DIR : /home/kozerus/public_html/index_new_htm.html
/home/kozerus/public_html
ko 20190222_062303 MAIN 0-0 fildb3=ko.db3 sqltbl=ko fillogd=ko_20190222.log
MSG_7500 FINDDT: ifile=index_av.html findmath=style_av tailmatch=style_av ofile=style_av
MSG_400: ko 20190222_062303 -= findt =- 0-0 ifile=index_av.html findmatch=style_avstyle_av ofile=style_av
EXIT_500 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ko 20190222_062303 -= findt =- 0-0 ___FOUND ifile=index_av.html findmatch=style_av ofile=style_av
ko 20190222_062304 MAIN 0-0 fildb3=ko.db3 sqltbl=ko fillogd=ko_20190222.log
MSG_7500 FINDDT: ifile=index_bb.html findmath=style_bb tailmatch=style_bb ofile=style_bb
MSG_400: ko 20190222_062304 -= findt =- 0-0 ifile=index_bb.html findmatch=style_bbstyle_bb ofile=style_bb
EXIT_500 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ko 20190222_062304 -= findt =- 0-0 ___FOUND ifile=index_bb.html findmatch=style_bb ofile=style_bb
ko 20190222_062304 MAIN 0-0 fildb3=ko.db3 sqltbl=ko fillogd=ko_20190222.log
MSG_7500 FINDDT: ifile=index.html findmath=style_buttons tailmatch=style_buttons ofile=style_buttons
MSG_400: ko 20190222_062304 -= findt =- 0-0 ifile=index.html findmatch=style_buttonsstyle_buttons ofile=style_buttons
EXIT_500 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ko 20190222_062304 -= findt =- 0-0 ___FOUND ifile=index.html findmatch=style_buttons ofile=style_buttons
match j=1470 line= <style id="style_buttons" >
FIND j=1471 line=// body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }
FIND j=1472 line= button {
FIND j=1473 line=// visibility: hidden;
FIND j=1474 line=// background: rgba(7, 99, 53, .1);
FIND j=1475 line= background: transparent;
FIND j=1476 line=// border: 3px solid rgba(7, 99, 53, 1);
FIND j=1477 line= border: 3px solid darkSlategrey;
FIND j=1478 line= border-radius: 5px;
FIND j=1479 line=// color: rgba(7, 99, 53, 1);
FIND j=1480 line=// color: ivory;
FIND j=1481 line= color: darkSlategrey;
FIND j=1482 line= cursor: pointer;
FIND j=1483 line= line-height: 40px;
FIND j=1484 line= font-size: 20px;
FIND j=1485 line= outline: none;
FIND j=1486 line= padding: 0 20px;
FIND j=1487 line= transition: all .3s;
FIND j=1488 line= }
FIND j=1489 line= button:hover {
FIND j=1490 line=// background: rgba(7, 99, 53, 1);
FIND j=1491 line= background: darkSlategrey;
FIND j=1492 line=// background: yellow;
FIND j=1493 line=// background: white;
FIND j=1494 line=// color: rgba(255,255,255,1);
FIND j=1495 line= color: ivory;
FIND j=1496 line= }
FIND j=1497 line= p {font-size: 20px; font-weight: bold;
TAIL j=1498 line= </style id="style_buttons" >
tail j=1499 line=
tail j=1500 line= <style id="style_input" >
tail j=1501 line=// body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }
tail j=1502 line= input {
tail j=1503 line=// visibility: hidden;
tail j=1504 line=// background: rgba(7, 99, 53, .1);
tail j=1505 line= background: transparent;
tail j=1506 line=// border: 3px solid rgba(7, 99, 53, 1);
tail j=1507 line= border: 3px solid darkSlategrey;
tail j=1508 line= border-radius: 5px;
tail j=1509 line=// color: rgba(7, 99, 53, 1);
tail j=1510 line=// color: ivory;
tail j=1511 line= color: darkSlategrey;
tail j=1512 line= cursor: pointer;
tail j=1513 line= line-height: 40px;
tail j=1514 line= font-size: 10px;
tail j=1515 line= outline: none;
tail j=1516 line= padding: 0 20px;
tail j=1517 line= transition: all .3s;
tail j=1518 line= }
tail j=1519 line= button:hover {
tail j=1520 line=// background: rgba(7, 99, 53, 1);
tail j=1521 line= background: darkgreyslate;
tail j=1522 line=// background: yellow;
tail j=1523 line=// background: white;
tail j=1524 line=// color: rgba(255,255,255,1);
tail j=1525 line=// color: white;
tail j=1526 line= color: ivory;
tail j=1527 line= }
tail j=1528 line= p {font-size: 10px; font-weight: bold;
tail j=1529 line= <style id="style_input" >
tail j=1530 line=
tail j=1531 line=
tail j=1532 line= <style id="style_drop" type="text/css">
tail j=1533 line= #drop {
tail j=1534 line= width:800px;
tail j=1535 line= height:250px;
tail j=1536 line= margin:3px auto;
tail j=1537 line=// background:#eddaa8;
tail j=1538 line= background:ivory;
tail j=1539 line= font-size:16px;
tail j=1540 line= }
tail j=1541 line= #drop #sw { text-decoration:underline; cursor:pointer; }
tail j=1542 line= #drag {
tail j=1543 line=// width:450px;
tail j=1544 line=// height:180px;
tail j=1545 line= width:800;
tail j=1546 line= height:480px;
tail j=1547 line= margin:12px auto;
tail j=1548 line= border:1px solid silver;
tail j=1549 line= font-size:16px;
tail j=1550 line= }
tail j=1551 line= #drag .drg { margin:10px 12px; }
tail j=1552 line= #drag div.drg {
tail j=1553 line= width:150px;
tail j=1554 line= height:50px;
tail j=1555 line= background:#07da08;
tail j=1556 line= border:2px solid blue;
tail j=1557 line= }
tail j=1558 line= </style id="style_drop" type="text/css">
tail j=1559 line=
tail j=1560 line= <style id="style_div_csv type="text/css">
tail j=1561 line= body {
tail j=1562 line=// font-family: Arial;
tail j=1563 line= font-family: yokkmokkOT;
tail j=1564 line= font-family: arial;
tail j=1565 line= font-size: 8pt;
tail j=1566 line= }
tail j=1567 line= table {
tail j=1568 line= border: 1px solid #ccc;
tail j=1569 line= }
tail j=1570 line= table th {
tail j=1571 line=// background-color: #F7F7F7;
tail j=1572 line= background-color: darkSlategrey;
tail j=1573 line=// color: #333;
tail j=1574 line= color: ivory;
tail j=1575 line= font-weight: bold;
tail j=1576 line= }
tail j=1577 line= table th, table td {
tail j=1578 line= padding: 5px;
tail j=1579 line= border-color: #ccc;
tail j=1580 line= }
tail j=1581 line= </style id="style_div_csv type="text/css">
tail j=1582 line=
tail j=1583 line= <style id="style_thumb_3800">
tail j=1584 line= .thumb {
tail j=1585 line= height: 75px;
tail j=1586 line= border: 1px solid #000;
tail j=1587 line= margin: 10px 5px 0 0;
tail j=1588 line= }
tail j=1589 line= </style>
tail j=1590 line=
tail j=1591 line= <style id="style_byte_content" >
tail j=1592 line= #byte_content {
tail j=1593 line= margin: 5px 0;
tail j=1594 line= max-height: 100px;
tail j=1595 line= overflow-y: auto;
tail j=1596 line= overflow-x: hidden;
tail j=1597 line= }
tail j=1598 line= #byte_range { margin-top: 5px; }
tail j=1599 line= </style>
tail j=1600 line=
tail j=1601 line= <script id="load_vues" >
tail j=1602 line= function load_vues(args) {
tail j=1603 line=// alert( "BUG_1000 load_vues"+args );
tail j=1604 line= vues = "";
tail j=1605 line= vues += "old|\n";
tail j=1606 line= vues += "ko|\n";
tail j=1607 line= vues += "new|\n";
tail j=1608 line= vues += "work|\n";
tail j=1609 line= vues += "focus|\n";
tail j=1610 line= vues += "where|";
tail j=1611 line= vues += "courtreport|\n";
tail j=1612 line= vues += "jtfdc|\n";
tail j=1613 line= vues += "jtrdcr|\n";
tail j=1614 line= vues += "jtfinc|\n";
tail j=1615 line= vues += "byrdpuckers|\n";
tail j=1616 line=
tail j=1617 line= vues += "kassil|\n";
tail j=1618 line= vues += "konet|\n";
tail j=1619 line= vues += "iperms|\n";
tail j=1620 line=
tail j=1621 line= vues += "memes|\n";
tail j=1622 line= vues += "food|\n";
tail j=1623 line= vues += "kids|\n";
tail j=1624 line= vues += "dogs|\n";
tail j=1625 line=
tail j=1626 line= vues += "jkwii|\n";
tail j=1627 line= vues += "kou|\n";
tail j=1628 line= vues += "konabus|\n";
tail j=1629 line= vues += "go|\n";
tail j=1630 line= vues += "kt|\n";
tail j=1631 line= vues += "ka|\n";
tail j=1632 line= vues += "ko|\n";
tail j=1633 line=
tail j=1634 line= vues += "ko0|\n";
tail j=1635 line= vues += "ko1|\n";
tail j=1636 line= vues += "ko2|\n";
tail j=1637 line= vues += "ka1|\n";
tail j=1638 line= vues += "ka2|\n";
tail j=1639 line=
tail j=1640 line= vues += "ka11|\n";
tail j=1641 line= vues += "ka12|\n";
tail j=1642 line= vues += "ka21|\n";
tail j=1643 line= vues += "ka22|\n";
tail j=1644 line=
tail j=1645 line= vues += "av|\n";
tail j=1646 line= vues += "bb|\n";
tail j=1647 line= vues += "dd|\n";
tail j=1648 line= vues += "pn|\n";
tail j=1649 line= vues += "sl|\n";
tail j=1650 line= vues += "tm|\n";
tail j=1651 line= vues += "tl|\n";
tail j=1652 line= vues += "vu|\n";
tail j=1653 line= vues += "yt|\n";
tail j=1654 line= vues += "zm|\n";
tail j=1655 line=
tail j=1656 line= vues += "old|\n";
tail j=1657 line=
tail j=1658 line=// alert( "BUG_1100 end load_vues vues="+vues );
tail j=1659 line= return( vues );
tail j=1660 line= }
tail j=1661 line= </script>
tail j=1662 line=
tail j=1663 line= <script id="script_show_vues">
tail j=1664 line= function show_vues(args) {
tail j=1665 line= alert( "BUGS_1060 BEG show_vues args="+args );
tail j=1666 line=
tail j=1667 line= vues = load_vues('').split("|");
tail j=1668 line= vuelen = vues.length;
tail j=1669 line= alert( "BUGS_1070 show_vues AAA htmout="+vuelen );
tail j=1670 line=
tail j=1671 line= htmout="";
tail j=1672 line= htmout_script_vues="";
tail j=1673 line= htmout_button_vues="";
tail j=1674 line= htmout_div_vues="";
tail j=1675 line= htmout="";
tail j=1676 line= htmout="";
tail j=1677 line=
tail j=1678 line= z=0;
tail j=1679 line=
tail j=1680 line= for( z=0; z<vuelen; z++ ) {
tail j=1681 line= vue = vues[z];
tail j=1682 line= url = '/?vuid="'+vue+'"';
tail j=1683 line= tn = "/imgs/gif/ringd.gif"; img = "/imgs/gif/ringb.gif";
tail j=1684 line= tn = "/imgs/gif/ringsd.gif"; img = "/imgs/gif/ringsb.png";
tail j=1685 line=
tail j=1686 line= background="yellow";
tail j=1687 line= color="black";
tail j=1688 line= font="yokkmokkOT";
tail j=1689 line= fontsize="12pt";
tail j=1690 line= width="35%";
tail j=1691 line=
tail j=1692 line= alert( "BUGS_1090 show_vues z="+z+" vue="+vue );
tail j=1693 line=
tail j=1694 line= htmout += "<hr color=yellow";
tail j=1695 line= htmout += "<hr color=red";
tail j=1696 line= htmout += '<img src="/imgs/gif/rings.gif" >\n';
tail j=1697 line= htmout += '<a href="'+url+'" alt="'+vue+'" class="popover" id="drg" target=_blank>';
tail j=1698 line= htmout += ' <img class="drg" src="'+tn+'" border=0>';
tail j=1699 line= htmout += ' <span><img class="drg" src="'+img+'" border=0></span>';
tail j=1700 line= htmout += ' </a>';
tail j=1701 line= htmout += "<hr color=yellow";
tail j=1702 line= htmout += "<hr color=red";
tail j=1703 line=
tail j=1704 line=// htmout_script_vues += '<script id="'+z+'" >';
tail j=1705 line= htmout_script_vues += '<script id="vue_kov_'+vue+'" >';
tail j=1706 line= htmout_script_vues += ' var kov = new Vue({ el: "#kov'+kovid+'",';
tail j=1707 line= htmout_script_vues += 'data: {collapsed: false},';
tail j=1708 line=
tail j=1709 line= htmout_script_vues += 'methods: {\n';
tail j=1710 line= htmout_script_vues += ' showhide_kov: function() {\n';
tail j=1711 line= htmout_script_vues += ' if (!this.collapsed) this.collapsed = true;\n';
tail j=1712 line= htmout_script_vues += ' else this.collapsed = false;\n';
tail j=1713 line= htmout_script_vues += ' },\n';
tail j=1714 line= htmout_script_vues += 'document.body.style.background = "'+background+'"';
tail j=1715 line=
tail j=1716 line= htmout_script_vues += 'document.body.style.color = "'+color+'"';
tail j=1717 line= htmout_script_vues += 'document.body.style.fontfamily = "'+font+'"';
tail j=1718 line= htmout_script_vues += 'document.body.style.fontsize = "'+fontsize+'"';
tail j=1719 line= htmout_script_vues += ' },\n';
tail j=1720 line= htmout_script_vues += ' </script" >';
tail j=1721 line=
tail j=1722 line= htmout_style_vues = '<style id="style_kov_'+vue+'\n';
tail j=1723 line= htmout_style_vues += ' .detail_'+vue+' { \n';
tail j=1724 line= htmout_style_vues += ' background: '+background+';\n';
tail j=1725 line= htmout_style_vues += ' width: '+width+';\n';
tail j=1726 line= htmout_style_vues += ' padding: 20px;\n';
tail j=1727 line= htmout_style_vues += ' border: 1px solid black;\n';
tail j=1728 line= htmout_style_vues += ' font-family: '+font+';\n';
tail j=1729 line= htmout_style_vues += ' color: '+color+';\n';
tail j=1730 line= htmout_style_vues += ' }\n';
tail j=1731 line= htmout_style_vues += ' </style>\n';
tail j=1732 line=
tail j=1733 line=// alert( "BUGS_1092 show_vues VUEHTM vuelen="+vuelen+" htmout_style_vues=\n"+htmout_style_vues );
tail j=1734 line= alert( "BUGS_1733 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues=\n"+htmout_script_vues );
tail j=1735 line= }
tail j=1736 line=
tail j=1737 line=
tail j=1738 line=// alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout="+htmout );
tail j=1739 line=// alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues="+htmout_script_vues );
tail j=1740 line=
tail j=1741 line= div_style_vues = document.getElementById('div_style_vues');
tail j=1742 line= div_style_vues.insertAdjacentHTML('afterbegin', htmout_style_vues );
tail j=1743 line=
tail j=1744 line= div_script_vues = document.getElementById('div_script_vues');
tail j=1745 line= div_script_vues.insertAdjacentHTML('afterbegin', htmout_script_vues );
tail j=1746 line=
tail j=1747 line=
tail j=1748 line= div_show_vues = document.getElementById('div_show_vues');
tail j=1749 line= div_show_vues.insertAdjacentHTML('afterbegin', htmout);
tail j=1750 line=
tail j=1751 line=
tail j=1752 line=// div_show_vues.insertAdjacentHTML('beforebegin', htmout);
tail j=1753 line=
tail j=1754 line=// div_show_vues = getelementbyID('div_show_vues");
tail j=1755 line=// div_show_vues.innerHTML = htmout;
tail j=1756 line=
tail j=1757 line=// alert("BUGS_2892 vuelen=" + vues.length + "\nStatus: " + status);
tail j=1758 line=// document.write( htmout );
tail j=1759 line=
tail j=1760 line=// alert( "BUGS_1100 END show_vues htmout="+htmout );
tail j=1761 line= return(htmout);
tail j=1762 line= }
tail j=1763 line= </script id="script_show_vues">
tail j=1764 line=
tail j=1765 line=
tail j=1766 line= <div id="div_style_vues"></div>
tail j=1767 line=
tail j=1768 line= <div id="div_script_vues"></div>
tail j=1769 line=
tail j=1770 line= <script id="script_kovs_hideshow">
tail j=1771 line=
tail j=1772 line= function kovs_hideshow( todo, kovs ) {
tail j=1773 line= kovlist = "";
tail j=1774 line= kovlist += "ko|go|kt|old|new|";
tail j=1775 line= kovlist += "kassil|konet|iperms|konabus|courtreport|";
tail j=1776 line= kovlist += "jkwii|byrdpucker|kou|jtfdc|jtfinc|";
tail j=1777 line= kovlist += "where|work|memes|focus|food|";
tail j=1778 line= kovlist += "dogs|kids|preserve|protect";
tail j=1779 line= kovs = kovlist.split('|');
tail j=1780 line= kovs_len = kovs.length;
tail j=1781 line=// alert( "BUS_1340 kovs_hideshow todo="+todo+" kovlist="+kovlist+" kovs_len="+kovs_len );
tail j=1782 line= htmout = "";
tail j=1783 line= z=0;
tail j=1784 line= for( z=0; z<kovs_len; z++ ) {
tail j=1785 line= kov=kovs[z];
tail j=1786 line= kovid="kov_"+kov;
tail j=1787 line= if( todo == "hide" ) {
tail j=1788 line= document.getElementById(kovid).style.visibility = "hidden";
tail j=1789 line= }
tail j=1790 line= if( todo == "show" ) {
tail j=1791 line= document.getElementById(kovid).style.visibility = "visible";
tail j=1792 line= }
tail j=1793 line= htmout += "z="+z+" todo="+todo+ " kovid="+kovid+"<br>\n";
tail j=1794 line=// alert( "BUS_1350 kovs_hideshow todo="+todo+" z="+z+" kovid="+kovid );
tail j=1795 line= }
tail j=1796 line= alert( "BUGS_1371 htmout="+htmout );
tail j=1797 line=// alert( "BUS_1370 kovs_hideshow todo="+todo+" kovs="+kovs );
tail j=1798 line= }
tail j=1799 line= </script>
tail j=1800 line=
tail j=1801 line= <script id="script_vues_hideshow">
tail j=1802 line= function vues_hideshow(hideshow,kovs) {
tail j=1803 line= alert( "BUGS_1220 vues_hideshow kovs="+kovs );
tail j=1804 line= kovs = "";
tail j=1805 line= kovs += "ko new focus work where memes ";
tail j=1806 line= kovs += "jtfdc jtfdcr jtfinc byrdpucker courtreport ";
tail j=1807 line= kovs += "jkwii kou kids dogs ";
tail j=1808 line= kovs += "kassil konet iperms konabus ko go kt old";
tail j=1809 line= alert( "BUGS_1221 vues_hideshow kovs="+kovs );
tail j=1810 line= z=0;
tail j=1811 line= for( kov in kovs.split(" ") ) {
tail j=1812 line= z=z+1;
tail j=1813 line= alert( "BUGS vues_hideshow z="+z+" kov="+kov );
tail j=1814 line= }
tail j=1815 line= }
tail j=1816 line= function vues_hideshow1(hideshow,divid) {
tail j=1817 line= alert( "BUGS_1230 vues_hideshow args="+args );
tail j=1818 line= htmout_vues_all="";
tail j=1819 line= if( hideshow == 'hide' ) {
tail j=1820 line= if( divid == "" ) or ( divid == "all" ) {
tail j=1821 line= alert( "MGS_1261 vues_showhide HIDE" );
tail j=1822 line= document.getElementById("btn_vues_hide").style.visibility = "hidden";
tail j=1823 line= document.getElementById("btn_vues_show").style.visibility = "visible";
tail j=1824 line=
tail j=1825 line= document.getElementById("kov_ko").style.visibility = "hidden";
tail j=1826 line= document.getElementById("kov_new").style.visibility = "hidden";
tail j=1827 line= document.getElementById("kov_focus").style.visibility = "hidden";
tail j=1828 line= document.getElementById("kov_food").style.visibility = "hidden";
tail j=1829 line= document.getElementById("kov_courtreport").style.visibility = "hidden";
tail j=1830 line= document.getElementById("kov_where").style.visibility = "hidden";
tail j=1831 line= document.getElementById("kov_work").style.visibility = "hidden";
tail j=1832 line= document.getElementById("kov_memes").style.visibility = "hidden";
tail j=1833 line= document.getElementById("kov_kids").style.visibility = "hidden";
tail j=1834 line= document.getElementById("kov_dogs").style.visibility = "hidden";
tail j=1835 line= document.getElementById("kov_preserve").style.visibility = "hidden";
tail j=1836 line= document.getElementById("kov_protect").style.visibility = "hidden";
tail j=1837 line= document.getElementById("kov_jtfdc").style.visibility = "hidden";
tail j=1838 line= document.getElementById("kov_jtfinc").style.visibility = "hidden";
tail j=1839 line= document.getElementById("kov_byrdpucker").style.visibility = "hidden";
tail j=1840 line= document.getElementById("kov_jkwii").style.visibility = "hidden";
tail j=1841 line= document.getElementById("kov_kou").style.visibility = "hidden";
tail j=1842 line= document.getElementById("kov_kassil").style.visibility = "hidden";
tail j=1843 line= document.getElementById("kov_konet").style.visibility = "hidden";
tail j=1844 line= document.getElementById("kov_iperms").style.visibility = "hidden";
tail j=1845 line= document.getElementById("kov_konabus").style.visibility = "hidden";
tail j=1846 line= document.getElementById("kov_kt").style.visibility = "hidden";
tail j=1847 line= document.getElementById("kov_go").style.visibility = "hidden";
tail j=1848 line= document.getElementById("kov_old").style.visibility = "hidden";
tail j=1849 line= }
tail j=1850 line= else {
tail j=1851 line= document.getElementById(divid).style.visibility = "hiddtn";
tail j=1852 line= }
tail j=1853 line=
tail j=1854 line=// var div_vues_all = document.getElementById('div_vues_all');
tail j=1855 line=// htmout_vues= div_vues_all.innerHTML;
tail j=1856 line=// div_vues_all.innerHTML = '<div id="div_vues_all" hidden><h1>div_vues_all_hidden</h1>\n';
tail j=1857 line=// htmout_vues = document.getElementById('div_vues_all').innerHTML;
tail j=1858 line= alert( "BUGS_1291 vues_hideshow HIDE=");
tail j=1859 line=// div_vues.innerHTML = '<h1>div_vues</h1><div id="div_vues" hidden>\n";
tail j=1860 line= }
tail j=1861 line= if( args == 'show' ) {
tail j=1862 line= if( divid == "" ) or ( divid == "all" ) {
tail j=1863 line= alert( "MGS_1262 vues_showhide HIDE" );
tail j=1864 line= document.getElementById("btn_vues_hide").style.visibility = "visible";
tail j=1865 line= document.getElementById("btn_vues_show").style.visibility = "hidden";
tail j=1866 line=
tail j=1867 line=
tail j=1868 line=
tail j=1869 line= document.getElementById("kov_ko").style.visibility = "visible";
tail j=1870 line= document.getElementById("kov_new").style.visibility = "visible";
tail j=1871 line= document.getElementById("kov_focus").style.visibility = "visible";
tail j=1872 line= document.getElementById("kov_food").style.visibility = "visible";
tail j=1873 line= document.getElementById("kov_courtreport").style.visibility = "visible";
tail j=1874 line= document.getElementById("kov_where").style.visibility = "visible";
tail j=1875 line= document.getElementById("kov_work").style.visibility = "visible";
tail j=1876 line= document.getElementById("kov_memes").style.visibility = "visible";
tail j=1877 line= document.getElementById("kov_kids").style.visibility = "visible";
tail j=1878 line= document.getElementById("kov_dogs").style.visibility = "visible";
tail j=1879 line= document.getElementById("kov_preserve").style.visibility = "visible";
tail j=1880 line= document.getElementById("kov_protect").style.visibility = "visible";
tail j=1881 line= document.getElementById("kov_jtfdc").style.visibility = "visible";
tail j=1882 line= document.getElementById("kov_jtfinc").style.visibility = "visible";
tail j=1883 line= document.getElementById("kov_byrdpucker").style.visibility = "visible";
tail j=1884 line= document.getElementById("kov_jkwii").style.visibility = "visible";
tail j=1885 line= document.getElementById("kov_kou").style.visibility = "visible";
tail j=1886 line= document.getElementById("kov_kassil").style.visibility = "visible";
tail j=1887 line= document.getElementById("kov_konet").style.visibility = "visible";
tail j=1888 line= document.getElementById("kov_iperms").style.visibility = "visible";
tail j=1889 line= document.getElementById("kov_konabus").style.visibility = "visible";
tail j=1890 line= document.getElementById("kov_kt").style.visibility = "visible";
tail j=1891 line= document.getElementById("kov_go").style.visibility = "visible";
tail j=1892 line= document.getElementById("kov_old").style.visibility = "visible";
tail j=1893 line= }
tail j=1894 line= else {
tail j=1895 line= document.getElementById(divid).style.visibility = "visible";
tail j=1896 line= }
tail j=1897 line= alert( "BUGS_1292 vues_hideshow SHOW htmout_vues=");
tail j=1898 line= }
tail j=1899 line= }
tail j=1900 line= </script id="script_vues_hideshow">
tail j=1901 line=
tail j=1902 line= <script id="script_kb" >function script_kb(args) {
tail j=1903 line= alert( "script_kb args="+args );
tail j=1904 line= }
tail j=1905 line= <script id="script_kw" >function script_kw(args) {
tail j=1906 line= alert( "script_kw args="+args );
tail j=1907 line= }
tail j=1908 line= <script id="script_koeyeb_w" >function script_koeyeb_w(args) {
tail j=1909 line= alert( "script_koeyeb_w args="+args );
tail j=1910 line= }
tail j=1911 line= <script id="script_koeyew_b" >function script_koeyew_b(args) {
tail j=1912 line= alert( "script_koeyew_b args="+args );
tail j=1913 line= }
tail j=1914 line= <script id="script_koeye_b" >function script_koeye_b(args) {
tail j=1915 line= alert( "script_koeye_b args="+args );
tail j=1916 line= }
tail j=1917 line= <script id="script_koeye_w" >function script_koeye_w(args) {
tail j=1918 line= alert( "script_koeye_w args="+args );
tail j=1919 line= }
tail j=1920 line= <script id="script_bubble" >function script_bubble(args) {
tail j=1921 line= alert( "script_bubble args="+args );
tail j=1922 line= }
tail j=1923 line=
tail j=1924 line= <script id="script_shutdown" >
tail j=1925 line= function script_shutdown( msg ) {
tail j=1926 line= alert( "BUGS_6100 script_shutdown msg="+msg );
tail j=1927 line= }
tail j=1928 line= </script id="script_shutdown" >
tail j=1929 line=
tail j=1930 line=
tail j=1931 line=
tail j=1932 line= </head>
tail j=1933 line=
tail j=1934 line=
tail j=1935 line=
tail j=1936 line=<!-- <body onload="init_pano('canvas'); kogrids();"> -->
tail j=1937 line=
tail j=1938 line=
tail j=1939 line=<body onload="startup();">
tail j=1940 line=
tail j=1941 line=<br><br><br><br>
tail j=1942 line=<br><br><br><br>
tail j=1943 line=
tail j=1944 line= <div id="div_kogrids_w"></div>
tail j=1945 line=
tail j=1946 line=
tail j=1947 line=<br><br><br><br><br>
tail j=1948 line=<hr color=yellow>
tail j=1949 line= <button type="btn_kovs_hideshow" id="kovs_hideshow" onclick="kovs_hideshow()">kovs_hideshow</button>
tail j=1950 line= <a href=# onclick="kovs_hideshow("hide","all"); return false;" class="popover">
tail j=1951 line= <img height=200 src=/imgs/gif/ringb.gif onclick="kovs_hideshow('hide','all')">
tail j=1952 line= <span><img height=200 src=/imgs/gif/ringp.gif onclick="kovs_hideshow('hide','all')"></span>
tail j=1953 line= <a>
tail j=1954 line=
tail j=1955 line=<!-- <img src=/imgs/gif/rings.gif onclick="kovs_hideshow('show','all')"> -->
tail j=1956 line=
tail j=1957 line= <a href=# onclick="kovs_hideshow("show","all"); return false;" class="popover">
tail j=1958 line= <img height=200 src=/imgs/gif/ringd.gif onclick="kovs_hideshow('show','all')">
tail j=1959 line= <span><img height=200 src=/imgs/gif/ringq.gif onclick="kovs_hideshow('show','all')"></span>
tail j=1960 line= <a>
tail j=1961 line=
tail j=1962 line= <script id="script_bugs" >
tail j=1963 line= function bugs(h,d) {
tail j=1964 line= alert( "BUGS " );
tail j=1965 line= }
tail j=1966 line= </script>
tail j=1967 line=
tail j=1968 line= <button type="btn_kovs_hide" id="btn_kovs_hide" onclick="kovs_hideshow('hide','all')>
tail j=1969 line= -= kovs_hide_all =-
tail j=1970 line= </button>
tail j=1971 line= <button type="btn_kovs_show" id="btn_kovs_show" onclick="kovs_hideshow('show','all')>
tail j=1972 line= -= kovs_show_all =-
tail j=1973 line= </button>
tail j=1974 line=
tail j=1975 line=<hr color=yellow>
tail j=1976 line=<br><br><br><br><br>
tail j=1977 line=<br><br><br><br><br>
tail j=1978 line=<br><br><br><br><br>
tail j=1979 line=<br><br><br><br><br>
tail j=1980 line=
tail j=1981 line= <button type="show_vues" id="show_vues" onclick="show_vues('')">show_vues</button>
tail j=1982 line=<!--
tail j=1983 line= <a href=# class=popover id="drag" >
tail j=1984 line= <img height=400 width=600 src="/imgs/gif/ringsb.gif" onclick="show_vues('')" >
tail j=1985 line= <span><img height=400 width=600 src="/imgs/gif/ringsq.gif" onclick="show_vues('')" ></span>
tail j=1986 line= </a>
tail j=1987 line= -->
tail j=1988 line=
tail j=1989 line=<button type="show_vues" id="show_vues" onclick="show_vues('')">show_vuew</button>
tail j=1990 line= <div id="div_show_vues" ><h1>div_show_vues_w</h1></div>
tail j=1991 line=
tail j=1992 line=
tail j=1993 line=<button type="kov_links_main" id="kov_links_main" onclick="kov_links()">kov_links_main</button>
tail j=1994 line=<!-- <button type="clear_div_kov" id="clear_div_kov" onclick="clear_div_kov()">clear_div_kov</button> -->
tail j=1995 line=<!-- <button type="load_kov_links" id="load_kov_links" onclick="load_kov_links()">load_kov_links</button> -->
tail j=1996 line=<!-- <button type="show_kov_links" id="show_kov_links" onclick="show_kov_links()">show_kov_links</button> -->
tail j=1997 line=
tail j=1998 line=
tail j=1999 line= <div id="div_kov_links"></div>
tail j=2000 line=
tail j=2001 line= <div id="v_hoverdate">
tail j=2002 line= <span v-bind:title="message"><font style="font-family: times, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
tail j=2003 line= <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
tail j=2004 line= </div>
tail j=2005 line= <script id="script_hoverdate" >
tail j=2006 line= kotxt = "";
tail j=2007 line= kotxt += "-== kako =- preview embed vu emchat -= 20190218_0800 =-";
tail j=2008 line=// kotxt += new Date().toLocaleString();
tail j=2009 line=// message: 'hoverdate ' + kotxt;
tail j=2010 line= var app2 = new Vue({el: '#v_hoverdate',
tail j=2011 line= data: {
tail j=2012 line= message: 'hover_dttm ' + new Date().toLocaleString() + kotxt
tail j=2013 line= }
tail j=2014 line= })
tail j=2015 line= </script id="script_hoverdate" >
tail j=2016 line=
tail j=2017 line=
tail j=2018 line= <dic id="div_vues" ><h1>div_vues</h1></div>
tail j=2019 line=<!-- <button type="button" onclick="script_ajax()">loadlist</button> -->
tail j=2020 line=
tail j=2021 line=
tail j=2022 line= <hr color=yellow>
tail j=2023 line= <div id="dynDataField"></div>
tail j=2024 line= <hr color=yellow>
tail j=2025 line=
tail j=2026 line= <h1 id="ajaxdb3">ajaxdb3.</h1>
tail j=2027 line= <button type="button" onclick="script_ajaxdb3()">ajaxdb3</button>
tail j=2028 line=
tail j=2029 line= <script id="script_ajaxdb3">
tail j=2030 line= db3=indexx.db3;
tail j=2031 line= sql="select * from list limit 5";
tail j=2032 line= function script_ajaxdb3(db3,sql) {
tail j=2033 line= $("button").click(function(){
tail j=2034 line= $.post("indexx.php", {
tail j=2035 line= db3: db3,
tail j=2036 line= sql: "select * from list limit 10"
tail j=2037 line= },
tail j=2038 line= function(data, status){
tail j=2039 line= lines = data.split("\n");
tail j=2040 line= linelen=lines.length;
tail j=2041 line= htmout="";
tail j=2042 line= alert( "BUGS1240 linelen="+linelen );
tail j=2043 line= for( z=0; z<lines.length; z++ ) {
tail j=2044 line= line=lines[z];
tail j=2045 line= if( line.length < 3 ) continue;
tail j=2046 line= z=z+1;
tail j=2047 line= flds = line.split(" ");
tail j=2048 line= img = flds[8];
tail j=2049 line= dd = flds[7];
tail j=2050 line= mth = flds[5];
tail j=2051 line= yyyy = flds[6];
tail j=2052 line= size = flds[4];
tail j=2053 line=// htmout += line+"\n";
tail j=2054 line= htmout += "img="+img+" dd="+dd+" "+yyyy+" "+mth+"\n";
tail j=2055 line=// alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
tail j=2056 line= }
tail j=2057 line= alert( "BUGS_1400 ajaxdb3 z="+z+" htmout="+htmout );
tail j=2058 line= for( z=0; z<lines.length; z++ ) {
tail j=2059 line= line=lines[z];
tail j=2060 line= alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
tail j=2061 line= flds = lines.split(" ");
tail j=2062 line= fldlen = flds.length;
tail j=2063 line= alert( "BUGS_1260 ajaxdb3 z="+z+" fldlen="+fldlen );
tail j=2064 line= psv=parseline(line);
tail j=2065 line= alert( "BUGS_1251 ajaxdb3 psv="+psv );
tail j=2066 line=// (url,img,id,tn,grp,desc) = parseline(line);
tail j=2067 line=// url = line.split(" ")[0];
tail j=2068 line=// img = line.split(" ")[1];
tail j=2069 line=// alert( "BUGS_1251 ajaxdb3 url="+url+" img="+img );
tail j=2070 line=// id = line.split("|")[2];
tail j=2071 line=// tn = line.split("|")[3];
tail j=2072 line=// grp = line.split("|")[4];
tail j=2073 line=// desc = line.split("|")[5];
tail j=2074 line=
tail j=2075 line= htmout += '<div id="drag">\n';
tail j=2076 line= htmout += '<div class="drg" >\n';
tail j=2077 line= htmout += '<a href="+url+" class="thumbnail" target=_blank>\n';
tail j=2078 line= htmout += ' <img class="drg" src="+img+" border=0>\n';
tail j=2079 line= htmout += ' <span><img class="drg" src="+img+" border=0></span>\n';
tail j=2080 line= htmout += ' </a>\n';
tail j=2081 line= htmout += ' </div>\n';
tail j=2082 line= htmout += ' </div>\n';
tail j=2083 line=// alert( "BUGS_1248 ajaxdb3 htmout="+htmout );
tail j=2084 line= }
tail j=2085 line=
tail j=2086 line=// getelementbyID('div_ajaxdb3");
tail j=2087 line=// alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
tail j=2088 line=
tail j=2089 line= div_ajaxdb3 = document.getElementById('div_ajaxdb3');
tail j=2090 line= div_ajaxdb3.insertAdjacentHTML('afterbegin', htmout);
tail j=2091 line=// document.write( htmout );
tail j=2092 line= });
tail j=2093 line= });
tail j=2094 line= }
tail j=2095 line= </script id="script_ajaxdb3">
tail j=2096 line=
tail j=2097 line=
tail j=2098 line= <script id="script_parseline">
tail j=2099 line= function parseline(line) {
tail j=2100 line= alert( "BUGS_1280 line="+line );
tail j=2101 line= flds=line.split(" ");
tail j=2102 line=
tail j=2103 line= url="index.html";
tail j=2104 line= img="/imgs/gif/ringsb.gif";
tail j=2105 line= id="jkwii";
tail j=2106 line= tn="/imgs/btn/ringsd.gif";
tail j=2107 line= grp="group";
tail j=2108 line= desc="timejak jkwii";
tail j=2109 line= psv=url+"|"+img+"|"+id+"|"+tn+"|"+grp+"|"+desc
tail j=2110 line=
tail j=2111 line=// return(url,img,id,tn,grp,desc);
tail j=2112 line= return(psv);
tail j=2113 line= }
tail j=2114 line= </script id="script_parseline">
tail j=2115 line=
tail j=2116 line= <hr color=yellow>
tail j=2117 line= <div id="div_ajaxdb3"></div>
tail j=2118 line= <hr color=yellow>
tail j=2119 line=
tail j=2120 line=
tail j=2121 line=<!-- <div id="ajax_loadlist">xxx ajax_loadlist xxx</div> -->
tail j=2122 line= <hr color=yellow>
tail j=2123 line=
tail j=2124 line=
tail j=2125 line=
tail j=2126 line= <div id="div_vues" >
tail j=2127 line=
tail j=2128 line= <div id="app_jkwii">
tail j=2129 line= <div>
tail j=2130 line=
tail j=2131 line= <h1 v-on:click="showhide" >= = : : jkwii is me : : = =</h1>
tail j=2132 line= <h2 v-on:click="showhide" >:: -=ko0us=- preview 20190218_0800 us_med_rectin</h2>
tail j=2133 line= <h2>private tours available on request</h2>
tail j=2134 line=
tail j=2135 line=<a id="drag" class="popover" href="/ani.html" target=_blank>
tail j=2136 line= <img class="drg" height=450 width=800 src="/imgs/gif/firebubblesb.gif" alt="firebubbles" border=0>
tail j=2137 line= <span><img height=450 width=800 class="drg" src="/imgs/gif/firebubblesq.gif" border=0></span>
tail j=2138 line= </a>
tail j=2139 line=
tail j=2140 line= <iframe frameborder='0' height='200' width=800 marginheight='0' marginwidth='0' scrolling='no'
tail j=2141 line= src='/ani.html'
tail j=2142 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=2143 line= </iframe>
tail j=2144 line=
tail j=2145 line= <hr color=blue>
tail j=2146 line= <hr color=white>
tail j=2147 line= <hr color=red>
tail j=2148 line=
tail j=2149 line=<!--
tail j=2150 line= <iframe id="myframe" src="/svc/emchat/index.html" width="600" height="500"
tail j=2151 line= frameborder="0" scrolling="yes"></iframe>
tail j=2152 line= -->
tail j=2153 line=
tail j=2154 line=<!--
tail j=2155 line= <img height=50 src="/imgs/btn/kob.png">
tail j=2156 line= <img height=50 src="/imgs/btn/koeyeb.png">
tail j=2157 line= <img height=50 src="/imgs/btn/koeye.png">
tail j=2158 line= <img height=50 src="/imgs/btn/koeyew.png">
tail j=2159 line= <img height=50 src="/imgs/btn/kow.png">
tail j=2160 line= -->
tail j=2161 line=
tail j=2162 line= <a href=/svc/emchat/index.html class="thumbnail" target=_blank>
tail j=2163 line= <img class="drg" height=200 src=/imgs/links/tn/tn_chat.png border=0>
tail j=2164 line= <span><img class="drg" height=400 src=/imgs/links/tn/tn_chat.png border=0></span>
tail j=2165 line= </a>
tail j=2166 line=
tail j=2167 line= <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
tail j=2168 line= <img class="drg" height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=2169 line= <span><img class="drg" height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=2170 line= </a>
tail j=2171 line=
tail j=2172 line= <a class="thumbnail" href=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin target=_blank>
tail j=2173 line= <img class="drg" height=200 src=/tl/imgs/tn/tn_jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0>
tail j=2174 line= <span><img class="drg" height=800 src=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0></span>
tail j=2175 line= </a>
tail j=2176 line=
tail j=2177 line= <a href=# v-on:click="showhide" class=thumbnail >
tail j=2178 line= <img class="drg" v-on:click="showhide" height=200 src=/tl/imgs/construction_sawhorse.gif border=0>
tail j=2179 line= <span><img class="drg" v-on:click="showhide" height=400 src=/tl/imgs/construction_sawhorse.gif border=0></span>
tail j=2180 line= </a>
tail j=2181 line=
tail j=2182 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.jpg alt=jtf31_streetswing_sawhorse_n_speedbump=_blank>
tail j=2183 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0>
tail j=2184 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0></span>
tail j=2185 line= </a>
tail j=2186 line=
tail j=2187 line= <a class="thumbnail" v-on:click="showhide" href=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0>
tail j=2188 line= <img class="drg" v-on:click="showhide" height=200 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
tail j=2189 line= <span><img class="drg" v-on:click="showhide" height=400 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0></span>
tail j=2190 line= </a>
tail j=2191 line=
tail j=2192 line=
tail j=2193 line=
tail j=2194 line= <br><br>
tail j=2195 line= <hr color=red>
tail j=2196 line= <hr color=white>
tail j=2197 line= <hr color=blue>
tail j=2198 line= <h2 v-on:click="showhide" >== jtfdc OPEN BORDER problem ==</h2>
tail j=2199 line= !! NO wall !! NO sawhorse !! NO tape !! NO chalk !!
tail j=2200 line= <br>
tail j=2201 line= !! NO EAGLES - OUR NO EAGLES !!
tail j=2202 line=
tail j=2203 line= <h1>
tail j=2204 line= <a href=/imgs/links_201901/great_wall_of_china_1870.jpg class="thumbnail_not" target=_blank>
tail j=2205 line= <img src=/imgs/links_201901/tn/tn_great_wall_of_china_1870.png border=0>
tail j=2206 line= </a>
tail j=2207 line= <a href=https://www.youtube.com/watch?v=OfCS1yXg8gk class="thumbnail_not" target=_blank>
tail j=2208 line= <img src=/imgs/links_201901/tn/tn_youb_across_the_border.png border=0>
tail j=2209 line= </a>
tail j=2210 line=
tail j=2211 line= <a href=/imgs/links/Image332.png class="thumbnail_not" target=_blank>
tail j=2212 line= <img src=/imgs/links/tn/tn_Image332.png border=0>
tail j=2213 line=<!-- <span><img src=/imgs/links/Image332.png border=0></span> -- >
tail j=2214 line= </a>
tail j=2215 line=
tail j=2216 line=
tail j=2217 line=
tail j=2218 line=<!--
tail j=2219 line= <a href=https://https://www.youtube.com/watch?v=Gj3UdRmhgvM&start_radio=1&list=RDGj3UdRmhgvM class="thumbnail_not" target=_blank>
tail j=2220 line= <img src=/imgs/links_201901/tn/tn_youb_dark_end_ofthe_street.png border=0>
tail j=2221 line= </a>
tail j=2222 line= -->
tail j=2223 line=<!-- -->
tail j=2224 line= <br>
tail j=2225 line=
tail j=2226 line=
tail j=2227 line= <a href=https://en.wikipedia.org/wiki/Moat class="thumbnail_not" target=_blank>
tail j=2228 line= <img src=/imgs/links_201901/tn/tn_Vellorefort.png border=0>
tail j=2229 line= </a>
tail j=2230 line=
tail j=2231 line= - ?? moat ?? -
tail j=2232 line= <a href=https://upload.wikimedia.org/wikipedia/commons/0/00/Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.JPG class="thumbnail_not" target=_blank>
tail j=2233 line= <img src=/imgs/links_201901/tn/tn_Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.png border=0></span>
tail j=2234 line= </a>
tail j=2235 line= </h1>
tail j=2236 line= <br>
tail j=2237 line= <a href=https://en.wikipedia.org/wiki/American_Gothic class="thumbnail_not" target=_blank>
tail j=2238 line= <img src=/imgs/links_201901/tn/tn_Grant_Wood_-_American_Gothic_-_Google_Art_Project.png border=0>
tail j=2239 line= </a>
tail j=2240 line=
tail j=2241 line= <hr color=blue>
tail j=2242 line= <hr color=white>
tail j=2243 line= <hr color=red>
tail j=2244 line=
tail j=2245 line=
tail j=2246 line=
tail j=2247 line=
tail j=2248 line=
tail j=2249 line=
tail j=2250 line=
tail j=2251 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5320_jtfdc_eagle_n.JPG alt=jtfdc_eagle_n target=_blank>
tail j=2252 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0>
tail j=2253 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0></span>
tail j=2254 line= </a>
tail j=2255 line=
tail j=2256 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.jpg alt=jtfdc_original_notresspassing_willprosecuted target=_blank>
tail j=2257 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0>
tail j=2258 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0></span>
tail j=2259 line= </a>
tail j=2260 line=
tail j=2261 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5704_jtfdc_eagle_s.JPG alt=jtfdc_eagle_s target=_blank>
tail j=2262 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0>
tail j=2263 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0></span>
tail j=2264 line= </a>
tail j=2265 line=
tail j=2266 line= <a href=# class=thumbnail>
tail j=2267 line= <img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
tail j=2268 line= <span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
tail j=2269 line= </a>
tail j=2270 line=
tail j=2271 line= <a class="thumbnail" href="mailto:adminihe@ko0.us?subject=adminihe_what?">
tail j=2272 line= <img height=50 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0>
tail j=2273 line= <span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0></span>
tail j=2274 line= </a>
tail j=2275 line=
tail j=2276 line= <a href=# class=thumbnail>
tail j=2277 line= <img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" >
tail j=2278 line= <span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
tail j=2279 line= </a>
tail j=2280 line= <a class="thumbnail" href="mailto:adminishe@ko0.us?subject=adminishe_what?">
tail j=2281 line= <img class="drg" height=50 src="/imgs/links/email.gif" alt="adminiwii_what" border=0>
tail j=2282 line= <span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminiwii_what" border=0></span>
tail j=2283 line= </a>
tail j=2284 line=
tail j=2285 line=<br><br><br>
tail j=2286 line= <div id="drag">
tail j=2287 line= <div class="drg">
tail j=2288 line= <h3>us_med_rechtin</h3>
tail j=2289 line= <a class="thumbnail" href=/us/med/rechtin target=_blank>
tail j=2290 line= <img height=200 src=/imgs/us/tn/tn_med_rechtin.png border=0>
tail j=2291 line= <span><img height=400 src=/imgs/us/med_rechtin.png border=0></span>
tail j=2292 line= </a>
tail j=2293 line= </div>
tail j=2294 line= </div>
tail j=2295 line=<br><br><br>
tail j=2296 line=<br><br><br>
tail j=2297 line= <div id="drag" >
tail j=2298 line= <div class="drg" >
tail j=2299 line= <h3>jtfdc_defford_courtreport</h3>
tail j=2300 line= <a class="thumbnail" href=/imgs/links/jtfdc_defford_courtreport.jpg target=_blank>
tail j=2301 line= <img height=200 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0>
tail j=2302 line= <span><img height=400 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0></span>
tail j=2303 line= </a>
tail j=2304 line= </div>
tail j=2305 line= </div>
tail j=2306 line=
tail j=2307 line=
tail j=2308 line=
tail j=2309 line=
tail j=2310 line=
tail j=2311 line=
tail j=2312 line=
tail j=2313 line=
tail j=2314 line=
tail j=2315 line=<hr color=yellow>
tail j=2316 line=
tail j=2317 line= <a href="index_tl.html" class="thumbnail" target=_blank>
tail j=2318 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2319 line= <span><img src="/imgs/links/index_tl.png" alt="tl" width="300px" height="200px" border="0"></span>
tail j=2320 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="tl" width="200px" height="150px" border="0"></span> -->
tail j=2321 line= </a>
tail j=2322 line=
tail j=2323 line= <a class="thumbnail" href="index_sl.html" target=_blank>
tail j=2324 line= <img src="/imgs/btn/koeyeb.png" alt="sl" width="200px" height="100px" border="0">
tail j=2325 line= <span><img src="/imgs/links/index_sl.png" alt="sl" width="400px" height="300px" border="0"></span>
tail j=2326 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="sl" width="200px" height="150px" border="0"></span> -->
tail j=2327 line= </a>
tail j=2328 line=
tail j=2329 line= <a class="thumbnail" href="sl/index_slv.html" target=_blank>
tail j=2330 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2331 line= <span><img src="/imgs/links/index_slv.jpg" alt="slv" width="400px" height=300px" border="0"></span>
tail j=2332 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="slv" width="200px" height=150px" border="0"></span> -->
tail j=2333 line= </a>
tail j=2334 line=
tail j=2335 line= <a class="thumbnail" href="index_pn.html" target=_blank>
tail j=2336 line= <img src="/imgs/btn/koeyeb.png" alt="pn" width="200px" height="100px" border="0">
tail j=2337 line= <span><img src="/imgs/links/index_pn.jpg" alt="pn" width="400px" height="300px" border="0"></span>
tail j=2338 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="pn" width="200px" height="150px" border="0"></span> -->
tail j=2339 line= </a>
tail j=2340 line=
tail j=2341 line= <a class="thumbnail" href="index_zm.html" target=_blank>
tail j=2342 line= <img src="/imgs/btn/koeyew.png" alt="zm" width="200px" height="100px" border="0">
tail j=2343 line= <span><img src="/imgs/links/index_zm.png" alt="zm" width="400px" height="300px" border="0"></span>
tail j=2344 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="zm" width="200px" height="150px" border="0"></span> -->
tail j=2345 line= </a>
tail j=2346 line=
tail j=2347 line= <a class="thumbnail" href="index_dd.html" target=_blank>
tail j=2348 line= <img src="/imgs/btn/koeyeb.png" alt="dd" width="200px" height="100px" border="0">
tail j=2349 line= <span><img src="/imgs/links/index_dd.jpg" alt="dd" width="400px" height="300px" border="0"></span>
tail j=2350 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="dd" width="200px" height="150px" border="0"></span> -->
tail j=2351 line= </a>
tail j=2352 line=
tail j=2353 line= <a class="thumbnail" href="index_av.html" target=_blank>
tail j=2354 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2355 line= <span><img src="/imgs/links/index_av.jpg" alt="av" width="400px" height="300px" border="0"></span>
tail j=2356 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="av" width="200px" height="150px" border="0"></span> -->
tail j=2357 line= </a>
tail j=2358 line=
tail j=2359 line=
tail j=2360 line= <a class="thumbnail" href="index_vu.html" target=_blank>
tail j=2361 line= <img src="/imgs/btn/koeyeb.png" alt="vu" width="200px" height="100px" border="0">
tail j=2362 line= <span><img src="/imgs/links/index_vu.jpg" alt="vu" width="400px" height="300px" border="0"></span>
tail j=2363 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="vu" width="200px" height="150px" border="0"></span> -->
tail j=2364 line= </a>
tail j=2365 line=
tail j=2366 line=
tail j=2367 line=
tail j=2368 line=
tail j=2369 line=
tail j=2370 line=
tail j=2371 line=
tail j=2372 line= <hr color=red>
tail j=2373 line= <hr color=white>
tail j=2374 line=
tail j=2375 line=
tail j=2376 line=
tail j=2377 line=
tail j=2378 line=
tail j=2379 line=
tail j=2380 line=
tail j=2381 line=<!--
tail j=2382 line=
tail j=2383 line= <img v-on:click="showhidr" src="/tl/imgs/jtfdc_private_court_since_1979_viewin.png">
tail j=2384 line= <img v-on:click="showhide" src="/heart/heart.gif" alt="koeye.png" border=0>
tail j=2385 line= <span><img v-on:click="showhide" src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
tail j=2386 line= <img v-on:click="showhide" src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
tail j=2387 line= <button v-on:click="showhide">showhide</button>
tail j=2388 line= <button v-on:click="showhide">yokkmokk</button>
tail j=2389 line= -->
tail j=2390 line=
tail j=2391 line=
tail j=2392 line= <hr>
tail j=2393 line= </div>
tail j=2394 line=
tail j=2395 line= <div v-show="collapsed" class="detail">
tail j=2396 line= jaokim kopernicus wundersteine ii
tail j=2397 line=
tail j=2398 line= <hr>
tail j=2399 line= <a class="thumbnail" href=https://meet.jit.si/ko target=_blank>
tail j=2400 line= <img src=/imgs/links/tn/tn_meet_jkwii.png border=0>
tail j=2401 line= <span><img src=/imgs/links/meet_jkwii.png border=0></span>
tail j=2402 line= </a>
tail j=2403 line= <a class="thumbnail" href=./?q=jkwii4trustee target=_blank>
tail j=2404 line= <img src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
tail j=2405 line= <span><img src=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0></span>
tail j=2406 line= </a>
tail j=2407 line=
tail j=2408 line= <a class="thumbnail" href="/?q=unclesam">
tail j=2409 line= <img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
tail j=2410 line= <span> <img height=400 width=220 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
tail j=2411 line= </a>
tail j=2412 line=
tail j=2413 line=
tail j=2414 line= <a class="thumbnail" href=/ko_jtf/zm/jtf_parcels/jtfdc_012.html target=_blank>
tail j=2415 line= <img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
tail j=2416 line= <span> <img height=400 width=220 src="/tn_snap_20170123_110294.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
tail j=2417 line= </a>
tail j=2418 line=<!-- -->
tail j=2419 line= <a class="thumbnail" href="/?q=columgia">
tail j=2420 line= <img src="/imgs/btn/koeyew.png" alt="koeyew.png" width="200px" height="80" border="0" >
tail j=2421 line= <span> <img height=400 width=220 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
tail j=2422 line= </a>
tail j=2423 line= <a class="popover" href=./?q=handhither target=_blank>
tail j=2424 line= <img src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
tail j=2425 line= <span><img src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
tail j=2426 line= </a>
tail j=2427 line=
tail j=2428 line=<!--
tail j=2429 line= <h1>link_kludge</h1>
tail j=2430 line= <div id="link_kludge" >
tail j=2431 line= <a class="thumbnail" href="/?q=tn1">
tail j=2432 line= <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0">
tail j=2433 line= <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
tail j=2434 line=
tail j=2435 line= <a class="thumbnail" href="/?q=tn2">
tail j=2436 line= <img src="/imgs/btn/koeyew.png" alt="ok" width="50px" height="25px" border="0">
tail j=2437 line= <span><img src="/imgs/globes/globedragon.png" alt="globedragon"></span></a>
tail j=2438 line=
tail j=2439 line= <a class="thumbnail" href="/?q=tn2">
tail j=2440 line= <img src="/imgs/btn/koeyeb.png" alt="ok" width="50px" height="25px" border="0">
tail j=2441 line= <span><img src="/imgs/globes/globewrap.png" alt="globewrap"></span></a>
tail j=2442 line=
tail j=2443 line= <h1>overview</h1>
tail j=2444 line= <a class="thumbnail" href="/?q=overview"> <img src="/tl/imgs/tn/tn_construction_lights.gif" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/construction_lights.gif" alt="construction_lights"></span></a>
tail j=2445 line= <a class="thumbnail" href="/?q=ein_hundes_leben"> <img src="/tl/imgs/tn/tn_index_book-ein_hundes_leben.png" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/index_book-ein_hundes_leben.gif" alt="construction_lights"></span></a>
tail j=2446 line= <a class="thumbnail" href="/?q=deffords_charm"> <img src="/tl/imgs/tn/tn_tl_jtf28_jd.jpg" alt="deffords_charm" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_jtf28_jd.png" alt="deffords_charm"></span></a>
tail j=2447 line= <a class="thumbnail" href="/?q=jtf29_jak3busstop"> <img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop"></span></a>
tail j=2448 line= <a class="thumbnail" href="/?q=jtf29_pre_jtf31"> <img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31"></span></a>
tail j=2449 line= <a class="thumbnail" href="/?q=jtf29_private_court_since_1979_viewin"> <img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin"></span></a>
tail j=2450 line= <a class="thumbnail" href="/?q=jtfinc"> <img src="/tl/imgs/jtfinc.png" alt="jtfinc" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtfinc.png" alt="jtfinc"></span></a>
tail j=2451 line= <a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
tail j=2452 line= <a class="thumbnail" href="/?q=tl_kassil_walter_mil"> <img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter_mil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter"></span></a>
tail j=2453 line= <a class="thumbnail" href="/?q=tl_kassil_walter"> <img src="/tl/imgs/tl_kassil_mil.png" alt="tl_kassil_walter" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter.png" alt="tl_kassil_walter"></span></a>
tail j=2454 line= <a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
tail j=2455 line= <a class="thumbnail" href="/?q=tl_konet_text"> <img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text"></span></a>
tail j=2456 line= <a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
tail j=2457 line= <a class="thumbnail" href="/?q=iperms_hub"> <img src="/tl/imgs/img575.png" alt="iperms_hub" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms_hub.png" alt="iperms_hub"></span></a>
tail j=2458 line= <a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
tail j=2459 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot"></span></a>
tail j=2460 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones"></span></a>
tail j=2461 line= <a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye"></span></a>
tail j=2462 line= <a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc"></span></a>
tail j=2463 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief"></span></a>
tail j=2464 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2465 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2466 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2467 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2468 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2469 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0"> <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
tail j=2470 line= </div>
tail j=2471 line= -->
tail j=2472 line=
tail j=2473 line= </div>
tail j=2474 line= </div>
tail j=2475 line=
tail j=2476 line= <script id="script_new_vue">
tail j=2477 line= var app = new Vue({ el: "#app_jkwii",
tail j=2478 line= data: {
tail j=2479 line= collapsed: false
tail j=2480 line= },
tail j=2481 line= methods: {
tail j=2482 line= showhide: function() {
tail j=2483 line= if (!this.collapsed)
tail j=2484 line= this.collapsed = true;
tail j=2485 line= else
tail j=2486 line= this.collapsed = false;
tail j=2487 line= }
tail j=2488 line= }
tail j=2489 line= });
tail j=2490 line= </script id="script_new_vue">
tail j=2491 line=
tail j=2492 line=<!-- jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj -->
tail j=2493 line=
tail j=2494 line= <script id="script_resize" >
tail j=2495 line= document.body.style.fontfamily = "arial";
tail j=2496 line= function resizeText(multiplier) {
tail j=2497 line= if (document.body.style.fontSize == "") {
tail j=2498 line= document.body.style.fontSize = "1.0em";
tail j=2499 line= }
tail j=2500 line= document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
tail j=2501 line= }
tail j=2502 line= function refontText(multiplier) {
tail j=2503 line= if (document.body.style.fontSize == "") {
tail j=2504 line= document.body.style.fontSize = "2.0em";
tail j=2505 line= }
tail j=2506 line= document.body.style.font = "yokkmokkOT";
tail j=2507 line= }
tail j=2508 line= </script id="script_resize">
tail j=2509 line=<!--
tail j=2510 line= <img id="plustext" alt="Increase text size" height=50 src="/imgs/btn/kob.png" onclick="resizeText(1)" />
tail j=2511 line= < >
tail j=2512 line= <img id="minustext" alt="Decrease text size" height=50 src="/imgs/btn/kow.png" onclick="resizeText(-1)" />
tail j=2513 line= <img id="plusfont" alt="fontup" height=50 src="/imgs/btn/kob.png" onclick="refontText(1)" />
tail j=2514 line= < >
tail j=2515 line= <img id="minusfont" alt="fontdown" height=50 src="/imgs/btn/kow.png" onclick="refontText(-1)" />
tail j=2516 line= -->
tail j=2517 line= <hr>
tail j=2518 line= <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:48pt; font-style:italic" >
tail j=2519 line= abcdefghijklmnopqrstuvwxyz <br>
tail j=2520 line= ABCDEFGHIJKLMNOPQRSTUVWXYZ <br>
tail j=2521 line= 01234567890
tail j=2522 line= </font></span>
tail j=2523 line= <hr>
tail j=2524 line=
tail j=2525 line=<!-- <button type="kogrids" id="kogrids" onclick="kogrids('')">-= kogrids =-</button> -->
tail j=2526 line= <div id="div_kogrids"></div>
tail j=2527 line=
tail j=2528 line=
tail j=2529 line=<!--
tail j=2530 line= <div id="kov">
tail j=2531 line= <div>
tail j=2532 line= kov is it: kov
tail j=2533 line= </div>
tail j=2534 line= <button v-on:click="showhide_kov">showhide_kov</button>
tail j=2535 line= <img v-on:click="showhide_kov1" src="/imgs/btn/kob.png" >
tail j=2536 line= <img v-on:click="showhide_kov" src="/imgs/btn/koeye.png" >
tail j=2537 line= <img v-on:click="showhide_kov2" src="/imgs/btn/kow.png" >
tail j=2538 line=
tail j=2539 line= <div v-show="collapsed" class="detail">
tail j=2540 line= kov detail
tail j=2541 line= <hr>
tail j=2542 line= <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
tail j=2543 line= <img src=/imgs/links/tn/tn_meet.png border=0>
tail j=2544 line= <span><img src=/imgs/links/meet.png border=0></span>
tail j=2545 line= </a>
tail j=2546 line= <hr>
tail j=2547 line= </div>
tail j=2548 line= </div>
tail j=2549 line= <script id="script_new_vue_kov">
tail j=2550 line= var kov = new Vue({ el: "#kov",
tail j=2551 line= data: {collapsed: false},
tail j=2552 line= methods: {
tail j=2553 line= showhide_kov: function() {
tail j=2554 line= if (!this.collapsed) this.collapsed = true;
tail j=2555 line= else this.collapsed = false;
tail j=2556 line=// document.body.style.background = "darkslategrey";
tail j=2557 line=// document.body.style.color = "black";
tail j=2558 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2559 line=// document.body.style.fontsize = "24pt";
tail j=2560 line= },
tail j=2561 line= showhide_kov1: function() {
tail j=2562 line= if (!this.collapsed) this.collapsed = true;
tail j=2563 line= else this.collapsed = false;
tail j=2564 line= },
tail j=2565 line= showhide_kov2: function() {
tail j=2566 line= if (!this.collapsed) this.collapsed = true;
tail j=2567 line= else this.collapsed = false;
tail j=2568 line= }
tail j=2569 line= }
tail j=2570 line= });
tail j=2571 line= </script id="script_new_vue_kov">
tail j=2572 line=
tail j=2573 line= <hr>
tail j=2574 line=abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 01234567890
tail j=2575 line= <hr>
tail j=2576 line= -->
tail j=2577 line=
tail j=2578 line=
tail j=2579 line= <div id="kov_ko">
tail j=2580 line= <div>
tail j=2581 line= ko: kov_ko
tail j=2582 line= </div>
tail j=2583 line= <button v-on:click="showhide_kov_ko">showhide_kov_ko</button>
tail j=2584 line= <img v-on:click="showhide_kov_ko1" src="/imgs/btn/kob.png" >
tail j=2585 line= <img v-on:click="showhide_kov_ko" src="/imgs/btn/koeye.png" >
tail j=2586 line= <img v-on:click="showhide_kov_ko2" src="/imgs/btn/kow.png" >
tail j=2587 line=
tail j=2588 line= <div v-show="collapsed" class="detail_ko">
tail j=2589 line= ko
tail j=2590 line= <hr>
tail j=2591 line= <a href=kov_ko.html class="thumbnail" target=_blank>
tail j=2592 line= <img src=/imgs/kov/tn/tn_kov_ko.png border=0>
tail j=2593 line= <span><img src=/imgs/kov/tn/tn_kov_ko.png border=0></span>
tail j=2594 line= </a>
tail j=2595 line= <hr>
tail j=2596 line=
tail j=2597 line=
tail j=2598 line=
tail j=2599 line= <div id="drag" >
tail j=2600 line= <a class="popover" href="/?q=bigtn_drag1">
tail j=2601 line= <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
tail j=2602 line= <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
tail j=2603 line= </a>
tail j=2604 line= </div>
tail j=2605 line=
tail j=2606 line=
tail j=2607 line=
tail j=2608 line=<!--
tail j=2609 line= <div id="drop">
tail j=2610 line= <span id="sw"><h1>droptop</h2></span>
tail j=2611 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=2612 line= <img height=200 width=300
tail j=2613 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=2614 line= </a>
tail j=2615 line= </div>
tail j=2616 line= -->
tail j=2617 line=
tail j=2618 line=
tail j=2619 line=
tail j=2620 line= </div>
tail j=2621 line= </div>
tail j=2622 line=
tail j=2623 line=
tail j=2624 line=
tail j=2625 line= <div id="div_showhide" hidden>
tail j=2626 line= <button type="button" id="show">Show Content</button>
tail j=2627 line= <button type="button" id="hide">Hide Content</button>
tail j=2628 line= <button type="show_dd" id="show_dd">Show_dd</button>
tail j=2629 line= <button type="hide_dd" id="hide_dd">Hide_dd</button>
tail j=2630 line= <button type="show_bb" id="show_bb">Show_bb</button>
tail j=2631 line= <button type="hide_bb" id="hide_bb">Hide_bb</button>
tail j=2632 line= <button type="show_tl" id="show_tl">Show_tl</button>
tail j=2633 line= <button type="hide_tl" id="hide_tl">Hide_tl</button>
tail j=2634 line= <button type="show_colors" id="show_colors">Show_colors</button>
tail j=2635 line= <button type="hide_colors" id="hide_colors">Hide_colors</button>
tail j=2636 line= <button type="show_fonts" id="show_fonts">Show_fonts</button>
tail j=2637 line= <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
tail j=2638 line= <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
tail j=2639 line= <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
tail j=2640 line= </div>
tail j=2641 line=
tail j=2642 line= <div id="item" hidden>
tail j=2643 line= <hr><h1>div_showhide</h1><hr>
tail j=2644 line= </div>
tail j=2645 line=
tail j=2646 line= <script id="script_showhide">
tail j=2647 line= $( "#show" ).click(function() {$('#item').show(); });
tail j=2648 line= $( "#hide" ).click(function() {$('#item').hide();});
tail j=2649 line= $( "#show_dd" ).click(function() {$('#div_dd').show(); });
tail j=2650 line= $( "#hide_dd" ).click(function() {$('#div_dd').hide();});
tail j=2651 line= $( "#show_bb" ).click(function() {$('#div_bb').show(); });
tail j=2652 line= $( "#hide_bb" ).click(function() {$('#div_bb').hide();});
tail j=2653 line= $( "#show_tl" ).click(function() {$('#div_tl').show(); });
tail j=2654 line= $( "#hide_tl" ).click(function() {$('#div_tl').hide();});
tail j=2655 line= $( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
tail j=2656 line= $( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
tail j=2657 line= $( "#show_colors" ).click(function() {$('#div_colors').show(); });
tail j=2658 line= $( "#hide_colors" ).click(function() {$('#div_colors').hide();});
tail j=2659 line= $( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
tail j=2660 line= $( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
tail j=2661 line= $( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
tail j=2662 line= $( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
tail j=2663 line= </script id="script_showhide">
tail j=2664 line=
tail j=2665 line=
tail j=2666 line= </div>
tail j=2667 line= </div>
tail j=2668 line= </div>
tail j=2669 line=
tail j=2670 line= <script id="script_kov_ko" >
tail j=2671 line= var kov_ko = new Vue({ el: "#kov_ko",
tail j=2672 line= data: {collapsed: false},
tail j=2673 line= methods: {
tail j=2674 line= showhide_kov_ko: function() {
tail j=2675 line= if (!this.collapsed) this.collapsed = true;
tail j=2676 line= else this.collapsed = false;
tail j=2677 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=2678 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2679 line=
tail j=2680 line= },
tail j=2681 line= showhide_kov_ko1: function() {
tail j=2682 line= if (!this.collapsed) this.collapsed = true;
tail j=2683 line= else this.collapsed = false;
tail j=2684 line= },
tail j=2685 line= showhide_kov_ko2: function() {
tail j=2686 line= if (!this.collapsed) this.collapsed = true;
tail j=2687 line= else this.collapsed = false;
tail j=2688 line= }
tail j=2689 line= }
tail j=2690 line= });
tail j=2691 line= </script id="script_kov_ko" >
tail j=2692 line=
tail j=2693 line=
tail j=2694 line=
tail j=2695 line=
tail j=2696 line=
tail j=2697 line=
tail j=2698 line= <div id="kov_new">
tail j=2699 line= <div>
tail j=2700 line= new: kov_new
tail j=2701 line= </div>
tail j=2702 line= <button v-on:click="showhide_kov_new">showhide_kov_new</button>
tail j=2703 line= <img v-on:click="showhide_kov_new" src="/imgs/btn/koeye.png" >
tail j=2704 line= <img v-on:click="showhide_kov_new1" src="/imgs/btn/kob.png" >
tail j=2705 line= <img v-on:click="showhide_kov_new2" src="/imgs/btn/kow.png" >
tail j=2706 line=
tail j=2707 line= <div v-show="collapsed" class="detail_new">
tail j=2708 line= new
tail j=2709 line= <hr>
tail j=2710 line= <a href=https://meet.jit.si/new class="thumbnail" target=_blank>
tail j=2711 line= <img src=/imgs/links/tn/tn_meet_new.png border=0>
tail j=2712 line= <span><img src=/imgs/links/tn/tn_meet_new.png border=0></span>
tail j=2713 line= </a>
tail j=2714 line=
tail j=2715 line=
tail j=2716 line= <hr color=yellow>
tail j=2717 line= <h1>atwist_page</h1>
tail j=2718 line= <div id="container" class="">
tail j=2719 line= <div class="box"></div>
tail j=2720 line= <div class="box-back"></div>
tail j=2721 line= </div>
tail j=2722 line=
tail j=2723 line=
tail j=2724 line= <button id="animate" class="kogo">kogo</button>
tail j=2725 line= <script id="script_atwist_page">
tail j=2726 line= var goButton = document.getElementById("animate");
tail j=2727 line= var container = document.getElementById("container");
tail j=2728 line= goButton.addEventListener('click', function() {
tail j=2729 line= container.classList.toggle('active');
tail j=2730 line= });
tail j=2731 line= </script id="script_atwist_page">
tail j=2732 line=
tail j=2733 line= <hr color=yellow>
tail j=2734 line=
tail j=2735 line=
tail j=2736 line=
tail j=2737 line=
tail j=2738 line=
tail j=2739 line=<a id="drag" class="thumbnail" href="/index_zm.html?zmid=zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility" target=_blank>
tail j=2740 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility/TileGroup0/0-0-0.jpg" border=0>
tail j=2741 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_donovanlaw_containment_facility.png" border=0></span>
tail j=2742 line= </a>
tail j=2743 line=
tail j=2744 line=<a id="drag" class="thumbnail" href="/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus" target=_blank>
tail j=2745 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus/TileGroup0/0-0-0.jpg" border=0>
tail j=2746 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_byrdpuckers_dogpony_campus.png" border=0></span>
tail j=2747 line= </a>
tail j=2748 line=
tail j=2749 line=<a id="drag" class="popover" href=/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_kou_campus target=_blank>
tail j=2750 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_kou_campus/TileGroup0/0-0-0.jpg" border=0>
tail j=2751 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_kou_campus.png" border=0></span>
tail j=2752 line= </a>
tail j=2753 line=
tail j=2754 line=<img src="/imgs/links/eyes_023.gif">
tail j=2755 line=
tail j=2756 line=
tail j=2757 line=
tail j=2758 line=
tail j=2759 line=
tail j=2760 line= </div>
tail j=2761 line= </div>
tail j=2762 line=
tail j=2763 line= <script id="script_kov_new">
tail j=2764 line= var kov_new = new Vue({ el: "#kov_new",
tail j=2765 line= data: {collapsed: false},
tail j=2766 line= methods: {
tail j=2767 line= showhide_kov_new: function() {
tail j=2768 line= if (!this.collapsed) this.collapsed = true;
tail j=2769 line= else this.collapsed = false;
tail j=2770 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=2771 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2772 line=
tail j=2773 line=// document.body.style.background = "darkslategrey";
tail j=2774 line=// document.body.style.color = "black";
tail j=2775 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2776 line=// document.body.style.fontsize = "24pt";
tail j=2777 line= },
tail j=2778 line= showhide_kov_new1: function() {
tail j=2779 line= if (!this.collapsed) this.collapsed = true;
tail j=2780 line= else this.collapsed = false;
tail j=2781 line= },
tail j=2782 line= showhide_kov_new2: function() {
tail j=2783 line= if (!this.collapsed) this.collapsed = true;
tail j=2784 line= else this.collapsed = false;
tail j=2785 line= }
tail j=2786 line= }
tail j=2787 line= });
tail j=2788 line= </script id="script_kov_new">
tail j=2789 line=
tail j=2790 line=
tail j=2791 line= <div id="div_kov_focus">
tail j=2792 line= <div>
tail j=2793 line= focus: kov_focus
tail j=2794 line= </div>
tail j=2795 line= <button v-on:click="showhide_kov_focus">showhide_kov_focus</button>
tail j=2796 line= <img v-on:click="showhide_kov_focus" src="/imgs/btn/koeye.png" >
tail j=2797 line= <img v-on:click="showhide_kov_focus1" src="/imgs/btn/kob.png" >
tail j=2798 line= <img v-on:click="showhide_kov_focus2" src="/imgs/btn/kow.png" >
tail j=2799 line=
tail j=2800 line= <div v-show="collapsed" class="detail_focus">
tail j=2801 line= focus2
tail j=2802 line= <hr>
tail j=2803 line= <a href=https://meet.jit.si/focus class="thumbnail" target=_blank>
tail j=2804 line= <img height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=2805 line= <span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=2806 line= </a>
tail j=2807 line= <hr>
tail j=2808 line=
tail j=2809 line= <a href=/imgs/links/warning_light.gif id="drag" target=_blank>
tail j=2810 line= <img class="drg" height=200 src=/imgs/links/warning_light.gif border=0>
tail j=2811 line= </a>
tail j=2812 line=
tail j=2813 line= <div id="drag">
tail j=2814 line= <div class="drg">
tail j=2815 line= <h3>preview_deck_rocksoup</h3>
tail j=2816 line= <div id="div_deck_rocksoup">
tail j=2817 line= <a class="popover" href=http://ka12/index_dk.html#rocksoup alt=index_dk_rocksoup target=_blank>
tail j=2818 line= <img width=200 height=200 src=imgs/links/rocksoup_rock.png alt=rocksoup_rock border=0>
tail j=2819 line= <span><img width=200 height=200 src=/imgs/links/rocksoup_pot.png alt=rocksoup_pot border=0></span>
tail j=2820 line= </a>
tail j=2821 line= </div>
tail j=2822 line= </div>
tail j=2823 line= </div>
tail j=2824 line=
tail j=2825 line=
tail j=2826 line=
tail j=2827 line= <a id="drag" class="thumbnail" href="svc/emchat/index.html" target=_blank>
tail j=2828 line= <img class="drg" src="/imgs/links/links_emchat.png" border=0>
tail j=2829 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_emchat.png" border=0></span>
tail j=2830 line= </a>
tail j=2831 line=
tail j=2832 line= <a id="drag" class="thumbnail" href="svc/ol/ht/index.html" target=_blank>
tail j=2833 line= <img class="drg" src="/imgs/links/links_ol.png" border=0>
tail j=2834 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_ol.png" border=0></span>
tail j=2835 line= </a>
tail j=2836 line=
tail j=2837 line=<!--
tail j=2838 line= <button type="button" onclick="script_ajax()">ajax</button>
tail j=2839 line= <img src="/imgs/btn/koeye_handhi.gif" onclick="script_ajax()">
tail j=2840 line= <div id="div_ajaxdb"><h2>div_ajaxdb</h2></div>
tail j=2841 line= -->
tail j=2842 line=
tail j=2843 line= </div>
tail j=2844 line= </div id="div_kov_focus">
tail j=2845 line=
tail j=2846 line= <script id="script_kov_focus" >
tail j=2847 line= var kov_focus = new Vue({ el: "#kov_focus",
tail j=2848 line= data: {collapsed: false},
tail j=2849 line= methods: {
tail j=2850 line= showhide_kov_focus: function() {
tail j=2851 line= if (!this.collapsed) this.collapsed = true;
tail j=2852 line= else this.collapsed = false;
tail j=2853 line= document.getElementById("kov_focus").style.font = "italic bold 20px arial,serif";
tail j=2854 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2855 line=
tail j=2856 line=// document.body.style.background = "darkslategrey";
tail j=2857 line=// document.body.style.color = "black";
tail j=2858 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2859 line=// document.body.style.fontsize = "24pt";
tail j=2860 line= },
tail j=2861 line= showhide_kov_focus1: function() {
tail j=2862 line= if (!this.collapsed) this.collapsed = true;
tail j=2863 line= else this.collapsed = false;
tail j=2864 line= },
tail j=2865 line= showhide_kov_focus2: function() {
tail j=2866 line= if (!this.collapsed) this.collapsed = true;
tail j=2867 line= else this.collapsed = false;
tail j=2868 line= }
tail j=2869 line= }
tail j=2870 line= });
tail j=2871 line= </script id="script_kov_focus" >
tail j=2872 line=
tail j=2873 line=
tail j=2874 line=
tail j=2875 line=
tail j=2876 line=
tail j=2877 line= <div id="kov_food">
tail j=2878 line= <div>
tail j=2879 line= kov_food:
tail j=2880 line= </div>
tail j=2881 line= <button v-on:click="showhide_kov_food">showhide_kov_food</button>
tail j=2882 line= <img v-on:click="showhide_kov_food" src="/imgs/btn/koeye.png" >
tail j=2883 line= <img v-on:click="showhide_kov_food1" src="/imgs/btn/kob.png" >
tail j=2884 line= <img v-on:click="showhide_kov_food2" src="/imgs/btn/kow.png" >
tail j=2885 line=
tail j=2886 line= <div v-show="collapsed" class="detail_food">
tail j=2887 line= kov_food
tail j=2888 line= <div id="drag"> kov_food:<br />
tail j=2889 line= <a href=kov_food.html class="thumbnail" target=_blank>
tail j=2890 line= <img class="drg" src="/imgs/kov/tn/tn_kov_food.png" alt="kov_food" width="50" class="drg"/>
tail j=2891 line= <span><img class="drg" src="/imgs/kov/kov_food.png" alt="kov_food" width="50" class="drg"/></span>
tail j=2892 line= </a>
tail j=2893 line= </div>
tail j=2894 line=
tail j=2895 line=
tail j=2896 line= </div>
tail j=2897 line= </div>
tail j=2898 line=
tail j=2899 line= <script>var kov_food = new Vue({ el: "#kov_food",
tail j=2900 line= data: {collapsed: false},
tail j=2901 line= methods: {
tail j=2902 line= showhide_kov_food: function() {
tail j=2903 line= if (!this.collapsed) this.collapsed = true;
tail j=2904 line= else this.collapsed = false;
tail j=2905 line= document.getElementById("kov_food").style.font = "italic bold 20px arial,serif";
tail j=2906 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2907 line=
tail j=2908 line=// document.body.style.background = "darkslategrey";
tail j=2909 line=// document.body.style.color = "black";
tail j=2910 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2911 line=// document.body.style.fontsize = "24pt";
tail j=2912 line= },
tail j=2913 line= showhide_kov_food1: function() {
tail j=2914 line= if (!this.collapsed) this.collapsed = true;
tail j=2915 line= else this.collapsed = false;
tail j=2916 line= },
tail j=2917 line= showhide_kov_food2: function() {
tail j=2918 line= if (!this.collapsed) this.collapsed = true;
tail j=2919 line= else this.collapsed = false;
tail j=2920 line= }
tail j=2921 line= }
tail j=2922 line= });
tail j=2923 line= </script>
tail j=2924 line=
tail j=2925 line=
tail j=2926 line=
tail j=2927 line=
tail j=2928 line= <div id="kov_courtreport">
tail j=2929 line= <div>
tail j=2930 line= kov_courtreport:
tail j=2931 line= </div>
tail j=2932 line= <button v-on:click="showhide_kov_courtreport">showhide_kov_courtreport</button>
tail j=2933 line= <img v-on:click="showhide_kov_courtreport" src="/imgs/btn/koeye.png" >
tail j=2934 line= <img v-on:click="showhide_kov_courtreport1" src="/imgs/btn/kob.png" >
tail j=2935 line= <img v-on:click="showhide_kov_courtreport2" src="/imgs/btn/kow.png" >
tail j=2936 line=
tail j=2937 line= <div v-show="collapsed" class="detail_courtreport">
tail j=2938 line= kov_courtreport
tail j=2939 line= <div id="drag"> kov_courtreport:<br />
tail j=2940 line= <a href=kov_food.html class="thumbnail" target=_blank>
tail j=2941 line= <img class="drg" src="/imgs/kov/tn/tn_kov_courtreport.png" alt="kov_food" width="50" class="drg"/>
tail j=2942 line= <span><img class="drg" src="/imgs/kov/kov_courtreport.png" alt="kov_food" width="50" class="drg"/></span>
tail j=2943 line= </a>
tail j=2944 line= </div>
tail j=2945 line=
tail j=2946 line= </div>
tail j=2947 line= </div>
tail j=2948 line=
tail j=2949 line= <script>var kov_courtreport = new Vue({ el: "#kov_courtreport",
tail j=2950 line= data: {collapsed: false},
tail j=2951 line= methods: {
tail j=2952 line= showhide_kov_courtreport: function() {
tail j=2953 line= if (!this.collapsed) this.collapsed = true;
tail j=2954 line= else this.collapsed = false;
tail j=2955 line= document.getElementById("kov_courtreport").style.font = "italic bold 20px arial,serif";
tail j=2956 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2957 line=
tail j=2958 line=// document.body.style.background = "darkslategrey";
tail j=2959 line=// document.body.style.color = "black";
tail j=2960 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2961 line=// document.body.style.fontsize = "24pt";
tail j=2962 line= },
tail j=2963 line= showhide_kov_courtreport1: function() {
tail j=2964 line= if (!this.collapsed) this.collapsed = true;
tail j=2965 line= else this.collapsed = false;
tail j=2966 line= },
tail j=2967 line= showhide_kov_courtreport2: function() {
tail j=2968 line= if (!this.collapsed) this.collapsed = true;
tail j=2969 line= else this.collapsed = false;
tail j=2970 line= }
tail j=2971 line= }
tail j=2972 line= });
tail j=2973 line= </script>
tail j=2974 line=
tail j=2975 line=
tail j=2976 line=
tail j=2977 line=
tail j=2978 line= <div id="kov_where">
tail j=2979 line= <div>
tail j=2980 line= kov_where:
tail j=2981 line= </div>
tail j=2982 line= <button v-on:click="showhide_kov_where">showhide_kov_where</button>
tail j=2983 line= <img v-on:click="showhide_kov_where" src="/imgs/btn/koeye.png" >
tail j=2984 line= <img v-on:click="showhide_kov_where1" src="/imgs/btn/kob.png" >
tail j=2985 line= <img v-on:click="showhide_kov_where2" src="/imgs/btn/kow.png" >
tail j=2986 line=
tail j=2987 line= <div v-show="collapsed" class="detail_where">
tail j=2988 line=
tail j=2989 line= where
tail j=2990 line= <hr color=yellow>
tail j=2991 line=
tail j=2992 line= <a id="drag" class="thumbnail" href="/svc/ol/ht/index.html" target=_blank>
tail j=2993 line= <img class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0>
tail j=2994 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0></span>
tail j=2995 line= </a>
tail j=2996 line=
tail j=2997 line=
tail j=2998 line= <div id="div_gigapan" id="drag" >
tail j=2999 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
tail j=3000 line= <img class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
tail j=3001 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
tail j=3002 line= </a>
tail j=3003 line=
tail j=3004 line=
tail j=3005 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com" target=_blank>
tail j=3006 line= <img height=200 class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0>
tail j=3007 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0></span>
tail j=3008 line= </a>
tail j=3009 line= </div>
tail j=3010 line=
tail j=3011 line=
tail j=3012 line=
tail j=3013 line= <div id="drag"> where:<br />
tail j=3014 line=
tail j=3015 line=<!--
tail j=3016 line= <a href=https://meet.jit.si/where class="thumbnail" target=_blank>
tail j=3017 line= <img height=100 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=3018 line= <span><img height=200 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/></span>
tail j=3019 line= </a>
tail j=3020 line= -->
tail j=3021 line=
tail j=3022 line=<!--
tail j=3023 line= <div class="drg"><h1>konet llc </h1>
tail j=3024 line= <pre>timejask jkwii</pre>
tail j=3025 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=3026 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=3027 line= <pre>timesak where</pre>
tail j=3028 line= </div>
tail j=3029 line= -->
tail j=3030 line=
tail j=3031 line= <div class="drg"><h1>jitsimeet/where </h1>
tail j=3032 line= <a href="https://jit.si.meee/where" id="drag" targer=_blank class="thumbnail">
tail j=3033 line= <img height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=3034 line= <span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=3035 line= </a>
tail j=3036 line= </div>
tail j=3037 line=
tail j=3038 line= <div id="drag"> where:<br />
tail j=3039 line= <a class="drg" href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
tail j=3040 line= <img height=200 src=/imgs/links/warning_light.gif border=0>
tail j=3041 line= <span><img src=/links/warning_light.gif border=0></span>
tail j=3042 line= </a>
tail j=3043 line= </div>
tail j=3044 line= </div>
tail j=3045 line= </div>
tail j=3046 line= <hr>
tail j=3047 line=
tail j=3048 line=
tail j=3049 line=
tail j=3050 line=
tail j=3051 line=
tail j=3052 line= </div>
tail j=3053 line= </div>
tail j=3054 line=
tail j=3055 line= <script>var kov_where = new Vue({ el: "#kov_where",
tail j=3056 line= data: {collapsed: false},
tail j=3057 line= methods: {
tail j=3058 line= showhide_kov_where: function() {
tail j=3059 line= if (!this.collapsed) this.collapsed = true;
tail j=3060 line= else this.collapsed = false;
tail j=3061 line= document.getElementById("kov_where").style.font = "italic bold 20px arial,serif";
tail j=3062 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3063 line=
tail j=3064 line=// document.body.style.background = "darkslategrey";
tail j=3065 line=// document.body.style.color = "black";
tail j=3066 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3067 line=// document.body.style.fontsize = "24pt";
tail j=3068 line= },
tail j=3069 line= showhide_kov_where1: function() {
tail j=3070 line= if (!this.collapsed) this.collapsed = true;
tail j=3071 line= else this.collapsed = false;
tail j=3072 line= },
tail j=3073 line= showhide_kov_where2: function() {
tail j=3074 line= if (!this.collapsed) this.collapsed = true;
tail j=3075 line= else this.collapsed = false;
tail j=3076 line= }
tail j=3077 line= }
tail j=3078 line= });
tail j=3079 line= </script>
tail j=3080 line=
tail j=3081 line=
tail j=3082 line=
tail j=3083 line=
tail j=3084 line=
tail j=3085 line=
tail j=3086 line=
tail j=3087 line=
tail j=3088 line=
tail j=3089 line=
tail j=3090 line=
tail j=3091 line=
tail j=3092 line=
tail j=3093 line=
tail j=3094 line=
tail j=3095 line=
tail j=3096 line=
tail j=3097 line= <div id="kov_work">
tail j=3098 line= <div>
tail j=3099 line= kov_work:
tail j=3100 line= </div>
tail j=3101 line= <button v-on:click="showhide_kov_work">showhide_kov_work</button>
tail j=3102 line= <img v-on:click="showhide_kov_work" src="/imgs/btn/koeye.png" >
tail j=3103 line= <img v-on:click="showhide_kov_work1" src="/imgs/btn/kob.png" >
tail j=3104 line= <img v-on:click="showhide_kov_work2" src="/imgs/btn/kow.png" >
tail j=3105 line=
tail j=3106 line= <div v-show="collapsed" class="detail_work">
tail j=3107 line= kov_work
tail j=3108 line= <div id="drag"> kov_work:<br />
tail j=3109 line= <a href=kov_work.html class="thumbnail" target=_blank>
tail j=3110 line= <img class="drg" src="/imgs/kov/tn/tn_kov_work.png" alt="kov_food" width="50" class="drg"/>
tail j=3111 line= <span><img class="drg" src="/imgs/kov/kov_work.png" alt="kov_food" width="50" class="drg"/></span>
tail j=3112 line= </a>
tail j=3113 line= </div>
tail j=3114 line=
tail j=3115 line=
tail j=3116 line= </div>
tail j=3117 line= </div>
tail j=3118 line=
tail j=3119 line= <script>var kov = new Vue({ el: "#kov_work",
tail j=3120 line= data: {collapsed: false},
tail j=3121 line= methods: {
tail j=3122 line= showhide_kov_work: function() {
tail j=3123 line= if (!this.collapsed) this.collapsed = true;
tail j=3124 line= else this.collapsed = false;
tail j=3125 line=// document.body.style.background = "darkslategrey";
tail j=3126 line=// document.body.style.color = "black";
tail j=3127 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3128 line=// document.body.style.fontsize = "24pt";
tail j=3129 line= },
tail j=3130 line= showhide_kov_work1: function() {
tail j=3131 line= if (!this.collapsed) this.collapsed = true;
tail j=3132 line= else this.collapsed = false;
tail j=3133 line= },
tail j=3134 line= showhide_kov_work2: function() {
tail j=3135 line= if (!this.collapsed) this.collapsed = true;
tail j=3136 line= else this.collapsed = false;
tail j=3137 line= }
tail j=3138 line= }
tail j=3139 line= });
tail j=3140 line= </script>
tail j=3141 line=
tail j=3142 line=
tail j=3143 line=
tail j=3144 line= <div id="kov_memes">
tail j=3145 line= <div>
tail j=3146 line= memes: kov_memes
tail j=3147 line= </div>
tail j=3148 line= <button v-on:click="showhide_kov_memes">showhide_kov_memes</button>
tail j=3149 line= <img v-on:click="showhide_kov_memes" src="/imgs/btn/koeye.png" >
tail j=3150 line= <img v-on:click="showhide_kov_memes1" src="/imgs/btn/kob.png" >
tail j=3151 line= <img v-on:click="showhide_kov_memes2" src="/imgs/btn/kow.png" >
tail j=3152 line=
tail j=3153 line= <div v-show="collapsed" class="detail_memes">
tail j=3154 line= kov_memes
tail j=3155 line= <div id="drag"> kov_memes:<br />
tail j=3156 line= <a href=kov_memes.html class="thumbnail" target=_blank>
tail j=3157 line= <img class="drg" src="/imgs/kov/tn/tn_kov_memes.png" alt="kov_food" width="50" class="drg"/>
tail j=3158 line= <span><img class="drg" src="/imgs/kov/kov_memes.png" alt="kov_food" width="50" class="drg"/></span>
tail j=3159 line= </a>
tail j=3160 line= </div>
tail j=3161 line=
tail j=3162 line= </div>
tail j=3163 line= </div>
tail j=3164 line=
tail j=3165 line= <script>var kov_memes = new Vue({ el: "#kov_memes",
tail j=3166 line= data: {collapsed: false},
tail j=3167 line= methods: {
tail j=3168 line= showhide_kov_memes: function() {
tail j=3169 line= if (!this.collapsed) this.collapsed = true;
tail j=3170 line= else this.collapsed = false;
tail j=3171 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3172 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3173 line=
tail j=3174 line=// document.body.style.background = "darkslategrey";
tail j=3175 line=// document.body.style.color = "black";
tail j=3176 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3177 line=// document.body.style.fontsize = "24pt";
tail j=3178 line= },
tail j=3179 line= showhide_kov_memes1: function() {
tail j=3180 line= if (!this.collapsed) this.collapsed = true;
tail j=3181 line= else this.collapsed = false;
tail j=3182 line= },
tail j=3183 line= showhide_kov_memes2: function() {
tail j=3184 line= if (!this.collapsed) this.collapsed = true;
tail j=3185 line= else this.collapsed = false;
tail j=3186 line= }
tail j=3187 line= }
tail j=3188 line= });
tail j=3189 line= </script>
tail j=3190 line=
tail j=3191 line=
tail j=3192 line= <div id="kov_kids">
tail j=3193 line= <div>
tail j=3194 line= kids: kov_kids
tail j=3195 line= </div>
tail j=3196 line= <button v-on:click="showhide_kov_kids">showhide_kov_kids</button>
tail j=3197 line= <img v-on:click="showhide_kov_kids" src="/imgs/btn/koeye.png" >
tail j=3198 line= <img v-on:click="showhide_kov_kids1" src="/imgs/btn/kob.png" >
tail j=3199 line= <img v-on:click="showhide_kov_kids2" src="/imgs/btn/kow.png" >
tail j=3200 line=
tail j=3201 line= <div v-show="collapsed" class="detail_kids">
tail j=3202 line= kov_kids
tail j=3203 line= <div id="drag"> kov_kids:<br />
tail j=3204 line= <a href=kov_kids.html class="thumbnail" target=_blank>
tail j=3205 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kids.png" alt="kov_food" width="200" class="drg"/>
tail j=3206 line= <span><img class="drg" src="/imgs/kov/kov_kids.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3207 line= </a>
tail j=3208 line=
tail j=3209 line=
tail j=3210 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
tail j=3211 line= <img class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
tail j=3212 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
tail j=3213 line= </a>
tail j=3214 line=
tail j=3215 line=
tail j=3216 line= <a href=/ko/svc/js/stemkoskijs/Three.js/Voxel-Painter.html class="thumbnail" target=_blank>
tail j=3217 line= <img height =200 src="/imgs/links/tn/tn_voxelpainter.png">
tail j=3218 line= <span><img height=400 src="/imgs/links/tn/tn_voxelpainter.png"></span>
tail j=3219 line= </a>
tail j=3220 line=
tail j=3221 line= <a href=/ko/svc/js/stemkoskijs/Three.js/ class="thumbnail" target=_blank>
tail j=3222 line= <img height =200 src="/imgs/links/tn/tn_stemkoskijs.png">
tail j=3223 line= <span><img height=400 src="/imgs/links/tn/tn_stemkoskijs.png"></span>
tail j=3224 line= </a>
tail j=3225 line=
tail j=3226 line= <a href=ko/svc/js/stemkoskijs/Three.js/ target=_blank>
tail j=3227 line=
tail j=3228 line= </a>
tail j=3229 line=
tail j=3230 line=
tail j=3231 line= </div>
tail j=3232 line= </div>
tail j=3233 line=
tail j=3234 line=<!--
tail j=3235 line=harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
tail j=3236 line=morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
tail j=3237 line=morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
tail j=3238 line=harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
tail j=3239 line=georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
tail j=3240 line= -->
tail j=3241 line=
tail j=3242 line=
tail j=3243 line=
tail j=3244 line= </div>
tail j=3245 line=
tail j=3246 line= </a>
tail j=3247 line=
tail j=3248 line=
tail j=3249 line= </div>
tail j=3250 line= </div>
tail j=3251 line=
tail j=3252 line=<!--
tail j=3253 line=harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
tail j=3254 line=morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
tail j=3255 line=morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
tail j=3256 line=harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
tail j=3257 line=georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
tail j=3258 line= -->
tail j=3259 line=
tail j=3260 line=
tail j=3261 line=
tail j=3262 line= </div>
tail j=3263 line= </div>
tail j=3264 line=
tail j=3265 line= <script>var kov_kids = new Vue({ el: "#kov_kids",
tail j=3266 line= data: {collapsed: false},
tail j=3267 line= methods: {
tail j=3268 line= showhide_kov_kids: function() {
tail j=3269 line= if (!this.collapsed) this.collapsed = true;
tail j=3270 line= else this.collapsed = false;
tail j=3271 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3272 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3273 line=
tail j=3274 line=// document.body.style.background = "darkslategrey";
tail j=3275 line=// document.body.style.color = "black";
tail j=3276 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3277 line=// document.body.style.fontsize = "24pt";
tail j=3278 line= },
tail j=3279 line= showhide_kov_kids1: function() {
tail j=3280 line= if (!this.collapsed) this.collapsed = true;
tail j=3281 line= else this.collapsed = false;
tail j=3282 line= },
tail j=3283 line= showhide_kov_kids2: function() {
tail j=3284 line= if (!this.collapsed) this.collapsed = true;
tail j=3285 line= else this.collapsed = false;
tail j=3286 line= }
tail j=3287 line= }
tail j=3288 line= });
tail j=3289 line= </script>
tail j=3290 line=
tail j=3291 line=
tail j=3292 line=
tail j=3293 line=
tail j=3294 line=
tail j=3295 line=
tail j=3296 line= <div id="kov_dogs">
tail j=3297 line= <div>
tail j=3298 line= dogs: kov_dogs
tail j=3299 line= </div>
tail j=3300 line= <button v-on:click="showhide_kov_dogs">showhide_kov_dogs</button>
tail j=3301 line= <img v-on:click="showhide_kov_dogs" src="/imgs/btn/koeye.png" >
tail j=3302 line= <img v-on:click="showhide_kov_dogs1" src="/imgs/btn/kob.png" >
tail j=3303 line= <img v-on:click="showhide_kov_dogs2" src="/imgs/btn/kow.png" >
tail j=3304 line=
tail j=3305 line= <div v-show="collapsed" class="detail_dogs">
tail j=3306 line= kov_dogs
tail j=3307 line= <div id="drag"> kov_dogs:<br />
tail j=3308 line= <a href=kov_dogs.html class="thumbnail" target=_blank>
tail j=3309 line= <img class="drg" src="/imgs/kov/tn/tn_kov_dogs.png" alt="kov_food" width="200" class="drg"/>
tail j=3310 line= <span><img class="drg" src="/imgs/kov/kov_dogs.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3311 line= </a>
tail j=3312 line= </div>
tail j=3313 line=
tail j=3314 line= <a href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
tail j=3315 line= <img height=200 src=/imgs/links/warning_light.gif border=0>
tail j=3316 line= <span><img src=/links/warning_light.gif border=0></span>
tail j=3317 line= </a>
tail j=3318 line=
tail j=3319 line=<!-- kov_dogs_end -->
tail j=3320 line= </div>
tail j=3321 line= </div>
tail j=3322 line=
tail j=3323 line= <script>var kov_dogs = new Vue({ el: "#kov_dogs",
tail j=3324 line= data: {collapsed: false},
tail j=3325 line= methods: {
tail j=3326 line= showhide_kov_dogs: function() {
tail j=3327 line= if (!this.collapsed) this.collapsed = true;
tail j=3328 line= else this.collapsed = false;
tail j=3329 line= document.getElementById("kov_dogs").style.font = "italic bold 20px arial,serif";
tail j=3330 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3331 line=
tail j=3332 line=// document.body.style.background = "darkslategrey";
tail j=3333 line=// document.body.style.color = "black";
tail j=3334 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3335 line=// document.body.style.fontsize = "24pt";
tail j=3336 line= },
tail j=3337 line= showhide_kov_dogs1: function() {
tail j=3338 line= if (!this.collapsed) this.collapsed = true;
tail j=3339 line= else this.collapsed = false;
tail j=3340 line= },
tail j=3341 line= showhide_kov_dogs2: function() {
tail j=3342 line= if (!this.collapsed) this.collapsed = true;
tail j=3343 line= else this.collapsed = false;
tail j=3344 line= }
tail j=3345 line= }
tail j=3346 line= });
tail j=3347 line= </script>
tail j=3348 line=
tail j=3349 line=
tail j=3350 line= <div id="kov_preserve">
tail j=3351 line= <div>
tail j=3352 line= preserve: kov_preserve
tail j=3353 line= </div>
tail j=3354 line= <button v-on:click="showhide_kov_preserve">showhide_kov_preserve</button>
tail j=3355 line= <img v-on:click="showhide_kov_preserve" src="/imgs/btn/koeye.png" >
tail j=3356 line= <img v-on:click="showhide_kov_preserve1" src="/imgs/btn/kob.png" >
tail j=3357 line= <img v-on:click="showhide_kov_preserve2" src="/imgs/btn/kow.png" >
tail j=3358 line=
tail j=3359 line= <div v-show="collapsed" class="detail_preserve">
tail j=3360 line= <div id="drag"> kov_preserve:<br />
tail j=3361 line= <a href=kov_preserve.html class="thumbnail" target=_blank>
tail j=3362 line= <img class="drg" src="/imgs/kov/tn/tn_kov_preserve.png" alt="kov_food" width="200" class="drg"/>
tail j=3363 line= <span><img class="drg" src="/imgs/kov/kov_preserve.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3364 line= </a>
tail j=3365 line= </div>
tail j=3366 line=
tail j=3367 line=
tail j=3368 line= </div>
tail j=3369 line= </div>
tail j=3370 line=
tail j=3371 line= <script>var kov_preserve = new Vue({ el: "#kov_preserve",
tail j=3372 line= data: {collapsed: false},
tail j=3373 line= methods: {
tail j=3374 line= showhide_kov_preserve: function() {
tail j=3375 line= if (!this.collapsed) this.collapsed = true;
tail j=3376 line= else this.collapsed = false;
tail j=3377 line= document.getElementById("kov_preserve").style.font = "italic bold 20px arial,serif";
tail j=3378 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3379 line=
tail j=3380 line=// document.body.style.background = "darkslategrey";
tail j=3381 line=// document.body.style.color = "black";
tail j=3382 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3383 line=// document.body.style.fontsize = "24pt";
tail j=3384 line= },
tail j=3385 line= showhide_kov_preserve1: function() {
tail j=3386 line= if (!this.collapsed) this.collapsed = true;
tail j=3387 line= else this.collapsed = false;
tail j=3388 line= },
tail j=3389 line= showhide_kov_preserve2: function() {
tail j=3390 line= if (!this.collapsed) this.collapsed = true;
tail j=3391 line= else this.collapsed = false;
tail j=3392 line= }
tail j=3393 line= }
tail j=3394 line= });
tail j=3395 line= </script>
tail j=3396 line=
tail j=3397 line=
tail j=3398 line=
tail j=3399 line= <div id="kov_protect">
tail j=3400 line= <div>
tail j=3401 line= protect: kov_protect
tail j=3402 line= </div>
tail j=3403 line= <button v-on:click="showhide_kov_protect">showhide_kov_protect</button>
tail j=3404 line= <img v-on:click="showhide_kov_protect" src="/imgs/btn/koeye.png" >
tail j=3405 line= <img v-on:click="showhide_kov_protect1" src="/imgs/btn/kob.png" >
tail j=3406 line= <img v-on:click="showhide_kov_protect2" src="/imgs/btn/kow.png" >
tail j=3407 line=
tail j=3408 line= <div v-show="collapsed" class="detail_protect">
tail j=3409 line= <div id="drag"> kov_protect:<br />
tail j=3410 line= <a href=kov_protect.html class="thumbnail" target=_blank>
tail j=3411 line= <img class="drg" src="/imgs/kov/tn/tn_kov_protect.png" alt="kov_food" width="200" class="drg"/>
tail j=3412 line= <span><img class="drg" src="/imgs/kov/kov_protect.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3413 line= </a>
tail j=3414 line= </div>
tail j=3415 line=
tail j=3416 line=
tail j=3417 line= </div>
tail j=3418 line= </div>
tail j=3419 line=
tail j=3420 line=
tail j=3421 line= <script>var kov_protect = new Vue({ el: "#kov_protect",
tail j=3422 line= data: {collapsed: false},
tail j=3423 line= methods: {
tail j=3424 line= showhide_kov_protect: function() {
tail j=3425 line= if (!this.collapsed) this.collapsed = true;
tail j=3426 line= else this.collapsed = false;
tail j=3427 line= document.getElementById("kov_protect").style.font = "italic bold 20px arial,serif";
tail j=3428 line= },
tail j=3429 line= showhide_kov_protect1: function() {
tail j=3430 line= if (!this.collapsed) this.collapsed = true;
tail j=3431 line= else this.collapsed = false;
tail j=3432 line= },
tail j=3433 line= showhide_kov_protect2: function() {
tail j=3434 line= if (!this.collapsed) this.collapsed = true;
tail j=3435 line= else this.collapsed = false;
tail j=3436 line= }
tail j=3437 line= }
tail j=3438 line= });
tail j=3439 line= </script>
tail j=3440 line=
tail j=3441 line=
tail j=3442 line=
tail j=3443 line= <div id="kov_jtfdc">
tail j=3444 line= <div>
tail j=3445 line= jtfdc: kov_jtfdc
tail j=3446 line= </div>
tail j=3447 line= <button v-on:click="showhide_kov_jtfdc">showhide_kov_jtfdc</button>
tail j=3448 line= <img v-on:click="showhide_kov_jtfdc" src="/imgs/btn/koeye.png" >
tail j=3449 line= <img v-on:click="showhide_kov_jtfdc1" src="/imgs/btn/kob.png" >
tail j=3450 line= <img v-on:click="showhide_kov_jtfdc2" src="/imgs/btn/kow.png" >
tail j=3451 line=
tail j=3452 line= <div v-show="collapsed" class="detail_jtfdc">
tail j=3453 line= <div id="drag"> kov_jtfdc:<br />
tail j=3454 line= <a href=kov_jtfdc.html class="thumbnail" target=_blank>
tail j=3455 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jtfdc.png" alt="kov_food" width="200" class="drg"/>
tail j=3456 line= <span><img class="drg" src="/imgs/kov/kov_jtfdc.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3457 line= </a>
tail j=3458 line= </div>
tail j=3459 line=
tail j=3460 line=
tail j=3461 line= </div>
tail j=3462 line= </div>
tail j=3463 line=
tail j=3464 line=
tail j=3465 line= <script>var kov_jtfdc = new Vue({ el: "#kov_jtfdc",
tail j=3466 line= data: {collapsed: false},
tail j=3467 line= methods: {
tail j=3468 line= showhide_kov_jtfdc: function() {
tail j=3469 line= if (!this.collapsed) this.collapsed = true;
tail j=3470 line= else this.collapsed = false;
tail j=3471 line= },
tail j=3472 line= showhide_kov_jtfdc1: function() {
tail j=3473 line= if (!this.collapsed) this.collapsed = true;
tail j=3474 line= else this.collapsed = false;
tail j=3475 line= },
tail j=3476 line= showhide_kov_jtfdc2: function() {
tail j=3477 line= if (!this.collapsed) this.collapsed = true;
tail j=3478 line= else this.collapsed = false;
tail j=3479 line= }
tail j=3480 line= }
tail j=3481 line= });
tail j=3482 line= </script>
tail j=3483 line=
tail j=3484 line= <div id="kov_jtfinc">
tail j=3485 line= <div>
tail j=3486 line= jtfinc: kov_jtfinc
tail j=3487 line= </div>
tail j=3488 line= <button v-on:click="showhide_kov_jtfinc">showhide_kov_jtfinc</button>
tail j=3489 line= <img v-on:click="showhide_kov_jtfinc" src="/imgs/btn/koeye.png" >
tail j=3490 line= <img v-on:click="showhide_kov_jtfinc1" src="/imgs/btn/kob.png" >
tail j=3491 line= <img v-on:click="showhide_kov_jtfinc2" src="/imgs/btn/kow.png" >
tail j=3492 line=
tail j=3493 line= <div v-show="collapsed" class="detail_jtfinc">
tail j=3494 line= <div id="drag"> kov_jtfinc:<br />
tail j=3495 line= <a href=kov_jtfinc.html class="thumbnail" target=_blank>
tail j=3496 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jtfinc.png" alt="kov_food" width="200" class="drg"/>
tail j=3497 line= <span><img class="drg" src="/imgs/kov/kov_jtfinc.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3498 line= </a>
tail j=3499 line= </div>
tail j=3500 line=
tail j=3501 line=
tail j=3502 line= </div>
tail j=3503 line= </div>
tail j=3504 line=
tail j=3505 line=
tail j=3506 line= <script>var kov_jtfinc = new Vue({ el: "#kov_jtfinc",
tail j=3507 line= data: {collapsed: false},
tail j=3508 line= methods: {
tail j=3509 line= showhide_kov_jtfinc: function() {
tail j=3510 line= if (!this.collapsed) this.collapsed = true;
tail j=3511 line= else this.collapsed = false;
tail j=3512 line= },
tail j=3513 line= showhide_kov_jtfinc1: function() {
tail j=3514 line= if (!this.collapsed) this.collapsed = true;
tail j=3515 line= else this.collapsed = false;
tail j=3516 line= },
tail j=3517 line= showhide_kov_jtfinc2: function() {
tail j=3518 line= if (!this.collapsed) this.collapsed = true;
tail j=3519 line= else this.collapsed = false;
tail j=3520 line= }
tail j=3521 line= }
tail j=3522 line= });
tail j=3523 line= </script>
tail j=3524 line=
tail j=3525 line=
tail j=3526 line=
tail j=3527 line=
tail j=3528 line= <div id="kov_byrdpucker">
tail j=3529 line= <div>
tail j=3530 line= byrdpucker is dogs-n-ponies:
tail j=3531 line= </div>
tail j=3532 line= <button v-on:click="showhide_kov_byrdpucker">showhide_kov_byrdpucker</button>
tail j=3533 line= <img v-on:click="showhide_kov_byrdpucker" src="/imgs/btn/koeye.png" >
tail j=3534 line= <img v-on:click="showhide_kov_byrdpucker1" src="/imgs/btn/kob.png" >
tail j=3535 line= <img v-on:click="showhide_kov_byrdpucker2" src="/imgs/btn/kow.png" >
tail j=3536 line=
tail j=3537 line= <div v-show="collapsed" class="detail_byrdpucker">
tail j=3538 line= byrdpucker dog and pony club cyclers and donuts too
tail j=3539 line= <hr>
tail j=3540 line= <div id="drag"> kov_byrpucker:<br />
tail j=3541 line= <a href=kov_byrpucker.html class="thumbnail" target=_blank>
tail j=3542 line= <img class="drg" src="/imgs/kov/tn/tn_kov_byrpucker.png" alt="kov_food" width="200" class="drg"/>
tail j=3543 line= <span><img class="drg" src="/imgs/kov/kov_byrpucker.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3544 line= </a>
tail j=3545 line= </div>
tail j=3546 line=
tail j=3547 line=
tail j=3548 line= </div>
tail j=3549 line= </div>
tail j=3550 line=
tail j=3551 line= <script>var kov_byrdpucker = new Vue({ el: "#kov_byrdpucker",
tail j=3552 line= data: {collapsed: false},
tail j=3553 line= methods: {
tail j=3554 line= showhide_kov_byrdpucker: function() {
tail j=3555 line= if (!this.collapsed) this.collapsed = true;
tail j=3556 line= else this.collapsed = false;
tail j=3557 line=// document.body.style.background = "darkslategrey";
tail j=3558 line=// document.body.style.color = "black";
tail j=3559 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3560 line=// document.body.style.fontsize = "24pt";
tail j=3561 line= },
tail j=3562 line= showhide_kov_byrdpucker1: function() {
tail j=3563 line= if (!this.collapsed) this.collapsed = true;
tail j=3564 line= else this.collapsed = false;
tail j=3565 line= },
tail j=3566 line= showhide_kov_byrdpucker2: function() {
tail j=3567 line= if (!this.collapsed) this.collapsed = true;
tail j=3568 line= else this.collapsed = false;
tail j=3569 line= }
tail j=3570 line= }
tail j=3571 line= });
tail j=3572 line= </script>
tail j=3573 line=
tail j=3574 line=
tail j=3575 line=
tail j=3576 line= <div id="kov_jkwii">
tail j=3577 line= <div>
tail j=3578 line= jkwii is me: kov_jkwii
tail j=3579 line= </div>
tail j=3580 line= <button v-on:click="showhide_kov_jkwii">showhide_kov_jkwii</button>
tail j=3581 line= <img v-on:click="showhide_kov_jkwii" src="/imgs/btn/koeye.png" >
tail j=3582 line= <img v-on:click="showhide_kov_jkwii1" src="/imgs/btn/kob.png" >
tail j=3583 line= <img v-on:click="showhide_kov_jkwii2" src="/imgs/btn/kow.png" >
tail j=3584 line=
tail j=3585 line= <div v-show="collapsed" class="detail_jkwii">
tail j=3586 line= jookiim kopernicus wundersteine ii
tail j=3587 line= <hr>
tail j=3588 line= <div id="drag"> kov_jkwii:<br />
tail j=3589 line= <a href=kov_jkwii.html class="thumbnail" target=_blank>
tail j=3590 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jkwii.png" alt="kov_food" width="200" class="drg"/>
tail j=3591 line= <span><img class="drg" src="/imgs/kov/kov_jkwii.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3592 line= </a>
tail j=3593 line= </div>
tail j=3594 line=
tail j=3595 line= <a href="mailto:jkwii@ko0.us?subject=jkwii?"><img src="/imgs/links/email.gif" alt="jkwii_what" border=0></a>
tail j=3596 line=
tail j=3597 line= <a href="mailto:skwii@ko0.us?subject=skwii?"><img src="/imgs/links/email.gif" alt="skwii_what" border=0></a>
tail j=3598 line= <hr>
tail j=3599 line=
tail j=3600 line= <a href=/imgs/links/eurodoor_Image429.png class="thumbnail" target=_blank>
tail j=3601 line= <img height=200 src=/imgs/links/tn/tn_eurodoor_Image429.png alt="eurodoor" border=0>
tail j=3602 line= <span><img src=/imgs/links/eurodoor_Image429.png alt="eurodoor" border=0></span>
tail j=3603 line= </a>
tail j=3604 line=
tail j=3605 line=
tail j=3606 line= </div>
tail j=3607 line= </div>
tail j=3608 line=
tail j=3609 line= <script>var kov_jkwii = new Vue({ el: "#kov_jkwii",
tail j=3610 line= data: {collapsed: false},
tail j=3611 line= methods: {
tail j=3612 line= showhide_kov_jkwii: function() {
tail j=3613 line= if (!this.collapsed) this.collapsed = true;
tail j=3614 line= else this.collapsed = false;
tail j=3615 line=// document.body.style.background = "darkslategrey";
tail j=3616 line=// document.body.style.color = "black";
tail j=3617 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3618 line=// document.body.style.fontsize = "24pt";
tail j=3619 line= },
tail j=3620 line= showhide_kov_jkwii1: function() {
tail j=3621 line= if (!this.collapsed) this.collapsed = true;
tail j=3622 line= else this.collapsed = false;
tail j=3623 line= },
tail j=3624 line= showhide_kov_jkwii2: function() {
tail j=3625 line= if (!this.collapsed) this.collapsed = true;
tail j=3626 line= else this.collapsed = false;
tail j=3627 line= }
tail j=3628 line= }
tail j=3629 line= });
tail j=3630 line= </script>
tail j=3631 line=
tail j=3632 line=
tail j=3633 line=
tail j=3634 line= <div id="kov_kou">
tail j=3635 line= <div>
tail j=3636 line= ko university digital ars technica:
tail j=3637 line= </div>
tail j=3638 line= <button v-on:click="showhide_kov_kou">showhide_kov_kou</button>
tail j=3639 line= <img v-on:click="showhide_kov_kou" src="/imgs/btn/koeye.png" >
tail j=3640 line= <img v-on:click="showhide_kov_kou1" src="/imgs/btn/kob.png" >
tail j=3641 line= <img v-on:click="showhide_kov_kou2" src="/imgs/btn/kow.png" >
tail j=3642 line=
tail j=3643 line= <div v-show="collapsed" class="detail_kou">
tail j=3644 line= kou digital ars technica
tail j=3645 line= <hr>
tail j=3646 line= <div id="drag"> kov_kou:<br />
tail j=3647 line= <a href=kov_kou.html class="thumbnail" target=_blank>
tail j=3648 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kou.png" alt="kov_food" width="200" class="drg"/>
tail j=3649 line= <span><img class="drg" src="/imgs/kov/kov_kou.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3650 line= </a>
tail j=3651 line= </div>
tail j=3652 line=
tail j=3653 line= </div>
tail j=3654 line= </div>
tail j=3655 line=
tail j=3656 line=
tail j=3657 line=
tail j=3658 line= <script>var kov_kou = new Vue({ el: "#kov_kou",
tail j=3659 line= data: {collapsed: false},
tail j=3660 line= methods: {
tail j=3661 line= showhide_kov_kou: function() {
tail j=3662 line= if (!this.collapsed) this.collapsed = true;
tail j=3663 line= else this.collapsed = false;
tail j=3664 line=// document.body.style.background = "darkslategrey";
tail j=3665 line=// document.body.style.color = "black";
tail j=3666 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3667 line=// document.body.style.fontsize = "24pt";
tail j=3668 line= },
tail j=3669 line= showhide_kov_kou1: function() {
tail j=3670 line= if (!this.collapsed) this.collapsed = true;
tail j=3671 line= else this.collapsed = false;
tail j=3672 line= },
tail j=3673 line= showhide_kov_kou2: function() {
tail j=3674 line= if (!this.collapsed) this.collapsed = true;
tail j=3675 line= else this.collapsed = false;
tail j=3676 line= }
tail j=3677 line= }
tail j=3678 line= });
tail j=3679 line= </script>
tail j=3680 line=
tail j=3681 line=
tail j=3682 line=
tail j=3683 line=
tail j=3684 line= <div id="kov_kassil">
tail j=3685 line= <div>
tail j=3686 line= kassil and others are us: kov_kassil
tail j=3687 line= </div>
tail j=3688 line= <button v-on:click="showhide_kov_kassil">showhide_kov_kassil</button>
tail j=3689 line= <img v-on:click="showhide_kov_kassil" src="/imgs/btn/koeye.png" >
tail j=3690 line= <img v-on:click="showhide_kov_kassil1" src="/imgs/btn/kob.png" >
tail j=3691 line= <img v-on:click="showhide_kov_kassil2" src="/imgs/btn/kow.png" >
tail j=3692 line=
tail j=3693 line= <div v-show="collapsed" class="detail_kassil">
tail j=3694 line= kassil & others
tail j=3695 line= <div id="drag"> kov_kassil:<br />
tail j=3696 line= <a href=kov_kassil.html class="thumbnail" target=_blank>
tail j=3697 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kassil.png" alt="kov_food" width="200" class="drg"/>
tail j=3698 line= <span><img class="drg" src="/imgs/kov/kov_kassil.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3699 line= </a>
tail j=3700 line= </div>
tail j=3701 line= <hr>
tail j=3702 line=
tail j=3703 line=
tail j=3704 line= </div>
tail j=3705 line= </div>
tail j=3706 line=
tail j=3707 line= <script>var kov_kassil = new Vue({ el: "#kov_kassil",
tail j=3708 line= data: {collapsed: false},
tail j=3709 line= methods: {
tail j=3710 line= showhide_kov_kassil: function() {
tail j=3711 line= if (!this.collapsed) this.collapsed = true;
tail j=3712 line= else this.collapsed = false;
tail j=3713 line=// document.body.style.background = "darkslategrey";
tail j=3714 line=// document.body.style.color = "black";
tail j=3715 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3716 line=// document.body.style.fontsize = "24pt";
tail j=3717 line= },
tail j=3718 line= showhide_kov_kassil1: function() {
tail j=3719 line= if (!this.collapsed) this.collapsed = true;
tail j=3720 line= else this.collapsed = false;
tail j=3721 line= },
tail j=3722 line= showhide_kov_kassil2: function() {
tail j=3723 line= if (!this.collapsed) this.collapsed = true;
tail j=3724 line= else this.collapsed = false;
tail j=3725 line= }
tail j=3726 line= }
tail j=3727 line= });
tail j=3728 line= </script>
tail j=3729 line=
tail j=3730 line=
tail j=3731 line=
tail j=3732 line=
tail j=3733 line= <div id="kov_konet">
tail j=3734 line= <div>
tail j=3735 line= konet is biz: kov_konet
tail j=3736 line= </div>
tail j=3737 line= <button v-on:click="showhide_kov_konet">showhide_kov_konet</button>
tail j=3738 line= <img v-on:click="showhide_kov_konet" src="/imgs/btn/koeye.png" >
tail j=3739 line= <img v-on:click="showhide_kov_konet1" src="/imgs/btn/kob.png" >
tail j=3740 line= <img v-on:click="showhide_kov_konet2" src="/imgs/btn/kow.png" >
tail j=3741 line=
tail j=3742 line= <div v-show="collapsed" class="detail_konet">
tail j=3743 line= konet is biz
tail j=3744 line= <hr>
tail j=3745 line= <div id="drag"> kov_konet:<br />
tail j=3746 line= <a href=kov_konet.html class="thumbnail" target=_blank>
tail j=3747 line= <img class="drg" src="/imgs/kov/tn/tn_kov_konet.png" alt="kov_food" width="200" class="drg"/>
tail j=3748 line= <span><img class="drg" src="/imgs/kov/kov_konet.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3749 line= </a>
tail j=3750 line= </div>
tail j=3751 line=
tail j=3752 line=
tail j=3753 line= </div>
tail j=3754 line= </div>
tail j=3755 line=
tail j=3756 line= <script>var kov_konet = new Vue({ el: "#kov_konet",
tail j=3757 line= data: {collapsed: false},
tail j=3758 line= methods: {
tail j=3759 line= showhide_kov_konet: function() {
tail j=3760 line= if (!this.collapsed) this.collapsed = true;
tail j=3761 line= else this.collapsed = false;
tail j=3762 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3763 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3764 line=
tail j=3765 line=// document.body.style.background = "darkslategrey";
tail j=3766 line=// document.body.style.color = "black";
tail j=3767 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3768 line=// document.body.style.fontsize = "24pt";
tail j=3769 line= },
tail j=3770 line= showhide_kov_konet1: function() {
tail j=3771 line= if (!this.collapsed) this.collapsed = true;
tail j=3772 line= else this.collapsed = false;
tail j=3773 line= },
tail j=3774 line= showhide_kov_konet2: function() {
tail j=3775 line= if (!this.collapsed) this.collapsed = true;
tail j=3776 line= else this.collapsed = false;
tail j=3777 line= }
tail j=3778 line= }
tail j=3779 line= });
tail j=3780 line= </script>
tail j=3781 line=
tail j=3782 line=
tail j=3783 line=
tail j=3784 line=
tail j=3785 line= <div id="kov_iperms">
tail j=3786 line= <div>
tail j=3787 line= iperms
tail j=3788 line=<!-- <h1 v-on:click="showhide_kov_iperms" >= = : : iperms : : = =</h1> -->
tail j=3789 line= </div>
tail j=3790 line= <button v-on:click="showhide_kov_iperms">showhide_kov_iperms</button>
tail j=3791 line= <img v-on:click="showhide_kov_iperms" src="/imgs/btn/koeye.png" >
tail j=3792 line= <img v-on:click="showhide_kov_iperms1" src="/imgs/btn/kob.png" >
tail j=3793 line= <img v-on:click="showhide_kov_iperms2" src="/imgs/btn/kow.png" >
tail j=3794 line=
tail j=3795 line= <div v-show="collapsed" class="detail_iperms">
tail j=3796 line= iperms
tail j=3797 line= <hr>
tail j=3798 line= <div id="drag"> kov_iperms:<br />
tail j=3799 line= <a href=kov_iperms.html class="thumbnail" target=_blank>
tail j=3800 line= <img class="drg" src="/imgs/kov/tn/tn_kov_iperms.png" alt="kov_food" width="200" class="drg"/>
tail j=3801 line= <span><img class="drg" src="/imgs/kov/kov_iperms.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3802 line= </a>
tail j=3803 line= </div>
tail j=3804 line=
tail j=3805 line=
tail j=3806 line= </div>
tail j=3807 line= </div>
tail j=3808 line=
tail j=3809 line= <script>var kov_iperms = new Vue({ el: "#kov_iperms",
tail j=3810 line= data: {collapsed: false},
tail j=3811 line= methods: {
tail j=3812 line= showhide_kov_iperms: function() {
tail j=3813 line= if (!this.collapsed) this.collapsed = true;
tail j=3814 line= else this.collapsed = false;
tail j=3815 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3816 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3817 line=
tail j=3818 line=// document.body.style.background = "darkslategrey";
tail j=3819 line=// document.body.style.color = "black";
tail j=3820 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3821 line=// document.body.style.fontsize = "24pt";
tail j=3822 line= },
tail j=3823 line= showhide_kov_iperms1: function() {
tail j=3824 line= if (!this.collapsed) this.collapsed = true;
tail j=3825 line= else this.collapsed = false;
tail j=3826 line= },
tail j=3827 line= showhide_kov_iperms2: function() {
tail j=3828 line= if (!this.collapsed) this.collapsed = true;
tail j=3829 line= else this.collapsed = false;
tail j=3830 line= }
tail j=3831 line= }
tail j=3832 line= });
tail j=3833 line= </script>
tail j=3834 line=
tail j=3835 line=
tail j=3836 line=
tail j=3837 line=
tail j=3838 line= <div id="kov_konabus">
tail j=3839 line= <div>
tail j=3840 line= konabus: kov_konabus
tail j=3841 line= </div>
tail j=3842 line= <button v-on:click="showhide_kov_konabus">showhide_kov_konabus</button>
tail j=3843 line= <img v-on:click="showhide_kov_konabus" src="/imgs/btn/koeye.png" >
tail j=3844 line= <img v-on:click="showhide_kov_konabus1" src="/imgs/btn/kob.png" >
tail j=3845 line= <img v-on:click="showhide_kov_konabus2" src="/imgs/btn/kow.png" >
tail j=3846 line=
tail j=3847 line= <div v-show="collapsed" class="detail_konabus">
tail j=3848 line= konabus
tail j=3849 line= <hr>
tail j=3850 line= <div id="drag"> kov_konabus:<br />
tail j=3851 line= <a href=kov_konabus.html class="thumbnail" target=_blank>
tail j=3852 line= <img class="drg" src="/imgs/kov/tn/tn_kov_konabus.png" alt="kov_food" width="200" class="drg"/>
tail j=3853 line= <span><img class="drg" src="/imgs/kov/kov_konabus.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3854 line= </a>
tail j=3855 line= </div>
tail j=3856 line=
tail j=3857 line= </div>
tail j=3858 line= </div>
tail j=3859 line=
tail j=3860 line= <script>var kov_konabus = new Vue({ el: "#kov_konabus",
tail j=3861 line= data: {collapsed: false},
tail j=3862 line= methods: {
tail j=3863 line= showhide_kov_konabus: function() {
tail j=3864 line= if (!this.collapsed) this.collapsed = true;
tail j=3865 line= else this.collapsed = false;
tail j=3866 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3867 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3868 line=
tail j=3869 line=// document.body.style.background = "darkslategrey";
tail j=3870 line=// document.body.style.color = "black";
tail j=3871 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3872 line=// document.body.style.fontsize = "24pt";
tail j=3873 line= },
tail j=3874 line= showhide_kov_konabus1: function() {
tail j=3875 line= if (!this.collapsed) this.collapsed = true;
tail j=3876 line= else this.collapsed = false;
tail j=3877 line= },
tail j=3878 line= showhide_kov_konabus2: function() {
tail j=3879 line= if (!this.collapsed) this.collapsed = true;
tail j=3880 line= else this.collapsed = false;
tail j=3881 line= }
tail j=3882 line= }
tail j=3883 line= });
tail j=3884 line= </script>
tail j=3885 line=
tail j=3886 line=
tail j=3887 line=
tail j=3888 line=
tail j=3889 line= <div id="kov_kt">
tail j=3890 line= <div>
tail j=3891 line= kt: kov_kt
tail j=3892 line= </div>
tail j=3893 line= <button v-on:click="showhide_kov_kt">showhide_kov_kt</button>
tail j=3894 line= <img v-on:click="showhide_kov_kt" src="/imgs/btn/koeye.png" >
tail j=3895 line= <img v-on:click="showhide_kov_kt1" src="/imgs/btn/kob.png" >
tail j=3896 line= <img v-on:click="showhide_kov_kt2" src="/imgs/btn/kow.png" >
tail j=3897 line=
tail j=3898 line= <div v-show="collapsed" class="detail_kt">
tail j=3899 line= kt
tail j=3900 line= <hr>
tail j=3901 line= <div id="drag"> kov_kt:<br />
tail j=3902 line= <a href=kov_kt.html class="thumbnail" target=_blank>
tail j=3903 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kt.png" alt="kov_food" width="200" class="drg"/>
tail j=3904 line= <span><img class="drg" src="/imgs/kov/kov_kt.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3905 line= </a>
tail j=3906 line= </div>
tail j=3907 line=
tail j=3908 line=
tail j=3909 line= </div>
tail j=3910 line= </div>
tail j=3911 line=
tail j=3912 line= <script>var kov_kt = new Vue({ el: "#kov_kt",
tail j=3913 line= data: {collapsed: false},
tail j=3914 line= methods: {
tail j=3915 line= showhide_kov_kt: function() {
tail j=3916 line= if (!this.collapsed) this.collapsed = true;
tail j=3917 line= else this.collapsed = false;
tail j=3918 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3919 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3920 line=
tail j=3921 line=// document.body.style.background = "darkslategrey";
tail j=3922 line=// document.body.style.color = "black";
tail j=3923 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3924 line=// document.body.style.fontsize = "24pt";
tail j=3925 line= },
tail j=3926 line= showhide_kov_kt1: function() {
tail j=3927 line= if (!this.collapsed) this.collapsed = true;
tail j=3928 line= else this.collapsed = false;
tail j=3929 line= },
tail j=3930 line= showhide_kov_kt2: function() {
tail j=3931 line= if (!this.collapsed) this.collapsed = true;
tail j=3932 line= else this.collapsed = false;
tail j=3933 line= }
tail j=3934 line= }
tail j=3935 line= });
tail j=3936 line= </script>
tail j=3937 line=
tail j=3938 line=
tail j=3939 line=
tail j=3940 line= <div id="kov_go">
tail j=3941 line= <div>
tail j=3942 line= go: kov_go
tail j=3943 line= </div>
tail j=3944 line= <button v-on:click="showhide_kov_go">showhide_kov_go</button>
tail j=3945 line= <img v-on:click="showhide_kov_go" src="/imgs/btn/koeye.png" >
tail j=3946 line= <img v-on:click="showhide_kov_go1" src="/imgs/btn/kob.png" >
tail j=3947 line= <img v-on:click="showhide_kov_go2" src="/imgs/btn/kow.png" >
tail j=3948 line=
tail j=3949 line= <div v-show="collapsed" class="detail_go">
tail j=3950 line= go
tail j=3951 line= <hr>
tail j=3952 line= <div id="drag"> kov_go:<br />
tail j=3953 line= <a href=kov_go.html class="thumbnail" target=_blank>
tail j=3954 line= <img class="drg" src="/imgs/kov/tn/tn_kov_go.png" alt="kov_food" width="200" class="drg"/>
tail j=3955 line= <span><img class="drg" src="/imgs/kov/kov_go.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3956 line= </a>
tail j=3957 line= </div>
tail j=3958 line=
tail j=3959 line=
tail j=3960 line= </div>
tail j=3961 line= </div>
tail j=3962 line=
tail j=3963 line= <script>var kov_go = new Vue({ el: "#kov_go",
tail j=3964 line= data: {collapsed: false},
tail j=3965 line= methods: {
tail j=3966 line= showhide_kov_go: function() {
tail j=3967 line= if (!this.collapsed) this.collapsed = true;
tail j=3968 line= else this.collapsed = false;
tail j=3969 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3970 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3971 line=
tail j=3972 line=// document.body.style.background = "darkslategrey";
tail j=3973 line=// document.body.style.color = "black";
tail j=3974 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3975 line=// document.body.style.fontsize = "24pt";
tail j=3976 line= },
tail j=3977 line= showhide_kov_go1: function() {
tail j=3978 line= if (!this.collapsed) this.collapsed = true;
tail j=3979 line= else this.collapsed = false;
tail j=3980 line= },
tail j=3981 line= showhide_kov_go2: function() {
tail j=3982 line= if (!this.collapsed) this.collapsed = true;
tail j=3983 line= else this.collapsed = false;
tail j=3984 line= }
tail j=3985 line= }
tail j=3986 line= });
tail j=3987 line= </script>
tail j=3988 line=
tail j=3989 line=
tail j=3990 line=
tail j=3991 line= <div id="div_kov_old">
tail j=3992 line= <div>
tail j=3993 line= old: kov_old
tail j=3994 line= </div>
tail j=3995 line= <button v-on:click="showhide_kov_old">showhide_kov_old</button>
tail j=3996 line= <img v-on:click="showhide_kov_old" src="/imgs/btn/koeye.png" >
tail j=3997 line= <img v-on:click="showhide_kov_old1" src="/imgs/btn/kob.png" >
tail j=3998 line= <img v-on:click="showhide_kov_old2" src="/imgs/btn/kow.png" >
tail j=3999 line=
tail j=4000 line= <div v-show="collapsed" class="detail_old">
tail j=4001 line=
tail j=4002 line= old
tail j=4003 line= <hr>
tail j=4004 line= <div id="drag"> kov_old:<br />
tail j=4005 line= <a href=kov_old.html class="thumbnail" target=_blank>
tail j=4006 line= <img class="drg" src="/imgs/kov/tn/tn_kov_old.png" alt="kov_food" width="200" class="drg"/>
tail j=4007 line= <span><img class="drg" src="/imgs/kov/kov_old.png" alt="kov_food" width="400" class="drg"/></span>
tail j=4008 line= </a>
tail j=4009 line= </div>
tail j=4010 line=
tail j=4011 line=
tail j=4012 line= </div>
tail j=4013 line= </div id="div_kov_old">
tail j=4014 line=
tail j=4015 line= <script id="script_kov_old">
tail j=4016 line= var kov_old = new Vue({ el: "#kov_old",
tail j=4017 line= data: {collapsed: false},
tail j=4018 line= methods: {
tail j=4019 line= showhide_kov_old: function() {
tail j=4020 line= if (!this.collapsed) this.collapsed = true;
tail j=4021 line= else this.collapsed = false;
tail j=4022 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=4023 line=// font-style font-variant font-weight font-size line-height font-family
tail j=4024 line=
tail j=4025 line=// document.body.style.background = "darkslategrey";
tail j=4026 line=// document.body.style.color = "black";
tail j=4027 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=4028 line=// document.body.style.fontsize = "24pt";
tail j=4029 line= },
tail j=4030 line= showhide_kov_old1: function() {
tail j=4031 line= if (!this.collapsed) this.collapsed = true;
tail j=4032 line= else this.collapsed = false;
tail j=4033 line= },
tail j=4034 line= showhide_kov_old2: function() {
tail j=4035 line= if (!this.collapsed) this.collapsed = true;
tail j=4036 line= else this.collapsed = false;
tail j=4037 line= }
tail j=4038 line= }
tail j=4039 line= });
tail j=4040 line= </script id="script_kov_old">
tail j=4041 line=
tail j=4042 line= </div id="div_vues_end" >
tail j=4043 line=
tail j=4044 line=<!-- kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk -->
tail j=4045 line=
tail j=4046 line=
tail j=4047 line=
tail j=4048 line=
tail j=4049 line=
tail j=4050 line=
tail j=4051 line=
tail j=4052 line=
tail j=4053 line=
tail j=4054 line=
tail j=4055 line=
tail j=4056 line= <ul id="kov_list">
tail j=4057 line= <li v-for="(item, index) in items">
tail j=4058 line= {{ parentMessage }} - {{ index }} - {{ item.message }}
tail j=4059 line= </li>
tail j=4060 line= </ul>
tail j=4061 line= <script id="script_kov_list" >
tail j=4062 line= var kov_list = new Vue({el: '#kov_list',
tail j=4063 line= data: {
tail j=4064 line= parentMessage: 'Parent',
tail j=4065 line= items: [
tail j=4066 line= { message: 'new' },
tail j=4067 line= { message: 'focus' },
tail j=4068 line= { message: 'work' },
tail j=4069 line= { message: 'memes' },
tail j=4070 line= { message: 'jtfdc' },
tail j=4071 line= { message: 'jtfinc' },
tail j=4072 line= { message: 'byrdpucker',
tail j=4073 line= { message: 'jkwii' },
tail j=4074 line= { message: 'kou' },
tail j=4075 line= { message: 'kassil' },
tail j=4076 line= { message: 'konet' },
tail j=4077 line= { message: 'iperms' },
tail j=4078 line= { message: 'konabus' },
tail j=4079 line= { message: 'kt' },
tail j=4080 line= { message: 'go' },
tail j=4081 line= { message: 'old' }
tail j=4082 line= ]
tail j=4083 line= }
tail j=4084 line= })
tail j=4085 line= </script id="script_kov_list" >
tail j=4086 line=
tail j=4087 line=
tail j=4088 line= <div id="div_url">
tail j=4089 line= <script id="script_url">
tail j=4090 line= var url = document.createElement("a");
tail j=4091 line= url.href=location.href;
tail j=4092 line= var output = "output";
tail j=4093 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
tail j=4094 line=
tail j=4095 line=// if( url.search != "" ) {
tail j=4096 line=// script_zm_view( url.search );
tail j=4097 line=// }
tail j=4098 line=
tail j=4099 line=// alert(location.href)
tail j=4100 line=// alert(url.protocol)
tail j=4101 line=// alert(url.hostname)
tail j=4102 line=// alert(url.pathname)
tail j=4103 line=// alert(url.search)
tail j=4104 line=// alert(url.hash)
tail j=4105 line=
tail j=4106 line=
tail j=4107 line=// document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
tail j=4108 line=// document.write( "pathname=" + url.pathname + " search=" + url.search );
tail j=4109 line= </script>
tail j=4110 line= </script id="script_url">
tail j=4111 line= </div id="div_url">
tail j=4112 line=
tail j=4113 line=
tail j=4114 line=
tail j=4115 line= <script id="script_document_ready" type="text/javascript">
tail j=4116 line= $(document).ready(function() {
tail j=4117 line=// sets the draggable
tail j=4118 line= $('#drag .drg').draggable({
tail j=4119 line= cursor: 'move', // sets the cursor apperance
tail j=4120 line= revert: 'valid'
tail j=4121 line= });
tail j=4122 line=
tail j=4123 line=// sets droppable
tail j=4124 line=// after the draggable is droped, hides it with a hide() effect
tail j=4125 line= $('#drop').droppable({
tail j=4126 line= drop: function(event, ui) {
tail j=4127 line= ui.draggable.hide(1000);
tail j=4128 line= }
tail j=4129 line= });
tail j=4130 line=
tail j=4131 line=// after the draggable is droped, hides it with a hide() effect
tail j=4132 line= $('#drop1').droppable({
tail j=4133 line= drop: function(event, ui) {
tail j=4134 line= ui.draggable.hide(1000);
tail j=4135 line= }
tail j=4136 line= });
tail j=4137 line=
tail j=4138 line=// after the draggable is droped, hides it with a hide() effect
tail j=4139 line= $('#drop2').droppable({
tail j=4140 line= drop: function(event, ui) {
tail j=4141 line= ui.draggable.hide(1000);
tail j=4142 line= }
tail j=4143 line= });
tail j=4144 line=
tail j=4145 line=// when the "#sw" element (inside the "#drop") is clicked
tail j=4146 line=// show the items with class "drg", contained in "#drag"
tail j=4147 line=// $('#drag .drg').slideDown(1000);
tail j=4148 line= $('#drop #sw').click(function(){
tail j=4149 line= var url = "/ko_center/ko_center.php?q=jqui/dragdrop1/"
tail j=4150 line= $(location).attr('href',url);
tail j=4151 line= });
tail j=4152 line= });
tail j=4153 line= </script id="script_document_ready" >
tail j=4154 line=
tail j=4155 line=
tail j=4156 line=
tail j=4157 line= <script id="script_load_liks" >
tail j=4158 line= var svc_links = new Array();
tail j=4159 line= var ko_links = new Array();
tail j=4160 line= var us_links = new Array();
tail j=4161 line= var u_links = new Array();
tail j=4162 line= var now_links = new Array();
tail j=4163 line= var srv_links = new Array();
tail j=4164 line= var kov_links = new Array();
tail j=4165 line= function load_svc_links() {
tail j=4166 line= var j=0;
tail j=4167 line= svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
tail j=4168 line= svc_links[j++]="/index_bb.html|/imgs/links/index_bb.png|index_bb|/imgs/btn/kob.png";
tail j=4169 line= svc_links[j++]="/index_bp.html|/imgs/links/index_bp.png|index_bb|/imgs/btn/kob.png";
tail j=4170 line= svc_links[j++]="/index_dd.html|/imgs/links/index_dd.png|index_dd|/imgs/btn/kob.png";
tail j=4171 line= svc_links[j++]="/index_dl.html|/imgs/links/index_dl.png|index_dl|/imgs/btn/kob.png";
tail j=4172 line= svc_links[j++]="/index_dp.html|/imgs/links/index_dp.png|index_dp|/imgs/btn/kob.png";
tail j=4173 line= svc_links[j++]="/index_fl.html|/imgs/links/index_fl.png|index_fl|/imgs/btn/kob.png";
tail j=4174 line= svc_links[j++]="/index_jg.html|/imgs/links/index_jg.png|index_jg|/imgs/btn/kob.png";
tail j=4175 line= svc_links[j++]="/index_pn.html|/imgs/links/index_pn.png|index_pn|/imgs/btn/kob.png";
tail j=4176 line= svc_links[j++]="/index_sc.html|/imgs/links/index_sc.png|index_sc|/imgs/btn/kob.png";
tail j=4177 line= svc_links[j++]="/index_sl.html|/imgs/links/index_sl.png|index_sl|/imgs/btn/kob.png";
tail j=4178 line= svc_links[j++]="/index_tl.html|/imgs/links/index_tl.png|index_tl|/imgs/btn/kob.png";
tail j=4179 line= svc_links[j++]="/index_tm.html|/imgs/links/index_tm.png|index_tm|/imgs/btn/kob.png";
tail j=4180 line= svc_links[j++]="/index_us.html|/imgs/links/index_us.png|index_us|/imgs/btn/kob.png";
tail j=4181 line= svc_links[j++]="/index_wc.html|/imgs/links/index_wc.png|index_wc|/imgs/btn/kob.png";
tail j=4182 line= svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
tail j=4183 line= svc_links[j++]="/index_zm.html|/imgs/links/index_zm.png|index_zm|/imgs/btn/kob.png";
tail j=4184 line= return( svc_links );
tail j=4185 line= }
tail j=4186 line=
tail j=4187 line= function load_srv_links() {
tail j=4188 line= srv_links[0]="ko0.us/index.html|/imgs/btn/koeyeb.png|ko0us|/imgs/btn/kob.png";
tail j=4189 line= srv_links[1]="ko1.us/index.html|/imgs/btn/koeye.png|ko1us|/imgs/btn/kop1234.png";
tail j=4190 line= srv_links[2]="ko2.us/index.html|/imgs/btn/koeyew.png|ko2us|/imgs/btn/kow.png";
tail j=4191 line= srv_links[3]="konet.org/index.html|/imgs/btn/ko.png|konet-org|/imgs/btn/kib.png";
tail j=4192 line= srv_links[4]="iperms.com/index.html|/imgs/links/iperms.png|iperms-com|/imgs/btn/kop34.png";
tail j=4193 line= srv_links[5]="kassil.com/index.html|/imgs/links/kassil.png|kassil-com|/imgs/btn/kop12.png";
tail j=4194 line= return( srv_links );
tail j=4195 line= }
tail j=4196 line=
tail j=4197 line= function load_ko_links() {
tail j=4198 line= var j=0;
tail j=4199 line= ko_links[j++]="/jkwii/blackboard.html|/imgs/links/blackboard.png|blackboard|/imgs/btn/koeye.png";
tail j=4200 line= ko_links[j++]="/jkwii/js/threejs/examples/index.html|/imgs/links/index_js3d.png|index_js3d|/imgs/btn/koeye.png";
tail j=4201 line= ko_links[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
tail j=4202 line= ko_links[j++]="/jkwii/js/gojs/index.html|/imgs/links/index_jsgo.png|index_jsgo|/imgs/btn/koeye.png";
tail j=4203 line= ko_links[j++]="/index_jsdk.html|/imgs/links/index_jsdk.png|index_jsdk|/imgs/btn/koeye.png";
tail j=4204 line= ko_links[j++]="/jkwii/koh5_globe/koh5_globe.html|/imgs/links/koh5_globe.png|koh5_globe|/imgs/btn/koeye.png";
tail j=4205 line= ko_links[j++]="/jkwii/aud/keybd/index.html|/imgs/links/index_jskb.png|index_jskb|/imgs/btn/koeye.png";
tail j=4206 line= ko_links[j++]="/svc/kokbdm/index.html|/imgs/links/index_jskb-dm.png|index_jskb-dm|/imgs/btn/koeye.png";
tail j=4207 line= ko_links[j++]="/svc/kokbdms/index.html|/imgs/links/index_jskb-dms.png|index_jskb-dms|/imgs/btn/koeye.png";
tail j=4208 line= ko_links[j++]="/piano.html|/imgs/links/index_piano.png|index_piano|/imgs/btn/koeye.png";
tail j=4209 line= ko_links[j++]="/jkwii/aud/piano_uri/koh5_piano_uri.html|/imgs/links/index_jskb-uri.png|index_jskb_uri|/imgs/btn/koeye.png";
tail j=4210 line= ko_links[j++]="/ko/svc/js/stemkoskijs/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
tail j=4211 line= ko_links[j++]="/ko/svc/aud/mrcoles/koh5_mrcoles.html|/imgs/links/mrcoles.png|mrcoles|/imgs/btn/koeye.png";
tail j=4212 line= ko_links[j++]="http://effectgames.com/demos/canvascycle/|/imgs/links/index_effectgames.png|index_effectgames|/imgs/btn/koeye.png";
tail j=4213 line= ko_links[j++]="https://www.leshylabs.com/apps/sfMaker/|/imgs/links/index_sfmaker.png|index_sfmaker|/imgs/btn/koeye.png";
tail j=4214 line= ko_links[j++]="https://dragongoserver.net/|/imgs/links/index_dgs.png|index_dgs|/imgs/btn/koeye.png";
tail j=4215 line= ko_links[j++]="/ko_center/ko_center.php|/imgs/links/ko_center.png|ko_center|/imgs/btn/kob.png";
tail j=4216 line= ko_links[j++]="/ko_saic/ko_saic.php|/imgs/links/ko_saic.png|ko_saic|/imgs/btn/kob.png";
tail j=4217 line= ko_links[j++]="/index_kt.html|/imgs/links/index_kt.png|index_kt|/imgs/btn/kob.png";
tail j=4218 line= ko_links[j++]="/index_jtf.html|/imgs/links/index_jtf.png|index_jtf|/imgs/btn/kob.png";
tail j=4219 line= ko_links[j++]="/index2big.html|/imgs/links/index2big.png|index2big|/imgs/btn/kob.png";
tail j=4220 line= ko_links[j++]="/index2big.htm|/imgs/links/index2big_noel.png|index2big_noel|/imgs/btn/kob.png";
tail j=4221 line= ko_links[j++]="/jkwii/whiteboard.html|/imgs/links/whiteboard.png|whiteboard|/imgs/btn/koeye.png";
tail j=4222 line= return( ko_links );
tail j=4223 line= }
tail j=4224 line=
tail j=4225 line=
tail j=4226 line=
tail j=4227 line= function load_us_links() {
tail j=4228 line= var j=0;
tail j=4229 line=// https://www.yelp.com/biz_photos/rechtin-family-and-cosmetic-dental-care-st-louis-2?adjust_creative=dWJMtmYxpd5N5yoyzSuhtA&utm_campaign=yelp_api&utm_medium=api_v2_business&utm_source=dWJMtmYxpd5N5yoyzSuhtA|
tail j=4230 line= us_links[j++]="/us/med/kov_rechtin.html|/imgs/us/med_rechtin.png|med_rechtin|/imgs/btn/koeye.png|med";
tail j=4231 line= us_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4232 line= us_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4233 line=
tail j=4234 line= us_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
tail j=4235 line= us_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
tail j=4236 line= us_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
tail j=4237 line= us_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
tail j=4238 line= us_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
tail j=4239 line= us_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
tail j=4240 line= us_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
tail j=4241 line= us_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
tail j=4242 line= us_links[j++]="http://www.fdazol.com/|/imgs/us/law_azol.png|law_azol_f|/imgs/btn/koeye.png|law";
tail j=4243 line=
tail j=4244 line= us_links[j++]="https://jmhalumni.com|/imgs/us/jmhalumni.png|ed_jmhalumni|/imgs/btn/koeye.png|edu";
tail j=4245 line= us_links[j++]="https://johnmarshallhighschool.com|/imgs/us/johnmarshallhighschool.png|ed_johnmarshallhighschool|/imgs/btn/koeye.png|edu";
tail j=4246 line= us_links[j++]="https://www.greatschools.org/kentucky/brandenburg/1993-Brandenburg-High-School/|/imgs/us/brandenburg_highschool.png|ed_brandenburg-highschool|/imgs/btn/koeye.png|edu";
tail j=4247 line= us_links[j++]="https://www.hazelwoodschools.org/Page/3143|/imgs/us/hazelwood_schools.png|ed_hazelwood_schools|/imgs/btn/koeye.png|edu";
tail j=4248 line= us_links[j++]="https://bw.edu|/imgs/us/bw.png|ed_bw|/imgs/btn/koeye.png|edu";
tail j=4249 line=
tail j=4250 line= us_links[j++]="http://oldtowndonuts.com|/imgs/us/oldtowndonuts.png|food_oldtowndonuts|/imgs/btn/koeye.png|food";
tail j=4251 line= us_links[j++]="http://farkaspastries.com|/imgs/us/farkaspastries.png|food_farkaspastries|/imgs/btn/koeye.png|food";
tail j=4252 line= us_links[j++]="https://www.facebook.com/HansaImportHouse|/imgs/us/hansaimporthouse.png|food_hansaimporthouse|/imgs/btn/koeye.png|food";
tail j=4253 line= us_links[j++]="http://havanagrillco.com|/imgs/us/havanagrillco.png|food_havanagrillco|/imgs/btn/koeye.png|food";
tail j=4254 line= us_links[j++]="http://spiros-restaurant.com|/imgs/us/spiros_restaurant.png|food_spiros_restaurant|/imgs/btn/koeye.png|food";
tail j=4255 line= us_links[j++]="https://www.opentable.com/jake-and-tellys-greek-taverna?page=1|/imgs/us/food_jake_tellys.png|food_jake_tellys|/imgs/btn/koeye.png|food";
tail j=4256 line= us_links[j++]="http://edelweissrest.com|/imgs/us/edelweissrest.png|food_edelweissrest|/imgs/btn/koeye.png|food";
tail j=4257 line= us_links[j++]="http://bierwerks.com|/imgs/us/food_bierwerks.png|food_bierwerks|/imgs/btn/koeye.png|food";
tail j=4258 line= us_links[j++]="http://www.savellispizzapastasubs.com/|/imgs/us/food_savellispizza.png|food_savellispizza|/imgs/bmtn/koeye.png|food";
tail j=4259 line= us_links[j++]="https://www.facebook.com/woohoogreekfood2/|/imgs/us/woohoogreekfood2.png|food_woohoogreekfood2|/imgs/btn/koeye.png|food";
tail j=4260 line=
tail j=4261 line= us_links[j++]="https://bdo.com/about/us-locations/bdo-st-louis|/imgs/us/bdo-stl.png|acct_bdo-stl|/imgs/btn/koeye.png|acct";
tail j=4262 line= us_links[j++]="https://bdo.com/about/us-locations/bdo-cleveland-office|/imgs/us/bdo-cle.png|acct_bdo-cle|/imgs/btn/koeye.png|acct";
tail j=4263 line= us_links[j++]="http://www.gatewayloan.com/|/imgs/us/gateway_mortgage.png|gateway_mortgage|/imgs/btn/koeye.png|acct";
tail j=4264 line= us_links[j++]="https://chesonsulting.com|/imgs/us/checonsulting.png|biz_checonsulting|/imgs/btn/koeye.png|biz";
tail j=4265 line= us_links[j++]="http://saic.com|/imgs/us/saic.png|saic|/imgs/btn/koeye.png|biz";
tail j=4266 line= us_links[j++]="http://leidos.com|/imgs/us/leidos.png|leidos|/imgs/btn/koeye.png|biz";
tail j=4267 line=
tail j=4268 line=
tail j=4269 line= us_links[j++]="http://ko2.us/index_focus.com|/imgs/us/focus_solutions.png|focus_solutions|/imgs/btn/koeye.png|biz";
tail j=4270 line= us_links[j++]="http://www.finduslocal.com/hardware-stores/kentucky/brandenburg/allens-s-t-hardware-inc|/imgs/us/biz_allens_hardware.png|biz_allens_hardware|/imgs/btn/koeye.png|biz";
tail j=4271 line= us_links[j++]="http://growwarehouse.com|/imgs/us/grow_warehouse.png|grow_warehouse|/imgs/btn/koeye.png|biz";
tail j=4272 line= us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
tail j=4273 line= us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
tail j=4274 line= us_links[j++]="http://www.savellidanceandmartialarts.com/?load=html|/imgs/us/savelli_dance_martialarts.png|savelli_dance_martialarts|/imgs/btn/koeye.png|phy";
tail j=4275 line= us_links[j++]="http://myfusiondance.com/?load=html|/imgs/us/fusion_dance.png|fusion_dance|/imgs/btn/koeye.png|phy";
tail j=4276 line= us_links[j++]="http://www.superseriesbaseball.com/|/imgs/us/super_series_baseball.png|super_series_baseball|/imgs/btn/koeye.png|phy";
tail j=4277 line=
tail j=4278 line= us_links[j++]="https://ftknox.afceachapters.org/|/imgs/us/afcea_knox.png|afcea_knox|/imgs/btn/koeye.png|org";
tail j=4279 line= us_links[j++]="https://scott.afceachapters.org/|/imgs/us/afcea_scott.png|afcea_scott|/imgs/btn/koeye.png|org";
tail j=4280 line= us_links[j++]="https://www.ble-t.org/|/imgs/us/ble.png|ble|/imgs/btn/koeye.png|org";
tail j=4281 line= us_links[j++]="http://www.doevalley.org/|/imgs/us/doe_valley.png|doe_valley|/imgs/btn/koeye.png|org";
tail j=4282 line=
tail j=4283 line= us_links[j++]="http://www.chapelofthecross.org/|/imgs/us/chapel_of_the_cross.png|chapel_of_the_cross|/imgs/btn/koeye.png|rel";
tail j=4284 line= us_links[j++]="https://www.lds.org/temples/details/st.-louis-missouri-temple|/imgs/us/lds_stl.png|lds_stl|/imgs/btn/koeye.png|rel";
tail j=4285 line= us_links[j++]="https://www.bethanyenglish.org/|/imgs/us/bethany_english_lutheran.png|bethany_english_lutheran|/imgs/btn/koeye.png|rel";
tail j=4286 line= us_links[j++]="https://www.meadecountymessenger.com/|/imgs/us/meade_county_messenger.png|meade_county_messenger|/imgs/btn/koeye.png|media";
tail j=4287 line= us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
tail j=4288 line= us_links[j++]="https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2088|/imgs/us/mars_jpl_nasa.png|mars_jpl_nasa|/imgs/btn/koeye.png|sci";
tail j=4289 line= us_links[j++]="https://mars.nasa.gov/mer/gallery/all/opportunity.html|/imgs/us/mars_nasa_gov.png|mars_nasa_gov|/imgs/btn/koeye.png|sci";
tail j=4290 line= us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
tail j=4291 line= return( us_links );
tail j=4292 line= }
tail j=4293 line=
tail j=4294 line=
tail j=4295 line=
tail j=4296 line= function load_u_links() {
tail j=4297 line= var j=0;
tail j=4298 line= u_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4299 line= u_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4300 line=
tail j=4301 line= u_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
tail j=4302 line= u_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
tail j=4303 line= u_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
tail j=4304 line= u_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
tail j=4305 line= u_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
tail j=4306 line= u_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
tail j=4307 line= u_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
tail j=4308 line= u_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
tail j=4309 line= return( u_links );
tail j=4310 line= }
tail j=4311 line=
tail j=4312 line=
tail j=4313 line=
tail j=4314 line= function load_now_links() {
tail j=4315 line= var j=0;
tail j=4316 line= now_links[j++]="http://index_party.html|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4317 line= now_links[j++]="http://index_jtfdc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4318 line= now_links[j++]="http://index_jtfinc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4319 line= now_links[j++]="http://index_stlc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4320 line= now_links[j++]="http://index_jtfdcr.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4321 line= now_links[j++]="http://index_byrdpucker.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4322 line= return( now_links );
tail j=4323 line= }
tail j=4324 line=
tail j=4325 line=
tail j=4326 line= function show_svc_links(mode) {
tail j=4327 line= svc_links = load_svc_links();
tail j=4328 line= htmout_svc_links = "";
tail j=4329 line= htmout_svc_linkz = "";
tail j=4330 line= for (i = 0; i < svc_links.length; i++) {
tail j=4331 line= my_btnimg = "/imgs/btn/kib.png";
tail j=4332 line= my_href = svc_links[i].split("|")[0];
tail j=4333 line= my_popimg = svc_links[i].split("|")[1];
tail j=4334 line= my_alt = svc_links[i].split("|")[2];
tail j=4335 line=
tail j=4336 line=// htmout_svc_linkz += '<div class="drag" name="'+my_alt+'" >\n';
tail j=4337 line= htmout_svc_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4338 line= htmout_svc_linkz += '<img id="drg" src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4339 line=// htmout_svc_linkz += '</div >';
tail j=4340 line=
tail j=4341 line=// htmout_svc_links += '<div class="drag" name="'+my_alt+'" >\n';
tail j=4342 line= htmout_svc_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4343 line= htmout_svc_links += '<img class="drag" id="drg" src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4344 line= htmout_svc_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4345 line=// htmout_svc_links += '</div >';
tail j=4346 line= }
tail j=4347 line= if( mode === 'pop' ) {
tail j=4348 line= htmout_svc_links += "<br><br>\n";
tail j=4349 line= var div_svc_links = document.getElementById('div_svc_links');
tail j=4350 line= div_svc_links.insertAdjacentHTML('beforeend', htmout_svc_links);
tail j=4351 line= return( htmout_svc_links );
tail j=4352 line= }
tail j=4353 line=
tail j=4354 line= htmout_svc_linkz += "<br><br>\n";
tail j=4355 line= var div_svc_linkz = document.getElementById('div_svc_linkz');
tail j=4356 line= div_svc_linkz.insertAdjacentHTML('beforeend', htmout_svc_linkz);
tail j=4357 line= return( htmout_svc_linkz );
tail j=4358 line= }
tail j=4359 line=
tail j=4360 line= function show_ko_links(mode) {
tail j=4361 line= ko_links = load_ko_links();
tail j=4362 line= htmout_ko_links = "";
tail j=4363 line= htmout_ko_linkz = "";
tail j=4364 line= for (i = 0; i < ko_links.length; i++) {
tail j=4365 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4366 line= my_href = ko_links[i].split("|")[0];
tail j=4367 line= my_popimg = ko_links[i].split("|")[1];
tail j=4368 line= my_alt = ko_links[i].split("|")[2];
tail j=4369 line=
tail j=4370 line= htmout_ko_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4371 line= htmout_ko_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4372 line=
tail j=4373 line= htmout_ko_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4374 line= htmout_ko_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4375 line= htmout_ko_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4376 line= }
tail j=4377 line=
tail j=4378 line= if( mode === 'pop' ) {
tail j=4379 line= htmout_ko_links += "<br><br>";
tail j=4380 line= var div_ko_links = document.getElementById('div_ko_links');
tail j=4381 line= div_ko_links.insertAdjacentHTML('beforeend', htmout_ko_links);
tail j=4382 line= return( htmout_ko_links );
tail j=4383 line= }
tail j=4384 line=
tail j=4385 line= htmout_ko_linkz += "<br><br>";
tail j=4386 line= var div_ko_linkz = document.getElementById('div_ko_linkz');
tail j=4387 line= div_ko_linkz.insertAdjacentHTML('beforeend', htmout_ko_linkz);
tail j=4388 line= return( htmout_ko_linkz );
tail j=4389 line= }
tail j=4390 line=
tail j=4391 line=
tail j=4392 line= function show_us_links(mode) {
tail j=4393 line= us_links = load_us_links();
tail j=4394 line= htmout_us_links = "";
tail j=4395 line= htmout_us_linkz = "";
tail j=4396 line= for (i = 0; i < us_links.length; i++) {
tail j=4397 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4398 line= my_href = us_links[i].split("|")[0];
tail j=4399 line= my_popimg = us_links[i].split("|")[1];
tail j=4400 line= my_alt = us_links[i].split("|")[2];
tail j=4401 line=
tail j=4402 line= htmout_us_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4403 line= htmout_us_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4404 line=
tail j=4405 line= htmout_us_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4406 line= htmout_us_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4407 line= htmout_us_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4408 line= }
tail j=4409 line=
tail j=4410 line= if( mode === 'pop' ) {
tail j=4411 line= htmout_us_links += "<br><br>";
tail j=4412 line= var div_us_links = document.getElementById('div_us_links');
tail j=4413 line= div_us_links.insertAdjacentHTML('beforeend', htmout_us_links);
tail j=4414 line= return( htmout_us_links );
tail j=4415 line= }
tail j=4416 line=
tail j=4417 line= htmout_us_linkz += "<br><br>";
tail j=4418 line= var div_us_linkz = document.getElementById('div_us_linkz');
tail j=4419 line= div_us_linkz.insertAdjacentHTML('beforeend', htmout_us_linkz);
tail j=4420 line= return( htmout_us_linkz );
tail j=4421 line= }
tail j=4422 line=
tail j=4423 line=
tail j=4424 line=
tail j=4425 line=
tail j=4426 line=
tail j=4427 line=
tail j=4428 line=
tail j=4429 line= function show_u_links(mode) {
tail j=4430 line= u_links = load_u_links();
tail j=4431 line= htmout_u_links = "";
tail j=4432 line= htmout_u_linkz = "";
tail j=4433 line= for (i = 0; i < u_links.length; i++) {
tail j=4434 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4435 line= my_href = u_links[i].split("|")[0];
tail j=4436 line= my_popimg = u_links[i].split("|")[1];
tail j=4437 line= my_alt = u_links[i].split("|")[2];
tail j=4438 line=
tail j=4439 line= htmout_u_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4440 line= htmout_u_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4441 line=
tail j=4442 line= htmout_u_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4443 line= htmout_u_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4444 line= htmout_u_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4445 line= }
tail j=4446 line=
tail j=4447 line= if( mode === 'pop' ) {
tail j=4448 line= htmout_u_links += "<br><br>";
tail j=4449 line= var div_u_links = document.getElementById('div_u_links');
tail j=4450 line= div_u_links.insertAdjacentHTML('beforeend', htmout_u_links);
tail j=4451 line= return( htmout_u_links );
tail j=4452 line= }
tail j=4453 line=
tail j=4454 line= htmout_u_linkz += "<br><br>";
tail j=4455 line= var div_u_linkz = document.getElementById('div_u_linkz');
tail j=4456 line= div_u_linkz.insertAdjacentHTML('beforeend', htmout_u_linkz);
tail j=4457 line= return( htmout_u_linkz );
tail j=4458 line= }
tail j=4459 line=
tail j=4460 line=
tail j=4461 line=
tail j=4462 line= function show_now_links(mode) {
tail j=4463 line= now_links = load_now_links();
tail j=4464 line= htmout_now_links = "";
tail j=4465 line= htmout_now_linkz = "";
tail j=4466 line= for (i = 0; i < now_links.length; i++) {
tail j=4467 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4468 line= my_href = now_links[i].split("|")[0];
tail j=4469 line= my_popimg = now_links[i].split("|")[1];
tail j=4470 line= my_alt = now_links[i].split("|")[2];
tail j=4471 line=
tail j=4472 line= htmout_now_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4473 line= htmout_now_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4474 line=
tail j=4475 line= htmout_now_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4476 line= htmout_now_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4477 line= htmout_now_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4478 line= }
tail j=4479 line=
tail j=4480 line= if( mode === 'pop' ) {
tail j=4481 line= htmout_now_links += "<br><br>";
tail j=4482 line= var div_now_links = document.getElementById('div_now_links');
tail j=4483 line= div_now_links.insertAdjacentHTML('beforeend', htmout_now_links);
tail j=4484 line= return( htmout_now_links );
tail j=4485 line= }
tail j=4486 line=
tail j=4487 line= htmout_now_linkz += "<br><br>";
tail j=4488 line= var div_now_linkz = document.getElementById('div_now_linkz');
tail j=4489 line= div_now_linkz.insertAdjacentHTML('beforeend', htmout_now_linkz);
tail j=4490 line= return( htmout_now_linkz );
tail j=4491 line= }
tail j=4492 line=
tail j=4493 line= function show_srv_links(mode) {
tail j=4494 line= srv_links = load_srv_links();
tail j=4495 line= htmout_srv_links = "";
tail j=4496 line= htmout_srv_linkz = "";
tail j=4497 line= for (i = 0; i < srv_links.length; i++) {
tail j=4498 line= my_btnimg = "/imgs/btn/kiw.png";
tail j=4499 line= my_href = srv_links[i].split("|")[0];
tail j=4500 line= my_popimg = srv_links[i].split("|")[1];
tail j=4501 line= my_alt = srv_links[i].split("|")[2];
tail j=4502 line=
tail j=4503 line= htmout_srv_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4504 line= htmout_srv_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4505 line=
tail j=4506 line= htmout_srv_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4507 line= htmout_srv_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4508 line= htmout_srv_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4509 line= }
tail j=4510 line= if( mode === 'pop' ) {
tail j=4511 line= htmout_srv_links += "<br><br>\n"
tail j=4512 line= var div_srv_links = document.getElementById('div_srv_links');
tail j=4513 line= div_srv_links.insertAdjacentHTML('beforeend', htmout_srv_links);
tail j=4514 line= return( htmout_srv_links );
tail j=4515 line= }
tail j=4516 line=
tail j=4517 line= htmout_srv_linkz += "<br><br>\n"
tail j=4518 line= var div_srv_linkz = document.getElementById('div_srv_linkz');
tail j=4519 line= div_srv_linkz.insertAdjacentHTML('beforeend', htmout_srv_linkz);
tail j=4520 line= return( htmout_srv_linkz );
tail j=4521 line= }
tail j=4522 line=
tail j=4523 line=// document.write( htmout_svc_links );
tail j=4524 line=// document.write( htmout_ko_links );
tail j=4525 line=// document.write( htmout_srv_links );
tail j=4526 line=
tail j=4527 line=// var div_ko_links = document.getElementById("div_ko_links");
tail j=4528 line=// var div_ko_links_orig = div_ko_links.innerHTML;
tail j=4529 line=// alert( "BUGS_500 div_ko_links_orig="+div_ko_links_orig );
tail j=4530 line=
tail j=4531 line=// div_ko_links.innerHTML = "";
tail j=4532 line=// div_ko_links.appendChild( htmout_ko_links);
tail j=4533 line=
tail j=4534 line=
tail j=4535 line=// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
tail j=4536 line=//
tail j=4537 line=// getElementById("foo").insertAdjacentHTML
tail j=4538 line=// <!-- beforebegin / before -->
tail j=4539 line=// <p>
tail j=4540 line=// <!-- afterbegin / prepend -->
tail j=4541 line=// foo
tail j=4542 line=// <!-- beforeend / append -->
tail j=4543 line=// </p>
tail j=4544 line=// <!-- afterend / after-->
tail j=4545 line=//
tail j=4546 line=// document.getElementById('foo').insertAdjacentHTML("beforebegin", "<hr>")
tail j=4547 line=// $('#foo').before("<hr>")
tail j=4548 line=// document.getElementById('foo').insertAdjacentHTML("afterend", "<hr>")
tail j=4549 line=// $('#foo').append("<hr>")
tail j=4550 line=// document.getElementById('foo').insertAdjacentHTML("beforeend", "<hr>")
tail j=4551 line=// $('#foo').append("<hr>")
tail j=4552 line=// document.getElementById('foo').insertAdjacentHTML("afterbegin", "<hr>")
tail j=4553 line=// $('#foo').prepend("<hr>")
tail j=4554 line=//
tail j=4555 line=// var btn = document.getElementById('btn'); // The button itself with an ID of 'btn'
tail j=4556 line=// var newButton = '<button>New button</button>'; // New button to be inserted
tail j=4557 line=// btn.insertAdjacentHTML('afterend', newButton);
tail j=4558 line=//
tail j=4559 line=// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
tail j=4560 line= function show_all_links(mode) {
tail j=4561 line= show_svc_links(mode);
tail j=4562 line= show_ko_links(mode);
tail j=4563 line= show_us_links(mode);
tail j=4564 line= show_u_links(mode);
tail j=4565 line= show_now_links(mode);
tail j=4566 line= show_srv_links(mode);
tail j=4567 line= }
tail j=4568 line=
tail j=4569 line= </script id="script_load_liks" >
tail j=4570 line=
tail j=4571 line= <div id="div_links" >
tail j=4572 line= <hr color=red>
tail j=4573 line= <div id="div_svc_links" > </div>
tail j=4574 line= <hr color=red>
tail j=4575 line=
tail j=4576 line= <hr color=white>
tail j=4577 line= <div id="div_ko_links" > </div>
tail j=4578 line= <hr color=white>
tail j=4579 line=
tail j=4580 line= <hr color=white>
tail j=4581 line= <div id="div_us_links" > </div>
tail j=4582 line= <hr color=white>
tail j=4583 line=
tail j=4584 line= <hr color=white>
tail j=4585 line= <div id="div_u_links" > </div>
tail j=4586 line= <hr color=white>
tail j=4587 line=
tail j=4588 line= <hr color=white>
tail j=4589 line= <div id="div_now_links" > </div>
tail j=4590 line= <hr color=white>
tail j=4591 line=
tail j=4592 line= <hr color=blue>
tail j=4593 line= <div id="div_srv_links" > </div>
tail j=4594 line= <hr color=blue>
tail j=4595 line= </div id="div_links" >
tail j=4596 line=
tail j=4597 line= <div id="div_linkz" >
tail j=4598 line= <hr color=red>
tail j=4599 line= <div id="div_svc_linkz" > </div>
tail j=4600 line= <hr color=red>
tail j=4601 line=
tail j=4602 line= <hr color=black>
tail j=4603 line= <div id="div_ko_linkz" > </div>
tail j=4604 line= <hr color=black>
tail j=4605 line=
tail j=4606 line= <hr color=black>
tail j=4607 line= <div id="div_us_linkz" > </div>
tail j=4608 line= <hr color=black>
tail j=4609 line=
tail j=4610 line= <hr color=black>
tail j=4611 line= <div id="div_u_linkz" > </div>
tail j=4612 line= <hr color=black>
tail j=4613 line=
tail j=4614 line= <hr color=black>
tail j=4615 line= <div id="div_now_linkz" > </div>
tail j=4616 line= <hr color=black>
tail j=4617 line=
tail j=4618 line= <hr color=blue>
tail j=4619 line= <div id="div_srv_linkz" > </div>
tail j=4620 line= <hr color=blue>
tail j=4621 line= </div id="div_linkz" >
tail j=4622 line=
tail j=4623 line= <div id="div_cfaa" class=ko>
tail j=4624 line=<!-- -->
tail j=4625 line=
tail j=4626 line= <script id="script_cfaa">
tail j=4627 line= var text_cfaa =
tail j=4628 line=`
tail j=4629 line=pqpqpqpqpqpqpqpqpqpq Warning pqpqpqpqpqpqpqpqpqpq<br>
tail j=4630 line=<br>
tail j=4631 line=This site may be protected under the
tail j=4632 line=<br>
tail j=4633 line=<br>
tail j=4634 line=<b>CFAA</b>
tail j=4635 line=<br>
tail j=4636 line=Computer Fraud and Abuse Act
tail j=4637 line=<br>
tail j=4638 line=<br>
tail j=4639 line=your attemped access has been logged
tail j=4640 line=<br>
tail j=4641 line=repeated attemps by unauthorized guests will be reported
tail j=4642 line=<br>
tail j=4643 line=<br>
tail j=4644 line=By continuing You are acknowledging
tail j=4645 line=<br>
tail j=4646 line=you are fully authorized and
tail j=4647 line=<br>
tail j=4648 line=understand the responsibilites to access the content on the site
tail j=4649 line=<br>
tail j=4650 line=<br>
tail j=4651 line=This page must not be removed
tail j=4652 line=<br>
tail j=4653 line=bdbdbdbdbdbdbdbdbdbd Warning bdbdbdbdbdbdbdbdbdbd
tail j=4654 line=<br>
tail j=4655 line=<br>
tail j=4656 line=unauthoriced users should
tail j=4657 line=<br>
tail j=4658 line=consider browsing elsewhere:
tail j=4659 line=
tail j=4660 line=
tail j=4661 line=<hr color=black>
tail j=4662 line=<hr color=ivory>
tail j=4663 line=<hr color=red>
tail j=4664 line=<hr color=blue>
tail j=4665 line=<hr color=ebony>
tail j=4666 line=<hr color=white>
tail j=4667 line=
tail j=4668 line=<a href=duckduckgo.com > <img src="ok.png" alt="duckduckgo" height=10 border=0></a>
tail j=4669 line=     
tail j=4670 line=<a href=bing.com > <img src="ok.png" alt="bing" height=10 border=0></a>
tail j=4671 line=     
tail j=4672 line=<a href=google.com > <img src="ok.png" alt="google" height=10 border=0></a>
tail j=4673 line=     
tail j=4674 line=<a href=yahoo.com > <img src="ok.png" alt="yahoo" height=10 border=0></a>
tail j=4675 line=     
tail j=4676 line= <a href=https://mars.jpl.nasa.gov/msl/multimedia/raw target=_blank>
tail j=4677 line= <img src="ok.png" border=0 height=10>
tail j=4678 line= </a>
tail j=4679 line=     
tail j=4680 line= <a href=http://youtube.com target=_blank>
tail j=4681 line= <img src="ok.png" border=0 height=10>
tail j=4682 line= </a>
tail j=4683 line= </div id="div_cfaa" class=ko>
tail j=4684 line=
tail j=4685 line=<hr color=white>
tail j=4686 line=<hr color=ebony>
tail j=4687 line=<hr color=blue>
tail j=4688 line=<hr color=red>
tail j=4689 line=<hr color=ivory>
tail j=4690 line=<hr color=black>
tail j=4691 line=
tail j=4692 line= <div id="div_warn2" class=ko>
tail j=4693 line= <p id=p_warn2 class=ko>
tail j=4694 line= <hr color=black>
tail j=4695 line= <hr color=white>
tail j=4696 line= <hr color=red>
tail j=4697 line= If you are seeing this page
tail j=4698 line= <br>
tail j=4699 line= you are probably unauthorized
tail j=4700 line= <br>
tail j=4701 line= you should <b>NOT</b> continue
tail j=4702 line= <br>
tail j=4703 line= accessing site content here may be
tail j=4704 line= <br>
tail j=4705 line= protected under <b>CFAA</b>
tail j=4706 line= <hr color=red>
tail j=4707 line= <hr color=white>
tail j=4708 line= <hr color=black>
tail j=4709 line= </p>
tail j=4710 line=
tail j=4711 line= authorized sites are available from bluehost
tail j=4712 line=
tail j=4713 line= <a href="https://www.bluehost.com/?utm_source=%28direct%29&utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype" target=_blank>
tail j=4714 line= <img src=/imgs/bh/bh_anim.gif height=30 border=0 alt=bluehost.com affiliate></a>
tail j=4715 line= <div id=kobh_offer class=ko>
tail j=4716 line= bluehost offers
tail j=4717 line= 50 gb space
tail j=4718 line= 999 gb bandwidth
tail j=4719 line=
tail j=4720 line= 6 domains on 1 account
tail j=4721 line= and more for only $6.95/month
tail j=4722 line= </div>
tail j=4723 line= </div id="div_warn2" class=ko>
tail j=4724 line=
tail j=4725 line=
tail j=4726 line= <script id="script_url">
tail j=4727 line= var url = document.createElement("a");
tail j=4728 line= url.href=location.href
tail j=4729 line= var output = "output"
tail j=4730 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
tail j=4731 line=// alert(location.href)
tail j=4732 line=// alert(url.protocol)
tail j=4733 line=// alert(url.hostname)
tail j=4734 line=// alert(url.pathname)
tail j=4735 line=// alert(url.search)
tail j=4736 line=// alert(url.hash)
tail j=4737 line=
tail j=4738 line= if( url.search == "" ) {document.write( text_cfaa );}
tail j=4739 line= if( url.search == "?q=cfaa" ) {document.write( text_cfaa ); }
tail j=4740 line= </script id="script_url">
tail j=4741 line= </div>
tail j=4742 line=
tail j=4743 line=
tail j=4744 line=
tail j=4745 line=<!--
tail j=4746 line= <iframe id="myframe" src="/svc/kokbdm/index.html" width="1000" height="500"
tail j=4747 line= frameborder="0" scrolling="yes"></iframe>
tail j=4748 line= -->
tail j=4749 line=
tail j=4750 line= <hr color=red><hr color=black><hr color=white>
tail j=4751 line= <button type="button" onclick="show_all_links('pop')">show_all_links</button>
tail j=4752 line=<!-- <button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
tail j=4753 line= <hr color=red><hr color=white><hr color=blue>
tail j=4754 line= <button type="button" onclick="show_svc_links('pop')">show_svc_links</button>
tail j=4755 line= <button type="button" onclick="show_ko_links('pop')">show_ko_links</button>
tail j=4756 line= <button type="button" onclick="show_us_links('pop')">show_us_links</button>
tail j=4757 line= <button type="button" onclick="show_u_links('pop')">show_u_links</button>
tail j=4758 line= <button type="button" onclick="show_now_links('pop')">show_now_links</button>
tail j=4759 line= <button type="button" onclick="show_srv_links('pop')">show_srv_links</button>
tail j=4760 line= <hr color=blue><hr color=white><hr color=black>
tail j=4761 line=
tail j=4762 line=<!--
tail j=4763 line= <img src="/imgs/btn/kib.png" height="50" size="150" alt="koeye" onclick="show_svc_links()">
tail j=4764 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_ko_links()">
tail j=4765 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_us_links()">
tail j=4766 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_u_links()">
tail j=4767 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_now_links()">
tail j=4768 line= <img src="/imgs/btn/kiw.png" height="50" size="150" alt="koeyew" onclick="show_srv_links()">
tail j=4769 line= -->
tail j=4770 line=
tail j=4771 line= <div id="div_kobuttons">
tail j=4772 line= <a href=# class="popover" onclick="show_svc_links();">
tail j=4773 line= <img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" >
tail j=4774 line= <span><img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" ></span>
tail j=4775 line= </a>
tail j=4776 line=
tail j=4777 line= <a href=# class="popover" onclick="show_ko_links();">
tail j=4778 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4779 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4780 line= </a>
tail j=4781 line=
tail j=4782 line= <a href=# class="popover" onclick="show_us_links();">
tail j=4783 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4784 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4785 line= </a>
tail j=4786 line=
tail j=4787 line= <a href=# class="popover" onclick="show_u_links();">
tail j=4788 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4789 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4790 line= </a>
tail j=4791 line=
tail j=4792 line= <a href=# class="popover" onclick="show_now_links();">
tail j=4793 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4794 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4795 line= </a>
tail j=4796 line=
tail j=4797 line= <a href=# class="popover" onclick="show_srv_links();">
tail j=4798 line= <img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" >
tail j=4799 line= <span><img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" ></span>
tail j=4800 line= </a>
tail j=4801 line= </div id="div_kobuttons">
tail j=4802 line=
tail j=4803 line= <hr color=blue><hr color=white><hr color=red>
tail j=4804 line=
tail j=4805 line=<!--
tail j=4806 line= <div id="div_drop">
tail j=4807 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=4808 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=4809 line= <img height=200 width=300
tail j=4810 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=4811 line= </a>
tail j=4812 line= <div id="div_drop">
tail j=4813 line= -->
tail j=4814 line= <hr color=red>
tail j=4815 line= <hr color=white>
tail j=4816 line= <hr color=blue>
tail j=4817 line=
tail j=4818 line= <div id="div_drag" >
tail j=4819 line= <a class="popover" href="/?q=bigtn_drag1">
tail j=4820 line= <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
tail j=4821 line= <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
tail j=4822 line= </a>
tail j=4823 line= </div id="div_drag" >
tail j=4824 line=
tail j=4825 line=
tail j=4826 line=
tail j=4827 line= <div id="div_drop_zm">
tail j=4828 line= <span id="sw"><h3>droptop</h3></span>
tail j=4829 line= <a class="thumbnail" href=/index_vu.html?zmid=/zm/komap target=_blank>
tail j=4830 line= <img height=200 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 >
tail j=4831 line= <span><img height=400 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 ></span>
tail j=4832 line= </a>
tail j=4833 line= </div id="div_drop_zm">
tail j=4834 line=
tail j=4835 line=
tail j=4836 line= <div id="div_drag_main"> drag:<br />
tail j=4837 line= <img class="drg" src="/images/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=4838 line=
tail j=4839 line= <div class="drg"><h1>konet llc </h1>
tail j=4840 line= <pre>timesak skwii</pre>
tail j=4841 line= <img class="drg" src="/imgs/links/keyeb.png" alt="keyeb.png" width="50" >
tail j=4842 line= <img class="drg" src="/imgs/links/keyw.png" alt="keyew.png" width="50" >
tail j=4843 line= <pre>timesak skwii</pre>
tail j=4844 line= </div>
tail j=4845 line=
tail j=4846 line= <div class="drg"><h3>jtf29 </h3>
tail j=4847 line= <a href=/ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=4848 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=4849 line= </a>
tail j=4850 line= </div>
tail j=4851 line=
tail j=4852 line=
tail j=4853 line= <div class="drg"><h3>dogheads</h3>
tail j=4854 line= <div id="div_jtf_vid5">
tail j=4855 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=4856 line= <source src="/ko_jtf/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4857 line= </video>
tail j=4858 line= </div>
tail j=4859 line= </div>
tail j=4860 line=
tail j=4861 line= <div class="drg"><h3>jtfdc night court lights action 3720</h3>
tail j=4862 line= <div id="div_vid">
tail j=4863 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=4864 line= <source src="index.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4865 line= <source src="index.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4866 line= </video>
tail j=4867 line= </div>
tail j=4868 line= </div>
tail j=4869 line=
tail j=4870 line= <div class="drg"><h3>vid1: </h3>
tail j=4871 line= <div id="div_vid1">
tail j=4872 line= <video controls="controls" defaultmuted="" muted="true" style="width:320;height:180;" poster="index1_mp4.png">
tail j=4873 line= <source src="index1.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4874 line= <source src="index1.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4875 line= </video>
tail j=4876 line= </div>
tail j=4877 line= </div>
tail j=4878 line=
tail j=4879 line= <div class="drg"><h3>vid2_avril</h3>
tail j=4880 line= <div id="div_vid2_avril">
tail j=4881 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index2_mp4.png">
tail j=4882 line= <source src="index2.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4883 line= <source src="index2.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4884 line= </video>
tail j=4885 line= </div>
tail j=4886 line= </div>
tail j=4887 line=
tail j=4888 line= <div class="drg"><h3>vid3_jtfinc_dogpatrol_tresspass</h3>
tail j=4889 line= <div id="div_vid3">
tail j=4890 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index3_mp4.png">
tail j=4891 line= <source src="index3.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4892 line= <source src="index3.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4893 line= </video>
tail j=4894 line= </div>
tail j=4895 line= </div>
tail j=4896 line=
tail j=4897 line=
tail j=4898 line= <div class="drg">konet llc
tail j=4899 line= <img src="/imgs/btn/kob.png" alt="ko.png" width="50" class="drg" />
tail j=4900 line=
tail j=4901 line= </div>
tail j=4902 line= </div id="div_drag_main">
tail j=4903 line=
tail j=4904 line=
tail j=4905 line= <hr color=yellow>
tail j=4906 line= <hr color=white>
tail j=4907 line= <hr color=yellow>
tail j=4908 line=
tail j=4909 line= <div id="div_neave_im" >
tail j=4910 line= <iframe frameborder='0' height='250' marginheight='0' marginwidth='0' scrolling='no'
tail j=4911 line= src='/index_neave_im.html'
tail j=4912 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=4913 line= </iframe>
tail j=4914 line= <a class="popover" href="/index_neave_im.html" target=_blank>
tail j=4915 line= <img height=50 width=1600 src="/imgs/links/index_neave_im.png" alt="index_neave_im" border=0>
tail j=4916 line= <span><img height=50 width=1600 src="/imgs/links/index_neave_im_pop.png" border=0></span>
tail j=4917 line= </a>
tail j=4918 line= </div id="div_neave_im" >
tail j=4919 line=
tail j=4920 line= <div id="div_iframe" height-"150" >
tail j=4921 line= </div id="div_ifram" >
tail j=4922 line=
tail j=4923 line= <div id="div_neave_wobble" >
tail j=4924 line=
tail j=4925 line= <a class="popover" href="/index_neave_wobble.html" target=_blank>
tail j=4926 line= <img height=50 width=1600 src="/imgs/links/index_neave_wobble.png" alt="index_neave_wobble" border=0>
tail j=4927 line= <span><img height=50 width=1600 src="/imgs/links/index_neave_wobble_pop.png" border=0></span>
tail j=4928 line= </a>
tail j=4929 line= <iframe frameborder='0' height='150' marginheight='0' marginwidth='0' scrolling='no'
tail j=4930 line= src='/index_neave_wobble.html'
tail j=4931 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=4932 line= </iframe>
tail j=4933 line= </div id="div_neave_wobble" >
tail j=4934 line=
tail j=4935 line=
tail j=4936 line=
tail j=4937 line=
tail j=4938 line= <div id="div_files" >
tail j=4939 line= <output id="zonelist"></output>
tail j=4940 line= <div id="dropzone">
tail j=4941 line= dropzone
tail j=4942 line= <div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
tail j=4943 line= <canvas id="canvas_dropzone" style="z-index: 1;
tail j=4944 line= position:absolute;
tail j=4945 line= left:0px;
tail j=4946 line= top:0px;
tail j=4947 line= " height="100px" width="200" background-color="darkSlategrey" color="ivory">
tail j=4948 line= WARN_1387 unauthorized access has been logged
tail j=4949 line= </canvas>
tail j=4950 line= </div id="div_files" >
tail j=4951 line=
tail j=4952 line= <script id="scrip_fileselect" name="script_fileselect">
tail j=4953 line= function handleFileSelect(evt) {
tail j=4954 line= evt.stopPropagation();
tail j=4955 line= evt.preventDefault();
tail j=4956 line=
tail j=4957 line= var files = evt.dataTransfer.files; // FileList object.
tail j=4958 line=
tail j=4959 line=// files is a FileList of File objects. List some properties.
tail j=4960 line= var output = [];
tail j=4961 line= for (var i = 0, f; f = files[i]; i++) {
tail j=4962 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
tail j=4963 line= f.size, ' bytes, last modified: ',
tail j=4964 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
tail j=4965 line= '</li>');
tail j=4966 line= }
tail j=4967 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
tail j=4968 line= }
tail j=4969 line=
tail j=4970 line= function handleDragOver(evt) {
tail j=4971 line= evt.stopPropagation();
tail j=4972 line= evt.preventDefault();
tail j=4973 line= evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
tail j=4974 line= }
tail j=4975 line=
tail j=4976 line= // Setup the dnd listeners.
tail j=4977 line= var dropZone = document.getElementById('dropzone');
tail j=4978 line= dropZone.addEventListener('dragover', handleDragOver, false);
tail j=4979 line= dropZone.addEventListener('drop', handleFileSelect, false);
tail j=4980 line= </script id="scrip_fileselect" name="script_fileselect">
tail j=4981 line=
tail j=4982 line=<hr><hr><hr>
tail j=4983 line= <div id="div_zonelist">
tail j=4984 line= <label class="fileContainer">
tail j=4985 line= files
tail j=4986 line= <input id="files" name="files[]" multiple="" type="file">
tail j=4987 line= </label>
tail j=4988 line= <output id="zonelist"></output>
tail j=4989 line= <div id="div_zonelist">
tail j=4990 line=
tail j=4991 line= <script id="script_hfileselect" >
tail j=4992 line= function handleFileSelect(evt) {
tail j=4993 line= var files = evt.target.files; // FileList object
tail j=4994 line=
tail j=4995 line= // files is a FileList of File objects. List some properties.
tail j=4996 line= var output = [];
tail j=4997 line= for (var i = 0, f; f = files[i]; i++) {
tail j=4998 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
tail j=4999 line= f.size, ' bytes, last modified: ',
tail j=5000 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
tail j=5001 line= '</li>');
tail j=5002 line= }
tail j=5003 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
tail j=5004 line= }
tail j=5005 line=
tail j=5006 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
tail j=5007 line= </script id="script_hfileselect" >
tail j=5008 line=
tail j=5009 line= <div id="div_files2" hidden >
tail j=5010 line= <label class="fileContainer">
tail j=5011 line= files2
tail j=5012 line= <input id="files" name="files[]" multiple="" type="file">
tail j=5013 line= </label>
tail j=5014 line= <output id="zonelist"></output>
tail j=5015 line= </div id="div_files2" hidden >
tail j=5016 line=
tail j=5017 line= <script id="script_hfileselect2" >
tail j=5018 line= function handleFileSelect(evt) {
tail j=5019 line= var files = evt.target.files; // FileList object
tail j=5020 line=
tail j=5021 line= // Loop through the FileList and render image files as thumbnails.
tail j=5022 line= for (var i = 0, f; f = files[i]; i++) {
tail j=5023 line=
tail j=5024 line=// Only process image files.
tail j=5025 line= if (!f.type.match('image.*')) { continue; }
tail j=5026 line=
tail j=5027 line= var reader = new FileReader();
tail j=5028 line=
tail j=5029 line= // Closure to capture the file information.
tail j=5030 line= reader.onload = (function(theFile) {
tail j=5031 line= return function(e) {
tail j=5032 line= // Render thumbnail.
tail j=5033 line= var span = document.createElement('span');
tail j=5034 line= span.innerHTML = ['<img class="thumb" src="', e.target.result,
tail j=5035 line= '" title="', escape(theFile.name), '"/>'].join('');
tail j=5036 line= document.getElementById('zonelist').insertBefore(span, null);
tail j=5037 line= };
tail j=5038 line= })(f);
tail j=5039 line=
tail j=5040 line= // Read in the image file as a data URL.
tail j=5041 line= reader.readAsDataURL(f);
tail j=5042 line= }
tail j=5043 line= }
tail j=5044 line=
tail j=5045 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
tail j=5046 line= </script id="script_hfileselect2" >
tail j=5047 line=
tail j=5048 line= <script id="script_previewfile">
tail j=5049 line= function previewfile(file) {
tail j=5050 line= if (tests.filereader === true && acceptedTypes[file.type] === true) {
tail j=5051 line= var reader = new FileReader();
tail j=5052 line= reader.onload = function (event) {
tail j=5053 line= var image = new Image();
tail j=5054 line= image.src = event.target.result;
tail j=5055 line= image.width = 250; // a fake resize
tail j=5056 line= holder.appendChild(image);
tail j=5057 line= };
tail j=5058 line=
tail j=5059 line= reader.readAsDataURL(file);
tail j=5060 line= }
tail j=5061 line= else {
tail j=5062 line= holder.innerHTML +=
tail j=5063 line= '<p>done: koupload'
tail j=5064 line= + file.name
tail j=5065 line= + ' '
tail j=5066 line= + (file.size ? (file.size/1024|0) + 'K' : '');
tail j=5067 line= console.log(file);
tail j=5068 line= }
tail j=5069 line= }
tail j=5070 line=
tail j=5071 line= function readfiles(files) {
tail j=5072 line= debugger;
tail j=5073 line= var formData = tests.formdata ? new FormData() : null;
tail j=5074 line= for (var i = 0; i < files.length; i++) {
tail j=5075 line= if (tests.formdata) formData.append('file', files[i]);
tail j=5076 line= previewfile(files[i]);
tail j=5077 line= }
tail j=5078 line=
tail j=5079 line=// now post a new XHR request
tail j=5080 line= if (tests.formdata) {
tail j=5081 line= var xhr = new XMLHttpRequest();
tail j=5082 line= xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
tail j=5083 line=// xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
tail j=5084 line= xhr.onload = function() {
tail j=5085 line= progress.value = progress.innerHTML = 100;
tail j=5086 line= };
tail j=5087 line=
tail j=5088 line= if (tests.progress) {
tail j=5089 line= xhr.upload.onprogress = function (event) {
tail j=5090 line= if (event.lengthComputable) {
tail j=5091 line= var complete = (event.loaded / event.total * 100 | 0);
tail j=5092 line= progress.value = progress.innerHTML = complete;
tail j=5093 line= }
tail j=5094 line= }
tail j=5095 line= }
tail j=5096 line=
tail j=5097 line= xhr.send(formData);
tail j=5098 line= }
tail j=5099 line= }
tail j=5100 line=
tail j=5101 line= if (tests.dnd) {
tail j=5102 line= holder.ondragover = function () { this.className = 'hover'; return false; };
tail j=5103 line= holder.ondragend = function () { this.className = ''; return false; };
tail j=5104 line= holder.ondrop = function (e) {
tail j=5105 line= this.className = '';
tail j=5106 line= e.preventDefault();
tail j=5107 line= readfiles(e.dataTransfer.files);
tail j=5108 line= }
tail j=5109 line= }
tail j=5110 line= else {
tail j=5111 line= fileupload.className = 'hidden';
tail j=5112 line= fileupload.querySelector('input').onchange = function () {
tail j=5113 line= readfiles(this.files);
tail j=5114 line= };
tail j=5115 line= }
tail j=5116 line= </script id="script_previewfile">
tail j=5117 line=
tail j=5118 line= <script id="script_myfilework>
tail j=5119 line= funtion myfilework( j, file ) {
tail j=5120 line=
tail j=5121 line= alert( j+" file="+file );
tail j=5122 line= }
tail j=5123 line=
tail j=5124 line= </script id="script_myfilework>
tail j=5125 line=
tail j=5126 line=
tail j=5127 line=
tail j=5128 line=
tail j=5129 line=
tail j=5130 line= <script id="script_upload_input">>
tail j=5131 line= var upload = document.getElementsByTagName('input')[0],
tail j=5132 line= holder2 = document.getElementById('holder2'),
tail j=5133 line= state = document.getElementById('status');
tail j=5134 line=
tail j=5135 line= if (typeof window.FileReader === 'undefined') {
tail j=5136 line= state.className = 'fail';
tail j=5137 line= }
tail j=5138 line= else {
tail j=5139 line= state.className = 'success';
tail j=5140 line= state.innerHTML = 'File API & FileReader available';
tail j=5141 line= }
tail j=5142 line=
tail j=5143 line= upload.onchange = function (e) {
tail j=5144 line= e.preventDefault();
tail j=5145 line=
tail j=5146 line= var file = upload.files[0],
tail j=5147 line= reader = new FileReader();
tail j=5148 line= reader.onload = function (event) {
tail j=5149 line= var img = new Image();
tail j=5150 line= img.src = event.target.result;
tail j=5151 line=// note: no onload required since we've got the dataurl...I think! :)
tail j=5152 line= if (img.width > 560) { // holder width
tail j=5153 line= img.width = 560;
tail j=5154 line= }
tail j=5155 line= holder2.innerHTML = '';
tail j=5156 line= holder.appendChild(img);
tail j=5157 line= };
tail j=5158 line= reader.readAsDataURL(file);
tail j=5159 line=
tail j=5160 line= return false;
tail j=5161 line= };
tail j=5162 line=
tail j=5163 line=// var formData = new FormData();
tail j=5164 line=// formData.append("part_num", "123ABC");
tail j=5165 line=// formData.append("part_price", 7.95);
tail j=5166 line=// formData.append("part_image", somefile)
tail j=5167 line=//
tail j=5168 line=// var xhr = new XMLHttpRequest();
tail j=5169 line=// xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");
tail j=5170 line=// xhr.send(formData);
tail j=5171 line= </script id="script_upload_input">>
tail j=5172 line=
tail j=5173 line= <canvas id="canvas_1" color="darkSlategrey" height="100" width="400">
tail j=5174 line= </canvas id="canvas_1" >
tail j=5175 line=
tail j=5176 line=
tail j=5177 line= <script id="script_canvas_1" >
tail j=5178 line= var canvas = document.getElementsByTagName('canvas_1')[0],
tail j=5179 line= ctx = null,
tail j=5180 line= grad = null,
tail j=5181 line= body = document.getElementsByTagName('body')[0],
tail j=5182 line= color = 255;
tail j=5183 line= color = lightblue;
tail j=5184 line=
tail j=5185 line=if (canvas.getContext('2d')) {
tail j=5186 line= ctx = canvas.getContext('2d');
tail j=5187 line= ctx.clearRect(0, 0, 600, 600);
tail j=5188 line= ctx.save();
tail j=5189 line=
tail j=5190 line=// Create radial gradient
tail j=5191 line=// grad = ctx.createRadialGradient(0,0,0,0,0,600);
tail j=5192 line=// grad.addColorStop(0, '#000');
tail j=5193 line=// grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');
tail j=5194 line=
tail j=5195 line= // assign gradients to fill
tail j=5196 line=// ctx.fillStyle = grad;
tail j=5197 line= ctx.fillstyle = "lightblue";
tail j=5198 line=
tail j=5199 line= // draw 600x600 fill
tail j=5200 line= ctx.fillRect(0,0,600,600);
tail j=5201 line= ctx.save();
tail j=5202 line=
tail j=5203 line= body.onmousemove = function (event) {
tail j=5204 line= var width = window.innerWidth,
tail j=5205 line= height = window.innerHeight,
tail j=5206 line= x = event.clientX,
tail j=5207 line= y = event.clientY,
tail j=5208 line= rx = 600 * x / width,
tail j=5209 line= ry = 600 * y / height;
tail j=5210 line=
tail j=5211 line= var xc = ~~(256 * x / width);
tail j=5212 line= var yc = ~~(256 * y / height);
tail j=5213 line=
tail j=5214 line= grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600);
tail j=5215 line= grad.addColorStop(0, '#000');
tail j=5216 line= grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
tail j=5217 line= // ctx.restore();
tail j=5218 line=// ctx.fillStyle = grad;
tail j=5219 line= ctx.fillstyle="lightblue";
tail j=5220 line= ctx.fillRect(0,0,600,600);
tail j=5221 line= // ctx.save();
tail j=5222 line= };
tail j=5223 line=}
tail j=5224 line= </script id="script_canvas_1" >
tail j=5225 line=
tail j=5226 line= <div id="div_csv"><h3></h3>
tail j=5227 line= </div id="div_csv">
tail j=5228 line=
tail j=5229 line= <script id="script_upload" type="text/javascript">
tail j=5230 line=// function upload_csv() {
tail j=5231 line= function Upload() {
tail j=5232 line=// var files = evt.dataTransfer.files; // FileList object.
tail j=5233 line=// var fileUpload = document.getElementById("upload_files");
tail j=5234 line= var fileUpload = document.getElementById("fileUpload");
tail j=5235 line= var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
tail j=5236 line=// if (regex.test(fileUpload.value.toLowerCase())) {
tail j=5237 line= if (regex.test(fileUpload.value.toLowerCase())) {
tail j=5238 line= if (typeof (FileReader) != "undefined") {
tail j=5239 line= var reader = new FileReader();
tail j=5240 line= reader.onload = function (e) {
tail j=5241 line= var table = document.createElement("table");
tail j=5242 line= var rows = e.target.result.split("\n");
tail j=5243 line= for (var i = 0; i < rows.length; i++) {
tail j=5244 line= var row = table.insertRow(-1);
tail j=5245 line=
tail j=5246 line=// var cells = rows[i].split("|");
tail j=5247 line= var cells = rows[i].split(",");
tail j=5248 line= for (var j = 0; j < cells.length; j++) {
tail j=5249 line= var cell = row.insertCell(-1);
tail j=5250 line= cell.innerHTML = cells[j];
tail j=5251 line= }
tail j=5252 line= }
tail j=5253 line= var csv2tbl = document.getElementById("csv2tbl");
tail j=5254 line= csv2tbl.innerHTML = "";
tail j=5255 line= csv2tbl.appendChild(table);
tail j=5256 line= }
tail j=5257 line= reader.readAsText(fileUpload.files[0]);
tail j=5258 line= file_csv=fileUpload.files[0];
tail j=5259 line= file_csvlen = fileUpload.files.length;
tail j=5260 line= alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
tail j=5261 line= load_file_csv(file_csv);
tail j=5262 line= }
tail j=5263 line= else {
tail j=5264 line= alert("csv2tbl warn: unauthorized access noted");
tail j=5265 line= }
tail j=5266 line= }
tail j=5267 line= else {
tail j=5268 line= alert("csv2tbl fail: unsuppoted format");
tail j=5269 line= }
tail j=5270 line= }
tail j=5271 line= </script id="script_upload" type="text/javascript">
tail j=5272 line=
tail j=5273 line= <script id="script_load_file_csv">
tail j=5274 line= function load_file_csv(file_csv) {
tail j=5275 line= alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
tail j=5276 line= file_psv=file_csv;
tail j=5277 line= return(file_psv);
tail j=5278 line= }
tail j=5279 line= </script id="script_load_file_csv">
tail j=5280 line=
tail j=5281 line= <div id="div_filecontainer" >
tail j=5282 line= <label class="fileContainer">
tail j=5283 line= files.csv.psv.txt
tail j=5284 line= <input id="fileUpload" type="file"></input>
tail j=5285 line= </label>
tail j=5286 line=
tail j=5287 line=      
tail j=5288 line= <label class="fileContainer">
tail j=5289 line= parse.csv.psv.txt
tail j=5290 line= <input id="upload" value="Upload" onclick="Upload()" type="button"></input>
tail j=5291 line= </label>
tail j=5292 line= </div id="div_filecontainer" >
tail j=5293 line=
tail j=5294 line=
tail j=5295 line=
tail j=5296 line= <div id="div_csv2tbl"><h3>csv2tbl</h3>
tail j=5297 line= </div id="div_csv2tbl" >
tail j=5298 line=
tail j=5299 line=<!--
tail j=5300 line= <button type="button" id="fileUpload" type="file" >select</button>
tail j=5301 line= <button type="button" id="upload" value="Upload" onclick="Upload()">upload</button>
tail j=5302 line= -->
tail j=5303 line=
tail j=5304 line=<!--
tail j=5305 line=
tail j=5306 line= <div id="div_showhide" hidden>
tail j=5307 line= <script id="script_showhide" >
tail j=5308 line= function show_files() {
tail j=5309 line= var div_files = document.getElementbyID("div_files");
tail j=5310 line= div_files.show();
tail j=5311 line= }
tail j=5312 line= function hide_files() {
tail j=5313 line= var div_files = document.getElementbyID("div_files");
tail j=5314 line= div_files.hide();
tail j=5315 line= }
tail j=5316 line= </script id="script_showhide" hidden>
tail j=5317 line=
tail j=5318 line= <button type="button" id="show">show</button>
tail j=5319 line= <button type="button" id="hide">hide</button>
tail j=5320 line= <button type="show_files" id="show_files" onclick="show_files()">Show_files</button>
tail j=5321 line= <button type="hide_files" id="hide_files" onclick="hide_files()">Hide_files</button>
tail j=5322 line= <button type="show_neave_wobble" id="show_neave_wobble">Show_neave_wobble</button>
tail j=5323 line= <button type="hide_neave_wobble" id="hide_neave_wobble">Hide_neave_wobble</button>
tail j=5324 line= -->
tail j=5325 line=<!--
tail j=5326 line= <button type="show_dd" id="show_dd">Show_dd</button>
tail j=5327 line= <button type="hide_dd" id="hide_dd">Hide_dd</button>
tail j=5328 line= <button type="show_bb" id="show_bb">Show_bb</button>
tail j=5329 line= <button type="hide_bb" id="hide_bb">Hide_bb</button>
tail j=5330 line= <button type="show_tl" id="show_tl">Show_tl</button>
tail j=5331 line= <button type="hide_tl" id="hide_tl">Hide_tl</button>
tail j=5332 line= <button type="show_colors" id="show_colors">Show_colors</button>
tail j=5333 line= <button type="hide_colors" id="hide_colors">Hide_colors</button>
tail j=5334 line= <button type="show_fonts" id="show_fonts">Show_fonts</button>
tail j=5335 line= <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
tail j=5336 line= <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
tail j=5337 line= <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
tail j=5338 line= -->
tail j=5339 line= </div id="dvi_showhide" >
tail j=5340 line=
tail j=5341 line=
tail j=5342 line= <div id="item" >div_item
tail j=5343 line= </div id="item">
tail j=5344 line=
tail j=5345 line=<!--
tail j=5346 line= <script id="script_showhide">
tail j=5347 line= $( "#show" ).click(function() {$('#item').show(); });
tail j=5348 line= $( "#hide" ).click(function() {$('#item').hide();});
tail j=5349 line= $( "#show_files" ).click(function() {$('#div_files').show(); });
tail j=5350 line= $( "#hide_files" ).click(function() {$('#div_files').hide();});
tail j=5351 line= $( "#show_neave_wobble" ).click(function() {$('#div_neave_wobble').show(); });
tail j=5352 line= $( "#hide_neave_wobble" ).click(function() {$('#div_neave_wobble').hide();});
tail j=5353 line=// $( "#show_dd" ).click(function() {$('#div_dd').show(); });
tail j=5354 line=// $( "#hide_dd" ).click(function() {$('#div_dd').hide();});
tail j=5355 line=// $( "#show_bb" ).click(function() {$('#div_bb').show(); });
tail j=5356 line=// $( "#hide_bb" ).click(function() {$('#div_bb').hide();});
tail j=5357 line=// $( "#show_tl" ).click(function() {$('#div_tl').show(); });
tail j=5358 line=// $( "#hide_tl" ).click(function() {$('#div_tl').hide();});
tail j=5359 line=// $( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
tail j=5360 line=// $( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
tail j=5361 line=// $( "#show_colors" ).click(function() {$('#div_colors').show(); });
tail j=5362 line=// $( "#hide_colors" ).click(function() {$('#div_colors').hide();});
tail j=5363 line=// $( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
tail j=5364 line=// $( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
tail j=5365 line=// $( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
tail j=5366 line=// $( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
tail j=5367 line= </script id="script_showhide" >
tail j=5368 line= -->
tail j=5369 line=
tail j=5370 line=
tail j=5371 line=<!--[if IE] -->
tail j=5372 line=<!--
tail j=5373 line= <script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
tail j=5374 line= -->
tail j=5375 line=<!-- <![endif]-->
tail j=5376 line=<!--
tail j=5377 line= <div class="la-anim-10" hidden></div>
tail j=5378 line= -->
tail j=5379 line=
tail j=5380 line=<!-- .corner-preloader -->
tail j=5381 line=<!--
tail j=5382 line= <div id="wrapper" hidden>
tail j=5383 line= <div id="upload-widget">
tail j=5384 line= <h1>
tail j=5385 line= <i class="fa fa-cloud-upload"></i> File Uploader
tail j=5386 line= </h1>
tail j=5387 line=
tail j=5388 line= <form id="file-upload-form">
tail j=5389 line= <div class="file-input-wrap">
tail j=5390 line= fups
tail j=5391 line= <input type="file" name="file" id="file" multiple>
tail j=5392 line= </div><!-- .file-input-wrap -->
tail j=5393 line= </form><!-- #file-upload-form -->
tail j=5394 line= </div><!-- #upload-widget -->
tail j=5395 line=
tail j=5396 line= <div id="upload-result">
tail j=5397 line= </div><!-- #upload-result -->
tail j=5398 line= </div><!-- #wrapper -->
tail j=5399 line=
tail j=5400 line= <div id="preloader">
tail j=5401 line= <img height=50 src="/imgs/btn/kob.png" alt="preloader_up" />
tail j=5402 line= </a>
tail j=5403 line= </div>
tail j=5404 line=
tail j=5405 line= <!-- SCRIPTS -->
tail j=5406 line=<!-- <script type="text/javascript" src="js/libraries/jquery-2.1.1.min.js"></script> -->
tail j=5407 line=<!-- <script type="text/javascript" src="/js/vue.js" > -->
tail j=5408 line= <script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIFZ1ZS5qcyB2Mi41LjE3CiAqIChjKSAyMDE0LTIwMTggRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDoKCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6CgkoZ2xvYmFsLlZ1ZSA9IGZhY3RvcnkoKSk7Cn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOwoKLyogICovCgp2YXIgZW1wdHlPYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTsKCi8vIHRoZXNlIGhlbHBlcnMgcHJvZHVjZXMgYmV0dGVyIHZtIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXIKLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZwpmdW5jdGlvbiBpc1VuZGVmICh2KSB7CiAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsCn0KCmZ1bmN0aW9uIGlzRGVmICh2KSB7CiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsCn0KCmZ1bmN0aW9uIGlzVHJ1ZSAodikgewogIHJldHVybiB2ID09PSB0cnVlCn0KCmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHsKICByZXR1cm4gdiA9PT0gZmFsc2UKfQoKLyoqCiAqIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZQogKi8KZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbHVlKSB7CiAgcmV0dXJuICgKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwKICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fAogICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicKICApCn0KCi8qKgogKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGwKICogT2JqZWN0cyBmcm9tIHByaW1pdGl2ZSB2YWx1ZXMgd2hlbiB3ZSBrbm93IHRoZSB2YWx1ZQogKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuCiAqLwpmdW5jdGlvbiBpc09iamVjdCAob2JqKSB7CiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jwp9CgovKioKICogR2V0IHRoZSByYXcgdHlwZSBzdHJpbmcgb2YgYSB2YWx1ZSBlLmcuIFtvYmplY3QgT2JqZWN0XQogKi8KdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpmdW5jdGlvbiB0b1Jhd1R5cGUgKHZhbHVlKSB7CiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSkKfQoKLyoqCiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWUKICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy4KICovCmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJwp9CgpmdW5jdGlvbiBpc1JlZ0V4cCAodikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXScKfQoKLyoqCiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LgogKi8KZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkgewogIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodmFsKSk7CiAgcmV0dXJuIG4gPj0gMCAmJiBNYXRoLmZsb29yKG4pID09PSBuICYmIGlzRmluaXRlKHZhbCkKfQoKLyoqCiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLgogKi8KZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkgewogIHJldHVybiB2YWwgPT0gbnVsbAogICAgPyAnJwogICAgOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JwogICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMikKICAgICAgOiBTdHJpbmcodmFsKQp9CgovKioKICogQ29udmVydCBhIGlucHV0IHZhbHVlIHRvIGEgbnVtYmVyIGZvciBwZXJzaXN0ZW5jZS4KICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuCiAqLwpmdW5jdGlvbiB0b051bWJlciAodmFsKSB7CiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7CiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbgp9CgovKioKICogTWFrZSBhIG1hcCBhbmQgcmV0dXJuIGEgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGEga2V5CiAqIGlzIGluIHRoYXQgbWFwLgogKi8KZnVuY3Rpb24gbWFrZU1hcCAoCiAgc3RyLAogIGV4cGVjdHNMb3dlckNhc2UKKSB7CiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7CiAgfQogIHJldHVybiBleHBlY3RzTG93ZXJDYXNlCiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH0KICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH0KfQoKLyoqCiAqIENoZWNrIGlmIGEgdGFnIGlzIGEgYnVpbHQtaW4gdGFnLgogKi8KdmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7CgovKioKICogQ2hlY2sgaWYgYSBhdHRyaWJ1dGUgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUuCiAqLwp2YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzJyk7CgovKioKICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheQogKi8KZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHsKICBpZiAoYXJyLmxlbmd0aCkgewogICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSkKICAgIH0KICB9Cn0KCi8qKgogKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS4KICovCnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHsKICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkKfQoKLyoqCiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi4KICovCmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHsKICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHJldHVybiAoZnVuY3Rpb24gY2FjaGVkRm4gKHN0cikgewogICAgdmFyIGhpdCA9IGNhY2hlW3N0cl07CiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSkKICB9KQp9CgovKioKICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy4KICovCnZhciBjYW1lbGl6ZVJFID0gLy0oXHcpL2c7CnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIGZ1bmN0aW9uIChfLCBjKSB7IHJldHVybiBjID8gYy50b1VwcGVyQ2FzZSgpIDogJyc7IH0pCn0pOwoKLyoqCiAqIENhcGl0YWxpemUgYSBzdHJpbmcuCiAqLwp2YXIgY2FwaXRhbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKQp9KTsKCi8qKgogKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLgogKi8KdmFyIGh5cGhlbmF0ZVJFID0gL1xCKFtBLVpdKS9nOwp2YXIgaHlwaGVuYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsICctJDEnKS50b0xvd2VyQ2FzZSgpCn0pOwoKLyoqCiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdC4uLiBlLmcuCiAqIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5IHdlIGRvbid0IG5lZWQgdGhpcyBhbnltb3JlIHNpbmNlIG5hdGl2ZSBiaW5kIGlzCiAqIG5vdyBtb3JlIHBlcmZvcm1hbnQgaW4gbW9zdCBicm93c2VycywgYnV0IHJlbW92aW5nIGl0IHdvdWxkIGJlIGJyZWFraW5nIGZvcgogKiBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluIFBoYW50b21KUyAxLngsIHNvIHRoaXMgbXVzdCBiZSBrZXB0IGZvcgogKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICovCgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBwb2x5ZmlsbEJpbmQgKGZuLCBjdHgpIHsKICBmdW5jdGlvbiBib3VuZEZuIChhKSB7CiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICByZXR1cm4gbAogICAgICA/IGwgPiAxCiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cykKICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKQogICAgICA6IGZuLmNhbGwoY3R4KQogIH0KCiAgYm91bmRGbi5fbGVuZ3RoID0gZm4ubGVuZ3RoOwogIHJldHVybiBib3VuZEZuCn0KCmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHsKICByZXR1cm4gZm4uYmluZChjdHgpCn0KCnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQKICA/IG5hdGl2ZUJpbmQKICA6IHBvbHlmaWxsQmluZDsKCi8qKgogKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS4KICovCmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7CiAgc3RhcnQgPSBzdGFydCB8fCAwOwogIHZhciBpID0gbGlzdC5sZW5ndGggLSBzdGFydDsKICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpOwogIHdoaWxlIChpLS0pIHsKICAgIHJldFtpXSA9IGxpc3RbaSArIHN0YXJ0XTsKICB9CiAgcmV0dXJuIHJldAp9CgovKioKICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LgogKi8KZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHsKICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHsKICAgIHRvW2tleV0gPSBfZnJvbVtrZXldOwogIH0KICByZXR1cm4gdG8KfQoKLyoqCiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuCiAqLwpmdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7CiAgdmFyIHJlcyA9IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoYXJyW2ldKSB7CiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyoqCiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLgogKiBTdHViYmluZyBhcmdzIHRvIG1ha2UgRmxvdyBoYXBweSB3aXRob3V0IGxlYXZpbmcgdXNlbGVzcyB0cmFuc3BpbGVkIGNvZGUKICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pCiAqLwpmdW5jdGlvbiBub29wIChhLCBiLCBjKSB7fQoKLyoqCiAqIEFsd2F5cyByZXR1cm4gZmFsc2UuCiAqLwp2YXIgbm8gPSBmdW5jdGlvbiAoYSwgYiwgYykgeyByZXR1cm4gZmFsc2U7IH07CgovKioKICogUmV0dXJuIHNhbWUgdmFsdWUKICovCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9OwoKLyoqCiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy4KICovCmZ1bmN0aW9uIGdlblN0YXRpY0tleXMgKG1vZHVsZXMpIHsKICByZXR1cm4gbW9kdWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGtleXMsIG0pIHsKICAgIHJldHVybiBrZXlzLmNvbmNhdChtLnN0YXRpY0tleXMgfHwgW10pCiAgfSwgW10pLmpvaW4oJywnKQp9CgovKioKICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsCiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT8KICovCmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHsKICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9CiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpOwogIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTsKICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0QikgewogICAgdHJ5IHsKICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTsKICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTsKICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7CiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKQogICAgICAgIH0pCiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5QikgewogICAgICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKGEpOwogICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpOwogICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChhW2tleV0sIGJba2V5XSkKICAgICAgICB9KQogICAgICB9IGVsc2UgewogICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHsKICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2UKICB9Cn0KCmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgaWYgKGxvb3NlRXF1YWwoYXJyW2ldLCB2YWwpKSB7IHJldHVybiBpIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qKgogKiBFbnN1cmUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlLgogKi8KZnVuY3Rpb24gb25jZSAoZm4pIHsKICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgIGlmICghY2FsbGVkKSB7CiAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfQp9Cgp2YXIgU1NSX0FUVFIgPSAnZGF0YS1zZXJ2ZXItcmVuZGVyZWQnOwoKdmFyIEFTU0VUX1RZUEVTID0gWwogICdjb21wb25lbnQnLAogICdkaXJlY3RpdmUnLAogICdmaWx0ZXInCl07Cgp2YXIgTElGRUNZQ0xFX0hPT0tTID0gWwogICdiZWZvcmVDcmVhdGUnLAogICdjcmVhdGVkJywKICAnYmVmb3JlTW91bnQnLAogICdtb3VudGVkJywKICAnYmVmb3JlVXBkYXRlJywKICAndXBkYXRlZCcsCiAgJ2JlZm9yZURlc3Ryb3knLAogICdkZXN0cm95ZWQnLAogICdhY3RpdmF0ZWQnLAogICdkZWFjdGl2YXRlZCcsCiAgJ2Vycm9yQ2FwdHVyZWQnCl07CgovKiAgKi8KCnZhciBjb25maWcgPSAoewogIC8qKgogICAqIE9wdGlvbiBtZXJnZSBzdHJhdGVnaWVzICh1c2VkIGluIGNvcmUvdXRpbC9vcHRpb25zKQogICAqLwogIC8vICRmbG93LWRpc2FibGUtbGluZQogIG9wdGlvbk1lcmdlU3RyYXRlZ2llczogT2JqZWN0LmNyZWF0ZShudWxsKSwKCiAgLyoqCiAgICogV2hldGhlciB0byBzdXBwcmVzcyB3YXJuaW5ncy4KICAgKi8KICBzaWxlbnQ6IGZhbHNlLAoKICAvKioKICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290PwogICAqLwogIHByb2R1Y3Rpb25UaXA6ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJywKCiAgLyoqCiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHMKICAgKi8KICBkZXZ0b29sczogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nLAoKICAvKioKICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmCiAgICovCiAgcGVyZm9ybWFuY2U6IGZhbHNlLAoKICAvKioKICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9ycwogICAqLwogIGVycm9ySGFuZGxlcjogbnVsbCwKCiAgLyoqCiAgICogV2FybiBoYW5kbGVyIGZvciB3YXRjaGVyIHdhcm5zCiAgICovCiAgd2FybkhhbmRsZXI6IG51bGwsCgogIC8qKgogICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50cwogICAqLwogIGlnbm9yZWRFbGVtZW50czogW10sCgogIC8qKgogICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uCiAgICovCiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCgogIC8qKgogICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYQogICAqIGNvbXBvbmVudC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi4KICAgKi8KICBpc1Jlc2VydmVkVGFnOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnQKICAgKiBwcm9wLiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLgogICAqLwogIGlzUmVzZXJ2ZWRBdHRyOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LgogICAqIFBsYXRmb3JtLWRlcGVuZGVudC4KICAgKi8KICBpc1Vua25vd25FbGVtZW50OiBubywKCiAgLyoqCiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudAogICAqLwogIGdldFRhZ05hbWVzcGFjZTogbm9vcCwKCiAgLyoqCiAgICogUGFyc2UgdGhlIHJlYWwgdGFnIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybS4KICAgKi8KICBwYXJzZVBsYXRmb3JtVGFnTmFtZTogaWRlbnRpdHksCgogIC8qKgogICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIGJvdW5kIHVzaW5nIHByb3BlcnR5LCBlLmcuIHZhbHVlCiAgICogUGxhdGZvcm0tZGVwZW5kZW50LgogICAqLwogIG11c3RVc2VQcm9wOiBubywKCiAgLyoqCiAgICogRXhwb3NlZCBmb3IgbGVnYWN5IHJlYXNvbnMKICAgKi8KICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LUwp9KQoKLyogICovCgovKioKICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfCiAqLwpmdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHsKICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTsKICByZXR1cm4gYyA9PT0gMHgyNCB8fCBjID09PSAweDVGCn0KCi8qKgogKiBEZWZpbmUgYSBwcm9wZXJ0eS4KICovCmZ1bmN0aW9uIGRlZiAob2JqLCBrZXksIHZhbCwgZW51bWVyYWJsZSkgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgdmFsdWU6IHZhbCwKICAgIGVudW1lcmFibGU6ICEhZW51bWVyYWJsZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7Cn0KCi8qKgogKiBQYXJzZSBzaW1wbGUgcGF0aC4KICovCnZhciBiYWlsUkUgPSAvW15cdy4kXS87CmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkgewogIGlmIChiYWlsUkUudGVzdChwYXRoKSkgewogICAgcmV0dXJuCiAgfQogIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy4nKTsKICByZXR1cm4gZnVuY3Rpb24gKG9iaikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIW9iaikgeyByZXR1cm4gfQogICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dOwogICAgfQogICAgcmV0dXJuIG9iagogIH0KfQoKLyogICovCgovLyBjYW4gd2UgdXNlIF9fcHJvdG9fXz8KdmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307CgovLyBCcm93c2VyIGVudmlyb25tZW50IHNuaWZmaW5nCnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJzsKdmFyIGluV2VleCA9IHR5cGVvZiBXWEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhIVdYRW52aXJvbm1lbnQucGxhdGZvcm07CnZhciB3ZWV4UGxhdGZvcm0gPSBpbldlZXggJiYgV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOwp2YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKdmFyIGlzSUUgPSBVQSAmJiAvbXNpZXx0cmlkZW50Ly50ZXN0KFVBKTsKdmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7CnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDsKdmFyIGlzQW5kcm9pZCA9IChVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwKSB8fCAod2VleFBsYXRmb3JtID09PSAnYW5kcm9pZCcpOwp2YXIgaXNJT1MgPSAoVUEgJiYgL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KFVBKSkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2lvcycpOwp2YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXC9cZCsvLnRlc3QoVUEpICYmICFpc0VkZ2U7CgovLyBGaXJlZm94IGhhcyBhICJ3YXRjaCIgZnVuY3Rpb24gb24gT2JqZWN0LnByb3RvdHlwZS4uLgp2YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoOwoKdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlOwppZiAoaW5Ccm93c2VyKSB7CiAgdHJ5IHsKICAgIHZhciBvcHRzID0ge307CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOwogICAgICB9CiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODUKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTsKICB9IGNhdGNoIChlKSB7fQp9CgovLyB0aGlzIG5lZWRzIHRvIGJlIGxhenktZXZhbGVkIGJlY2F1c2UgdnVlIG1heSBiZSByZXF1aXJlZCBiZWZvcmUKLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlYKdmFyIF9pc1NlcnZlcjsKdmFyIGlzU2VydmVyUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkgewogIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWluQnJvd3NlciAmJiAhaW5XZWV4ICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZAogICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzCiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJzsKICAgIH0gZWxzZSB7CiAgICAgIF9pc1NlcnZlciA9IGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gX2lzU2VydmVyCn07CgovLyBkZXRlY3QgZGV2dG9vbHMKdmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fOwoKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHsKICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSkKfQoKdmFyIGhhc1N5bWJvbCA9CiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJgogIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpOwoKdmFyIF9TZXQ7Ci8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLyAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHsKICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS4KICBfU2V0ID0gU2V0Owp9IGVsc2UgewogIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy4KICBfU2V0ID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFNldCAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWUKICAgIH07CiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoa2V5KSB7CiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlOwogICAgfTsKICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH07CgogICAgcmV0dXJuIFNldDsKICB9KCkpOwp9CgovKiAgKi8KCnZhciB3YXJuID0gbm9vcDsKdmFyIHRpcCA9IG5vb3A7CnZhciBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gKG5vb3ApOyAvLyB3b3JrIGFyb3VuZCBmbG93IGNoZWNrCnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApOwoKewogIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnOwogIHZhciBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXHcpL2c7CiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyCiAgICAucmVwbGFjZShjbGFzc2lmeVJFLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KQogICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9OwoKICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHsKICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJzsKCiAgICBpZiAoY29uZmlnLndhcm5IYW5kbGVyKSB7CiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTsKICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoKCJbVnVlIHdhcm5dOiAiICsgbXNnICsgdHJhY2UpKTsKICAgIH0KICB9OwoKICB0aXAgPSBmdW5jdGlvbiAobXNnLCB2bSkgewogICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkgewogICAgICBjb25zb2xlLndhcm4oIltWdWUgdGlwXTogIiArIG1zZyArICgKICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJycKICAgICAgKSk7CiAgICB9CiAgfTsKCiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHsKICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHsKICAgICAgcmV0dXJuICc8Um9vdD4nCiAgICB9CiAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiB2bSA9PT0gJ2Z1bmN0aW9uJyAmJiB2bS5jaWQgIT0gbnVsbAogICAgICA/IHZtLm9wdGlvbnMKICAgICAgOiB2bS5faXNWdWUKICAgICAgICA/IHZtLiRvcHRpb25zIHx8IHZtLmNvbnN0cnVjdG9yLm9wdGlvbnMKICAgICAgICA6IHZtIHx8IHt9OwogICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnOwogICAgdmFyIGZpbGUgPSBvcHRpb25zLl9fZmlsZTsKICAgIGlmICghbmFtZSAmJiBmaWxlKSB7CiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXF0rKVwudnVlJC8pOwogICAgICBuYW1lID0gbWF0Y2ggJiYgbWF0Y2hbMV07CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgKG5hbWUgPyAoIjwiICsgKGNsYXNzaWZ5KG5hbWUpKSArICI+IikgOiAiPEFub255bW91cz4iKSArCiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/ICgiIGF0ICIgKyBmaWxlKSA6ICcnKQogICAgKQogIH07CgogIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7CiAgICB2YXIgcmVzID0gJyc7CiAgICB3aGlsZSAobikgewogICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfQogICAgICBpZiAobiA+IDEpIHsgc3RyICs9IHN0cjsgfQogICAgICBuID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlcwogIH07CgogIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSBmdW5jdGlvbiAodm0pIHsKICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkgewogICAgICB2YXIgdHJlZSA9IFtdOwogICAgICB2YXIgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgd2hpbGUgKHZtKSB7CiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07CiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7CiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDsKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkgewogICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJlZS5wdXNoKHZtKTsKICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuICdcblxuZm91bmQgaW5cblxuJyArIHRyZWUKICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKCIiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSkKICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArICIuLi4gKCIgKyAodm1bMV0pICsgIiByZWN1cnNpdmUgY2FsbHMpIikKICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KQogICAgICAgIC5qb2luKCdcbicpCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gKCJcblxuKGZvdW5kIGluICIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgIikiKQogICAgfQogIH07Cn0KCi8qICAqLwoKCnZhciB1aWQgPSAwOwoKLyoqCiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZQogKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LgogKi8KdmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7CiAgdGhpcy5pZCA9IHVpZCsrOwogIHRoaXMuc3VicyA9IFtdOwp9OwoKRGVwLnByb3RvdHlwZS5hZGRTdWIgPSBmdW5jdGlvbiBhZGRTdWIgKHN1YikgewogIHRoaXMuc3Vicy5wdXNoKHN1Yik7Cn07CgpEZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7CiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTsKfTsKCkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHsKICBpZiAoRGVwLnRhcmdldCkgewogICAgRGVwLnRhcmdldC5hZGREZXAodGhpcyk7CiAgfQp9OwoKRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkgewogIC8vIHN0YWJpbGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0CiAgdmFyIHN1YnMgPSB0aGlzLnN1YnMuc2xpY2UoKTsKICBmb3IgKHZhciBpID0gMCwgbCA9IHN1YnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICBzdWJzW2ldLnVwZGF0ZSgpOwogIH0KfTsKCi8vIHRoZSBjdXJyZW50IHRhcmdldCB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZC4KLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZQovLyB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZCBhdCBhbnkgdGltZS4KRGVwLnRhcmdldCA9IG51bGw7CnZhciB0YXJnZXRTdGFjayA9IFtdOwoKZnVuY3Rpb24gcHVzaFRhcmdldCAoX3RhcmdldCkgewogIGlmIChEZXAudGFyZ2V0KSB7IHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldCk7IH0KICBEZXAudGFyZ2V0ID0gX3RhcmdldDsKfQoKZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHsKICBEZXAudGFyZ2V0ID0gdGFyZ2V0U3RhY2sucG9wKCk7Cn0KCi8qICAqLwoKdmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUgKAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIHRleHQsCiAgZWxtLAogIGNvbnRleHQsCiAgY29tcG9uZW50T3B0aW9ucywKICBhc3luY0ZhY3RvcnkKKSB7CiAgdGhpcy50YWcgPSB0YWc7CiAgdGhpcy5kYXRhID0gZGF0YTsKICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgdGhpcy50ZXh0ID0gdGV4dDsKICB0aGlzLmVsbSA9IGVsbTsKICB0aGlzLm5zID0gdW5kZWZpbmVkOwogIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7CiAgdGhpcy5mbk9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgdGhpcy5mblNjb3BlSWQgPSB1bmRlZmluZWQ7CiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5OwogIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7CiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDsKICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDsKICB0aGlzLnJhdyA9IGZhbHNlOwogIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTsKICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7CiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTsKICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7CiAgdGhpcy5pc09uY2UgPSBmYWxzZTsKICB0aGlzLmFzeW5jRmFjdG9yeSA9IGFzeW5jRmFjdG9yeTsKICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDsKICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlOwp9OwoKdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTsKCi8vIERFUFJFQ0FURUQ6IGFsaWFzIGZvciBjb21wb25lbnRJbnN0YW5jZSBmb3IgYmFja3dhcmRzIGNvbXBhdC4KLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KcHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZQp9OwoKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZOb2RlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7Cgp2YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgaWYgKCB0ZXh0ID09PSB2b2lkIDAgKSB0ZXh0ID0gJyc7CgogIHZhciBub2RlID0gbmV3IFZOb2RlKCk7CiAgbm9kZS50ZXh0ID0gdGV4dDsKICBub2RlLmlzQ29tbWVudCA9IHRydWU7CiAgcmV0dXJuIG5vZGUKfTsKCmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7CiAgcmV0dXJuIG5ldyBWTm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBTdHJpbmcodmFsKSkKfQoKLy8gb3B0aW1pemVkIHNoYWxsb3cgY2xvbmUKLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zcwovLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHkKLy8gb24gdGhlaXIgZWxtIHJlZmVyZW5jZS4KZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHsKICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKAogICAgdm5vZGUudGFnLAogICAgdm5vZGUuZGF0YSwKICAgIHZub2RlLmNoaWxkcmVuLAogICAgdm5vZGUudGV4dCwKICAgIHZub2RlLmVsbSwKICAgIHZub2RlLmNvbnRleHQsCiAgICB2bm9kZS5jb21wb25lbnRPcHRpb25zLAogICAgdm5vZGUuYXN5bmNGYWN0b3J5CiAgKTsKICBjbG9uZWQubnMgPSB2bm9kZS5uczsKICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYzsKICBjbG9uZWQua2V5ID0gdm5vZGUua2V5OwogIGNsb25lZC5pc0NvbW1lbnQgPSB2bm9kZS5pc0NvbW1lbnQ7CiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDsKICBjbG9uZWQuZm5PcHRpb25zID0gdm5vZGUuZm5PcHRpb25zOwogIGNsb25lZC5mblNjb3BlSWQgPSB2bm9kZS5mblNjb3BlSWQ7CiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTsKICByZXR1cm4gY2xvbmVkCn0KCi8qCiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aAogKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGUKICovCgp2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTsKdmFyIGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90byk7Cgp2YXIgbWV0aG9kc1RvUGF0Y2ggPSBbCiAgJ3B1c2gnLAogICdwb3AnLAogICdzaGlmdCcsCiAgJ3Vuc2hpZnQnLAogICdzcGxpY2UnLAogICdzb3J0JywKICAncmV2ZXJzZScKXTsKCi8qKgogKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHMKICovCm1ldGhvZHNUb1BhdGNoLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZAogIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTsKICBkZWYoYXJyYXlNZXRob2RzLCBtZXRob2QsIGZ1bmN0aW9uIG11dGF0b3IgKCkgewogICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07CgogICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgdmFyIG9iID0gdGhpcy5fX29iX187CiAgICB2YXIgaW5zZXJ0ZWQ7CiAgICBzd2l0Y2ggKG1ldGhvZCkgewogICAgICBjYXNlICdwdXNoJzoKICAgICAgY2FzZSAndW5zaGlmdCc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzOwogICAgICAgIGJyZWFrCiAgICAgIGNhc2UgJ3NwbGljZSc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpOwogICAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfQogICAgLy8gbm90aWZ5IGNoYW5nZQogICAgb2IuZGVwLm5vdGlmeSgpOwogICAgcmV0dXJuIHJlc3VsdAogIH0pOwp9KTsKCi8qICAqLwoKdmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7CgovKioKICogSW4gc29tZSBjYXNlcyB3ZSBtYXkgd2FudCB0byBkaXNhYmxlIG9ic2VydmF0aW9uIGluc2lkZSBhIGNvbXBvbmVudCdzCiAqIHVwZGF0ZSBjb21wdXRhdGlvbi4KICovCnZhciBzaG91bGRPYnNlcnZlID0gdHJ1ZTsKCmZ1bmN0aW9uIHRvZ2dsZU9ic2VydmluZyAodmFsdWUpIHsKICBzaG91bGRPYnNlcnZlID0gdmFsdWU7Cn0KCi8qKgogKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWQKICogb2JqZWN0LiBPbmNlIGF0dGFjaGVkLCB0aGUgb2JzZXJ2ZXIgY29udmVydHMgdGhlIHRhcmdldAogKiBvYmplY3QncyBwcm9wZXJ0eSBrZXlzIGludG8gZ2V0dGVyL3NldHRlcnMgdGhhdAogKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy4KICovCnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkgewogIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB0aGlzLmRlcCA9IG5ldyBEZXAoKTsKICB0aGlzLnZtQ291bnQgPSAwOwogIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpOwogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90bwogICAgICA/IHByb3RvQXVnbWVudAogICAgICA6IGNvcHlBdWdtZW50OwogICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpOwogICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpOwogIH0gZWxzZSB7CiAgICB0aGlzLndhbGsodmFsdWUpOwogIH0KfTsKCi8qKgogKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG8KICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCiAqIHZhbHVlIHR5cGUgaXMgT2JqZWN0LgogKi8KT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBkZWZpbmVSZWFjdGl2ZShvYmosIGtleXNbaV0pOwogIH0KfTsKCi8qKgogKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy4KICovCk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9ic2VydmUoaXRlbXNbaV0pOwogIH0KfTsKCi8vIGhlbHBlcnMKCi8qKgogKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nCiAqIHRoZSBwcm90b3R5cGUgY2hhaW4gdXNpbmcgX19wcm90b19fCiAqLwpmdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7CiAgLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi8KICB0YXJnZXQuX19wcm90b19fID0gc3JjOwogIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi8KfQoKLyoqCiAqIEF1Z21lbnQgYW4gdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZwogKiBoaWRkZW4gcHJvcGVydGllcy4KICovCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmZ1bmN0aW9uIGNvcHlBdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykgewogIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgZGVmKHRhcmdldCwga2V5LCBzcmNba2V5XSk7CiAgfQp9CgovKioKICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsCiAqIHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBpZiBzdWNjZXNzZnVsbHkgb2JzZXJ2ZWQsCiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLgogKi8KZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIGFzUm9vdERhdGEpIHsKICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIG9iOwogIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikgewogICAgb2IgPSB2YWx1ZS5fX29iX187CiAgfSBlbHNlIGlmICgKICAgIHNob3VsZE9ic2VydmUgJiYKICAgICFpc1NlcnZlclJlbmRlcmluZygpICYmCiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpICYmCiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJgogICAgIXZhbHVlLl9pc1Z1ZQogICkgewogICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpOwogIH0KICBpZiAoYXNSb290RGF0YSAmJiBvYikgewogICAgb2Iudm1Db3VudCsrOwogIH0KICByZXR1cm4gb2IKfQoKLyoqCiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC4KICovCmZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlICgKICBvYmosCiAga2V5LAogIHZhbCwKICBjdXN0b21TZXR0ZXIsCiAgc2hhbGxvdwopIHsKICB2YXIgZGVwID0gbmV3IERlcCgpOwoKICB2YXIgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTsKICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkgewogICAgcmV0dXJuCiAgfQoKICAvLyBjYXRlciBmb3IgcHJlLWRlZmluZWQgZ2V0dGVyL3NldHRlcnMKICB2YXIgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0OwogIGlmICghZ2V0dGVyICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgIHZhbCA9IG9ialtrZXldOwogIH0KICB2YXIgc2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuc2V0OwoKICB2YXIgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUodmFsKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHsKICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsKICAgICAgaWYgKERlcC50YXJnZXQpIHsKICAgICAgICBkZXAuZGVwZW5kKCk7CiAgICAgICAgaWYgKGNoaWxkT2IpIHsKICAgICAgICAgIGNoaWxkT2IuZGVwLmRlcGVuZCgpOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlCiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7CiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7CiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7CiAgICAgICAgY3VzdG9tU2V0dGVyKCk7CiAgICAgIH0KICAgICAgaWYgKHNldHRlcikgewogICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWwgPSBuZXdWYWw7CiAgICAgIH0KICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTsKICAgICAgZGVwLm5vdGlmeSgpOwogICAgfQogIH0pOwp9CgovKioKICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kCiAqIHRyaWdnZXJzIGNoYW5nZSBub3RpZmljYXRpb24gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QKICogYWxyZWFkeSBleGlzdC4KICovCmZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbCkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3Qgc2V0IHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5sZW5ndGggPSBNYXRoLm1heCh0YXJnZXQubGVuZ3RoLCBrZXkpOwogICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7CiAgICB0YXJnZXRba2V5XSA9IHZhbDsKICAgIHJldHVybiB2YWwKICB9CiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fOwogIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICdBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICsKICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLicKICAgICk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmICghb2IpIHsKICAgIHRhcmdldFtrZXldID0gdmFsOwogICAgcmV0dXJuIHZhbAogIH0KICBkZWZpbmVSZWFjdGl2ZShvYi52YWx1ZSwga2V5LCB2YWwpOwogIG9iLmRlcC5ub3RpZnkoKTsKICByZXR1cm4gdmFsCn0KCi8qKgogKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5LgogKi8KZnVuY3Rpb24gZGVsICh0YXJnZXQsIGtleSkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3QgZGVsZXRlIHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxKTsKICAgIHJldHVybgogIH0KICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187CiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArCiAgICAgICctIGp1c3Qgc2V0IGl0IHRvIG51bGwuJwogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIHsKICAgIHJldHVybgogIH0KICBkZWxldGUgdGFyZ2V0W2tleV07CiAgaWYgKCFvYikgewogICAgcmV0dXJuCiAgfQogIG9iLmRlcC5ub3RpZnkoKTsKfQoKLyoqCiAqIENvbGxlY3QgZGVwZW5kZW5jaWVzIG9uIGFycmF5IGVsZW1lbnRzIHdoZW4gdGhlIGFycmF5IGlzIHRvdWNoZWQsIHNpbmNlCiAqIHdlIGNhbm5vdCBpbnRlcmNlcHQgYXJyYXkgZWxlbWVudCBhY2Nlc3MgbGlrZSBwcm9wZXJ0eSBnZXR0ZXJzLgogKi8KZnVuY3Rpb24gZGVwZW5kQXJyYXkgKHZhbHVlKSB7CiAgZm9yICh2YXIgZSA9ICh2b2lkIDApLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZSA9IHZhbHVlW2ldOwogICAgZSAmJiBlLl9fb2JfXyAmJiBlLl9fb2JfXy5kZXAuZGVwZW5kKCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICBkZXBlbmRBcnJheShlKTsKICAgIH0KICB9Cn0KCi8qICAqLwoKLyoqCiAqIE9wdGlvbiBvdmVyd3JpdGluZyBzdHJhdGVnaWVzIGFyZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb24KICogdmFsdWUgaW50byB0aGUgZmluYWwgdmFsdWUuCiAqLwp2YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llczsKCi8qKgogKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zCiAqLwp7CiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7CiAgICBpZiAoIXZtKSB7CiAgICAgIHdhcm4oCiAgICAgICAgIm9wdGlvbiBcIiIgKyBrZXkgKyAiXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgIiArCiAgICAgICAgJ2NyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJwogICAgICApOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRTdHJhdChwYXJlbnQsIGNoaWxkKQogIH07Cn0KCi8qKgogKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci4KICovCmZ1bmN0aW9uIG1lcmdlRGF0YSAodG8sIGZyb20pIHsKICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH0KICB2YXIga2V5LCB0b1ZhbCwgZnJvbVZhbDsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyb20pOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAga2V5ID0ga2V5c1tpXTsKICAgIHRvVmFsID0gdG9ba2V5XTsKICAgIGZyb21WYWwgPSBmcm9tW2tleV07CiAgICBpZiAoIWhhc093bih0bywga2V5KSkgewogICAgICBzZXQodG8sIGtleSwgZnJvbVZhbCk7CiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodG9WYWwpICYmIGlzUGxhaW5PYmplY3QoZnJvbVZhbCkpIHsKICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTsKICAgIH0KICB9CiAgcmV0dXJuIHRvCn0KCi8qKgogKiBEYXRhCiAqLwpmdW5jdGlvbiBtZXJnZURhdGFPckZuICgKICBwYXJlbnRWYWwsCiAgY2hpbGRWYWwsCiAgdm0KKSB7CiAgaWYgKCF2bSkgewogICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnMKICAgIGlmICghY2hpbGRWYWwpIHsKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgaWYgKCFwYXJlbnRWYWwpIHsKICAgICAgcmV0dXJuIGNoaWxkVmFsCiAgICB9CiAgICAvLyB3aGVuIHBhcmVudFZhbCAmIGNoaWxkVmFsIGFyZSBib3RoIHByZXNlbnQsCiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0bwogICAgLy8gY2hlY2sgaWYgcGFyZW50VmFsIGlzIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlCiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy4KICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkgewogICAgICByZXR1cm4gbWVyZ2VEYXRhKAogICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCwKICAgICAgICB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nID8gcGFyZW50VmFsLmNhbGwodGhpcywgdGhpcykgOiBwYXJlbnRWYWwKICAgICAgKQogICAgfQogIH0gZWxzZSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkSW5zdGFuY2VEYXRhRm4gKCkgewogICAgICAvLyBpbnN0YW5jZSBtZXJnZQogICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBjaGlsZFZhbC5jYWxsKHZtLCB2bSkKICAgICAgICA6IGNoaWxkVmFsOwogICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSwgdm0pCiAgICAgICAgOiBwYXJlbnRWYWw7CiAgICAgIGlmIChpbnN0YW5jZURhdGEpIHsKICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRhCiAgICAgIH0KICAgIH0KICB9Cn0KCnN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bQopIHsKICBpZiAoIXZtKSB7CiAgICBpZiAoY2hpbGRWYWwgJiYgdHlwZW9mIGNoaWxkVmFsICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdUaGUgImRhdGEiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICsKICAgICAgICAndGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCAnICsKICAgICAgICAnZGVmaW5pdGlvbnMuJywKICAgICAgICB2bQogICAgICApOwoKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCkKICB9CgogIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKQp9OwoKLyoqCiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy4KICovCmZ1bmN0aW9uIG1lcmdlSG9vayAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsCikgewogIHJldHVybiBjaGlsZFZhbAogICAgPyBwYXJlbnRWYWwKICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKQogICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpCiAgICAgICAgPyBjaGlsZFZhbAogICAgICAgIDogW2NoaWxkVmFsXQogICAgOiBwYXJlbnRWYWwKfQoKTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHsKICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7Cn0pOwoKLyoqCiAqIEFzc2V0cwogKgogKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvCiAqIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gY29uc3RydWN0b3Igb3B0aW9ucywgaW5zdGFuY2UKICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuCiAqLwpmdW5jdGlvbiBtZXJnZUFzc2V0cyAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICB2YXIgcmVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCk7CiAgaWYgKGNoaWxkVmFsKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgICByZXR1cm4gZXh0ZW5kKHJlcywgY2hpbGRWYWwpCiAgfSBlbHNlIHsKICAgIHJldHVybiByZXMKICB9Cn0KCkFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0czsKfSk7CgovKioKICogV2F0Y2hlcnMuCiAqCiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmUKICogYW5vdGhlciwgc28gd2UgbWVyZ2UgdGhlbSBhcyBhcnJheXMuCiAqLwpzdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLgogIGlmIChwYXJlbnRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IHBhcmVudFZhbCA9IHVuZGVmaW5lZDsgfQogIGlmIChjaGlsZFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgY2hpbGRWYWwgPSB1bmRlZmluZWQ7IH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKSB9CiAgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IHt9OwogIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7CiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHsKICAgIHZhciBwYXJlbnQgPSByZXRba2V5JDFdOwogICAgdmFyIGNoaWxkID0gY2hpbGRWYWxba2V5JDFdOwogICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7CiAgICAgIHBhcmVudCA9IFtwYXJlbnRdOwogICAgfQogICAgcmV0W2tleSQxXSA9IHBhcmVudAogICAgICA/IHBhcmVudC5jb25jYXQoY2hpbGQpCiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07CiAgfQogIHJldHVybiByZXQKfTsKCi8qKgogKiBPdGhlciBvYmplY3QgaGFzaGVzLgogKi8Kc3RyYXRzLnByb3BzID0Kc3RyYXRzLm1ldGhvZHMgPQpzdHJhdHMuaW5qZWN0ID0Kc3RyYXRzLmNvbXB1dGVkID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bSwKICBrZXkKKSB7CiAgaWYgKGNoaWxkVmFsICYmICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTsKICBpZiAoY2hpbGRWYWwpIHsgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOyB9CiAgcmV0dXJuIHJldAp9OwpzdHJhdHMucHJvdmlkZSA9IG1lcmdlRGF0YU9yRm47CgovKioKICogRGVmYXVsdCBzdHJhdGVneS4KICovCnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkgewogIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkCiAgICA/IHBhcmVudFZhbAogICAgOiBjaGlsZFZhbAp9OwoKLyoqCiAqIFZhbGlkYXRlIGNvbXBvbmVudCBuYW1lcwogKi8KZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7CiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykgewogICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7CiAgfQp9CgpmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUgKG5hbWUpIHsKICBpZiAoIS9eW2EtekEtWl1bXHctXSokLy50ZXN0KG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogIicgKyBuYW1lICsgJyIuIENvbXBvbmVudCBuYW1lcyAnICsKICAgICAgJ2NhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHRoZSBoeXBoZW4sICcgKwogICAgICAnYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci4nCiAgICApOwogIH0KICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCAnICsKICAgICAgJ2lkOiAnICsgbmFtZQogICAgKTsKICB9Cn0KCi8qKgogKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGUKICogT2JqZWN0LWJhc2VkIGZvcm1hdC4KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkgewogIHZhciBwcm9wcyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKCFwcm9wcykgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICB2YXIgaSwgdmFsLCBuYW1lOwogIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgewogICAgaSA9IHByb3BzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdmFsID0gcHJvcHNbaV07CiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgICAgIG5hbWUgPSBjYW1lbGl6ZSh2YWwpOwogICAgICAgIHJlc1tuYW1lXSA9IHsgdHlwZTogbnVsbCB9OwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oJ3Byb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4nKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgICB2YWwgPSBwcm9wc1trZXldOwogICAgICBuYW1lID0gY2FtZWxpemUoa2V5KTsKICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpCiAgICAgICAgPyB2YWwKICAgICAgICA6IHsgdHlwZTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJwcm9wc1wiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsICIgKwogICAgICAiYnV0IGdvdCAiICsgKHRvUmF3VHlwZShwcm9wcykpICsgIi4iLAogICAgICB2bQogICAgKTsKICB9CiAgb3B0aW9ucy5wcm9wcyA9IHJlczsKfQoKLyoqCiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXQKICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdCAob3B0aW9ucywgdm0pIHsKICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7CiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH0KICB2YXIgbm9ybWFsaXplZCA9IG9wdGlvbnMuaW5qZWN0ID0ge307CiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHsKICAgICAgbm9ybWFsaXplZFtpbmplY3RbaV1dID0geyBmcm9tOiBpbmplY3RbaV0gfTsKICAgIH0KICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkgewogICAgZm9yICh2YXIga2V5IGluIGluamVjdCkgewogICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07CiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKQogICAgICAgID8gZXh0ZW5kKHsgZnJvbToga2V5IH0sIHZhbCkKICAgICAgICA6IHsgZnJvbTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJpbmplY3RcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUoaW5qZWN0KSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogIH0KfQoKLyoqCiAqIE5vcm1hbGl6ZSByYXcgZnVuY3Rpb24gZGlyZWN0aXZlcyBpbnRvIG9iamVjdCBmb3JtYXQuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7CiAgdmFyIGRpcnMgPSBvcHRpb25zLmRpcmVjdGl2ZXM7CiAgaWYgKGRpcnMpIHsKICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7CiAgICAgIHZhciBkZWYgPSBkaXJzW2tleV07CiAgICAgIGlmICh0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkgewogIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsgbmFtZSArICJcIjogZXhwZWN0ZWQgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUodmFsdWUpKSArICIuIiwKICAgICAgdm0KICAgICk7CiAgfQp9CgovKioKICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLgogKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLgogKi8KZnVuY3Rpb24gbWVyZ2VPcHRpb25zICgKICBwYXJlbnQsCiAgY2hpbGQsCiAgdm0KKSB7CiAgewogICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTsKICB9CgogIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHsKICAgIGNoaWxkID0gY2hpbGQub3B0aW9uczsKICB9CgogIG5vcm1hbGl6ZVByb3BzKGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7CiAgdmFyIGV4dGVuZHNGcm9tID0gY2hpbGQuZXh0ZW5kczsKICBpZiAoZXh0ZW5kc0Zyb20pIHsKICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGV4dGVuZHNGcm9tLCB2bSk7CiAgfQogIGlmIChjaGlsZC5taXhpbnMpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTsKICAgIH0KICB9CiAgdmFyIG9wdGlvbnMgPSB7fTsKICB2YXIga2V5OwogIGZvciAoa2V5IGluIHBhcmVudCkgewogICAgbWVyZ2VGaWVsZChrZXkpOwogIH0KICBmb3IgKGtleSBpbiBjaGlsZCkgewogICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7CiAgICAgIG1lcmdlRmllbGQoa2V5KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7CiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7CiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7CiAgfQogIHJldHVybiBvcHRpb25zCn0KCi8qKgogKiBSZXNvbHZlIGFuIGFzc2V0LgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3MKICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLgogKi8KZnVuY3Rpb24gcmVzb2x2ZUFzc2V0ICgKICBvcHRpb25zLAogIHR5cGUsCiAgaWQsCiAgd2Fybk1pc3NpbmcKKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHsKICAgIHJldHVybgogIH0KICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTsKICAvLyBjaGVjayBsb2NhbCByZWdpc3RyYXRpb24gdmFyaWF0aW9ucyBmaXJzdAogIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfQogIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTsKICBpZiAoaGFzT3duKGFzc2V0cywgY2FtZWxpemVkSWQpKSB7IHJldHVybiBhc3NldHNbY2FtZWxpemVkSWRdIH0KICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7CiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH0KICAvLyBmYWxsYmFjayB0byBwcm90b3R5cGUgY2hhaW4KICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykgewogICAgd2FybigKICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCwKICAgICAgb3B0aW9ucwogICAgKTsKICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIHZhbGlkYXRlUHJvcCAoCiAga2V5LAogIHByb3BPcHRpb25zLAogIHByb3BzRGF0YSwKICB2bQopIHsKICB2YXIgcHJvcCA9IHByb3BPcHRpb25zW2tleV07CiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpOwogIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldOwogIC8vIGJvb2xlYW4gY2FzdGluZwogIHZhciBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTsKICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHsKICAgIGlmIChhYnNlbnQgJiYgIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7CiAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHsKICAgICAgLy8gb25seSBjYXN0IGVtcHR5IHN0cmluZyAvIHNhbWUgbmFtZSB0byBib29sZWFuIGlmCiAgICAgIC8vIGJvb2xlYW4gaGFzIGhpZ2hlciBwcmlvcml0eQogICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpOwogICAgICBpZiAoc3RyaW5nSW5kZXggPCAwIHx8IGJvb2xlYW5JbmRleCA8IHN0cmluZ0luZGV4KSB7CiAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQogIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUKICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpOwogICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LAogICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuCiAgICB2YXIgcHJldlNob3VsZE9ic2VydmUgPSBzaG91bGRPYnNlcnZlOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogICAgb2JzZXJ2ZSh2YWx1ZSk7CiAgICB0b2dnbGVPYnNlcnZpbmcocHJldlNob3VsZE9ic2VydmUpOwogIH0KICB7CiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpOwogIH0KICByZXR1cm4gdmFsdWUKfQoKLyoqCiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuCiAqLwpmdW5jdGlvbiBnZXRQcm9wRGVmYXVsdFZhbHVlICh2bSwgcHJvcCwga2V5KSB7CiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZAogIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHsKICAgIHJldHVybiB1bmRlZmluZWQKICB9CiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDsKICAvLyB3YXJuIGFnYWluc3Qgbm9uLWZhY3RvcnkgZGVmYXVsdHMgZm9yIE9iamVjdCAmIEFycmF5CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wICInICsga2V5ICsgJyI6ICcgKwogICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArCiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJywKICAgICAgdm0KICAgICk7CiAgfQogIC8vIHRoZSByYXcgcHJvcCB2YWx1ZSB3YXMgYWxzbyB1bmRlZmluZWQgZnJvbSBwcmV2aW91cyByZW5kZXIsCiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyCiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJgogICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhW2tleV0gPT09IHVuZGVmaW5lZCAmJgogICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZAogICkgewogICAgcmV0dXJuIHZtLl9wcm9wc1trZXldCiAgfQogIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzCiAgLy8gYSB2YWx1ZSBpcyBGdW5jdGlvbiBpZiBpdHMgcHJvdG90eXBlIGlzIGZ1bmN0aW9uIGV2ZW4gYWNyb3NzIGRpZmZlcmVudCBleGVjdXRpb24gY29udGV4dAogIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJwogICAgPyBkZWYuY2FsbCh2bSkKICAgIDogZGVmCn0KCi8qKgogKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuCiAqLwpmdW5jdGlvbiBhc3NlcnRQcm9wICgKICBwcm9wLAogIG5hbWUsCiAgdmFsdWUsCiAgdm0sCiAgYWJzZW50CikgewogIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkgewogICAgd2FybigKICAgICAgJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogIicgKyBuYW1lICsgJyInLAogICAgICB2bQogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkgewogICAgcmV0dXJuCiAgfQogIHZhciB0eXBlID0gcHJvcC50eXBlOwogIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7CiAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTsKICBpZiAodHlwZSkgewogICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7CiAgICAgIHR5cGUgPSBbdHlwZV07CiAgICB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7CiAgICAgIHZhciBhc3NlcnRlZFR5cGUgPSBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlW2ldKTsKICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpOwogICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDsKICAgIH0KICB9CiAgaWYgKCF2YWxpZCkgewogICAgd2FybigKICAgICAgIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIiICsgbmFtZSArICJcIi4iICsKICAgICAgIiBFeHBlY3RlZCAiICsgKGV4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oJywgJykpICsKICAgICAgIiwgZ290ICIgKyAodG9SYXdUeXBlKHZhbHVlKSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjsKICBpZiAodmFsaWRhdG9yKSB7CiAgICBpZiAoIXZhbGlkYXRvcih2YWx1ZSkpIHsKICAgICAgd2FybigKICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJyArIG5hbWUgKyAnIi4nLAogICAgICAgIHZtCiAgICAgICk7CiAgICB9CiAgfQp9Cgp2YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87CgpmdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkgewogIHZhciB2YWxpZDsKICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTsKICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTsKICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzCiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlOwogICAgfQogIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0JykgewogICAgdmFsaWQgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTsKICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5JykgewogICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTsKICB9IGVsc2UgewogICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7CiAgfQogIHJldHVybiB7CiAgICB2YWxpZDogdmFsaWQsCiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZQogIH0KfQoKLyoqCiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcywKICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nCiAqIGFjcm9zcyBkaWZmZXJlbnQgdm1zIC8gaWZyYW1lcy4KICovCmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7CiAgdmFyIG1hdGNoID0gZm4gJiYgZm4udG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7CiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJwp9CgpmdW5jdGlvbiBpc1NhbWVUeXBlIChhLCBiKSB7CiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYikKfQoKZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7CiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMQogIH0KICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgaWYgKGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlc1tpXSwgdHlwZSkpIHsKICAgICAgcmV0dXJuIGkKICAgIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qICAqLwoKZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAodm0pIHsKICAgIHZhciBjdXIgPSB2bTsKICAgIHdoaWxlICgoY3VyID0gY3VyLiRwYXJlbnQpKSB7CiAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkOwogICAgICBpZiAoaG9va3MpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7CiAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7IHJldHVybiB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKQogICAgfSBjYXRjaCAoZSkgewogICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpOwogICAgfQogIH0KICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICB7CiAgICB3YXJuKCgiRXJyb3IgaW4gIiArIGluZm8gKyAiOiBcIiIgKyAoZXJyLnRvU3RyaW5nKCkpICsgIlwiIiksIHZtKTsKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAoKGluQnJvd3NlciB8fCBpbldlZXgpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgewogICAgY29uc29sZS5lcnJvcihlcnIpOwogIH0gZWxzZSB7CiAgICB0aHJvdyBlcnIKICB9Cn0KCi8qICAqLwovKiBnbG9iYWxzIE1lc3NhZ2VDaGFubmVsICovCgp2YXIgY2FsbGJhY2tzID0gW107CnZhciBwZW5kaW5nID0gZmFsc2U7CgpmdW5jdGlvbiBmbHVzaENhbGxiYWNrcyAoKSB7CiAgcGVuZGluZyA9IGZhbHNlOwogIHZhciBjb3BpZXMgPSBjYWxsYmFja3Muc2xpY2UoMCk7CiAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHsKICAgIGNvcGllc1tpXSgpOwogIH0KfQoKLy8gSGVyZSB3ZSBoYXZlIGFzeW5jIGRlZmVycmluZyB3cmFwcGVycyB1c2luZyBib3RoIG1pY3JvdGFza3MgYW5kIChtYWNybykgdGFza3MuCi8vIEluIDwgMi40IHdlIHVzZWQgbWljcm90YXNrcyBldmVyeXdoZXJlLCBidXQgdGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZXJlCi8vIG1pY3JvdGFza3MgaGF2ZSB0b28gaGlnaCBhIHByaW9yaXR5IGFuZCBmaXJlIGluIGJldHdlZW4gc3VwcG9zZWRseQovLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTApIG9yIGV2ZW4gYmV0d2VlbiBidWJibGluZyBvZiB0aGUgc2FtZQovLyBldmVudCAoIzY1NjYpLiBIb3dldmVyLCB1c2luZyAobWFjcm8pIHRhc2tzIGV2ZXJ5d2hlcmUgYWxzbyBoYXMgc3VidGxlIHByb2JsZW1zCi8vIHdoZW4gc3RhdGUgaXMgY2hhbmdlZCByaWdodCBiZWZvcmUgcmVwYWludCAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS4KLy8gSGVyZSB3ZSB1c2UgbWljcm90YXNrIGJ5IGRlZmF1bHQsIGJ1dCBleHBvc2UgYSB3YXkgdG8gZm9yY2UgKG1hY3JvKSB0YXNrIHdoZW4KLy8gbmVlZGVkIChlLmcuIGluIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIGJ5IHYtb24pLgp2YXIgbWljcm9UaW1lckZ1bmM7CnZhciBtYWNyb1RpbWVyRnVuYzsKdmFyIHVzZU1hY3JvVGFzayA9IGZhbHNlOwoKLy8gRGV0ZXJtaW5lIChtYWNybykgdGFzayBkZWZlciBpbXBsZW1lbnRhdGlvbi4KLy8gVGVjaG5pY2FsbHkgc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBidXQgaXQncyBvbmx5IGF2YWlsYWJsZQovLyBpbiBJRS4gVGhlIG9ubHkgcG9seWZpbGwgdGhhdCBjb25zaXN0ZW50bHkgcXVldWVzIHRoZSBjYWxsYmFjayBhZnRlciBhbGwgRE9NCi8vIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIHNhbWUgbG9vcCBpcyBieSB1c2luZyBNZXNzYWdlQ2hhbm5lbC4KLyogaXN0YW5idWwgaWdub3JlIGlmICovCmlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShzZXRJbW1lZGlhdGUpKSB7CiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpOwogIH07Cn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJyAmJiAoCiAgaXNOYXRpdmUoTWVzc2FnZUNoYW5uZWwpIHx8CiAgLy8gUGhhbnRvbUpTCiAgTWVzc2FnZUNoYW5uZWwudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgTWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvcl0nCikpIHsKICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjsKICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoQ2FsbGJhY2tzOwogIG1hY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcG9ydC5wb3N0TWVzc2FnZSgxKTsKICB9Owp9IGVsc2UgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRUaW1lb3V0KGZsdXNoQ2FsbGJhY2tzLCAwKTsKICB9Owp9CgovLyBEZXRlcm1pbmUgbWljcm90YXNrIGRlZmVyIGltcGxlbWVudGF0aW9uLgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovCmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHsKICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpOwogIG1pY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcC50aGVuKGZsdXNoQ2FsbGJhY2tzKTsKICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dAogICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlCiAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYnV0IHRoZSBxdWV1ZSBpc24ndCBiZWluZyBmbHVzaGVkLCB1bnRpbCB0aGUgYnJvd3NlcgogICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuCiAgICAvLyAiZm9yY2UiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuCiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfQogIH07Cn0gZWxzZSB7CiAgLy8gZmFsbGJhY2sgdG8gbWFjcm8KICBtaWNyb1RpbWVyRnVuYyA9IG1hY3JvVGltZXJGdW5jOwp9CgovKioKICogV3JhcCBhIGZ1bmN0aW9uIHNvIHRoYXQgaWYgYW55IGNvZGUgaW5zaWRlIHRyaWdnZXJzIHN0YXRlIGNoYW5nZSwKICogdGhlIGNoYW5nZXMgYXJlIHF1ZXVlZCB1c2luZyBhIChtYWNybykgdGFzayBpbnN0ZWFkIG9mIGEgbWljcm90YXNrLgogKi8KZnVuY3Rpb24gd2l0aE1hY3JvVGFzayAoZm4pIHsKICByZXR1cm4gZm4uX3dpdGhUYXNrIHx8IChmbi5fd2l0aFRhc2sgPSBmdW5jdGlvbiAoKSB7CiAgICB1c2VNYWNyb1Rhc2sgPSB0cnVlOwogICAgdmFyIHJlcyA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB1c2VNYWNyb1Rhc2sgPSBmYWxzZTsKICAgIHJldHVybiByZXMKICB9KQp9CgpmdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkgewogIHZhciBfcmVzb2x2ZTsKICBjYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7CiAgICBpZiAoY2IpIHsKICAgICAgdHJ5IHsKICAgICAgICBjYi5jYWxsKGN0eCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7CiAgICAgIF9yZXNvbHZlKGN0eCk7CiAgICB9CiAgfSk7CiAgaWYgKCFwZW5kaW5nKSB7CiAgICBwZW5kaW5nID0gdHJ1ZTsKICAgIGlmICh1c2VNYWNyb1Rhc2spIHsKICAgICAgbWFjcm9UaW1lckZ1bmMoKTsKICAgIH0gZWxzZSB7CiAgICAgIG1pY3JvVGltZXJGdW5jKCk7CiAgICB9CiAgfQogIC8vICRmbG93LWRpc2FibGUtbGluZQogIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgX3Jlc29sdmUgPSByZXNvbHZlOwogICAgfSkKICB9Cn0KCi8qICAqLwoKdmFyIG1hcms7CnZhciBtZWFzdXJlOwoKewogIHZhciBwZXJmID0gaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoCiAgICBwZXJmICYmCiAgICBwZXJmLm1hcmsgJiYKICAgIHBlcmYubWVhc3VyZSAmJgogICAgcGVyZi5jbGVhck1hcmtzICYmCiAgICBwZXJmLmNsZWFyTWVhc3VyZXMKICApIHsKICAgIG1hcmsgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiBwZXJmLm1hcmsodGFnKTsgfTsKICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykgewogICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpOwogICAgICBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSk7CiAgICB9OwogIH0KfQoKLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovCgp2YXIgaW5pdFByb3h5OwoKewogIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoCiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICsKICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICsKICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArCiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeQogICk7CgogIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgewogICAgd2FybigKICAgICAgIlByb3BlcnR5IG9yIG1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCAiICsKICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArCiAgICAgICdlaXRoZXIgaW4gdGhlIGRhdGEgb3B0aW9uLCBvciBmb3IgY2xhc3MtYmFzZWQgY29tcG9uZW50cywgYnkgJyArCiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICsKICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsCiAgICAgIHRhcmdldAogICAgKTsKICB9OwoKICB2YXIgaGFzUHJveHkgPQogICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7CgogIGlmIChoYXNQcm94eSkgewogICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpOwogICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2RlcywgewogICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7CiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHsKICAgICAgICAgIHdhcm4oKCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC4iICsga2V5KSk7CiAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZhciBoYXNIYW5kbGVyID0gewogICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7CiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0OwogICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fCBrZXkuY2hhckF0KDApID09PSAnXyc7CiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkCiAgICB9CiAgfTsKCiAgdmFyIGdldEhhbmRsZXIgPSB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHsKICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldFtrZXldCiAgICB9CiAgfTsKCiAgaW5pdFByb3h5ID0gZnVuY3Rpb24gaW5pdFByb3h5ICh2bSkgewogICAgaWYgKGhhc1Byb3h5KSB7CiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZQogICAgICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogICAgICB2YXIgaGFuZGxlcnMgPSBvcHRpb25zLnJlbmRlciAmJiBvcHRpb25zLnJlbmRlci5fd2l0aFN0cmlwcGVkCiAgICAgICAgPyBnZXRIYW5kbGVyCiAgICAgICAgOiBoYXNIYW5kbGVyOwogICAgICB2bS5fcmVuZGVyUHJveHkgPSBuZXcgUHJveHkodm0sIGhhbmRsZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtOwogICAgfQogIH07Cn0KCi8qICAqLwoKdmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTsKCi8qKgogKiBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZAogKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdAogKiBpcyBjb2xsZWN0ZWQgYXMgYSAiZGVlcCIgZGVwZW5kZW5jeS4KICovCmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHsKICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7CiAgc2Vlbk9iamVjdHMuY2xlYXIoKTsKfQoKZnVuY3Rpb24gX3RyYXZlcnNlICh2YWwsIHNlZW4pIHsKICB2YXIgaSwga2V5czsKICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpOwogIGlmICgoIWlzQSAmJiAhaXNPYmplY3QodmFsKSkgfHwgT2JqZWN0LmlzRnJvemVuKHZhbCkgfHwgdmFsIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybgogIH0KICBpZiAodmFsLl9fb2JfXykgewogICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7CiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7CiAgICAgIHJldHVybgogICAgfQogICAgc2Vlbi5hZGQoZGVwSWQpOwogIH0KICBpZiAoaXNBKSB7CiAgICBpID0gdmFsLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtpXSwgc2Vlbik7IH0KICB9IGVsc2UgewogICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7CiAgICBpID0ga2V5cy5sZW5ndGg7CiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9CiAgfQp9CgovKiAgKi8KCnZhciBub3JtYWxpemVFdmVudCA9IGNhY2hlZChmdW5jdGlvbiAobmFtZSkgewogIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJzsKICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lOwogIHZhciBvbmNlJCQxID0gbmFtZS5jaGFyQXQoMCkgPT09ICd+JzsgLy8gUHJlZml4ZWQgbGFzdCwgY2hlY2tlZCBmaXJzdAogIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnOwogIG5hbWUgPSBjYXB0dXJlID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgcmV0dXJuIHsKICAgIG5hbWU6IG5hbWUsCiAgICBvbmNlOiBvbmNlJCQxLAogICAgY2FwdHVyZTogY2FwdHVyZSwKICAgIHBhc3NpdmU6IHBhc3NpdmUKICB9Cn0pOwoKZnVuY3Rpb24gY3JlYXRlRm5JbnZva2VyIChmbnMpIHsKICBmdW5jdGlvbiBpbnZva2VyICgpIHsKICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50czsKCiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7CiAgICAgIHZhciBjbG9uZWQgPSBmbnMuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVycwogICAgICByZXR1cm4gZm5zLmFwcGx5KG51bGwsIGFyZ3VtZW50cykKICAgIH0KICB9CiAgaW52b2tlci5mbnMgPSBmbnM7CiAgcmV0dXJuIGludm9rZXIKfQoKZnVuY3Rpb24gdXBkYXRlTGlzdGVuZXJzICgKICBvbiwKICBvbGRPbiwKICBhZGQsCiAgcmVtb3ZlJCQxLAogIHZtCikgewogIHZhciBuYW1lLCBkZWYsIGN1ciwgb2xkLCBldmVudDsKICBmb3IgKG5hbWUgaW4gb24pIHsKICAgIGRlZiA9IGN1ciA9IG9uW25hbWVdOwogICAgb2xkID0gb2xkT25bbmFtZV07CiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNVbmRlZihjdXIpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50IFwiIiArIChldmVudC5uYW1lKSArICJcIjogZ290ICIgKyBTdHJpbmcoY3VyKSwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHsKICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHsKICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZUZuSW52b2tlcihjdXIpOwogICAgICB9CiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50Lm9uY2UsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7CiAgICAgIG9sZC5mbnMgPSBjdXI7CiAgICAgIG9uW25hbWVdID0gb2xkOwogICAgfQogIH0KICBmb3IgKG5hbWUgaW4gb2xkT24pIHsKICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkgewogICAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpOwogICAgfQogIH0KfQoKLyogICovCgpmdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7CiAgaWYgKGRlZiBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pOwogIH0KICB2YXIgaW52b2tlcjsKICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTsKCiAgZnVuY3Rpb24gd3JhcHBlZEhvb2sgKCkgewogICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgLy8gaW1wb3J0YW50OiByZW1vdmUgbWVyZ2VkIGhvb2sgdG8gZW5zdXJlIGl0J3MgY2FsbGVkIG9ubHkgb25jZQogICAgLy8gYW5kIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spOwogIH0KCiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHsKICAgIC8vIG5vIGV4aXN0aW5nIGhvb2sKICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW3dyYXBwZWRIb29rXSk7CiAgfSBlbHNlIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKGlzRGVmKG9sZEhvb2suZm5zKSAmJiBpc1RydWUob2xkSG9vay5tZXJnZWQpKSB7CiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlcgogICAgICBpbnZva2VyID0gb2xkSG9vazsKICAgICAgaW52b2tlci5mbnMucHVzaCh3cmFwcGVkSG9vayk7CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBwbGFpbiBob29rCiAgICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW29sZEhvb2ssIHdyYXBwZWRIb29rXSk7CiAgICB9CiAgfQoKICBpbnZva2VyLm1lcmdlZCA9IHRydWU7CiAgZGVmW2hvb2tLZXldID0gaW52b2tlcjsKfQoKLyogICovCgpmdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhICgKICBkYXRhLAogIEN0b3IsCiAgdGFnCikgewogIC8vIHdlIGFyZSBvbmx5IGV4dHJhY3RpbmcgcmF3IHZhbHVlcyBoZXJlLgogIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZAogIC8vIGNvbXBvbmVudCBpdHNlbGYuCiAgdmFyIHByb3BPcHRpb25zID0gQ3Rvci5vcHRpb25zLnByb3BzOwogIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkgewogICAgcmV0dXJuCiAgfQogIHZhciByZXMgPSB7fTsKICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzOwogIHZhciBwcm9wcyA9IGRhdGEucHJvcHM7CiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykgewogICAgICB2YXIgYWx0S2V5ID0gaHlwaGVuYXRlKGtleSk7CiAgICAgIHsKICAgICAgICB2YXIga2V5SW5Mb3dlckNhc2UgPSBrZXkudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoCiAgICAgICAgICBrZXkgIT09IGtleUluTG93ZXJDYXNlICYmCiAgICAgICAgICBhdHRycyAmJiBoYXNPd24oYXR0cnMsIGtleUluTG93ZXJDYXNlKQogICAgICAgICkgewogICAgICAgICAgdGlwKAogICAgICAgICAgICAiUHJvcCBcIiIgKyBrZXlJbkxvd2VyQ2FzZSArICJcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50ICIgKwogICAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh0YWcgfHwgQ3RvcikpICsgIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXMiICsKICAgICAgICAgICAgIiBcIiIgKyBrZXkgKyAiXCIuICIgKwogICAgICAgICAgICAiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCAiICsKICAgICAgICAgICAgInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gIiArCiAgICAgICAgICAgICJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFwiIiArIGFsdEtleSArICJcIiBpbnN0ZWFkIG9mIFwiIiArIGtleSArICJcIi4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGVja1Byb3AocmVzLCBwcm9wcywga2V5LCBhbHRLZXksIHRydWUpIHx8CiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrUHJvcCAoCiAgcmVzLAogIGhhc2gsCiAga2V5LAogIGFsdEtleSwKICBwcmVzZXJ2ZQopIHsKICBpZiAoaXNEZWYoaGFzaCkpIHsKICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkgewogICAgICByZXNba2V5XSA9IGhhc2hba2V5XTsKICAgICAgaWYgKCFwcmVzZXJ2ZSkgewogICAgICAgIGRlbGV0ZSBoYXNoW2tleV07CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWUKICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHsKICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07CiAgICAgIGlmICghcHJlc2VydmUpIHsKICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQogIHJldHVybiBmYWxzZQp9CgovKiAgKi8KCi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieQovLyBzdGF0aWNhbGx5IGFuYWx5emluZyB0aGUgdGVtcGxhdGUgYXQgY29tcGlsZSB0aW1lLgovLwovLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZQovLyBnZW5lcmF0ZWQgcmVuZGVyIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIEFycmF5PFZOb2RlPi4gVGhlcmUgYXJlCi8vIHR3byBjYXNlcyB3aGVyZSBleHRyYSBub3JtYWxpemF0aW9uIGlzIG5lZWRlZDoKCi8vIDEuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbXBvbmVudHMgLSBiZWNhdXNlIGEgZnVuY3Rpb25hbCBjb21wb25lbnQKLy8gbWF5IHJldHVybiBhbiBBcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJvb3QuIEluIHRoaXMgY2FzZSwganVzdCBhIHNpbXBsZQovLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGUKLy8gdGhpbmcgd2l0aCBBcnJheS5wcm90b3R5cGUuY29uY2F0LiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9ubHkgMS1sZXZlbCBkZWVwCi8vIGJlY2F1c2UgZnVuY3Rpb25hbCBjb21wb25lbnRzIGFscmVhZHkgbm9ybWFsaXplIHRoZWlyIG93biBjaGlsZHJlbi4KZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW5baV0pKSB7CiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbikKICAgIH0KICB9CiAgcmV0dXJuIGNoaWxkcmVuCn0KCi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsCi8vIGUuZy4gPHRlbXBsYXRlPiwgPHNsb3Q+LCB2LWZvciwgb3Igd2hlbiB0aGUgY2hpbGRyZW4gaXMgcHJvdmlkZWQgYnkgdXNlcgovLyB3aXRoIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zIC8gSlNYLiBJbiBzdWNoIGNhc2VzIGEgZnVsbCBub3JtYWxpemF0aW9uCi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLgpmdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbiAoY2hpbGRyZW4pIHsKICByZXR1cm4gaXNQcmltaXRpdmUoY2hpbGRyZW4pCiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXQogICAgOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKQogICAgICA/IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oY2hpbGRyZW4pCiAgICAgIDogdW5kZWZpbmVkCn0KCmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHsKICByZXR1cm4gaXNEZWYobm9kZSkgJiYgaXNEZWYobm9kZS50ZXh0KSAmJiBpc0ZhbHNlKG5vZGUuaXNDb21tZW50KQp9CgpmdW5jdGlvbiBub3JtYWxpemVBcnJheUNoaWxkcmVuIChjaGlsZHJlbiwgbmVzdGVkSW5kZXgpIHsKICB2YXIgcmVzID0gW107CiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDsKICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgIGMgPSBjaGlsZHJlbltpXTsKICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfQogICAgbGFzdEluZGV4ID0gcmVzLmxlbmd0aCAtIDE7CiAgICBsYXN0ID0gcmVzW2xhc3RJbmRleF07CiAgICAvLyAgbmVzdGVkCiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgewogICAgICBpZiAoYy5sZW5ndGggPiAwKSB7CiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyAiXyIgKyBpKSk7CiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcwogICAgICAgIGlmIChpc1RleHROb2RlKGNbMF0pICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIChjWzBdKS50ZXh0KTsKICAgICAgICAgIGMuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBjKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZShjKSkgewogICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkgewogICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMKICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgU1NSIGh5ZHJhdGlvbiBiZWNhdXNlIHRleHQgbm9kZXMgYXJlCiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7CiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHsKICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0byB2bm9kZQogICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBkZWZhdWx0IGtleSBmb3IgbmVzdGVkIGFycmF5IGNoaWxkcmVuIChsaWtlbHkgZ2VuZXJhdGVkIGJ5IHYtZm9yKQogICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmCiAgICAgICAgICBpc0RlZihjLnRhZykgJiYKICAgICAgICAgIGlzVW5kZWYoYy5rZXkpICYmCiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHsKICAgICAgICAgIGMua2V5ID0gIl9fdmxpc3QiICsgbmVzdGVkSW5kZXggKyAiXyIgKyBpICsgIl9fIjsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2goYyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIGVuc3VyZUN0b3IgKGNvbXAsIGJhc2UpIHsKICBpZiAoCiAgICBjb21wLl9fZXNNb2R1bGUgfHwKICAgIChoYXNTeW1ib2wgJiYgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJykKICApIHsKICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7CiAgfQogIHJldHVybiBpc09iamVjdChjb21wKQogICAgPyBiYXNlLmV4dGVuZChjb21wKQogICAgOiBjb21wCn0KCmZ1bmN0aW9uIGNyZWF0ZUFzeW5jUGxhY2Vob2xkZXIgKAogIGZhY3RvcnksCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7CiAgbm9kZS5hc3luY01ldGEgPSB7IGRhdGE6IGRhdGEsIGNvbnRleHQ6IGNvbnRleHQsIGNoaWxkcmVuOiBjaGlsZHJlbiwgdGFnOiB0YWcgfTsKICByZXR1cm4gbm9kZQp9CgpmdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKAogIGZhY3RvcnksCiAgYmFzZUN0b3IsCiAgY29udGV4dAopIHsKICBpZiAoaXNUcnVlKGZhY3RvcnkuZXJyb3IpICYmIGlzRGVmKGZhY3RvcnkuZXJyb3JDb21wKSkgewogICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHsKICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkCiAgfQoKICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHsKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5jb250ZXh0cykpIHsKICAgIC8vIGFscmVhZHkgcGVuZGluZwogICAgZmFjdG9yeS5jb250ZXh0cy5wdXNoKGNvbnRleHQpOwogIH0gZWxzZSB7CiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdOwogICAgdmFyIHN5bmMgPSB0cnVlOwoKICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb250ZXh0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBjb250ZXh0c1tpXS4kZm9yY2VVcGRhdGUoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykgewogICAgICAvLyBjYWNoZSByZXNvbHZlZAogICAgICBmYWN0b3J5LnJlc29sdmVkID0gZW5zdXJlQ3RvcihyZXMsIGJhc2VDdG9yKTsKICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZQogICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUikKICAgICAgaWYgKCFzeW5jKSB7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgYXN5bmMgY29tcG9uZW50OiAiICsgKFN0cmluZyhmYWN0b3J5KSkgKwogICAgICAgIChyZWFzb24gPyAoIlxuUmVhc29uOiAiICsgcmVhc29uKSA6ICcnKQogICAgICApOwogICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7CiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTsKCiAgICBpZiAoaXNPYmplY3QocmVzKSkgewogICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZQogICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7CiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc0RlZihyZXMuY29tcG9uZW50KSAmJiB0eXBlb2YgcmVzLmNvbXBvbmVudC50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7CgogICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7CiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7CiAgICAgICAgICBmYWN0b3J5LmxvYWRpbmdDb21wID0gZW5zdXJlQ3RvcihyZXMubG9hZGluZywgYmFzZUN0b3IpOwogICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkgewogICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCByZXMuZGVsYXkgfHwgMjAwKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc0RlZihyZXMudGltZW91dCkpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgICAgICAgIHJlamVjdCgKICAgICAgICAgICAgICAgICJ0aW1lb3V0ICgiICsgKHJlcy50aW1lb3V0KSArICJtcykiCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgcmVzLnRpbWVvdXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHN5bmMgPSBmYWxzZTsKICAgIC8vIHJldHVybiBpbiBjYXNlIHJlc29sdmVkIHN5bmNocm9ub3VzbHkKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmcKICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wCiAgICAgIDogZmFjdG9yeS5yZXNvbHZlZAogIH0KfQoKLyogICovCgpmdW5jdGlvbiBpc0FzeW5jUGxhY2Vob2xkZXIgKG5vZGUpIHsKICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3RvcnkKfQoKLyogICovCgpmdW5jdGlvbiBnZXRGaXJzdENvbXBvbmVudENoaWxkIChjaGlsZHJlbikgewogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkgewogICAgICAgIHJldHVybiBjCiAgICAgIH0KICAgIH0KICB9Cn0KCi8qICAqLwoKLyogICovCgpmdW5jdGlvbiBpbml0RXZlbnRzICh2bSkgewogIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTsKICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHMKICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczsKICBpZiAobGlzdGVuZXJzKSB7CiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycyk7CiAgfQp9Cgp2YXIgdGFyZ2V0OwoKZnVuY3Rpb24gYWRkIChldmVudCwgZm4sIG9uY2UpIHsKICBpZiAob25jZSkgewogICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7CiAgfSBlbHNlIHsKICAgIHRhcmdldC4kb24oZXZlbnQsIGZuKTsKICB9Cn0KCmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHsKICB0YXJnZXQuJG9mZihldmVudCwgZm4pOwp9CgpmdW5jdGlvbiB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnMgKAogIHZtLAogIGxpc3RlbmVycywKICBvbGRMaXN0ZW5lcnMKKSB7CiAgdGFyZ2V0ID0gdm07CiAgdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzIHx8IHt9LCBhZGQsIHJlbW92ZSQxLCB2bSk7CiAgdGFyZ2V0ID0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7CiAgdmFyIGhvb2tSRSA9IC9eaG9vazovOwogIFZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHRoaXMkMS4kb24oZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKHZtLl9ldmVudHNbZXZlbnRdIHx8ICh2bS5fZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChmbik7CiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uCiAgICAgIC8vIGluc3RlYWQgb2YgYSBoYXNoIGxvb2t1cAogICAgICBpZiAoaG9va1JFLnRlc3QoZXZlbnQpKSB7CiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07CgogIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgZnVuY3Rpb24gb24gKCkgewogICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7CiAgICAgIGZuLmFwcGx5KHZtLCBhcmd1bWVudHMpOwogICAgfQogICAgb24uZm4gPSBmbjsKICAgIHZtLiRvbihldmVudCwgb24pOwogICAgcmV0dXJuIHZtCiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kb2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIC8vIGFsbAogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIGFycmF5IG9mIGV2ZW50cwogICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgdGhpcyQxLiRvZmYoZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIHNwZWNpZmljIGV2ZW50CiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07CiAgICBpZiAoIWNicykgewogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmICghZm4pIHsKICAgICAgdm0uX2V2ZW50c1tldmVudF0gPSBudWxsOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmIChmbikgewogICAgICAvLyBzcGVjaWZpYyBoYW5kbGVyCiAgICAgIHZhciBjYjsKICAgICAgdmFyIGkkMSA9IGNicy5sZW5ndGg7CiAgICAgIHdoaWxlIChpJDEtLSkgewogICAgICAgIGNiID0gY2JzW2kkMV07CiAgICAgICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHsKICAgICAgICAgIGNicy5zcGxpY2UoaSQxLCAxKTsKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdm0KICB9OwoKICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgewogICAgICB2YXIgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7CiAgICAgICAgdGlwKAogICAgICAgICAgIkV2ZW50IFwiIiArIGxvd2VyQ2FzZUV2ZW50ICsgIlwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICIgKwogICAgICAgICAgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArICIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFwiIiArIGV2ZW50ICsgIlwiLiAiICsKICAgICAgICAgICJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSAiICsKICAgICAgICAgICJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gIiArCiAgICAgICAgICAiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIiICsgKGh5cGhlbmF0ZShldmVudCkpICsgIlwiIGluc3RlYWQgb2YgXCIiICsgZXZlbnQgKyAiXCIuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTsKICAgIGlmIChjYnMpIHsKICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7CiAgICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgY2JzW2ldLmFwcGx5KHZtLCBhcmdzKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKCJldmVudCBoYW5kbGVyIGZvciBcIiIgKyBldmVudCArICJcIiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07Cn0KCi8qICAqLwoKCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC4KICovCmZ1bmN0aW9uIHJlc29sdmVTbG90cyAoCiAgY2hpbGRyZW4sCiAgY29udGV4dAopIHsKICB2YXIgc2xvdHMgPSB7fTsKICBpZiAoIWNoaWxkcmVuKSB7CiAgICByZXR1cm4gc2xvdHMKICB9CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgdmFyIGRhdGEgPSBjaGlsZC5kYXRhOwogICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZQogICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHsKICAgICAgZGVsZXRlIGRhdGEuYXR0cnMuc2xvdDsKICAgIH0KICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZQogICAgLy8gc2FtZSBjb250ZXh0LgogICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiYKICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbAogICAgKSB7CiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90OwogICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpOwogICAgICBpZiAoY2hpbGQudGFnID09PSAndGVtcGxhdGUnKSB7CiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbG90LnB1c2goY2hpbGQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAoc2xvdHMuZGVmYXVsdCB8fCAoc2xvdHMuZGVmYXVsdCA9IFtdKSkucHVzaChjaGlsZCk7CiAgICB9CiAgfQogIC8vIGlnbm9yZSBzbG90cyB0aGF0IGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZQogIGZvciAodmFyIG5hbWUkMSBpbiBzbG90cykgewogICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkgewogICAgICBkZWxldGUgc2xvdHNbbmFtZSQxXTsKICAgIH0KICB9CiAgcmV0dXJuIHNsb3RzCn0KCmZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAobm9kZSkgewogIHJldHVybiAobm9kZS5pc0NvbW1lbnQgJiYgIW5vZGUuYXN5bmNGYWN0b3J5KSB8fCBub2RlLnRleHQgPT09ICcgJwp9CgpmdW5jdGlvbiByZXNvbHZlU2NvcGVkU2xvdHMgKAogIGZucywgLy8gc2VlIGZsb3cvdm5vZGUKICByZXMKKSB7CiAgcmVzID0gcmVzIHx8IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnNbaV0pKSB7CiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7CiAgICB9IGVsc2UgewogICAgICByZXNbZm5zW2ldLmtleV0gPSBmbnNbaV0uZm47CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsOwp2YXIgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7CgpmdW5jdGlvbiBpbml0TGlmZWN5Y2xlICh2bSkgewogIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7CgogIC8vIGxvY2F0ZSBmaXJzdCBub24tYWJzdHJhY3QgcGFyZW50CiAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7CiAgICB9CiAgICBwYXJlbnQuJGNoaWxkcmVuLnB1c2godm0pOwogIH0KCiAgdm0uJHBhcmVudCA9IHBhcmVudDsKICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtOwoKICB2bS4kY2hpbGRyZW4gPSBbXTsKICB2bS4kcmVmcyA9IHt9OwoKICB2bS5fd2F0Y2hlciA9IG51bGw7CiAgdm0uX2luYWN0aXZlID0gbnVsbDsKICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTsKICB2bS5faXNNb3VudGVkID0gZmFsc2U7CiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2U7CiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTsKfQoKZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkgewogIFZ1ZS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICh2bm9kZSwgaHlkcmF0aW5nKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKHZtLl9pc01vdW50ZWQpIHsKICAgICAgY2FsbEhvb2sodm0sICdiZWZvcmVVcGRhdGUnKTsKICAgIH0KICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7CiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlOwogICAgdmFyIHByZXZBY3RpdmVJbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlOwogICAgYWN0aXZlSW5zdGFuY2UgPSB2bTsKICAgIHZtLl92bm9kZSA9IHZub2RlOwogICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzCiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC4KICAgIGlmICghcHJldlZub2RlKSB7CiAgICAgIC8vIGluaXRpYWwgcmVuZGVyCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXygKICAgICAgICB2bS4kZWwsIHZub2RlLCBoeWRyYXRpbmcsIGZhbHNlIC8qIHJlbW92ZU9ubHkgKi8sCiAgICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSwKICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtCiAgICAgICk7CiAgICAgIC8vIG5vIG5lZWQgZm9yIHRoZSByZWYgbm9kZXMgYWZ0ZXIgaW5pdGlhbCBwYXRjaAogICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKQogICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtID0gdm0uJG9wdGlvbnMuX3JlZkVsbSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICAvLyB1cGRhdGVzCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhwcmV2Vm5vZGUsIHZub2RlKTsKICAgIH0KICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlOwogICAgLy8gdXBkYXRlIF9fdnVlX18gcmVmZXJlbmNlCiAgICBpZiAocHJldkVsKSB7CiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDsKICAgIH0KICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTsKICAgIH0KICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGwKICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7CiAgICAgIHZtLiRwYXJlbnQuJGVsID0gdm0uJGVsOwogICAgfQogICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZQogICAgLy8gdXBkYXRlZCBpbiBhIHBhcmVudCdzIHVwZGF0ZWQgaG9vay4KICB9OwoKICBWdWUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX2lzQmVpbmdEZXN0cm95ZWQpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZURlc3Ryb3knKTsKICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTsKICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50CiAgICB2YXIgcGFyZW50ID0gdm0uJHBhcmVudDsKICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHsKICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTsKICAgIH0KICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzCiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudGVhcmRvd24oKTsKICAgIH0KICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7CiAgICB9CiAgICAvLyByZW1vdmUgcmVmZXJlbmNlIGZyb20gZGF0YSBvYgogICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuCiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7CiAgICAgIHZtLl9kYXRhLl9fb2JfXy52bUNvdW50LS07CiAgICB9CiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi4KICAgIHZtLl9pc0Rlc3Ryb3llZCA9IHRydWU7CiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWUKICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpOwogICAgLy8gZmlyZSBkZXN0cm95ZWQgaG9vawogICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTsKICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuCiAgICB2bS4kb2ZmKCk7CiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2UKICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSBudWxsOwogICAgfQogICAgLy8gcmVsZWFzZSBjaXJjdWxhciByZWZlcmVuY2UgKCM2NzU5KQogICAgaWYgKHZtLiR2bm9kZSkgewogICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBtb3VudENvbXBvbmVudCAoCiAgdm0sCiAgZWwsCiAgaHlkcmF0aW5nCikgewogIHZtLiRlbCA9IGVsOwogIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7CiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlOwogICAgewogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHwKICAgICAgICB2bS4kb3B0aW9ucy5lbCB8fCBlbCkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArCiAgICAgICAgICAnY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIHByZS1jb21waWxlIHRoZSB0ZW1wbGF0ZXMgaW50byAnICsKICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgfQogIH0KICBjYWxsSG9vayh2bSwgJ2JlZm9yZU1vdW50Jyk7CgogIHZhciB1cGRhdGVDb21wb25lbnQ7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lOwogICAgICB2YXIgaWQgPSB2bS5fdWlkOwogICAgICB2YXIgc3RhcnRUYWcgPSAidnVlLXBlcmYtc3RhcnQ6IiArIGlkOwogICAgICB2YXIgZW5kVGFnID0gInZ1ZS1wZXJmLWVuZDoiICsgaWQ7CgogICAgICBtYXJrKHN0YXJ0VGFnKTsKICAgICAgdmFyIHZub2RlID0gdm0uX3JlbmRlcigpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHJlbmRlciIpLCBzdGFydFRhZywgZW5kVGFnKTsKCiAgICAgIG1hcmsoc3RhcnRUYWcpOwogICAgICB2bS5fdXBkYXRlKHZub2RlLCBoeWRyYXRpbmcpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHBhdGNoIiksIHN0YXJ0VGFnLCBlbmRUYWcpOwogICAgfTsKICB9IGVsc2UgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2bS5fdXBkYXRlKHZtLl9yZW5kZXIoKSwgaHlkcmF0aW5nKTsKICAgIH07CiAgfQoKICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvcgogIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkCiAgLy8gY29tcG9uZW50J3MgbW91bnRlZCBob29rKSwgd2hpY2ggcmVsaWVzIG9uIHZtLl93YXRjaGVyIGJlaW5nIGFscmVhZHkgZGVmaW5lZAogIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIG51bGwsIHRydWUgLyogaXNSZW5kZXJXYXRjaGVyICovKTsKICBoeWRyYXRpbmcgPSBmYWxzZTsKCiAgLy8gbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSwgY2FsbCBtb3VudGVkIG9uIHNlbGYKICAvLyBtb3VudGVkIGlzIGNhbGxlZCBmb3IgcmVuZGVyLWNyZWF0ZWQgY2hpbGQgY29tcG9uZW50cyBpbiBpdHMgaW5zZXJ0ZWQgaG9vawogIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkgewogICAgdm0uX2lzTW91bnRlZCA9IHRydWU7CiAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTsKICB9CiAgcmV0dXJuIHZtCn0KCmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50ICgKICB2bSwKICBwcm9wc0RhdGEsCiAgbGlzdGVuZXJzLAogIHBhcmVudFZub2RlLAogIHJlbmRlckNoaWxkcmVuCikgewogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7CiAgfQoKICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW4KICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG92ZXJ3cml0aW5nICRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbgogIHZhciBoYXNDaGlsZHJlbiA9ICEhKAogICAgcmVuZGVyQ2hpbGRyZW4gfHwgICAgICAgICAgICAgICAvLyBoYXMgbmV3IHN0YXRpYyBzbG90cwogICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90cwogICAgcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyB8fCAvLyBoYXMgbmV3IHNjb3BlZCBzbG90cwogICAgdm0uJHNjb3BlZFNsb3RzICE9PSBlbXB0eU9iamVjdCAvLyBoYXMgb2xkIHNjb3BlZCBzbG90cwogICk7CgogIHZtLiRvcHRpb25zLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlOwogIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyCgogIGlmICh2bS5fdm5vZGUpIHsgLy8gdXBkYXRlIGNoaWxkIHRyZWUncyBwYXJlbnQKICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTsKICB9CiAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW47CgogIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5lcnMgaGFzaAogIC8vIHRoZXNlIGFyZSBhbHNvIHJlYWN0aXZlIHNvIHRoZXkgbWF5IHRyaWdnZXIgY2hpbGQgdXBkYXRlIGlmIHRoZSBjaGlsZAogIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyCiAgdm0uJGF0dHJzID0gcGFyZW50Vm5vZGUuZGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdDsKICB2bS4kbGlzdGVuZXJzID0gbGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0OwoKICAvLyB1cGRhdGUgcHJvcHMKICBpZiAocHJvcHNEYXRhICYmIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgdmFyIHByb3BzID0gdm0uX3Byb3BzOwogICAgdmFyIHByb3BLZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07CiAgICAgIHZhciBwcm9wT3B0aW9ucyA9IHZtLiRvcHRpb25zLnByb3BzOyAvLyB3dGYgZmxvdz8KICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTsKICAgIH0KICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGEKICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YSA9IHByb3BzRGF0YTsKICB9CgogIC8vIHVwZGF0ZSBsaXN0ZW5lcnMKICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7CiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTsKCiAgLy8gcmVzb2x2ZSBzbG90cyArIGZvcmNlIHVwZGF0ZSBpZiBoYXMgY2hpbGRyZW4KICBpZiAoaGFzQ2hpbGRyZW4pIHsKICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7CiAgICB2bS4kZm9yY2VVcGRhdGUoKTsKICB9CgogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlOwogIH0KfQoKZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHsKICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHsKICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfQogIH0KICByZXR1cm4gZmFsc2UKfQoKZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlOwogICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7CiAgICAgIHJldHVybgogICAgfQogIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7CiAgICByZXR1cm4KICB9CiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHsKICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pOwogICAgfQogICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7CiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgfQogIGlmICghdm0uX2luYWN0aXZlKSB7CiAgICB2bS5faW5hY3RpdmUgPSB0cnVlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7CiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHsKICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzCiAgcHVzaFRhcmdldCgpOwogIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdOwogIGlmIChoYW5kbGVycykgewogICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgdHJ5IHsKICAgICAgICBoYW5kbGVyc1tpXS5jYWxsKHZtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoaG9vayArICIgaG9vayIpKTsKICAgICAgfQogICAgfQogIH0KICBpZiAodm0uX2hhc0hvb2tFdmVudCkgewogICAgdm0uJGVtaXQoJ2hvb2s6JyArIGhvb2spOwogIH0KICBwb3BUYXJnZXQoKTsKfQoKLyogICovCgoKdmFyIE1BWF9VUERBVEVfQ09VTlQgPSAxMDA7Cgp2YXIgcXVldWUgPSBbXTsKdmFyIGFjdGl2YXRlZENoaWxkcmVuID0gW107CnZhciBoYXMgPSB7fTsKdmFyIGNpcmN1bGFyID0ge307CnZhciB3YWl0aW5nID0gZmFsc2U7CnZhciBmbHVzaGluZyA9IGZhbHNlOwp2YXIgaW5kZXggPSAwOwoKLyoqCiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS4KICovCmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkgewogIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDsKICBoYXMgPSB7fTsKICB7CiAgICBjaXJjdWxhciA9IHt9OwogIH0KICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTsKfQoKLyoqCiAqIEZsdXNoIGJvdGggcXVldWVzIGFuZCBydW4gdGhlIHdhdGNoZXJzLgogKi8KZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7CiAgZmx1c2hpbmcgPSB0cnVlOwogIHZhciB3YXRjaGVyLCBpZDsKCiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guCiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6CiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5cwogIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZCkKICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlCiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKQogIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sCiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLgogIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTsKCiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkCiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzCiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7CiAgICB3YXRjaGVyID0gcXVldWVbaW5kZXhdOwogICAgaWQgPSB3YXRjaGVyLmlkOwogICAgaGFzW2lkXSA9IG51bGw7CiAgICB3YXRjaGVyLnJ1bigpOwogICAgLy8gaW4gZGV2IGJ1aWxkLCBjaGVjayBhbmQgc3RvcCBjaXJjdWxhciB1cGRhdGVzLgogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHsKICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7CiAgICAgIGlmIChjaXJjdWxhcltpZF0gPiBNQVhfVVBEQVRFX0NPVU5UKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArICgKICAgICAgICAgICAgd2F0Y2hlci51c2VyCiAgICAgICAgICAgICAgPyAoImluIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uIFwiIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgIlwiIikKICAgICAgICAgICAgICA6ICJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uIgogICAgICAgICAgKSwKICAgICAgICAgIHdhdGNoZXIudm0KICAgICAgICApOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICB9CgogIC8vIGtlZXAgY29waWVzIG9mIHBvc3QgcXVldWVzIGJlZm9yZSByZXNldHRpbmcgc3RhdGUKICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpOwogIHZhciB1cGRhdGVkUXVldWUgPSBxdWV1ZS5zbGljZSgpOwoKICByZXNldFNjaGVkdWxlclN0YXRlKCk7CgogIC8vIGNhbGwgY29tcG9uZW50IHVwZGF0ZWQgYW5kIGFjdGl2YXRlZCBob29rcwogIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7CiAgY2FsbFVwZGF0ZWRIb29rcyh1cGRhdGVkUXVldWUpOwoKICAvLyBkZXZ0b29sIGhvb2sKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoZGV2dG9vbHMgJiYgY29uZmlnLmRldnRvb2xzKSB7CiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpOwogIH0KfQoKZnVuY3Rpb24gY2FsbFVwZGF0ZWRIb29rcyAocXVldWUpIHsKICB2YXIgaSA9IHF1ZXVlLmxlbmd0aDsKICB3aGlsZSAoaS0tKSB7CiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2ldOwogICAgdmFyIHZtID0gd2F0Y2hlci52bTsKICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkKSB7CiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpOwogICAgfQogIH0KfQoKLyoqCiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC4KICogVGhlIHF1ZXVlIHdpbGwgYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSBlbnRpcmUgdHJlZSBoYXMgYmVlbiBwYXRjaGVkLgogKi8KZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7CiAgLy8gc2V0dGluZyBfaW5hY3RpdmUgdG8gZmFsc2UgaGVyZSBzbyB0aGF0IGEgcmVuZGVyIGZ1bmN0aW9uIGNhbgogIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpCiAgdm0uX2luYWN0aXZlID0gZmFsc2U7CiAgYWN0aXZhdGVkQ2hpbGRyZW4ucHVzaCh2bSk7Cn0KCmZ1bmN0aW9uIGNhbGxBY3RpdmF0ZWRIb29rcyAocXVldWUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlOwogICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChxdWV1ZVtpXSwgdHJ1ZSAvKiB0cnVlICovKTsKICB9Cn0KCi8qKgogKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLgogKiBKb2JzIHdpdGggZHVwbGljYXRlIElEcyB3aWxsIGJlIHNraXBwZWQgdW5sZXNzIGl0J3MKICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuCiAqLwpmdW5jdGlvbiBxdWV1ZVdhdGNoZXIgKHdhdGNoZXIpIHsKICB2YXIgaWQgPSB3YXRjaGVyLmlkOwogIGlmIChoYXNbaWRdID09IG51bGwpIHsKICAgIGhhc1tpZF0gPSB0cnVlOwogICAgaWYgKCFmbHVzaGluZykgewogICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZAogICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LgogICAgICB2YXIgaSA9IHF1ZXVlLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7CiAgICAgICAgaS0tOwogICAgICB9CiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7CiAgICB9CiAgICAvLyBxdWV1ZSB0aGUgZmx1c2gKICAgIGlmICghd2FpdGluZykgewogICAgICB3YWl0aW5nID0gdHJ1ZTsKICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciB1aWQkMSA9IDA7CgovKioKICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsCiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuCiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLgogKi8KdmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGNiLAogIG9wdGlvbnMsCiAgaXNSZW5kZXJXYXRjaGVyCikgewogIHRoaXMudm0gPSB2bTsKICBpZiAoaXNSZW5kZXJXYXRjaGVyKSB7CiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7CiAgfQogIHZtLl93YXRjaGVycy5wdXNoKHRoaXMpOwogIC8vIG9wdGlvbnMKICBpZiAob3B0aW9ucykgewogICAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7CiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjsKICAgIHRoaXMubGF6eSA9ICEhb3B0aW9ucy5sYXp5OwogICAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7CiAgfSBlbHNlIHsKICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlOwogIH0KICB0aGlzLmNiID0gY2I7CiAgdGhpcy5pZCA9ICsrdWlkJDE7IC8vIHVpZCBmb3IgYmF0Y2hpbmcKICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnMKICB0aGlzLmRlcHMgPSBbXTsKICB0aGlzLm5ld0RlcHMgPSBbXTsKICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7CiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpOwogIHRoaXMuZXhwcmVzc2lvbiA9IGV4cE9yRm4udG9TdHJpbmcoKTsKICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXIKICBpZiAodHlwZW9mIGV4cE9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjsKICB9IGVsc2UgewogICAgdGhpcy5nZXR0ZXIgPSBwYXJzZVBhdGgoZXhwT3JGbik7CiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7CiAgICAgIHRoaXMuZ2V0dGVyID0gZnVuY3Rpb24gKCkge307CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXCIiICsgZXhwT3JGbiArICJcIiAiICsKICAgICAgICAnV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuICcgKwogICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsCiAgICAgICAgdm0KICAgICAgKTsKICAgIH0KICB9CiAgdGhpcy52YWx1ZSA9IHRoaXMubGF6eQogICAgPyB1bmRlZmluZWQKICAgIDogdGhpcy5nZXQoKTsKfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkgewogIHB1c2hUYXJnZXQodGhpcyk7CiAgdmFyIHZhbHVlOwogIHZhciB2bSA9IHRoaXMudm07CiAgdHJ5IHsKICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIGlmICh0aGlzLnVzZXIpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICgiZ2V0dGVyIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZQogICAgfQogIH0gZmluYWxseSB7CiAgICAvLyAidG91Y2giIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzCiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmcKICAgIGlmICh0aGlzLmRlZXApIHsKICAgICAgdHJhdmVyc2UodmFsdWUpOwogICAgfQogICAgcG9wVGFyZ2V0KCk7CiAgICB0aGlzLmNsZWFudXBEZXBzKCk7CiAgfQogIHJldHVybiB2YWx1ZQp9OwoKLyoqCiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5hZGREZXAgPSBmdW5jdGlvbiBhZGREZXAgKGRlcCkgewogIHZhciBpZCA9IGRlcC5pZDsKICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHsKICAgIHRoaXMubmV3RGVwSWRzLmFkZChpZCk7CiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApOwogICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7CiAgICAgIGRlcC5hZGRTdWIodGhpcyk7CiAgICB9CiAgfQp9OwoKLyoqCiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGRlcCA9IHRoaXMkMS5kZXBzW2ldOwogICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7CiAgICAgIGRlcC5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICB9CiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzOwogIHRoaXMuZGVwSWRzID0gdGhpcy5uZXdEZXBJZHM7CiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7CiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTsKICB0bXAgPSB0aGlzLmRlcHM7CiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzOwogIHRoaXMubmV3RGVwcyA9IHRtcDsKICB0aGlzLm5ld0RlcHMubGVuZ3RoID0gMDsKfTsKCi8qKgogKiBTdWJzY3JpYmVyIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy4KICovCldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAodGhpcy5sYXp5KSB7CiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICB9IGVsc2UgaWYgKHRoaXMuc3luYykgewogICAgdGhpcy5ydW4oKTsKICB9IGVsc2UgewogICAgcXVldWVXYXRjaGVyKHRoaXMpOwogIH0KfTsKCi8qKgogKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci4KICovCldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7CiAgaWYgKHRoaXMuYWN0aXZlKSB7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpOwogICAgaWYgKAogICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fAogICAgICAvLyBEZWVwIHdhdGNoZXJzIGFuZCB3YXRjaGVycyBvbiBPYmplY3QvQXJyYXlzIHNob3VsZCBmaXJlIGV2ZW4KICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heQogICAgICAvLyBoYXZlIG11dGF0ZWQuCiAgICAgIGlzT2JqZWN0KHZhbHVlKSB8fAogICAgICB0aGlzLmRlZXAKICAgICkgewogICAgICAvLyBzZXQgbmV3IHZhbHVlCiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgaWYgKHRoaXMudXNlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoImNhbGxiYWNrIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgfQogICAgfQogIH0KfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuCiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy4KICovCldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkgewogIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpOwogIHRoaXMuZGlydHkgPSBmYWxzZTsKfTsKCi8qKgogKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci4KICovCldhdGNoZXIucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIHRoaXMkMS5kZXBzW2ldLmRlcGVuZCgpOwogIH0KfTsKCi8qKgogKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC4KICovCldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogIGlmICh0aGlzLmFjdGl2ZSkgewogICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdAogICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdAogICAgLy8gaWYgdGhlIHZtIGlzIGJlaW5nIGRlc3Ryb3llZC4KICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkgewogICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpOwogICAgfQogICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogICAgd2hpbGUgKGktLSkgewogICAgICB0aGlzJDEuZGVwc1tpXS5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgfQp9OwoKLyogICovCgp2YXIgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uID0gewogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGdldDogbm9vcCwKICBzZXQ6IG5vb3AKfTsKCmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHsKICAgIHJldHVybiB0aGlzW3NvdXJjZUtleV1ba2V5XQogIH07CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHsKICAgIHRoaXNbc291cmNlS2V5XVtrZXldID0gdmFsOwogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pOwp9CgpmdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7CiAgdm0uX3dhdGNoZXJzID0gW107CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9uczsKICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9CiAgaWYgKG9wdHMubWV0aG9kcykgeyBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKTsgfQogIGlmIChvcHRzLmRhdGEpIHsKICAgIGluaXREYXRhKHZtKTsKICB9IGVsc2UgewogICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pOwogIH0KICBpZiAob3B0cy5jb21wdXRlZCkgeyBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpOyB9CiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHsKICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7CiAgfQp9CgpmdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHsKICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9OwogIHZhciBwcm9wcyA9IHZtLl9wcm9wcyA9IHt9OwogIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5CiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uCiAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBbXTsKICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7CiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkCiAgaWYgKCFpc1Jvb3QpIHsKICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7CiAgfQogIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICBrZXlzLnB1c2goa2V5KTsKICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7CiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwogICAgewogICAgICB2YXIgaHlwaGVuYXRlZEtleSA9IGh5cGhlbmF0ZShrZXkpOwogICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShoeXBoZW5hdGVkS2V5KSB8fAogICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiXCIiICsgaHlwaGVuYXRlZEtleSArICJcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuIiksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgZGVmaW5lUmVhY3RpdmUocHJvcHMsIGtleSwgdmFsdWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodm0uJHBhcmVudCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlICIgKwogICAgICAgICAgICAib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgIiArCiAgICAgICAgICAgICJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcIiIgKyBrZXkgKyAiXCIiLAogICAgICAgICAgICB2bQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZQogICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXQKICAgIC8vIGluc3RhbnRpYXRpb24gaGVyZS4KICAgIGlmICghKGtleSBpbiB2bSkpIHsKICAgICAgcHJveHkodm0sICJfcHJvcHMiLCBrZXkpOwogICAgfQogIH07CgogIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApOwogIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKfQoKZnVuY3Rpb24gaW5pdERhdGEgKHZtKSB7CiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhOwogIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nCiAgICA/IGdldERhdGEoZGF0YSwgdm0pCiAgICA6IGRhdGEgfHwge307CiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7CiAgICBkYXRhID0ge307CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ2RhdGEgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0OlxuJyArCiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLAogICAgICB2bQogICAgKTsKICB9CiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgdmFyIG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzOwogIHZhciBpID0ga2V5cy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICB7CiAgICAgIGlmIChtZXRob2RzICYmIGhhc093bihtZXRob2RzLCBrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiTWV0aG9kIFwiIiArIGtleSArICJcIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBkYXRhIHByb3BlcnR5LiIpLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBpZiAocHJvcHMgJiYgaGFzT3duKHByb3BzLCBrZXkpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJUaGUgZGF0YSBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuICIgKwogICAgICAgICJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuIiwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgIHByb3h5KHZtLCAiX2RhdGEiLCBrZXkpOwogICAgfQogIH0KICAvLyBvYnNlcnZlIGRhdGEKICBvYnNlcnZlKGRhdGEsIHRydWUgLyogYXNSb290RGF0YSAqLyk7Cn0KCmZ1bmN0aW9uIGdldERhdGEgKGRhdGEsIHZtKSB7CiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVycwogIHB1c2hUYXJnZXQoKTsKICB0cnkgewogICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pCiAgfSBjYXRjaCAoZSkgewogICAgaGFuZGxlRXJyb3IoZSwgdm0sICJkYXRhKCkiKTsKICAgIHJldHVybiB7fQogIH0gZmluYWxseSB7CiAgICBwb3BUYXJnZXQoKTsKICB9Cn0KCnZhciBjb21wdXRlZFdhdGNoZXJPcHRpb25zID0geyBsYXp5OiB0cnVlIH07CgpmdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkgewogIC8vICRmbG93LWRpc2FibGUtbGluZQogIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUgogIHZhciBpc1NTUiA9IGlzU2VydmVyUmVuZGVyaW5nKCk7CgogIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkgewogICAgdmFyIHVzZXJEZWYgPSBjb21wdXRlZFtrZXldOwogICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0OwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBnZXR0ZXIgPT0gbnVsbCkgewogICAgICB3YXJuKAogICAgICAgICgiR2V0dGVyIGlzIG1pc3NpbmcgZm9yIGNvbXB1dGVkIHByb3BlcnR5IFwiIiArIGtleSArICJcIi4iKSwKICAgICAgICB2bQogICAgICApOwogICAgfQoKICAgIGlmICghaXNTU1IpIHsKICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKAogICAgICAgIHZtLAogICAgICAgIGdldHRlciB8fCBub29wLAogICAgICAgIG5vb3AsCiAgICAgICAgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucwogICAgICApOwogICAgfQoKICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGUKICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkCiAgICAvLyBhdCBpbnN0YW50aWF0aW9uIGhlcmUuCiAgICBpZiAoIShrZXkgaW4gdm0pKSB7CiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkgewogICAgICAgIHdhcm4oKCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLiIpLCB2bSk7CiAgICAgIH0gZWxzZSBpZiAodm0uJG9wdGlvbnMucHJvcHMgJiYga2V5IGluIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICAgICAgd2FybigoIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC4iKSwgdm0pOwogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBkZWZpbmVDb21wdXRlZCAoCiAgdGFyZ2V0LAogIGtleSwKICB1c2VyRGVmCikgewogIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpOwogIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlCiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KQogICAgICA6IHVzZXJEZWY7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDsKICB9IGVsc2UgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHVzZXJEZWYuZ2V0CiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2UKICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSkKICAgICAgICA6IHVzZXJEZWYuZ2V0CiAgICAgIDogbm9vcDsKICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldAogICAgICA/IHVzZXJEZWYuc2V0CiAgICAgIDogbm9vcDsKICB9CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICB3YXJuKAogICAgICAgICgiQ29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIHdhcyBhc3NpZ25lZCB0byBidXQgaXQgaGFzIG5vIHNldHRlci4iKSwKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbik7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXB1dGVkR2V0dGVyIChrZXkpIHsKICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkgewogICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTsKICAgIGlmICh3YXRjaGVyKSB7CiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7CiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpOwogICAgICB9CiAgICAgIGlmIChEZXAudGFyZ2V0KSB7CiAgICAgICAgd2F0Y2hlci5kZXBlbmQoKTsKICAgICAgfQogICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZQogICAgfQogIH0KfQoKZnVuY3Rpb24gaW5pdE1ldGhvZHMgKHZtLCBtZXRob2RzKSB7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHsKICAgIHsKICAgICAgaWYgKG1ldGhvZHNba2V5XSA9PSBudWxsKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiAiICsKICAgICAgICAgICJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAoIk1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgcHJvcC4iKSwKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuICIgKwogICAgICAgICAgIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pOwogIH0KfQoKZnVuY3Rpb24gaW5pdFdhdGNoICh2bSwgd2F0Y2gpIHsKICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHsKICAgIHZhciBoYW5kbGVyID0gd2F0Y2hba2V5XTsKICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykgewogICAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcltpXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcik7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGhhbmRsZXIsCiAgb3B0aW9ucwopIHsKICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkgewogICAgb3B0aW9ucyA9IGhhbmRsZXI7CiAgICBoYW5kbGVyID0gaGFuZGxlci5oYW5kbGVyOwogIH0KICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7CiAgICBoYW5kbGVyID0gdm1baGFuZGxlcl07CiAgfQogIHJldHVybiB2bS4kd2F0Y2goZXhwT3JGbiwgaGFuZGxlciwgb3B0aW9ucykKfQoKZnVuY3Rpb24gc3RhdGVNaXhpbiAoVnVlKSB7CiAgLy8gZmxvdyBzb21laG93IGhhcyBwcm9ibGVtcyB3aXRoIGRpcmVjdGx5IGRlY2xhcmVkIGRlZmluaXRpb24gb2JqZWN0CiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwCiAgLy8gdGhlIG9iamVjdCBoZXJlLgogIHZhciBkYXRhRGVmID0ge307CiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07CiAgdmFyIHByb3BzRGVmID0ge307CiAgcHJvcHNEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHJvcHMgfTsKICB7CiAgICBkYXRhRGVmLnNldCA9IGZ1bmN0aW9uIChuZXdEYXRhKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICsKICAgICAgICAnVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4nLAogICAgICAgIHRoaXMKICAgICAgKTsKICAgIH07CiAgICBwcm9wc0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHdhcm4oIiRwcm9wcyBpcyByZWFkb25seS4iLCB0aGlzKTsKICAgIH07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGRhdGEnLCBkYXRhRGVmKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTsKCiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0OwogIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDsKCiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoCiAgICBleHBPckZuLAogICAgY2IsCiAgICBvcHRpb25zCiAgKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKGlzUGxhaW5PYmplY3QoY2IpKSB7CiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucykKICAgIH0KICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy51c2VyID0gdHJ1ZTsKICAgIHZhciB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKTsKICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZSkgewogICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiB1bndhdGNoRm4gKCkgewogICAgICB3YXRjaGVyLnRlYXJkb3duKCk7CiAgICB9CiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0UHJvdmlkZSAodm0pIHsKICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7CiAgaWYgKHByb3ZpZGUpIHsKICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nCiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKQogICAgICA6IHByb3ZpZGU7CiAgfQp9CgpmdW5jdGlvbiBpbml0SW5qZWN0aW9ucyAodm0pIHsKICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTsKICBpZiAocmVzdWx0KSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgICAgewogICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSAiICsKICAgICAgICAgICAgIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXCIiICsga2V5ICsgIlwiIiwKICAgICAgICAgICAgdm0KICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkgewogIGlmIChpbmplY3QpIHsKICAgIC8vIGluamVjdCBpcyA6YW55IGJlY2F1c2UgZmxvdyBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgY2FjaGVkCiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBrZXlzID0gaGFzU3ltYm9sCiAgICAgID8gUmVmbGVjdC5vd25LZXlzKGluamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwogICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluamVjdCwga2V5KS5lbnVtZXJhYmxlCiAgICAgIH0pCiAgICAgIDogT2JqZWN0LmtleXMoaW5qZWN0KTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTsKICAgICAgdmFyIHNvdXJjZSA9IHZtOwogICAgICB3aGlsZSAoc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDsKICAgICAgfQogICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHsKICAgICAgICAgIHZhciBwcm92aWRlRGVmYXVsdCA9IGluamVjdFtrZXldLmRlZmF1bHQ7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pCiAgICAgICAgICAgIDogcHJvdmlkZURlZmF1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm4oKCJJbmplY3Rpb24gXCIiICsga2V5ICsgIlwiIG5vdCBmb3VuZCIpLCB2bSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLgogKi8KZnVuY3Rpb24gcmVuZGVyTGlzdCAoCiAgdmFsLAogIHJlbmRlcgopIHsKICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpOwogICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHsKICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpOwogICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBrZXkgPSBrZXlzW2ldOwogICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7CiAgICB9CiAgfQogIGlmIChpc0RlZihyZXQpKSB7CiAgICAocmV0KS5faXNWTGlzdCA9IHRydWU7CiAgfQogIHJldHVybiByZXQKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyA8c2xvdD4KICovCmZ1bmN0aW9uIHJlbmRlclNsb3QgKAogIG5hbWUsCiAgZmFsbGJhY2ssCiAgcHJvcHMsCiAgYmluZE9iamVjdAopIHsKICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07CiAgdmFyIG5vZGVzOwogIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3QKICAgIHByb3BzID0gcHJvcHMgfHwge307CiAgICBpZiAoYmluZE9iamVjdCkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc09iamVjdChiaW5kT2JqZWN0KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7CiAgICB9CiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7CiAgfSBlbHNlIHsKICAgIHZhciBzbG90Tm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXTsKICAgIC8vIHdhcm4gZHVwbGljYXRlIHNsb3QgdXNhZ2UKICAgIGlmIChzbG90Tm9kZXMpIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzbG90Tm9kZXMuX3JlbmRlcmVkKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcIiIgKyBuYW1lICsgIlwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlICIgKwogICAgICAgICAgIi0gdGhpcyB3aWxsIGxpa2VseSBjYXVzZSByZW5kZXIgZXJyb3JzLiIsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBzbG90Tm9kZXMuX3JlbmRlcmVkID0gdHJ1ZTsKICAgIH0KICAgIG5vZGVzID0gc2xvdE5vZGVzIHx8IGZhbGxiYWNrOwogIH0KCiAgdmFyIHRhcmdldCA9IHByb3BzICYmIHByb3BzLnNsb3Q7CiAgaWYgKHRhcmdldCkgewogICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpCiAgfSBlbHNlIHsKICAgIHJldHVybiBub2RlcwogIH0KfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzCiAqLwpmdW5jdGlvbiByZXNvbHZlRmlsdGVyIChpZCkgewogIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHkKfQoKLyogICovCgpmdW5jdGlvbiBpc0tleU5vdE1hdGNoIChleHBlY3QsIGFjdHVhbCkgewogIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHsKICAgIHJldHVybiBleHBlY3QuaW5kZXhPZihhY3R1YWwpID09PSAtMQogIH0gZWxzZSB7CiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWwKICB9Cn0KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgY2hlY2tpbmcga2V5Q29kZXMgZnJvbSBjb25maWcuCiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fawogKiBwYXNzaW5nIGluIGV2ZW50S2V5TmFtZSBhcyBsYXN0IGFyZ3VtZW50IHNlcGFyYXRlbHkgZm9yIGJhY2t3YXJkcyBjb21wYXQKICovCmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKAogIGV2ZW50S2V5Q29kZSwKICBrZXksCiAgYnVpbHRJbktleUNvZGUsCiAgZXZlbnRLZXlOYW1lLAogIGJ1aWx0SW5LZXlOYW1lCikgewogIHZhciBtYXBwZWRLZXlDb2RlID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbktleUNvZGU7CiAgaWYgKGJ1aWx0SW5LZXlOYW1lICYmIGV2ZW50S2V5TmFtZSAmJiAhY29uZmlnLmtleUNvZGVzW2tleV0pIHsKICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpCiAgfSBlbHNlIGlmIChtYXBwZWRLZXlDb2RlKSB7CiAgICByZXR1cm4gaXNLZXlOb3RNYXRjaChtYXBwZWRLZXlDb2RlLCBldmVudEtleUNvZGUpCiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHsKICAgIHJldHVybiBoeXBoZW5hdGUoZXZlbnRLZXlOYW1lKSAhPT0ga2V5CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgbWVyZ2luZyB2LWJpbmQ9Im9iamVjdCIgaW50byBhIFZOb2RlJ3MgZGF0YS4KICovCmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoCiAgZGF0YSwKICB0YWcsCiAgdmFsdWUsCiAgYXNQcm9wLAogIGlzU3luYwopIHsKICBpZiAodmFsdWUpIHsKICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICd2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCBvciBBcnJheSB2YWx1ZScsCiAgICAgICAgdGhpcwogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgdmFsdWUgPSB0b09iamVjdCh2YWx1ZSk7CiAgICAgIH0KICAgICAgdmFyIGhhc2g7CiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8CiAgICAgICAgICBrZXkgPT09ICdzdHlsZScgfHwKICAgICAgICAgIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUoa2V5KQogICAgICAgICkgewogICAgICAgICAgaGFzaCA9IGRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7CiAgICAgICAgICBoYXNoID0gYXNQcm9wIHx8IGNvbmZpZy5tdXN0VXNlUHJvcCh0YWcsIHR5cGUsIGtleSkKICAgICAgICAgICAgPyBkYXRhLmRvbVByb3BzIHx8IChkYXRhLmRvbVByb3BzID0ge30pCiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2V5IGluIGhhc2gpKSB7CiAgICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZVtrZXldOwoKICAgICAgICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgICAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICAgICAgICAgICAgb25bKCJ1cGRhdGU6IiArIGtleSldID0gZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuCiAqLwpmdW5jdGlvbiByZW5kZXJTdGF0aWMgKAogIGluZGV4LAogIGlzSW5Gb3IKKSB7CiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTsKICB2YXIgdHJlZSA9IGNhY2hlZFtpbmRleF07CiAgLy8gaWYgaGFzIGFscmVhZHktcmVuZGVyZWQgc3RhdGljIHRyZWUgYW5kIG5vdCBpbnNpZGUgdi1mb3IsCiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuCiAgaWYgKHRyZWUgJiYgIWlzSW5Gb3IpIHsKICAgIHJldHVybiB0cmVlCiAgfQogIC8vIG90aGVyd2lzZSwgcmVuZGVyIGEgZnJlc2ggdHJlZS4KICB0cmVlID0gY2FjaGVkW2luZGV4XSA9IHRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2luZGV4XS5jYWxsKAogICAgdGhpcy5fcmVuZGVyUHJveHksCiAgICBudWxsLAogICAgdGhpcyAvLyBmb3IgcmVuZGVyIGZucyBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9uYWwgY29tcG9uZW50IHRlbXBsYXRlcwogICk7CiAgbWFya1N0YXRpYyh0cmVlLCAoIl9fc3RhdGljX18iICsgaW5kZXgpLCBmYWxzZSk7CiAgcmV0dXJuIHRyZWUKfQoKLyoqCiAqIFJ1bnRpbWUgaGVscGVyIGZvciB2LW9uY2UuCiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LgogKi8KZnVuY3Rpb24gbWFya09uY2UgKAogIHRyZWUsCiAgaW5kZXgsCiAga2V5CikgewogIG1hcmtTdGF0aWModHJlZSwgKCJfX29uY2VfXyIgKyBpbmRleCArIChrZXkgPyAoIl8iICsga2V5KSA6ICIiKSksIHRydWUpOwogIHJldHVybiB0cmVlCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMgKAogIHRyZWUsCiAga2V5LAogIGlzT25jZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykgewogICAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWVbaV0sIChrZXkgKyAiXyIgKyBpKSwgaXNPbmNlKTsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBtYXJrU3RhdGljTm9kZSh0cmVlLCBrZXksIGlzT25jZSk7CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljTm9kZSAobm9kZSwga2V5LCBpc09uY2UpIHsKICBub2RlLmlzU3RhdGljID0gdHJ1ZTsKICBub2RlLmtleSA9IGtleTsKICBub2RlLmlzT25jZSA9IGlzT25jZTsKfQoKLyogICovCgpmdW5jdGlvbiBiaW5kT2JqZWN0TGlzdGVuZXJzIChkYXRhLCB2YWx1ZSkgewogIGlmICh2YWx1ZSkgewogICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJywKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICB2YXIgb24gPSBkYXRhLm9uID0gZGF0YS5vbiA/IGV4dGVuZCh7fSwgZGF0YS5vbikgOiB7fTsKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7CiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTsKICAgICAgICB2YXIgb3VycyA9IHZhbHVlW2tleV07CiAgICAgICAgb25ba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBvdXJzKSA6IG91cnM7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgpmdW5jdGlvbiBpbnN0YWxsUmVuZGVySGVscGVycyAodGFyZ2V0KSB7CiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7CiAgdGFyZ2V0Ll9uID0gdG9OdW1iZXI7CiAgdGFyZ2V0Ll9zID0gdG9TdHJpbmc7CiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDsKICB0YXJnZXQuX3QgPSByZW5kZXJTbG90OwogIHRhcmdldC5fcSA9IGxvb3NlRXF1YWw7CiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mOwogIHRhcmdldC5fbSA9IHJlbmRlclN0YXRpYzsKICB0YXJnZXQuX2YgPSByZXNvbHZlRmlsdGVyOwogIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7CiAgdGFyZ2V0Ll9iID0gYmluZE9iamVjdFByb3BzOwogIHRhcmdldC5fdiA9IGNyZWF0ZVRleHRWTm9kZTsKICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlOwogIHRhcmdldC5fdSA9IHJlc29sdmVTY29wZWRTbG90czsKICB0YXJnZXQuX2cgPSBiaW5kT2JqZWN0TGlzdGVuZXJzOwp9CgovKiAgKi8KCmZ1bmN0aW9uIEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0ICgKICBkYXRhLAogIHByb3BzLAogIGNoaWxkcmVuLAogIHBhcmVudCwKICBDdG9yCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIC8vIGVuc3VyZSB0aGUgY3JlYXRlRWxlbWVudCBmdW5jdGlvbiBpbiBmdW5jdGlvbmFsIGNvbXBvbmVudHMKICAvLyBnZXRzIGEgdW5pcXVlIGNvbnRleHQgLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBuYW1lZCBzbG90IGNoZWNrCiAgdmFyIGNvbnRleHRWbTsKICBpZiAoaGFzT3duKHBhcmVudCwgJ191aWQnKSkgewogICAgY29udGV4dFZtID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQpOwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBjb250ZXh0Vm0uX29yaWdpbmFsID0gcGFyZW50OwogIH0gZWxzZSB7CiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC4KICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYWJsZSB0byBnZXQgYSBob2xkIHRvIHRoZQogICAgLy8gcmVhbCBjb250ZXh0IGluc3RhbmNlLgogICAgY29udGV4dFZtID0gcGFyZW50OwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBwYXJlbnQgPSBwYXJlbnQuX29yaWdpbmFsOwogIH0KICB2YXIgaXNDb21waWxlZCA9IGlzVHJ1ZShvcHRpb25zLl9jb21waWxlZCk7CiAgdmFyIG5lZWROb3JtYWxpemF0aW9uID0gIWlzQ29tcGlsZWQ7CgogIHRoaXMuZGF0YSA9IGRhdGE7CiAgdGhpcy5wcm9wcyA9IHByb3BzOwogIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICB0aGlzLmxpc3RlbmVycyA9IGRhdGEub24gfHwgZW1wdHlPYmplY3Q7CiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTsKICB0aGlzLnNsb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpOyB9OwoKICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlCiAgaWYgKGlzQ29tcGlsZWQpIHsKICAgIC8vIGV4cG9zaW5nICRvcHRpb25zIGZvciByZW5kZXJTdGF0aWMoKQogICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAvLyBwcmUtcmVzb2x2ZSBzbG90cyBmb3IgcmVuZGVyU2xvdCgpCiAgICB0aGlzLiRzbG90cyA9IHRoaXMuc2xvdHMoKTsKICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gZGF0YS5zY29wZWRTbG90cyB8fCBlbXB0eU9iamVjdDsKICB9CgogIGlmIChvcHRpb25zLl9zY29wZUlkKSB7CiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsKICAgICAgdmFyIHZub2RlID0gY3JlYXRlRWxlbWVudChjb250ZXh0Vm0sIGEsIGIsIGMsIGQsIG5lZWROb3JtYWxpemF0aW9uKTsKICAgICAgaWYgKHZub2RlICYmICFBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7CiAgICAgICAgdm5vZGUuZm5Db250ZXh0ID0gcGFyZW50OwogICAgICB9CiAgICAgIHJldHVybiB2bm9kZQogICAgfTsKICB9IGVsc2UgewogICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9OwogIH0KfQoKaW5zdGFsbFJlbmRlckhlbHBlcnMoRnVuY3Rpb25hbFJlbmRlckNvbnRleHQucHJvdG90eXBlKTsKCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKAogIEN0b3IsCiAgcHJvcHNEYXRhLAogIGRhdGEsCiAgY29udGV4dFZtLAogIGNoaWxkcmVuCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIHZhciBwcm9wcyA9IHt9OwogIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKGlzRGVmKHByb3BPcHRpb25zKSkgewogICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7CiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YS5wcm9wcykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5wcm9wcyk7IH0KICB9CgogIHZhciByZW5kZXJDb250ZXh0ID0gbmV3IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0KAogICAgZGF0YSwKICAgIHByb3BzLAogICAgY2hpbGRyZW4sCiAgICBjb250ZXh0Vm0sCiAgICBDdG9yCiAgKTsKCiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTsKCiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucykKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICB2YXIgdm5vZGVzID0gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUpIHx8IFtdOwogICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc1tpXSA9IGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQodm5vZGVzW2ldLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucyk7CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0ICh2bm9kZSwgZGF0YSwgY29udGV4dFZtLCBvcHRpb25zKSB7CiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWQKICAvLyAoZS5nLiBpdCB3YXMgZnJvbSBhIGNhY2hlZCBub3JtYWwgc2xvdCkgdGhlIGZuQ29udGV4dCBjYXVzZXMgbmFtZWQgc2xvdHMKICAvLyB0aGF0IHNob3VsZCBub3QgYmUgbWF0Y2hlZCB0byBtYXRjaC4KICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTsKICBjbG9uZS5mbkNvbnRleHQgPSBjb250ZXh0Vm07CiAgY2xvbmUuZm5PcHRpb25zID0gb3B0aW9uczsKICBpZiAoZGF0YS5zbG90KSB7CiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDsKICB9CiAgcmV0dXJuIGNsb25lCn0KCmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRvLCBmcm9tKSB7CiAgZm9yICh2YXIga2V5IGluIGZyb20pIHsKICAgIHRvW2NhbWVsaXplKGtleSldID0gZnJvbVtrZXldOwogIH0KfQoKLyogICovCgoKCgovLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGhvb2sgdG8gd2VleCBuYXRpdmUgcmVuZGVyIGVuZ2luZS4KLy8gVGhlIGhvb2sgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgbmF0aXZlLCBub3QgamF2YXNjcmlwdC4KCgovLyBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHRvIHdlZXggbmF0aXZlIHJlbmRlciBlbmdpbmUuCgovKiAgKi8KCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYW5rczEwMTAwL3dlZXgtbmF0aXZlLWRpcmVjdGl2ZS90cmVlL21hc3Rlci9jb21wb25lbnQKCi8vIGxpc3RlbmluZyBvbiBuYXRpdmUgY2FsbGJhY2sKCi8qICAqLwoKLyogICovCgovLyBpbmxpbmUgaG9va3MgdG8gYmUgaW52b2tlZCBvbiBjb21wb25lbnQgVk5vZGVzIGR1cmluZyBwYXRjaAp2YXIgY29tcG9uZW50Vk5vZGVIb29rcyA9IHsKICBpbml0OiBmdW5jdGlvbiBpbml0ICgKICAgIHZub2RlLAogICAgaHlkcmF0aW5nLAogICAgcGFyZW50RWxtLAogICAgcmVmRWxtCiAgKSB7CiAgICBpZiAoCiAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmCiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiYKICAgICAgdm5vZGUuZGF0YS5rZWVwQWxpdmUKICAgICkgewogICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2gKICAgICAgdmFyIG1vdW50ZWROb2RlID0gdm5vZGU7IC8vIHdvcmsgYXJvdW5kIGZsb3cKICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKAogICAgICAgIHZub2RlLAogICAgICAgIGFjdGl2ZUluc3RhbmNlLAogICAgICAgIHBhcmVudEVsbSwKICAgICAgICByZWZFbG0KICAgICAgKTsKICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTsKICAgIH0KICB9LAoKICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkgewogICAgdmFyIG9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTsKICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KAogICAgICBjaGlsZCwKICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHMKICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzCiAgICAgIHZub2RlLCAvLyBuZXcgcGFyZW50IHZub2RlCiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuCiAgICApOwogIH0sCgogIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkgewogICAgdmFyIGNvbnRleHQgPSB2bm9kZS5jb250ZXh0OwogICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7CiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHsKICAgICAgY29tcG9uZW50SW5zdGFuY2UuX2lzTW91bnRlZCA9IHRydWU7CiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpOwogICAgfQogICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7CiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHsKICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTIKICAgICAgICAvLyBEdXJpbmcgdXBkYXRlcywgYSBrZXB0LWFsaXZlIGNvbXBvbmVudCdzIGNoaWxkIGNvbXBvbmVudHMgbWF5CiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzCiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbAogICAgICAgIC8vIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgd2hvbGUgcGF0Y2ggcHJvY2VzcyBlbmRlZC4KICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pOwogICAgICB9CiAgICB9CiAgfSwKCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHsKICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkgewogICAgICAgIGNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7CiAgICAgIH0KICAgIH0KICB9Cn07Cgp2YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7CgpmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKAogIEN0b3IsCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICBpZiAoaXNVbmRlZihDdG9yKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgYmFzZUN0b3IgPSBjb250ZXh0LiRvcHRpb25zLl9iYXNlOwoKICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3IKICBpZiAoaXNPYmplY3QoQ3RvcikpIHsKICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7CiAgfQoKICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksCiAgLy8gcmVqZWN0LgogIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJykgewogICAgewogICAgICB3YXJuKCgiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4KICB9CgogIC8vIGFzeW5jIGNvbXBvbmVudAogIHZhciBhc3luY0ZhY3Rvcnk7CiAgaWYgKGlzVW5kZWYoQ3Rvci5jaWQpKSB7CiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yOwogICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTsKICAgIGlmIChDdG9yID09PSB1bmRlZmluZWQpIHsKICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZAogICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS4KICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgYXN5bmMgc2VydmVyLXJlbmRlcmluZyBhbmQgaHlkcmF0aW9uLgogICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcigKICAgICAgICBhc3luY0ZhY3RvcnksCiAgICAgICAgZGF0YSwKICAgICAgICBjb250ZXh0LAogICAgICAgIGNoaWxkcmVuLAogICAgICAgIHRhZwogICAgICApCiAgICB9CiAgfQoKICBkYXRhID0gZGF0YSB8fCB7fTsKCiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlcgogIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvbgogIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvcik7CgogIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHMKICBpZiAoaXNEZWYoZGF0YS5tb2RlbCkpIHsKICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7CiAgfQoKICAvLyBleHRyYWN0IHByb3BzCiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTsKCiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnQKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkgewogICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoQ3RvciwgcHJvcHNEYXRhLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbikKICB9CgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzLCBzaW5jZSB0aGVzZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzCiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnMKICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjsKICAvLyByZXBsYWNlIHdpdGggbGlzdGVuZXJzIHdpdGggLm5hdGl2ZSBtb2RpZmllcgogIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLgogIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uOwoKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHsKICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmcKICAgIC8vIG90aGVyIHRoYW4gcHJvcHMgJiBsaXN0ZW5lcnMgJiBzbG90CgogICAgLy8gd29yayBhcm91bmQgZmxvdwogICAgdmFyIHNsb3QgPSBkYXRhLnNsb3Q7CiAgICBkYXRhID0ge307CiAgICBpZiAoc2xvdCkgewogICAgICBkYXRhLnNsb3QgPSBzbG90OwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlCiAgaW5zdGFsbENvbXBvbmVudEhvb2tzKGRhdGEpOwoKICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZQogIHZhciBuYW1lID0gQ3Rvci5vcHRpb25zLm5hbWUgfHwgdGFnOwogIHZhciB2bm9kZSA9IG5ldyBWTm9kZSgKICAgICgidnVlLWNvbXBvbmVudC0iICsgKEN0b3IuY2lkKSArIChuYW1lID8gKCItIiArIG5hbWUpIDogJycpKSwKICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHQsCiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LAogICAgYXN5bmNGYWN0b3J5CiAgKTsKCiAgLy8gV2VleCBzcGVjaWZpYzogaW52b2tlIHJlY3ljbGUtbGlzdCBvcHRpbWl6ZWQgQHJlbmRlciBmdW5jdGlvbiBmb3IKICAvLyBleHRyYWN0aW5nIGNlbGwtc2xvdCB0ZW1wbGF0ZS4KICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGFua3MxMDEwMC93ZWV4LW5hdGl2ZS1kaXJlY3RpdmUvdHJlZS9tYXN0ZXIvY29tcG9uZW50CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgcmV0dXJuIHZub2RlCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUgKAogIHZub2RlLCAvLyB3ZSBrbm93IGl0J3MgTW91bnRlZENvbXBvbmVudFZOb2RlIGJ1dCBmbG93IGRvZXNuJ3QKICBwYXJlbnQsIC8vIGFjdGl2ZUluc3RhbmNlIGluIGxpZmVjeWNsZSBzdGF0ZQogIHBhcmVudEVsbSwKICByZWZFbG0KKSB7CiAgdmFyIG9wdGlvbnMgPSB7CiAgICBfaXNDb21wb25lbnQ6IHRydWUsCiAgICBwYXJlbnQ6IHBhcmVudCwKICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsCiAgICBfcGFyZW50RWxtOiBwYXJlbnRFbG0gfHwgbnVsbCwKICAgIF9yZWZFbG06IHJlZkVsbSB8fCBudWxsCiAgfTsKICAvLyBjaGVjayBpbmxpbmUtdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9ucwogIHZhciBpbmxpbmVUZW1wbGF0ZSA9IHZub2RlLmRhdGEuaW5saW5lVGVtcGxhdGU7CiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkgewogICAgb3B0aW9ucy5yZW5kZXIgPSBpbmxpbmVUZW1wbGF0ZS5yZW5kZXI7CiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZuczsKICB9CiAgcmV0dXJuIG5ldyB2bm9kZS5jb21wb25lbnRPcHRpb25zLkN0b3Iob3B0aW9ucykKfQoKZnVuY3Rpb24gaW5zdGFsbENvbXBvbmVudEhvb2tzIChkYXRhKSB7CiAgdmFyIGhvb2tzID0gZGF0YS5ob29rIHx8IChkYXRhLmhvb2sgPSB7fSk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBob29rc1RvTWVyZ2VbaV07CiAgICBob29rc1trZXldID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldOwogIH0KfQoKLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50bwovLyBwcm9wIGFuZCBldmVudCBoYW5kbGVyIHJlc3BlY3RpdmVseS4KZnVuY3Rpb24gdHJhbnNmb3JtTW9kZWwgKG9wdGlvbnMsIGRhdGEpIHsKICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJzsKICB2YXIgZXZlbnQgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLmV2ZW50KSB8fCAnaW5wdXQnOyhkYXRhLnByb3BzIHx8IChkYXRhLnByb3BzID0ge30pKVtwcm9wXSA9IGRhdGEubW9kZWwudmFsdWU7CiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICBpZiAoaXNEZWYob25bZXZlbnRdKSkgewogICAgb25bZXZlbnRdID0gW2RhdGEubW9kZWwuY2FsbGJhY2tdLmNvbmNhdChvbltldmVudF0pOwogIH0gZWxzZSB7CiAgICBvbltldmVudF0gPSBkYXRhLm1vZGVsLmNhbGxiYWNrOwogIH0KfQoKLyogICovCgp2YXIgU0lNUExFX05PUk1BTElaRSA9IDE7CnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjsKCi8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHByb3ZpZGluZyBhIG1vcmUgZmxleGlibGUgaW50ZXJmYWNlCi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvdwpmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlLAogIGFsd2F5c05vcm1hbGl6ZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gZGF0YTsKICAgIGRhdGEgPSB1bmRlZmluZWQ7CiAgfQogIGlmIChpc1RydWUoYWx3YXlzTm9ybWFsaXplKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFOwogIH0KICByZXR1cm4gX2NyZWF0ZUVsZW1lbnQoY29udGV4dCwgdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUpCn0KCmZ1bmN0aW9uIF9jcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlCikgewogIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICJBdm9pZCB1c2luZyBvYnNlcnZlZCBkYXRhIG9iamVjdCBhcyB2bm9kZSBkYXRhOiAiICsgKEpTT04uc3RyaW5naWZ5KGRhdGEpKSArICJcbiIgKwogICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJywKICAgICAgY29udGV4dAogICAgKTsKICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKCkKICB9CiAgLy8gb2JqZWN0IHN5bnRheCBpbiB2LWJpbmQKICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHsKICAgIHRhZyA9IGRhdGEuaXM7CiAgfQogIGlmICghdGFnKSB7CiAgICAvLyBpbiBjYXNlIG9mIGNvbXBvbmVudCA6aXMgc2V0IHRvIGZhbHN5IHZhbHVlCiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQogIC8vIHdhcm4gYWdhaW5zdCBub24tcHJpbWl0aXZlIGtleQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIGlzRGVmKGRhdGEpICYmIGlzRGVmKGRhdGEua2V5KSAmJiAhaXNQcmltaXRpdmUoZGF0YS5rZXkpCiAgKSB7CiAgICB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCAnICsKICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLAogICAgICAgIGNvbnRleHQKICAgICAgKTsKICAgIH0KICB9CiAgLy8gc3VwcG9ydCBzaW5nbGUgZnVuY3Rpb24gY2hpbGRyZW4gYXMgZGVmYXVsdCBzY29wZWQgc2xvdAogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJgogICAgdHlwZW9mIGNoaWxkcmVuWzBdID09PSAnZnVuY3Rpb24nCiAgKSB7CiAgICBkYXRhID0gZGF0YSB8fCB7fTsKICAgIGRhdGEuc2NvcGVkU2xvdHMgPSB7IGRlZmF1bHQ6IGNoaWxkcmVuWzBdIH07CiAgICBjaGlsZHJlbi5sZW5ndGggPSAwOwogIH0KICBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IEFMV0FZU19OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gbm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0KICB2YXIgdm5vZGUsIG5zOwogIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJykgewogICAgdmFyIEN0b3I7CiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpOwogICAgaWYgKGNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHMKICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHRhZyksIGRhdGEsIGNoaWxkcmVuLAogICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0CiAgICAgICk7CiAgICB9IGVsc2UgaWYgKGlzRGVmKEN0b3IgPSByZXNvbHZlQXNzZXQoY29udGV4dC4kb3B0aW9ucywgJ2NvbXBvbmVudHMnLCB0YWcpKSkgewogICAgICAvLyBjb21wb25lbnQKICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7CiAgICB9IGVsc2UgewogICAgICAvLyB1bmtub3duIG9yIHVubGlzdGVkIG5hbWVzcGFjZWQgZWxlbWVudHMKICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHMKICAgICAgLy8gcGFyZW50IG5vcm1hbGl6ZXMgY2hpbGRyZW4KICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbiwKICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dAogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBkaXJlY3QgY29tcG9uZW50IG9wdGlvbnMgLyBjb25zdHJ1Y3RvcgogICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7CiAgfQogIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgcmV0dXJuIHZub2RlCiAgfSBlbHNlIGlmIChpc0RlZih2bm9kZSkpIHsKICAgIGlmIChpc0RlZihucykpIHsgYXBwbHlOUyh2bm9kZSwgbnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH0KICAgIHJldHVybiB2bm9kZQogIH0gZWxzZSB7CiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQp9CgpmdW5jdGlvbiBhcHBseU5TICh2bm9kZSwgbnMsIGZvcmNlKSB7CiAgdm5vZGUubnMgPSBuczsKICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHsKICAgIC8vIHVzZSBkZWZhdWx0IG5hbWVzcGFjZSBpbnNpZGUgZm9yZWlnbk9iamVjdAogICAgbnMgPSB1bmRlZmluZWQ7CiAgICBmb3JjZSA9IHRydWU7CiAgfQogIGlmIChpc0RlZih2bm9kZS5jaGlsZHJlbikpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoY2hpbGQudGFnKSAmJiAoCiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7CiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMsIGZvcmNlKTsKICAgICAgfQogICAgfQogIH0KfQoKLy8gcmVmICM1MzE4Ci8vIG5lY2Vzc2FyeSB0byBlbnN1cmUgcGFyZW50IHJlLXJlbmRlciB3aGVuIGRlZXAgYmluZGluZ3MgbGlrZSA6c3R5bGUgYW5kCi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzCmZ1bmN0aW9uIHJlZ2lzdGVyRGVlcEJpbmRpbmdzIChkYXRhKSB7CiAgaWYgKGlzT2JqZWN0KGRhdGEuc3R5bGUpKSB7CiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTsKICB9CiAgaWYgKGlzT2JqZWN0KGRhdGEuY2xhc3MpKSB7CiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHsKICB2bS5fdm5vZGUgPSBudWxsOyAvLyB0aGUgcm9vdCBvZiB0aGUgY2hpbGQgdHJlZQogIHZtLl9zdGF0aWNUcmVlcyA9IG51bGw7IC8vIHYtb25jZSBjYWNoZWQgdHJlZXMKICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogIHZhciBwYXJlbnRWbm9kZSA9IHZtLiR2bm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZQogIHZhciByZW5kZXJDb250ZXh0ID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuY29udGV4dDsKICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpOwogIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0OwogIC8vIGJpbmQgdGhlIGNyZWF0ZUVsZW1lbnQgZm4gdG8gdGhpcyBpbnN0YW5jZQogIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuCiAgLy8gYXJncyBvcmRlcjogdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUsIGFsd2F5c05vcm1hbGl6ZQogIC8vIGludGVybmFsIHZlcnNpb24gaXMgdXNlZCBieSByZW5kZXIgZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gdGVtcGxhdGVzCiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9OwogIC8vIG5vcm1hbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgZm9yIHRoZSBwdWJsaWMgdmVyc2lvbiwgdXNlZCBpbgogIC8vIHVzZXItd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zLgogIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9OwoKICAvLyAkYXR0cnMgJiAkbGlzdGVuZXJzIGFyZSBleHBvc2VkIGZvciBlYXNpZXIgSE9DIGNyZWF0aW9uLgogIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWQKICB2YXIgcGFyZW50RGF0YSA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmRhdGE7CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgewogICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkYXR0cnMgaXMgcmVhZG9ubHkuIiwgdm0pOwogICAgfSwgdHJ1ZSk7CiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LiIsIHZtKTsKICAgIH0sIHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVuZGVyTWl4aW4gKFZ1ZSkgewogIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzCiAgaW5zdGFsbFJlbmRlckhlbHBlcnMoVnVlLnByb3RvdHlwZSk7CgogIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpCiAgfTsKCiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHZtID0gdGhpczsKICAgIHZhciByZWYgPSB2bS4kb3B0aW9uczsKICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyOwogICAgdmFyIF9wYXJlbnRWbm9kZSA9IHJlZi5fcGFyZW50Vm5vZGU7CgogICAgLy8gcmVzZXQgX3JlbmRlcmVkIGZsYWcgb24gc2xvdHMgZm9yIGR1cGxpY2F0ZSBzbG90IGNoZWNrCiAgICB7CiAgICAgIGZvciAodmFyIGtleSBpbiB2bS4kc2xvdHMpIHsKICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgICB2bS4kc2xvdHNba2V5XS5fcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChfcGFyZW50Vm5vZGUpIHsKICAgICAgdm0uJHNjb3BlZFNsb3RzID0gX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMgfHwgZW1wdHlPYmplY3Q7CiAgICB9CgogICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2VzcwogICAgLy8gdG8gdGhlIGRhdGEgb24gdGhlIHBsYWNlaG9sZGVyIG5vZGUuCiAgICB2bS4kdm5vZGUgPSBfcGFyZW50Vm5vZGU7CiAgICAvLyByZW5kZXIgc2VsZgogICAgdmFyIHZub2RlOwogICAgdHJ5IHsKICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXIiKTsKICAgICAgLy8gcmV0dXJuIGVycm9yIHJlbmRlciByZXN1bHQsCiAgICAgIC8vIG9yIHByZXZpb3VzIHZub2RlIHRvIHByZXZlbnQgcmVuZGVyIGVycm9yIGNhdXNpbmcgYmxhbmsgY29tcG9uZW50CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgICAgIHsKICAgICAgICBpZiAodm0uJG9wdGlvbnMucmVuZGVyRXJyb3IpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXJFcnJvciIpOwogICAgICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGUgPSB2bS5fdm5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0CiAgICBpZiAoISh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdNdWx0aXBsZSByb290IG5vZGVzIHJldHVybmVkIGZyb20gcmVuZGVyIGZ1bmN0aW9uLiBSZW5kZXIgZnVuY3Rpb24gJyArCiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICB2bm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICAgIH0KICAgIC8vIHNldCBwYXJlbnQKICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTsKICAgIHJldHVybiB2bm9kZQogIH07Cn0KCi8qICAqLwoKdmFyIHVpZCQzID0gMDsKCmZ1bmN0aW9uIGluaXRNaXhpbiAoVnVlKSB7CiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgLy8gYSB1aWQKICAgIHZtLl91aWQgPSB1aWQkMysrOwoKICAgIHZhciBzdGFydFRhZywgZW5kVGFnOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgIHN0YXJ0VGFnID0gInZ1ZS1wZXJmLXN0YXJ0OiIgKyAodm0uX3VpZCk7CiAgICAgIGVuZFRhZyA9ICJ2dWUtcGVyZi1lbmQ6IiArICh2bS5fdWlkKTsKICAgICAgbWFyayhzdGFydFRhZyk7CiAgICB9CgogICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWQKICAgIHZtLl9pc1Z1ZSA9IHRydWU7CiAgICAvLyBtZXJnZSBvcHRpb25zCiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkgewogICAgICAvLyBvcHRpbWl6ZSBpbnRlcm5hbCBjb21wb25lbnQgaW5zdGFudGlhdGlvbgogICAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlCiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LgogICAgICBpbml0SW50ZXJuYWxDb21wb25lbnQodm0sIG9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyh2bS5jb25zdHJ1Y3RvciksCiAgICAgICAgb3B0aW9ucyB8fCB7fSwKICAgICAgICB2bQogICAgICApOwogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIHsKICAgICAgaW5pdFByb3h5KHZtKTsKICAgIH0KICAgIC8vIGV4cG9zZSByZWFsIHNlbGYKICAgIHZtLl9zZWxmID0gdm07CiAgICBpbml0TGlmZWN5Y2xlKHZtKTsKICAgIGluaXRFdmVudHModm0pOwogICAgaW5pdFJlbmRlcih2bSk7CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZUNyZWF0ZScpOwogICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHMKICAgIGluaXRTdGF0ZSh2bSk7CiAgICBpbml0UHJvdmlkZSh2bSk7IC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzCiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHsKICAgICAgdm0uX25hbWUgPSBmb3JtYXRDb21wb25lbnROYW1lKHZtLCBmYWxzZSk7CiAgICAgIG1hcmsoZW5kVGFnKTsKICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHZtLl9uYW1lKSArICIgaW5pdCIpLCBzdGFydFRhZywgZW5kVGFnKTsKICAgIH0KCiAgICBpZiAodm0uJG9wdGlvbnMuZWwpIHsKICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBpbml0SW50ZXJuYWxDb21wb25lbnQgKHZtLCBvcHRpb25zKSB7CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7CiAgLy8gZG9pbmcgdGhpcyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZHluYW1pYyBlbnVtZXJhdGlvbi4KICB2YXIgcGFyZW50Vm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsKICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIG9wdHMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7CiAgb3B0cy5fcGFyZW50RWxtID0gb3B0aW9ucy5fcGFyZW50RWxtOwogIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTsKCiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgb3B0cy5wcm9wc0RhdGEgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhOwogIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7CiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47CiAgb3B0cy5fY29tcG9uZW50VGFnID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZzsKCiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7CiAgICBvcHRzLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyOwogICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuczsKICB9Cn0KCmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHsKICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9uczsKICBpZiAoQ3Rvci5zdXBlcikgewogICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7CiAgICB2YXIgY2FjaGVkU3VwZXJPcHRpb25zID0gQ3Rvci5zdXBlck9wdGlvbnM7CiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHsKICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsCiAgICAgIC8vIG5lZWQgdG8gcmVzb2x2ZSBuZXcgb3B0aW9ucy4KICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7CiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NikKICAgICAgdmFyIG1vZGlmaWVkT3B0aW9ucyA9IHJlc29sdmVNb2RpZmllZE9wdGlvbnMoQ3Rvcik7CiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zCiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHsKICAgICAgICBleHRlbmQoQ3Rvci5leHRlbmRPcHRpb25zLCBtb2RpZmllZE9wdGlvbnMpOwogICAgICB9CiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpOwogICAgICBpZiAob3B0aW9ucy5uYW1lKSB7CiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBvcHRpb25zCn0KCmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHsKICB2YXIgbW9kaWZpZWQ7CiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9uczsKICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7CiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9uczsKICBmb3IgKHZhciBrZXkgaW4gbGF0ZXN0KSB7CiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7CiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfQogICAgICBtb2RpZmllZFtrZXldID0gZGVkdXBlKGxhdGVzdFtrZXldLCBleHRlbmRlZFtrZXldLCBzZWFsZWRba2V5XSk7CiAgICB9CiAgfQogIHJldHVybiBtb2RpZmllZAp9CgpmdW5jdGlvbiBkZWR1cGUgKGxhdGVzdCwgZXh0ZW5kZWQsIHNlYWxlZCkgewogIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkCiAgLy8gYmV0d2VlbiBtZXJnZXMKICBpZiAoQXJyYXkuaXNBcnJheShsYXRlc3QpKSB7CiAgICB2YXIgcmVzID0gW107CiAgICBzZWFsZWQgPSBBcnJheS5pc0FycmF5KHNlYWxlZCkgPyBzZWFsZWQgOiBbc2VhbGVkXTsKICAgIGV4dGVuZGVkID0gQXJyYXkuaXNBcnJheShleHRlbmRlZCkgPyBleHRlbmRlZCA6IFtleHRlbmRlZF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykgewogICAgICAvLyBwdXNoIG9yaWdpbmFsIG9wdGlvbnMgYW5kIG5vdCBzZWFsZWQgb3B0aW9ucyB0byBleGNsdWRlIGR1cGxpY2F0ZWQgb3B0aW9ucwogICAgICBpZiAoZXh0ZW5kZWQuaW5kZXhPZihsYXRlc3RbaV0pID49IDAgfHwgc2VhbGVkLmluZGV4T2YobGF0ZXN0W2ldKSA8IDApIHsKICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfSBlbHNlIHsKICAgIHJldHVybiBsYXRlc3QKICB9Cn0KCmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSkKICApIHsKICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTsKICB9CiAgdGhpcy5faW5pdChvcHRpb25zKTsKfQoKaW5pdE1peGluKFZ1ZSk7CnN0YXRlTWl4aW4oVnVlKTsKZXZlbnRzTWl4aW4oVnVlKTsKbGlmZWN5Y2xlTWl4aW4oVnVlKTsKcmVuZGVyTWl4aW4oVnVlKTsKCi8qICAqLwoKZnVuY3Rpb24gaW5pdFVzZSAoVnVlKSB7CiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHsKICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpOwogICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID4gLTEpIHsKICAgICAgcmV0dXJuIHRoaXMKICAgIH0KCiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgYXJncy51bnNoaWZ0KHRoaXMpOwogICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTsKICAgIH0KICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChwbHVnaW4pOwogICAgcmV0dXJuIHRoaXMKICB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHsKICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHsKICAgIHRoaXMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG1peGluKTsKICAgIHJldHVybiB0aGlzCiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHsKICAvKioKICAgKiBFYWNoIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgVnVlLCBoYXMgYSB1bmlxdWUKICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCAiY2hpbGQKICAgKiBjb25zdHJ1Y3RvcnMiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLgogICAqLwogIFZ1ZS5jaWQgPSAwOwogIHZhciBjaWQgPSAxOwoKICAvKioKICAgKiBDbGFzcyBpbmhlcml0YW5jZQogICAqLwogIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbiAoZXh0ZW5kT3B0aW9ucykgewogICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307CiAgICB2YXIgU3VwZXIgPSB0aGlzOwogICAgdmFyIFN1cGVySWQgPSBTdXBlci5jaWQ7CiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pOwogICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7CiAgICAgIHJldHVybiBjYWNoZWRDdG9yc1tTdXBlcklkXQogICAgfQoKICAgIHZhciBuYW1lID0gZXh0ZW5kT3B0aW9ucy5uYW1lIHx8IFN1cGVyLm9wdGlvbnMubmFtZTsKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkgewogICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSk7CiAgICB9CgogICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFZ1ZUNvbXBvbmVudCAob3B0aW9ucykgewogICAgICB0aGlzLl9pbml0KG9wdGlvbnMpOwogICAgfTsKICAgIFN1Yi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSk7CiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViOwogICAgU3ViLmNpZCA9IGNpZCsrOwogICAgU3ViLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgIFN1cGVyLm9wdGlvbnMsCiAgICAgIGV4dGVuZE9wdGlvbnMKICAgICk7CiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjsKCiAgICAvLyBGb3IgcHJvcHMgYW5kIGNvbXB1dGVkIHByb3BlcnRpZXMsIHdlIGRlZmluZSB0aGUgcHJveHkgZ2V0dGVycyBvbgogICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXMKICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC4KICAgIGlmIChTdWIub3B0aW9ucy5wcm9wcykgewogICAgICBpbml0UHJvcHMkMShTdWIpOwogICAgfQogICAgaWYgKFN1Yi5vcHRpb25zLmNvbXB1dGVkKSB7CiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7CiAgICB9CgogICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlCiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kOwogICAgU3ViLm1peGluID0gU3VwZXIubWl4aW47CiAgICBTdWIudXNlID0gU3VwZXIudXNlOwoKICAgIC8vIGNyZWF0ZSBhc3NldCByZWdpc3RlcnMsIHNvIGV4dGVuZGVkIGNsYXNzZXMKICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby4KICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgU3ViW3R5cGVdID0gU3VwZXJbdHlwZV07CiAgICB9KTsKICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXAKICAgIGlmIChuYW1lKSB7CiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7CiAgICB9CgogICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS4KICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlCiAgICAvLyBiZWVuIHVwZGF0ZWQuCiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9uczsKICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9uczsKICAgIFN1Yi5zZWFsZWRPcHRpb25zID0gZXh0ZW5kKHt9LCBTdWIub3B0aW9ucyk7CgogICAgLy8gY2FjaGUgY29uc3RydWN0b3IKICAgIGNhY2hlZEN0b3JzW1N1cGVySWRdID0gU3ViOwogICAgcmV0dXJuIFN1YgogIH07Cn0KCmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7CiAgdmFyIHByb3BzID0gQ29tcC5vcHRpb25zLnByb3BzOwogIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgcHJveHkoQ29tcC5wcm90b3R5cGUsICJfcHJvcHMiLCBrZXkpOwogIH0KfQoKZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHsKICB2YXIgY29tcHV0ZWQgPSBDb21wLm9wdGlvbnMuY29tcHV0ZWQ7CiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7CiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHsKICAvKioKICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuCiAgICovCiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKAogICAgICBpZCwKICAgICAgZGVmaW5pdGlvbgogICAgKSB7CiAgICAgIGlmICghZGVmaW5pdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50JykgewogICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHsKICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDsKICAgICAgICAgIGRlZmluaXRpb24gPSB0aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKGRlZmluaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGRlZmluaXRpb24gPSB7IGJpbmQ6IGRlZmluaXRpb24sIHVwZGF0ZTogZGVmaW5pdGlvbiB9OwogICAgICAgIH0KICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjsKICAgICAgICByZXR1cm4gZGVmaW5pdGlvbgogICAgICB9CiAgICB9OwogIH0pOwp9CgovKiAgKi8KCmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHsKICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZykKfQoKZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkgewogIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgcmV0dXJuIGZhbHNlCn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHsKICB2YXIgY2FjaGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5jYWNoZTsKICB2YXIga2V5cyA9IGtlZXBBbGl2ZUluc3RhbmNlLmtleXM7CiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTsKICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpIHsKICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTsKICAgIGlmIChjYWNoZWROb2RlKSB7CiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjYWNoZWROb2RlLmNvbXBvbmVudE9wdGlvbnMpOwogICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7CiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoCiAgY2FjaGUsCiAga2V5LAogIGtleXMsCiAgY3VycmVudAopIHsKICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTsKICBpZiAoY2FjaGVkJCQxICYmICghY3VycmVudCB8fCBjYWNoZWQkJDEudGFnICE9PSBjdXJyZW50LnRhZykpIHsKICAgIGNhY2hlZCQkMS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpOwogIH0KICBjYWNoZVtrZXldID0gbnVsbDsKICByZW1vdmUoa2V5cywga2V5KTsKfQoKdmFyIHBhdHRlcm5UeXBlcyA9IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldOwoKdmFyIEtlZXBBbGl2ZSA9IHsKICBuYW1lOiAna2VlcC1hbGl2ZScsCiAgYWJzdHJhY3Q6IHRydWUsCgogIHByb3BzOiB7CiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl0KICB9LAoKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHsKICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5rZXlzID0gW107CiAgfSwKCiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQgKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgZm9yICh2YXIga2V5IGluIHRoaXMkMS5jYWNoZSkgewogICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlLCBrZXksIHRoaXMkMS5rZXlzKTsKICAgIH0KICB9LAoKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7CiAgICB9KTsKICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICFtYXRjaGVzKHZhbCwgbmFtZSk7IH0pOwogICAgfSk7CiAgfSwKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkgewogICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0OwogICAgdmFyIHZub2RlID0gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChzbG90KTsKICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9uczsKICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7CiAgICAgIC8vIGNoZWNrIHBhdHRlcm4KICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpOwogICAgICB2YXIgcmVmID0gdGhpczsKICAgICAgdmFyIGluY2x1ZGUgPSByZWYuaW5jbHVkZTsKICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTsKICAgICAgaWYgKAogICAgICAgIC8vIG5vdCBpbmNsdWRlZAogICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8CiAgICAgICAgLy8gZXhjbHVkZWQKICAgICAgICAoZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpCiAgICAgICkgewogICAgICAgIHJldHVybiB2bm9kZQogICAgICB9CgogICAgICB2YXIgcmVmJDEgPSB0aGlzOwogICAgICB2YXIgY2FjaGUgPSByZWYkMS5jYWNoZTsKICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGwKICAgICAgICAvLyBzYW1lIGNvbnN0cnVjdG9yIG1heSBnZXQgcmVnaXN0ZXJlZCBhcyBkaWZmZXJlbnQgbG9jYWwgY29tcG9uZW50cwogICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSkKICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoIjo6IiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpCiAgICAgICAgOiB2bm9kZS5rZXk7CiAgICAgIGlmIChjYWNoZVtrZXldKSB7CiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlOwogICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3QKICAgICAgICByZW1vdmUoa2V5cywga2V5KTsKICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYWNoZVtrZXldID0gdm5vZGU7CiAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5CiAgICAgICAgaWYgKHRoaXMubWF4ICYmIGtleXMubGVuZ3RoID4gcGFyc2VJbnQodGhpcy5tYXgpKSB7CiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKQogIH0KfQoKdmFyIGJ1aWx0SW5Db21wb25lbnRzID0gewogIEtlZXBBbGl2ZTogS2VlcEFsaXZlCn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7CiAgLy8gY29uZmlnCiAgdmFyIGNvbmZpZ0RlZiA9IHt9OwogIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07CiAgewogICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgd2FybigKICAgICAgICAnRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4nCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTsKCiAgLy8gZXhwb3NlZCB1dGlsIG1ldGhvZHMuCiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uCiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay4KICBWdWUudXRpbCA9IHsKICAgIHdhcm46IHdhcm4sCiAgICBleHRlbmQ6IGV4dGVuZCwKICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLAogICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlCiAgfTsKCiAgVnVlLnNldCA9IHNldDsKICBWdWUuZGVsZXRlID0gZGVsOwogIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrOwoKICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0pOwoKICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlICJiYXNlIiBjb25zdHJ1Y3RvciB0byBleHRlbmQgYWxsIHBsYWluLW9iamVjdAogIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLgogIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlOwoKICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpOwoKICBpbml0VXNlKFZ1ZSk7CiAgaW5pdE1peGluJDEoVnVlKTsKICBpbml0RXh0ZW5kKFZ1ZSk7CiAgaW5pdEFzc2V0UmVnaXN0ZXJzKFZ1ZSk7Cn0KCmluaXRHbG9iYWxBUEkoVnVlKTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywgewogIGdldDogaXNTZXJ2ZXJSZW5kZXJpbmcKfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRzc3JDb250ZXh0JywgewogIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICByZXR1cm4gdGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dAogIH0KfSk7CgovLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb24KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0JywgewogIHZhbHVlOiBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dAp9KTsKClZ1ZS52ZXJzaW9uID0gJzIuNS4xNyc7CgovKiAgKi8KCi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheQovLyBkdXJpbmcgdGVtcGxhdGUgY29tcGlsYXRpb24KdmFyIGlzUmVzZXJ2ZWRBdHRyID0gbWFrZU1hcCgnc3R5bGUsY2xhc3MnKTsKCi8vIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgdXNpbmcgcHJvcHMgZm9yIGJpbmRpbmcKdmFyIGFjY2VwdFZhbHVlID0gbWFrZU1hcCgnaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcycpOwp2YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7CiAgcmV0dXJuICgKICAgIChhdHRyID09PSAndmFsdWUnICYmIGFjY2VwdFZhbHVlKHRhZykpICYmIHR5cGUgIT09ICdidXR0b24nIHx8CiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fAogICAgKGF0dHIgPT09ICdjaGVja2VkJyAmJiB0YWcgPT09ICdpbnB1dCcpIHx8CiAgICAoYXR0ciA9PT0gJ211dGVkJyAmJiB0YWcgPT09ICd2aWRlbycpCiAgKQp9OwoKdmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTsKCnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcCgKICAnYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSwnICsKICAnZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLCcgKwogICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgKwogICdtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LCcgKwogICdyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLCcgKwogICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJwopOwoKdmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7Cgp2YXIgaXNYbGluayA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJwp9OwoKdmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIGlzWGxpbmsobmFtZSkgPyBuYW1lLnNsaWNlKDYsIG5hbWUubGVuZ3RoKSA6ICcnCn07Cgp2YXIgaXNGYWxzeUF0dHJWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsKICByZXR1cm4gdmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZQp9OwoKLyogICovCgpmdW5jdGlvbiBnZW5DbGFzc0ZvclZub2RlICh2bm9kZSkgewogIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlOwogIHZhciBjaGlsZE5vZGUgPSB2bm9kZTsKICB3aGlsZSAoaXNEZWYoY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlKSkgewogICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEpIHsKICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGNoaWxkTm9kZS5kYXRhLCBkYXRhKTsKICAgIH0KICB9CiAgd2hpbGUgKGlzRGVmKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHsKICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkgewogICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoZGF0YSwgcGFyZW50Tm9kZS5kYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlbmRlckNsYXNzKGRhdGEuc3RhdGljQ2xhc3MsIGRhdGEuY2xhc3MpCn0KCmZ1bmN0aW9uIG1lcmdlQ2xhc3NEYXRhIChjaGlsZCwgcGFyZW50KSB7CiAgcmV0dXJuIHsKICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksCiAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpCiAgICAgID8gW2NoaWxkLmNsYXNzLCBwYXJlbnQuY2xhc3NdCiAgICAgIDogcGFyZW50LmNsYXNzCiAgfQp9CgpmdW5jdGlvbiByZW5kZXJDbGFzcyAoCiAgc3RhdGljQ2xhc3MsCiAgZHluYW1pY0NsYXNzCikgewogIGlmIChpc0RlZihzdGF0aWNDbGFzcykgfHwgaXNEZWYoZHluYW1pY0NsYXNzKSkgewogICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSkKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7CiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJykKfQoKZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpCiAgfQogIGlmIChpc09iamVjdCh2YWx1ZSkpIHsKICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpCiAgfQogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICByZXR1cm4gdmFsdWUKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIHZhciBzdHJpbmdpZmllZDsKICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgaWYgKHZhbHVlW2tleV0pIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBrZXk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgbmFtZXNwYWNlTWFwID0gewogIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywKICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcKfTsKCnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKAogICdodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSwnICsKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLCcgKwogICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICsKICAnYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LCcgKwogICdzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbywnICsKICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArCiAgJ2NhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLCcgKwogICdidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLCcgKwogICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgKwogICdkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksJyArCiAgJ2NvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QnCik7CgovLyB0aGlzIG1hcCBpcyBpbnRlbnRpb25hbGx5IHNlbGVjdGl2ZSwgb25seSBjb3ZlcmluZyBTVkcgZWxlbWVudHMgdGhhdCBtYXkKLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy4KdmFyIGlzU1ZHID0gbWFrZU1hcCgKICAnc3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLCcgKwogICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICsKICAncG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldycsCiAgdHJ1ZQopOwoKdmFyIGlzUHJlVGFnID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gdGFnID09PSAncHJlJzsgfTsKCnZhciBpc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKHRhZykgewogIHJldHVybiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWRyh0YWcpCn07CgpmdW5jdGlvbiBnZXRUYWdOYW1lc3BhY2UgKHRhZykgewogIGlmIChpc1NWRyh0YWcpKSB7CiAgICByZXR1cm4gJ3N2ZycKICB9CiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MCiAgLy8gbm90ZSBpdCBkb2Vzbid0IHN1cHBvcnQgb3RoZXIgTWF0aE1MIGVsZW1lbnRzIGJlaW5nIGNvbXBvbmVudCByb290cwogIGlmICh0YWcgPT09ICdtYXRoJykgewogICAgcmV0dXJuICdtYXRoJwogIH0KfQoKdmFyIHVua25vd25FbGVtZW50Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpmdW5jdGlvbiBpc1Vua25vd25FbGVtZW50ICh0YWcpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWluQnJvd3NlcikgewogICAgcmV0dXJuIHRydWUKICB9CiAgaWYgKGlzUmVzZXJ2ZWRUYWcodGFnKSkgewogICAgcmV0dXJuIGZhbHNlCiAgfQogIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkgewogICAgcmV0dXJuIHVua25vd25FbGVtZW50Q2FjaGVbdGFnXQogIH0KICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgaWYgKHRhZy5pbmRleE9mKCctJykgPiAtMSkgewogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjgyMTAzNjQvMTA3MDI0NAogICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoCiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTFVua25vd25FbGVtZW50IHx8CiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTEVsZW1lbnQKICAgICkpCiAgfSBlbHNlIHsKICAgIHJldHVybiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddID0gL0hUTUxVbmtub3duRWxlbWVudC8udGVzdChlbC50b1N0cmluZygpKSkKICB9Cn0KCnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpOwoKLyogICovCgovKioKICogUXVlcnkgYW4gZWxlbWVudCBzZWxlY3RvciBpZiBpdCdzIG5vdCBhbiBlbGVtZW50IGFscmVhZHkuCiAqLwpmdW5jdGlvbiBxdWVyeSAoZWwpIHsKICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgewogICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7CiAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdDYW5ub3QgZmluZCBlbGVtZW50OiAnICsgZWwKICAgICAgKTsKICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpCiAgICB9CiAgICByZXR1cm4gc2VsZWN0ZWQKICB9IGVsc2UgewogICAgcmV0dXJuIGVsCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQkMSAodGFnTmFtZSwgdm5vZGUpIHsKICB2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHsKICAgIHJldHVybiBlbG0KICB9CiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3QKICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMubXVsdGlwbGUgIT09IHVuZGVmaW5lZCkgewogICAgZWxtLnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnbXVsdGlwbGUnKTsKICB9CiAgcmV0dXJuIGVsbQp9CgpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkgewogIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlTWFwW25hbWVzcGFjZV0sIHRhZ05hbWUpCn0KCmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlICh0ZXh0KSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHsKICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KQp9CgpmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHsKICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTsKfQoKZnVuY3Rpb24gcmVtb3ZlQ2hpbGQgKG5vZGUsIGNoaWxkKSB7CiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Cn0KCmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkgewogIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwp9CgpmdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7CiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZQp9CgpmdW5jdGlvbiBuZXh0U2libGluZyAobm9kZSkgewogIHJldHVybiBub2RlLm5leHRTaWJsaW5nCn0KCmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHsKICByZXR1cm4gbm9kZS50YWdOYW1lCn0KCmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7CiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7Cn0KCmZ1bmN0aW9uIHNldFN0eWxlU2NvcGUgKG5vZGUsIHNjb3BlSWQpIHsKICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7Cn0KCgp2YXIgbm9kZU9wcyA9IE9iamVjdC5mcmVlemUoewoJY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCQxLAoJY3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsCgljcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsCgljcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LAoJaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsCglyZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsCglhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsCglwYXJlbnROb2RlOiBwYXJlbnROb2RlLAoJbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLAoJdGFnTmFtZTogdGFnTmFtZSwKCXNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCwKCXNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGUKfSk7CgovKiAgKi8KCnZhciByZWYgPSB7CiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7CiAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgICBpZiAob2xkVm5vZGUuZGF0YS5yZWYgIT09IHZub2RlLmRhdGEucmVmKSB7CiAgICAgIHJlZ2lzdGVyUmVmKG9sZFZub2RlLCB0cnVlKTsKICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpOwogICAgfQogIH0sCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHJlZ2lzdGVyUmVmKHZub2RlLCB0cnVlKTsKICB9Cn0KCmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7CiAgdmFyIGtleSA9IHZub2RlLmRhdGEucmVmOwogIGlmICghaXNEZWYoa2V5KSkgeyByZXR1cm4gfQoKICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0OwogIHZhciByZWYgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5lbG07CiAgdmFyIHJlZnMgPSB2bS4kcmVmczsKICBpZiAoaXNSZW1vdmFsKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7CiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7CiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7CiAgICAgIHJlZnNba2V5XSA9IHVuZGVmaW5lZDsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHZub2RlLmRhdGEucmVmSW5Gb3IpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsKICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsKICAgICAgfSBlbHNlIGlmIChyZWZzW2tleV0uaW5kZXhPZihyZWYpIDwgMCkgewogICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlZnNba2V5XSA9IHJlZjsKICAgIH0KICB9Cn0KCi8qKgogKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnkKICogU2ltb24gRnJpaXMgVmluZHVtIChAcGFsZGVwaW5kKQogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UKICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFCiAqCiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKQogKgogKiBOb3QgdHlwZS1jaGVja2luZyB0aGlzIGJlY2F1c2UgdGhpcyBmaWxlIGlzIHBlcmYtY3JpdGljYWwgYW5kIHRoZSBjb3N0CiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LgogKi8KCnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7Cgp2YXIgaG9va3MgPSBbJ2NyZWF0ZScsICdhY3RpdmF0ZScsICd1cGRhdGUnLCAncmVtb3ZlJywgJ2Rlc3Ryb3knXTsKCmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikgewogIHJldHVybiAoCiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKAogICAgICAoCiAgICAgICAgYS50YWcgPT09IGIudGFnICYmCiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmCiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJgogICAgICAgIHNhbWVJbnB1dFR5cGUoYSwgYikKICAgICAgKSB8fCAoCiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJgogICAgICAgIGEuYXN5bmNGYWN0b3J5ID09PSBiLmFzeW5jRmFjdG9yeSAmJgogICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpCiAgICAgICkKICAgICkKICApCn0KCmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHsKICBpZiAoYS50YWcgIT09ICdpbnB1dCcpIHsgcmV0dXJuIHRydWUgfQogIHZhciBpOwogIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7CiAgdmFyIHR5cGVCID0gaXNEZWYoaSA9IGIuZGF0YSkgJiYgaXNEZWYoaSA9IGkuYXR0cnMpICYmIGkudHlwZTsKICByZXR1cm4gdHlwZUEgPT09IHR5cGVCIHx8IGlzVGV4dElucHV0VHlwZSh0eXBlQSkgJiYgaXNUZXh0SW5wdXRUeXBlKHR5cGVCKQp9CgpmdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeCAoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHsKICB2YXIgaSwga2V5OwogIHZhciBtYXAgPSB7fTsKICBmb3IgKGkgPSBiZWdpbklkeDsgaSA8PSBlbmRJZHg7ICsraSkgewogICAga2V5ID0gY2hpbGRyZW5baV0ua2V5OwogICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9CiAgfQogIHJldHVybiBtYXAKfQoKZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkgewogIHZhciBpLCBqOwogIHZhciBjYnMgPSB7fTsKCiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7CiAgdmFyIG5vZGVPcHMgPSBiYWNrZW5kLm5vZGVPcHM7CgogIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkgewogICAgY2JzW2hvb2tzW2ldXSA9IFtdOwogICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHsKICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkgewogICAgICAgIGNic1tob29rc1tpXV0ucHVzaChtb2R1bGVzW2pdW2hvb2tzW2ldXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHsKICAgIHJldHVybiBuZXcgVk5vZGUobm9kZU9wcy50YWdOYW1lKGVsbSkudG9Mb3dlckNhc2UoKSwge30sIFtdLCB1bmRlZmluZWQsIGVsbSkKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZVJtQ2IgKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHsKICAgIGZ1bmN0aW9uIHJlbW92ZSAoKSB7CiAgICAgIGlmICgtLXJlbW92ZS5saXN0ZW5lcnMgPT09IDApIHsKICAgICAgICByZW1vdmVOb2RlKGNoaWxkRWxtKTsKICAgICAgfQogICAgfQogICAgcmVtb3ZlLmxpc3RlbmVycyA9IGxpc3RlbmVyczsKICAgIHJldHVybiByZW1vdmUKICB9CgogIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7CiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTsKICAgIC8vIGVsZW1lbnQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZHVlIHRvIHYtaHRtbCAvIHYtdGV4dAogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQkJDEgKHZub2RlLCBpblZQcmUpIHsKICAgIHJldHVybiAoCiAgICAgICFpblZQcmUgJiYKICAgICAgIXZub2RlLm5zICYmCiAgICAgICEoCiAgICAgICAgY29uZmlnLmlnbm9yZWRFbGVtZW50cy5sZW5ndGggJiYKICAgICAgICBjb25maWcuaWdub3JlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGlnbm9yZSkgewogICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSkKICAgICAgICAgICAgPyBpZ25vcmUudGVzdCh2bm9kZS50YWcpCiAgICAgICAgICAgIDogaWdub3JlID09PSB2bm9kZS50YWcKICAgICAgICB9KQogICAgICApICYmCiAgICAgIGNvbmZpZy5pc1Vua25vd25FbGVtZW50KHZub2RlLnRhZykKICAgICkKICB9CgogIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7CgogIGZ1bmN0aW9uIGNyZWF0ZUVsbSAoCiAgICB2bm9kZSwKICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgIHBhcmVudEVsbSwKICAgIHJlZkVsbSwKICAgIG5lc3RlZCwKICAgIG93bmVyQXJyYXksCiAgICBpbmRleAogICkgewogICAgaWYgKGlzRGVmKHZub2RlLmVsbSkgJiYgaXNEZWYob3duZXJBcnJheSkpIHsKICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciEKICAgICAgLy8gbm93IGl0J3MgdXNlZCBhcyBhIG5ldyBub2RlLCBvdmVyd3JpdGluZyBpdHMgZWxtIHdvdWxkIGNhdXNlCiAgICAgIC8vIHBvdGVudGlhbCBwYXRjaCBlcnJvcnMgZG93biB0aGUgcm9hZCB3aGVuIGl0J3MgdXNlZCBhcyBhbiBpbnNlcnRpb24KICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmcKICAgICAgLy8gYXNzb2NpYXRlZCBET00gZWxlbWVudCBmb3IgaXQuCiAgICAgIHZub2RlID0gb3duZXJBcnJheVtpbmRleF0gPSBjbG9uZVZOb2RlKHZub2RlKTsKICAgIH0KCiAgICB2bm9kZS5pc1Jvb3RJbnNlcnQgPSAhbmVzdGVkOyAvLyBmb3IgdHJhbnNpdGlvbiBlbnRlciBjaGVjawogICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47CiAgICB2YXIgdGFnID0gdm5vZGUudGFnOwogICAgaWYgKGlzRGVmKHRhZykpIHsKICAgICAgewogICAgICAgIGlmIChkYXRhICYmIGRhdGEucHJlKSB7CiAgICAgICAgICBjcmVhdGluZ0VsbUluVlByZSsrOwogICAgICAgIH0KICAgICAgICBpZiAoaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgY3JlYXRpbmdFbG1JblZQcmUpKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArCiAgICAgICAgICAgICdyZWdpc3RlciB0aGUgY29tcG9uZW50IGNvcnJlY3RseT8gRm9yIHJlY3Vyc2l2ZSBjb21wb25lbnRzLCAnICsKICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSAibmFtZSIgb3B0aW9uLicsCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2bm9kZS5lbG0gPSB2bm9kZS5ucwogICAgICAgID8gbm9kZU9wcy5jcmVhdGVFbGVtZW50TlModm5vZGUubnMsIHRhZykKICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTsKICAgICAgc2V0U2NvcGUodm5vZGUpOwoKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIHsKICAgICAgICBjcmVhdGVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9CiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgICB9CgogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRhdGEgJiYgZGF0YS5wcmUpIHsKICAgICAgICBjcmVhdGluZ0VsbUluVlByZS0tOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpKSB7CiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlQ29tbWVudCh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfSBlbHNlIHsKICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgdmFyIGkgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIHZhciBpc1JlYWN0aXZhdGVkID0gaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpICYmIGkua2VlcEFsaXZlOwogICAgICBpZiAoaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsKICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8sIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgICAgfQogICAgICAvLyBhZnRlciBjYWxsaW5nIHRoZSBpbml0IGhvb2ssIGlmIHRoZSB2bm9kZSBpcyBhIGNoaWxkIGNvbXBvbmVudAogICAgICAvLyBpdCBzaG91bGQndmUgY3JlYXRlZCBhIGNoaWxkIGluc3RhbmNlIGFuZCBtb3VudGVkIGl0LiB0aGUgY2hpbGQKICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uCiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGVsZW1lbnQgYW5kIGJlIGRvbmUuCiAgICAgIGlmIChpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHsKICAgICAgICAgIHJlYWN0aXZhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0Q29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkgewogICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaC5hcHBseShpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCk7CiAgICAgIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCA9IG51bGw7CiAgICB9CiAgICB2bm9kZS5lbG0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS4kZWw7CiAgICBpZiAoaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICBzZXRTY29wZSh2bm9kZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC4KICAgICAgLy8gc2tpcCBhbGwgZWxlbWVudC1yZWxhdGVkIG1vZHVsZXMgZXhjZXB0IGZvciByZWYgKCMzNDU1KQogICAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rCiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKHZub2RlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlYWN0aXZhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7CiAgICB2YXIgaTsKICAgIC8vIGhhY2sgZm9yICM0MzM5OiBhIHJlYWN0aXZhdGVkIGNvbXBvbmVudCB3aXRoIGlubmVyIHRyYW5zaXRpb24KICAgIC8vIGRvZXMgbm90IHRyaWdnZXIgYmVjYXVzZSB0aGUgaW5uZXIgbm9kZSdzIGNyZWF0ZWQgaG9va3MgYXJlIG5vdCBjYWxsZWQKICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dAogICAgLy8gdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyBpdC4KICAgIHZhciBpbm5lck5vZGUgPSB2bm9kZTsKICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgaW5uZXJOb2RlID0gaW5uZXJOb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgICAgaWYgKGlzRGVmKGkgPSBpbm5lck5vZGUuZGF0YSkgJiYgaXNEZWYoaSA9IGkudHJhbnNpdGlvbikpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBjYnMuYWN0aXZhdGVbaV0oZW1wdHlOb2RlLCBpbm5lck5vZGUpOwogICAgICAgIH0KICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICAgIC8vIHVubGlrZSBhIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50LAogICAgLy8gYSByZWFjdGl2YXRlZCBrZWVwLWFsaXZlIGNvbXBvbmVudCBkb2Vzbid0IGluc2VydCBpdHNlbGYKICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkgewogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgaWYgKGlzRGVmKHJlZiQkMSkpIHsKICAgICAgICBpZiAocmVmJCQxLnBhcmVudE5vZGUgPT09IHBhcmVudCkgewogICAgICAgICAgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50LCBlbG0sIHJlZiQkMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQocGFyZW50LCBlbG0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgICB7CiAgICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKGNoaWxkcmVuKTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSwgY2hpbGRyZW4sIGkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7CiAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQodm5vZGUuZWxtLCBub2RlT3BzLmNyZWF0ZVRleHROb2RlKFN0cmluZyh2bm9kZS50ZXh0KSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNQYXRjaGFibGUgKHZub2RlKSB7CiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7CiAgICB9CiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKQogIH0KCiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICBjYnMuY3JlYXRlW2kkMV0oZW1wdHlOb2RlLCB2bm9kZSk7CiAgICB9CiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZQogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH0KICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH0KICAgIH0KICB9CgogIC8vIHNldCBzY29wZSBpZCBhdHRyaWJ1dGUgZm9yIHNjb3BlZCBDU1MuCiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuCiAgZnVuY3Rpb24gc2V0U2NvcGUgKHZub2RlKSB7CiAgICB2YXIgaTsKICAgIGlmIChpc0RlZihpID0gdm5vZGUuZm5TY29wZUlkKSkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlOwogICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkgewogICAgICAgICAgbm9kZU9wcy5zZXRTdHlsZVNjb3BlKHZub2RlLmVsbSwgaSk7CiAgICAgICAgfQogICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50OwogICAgICB9CiAgICB9CiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuCiAgICBpZiAoaXNEZWYoaSA9IGFjdGl2ZUluc3RhbmNlKSAmJgogICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmCiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJgogICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkKICAgICkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7CiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnZva2VEZXN0cm95SG9vayAodm5vZGUpIHsKICAgIHZhciBpLCBqOwogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9CiAgICB9CiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkgewogICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHsKICAgICAgICBpbnZva2VEZXN0cm95SG9vayh2bm9kZS5jaGlsZHJlbltqXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHsKICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHsKICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTsKICAgICAgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihjaC50YWcpKSB7CiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTsKICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTsKICAgICAgICB9IGVsc2UgeyAvLyBUZXh0IG5vZGUKICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkgewogICAgaWYgKGlzRGVmKHJtKSB8fCBpc0RlZih2bm9kZS5kYXRhKSkgewogICAgICB2YXIgaTsKICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTsKICAgICAgaWYgKGlzRGVmKHJtKSkgewogICAgICAgIC8vIHdlIGhhdmUgYSByZWN1cnNpdmVseSBwYXNzZWQgZG93biBybSBjYWxsYmFjawogICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnQKICAgICAgICBybS5saXN0ZW5lcnMgKz0gbGlzdGVuZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nCiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTsKICAgICAgfQogICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpc0RlZihpID0gaS5fdm5vZGUpICYmIGlzRGVmKGkuZGF0YSkpIHsKICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGksIHJtKTsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkgewogICAgICAgIGNicy5yZW1vdmVbaV0odm5vZGUsIHJtKTsKICAgICAgfQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkgewogICAgICAgIGkodm5vZGUsIHJtKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBybSgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZW1vdmVOb2RlKHZub2RlLmVsbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbiAocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDsKICAgIHZhciBuZXdTdGFydElkeCA9IDA7CiAgICB2YXIgb2xkRW5kSWR4ID0gb2xkQ2gubGVuZ3RoIC0gMTsKICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07CiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdOwogICAgdmFyIG5ld0VuZElkeCA9IG5ld0NoLmxlbmd0aCAtIDE7CiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdOwogICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTsKICAgIHZhciBvbGRLZXlUb0lkeCwgaWR4SW5PbGQsIHZub2RlVG9Nb3ZlLCByZWZFbG07CgogICAgLy8gcmVtb3ZlT25seSBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgYnkgPHRyYW5zaXRpb24tZ3JvdXA+CiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zCiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9ucwogICAgdmFyIGNhbk1vdmUgPSAhcmVtb3ZlT25seTsKCiAgICB7CiAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhuZXdDaCk7CiAgICB9CgogICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHsKICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnQKICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkgewogICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07CiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7CiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07CiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07CiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCByaWdodAogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpOwogICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsKICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTsKICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnQKICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBvbGRFbmRWbm9kZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsKICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9CiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSkKICAgICAgICAgID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldCiAgICAgICAgICA6IGZpbmRJZHhJbk9sZChuZXdTdGFydFZub2RlLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7CiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50CiAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBmYWxzZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07CiAgICAgICAgICBpZiAoc2FtZVZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgICAgICBwYXRjaFZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCB2bm9kZVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnQKICAgICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsKICAgICAgfQogICAgfQogICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7CiAgICAgIHJlZkVsbSA9IGlzVW5kZWYobmV3Q2hbbmV3RW5kSWR4ICsgMV0pID8gbnVsbCA6IG5ld0NoW25ld0VuZElkeCArIDFdLmVsbTsKICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHsKICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgb2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVLZXlzIChjaGlsZHJlbikgewogICAgdmFyIHNlZW5LZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB2bm9kZSA9IGNoaWxkcmVuW2ldOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5OwogICAgICBpZiAoaXNEZWYoa2V5KSkgewogICAgICAgIGlmIChzZWVuS2V5c1trZXldKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAoIkR1cGxpY2F0ZSBrZXlzIGRldGVjdGVkOiAnIiArIGtleSArICInLiBUaGlzIG1heSBjYXVzZSBhbiB1cGRhdGUgZXJyb3IuIiksCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZW5LZXlzW2tleV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZElkeEluT2xkIChub2RlLCBvbGRDaCwgc3RhcnQsIGVuZCkgewogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGMgPSBvbGRDaFtpXTsKICAgICAgaWYgKGlzRGVmKGMpICYmIHNhbWVWbm9kZShub2RlLCBjKSkgeyByZXR1cm4gaSB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgaWYgKG9sZFZub2RlID09PSB2bm9kZSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtOwoKICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkgewogICAgICBpZiAoaXNEZWYodm5vZGUuYXN5bmNGYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgIGh5ZHJhdGUob2xkVm5vZGUuZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybgogICAgfQoKICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy4KICAgIC8vIG5vdGUgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgLQogICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuCiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc1N0YXRpYykgJiYKICAgICAgaXNUcnVlKG9sZFZub2RlLmlzU3RhdGljKSAmJgogICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJgogICAgICAoaXNUcnVlKHZub2RlLmlzQ2xvbmVkKSB8fCBpc1RydWUodm5vZGUuaXNPbmNlKSkKICAgICkgewogICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgaTsKICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHsKICAgICAgaShvbGRWbm9kZSwgdm5vZGUpOwogICAgfQoKICAgIHZhciBvbGRDaCA9IG9sZFZub2RlLmNoaWxkcmVuOwogICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47CiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKSB7IGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTsgfQogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICAgIGlmIChpc1VuZGVmKHZub2RlLnRleHQpKSB7CiAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7CiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfQogICAgICB9IGVsc2UgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9CiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkQ2gpKSB7CiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpOwogICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7CiAgICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sICcnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7CiAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCB2bm9kZS50ZXh0KTsKICAgIH0KICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucG9zdHBhdGNoKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkgewogICAgLy8gZGVsYXkgaW5zZXJ0IGhvb2tzIGZvciBjb21wb25lbnQgcm9vdCBub2RlcywgaW52b2tlIHRoZW0gYWZ0ZXIgdGhlCiAgICAvLyBlbGVtZW50IGlzIHJlYWxseSBpbnNlcnRlZAogICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7CiAgICAgIHZub2RlLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQgPSBxdWV1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHsKICAgICAgICBxdWV1ZVtpXS5kYXRhLmhvb2suaW5zZXJ0KHF1ZXVlW2ldKTsKICAgICAgfQogICAgfQogIH0KCiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlOwogIC8vIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBza2lwIGNyZWF0ZSBob29rIGR1cmluZyBoeWRyYXRpb24gYmVjYXVzZSB0aGV5CiAgLy8gYXJlIGFscmVhZHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCBvciBoYXMgbm8gbmVlZCBmb3IgaW5pdGlhbGl6YXRpb24KICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmUKICAvLyBkZWVwIHVwZGF0ZXMgKCM3MDYzKS4KICB2YXIgaXNSZW5kZXJlZE1vZHVsZSA9IG1ha2VNYXAoJ2F0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleScpOwoKICAvLyBOb3RlOiB0aGlzIGlzIGEgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uIHNvIHdlIGNhbiBhc3N1bWUgZWxtcyBhcmUgRE9NIG5vZGVzLgogIGZ1bmN0aW9uIGh5ZHJhdGUgKGVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSB7CiAgICB2YXIgaTsKICAgIHZhciB0YWcgPSB2bm9kZS50YWc7CiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjsKICAgIGluVlByZSA9IGluVlByZSB8fCAoZGF0YSAmJiBkYXRhLnByZSk7CiAgICB2bm9kZS5lbG0gPSBlbG07CgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpICYmIGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeSkpIHsKICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIC8vIGFzc2VydCBub2RlIG1hdGNoCiAgICB7CiAgICAgIGlmICghYXNzZXJ0Tm9kZU1hdGNoKGVsbSwgdm5vZGUsIGluVlByZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgfQogICAgfQogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH0KICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS4KICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0KICAgIGlmIChpc0RlZih0YWcpKSB7CiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHsKICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW4KICAgICAgICBpZiAoIWVsbS5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gdi1odG1sIGFuZCBkb21Qcm9wczogaW5uZXJIVE1MCiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7CiAgICAgICAgICAgIGlmIChpICE9PSBlbG0uaW5uZXJIVE1MKSB7CiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkCiAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NlcnZlciBpbm5lckhUTUw6ICcsIGkpOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdjbGllbnQgaW5uZXJIVE1MOiAnLCBlbG0uaW5uZXJIVE1MKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGNvbXBhcmUgY2hpbGRyZW4gbGlzdHMKICAgICAgICAgICAgdmFyIGNoaWxkcmVuTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHsKICAgICAgICAgICAgICBpZiAoIWNoaWxkTm9kZSB8fCAhaHlkcmF0ZShjaGlsZE5vZGUsIGNoaWxkcmVuW2kkMV0sIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSkgewogICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIGNoaWxkTm9kZSBpcyBub3QgbnVsbCwgaXQgbWVhbnMgdGhlIGFjdHVhbCBjaGlsZE5vZGVzIGxpc3QgaXMKICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC4KICAgICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoIHx8IGNoaWxkTm9kZSkgewogICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZAogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgaHlkcmF0aW9uQmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGVsbS5jaGlsZE5vZGVzLCBjaGlsZHJlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgIGlmICghaXNSZW5kZXJlZE1vZHVsZShrZXkpKSB7CiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlOwogICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICAgICAgYnJlYWsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFmdWxsSW52b2tlICYmIGRhdGFbJ2NsYXNzJ10pIHsKICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzCiAgICAgICAgICB0cmF2ZXJzZShkYXRhWydjbGFzcyddKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHsKICAgICAgZWxtLmRhdGEgPSB2bm9kZS50ZXh0OwogICAgfQogICAgcmV0dXJuIHRydWUKICB9CgogIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUsIGluVlByZSkgewogICAgaWYgKGlzRGVmKHZub2RlLnRhZykpIHsKICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKAogICAgICAgICFpc1Vua25vd25FbGVtZW50JCQxKHZub2RlLCBpblZQcmUpICYmCiAgICAgICAgdm5vZGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IChub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpCiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAodm5vZGUuaXNDb21tZW50ID8gOCA6IDMpCiAgICB9CiAgfQoKICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5LCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7CiAgICAgIGlmIChpc0RlZihvbGRWbm9kZSkpIHsgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOyB9CiAgICAgIHJldHVybgogICAgfQoKICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlOwogICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdOwoKICAgIGlmIChpc1VuZGVmKG9sZFZub2RlKSkgewogICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50CiAgICAgIGlzSW5pdGlhbFBhdGNoID0gdHJ1ZTsKICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpOwogICAgICBpZiAoIWlzUmVhbEVsZW1lbnQgJiYgc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHsKICAgICAgICAvLyBwYXRjaCBleGlzdGluZyByb290IG5vZGUKICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNSZWFsRWxlbWVudCkgewogICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnQKICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQgYW5kIGlmIHdlIGNhbiBwZXJmb3JtCiAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgaHlkcmF0aW9uLgogICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHsKICAgICAgICAgICAgb2xkVm5vZGUucmVtb3ZlQXR0cmlidXRlKFNTUl9BVFRSKTsKICAgICAgICAgICAgaHlkcmF0aW5nID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1RydWUoaHlkcmF0aW5nKSkgewogICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHsKICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpOwogICAgICAgICAgICAgIHJldHVybiBvbGRWbm9kZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgICAnVGhlIGNsaWVudC1zaWRlIHJlbmRlcmVkIHZpcnR1YWwgRE9NIHRyZWUgaXMgbm90IG1hdGNoaW5nICcgKwogICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgKwogICAgICAgICAgICAgICAgJ0hUTUwgbWFya3VwLCBmb3IgZXhhbXBsZSBuZXN0aW5nIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSAnICsKICAgICAgICAgICAgICAgICc8cD4sIG9yIG1pc3NpbmcgPHRib2R5Pi4gQmFpbGluZyBoeWRyYXRpb24gYW5kIHBlcmZvcm1pbmcgJyArCiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIGVpdGhlciBub3Qgc2VydmVyLXJlbmRlcmVkLCBvciBoeWRyYXRpb24gZmFpbGVkLgogICAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5vZGUgYW5kIHJlcGxhY2UgaXQKICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnQKICAgICAgICB2YXIgb2xkRWxtID0gb2xkVm5vZGUuZWxtOwogICAgICAgIHZhciBwYXJlbnRFbG0kMSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pOwoKICAgICAgICAvLyBjcmVhdGUgbmV3IG5vZGUKICAgICAgICBjcmVhdGVFbG0oCiAgICAgICAgICB2bm9kZSwKICAgICAgICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhCiAgICAgICAgICAvLyBsZWF2aW5nIHRyYW5zaXRpb24uIE9ubHkgaGFwcGVucyB3aGVuIGNvbWJpbmluZyB0cmFuc2l0aW9uICsKICAgICAgICAgIC8vIGtlZXAtYWxpdmUgKyBIT0NzLiAoIzQ1OTApCiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtJDEsCiAgICAgICAgICBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVsbSkKICAgICAgICApOwoKICAgICAgICAvLyB1cGRhdGUgcGFyZW50IHBsYWNlaG9sZGVyIG5vZGUgZWxlbWVudCwgcmVjdXJzaXZlbHkKICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkgewogICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50OwogICAgICAgICAgdmFyIHBhdGNoYWJsZSA9IGlzUGF0Y2hhYmxlKHZub2RlKTsKICAgICAgICAgIHdoaWxlIChhbmNlc3RvcikgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgY2JzLmRlc3Ryb3lbaV0oYW5jZXN0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFuY2VzdG9yLmVsbSA9IHZub2RlLmVsbTsKICAgICAgICAgICAgaWYgKHBhdGNoYWJsZSkgewogICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICAgICAgICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgYW5jZXN0b3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyAjNjUxMwogICAgICAgICAgICAgIC8vIGludm9rZSBpbnNlcnQgaG9va3MgdGhhdCBtYXkgaGF2ZSBiZWVuIG1lcmdlZCBieSBjcmVhdGUgaG9va3MuCiAgICAgICAgICAgICAgLy8gZS5nLiBmb3IgZGlyZWN0aXZlcyB0aGF0IHVzZXMgdGhlICJpbnNlcnRlZCIgaG9vay4KICAgICAgICAgICAgICB2YXIgaW5zZXJ0ID0gYW5jZXN0b3IuZGF0YS5ob29rLmluc2VydDsKICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkgewogICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgaW5kZXggMSB0byBhdm9pZCByZS1pbnZva2luZyBjb21wb25lbnQgbW91bnRlZCBob29rCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDIgPSAxOyBpJDIgPCBpbnNlcnQuZm5zLmxlbmd0aDsgaSQyKyspIHsKICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlZ2lzdGVyUmVmKGFuY2VzdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRlc3Ryb3kgb2xkIG5vZGUKICAgICAgICBpZiAoaXNEZWYocGFyZW50RWxtJDEpKSB7CiAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtJDEsIFtvbGRWbm9kZV0sIDAsIDApOwogICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkgewogICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpOwogICAgcmV0dXJuIHZub2RlLmVsbQogIH0KfQoKLyogICovCgp2YXIgZGlyZWN0aXZlcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsCiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLAogIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7CiAgICB1cGRhdGVEaXJlY3RpdmVzKHZub2RlLCBlbXB0eU5vZGUpOwogIH0KfQoKZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7CiAgaWYgKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcyB8fCB2bm9kZS5kYXRhLmRpcmVjdGl2ZXMpIHsKICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTsKICB9Cn0KCmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBpc0NyZWF0ZSA9IG9sZFZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTsKICB2YXIgbmV3RGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSh2bm9kZS5kYXRhLmRpcmVjdGl2ZXMsIHZub2RlLmNvbnRleHQpOwoKICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTsKICB2YXIgZGlyc1dpdGhQb3N0cGF0Y2ggPSBbXTsKCiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7CiAgZm9yIChrZXkgaW4gbmV3RGlycykgewogICAgb2xkRGlyID0gb2xkRGlyc1trZXldOwogICAgZGlyID0gbmV3RGlyc1trZXldOwogICAgaWYgKCFvbGREaXIpIHsKICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZAogICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmluc2VydGVkKSB7CiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZQogICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7CiAgICAgIGNhbGxIb29rJDEoZGlyLCAndXBkYXRlJywgdm5vZGUsIG9sZFZub2RlKTsKICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5jb21wb25lbnRVcGRhdGVkKSB7CiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZGlyc1dpdGhJbnNlcnQubGVuZ3RoKSB7CiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzV2l0aEluc2VydC5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhJbnNlcnRbaV0sICdpbnNlcnRlZCcsIHZub2RlLCBvbGRWbm9kZSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaXNDcmVhdGUpIHsKICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxJbnNlcnQoKTsKICAgIH0KICB9CgogIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHsKICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAncG9zdHBhdGNoJywgZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoUG9zdHBhdGNoLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICB9CiAgICB9KTsKICB9CgogIGlmICghaXNDcmVhdGUpIHsKICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHsKICAgICAgaWYgKCFuZXdEaXJzW2tleV0pIHsKICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kCiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CgpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKAogIGRpcnMsCiAgdm0KKSB7CiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFkaXJzKSB7CiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgIHJldHVybiByZXMKICB9CiAgdmFyIGksIGRpcjsKICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIGlmICghZGlyLm1vZGlmaWVycykgewogICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgZGlyLm1vZGlmaWVycyA9IGVtcHR5TW9kaWZpZXJzOwogICAgfQogICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7CiAgICBkaXIuZGVmID0gcmVzb2x2ZUFzc2V0KHZtLiRvcHRpb25zLCAnZGlyZWN0aXZlcycsIGRpci5uYW1lLCB0cnVlKTsKICB9CiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBnZXRSYXdEaXJOYW1lIChkaXIpIHsKICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyAiLiIgKyAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycyB8fCB7fSkuam9pbignLicpKSkKfQoKZnVuY3Rpb24gY2FsbEhvb2skMSAoZGlyLCBob29rLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSkgewogIHZhciBmbiA9IGRpci5kZWYgJiYgZGlyLmRlZltob29rXTsKICBpZiAoZm4pIHsKICAgIHRyeSB7CiAgICAgIGZuKHZub2RlLmVsbSwgZGlyLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGhhbmRsZUVycm9yKGUsIHZub2RlLmNvbnRleHQsICgiZGlyZWN0aXZlICIgKyAoZGlyLm5hbWUpICsgIiAiICsgaG9vayArICIgaG9vayIpKTsKICAgIH0KICB9Cn0KCnZhciBiYXNlTW9kdWxlcyA9IFsKICByZWYsCiAgZGlyZWN0aXZlcwpdCgovKiAgKi8KCmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHsKICB2YXIgb3B0cyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgaWYgKGlzRGVmKG9wdHMpICYmIG9wdHMuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRycyA9PT0gZmFsc2UpIHsKICAgIHJldHVybgogIH0KICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLmF0dHJzKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEuYXR0cnMpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIGtleSwgY3VyLCBvbGQ7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzIHx8IHt9OwogIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKGF0dHJzLl9fb2JfXykpIHsKICAgIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYXR0cnMpOwogIH0KCiAgZm9yIChrZXkgaW4gYXR0cnMpIHsKICAgIGN1ciA9IGF0dHJzW2tleV07CiAgICBvbGQgPSBvbGRBdHRyc1trZXldOwogICAgaWYgKG9sZCAhPT0gY3VyKSB7CiAgICAgIHNldEF0dHIoZWxtLCBrZXksIGN1cik7CiAgICB9CiAgfQogIC8vICM0MzkxOiBpbiBJRTksIHNldHRpbmcgdHlwZSBjYW4gcmVzZXQgdmFsdWUgZm9yIGlucHV0W3R5cGU9cmFkaW9dCiAgLy8gIzY2NjY6IElFL0VkZ2UgZm9yY2VzIHByb2dyZXNzIHZhbHVlIGRvd24gdG8gMSBiZWZvcmUgc2V0dGluZyBhIG1heAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICgoaXNJRSB8fCBpc0VkZ2UpICYmIGF0dHJzLnZhbHVlICE9PSBvbGRBdHRycy52YWx1ZSkgewogICAgc2V0QXR0cihlbG0sICd2YWx1ZScsIGF0dHJzLnZhbHVlKTsKICB9CiAgZm9yIChrZXkgaW4gb2xkQXR0cnMpIHsKICAgIGlmIChpc1VuZGVmKGF0dHJzW2tleV0pKSB7CiAgICAgIGlmIChpc1hsaW5rKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpOwogICAgICB9IGVsc2UgaWYgKCFpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7CiAgaWYgKGVsLnRhZ05hbWUuaW5kZXhPZignLScpID4gLTEpIHsKICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTsKICB9IGVsc2UgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkgewogICAgLy8gc2V0IGF0dHJpYnV0ZSBmb3IgYmxhbmsgdmFsdWUKICAgIC8vIGUuZy4gPG9wdGlvbiBkaXNhYmxlZD5TZWxlY3Qgb25lPC9vcHRpb24+CiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICB9IGVsc2UgewogICAgICAvLyB0ZWNobmljYWxseSBhbGxvd2Z1bGxzY3JlZW4gaXMgYSBib29sZWFuIGF0dHJpYnV0ZSBmb3IgPGlmcmFtZT4sCiAgICAgIC8vIGJ1dCBGbGFzaCBleHBlY3RzIGEgdmFsdWUgb2YgInRydWUiIHdoZW4gdXNlZCBvbiA8ZW1iZWQ+IHRhZwogICAgICB2YWx1ZSA9IGtleSA9PT0gJ2FsbG93ZnVsbHNjcmVlbicgJiYgZWwudGFnTmFtZSA9PT0gJ0VNQkVEJwogICAgICAgID8gJ3RydWUnCiAgICAgICAgOiBrZXk7CiAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzRW51bWVyYXRlZEF0dHIoa2V5KSkgewogICAgZWwuc2V0QXR0cmlidXRlKGtleSwgaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZScgPyAnZmFsc2UnIDogJ3RydWUnKTsKICB9IGVsc2UgaWYgKGlzWGxpbmsoa2V5KSkgewogICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpOwogICAgfQogIH0gZWxzZSB7CiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7CiAgfQp9CgpmdW5jdGlvbiBiYXNlU2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHsKICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpOwogIH0gZWxzZSB7CiAgICAvLyAjNzEzODogSUUxMCAmIDExIGZpcmVzIGlucHV0IGV2ZW50IHdoZW4gc2V0dGluZyBwbGFjZWhvbGRlciBvbgogICAgLy8gPHRleHRhcmVhPi4uLiBibG9jayB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYW5kIHJlbW92ZSB0aGUgYmxvY2tlcgogICAgLy8gaW1tZWRpYXRlbHkuCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgKICAgICAgaXNJRSAmJiAhaXNJRTkgJiYKICAgICAgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyAmJgogICAgICBrZXkgPT09ICdwbGFjZWhvbGRlcicgJiYgIWVsLl9faWVwaAogICAgKSB7CiAgICAgIHZhciBibG9ja2VyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIH07CiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICBlbC5fX2llcGggPSB0cnVlOyAvKiBJRSBwbGFjZWhvbGRlciBwYXRjaGVkICovCiAgICB9CiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CiAgfQp9Cgp2YXIgYXR0cnMgPSB7CiAgY3JlYXRlOiB1cGRhdGVBdHRycywKICB1cGRhdGU6IHVwZGF0ZUF0dHJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlQ2xhc3MgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBlbCA9IHZub2RlLmVsbTsKICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhOwogIGlmICgKICAgIGlzVW5kZWYoZGF0YS5zdGF0aWNDbGFzcykgJiYKICAgIGlzVW5kZWYoZGF0YS5jbGFzcykgJiYgKAogICAgICBpc1VuZGVmKG9sZERhdGEpIHx8ICgKICAgICAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljQ2xhc3MpICYmCiAgICAgICAgaXNVbmRlZihvbGREYXRhLmNsYXNzKQogICAgICApCiAgICApCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjbHMgPSBnZW5DbGFzc0ZvclZub2RlKHZub2RlKTsKCiAgLy8gaGFuZGxlIHRyYW5zaXRpb24gY2xhc3NlcwogIHZhciB0cmFuc2l0aW9uQ2xhc3MgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXM7CiAgaWYgKGlzRGVmKHRyYW5zaXRpb25DbGFzcykpIHsKICAgIGNscyA9IGNvbmNhdChjbHMsIHN0cmluZ2lmeUNsYXNzKHRyYW5zaXRpb25DbGFzcykpOwogIH0KCiAgLy8gc2V0IHRoZSBjbGFzcwogIGlmIChjbHMgIT09IGVsLl9wcmV2Q2xhc3MpIHsKICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbHMpOwogICAgZWwuX3ByZXZDbGFzcyA9IGNsczsKICB9Cn0KCnZhciBrbGFzcyA9IHsKICBjcmVhdGU6IHVwZGF0ZUNsYXNzLAogIHVwZGF0ZTogdXBkYXRlQ2xhc3MKfQoKLyogICovCgp2YXIgdmFsaWREaXZpc2lvbkNoYXJSRSA9IC9bXHcpLitcLV8kXF1dLzsKCmZ1bmN0aW9uIHBhcnNlRmlsdGVycyAoZXhwKSB7CiAgdmFyIGluU2luZ2xlID0gZmFsc2U7CiAgdmFyIGluRG91YmxlID0gZmFsc2U7CiAgdmFyIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsKICB2YXIgaW5SZWdleCA9IGZhbHNlOwogIHZhciBjdXJseSA9IDA7CiAgdmFyIHNxdWFyZSA9IDA7CiAgdmFyIHBhcmVuID0gMDsKICB2YXIgbGFzdEZpbHRlckluZGV4ID0gMDsKICB2YXIgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsKCiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykgewogICAgcHJldiA9IGM7CiAgICBjID0gZXhwLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoaW5TaW5nbGUpIHsKICAgICAgaWYgKGMgPT09IDB4MjcgJiYgcHJldiAhPT0gMHg1QykgeyBpblNpbmdsZSA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7CiAgICAgIGlmIChjID09PSAweDIyICYmIHByZXYgIT09IDB4NUMpIHsgaW5Eb3VibGUgPSBmYWxzZTsgfQogICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7CiAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NUMpIHsgaW5UZW1wbGF0ZVN0cmluZyA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHsKICAgICAgaWYgKGMgPT09IDB4MmYgJiYgcHJldiAhPT0gMHg1QykgeyBpblJlZ2V4ID0gZmFsc2U7IH0KICAgIH0gZWxzZSBpZiAoCiAgICAgIGMgPT09IDB4N0MgJiYgLy8gcGlwZQogICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYKICAgICAgZXhwLmNoYXJDb2RlQXQoaSAtIDEpICE9PSAweDdDICYmCiAgICAgICFjdXJseSAmJiAhc3F1YXJlICYmICFwYXJlbgogICAgKSB7CiAgICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBmaXJzdCBmaWx0ZXIsIGVuZCBvZiBleHByZXNzaW9uCiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaEZpbHRlcigpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlIDB4MjI6IGluRG91YmxlID0gdHJ1ZTsgYnJlYWsgICAgICAgICAvLyAiCiAgICAgICAgY2FzZSAweDI3OiBpblNpbmdsZSA9IHRydWU7IGJyZWFrICAgICAgICAgLy8gJwogICAgICAgIGNhc2UgMHg2MDogaW5UZW1wbGF0ZVN0cmluZyA9IHRydWU7IGJyZWFrIC8vIGAKICAgICAgICBjYXNlIDB4Mjg6IHBhcmVuKys7IGJyZWFrICAgICAgICAgICAgICAgICAvLyAoCiAgICAgICAgY2FzZSAweDI5OiBwYXJlbi0tOyBicmVhayAgICAgICAgICAgICAgICAgLy8gKQogICAgICAgIGNhc2UgMHg1Qjogc3F1YXJlKys7IGJyZWFrICAgICAgICAgICAgICAgIC8vIFsKICAgICAgICBjYXNlIDB4NUQ6IHNxdWFyZS0tOyBicmVhayAgICAgICAgICAgICAgICAvLyBdCiAgICAgICAgY2FzZSAweDdCOiBjdXJseSsrOyBicmVhayAgICAgICAgICAgICAgICAgLy8gewogICAgICAgIGNhc2UgMHg3RDogY3VybHktLTsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgfQogICAgICBpZiAoYyA9PT0gMHgyZikgeyAvLyAvCiAgICAgICAgdmFyIGogPSBpIC0gMTsKICAgICAgICB2YXIgcCA9ICh2b2lkIDApOwogICAgICAgIC8vIGZpbmQgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgcHJldiBjaGFyCiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICBwID0gZXhwLmNoYXJBdChqKTsKICAgICAgICAgIGlmIChwICE9PSAnICcpIHsgYnJlYWsgfQogICAgICAgIH0KICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkgewogICAgICAgICAgaW5SZWdleCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsKICB9IGVsc2UgaWYgKGxhc3RGaWx0ZXJJbmRleCAhPT0gMCkgewogICAgcHVzaEZpbHRlcigpOwogIH0KCiAgZnVuY3Rpb24gcHVzaEZpbHRlciAoKSB7CiAgICAoZmlsdGVycyB8fCAoZmlsdGVycyA9IFtdKSkucHVzaChleHAuc2xpY2UobGFzdEZpbHRlckluZGV4LCBpKS50cmltKCkpOwogICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgfQoKICBpZiAoZmlsdGVycykgewogICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSk7CiAgICB9CiAgfQoKICByZXR1cm4gZXhwcmVzc2lvbgp9CgpmdW5jdGlvbiB3cmFwRmlsdGVyIChleHAsIGZpbHRlcikgewogIHZhciBpID0gZmlsdGVyLmluZGV4T2YoJygnKTsKICBpZiAoaSA8IDApIHsKICAgIC8vIF9mOiByZXNvbHZlRmlsdGVyCiAgICByZXR1cm4gKCJfZihcIiIgKyBmaWx0ZXIgKyAiXCIpKCIgKyBleHAgKyAiKSIpCiAgfSBlbHNlIHsKICAgIHZhciBuYW1lID0gZmlsdGVyLnNsaWNlKDAsIGkpOwogICAgdmFyIGFyZ3MgPSBmaWx0ZXIuc2xpY2UoaSArIDEpOwogICAgcmV0dXJuICgiX2YoXCIiICsgbmFtZSArICJcIikoIiArIGV4cCArIChhcmdzICE9PSAnKScgPyAnLCcgKyBhcmdzIDogYXJncykpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGJhc2VXYXJuIChtc2cpIHsKICBjb25zb2xlLmVycm9yKCgiW1Z1ZSBjb21waWxlcl06ICIgKyBtc2cpKTsKfQoKZnVuY3Rpb24gcGx1Y2tNb2R1bGVGdW5jdGlvbiAoCiAgbW9kdWxlcywKICBrZXkKKSB7CiAgcmV0dXJuIG1vZHVsZXMKICAgID8gbW9kdWxlcy5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1ba2V5XTsgfSkuZmlsdGVyKGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9KQogICAgOiBbXQp9CgpmdW5jdGlvbiBhZGRQcm9wIChlbCwgbmFtZSwgdmFsdWUpIHsKICAoZWwucHJvcHMgfHwgKGVsLnByb3BzID0gW10pKS5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOwogIGVsLnBsYWluID0gZmFsc2U7Cn0KCmZ1bmN0aW9uIGFkZEF0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIChlbC5hdHRycyB8fCAoZWwuYXR0cnMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7CiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKLy8gYWRkIGEgcmF3IGF0dHIgKHVzZSB0aGlzIGluIHByZVRyYW5zZm9ybXMpCmZ1bmN0aW9uIGFkZFJhd0F0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIGVsLmF0dHJzTWFwW25hbWVdID0gdmFsdWU7CiAgZWwuYXR0cnNMaXN0LnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7Cn0KCmZ1bmN0aW9uIGFkZERpcmVjdGl2ZSAoCiAgZWwsCiAgbmFtZSwKICByYXdOYW1lLAogIHZhbHVlLAogIGFyZywKICBtb2RpZmllcnMKKSB7CiAgKGVsLmRpcmVjdGl2ZXMgfHwgKGVsLmRpcmVjdGl2ZXMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCByYXdOYW1lOiByYXdOYW1lLCB2YWx1ZTogdmFsdWUsIGFyZzogYXJnLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9KTsKICBlbC5wbGFpbiA9IGZhbHNlOwp9CgpmdW5jdGlvbiBhZGRIYW5kbGVyICgKICBlbCwKICBuYW1lLAogIHZhbHVlLAogIG1vZGlmaWVycywKICBpbXBvcnRhbnQsCiAgd2FybgopIHsKICBtb2RpZmllcnMgPSBtb2RpZmllcnMgfHwgZW1wdHlPYmplY3Q7CiAgLy8gd2FybiBwcmV2ZW50IGFuZCBwYXNzaXZlIG1vZGlmaWVyCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKAogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4gJiYKICAgIG1vZGlmaWVycy5wcmV2ZW50ICYmIG1vZGlmaWVycy5wYXNzaXZlCiAgKSB7CiAgICB3YXJuKAogICAgICAncGFzc2l2ZSBhbmQgcHJldmVudCBjYW5cJ3QgYmUgdXNlZCB0b2dldGhlci4gJyArCiAgICAgICdQYXNzaXZlIGhhbmRsZXIgY2FuXCd0IHByZXZlbnQgZGVmYXVsdCBldmVudC4nCiAgICApOwogIH0KCiAgLy8gY2hlY2sgY2FwdHVyZSBtb2RpZmllcgogIGlmIChtb2RpZmllcnMuY2FwdHVyZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5jYXB0dXJlOwogICAgbmFtZSA9ICchJyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIGNhcHR1cmVkCiAgfQogIGlmIChtb2RpZmllcnMub25jZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5vbmNlOwogICAgbmFtZSA9ICd+JyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIG9uY2UKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKG1vZGlmaWVycy5wYXNzaXZlKSB7CiAgICBkZWxldGUgbW9kaWZpZXJzLnBhc3NpdmU7CiAgICBuYW1lID0gJyYnICsgbmFtZTsgLy8gbWFyayB0aGUgZXZlbnQgYXMgcGFzc2l2ZQogIH0KCiAgLy8gbm9ybWFsaXplIGNsaWNrLnJpZ2h0IGFuZCBjbGljay5taWRkbGUgc2luY2UgdGhleSBkb24ndCBhY3R1YWxseSBmaXJlCiAgLy8gdGhpcyBpcyB0ZWNobmljYWxseSBicm93c2VyLXNwZWNpZmljLCBidXQgYXQgbGVhc3QgZm9yIG5vdyBicm93c2VycyBhcmUKICAvLyB0aGUgb25seSB0YXJnZXQgZW52cyB0aGF0IGhhdmUgcmlnaHQvbWlkZGxlIGNsaWNrcy4KICBpZiAobmFtZSA9PT0gJ2NsaWNrJykgewogICAgaWYgKG1vZGlmaWVycy5yaWdodCkgewogICAgICBuYW1lID0gJ2NvbnRleHRtZW51JzsKICAgICAgZGVsZXRlIG1vZGlmaWVycy5yaWdodDsKICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLm1pZGRsZSkgewogICAgICBuYW1lID0gJ21vdXNldXAnOwogICAgfQogIH0KCiAgdmFyIGV2ZW50czsKICBpZiAobW9kaWZpZXJzLm5hdGl2ZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5uYXRpdmU7CiAgICBldmVudHMgPSBlbC5uYXRpdmVFdmVudHMgfHwgKGVsLm5hdGl2ZUV2ZW50cyA9IHt9KTsKICB9IGVsc2UgewogICAgZXZlbnRzID0gZWwuZXZlbnRzIHx8IChlbC5ldmVudHMgPSB7fSk7CiAgfQoKICB2YXIgbmV3SGFuZGxlciA9IHsKICAgIHZhbHVlOiB2YWx1ZS50cmltKCkKICB9OwogIGlmIChtb2RpZmllcnMgIT09IGVtcHR5T2JqZWN0KSB7CiAgICBuZXdIYW5kbGVyLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKICB9CgogIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoQXJyYXkuaXNBcnJheShoYW5kbGVycykpIHsKICAgIGltcG9ydGFudCA/IGhhbmRsZXJzLnVuc2hpZnQobmV3SGFuZGxlcikgOiBoYW5kbGVycy5wdXNoKG5ld0hhbmRsZXIpOwogIH0gZWxzZSBpZiAoaGFuZGxlcnMpIHsKICAgIGV2ZW50c1tuYW1lXSA9IGltcG9ydGFudCA/IFtuZXdIYW5kbGVyLCBoYW5kbGVyc10gOiBbaGFuZGxlcnMsIG5ld0hhbmRsZXJdOwogIH0gZWxzZSB7CiAgICBldmVudHNbbmFtZV0gPSBuZXdIYW5kbGVyOwogIH0KCiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0QmluZGluZ0F0dHIgKAogIGVsLAogIG5hbWUsCiAgZ2V0U3RhdGljCikgewogIHZhciBkeW5hbWljVmFsdWUgPQogICAgZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJzonICsgbmFtZSkgfHwKICAgIGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWJpbmQ6JyArIG5hbWUpOwogIGlmIChkeW5hbWljVmFsdWUgIT0gbnVsbCkgewogICAgcmV0dXJuIHBhcnNlRmlsdGVycyhkeW5hbWljVmFsdWUpCiAgfSBlbHNlIGlmIChnZXRTdGF0aWMgIT09IGZhbHNlKSB7CiAgICB2YXIgc3RhdGljVmFsdWUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCBuYW1lKTsKICAgIGlmIChzdGF0aWNWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0aWNWYWx1ZSkKICAgIH0KICB9Cn0KCi8vIG5vdGU6IHRoaXMgb25seSByZW1vdmVzIHRoZSBhdHRyIGZyb20gdGhlIEFycmF5IChhdHRyc0xpc3QpIHNvIHRoYXQgaXQKLy8gZG9lc24ndCBnZXQgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NBdHRycy4KLy8gQnkgZGVmYXVsdCBpdCBkb2VzIE5PVCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwIChhdHRyc01hcCkgYmVjYXVzZSB0aGUgbWFwIGlzCi8vIG5lZWRlZCBkdXJpbmcgY29kZWdlbi4KZnVuY3Rpb24gZ2V0QW5kUmVtb3ZlQXR0ciAoCiAgZWwsCiAgbmFtZSwKICByZW1vdmVGcm9tTWFwCikgewogIHZhciB2YWw7CiAgaWYgKCh2YWwgPSBlbC5hdHRyc01hcFtuYW1lXSkgIT0gbnVsbCkgewogICAgdmFyIGxpc3QgPSBlbC5hdHRyc0xpc3Q7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICBsaXN0LnNwbGljZShpLCAxKTsKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQogIGlmIChyZW1vdmVGcm9tTWFwKSB7CiAgICBkZWxldGUgZWwuYXR0cnNNYXBbbmFtZV07CiAgfQogIHJldHVybiB2YWwKfQoKLyogICovCgovKioKICogQ3Jvc3MtcGxhdGZvcm0gY29kZSBnZW5lcmF0aW9uIGZvciBjb21wb25lbnQgdi1tb2RlbAogKi8KZnVuY3Rpb24gZ2VuQ29tcG9uZW50TW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgcmVmID0gbW9kaWZpZXJzIHx8IHt9OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CgogIHZhciBiYXNlVmFsdWVFeHByZXNzaW9uID0gJyQkdic7CiAgdmFyIHZhbHVlRXhwcmVzc2lvbiA9IGJhc2VWYWx1ZUV4cHJlc3Npb247CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9CiAgICAgICIodHlwZW9mICIgKyBiYXNlVmFsdWVFeHByZXNzaW9uICsgIiA9PT0gJ3N0cmluZyciICsKICAgICAgIj8gIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiLnRyaW0oKSIgKwogICAgICAiOiAiICsgYmFzZVZhbHVlRXhwcmVzc2lvbiArICIpIjsKICB9CiAgaWYgKG51bWJlcikgewogICAgdmFsdWVFeHByZXNzaW9uID0gIl9uKCIgKyB2YWx1ZUV4cHJlc3Npb24gKyAiKSI7CiAgfQogIHZhciBhc3NpZ25tZW50ID0gZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIHZhbHVlRXhwcmVzc2lvbik7CgogIGVsLm1vZGVsID0gewogICAgdmFsdWU6ICgiKCIgKyB2YWx1ZSArICIpIiksCiAgICBleHByZXNzaW9uOiAoIlwiIiArIHZhbHVlICsgIlwiIiksCiAgICBjYWxsYmFjazogKCJmdW5jdGlvbiAoIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiKSB7IiArIGFzc2lnbm1lbnQgKyAifSIpCiAgfTsKfQoKLyoqCiAqIENyb3NzLXBsYXRmb3JtIGNvZGVnZW4gaGVscGVyIGZvciBnZW5lcmF0aW5nIHYtbW9kZWwgdmFsdWUgYXNzaWdubWVudCBjb2RlLgogKi8KZnVuY3Rpb24gZ2VuQXNzaWdubWVudENvZGUgKAogIHZhbHVlLAogIGFzc2lnbm1lbnQKKSB7CiAgdmFyIHJlcyA9IHBhcnNlTW9kZWwodmFsdWUpOwogIGlmIChyZXMua2V5ID09PSBudWxsKSB7CiAgICByZXR1cm4gKHZhbHVlICsgIj0iICsgYXNzaWdubWVudCkKICB9IGVsc2UgewogICAgcmV0dXJuICgiJHNldCgiICsgKHJlcy5leHApICsgIiwgIiArIChyZXMua2V5KSArICIsICIgKyBhc3NpZ25tZW50ICsgIikiKQogIH0KfQoKLyoqCiAqIFBhcnNlIGEgdi1tb2RlbCBleHByZXNzaW9uIGludG8gYSBiYXNlIHBhdGggYW5kIGEgZmluYWwga2V5IHNlZ21lbnQuCiAqIEhhbmRsZXMgYm90aCBkb3QtcGF0aCBhbmQgcG9zc2libGUgc3F1YXJlIGJyYWNrZXRzLgogKgogKiBQb3NzaWJsZSBjYXNlczoKICoKICogLSB0ZXN0CiAqIC0gdGVzdFtrZXldCiAqIC0gdGVzdFt0ZXN0MVtrZXldXQogKiAtIHRlc3RbImEiXVtrZXldCiAqIC0geHh4LnRlc3RbYVthXS50ZXN0MVtrZXldXQogKiAtIHRlc3QueHh4LmFbImFzYSJdW3Rlc3QxW2tleV1dCiAqCiAqLwoKdmFyIGxlbjsKdmFyIHN0cjsKdmFyIGNocjsKdmFyIGluZGV4JDE7CnZhciBleHByZXNzaW9uUG9zOwp2YXIgZXhwcmVzc2lvbkVuZFBvczsKCgoKZnVuY3Rpb24gcGFyc2VNb2RlbCAodmFsKSB7CiAgLy8gRml4IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvcHVsbC83NzMwCiAgLy8gYWxsb3cgdi1tb2RlbD0ib2JqLnZhbCAiICh0cmFpbGluZyB3aGl0ZXNwYWNlKQogIHZhbCA9IHZhbC50cmltKCk7CiAgbGVuID0gdmFsLmxlbmd0aDsKCiAgaWYgKHZhbC5pbmRleE9mKCdbJykgPCAwIHx8IHZhbC5sYXN0SW5kZXhPZignXScpIDwgbGVuIC0gMSkgewogICAgaW5kZXgkMSA9IHZhbC5sYXN0SW5kZXhPZignLicpOwogICAgaWYgKGluZGV4JDEgPiAtMSkgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLnNsaWNlKDAsIGluZGV4JDEpLAogICAgICAgIGtleTogJyInICsgdmFsLnNsaWNlKGluZGV4JDEgKyAxKSArICciJwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLAogICAgICAgIGtleTogbnVsbAogICAgICB9CiAgICB9CiAgfQoKICBzdHIgPSB2YWw7CiAgaW5kZXgkMSA9IGV4cHJlc3Npb25Qb3MgPSBleHByZXNzaW9uRW5kUG9zID0gMDsKCiAgd2hpbGUgKCFlb2YoKSkgewogICAgY2hyID0gbmV4dCgpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QikgewogICAgICBwYXJzZUJyYWNrZXQoY2hyKTsKICAgIH0KICB9CgogIHJldHVybiB7CiAgICBleHA6IHZhbC5zbGljZSgwLCBleHByZXNzaW9uUG9zKSwKICAgIGtleTogdmFsLnNsaWNlKGV4cHJlc3Npb25Qb3MgKyAxLCBleHByZXNzaW9uRW5kUG9zKQogIH0KfQoKZnVuY3Rpb24gbmV4dCAoKSB7CiAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgkMSkKfQoKZnVuY3Rpb24gZW9mICgpIHsKICByZXR1cm4gaW5kZXgkMSA+PSBsZW4KfQoKZnVuY3Rpb24gaXNTdHJpbmdTdGFydCAoY2hyKSB7CiAgcmV0dXJuIGNociA9PT0gMHgyMiB8fCBjaHIgPT09IDB4MjcKfQoKZnVuY3Rpb24gcGFyc2VCcmFja2V0IChjaHIpIHsKICB2YXIgaW5CcmFja2V0ID0gMTsKICBleHByZXNzaW9uUG9zID0gaW5kZXgkMTsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAoY2hyID09PSAweDVCKSB7IGluQnJhY2tldCsrOyB9CiAgICBpZiAoY2hyID09PSAweDVEKSB7IGluQnJhY2tldC0tOyB9CiAgICBpZiAoaW5CcmFja2V0ID09PSAwKSB7CiAgICAgIGV4cHJlc3Npb25FbmRQb3MgPSBpbmRleCQxOwogICAgICBicmVhawogICAgfQogIH0KfQoKZnVuY3Rpb24gcGFyc2VTdHJpbmcgKGNocikgewogIHZhciBzdHJpbmdRdW90ZSA9IGNocjsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoY2hyID09PSBzdHJpbmdRdW90ZSkgewogICAgICBicmVhawogICAgfQogIH0KfQoKLyogICovCgp2YXIgd2FybiQxOwoKLy8gaW4gc29tZSBjYXNlcywgdGhlIGV2ZW50IHVzZWQgaGFzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZQovLyBzbyB3ZSB1c2VkIHNvbWUgcmVzZXJ2ZWQgdG9rZW5zIGR1cmluZyBjb21waWxlLgp2YXIgUkFOR0VfVE9LRU4gPSAnX19yJzsKdmFyIENIRUNLQk9YX1JBRElPX1RPS0VOID0gJ19fYyc7CgpmdW5jdGlvbiBtb2RlbCAoCiAgZWwsCiAgZGlyLAogIF93YXJuCikgewogIHdhcm4kMSA9IF93YXJuOwogIHZhciB2YWx1ZSA9IGRpci52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVyczsKICB2YXIgdGFnID0gZWwudGFnOwogIHZhciB0eXBlID0gZWwuYXR0cnNNYXAudHlwZTsKCiAgewogICAgLy8gaW5wdXRzIHdpdGggdHlwZT0iZmlsZSIgYXJlIHJlYWQgb25seSBhbmQgc2V0dGluZyB0aGUgaW5wdXQncwogICAgLy8gdmFsdWUgd2lsbCB0aHJvdyBhbiBlcnJvci4KICAgIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2ZpbGUnKSB7CiAgICAgIHdhcm4kMSgKICAgICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIiB0eXBlPVwiZmlsZVwiPjpcbiIgKwogICAgICAgICJGaWxlIGlucHV0cyBhcmUgcmVhZCBvbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLiIKICAgICAgKTsKICAgIH0KICB9CgogIGlmIChlbC5jb21wb25lbnQpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgIGdlblNlbGVjdChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2NoZWNrYm94JykgewogICAgZ2VuQ2hlY2tib3hNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ3JhZGlvJykgewogICAgZ2VuUmFkaW9Nb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7CiAgICBnZW5EZWZhdWx0TW9kZWwoZWwsIHZhbHVlLCBtb2RpZmllcnMpOwogIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgewogICAgd2FybiQxKAogICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIj46ICIgKwogICAgICAidi1tb2RlbCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZWxlbWVudCB0eXBlLiAiICsKICAgICAgJ0lmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbnRlbnRlZGl0YWJsZSwgaXRcJ3MgcmVjb21tZW5kZWQgdG8gJyArCiAgICAgICd3cmFwIGEgbGlicmFyeSBkZWRpY2F0ZWQgZm9yIHRoYXQgcHVycG9zZSBpbnNpZGUgYSBjdXN0b20gY29tcG9uZW50LicKICAgICk7CiAgfQoKICAvLyBlbnN1cmUgcnVudGltZSBkaXJlY3RpdmUgbWV0YWRhdGEKICByZXR1cm4gdHJ1ZQp9CgpmdW5jdGlvbiBnZW5DaGVja2JveE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciB2YWx1ZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3ZhbHVlJykgfHwgJ251bGwnOwogIHZhciB0cnVlVmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICd0cnVlLXZhbHVlJykgfHwgJ3RydWUnOwogIHZhciBmYWxzZVZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnZmFsc2UtdmFsdWUnKSB8fCAnZmFsc2UnOwogIGFkZFByb3AoZWwsICdjaGVja2VkJywKICAgICJBcnJheS5pc0FycmF5KCIgKyB2YWx1ZSArICIpIiArCiAgICAiP19pKCIgKyB2YWx1ZSArICIsIiArIHZhbHVlQmluZGluZyArICIpPi0xIiArICgKICAgICAgdHJ1ZVZhbHVlQmluZGluZyA9PT0gJ3RydWUnCiAgICAgICAgPyAoIjooIiArIHZhbHVlICsgIikiKQogICAgICAgIDogKCI6X3EoIiArIHZhbHVlICsgIiwiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpIikKICAgICkKICApOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLAogICAgInZhciAkJGE9IiArIHZhbHVlICsgIiwiICsKICAgICAgICAnJCRlbD0kZXZlbnQudGFyZ2V0LCcgKwogICAgICAgICIkJGM9JCRlbC5jaGVja2VkPygiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpOigiICsgZmFsc2VWYWx1ZUJpbmRpbmcgKyAiKTsiICsKICAgICdpZihBcnJheS5pc0FycmF5KCQkYSkpeycgKwogICAgICAidmFyICQkdj0iICsgKG51bWJlciA/ICdfbignICsgdmFsdWVCaW5kaW5nICsgJyknIDogdmFsdWVCaW5kaW5nKSArICIsIiArCiAgICAgICAgICAnJCRpPV9pKCQkYSwkJHYpOycgKwogICAgICAiaWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIgKyAoZ2VuQXNzaWdubWVudENvZGUodmFsdWUsICckJGEuY29uY2F0KFskJHZdKScpKSArICIpfSIgKwogICAgICAiZWxzZXskJGk+LTEmJigiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSknKSkgKyAiKX0iICsKICAgICJ9ZWxzZXsiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRjJykpICsgIn0iLAogICAgbnVsbCwgdHJ1ZQogICk7Cn0KCmZ1bmN0aW9uIGdlblJhZGlvTW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgbnVtYmVyID0gbW9kaWZpZXJzICYmIG1vZGlmaWVycy5udW1iZXI7CiAgdmFyIHZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKSB8fCAnbnVsbCc7CiAgdmFsdWVCaW5kaW5nID0gbnVtYmVyID8gKCJfbigiICsgdmFsdWVCaW5kaW5nICsgIikiKSA6IHZhbHVlQmluZGluZzsKICBhZGRQcm9wKGVsLCAnY2hlY2tlZCcsICgiX3EoIiArIHZhbHVlICsgIiwiICsgdmFsdWVCaW5kaW5nICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsIGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCB2YWx1ZUJpbmRpbmcpLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuU2VsZWN0ICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciBzZWxlY3RlZFZhbCA9ICJBcnJheS5wcm90b3R5cGUuZmlsdGVyIiArCiAgICAiLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLGZ1bmN0aW9uKG8pe3JldHVybiBvLnNlbGVjdGVkfSkiICsKICAgICIubWFwKGZ1bmN0aW9uKG8pe3ZhciB2YWwgPSBcIl92YWx1ZVwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7IiArCiAgICAicmV0dXJuICIgKyAobnVtYmVyID8gJ19uKHZhbCknIDogJ3ZhbCcpICsgIn0pIjsKCiAgdmFyIGFzc2lnbm1lbnQgPSAnJGV2ZW50LnRhcmdldC5tdWx0aXBsZSA/ICQkc2VsZWN0ZWRWYWwgOiAkJHNlbGVjdGVkVmFsWzBdJzsKICB2YXIgY29kZSA9ICJ2YXIgJCRzZWxlY3RlZFZhbCA9ICIgKyBzZWxlY3RlZFZhbCArICI7IjsKICBjb2RlID0gY29kZSArICIgIiArIChnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgYXNzaWdubWVudCkpOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLCBjb2RlLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuRGVmYXVsdE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIHR5cGUgPSBlbC5hdHRyc01hcC50eXBlOwoKICAvLyB3YXJuIGlmIHYtYmluZDp2YWx1ZSBjb25mbGljdHMgd2l0aCB2LW1vZGVsCiAgLy8gZXhjZXB0IGZvciBpbnB1dHMgd2l0aCB2LWJpbmQ6dHlwZQogIHsKICAgIHZhciB2YWx1ZSQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddIHx8IGVsLmF0dHJzTWFwWyc6dmFsdWUnXTsKICAgIHZhciB0eXBlQmluZGluZyA9IGVsLmF0dHJzTWFwWyd2LWJpbmQ6dHlwZSddIHx8IGVsLmF0dHJzTWFwWyc6dHlwZSddOwogICAgaWYgKHZhbHVlJDEgJiYgIXR5cGVCaW5kaW5nKSB7CiAgICAgIHZhciBiaW5kaW5nID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddID8gJ3YtYmluZDp2YWx1ZScgOiAnOnZhbHVlJzsKICAgICAgd2FybiQxKAogICAgICAgIGJpbmRpbmcgKyAiPVwiIiArIHZhbHVlJDEgKyAiXCIgY29uZmxpY3RzIHdpdGggdi1tb2RlbCBvbiB0aGUgc2FtZSBlbGVtZW50ICIgKwogICAgICAgICdiZWNhdXNlIHRoZSBsYXR0ZXIgYWxyZWFkeSBleHBhbmRzIHRvIGEgdmFsdWUgYmluZGluZyBpbnRlcm5hbGx5JwogICAgICApOwogICAgfQogIH0KCiAgdmFyIHJlZiA9IG1vZGlmaWVycyB8fCB7fTsKICB2YXIgbGF6eSA9IHJlZi5sYXp5OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CiAgdmFyIG5lZWRDb21wb3NpdGlvbkd1YXJkID0gIWxhenkgJiYgdHlwZSAhPT0gJ3JhbmdlJzsKICB2YXIgZXZlbnQgPSBsYXp5CiAgICA/ICdjaGFuZ2UnCiAgICA6IHR5cGUgPT09ICdyYW5nZScKICAgICAgPyBSQU5HRV9UT0tFTgogICAgICA6ICdpbnB1dCc7CgogIHZhciB2YWx1ZUV4cHJlc3Npb24gPSAnJGV2ZW50LnRhcmdldC52YWx1ZSc7CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKSI7CiAgfQogIGlmIChudW1iZXIpIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICJfbigiICsgdmFsdWVFeHByZXNzaW9uICsgIikiOwogIH0KCiAgdmFyIGNvZGUgPSBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgdmFsdWVFeHByZXNzaW9uKTsKICBpZiAobmVlZENvbXBvc2l0aW9uR3VhcmQpIHsKICAgIGNvZGUgPSAiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIgKyBjb2RlOwogIH0KCiAgYWRkUHJvcChlbCwgJ3ZhbHVlJywgKCIoIiArIHZhbHVlICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgZXZlbnQsIGNvZGUsIG51bGwsIHRydWUpOwogIGlmICh0cmltIHx8IG51bWJlcikgewogICAgYWRkSGFuZGxlcihlbCwgJ2JsdXInLCAnJGZvcmNlVXBkYXRlKCknKTsKICB9Cn0KCi8qICAqLwoKLy8gbm9ybWFsaXplIHYtbW9kZWwgZXZlbnQgdG9rZW5zIHRoYXQgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLgovLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlCi8vIHRoZSB3aG9sZSBwb2ludCBpcyBlbnN1cmluZyB0aGUgdi1tb2RlbCBjYWxsYmFjayBnZXRzIGNhbGxlZCBiZWZvcmUKLy8gdXNlci1hdHRhY2hlZCBoYW5kbGVycy4KZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltSQU5HRV9UT0tFTl0pKSB7CiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50CiAgICB2YXIgZXZlbnQgPSBpc0lFID8gJ2NoYW5nZScgOiAnaW5wdXQnOwogICAgb25bZXZlbnRdID0gW10uY29uY2F0KG9uW1JBTkdFX1RPS0VOXSwgb25bZXZlbnRdIHx8IFtdKTsKICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07CiAgfQogIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gZml4ICM0NTIxIGJ1dCBubyBsb25nZXIgbmVjZXNzYXJ5CiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltDSEVDS0JPWF9SQURJT19UT0tFTl0pKSB7CiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pOwogICAgZGVsZXRlIG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXTsKICB9Cn0KCnZhciB0YXJnZXQkMTsKCmZ1bmN0aW9uIGNyZWF0ZU9uY2VIYW5kbGVyIChoYW5kbGVyLCBldmVudCwgY2FwdHVyZSkgewogIHZhciBfdGFyZ2V0ID0gdGFyZ2V0JDE7IC8vIHNhdmUgY3VycmVudCB0YXJnZXQgZWxlbWVudCBpbiBjbG9zdXJlCiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHsKICAgIHZhciByZXMgPSBoYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzICE9PSBudWxsKSB7CiAgICAgIHJlbW92ZSQyKGV2ZW50LCBvbmNlSGFuZGxlciwgY2FwdHVyZSwgX3RhcmdldCk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBhZGQkMSAoCiAgZXZlbnQsCiAgaGFuZGxlciwKICBvbmNlJCQxLAogIGNhcHR1cmUsCiAgcGFzc2l2ZQopIHsKICBoYW5kbGVyID0gd2l0aE1hY3JvVGFzayhoYW5kbGVyKTsKICBpZiAob25jZSQkMSkgeyBoYW5kbGVyID0gY3JlYXRlT25jZUhhbmRsZXIoaGFuZGxlciwgZXZlbnQsIGNhcHR1cmUpOyB9CiAgdGFyZ2V0JDEuYWRkRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlciwKICAgIHN1cHBvcnRzUGFzc2l2ZQogICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9CiAgICAgIDogY2FwdHVyZQogICk7Cn0KCmZ1bmN0aW9uIHJlbW92ZSQyICgKICBldmVudCwKICBoYW5kbGVyLAogIGNhcHR1cmUsCiAgX3RhcmdldAopIHsKICAoX3RhcmdldCB8fCB0YXJnZXQkMSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlci5fd2l0aFRhc2sgfHwgaGFuZGxlciwKICAgIGNhcHR1cmUKICApOwp9CgpmdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEub24pICYmIGlzVW5kZWYodm5vZGUuZGF0YS5vbikpIHsKICAgIHJldHVybgogIH0KICB2YXIgb24gPSB2bm9kZS5kYXRhLm9uIHx8IHt9OwogIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307CiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07CiAgbm9ybWFsaXplRXZlbnRzKG9uKTsKICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpOwogIHRhcmdldCQxID0gdW5kZWZpbmVkOwp9Cgp2YXIgZXZlbnRzID0gewogIGNyZWF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzLAogIHVwZGF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlRE9NUHJvcHMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuZG9tUHJvcHMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5kb21Qcm9wcykpIHsKICAgIHJldHVybgogIH0KICB2YXIga2V5LCBjdXI7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkUHJvcHMgPSBvbGRWbm9kZS5kYXRhLmRvbVByb3BzIHx8IHt9OwogIHZhciBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKHByb3BzLl9fb2JfXykpIHsKICAgIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHMpOwogIH0KCiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHsKICAgIGlmIChpc1VuZGVmKHByb3BzW2tleV0pKSB7CiAgICAgIGVsbVtrZXldID0gJyc7CiAgICB9CiAgfQogIGZvciAoa2V5IGluIHByb3BzKSB7CiAgICBjdXIgPSBwcm9wc1trZXldOwogICAgLy8gaWdub3JlIGNoaWxkcmVuIGlmIHRoZSBub2RlIGhhcyB0ZXh0Q29udGVudCBvciBpbm5lckhUTUwsCiAgICAvLyBhcyB0aGVzZSB3aWxsIHRocm93IGF3YXkgZXhpc3RpbmcgRE9NIG5vZGVzIGFuZCBjYXVzZSByZW1vdmFsIGVycm9ycwogICAgLy8gb24gc3Vic2VxdWVudCBwYXRjaGVzICgjMzM2MCkKICAgIGlmIChrZXkgPT09ICd0ZXh0Q29udGVudCcgfHwga2V5ID09PSAnaW5uZXJIVE1MJykgewogICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHsgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID0gMDsgfQogICAgICBpZiAoY3VyID09PSBvbGRQcm9wc1trZXldKSB7IGNvbnRpbnVlIH0KICAgICAgLy8gIzY2MDEgd29yayBhcm91bmQgQ2hyb21lIHZlcnNpb24gPD0gNTUgYnVnIHdoZXJlIHNpbmdsZSB0ZXh0Tm9kZQogICAgICAvLyByZXBsYWNlZCBieSBpbm5lckhUTUwvdGV4dENvbnRlbnQgcmV0YWlucyBpdHMgcGFyZW50Tm9kZSBwcm9wZXJ0eQogICAgICBpZiAoZWxtLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5jaGlsZE5vZGVzWzBdKTsKICAgICAgfQogICAgfQoKICAgIGlmIChrZXkgPT09ICd2YWx1ZScpIHsKICAgICAgLy8gc3RvcmUgdmFsdWUgYXMgX3ZhbHVlIGFzIHdlbGwgc2luY2UKICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZAogICAgICBlbG0uX3ZhbHVlID0gY3VyOwogICAgICAvLyBhdm9pZCByZXNldHRpbmcgY3Vyc29yIHBvc2l0aW9uIHdoZW4gdmFsdWUgaXMgdGhlIHNhbWUKICAgICAgdmFyIHN0ckN1ciA9IGlzVW5kZWYoY3VyKSA/ICcnIDogU3RyaW5nKGN1cik7CiAgICAgIGlmIChzaG91bGRVcGRhdGVWYWx1ZShlbG0sIHN0ckN1cikpIHsKICAgICAgICBlbG0udmFsdWUgPSBzdHJDdXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVsbVtrZXldID0gY3VyOwogICAgfQogIH0KfQoKLy8gY2hlY2sgcGxhdGZvcm1zL3dlYi91dGlsL2F0dHJzLmpzIGFjY2VwdFZhbHVlCgoKZnVuY3Rpb24gc2hvdWxkVXBkYXRlVmFsdWUgKGVsbSwgY2hlY2tWYWwpIHsKICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmICgKICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fAogICAgaXNOb3RJbkZvY3VzQW5kRGlydHkoZWxtLCBjaGVja1ZhbCkgfHwKICAgIGlzRGlydHlXaXRoTW9kaWZpZXJzKGVsbSwgY2hlY2tWYWwpCiAgKSkKfQoKZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHsKICAvLyByZXR1cm4gdHJ1ZSB3aGVuIHRleHRib3ggKC5udW1iZXIgYW5kIC50cmltKSBsb3NlcyBmb2N1cyBhbmQgaXRzIHZhbHVlIGlzCiAgLy8gbm90IGVxdWFsIHRvIHRoZSB1cGRhdGVkIHZhbHVlCiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlOwogIC8vICM2MTU3CiAgLy8gd29yayBhcm91bmQgSUUgYnVnIHdoZW4gYWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW4gYW4gaWZyYW1lCiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge30KICByZXR1cm4gbm90SW5Gb2N1cyAmJiBlbG0udmFsdWUgIT09IGNoZWNrVmFsCn0KCmZ1bmN0aW9uIGlzRGlydHlXaXRoTW9kaWZpZXJzIChlbG0sIG5ld1ZhbCkgewogIHZhciB2YWx1ZSA9IGVsbS52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWUKICBpZiAoaXNEZWYobW9kaWZpZXJzKSkgewogICAgaWYgKG1vZGlmaWVycy5sYXp5KSB7CiAgICAgIC8vIGlucHV0cyB3aXRoIGxhenkgc2hvdWxkIG9ubHkgYmUgdXBkYXRlZCB3aGVuIG5vdCBpbiBmb2N1cwogICAgICByZXR1cm4gZmFsc2UKICAgIH0KICAgIGlmIChtb2RpZmllcnMubnVtYmVyKSB7CiAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgIT09IHRvTnVtYmVyKG5ld1ZhbCkKICAgIH0KICAgIGlmIChtb2RpZmllcnMudHJpbSkgewogICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSBuZXdWYWwudHJpbSgpCiAgICB9CiAgfQogIHJldHVybiB2YWx1ZSAhPT0gbmV3VmFsCn0KCnZhciBkb21Qcm9wcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLAogIHVwZGF0ZTogdXBkYXRlRE9NUHJvcHMKfQoKLyogICovCgp2YXIgcGFyc2VTdHlsZVRleHQgPSBjYWNoZWQoZnVuY3Rpb24gKGNzc1RleHQpIHsKICB2YXIgcmVzID0ge307CiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXCkpL2c7CiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLzsKICBjc3NUZXh0LnNwbGl0KGxpc3REZWxpbWl0ZXIpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmIChpdGVtKSB7CiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTsKICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJlc1t0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpOwogICAgfQogIH0pOwogIHJldHVybiByZXMKfSk7CgovLyBtZXJnZSBzdGF0aWMgYW5kIGR5bmFtaWMgc3R5bGUgZGF0YSBvbiB0aGUgc2FtZSB2bm9kZQpmdW5jdGlvbiBub3JtYWxpemVTdHlsZURhdGEgKGRhdGEpIHsKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZGF0YS5zdHlsZSk7CiAgLy8gc3RhdGljIHN0eWxlIGlzIHByZS1wcm9jZXNzZWQgaW50byBhbiBvYmplY3QgZHVyaW5nIGNvbXBpbGF0aW9uCiAgLy8gYW5kIGlzIGFsd2F5cyBhIGZyZXNoIG9iamVjdCwgc28gaXQncyBzYWZlIHRvIG1lcmdlIGludG8gaXQKICByZXR1cm4gZGF0YS5zdGF0aWNTdHlsZQogICAgPyBleHRlbmQoZGF0YS5zdGF0aWNTdHlsZSwgc3R5bGUpCiAgICA6IHN0eWxlCn0KCi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3QKZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHsKICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nU3R5bGUpKSB7CiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKQogIH0KICBpZiAodHlwZW9mIGJpbmRpbmdTdHlsZSA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpCiAgfQogIHJldHVybiBiaW5kaW5nU3R5bGUKfQoKLyoqCiAqIHBhcmVudCBjb21wb25lbnQgc3R5bGUgc2hvdWxkIGJlIGFmdGVyIGNoaWxkJ3MKICogc28gdGhhdCBwYXJlbnQgY29tcG9uZW50J3Mgc3R5bGUgY291bGQgb3ZlcnJpZGUgaXQKICovCmZ1bmN0aW9uIGdldFN0eWxlICh2bm9kZSwgY2hlY2tDaGlsZCkgewogIHZhciByZXMgPSB7fTsKICB2YXIgc3R5bGVEYXRhOwoKICBpZiAoY2hlY2tDaGlsZCkgewogICAgdmFyIGNoaWxkTm9kZSA9IHZub2RlOwogICAgd2hpbGUgKGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZSkgewogICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlOwogICAgICBpZiAoCiAgICAgICAgY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhICYmCiAgICAgICAgKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YShjaGlsZE5vZGUuZGF0YSkpCiAgICAgICkgewogICAgICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICgoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHZub2RlLmRhdGEpKSkgewogICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICB9CgogIHZhciBwYXJlbnROb2RlID0gdm5vZGU7CiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7CiAgICBpZiAocGFyZW50Tm9kZS5kYXRhICYmIChzdHlsZURhdGEgPSBub3JtYWxpemVTdHlsZURhdGEocGFyZW50Tm9kZS5kYXRhKSkpIHsKICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCnZhciBjc3NWYXJSRSA9IC9eLS0vOwp2YXIgaW1wb3J0YW50UkUgPSAvXHMqIWltcG9ydGFudCQvOwp2YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGNzc1ZhclJFLnRlc3QobmFtZSkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7CiAgfSBlbHNlIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCAnJyksICdpbXBvcnRhbnQnKTsKICB9IGVsc2UgewogICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplKG5hbWUpOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAvLyBTdXBwb3J0IHZhbHVlcyBhcnJheSBjcmVhdGVkIGJ5IGF1dG9wcmVmaXhlciwgZS5nLgogICAgICAvLyB7ZGlzcGxheTogWyItd2Via2l0LWJveCIsICItbXMtZmxleGJveCIsICJmbGV4Il19CiAgICAgIC8vIFNldCB0aGVtIG9uZSBieSBvbmUsIGFuZCB0aGUgYnJvd3NlciB3aWxsIG9ubHkgc2V0IHRob3NlIGl0IGNhbiByZWNvZ25pemUKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbC5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbFtpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsOwogICAgfQogIH0KfTsKCnZhciB2ZW5kb3JOYW1lcyA9IFsnV2Via2l0JywgJ01veicsICdtcyddOwoKdmFyIGVtcHR5U3R5bGU7CnZhciBub3JtYWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHByb3ApIHsKICBlbXB0eVN0eWxlID0gZW1wdHlTdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKICBwcm9wID0gY2FtZWxpemUocHJvcCk7CiAgaWYgKHByb3AgIT09ICdmaWx0ZXInICYmIChwcm9wIGluIGVtcHR5U3R5bGUpKSB7CiAgICByZXR1cm4gcHJvcAogIH0KICB2YXIgY2FwTmFtZSA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBuYW1lID0gdmVuZG9yTmFtZXNbaV0gKyBjYXBOYW1lOwogICAgaWYgKG5hbWUgaW4gZW1wdHlTdHlsZSkgewogICAgICByZXR1cm4gbmFtZQogICAgfQogIH0KfSk7CgpmdW5jdGlvbiB1cGRhdGVTdHlsZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTsKCiAgaWYgKGlzVW5kZWYoZGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihkYXRhLnN0eWxlKSAmJgogICAgaXNVbmRlZihvbGREYXRhLnN0YXRpY1N0eWxlKSAmJiBpc1VuZGVmKG9sZERhdGEuc3R5bGUpCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjdXIsIG5hbWU7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwogIHZhciBvbGRTdGF0aWNTdHlsZSA9IG9sZERhdGEuc3RhdGljU3R5bGU7CiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZERhdGEubm9ybWFsaXplZFN0eWxlIHx8IG9sZERhdGEuc3R5bGUgfHwge307CgogIC8vIGlmIHN0YXRpYyBzdHlsZSBleGlzdHMsIHN0eWxlYmluZGluZyBhbHJlYWR5IG1lcmdlZCBpbnRvIGl0IHdoZW4gZG9pbmcgbm9ybWFsaXplU3R5bGVEYXRhCiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nOwoKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcodm5vZGUuZGF0YS5zdHlsZSkgfHwge307CgogIC8vIHN0b3JlIG5vcm1hbGl6ZWQgc3R5bGUgdW5kZXIgYSBkaWZmZXJlbnQga2V5IGZvciBuZXh0IGRpZmYKICAvLyBtYWtlIHN1cmUgdG8gY2xvbmUgaXQgaWYgaXQncyByZWFjdGl2ZSwgc2luY2UgdGhlIHVzZXIgbGlrZWx5IHdhbnRzCiAgLy8gdG8gbXV0YXRlIGl0LgogIHZub2RlLmRhdGEubm9ybWFsaXplZFN0eWxlID0gaXNEZWYoc3R5bGUuX19vYl9fKQogICAgPyBleHRlbmQoe30sIHN0eWxlKQogICAgOiBzdHlsZTsKCiAgdmFyIG5ld1N0eWxlID0gZ2V0U3R5bGUodm5vZGUsIHRydWUpOwoKICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHsKICAgIGlmIChpc1VuZGVmKG5ld1N0eWxlW25hbWVdKSkgewogICAgICBzZXRQcm9wKGVsLCBuYW1lLCAnJyk7CiAgICB9CiAgfQogIGZvciAobmFtZSBpbiBuZXdTdHlsZSkgewogICAgY3VyID0gbmV3U3R5bGVbbmFtZV07CiAgICBpZiAoY3VyICE9PSBvbGRTdHlsZVtuYW1lXSkgewogICAgICAvLyBpZTkgc2V0dGluZyB0byBudWxsIGhhcyBubyBlZmZlY3QsIG11c3QgdXNlIGVtcHR5IHN0cmluZwogICAgICBzZXRQcm9wKGVsLCBuYW1lLCBjdXIgPT0gbnVsbCA/ICcnIDogY3VyKTsKICAgIH0KICB9Cn0KCnZhciBzdHlsZSA9IHsKICBjcmVhdGU6IHVwZGF0ZVN0eWxlLAogIHVwZGF0ZTogdXBkYXRlU3R5bGUKfQoKLyogICovCgovKioKICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gYWRkQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbHMpOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgY3VyID0gIiAiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAiICI7CiAgICBpZiAoY3VyLmluZGV4T2YoJyAnICsgY2xzICsgJyAnKSA8IDApIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIChjdXIgKyBjbHMpLnRyaW0oKSk7CiAgICB9CiAgfQp9CgovKioKICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gcmVtb3ZlQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbHMpOwogICAgfQogICAgaWYgKCFlbC5jbGFzc0xpc3QubGVuZ3RoKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgIH0KICB9IGVsc2UgewogICAgdmFyIGN1ciA9ICIgIiArIChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiOwogICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJzsKICAgIHdoaWxlIChjdXIuaW5kZXhPZih0YXIpID49IDApIHsKICAgICAgY3VyID0gY3VyLnJlcGxhY2UodGFyLCAnICcpOwogICAgfQogICAgY3VyID0gY3VyLnRyaW0oKTsKICAgIGlmIChjdXIpIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGN1cik7CiAgICB9IGVsc2UgewogICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uIChkZWYpIHsKICBpZiAoIWRlZikgewogICAgcmV0dXJuCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKHR5cGVvZiBkZWYgPT09ICdvYmplY3QnKSB7CiAgICB2YXIgcmVzID0ge307CiAgICBpZiAoZGVmLmNzcyAhPT0gZmFsc2UpIHsKICAgICAgZXh0ZW5kKHJlcywgYXV0b0Nzc1RyYW5zaXRpb24oZGVmLm5hbWUgfHwgJ3YnKSk7CiAgICB9CiAgICBleHRlbmQocmVzLCBkZWYpOwogICAgcmV0dXJuIHJlcwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZiA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYpCiAgfQp9Cgp2YXIgYXV0b0Nzc1RyYW5zaXRpb24gPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHsKICByZXR1cm4gewogICAgZW50ZXJDbGFzczogKG5hbWUgKyAiLWVudGVyIiksCiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgIi1lbnRlci10byIpLAogICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyAiLWVudGVyLWFjdGl2ZSIpLAogICAgbGVhdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlIiksCiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgIi1sZWF2ZS10byIpLAogICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlLWFjdGl2ZSIpCiAgfQp9KTsKCnZhciBoYXNUcmFuc2l0aW9uID0gaW5Ccm93c2VyICYmICFpc0lFOTsKdmFyIFRSQU5TSVRJT04gPSAndHJhbnNpdGlvbic7CnZhciBBTklNQVRJT04gPSAnYW5pbWF0aW9uJzsKCi8vIFRyYW5zaXRpb24gcHJvcGVydHkvZXZlbnQgc25pZmZpbmcKdmFyIHRyYW5zaXRpb25Qcm9wID0gJ3RyYW5zaXRpb24nOwp2YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3RyYW5zaXRpb25lbmQnOwp2YXIgYW5pbWF0aW9uUHJvcCA9ICdhbmltYXRpb24nOwp2YXIgYW5pbWF0aW9uRW5kRXZlbnQgPSAnYW5pbWF0aW9uZW5kJzsKaWYgKGhhc1RyYW5zaXRpb24pIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAod2luZG93Lm9udHJhbnNpdGlvbmVuZCA9PT0gdW5kZWZpbmVkICYmCiAgICB3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kICE9PSB1bmRlZmluZWQKICApIHsKICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nOwogICAgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnOwogIH0KICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiYKICAgIHdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCAhPT0gdW5kZWZpbmVkCiAgKSB7CiAgICBhbmltYXRpb25Qcm9wID0gJ1dlYmtpdEFuaW1hdGlvbic7CiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnOwogIH0KfQoKLy8gYmluZGluZyB0byB3aW5kb3cgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaG90IHJlbG9hZCB3b3JrIGluIElFIGluIHN0cmljdCBtb2RlCnZhciByYWYgPSBpbkJyb3dzZXIKICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUKICAgID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykKICAgIDogc2V0VGltZW91dAogIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9OwoKZnVuY3Rpb24gbmV4dEZyYW1lIChmbikgewogIHJhZihmdW5jdGlvbiAoKSB7CiAgICByYWYoZm4pOwogIH0pOwp9CgpmdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICB2YXIgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXMgfHwgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcyA9IFtdKTsKICBpZiAodHJhbnNpdGlvbkNsYXNzZXMuaW5kZXhPZihjbHMpIDwgMCkgewogICAgdHJhbnNpdGlvbkNsYXNzZXMucHVzaChjbHMpOwogICAgYWRkQ2xhc3MoZWwsIGNscyk7CiAgfQp9CgpmdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7CiAgICByZW1vdmUoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpOwogIH0KICByZW1vdmVDbGFzcyhlbCwgY2xzKTsKfQoKZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzICgKICBlbCwKICBleHBlY3RlZFR5cGUsCiAgY2IKKSB7CiAgdmFyIHJlZiA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpOwogIHZhciB0eXBlID0gcmVmLnR5cGU7CiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDsKICB2YXIgcHJvcENvdW50ID0gcmVmLnByb3BDb3VudDsKICBpZiAoIXR5cGUpIHsgcmV0dXJuIGNiKCkgfQogIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDsKICB2YXIgZW5kZWQgPSAwOwogIHZhciBlbmQgPSBmdW5jdGlvbiAoKSB7CiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7CiAgICBjYigpOwogIH07CiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHsKICAgIGlmIChlLnRhcmdldCA9PT0gZWwpIHsKICAgICAgaWYgKCsrZW5kZWQgPj0gcHJvcENvdW50KSB7CiAgICAgICAgZW5kKCk7CiAgICAgIH0KICAgIH0KICB9OwogIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7CiAgICAgIGVuZCgpOwogICAgfQogIH0sIHRpbWVvdXQgKyAxKTsKICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7Cn0KCnZhciB0cmFuc2Zvcm1SRSA9IC9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLzsKCmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvIChlbCwgZXhwZWN0ZWRUeXBlKSB7CiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTsKICB2YXIgdHJhbnNpdGlvbkRlbGF5cyA9IHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEZWxheSddLnNwbGl0KCcsICcpOwogIHZhciB0cmFuc2l0aW9uRHVyYXRpb25zID0gc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7CiAgdmFyIHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTsKICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uRHVyYXRpb25zID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRHVyYXRpb24nXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpOwoKICB2YXIgdHlwZTsKICB2YXIgdGltZW91dCA9IDA7CiAgdmFyIHByb3BDb3VudCA9IDA7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gVFJBTlNJVElPTikgewogICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkgewogICAgICB0eXBlID0gVFJBTlNJVElPTjsKICAgICAgdGltZW91dCA9IHRyYW5zaXRpb25UaW1lb3V0OwogICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDsKICAgIH0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gQU5JTUFUSU9OKSB7CiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHsKICAgICAgdHlwZSA9IEFOSU1BVElPTjsKICAgICAgdGltZW91dCA9IGFuaW1hdGlvblRpbWVvdXQ7CiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7CiAgICB9CiAgfSBlbHNlIHsKICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7CiAgICB0eXBlID0gdGltZW91dCA+IDAKICAgICAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQKICAgICAgICA/IFRSQU5TSVRJT04KICAgICAgICA6IEFOSU1BVElPTgogICAgICA6IG51bGw7CiAgICBwcm9wQ291bnQgPSB0eXBlCiAgICAgID8gdHlwZSA9PT0gVFJBTlNJVElPTgogICAgICAgID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgOiAwOwogIH0KICB2YXIgaGFzVHJhbnNmb3JtID0KICAgIHR5cGUgPT09IFRSQU5TSVRJT04gJiYKICAgIHRyYW5zZm9ybVJFLnRlc3Qoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ1Byb3BlcnR5J10pOwogIHJldHVybiB7CiAgICB0eXBlOiB0eXBlLAogICAgdGltZW91dDogdGltZW91dCwKICAgIHByb3BDb3VudDogcHJvcENvdW50LAogICAgaGFzVHJhbnNmb3JtOiBoYXNUcmFuc2Zvcm0KICB9Cn0KCmZ1bmN0aW9uIGdldFRpbWVvdXQgKGRlbGF5cywgZHVyYXRpb25zKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICB3aGlsZSAoZGVsYXlzLmxlbmd0aCA8IGR1cmF0aW9ucy5sZW5ndGgpIHsKICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTsKICB9CgogIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBkdXJhdGlvbnMubWFwKGZ1bmN0aW9uIChkLCBpKSB7CiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKQogIH0pKQp9CgpmdW5jdGlvbiB0b01zIChzKSB7CiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKSkgKiAxMDAwCn0KCi8qICAqLwoKZnVuY3Rpb24gZW50ZXIgKHZub2RlLCB0b2dnbGVEaXNwbGF5KSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHsKICAgIGVsLl9sZWF2ZUNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fbGVhdmVDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsKICAgIHJldHVybgogIH0KCiAgdmFyIGNzcyA9IGRhdGEuY3NzOwogIHZhciB0eXBlID0gZGF0YS50eXBlOwogIHZhciBlbnRlckNsYXNzID0gZGF0YS5lbnRlckNsYXNzOwogIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzczsKICB2YXIgZW50ZXJBY3RpdmVDbGFzcyA9IGRhdGEuZW50ZXJBY3RpdmVDbGFzczsKICB2YXIgYXBwZWFyQ2xhc3MgPSBkYXRhLmFwcGVhckNsYXNzOwogIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzOwogIHZhciBhcHBlYXJBY3RpdmVDbGFzcyA9IGRhdGEuYXBwZWFyQWN0aXZlQ2xhc3M7CiAgdmFyIGJlZm9yZUVudGVyID0gZGF0YS5iZWZvcmVFbnRlcjsKICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyOwogIHZhciBhZnRlckVudGVyID0gZGF0YS5hZnRlckVudGVyOwogIHZhciBlbnRlckNhbmNlbGxlZCA9IGRhdGEuZW50ZXJDYW5jZWxsZWQ7CiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyOwogIHZhciBhcHBlYXIgPSBkYXRhLmFwcGVhcjsKICB2YXIgYWZ0ZXJBcHBlYXIgPSBkYXRhLmFmdGVyQXBwZWFyOwogIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDsKICB2YXIgZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uOwoKICAvLyBhY3RpdmVJbnN0YW5jZSB3aWxsIGFsd2F5cyBiZSB0aGUgPHRyYW5zaXRpb24+IGNvbXBvbmVudCBtYW5hZ2luZyB0aGlzCiAgLy8gdHJhbnNpdGlvbi4gT25lIGVkZ2UgY2FzZSB0byBjaGVjayBpcyB3aGVuIHRoZSA8dHJhbnNpdGlvbj4gaXMgcGxhY2VkCiAgLy8gYXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNoaWxkIGNvbXBvbmVudC4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY2hlY2sKICAvLyA8dHJhbnNpdGlvbj4ncyBwYXJlbnQgZm9yIGFwcGVhciBjaGVjay4KICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlOwogIHZhciB0cmFuc2l0aW9uTm9kZSA9IGFjdGl2ZUluc3RhbmNlLiR2bm9kZTsKICB3aGlsZSAodHJhbnNpdGlvbk5vZGUgJiYgdHJhbnNpdGlvbk5vZGUucGFyZW50KSB7CiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDsKICAgIGNvbnRleHQgPSB0cmFuc2l0aW9uTm9kZS5jb250ZXh0OwogIH0KCiAgdmFyIGlzQXBwZWFyID0gIWNvbnRleHQuX2lzTW91bnRlZCB8fCAhdm5vZGUuaXNSb290SW5zZXJ0OwoKICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBzdGFydENsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyQ2xhc3MKICAgID8gYXBwZWFyQ2xhc3MKICAgIDogZW50ZXJDbGFzczsKICB2YXIgYWN0aXZlQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJBY3RpdmVDbGFzcwogICAgPyBhcHBlYXJBY3RpdmVDbGFzcwogICAgOiBlbnRlckFjdGl2ZUNsYXNzOwogIHZhciB0b0NsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyVG9DbGFzcwogICAgPyBhcHBlYXJUb0NsYXNzCiAgICA6IGVudGVyVG9DbGFzczsKCiAgdmFyIGJlZm9yZUVudGVySG9vayA9IGlzQXBwZWFyCiAgICA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpCiAgICA6IGJlZm9yZUVudGVyOwogIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAodHlwZW9mIGFwcGVhciA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGVhciA6IGVudGVyKQogICAgOiBlbnRlcjsKICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAoYWZ0ZXJBcHBlYXIgfHwgYWZ0ZXJFbnRlcikKICAgIDogYWZ0ZXJFbnRlcjsKICB2YXIgZW50ZXJDYW5jZWxsZWRIb29rID0gaXNBcHBlYXIKICAgID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkKICAgIDogZW50ZXJDYW5jZWxsZWQ7CgogIHZhciBleHBsaWNpdEVudGVyRHVyYXRpb24gPSB0b051bWJlcigKICAgIGlzT2JqZWN0KGR1cmF0aW9uKQogICAgICA/IGR1cmF0aW9uLmVudGVyCiAgICAgIDogZHVyYXRpb24KICApOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV4cGxpY2l0RW50ZXJEdXJhdGlvbiAhPSBudWxsKSB7CiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbiwgJ2VudGVyJywgdm5vZGUpOwogIH0KCiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTsKICB2YXIgdXNlcldhbnRzQ29udHJvbCA9IGdldEhvb2tBcmd1bWVudHNMZW5ndGgoZW50ZXJIb29rKTsKCiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHsKICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgdG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgfQogICAgaWYgKGNiLmNhbmNlbGxlZCkgewogICAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7CiAgICAgIH0KICAgICAgZW50ZXJDYW5jZWxsZWRIb29rICYmIGVudGVyQ2FuY2VsbGVkSG9vayhlbCk7CiAgICB9IGVsc2UgewogICAgICBhZnRlckVudGVySG9vayAmJiBhZnRlckVudGVySG9vayhlbCk7CiAgICB9CiAgICBlbC5fZW50ZXJDYiA9IG51bGw7CiAgfSk7CgogIGlmICghdm5vZGUuZGF0YS5zaG93KSB7CiAgICAvLyByZW1vdmUgcGVuZGluZyBsZWF2ZSBlbGVtZW50IG9uIGVudGVyIGJ5IGluamVjdGluZyBhbiBpbnNlcnQgaG9vawogICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlOwogICAgICB2YXIgcGVuZGluZ05vZGUgPSBwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nICYmIHBhcmVudC5fcGVuZGluZ1t2bm9kZS5rZXldOwogICAgICBpZiAocGVuZGluZ05vZGUgJiYKICAgICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJgogICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYgogICAgICApIHsKICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTsKICAgICAgfQogICAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgICB9KTsKICB9CgogIC8vIHN0YXJ0IGVudGVyIHRyYW5zaXRpb24KICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTsKICBpZiAoZXhwZWN0c0NTUykgewogICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHsKICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpOwogICAgICAgIGlmICghdXNlcldhbnRzQ29udHJvbCkgewogICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdEVudGVyRHVyYXRpb24pKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0RW50ZXJEdXJhdGlvbik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgaWYgKHZub2RlLmRhdGEuc2hvdykgewogICAgdG9nZ2xlRGlzcGxheSAmJiB0b2dnbGVEaXNwbGF5KCk7CiAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgfQoKICBpZiAoIWV4cGVjdHNDU1MgJiYgIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgIGNiKCk7CiAgfQp9CgpmdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikpIHsKICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fZW50ZXJDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7CiAgICByZXR1cm4gcm0oKQogIH0KCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGlzRGVmKGVsLl9sZWF2ZUNiKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgY3NzID0gZGF0YS5jc3M7CiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7CiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7CiAgdmFyIGxlYXZlVG9DbGFzcyA9IGRhdGEubGVhdmVUb0NsYXNzOwogIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzOwogIHZhciBiZWZvcmVMZWF2ZSA9IGRhdGEuYmVmb3JlTGVhdmU7CiAgdmFyIGxlYXZlID0gZGF0YS5sZWF2ZTsKICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTsKICB2YXIgbGVhdmVDYW5jZWxsZWQgPSBkYXRhLmxlYXZlQ2FuY2VsbGVkOwogIHZhciBkZWxheUxlYXZlID0gZGF0YS5kZWxheUxlYXZlOwogIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247CgogIHZhciBleHBlY3RzQ1NTID0gY3NzICE9PSBmYWxzZSAmJiAhaXNJRTk7CiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGxlYXZlKTsKCiAgdmFyIGV4cGxpY2l0TGVhdmVEdXJhdGlvbiA9IHRvTnVtYmVyKAogICAgaXNPYmplY3QoZHVyYXRpb24pCiAgICAgID8gZHVyYXRpb24ubGVhdmUKICAgICAgOiBkdXJhdGlvbgogICk7CgogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZXhwbGljaXRMZWF2ZUR1cmF0aW9uKSkgewogICAgY2hlY2tEdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24sICdsZWF2ZScsIHZub2RlKTsKICB9CgogIHZhciBjYiA9IGVsLl9sZWF2ZUNiID0gb25jZShmdW5jdGlvbiAoKSB7CiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7CiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7CiAgICB9CiAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7CiAgICB9CiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgfQogICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7CiAgICB9IGVsc2UgewogICAgICBybSgpOwogICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpOwogICAgfQogICAgZWwuX2xlYXZlQ2IgPSBudWxsOwogIH0pOwoKICBpZiAoZGVsYXlMZWF2ZSkgewogICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpOwogIH0gZWxzZSB7CiAgICBwZXJmb3JtTGVhdmUoKTsKICB9CgogIGZ1bmN0aW9uIHBlcmZvcm1MZWF2ZSAoKSB7CiAgICAvLyB0aGUgZGVsYXllZCBsZWF2ZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkCiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIHJldHVybgogICAgfQogICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudAogICAgaWYgKCF2bm9kZS5kYXRhLnNob3cpIHsKICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlOwogICAgfQogICAgYmVmb3JlTGVhdmUgJiYgYmVmb3JlTGVhdmUoZWwpOwogICAgaWYgKGV4cGVjdHNDU1MpIHsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTsKICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpOwogICAgICAgIGlmICghY2IuY2FuY2VsbGVkKSB7CiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgICAgICBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24pKSB7CiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpOwogICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7CiAgICAgIGNiKCk7CiAgICB9CiAgfQp9CgovLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGUKZnVuY3Rpb24gY2hlY2tEdXJhdGlvbiAodmFsLCBuYW1lLCB2bm9kZSkgewogIGlmICh0eXBlb2YgdmFsICE9PSAnbnVtYmVyJykgewogICAgd2FybigKICAgICAgIjx0cmFuc2l0aW9uPiBleHBsaWNpdCAiICsgbmFtZSArICIgZHVyYXRpb24gaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gIiArCiAgICAgICJnb3QgIiArIChKU09OLnN0cmluZ2lmeSh2YWwpKSArICIuIiwKICAgICAgdm5vZGUuY29udGV4dAogICAgKTsKICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHsKICAgIHdhcm4oCiAgICAgICI8dHJhbnNpdGlvbj4gZXhwbGljaXQgIiArIG5hbWUgKyAiIGR1cmF0aW9uIGlzIE5hTiAtICIgKwogICAgICAndGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LicsCiAgICAgIHZub2RlLmNvbnRleHQKICAgICk7CiAgfQp9CgpmdW5jdGlvbiBpc1ZhbGlkRHVyYXRpb24gKHZhbCkgewogIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKQp9CgovKioKICogTm9ybWFsaXplIGEgdHJhbnNpdGlvbiBob29rJ3MgYXJndW1lbnQgbGVuZ3RoLiBUaGUgaG9vayBtYXkgYmU6CiAqIC0gYSBtZXJnZWQgaG9vayAoaW52b2tlcikgd2l0aCB0aGUgb3JpZ2luYWwgaW4gLmZucwogKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aCkKICogLSBhIHBsYWluIGZ1bmN0aW9uICgubGVuZ3RoKQogKi8KZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHsKICBpZiAoaXNVbmRlZihmbikpIHsKICAgIHJldHVybiBmYWxzZQogIH0KICB2YXIgaW52b2tlckZucyA9IGZuLmZuczsKICBpZiAoaXNEZWYoaW52b2tlckZucykpIHsKICAgIC8vIGludm9rZXIKICAgIHJldHVybiBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKAogICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpCiAgICAgICAgPyBpbnZva2VyRm5zWzBdCiAgICAgICAgOiBpbnZva2VyRm5zCiAgICApCiAgfSBlbHNlIHsKICAgIHJldHVybiAoZm4uX2xlbmd0aCB8fCBmbi5sZW5ndGgpID4gMQogIH0KfQoKZnVuY3Rpb24gX2VudGVyIChfLCB2bm9kZSkgewogIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgIGVudGVyKHZub2RlKTsKICB9Cn0KCnZhciB0cmFuc2l0aW9uID0gaW5Ccm93c2VyID8gewogIGNyZWF0ZTogX2VudGVyLAogIGFjdGl2YXRlOiBfZW50ZXIsCiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUkJDEgKHZub2RlLCBybSkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgICAgbGVhdmUodm5vZGUsIHJtKTsKICAgIH0gZWxzZSB7CiAgICAgIHJtKCk7CiAgICB9CiAgfQp9IDoge30KCnZhciBwbGF0Zm9ybU1vZHVsZXMgPSBbCiAgYXR0cnMsCiAga2xhc3MsCiAgZXZlbnRzLAogIGRvbVByb3BzLAogIHN0eWxlLAogIHRyYW5zaXRpb24KXQoKLyogICovCgovLyB0aGUgZGlyZWN0aXZlIG1vZHVsZSBzaG91bGQgYmUgYXBwbGllZCBsYXN0LCBhZnRlciBhbGwKLy8gYnVpbHQtaW4gbW9kdWxlcyBoYXZlIGJlZW4gYXBwbGllZC4KdmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTsKCnZhciBwYXRjaCA9IGNyZWF0ZVBhdGNoRnVuY3Rpb24oeyBub2RlT3BzOiBub2RlT3BzLCBtb2R1bGVzOiBtb2R1bGVzIH0pOwoKLyoqCiAqIE5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBsaWtlIGF0dGFjaGluZwogKiBwcm9wZXJ0aWVzIHRvIEVsZW1lbnRzLgogKi8KCi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwppZiAoaXNJRTkpIHsKICAvLyBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L2ludGVybmV0LWV4cGxvcmVyLTktb25pbnB1dC8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgaWYgKGVsICYmIGVsLnZtb2RlbCkgewogICAgICB0cmlnZ2VyKGVsLCAnaW5wdXQnKTsKICAgIH0KICB9KTsKfQoKdmFyIGRpcmVjdGl2ZSA9IHsKICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVm5vZGUpIHsKICAgIGlmICh2bm9kZS50YWcgPT09ICdzZWxlY3QnKSB7CiAgICAgIC8vICM2OTAzCiAgICAgIGlmIChvbGRWbm9kZS5lbG0gJiYgIW9sZFZub2RlLmVsbS5fdk9wdGlvbnMpIHsKICAgICAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGRpcmVjdGl2ZS5jb21wb25lbnRVcGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICB9CiAgICAgIGVsLl92T3B0aW9ucyA9IFtdLm1hcC5jYWxsKGVsLm9wdGlvbnMsIGdldFZhbHVlKTsKICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGlzVGV4dElucHV0VHlwZShlbC50eXBlKSkgewogICAgICBlbC5fdk1vZGlmaWVycyA9IGJpbmRpbmcubW9kaWZpZXJzOwogICAgICBpZiAoIWJpbmRpbmcubW9kaWZpZXJzLmxhenkpIHsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpOwogICAgICAgIC8vIFNhZmFyaSA8IDEwLjIgJiBVSVdlYlZpZXcgZG9lc24ndCBmaXJlIGNvbXBvc2l0aW9uZW5kIHdoZW4KICAgICAgICAvLyBzd2l0Y2hpbmcgZm9jdXMgYmVmb3JlIGNvbmZpcm1pbmcgY29tcG9zaXRpb24gY2hvaWNlCiAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZQogICAgICAgIC8vIGZpcmVzICJjaGFuZ2UiIGluc3RlYWQgb2YgImlucHV0IiBvbiBhdXRvY29tcGxldGUuCiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKGlzSUU5KSB7CiAgICAgICAgICBlbC52bW9kZWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIGNvbXBvbmVudFVwZGF0ZWQ6IGZ1bmN0aW9uIGNvbXBvbmVudFVwZGF0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSkgewogICAgaWYgKHZub2RlLnRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICAvLyBpbiBjYXNlIHRoZSBvcHRpb25zIHJlbmRlcmVkIGJ5IHYtZm9yIGhhdmUgY2hhbmdlZCwKICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHRoZSB2YWx1ZSBpcyBvdXQtb2Ytc3luYyB3aXRoIHRoZSByZW5kZXJlZCBvcHRpb25zLgogICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmcKICAgICAgLy8gb3B0aW9uIGluIHRoZSBET00uCiAgICAgIHZhciBwcmV2T3B0aW9ucyA9IGVsLl92T3B0aW9uczsKICAgICAgdmFyIGN1ck9wdGlvbnMgPSBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7CiAgICAgIGlmIChjdXJPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG8sIGkpIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHByZXZPcHRpb25zW2ldKTsgfSkpIHsKICAgICAgICAvLyB0cmlnZ2VyIGNoYW5nZSBldmVudCBpZgogICAgICAgIC8vIG5vIG1hdGNoaW5nIG9wdGlvbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlCiAgICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlCiAgICAgICAgICA/IGJpbmRpbmcudmFsdWUuc29tZShmdW5jdGlvbiAodikgeyByZXR1cm4gaGFzTm9NYXRjaGluZ09wdGlvbih2LCBjdXJPcHRpb25zKTsgfSkKICAgICAgICAgIDogYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSAmJiBoYXNOb01hdGNoaW5nT3B0aW9uKGJpbmRpbmcudmFsdWUsIGN1ck9wdGlvbnMpOwogICAgICAgIGlmIChuZWVkUmVzZXQpIHsKICAgICAgICAgIHRyaWdnZXIoZWwsICdjaGFuZ2UnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgpmdW5jdGlvbiBzZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0lFIHx8IGlzRWRnZSkgewogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIGFjdHVhbGx5U2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZtKTsKICAgIH0sIDApOwogIH0KfQoKZnVuY3Rpb24gYWN0dWFsbHlTZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgdmFyIHZhbHVlID0gYmluZGluZy52YWx1ZTsKICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlOwogIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICI8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw9XCIiICsgKGJpbmRpbmcuZXhwcmVzc2lvbikgKyAiXCI+ICIgKwogICAgICAiZXhwZWN0cyBhbiBBcnJheSB2YWx1ZSBmb3IgaXRzIGJpbmRpbmcsIGJ1dCBnb3QgIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSksCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciBzZWxlY3RlZCwgb3B0aW9uOwogIGZvciAodmFyIGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07CiAgICBpZiAoaXNNdWx0aXBsZSkgewogICAgICBzZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgZ2V0VmFsdWUob3B0aW9uKSkgPiAtMTsKICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHsKICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7CiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIHsKICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgICAgfQogICAgfQogIH0KICBpZiAoIWlzTXVsdGlwbGUpIHsKICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTsKICB9Cn0KCmZ1bmN0aW9uIGhhc05vTWF0Y2hpbmdPcHRpb24gKHZhbHVlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG9wdGlvbnMuZXZlcnkoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHZhbHVlKTsgfSkKfQoKZnVuY3Rpb24gZ2V0VmFsdWUgKG9wdGlvbikgewogIHJldHVybiAnX3ZhbHVlJyBpbiBvcHRpb24KICAgID8gb3B0aW9uLl92YWx1ZQogICAgOiBvcHRpb24udmFsdWUKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0IChlKSB7CiAgZS50YXJnZXQuY29tcG9zaW5nID0gdHJ1ZTsKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZCAoZSkgewogIC8vIHByZXZlbnQgdHJpZ2dlcmluZyBhbiBpbnB1dCBldmVudCBmb3Igbm8gcmVhc29uCiAgaWYgKCFlLnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuIH0KICBlLnRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTsKICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTsKfQoKZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHsKICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7CiAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7CiAgZWwuZGlzcGF0Y2hFdmVudChlKTsKfQoKLyogICovCgovLyByZWN1cnNpdmVseSBzZWFyY2ggZm9yIHBvc3NpYmxlIHRyYW5zaXRpb24gZGVmaW5lZCBpbnNpZGUgdGhlIGNvbXBvbmVudCByb290CmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7CiAgcmV0dXJuIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmICghdm5vZGUuZGF0YSB8fCAhdm5vZGUuZGF0YS50cmFuc2l0aW9uKQogICAgPyBsb2NhdGVOb2RlKHZub2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkKICAgIDogdm5vZGUKfQoKdmFyIHNob3cgPSB7CiAgYmluZDogZnVuY3Rpb24gYmluZCAoZWwsIHJlZiwgdm5vZGUpIHsKICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTsKCiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPQogICAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7CiAgICBpZiAodmFsdWUgJiYgdHJhbnNpdGlvbiQkMSkgewogICAgICB2bm9kZS5kYXRhLnNob3cgPSB0cnVlOwogICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkgewogICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gb3JpZ2luYWxEaXNwbGF5IDogJ25vbmUnOwogICAgfQogIH0sCgogIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkgewogICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlOwogICAgdmFyIG9sZFZhbHVlID0gcmVmLm9sZFZhbHVlOwoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKSB7IHJldHVybiB9CiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIGlmICh0cmFuc2l0aW9uJCQxKSB7CiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGVudGVyKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgOiAnbm9uZSc7CiAgICB9CiAgfSwKCiAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQgKAogICAgZWwsCiAgICBiaW5kaW5nLAogICAgdm5vZGUsCiAgICBvbGRWbm9kZSwKICAgIGlzRGVzdHJveQogICkgewogICAgaWYgKCFpc0Rlc3Ryb3kpIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheTsKICAgIH0KICB9Cn0KCnZhciBwbGF0Zm9ybURpcmVjdGl2ZXMgPSB7CiAgbW9kZWw6IGRpcmVjdGl2ZSwKICBzaG93OiBzaG93Cn0KCi8qICAqLwoKLy8gUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBhIHNpbmdsZSBlbGVtZW50L2NvbXBvbmVudC4KLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpCgp2YXIgdHJhbnNpdGlvblByb3BzID0gewogIG5hbWU6IFN0cmluZywKICBhcHBlYXI6IEJvb2xlYW4sCiAgY3NzOiBCb29sZWFuLAogIG1vZGU6IFN0cmluZywKICB0eXBlOiBTdHJpbmcsCiAgZW50ZXJDbGFzczogU3RyaW5nLAogIGxlYXZlQ2xhc3M6IFN0cmluZywKICBlbnRlclRvQ2xhc3M6IFN0cmluZywKICBsZWF2ZVRvQ2xhc3M6IFN0cmluZywKICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsCiAgbGVhdmVBY3RpdmVDbGFzczogU3RyaW5nLAogIGFwcGVhckNsYXNzOiBTdHJpbmcsCiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZywKICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsCiAgZHVyYXRpb246IFtOdW1iZXIsIFN0cmluZywgT2JqZWN0XQp9OwoKLy8gaW4gY2FzZSB0aGUgY2hpbGQgaXMgYWxzbyBhbiBhYnN0cmFjdCBjb21wb25lbnQsIGUuZy4gPGtlZXAtYWxpdmU+Ci8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkCmZ1bmN0aW9uIGdldFJlYWxDaGlsZCAodm5vZGUpIHsKICB2YXIgY29tcE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHJldHVybiBnZXRSZWFsQ2hpbGQoZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChjb21wT3B0aW9ucy5jaGlsZHJlbikpCiAgfSBlbHNlIHsKICAgIHJldHVybiB2bm9kZQogIH0KfQoKZnVuY3Rpb24gZXh0cmFjdFRyYW5zaXRpb25EYXRhIChjb21wKSB7CiAgdmFyIGRhdGEgPSB7fTsKICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7CiAgLy8gcHJvcHMKICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5wcm9wc0RhdGEpIHsKICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTsKICB9CiAgLy8gZXZlbnRzLgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kcwogIHZhciBsaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgZm9yICh2YXIga2V5JDEgaW4gbGlzdGVuZXJzKSB7CiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdOwogIH0KICByZXR1cm4gZGF0YQp9CgpmdW5jdGlvbiBwbGFjZWhvbGRlciAoaCwgcmF3Q2hpbGQpIHsKICBpZiAoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHJhd0NoaWxkLnRhZykpIHsKICAgIHJldHVybiBoKCdrZWVwLWFsaXZlJywgewogICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEKICAgIH0pCiAgfQp9CgpmdW5jdGlvbiBoYXNQYXJlbnRUcmFuc2l0aW9uICh2bm9kZSkgewogIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7CiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBpc1NhbWVDaGlsZCAoY2hpbGQsIG9sZENoaWxkKSB7CiAgcmV0dXJuIG9sZENoaWxkLmtleSA9PT0gY2hpbGQua2V5ICYmIG9sZENoaWxkLnRhZyA9PT0gY2hpbGQudGFnCn0KCnZhciBUcmFuc2l0aW9uID0gewogIG5hbWU6ICd0cmFuc2l0aW9uJywKICBwcm9wczogdHJhbnNpdGlvblByb3BzLAogIGFic3RyYWN0OiB0cnVlLAoKICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdDsKICAgIGlmICghY2hpbGRyZW4pIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcykKICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH0pOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigKICAgICAgICAnPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudC4gVXNlICcgKwogICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsCiAgICAgICAgdGhpcy4kcGFyZW50CiAgICAgICk7CiAgICB9CgogICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7CgogICAgLy8gd2FybiBpbnZhbGlkIG1vZGUKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJwogICAgKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLAogICAgICAgIHRoaXMuJHBhcmVudAogICAgICApOwogICAgfQoKICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdOwoKICAgIC8vIGlmIHRoaXMgaXMgYSBjb21wb25lbnQgcm9vdCBub2RlIGFuZCB0aGUgY29tcG9uZW50J3MKICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLgogICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7CiAgICAgIHJldHVybiByYXdDaGlsZAogICAgfQoKICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gZGF0YSB0byBjaGlsZAogICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZQogICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCFjaGlsZCkgewogICAgICByZXR1cm4gcmF3Q2hpbGQKICAgIH0KCiAgICBpZiAodGhpcy5fbGVhdmluZykgewogICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICB9CgogICAgLy8gZW5zdXJlIGEga2V5IHRoYXQgaXMgdW5pcXVlIHRvIHRoZSB2bm9kZSB0eXBlIGFuZCB0byB0aGlzIHRyYW5zaXRpb24KICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXMKICAgIC8vIGR1cmluZyBlbnRlcmluZy4KICAgIHZhciBpZCA9ICJfX3RyYW5zaXRpb24tIiArICh0aGlzLl91aWQpICsgIi0iOwogICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGwKICAgICAgPyBjaGlsZC5pc0NvbW1lbnQKICAgICAgICA/IGlkICsgJ2NvbW1lbnQnCiAgICAgICAgOiBpZCArIGNoaWxkLnRhZwogICAgICA6IGlzUHJpbWl0aXZlKGNoaWxkLmtleSkKICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KQogICAgICAgIDogY2hpbGQua2V5OwoKICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7CiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTsKICAgIHZhciBvbGRDaGlsZCA9IGdldFJlYWxDaGlsZChvbGRSYXdDaGlsZCk7CgogICAgLy8gbWFyayB2LXNob3cKICAgIC8vIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gbW9kdWxlIGNhbiBoYW5kIG92ZXIgdGhlIGNvbnRyb2wgdG8gdGhlIGRpcmVjdGl2ZQogICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5uYW1lID09PSAnc2hvdyc7IH0pKSB7CiAgICAgIGNoaWxkLmRhdGEuc2hvdyA9IHRydWU7CiAgICB9CgogICAgaWYgKAogICAgICBvbGRDaGlsZCAmJgogICAgICBvbGRDaGlsZC5kYXRhICYmCiAgICAgICFpc1NhbWVDaGlsZChjaGlsZCwgb2xkQ2hpbGQpICYmCiAgICAgICFpc0FzeW5jUGxhY2Vob2xkZXIob2xkQ2hpbGQpICYmCiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlCiAgICAgICEob2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UgJiYgb2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkKICAgICkgewogICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmUKICAgICAgLy8gaW1wb3J0YW50IGZvciBkeW5hbWljIHRyYW5zaXRpb25zIQogICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkLmRhdGEudHJhbnNpdGlvbiA9IGV4dGVuZCh7fSwgZGF0YSk7CiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGUKICAgICAgaWYgKG1vZGUgPT09ICdvdXQtaW4nKSB7CiAgICAgICAgLy8gcmV0dXJuIHBsYWNlaG9sZGVyIG5vZGUgYW5kIHF1ZXVlIHVwZGF0ZSB3aGVuIGxlYXZlIGZpbmlzaGVzCiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2FmdGVyTGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aGlzJDEuX2xlYXZpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHsKICAgICAgICBpZiAoaXNBc3luY1BsYWNlaG9sZGVyKGNoaWxkKSkgewogICAgICAgICAgcmV0dXJuIG9sZFJhd0NoaWxkCiAgICAgICAgfQogICAgICAgIHZhciBkZWxheWVkTGVhdmU7CiAgICAgICAgdmFyIHBlcmZvcm1MZWF2ZSA9IGZ1bmN0aW9uICgpIHsgZGVsYXllZExlYXZlKCk7IH07CiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpOwogICAgICAgIG1lcmdlVk5vZGVIb29rKGRhdGEsICdlbnRlckNhbmNlbGxlZCcsIHBlcmZvcm1MZWF2ZSk7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2RlbGF5TGVhdmUnLCBmdW5jdGlvbiAobGVhdmUpIHsgZGVsYXllZExlYXZlID0gbGVhdmU7IH0pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJhd0NoaWxkCiAgfQp9CgovKiAgKi8KCi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgbGlzdCBpdGVtcy4KLy8gc3VwcG9ydHMgbW92ZSB0cmFuc2l0aW9ucyB1c2luZyB0aGUgRkxJUCB0ZWNobmlxdWUuCgovLyBCZWNhdXNlIHRoZSB2ZG9tJ3MgY2hpbGRyZW4gdXBkYXRlIGFsZ29yaXRobSBpcyAidW5zdGFibGUiIC0gaS5lLgovLyBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcmVtb3ZlZCBlbGVtZW50cywKLy8gd2UgZm9yY2UgdHJhbnNpdGlvbi1ncm91cCB0byB1cGRhdGUgaXRzIGNoaWxkcmVuIGludG8gdHdvIHBhc3NlczoKLy8gaW4gdGhlIGZpcnN0IHBhc3MsIHdlIHJlbW92ZSBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQsCi8vIHRyaWdnZXJpbmcgdGhlaXIgbGVhdmluZyB0cmFuc2l0aW9uOyBpbiB0aGUgc2Vjb25kIHBhc3MsIHdlIGluc2VydC9tb3ZlCi8vIGludG8gdGhlIGZpbmFsIGRlc2lyZWQgc3RhdGUuIFRoaXMgd2F5IGluIHRoZSBzZWNvbmQgcGFzcyByZW1vdmVkCi8vIG5vZGVzIHdpbGwgcmVtYWluIHdoZXJlIHRoZXkgc2hvdWxkIGJlLgoKdmFyIHByb3BzID0gZXh0ZW5kKHsKICB0YWc6IFN0cmluZywKICBtb3ZlQ2xhc3M6IFN0cmluZwp9LCB0cmFuc2l0aW9uUHJvcHMpOwoKZGVsZXRlIHByb3BzLm1vZGU7Cgp2YXIgVHJhbnNpdGlvbkdyb3VwID0gewogIHByb3BzOiBwcm9wcywKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHsKICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7CiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdOwogICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTsKICAgICAgaWYgKGMudGFnKSB7CiAgICAgICAgaWYgKGMua2V5ICE9IG51bGwgJiYgU3RyaW5nKGMua2V5KS5pbmRleE9mKCdfX3ZsaXN0JykgIT09IDApIHsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7CiAgICAgICAgICBtYXBbYy5rZXldID0gYwogICAgICAgICAgOyhjLmRhdGEgfHwgKGMuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25EYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgb3B0cyA9IGMuY29tcG9uZW50T3B0aW9uczsKICAgICAgICAgIHZhciBuYW1lID0gb3B0cyA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnIHx8ICcnKSA6IGMudGFnOwogICAgICAgICAgd2FybigoIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8IiArIG5hbWUgKyAiPiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJldkNoaWxkcmVuKSB7CiAgICAgIHZhciBrZXB0ID0gW107CiAgICAgIHZhciByZW1vdmVkID0gW107CiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7CiAgICAgICAgdmFyIGMkMSA9IHByZXZDaGlsZHJlbltpJDFdOwogICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTsKICAgICAgICBjJDEuZGF0YS5wb3MgPSBjJDEuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmIChtYXBbYyQxLmtleV0pIHsKICAgICAgICAgIGtlcHQucHVzaChjJDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZW1vdmVkLnB1c2goYyQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5rZXB0ID0gaCh0YWcsIG51bGwsIGtlcHQpOwogICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkOwogICAgfQoKICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pCiAgfSwKCiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkgewogICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzcwogICAgdGhpcy5fX3BhdGNoX18oCiAgICAgIHRoaXMuX3Zub2RlLAogICAgICB0aGlzLmtlcHQsCiAgICAgIGZhbHNlLCAvLyBoeWRyYXRpbmcKICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpCiAgICApOwogICAgdGhpcy5fdm5vZGUgPSB0aGlzLmtlcHQ7CiAgfSwKCiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCAoKSB7CiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjsKICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7CiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5oYXNNb3ZlKGNoaWxkcmVuWzBdLmVsbSwgbW92ZUNsYXNzKSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3ZSBkaXZpZGUgdGhlIHdvcmsgaW50byB0aHJlZSBsb29wcyB0byBhdm9pZCBtaXhpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMKICAgIC8vIGluIGVhY2ggaXRlcmF0aW9uIC0gd2hpY2ggaGVscHMgcHJldmVudCBsYXlvdXQgdGhyYXNoaW5nLgogICAgY2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7CiAgICBjaGlsZHJlbi5mb3JFYWNoKHJlY29yZFBvc2l0aW9uKTsKICAgIGNoaWxkcmVuLmZvckVhY2goYXBwbHlUcmFuc2xhdGlvbik7CgogICAgLy8gZm9yY2UgcmVmbG93IHRvIHB1dCBldmVyeXRoaW5nIGluIHBvc2l0aW9uCiAgICAvLyBhc3NpZ24gdG8gdGhpcyB0byBhdm9pZCBiZWluZyByZW1vdmVkIGluIHRyZWUtc2hha2luZwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICB0aGlzLl9yZWZsb3cgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDsKCiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmRhdGEubW92ZWQpIHsKICAgICAgICB2YXIgZWwgPSBjLmVsbTsKICAgICAgICB2YXIgcyA9IGVsLnN0eWxlOwogICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTsKICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJzsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmRFdmVudCwgZWwuX21vdmVDYiA9IGZ1bmN0aW9uIGNiIChlKSB7CiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7CiAgICAgICAgICAgIGVsLl9tb3ZlQ2IgPSBudWxsOwogICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0sCgogIG1ldGhvZHM6IHsKICAgIGhhc01vdmU6IGZ1bmN0aW9uIGhhc01vdmUgKGVsLCBtb3ZlQ2xhc3MpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikgewogICAgICAgIHJldHVybiBmYWxzZQogICAgICB9CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAodGhpcy5faGFzTW92ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNNb3ZlCiAgICAgIH0KICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBtb3ZlIGNsYXNzIGFwcGxpZWQgaGFzCiAgICAgIC8vIENTUyB0cmFuc2l0aW9ucy4gU2luY2UgdGhlIGVsZW1lbnQgbWF5IGJlIGluc2lkZSBhbiBlbnRlcmluZwogICAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlCiAgICAgIC8vIGFsbCBvdGhlciB0cmFuc2l0aW9uIGNsYXNzZXMgYXBwbGllZCB0byBlbnN1cmUgb25seSB0aGUgbW92ZSBjbGFzcwogICAgICAvLyBpcyBhcHBsaWVkLgogICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTsKICAgICAgaWYgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcykgewogICAgICAgIGVsLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHsgcmVtb3ZlQ2xhc3MoY2xvbmUsIGNscyk7IH0pOwogICAgICB9CiAgICAgIGFkZENsYXNzKGNsb25lLCBtb3ZlQ2xhc3MpOwogICAgICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB0aGlzLiRlbC5hcHBlbmRDaGlsZChjbG9uZSk7CiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpOwogICAgICB0aGlzLiRlbC5yZW1vdmVDaGlsZChjbG9uZSk7CiAgICAgIHJldHVybiAodGhpcy5faGFzTW92ZSA9IGluZm8uaGFzVHJhbnNmb3JtKQogICAgfQogIH0KfQoKZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMgKGMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX21vdmVDYikgewogICAgYy5lbG0uX21vdmVDYigpOwogIH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX2VudGVyQ2IpIHsKICAgIGMuZWxtLl9lbnRlckNiKCk7CiAgfQp9CgpmdW5jdGlvbiByZWNvcmRQb3NpdGlvbiAoYykgewogIGMuZGF0YS5uZXdQb3MgPSBjLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKfQoKZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbiAoYykgewogIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zOwogIHZhciBuZXdQb3MgPSBjLmRhdGEubmV3UG9zOwogIHZhciBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7CiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7CiAgaWYgKGR4IHx8IGR5KSB7CiAgICBjLmRhdGEubW92ZWQgPSB0cnVlOwogICAgdmFyIHMgPSBjLmVsbS5zdHlsZTsKICAgIHMudHJhbnNmb3JtID0gcy5XZWJraXRUcmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBkeCArICJweCwiICsgZHkgKyAicHgpIjsKICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJzsKICB9Cn0KCnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7CiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbiwKICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cAp9CgovKiAgKi8KCi8vIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMgdXRpbHMKVnVlLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyID0gaXNSZXNlcnZlZEF0dHI7ClZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZ2V0VGFnTmFtZXNwYWNlOwpWdWUuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50OwoKLy8gaW5zdGFsbCBwbGF0Zm9ybSBydW50aW1lIGRpcmVjdGl2ZXMgJiBjb21wb25lbnRzCmV4dGVuZChWdWUub3B0aW9ucy5kaXJlY3RpdmVzLCBwbGF0Zm9ybURpcmVjdGl2ZXMpOwpleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgcGxhdGZvcm1Db21wb25lbnRzKTsKCi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb24KVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gPSBpbkJyb3dzZXIgPyBwYXRjaCA6IG5vb3A7CgovLyBwdWJsaWMgbW91bnQgbWV0aG9kClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDsKICByZXR1cm4gbW91bnRDb21wb25lbnQodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8vIGRldnRvb2xzIGdsb2JhbCBob29rCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmlmIChpbkJyb3dzZXIpIHsKICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIGlmIChjb25maWcuZGV2dG9vbHMpIHsKICAgICAgaWYgKGRldnRvb2xzKSB7CiAgICAgICAgZGV2dG9vbHMuZW1pdCgnaW5pdCcsIFZ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgICAgaXNDaHJvbWUKICAgICAgKSB7CiAgICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oCiAgICAgICAgICAnRG93bmxvYWQgdGhlIFZ1ZSBEZXZ0b29scyBleHRlbnNpb24gZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6XG4nICsKICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWRldnRvb2xzJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgIGNvbmZpZy5wcm9kdWN0aW9uVGlwICE9PSBmYWxzZSAmJgogICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcKICAgICkgewogICAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/ICdpbmZvJyA6ICdsb2cnXSgKICAgICAgICAiWW91IGFyZSBydW5uaW5nIFZ1ZSBpbiBkZXZlbG9wbWVudCBtb2RlLlxuIiArCiAgICAgICAgIk1ha2Ugc3VyZSB0byB0dXJuIG9uIHByb2R1Y3Rpb24gbW9kZSB3aGVuIGRlcGxveWluZyBmb3IgcHJvZHVjdGlvbi5cbiIgKwogICAgICAgICJTZWUgbW9yZSB0aXBzIGF0IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2RlcGxveW1lbnQuaHRtbCIKICAgICAgKTsKICAgIH0KICB9LCAwKTsKfQoKLyogICovCgp2YXIgZGVmYXVsdFRhZ1JFID0gL1x7XHsoKD86LnxcbikrPylcfVx9L2c7CnZhciByZWdleEVzY2FwZVJFID0gL1stLiorP14ke30oKXxbXF1cL1xcXS9nOwoKdmFyIGJ1aWxkUmVnZXggPSBjYWNoZWQoZnVuY3Rpb24gKGRlbGltaXRlcnMpIHsKICB2YXIgb3BlbiA9IGRlbGltaXRlcnNbMF0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHZhciBjbG9zZSA9IGRlbGltaXRlcnNbMV0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHJldHVybiBuZXcgUmVnRXhwKG9wZW4gKyAnKCg/Oi58XFxuKSs/KScgKyBjbG9zZSwgJ2cnKQp9KTsKCgoKZnVuY3Rpb24gcGFyc2VUZXh0ICgKICB0ZXh0LAogIGRlbGltaXRlcnMKKSB7CiAgdmFyIHRhZ1JFID0gZGVsaW1pdGVycyA/IGJ1aWxkUmVnZXgoZGVsaW1pdGVycykgOiBkZWZhdWx0VGFnUkU7CiAgaWYgKCF0YWdSRS50ZXN0KHRleHQpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIHRva2VucyA9IFtdOwogIHZhciByYXdUb2tlbnMgPSBbXTsKICB2YXIgbGFzdEluZGV4ID0gdGFnUkUubGFzdEluZGV4ID0gMDsKICB2YXIgbWF0Y2gsIGluZGV4LCB0b2tlblZhbHVlOwogIHdoaWxlICgobWF0Y2ggPSB0YWdSRS5leGVjKHRleHQpKSkgewogICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgIC8vIHB1c2ggdGV4dCB0b2tlbgogICAgaWYgKGluZGV4ID4gbGFzdEluZGV4KSB7CiAgICAgIHJhd1Rva2Vucy5wdXNoKHRva2VuVmFsdWUgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTsKICAgICAgdG9rZW5zLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW5WYWx1ZSkpOwogICAgfQogICAgLy8gdGFnIHRva2VuCiAgICB2YXIgZXhwID0gcGFyc2VGaWx0ZXJzKG1hdGNoWzFdLnRyaW0oKSk7CiAgICB0b2tlbnMucHVzaCgoIl9zKCIgKyBleHAgKyAiKSIpKTsKICAgIHJhd1Rva2Vucy5wdXNoKHsgJ0BiaW5kaW5nJzogZXhwIH0pOwogICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CiAgfQogIGlmIChsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgcmF3VG9rZW5zLnB1c2godG9rZW5WYWx1ZSA9IHRleHQuc2xpY2UobGFzdEluZGV4KSk7CiAgICB0b2tlbnMucHVzaChKU09OLnN0cmluZ2lmeSh0b2tlblZhbHVlKSk7CiAgfQogIHJldHVybiB7CiAgICBleHByZXNzaW9uOiB0b2tlbnMuam9pbignKycpLAogICAgdG9rZW5zOiByYXdUb2tlbnMKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gdHJhbnNmb3JtTm9kZSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljQ2xhc3MgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnY2xhc3MnKTsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHN0YXRpY0NsYXNzKSB7CiAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY0NsYXNzLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgaWYgKHJlcykgewogICAgICB3YXJuKAogICAgICAgICJjbGFzcz1cIiIgKyBzdGF0aWNDbGFzcyArICJcIjogIiArCiAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArCiAgICAgICAgJ1VzZSB2LWJpbmQgb3IgdGhlIGNvbG9uIHNob3J0aGFuZCBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgJyArCiAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBjbGFzcz0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpjbGFzcz0idmFsIj4uJwogICAgICApOwogICAgfQogIH0KICBpZiAoc3RhdGljQ2xhc3MpIHsKICAgIGVsLnN0YXRpY0NsYXNzID0gSlNPTi5zdHJpbmdpZnkoc3RhdGljQ2xhc3MpOwogIH0KICB2YXIgY2xhc3NCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdjbGFzcycsIGZhbHNlIC8qIGdldFN0YXRpYyAqLyk7CiAgaWYgKGNsYXNzQmluZGluZykgewogICAgZWwuY2xhc3NCaW5kaW5nID0gY2xhc3NCaW5kaW5nOwogIH0KfQoKZnVuY3Rpb24gZ2VuRGF0YSAoZWwpIHsKICB2YXIgZGF0YSA9ICcnOwogIGlmIChlbC5zdGF0aWNDbGFzcykgewogICAgZGF0YSArPSAic3RhdGljQ2xhc3M6IiArIChlbC5zdGF0aWNDbGFzcykgKyAiLCI7CiAgfQogIGlmIChlbC5jbGFzc0JpbmRpbmcpIHsKICAgIGRhdGEgKz0gImNsYXNzOiIgKyAoZWwuY2xhc3NCaW5kaW5nKSArICIsIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIGtsYXNzJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNDbGFzcyddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUsCiAgZ2VuRGF0YTogZ2VuRGF0YQp9CgovKiAgKi8KCmZ1bmN0aW9uIHRyYW5zZm9ybU5vZGUkMSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljU3R5bGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc3R5bGUnKTsKICBpZiAoc3RhdGljU3R5bGUpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY1N0eWxlLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgICBpZiAocmVzKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJzdHlsZT1cIiIgKyBzdGF0aWNTdHlsZSArICJcIjogIiArCiAgICAgICAgICAnSW50ZXJwb2xhdGlvbiBpbnNpZGUgYXR0cmlidXRlcyBoYXMgYmVlbiByZW1vdmVkLiAnICsKICAgICAgICAgICdVc2Ugdi1iaW5kIG9yIHRoZSBjb2xvbiBzaG9ydGhhbmQgaW5zdGVhZC4gRm9yIGV4YW1wbGUsICcgKwogICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBzdHlsZT0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpzdHlsZT0idmFsIj4uJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGVsLnN0YXRpY1N0eWxlID0gSlNPTi5zdHJpbmdpZnkocGFyc2VTdHlsZVRleHQoc3RhdGljU3R5bGUpKTsKICB9CgogIHZhciBzdHlsZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3N0eWxlJywgZmFsc2UgLyogZ2V0U3RhdGljICovKTsKICBpZiAoc3R5bGVCaW5kaW5nKSB7CiAgICBlbC5zdHlsZUJpbmRpbmcgPSBzdHlsZUJpbmRpbmc7CiAgfQp9CgpmdW5jdGlvbiBnZW5EYXRhJDEgKGVsKSB7CiAgdmFyIGRhdGEgPSAnJzsKICBpZiAoZWwuc3RhdGljU3R5bGUpIHsKICAgIGRhdGEgKz0gInN0YXRpY1N0eWxlOiIgKyAoZWwuc3RhdGljU3R5bGUpICsgIiwiOwogIH0KICBpZiAoZWwuc3R5bGVCaW5kaW5nKSB7CiAgICBkYXRhICs9ICJzdHlsZTooIiArIChlbC5zdHlsZUJpbmRpbmcpICsgIiksIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIHN0eWxlJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNTdHlsZSddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUkMSwKICBnZW5EYXRhOiBnZW5EYXRhJDEKfQoKLyogICovCgp2YXIgZGVjb2RlcjsKCnZhciBoZSA9IHsKICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZSAoaHRtbCkgewogICAgZGVjb2RlciA9IGRlY29kZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkZWNvZGVyLmlubmVySFRNTCA9IGh0bWw7CiAgICByZXR1cm4gZGVjb2Rlci50ZXh0Q29udGVudAogIH0KfQoKLyogICovCgp2YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoCiAgJ2FyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLCcgKwogICdsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicKKTsKCi8vIEVsZW1lbnRzIHRoYXQgeW91IGNhbiwgaW50ZW50aW9uYWxseSwgbGVhdmUgb3BlbgovLyAoYW5kIHdoaWNoIGNsb3NlIHRoZW1zZWx2ZXMpCnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcCgKICAnY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZScKKTsKCi8vIEhUTUw1IHRhZ3MgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sI2VsZW1lbnRzLTMKLy8gUGhyYXNpbmcgQ29udGVudCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNwaHJhc2luZy1jb250ZW50CnZhciBpc05vblBocmFzaW5nVGFnID0gbWFrZU1hcCgKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLCcgKwogICdkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sJyArCiAgJ2gxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLCcgKwogICdvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsJyArCiAgJ3RpdGxlLHRyLHRyYWNrJwopOwoKLyoqCiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGl0J3MgbW9zdGx5IHZlbmRvciBjb2RlLgogKi8KCi8qIQogKiBIVE1MIFBhcnNlciBCeSBKb2huIFJlc2lnIChlam9obi5vcmcpCiAqIE1vZGlmaWVkIGJ5IEp1cml5ICJrYW5nYXgiIFpheXRzZXYKICogT3JpZ2luYWwgY29kZSBieSBFcmlrIEFydmlkc3NvbiwgTW96aWxsYSBQdWJsaWMgTGljZW5zZQogKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qcwogKi8KCi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlcwp2YXIgYXR0cmlidXRlID0gL15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vOwovLyBjb3VsZCB1c2UgaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhtbC1uYW1lcy0xOTk5MDExNC8jTlQtUU5hbWUKLy8gYnV0IGZvciBWdWUgdGVtcGxhdGVzIHdlIGNhbiBlbmZvcmNlIGEgc2ltcGxlIGNoYXJzZXQKdmFyIG5jbmFtZSA9ICdbYS16QS1aX11bXFx3XFwtXFwuXSonOwp2YXIgcW5hbWVDYXB0dXJlID0gIigoPzoiICsgbmNuYW1lICsgIlxcOik/IiArIG5jbmFtZSArICIpIjsKdmFyIHN0YXJ0VGFnT3BlbiA9IG5ldyBSZWdFeHAoKCJePCIgKyBxbmFtZUNhcHR1cmUpKTsKdmFyIHN0YXJ0VGFnQ2xvc2UgPSAvXlxzKihcLz8pPi87CnZhciBlbmRUYWcgPSBuZXcgUmVnRXhwKCgiXjxcXC8iICsgcW5hbWVDYXB0dXJlICsgIltePl0qPiIpKTsKdmFyIGRvY3R5cGUgPSAvXjwhRE9DVFlQRSBbXj5dKz4vaTsKLy8gIzcyOTg6IGVzY2FwZSAtIHRvIGF2b2lkIGJlaW5nIHBhc2VkIGFzIEhUTUwgY29tbWVudCB3aGVuIGlubGluZWQgaW4gcGFnZQp2YXIgY29tbWVudCA9IC9ePCFcLS0vOwp2YXIgY29uZGl0aW9uYWxDb21tZW50ID0gL148IVxbLzsKCnZhciBJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOID0gZmFsc2U7Cid4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobSwgZykgewogIElTX1JFR0VYX0NBUFRVUklOR19CUk9LRU4gPSBnID09PSAnJzsKfSk7CgovLyBTcGVjaWFsIEVsZW1lbnRzIChjYW4gY29udGFpbiBhbnl0aGluZykKdmFyIGlzUGxhaW5UZXh0RWxlbWVudCA9IG1ha2VNYXAoJ3NjcmlwdCxzdHlsZSx0ZXh0YXJlYScsIHRydWUpOwp2YXIgcmVDYWNoZSA9IHt9OwoKdmFyIGRlY29kaW5nTWFwID0gewogICcmbHQ7JzogJzwnLAogICcmZ3Q7JzogJz4nLAogICcmcXVvdDsnOiAnIicsCiAgJyZhbXA7JzogJyYnLAogICcmIzEwOyc6ICdcbicsCiAgJyYjOTsnOiAnXHQnCn07CnZhciBlbmNvZGVkQXR0ciA9IC8mKD86bHR8Z3R8cXVvdHxhbXApOy9nOwp2YXIgZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgPSAvJig/Omx0fGd0fHF1b3R8YW1wfCMxMHwjOSk7L2c7CgovLyAjNTk5Mgp2YXIgaXNJZ25vcmVOZXdsaW5lVGFnID0gbWFrZU1hcCgncHJlLHRleHRhcmVhJywgdHJ1ZSk7CnZhciBzaG91bGRJZ25vcmVGaXJzdE5ld2xpbmUgPSBmdW5jdGlvbiAodGFnLCBodG1sKSB7IHJldHVybiB0YWcgJiYgaXNJZ25vcmVOZXdsaW5lVGFnKHRhZykgJiYgaHRtbFswXSA9PT0gJ1xuJzsgfTsKCmZ1bmN0aW9uIGRlY29kZUF0dHIgKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykgewogIHZhciByZSA9IHNob3VsZERlY29kZU5ld2xpbmVzID8gZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgOiBlbmNvZGVkQXR0cjsKICByZXR1cm4gdmFsdWUucmVwbGFjZShyZSwgZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBkZWNvZGluZ01hcFttYXRjaF07IH0pCn0KCmZ1bmN0aW9uIHBhcnNlSFRNTCAoaHRtbCwgb3B0aW9ucykgewogIHZhciBzdGFjayA9IFtdOwogIHZhciBleHBlY3RIVE1MID0gb3B0aW9ucy5leHBlY3RIVE1MOwogIHZhciBpc1VuYXJ5VGFnJCQxID0gb3B0aW9ucy5pc1VuYXJ5VGFnIHx8IG5vOwogIHZhciBjYW5CZUxlZnRPcGVuVGFnJCQxID0gb3B0aW9ucy5jYW5CZUxlZnRPcGVuVGFnIHx8IG5vOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxhc3QsIGxhc3RUYWc7CiAgd2hpbGUgKGh0bWwpIHsKICAgIGxhc3QgPSBodG1sOwogICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBpbiBhIHBsYWludGV4dCBjb250ZW50IGVsZW1lbnQgbGlrZSBzY3JpcHQvc3R5bGUKICAgIGlmICghbGFzdFRhZyB8fCAhaXNQbGFpblRleHRFbGVtZW50KGxhc3RUYWcpKSB7CiAgICAgIHZhciB0ZXh0RW5kID0gaHRtbC5pbmRleE9mKCc8Jyk7CiAgICAgIGlmICh0ZXh0RW5kID09PSAwKSB7CiAgICAgICAgLy8gQ29tbWVudDoKICAgICAgICBpZiAoY29tbWVudC50ZXN0KGh0bWwpKSB7CiAgICAgICAgICB2YXIgY29tbWVudEVuZCA9IGh0bWwuaW5kZXhPZignLS0+Jyk7CgogICAgICAgICAgaWYgKGNvbW1lbnRFbmQgPj0gMCkgewogICAgICAgICAgICBpZiAob3B0aW9ucy5zaG91bGRLZWVwQ29tbWVudCkgewogICAgICAgICAgICAgIG9wdGlvbnMuY29tbWVudChodG1sLnN1YnN0cmluZyg0LCBjb21tZW50RW5kKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZShjb21tZW50RW5kICsgMyk7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmRpdGlvbmFsX2NvbW1lbnQjRG93bmxldmVsLXJldmVhbGVkX2NvbmRpdGlvbmFsX2NvbW1lbnQKICAgICAgICBpZiAoY29uZGl0aW9uYWxDb21tZW50LnRlc3QoaHRtbCkpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25hbEVuZCA9IGh0bWwuaW5kZXhPZignXT4nKTsKCiAgICAgICAgICBpZiAoY29uZGl0aW9uYWxFbmQgPj0gMCkgewogICAgICAgICAgICBhZHZhbmNlKGNvbmRpdGlvbmFsRW5kICsgMik7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEb2N0eXBlOgogICAgICAgIHZhciBkb2N0eXBlTWF0Y2ggPSBodG1sLm1hdGNoKGRvY3R5cGUpOwogICAgICAgIGlmIChkb2N0eXBlTWF0Y2gpIHsKICAgICAgICAgIGFkdmFuY2UoZG9jdHlwZU1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgLy8gRW5kIHRhZzoKICAgICAgICB2YXIgZW5kVGFnTWF0Y2ggPSBodG1sLm1hdGNoKGVuZFRhZyk7CiAgICAgICAgaWYgKGVuZFRhZ01hdGNoKSB7CiAgICAgICAgICB2YXIgY3VySW5kZXggPSBpbmRleDsKICAgICAgICAgIGFkdmFuY2UoZW5kVGFnTWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgIHBhcnNlRW5kVGFnKGVuZFRhZ01hdGNoWzFdLCBjdXJJbmRleCwgaW5kZXgpOwogICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIC8vIFN0YXJ0IHRhZzoKICAgICAgICB2YXIgc3RhcnRUYWdNYXRjaCA9IHBhcnNlU3RhcnRUYWcoKTsKICAgICAgICBpZiAoc3RhcnRUYWdNYXRjaCkgewogICAgICAgICAgaGFuZGxlU3RhcnRUYWcoc3RhcnRUYWdNYXRjaCk7CiAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKGxhc3RUYWcsIGh0bWwpKSB7CiAgICAgICAgICAgIGFkdmFuY2UoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHRleHQgPSAodm9pZCAwKSwgcmVzdCA9ICh2b2lkIDApLCBuZXh0ID0gKHZvaWQgMCk7CiAgICAgIGlmICh0ZXh0RW5kID49IDApIHsKICAgICAgICByZXN0ID0gaHRtbC5zbGljZSh0ZXh0RW5kKTsKICAgICAgICB3aGlsZSAoCiAgICAgICAgICAhZW5kVGFnLnRlc3QocmVzdCkgJiYKICAgICAgICAgICFzdGFydFRhZ09wZW4udGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbW1lbnQudGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbmRpdGlvbmFsQ29tbWVudC50ZXN0KHJlc3QpCiAgICAgICAgKSB7CiAgICAgICAgICAvLyA8IGluIHBsYWluIHRleHQsIGJlIGZvcmdpdmluZyBhbmQgdHJlYXQgaXQgYXMgdGV4dAogICAgICAgICAgbmV4dCA9IHJlc3QuaW5kZXhPZignPCcsIDEpOwogICAgICAgICAgaWYgKG5leHQgPCAwKSB7IGJyZWFrIH0KICAgICAgICAgIHRleHRFbmQgKz0gbmV4dDsKICAgICAgICAgIHJlc3QgPSBodG1sLnNsaWNlKHRleHRFbmQpOwogICAgICAgIH0KICAgICAgICB0ZXh0ID0gaHRtbC5zdWJzdHJpbmcoMCwgdGV4dEVuZCk7CiAgICAgICAgYWR2YW5jZSh0ZXh0RW5kKTsKICAgICAgfQoKICAgICAgaWYgKHRleHRFbmQgPCAwKSB7CiAgICAgICAgdGV4dCA9IGh0bWw7CiAgICAgICAgaHRtbCA9ICcnOwogICAgICB9CgogICAgICBpZiAob3B0aW9ucy5jaGFycyAmJiB0ZXh0KSB7CiAgICAgICAgb3B0aW9ucy5jaGFycyh0ZXh0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGVuZFRhZ0xlbmd0aCA9IDA7CiAgICAgIHZhciBzdGFja2VkVGFnID0gbGFzdFRhZy50b0xvd2VyQ2FzZSgpOwogICAgICB2YXIgcmVTdGFja2VkVGFnID0gcmVDYWNoZVtzdGFja2VkVGFnXSB8fCAocmVDYWNoZVtzdGFja2VkVGFnXSA9IG5ldyBSZWdFeHAoJyhbXFxzXFxTXSo/KSg8LycgKyBzdGFja2VkVGFnICsgJ1tePl0qPiknLCAnaScpKTsKICAgICAgdmFyIHJlc3QkMSA9IGh0bWwucmVwbGFjZShyZVN0YWNrZWRUYWcsIGZ1bmN0aW9uIChhbGwsIHRleHQsIGVuZFRhZykgewogICAgICAgIGVuZFRhZ0xlbmd0aCA9IGVuZFRhZy5sZW5ndGg7CiAgICAgICAgaWYgKCFpc1BsYWluVGV4dEVsZW1lbnQoc3RhY2tlZFRhZykgJiYgc3RhY2tlZFRhZyAhPT0gJ25vc2NyaXB0JykgewogICAgICAgICAgdGV4dCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCAnJDEnKSAvLyAjNzI5OAogICAgICAgICAgICAucmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csICckMScpOwogICAgICAgIH0KICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKHN0YWNrZWRUYWcsIHRleHQpKSB7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnMpIHsKICAgICAgICAgIG9wdGlvbnMuY2hhcnModGV4dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJwogICAgICB9KTsKICAgICAgaW5kZXggKz0gaHRtbC5sZW5ndGggLSByZXN0JDEubGVuZ3RoOwogICAgICBodG1sID0gcmVzdCQxOwogICAgICBwYXJzZUVuZFRhZyhzdGFja2VkVGFnLCBpbmRleCAtIGVuZFRhZ0xlbmd0aCwgaW5kZXgpOwogICAgfQoKICAgIGlmIChodG1sID09PSBsYXN0KSB7CiAgICAgIG9wdGlvbnMuY2hhcnMgJiYgb3B0aW9ucy5jaGFycyhodG1sKTsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiAhc3RhY2subGVuZ3RoICYmIG9wdGlvbnMud2FybikgewogICAgICAgIG9wdGlvbnMud2FybigoIk1hbC1mb3JtYXR0ZWQgdGFnIGF0IGVuZCBvZiB0ZW1wbGF0ZTogXCIiICsgaHRtbCArICJcIiIpKTsKICAgICAgfQogICAgICBicmVhawogICAgfQogIH0KCiAgLy8gQ2xlYW4gdXAgYW55IHJlbWFpbmluZyB0YWdzCiAgcGFyc2VFbmRUYWcoKTsKCiAgZnVuY3Rpb24gYWR2YW5jZSAobikgewogICAgaW5kZXggKz0gbjsKICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhuKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3RhcnRUYWcgKCkgewogICAgdmFyIHN0YXJ0ID0gaHRtbC5tYXRjaChzdGFydFRhZ09wZW4pOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIHZhciBtYXRjaCA9IHsKICAgICAgICB0YWdOYW1lOiBzdGFydFsxXSwKICAgICAgICBhdHRyczogW10sCiAgICAgICAgc3RhcnQ6IGluZGV4CiAgICAgIH07CiAgICAgIGFkdmFuY2Uoc3RhcnRbMF0ubGVuZ3RoKTsKICAgICAgdmFyIGVuZCwgYXR0cjsKICAgICAgd2hpbGUgKCEoZW5kID0gaHRtbC5tYXRjaChzdGFydFRhZ0Nsb3NlKSkgJiYgKGF0dHIgPSBodG1sLm1hdGNoKGF0dHJpYnV0ZSkpKSB7CiAgICAgICAgYWR2YW5jZShhdHRyWzBdLmxlbmd0aCk7CiAgICAgICAgbWF0Y2guYXR0cnMucHVzaChhdHRyKTsKICAgICAgfQogICAgICBpZiAoZW5kKSB7CiAgICAgICAgbWF0Y2gudW5hcnlTbGFzaCA9IGVuZFsxXTsKICAgICAgICBhZHZhbmNlKGVuZFswXS5sZW5ndGgpOwogICAgICAgIG1hdGNoLmVuZCA9IGluZGV4OwogICAgICAgIHJldHVybiBtYXRjaAogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVTdGFydFRhZyAobWF0Y2gpIHsKICAgIHZhciB0YWdOYW1lID0gbWF0Y2gudGFnTmFtZTsKICAgIHZhciB1bmFyeVNsYXNoID0gbWF0Y2gudW5hcnlTbGFzaDsKCiAgICBpZiAoZXhwZWN0SFRNTCkgewogICAgICBpZiAobGFzdFRhZyA9PT0gJ3AnICYmIGlzTm9uUGhyYXNpbmdUYWcodGFnTmFtZSkpIHsKICAgICAgICBwYXJzZUVuZFRhZyhsYXN0VGFnKTsKICAgICAgfQogICAgICBpZiAoY2FuQmVMZWZ0T3BlblRhZyQkMSh0YWdOYW1lKSAmJiBsYXN0VGFnID09PSB0YWdOYW1lKSB7CiAgICAgICAgcGFyc2VFbmRUYWcodGFnTmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdW5hcnkgPSBpc1VuYXJ5VGFnJCQxKHRhZ05hbWUpIHx8ICEhdW5hcnlTbGFzaDsKCiAgICB2YXIgbCA9IG1hdGNoLmF0dHJzLmxlbmd0aDsKICAgIHZhciBhdHRycyA9IG5ldyBBcnJheShsKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBhcmdzID0gbWF0Y2guYXR0cnNbaV07CiAgICAgIC8vIGhhY2tpc2ggd29yayBhcm91bmQgRkYgYnVnIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTM2OTc3OAogICAgICBpZiAoSVNfUkVHRVhfQ0FQVFVSSU5HX0JST0tFTiAmJiBhcmdzWzBdLmluZGV4T2YoJyIiJykgPT09IC0xKSB7CiAgICAgICAgaWYgKGFyZ3NbM10gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzNdOyB9CiAgICAgICAgaWYgKGFyZ3NbNF0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzRdOyB9CiAgICAgICAgaWYgKGFyZ3NbNV0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzVdOyB9CiAgICAgIH0KICAgICAgdmFyIHZhbHVlID0gYXJnc1szXSB8fCBhcmdzWzRdIHx8IGFyZ3NbNV0gfHwgJyc7CiAgICAgIHZhciBzaG91bGREZWNvZGVOZXdsaW5lcyA9IHRhZ05hbWUgPT09ICdhJyAmJiBhcmdzWzFdID09PSAnaHJlZicKICAgICAgICA/IG9wdGlvbnMuc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmCiAgICAgICAgOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzOwogICAgICBhdHRyc1tpXSA9IHsKICAgICAgICBuYW1lOiBhcmdzWzFdLAogICAgICAgIHZhbHVlOiBkZWNvZGVBdHRyKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykKICAgICAgfTsKICAgIH0KCiAgICBpZiAoIXVuYXJ5KSB7CiAgICAgIHN0YWNrLnB1c2goeyB0YWc6IHRhZ05hbWUsIGxvd2VyQ2FzZWRUYWc6IHRhZ05hbWUudG9Mb3dlckNhc2UoKSwgYXR0cnM6IGF0dHJzIH0pOwogICAgICBsYXN0VGFnID0gdGFnTmFtZTsKICAgIH0KCiAgICBpZiAob3B0aW9ucy5zdGFydCkgewogICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIGF0dHJzLCB1bmFyeSwgbWF0Y2guc3RhcnQsIG1hdGNoLmVuZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZUVuZFRhZyAodGFnTmFtZSwgc3RhcnQsIGVuZCkgewogICAgdmFyIHBvcywgbG93ZXJDYXNlZFRhZ05hbWU7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgeyBzdGFydCA9IGluZGV4OyB9CiAgICBpZiAoZW5kID09IG51bGwpIHsgZW5kID0gaW5kZXg7IH0KCiAgICBpZiAodGFnTmFtZSkgewogICAgICBsb3dlckNhc2VkVGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIH0KCiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG9wZW5lZCB0YWcgb2YgdGhlIHNhbWUgdHlwZQogICAgaWYgKHRhZ05hbWUpIHsKICAgICAgZm9yIChwb3MgPSBzdGFjay5sZW5ndGggLSAxOyBwb3MgPj0gMDsgcG9zLS0pIHsKICAgICAgICBpZiAoc3RhY2tbcG9zXS5sb3dlckNhc2VkVGFnID09PSBsb3dlckNhc2VkVGFnTmFtZSkgewogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIG5vIHRhZyBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhbiBzaG9wCiAgICAgIHBvcyA9IDA7CiAgICB9CgogICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrCiAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IHBvczsgaS0tKSB7CiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgKGkgPiBwb3MgfHwgIXRhZ05hbWUpICYmCiAgICAgICAgICBvcHRpb25zLndhcm4KICAgICAgICApIHsKICAgICAgICAgIG9wdGlvbnMud2FybigKICAgICAgICAgICAgKCJ0YWcgPCIgKyAoc3RhY2tbaV0udGFnKSArICI+IGhhcyBubyBtYXRjaGluZyBlbmQgdGFnLiIpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy5lbmQpIHsKICAgICAgICAgIG9wdGlvbnMuZW5kKHN0YWNrW2ldLnRhZywgc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZW1vdmUgdGhlIG9wZW4gZWxlbWVudHMgZnJvbSB0aGUgc3RhY2sKICAgICAgc3RhY2subGVuZ3RoID0gcG9zOwogICAgICBsYXN0VGFnID0gcG9zICYmIHN0YWNrW3BvcyAtIDFdLnRhZzsKICAgIH0gZWxzZSBpZiAobG93ZXJDYXNlZFRhZ05hbWUgPT09ICdicicpIHsKICAgICAgaWYgKG9wdGlvbnMuc3RhcnQpIHsKICAgICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIFtdLCB0cnVlLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChsb3dlckNhc2VkVGFnTmFtZSA9PT0gJ3AnKSB7CiAgICAgIGlmIChvcHRpb25zLnN0YXJ0KSB7CiAgICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBbXSwgZmFsc2UsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmVuZCkgewogICAgICAgIG9wdGlvbnMuZW5kKHRhZ05hbWUsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciBvblJFID0gL15AfF52LW9uOi87CnZhciBkaXJSRSA9IC9edi18XkB8XjovOwp2YXIgZm9yQWxpYXNSRSA9IC8oW15dKj8pXHMrKD86aW58b2YpXHMrKFteXSopLzsKdmFyIGZvckl0ZXJhdG9yUkUgPSAvLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLzsKdmFyIHN0cmlwUGFyZW5zUkUgPSAvXlwofFwpJC9nOwoKdmFyIGFyZ1JFID0gLzooLiopJC87CnZhciBiaW5kUkUgPSAvXjp8XnYtYmluZDovOwp2YXIgbW9kaWZpZXJSRSA9IC9cLlteLl0rL2c7Cgp2YXIgZGVjb2RlSFRNTENhY2hlZCA9IGNhY2hlZChoZS5kZWNvZGUpOwoKLy8gY29uZmlndXJhYmxlIHN0YXRlCnZhciB3YXJuJDI7CnZhciBkZWxpbWl0ZXJzOwp2YXIgdHJhbnNmb3JtczsKdmFyIHByZVRyYW5zZm9ybXM7CnZhciBwb3N0VHJhbnNmb3JtczsKdmFyIHBsYXRmb3JtSXNQcmVUYWc7CnZhciBwbGF0Zm9ybU11c3RVc2VQcm9wOwp2YXIgcGxhdGZvcm1HZXRUYWdOYW1lc3BhY2U7CgoKCmZ1bmN0aW9uIGNyZWF0ZUFTVEVsZW1lbnQgKAogIHRhZywKICBhdHRycywKICBwYXJlbnQKKSB7CiAgcmV0dXJuIHsKICAgIHR5cGU6IDEsCiAgICB0YWc6IHRhZywKICAgIGF0dHJzTGlzdDogYXR0cnMsCiAgICBhdHRyc01hcDogbWFrZUF0dHJzTWFwKGF0dHJzKSwKICAgIHBhcmVudDogcGFyZW50LAogICAgY2hpbGRyZW46IFtdCiAgfQp9CgovKioKICogQ29udmVydCBIVE1MIHN0cmluZyB0byBBU1QuCiAqLwpmdW5jdGlvbiBwYXJzZSAoCiAgdGVtcGxhdGUsCiAgb3B0aW9ucwopIHsKICB3YXJuJDIgPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CgogIHBsYXRmb3JtSXNQcmVUYWcgPSBvcHRpb25zLmlzUHJlVGFnIHx8IG5vOwogIHBsYXRmb3JtTXVzdFVzZVByb3AgPSBvcHRpb25zLm11c3RVc2VQcm9wIHx8IG5vOwogIHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlID0gb3B0aW9ucy5nZXRUYWdOYW1lc3BhY2UgfHwgbm87CgogIHRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3RyYW5zZm9ybU5vZGUnKTsKICBwcmVUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwcmVUcmFuc2Zvcm1Ob2RlJyk7CiAgcG9zdFRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3Bvc3RUcmFuc2Zvcm1Ob2RlJyk7CgogIGRlbGltaXRlcnMgPSBvcHRpb25zLmRlbGltaXRlcnM7CgogIHZhciBzdGFjayA9IFtdOwogIHZhciBwcmVzZXJ2ZVdoaXRlc3BhY2UgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSAhPT0gZmFsc2U7CiAgdmFyIHJvb3Q7CiAgdmFyIGN1cnJlbnRQYXJlbnQ7CiAgdmFyIGluVlByZSA9IGZhbHNlOwogIHZhciBpblByZSA9IGZhbHNlOwogIHZhciB3YXJuZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gd2Fybk9uY2UgKG1zZykgewogICAgaWYgKCF3YXJuZWQpIHsKICAgICAgd2FybmVkID0gdHJ1ZTsKICAgICAgd2FybiQyKG1zZyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbG9zZUVsZW1lbnQgKGVsZW1lbnQpIHsKICAgIC8vIGNoZWNrIHByZSBzdGF0ZQogICAgaWYgKGVsZW1lbnQucHJlKSB7CiAgICAgIGluVlByZSA9IGZhbHNlOwogICAgfQogICAgaWYgKHBsYXRmb3JtSXNQcmVUYWcoZWxlbWVudC50YWcpKSB7CiAgICAgIGluUHJlID0gZmFsc2U7CiAgICB9CiAgICAvLyBhcHBseSBwb3N0LXRyYW5zZm9ybXMKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zdFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgcG9zdFRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucyk7CiAgICB9CiAgfQoKICBwYXJzZUhUTUwodGVtcGxhdGUsIHsKICAgIHdhcm46IHdhcm4kMiwKICAgIGV4cGVjdEhUTUw6IG9wdGlvbnMuZXhwZWN0SFRNTCwKICAgIGlzVW5hcnlUYWc6IG9wdGlvbnMuaXNVbmFyeVRhZywKICAgIGNhbkJlTGVmdE9wZW5UYWc6IG9wdGlvbnMuY2FuQmVMZWZ0T3BlblRhZywKICAgIHNob3VsZERlY29kZU5ld2xpbmVzOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzLAogICAgc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiwKICAgIHNob3VsZEtlZXBDb21tZW50OiBvcHRpb25zLmNvbW1lbnRzLAogICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0ICh0YWcsIGF0dHJzLCB1bmFyeSkgewogICAgICAvLyBjaGVjayBuYW1lc3BhY2UuCiAgICAgIC8vIGluaGVyaXQgcGFyZW50IG5zIGlmIHRoZXJlIGlzIG9uZQogICAgICB2YXIgbnMgPSAoY3VycmVudFBhcmVudCAmJiBjdXJyZW50UGFyZW50Lm5zKSB8fCBwbGF0Zm9ybUdldFRhZ05hbWVzcGFjZSh0YWcpOwoKICAgICAgLy8gaGFuZGxlIElFIHN2ZyBidWcKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmIChpc0lFICYmIG5zID09PSAnc3ZnJykgewogICAgICAgIGF0dHJzID0gZ3VhcmRJRVNWR0J1ZyhhdHRycyk7CiAgICAgIH0KCiAgICAgIHZhciBlbGVtZW50ID0gY3JlYXRlQVNURWxlbWVudCh0YWcsIGF0dHJzLCBjdXJyZW50UGFyZW50KTsKICAgICAgaWYgKG5zKSB7CiAgICAgICAgZWxlbWVudC5ucyA9IG5zOwogICAgICB9CgogICAgICBpZiAoaXNGb3JiaWRkZW5UYWcoZWxlbWVudCkgJiYgIWlzU2VydmVyUmVuZGVyaW5nKCkpIHsKICAgICAgICBlbGVtZW50LmZvcmJpZGRlbiA9IHRydWU7CiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4kMigKICAgICAgICAgICdUZW1wbGF0ZXMgc2hvdWxkIG9ubHkgYmUgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgdGhlIHN0YXRlIHRvIHRoZSAnICsKICAgICAgICAgICdVSS4gQXZvaWQgcGxhY2luZyB0YWdzIHdpdGggc2lkZS1lZmZlY3RzIGluIHlvdXIgdGVtcGxhdGVzLCBzdWNoIGFzICcgKwogICAgICAgICAgIjwiICsgdGFnICsgIj4iICsgJywgYXMgdGhleSB3aWxsIG5vdCBiZSBwYXJzZWQuJwogICAgICAgICk7CiAgICAgIH0KCiAgICAgIC8vIGFwcGx5IHByZS10cmFuc2Zvcm1zCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlVHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGVsZW1lbnQgPSBwcmVUcmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgICAgIH0KCiAgICAgIGlmICghaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1ByZShlbGVtZW50KTsKICAgICAgICBpZiAoZWxlbWVudC5wcmUpIHsKICAgICAgICAgIGluVlByZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwbGF0Zm9ybUlzUHJlVGFnKGVsZW1lbnQudGFnKSkgewogICAgICAgIGluUHJlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1Jhd0F0dHJzKGVsZW1lbnQpOwogICAgICB9IGVsc2UgaWYgKCFlbGVtZW50LnByb2Nlc3NlZCkgewogICAgICAgIC8vIHN0cnVjdHVyYWwgZGlyZWN0aXZlcwogICAgICAgIHByb2Nlc3NGb3IoZWxlbWVudCk7CiAgICAgICAgcHJvY2Vzc0lmKGVsZW1lbnQpOwogICAgICAgIHByb2Nlc3NPbmNlKGVsZW1lbnQpOwogICAgICAgIC8vIGVsZW1lbnQtc2NvcGUgc3R1ZmYKICAgICAgICBwcm9jZXNzRWxlbWVudChlbGVtZW50LCBvcHRpb25zKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2hlY2tSb290Q29uc3RyYWludHMgKGVsKSB7CiAgICAgICAgewogICAgICAgICAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnIHx8IGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8IiArIChlbC50YWcpICsgIj4gYXMgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlIGl0IG1heSAiICsKICAgICAgICAgICAgICAnY29udGFpbiBtdWx0aXBsZSBub2Rlcy4nCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZWwuYXR0cnNNYXAuaGFzT3duUHJvcGVydHkoJ3YtZm9yJykpIHsKICAgICAgICAgICAgd2Fybk9uY2UoCiAgICAgICAgICAgICAgJ0Nhbm5vdCB1c2Ugdi1mb3Igb24gc3RhdGVmdWwgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlICcgKwogICAgICAgICAgICAgICdpdCByZW5kZXJzIG11bHRpcGxlIGVsZW1lbnRzLicKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIHRyZWUgbWFuYWdlbWVudAogICAgICBpZiAoIXJvb3QpIHsKICAgICAgICByb290ID0gZWxlbWVudDsKICAgICAgICBjaGVja1Jvb3RDb25zdHJhaW50cyhyb290KTsKICAgICAgfSBlbHNlIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgLy8gYWxsb3cgcm9vdCBlbGVtZW50cyB3aXRoIHYtaWYsIHYtZWxzZS1pZiBhbmQgdi1lbHNlCiAgICAgICAgaWYgKHJvb3QuaWYgJiYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkpIHsKICAgICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKGVsZW1lbnQpOwogICAgICAgICAgYWRkSWZDb25kaXRpb24ocm9vdCwgewogICAgICAgICAgICBleHA6IGVsZW1lbnQuZWxzZWlmLAogICAgICAgICAgICBibG9jazogZWxlbWVudAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm5PbmNlKAogICAgICAgICAgICAiQ29tcG9uZW50IHRlbXBsYXRlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gIiArCiAgICAgICAgICAgICJJZiB5b3UgYXJlIHVzaW5nIHYtaWYgb24gbXVsdGlwbGUgZWxlbWVudHMsICIgKwogICAgICAgICAgICAidXNlIHYtZWxzZS1pZiB0byBjaGFpbiB0aGVtIGluc3RlYWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgJiYgIWVsZW1lbnQuZm9yYmlkZGVuKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkgewogICAgICAgICAgcHJvY2Vzc0lmQ29uZGl0aW9ucyhlbGVtZW50LCBjdXJyZW50UGFyZW50KTsKICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc2xvdFNjb3BlKSB7IC8vIHNjb3BlZCBzbG90CiAgICAgICAgICBjdXJyZW50UGFyZW50LnBsYWluID0gZmFsc2U7CiAgICAgICAgICB2YXIgbmFtZSA9IGVsZW1lbnQuc2xvdFRhcmdldCB8fCAnImRlZmF1bHQiJzsoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyB8fCAoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyA9IHt9KSlbbmFtZV0gPSBlbGVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goZWxlbWVudCk7CiAgICAgICAgICBlbGVtZW50LnBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdW5hcnkpIHsKICAgICAgICBjdXJyZW50UGFyZW50ID0gZWxlbWVudDsKICAgICAgICBzdGFjay5wdXNoKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgICAgfQogICAgfSwKCiAgICBlbmQ6IGZ1bmN0aW9uIGVuZCAoKSB7CiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgIHZhciBlbGVtZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIHZhciBsYXN0Tm9kZSA9IGVsZW1lbnQuY2hpbGRyZW5bZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDMgJiYgbGFzdE5vZGUudGV4dCA9PT0gJyAnICYmICFpblByZSkgewogICAgICAgIGVsZW1lbnQuY2hpbGRyZW4ucG9wKCk7CiAgICAgIH0KICAgICAgLy8gcG9wIHN0YWNrCiAgICAgIHN0YWNrLmxlbmd0aCAtPSAxOwogICAgICBjdXJyZW50UGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgIH0sCgogICAgY2hhcnM6IGZ1bmN0aW9uIGNoYXJzICh0ZXh0KSB7CiAgICAgIGlmICghY3VycmVudFBhcmVudCkgewogICAgICAgIHsKICAgICAgICAgIGlmICh0ZXh0ID09PSB0ZW1wbGF0ZSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAnQ29tcG9uZW50IHRlbXBsYXRlIHJlcXVpcmVzIGEgcm9vdCBlbGVtZW50LCByYXRoZXIgdGhhbiBqdXN0IHRleHQuJwogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIGlmICgodGV4dCA9IHRleHQudHJpbSgpKSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAoInRleHQgXCIiICsgdGV4dCArICJcIiBvdXRzaWRlIHJvb3QgZWxlbWVudCB3aWxsIGJlIGlnbm9yZWQuIikKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgLy8gSUUgdGV4dGFyZWEgcGxhY2Vob2xkZXIgYnVnCiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoaXNJRSAmJgogICAgICAgIGN1cnJlbnRQYXJlbnQudGFnID09PSAndGV4dGFyZWEnICYmCiAgICAgICAgY3VycmVudFBhcmVudC5hdHRyc01hcC5wbGFjZWhvbGRlciA9PT0gdGV4dAogICAgICApIHsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50UGFyZW50LmNoaWxkcmVuOwogICAgICB0ZXh0ID0gaW5QcmUgfHwgdGV4dC50cmltKCkKICAgICAgICA/IGlzVGV4dFRhZyhjdXJyZW50UGFyZW50KSA/IHRleHQgOiBkZWNvZGVIVE1MQ2FjaGVkKHRleHQpCiAgICAgICAgLy8gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGlmIGl0cyBub3QgcmlnaHQgYWZ0ZXIgYSBzdGFydGluZyB0YWcKICAgICAgICA6IHByZXNlcnZlV2hpdGVzcGFjZSAmJiBjaGlsZHJlbi5sZW5ndGggPyAnICcgOiAnJzsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIGlmICghaW5WUHJlICYmIHRleHQgIT09ICcgJyAmJiAocmVzID0gcGFyc2VUZXh0KHRleHQsIGRlbGltaXRlcnMpKSkgewogICAgICAgICAgY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHR5cGU6IDIsCiAgICAgICAgICAgIGV4cHJlc3Npb246IHJlcy5leHByZXNzaW9uLAogICAgICAgICAgICB0b2tlbnM6IHJlcy50b2tlbnMsCiAgICAgICAgICAgIHRleHQ6IHRleHQKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAodGV4dCAhPT0gJyAnIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dCAhPT0gJyAnKSB7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgdHlwZTogMywKICAgICAgICAgICAgdGV4dDogdGV4dAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY29tbWVudDogZnVuY3Rpb24gY29tbWVudCAodGV4dCkgewogICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goewogICAgICAgIHR5cGU6IDMsCiAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICBpc0NvbW1lbnQ6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJvb3QKfQoKZnVuY3Rpb24gcHJvY2Vzc1ByZSAoZWwpIHsKICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtcHJlJykgIT0gbnVsbCkgewogICAgZWwucHJlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSYXdBdHRycyAoZWwpIHsKICB2YXIgbCA9IGVsLmF0dHJzTGlzdC5sZW5ndGg7CiAgaWYgKGwpIHsKICAgIHZhciBhdHRycyA9IGVsLmF0dHJzID0gbmV3IEFycmF5KGwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgYXR0cnNbaV0gPSB7CiAgICAgICAgbmFtZTogZWwuYXR0cnNMaXN0W2ldLm5hbWUsCiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVsLmF0dHJzTGlzdFtpXS52YWx1ZSkKICAgICAgfTsKICAgIH0KICB9IGVsc2UgaWYgKCFlbC5wcmUpIHsKICAgIC8vIG5vbiByb290IG5vZGUgaW4gcHJlIGJsb2NrcyB3aXRoIG5vIGF0dHJpYnV0ZXMKICAgIGVsLnBsYWluID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50IChlbGVtZW50LCBvcHRpb25zKSB7CiAgcHJvY2Vzc0tleShlbGVtZW50KTsKCiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgYWZ0ZXIKICAvLyByZW1vdmluZyBzdHJ1Y3R1cmFsIGF0dHJpYnV0ZXMKICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFlbGVtZW50LmF0dHJzTGlzdC5sZW5ndGg7CgogIHByb2Nlc3NSZWYoZWxlbWVudCk7CiAgcHJvY2Vzc1Nsb3QoZWxlbWVudCk7CiAgcHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgIGVsZW1lbnQgPSB0cmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgfQogIHByb2Nlc3NBdHRycyhlbGVtZW50KTsKfQoKZnVuY3Rpb24gcHJvY2Vzc0tleSAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QmluZGluZ0F0dHIoZWwsICdrZXknKTsKICBpZiAoZXhwKSB7CiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICB3YXJuJDIoIjx0ZW1wbGF0ZT4gY2Fubm90IGJlIGtleWVkLiBQbGFjZSB0aGUga2V5IG9uIHJlYWwgZWxlbWVudHMgaW5zdGVhZC4iKTsKICAgIH0KICAgIGVsLmtleSA9IGV4cDsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSZWYgKGVsKSB7CiAgdmFyIHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAncmVmJyk7CiAgaWYgKHJlZikgewogICAgZWwucmVmID0gcmVmOwogICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NGb3IgKGVsKSB7CiAgdmFyIGV4cDsKICBpZiAoKGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWZvcicpKSkgewogICAgdmFyIHJlcyA9IHBhcnNlRm9yKGV4cCk7CiAgICBpZiAocmVzKSB7CiAgICAgIGV4dGVuZChlbCwgcmVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdhcm4kMigKICAgICAgICAoIkludmFsaWQgdi1mb3IgZXhwcmVzc2lvbjogIiArIGV4cCkKICAgICAgKTsKICAgIH0KICB9Cn0KCgoKZnVuY3Rpb24gcGFyc2VGb3IgKGV4cCkgewogIHZhciBpbk1hdGNoID0gZXhwLm1hdGNoKGZvckFsaWFzUkUpOwogIGlmICghaW5NYXRjaCkgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICByZXMuZm9yID0gaW5NYXRjaFsyXS50cmltKCk7CiAgdmFyIGFsaWFzID0gaW5NYXRjaFsxXS50cmltKCkucmVwbGFjZShzdHJpcFBhcmVuc1JFLCAnJyk7CiAgdmFyIGl0ZXJhdG9yTWF0Y2ggPSBhbGlhcy5tYXRjaChmb3JJdGVyYXRvclJFKTsKICBpZiAoaXRlcmF0b3JNYXRjaCkgewogICAgcmVzLmFsaWFzID0gYWxpYXMucmVwbGFjZShmb3JJdGVyYXRvclJFLCAnJyk7CiAgICByZXMuaXRlcmF0b3IxID0gaXRlcmF0b3JNYXRjaFsxXS50cmltKCk7CiAgICBpZiAoaXRlcmF0b3JNYXRjaFsyXSkgewogICAgICByZXMuaXRlcmF0b3IyID0gaXRlcmF0b3JNYXRjaFsyXS50cmltKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJlcy5hbGlhcyA9IGFsaWFzOwogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIHByb2Nlc3NJZiAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtaWYnKTsKICBpZiAoZXhwKSB7CiAgICBlbC5pZiA9IGV4cDsKICAgIGFkZElmQ29uZGl0aW9uKGVsLCB7CiAgICAgIGV4cDogZXhwLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScpICE9IG51bGwpIHsKICAgICAgZWwuZWxzZSA9IHRydWU7CiAgICB9CiAgICB2YXIgZWxzZWlmID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZS1pZicpOwogICAgaWYgKGVsc2VpZikgewogICAgICBlbC5lbHNlaWYgPSBlbHNlaWY7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBwcm9jZXNzSWZDb25kaXRpb25zIChlbCwgcGFyZW50KSB7CiAgdmFyIHByZXYgPSBmaW5kUHJldkVsZW1lbnQocGFyZW50LmNoaWxkcmVuKTsKICBpZiAocHJldiAmJiBwcmV2LmlmKSB7CiAgICBhZGRJZkNvbmRpdGlvbihwcmV2LCB7CiAgICAgIGV4cDogZWwuZWxzZWlmLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICB3YXJuJDIoCiAgICAgICJ2LSIgKyAoZWwuZWxzZWlmID8gKCdlbHNlLWlmPSInICsgZWwuZWxzZWlmICsgJyInKSA6ICdlbHNlJykgKyAiICIgKwogICAgICAidXNlZCBvbiBlbGVtZW50IDwiICsgKGVsLnRhZykgKyAiPiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdi1pZi4iCiAgICApOwogIH0KfQoKZnVuY3Rpb24gZmluZFByZXZFbGVtZW50IChjaGlsZHJlbikgewogIHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIGlmIChjaGlsZHJlbltpXS50eXBlID09PSAxKSB7CiAgICAgIHJldHVybiBjaGlsZHJlbltpXQogICAgfSBlbHNlIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGlsZHJlbltpXS50ZXh0ICE9PSAnICcpIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAidGV4dCBcIiIgKyAoY2hpbGRyZW5baV0udGV4dC50cmltKCkpICsgIlwiIGJldHdlZW4gdi1pZiBhbmQgdi1lbHNlKC1pZikgIiArCiAgICAgICAgICAid2lsbCBiZSBpZ25vcmVkLiIKICAgICAgICApOwogICAgICB9CiAgICAgIGNoaWxkcmVuLnBvcCgpOwogICAgfQogIH0KfQoKZnVuY3Rpb24gYWRkSWZDb25kaXRpb24gKGVsLCBjb25kaXRpb24pIHsKICBpZiAoIWVsLmlmQ29uZGl0aW9ucykgewogICAgZWwuaWZDb25kaXRpb25zID0gW107CiAgfQogIGVsLmlmQ29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NPbmNlIChlbCkgewogIHZhciBvbmNlJCQxID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Ytb25jZScpOwogIGlmIChvbmNlJCQxICE9IG51bGwpIHsKICAgIGVsLm9uY2UgPSB0cnVlOwogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc1Nsb3QgKGVsKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnKSB7CiAgICBlbC5zbG90TmFtZSA9IGdldEJpbmRpbmdBdHRyKGVsLCAnbmFtZScpOwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBlbC5rZXkpIHsKICAgICAgd2FybiQyKAogICAgICAgICJga2V5YCBkb2VzIG5vdCB3b3JrIG9uIDxzbG90PiBiZWNhdXNlIHNsb3RzIGFyZSBhYnN0cmFjdCBvdXRsZXRzICIgKwogICAgICAgICJhbmQgY2FuIHBvc3NpYmx5IGV4cGFuZCBpbnRvIG11bHRpcGxlIGVsZW1lbnRzLiAiICsKICAgICAgICAiVXNlIHRoZSBrZXkgb24gYSB3cmFwcGluZyBlbGVtZW50IGluc3RlYWQuIgogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgc2xvdFNjb3BlOwogICAgaWYgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICBzbG90U2NvcGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2NvcGUnKTsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgc2xvdFNjb3BlKSB7CiAgICAgICAgd2FybiQyKAogICAgICAgICAgInRoZSBcInNjb3BlXCIgYXR0cmlidXRlIGZvciBzY29wZWQgc2xvdHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kICIgKwogICAgICAgICAgInJlcGxhY2VkIGJ5IFwic2xvdC1zY29wZVwiIHNpbmNlIDIuNS4gVGhlIG5ldyBcInNsb3Qtc2NvcGVcIiBhdHRyaWJ1dGUgIiArCiAgICAgICAgICAiY2FuIGFsc28gYmUgdXNlZCBvbiBwbGFpbiBlbGVtZW50cyBpbiBhZGRpdGlvbiB0byA8dGVtcGxhdGU+IHRvICIgKwogICAgICAgICAgImRlbm90ZSBzY29wZWQgc2xvdHMuIiwKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICB9CiAgICAgIGVsLnNsb3RTY29wZSA9IHNsb3RTY29wZSB8fCBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2xvdC1zY29wZScpOwogICAgfSBlbHNlIGlmICgoc2xvdFNjb3BlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Nsb3Qtc2NvcGUnKSkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgZWwuYXR0cnNNYXBbJ3YtZm9yJ10pIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAiQW1iaWd1b3VzIGNvbWJpbmVkIHVzYWdlIG9mIHNsb3Qtc2NvcGUgYW5kIHYtZm9yIG9uIDwiICsgKGVsLnRhZykgKyAiPiAiICsKICAgICAgICAgICIodi1mb3IgdGFrZXMgaGlnaGVyIHByaW9yaXR5KS4gVXNlIGEgd3JhcHBlciA8dGVtcGxhdGU+IGZvciB0aGUgIiArCiAgICAgICAgICAic2NvcGVkIHNsb3QgdG8gbWFrZSBpdCBjbGVhcmVyLiIsCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgfQogICAgICBlbC5zbG90U2NvcGUgPSBzbG90U2NvcGU7CiAgICB9CiAgICB2YXIgc2xvdFRhcmdldCA9IGdldEJpbmRpbmdBdHRyKGVsLCAnc2xvdCcpOwogICAgaWYgKHNsb3RUYXJnZXQpIHsKICAgICAgZWwuc2xvdFRhcmdldCA9IHNsb3RUYXJnZXQgPT09ICciIicgPyAnImRlZmF1bHQiJyA6IHNsb3RUYXJnZXQ7CiAgICAgIC8vIHByZXNlcnZlIHNsb3QgYXMgYW4gYXR0cmlidXRlIGZvciBuYXRpdmUgc2hhZG93IERPTSBjb21wYXQKICAgICAgLy8gb25seSBmb3Igbm9uLXNjb3BlZCBzbG90cy4KICAgICAgaWYgKGVsLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICAgICAgYWRkQXR0cihlbCwgJ3Nsb3QnLCBzbG90VGFyZ2V0KTsKICAgICAgfQogICAgfQogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc0NvbXBvbmVudCAoZWwpIHsKICB2YXIgYmluZGluZzsKICBpZiAoKGJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2lzJykpKSB7CiAgICBlbC5jb21wb25lbnQgPSBiaW5kaW5nOwogIH0KICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ2lubGluZS10ZW1wbGF0ZScpICE9IG51bGwpIHsKICAgIGVsLmlubGluZVRlbXBsYXRlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NBdHRycyAoZWwpIHsKICB2YXIgbGlzdCA9IGVsLmF0dHJzTGlzdDsKICB2YXIgaSwgbCwgbmFtZSwgcmF3TmFtZSwgdmFsdWUsIG1vZGlmaWVycywgaXNQcm9wOwogIGZvciAoaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgbmFtZSA9IHJhd05hbWUgPSBsaXN0W2ldLm5hbWU7CiAgICB2YWx1ZSA9IGxpc3RbaV0udmFsdWU7CiAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAvLyBtYXJrIGVsZW1lbnQgYXMgZHluYW1pYwogICAgICBlbC5oYXNCaW5kaW5ncyA9IHRydWU7CiAgICAgIC8vIG1vZGlmaWVycwogICAgICBtb2RpZmllcnMgPSBwYXJzZU1vZGlmaWVycyhuYW1lKTsKICAgICAgaWYgKG1vZGlmaWVycykgewogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UobW9kaWZpZXJSRSwgJycpOwogICAgICB9CiAgICAgIGlmIChiaW5kUkUudGVzdChuYW1lKSkgeyAvLyB2LWJpbmQKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGJpbmRSRSwgJycpOwogICAgICAgIHZhbHVlID0gcGFyc2VGaWx0ZXJzKHZhbHVlKTsKICAgICAgICBpc1Byb3AgPSBmYWxzZTsKICAgICAgICBpZiAobW9kaWZpZXJzKSB7CiAgICAgICAgICBpZiAobW9kaWZpZXJzLnByb3ApIHsKICAgICAgICAgICAgaXNQcm9wID0gdHJ1ZTsKICAgICAgICAgICAgbmFtZSA9IGNhbWVsaXplKG5hbWUpOwogICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2lubmVySHRtbCcpIHsgbmFtZSA9ICdpbm5lckhUTUwnOyB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobW9kaWZpZXJzLmNhbWVsKSB7CiAgICAgICAgICAgIG5hbWUgPSBjYW1lbGl6ZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb2RpZmllcnMuc3luYykgewogICAgICAgICAgICBhZGRIYW5kbGVyKAogICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICgidXBkYXRlOiIgKyAoY2FtZWxpemUobmFtZSkpKSwKICAgICAgICAgICAgICBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgIiRldmVudCIpCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1Byb3AgfHwgKAogICAgICAgICAgIWVsLmNvbXBvbmVudCAmJiBwbGF0Zm9ybU11c3RVc2VQcm9wKGVsLnRhZywgZWwuYXR0cnNNYXAudHlwZSwgbmFtZSkKICAgICAgICApKSB7CiAgICAgICAgICBhZGRQcm9wKGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZEF0dHIoZWwsIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob25SRS50ZXN0KG5hbWUpKSB7IC8vIHYtb24KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9uUkUsICcnKTsKICAgICAgICBhZGRIYW5kbGVyKGVsLCBuYW1lLCB2YWx1ZSwgbW9kaWZpZXJzLCBmYWxzZSwgd2FybiQyKTsKICAgICAgfSBlbHNlIHsgLy8gbm9ybWFsIGRpcmVjdGl2ZXMKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGRpclJFLCAnJyk7CiAgICAgICAgLy8gcGFyc2UgYXJnCiAgICAgICAgdmFyIGFyZ01hdGNoID0gbmFtZS5tYXRjaChhcmdSRSk7CiAgICAgICAgdmFyIGFyZyA9IGFyZ01hdGNoICYmIGFyZ01hdGNoWzFdOwogICAgICAgIGlmIChhcmcpIHsKICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC0oYXJnLmxlbmd0aCArIDEpKTsKICAgICAgICB9CiAgICAgICAgYWRkRGlyZWN0aXZlKGVsLCBuYW1lLCByYXdOYW1lLCB2YWx1ZSwgYXJnLCBtb2RpZmllcnMpOwogICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSA9PT0gJ21vZGVsJykgewogICAgICAgICAgY2hlY2tGb3JBbGlhc01vZGVsKGVsLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBsaXRlcmFsIGF0dHJpYnV0ZQogICAgICB7CiAgICAgICAgdmFyIHJlcyA9IHBhcnNlVGV4dCh2YWx1ZSwgZGVsaW1pdGVycyk7CiAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgd2FybiQyKAogICAgICAgICAgICBuYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIjogIiArCiAgICAgICAgICAgICdJbnRlcnBvbGF0aW9uIGluc2lkZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIHJlbW92ZWQuICcgKwogICAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICsKICAgICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBpZD0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDppZD0idmFsIj4uJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkQXR0cihlbCwgbmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgICAgLy8gIzY4ODcgZmlyZWZveCBkb2Vzbid0IHVwZGF0ZSBtdXRlZCBzdGF0ZSBpZiBzZXQgdmlhIGF0dHJpYnV0ZQogICAgICAvLyBldmVuIGltbWVkaWF0ZWx5IGFmdGVyIGVsZW1lbnQgY3JlYXRpb24KICAgICAgaWYgKCFlbC5jb21wb25lbnQgJiYKICAgICAgICAgIG5hbWUgPT09ICdtdXRlZCcgJiYKICAgICAgICAgIHBsYXRmb3JtTXVzdFVzZVByb3AoZWwudGFnLCBlbC5hdHRyc01hcC50eXBlLCBuYW1lKSkgewogICAgICAgIGFkZFByb3AoZWwsIG5hbWUsICd0cnVlJyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrSW5Gb3IgKGVsKSB7CiAgdmFyIHBhcmVudCA9IGVsOwogIHdoaWxlIChwYXJlbnQpIHsKICAgIGlmIChwYXJlbnQuZm9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgfQogIHJldHVybiBmYWxzZQp9CgpmdW5jdGlvbiBwYXJzZU1vZGlmaWVycyAobmFtZSkgewogIHZhciBtYXRjaCA9IG5hbWUubWF0Y2gobW9kaWZpZXJSRSk7CiAgaWYgKG1hdGNoKSB7CiAgICB2YXIgcmV0ID0ge307CiAgICBtYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7IHJldFttLnNsaWNlKDEpXSA9IHRydWU7IH0pOwogICAgcmV0dXJuIHJldAogIH0KfQoKZnVuY3Rpb24gbWFrZUF0dHJzTWFwIChhdHRycykgewogIHZhciBtYXAgPSB7fTsKICBmb3IgKHZhciBpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKAogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbWFwW2F0dHJzW2ldLm5hbWVdICYmICFpc0lFICYmICFpc0VkZ2UKICAgICkgewogICAgICB3YXJuJDIoJ2R1cGxpY2F0ZSBhdHRyaWJ1dGU6ICcgKyBhdHRyc1tpXS5uYW1lKTsKICAgIH0KICAgIG1hcFthdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlOwogIH0KICByZXR1cm4gbWFwCn0KCi8vIGZvciBzY3JpcHQgKGUuZy4gdHlwZT0ieC90ZW1wbGF0ZSIpIG9yIHN0eWxlLCBkbyBub3QgZGVjb2RlIGNvbnRlbnQKZnVuY3Rpb24gaXNUZXh0VGFnIChlbCkgewogIHJldHVybiBlbC50YWcgPT09ICdzY3JpcHQnIHx8IGVsLnRhZyA9PT0gJ3N0eWxlJwp9CgpmdW5jdGlvbiBpc0ZvcmJpZGRlblRhZyAoZWwpIHsKICByZXR1cm4gKAogICAgZWwudGFnID09PSAnc3R5bGUnIHx8CiAgICAoZWwudGFnID09PSAnc2NyaXB0JyAmJiAoCiAgICAgICFlbC5hdHRyc01hcC50eXBlIHx8CiAgICAgIGVsLmF0dHJzTWFwLnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnCiAgICApKQogICkKfQoKdmFyIGllTlNCdWcgPSAvXnhtbG5zOk5TXGQrLzsKdmFyIGllTlNQcmVmaXggPSAvXk5TXGQrOi87CgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBndWFyZElFU1ZHQnVnIChhdHRycykgewogIHZhciByZXMgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldOwogICAgaWYgKCFpZU5TQnVnLnRlc3QoYXR0ci5uYW1lKSkgewogICAgICBhdHRyLm5hbWUgPSBhdHRyLm5hbWUucmVwbGFjZShpZU5TUHJlZml4LCAnJyk7CiAgICAgIHJlcy5wdXNoKGF0dHIpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrRm9yQWxpYXNNb2RlbCAoZWwsIHZhbHVlKSB7CiAgdmFyIF9lbCA9IGVsOwogIHdoaWxlIChfZWwpIHsKICAgIGlmIChfZWwuZm9yICYmIF9lbC5hbGlhcyA9PT0gdmFsdWUpIHsKICAgICAgd2FybiQyKAogICAgICAgICI8IiArIChlbC50YWcpICsgIiB2LW1vZGVsPVwiIiArIHZhbHVlICsgIlwiPjogIiArCiAgICAgICAgIllvdSBhcmUgYmluZGluZyB2LW1vZGVsIGRpcmVjdGx5IHRvIGEgdi1mb3IgaXRlcmF0aW9uIGFsaWFzLiAiICsKICAgICAgICAiVGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgdi1mb3Igc291cmNlIGFycmF5IGJlY2F1c2UgIiArCiAgICAgICAgIndyaXRpbmcgdG8gdGhlIGFsaWFzIGlzIGxpa2UgbW9kaWZ5aW5nIGEgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGUuICIgKwogICAgICAgICJDb25zaWRlciB1c2luZyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCB1c2Ugdi1tb2RlbCBvbiBhbiBvYmplY3QgcHJvcGVydHkgaW5zdGVhZC4iCiAgICAgICk7CiAgICB9CiAgICBfZWwgPSBfZWwucGFyZW50OwogIH0KfQoKLyogICovCgovKioKICogRXhwYW5kIGlucHV0W3YtbW9kZWxdIHdpdGggZHlhbm1pYyB0eXBlIGJpbmRpbmdzIGludG8gdi1pZi1lbHNlIGNoYWlucwogKiBUdXJuIHRoaXM6CiAqICAgPGlucHV0IHYtbW9kZWw9ImRhdGFbdHlwZV0iIDp0eXBlPSJ0eXBlIj4KICogaW50byB0aGlzOgogKiAgIDxpbnB1dCB2LWlmPSJ0eXBlID09PSAnY2hlY2tib3gnIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iZGF0YVt0eXBlXSI+CiAqICAgPGlucHV0IHYtZWxzZS1pZj0idHlwZSA9PT0gJ3JhZGlvJyIgdHlwZT0icmFkaW8iIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKiAgIDxpbnB1dCB2LWVsc2UgOnR5cGU9InR5cGUiIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKi8KCmZ1bmN0aW9uIHByZVRyYW5zZm9ybU5vZGUgKGVsLCBvcHRpb25zKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ2lucHV0JykgewogICAgdmFyIG1hcCA9IGVsLmF0dHJzTWFwOwogICAgaWYgKCFtYXBbJ3YtbW9kZWwnXSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgdHlwZUJpbmRpbmc7CiAgICBpZiAobWFwWyc6dHlwZSddIHx8IG1hcFsndi1iaW5kOnR5cGUnXSkgewogICAgICB0eXBlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndHlwZScpOwogICAgfQogICAgaWYgKCFtYXAudHlwZSAmJiAhdHlwZUJpbmRpbmcgJiYgbWFwWyd2LWJpbmQnXSkgewogICAgICB0eXBlQmluZGluZyA9ICIoIiArIChtYXBbJ3YtYmluZCddKSArICIpLnR5cGUiOwogICAgfQoKICAgIGlmICh0eXBlQmluZGluZykgewogICAgICB2YXIgaWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1pZicsIHRydWUpOwogICAgICB2YXIgaWZDb25kaXRpb25FeHRyYSA9IGlmQ29uZGl0aW9uID8gKCImJigiICsgaWZDb25kaXRpb24gKyAiKSIpIDogIiI7CiAgICAgIHZhciBoYXNFbHNlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScsIHRydWUpICE9IG51bGw7CiAgICAgIHZhciBlbHNlSWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1lbHNlLWlmJywgdHJ1ZSk7CiAgICAgIC8vIDEuIGNoZWNrYm94CiAgICAgIHZhciBicmFuY2gwID0gY2xvbmVBU1RFbGVtZW50KGVsKTsKICAgICAgLy8gcHJvY2VzcyBmb3Igb24gdGhlIG1haW4gbm9kZQogICAgICBwcm9jZXNzRm9yKGJyYW5jaDApOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDAsICd0eXBlJywgJ2NoZWNrYm94Jyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDAsIG9wdGlvbnMpOwogICAgICBicmFuY2gwLnByb2Nlc3NlZCA9IHRydWU7IC8vIHByZXZlbnQgaXQgZnJvbSBkb3VibGUtcHJvY2Vzc2VkCiAgICAgIGJyYW5jaDAuaWYgPSAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J2NoZWNrYm94JyIgKyBpZkNvbmRpdGlvbkV4dHJhOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiBicmFuY2gwLmlmLAogICAgICAgIGJsb2NrOiBicmFuY2gwCiAgICAgIH0pOwogICAgICAvLyAyLiBhZGQgcmFkaW8gZWxzZS1pZiBjb25kaXRpb24KICAgICAgdmFyIGJyYW5jaDEgPSBjbG9uZUFTVEVsZW1lbnQoZWwpOwogICAgICBnZXRBbmRSZW1vdmVBdHRyKGJyYW5jaDEsICd2LWZvcicsIHRydWUpOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDEsICd0eXBlJywgJ3JhZGlvJyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDEsIG9wdGlvbnMpOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J3JhZGlvJyIgKyBpZkNvbmRpdGlvbkV4dHJhLAogICAgICAgIGJsb2NrOiBicmFuY2gxCiAgICAgIH0pOwogICAgICAvLyAzLiBvdGhlcgogICAgICB2YXIgYnJhbmNoMiA9IGNsb25lQVNURWxlbWVudChlbCk7CiAgICAgIGdldEFuZFJlbW92ZUF0dHIoYnJhbmNoMiwgJ3YtZm9yJywgdHJ1ZSk7CiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMiwgJzp0eXBlJywgdHlwZUJpbmRpbmcpOwogICAgICBwcm9jZXNzRWxlbWVudChicmFuY2gyLCBvcHRpb25zKTsKICAgICAgYWRkSWZDb25kaXRpb24oYnJhbmNoMCwgewogICAgICAgIGV4cDogaWZDb25kaXRpb24sCiAgICAgICAgYmxvY2s6IGJyYW5jaDIKICAgICAgfSk7CgogICAgICBpZiAoaGFzRWxzZSkgewogICAgICAgIGJyYW5jaDAuZWxzZSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoZWxzZUlmQ29uZGl0aW9uKSB7CiAgICAgICAgYnJhbmNoMC5lbHNlaWYgPSBlbHNlSWZDb25kaXRpb247CiAgICAgIH0KCiAgICAgIHJldHVybiBicmFuY2gwCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFTVEVsZW1lbnQgKGVsKSB7CiAgcmV0dXJuIGNyZWF0ZUFTVEVsZW1lbnQoZWwudGFnLCBlbC5hdHRyc0xpc3Quc2xpY2UoKSwgZWwucGFyZW50KQp9Cgp2YXIgbW9kZWwkMiA9IHsKICBwcmVUcmFuc2Zvcm1Ob2RlOiBwcmVUcmFuc2Zvcm1Ob2RlCn0KCnZhciBtb2R1bGVzJDEgPSBbCiAga2xhc3MkMSwKICBzdHlsZSQxLAogIG1vZGVsJDIKXQoKLyogICovCgpmdW5jdGlvbiB0ZXh0IChlbCwgZGlyKSB7CiAgaWYgKGRpci52YWx1ZSkgewogICAgYWRkUHJvcChlbCwgJ3RleHRDb250ZW50JywgKCJfcygiICsgKGRpci52YWx1ZSkgKyAiKSIpKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaHRtbCAoZWwsIGRpcikgewogIGlmIChkaXIudmFsdWUpIHsKICAgIGFkZFByb3AoZWwsICdpbm5lckhUTUwnLCAoIl9zKCIgKyAoZGlyLnZhbHVlKSArICIpIikpOwogIH0KfQoKdmFyIGRpcmVjdGl2ZXMkMSA9IHsKICBtb2RlbDogbW9kZWwsCiAgdGV4dDogdGV4dCwKICBodG1sOiBodG1sCn0KCi8qICAqLwoKdmFyIGJhc2VPcHRpb25zID0gewogIGV4cGVjdEhUTUw6IHRydWUsCiAgbW9kdWxlczogbW9kdWxlcyQxLAogIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXMkMSwKICBpc1ByZVRhZzogaXNQcmVUYWcsCiAgaXNVbmFyeVRhZzogaXNVbmFyeVRhZywKICBtdXN0VXNlUHJvcDogbXVzdFVzZVByb3AsCiAgY2FuQmVMZWZ0T3BlblRhZzogY2FuQmVMZWZ0T3BlblRhZywKICBpc1Jlc2VydmVkVGFnOiBpc1Jlc2VydmVkVGFnLAogIGdldFRhZ05hbWVzcGFjZTogZ2V0VGFnTmFtZXNwYWNlLAogIHN0YXRpY0tleXM6IGdlblN0YXRpY0tleXMobW9kdWxlcyQxKQp9OwoKLyogICovCgp2YXIgaXNTdGF0aWNLZXk7CnZhciBpc1BsYXRmb3JtUmVzZXJ2ZWRUYWc7Cgp2YXIgZ2VuU3RhdGljS2V5c0NhY2hlZCA9IGNhY2hlZChnZW5TdGF0aWNLZXlzJDEpOwoKLyoqCiAqIEdvYWwgb2YgdGhlIG9wdGltaXplcjogd2FsayB0aGUgZ2VuZXJhdGVkIHRlbXBsYXRlIEFTVCB0cmVlCiAqIGFuZCBkZXRlY3Qgc3ViLXRyZWVzIHRoYXQgYXJlIHB1cmVseSBzdGF0aWMsIGkuZS4gcGFydHMgb2YKICogdGhlIERPTSB0aGF0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZS4KICoKICogT25jZSB3ZSBkZXRlY3QgdGhlc2Ugc3ViLXRyZWVzLCB3ZSBjYW46CiAqCiAqIDEuIEhvaXN0IHRoZW0gaW50byBjb25zdGFudHMsIHNvIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8KICogICAgY3JlYXRlIGZyZXNoIG5vZGVzIGZvciB0aGVtIG9uIGVhY2ggcmUtcmVuZGVyOwogKiAyLiBDb21wbGV0ZWx5IHNraXAgdGhlbSBpbiB0aGUgcGF0Y2hpbmcgcHJvY2Vzcy4KICovCmZ1bmN0aW9uIG9wdGltaXplIChyb290LCBvcHRpb25zKSB7CiAgaWYgKCFyb290KSB7IHJldHVybiB9CiAgaXNTdGF0aWNLZXkgPSBnZW5TdGF0aWNLZXlzQ2FjaGVkKG9wdGlvbnMuc3RhdGljS2V5cyB8fCAnJyk7CiAgaXNQbGF0Zm9ybVJlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIC8vIGZpcnN0IHBhc3M6IG1hcmsgYWxsIG5vbi1zdGF0aWMgbm9kZXMuCiAgbWFya1N0YXRpYyQxKHJvb3QpOwogIC8vIHNlY29uZCBwYXNzOiBtYXJrIHN0YXRpYyByb290cy4KICBtYXJrU3RhdGljUm9vdHMocm9vdCwgZmFsc2UpOwp9CgpmdW5jdGlvbiBnZW5TdGF0aWNLZXlzJDEgKGtleXMpIHsKICByZXR1cm4gbWFrZU1hcCgKICAgICd0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzJyArCiAgICAoa2V5cyA/ICcsJyArIGtleXMgOiAnJykKICApCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMkMSAobm9kZSkgewogIG5vZGUuc3RhdGljID0gaXNTdGF0aWMobm9kZSk7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgLy8gZG8gbm90IG1ha2UgY29tcG9uZW50IHNsb3QgY29udGVudCBzdGF0aWMuIHRoaXMgYXZvaWRzCiAgICAvLyAxLiBjb21wb25lbnRzIG5vdCBhYmxlIHRvIG11dGF0ZSBzbG90IG5vZGVzCiAgICAvLyAyLiBzdGF0aWMgc2xvdCBjb250ZW50IGZhaWxzIGZvciBob3QtcmVsb2FkaW5nCiAgICBpZiAoCiAgICAgICFpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcobm9kZS50YWcpICYmCiAgICAgIG5vZGUudGFnICE9PSAnc2xvdCcgJiYKICAgICAgbm9kZS5hdHRyc01hcFsnaW5saW5lLXRlbXBsYXRlJ10gPT0gbnVsbAogICAgKSB7CiAgICAgIHJldHVybgogICAgfQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldOwogICAgICBtYXJrU3RhdGljJDEoY2hpbGQpOwogICAgICBpZiAoIWNoaWxkLnN0YXRpYykgewogICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICB2YXIgYmxvY2sgPSBub2RlLmlmQ29uZGl0aW9uc1tpJDFdLmJsb2NrOwogICAgICAgIG1hcmtTdGF0aWMkMShibG9jayk7CiAgICAgICAgaWYgKCFibG9jay5zdGF0aWMpIHsKICAgICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljUm9vdHMgKG5vZGUsIGlzSW5Gb3IpIHsKICBpZiAobm9kZS50eXBlID09PSAxKSB7CiAgICBpZiAobm9kZS5zdGF0aWMgfHwgbm9kZS5vbmNlKSB7CiAgICAgIG5vZGUuc3RhdGljSW5Gb3IgPSBpc0luRm9yOwogICAgfQogICAgLy8gRm9yIGEgbm9kZSB0byBxdWFsaWZ5IGFzIGEgc3RhdGljIHJvb3QsIGl0IHNob3VsZCBoYXZlIGNoaWxkcmVuIHRoYXQKICAgIC8vIGFyZSBub3QganVzdCBzdGF0aWMgdGV4dC4gT3RoZXJ3aXNlIHRoZSBjb3N0IG9mIGhvaXN0aW5nIG91dCB3aWxsCiAgICAvLyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgYW5kIGl0J3MgYmV0dGVyIG9mZiB0byBqdXN0IGFsd2F5cyByZW5kZXIgaXQgZnJlc2guCiAgICBpZiAobm9kZS5zdGF0aWMgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgISgKICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYKICAgICAgbm9kZS5jaGlsZHJlblswXS50eXBlID09PSAzCiAgICApKSB7CiAgICAgIG5vZGUuc3RhdGljUm9vdCA9IHRydWU7CiAgICAgIHJldHVybgogICAgfSBlbHNlIHsKICAgICAgbm9kZS5zdGF0aWNSb290ID0gZmFsc2U7CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgbWFya1N0YXRpY1Jvb3RzKG5vZGUuY2hpbGRyZW5baV0sIGlzSW5Gb3IgfHwgISFub2RlLmZvcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICBtYXJrU3RhdGljUm9vdHMobm9kZS5pZkNvbmRpdGlvbnNbaSQxXS5ibG9jaywgaXNJbkZvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGlzU3RhdGljIChub2RlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMikgeyAvLyBleHByZXNzaW9uCiAgICByZXR1cm4gZmFsc2UKICB9CiAgaWYgKG5vZGUudHlwZSA9PT0gMykgeyAvLyB0ZXh0CiAgICByZXR1cm4gdHJ1ZQogIH0KICByZXR1cm4gISEobm9kZS5wcmUgfHwgKAogICAgIW5vZGUuaGFzQmluZGluZ3MgJiYgLy8gbm8gZHluYW1pYyBiaW5kaW5ncwogICAgIW5vZGUuaWYgJiYgIW5vZGUuZm9yICYmIC8vIG5vdCB2LWlmIG9yIHYtZm9yIG9yIHYtZWxzZQogICAgIWlzQnVpbHRJblRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgYnVpbHQtaW4KICAgIGlzUGxhdGZvcm1SZXNlcnZlZFRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgY29tcG9uZW50CiAgICAhaXNEaXJlY3RDaGlsZE9mVGVtcGxhdGVGb3Iobm9kZSkgJiYKICAgIE9iamVjdC5rZXlzKG5vZGUpLmV2ZXJ5KGlzU3RhdGljS2V5KQogICkpCn0KCmZ1bmN0aW9uIGlzRGlyZWN0Q2hpbGRPZlRlbXBsYXRlRm9yIChub2RlKSB7CiAgd2hpbGUgKG5vZGUucGFyZW50KSB7CiAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICBpZiAobm9kZS50YWcgIT09ICd0ZW1wbGF0ZScpIHsKICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgICBpZiAobm9kZS5mb3IpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlCn0KCi8qICAqLwoKdmFyIGZuRXhwUkUgPSAvXihbXHckX10rfFwoW14pXSo/XCkpXHMqPT58XmZ1bmN0aW9uXHMqXCgvOwp2YXIgc2ltcGxlUGF0aFJFID0gL15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLzsKCi8vIEtleWJvYXJkRXZlbnQua2V5Q29kZSBhbGlhc2VzCnZhciBrZXlDb2RlcyA9IHsKICBlc2M6IDI3LAogIHRhYjogOSwKICBlbnRlcjogMTMsCiAgc3BhY2U6IDMyLAogIHVwOiAzOCwKICBsZWZ0OiAzNywKICByaWdodDogMzksCiAgZG93bjogNDAsCiAgJ2RlbGV0ZSc6IFs4LCA0Nl0KfTsKCi8vIEtleWJvYXJkRXZlbnQua2V5IGFsaWFzZXMKdmFyIGtleU5hbWVzID0gewogIGVzYzogJ0VzY2FwZScsCiAgdGFiOiAnVGFiJywKICBlbnRlcjogJ0VudGVyJywKICBzcGFjZTogJyAnLAogIC8vICM3ODA2OiBJRTExIHVzZXMga2V5IG5hbWVzIHdpdGhvdXQgYEFycm93YCBwcmVmaXggZm9yIGFycm93IGtleXMuCiAgdXA6IFsnVXAnLCAnQXJyb3dVcCddLAogIGxlZnQ6IFsnTGVmdCcsICdBcnJvd0xlZnQnXSwKICByaWdodDogWydSaWdodCcsICdBcnJvd1JpZ2h0J10sCiAgZG93bjogWydEb3duJywgJ0Fycm93RG93biddLAogICdkZWxldGUnOiBbJ0JhY2tzcGFjZScsICdEZWxldGUnXQp9OwoKLy8gIzQ4Njg6IG1vZGlmaWVycyB0aGF0IHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbGlzdGVuZXIKLy8gbmVlZCB0byBleHBsaWNpdGx5IHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIHRvIHJlbW92ZQovLyB0aGUgbGlzdGVuZXIgZm9yIC5vbmNlCnZhciBnZW5HdWFyZCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHsgcmV0dXJuICgiaWYoIiArIGNvbmRpdGlvbiArICIpcmV0dXJuIG51bGw7Iik7IH07Cgp2YXIgbW9kaWZpZXJDb2RlID0gewogIHN0b3A6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JywKICBwcmV2ZW50OiAnJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JywKICBzZWxmOiBnZW5HdWFyZCgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSwKICBjdHJsOiBnZW5HdWFyZCgiISRldmVudC5jdHJsS2V5IiksCiAgc2hpZnQ6IGdlbkd1YXJkKCIhJGV2ZW50LnNoaWZ0S2V5IiksCiAgYWx0OiBnZW5HdWFyZCgiISRldmVudC5hbHRLZXkiKSwKICBtZXRhOiBnZW5HdWFyZCgiISRldmVudC5tZXRhS2V5IiksCiAgbGVmdDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAwIiksCiAgbWlkZGxlOiBnZW5HdWFyZCgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSwKICByaWdodDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyIikKfTsKCmZ1bmN0aW9uIGdlbkhhbmRsZXJzICgKICBldmVudHMsCiAgaXNOYXRpdmUsCiAgd2FybgopIHsKICB2YXIgcmVzID0gaXNOYXRpdmUgPyAnbmF0aXZlT246eycgOiAnb246eyc7CiAgZm9yICh2YXIgbmFtZSBpbiBldmVudHMpIHsKICAgIHJlcyArPSAiXCIiICsgbmFtZSArICJcIjoiICsgKGdlbkhhbmRsZXIobmFtZSwgZXZlbnRzW25hbWVdKSkgKyAiLCI7CiAgfQogIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ30nCn0KCmZ1bmN0aW9uIGdlbkhhbmRsZXIgKAogIG5hbWUsCiAgaGFuZGxlcgopIHsKICBpZiAoIWhhbmRsZXIpIHsKICAgIHJldHVybiAnZnVuY3Rpb24oKXt9JwogIH0KCiAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHsKICAgIHJldHVybiAoIlsiICsgKGhhbmRsZXIubWFwKGZ1bmN0aW9uIChoYW5kbGVyKSB7IHJldHVybiBnZW5IYW5kbGVyKG5hbWUsIGhhbmRsZXIpOyB9KS5qb2luKCcsJykpICsgIl0iKQogIH0KCiAgdmFyIGlzTWV0aG9kUGF0aCA9IHNpbXBsZVBhdGhSRS50ZXN0KGhhbmRsZXIudmFsdWUpOwogIHZhciBpc0Z1bmN0aW9uRXhwcmVzc2lvbiA9IGZuRXhwUkUudGVzdChoYW5kbGVyLnZhbHVlKTsKCiAgaWYgKCFoYW5kbGVyLm1vZGlmaWVycykgewogICAgaWYgKGlzTWV0aG9kUGF0aCB8fCBpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gaGFuZGxlci52YWx1ZQogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICByZXR1cm4gKCJmdW5jdGlvbigkZXZlbnQpeyIgKyAoaGFuZGxlci52YWx1ZSkgKyAifSIpIC8vIGlubGluZSBzdGF0ZW1lbnQKICB9IGVsc2UgewogICAgdmFyIGNvZGUgPSAnJzsKICAgIHZhciBnZW5Nb2RpZmllckNvZGUgPSAnJzsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gaGFuZGxlci5tb2RpZmllcnMpIHsKICAgICAgaWYgKG1vZGlmaWVyQ29kZVtrZXldKSB7CiAgICAgICAgZ2VuTW9kaWZpZXJDb2RlICs9IG1vZGlmaWVyQ29kZVtrZXldOwogICAgICAgIC8vIGxlZnQvcmlnaHQKICAgICAgICBpZiAoa2V5Q29kZXNba2V5XSkgewogICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4YWN0JykgewogICAgICAgIHZhciBtb2RpZmllcnMgPSAoaGFuZGxlci5tb2RpZmllcnMpOwogICAgICAgIGdlbk1vZGlmaWVyQ29kZSArPSBnZW5HdWFyZCgKICAgICAgICAgIFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnbWV0YSddCiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleU1vZGlmaWVyKSB7IHJldHVybiAhbW9kaWZpZXJzW2tleU1vZGlmaWVyXTsgfSkKICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5TW9kaWZpZXIpIHsgcmV0dXJuICgiJGV2ZW50LiIgKyBrZXlNb2RpZmllciArICJLZXkiKTsgfSkKICAgICAgICAgICAgLmpvaW4oJ3x8JykKICAgICAgICApOwogICAgICB9IGVsc2UgewogICAgICAgIGtleXMucHVzaChrZXkpOwogICAgICB9CiAgICB9CiAgICBpZiAoa2V5cy5sZW5ndGgpIHsKICAgICAgY29kZSArPSBnZW5LZXlGaWx0ZXIoa2V5cyk7CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgbW9kaWZpZXJzIGxpa2UgcHJldmVudCBhbmQgc3RvcCBnZXQgZXhlY3V0ZWQgYWZ0ZXIga2V5IGZpbHRlcmluZwogICAgaWYgKGdlbk1vZGlmaWVyQ29kZSkgewogICAgICBjb2RlICs9IGdlbk1vZGlmaWVyQ29kZTsKICAgIH0KICAgIHZhciBoYW5kbGVyQ29kZSA9IGlzTWV0aG9kUGF0aAogICAgICA/ICgicmV0dXJuICIgKyAoaGFuZGxlci52YWx1ZSkgKyAiKCRldmVudCkiKQogICAgICA6IGlzRnVuY3Rpb25FeHByZXNzaW9uCiAgICAgICAgPyAoInJldHVybiAoIiArIChoYW5kbGVyLnZhbHVlKSArICIpKCRldmVudCkiKQogICAgICAgIDogaGFuZGxlci52YWx1ZTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgcmV0dXJuICgiZnVuY3Rpb24oJGV2ZW50KXsiICsgY29kZSArIGhhbmRsZXJDb2RlICsgIn0iKQogIH0KfQoKZnVuY3Rpb24gZ2VuS2V5RmlsdGVyIChrZXlzKSB7CiAgcmV0dXJuICgiaWYoISgnYnV0dG9uJyBpbiAkZXZlbnQpJiYiICsgKGtleXMubWFwKGdlbkZpbHRlckNvZGUpLmpvaW4oJyYmJykpICsgIilyZXR1cm4gbnVsbDsiKQp9CgpmdW5jdGlvbiBnZW5GaWx0ZXJDb2RlIChrZXkpIHsKICB2YXIga2V5VmFsID0gcGFyc2VJbnQoa2V5LCAxMCk7CiAgaWYgKGtleVZhbCkgewogICAgcmV0dXJuICgiJGV2ZW50LmtleUNvZGUhPT0iICsga2V5VmFsKQogIH0KICB2YXIga2V5Q29kZSA9IGtleUNvZGVzW2tleV07CiAgdmFyIGtleU5hbWUgPSBrZXlOYW1lc1trZXldOwogIHJldHVybiAoCiAgICAiX2soJGV2ZW50LmtleUNvZGUsIiArCiAgICAoSlNPTi5zdHJpbmdpZnkoa2V5KSkgKyAiLCIgKwogICAgKEpTT04uc3RyaW5naWZ5KGtleUNvZGUpKSArICIsIiArCiAgICAiJGV2ZW50LmtleSwiICsKICAgICIiICsgKEpTT04uc3RyaW5naWZ5KGtleU5hbWUpKSArCiAgICAiKSIKICApCn0KCi8qICAqLwoKZnVuY3Rpb24gb24gKGVsLCBkaXIpIHsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRpci5tb2RpZmllcnMpIHsKICAgIHdhcm4oInYtb24gd2l0aG91dCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IG1vZGlmaWVycy4iKTsKICB9CiAgZWwud3JhcExpc3RlbmVycyA9IGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiAoIl9nKCIgKyBjb2RlICsgIiwiICsgKGRpci52YWx1ZSkgKyAiKSIpOyB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGJpbmQkMSAoZWwsIGRpcikgewogIGVsLndyYXBEYXRhID0gZnVuY3Rpb24gKGNvZGUpIHsKICAgIHJldHVybiAoIl9iKCIgKyBjb2RlICsgIiwnIiArIChlbC50YWcpICsgIicsIiArIChkaXIudmFsdWUpICsgIiwiICsgKGRpci5tb2RpZmllcnMgJiYgZGlyLm1vZGlmaWVycy5wcm9wID8gJ3RydWUnIDogJ2ZhbHNlJykgKyAoZGlyLm1vZGlmaWVycyAmJiBkaXIubW9kaWZpZXJzLnN5bmMgPyAnLHRydWUnIDogJycpICsgIikiKQogIH07Cn0KCi8qICAqLwoKdmFyIGJhc2VEaXJlY3RpdmVzID0gewogIG9uOiBvbiwKICBiaW5kOiBiaW5kJDEsCiAgY2xvYWs6IG5vb3AKfQoKLyogICovCgp2YXIgQ29kZWdlblN0YXRlID0gZnVuY3Rpb24gQ29kZWdlblN0YXRlIChvcHRpb25zKSB7CiAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICB0aGlzLndhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CiAgdGhpcy50cmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICd0cmFuc2Zvcm1Db2RlJyk7CiAgdGhpcy5kYXRhR2VuRm5zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdnZW5EYXRhJyk7CiAgdGhpcy5kaXJlY3RpdmVzID0gZXh0ZW5kKGV4dGVuZCh7fSwgYmFzZURpcmVjdGl2ZXMpLCBvcHRpb25zLmRpcmVjdGl2ZXMpOwogIHZhciBpc1Jlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIHRoaXMubWF5YmVDb21wb25lbnQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICFpc1Jlc2VydmVkVGFnKGVsLnRhZyk7IH07CiAgdGhpcy5vbmNlSWQgPSAwOwogIHRoaXMuc3RhdGljUmVuZGVyRm5zID0gW107Cn07CgoKCmZ1bmN0aW9uIGdlbmVyYXRlICgKICBhc3QsCiAgb3B0aW9ucwopIHsKICB2YXIgc3RhdGUgPSBuZXcgQ29kZWdlblN0YXRlKG9wdGlvbnMpOwogIHZhciBjb2RlID0gYXN0ID8gZ2VuRWxlbWVudChhc3QsIHN0YXRlKSA6ICdfYygiZGl2IiknOwogIHJldHVybiB7CiAgICByZW5kZXI6ICgid2l0aCh0aGlzKXtyZXR1cm4gIiArIGNvZGUgKyAifSIpLAogICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMKICB9Cn0KCmZ1bmN0aW9uIGdlbkVsZW1lbnQgKGVsLCBzdGF0ZSkgewogIGlmIChlbC5zdGF0aWNSb290ICYmICFlbC5zdGF0aWNQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5TdGF0aWMoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwub25jZSAmJiAhZWwub25jZVByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbk9uY2UoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuZm9yICYmICFlbC5mb3JQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5Gb3IoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuaWYgJiYgIWVsLmlmUHJvY2Vzc2VkKSB7CiAgICByZXR1cm4gZ2VuSWYoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwudGFnID09PSAndGVtcGxhdGUnICYmICFlbC5zbG90VGFyZ2V0KSB7CiAgICByZXR1cm4gZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlKSB8fCAndm9pZCAwJwogIH0gZWxzZSBpZiAoZWwudGFnID09PSAnc2xvdCcpIHsKICAgIHJldHVybiBnZW5TbG90KGVsLCBzdGF0ZSkKICB9IGVsc2UgewogICAgLy8gY29tcG9uZW50IG9yIGVsZW1lbnQKICAgIHZhciBjb2RlOwogICAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgICBjb2RlID0gZ2VuQ29tcG9uZW50KGVsLmNvbXBvbmVudCwgZWwsIHN0YXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBkYXRhID0gZWwucGxhaW4gPyB1bmRlZmluZWQgOiBnZW5EYXRhJDIoZWwsIHN0YXRlKTsKCiAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmlubGluZVRlbXBsYXRlID8gbnVsbCA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSwgdHJ1ZSk7CiAgICAgIGNvZGUgPSAiX2MoJyIgKyAoZWwudGFnKSArICInIiArIChkYXRhID8gKCIsIiArIGRhdGEpIDogJycpICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKSArICIpIjsKICAgIH0KICAgIC8vIG1vZHVsZSB0cmFuc2Zvcm1zCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLnRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29kZSA9IHN0YXRlLnRyYW5zZm9ybXNbaV0oZWwsIGNvZGUpOwogICAgfQogICAgcmV0dXJuIGNvZGUKICB9Cn0KCi8vIGhvaXN0IHN0YXRpYyBzdWItdHJlZXMgb3V0CmZ1bmN0aW9uIGdlblN0YXRpYyAoZWwsIHN0YXRlKSB7CiAgZWwuc3RhdGljUHJvY2Vzc2VkID0gdHJ1ZTsKICBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMucHVzaCgoIndpdGgodGhpcyl7cmV0dXJuICIgKyAoZ2VuRWxlbWVudChlbCwgc3RhdGUpKSArICJ9IikpOwogIHJldHVybiAoIl9tKCIgKyAoc3RhdGUuc3RhdGljUmVuZGVyRm5zLmxlbmd0aCAtIDEpICsgKGVsLnN0YXRpY0luRm9yID8gJyx0cnVlJyA6ICcnKSArICIpIikKfQoKLy8gdi1vbmNlCmZ1bmN0aW9uIGdlbk9uY2UgKGVsLCBzdGF0ZSkgewogIGVsLm9uY2VQcm9jZXNzZWQgPSB0cnVlOwogIGlmIChlbC5pZiAmJiAhZWwuaWZQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5JZihlbCwgc3RhdGUpCiAgfSBlbHNlIGlmIChlbC5zdGF0aWNJbkZvcikgewogICAgdmFyIGtleSA9ICcnOwogICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgaWYgKHBhcmVudC5mb3IpIHsKICAgICAgICBrZXkgPSBwYXJlbnQua2V5OwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGlmICgha2V5KSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzdGF0ZS53YXJuKAogICAgICAgICJ2LW9uY2UgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgdi1mb3IgdGhhdCBpcyBrZXllZC4gIgogICAgICApOwogICAgICByZXR1cm4gZ2VuRWxlbWVudChlbCwgc3RhdGUpCiAgICB9CiAgICByZXR1cm4gKCJfbygiICsgKGdlbkVsZW1lbnQoZWwsIHN0YXRlKSkgKyAiLCIgKyAoc3RhdGUub25jZUlkKyspICsgIiwiICsga2V5ICsgIikiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuU3RhdGljKGVsLCBzdGF0ZSkKICB9Cn0KCmZ1bmN0aW9uIGdlbklmICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0RW1wdHkKKSB7CiAgZWwuaWZQcm9jZXNzZWQgPSB0cnVlOyAvLyBhdm9pZCByZWN1cnNpb24KICByZXR1cm4gZ2VuSWZDb25kaXRpb25zKGVsLmlmQ29uZGl0aW9ucy5zbGljZSgpLCBzdGF0ZSwgYWx0R2VuLCBhbHRFbXB0eSkKfQoKZnVuY3Rpb24gZ2VuSWZDb25kaXRpb25zICgKICBjb25kaXRpb25zLAogIHN0YXRlLAogIGFsdEdlbiwKICBhbHRFbXB0eQopIHsKICBpZiAoIWNvbmRpdGlvbnMubGVuZ3RoKSB7CiAgICByZXR1cm4gYWx0RW1wdHkgfHwgJ19lKCknCiAgfQoKICB2YXIgY29uZGl0aW9uID0gY29uZGl0aW9ucy5zaGlmdCgpOwogIGlmIChjb25kaXRpb24uZXhwKSB7CiAgICByZXR1cm4gKCIoIiArIChjb25kaXRpb24uZXhwKSArICIpPyIgKyAoZ2VuVGVybmFyeUV4cChjb25kaXRpb24uYmxvY2spKSArICI6IiArIChnZW5JZkNvbmRpdGlvbnMoY29uZGl0aW9ucywgc3RhdGUsIGFsdEdlbiwgYWx0RW1wdHkpKSkKICB9IGVsc2UgewogICAgcmV0dXJuICgiIiArIChnZW5UZXJuYXJ5RXhwKGNvbmRpdGlvbi5ibG9jaykpKQogIH0KCiAgLy8gdi1pZiB3aXRoIHYtb25jZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBsaWtlIChhKT9fbSgwKTpfbSgxKQogIGZ1bmN0aW9uIGdlblRlcm5hcnlFeHAgKGVsKSB7CiAgICByZXR1cm4gYWx0R2VuCiAgICAgID8gYWx0R2VuKGVsLCBzdGF0ZSkKICAgICAgOiBlbC5vbmNlCiAgICAgICAgPyBnZW5PbmNlKGVsLCBzdGF0ZSkKICAgICAgICA6IGdlbkVsZW1lbnQoZWwsIHN0YXRlKQogIH0KfQoKZnVuY3Rpb24gZ2VuRm9yICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0SGVscGVyCikgewogIHZhciBleHAgPSBlbC5mb3I7CiAgdmFyIGFsaWFzID0gZWwuYWxpYXM7CiAgdmFyIGl0ZXJhdG9yMSA9IGVsLml0ZXJhdG9yMSA/ICgiLCIgKyAoZWwuaXRlcmF0b3IxKSkgOiAnJzsKICB2YXIgaXRlcmF0b3IyID0gZWwuaXRlcmF0b3IyID8gKCIsIiArIChlbC5pdGVyYXRvcjIpKSA6ICcnOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICBzdGF0ZS5tYXliZUNvbXBvbmVudChlbCkgJiYKICAgIGVsLnRhZyAhPT0gJ3Nsb3QnICYmCiAgICBlbC50YWcgIT09ICd0ZW1wbGF0ZScgJiYKICAgICFlbC5rZXkKICApIHsKICAgIHN0YXRlLndhcm4oCiAgICAgICI8IiArIChlbC50YWcpICsgIiB2LWZvcj1cIiIgKyBhbGlhcyArICIgaW4gIiArIGV4cCArICJcIj46IGNvbXBvbmVudCBsaXN0cyByZW5kZXJlZCB3aXRoICIgKwogICAgICAidi1mb3Igc2hvdWxkIGhhdmUgZXhwbGljaXQga2V5cy4gIiArCiAgICAgICJTZWUgaHR0cHM6Ly92dWVqcy5vcmcvZ3VpZGUvbGlzdC5odG1sI2tleSBmb3IgbW9yZSBpbmZvLiIsCiAgICAgIHRydWUgLyogdGlwICovCiAgICApOwogIH0KCiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuIChhbHRIZWxwZXIgfHwgJ19sJykgKyAiKCgiICsgZXhwICsgIiksIiArCiAgICAiZnVuY3Rpb24oIiArIGFsaWFzICsgaXRlcmF0b3IxICsgaXRlcmF0b3IyICsgIil7IiArCiAgICAgICJyZXR1cm4gIiArICgoYWx0R2VuIHx8IGdlbkVsZW1lbnQpKGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuRGF0YSQyIChlbCwgc3RhdGUpIHsKICB2YXIgZGF0YSA9ICd7JzsKCiAgLy8gZGlyZWN0aXZlcyBmaXJzdC4KICAvLyBkaXJlY3RpdmVzIG1heSBtdXRhdGUgdGhlIGVsJ3Mgb3RoZXIgcHJvcGVydGllcyBiZWZvcmUgdGhleSBhcmUgZ2VuZXJhdGVkLgogIHZhciBkaXJzID0gZ2VuRGlyZWN0aXZlcyhlbCwgc3RhdGUpOwogIGlmIChkaXJzKSB7IGRhdGEgKz0gZGlycyArICcsJzsgfQoKICAvLyBrZXkKICBpZiAoZWwua2V5KSB7CiAgICBkYXRhICs9ICJrZXk6IiArIChlbC5rZXkpICsgIiwiOwogIH0KICAvLyByZWYKICBpZiAoZWwucmVmKSB7CiAgICBkYXRhICs9ICJyZWY6IiArIChlbC5yZWYpICsgIiwiOwogIH0KICBpZiAoZWwucmVmSW5Gb3IpIHsKICAgIGRhdGEgKz0gInJlZkluRm9yOnRydWUsIjsKICB9CiAgLy8gcHJlCiAgaWYgKGVsLnByZSkgewogICAgZGF0YSArPSAicHJlOnRydWUsIjsKICB9CiAgLy8gcmVjb3JkIG9yaWdpbmFsIHRhZyBuYW1lIGZvciBjb21wb25lbnRzIHVzaW5nICJpcyIgYXR0cmlidXRlCiAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgZGF0YSArPSAidGFnOlwiIiArIChlbC50YWcpICsgIlwiLCI7CiAgfQogIC8vIG1vZHVsZSBkYXRhIGdlbmVyYXRpb24gZnVuY3Rpb25zCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5kYXRhR2VuRm5zLmxlbmd0aDsgaSsrKSB7CiAgICBkYXRhICs9IHN0YXRlLmRhdGFHZW5GbnNbaV0oZWwpOwogIH0KICAvLyBhdHRyaWJ1dGVzCiAgaWYgKGVsLmF0dHJzKSB7CiAgICBkYXRhICs9ICJhdHRyczp7IiArIChnZW5Qcm9wcyhlbC5hdHRycykpICsgIn0sIjsKICB9CiAgLy8gRE9NIHByb3BzCiAgaWYgKGVsLnByb3BzKSB7CiAgICBkYXRhICs9ICJkb21Qcm9wczp7IiArIChnZW5Qcm9wcyhlbC5wcm9wcykpICsgIn0sIjsKICB9CiAgLy8gZXZlbnQgaGFuZGxlcnMKICBpZiAoZWwuZXZlbnRzKSB7CiAgICBkYXRhICs9IChnZW5IYW5kbGVycyhlbC5ldmVudHMsIGZhbHNlLCBzdGF0ZS53YXJuKSkgKyAiLCI7CiAgfQogIGlmIChlbC5uYXRpdmVFdmVudHMpIHsKICAgIGRhdGEgKz0gKGdlbkhhbmRsZXJzKGVsLm5hdGl2ZUV2ZW50cywgdHJ1ZSwgc3RhdGUud2FybikpICsgIiwiOwogIH0KICAvLyBzbG90IHRhcmdldAogIC8vIG9ubHkgZm9yIG5vbi1zY29wZWQgc2xvdHMKICBpZiAoZWwuc2xvdFRhcmdldCAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICBkYXRhICs9ICJzbG90OiIgKyAoZWwuc2xvdFRhcmdldCkgKyAiLCI7CiAgfQogIC8vIHNjb3BlZCBzbG90cwogIGlmIChlbC5zY29wZWRTbG90cykgewogICAgZGF0YSArPSAoZ2VuU2NvcGVkU2xvdHMoZWwuc2NvcGVkU2xvdHMsIHN0YXRlKSkgKyAiLCI7CiAgfQogIC8vIGNvbXBvbmVudCB2LW1vZGVsCiAgaWYgKGVsLm1vZGVsKSB7CiAgICBkYXRhICs9ICJtb2RlbDp7dmFsdWU6IiArIChlbC5tb2RlbC52YWx1ZSkgKyAiLGNhbGxiYWNrOiIgKyAoZWwubW9kZWwuY2FsbGJhY2spICsgIixleHByZXNzaW9uOiIgKyAoZWwubW9kZWwuZXhwcmVzc2lvbikgKyAifSwiOwogIH0KICAvLyBpbmxpbmUtdGVtcGxhdGUKICBpZiAoZWwuaW5saW5lVGVtcGxhdGUpIHsKICAgIHZhciBpbmxpbmVUZW1wbGF0ZSA9IGdlbklubGluZVRlbXBsYXRlKGVsLCBzdGF0ZSk7CiAgICBpZiAoaW5saW5lVGVtcGxhdGUpIHsKICAgICAgZGF0YSArPSBpbmxpbmVUZW1wbGF0ZSArICIsIjsKICAgIH0KICB9CiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLCQvLCAnJykgKyAnfSc7CiAgLy8gdi1iaW5kIGRhdGEgd3JhcAogIGlmIChlbC53cmFwRGF0YSkgewogICAgZGF0YSA9IGVsLndyYXBEYXRhKGRhdGEpOwogIH0KICAvLyB2LW9uIGRhdGEgd3JhcAogIGlmIChlbC53cmFwTGlzdGVuZXJzKSB7CiAgICBkYXRhID0gZWwud3JhcExpc3RlbmVycyhkYXRhKTsKICB9CiAgcmV0dXJuIGRhdGEKfQoKZnVuY3Rpb24gZ2VuRGlyZWN0aXZlcyAoZWwsIHN0YXRlKSB7CiAgdmFyIGRpcnMgPSBlbC5kaXJlY3RpdmVzOwogIGlmICghZGlycykgeyByZXR1cm4gfQogIHZhciByZXMgPSAnZGlyZWN0aXZlczpbJzsKICB2YXIgaGFzUnVudGltZSA9IGZhbHNlOwogIHZhciBpLCBsLCBkaXIsIG5lZWRSdW50aW1lOwogIGZvciAoaSA9IDAsIGwgPSBkaXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIG5lZWRSdW50aW1lID0gdHJ1ZTsKICAgIHZhciBnZW4gPSBzdGF0ZS5kaXJlY3RpdmVzW2Rpci5uYW1lXTsKICAgIGlmIChnZW4pIHsKICAgICAgLy8gY29tcGlsZS10aW1lIGRpcmVjdGl2ZSB0aGF0IG1hbmlwdWxhdGVzIEFTVC4KICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IGFsc28gbmVlZHMgYSBydW50aW1lIGNvdW50ZXJwYXJ0LgogICAgICBuZWVkUnVudGltZSA9ICEhZ2VuKGVsLCBkaXIsIHN0YXRlLndhcm4pOwogICAgfQogICAgaWYgKG5lZWRSdW50aW1lKSB7CiAgICAgIGhhc1J1bnRpbWUgPSB0cnVlOwogICAgICByZXMgKz0gIntuYW1lOlwiIiArIChkaXIubmFtZSkgKyAiXCIscmF3TmFtZTpcIiIgKyAoZGlyLnJhd05hbWUpICsgIlwiIiArIChkaXIudmFsdWUgPyAoIix2YWx1ZTooIiArIChkaXIudmFsdWUpICsgIiksZXhwcmVzc2lvbjoiICsgKEpTT04uc3RyaW5naWZ5KGRpci52YWx1ZSkpKSA6ICcnKSArIChkaXIuYXJnID8gKCIsYXJnOlwiIiArIChkaXIuYXJnKSArICJcIiIpIDogJycpICsgKGRpci5tb2RpZmllcnMgPyAoIixtb2RpZmllcnM6IiArIChKU09OLnN0cmluZ2lmeShkaXIubW9kaWZpZXJzKSkpIDogJycpICsgIn0sIjsKICAgIH0KICB9CiAgaWYgKGhhc1J1bnRpbWUpIHsKICAgIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ10nCiAgfQp9CgpmdW5jdGlvbiBnZW5JbmxpbmVUZW1wbGF0ZSAoZWwsIHN0YXRlKSB7CiAgdmFyIGFzdCA9IGVsLmNoaWxkcmVuWzBdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgKAogICAgZWwuY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGFzdC50eXBlICE9PSAxCiAgKSkgewogICAgc3RhdGUud2FybignSW5saW5lLXRlbXBsYXRlIGNvbXBvbmVudHMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGVsZW1lbnQuJyk7CiAgfQogIGlmIChhc3QudHlwZSA9PT0gMSkgewogICAgdmFyIGlubGluZVJlbmRlckZucyA9IGdlbmVyYXRlKGFzdCwgc3RhdGUub3B0aW9ucyk7CiAgICByZXR1cm4gKCJpbmxpbmVUZW1wbGF0ZTp7cmVuZGVyOmZ1bmN0aW9uKCl7IiArIChpbmxpbmVSZW5kZXJGbnMucmVuZGVyKSArICJ9LHN0YXRpY1JlbmRlckZuczpbIiArIChpbmxpbmVSZW5kZXJGbnMuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gKCJmdW5jdGlvbigpeyIgKyBjb2RlICsgIn0iKTsgfSkuam9pbignLCcpKSArICJdfSIpCiAgfQp9CgpmdW5jdGlvbiBnZW5TY29wZWRTbG90cyAoCiAgc2xvdHMsCiAgc3RhdGUKKSB7CiAgcmV0dXJuICgic2NvcGVkU2xvdHM6X3UoWyIgKyAoT2JqZWN0LmtleXMoc2xvdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7CiAgICAgIHJldHVybiBnZW5TY29wZWRTbG90KGtleSwgc2xvdHNba2V5XSwgc3RhdGUpCiAgICB9KS5qb2luKCcsJykpICsgIl0pIikKfQoKZnVuY3Rpb24gZ2VuU2NvcGVkU2xvdCAoCiAga2V5LAogIGVsLAogIHN0YXRlCikgewogIGlmIChlbC5mb3IgJiYgIWVsLmZvclByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbkZvclNjb3BlZFNsb3Qoa2V5LCBlbCwgc3RhdGUpCiAgfQogIHZhciBmbiA9ICJmdW5jdGlvbigiICsgKFN0cmluZyhlbC5zbG90U2NvcGUpKSArICIpeyIgKwogICAgInJldHVybiAiICsgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJwogICAgICA/IGVsLmlmCiAgICAgICAgPyAoKGVsLmlmKSArICI/IiArIChnZW5DaGlsZHJlbihlbCwgc3RhdGUpIHx8ICd1bmRlZmluZWQnKSArICI6dW5kZWZpbmVkIikKICAgICAgICA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSkgfHwgJ3VuZGVmaW5lZCcKICAgICAgOiBnZW5FbGVtZW50KGVsLCBzdGF0ZSkpICsgIn0iOwogIHJldHVybiAoIntrZXk6IiArIGtleSArICIsZm46IiArIGZuICsgIn0iKQp9CgpmdW5jdGlvbiBnZW5Gb3JTY29wZWRTbG90ICgKICBrZXksCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGV4cCA9IGVsLmZvcjsKICB2YXIgYWxpYXMgPSBlbC5hbGlhczsKICB2YXIgaXRlcmF0b3IxID0gZWwuaXRlcmF0b3IxID8gKCIsIiArIChlbC5pdGVyYXRvcjEpKSA6ICcnOwogIHZhciBpdGVyYXRvcjIgPSBlbC5pdGVyYXRvcjIgPyAoIiwiICsgKGVsLml0ZXJhdG9yMikpIDogJyc7CiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuICJfbCgoIiArIGV4cCArICIpLCIgKwogICAgImZ1bmN0aW9uKCIgKyBhbGlhcyArIGl0ZXJhdG9yMSArIGl0ZXJhdG9yMiArICIpeyIgKwogICAgICAicmV0dXJuICIgKyAoZ2VuU2NvcGVkU2xvdChrZXksIGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuQ2hpbGRyZW4gKAogIGVsLAogIHN0YXRlLAogIGNoZWNrU2tpcCwKICBhbHRHZW5FbGVtZW50LAogIGFsdEdlbk5vZGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47CiAgaWYgKGNoaWxkcmVuLmxlbmd0aCkgewogICAgdmFyIGVsJDEgPSBjaGlsZHJlblswXTsKICAgIC8vIG9wdGltaXplIHNpbmdsZSB2LWZvcgogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJgogICAgICBlbCQxLmZvciAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3Nsb3QnCiAgICApIHsKICAgICAgcmV0dXJuIChhbHRHZW5FbGVtZW50IHx8IGdlbkVsZW1lbnQpKGVsJDEsIHN0YXRlKQogICAgfQogICAgdmFyIG5vcm1hbGl6YXRpb25UeXBlID0gY2hlY2tTa2lwCiAgICAgID8gZ2V0Tm9ybWFsaXphdGlvblR5cGUoY2hpbGRyZW4sIHN0YXRlLm1heWJlQ29tcG9uZW50KQogICAgICA6IDA7CiAgICB2YXIgZ2VuID0gYWx0R2VuTm9kZSB8fCBnZW5Ob2RlOwogICAgcmV0dXJuICgiWyIgKyAoY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBnZW4oYywgc3RhdGUpOyB9KS5qb2luKCcsJykpICsgIl0iICsgKG5vcm1hbGl6YXRpb25UeXBlID8gKCIsIiArIG5vcm1hbGl6YXRpb25UeXBlKSA6ICcnKSkKICB9Cn0KCi8vIGRldGVybWluZSB0aGUgbm9ybWFsaXphdGlvbiBuZWVkZWQgZm9yIHRoZSBjaGlsZHJlbiBhcnJheS4KLy8gMDogbm8gbm9ybWFsaXphdGlvbiBuZWVkZWQKLy8gMTogc2ltcGxlIG5vcm1hbGl6YXRpb24gbmVlZGVkIChwb3NzaWJsZSAxLWxldmVsIGRlZXAgbmVzdGVkIGFycmF5KQovLyAyOiBmdWxsIG5vcm1hbGl6YXRpb24gbmVlZGVkCmZ1bmN0aW9uIGdldE5vcm1hbGl6YXRpb25UeXBlICgKICBjaGlsZHJlbiwKICBtYXliZUNvbXBvbmVudAopIHsKICB2YXIgcmVzID0gMDsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZWwgPSBjaGlsZHJlbltpXTsKICAgIGlmIChlbC50eXBlICE9PSAxKSB7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAobmVlZHNOb3JtYWxpemF0aW9uKGVsKSB8fAogICAgICAgIChlbC5pZkNvbmRpdGlvbnMgJiYgZWwuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIG5lZWRzTm9ybWFsaXphdGlvbihjLmJsb2NrKTsgfSkpKSB7CiAgICAgIHJlcyA9IDI7CiAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAobWF5YmVDb21wb25lbnQoZWwpIHx8CiAgICAgICAgKGVsLmlmQ29uZGl0aW9ucyAmJiBlbC5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gbWF5YmVDb21wb25lbnQoYy5ibG9jayk7IH0pKSkgewogICAgICByZXMgPSAxOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIG5lZWRzTm9ybWFsaXphdGlvbiAoZWwpIHsKICByZXR1cm4gZWwuZm9yICE9PSB1bmRlZmluZWQgfHwgZWwudGFnID09PSAndGVtcGxhdGUnIHx8IGVsLnRhZyA9PT0gJ3Nsb3QnCn0KCmZ1bmN0aW9uIGdlbk5vZGUgKG5vZGUsIHN0YXRlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgcmV0dXJuIGdlbkVsZW1lbnQobm9kZSwgc3RhdGUpCiAgfSBpZiAobm9kZS50eXBlID09PSAzICYmIG5vZGUuaXNDb21tZW50KSB7CiAgICByZXR1cm4gZ2VuQ29tbWVudChub2RlKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuVGV4dChub2RlKQogIH0KfQoKZnVuY3Rpb24gZ2VuVGV4dCAodGV4dCkgewogIHJldHVybiAoIl92KCIgKyAodGV4dC50eXBlID09PSAyCiAgICA/IHRleHQuZXhwcmVzc2lvbiAvLyBubyBuZWVkIGZvciAoKSBiZWNhdXNlIGFscmVhZHkgd3JhcHBlZCBpbiBfcygpCiAgICA6IHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyhKU09OLnN0cmluZ2lmeSh0ZXh0LnRleHQpKSkgKyAiKSIpCn0KCmZ1bmN0aW9uIGdlbkNvbW1lbnQgKGNvbW1lbnQpIHsKICByZXR1cm4gKCJfZSgiICsgKEpTT04uc3RyaW5naWZ5KGNvbW1lbnQudGV4dCkpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5TbG90IChlbCwgc3RhdGUpIHsKICB2YXIgc2xvdE5hbWUgPSBlbC5zbG90TmFtZSB8fCAnImRlZmF1bHQiJzsKICB2YXIgY2hpbGRyZW4gPSBnZW5DaGlsZHJlbihlbCwgc3RhdGUpOwogIHZhciByZXMgPSAiX3QoIiArIHNsb3ROYW1lICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKTsKICB2YXIgYXR0cnMgPSBlbC5hdHRycyAmJiAoInsiICsgKGVsLmF0dHJzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChjYW1lbGl6ZShhLm5hbWUpKSArICI6IiArIChhLnZhbHVlKSk7IH0pLmpvaW4oJywnKSkgKyAifSIpOwogIHZhciBiaW5kJCQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZCddOwogIGlmICgoYXR0cnMgfHwgYmluZCQkMSkgJiYgIWNoaWxkcmVuKSB7CiAgICByZXMgKz0gIixudWxsIjsKICB9CiAgaWYgKGF0dHJzKSB7CiAgICByZXMgKz0gIiwiICsgYXR0cnM7CiAgfQogIGlmIChiaW5kJCQxKSB7CiAgICByZXMgKz0gKGF0dHJzID8gJycgOiAnLG51bGwnKSArICIsIiArIGJpbmQkJDE7CiAgfQogIHJldHVybiByZXMgKyAnKScKfQoKLy8gY29tcG9uZW50TmFtZSBpcyBlbC5jb21wb25lbnQsIHRha2UgaXQgYXMgYXJndW1lbnQgdG8gc2h1biBmbG93J3MgcGVzc2ltaXN0aWMgcmVmaW5lbWVudApmdW5jdGlvbiBnZW5Db21wb25lbnQgKAogIGNvbXBvbmVudE5hbWUsCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuaW5saW5lVGVtcGxhdGUgPyBudWxsIDogZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlLCB0cnVlKTsKICByZXR1cm4gKCJfYygiICsgY29tcG9uZW50TmFtZSArICIsIiArIChnZW5EYXRhJDIoZWwsIHN0YXRlKSkgKyAoY2hpbGRyZW4gPyAoIiwiICsgY2hpbGRyZW4pIDogJycpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5Qcm9wcyAocHJvcHMpIHsKICB2YXIgcmVzID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgdmFyIHByb3AgPSBwcm9wc1tpXTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICByZXMgKz0gIlwiIiArIChwcm9wLm5hbWUpICsgIlwiOiIgKyAodHJhbnNmb3JtU3BlY2lhbE5ld2xpbmVzKHByb3AudmFsdWUpKSArICIsIjsKICAgIH0KICB9CiAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkKfQoKLy8gIzM4OTUsICM0MjY4CmZ1bmN0aW9uIHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyAodGV4dCkgewogIHJldHVybiB0ZXh0CiAgICAucmVwbGFjZSgvXHUyMDI4L2csICdcXHUyMDI4JykKICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKQp9CgovKiAgKi8KCi8vIHRoZXNlIGtleXdvcmRzIHNob3VsZCBub3QgYXBwZWFyIGluc2lkZSBleHByZXNzaW9ucywgYnV0IG9wZXJhdG9ycyBsaWtlCi8vIHR5cGVvZiwgaW5zdGFuY2VvZiBhbmQgaW4gYXJlIGFsbG93ZWQKdmFyIHByb2hpYml0ZWRLZXl3b3JkUkUgPSBuZXcgUmVnRXhwKCdcXGInICsgKAogICdkbyxpZixmb3IsbGV0LG5ldyx0cnksdmFyLGNhc2UsZWxzZSx3aXRoLGF3YWl0LGJyZWFrLGNhdGNoLGNsYXNzLGNvbnN0LCcgKwogICdzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsJyArCiAgJ2V4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMnCikuc3BsaXQoJywnKS5qb2luKCdcXGJ8XFxiJykgKyAnXFxiJyk7CgovLyB0aGVzZSB1bmFyeSBvcGVyYXRvcnMgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHByb3BlcnR5L21ldGhvZCBuYW1lcwp2YXIgdW5hcnlPcGVyYXRvcnNSRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyAoCiAgJ2RlbGV0ZSx0eXBlb2Ysdm9pZCcKKS5zcGxpdCgnLCcpLmpvaW4oJ1xccypcXChbXlxcKV0qXFwpfFxcYicpICsgJ1xccypcXChbXlxcKV0qXFwpJyk7CgovLyBzdHJpcCBzdHJpbmdzIGluIGV4cHJlc3Npb25zCnZhciBzdHJpcFN0cmluZ1JFID0gLycoPzpbXidcXF18XFwuKSonfCIoPzpbXiJcXF18XFwuKSoifGAoPzpbXmBcXF18XFwuKSpcJFx7fFx9KD86W15gXFxdfFxcLikqYHxgKD86W15gXFxdfFxcLikqYC9nOwoKLy8gZGV0ZWN0IHByb2JsZW1hdGljIGV4cHJlc3Npb25zIGluIGEgdGVtcGxhdGUKZnVuY3Rpb24gZGV0ZWN0RXJyb3JzIChhc3QpIHsKICB2YXIgZXJyb3JzID0gW107CiAgaWYgKGFzdCkgewogICAgY2hlY2tOb2RlKGFzdCwgZXJyb3JzKTsKICB9CiAgcmV0dXJuIGVycm9ycwp9CgpmdW5jdGlvbiBjaGVja05vZGUgKG5vZGUsIGVycm9ycykgewogIGlmIChub2RlLnR5cGUgPT09IDEpIHsKICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZS5hdHRyc01hcCkgewogICAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuYXR0cnNNYXBbbmFtZV07CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAobmFtZSA9PT0gJ3YtZm9yJykgewogICAgICAgICAgICBjaGVja0Zvcihub2RlLCAoInYtZm9yPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9IGVsc2UgaWYgKG9uUkUudGVzdChuYW1lKSkgewogICAgICAgICAgICBjaGVja0V2ZW50KHZhbHVlLCAobmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIiKSwgZXJyb3JzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoZWNrRXhwcmVzc2lvbih2YWx1ZSwgKG5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGVja05vZGUobm9kZS5jaGlsZHJlbltpXSwgZXJyb3JzKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAyKSB7CiAgICBjaGVja0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBub2RlLnRleHQsIGVycm9ycyk7CiAgfQp9CgpmdW5jdGlvbiBjaGVja0V2ZW50IChleHAsIHRleHQsIGVycm9ycykgewogIHZhciBzdGlwcGVkID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpOwogIHZhciBrZXl3b3JkTWF0Y2ggPSBzdGlwcGVkLm1hdGNoKHVuYXJ5T3BlcmF0b3JzUkUpOwogIGlmIChrZXl3b3JkTWF0Y2ggJiYgc3RpcHBlZC5jaGFyQXQoa2V5d29yZE1hdGNoLmluZGV4IC0gMSkgIT09ICckJykgewogICAgZXJyb3JzLnB1c2goCiAgICAgICJhdm9pZCB1c2luZyBKYXZhU2NyaXB0IHVuYXJ5IG9wZXJhdG9yIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAiXCIiICsgKGtleXdvcmRNYXRjaFswXSkgKyAiXCIgaW4gZXhwcmVzc2lvbiAiICsgKHRleHQudHJpbSgpKQogICAgKTsKICB9CiAgY2hlY2tFeHByZXNzaW9uKGV4cCwgdGV4dCwgZXJyb3JzKTsKfQoKZnVuY3Rpb24gY2hlY2tGb3IgKG5vZGUsIHRleHQsIGVycm9ycykgewogIGNoZWNrRXhwcmVzc2lvbihub2RlLmZvciB8fCAnJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5hbGlhcywgJ3YtZm9yIGFsaWFzJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5pdGVyYXRvcjEsICd2LWZvciBpdGVyYXRvcicsIHRleHQsIGVycm9ycyk7CiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuaXRlcmF0b3IyLCAndi1mb3IgaXRlcmF0b3InLCB0ZXh0LCBlcnJvcnMpOwp9CgpmdW5jdGlvbiBjaGVja0lkZW50aWZpZXIgKAogIGlkZW50LAogIHR5cGUsCiAgdGV4dCwKICBlcnJvcnMKKSB7CiAgaWYgKHR5cGVvZiBpZGVudCA9PT0gJ3N0cmluZycpIHsKICAgIHRyeSB7CiAgICAgIG5ldyBGdW5jdGlvbigoInZhciAiICsgaWRlbnQgKyAiPV8iKSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGVycm9ycy5wdXNoKCgiaW52YWxpZCAiICsgdHlwZSArICIgXCIiICsgaWRlbnQgKyAiXCIgaW4gZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkpKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrRXhwcmVzc2lvbiAoZXhwLCB0ZXh0LCBlcnJvcnMpIHsKICB0cnkgewogICAgbmV3IEZ1bmN0aW9uKCgicmV0dXJuICIgKyBleHApKTsKICB9IGNhdGNoIChlKSB7CiAgICB2YXIga2V5d29yZE1hdGNoID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpLm1hdGNoKHByb2hpYml0ZWRLZXl3b3JkUkUpOwogICAgaWYgKGtleXdvcmRNYXRjaCkgewogICAgICBlcnJvcnMucHVzaCgKICAgICAgICAiYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAgICJcIiIgKyAoa2V5d29yZE1hdGNoWzBdKSArICJcIlxuICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9ycy5wdXNoKAogICAgICAgICJpbnZhbGlkIGV4cHJlc3Npb246ICIgKyAoZS5tZXNzYWdlKSArICIgaW5cblxuIiArCiAgICAgICAgIiAgICAiICsgZXhwICsgIlxuXG4iICsKICAgICAgICAiICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkgKyAiXG4iCiAgICAgICk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uIChjb2RlLCBlcnJvcnMpIHsKICB0cnkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlKQogIH0gY2F0Y2ggKGVycikgewogICAgZXJyb3JzLnB1c2goeyBlcnI6IGVyciwgY29kZTogY29kZSB9KTsKICAgIHJldHVybiBub29wCiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuIChjb21waWxlKSB7CiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBpbGVUb0Z1bmN0aW9ucyAoCiAgICB0ZW1wbGF0ZSwKICAgIG9wdGlvbnMsCiAgICB2bQogICkgewogICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICB2YXIgd2FybiQkMSA9IG9wdGlvbnMud2FybiB8fCB3YXJuOwogICAgZGVsZXRlIG9wdGlvbnMud2FybjsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIHsKICAgICAgLy8gZGV0ZWN0IHBvc3NpYmxlIENTUCByZXN0cmljdGlvbgogICAgICB0cnkgewogICAgICAgIG5ldyBGdW5jdGlvbigncmV0dXJuIDEnKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLnRvU3RyaW5nKCkubWF0Y2goL3Vuc2FmZS1ldmFsfENTUC8pKSB7CiAgICAgICAgICB3YXJuJCQxKAogICAgICAgICAgICAnSXQgc2VlbXMgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhbG9uZSBidWlsZCBvZiBWdWUuanMgaW4gYW4gJyArCiAgICAgICAgICAgICdlbnZpcm9ubWVudCB3aXRoIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IHRoYXQgcHJvaGliaXRzIHVuc2FmZS1ldmFsLiAnICsKICAgICAgICAgICAgJ1RoZSB0ZW1wbGF0ZSBjb21waWxlciBjYW5ub3Qgd29yayBpbiB0aGlzIGVudmlyb25tZW50LiBDb25zaWRlciAnICsKICAgICAgICAgICAgJ3JlbGF4aW5nIHRoZSBwb2xpY3kgdG8gYWxsb3cgdW5zYWZlLWV2YWwgb3IgcHJlLWNvbXBpbGluZyB5b3VyICcgKwogICAgICAgICAgICAndGVtcGxhdGVzIGludG8gcmVuZGVyIGZ1bmN0aW9ucy4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIGNoZWNrIGNhY2hlCiAgICB2YXIga2V5ID0gb3B0aW9ucy5kZWxpbWl0ZXJzCiAgICAgID8gU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVycykgKyB0ZW1wbGF0ZQogICAgICA6IHRlbXBsYXRlOwogICAgaWYgKGNhY2hlW2tleV0pIHsKICAgICAgcmV0dXJuIGNhY2hlW2tleV0KICAgIH0KCiAgICAvLyBjb21waWxlCiAgICB2YXIgY29tcGlsZWQgPSBjb21waWxlKHRlbXBsYXRlLCBvcHRpb25zKTsKCiAgICAvLyBjaGVjayBjb21waWxhdGlvbiBlcnJvcnMvdGlwcwogICAgewogICAgICBpZiAoY29tcGlsZWQuZXJyb3JzICYmIGNvbXBpbGVkLmVycm9ycy5sZW5ndGgpIHsKICAgICAgICB3YXJuJCQxKAogICAgICAgICAgIkVycm9yIGNvbXBpbGluZyB0ZW1wbGF0ZTpcblxuIiArIHRlbXBsYXRlICsgIlxuXG4iICsKICAgICAgICAgIGNvbXBpbGVkLmVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuICgiLSAiICsgZSk7IH0pLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChjb21waWxlZC50aXBzICYmIGNvbXBpbGVkLnRpcHMubGVuZ3RoKSB7CiAgICAgICAgY29tcGlsZWQudGlwcy5mb3JFYWNoKGZ1bmN0aW9uIChtc2cpIHsgcmV0dXJuIHRpcChtc2csIHZtKTsgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyB0dXJuIGNvZGUgaW50byBmdW5jdGlvbnMKICAgIHZhciByZXMgPSB7fTsKICAgIHZhciBmbkdlbkVycm9ycyA9IFtdOwogICAgcmVzLnJlbmRlciA9IGNyZWF0ZUZ1bmN0aW9uKGNvbXBpbGVkLnJlbmRlciwgZm5HZW5FcnJvcnMpOwogICAgcmVzLnN0YXRpY1JlbmRlckZucyA9IGNvbXBpbGVkLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKGNvZGUsIGZuR2VuRXJyb3JzKQogICAgfSk7CgogICAgLy8gY2hlY2sgZnVuY3Rpb24gZ2VuZXJhdGlvbiBlcnJvcnMuCiAgICAvLyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29tcGlsZXIgaXRzZWxmLgogICAgLy8gbW9zdGx5IGZvciBjb2RlZ2VuIGRldmVsb3BtZW50IHVzZQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICB7CiAgICAgIGlmICgoIWNvbXBpbGVkLmVycm9ycyB8fCAhY29tcGlsZWQuZXJyb3JzLmxlbmd0aCkgJiYgZm5HZW5FcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgd2FybiQkMSgKICAgICAgICAgICJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVuZGVyIGZ1bmN0aW9uOlxuXG4iICsKICAgICAgICAgIGZuR2VuRXJyb3JzLm1hcChmdW5jdGlvbiAocmVmKSB7CiAgICAgICAgICAgIHZhciBlcnIgPSByZWYuZXJyOwogICAgICAgICAgICB2YXIgY29kZSA9IHJlZi5jb2RlOwoKICAgICAgICAgICAgcmV0dXJuICgoZXJyLnRvU3RyaW5nKCkpICsgIiBpblxuXG4iICsgY29kZSArICJcbiIpOwogICAgICAgIH0pLmpvaW4oJ1xuJyksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKGNhY2hlW2tleV0gPSByZXMpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBpbGVyQ3JlYXRvciAoYmFzZUNvbXBpbGUpIHsKICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQ29tcGlsZXIgKGJhc2VPcHRpb25zKSB7CiAgICBmdW5jdGlvbiBjb21waWxlICgKICAgICAgdGVtcGxhdGUsCiAgICAgIG9wdGlvbnMKICAgICkgewogICAgICB2YXIgZmluYWxPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShiYXNlT3B0aW9ucyk7CiAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgdmFyIHRpcHMgPSBbXTsKICAgICAgZmluYWxPcHRpb25zLndhcm4gPSBmdW5jdGlvbiAobXNnLCB0aXApIHsKICAgICAgICAodGlwID8gdGlwcyA6IGVycm9ycykucHVzaChtc2cpOwogICAgICB9OwoKICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAvLyBtZXJnZSBjdXN0b20gbW9kdWxlcwogICAgICAgIGlmIChvcHRpb25zLm1vZHVsZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5tb2R1bGVzID0KICAgICAgICAgICAgKGJhc2VPcHRpb25zLm1vZHVsZXMgfHwgW10pLmNvbmNhdChvcHRpb25zLm1vZHVsZXMpOwogICAgICAgIH0KICAgICAgICAvLyBtZXJnZSBjdXN0b20gZGlyZWN0aXZlcwogICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5kaXJlY3RpdmVzID0gZXh0ZW5kKAogICAgICAgICAgICBPYmplY3QuY3JlYXRlKGJhc2VPcHRpb25zLmRpcmVjdGl2ZXMgfHwgbnVsbCksCiAgICAgICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlcwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy8gY29weSBvdGhlciBvcHRpb25zCiAgICAgICAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgICAgICAgIGlmIChrZXkgIT09ICdtb2R1bGVzJyAmJiBrZXkgIT09ICdkaXJlY3RpdmVzJykgewogICAgICAgICAgICBmaW5hbE9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBjb21waWxlZCA9IGJhc2VDb21waWxlKHRlbXBsYXRlLCBmaW5hbE9wdGlvbnMpOwogICAgICB7CiAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBkZXRlY3RFcnJvcnMoY29tcGlsZWQuYXN0KSk7CiAgICAgIH0KICAgICAgY29tcGlsZWQuZXJyb3JzID0gZXJyb3JzOwogICAgICBjb21waWxlZC50aXBzID0gdGlwczsKICAgICAgcmV0dXJuIGNvbXBpbGVkCiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgY29tcGlsZTogY29tcGlsZSwKICAgICAgY29tcGlsZVRvRnVuY3Rpb25zOiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuKGNvbXBpbGUpCiAgICB9CiAgfQp9CgovKiAgKi8KCi8vIGBjcmVhdGVDb21waWxlckNyZWF0b3JgIGFsbG93cyBjcmVhdGluZyBjb21waWxlcnMgdGhhdCB1c2UgYWx0ZXJuYXRpdmUKLy8gcGFyc2VyL29wdGltaXplci9jb2RlZ2VuLCBlLmcgdGhlIFNTUiBvcHRpbWl6aW5nIGNvbXBpbGVyLgovLyBIZXJlIHdlIGp1c3QgZXhwb3J0IGEgZGVmYXVsdCBjb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCBwYXJ0cy4KdmFyIGNyZWF0ZUNvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXJDcmVhdG9yKGZ1bmN0aW9uIGJhc2VDb21waWxlICgKICB0ZW1wbGF0ZSwKICBvcHRpb25zCikgewogIHZhciBhc3QgPSBwYXJzZSh0ZW1wbGF0ZS50cmltKCksIG9wdGlvbnMpOwogIGlmIChvcHRpb25zLm9wdGltaXplICE9PSBmYWxzZSkgewogICAgb3B0aW1pemUoYXN0LCBvcHRpb25zKTsKICB9CiAgdmFyIGNvZGUgPSBnZW5lcmF0ZShhc3QsIG9wdGlvbnMpOwogIHJldHVybiB7CiAgICBhc3Q6IGFzdCwKICAgIHJlbmRlcjogY29kZS5yZW5kZXIsCiAgICBzdGF0aWNSZW5kZXJGbnM6IGNvZGUuc3RhdGljUmVuZGVyRm5zCiAgfQp9KTsKCi8qICAqLwoKdmFyIHJlZiQxID0gY3JlYXRlQ29tcGlsZXIoYmFzZU9wdGlvbnMpOwp2YXIgY29tcGlsZVRvRnVuY3Rpb25zID0gcmVmJDEuY29tcGlsZVRvRnVuY3Rpb25zOwoKLyogICovCgovLyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgYnJvd3NlciBlbmNvZGVzIGEgY2hhciBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcwp2YXIgZGl2OwpmdW5jdGlvbiBnZXRTaG91bGREZWNvZGUgKGhyZWYpIHsKICBkaXYgPSBkaXYgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGl2LmlubmVySFRNTCA9IGhyZWYgPyAiPGEgaHJlZj1cIlxuXCIvPiIgOiAiPGRpdiBhPVwiXG5cIi8+IjsKICByZXR1cm4gZGl2LmlubmVySFRNTC5pbmRleE9mKCcmIzEwOycpID4gMAp9CgovLyAjMzY2MzogSUUgZW5jb2RlcyBuZXdsaW5lcyBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcyB3aGlsZSBvdGhlciBicm93c2VycyBkb24ndAp2YXIgc2hvdWxkRGVjb2RlTmV3bGluZXMgPSBpbkJyb3dzZXIgPyBnZXRTaG91bGREZWNvZGUoZmFsc2UpIDogZmFsc2U7Ci8vICM2ODI4OiBjaHJvbWUgZW5jb2RlcyBjb250ZW50IGluIGFbaHJlZl0KdmFyIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiA9IGluQnJvd3NlciA/IGdldFNob3VsZERlY29kZSh0cnVlKSA6IGZhbHNlOwoKLyogICovCgp2YXIgaWRUb1RlbXBsYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChpZCkgewogIHZhciBlbCA9IHF1ZXJ5KGlkKTsKICByZXR1cm4gZWwgJiYgZWwuaW5uZXJIVE1MCn0pOwoKdmFyIG1vdW50ID0gVnVlLnByb3RvdHlwZS4kbW91bnQ7ClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIHF1ZXJ5KGVsKTsKCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5IHx8IGVsID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAiRG8gbm90IG1vdW50IFZ1ZSB0byA8aHRtbD4gb3IgPGJvZHk+IC0gbW91bnQgdG8gbm9ybWFsIGVsZW1lbnRzIGluc3RlYWQuIgogICAgKTsKICAgIHJldHVybiB0aGlzCiAgfQoKICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7CiAgLy8gcmVzb2x2ZSB0ZW1wbGF0ZS9lbCBhbmQgY29udmVydCB0byByZW5kZXIgZnVuY3Rpb24KICBpZiAoIW9wdGlvbnMucmVuZGVyKSB7CiAgICB2YXIgdGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlOwogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdCgwKSA9PT0gJyMnKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IGlkVG9UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgKCJUZW1wbGF0ZSBlbGVtZW50IG5vdCBmb3VuZCBvciBpcyBlbXB0eTogIiArIChvcHRpb25zLnRlbXBsYXRlKSksCiAgICAgICAgICAgICAgdGhpcwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkgewogICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuaW5uZXJIVE1MOwogICAgICB9IGVsc2UgewogICAgICAgIHsKICAgICAgICAgIHdhcm4oJ2ludmFsaWQgdGVtcGxhdGUgb3B0aW9uOicgKyB0ZW1wbGF0ZSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWwpIHsKICAgICAgdGVtcGxhdGUgPSBnZXRPdXRlckhUTUwoZWwpOwogICAgfQogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgICAgbWFyaygnY29tcGlsZScpOwogICAgICB9CgogICAgICB2YXIgcmVmID0gY29tcGlsZVRvRnVuY3Rpb25zKHRlbXBsYXRlLCB7CiAgICAgICAgc2hvdWxkRGVjb2RlTmV3bGluZXM6IHNob3VsZERlY29kZU5ld2xpbmVzLAogICAgICAgIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjogc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmLAogICAgICAgIGRlbGltaXRlcnM6IG9wdGlvbnMuZGVsaW1pdGVycywKICAgICAgICBjb21tZW50czogb3B0aW9ucy5jb21tZW50cwogICAgICB9LCB0aGlzKTsKICAgICAgdmFyIHJlbmRlciA9IHJlZi5yZW5kZXI7CiAgICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zOwogICAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlcjsKICAgICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnM7CgogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgICAgIG1hcmsoJ2NvbXBpbGUgZW5kJyk7CiAgICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHRoaXMuX25hbWUpICsgIiBjb21waWxlIiksICdjb21waWxlJywgJ2NvbXBpbGUgZW5kJyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG1vdW50LmNhbGwodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8qKgogKiBHZXQgb3V0ZXJIVE1MIG9mIGVsZW1lbnRzLCB0YWtpbmcgY2FyZQogKiBvZiBTVkcgZWxlbWVudHMgaW4gSUUgYXMgd2VsbC4KICovCmZ1bmN0aW9uIGdldE91dGVySFRNTCAoZWwpIHsKICBpZiAoZWwub3V0ZXJIVE1MKSB7CiAgICByZXR1cm4gZWwub3V0ZXJIVE1MCiAgfSBlbHNlIHsKICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbC5jbG9uZU5vZGUodHJ1ZSkpOwogICAgcmV0dXJuIGNvbnRhaW5lci5pbm5lckhUTUwKICB9Cn0KClZ1ZS5jb21waWxlID0gY29tcGlsZVRvRnVuY3Rpb25zOwoKcmV0dXJuIFZ1ZTsKCn0pKSk7Cg==" >
tail j=5409 line=
tail j=5410 line=<!-- <script type="text/javascript" src="/jquery-3.3.1.js" > -->
tail j=5411 line= <script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkgewoKCSJ1c2Ugc3RyaWN0IjsKCglpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2AKCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgoJCS8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgCgkJLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuCgkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uCgkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPwoJCQlmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6CgkJCWZ1bmN0aW9uKCB3ICkgewoJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50IiApOwoJCQkJfQoJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKCQkJfTsKCX0gZWxzZSB7CgkJZmFjdG9yeSggZ2xvYmFsICk7Cgl9CgovLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAp9ICkoIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CgovLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjEKLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlCi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uCi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLgoidXNlIHN0cmljdCI7Cgp2YXIgYXJyID0gW107Cgp2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cgp2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7Cgp2YXIgc2xpY2UgPSBhcnIuc2xpY2U7Cgp2YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKCnZhciBwdXNoID0gYXJyLnB1c2g7Cgp2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOwoKdmFyIGNsYXNzMnR5cGUgPSB7fTsKCnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7Cgp2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKCnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nOwoKdmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTsKCnZhciBzdXBwb3J0ID0ge307Cgp2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHsKCiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTIKICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgImZ1bmN0aW9uIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50cwogICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib2JqZWN0IiApID09PSAiZnVuY3Rpb24iYCkuCiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi4KICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gIm51bWJlciI7CiAgfTsKCgp2YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Cgl9OwoKCgoKCXZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0gewoJCXR5cGU6IHRydWUsCgkJc3JjOiB0cnVlLAoJCW5vTW9kdWxlOiB0cnVlCgl9OwoKCWZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYywgbm9kZSApIHsKCQlkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7CgoJCXZhciBpLAoJCQlzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsKCgkJc2NyaXB0LnRleHQgPSBjb2RlOwoJCWlmICggbm9kZSApIHsKCQkJZm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkgewoJCQkJaWYgKCBub2RlWyBpIF0gKSB7CgkJCQkJc2NyaXB0WyBpIF0gPSBub2RlWyBpIF07CgkJCQl9CgkJCX0KCQl9CgkJZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJfQoKCmZ1bmN0aW9uIHRvVHlwZSggb2JqICkgewoJaWYgKCBvYmogPT0gbnVsbCApIHsKCQlyZXR1cm4gb2JqICsgIiI7Cgl9CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApCglyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CgkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CgkJdHlwZW9mIG9iajsKfQovKiBnbG9iYWwgU3ltYm9sICovCi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsCi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlCgoKCnZhcgoJdmVyc2lvbiA9ICIzLjMuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfSwKCgkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHkKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAoJcnRyaW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogdmVyc2lvbiwKCgljb25zdHJ1Y3RvcjogalF1ZXJ5LAoKCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVuZ3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgoJCS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKCQlpZiAoIG51bSA9PSBudWxsICkgewoJCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApOwoJCX0KCgkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAoJCXJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoKCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAoJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSApICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpOwoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KCXB1c2g6IHB1c2gsCglzb3J0OiBhcnIuc29ydCwKCXNwbGljZTogYXJyLnNwbGljZQp9OwoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKCQl0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSwKCQlpID0gMSwKCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAoJCWRlZXAgPSBmYWxzZTsKCgkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKCQlkZWVwID0gdGFyZ2V0OwoKCQkvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CgkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CgkJaSsrOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGkgPT09IGxlbmd0aCApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCWktLTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgewoKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHwKCQkJCQkoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHsKCgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCWV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAoKCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCglpc1JlYWR5OiB0cnVlLAoKCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewoJCXRocm93IG5ldyBFcnJvciggbXNnICk7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgcHJvdG8sIEN0b3I7CgoJCS8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlcwoJCS8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0cwoJCWlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gIltvYmplY3QgT2JqZWN0XSIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXByb3RvID0gZ2V0UHJvdG8oIG9iaiApOwoKCQkvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluCgkJaWYgKCAhcHJvdG8gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb24KCQlDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCAiY29uc3RydWN0b3IiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7CgkJcmV0dXJuIHR5cGVvZiBDdG9yID09PSAiZnVuY3Rpb24iICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZzsKCX0sCgoJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCgkJLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KCQkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjUKCQl2YXIgbmFtZTsKCgkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHsKCQlET01FdmFsKCBjb2RlICk7Cgl9LAoKCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkgewoJCXZhciBsZW5ndGgsIGkgPSAwOwoKCQlpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHsKCQkJbGVuZ3RoID0gb2JqLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvciAoIGkgaW4gb2JqICkgewoJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seQoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CgkJCSIiIDoKCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCX0sCgoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIGFyciAhPSBudWxsICkgewoJCQlpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKCQlyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seQoJLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdAoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJCXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNoZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKCQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2YXIgbGVuZ3RoLCB2YWx1ZSwKCQkJaSA9IDAsCgkJCXJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwoJCWlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7CgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBpIGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldC5wdXNoKCB2YWx1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCgkvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgoJc3VwcG9ydDogc3VwcG9ydAp9ICk7CgppZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CglqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTsKfQoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCAiICIgKSwKZnVuY3Rpb24oIGksIG5hbWUgKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9ICk7CgpmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkgewoKCS8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcikKCS8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSkKCS8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwoJLy8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRQoJdmFyIGxlbmd0aCA9ICEhb2JqICYmICJsZW5ndGgiIGluIG9iaiAmJiBvYmoubGVuZ3RoLAoJCXR5cGUgPSB0b1R5cGUoIG9iaiApOwoKCWlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKCQl0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKfQp2YXIgU2l6emxlID0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNi0wOC0wOAogKi8KKGZ1bmN0aW9uKCB3aW5kb3cgKSB7Cgp2YXIgaSwKCXN1cHBvcnQsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJdG9rZW5pemUsCgljb21waWxlLAoJc2VsZWN0LAoJb3V0ZXJtb3N0Q29udGV4dCwKCXNvcnRJbnB1dCwKCWhhc0R1cGxpY2F0ZSwKCgkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCglzZXREb2N1bWVudCwKCWRvY3VtZW50LAoJZG9jRWxlbSwKCWRvY3VtZW50SXNIVE1MLAoJcmJ1Z2d5UVNBLAoJcmJ1Z2d5TWF0Y2hlcywKCW1hdGNoZXMsCgljb250YWlucywKCgkvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCglleHBhbmRvID0gInNpenpsZSIgKyAxICogbmV3IERhdGUoKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMgPSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVybiAwOwoJfSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNlLAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlCgkvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81CglpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7CgkJdmFyIGkgPSAwLAoJCQlsZW4gPSBsaXN0Lmxlbmd0aDsKCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfSwKCglib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCgoJLy8gUmVndWxhciBleHByZXNzaW9ucwoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRpZmllciA9ICIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsCgoJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGlkZW50aWZpZXIgKyAiKSg/OiIgKyB3aGl0ZXNwYWNlICsKCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQoJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKwoJCS8vICJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdIgoJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCgkJIipcXF0iLAoKCXBzZXVkb3MgPSAiOigiICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKwoJCS8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgoJcndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgIisiLCAiZyIgKSwKCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAoKCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAoJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAoKCXJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCAiPSIgKyB3aGl0ZXNwYWNlICsgIiooW15cXF0nXCJdKj8pIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsICJnIiApLAoKCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCglyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoICJeIiArIGlkZW50aWZpZXIgKyAiJCIgKSwKCgltYXRjaEV4cHIgPSB7CgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBpZGVudGlmaWVyICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50aWZpZXIgKyAiKSIgKSwKCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGlkZW50aWZpZXIgKyAifFsqXSkiICksCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCgkJIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwKCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKCQkvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgCgkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCgkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQoJfSwKCglyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJoZWFkZXIgPSAvXmhcZCQvaSwKCglybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCgoJcnNpYmxpbmcgPSAvWyt+XS8sCgoJLy8gQ1NTIGVzY2FwZXMKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKCXJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJcXFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIpfC4pIiwgImlnIiApLAoJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgewoJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwoJCS8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CgkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAoJCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKCQlyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/CgkJCWVzY2FwZWQgOgoJCQloaWdoIDwgMCA/CgkJCQkvLyBCTVAgY29kZXBvaW50CgkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQoJCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Cgl9LAoKCS8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uCgkvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXMKCXJjc3Nlc2NhcGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywKCWZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkgewoJCWlmICggYXNDb2RlUG9pbnQgKSB7CgoJCQkvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIKCQkJaWYgKCBjaCA9PT0gIlwwIiApIHsKCQkJCXJldHVybiAiXHVGRkZEIjsKCQkJfQoKCQkJLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHMKCQkJcmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgIlxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArICIgIjsKCQl9CgoJCS8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWQKCQlyZXR1cm4gIlxcIiArIGNoOwoJfSwKCgkvLyBVc2VkIGZvciBpZnJhbWVzCgkvLyBTZWUgc2V0RG9jdW1lbnQoKQoJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgoJLy8gZXJyb3IgaW4gSUUKCXVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKCQlzZXREb2N1bWVudCgpOwoJfSwKCglkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcigKCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgKCJmb3JtIiBpbiBlbGVtIHx8ICJsYWJlbCIgaW4gZWxlbSk7CgkJfSwKCQl7IGRpcjogInBhcmVudE5vZGUiLCBuZXh0OiAibGVnZW5kIiB9CgkpOwoKLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKdHJ5IHsKCXB1c2guYXBwbHkoCgkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAoJCXByZWZlcnJlZERvYy5jaGlsZE5vZGVzCgkpOwoJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKCS8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHkKCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cn0gY2F0Y2ggKCBlICkgewoJcHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggPwoKCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQoJCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CgkJfSA6CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5CgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCgkJCQlpID0gMDsKCQkJLy8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoCgkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Cgl2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3RvciwKCQluZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsCgoJCS8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnQKCQlub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTsKCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCgkvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dAoJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciIHx8ICFzZWxlY3RvciB8fAoJCW5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHsKCgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgoJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50cwoJaWYgKCAhc2VlZCApIHsKCgkJaWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHsKCQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CgoJCQkvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgImdldCpCeSoiIERPTSBtZXRob2QKCQkJLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQoJCQlpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewoKCQkJCS8vIElEIHNlbGVjdG9yCgkJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgewoKCQkJCQkvLyBEb2N1bWVudCBjb250ZXh0CgkJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJCS8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zCgkJCQkJCQkvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoKCQkJCQkvLyBFbGVtZW50IGNvbnRleHQKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJLy8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnMKCQkJCQkJLy8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCgkJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmCgkJCQkJCQllbGVtLmlkID09PSBtICkgewoKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9CgoJCQkJLy8gVHlwZSBzZWxlY3RvcgoJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwoJCQkJCXJldHVybiByZXN1bHRzOwoKCQkJCS8vIENsYXNzIHNlbGVjdG9yCgkJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYKCQkJCQljb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CgoJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CgkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQl9CgkJCX0KCgkJCS8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGwKCQkJaWYgKCBzdXBwb3J0LnFzYSAmJgoJCQkJIWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF0gJiYKCQkJCSghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgoJCQkJaWYgKCBub2RlVHlwZSAhPT0gMSApIHsKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IHNlbGVjdG9yOwoKCQkJCS8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudAoJCQkJLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKCQkJCS8vIFN1cHBvcnQ6IElFIDw9OAoJCQkJLy8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHMKCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgoJCQkJCS8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CgkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIChuaWQgPSBleHBhbmRvKSApOwoJCQkJCX0KCgkJCQkJLy8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7CgkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCWdyb3Vwc1tpXSA9ICIjIiArIG5pZCArICIgIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwoJCQkJCX0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCAiLCIgKTsKCgkJCQkJLy8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzCgkJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8CgkJCQkJCWNvbnRleHQ7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAoJCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCgkJCQkJCSk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0gY2F0Y2ggKCBxc2FFcnJvciApIHsKCQkJCQl9IGZpbmFsbHkgewoJCQkJCQlpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQWxsIG90aGVycwoJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwp9CgovKioKICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGgKICoJcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQogKi8KZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7Cgl2YXIga2V5cyA9IFtdOwoKCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgewoJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQoJCWlmICgga2V5cy5wdXNoKCBrZXkgKyAiICIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwoJCX0KCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsKCX0KCXJldHVybiBjYWNoZTsKfQoKLyoqCiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCiAqLwpmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewoJZm5bIGV4cGFuZG8gXSA9IHRydWU7CglyZXR1cm4gZm47Cn0KCi8qKgogKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkgewoJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTsKCgl0cnkgewoJCXJldHVybiAhIWZuKCBlbCApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVybiBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CgkJaWYgKCBlbC5wYXJlbnROb2RlICkgewoJCQllbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApOwoJCX0KCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCWVsID0gbnVsbDsKCX0KfQoKLyoqCiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQKICovCmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Cgl2YXIgYXJyID0gYXR0cnMuc3BsaXQoInwiKSwKCQlpID0gYXJyLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBhCiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBiICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkCiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWQKICovCmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHsKCgkvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGUKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWQKCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkCgkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWQKCQlpZiAoICJmb3JtIiBpbiBlbGVtICkgewoKCQkJLy8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOgoJCQkvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldAoJCQkvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkCgkJCS8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkCgkJCS8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkCgkJCS8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSAiZm9ybSIgcHJvcGVydHkuCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkgewoKCQkJCS8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50CgkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbSApIHsKCQkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQlyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFN1cHBvcnQ6IElFIDYgLSAxMQoJCQkJLy8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnMKCQkJCXJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8CgoJCQkJCS8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5CgkJCQkJLyoganNoaW50IC1XMDE4ICovCgkJCQkJZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiYKCQkJCQkJZGlzYWJsZWRBbmNlc3RvciggZWxlbSApID09PSBkaXNhYmxlZDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkOwoKCQkvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuCgkJLy8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0CgkJLy8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuCgkJfSBlbHNlIGlmICggImxhYmVsIiBpbiBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJfQoKCQkvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZAoJCXJldHVybiBmYWxzZTsKCX07Cn0KCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCiAqLwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAogKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dAogKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKICovCmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkgewoJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1MIG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LAoJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKCgkvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZAoJaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgoJLy8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXMKCWRvY3VtZW50ID0gZG9jOwoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCWRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApOwoKCS8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2UKCS8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpCglpZiAoIHByZWZlcnJlZERvYyAhPT0gZG9jdW1lbnQgJiYKCQkoc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHsKCgkJLy8gU3VwcG9ydDogSUUgMTEsIEVkZ2UKCQlpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJCQlzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5CgkJfSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkgewoJCQlzdWJXaW5kb3cuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIHVubG9hZEhhbmRsZXIgKTsKCQl9Cgl9CgoJLyogQXR0cmlidXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFN1cHBvcnQ6IElFPDgKCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcwoJLy8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCglzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Cgl9KTsKCgkvKiBnZXRFbGVtZW50KHMpQnkqCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCXN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Cgl9KTsKCgkvLyBTdXBwb3J0OiBJRTw5CglzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsKCgkvLyBTdXBwb3J0OiBJRTwxMAoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lCgkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcywKCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAoJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbzsKCQlyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKCX0pOwoKCS8vIElEIGZpbHRlciBhbmQgZmluZAoJaWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7CgkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJCUV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCQl2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJCQlyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107CgkJCX0KCQl9OwoJfSBlbHNlIHsKCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCQkJZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOwoJCQl9OwoJCX07CgoJCS8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHkKCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CgkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBub2RlLCBpLCBlbGVtcywKCQkJCQllbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCgkJCQlpZiAoIGVsZW0gKSB7CgoJCQkJCS8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlCgkJCQkJbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7CgkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQl9CgoJCQkJCS8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZQoJCQkJCWVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTsKCQkJCQlpID0gMDsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7CgkJCQkJCW5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgkJCQkJCWlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHsKCQkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gW107CgkJCX0KCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROCgkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgewoJCQkJcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CgkJCX0KCQl9IDoKCgkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJdmFyIGVsZW0sCgkJCQl0bXAgPSBbXSwKCQkJCWkgPSAwLAoJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbwoJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdG1wOwoJCQl9CgkJCXJldHVybiByZXN1bHRzOwoJCX07CgoJLy8gQ2xhc3MKCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCX0KCX07CgoJLyogUVNBL21hdGNoZXNTZWxlY3RvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKCgkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJcmJ1Z2d5TWF0Y2hlcyA9IFtdOwoKCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCgkvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3IKCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKCS8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCgkvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CglyYnVnZ3lRU0EgPSBbXTsKCglpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHsKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQoJCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCgkJCQkiPHNlbGVjdCBpZD0nIiArIGV4cGFuZG8gKyAiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPiIgKwoJCQkJIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKCgkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQoJCQkvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCAic2FmZSIgZm9yIFdpblJUCgkJCS8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IElFOAoJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44KwoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgifj0iKTsKCQkJfQoKCQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKCQkJaWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MQoJCQkvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzCgkJCWlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCIuIy4rWyt+XSIpOwoJCQl9CgkJfSk7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCWVsLmlubmVySFRNTCA9ICI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPiIgKwoJCQkJIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iOwoKCQkJLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzCgkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAoJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKCQkJZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiApOwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJuYW1lIiArIHdoaXRlc3BhY2UgKyAiKlsqXiR8IX5dPz0iICk7CgkJCX0KCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggIT09IDIgKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogSUU5LTExKwoJCQkvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHMKCQkJZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7CgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoICE9PSAyICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CgkJCX0KCgkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCgkJCWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQoJCQlzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgIioiICk7CgoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBlbCwgIltzIT0nJ106eCIgKTsKCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CgkJfSk7Cgl9CgoJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CglyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCJ8IikgKTsKCgkvKiBDb250YWlucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwoKCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgoJLy8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlCgkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8KCQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBiICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYgKCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJaWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKCQkJcmV0dXJuIHNvcnRJbnB1dCA/CgkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVudE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJYnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsKCQkJcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgoJCQkJYiA9PT0gZG9jdW1lbnQgPyAxIDoKCQkJCWF1cCA/IC0xIDoKCQkJCWJ1cCA/IDEgOgoJCQkJc29ydElucHV0ID8KCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJCX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2N1bWVudDsKfTsKClNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKfTsKClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCglleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOwoKCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkhY29tcGlsZXJDYWNoZVsgZXhwciArICIgIiBdICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoIChlKSB7fQoJfQoKCXJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cn07CgpTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7Cgl9CglyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxlbSApOwoJfQoKCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCgkJLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCgkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwoJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgoJCQl1bmRlZmluZWQ7CgoJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KCQl2YWwgOgoJCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwoJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CgkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKfTsKClNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkgewoJcmV0dXJuIChzZWwgKyAiIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8qKgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRlcyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKCWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJbnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hFeHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwKCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHktY29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJCX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJCXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKCQkJCX0pOwoJCX0sCgoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CgoJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CgkJCQl9CgkJCQlpZiAoICFvcGVyYXRvciApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCgkJCQlyZXN1bHQgKz0gIiI7CgoJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgoJCQkJCW9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJCQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAoJCQkJCQlkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIsCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCXVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLAoJCQkJCQlkaWZmID0gZmFsc2U7CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJCXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZUeXBlID8KCQkJCQkJCQkJCW5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CgkJCQkJCQkJCQlub2RlLm5vZGVUeXBlID09PSAxICkgewoKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewoKCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAoKCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCW5vZGUgPSBwYXJlbnQ7CgkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUgPDkgb25seQoJCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCShvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQkJY2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdOwoJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOwoJCQkJCQkJbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CgoJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKCgkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKCgkJCQkJCQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CgkJCQkJCQkJCXVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCgkJCQkJCQlpZiAoIHVzZUNhY2hlICkgewoJCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCQlub2RlID0gZWxlbTsKCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQljYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJCWRpZmYgPSBub2RlSW5kZXg7CgkJCQkJCQl9CgoJCQkJCQkJLy8geG1sIDpudGgtY2hpbGQoLi4uKQoJCQkJCQkJLy8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQoJCQkJCQkJaWYgKCBkaWZmID09PSBmYWxzZSApIHsKCQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CgkJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewoKCQkJCQkJCQkJaWYgKCAoIG9mVHlwZSA/CgkJCQkJCQkJCQlub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOgoJCQkJCQkJCQkJbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmCgkJCQkJCQkJCQkrK2RpZmYgKSB7CgoJCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAoJCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKCQkJCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQoJCQkJCQlkaWZmIC09IGxhc3Q7CgkJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJCX07CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwoJCQkvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCgkJCXZhciBhcmdzLAoJCQkJZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOwoKCQkJLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCgkJCWlmICggZm5bIGV4cGFuZG8gXSApIHsKCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKCQkJfQoKCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKCQkJCWFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKCQkJCQkJdmFyIGlkeCwKCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOwoJCQkJCQl9CgkJCQkJfSkgOgoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKCQkJCQl9OwoJCQl9CgoJCQlyZXR1cm4gZm47CgkJfQoJfSwKCglwc2V1ZG9zOiB7CgkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwoJCQl2YXIgaW5wdXQgPSBbXSwKCQkJCXJlc3VsdHMgPSBbXSwKCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CgoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsKCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pIDoKCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCQkJaW5wdXRbMF0gPSBlbGVtOwoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKCQkJCQkvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQoJCQkJCWlucHV0WzBdID0gbnVsbDsKCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7CgkJCQl9OwoJCX0pLAoKCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwoJCQl9OwoJCX0pLAoKCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CgkJCX07CgkJfSksCgoJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCgkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKCQkvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAoJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgoJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoJCS8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgoJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CgkJCS8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7CgkJCX0KCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgZWxlbUxhbmc7CgkJCQlkbyB7CgkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/CgkJCQkJCWVsZW0ubGFuZyA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgewoKCQkJCQkJZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwoJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOwoJCQkJCX0KCQkJCX0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJCX0pLAoKCQkvLyBNaXNjZWxsYW5lb3VzCgkJInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwoJCX0sCgoJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBkb2NFbGVtOwoJCX0sCgoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOwoJCX0sCgoJCS8vIEJvb2xlYW4gcHJvcGVydGllcwoJCSJlbmFibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksCgkJImRpc2FibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSwKCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwoJCX0sCgoJCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCgkJLy8gQ29udGVudHMKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAoJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQoJCQkvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwoJCX0sCgoJCS8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGF0dHI7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCgoJCQkJLy8gU3VwcG9ydDogSUU8OAoJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgoJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKCQl9LAoKCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CgkJfSksCgoJCSJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwoJCX0pLAoKCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDA7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CgkJCXZhciBpID0gMTsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwoJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CgkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KQoJfQp9OwoKRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKCi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwp9CmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CglFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwp9CgovLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOwpFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwoKdG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAoJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKCglpZiAoIGNhY2hlZCApIHsKCQlyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwoJfQoKCXNvRmFyID0gc2VsZWN0b3I7Cglncm91cHMgPSBbXTsKCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKCgl3aGlsZSAoIHNvRmFyICkgewoKCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CgkJCWlmICggbWF0Y2ggKSB7CgkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CgkJCX0KCQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKCQl9CgoJCW1hdGNoZWQgPSBmYWxzZTsKCgkJLy8gQ29tYmluYXRvcnMKCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKCQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCXRva2Vucy5wdXNoKHsKCQkJCXZhbHVlOiBtYXRjaGVkLAoJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCgkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKCQkJfSk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJfQoKCQkvLyBGaWx0ZXJzCgkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CgkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKCQkJCXRva2Vucy5wdXNoKHsKCQkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCW1hdGNoZXM6IG1hdGNoCgkJCQl9KTsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJCX0KCQl9CgoJCWlmICggIW1hdGNoZWQgKSB7CgkJCWJyZWFrOwoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCglyZXR1cm4gcGFyc2VPbmx5ID8KCQlzb0Zhci5sZW5ndGggOgoJCXNvRmFyID8KCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKCQkJLy8gQ2FjaGUgdGhlIHRva2VucwoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKfTsKCmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKCXZhciBpID0gMCwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCXNlbGVjdG9yID0gIiI7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7Cgl9CglyZXR1cm4gc2VsZWN0b3I7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJc2tpcCA9IGNvbWJpbmF0b3IubmV4dCwKCQlrZXkgPSBza2lwIHx8IGRpciwKCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewoJCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSA6CgoJCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsCgkJCQluZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTsKCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZwoJCQlpZiAoIHhtbCApIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKCgkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCXVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQlpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoJCQkJCQkJZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07CgkJCQkJCX0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiYKCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CgoJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKCQkJCQkJCXJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cwoJCQkJCQkJdW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7CgoJCQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Owp9CgpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IDoKCQltYXRjaGVyc1swXTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Cgl9CglyZXR1cm4gcmVzdWx0czsKfQoKZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsKCXZhciBlbGVtLAoJCW5ld1VubWF0Y2hlZCA9IFtdLAoJCWkgPSAwLAoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCgkJbWFwcGVkID0gbWFwICE9IG51bGw7CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCWlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCWlmICggbWFwcGVkICkgewoJCQkJCW1hcC5wdXNoKCBpICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG5ld1VubWF0Y2hlZDsKfQoKZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgewoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKCX0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKCX0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKCQl2YXIgdGVtcCwgaSwgZWxlbSwKCQkJcHJlTWFwID0gW10sCgkJCXBvc3RNYXAgPSBbXSwKCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0CgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCgoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CgkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6CgkJCQllbGVtcywKCgkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CgoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQoJCQkJCVtdIDoKCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5CgkJCQkJcmVzdWx0cyA6CgkJCQltYXRjaGVySW47CgoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCgkJaWYgKCBtYXRjaGVyICkgewoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwoJCX0KCgkJLy8gQXBwbHkgcG9zdEZpbHRlcgoJCWlmICggcG9zdEZpbHRlciApIHsKCQkJdGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKCgkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KCQkJaSA9IHRlbXAubGVuZ3RoOwoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggc2VlZCApIHsKCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKCQkJCWlmICggcG9zdEZpbmRlciApIHsKCQkJCQkvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHMKCQkJCQl0ZW1wID0gW107CgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAoJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CgkJCQl9CgoJCQkJLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCXdoaWxlICggaS0tICkgewoJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCQkvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSkKCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKCQkJcmV0dXJuIHJldDsKCQl9IF07CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKCQl9IGVsc2UgewoJCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7CgoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgoJCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZwoJCQkJaiA9ICsraTsKCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoCgkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCgkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmAKCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCgkJCQkJbWF0Y2hlciwKCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCgkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7CgkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAoJCQkJbWF0Y2hlZENvdW50ID0gMCwKCQkJCWkgPSAiMCIsCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAoJCQkJc2V0TWF0Y2hlZCA9IFtdLAoJCQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJtb3N0ICksCgkJCQkvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCgkJCQlsZW4gPSBlbGVtcy5sZW5ndGg7CgoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDsKCQkJfQoKCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCgkJCS8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlqID0gMDsKCQkJCQlpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7CgkJCQkJCXNldERvY3VtZW50KCBlbGVtICk7CgkJCQkJCXhtbCA9ICFkb2N1bWVudElzSFRNTDsKCQkJCQl9CgkJCQkJd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKCQkJCWlmICggYnlTZXQgKSB7CgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKCQkJCQkJbWF0Y2hlZENvdW50LS07CgkJCQkJfQoKCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CgkJCQkJaWYgKCBzZWVkICkgewoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YAoJCQkvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLgoJCQltYXRjaGVkQ291bnQgKz0gaTsKCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQkvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgCgkJCS8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQoJCQkvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLgoJCQkvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyAiMCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdAoJCQkvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvCgkJCS8vIG51bWVyaWNhbGx5IHplcm8uCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNlZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJCQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJaWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsKCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9ucwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKCS8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dCkKCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgoJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewoKCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbAoJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7CgkJCX0KCgkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOwoJCX0KCgkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJdG9rZW4gPSB0b2tlbnNbaV07CgoJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKCQkJCS8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycwoJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAoJCQkJCXJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKCQkJCSkpICkgewoKCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CgkJCQkJc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKCQkJCQlpZiAoICFzZWxlY3RvciApIHsKCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZAoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAoJCXNlZWQsCgkJY29udGV4dCwKCQkhZG9jdW1lbnRJc0hUTUwsCgkJcmVzdWx0cywKCQkhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CgkpOwoJcmV0dXJuIHJlc3VsdHM7Cn07CgovLyBPbmUtdGltZSBhc3NpZ25tZW50cwoKLy8gU29ydCBzdGFiaWxpdHkKc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CgovLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24Kc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7CgovLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKc2V0RG9jdW1lbnQoKTsKCi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgpzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKCXJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgovLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAppZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cn0pICkgewoJYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CgkJfQoJfSk7Cn0KCi8vIFN1cHBvcnQ6IElFPDkKLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKCWVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCXJldHVybiBlbC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKfSkgKSB7CglhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJdmFyIHZhbDsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CgkJCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KCQkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKCQl9Cgl9KTsKfQoKcmV0dXJuIFNpenpsZTsKCn0pKCB3aW5kb3cgKTsKCgoKalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKCi8vIERlcHJlY2F0ZWQKalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwpqUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlOwoKCgoKdmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJdmFyIG1hdGNoZWQgPSBbXSwKCQl0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CgoJd2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQlpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJbWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJfQoJfQoJcmV0dXJuIG1hdGNoZWQ7Cn07CgoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7Cgl2YXIgbWF0Y2hlZCA9IFtdOwoKCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CgkJCW1hdGNoZWQucHVzaCggbiApOwoJCX0KCX0KCglyZXR1cm4gbWF0Y2hlZDsKfTsKCgp2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKCgoKZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7CgogIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKfTsKdmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pICk7CgoKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewoJaWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwoJCX0gKTsKCX0KCgkvLyBTaW5nbGUgZWxlbWVudAoJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7CgkJfSApOwoJfQoKCS8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KQoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDsKCQl9ICk7Cgl9CgoJLy8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9ycwoJcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJfQoKCWlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJcmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTsKCX0KCglyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCX0gKSApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCByZXQsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfSApICk7CgkJfQoKCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTsKCgkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJcmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7Cgl9LAoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKCX0sCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5ndGg7Cgl9Cn0gKTsKCgovLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAoKCi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQp2YXIgcm9vdGpRdWVyeSwKCgkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCgkvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkCglycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLywKCglpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7CgkJdmFyIG1hdGNoLCBlbGVtOwoKCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCgkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CgkJLy8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKQoJCXJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCgkJCQlzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYKCQkJCXNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewoKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsgMSBdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDsKCgkJCQkJLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWyAxIF0sCgkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCgkJCQkJCXRydWUKCQkJCQkpICk7CgoJCQkJCS8vIEhBTkRMRTogJChodG1sLCBwcm9wcykKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCWZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7CgoJCQkJCQkJLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZQoJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CgkJCQkJCQkJdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOwoKCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQoJCQkJfSBlbHNlIHsKCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTsKCgkJCQkJaWYgKCBlbGVtICkgewoKCQkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpc1sgMCBdID0gZWxlbTsKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKCQkJdGhpc1sgMCBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID8KCQkJCXJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgoKCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKCQkJCXNlbGVjdG9yKCBqUXVlcnkgKTsKCQl9CgoJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwoJfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgovLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CgoKdmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoKCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWwgPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSAwOwoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CgkJdmFyIGN1ciwKCQkJaSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJbWF0Y2hlZCA9IFtdLAoJCQl0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTsKCgkJLy8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dAoJCWlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgoJCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID8KCQkJCQkJdGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6CgoJCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKCQkJCQkJY3VyLm5vZGVUeXBlID09PSAxICYmCgkJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKCgkJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBJbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLAoKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQoJCSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZVNvcnQoCgkJCQlqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCgkJCSkKCQkpOwoJfSwKCglhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Cn0gKTsKCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJd2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goIHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewogICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDsKICAgICAgICB9CgogICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seQogICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdAogICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgInRlbXBsYXRlIiApICkgewogICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CgoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcwoJCQlpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCQltYXRjaGVkLnJldmVyc2UoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7Cgl9Owp9ICk7CnZhciBybm90aHRtbHdoaXRlID0gKCAvW15ceDIwXHRcclxuXGZdKy9nICk7CgoKCi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0ge307CglqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9ICk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoKICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCWNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZwoJCWZpcmluZywKCgkJLy8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMKCQltZW1vcnksCgoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCgkJZmlyZWQsCgoJCS8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmcKCQlsb2NrZWQsCgoJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoKCQkvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXF1ZXVlID0gW10sCgoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKQoJCWZpcmluZ0luZGV4ID0gLTEsCgoJCS8vIEZpcmUgY2FsbGJhY2tzCgkJZmlyZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nCgkJCWxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7CgoJCQkvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucywKCQkJLy8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlcwoJCQlmaXJlZCA9IGZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkgewoJCQkJbWVtb3J5ID0gcXVldWUuc2hpZnQoKTsKCQkJCXdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgewoKCQkJCQkvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvbgoJCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmCgkJCQkJCW9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgoJCQkJCQkvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCgkJCQkJCWZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7CgkJCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdAoJCQlpZiAoICFvcHRpb25zLm1lbW9yeSApIHsKCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQl9CgoJCQlmaXJpbmcgPSBmYWxzZTsKCgkJCS8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kCgkJCWlmICggbG9ja2VkICkgewoKCQkJCS8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHMKCQkJCWlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCgkJCQkvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50CgkJCQl9IGVsc2UgewoJCQkJCWxpc3QgPSAiIjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCgkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCgkJCQkJLy8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmcKCQkJCQlpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewoJCQkJCQlmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTsKCQkJCQkJcXVldWUucHVzaCggbWVtb3J5ICk7CgkJCQkJfQoKCQkJCQkoIGZ1bmN0aW9uIGFkZCggYXJncyApIHsKCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCQlpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gInN0cmluZyIgKSB7CgoJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKCQkJCQkJCQlhZGQoIGFyZyApOwoJCQkJCQkJfQoJCQkJCQl9ICk7CgkJCQkJfSApKCBhcmd1bWVudHMgKTsKCgkJCQkJaWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHsKCQkJCQkJZmlyZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJCQl2YXIgaW5kZXg7CgkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7CgkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoKCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQlmaXJpbmdJbmRleC0tOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CgkJCQlyZXR1cm4gZm4gPwoJCQkJCWpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOgoJCQkJCWxpc3QubGVuZ3RoID4gMDsKCQkJfSwKCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZAoJCQkvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnMKCQkJLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbG9ja2VkID0gcXVldWUgPSBbXTsKCQkJCWxpc3QgPSBtZW1vcnkgPSAiIjsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgoJCQkvLyBEaXNhYmxlIC5maXJlCgkJCS8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpCgkJCS8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlsb2NrZWQgPSBxdWV1ZSA9IFtdOwoJCQkJaWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7CgkJCQkJbGlzdCA9IG1lbW9yeSA9ICIiOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFsb2NrZWQ7CgkJCX0sCgoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWlmICggIWxvY2tlZCApIHsKCQkJCQlhcmdzID0gYXJncyB8fCBbXTsKCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOwoJCQkJCXF1ZXVlLnB1c2goIGFyZ3MgKTsKCQkJCQlpZiAoICFmaXJpbmcgKSB7CgkJCQkJCWZpcmUoKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CgoKZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7CglyZXR1cm4gdjsKfQpmdW5jdGlvbiBUaHJvd2VyKCBleCApIHsKCXRocm93IGV4Owp9CgpmdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkgewoJdmFyIG1ldGhvZDsKCgl0cnkgewoKCQkvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yCgkJaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkgewoJCQltZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7CgoJCS8vIE90aGVyIHRoZW5hYmxlcwoJCX0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7CgkJCW1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7CgoJCS8vIE90aGVyIG5vbi10aGVuYWJsZXMKCQl9IGVsc2UgewoKCQkJLy8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOgoJCQkvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApCgkJCS8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpCgkJCXJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTsKCQl9CgoJLy8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zCgkvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluCgkvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLgoJfSBjYXRjaCAoIHZhbHVlICkgewoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5CgkJLy8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dAoJCXJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCggewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoKCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsCgkJCQkvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJtZW1vcnkiICksIDIgXSwKCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKCQkJCQlqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIDAsICJyZXNvbHZlZCIgXSwKCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwgMSwgInJlamVjdGVkIiBdCgkJCV0sCgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJCSJjYXRjaCI6IGZ1bmN0aW9uKCBmbiApIHsKCQkJCQlyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApOwoJCQkJfSwKCgkJCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJCQlwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CgkJCQkJdmFyIGZucyA9IGFyZ3VtZW50czsKCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgoJCQkJCQkJLy8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpCgkJCQkJCQl2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdOwoKCQkJCQkJCS8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KQoJCQkJCQkJLy8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pCgkJCQkJCQkvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KQoJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKAoJCQkJCQkJCQkJdGhpcywKCQkJCQkJCQkJCWZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzCgkJCQkJCQkJCSk7CgkJCQkJCQkJfQoJCQkJCQkJfSApOwoJCQkJCQl9ICk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSApLnByb21pc2UoKTsKCQkJCX0sCgkJCQl0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7CgkJCQkJdmFyIG1heERlcHRoID0gMDsKCQkJCQlmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7CgkJCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkJCXZhciB0aGF0ID0gdGhpcywKCQkJCQkJCQlhcmdzID0gYXJndW1lbnRzLAoJCQkJCQkJCW1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyIHJldHVybmVkLCB0aGVuOwoKCQkJCQkJCQkJLy8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjMKCQkJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTkKCQkJCQkJCQkJLy8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzCgkJCQkJCQkJCWlmICggZGVwdGggPCBtYXhEZXB0aCApIHsKCQkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7CgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xCgkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4CgkJCQkJCQkJCWlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHsKCQkJCQkJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iICk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNQoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NAoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NQoJCQkJCQkJCQkvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlCgkJCQkJCQkJCXRoZW4gPSByZXR1cm5lZCAmJgoKCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjQKCQkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0CgkJCQkJCQkJCQkvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHkKCQkJCQkJCQkJCSggdHlwZW9mIHJldHVybmVkID09PSAib2JqZWN0IiB8fAoJCQkJCQkJCQkJCXR5cGVvZiByZXR1cm5lZCA9PT0gImZ1bmN0aW9uIiApICYmCgkJCQkJCQkJCQlyZXR1cm5lZC50aGVuOwoKCQkJCQkJCQkJLy8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGUKCQkJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7CgoJCQkJCQkJCQkJLy8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvbgoJCQkJCQkJCQkJaWYgKCBzcGVjaWFsICkgewoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICkKCQkJCQkJCQkJCQkpOwoKCQkJCQkJCQkJCS8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzcwoJCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkJLy8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlcwoJCQkJCQkJCQkJCW1heERlcHRoKys7CgoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksCgkJCQkJCQkJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoICkKCQkJCQkJCQkJCQkpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXMKCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0CgkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCWlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7CgkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQlhcmdzID0gWyByZXR1cm5lZCBdOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpCgkJCQkJCQkJCQkvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZQoJCQkJCQkJCQkJKCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0sCgoJCQkJCQkJCS8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9ucwoJCQkJCQkJCXByb2Nlc3MgPSBzcGVjaWFsID8KCQkJCQkJCQkJbWlnaHRUaHJvdyA6CgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJCQltaWdodFRocm93KCk7CgkJCQkJCQkJCQl9IGNhdGNoICggZSApIHsKCgkJCQkJCQkJCQkJaWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHsKCQkJCQkJCQkJCQkJalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsCgkJCQkJCQkJCQkJCQlwcm9jZXNzLnN0YWNrVHJhY2UgKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjEKCQkJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MQoJCQkJCQkJCQkJCS8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9ucwoJCQkJCQkJCQkJCWlmICggZGVwdGggKyAxID49IG1heERlcHRoICkgewoKCQkJCQkJCQkJCQkJLy8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dAoJCQkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCQkJaWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkgewoJCQkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQkJCWFyZ3MgPSBbIGUgXTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJfTsKCgkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMQoJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTcKCQkJCQkJCS8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb20KCQkJCQkJCS8vIHN1YnNlcXVlbnQgZXJyb3JzCgkJCQkJCQlpZiAoIGRlcHRoICkgewoJCQkJCQkJCXByb2Nlc3MoKTsKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCS8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvbgoJCQkJCQkJCS8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luYwoJCQkJCQkJCWlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHsKCQkJCQkJCQkJcHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpOwoJCQkJCQkJCX0KCQkJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApOwoJCQkJCQkJfQoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoKCQkJCQkJLy8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKQoJCQkJCQl0dXBsZXNbIDAgXVsgMyBdLmFkZCgKCQkJCQkJCXJlc29sdmUoCgkJCQkJCQkJMCwKCQkJCQkJCQluZXdEZWZlciwKCQkJCQkJCQlpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgPwoJCQkJCQkJCQlvblByb2dyZXNzIDoKCQkJCQkJCQkJSWRlbnRpdHksCgkJCQkJCQkJbmV3RGVmZXIubm90aWZ5V2l0aAoJCQkJCQkJKQoJCQkJCQkpOwoKCQkJCQkJLy8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAxIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/CgkJCQkJCQkJCW9uRnVsZmlsbGVkIDoKCQkJCQkJCQkJSWRlbnRpdHkKCQkJCQkJCSkKCQkJCQkJKTsKCgkJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAyIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25SZWplY3RlZCApID8KCQkJCQkJCQkJb25SZWplY3RlZCA6CgkJCQkJCQkJCVRocm93ZXIKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQl9ICkucHJvbWlzZSgpOwoJCQkJfSwKCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwKCQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdOwoKCQkJLy8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkCgkJCXByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVTdHJpbmcgKSB7CgkJCQlsaXN0LmFkZCgKCQkJCQlmdW5jdGlvbigpIHsKCgkJCQkJCS8vIHN0YXRlID0gInJlc29sdmVkIiAoaS5lLiwgZnVsZmlsbGVkKQoJCQkJCQkvLyBzdGF0ZSA9ICJyZWplY3RlZCIKCQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKCQkJCQl9LAoKCQkJCQkvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCS8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsCgoJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGUKCQkJCQkvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsCgoJCQkJCS8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDIgXS5sb2NrLAoKCQkJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDMgXS5sb2NrCgkJCQkpOwoJCQl9CgoJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlCgkJCS8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlCgkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmUKCQkJbGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApOwoKCQkJLy8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfQoJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7CgkJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgoJCQkvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aAoJCQkvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJLy8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSApOwoKCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CgoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoKCQkvLyBBbGwgZG9uZSEKCQlyZXR1cm4gZGVmZXJyZWQ7Cgl9LAoKCS8vIERlZmVycmVkIGhlbHBlcgoJd2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkgewoJCXZhcgoKCQkJLy8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCgkJCXJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsCgoJCQkvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHMKCQkJaSA9IHJlbWFpbmluZywKCgkJCS8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGEKCQkJcmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSwKCQkJcmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoKCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZAoJCQltYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCgkJCS8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3RvcnkKCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwoJCQkJCWlmICggISggLS1yZW1haW5pbmcgKSApIHsKCQkJCQkJbWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoKCQkvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmUKCQlpZiAoIHJlbWFpbmluZyA8PSAxICkgewoJCQlhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsCgkJCQkhcmVtYWluaW5nICk7CgoJCQkvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApCgkJCWlmICggbWFzdGVyLnN0YXRlKCkgPT09ICJwZW5kaW5nIiB8fAoJCQkJaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7CgoJCQkJcmV0dXJuIG1hc3Rlci50aGVuKCk7CgkJCX0KCQl9CgoJCS8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzCgkJd2hpbGUgKCBpLS0gKSB7CgkJCWFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7CgkJfQoKCQlyZXR1cm4gbWFzdGVyLnByb21pc2UoKTsKCX0KfSApOwoKCi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LAovLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC4KdmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87CgpqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7CgoJLy8gU3VwcG9ydDogSUUgOCAtIDkgb25seQoJLy8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKCWlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7CgkJd2luZG93LmNvbnNvbGUud2FybiggImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTsKCX0KfTsKCgoKCmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQl0aHJvdyBlcnJvcjsKCX0gKTsKfTsKCgoKCi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQp2YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgoJcmVhZHlMaXN0CgkJLnRoZW4oIGZuICkKCgkJLy8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXAKCQkvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2sKCQkvLyByZWdpc3RyYXRpb24uCgkJLmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7CgkJCWpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTsKCQl9ICk7CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KCWlzUmVhZHk6IGZhbHNlLAoKCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCglyZWFkeVdhaXQ6IDEsCgoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewoKCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CgkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCX0KfSApOwoKalF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjsKCi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHsKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKCWpRdWVyeS5yZWFkeSgpOwp9CgovLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZAovLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seQovLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyAiaW50ZXJhY3RpdmUiIHRvbyBzb29uCmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fAoJKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkgewoKCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwoKfSBlbHNlIHsKCgkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCApOwoKCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKfQoKCgoKLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgp2YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGVsZW1zLmxlbmd0aCwKCQlidWxrID0ga2V5ID09IG51bGw7CgoJLy8gU2V0cyBtYW55IHZhbHVlcwoJaWYgKCB0b1R5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKCQljaGFpbmFibGUgPSB0cnVlOwoJCWZvciAoIGkgaW4ga2V5ICkgewoJCQlhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8gU2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmF3ID0gdHJ1ZTsKCQl9CgoJCWlmICggYnVsayApIHsKCgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0KCQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQkJZm4oCgkJCQkJZWxlbXNbIGkgXSwga2V5LCByYXcgPwoJCQkJCXZhbHVlIDoKCQkJCQl2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQoJCQkJKTsKCQkJfQoJCX0KCX0KCglpZiAoIGNoYWluYWJsZSApIHsKCQlyZXR1cm4gZWxlbXM7Cgl9CgoJLy8gR2V0cwoJaWYgKCBidWxrICkgewoJCXJldHVybiBmbi5jYWxsKCBlbGVtcyApOwoJfQoKCXJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDsKfTsKCgovLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKdmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7CgovLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7CglyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Cn0KCi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQovLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkgewoJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwp9CnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgewoKCS8vIEFjY2VwdHMgb25seToKCS8vICAtIE5vZGUKCS8vICAgIC0gTm9kZS5FTEVNRU5UX05PREUKCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCgkvLyAgLSBPYmplY3QKCS8vICAgIC0gQW55CglyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cn07CgoKCgpmdW5jdGlvbiBEYXRhKCkgewoJdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwp9CgpEYXRhLnVpZCA9IDE7CgpEYXRhLnByb3RvdHlwZSA9IHsKCgljYWNoZTogZnVuY3Rpb24oIG93bmVyICkgewoKCQkvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUKCQl2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCS8vIElmIG5vdCwgY3JlYXRlIG9uZQoJCWlmICggIXZhbHVlICkgewoJCQl2YWx1ZSA9IHt9OwoKCQkJLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCgkJCS8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCgkJCS8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LgoJCQlpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CgoJCQkJLy8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlcgoJCQkJLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQKCQkJCWlmICggb3duZXIubm9kZVR5cGUgKSB7CgkJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7CgoJCQkJLy8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5CgkJCQkvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQoJCQkJLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoJCQkJfSBlbHNlIHsKCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHsKCQkJCQkJdmFsdWU6IHZhbHVlLAoJCQkJCQljb25maWd1cmFibGU6IHRydWUKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB2YWx1ZTsKCX0sCglzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CgkJdmFyIHByb3AsCgkJCWNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJncwoJCS8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1NykKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJY2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKCQl9IGVsc2UgewoKCQkJLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKCQkJZm9yICggcHJvcCBpbiBkYXRhICkgewoJCQkJY2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07CgkJCX0KCQl9CgkJcmV0dXJuIGNhY2hlOwoJfSwKCWdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcy5jYWNoZSggb3duZXIgKSA6CgoJCQkvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpCgkJCW93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTsKCX0sCglhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHsKCgkJLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAoJCS8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAoJCS8vCgkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQoJCS8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKCQkvLwoJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKCQkvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5CgkJLy8KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CgkJCQkoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7CgkJfQoKCQkvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQoJCS8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwoJCS8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCgkJLy8KCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKCgkJLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cwoJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQoJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7Cgl9LAoJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKCQl2YXIgaSwKCQkJY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCWlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzCgkJCWlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7CgoJCQkJLy8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KCQkJCS8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LgoJCQkJa2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7CgkJCX0gZWxzZSB7CgkJCQlrZXkgPSBjYW1lbENhc2UoIGtleSApOwoKCQkJCS8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC4KCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCgkJCQlrZXkgPSBrZXkgaW4gY2FjaGUgPwoJCQkJCVsga2V5IF0gOgoJCQkJCSgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTsKCQkJfQoKCQkJaSA9IGtleS5sZW5ndGg7CgoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKCgkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUKCQkJLy8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKCQkJLy8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZAoJCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKQoJCQlpZiAoIG93bmVyLm5vZGVUeXBlICkgewoJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKCQkJfQoJCX0KCX0sCgloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CgkJdmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdOwoJCXJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTsKCX0KfTsKdmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTsKCnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7CgoKCi8vCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKLy8KLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAovLwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLy8JCXBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS4KLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgovLwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQovLwk1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcykKLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0Cgp2YXIgcmJyYWNlID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvW0EtWl0vZzsKCmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7CglpZiAoIGRhdGEgPT09ICJ0cnVlIiApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGRhdGEgPT09ICJmYWxzZSIgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggZGF0YSA9PT0gIm51bGwiICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCglpZiAoIGRhdGEgPT09ICtkYXRhICsgIiIgKSB7CgkJcmV0dXJuICtkYXRhOwoJfQoKCWlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHsKCQlyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApOwoJfQoKCXJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewoJdmFyIG5hbWU7CgoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNhc2UoKTsKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0gZ2V0RGF0YSggZGF0YSApOwoJCQl9IGNhdGNoICggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCXJldHVybiBkYXRhOwp9CgpqUXVlcnkuZXh0ZW5kKCB7CgloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTsKCX0sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWQKCS8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKCX0sCgoJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaSwgbmFtZSwgZGF0YSwKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJYXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgImhhc0RhdGFBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUgMTEgb25seQoJCQkJCQkvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NCkKCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgewoJCQkJCQkJbmFtZSA9IGF0dHJzWyBpIF0ubmFtZTsKCQkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CgkJCQkJCQkJbmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTsKCQkJfSApOwoJCX0KCgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZGF0YTsKCgkJCS8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CgkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCgkJCS8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0CgkJCS8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KCQkJaWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZQoJCQkJLy8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGEKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gQXR0ZW1wdCB0byAiZGlzY292ZXIiIHRoZSBkYXRhIGluCgkJCQkvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCgkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRhdGEuLi4KCQkJdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCgkJCQkvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5CgkJCQlkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApOwoJCX0gKTsKCX0KfSApOwoKCmpRdWVyeS5leHRlbmQoIHsKCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKCQl2YXIgcXVldWU7CgoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwoJCQlxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApOwoKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJcXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWV1ZS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOwoJCX0KCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCgkJCW5leHQgPSBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CgkJCX07CgoJCS8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkJc3RhcnRMZW5ndGgtLTsKCQl9CgoJCWlmICggZm4gKSB7CgoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CgkJCX0KCgkJCS8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CgkJfQoKCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCX0KCX0sCgoJLy8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmUKCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKCQlyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwgewoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLmFkZCggZnVuY3Rpb24oKSB7CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1ZSIsIGtleSBdICk7CgkJCX0gKQoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWyAwIF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9ICk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSApOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoKCS8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsKCQl2YXIgdG1wLAoJCQljb3VudCA9IDEsCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IHRoaXMubGVuZ3RoLAoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwoJCQkJfQoJCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJb2JqID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJd2hpbGUgKCBpLS0gKSB7CgkJCXRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0gKTsKdmFyIHBudW0gPSAoIC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8gKS5zb3VyY2U7Cgp2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CgoKdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKCnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgoJCS8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwoJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAoJCWVsZW0gPSBlbCB8fCBlbGVtOwoKCQkvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbAoJCXJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fAoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmCgoJCQkvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlCgkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1CgkJCS8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpcwoJCQkvLyBpbiB0aGUgZG9jdW1lbnQuCgkJCWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiYKCgkJCWpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSI7Cgl9OwoKdmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Cgl2YXIgcmV0LCBuYW1lLAoJCW9sZCA9IHt9OwoKCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCX0KCglyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwoKCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQoKCXJldHVybiByZXQ7Cn07CgoKCgpmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgewoJdmFyIGFkanVzdGVkLCBzY2FsZSwKCQltYXhJdGVyYXRpb25zID0gMjAsCgkJY3VycmVudFZhbHVlID0gdHdlZW4gPwoJCQlmdW5jdGlvbigpIHsKCQkJCXJldHVybiB0d2Vlbi5jdXIoKTsKCQkJfSA6CgkJCWZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsICIiICk7CgkJCX0sCgkJaW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLAoJCXVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAoKCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCWluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKCQkJcmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTsKCglpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgewoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTQKCQkvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpCgkJaW5pdGlhbCA9IGluaXRpYWwgLyAyOwoKCQkvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzCgkJdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdOwoKCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCWluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxOwoKCQl3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHsKCgkJCS8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuCgkJCS8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS4KCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApOwoJCQlpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHsKCQkJCW1heEl0ZXJhdGlvbnMgPSAwOwoJCQl9CgkJCWluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CgoJCX0KCgkJaW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyOwoJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTsKCgkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCXZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdOwoJfQoKCWlmICggdmFsdWVQYXJ0cyApIHsKCQlpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDsKCgkJLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkCgkJYWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gPwoJCQlpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOgoJCQkrdmFsdWVQYXJ0c1sgMiBdOwoJCWlmICggdHdlZW4gKSB7CgkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQl0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7CgkJCXR3ZWVuLmVuZCA9IGFkanVzdGVkOwoJCX0KCX0KCXJldHVybiBhZGp1c3RlZDsKfQoKCnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9OwoKZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7Cgl2YXIgdGVtcCwKCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCgkJbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLAoJCWRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTsKCglpZiAoIGRpc3BsYXkgKSB7CgkJcmV0dXJuIGRpc3BsYXk7Cgl9CgoJdGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApOwoJZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsICJkaXNwbGF5IiApOwoKCXRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApOwoKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCWRpc3BsYXkgPSAiYmxvY2siOwoJfQoJZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZGlzcGxheSwgZWxlbSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCS8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZQoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoKCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwoJCWlmICggc2hvdyApIHsKCgkJCS8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdykKCQkJLy8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyCgkJCS8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZCkKCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJkaXNwbGF5IiApIHx8IG51bGw7CgkJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CgkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQl9CgkJCX0KCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gIm5vbmUiOwoKCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmcKCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvdwoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkgewoJCQllbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgewoJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CgkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0gKTsKCX0KfSApOwp2YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7Cgp2YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pICk7Cgp2YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApOwoKCgovLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKQp2YXIgd3JhcE1hcCA9IHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCgkvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZQoJLy8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlbgoJLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgoJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgljb2w6IFsgMiwgIjx0YWJsZT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAoKCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCn07CgovLyBTdXBwb3J0OiBJRSA8PTkgb25seQp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Cgp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5CgkvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpCgl2YXIgcmV0OwoKCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgewoJCXJldCA9IFtdOwoJfQoKCWlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHsKCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKCi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZApmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Cgl2YXIgaSA9IDAsCgkJbCA9IGVsZW1zLmxlbmd0aDsKCglmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJZGF0YVByaXYuc2V0KAoJCQllbGVtc1sgaSBdLAoJCQkiZ2xvYmFsRXZhbCIsCgkJCSFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCgkJKTsKCX0KfQoKCnZhciByaHRtbCA9IC88fCYjP1x3KzsvOwoKZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKCXZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlub2RlcyA9IFtdLAoJCWkgPSAwLAoJCWwgPSBlbGVtcy5sZW5ndGg7CgoJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1sgaSBdOwoKCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKCgkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQoJCQlpZiAoIHRvVHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQoJCQl9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CgoJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKCQkJfSBlbHNlIHsKCQkJCXRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CgoJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgoJCQkJdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwoJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07CgoJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CgkJCQlqID0gd3JhcFsgMCBdOwoJCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQkJdG1wID0gdG1wLmxhc3RDaGlsZDsKCQkJCX0KCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CgoJCQkJLy8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIKCQkJCXRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQkJLy8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKQoJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9Cgl9CgoJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAoJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKCglpID0gMDsKCXdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CgoJCS8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpCgkJaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7CgkJCWlmICggaWdub3JlZCApIHsKCQkJCWlnbm9yZWQucHVzaCggZWxlbSApOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCgkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKCQl0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlpZiAoIGNvbnRhaW5zICkgewoJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKCQl9CgoJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKCQlpZiAoIHNjcmlwdHMgKSB7CgkJCWogPSAwOwoJCQl3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHsKCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGZyYWdtZW50Owp9CgoKKCBmdW5jdGlvbigpIHsKCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApLAoJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHkKCS8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpCgkvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCgkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAicmFkaW8iICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seQoJLy8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZAoJZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOwp9ICkoKTsKdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgoKdmFyCglya2V5RXZlbnQgPSAvXmtleS8sCglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkvOwoKZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKCXJldHVybiBmYWxzZTsKfQoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvCmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewoJdHJ5IHsKCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCX0gY2F0Y2ggKCBlcnIgKSB7IH0KfQoKZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHsKCXZhciBvcmlnRm4sIHR5cGU7CgoJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCglpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCW9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJfQoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgoJCS8vICggdHlwZXMsIGZuICkKCQlmbiA9IHNlbGVjdG9yOwoJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0gZWxzZSB7CgoJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9Cgl9CglpZiAoIGZuID09PSBmYWxzZSApIHsKCQlmbiA9IHJldHVybkZhbHNlOwoJfSBlbHNlIGlmICggIWZuICkgewoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggb25lID09PSAxICkgewoJCW9yaWdGbiA9IGZuOwoJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCgkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKCX0KCXJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkgewoJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCX0gKTsKfQoKLyoKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCWdsb2JhbDoge30sCgoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewoKCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCgkJCWV2ZW50cywgdCwgaGFuZGxlT2JqLAoJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCgkJCWVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZQoJCS8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KQoJCWlmICggc2VsZWN0b3IgKSB7CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAoJCWlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7CgkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OwoJCX0KCQlpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7CgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPwoJCQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCgkJCWlmICggIXR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCgkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9yaWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oICIuIiApCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQlpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fAoJCQkJCXNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CgoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2UgewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJfSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCgkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCWlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwoJCQl0bXAgPSB0bXBbIDIgXSAmJgoJCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOwoJCQl3aGlsZSAoIGotLSApIHsKCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CgoJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgoJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCgkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgoJCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwKCQkJCQkJc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CgkJCQkJfQoJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwKCQkJCQlzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCgkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CgkJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgImhhbmRsZSBldmVudHMiICk7CgkJfQoJfSwKCglkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkgewoKCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKCQl2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApOwoKCQl2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSwKCQkJYXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLAoJCQloYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJCS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1sgMCBdID0gZXZlbnQ7CgoJCWZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewoJCQlhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTsKCQl9CgoJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJd2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CgoJCQlqID0gMDsKCQkJd2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiYKCQkJCSFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoKCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2UocykKCQkJCS8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgoJCQkJaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKCgkJCQkJcmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fAoJCQkJCQloYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycywKCQkJaGFuZGxlclF1ZXVlID0gW10sCgkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAoJCQljdXIgPSBldmVudC50YXJnZXQ7CgoJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OQoJCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MCkKCQkJY3VyLm5vZGVUeXBlICYmCgoJCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDIKCQkJLy8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKQoJCQkvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrCgkJCS8vIFN1cHBvcnQ6IElFIDExIG9ubHkKCQkJLy8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgImNsaWNrcyIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0MykKCQkJISggZXZlbnQudHlwZSA9PT0gImNsaWNrIiAmJiBldmVudC5idXR0b24gPj0gMSApICkgewoKCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CgoJCQkJLy8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpCgkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09ICJjbGljayIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7CgkJCQkJbWF0Y2hlZEhhbmRsZXJzID0gW107CgkJCQkJbWF0Y2hlZFNlbGVjdG9ycyA9IHt9OwoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgewoJCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwoKCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwoKCQkJCQkJaWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7CgkJCQkJCQltYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycwoJCWN1ciA9IHRoaXM7CgkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewoJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTsKCQl9CgoJCXJldHVybiBoYW5kbGVyUXVldWU7Cgl9LAoKCWFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkgewoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwgewoJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQljb25maWd1cmFibGU6IHRydWUsCgoJCQlnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/CgkJCQlmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHsKCQkJCQkJCXJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTsKCQkJCQl9CgkJCQl9IDoKCQkJCWZ1bmN0aW9uKCkgewoJCQkJCWlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkgewoJCQkJCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdOwoJCQkJCX0KCQkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwgewoJCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCQkJCXdyaXRhYmxlOiB0cnVlLAoJCQkJCXZhbHVlOiB2YWx1ZQoJCQkJfSApOwoJCQl9CgkJfSApOwoJfSwKCglmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkgewoJCXJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KCQkJb3JpZ2luYWxFdmVudCA6CgkJCW5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCgkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKCQkJbm9CdWJibGU6IHRydWUKCQl9LAoJCWZvY3VzOiB7CgoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgoJCX0sCgkJYmx1cjogewoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKCQl9LAoJCWNsaWNrOiB7CgoJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKCQkJCQl0aGlzLmNsaWNrKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoKCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCgkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlyZXR1cm4gbm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCgkvLyBUaGlzICJpZiIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzCglpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApOwoJfQp9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKCQkJCXNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiYKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkKCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7CgoJCS8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllcwoJCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHkKCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCXRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/CgkJCXNyYy50YXJnZXQucGFyZW50Tm9kZSA6CgkJCXNyYy50YXJnZXQ7CgoJCXRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0OwoJCXRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0OwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwovLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzU2ltdWxhdGVkOiBmYWxzZSwKCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJfQoKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfQp9OwoKLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHMKalF1ZXJ5LmVhY2goIHsKCWFsdEtleTogdHJ1ZSwKCWJ1YmJsZXM6IHRydWUsCgljYW5jZWxhYmxlOiB0cnVlLAoJY2hhbmdlZFRvdWNoZXM6IHRydWUsCgljdHJsS2V5OiB0cnVlLAoJZGV0YWlsOiB0cnVlLAoJZXZlbnRQaGFzZTogdHJ1ZSwKCW1ldGFLZXk6IHRydWUsCglwYWdlWDogdHJ1ZSwKCXBhZ2VZOiB0cnVlLAoJc2hpZnRLZXk6IHRydWUsCgl2aWV3OiB0cnVlLAoJImNoYXIiOiB0cnVlLAoJY2hhckNvZGU6IHRydWUsCglrZXk6IHRydWUsCglrZXlDb2RlOiB0cnVlLAoJYnV0dG9uOiB0cnVlLAoJYnV0dG9uczogdHJ1ZSwKCWNsaWVudFg6IHRydWUsCgljbGllbnRZOiB0cnVlLAoJb2Zmc2V0WDogdHJ1ZSwKCW9mZnNldFk6IHRydWUsCglwb2ludGVySWQ6IHRydWUsCglwb2ludGVyVHlwZTogdHJ1ZSwKCXNjcmVlblg6IHRydWUsCglzY3JlZW5ZOiB0cnVlLAoJdGFyZ2V0VG91Y2hlczogdHJ1ZSwKCXRvRWxlbWVudDogdHJ1ZSwKCXRvdWNoZXM6IHRydWUsCgoJd2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uOwoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJcmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkgewoJCQlpZiAoIGJ1dHRvbiAmIDEgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCBidXR0b24gJiAyICkgewoJCQkJcmV0dXJuIDM7CgkJCX0KCgkJCWlmICggYnV0dG9uICYgNCApIHsKCQkJCXJldHVybiAyOwoJCQl9CgoJCQlyZXR1cm4gMDsKCQl9CgoJCXJldHVybiBldmVudC53aGljaDsKCX0KfSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwovLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LgovLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dAovLwovLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5Ci8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNTgKLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4KalF1ZXJ5LmVhY2goIHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKCXBvaW50ZXJlbnRlcjogInBvaW50ZXJvdmVyIiwKCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCWRlbGVnYXRlVHlwZTogZml4LAoJCWJpbmRUeXBlOiBmaXgsCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcmV0LAoJCQkJdGFyZ2V0ID0gdGhpcywKCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAoJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwoKCQkJLy8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewoJCXJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8KCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDoKCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9ICk7Cgl9Cn0gKTsKCgp2YXIKCgkvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgoJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5CglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksCgoJLyogZXNsaW50LWVuYWJsZSAqLwoKCS8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHkKCS8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuCgkvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLwoJcm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksCgoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKCi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93cwpmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglpZiAoIG5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgKSB7CgoJCXJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggInRib2R5IiApWyAwIF0gfHwgZWxlbTsKCX0KCglyZXR1cm4gZWxlbTsKfQoKLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgpmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgewoJZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICkgIT09IG51bGwgKSArICIvIiArIGVsZW0udHlwZTsKCXJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CglpZiAoICggZWxlbS50eXBlIHx8ICIiICkuc2xpY2UoIDAsIDUgKSA9PT0gInRydWUvIiApIHsKCQllbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTsKCX0gZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoICJ0eXBlIiApOwoJfQoKCXJldHVybiBlbGVtOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoJdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgoJaWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKCQlwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7CgkJcGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CgkJZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CgoJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyAyLiBDb3B5IHVzZXIgZGF0YQoJaWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHsKCQl1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7CgkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKCgkJZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOwoJfQp9CgovLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoJfQp9CgpmdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7CgoJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJYXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgl2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsCgkJaSA9IDAsCgkJbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAoJCWlOb0Nsb25lID0gbCAtIDEsCgkJdmFsdWUgPSBhcmdzWyAwIF0sCgkJdmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCWlmICggdmFsdWVJc0Z1bmN0aW9uIHx8CgkJCSggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJgoJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQl2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7CgkJCWlmICggdmFsdWVJc0Z1bmN0aW9uICkgewoJCQkJYXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7CgkJCX0KCQkJZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CgkJfSApOwoJfQoKCWlmICggbCApIHsKCQlmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApOwoJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQl9CgoJCS8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjawoJCWlmICggZmlyc3QgfHwgaWdub3JlZCApIHsKCQkJc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOwoKCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbQoJCQkvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJbm9kZSA9IGZyYWdtZW50OwoKCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CgkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwoKCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJCQkJaWYgKCBoYXNTY3JpcHRzICkgewoKCQkJCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJCQl9CgkJCQl9CgoJCQkJY2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7CgkJCX0KCgkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CgoJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwoJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOwoKCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewoJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07CgkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgoJCQkJCQkhZGF0YVByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgoJCQkJCQlqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJaWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCAiIiApLnRvTG93ZXJDYXNlKCkgICE9PSAibW9kdWxlIiApIHsKCgkJCQkJCQkvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudAoJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CgkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICksIGRvYywgbm9kZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBjb2xsZWN0aW9uOwp9CgpmdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCXZhciBub2RlLAoJCW5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSwKCQlpID0gMDsKCglmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7CgkJaWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKCQl9CgoJCWlmICggbm9kZS5wYXJlbnROb2RlICkgewoJCQlpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7CgkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJfQoJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTsKCQl9Cgl9CgoJcmV0dXJuIGVsZW07Cn0KCmpRdWVyeS5leHRlbmQoIHsKCWh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAoJCQlpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCgkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgoJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJCX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKCQkJaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCQlpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkgewoJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CgkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CgoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJaWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgkJfQoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOwoJfSwKCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwoJCQkJCX0KCQkJCX0gKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0gKTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKCQkJCXRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0gKTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwoKCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7CgkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOwoKCQlyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0gKTsKCX0sCgoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CgoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2ggKCBlICkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgaWdub3JlZCA9IFtdOwoKCQkvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnQKCQlyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQlpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkgewoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKCQkJCWlmICggcGFyZW50ICkgewoJCQkJCXBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJCX0KCQkJfQoKCQkvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uCgkJfSwgaWdub3JlZCApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAoJCQlpID0gMDsKCgkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKCQkJalF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0gKTsKdmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApOwoKdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApCgkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCgkJLy8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoICJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlIgoJCXZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQlpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHsKCQkJdmlldyA9IHdpbmRvdzsKCQl9CgoJCXJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTsKCX07Cgp2YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oICJ8IiApLCAiaSIgKTsKCgoKKCBmdW5jdGlvbigpIHsKCgkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQKCS8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uCglmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHsKCgkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZQoJCWlmICggIWRpdiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4OyIgKwoJCQkibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIjsKCQlkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7IiArCgkJCSJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4OyIgKwoJCQkid2lkdGg6NjAlO3RvcDoxJSI7CgkJZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTsKCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0CgkJcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjMKCQkvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3QKCQlkaXYuc3R5bGUucmlnaHQgPSAiNjAlIjsKCQlwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkJLy8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50cwoJCWJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjsKCgkJLy8gU3VwcG9ydDogSUUgOSBvbmx5CgkJLy8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KQoJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgImFic29sdXRlIjsKCgkJZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCgkJLy8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZAoJCS8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQKCQlkaXYgPSBudWxsOwoJfQoKCWZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHsKCQlyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7Cgl9CgoJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCwKCQlyZWxpYWJsZU1hcmdpbkxlZnRWYWwsCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFkaXYuc3R5bGUgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCS8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CglkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOwoKCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKCQl9LAoJCXBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsOwoJCX0sCgkJcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgkJcmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKCQl9LAoJCXNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkgewoJCQljb21wdXRlU3R5bGVUZXN0cygpOwoJCQlyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDsKCQl9Cgl9ICk7Cn0gKSgpOwoKCmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7Cgl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDUxKwoJCS8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3cKCQkvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzCgkJLy8gb24gZGV0YWNoZWQgZWxlbWVudHMKCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6CgkvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNykKCS8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KQoJaWYgKCBjb21wdXRlZCApIHsKCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKCgkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQl9CgoJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJLy8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsCgkJLy8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy4KCQkvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQlpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CgkJfQoJfQoKCXJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CgoJCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCQkvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgoJCXJldCArICIiIDoKCQlyZXQ7Cn0KCgpmdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgoJLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KCXJldHVybiB7CgkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJaWYgKCBjb25kaXRpb25GbigpICkgewoKCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZQoJCQkJLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCQkJcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfTsKfQoKCnZhcgoKCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUKCS8vIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglyY3VzdG9tUHJvcCA9IC9eLS0vLAoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogIjAiLAoJCWZvbnRXZWlnaHQ6ICI0MDAiCgl9LAoKCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk1veiIsICJtcyIgXSwKCWVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLnN0eWxlOwoKLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHsKCgkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAoJaWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHsKCQkJcmV0dXJuIG5hbWU7CgkJfQoJfQp9CgovLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG8KLy8gYSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkuCmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7Cgl2YXIgcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF07CglpZiAoICFyZXQgKSB7CgkJcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7Cgl9CglyZXR1cm4gcmV0Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoKCS8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4KCS8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludAoJdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CglyZXR1cm4gbWF0Y2hlcyA/CgoJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcwoJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgInB4IiApIDoKCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7Cgl2YXIgaSA9IGRpbWVuc2lvbiA9PT0gIndpZHRoIiA/IDEgOiAwLAoJCWV4dHJhID0gMCwKCQlkZWx0YSA9IDA7CgoJLy8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeQoJaWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApICkgewoJCXJldHVybiAwOwoJfQoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCgkJLy8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luCgkJaWYgKCBib3ggPT09ICJtYXJnaW4iICkgewoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgkJfQoKCQkvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgInBhZGRpbmciIG9yICJib3JkZXIiIG9yICJtYXJnaW4iCgkJaWYgKCAhaXNCb3JkZXJCb3ggKSB7CgoJCQkvLyBBZGQgcGFkZGluZwoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgoJCQkvLyBGb3IgImJvcmRlciIgb3IgIm1hcmdpbiIsIGFkZCBib3JkZXIKCQkJaWYgKCBib3ggIT09ICJwYWRkaW5nIiApIHsKCQkJCWRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKCgkJCS8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZQoJCQl9IGVsc2UgewoJCQkJZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgoJCS8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgImNvbnRlbnQiIG9yCgkJLy8gInBhZGRpbmciIG9yICJtYXJnaW4iCgkJfSBlbHNlIHsKCgkJCS8vIEZvciAiY29udGVudCIsIHN1YnRyYWN0IHBhZGRpbmcKCQkJaWYgKCBib3ggPT09ICJjb250ZW50IiApIHsKCQkJCWRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQkJfQoKCQkJLy8gRm9yICJjb250ZW50IiBvciAicGFkZGluZyIsIHN1YnRyYWN0IGJvcmRlcgoJCQlpZiAoIGJveCAhPT0gIm1hcmdpbiIgKSB7CgkJCQlkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CgkJCX0KCQl9Cgl9CgoJLy8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWwKCWlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7CgoJCS8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXIKCQkvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duCgkJZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbCgKCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCWNvbXB1dGVkVmFsIC0KCQkJZGVsdGEgLQoJCQlleHRyYSAtCgkJCTAuNQoJCSkgKTsKCX0KCglyZXR1cm4gZGVsdGE7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7CgoJLy8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZQoJdmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAoJCXZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7CgoJLy8gU3VwcG9ydDogRmlyZWZveCA8PTU0CgkvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS4KCWlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkgewoJCWlmICggIWV4dHJhICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCQl2YWwgPSAiYXV0byI7Cgl9CgoJLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKCXZhbHVlSXNCb3JkZXJCb3ggPSB2YWx1ZUlzQm9yZGVyQm94ICYmCgkJKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSApOwoKCS8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyAiYXV0byIKCS8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSkKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seQoJLy8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMikKCWlmICggdmFsID09PSAiYXV0byIgfHwKCQkhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiLCBmYWxzZSwgc3R5bGVzICkgPT09ICJpbmxpbmUiICkgewoKCQl2YWwgPSBlbGVtWyAib2Zmc2V0IiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdOwoKCQkvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlcwoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlOwoJfQoKCS8vIE5vcm1hbGl6ZSAiIiBhbmQgYXV0bwoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsCglyZXR1cm4gKCB2YWwgKwoJCWJveE1vZGVsQWRqdXN0bWVudCgKCQkJZWxlbSwKCQkJZGltZW5zaW9uLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveCwKCQkJc3R5bGVzLAoKCQkJLy8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSkKCQkJdmFsCgkJKQoJKSArICJweCI7Cn0KCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCgljc3NOdW1iZXI6IHsKCQkiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAoJCSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHt9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndAoJCS8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eQoJCS8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC4KCQlpZiAoICFpc0N1c3RvbVByb3AgKSB7CgkJCW5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApOwoJCX0KCgkJLy8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOwoKCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsKCQkJCXZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTsKCgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNikKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gIiIgOiAicHgiICk7CgkJCX0KCgkJCS8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXMKCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CgkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISggInNldCIgaW4gaG9va3MgKSB8fAoJCQkJKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggaXNDdXN0b21Qcm9wICkgewoJCQkJCXN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJfSBlbHNlIHsKCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKCQl2YXIgdmFsLCBudW0sIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3QKCQkvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5CgkJLy8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLgoJCWlmICggIWlzQ3VzdG9tUHJvcCApIHsKCQkJbmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7CgkJfQoKCQkvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwoJCX0KCgkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwoJCX0KCgkJLy8gQ29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQoJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CgkJfQoKCQkvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgoJCXJldHVybiB2YWw7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBkaW1lbnNpb24gKSB7CglqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0CgkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKCgkJCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrCgkJCQkJLy8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm8KCQkJCQkvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQoJCQkJCS8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGUKCQkJCQkvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuCgkJCQkJKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID8KCQkJCQkJc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApOwoJCQkJCQl9ICkgOgoJCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXZhciBtYXRjaGVzLAoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCgkJCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQkJCXN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KAoJCQkJCWVsZW0sCgkJCQkJZGltZW5zaW9uLAoJCQkJCWV4dHJhLAoJCQkJCWlzQm9yZGVyQm94LAoJCQkJCXN0eWxlcwoJCQkJKTsKCgkJCS8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZAoJCQkvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KQoJCQlpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7CgkJCQlzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoCgkJCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCQkJcGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC0KCQkJCQlib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgImJvcmRlciIsIGZhbHNlLCBzdHlsZXMgKSAtCgkJCQkJMC41CgkJCQkpOwoJCQl9CgoJCQkvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZAoJCQlpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmCgkJCQkoIG1hdGNoZXNbIDMgXSB8fCAicHgiICkgIT09ICJweCIgKSB7CgoJCQkJZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTsKCQkJCXZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7CgkJCX0KCgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CgkJfQoJfTsKfSApOwoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LAoJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCWlmICggY29tcHV0ZWQgKSB7CgkJCXJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgIm1hcmdpbkxlZnQiICkgKSB8fAoJCQkJZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KCQkJCQlzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CgkJCQkJfSApCgkJCQkpICsgInB4IjsKCQl9Cgl9Cik7CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKCB7CgltYXJnaW46ICIiLAoJcGFkZGluZzogIiIsCglib3JkZXI6ICJXaWR0aCIKfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKCQlleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGkgPSAwLAoJCQkJZXhwYW5kZWQgPSB7fSwKCgkJCQkvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCAiICIgKSA6IFsgdmFsdWUgXTsKCgkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggcHJlZml4ICE9PSAibWFyZ2luIiApIHsKCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZXMsIGxlbiwKCQkJCW1hcCA9IHt9LAoJCQkJaSA9IDA7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApOwoJCQkJbGVuID0gbmFtZS5sZW5ndGg7CgoJCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwoJCQkJfQoKCQkJCXJldHVybiBtYXA7CgkJCX0KCgkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CgkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9Cn0gKTsKCgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJLy8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCwKCQkJLy8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy4KCQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgoJCQkvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7CgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOwoKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCgkJCS8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LgoJCQkvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuCgkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7CgkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKCQkJCSggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8CgkJCQkJalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwoJCQl9IGVsc2UgewoJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCQl9CgkJfQoJfQp9OwoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKCX0sCglfZGVmYXVsdDogInN3aW5nIgp9OwoKalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CgovLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKCgoKdmFyCglmeE5vdywgaW5Qcm9ncmVzcywKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC87CgpmdW5jdGlvbiBzY2hlZHVsZSgpIHsKCWlmICggaW5Qcm9ncmVzcyApIHsKCQlpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApOwoJCX0KCgkJalF1ZXJ5LmZ4LnRpY2soKTsKCX0KfQoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0gKTsKCXJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApOwp9CgovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNoLAoJCWkgPSAwLAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKCgkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCgkvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7Cglmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJaWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHsKCgkJCS8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCXJldHVybiB0d2VlbjsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewoJdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LAoJCWlzQm94ID0gIndpZHRoIiBpbiBwcm9wcyB8fCAiaGVpZ2h0IiBpbiBwcm9wcywKCQlhbmltID0gdGhpcywKCQlvcmlnID0ge30sCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCWhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksCgkJZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzCglpZiAoICFvcHRzLnF1ZXVlICkgewoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7CgkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewoJCQlob29rcy51bnF1ZXVlZCA9IDA7CgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwoJCQlob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKCQkJCQlvbGRmaXJlKCk7CgkJCQl9CgkJCX07CgkJfQoJCWhvb2tzLnVucXVldWVkKys7CgoJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9ICk7CgkJfSApOwoJfQoKCS8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CgkJaWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCgkJCQkvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgInNob3ciIGFuZAoJCQkJLy8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGUKCQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsKCgkJCQkvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhCgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgkJfQoJfQoKCS8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpCglwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7CglpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKCQlyZXR1cm47Cgl9CgoJLy8gUmVzdHJpY3QgIm92ZXJmbG93IiBhbmQgImRpc3BsYXkiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnMKCWlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZAoJCS8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9ycwoJCS8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZQoJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTsKCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCAiZGlzcGxheSIgKTsKCQl9CgkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ICkgewoJCQkJZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQl9IGVsc2UgewoKCQkJCS8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHkKCQkJCXNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApOwoJCQkJcmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7CgkJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0gKTsKCQkJfQoJCX0KCgkJLy8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrCgkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkgewoJCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoKCQkJCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zCgkJCQlpZiAoICFwcm9wVHdlZW4gKSB7CgkJCQkJYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKCQkJCQkJc3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQkJCX0gKTsKCQkJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCQkJCWRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5OwoJCQkJCQlyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/ICIiIDogZGlzcGxheTsKCQkJCQl9CgkJCQl9CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJYW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOwoJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJfSApOwoJfQoKCS8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJcHJvcFR3ZWVuID0gZmFsc2U7Cglmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgoJCS8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uCgkJaWYgKCAhcHJvcFR3ZWVuICkgewoJCQlpZiAoIGRhdGFTaG93ICkgewoJCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApOwoJCQl9CgoJCQkvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCAicmV2ZXJzZXMiCgkJCWlmICggdG9nZ2xlICkgewoJCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKCQkJfQoKCQkJLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW0KCQkJaWYgKCBoaWRkZW4gKSB7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTsKCQkJfQoKCQkJLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovCgoJCQlhbmltLmRvbmUoIGZ1bmN0aW9uKCkgewoKCQkJLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi8KCgkJCQkvLyBUaGUgZmluYWwgc3RlcCBvZiBhICJoaWRlIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50CgkJCQlpZiAoICFoaWRkZW4gKSB7CgkJCQkJc2hvd0hpZGUoIFsgZWxlbSBdICk7CgkJCQl9CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CgkJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gUGVyLXByb3BlcnR5IHNldHVwCgkJcHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CgkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCWRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7CgkJCWlmICggaGlkZGVuICkgewoJCQkJcHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDsKCQkJCXByb3BUd2Vlbi5zdGFydCA9IDA7CgkJCX0KCQl9Cgl9Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7CgkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCgkJCS8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAoJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0gKSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoKCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHkKCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJCWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApOwoKCQkJLy8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZAoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvbgoJCQlpZiAoICFsZW5ndGggKSB7CgkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7CgkJCX0KCgkJCS8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uCgkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsKCQkJCXNwZWNpYWxFYXNpbmc6IHt9LAoJCQkJZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CgkJCX0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4gdHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJdmFyIGluZGV4ID0gMCwKCgkJCQkJLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCQkJCWlmICggc3RvcHBlZCApIHsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJCXN0b3BwZWQgPSB0cnVlOwoJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOwoJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSApLAoJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOwoKCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwoJCWlmICggcmVzdWx0ICkgewoJCQlpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7CgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQoJCQkJCXJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApOwoJCQl9CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfQoKCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CgoJaWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwoJfQoKCS8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglhbmltYXRpb24KCQkucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQllbGVtOiBlbGVtLAoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQoJCX0gKQoJKTsKCglyZXR1cm4gYW5pbWF0aW9uOwp9CgpqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CgoJdHdlZW5lcnM6IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApOwoJCQlhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTsKCQkJcmV0dXJuIHR3ZWVuOwoJCX0gXQoJfSwKCgl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewoJCWlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0KCX0sCgoJcHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCUFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CgkJfQoJfQp9ICk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJZHVyYXRpb246IHNwZWVkLAoJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCS8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZgoJaWYgKCBqUXVlcnkuZngub2ZmICkgewoJCW9wdC5kdXJhdGlvbiA9IDA7CgoJfSBlbHNlIHsKCQlpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09ICJudW1iZXIiICkgewoJCQlpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07CgoJCQl9IGVsc2UgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCQkJfQoJCX0KCX0KCgkvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCglpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKCQlvcHQucXVldWUgPSAiZngiOwoJfQoKCS8vIFF1ZXVlaW5nCglvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoKCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoKCQkvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CgkJCQl2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CgoJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CgkJCQlpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJgoJCQkJCSggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgewoKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuCgkJCS8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSApOwoJfSwKCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CgkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0cnVlOwoKCQkJLy8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7CgkJfSApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCggewoJc2xpZGVEb3duOiBnZW5GeCggInNob3ciICksCglzbGlkZVVwOiBnZW5GeCggImhpZGUiICksCglzbGlkZVRvZ2dsZTogZ2VuRngoICJ0b2dnbGUiICksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCWkgPSAwLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJZnhOb3cgPSBEYXRlLm5vdygpOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoKCQkvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWpRdWVyeS5meC5zdGFydCgpOwp9OwoKalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewoJaWYgKCBpblByb2dyZXNzICkgewoJCXJldHVybjsKCX0KCglpblByb2dyZXNzID0gdHJ1ZTsKCXNjaGVkdWxlKCk7Cn07CgpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgewoJaW5Qcm9ncmVzcyA9IG51bGw7Cn07CgpqUXVlcnkuZnguc3BlZWRzID0gewoJc2xvdzogNjAwLAoJZmFzdDogMjAwLAoKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKCQl2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CgkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsKCX0gKTsKfTsKCgooIGZ1bmN0aW9uKCkgewoJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAoJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCgkJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib3B0aW9uIiApICk7CgoJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5CgkvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSAib24iCglzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdAoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKCgkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHkKCS8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQudHlwZSA9ICJyYWRpbyI7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwp9ICkoKTsKCgp2YXIgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOwoJCX0KCgkJLy8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgoJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CgkJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTsKCgkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQlyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKCQkJCQlub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLAoJCQlpID0gMCwKCgkJCS8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKCQkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7CgoJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCXdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJfQoJCX0KCX0KfSApOwoKLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCXZhciByZXQsIGhhbmRsZSwKCQkJbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCgkJaWYgKCAhaXNYTUwgKSB7CgoJCQkvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCgkJCWhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTsKCQkJYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0OwoJCQlyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CgkJCQlsb3dlcmNhc2VOYW1lIDoKCQkJCW51bGw7CgkJCWF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gKTsKCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYKCQkJCSggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seQoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCgkJCQkvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKCgkJCQlpZiAoIHRhYmluZGV4ICkgewoJCQkJCXJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7CgkJCQl9CgoJCQkJaWYgKAoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CgkJCQkJcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYKCQkJCQllbGVtLmhyZWYKCQkJCSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCX0sCgoJcHJvcEZpeDogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNsYXNzIjogImNsYXNzTmFtZSIKCX0KfSApOwoKLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5Ci8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eQovLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCi8vIG9uIHRoZSBvcHRpb24KLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWQKLy8gd2hlbiBpbiBhbiBvcHRncm91cAovLyBlc2xpbnQgcnVsZSAibm8tdW51c2VkLWV4cHJlc3Npb25zIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlCi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcAppZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJLyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogIm9mZiIgKi8KCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJCWlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiAib2ZmIiAqLwoKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgpqUXVlcnkuZWFjaCggWwoJInRhYkluZGV4IiwKCSJyZWFkT25seSIsCgkibWF4TGVuZ3RoIiwKCSJjZWxsU3BhY2luZyIsCgkiY2VsbFBhZGRpbmciLAoJInJvd1NwYW4iLAoJImNvbFNwYW4iLAoJInVzZU1hcCIsCgkiZnJhbWVCb3JkZXIiLAoJImNvbnRlbnRFZGl0YWJsZSIKXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOwp9ICk7CgoKCgoJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlYwoJLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlCglmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHsKCQl2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTsKCQlyZXR1cm4gdG9rZW5zLmpvaW4oICIgIiApOwoJfQoKCmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgewoJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCAiY2xhc3MiICkgfHwgIiI7Cn0KCmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHsKCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CglpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107Cgl9CglyZXR1cm4gW107Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJY2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApOwoKCQlpZiAoIGNsYXNzZXMubGVuZ3RoICkgewoJCQl3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7CgkJCQljdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgewoJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgoJCQkJCWZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTsKCQkJCQlpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggImNsYXNzIiwgZmluYWxWYWx1ZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuYXR0ciggImNsYXNzIiwgIiIgKTsKCQl9CgoJCWNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJaWYgKCBjbGFzc2VzLmxlbmd0aCApIHsKCQkJd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgewoJCQkJY3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApOwoKCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgoJCQkJCQkvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPiAtMSApIHsKCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApOwoJCQkJCWlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7CgkJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09ICJzdHJpbmciIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7CgoJCWlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgaXNWYWxpZFZhbHVlICkgewoJCQlyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcygKCQkJCQl2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLAoJCQkJCXN0YXRlVmFsCgkJCQkpOwoJCQl9ICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJdmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lczsKCgkJCWlmICggaXNWYWxpZFZhbHVlICkgewoKCQkJCS8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCQlpID0gMDsKCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJCQl3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHsKCgkJCQkJLy8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQljbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApOwoJCQkJaWYgKCBjbGFzc05hbWUgKSB7CgoJCQkJCS8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlkYXRhUHJpdi5zZXQoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKCQkJCS8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCgkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAoJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgoJCQkJaWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHsKCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSggImNsYXNzIiwKCQkJCQkJY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CgkJCQkJCSIiIDoKCQkJCQkJZGF0YVByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIgoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSwgZWxlbSwKCQkJaSA9IDA7CgoJCWNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiOwoJCXdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCgkJCQkoICIgIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArICIgIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KfSApOwoKCgoKdmFyIHJyZXR1cm4gPSAvXHIvZzsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sCgkJCWVsZW0gPSB0aGlzWyAwIF07CgoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fAoJCQkJCWpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJgoJCQkJCSJnZXQiIGluIGhvb2tzICYmCgkJCQkJKCByZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSApICE9PSB1bmRlZmluZWQKCQkJCSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJcmV0ID0gZWxlbS52YWx1ZTsKCgkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCgkJCQlpZiAoIHR5cGVvZiByZXQgPT09ICJzdHJpbmciICkgewoJCQkJCXJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgIiIgKTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCXJldHVybiByZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQl2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewoJCQkJdmFsICs9ICIiOwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKCQkJCX0gKTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7CgkJCX0KCQl9ICk7Cgl9Cn0gKTsKCmpRdWVyeS5leHRlbmQoIHsKCXZhbEhvb2tzOiB7CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CgkJCQkJdmFsIDoKCgkJCQkJLy8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHkKCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCgkJCQkJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UKCQkJCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZQoJCQkJCXN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKCQkJfQoJCX0sCgkJc2VsZWN0OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgdmFsdWUsIG9wdGlvbiwgaSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsKCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlpID0gbWF4OwoKCQkJCX0gZWxzZSB7CgkJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAoJCQkJCQkJIW9wdGlvbi5kaXNhYmxlZCAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwKCQkJCQkJCQkhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxlbmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovCgoJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkID0KCQkJCQkJalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMQoJCQkJCSkgewoJCQkJCQlvcHRpb25TZXQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqLwoJCQkJfQoKCQkJCS8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CgkJCQlpZiAoICFvcHRpb25TZXQgKSB7CgkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9CgkJfQoJfQp9ICk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVlcnkuZWFjaCggWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7CgkJCX0KCQl9Cgl9OwoJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgewoJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwoJCX07Cgl9Cn0gKTsKCgoKCi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KCgpzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CgoKdmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAoJc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwgewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoKCQl2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCwKCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCgkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAoJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOwoKCQljdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewoKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggIi4iICk7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoICI6IiApIDwgMCAmJiAib24iICsgdHlwZTsKCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CgkJCWV2ZW50IDoKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwoKCQkvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCgkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKCQlldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID8KCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoKCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsKCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCQl9CgkJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKCQkJCXRtcCA9IGN1cjsKCQkJfQoKCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCgkJCWlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkgewoJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwoJCQl9CgkJfQoKCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCgkJaSA9IDA7CgkJd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbGFzdEVsZW1lbnQgPSBjdXI7CgkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CgkJCQlidWJibGVUeXBlIDoKCQkJCXNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKCgkJCS8vIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmCgkJCQlkYXRhUHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBOYXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgewoJCQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9CgkJfQoJCWV2ZW50LnR5cGUgPSB0eXBlOwoKCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCgkJCWlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAoJCQkJc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiYKCQkJCWFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJaWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKCgkJCQkJaWYgKCB0bXAgKSB7CgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQl9CgoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgoJCQkJCWlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQkJbGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTsKCQkJCQl9CgoJCQkJCWVsZW1bIHR5cGUgXSgpOwoKCQkJCQlpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCWxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7CgkJCQkJfQoKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoKCQkJCQlpZiAoIHRtcCApIHsKCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUKCS8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCglzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkgewoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVudCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlCgkJCX0KCQkpOwoKCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJfQoKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0gKTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIGVsZW0gPSB0aGlzWyAwIF07CgkJaWYgKCBlbGVtICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKCQl9Cgl9Cn0gKTsKCgovLyBTdXBwb3J0OiBGaXJlZm94IDw9NDQKLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50cwovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4NwovLwovLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjEKLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlcgovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1NwppZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7CglqUXVlcnkuZWFjaCggeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsKCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCQlkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7CgoJCQkJfSBlbHNlIHsKCQkJCQlkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOwoJCQkJfQoJCQl9CgkJfTsKCX0gKTsKfQp2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247Cgp2YXIgbm9uY2UgPSBEYXRlLm5vdygpOwoKdmFyIHJxdWVyeSA9ICggL1w/LyApOwoKCgovLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkgewoJdmFyIHhtbDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC4KCXRyeSB7CgkJeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7Cgl9IGNhdGNoICggZSApIHsKCQl4bWwgPSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKCX0KCXJldHVybiB4bWw7Cn07CgoKdmFyCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLAoJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwoKZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgewoJdmFyIG5hbWU7CgoJaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHsKCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCgkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CgkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CgoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcygKCQkJCQlwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKCQkJCQl2LAoJCQkJCXRyYWRpdGlvbmFsLAoJCQkJCWFkZAoJCQkJKTsKCQkJfQoJCX0gKTsKCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7CgoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlCgkJCXZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID8KCQkJCXZhbHVlT3JGdW5jdGlvbigpIDoKCQkJCXZhbHVlT3JGdW5jdGlvbjsKCgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsKCQkJCWVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQl9OwoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9ICk7CgoJfSBlbHNlIHsKCgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKCX0sCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0gKQoJCS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQl2YXIgdHlwZSA9IHRoaXMudHlwZTsKCgkJCS8vIFVzZSAuaXMoICI6ZGlzYWJsZWQiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTsKCQl9ICkKCQkubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJcmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQl9ICk7CgkJCX0KCgkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9ICkuZ2V0KCk7Cgl9Cn0gKTsKCgp2YXIKCXIyMCA9IC8lMjAvZywKCXJoYXNoID0gLyMuKiQvLAoJcmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCglybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKCXJwcm90b2NvbCA9IC9eXC9cLy8sCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKCgkvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW4KCW9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJb3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsCgkJCWkgPSAwLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdOwoKCQlpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJd2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkgewoKCQkJCS8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCgkJCQlpZiAoIGRhdGFUeXBlWyAwIF0gPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgIioiOwoJCQkJCSggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApOwoKCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKCQkJCX0gZWxzZSB7CgkJCQkJKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKCgl2YXIgaW5zcGVjdGVkID0ge30sCgkJc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7CgoJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CgkJdmFyIHNlbGVjdGVkOwoJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKCQkJdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkJaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYKCQkJCSFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9ICk7CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCglmb3IgKCBrZXkgaW4gc3JjICkgewoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgewoJCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCgkJY29udGVudHMgPSBzLmNvbnRlbnRzLAoJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCiAqLwpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7Cgl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKCQljb252ZXJ0ZXJzID0ge30sCgoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOwoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCgl3aGlsZSAoIGN1cnJlbnQgKSB7CgoJCWlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewoJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKCQl9CgoJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCgkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCQl9CgoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkJaWYgKCBjdXJyZW50ICkgewoKCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCQlpZiAoIGN1cnJlbnQgPT09ICIqIiApIHsKCgkJCQljdXJyZW50ID0gcHJldjsKCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7CgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CgoJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0CgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKCQkJCQkJCWlmICggY29udiApIHsKCgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzLnRocm93cyApIHsKCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJcmV0dXJuIHsKCQkJCQkJCQlzdGF0ZTogInBhcnNlcmVycm9yIiwKCQkJCQkJCQllcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudAoJCQkJCQkJfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQl0eXBlOiAiR0VUIiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLAoJCWdsb2JhbDogdHJ1ZSwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czogZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAvXGJ4bWxcYi8sCgkJCWh0bWw6IC9cYmh0bWwvLAoJCQlqc29uOiAvXGJqc29uXGIvCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKCQkJanNvbjogInJlc3BvbnNlSlNPTiIKCQl9LAoKCQkvLyBEYXRhIGNvbnZlcnRlcnMKCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0IjogU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogSlNPTi5wYXJzZSwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJdXJsOiB0cnVlLAoJCQljb250ZXh0OiB0cnVlCgkJfQoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJcmV0dXJuIHNldHRpbmdzID8KCgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKCgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIHRyYW5zcG9ydCwKCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KCQkJY2FjaGVVUkwsCgoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVXJsIGNsZWFudXAgdmFyCgkJCXVybEFuY2hvciwKCgkJCS8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbikKCQkJY29tcGxldGVkLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoKCQkJLy8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsCgkJCXVuY2FjaGVkLAoKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CgkJCQkJalF1ZXJ5LmV2ZW50LAoKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoKCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKCQkJcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAoKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID0KCQkJCQkJCXJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJCXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIGNvbXBsZXRlZCApIHsKCgkJCQkJCQkvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzCgkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CgkJCQkJfQoJCQkJCWRvbmUoIDAsIGZpbmFsVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCgkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgIiIgKQoJCQkucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKTsKCgkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CgkJcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAoJCXMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQl1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTUKCQkJLy8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCwKCQkJLy8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4LwoJCQl0cnkgewoJCQkJdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKCgkJCQkvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5CgkJCQkvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQoJCQkJdXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjsKCQkJCXMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyAiLy8iICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09CgkJCQkJdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiArIHVybEFuY2hvci5ob3N0OwoJCQl9IGNhdGNoICggZSApIHsKCgkJCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbiwKCQkJCS8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWQKCQkJCXMuY3Jvc3NEb21haW4gPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggY29tcGxldGVkICkgewoJCQlyZXR1cm4ganFYSFI7CgkJfQoKCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwoJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCgkJZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCgkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCgkJLy8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvbgoJCWNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrCgkJCXVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApOwoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgKSApIHsKCQkJCWNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgkJCQljYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsICIkMSIgKTsKCQkJCXVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7CgkJCX0KCgkJCS8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMikKCQkJcy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkOwoKCQkvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OCkKCQl9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJgoJCQkoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiApID09PSAwICkgewoJCQlzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCAiKyIgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAoJCQkiQWNjZXB0IiwKCQkJcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArCgkJCQkJKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CgkJCQlzLmFjY2VwdHNbICIqIiBdCgkJKTsKCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCgkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CgkJfQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYKCQkJKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHsKCgkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKCQl9CgoJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJY29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTsKCQlqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTsKCQlqcVhIUi5mYWlsKCBzLmVycm9yICk7CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCgkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50CgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CgkJCX0KCgkJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuIGpxWEhSOwoJCQl9CgoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJY29tcGxldGVkID0gZmFsc2U7CgkJCQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJLy8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9ucwoJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCgkJCQkvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHMKCQkJCWRvbmUoIC0xLCBlICk7CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb21wbGV0ZWQgPSB0cnVlOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImV0YWciICk7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaWYgbm8gY29udGVudAoJCQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7CgoJCQkJLy8gaWYgbm90IG1vZGlmaWVkCgkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKCQkJCX0gZWxzZSB7CgkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwoJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoKCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKCQkJCWlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOwoJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKCQkJCQkJc3RhdHVzID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0CgkJCWpxWEhSLnN0YXR1cyA9IHN0YXR1czsKCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKCgkJCS8vIFN1Y2Nlc3MvRXJyb3IKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKCQkJfSBlbHNlIHsKCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7CgkJCXN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBDb21wbGV0ZQoJCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CgoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCgkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKCQlpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKQoJCXJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCggewoJCQl1cmw6IHVybCwKCQkJdHlwZTogbWV0aG9kLAoJCQlkYXRhVHlwZTogdHlwZSwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2sKCQl9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTsKCX07Cn0gKTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KCB7CgkJdXJsOiB1cmwsCgoJCS8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KQoJCXR5cGU6ICJHRVQiLAoJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQljYWNoZTogdHJ1ZSwKCQlhc3luYzogZmFsc2UsCgkJZ2xvYmFsOiBmYWxzZSwKCQkidGhyb3dzIjogdHJ1ZQoJfSApOwp9OwoKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciB3cmFwOwoKCQlpZiAoIHRoaXNbIDAgXSApIHsKCQkJaWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCQlodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTsKCQkJfQoKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CgoJCQlpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOwoJCQl9CgoJCQl3cmFwLm1hcCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9ICkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7CgkJCX0gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSApOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApOwoJCX0gKTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCAiYm9keSIgKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCX0gKTsKCQlyZXR1cm4gdGhpczsKCX0KfSApOwoKCmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApOwp9OwpqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCXJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7Cn07CgoKCgpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoIGUgKSB7fQp9OwoKdmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7CgoJCS8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCgkJMDogMjAwLAoKCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCS8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCTEyMjM6IDIwNAoJfSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7CgpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwpzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKCmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHsKCXZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKCgkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CglpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoJCQkJdmFyIGksCgkJCQkJeGhyID0gb3B0aW9ucy54aHIoKTsKCgkJCQl4aHIub3BlbigKCQkJCQlvcHRpb25zLnR5cGUsCgkJCQkJb3B0aW9ucy51cmwsCgkJCQkJb3B0aW9ucy5hc3luYywKCQkJCQlvcHRpb25zLnVzZXJuYW1lLAoJCQkJCW9wdGlvbnMucGFzc3dvcmQKCQkJCSk7CgoJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKCQkJCQlmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgewoJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOwoJCQkJfQoKCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCgkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdICkgewoJCQkJCWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCX0KCgkJCQkvLyBTZXQgaGVhZGVycwoJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCX0KCgkJCQkvLyBDYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQljYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID0KCQkJCQkJCQl4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsKCQkJCQkJCQl4aHIuYWJvcnQoKTsKCQkJCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJCQkJLy8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzCgkJCQkJCQkJLy8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZQoJCQkJCQkJCWlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgewoJCQkJCQkJCQljb21wbGV0ZSggMCwgImVycm9yIiApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWNvbXBsZXRlKAoKCQkJCQkJCQkJCS8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CgkJCQkJCQkJCQl4aHIuc3RhdHVzLAoJCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKCQkJCQkJCQkJKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWNvbXBsZXRlKAoJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCQkJCQkJCQkvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpCgkJCQkJCQkJCS8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpCgkJCQkJCQkJCSggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRleHQiICB8fAoJCQkJCQkJCQl0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gInN0cmluZyIgPwoJCQkJCQkJCQkJeyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDoKCQkJCQkJCQkJCXsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAoJCQkJCQkJCQl4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX07CgoJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cwoJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CgkJCQllcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soICJlcnJvciIgKTsKCgkJCQkvLyBTdXBwb3J0OiBJRSA5IG9ubHkKCQkJCS8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CgkJCQkvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzCgkJCQlpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJeGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrOwoJCQkJfSBlbHNlIHsKCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgoJCQkJCQkvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXMKCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCgkJCQkJCQkvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCwKCQkJCQkJCS8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydAoJCQkJCQkJLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKCQkJCQkJCS8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZAoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQkJCWVycm9yQ2FsbGJhY2soKTsKCQkJCQkJCQl9CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoKCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIgKTsKCgkJCQl0cnkgewoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pCgkJCQkJeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwoJCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJdGhyb3cgZTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9ICk7CgoKCgovLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKQpqUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTsKCX0KfSApOwoKLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCggewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgIiArCgkJCSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSApOwoKLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpbgpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJfQp9ICk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJdmFyIHNjcmlwdCwgY2FsbGJhY2s7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewoJCQkJc2NyaXB0ID0galF1ZXJ5KCAiPHNjcmlwdD4iICkucHJvcCggewoJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKCQkJCQlzcmM6IHMudXJsCgkJCQl9ICkub24oCgkJCQkJImxvYWQgZXJyb3IiLAoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKCQkJCQkJc2NyaXB0LnJlbW92ZSgpOwoJCQkJCQljYWxsYmFjayA9IG51bGw7CgkJCQkJCWlmICggZXZ0ICkgewoJCQkJCQkJY29tcGxldGUoIGV2dC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwLCBldnQudHlwZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJKTsKCgkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CgkJCX0sCgkJCWFib3J0OiBmdW5jdGlvbigpIHsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0KCQkJfQoJCX07Cgl9Cn0gKTsKCgoKCnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoIHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwoJCXRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOwoJCXJldHVybiBjYWxsYmFjazsKCX0KfSApOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KCQkJInVybCIgOgoJCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJgoJCQkJKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkKCQkJCQkuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgoJCQkJcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgoJCSk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KCQkJcy5qc29ucENhbGxiYWNrKCkgOgoJCQlzLmpzb25wQ2FsbGJhY2s7CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIGpzb25Qcm9wICkgewoJCQlzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBGb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7CgoJCQkvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXQKCQkJaWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkgewoJCQkJalF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKCgkJCS8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCgkJCX0gZWxzZSB7CgkJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgkJCX0KCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCgkJCWlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgewoJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoKCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDsKCQl9ICk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSApOwoKCgoKLy8gU3VwcG9ydDogU2FmYXJpIDggb25seQovLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50Ci8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLgovLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzcKc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkgewoJdmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICkuYm9keTsKCWJvZHkuaW5uZXJIVE1MID0gIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IjsKCXJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwp9ICkoKTsKCgovLyBBcmd1bWVudCAiZGF0YSIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sCi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwKLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnQKLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwpqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkgewoJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIFtdOwoJfQoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9CgoJdmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0czsKCglpZiAoICFjb250ZXh0ICkgewoKCQkvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKCQkvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbgoJCWlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICk7CgoJCQkvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnQKCQkJLy8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHMKCQkJLy8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSkKCQkJYmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggImJhc2UiICk7CgkJCWJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CgkJCWNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApOwoJCX0gZWxzZSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudDsKCQl9Cgl9CgoJcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7CglzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwoKCS8vIFNpbmdsZSB0YWcKCWlmICggcGFyc2VkICkgewoJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdOwoJfQoKCXBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwp9OwoKCi8qKgogKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCiAqLwpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7Cgl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAoJCXNlbGYgPSB0aGlzLAoJCW9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCglpZiAoIG9mZiA+IC0xICkgewoJCXNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoKCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCWNhbGxiYWNrID0gcGFyYW1zOwoJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJdHlwZSA9ICJQT1NUIjsKCX0KCgkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAoJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CgkJalF1ZXJ5LmFqYXgoIHsKCQkJdXJsOiB1cmwsCgoJCQkvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCgkJCS8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZQoJCQkvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2QKCQkJdHlwZTogdHlwZSB8fCAiR0VUIiwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CgoJCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKCQkJCS8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwoJCQkJalF1ZXJ5KCAiPGRpdj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQgKTsKCgkJLy8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyAiZGF0YSIsICJzdGF0dXMiLCAianFYSFIiCgkJLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLgoJCS8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgImpxWEhSIiwgInN0YXR1cyIsICJlcnJvciIKCQl9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJc2VsZi5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJCX0gKTsKCQl9ICk7Cgl9CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWwoJImFqYXhTdGFydCIsCgkiYWpheFN0b3AiLAoJImFqYXhDb21wbGV0ZSIsCgkiYWpheEVycm9yIiwKCSJhamF4U3VjY2VzcyIsCgkiYWpheFNlbmQiCl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cgl9Owp9ICk7CgoKCgpqUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKCX0gKS5sZW5ndGg7Cn07CgoKCgpqUXVlcnkub2Zmc2V0ID0gewoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOwoKCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlcgoJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7CgkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwoJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0OwoKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCgkJCS8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KQoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoKCQl9IGVsc2UgewoJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKCQl9Cgl9Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJLy8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luCglvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQkvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KCQkJCXRoaXMgOgoJCQkJdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSApOwoJCX0KCgkJdmFyIHJlY3QsIHdpbiwKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApCgkJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkJLy8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYQoJCS8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvcgoJCWlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJLy8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUgoJCXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsKCQlyZXR1cm4gewoJCQl0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LAoJCQlsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQKCQl9OwoJfSwKCgkvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveAoJLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1sgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYywKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJLy8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKCgkJCS8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3QKCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJfSBlbHNlIHsKCQkJb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCgkJCS8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50CgkJCS8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYKCQkJCSggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJgoJCQkJalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlOwoJCQl9CgkJCWlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luCgkJCQlwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpOwoJCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUgKTsKCQkJfQoJCX0KCgkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwoJCXJldHVybiB7CgkJCXRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKCQl9OwoJfSwKCgkvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKCS8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KCS8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvdwoJLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAoJLy8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZgoJLy8KCS8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcwoJLy8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuCgkvLwoJLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OwoKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoKCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CgkJfSApOwoJfQp9ICk7CgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gInBhZ2VZT2Zmc2V0IiA9PT0gcHJvcDsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CgoJCQkvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3MKCQkJdmFyIHdpbjsKCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoJCQkJd2luID0gZWxlbTsKCQkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7CgkJCX0KCgkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCwKCQkJCQl0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXQKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApOwoJfTsKfSApOwoKLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OQovLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgovLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDcKLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUKalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCgkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCgkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7CgkJCX0KCQl9CgkpOwp9ICk7CgoKLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LAoJCWZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgewoKCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKCQkJCXZhciBkb2M7CgoJCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KQoJCQkJCXJldHVybiBmdW5jTmFtZS5pbmRleE9mKCAib3V0ZXIiICkgPT09IDAgPwoJCQkJCQllbGVtWyAiaW5uZXIiICsgbmFtZSBdIDoKCQkJCQkJZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAoJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoKCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApOwoJCX07Cgl9ICk7Cn0gKTsKCgpqUXVlcnkuZWFjaCggKCAiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIgKS5zcGxpdCggIiAiICksCglmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewoJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwoJfQp9ICk7CgoKCgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPwoJCQl0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6CgkJCXRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0KfSApOwoKLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55Ci8vIGFyZ3VtZW50cy4KLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKQovLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb24KalF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJdmFyIHRtcCwgYXJncywgcHJveHk7CgoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJdG1wID0gZm5bIGNvbnRleHQgXTsKCQljb250ZXh0ID0gZm47CgkJZm4gPSB0bXA7Cgl9CgoJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCglpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkgewoJCXJldHVybiB1bmRlZmluZWQ7Cgl9CgoJLy8gU2ltdWxhdGVkIGJpbmQKCWFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Cgl9OwoKCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJcmV0dXJuIHByb3h5Owp9OwoKalF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkgewoJaWYgKCBob2xkICkgewoJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCX0gZWxzZSB7CgkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7Cgl9Cn07CmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKalF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7CmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lOwpqUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93OwpqUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlOwpqUXVlcnkudHlwZSA9IHRvVHlwZTsKCmpRdWVyeS5ub3cgPSBEYXRlLm5vdzsKCmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkgewoKCS8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvCgkvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpCgkvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKQoJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CglyZXR1cm4gKCB0eXBlID09PSAibnVtYmVyIiB8fCB0eXBlID09PSAic3RyaW5nIiApICYmCgoJCS8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzICgiIikKCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQoJCS8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgoJCSFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTsKfTsKCgoKCi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgovLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAovLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQovLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoKLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhbgovLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQovLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCgppZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5OwoJfSApOwp9CgoKCgp2YXIKCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoKCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfJCA9IHdpbmRvdy4kOwoKalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cuJCA9IF8kOwoJfQoKCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CgkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Cgl9CgoJcmV0dXJuIGpRdWVyeTsKfTsKCi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1ECi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQppZiAoICFub0dsb2JhbCApIHsKCXdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKfQoKCgoKcmV0dXJuIGpRdWVyeTsKfSApOwo=" >
tail j=5412 line=
tail j=5413 line= </script>
tail j=5414 line=
tail j=5415 line=<!-- <script type="text/javascript" src="js/custom.js"></script> -->
tail j=5416 line=<!-- <script type="text/javascript" src="js/custom.js"></script> -->
tail j=5417 line=
tail j=5418 line=
tail j=5419 line= <script id="script_file" type="text/javascript">
tail j=5420 line= $(function() {
tail j=5421 line=// grab the file input and bind a change event onto it
tail j=5422 line= $('#file').bind("change", function() {
tail j=5423 line=// new html5 formdata object.
tail j=5424 line= var formData = new FormData();
tail j=5425 line=// for each entry, add to formdata to later access via $_FILES["file" + i]
tail j=5426 line= for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
tail j=5427 line= formData.append("file" + i, document.getElementById('file').files[i]);
tail j=5428 line= }
tail j=5429 line=
tail j=5430 line=//send formdata to server-side
tail j=5431 line= $.ajax({
tail j=5432 line=// url: "file-upload.php", // our php file
tail j=5433 line=// url: "ka1_fileupload.php", // our php file
tail j=5434 line=// nurl: "http://ka1/ka1.php?q=up", // our php file
tail j=5435 line=// url: "/kup.php", // our php file
tail j=5436 line=// url: "/ka1_up.php", // our php file
tail j=5437 line=// url: "/ka1.php?q=kup", // our php file
tail j=5438 line=// url: "/ko0.php?q=kup", // our php file
tail j=5439 line=// url: "/ko1.php?q=kup", // our php file
tail j=5440 line= url: "/ko2.php?q=kup", // our php file
tail j=5441 line=// bugs url: "10.0.0.112:/ka1.php?q=up", // our php file
tail j=5442 line= type: 'post',
tail j=5443 line= data: formData,
tail j=5444 line= dataType: 'html', // we return html from our php file
tail j=5445 line= async: true,
tail j=5446 line= processData: false, // tell jQuery not to process the data
tail j=5447 line= contentType: false, // tell jQuery not to set contentType
tail j=5448 line= success : function(data) {
tail j=5449 line= $('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
tail j=5450 line= $('#upload-result .alert').append(data);
tail j=5451 line= },
tail j=5452 line= error : function(request) {
tail j=5453 line= console.log(request.responseText);
tail j=5454 line= }
tail j=5455 line= });
tail j=5456 line= });
tail j=5457 line= });
tail j=5458 line= </script id="script_file" >
tail j=5459 line=
tail j=5460 line= <hr color=white>
tail j=5461 line= <hr color=black>
tail j=5462 line= <div id='editableDiv' contenteditable='true'>paste
tail j=5463 line= </div id="editableDiv" >
tail j=5464 line= <hr color=black>
tail j=5465 line= <hr color=white>
tail j=5466 line= <hr color=black>
tail j=5467 line= <div id="div_ffpaste" contenteditable='true'>ffpaste
tail j=5468 line= </div id="div_ffpaste">
tail j=5469 line= <hr color=black>
tail j=5470 line= <hr color=white>
tail j=5471 line=
tail j=5472 line= <script id="script_clipboard" >
tail j=5473 line= function handlePaste (e) {
tail j=5474 line= var clipboardData, pastedData;
tail j=5475 line=
tail j=5476 line=// Stop data actually being pasted into div
tail j=5477 line= e.stopPropagation();
tail j=5478 line= e.preventDefault();
tail j=5479 line=
tail j=5480 line=// Get pasted data via clipboard API
tail j=5481 line= clipboardData = e.clipboardData || window.clipboardData;
tail j=5482 line= pastedData = clipboardData.getData('Text');
tail j=5483 line=
tail j=5484 line=// Do whatever with pasteddata
tail j=5485 line= alert(pastedData);
tail j=5486 line= }
tail j=5487 line=
tail j=5488 line= document.getElementById('editableDiv').addEventListener('paste', handlePaste);
tail j=5489 line= </script id="script_clipboard" >
tail j=5490 line=
tail j=5491 line=
tail j=5492 line= <script id="script_clipboard_ff" >
tail j=5493 line= function handlepaste_ff (e) {
tail j=5494 line= var types, pastedData, savedContent;
tail j=5495 line=
tail j=5496 line=// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
tail j=5497 line= if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {
tail j=5498 line=
tail j=5499 line=// Check for 'text/html' in types list. See abligh's answer below for deatils on
tail j=5500 line=// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
tail j=5501 line=// Safari/Edge don't advertise HTML data even if it is available
tail j=5502 line= types = e.clipboardData.types;
tail j=5503 line= if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {
tail j=5504 line=
tail j=5505 line=// Extract data and pass it to callback
tail j=5506 line= pastedData = e.clipboardData.getData('text/html');
tail j=5507 line=// processPaste(editableDiv, pastedData);
tail j=5508 line= processPaste_ff(editableDiv, pastedData);
tail j=5509 line=
tail j=5510 line=// Stop the data from actually being pasted
tail j=5511 line= e.stopPropagation();
tail j=5512 line= e.preventDefault();
tail j=5513 line= return false;
tail j=5514 line= }
tail j=5515 line= }
tail j=5516 line=
tail j=5517 line=// Everything else: Move existing element contents to a DocumentFragment for safekeeping
tail j=5518 line= savedContent = document.createDocumentFragment();
tail j=5519 line= while(editableDiv.childNodes.length > 0) {
tail j=5520 line= savedContent.appendChild(editableDiv.childNodes[0]);
tail j=5521 line= }
tail j=5522 line=
tail j=5523 line=// Then wait for browser to paste content into it and cleanup
tail j=5524 line= waitForPastedData(editableDiv, savedContent);
tail j=5525 line= return true;
tail j=5526 line= }
tail j=5527 line=
tail j=5528 line= function waitForPastedData (elem, savedContent) {
tail j=5529 line=
tail j=5530 line=// If data has been processes by browser, process it
tail j=5531 line= if (elem.childNodes && elem.childNodes.length > 0) {
tail j=5532 line=
tail j=5533 line=// Retrieve pasted content via innerHTML
tail j=5534 line=// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
tail j=5535 line= var pastedData = elem.innerHTML;
tail j=5536 line=
tail j=5537 line=// Restore saved content
tail j=5538 line= elem.innerHTML = "";
tail j=5539 line= elem.appendChild(savedContent);
tail j=5540 line=
tail j=5541 line=// Call callback
tail j=5542 line= processPaste_ff(elem, pastedData);
tail j=5543 line= }
tail j=5544 line=
tail j=5545 line=// Else wait 20ms and try again
tail j=5546 line= else {
tail j=5547 line= setTimeout(function () {
tail j=5548 line= waitForPastedData(elem, savedContent)
tail j=5549 line= }, 20);
tail j=5550 line= }
tail j=5551 line= }
tail j=5552 line=
tail j=5553 line= function processPaste_ff (elem, pastedData) {
tail j=5554 line=// Do whatever with gathered data;
tail j=5555 line= alert(pastedData);
tail j=5556 line= elem.focus();
tail j=5557 line= }
tail j=5558 line=
tail j=5559 line=// Modern browsers. Note: 3rd argument is required for Firefox <= 6
tail j=5560 line= if (editableDiv.addEventListener) {
tail j=5561 line= editableDiv.addEventListener('paste', handlepaste, false);
tail j=5562 line= }
tail j=5563 line=// IE <= 8
tail j=5564 line= else {
tail j=5565 line= editableDiv.attachEvent('onpaste', handlepaste);
tail j=5566 line= }
tail j=5567 line=
tail j=5568 line= $(document).on('paste','[contenteditable]',function(e) {
tail j=5569 line= e.preventDefault();
tail j=5570 line= var text = (e.originalEvent || e).clipboardData.getData('text/plain');
tail j=5571 line= window.document.execCommand('insertText', false, text);
tail j=5572 line= });
tail j=5573 line= </script id="script_clipboard_ff" >
tail j=5574 line=
tail j=5575 line= <script id="script_clipboard_jskit" >
tail j=5576 line= function getSelectionText(){
tail j=5577 line= var selectedText = ""
tail j=5578 line= if (window.getSelection){ // all modern browsers and IE9+
tail j=5579 line= selectedText = window.getSelection().toString()
tail j=5580 line= }
tail j=5581 line= return selectedText
tail j=5582 line= }
tail j=5583 line=
tail j=5584 line=
tail j=5585 line= document.addEventListener('mouseup', function(){
tail j=5586 line= var thetext = getSelectionText()
tail j=5587 line= if (thetext.length > 0){ // check there's some text selected
tail j=5588 line= console.log(thetext) // logs whatever textual content the user has selected on the page
tail j=5589 line= }
tail j=5590 line= }, false)
tail j=5591 line=
tail j=5592 line= function copySelectionText(){
tail j=5593 line= var copysuccess // var to check whether execCommand successfully executed
tail j=5594 line= try{
tail j=5595 line= copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
tail j=5596 line= }
tail j=5597 line= catch(e){
tail j=5598 line= copysuccess = false
tail j=5599 line= }
tail j=5600 line= return copysuccess
tail j=5601 line= }
tail j=5602 line=
tail j=5603 line= </script id="script_clipboard_jskit" >
tail j=5604 line=
tail j=5605 line=<!--
tail j=5606 line= <div name="div_dd" id="div_dd" hidden>
tail j=5607 line= <div id="drop">
tail j=5608 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=5609 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=5610 line= <img height=200 width=300
tail j=5611 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=5612 line= </a>
tail j=5613 line= </div>
tail j=5614 line=
tail j=5615 line= <div id="drag"> jtfdc:<br />
tail j=5616 line= <img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=5617 line=
tail j=5618 line= <div class="drg"><h1>konet llc </h1>
tail j=5619 line= <pre>timejask jkwii</pre>
tail j=5620 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=5621 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=5622 line= <pre>timesak skwii</pre>
tail j=5623 line= </div>
tail j=5624 line=
tail j=5625 line= <div class="drg"><h1>jtf29 </h1>
tail j=5626 line= <a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=5627 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=5628 line= </a>
tail j=5629 line= </div>
tail j=5630 line=
tail j=5631 line=
tail j=5632 line= <div class="drg"><h1>dogheads</h1>
tail j=5633 line= <div id="div_jtf_vid5">
tail j=5634 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=5635 line= <source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5636 line= </video>
tail j=5637 line= </div>
tail j=5638 line= </div>
tail j=5639 line=
tail j=5640 line= <div class="drg"><h1>jtfdc night court lights action 3720</h1>
tail j=5641 line= <div id="div_vid">
tail j=5642 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=5643 line= <source src="index_avril.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5644 line= <source src="index_avril.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=5645 line= </video>
tail j=5646 line= </div>
tail j=5647 line= </div>
tail j=5648 line= </div>
tail j=5649 line= </div>
tail j=5650 line= -->
tail j=5651 line=
tail j=5652 line= <script id="script_ytlist_load" >
tail j=5653 line= function ytlist_load() {
tail j=5654 line= j=0;;
tail j=5655 line=
tail j=5656 line= ytlist[j++] = 'ko0|ko0|ko0.us|';
tail j=5657 line= ytlist[j++] = 'ko2|ko2|ko2.us|';
tail j=5658 line= ytlist[j++] = '|duckduck_go|https://duckduckgo.com/';
tail j=5659 line= ytlist[j++] = '|jpl_curiosity|https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2287';
tail j=5660 line= ytlist[j++] = '|jpl_insight|https://mars.nasa.gov/insight/';
tail j=5661 line= ytlist[j++] = '|jpl_bennu|http://pluto.jhuapl.edu/';
tail j=5662 line= ytlist[j++] = '|jpl_osirisrex_thule|https://www.asteroidmission.org/';
tail j=5663 line= ytlist[j++] = '|whatsitmean|http://whatdoesitmean.com/|';
tail j=5664 line= ytlist[j++] = '|dailymail|https://www.dailymail.co.uk/ushome/index.html';
tail j=5665 line= ytlist[j++] = '|zerohedge|http://zerohedge.com/';
tail j=5666 line= ytlist[j++] = 'bluehost|http://bluehost.com/track/konet/ko2.us|';
tail j=5667 line= ytlist[j++] = '|webb|webb_george|https://www.youtube.com/results?search_query=webb_george';
tail j=5668 line= ytlist[j++] = '|preppy|preppy_kitty|https://www.youtube.com/results?search_query=prepper+kitty';
tail j=5669 line= ytlist[j++] = '|quinn|quinn_micheals||https://www.youtube.com/user/quinnmichaels';
tail j=5670 line= ytlist[j++] = '|kennedy|kennedy|https://www.youtube.com/channel/UCl609oqTRx-zBZ4vPfN2mqA';
tail j=5671 line= ytlist[j++] = '|stropyme|stroppy_me|https://www.youtube.com/results?search_query=stroppy+me|';
tail j=5672 line= ytlist[j++] = '|outerlite|outer_light|https://www.youtube.com/results?search_query=outer+light|';
tail j=5673 line= ytlist[j++] = '|munder|munder|https://www.youtube.com/user/1Munder1|';
tail j=5674 line= ytlist[j++] = '|dahboo77|dahboo77|https://www.youtube.com/results?search_query=dahboo77';
tail j=5675 line= ytlist[j++] = '|secureteam|secureteam10|https://www.youtube.com/results?search_query=secureteam10';
tail j=5676 line= ytlist[j++] = '|vlad96|vlad9t|https://www.youtube.com/results?search_query=vlad9t';
tail j=5677 line= ytlist[j++] = '|newearth|newearth|https://www.youtube.com/results?search_query=new+earth';
tail j=5678 line= ytlist[j++] = '|forester|forester_brian|https://www.youtube.com/results?search_query=brian+forrester';
tail j=5679 line= ytlist[j++] = '|hoagland|hoagland|https://www.youtube.com/results?search_query=hoagland+richard';
tail j=5680 line= ytlist[j++] = '|levenda||levenda|https://www.youtube.com/results?search_query=levenda+peter|';
tail j=5681 line= ytlist[j++] = 'borealus|borealus_forum|https://www.youtube.com/results?search_query=borealis+forum';
tail j=5682 line= ytlist[j++] = '|earthfiles|howe_linda_moultan|https://www.youtube.com/results?search_query=howe+linda';
tail j=5683 line= ytlist[j++] = '|newsbud|https://www.youtube.com/results?search_query=newsbud|';
tail j=5684 line= ytlist[j++] = '|lional|lional_nation|https://www.youtube.com/results?search_query=lionel+nation|';
tail j=5685 line= ytlist[j++] = '|gooman|jason_goodman|https://www.youtube.com/channel/UC8Cl9QaRtuW9CNjP7pP4BBQ|';
tail j=5686 line= ytlist[j++] = '|cernovich|cernovich|https://www.youtube.com/results?search_query=cernovich|';
tail j=5687 line= ytlist[j++] = '|conte|conte_marcus|https://www.youtube.com/results?search_query=conte+marcus|';
tail j=5688 line= ytlist[j++] = '|fulford|fulford_benjamin|https://www.youtube.com/results?search_query=fulford+benjamin';
tail j=5689 line= ytlist[j++] = '||Julijana Sarac I Put A Spell On You|https://www.youtube.com/watch?v=jGhA2_ZcRVY&list=RDjGhA2_ZcRVY&start_radio=1';
tail j=5690 line=
tail j=5691 line= ytlist[j++] = 'redding|dreams_to_remeber|pn://www.youtube.com/watch?v=8UOf6kngJGw&list=RD8UOf6kngJGw&start_radio=1';
tail j=5692 line=
tail j=5693 line= ytlist[j++] = '|haggard|A place to fall apart Merle Haggard Janie Fricke|https://www.youtube.com/watch?v=iXPdB1ykWHE&list=RDiXPdB1ykWHE&start_radio=1|';
tail j=5694 line=
tail j=5695 line= ytlist[j++] = '|dreamers|Freddie & The Dreamers ~ I Understand/Auld Lang Syne|http://www.youtube.com/watch?v=Hy0AGS13dqc';
tail j=5696 line=
tail j=5697 line= ytlist[j++] = '|dreamers|telln_you_now_dreamers|https://www.youtube.com/watch?v=Qu3Yk_0oRy0&start_radio=1&list=RDQu3Yk_0oRy0';
tail j=5698 line=
tail j=5699 line= ytlist[j++] = '|drezmers|hog4u|https://www.youtube.com/watch?v=911rMO4l0sA';
tail j=5700 line=
tail j=5701 line= ytlist[j++] = '|cher|sony_cher-gotubabe|https://www.youtube.com/watch?v=Vp2Du8j2_L0';
tail j=5702 line=
tail j=5703 line= ytlist[j++] = '|remR|Everybody Hurts (Live at Glastonbury 2003) HQ|http://www.youtube.com/watch?v=NLlOeGeVih4';
tail j=5704 line=
tail j=5705 line= ytlist[j++] = '|once|once_upontime_west|https://www.youtube.com/watch?v=kOy6M_X2MO8';
tail j=5706 line=
tail j=5707 line= ytlist[j++] = '|pale|procol_harme_litershade_denmark|https://www.youtube.com/watch?v=St6jyEFe5WM';
tail j=5708 line=
tail j=5709 line= ytlist[j++] = '|pale|Procol Harum Whiter Shade of Pale 2verses|http://www.youtube.com/watch?v=vIWCSrG1d-Y';
tail j=5710 line=
tail j=5711 line= ytlist[j++] = 'deadsouth| - In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY|';
tail j=5712 line= ytlist[j++] = '|pale|shadofpale_ships|https://www.youtube.com/watch?v=PYBqv3NIqho';
tail j=5713 line=
tail j=5714 line= ytlist[j++] = '|caro| nightlikethis|https://www.youtube.com/watch?v=Fc6izYdLhNE';
tail j=5715 line=
tail j=5716 line= ytlist[j++] = '|waits|time_cover_guitar|http://www.youtube.com/watch?v=uja4SHnfogo';
tail j=5717 line=
tail j=5718 line= ytlist[j++] = 'morrison|4seasons_back_on_top|https://www.youtube.com/watch?v=7fjTY_ABMj0&list=PL5A2209DE63BA79B8';
tail j=5719 line=
tail j=5720 line= ytlist[j++] = 'gurumal|delta_Delta Bayini|https://www.youtube.com/watch?v=oi6zbPjtO6I';
tail j=5721 line=
tail j=5722 line= ytlist[j++] = '|cohen|youb_you_got_me_singin|https://www.youtube.com/watch?v=3sFsT9vT6Fo';
tail j=5723 line=
tail j=5724 line= ytlist[j++] = 'dreamers|iunderst|https://www.youtube.com/watch?v=yo-1Des8i5M&list=PL9DF20D3DD3895F1C&index=4';
tail j=5725 line=
tail j=5726 line= ytlist[j++] = 'sledge|dark_end_of_the_street|https://www.youtube.com/watch?v=Gj3UdRmhgvM';
tail j=5727 line=
tail j=5728 line= ytlist[j++] = 'oesch|bavaria_yodl| https://www.youtube.com/watch?v=hVjNxV7qM90';
tail j=5729 line=
tail j=5730 line= ytlist[j++] = 'hagardlife_isgone2hellhttps://www.youtube.com/watch?v=iXPdB1ykWHE&start_radio=1&list=RDMMiXPdB1ykWHE';
tail j=5731 line=
tail j=5732 line= ytlist[j++] = 'claypton|xmas| https://www.youtube.com/watch?v=R7iKUCWTNWc&list=RDR7iKUCWTNWc&start_radio=1';
tail j=5733 line=
tail j=5734 line= ytlist[j++] = 'Guadalupe Pineda|Historia De Un Amor|https://www.youtube.com/watch?v=HzjE33U_gy8';
tail j=5735 line=
tail j=5736 line= ytlist[j++] = 'deadsouth|In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY';
tail j=5737 line=
tail j=5738 line= ytlist[j++] = 'morisson|4seasons|https://www.youtube.com/watch?v=zbxUXAMUeGk&list=PLFCFB9B1A93E89756&index=10';
tail j=5739 line=
tail j=5740 line= ytlist[j++] = 'morisan|playhousedown|https://www.youtube.com/watch?v=b0jqe40gmH4&list=PLFCFB9B1A93E89756&index=5';
tail j=5741 line=
tail j=5742 line= ytlist[j++] = '|van_morison|end_ofthe_land|https://www.youtube.com/watch?v=dui7_N0g_VY&index=6&list=PLFCFB9B1A93E89756';
tail j=5743 line=
tail j=5744 line= ytlist[j++] = '|vanloss|stariway|https://www.youtube.com/watch?v=gCE0MapWKJ8&index=7&list=PLFCFB9B1A93E89756';
tail j=5745 line=
tail j=5746 line= ytlist[j++] = 'fureys|last lovesong| https://www.youtube.com/watch?v=yNFiD1ZQZLU';
tail j=5747 line=
tail j=5748 line= ytlist[j++] = '|rush|cirlce_game|https://www.youtube.com/watch?v=q_C_rOOdXxs';
tail j=5749 line=
tail j=5750 line= ytlist[j++] = '|rush|circlgam2|https://www.youtube.com/watch?v=9yN-6PbqAPM';
tail j=5751 line=
tail j=5752 line= ytlist[j++] = 'rush|remberbergame| https://www.youtube.com/watch?v=xMFtm02rgF0';
tail j=5753 line=
tail j=5754 line= ytlist[j++] = 'lucinda_williams|broken_butterflies|https://www.youtube.com/watch?v=gLQ23LLtKJk';
tail j=5755 line=
tail j=5756 line=
tail j=5757 line= ytlist[j++] = 'kou|python|https://www.youtube.com/watch?v=rfscVS0vtbw';
tail j=5758 line=
tail j=5759 line= ytlist[j++] = 'kou|blender28|https://www.youtube.com/watch?v=jBqYTgaFDxU';
tail j=5760 line=
tail j=5761 line= ytlist[j++] = 'kou|html|https://www.youtube.com/watch?v=pQN-pnXPaVg';
tail j=5762 line=
tail j=5763 line= ytlist[j++] = 'kou|sqlite3|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5764 line=
tail j=5765 line=
tail j=5766 line= ytlist[j++] = 'kou|visual_studio|https://www.youtube.com/watch?v=fnPhJHN0jTE';
tail j=5767 line=
tail j=5768 line= ytlist[j++] = 'kou|visual_studio_py|https://www.youtube.com/watch?v=72Alzsz8RyI';
tail j=5769 line=
tail j=5770 line=
tail j=5771 line= ytlist[j++] = 'kou|php|https://www.youtube.com/watch?v=OK_JCtrrv-c';
tail j=5772 line=
tail j=5773 line= ytlist[j++] = 'kou|tensor|https://www.youtube.com/watch?v=tYYVSEHq-io';
tail j=5774 line=
tail j=5775 line= ytlist[j++] = 'kou|go|https://www.youtube.com/watch?v=5PTXdR8hLlQ';
tail j=5776 line=
tail j=5777 line= ytlist[j++] = 'kou|vi|https://www.youtube.com/watch?v=HMpB28l1sLc';
tail j=5778 line=
tail j=5779 line= ytlist[j++] = 'kou|tech_ingredients_speakers|https://www.youtube.com/watch?v=zdkyGDqU7xA';
tail j=5780 line=
tail j=5781 line= ytlist[j++] = 'kou|tech_ingredients_labshop|https://www.youtube.com/watch?v=nZefdoHmtJo';
tail j=5782 line=
tail j=5783 line= ytlist[j++] = 'kou|tech_ingredients_magnetics|https://www.youtube.com/watch?v=LS3GQk9ETRU';
tail j=5784 line=
tail j=5785 line= ytlist[j++] = 'kou|3dprint|https://www.youtube.com/watch?v=3LBTkLsjHGQ';
tail j=5786 line=
tail j=5787 line= ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5788 line=
tail j=5789 line= ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5790 line=
tail j=5791 line= alert( "BUGS_4715 ytlist len="+j );
tail j=5792 line= }
tail j=5793 line=
tail j=5794 line= </script id="script_ytlist_load" >
tail j=5795 line=
tail j=5796 line=
tail j=5797 line=<!---
tail j=5798 line= <script id="script_dragable" type="text/javascript">
tail j=5799 line=
tail j=5800 line= $(document).ready(function() {
tail j=5801 line=// sets the draggable
tail j=5802 line= $('#drag .drg').draggable({
tail j=5803 line= cursor: 'move', // sets the cursor apperance
tail j=5804 line= revert: 'valid'
tail j=5805 line= });
tail j=5806 line=
tail j=5807 line=
tail j=5808 line=// sets droppable
tail j=5809 line=// after the draggable is droped, hides it with a hide() effect
tail j=5810 line= $('#drop').droppable({
tail j=5811 line= drop: function(event, ui) {
tail j=5812 line= ui.draggable.hide(1000);
tail j=5813 line=
tail j=5814 line= }
tail j=5815 line= });
tail j=5816 line=
tail j=5817 line=// after the draggable is droped, hides it with a hide() effect
tail j=5818 line= $('#drop1').droppable({
tail j=5819 line= drop: function(event, ui) {
tail j=5820 line= ui.draggable.hide(1000);
tail j=5821 line= }
tail j=5822 line= });
tail j=5823 line=
tail j=5824 line= $('#drop2').droppable({
tail j=5825 line= drop: function(event, ui) {
tail j=5826 line=// after the draggable is droped, hides it with a hide() effect
tail j=5827 line= ui.draggable.hide(1000);
tail j=5828 line= }
tail j=5829 line= });
tail j=5830 line=
tail j=5831 line=// when the "#sw" element (inside the "#drop") is clicked
tail j=5832 line=// show the items with class "drg", contained in "#drag"
tail j=5833 line=// $('#drag .drg').slideDown(1000);
tail j=5834 line= $('#drop #sw').click(function(){
tail j=5835 line= var url = "https://ka6//ko_center/ko_center.php?q=jqui/dragdrop1/"
tail j=5836 line= $(location).attr('href',url);
tail j=5837 line= });
tail j=5838 line= });
tail j=5839 line= </script>
tail j=5840 line= -->
tail j=5841 line=<!--
tail j=5842 line=
tail j=5843 line= <style type="text/css">
tail j=5844 line= #drop {
tail j=5845 line= width:200px;
tail j=5846 line= height:150px;
tail j=5847 line= margin:3px auto;
tail j=5848 line= background:#eddaa8;
tail j=5849 line= font-size:16px;
tail j=5850 line= }
tail j=5851 line= #drop #sw { text-decoration:underline; cursor:pointer; }
tail j=5852 line= #drag {
tail j=5853 line=// width:450px;
tail j=5854 line=// height:180px;
tail j=5855 line= width:50px;
tail j=5856 line= height:50px;
tail j=5857 line=
tail j=5858 line= margin:12px auto;
tail j=5859 line= border:1px solid darkslategrey;
tail j=5860 line=// border:1px solid silver;
tail j=5861 line= font-size:16px;
tail j=5862 line= }
tail j=5863 line= #drag .drg { margin:10px 12px; }
tail j=5864 line= #drag div.drg {
tail j=5865 line= width:150px;
tail j=5866 line= height:50px;
tail j=5867 line= background:#07da08;
tail j=5868 line= border:2px solid lightblue;
tail j=5869 line= }
tail j=5870 line= </style>
tail j=5871 line= -->
tail j=5872 line=
tail j=5873 line=
tail j=5874 line=
tail j=5875 line=<!--
tail j=5876 line= <div name="div_dd" id="div_dd" hidden>
tail j=5877 line= <div id="drop">
tail j=5878 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=5879 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=5880 line= <img height=200 width=300
tail j=5881 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=5882 line= </a>
tail j=5883 line= </div>
tail j=5884 line= -->
tail j=5885 line=<!--
tail j=5886 line= <div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
tail j=5887 line= <img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=5888 line=
tail j=5889 line= <div class="drg"><h1>konet llc </h1>
tail j=5890 line= <pre>timejask jkwii</pre>
tail j=5891 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=5892 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=5893 line= <pre>timesak skwii</pre>
tail j=5894 line= </div>
tail j=5895 line=
tail j=5896 line= <div class="drg"><h1>jtf29 </h1>
tail j=5897 line= <a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=5898 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=5899 line= </a>
tail j=5900 line= </div>
tail j=5901 line=
tail j=5902 line=
tail j=5903 line= <div class="drg"><h1>dogheads</h1>
tail j=5904 line= <div id="div_jtf_vid5">
tail j=5905 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=5906 line= <source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5907 line= </video>
tail j=5908 line= </div>
tail j=5909 line= </div>
tail j=5910 line=
tail j=5911 line= <div class="drg"><h1>jtfdc night court lights action 3720</h1>
tail j=5912 line= <div id="div_vid">
tail j=5913 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=5914 line= <source src="index_avril.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5915 line= <source src="index_avril.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=5916 line= </video>
tail j=5917 line= </div>
tail j=5918 line= </div>
tail j=5919 line= </div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
tail j=5920 line= </div>
tail j=5921 line= -->
tail j=5922 line=
tail j=5923 line= <div id="myCanvas_jkwii" ></div>
tail j=5924 line=
tail j=5925 line=<!--
tail j=5926 line= <script id="script_js_bb_onload" type='text/javascript'>
tail j=5927 line= window.onload = function() {
tail j=5928 line=// startup();
tail j=5929 line= var myCanvas = document.getElementById('myCanvas_jkwii');
tail j=5930 line= var ctx = myCanvas.getContext('2d');
tail j=5931 line=
tail j=5932 line= myCanvas.width = window.innerWidth; myCanvas.height = window.innerHeight;
tail j=5933 line= myCanvas.width = window.innerWidth / 2; myCanvas.height = window.innerHeight / 2 ;
tail j=5934 line= ctx.fillStyle='black'
tail j=5935 line= ctx.fillStyle='white'
tail j=5936 line= ctx.fillStyle='blue'
tail j=5937 line= ctx.fillRect(0, 0, myCanvas.width, myCanvas.height);
tail j=5938 line= }
tail j=5939 line= </script id="script_js_bb_onload" >
tail j=5940 line=
tail j=5941 line= <script id="script_js_bb_mouse" >
tail j=5942 line=// Mouse Event Handlers
tail j=5943 line= if(myCanvas){
tail j=5944 line= var isDown = false;
tail j=5945 line= var canvasX, canvasY;
tail j=5946 line= ctx.lineWidth = 5;
tail j=5947 line=
tail j=5948 line=
tail j=5949 line= $(myCanvas)
tail j=5950 line= .mousedown(function(e){
tail j=5951 line= isDown = true;
tail j=5952 line= ctx.beginPath();
tail j=5953 line= canvasX = e.pageX - myCanvas.offsetLeft;
tail j=5954 line= canvasY = e.pageY - myCanvas.offsetTop;
tail j=5955 line= ctx.moveTo(canvasX, canvasY);
tail j=5956 line= })
tail j=5957 line= .mousemove(function(e){
tail j=5958 line= if(isDown !== false) {
tail j=5959 line= canvasX = e.pageX - myCanvas.offsetLeft;
tail j=5960 line= canvasY = e.pageY - myCanvas.offsetTop;
tail j=5961 line= ctx.lineTo(canvasX, canvasY);
tail j=5962 line=// ctx.strokeStyle = '#000';
tail j=5963 line= ctx.strokeStyle = '#fff';
tail j=5964 line=
tail j=5965 line= ctx.stroke();
tail j=5966 line= }
tail j=5967 line= })
tail j=5968 line= .mouseup(function(e){
tail j=5969 line= isDown = false;
tail j=5970 line= ctx.closePath();
tail j=5971 line= });
tail j=5972 line= }
tail j=5973 line=
tail j=5974 line=// Touch Events Handlers
tail j=5975 line= draw = {
tail j=5976 line= started: false,
tail j=5977 line= start: function(evt) {
tail j=5978 line=
tail j=5979 line= ctx.beginPath();
tail j=5980 line= ctx.moveTo(
tail j=5981 line= evt.touches[0].pageX,
tail j=5982 line= evt.touches[0].pageY
tail j=5983 line= );
tail j=5984 line=
tail j=5985 line= this.started = true;
tail j=5986 line=
tail j=5987 line= },
tail j=5988 line= move: function(evt) {
tail j=5989 line=
tail j=5990 line= if (this.started) {
tail j=5991 line= ctx.lineTo(
tail j=5992 line= evt.touches[0].pageX,
tail j=5993 line= evt.touches[0].pageY
tail j=5994 line= );
tail j=5995 line=
tail j=5996 line= ctx.strokeStyle = '#000';
tail j=5997 line= ctx.lineWidth = 5;
tail j=5998 line= ctx.stroke();
tail j=5999 line= }
tail j=6000 line=
tail j=6001 line= },
tail j=6002 line= end: function(evt) {
tail j=6003 line= this.started = false;
tail j=6004 line= }
tail j=6005 line= };
tail j=6006 line=
tail j=6007 line=// Touch Events
tail j=6008 line= myCanvas.addEventListener('touchstart', draw.start, false);
tail j=6009 line= myCanvas.addEventListener('touchend', draw.end, false);
tail j=6010 line= myCanvas.addEventListener('touchmove', draw.move, false);
tail j=6011 line=
tail j=6012 line=// Disable Page Move
tail j=6013 line= document.body.addEventListener('touchmove',function(evt){
tail j=6014 line= evt.preventDefault();
tail j=6015 line= },false);
tail j=6016 line= };
tail j=6017 line= </script id="script_js_bb_mouse" >
tail j=6018 line=
tail j=6019 line= <script id="script_js_bb">
tail j=6020 line=// var c5 = document.getElementById("c5");
tail j=6021 line=// var c5_context = c5.getContext("2d");
tail j=6022 line= var c5 = document.getElementById("myCanvas");
tail j=6023 line= var c5_context = c5.getContext("2d");
tail j=6024 line=
tail j=6025 line= var dragon = new Image();
tail j=6026 line= dragon.src = 'dragon.png';
tail j=6027 line= var img = new Image();
tail j=6028 line= img.src = 'dragon.png';
tail j=6029 line=
tail j=6030 line= function draw_img() {
tail j=6031 line= c5_context.drawImage(img, 100, 5);
tail j=6032 line= }
tail j=6033 line= </script id="script_js_bb">
tail j=6034 line=
tail j=6035 line=
tail j=6036 line= <script id=script_mycanvas_write >
tail j=6037 line=// mycanvas_write( context, x, y, font, fontsize, fillstyle, text );
tail j=6038 line= function mycanvas_write( ctx, x, y, font, fontsize, fillstyle, text ) {
tail j=6039 line=// ctx.font = 'italic bold 30px sans-serif';
tail j=6040 line= ctx.fillStyle = 'white';
tail j=6041 line= ctx.fillStyle = 'black';
tail j=6042 line= ctx.fillStyle = "'" + fillstyle + "'";
tail j=6043 line= ctx.fillStyle = fillstyle;
tail j=6044 line= ctx.font = 'italic bold 30px roman';
tail j=6045 line= ctx.font = 'italic bold 30px arial';
tail j=6046 line= ctx.font = 'italic bold 30px monospace';
tail j=6047 line= ctx.font = 'italic bold 30px cursive';
tail j=6048 line= ctx.font = 'italic bold 30px fantasy';
tail j=6049 line= ctx.font = 'italic bold 30px yokkmokkOT';
tail j=6050 line= ctx.font = 'bold 30px sans-serif';
tail j=6051 line=// ctx.font = 'italic bold ' + fontsize + " " + font;
tail j=6052 line= ctx.font = '' + fontsize + " " + font;
tail j=6053 line= ctx.textBaseline = 'bottom';
tail j=6054 line= ctx.fillText( text, x, y);
tail j=6055 line= }
tail j=6056 line=
tail j=6057 line= function mycanvas_write0( ctx0, text, fillstyle, x, y ) {
tail j=6058 line= ctx0.fillStyle = 'white';
tail j=6059 line= ctx0.fillStyle = fillstyle;
tail j=6060 line= ctx0.font = 'italic bold 30px yokkmokkOT';
tail j=6061 line= ctx0.textBaseline = 'bottom';
tail j=6062 line=// ctx0.fillText('timejak-0: jkwii', x, y);
tail j=6063 line= ctx0.fillText( text, x, y);
tail j=6064 line= }
tail j=6065 line= </script id=script_mycanvas_write >
tail j=6066 line= -->
tail j=6067 line=
tail j=6068 line= <img src="/imgs/btn/koeye.png" onclick="script_ajax()">
tail j=6069 line= <script id="script_ajax">
tail j=6070 line= php="index_ko.php";
tail j=6071 line= db3="index_ko.db3";
tail j=6072 line= sql="select * from list limit 5";
tail j=6073 line= script_ajax(php,db3,sql)
tail j=6074 line= function script_ajax(php, db3,sql) {
tail j=6075 line= alert( "BUGS_4895" )
tail j=6076 line= $("button").click(function(){
tail j=6077 line= $.post( php, {
tail j=6078 line= db3: db3,
tail j=6079 line= sql: "select * from list limit 10"
tail j=6080 line= },
tail j=6081 line= function(data, status){
tail j=6082 line= line = data.split("\n");
tail j=6083 line= htmout="";
tail j=6084 line= for( z=0; z<line.length; z++ ) {
tail j=6085 line= htmout += "<a href="+line+" target=_blank>";
tail j=6086 line= htmout += " <img src="+line+" border=0>";
tail j=6087 line= htmout += " </a>";
tail j=6088 line= }
tail j=6089 line= getelementbyID('div_ajaxdb");
tail j=6090 line=// alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
tail j=6091 line= document.write( htmout );
tail j=6092 line= });
tail j=6093 line= });
tail j=6094 line= }
tail j=6095 line= </script id="script_ajax">
tail j=6096 line=
tail j=6097 line= <script id="script_kolines">
tail j=6098 line= function kolines(color,count,position) {
tail j=6099 line= var htmout = "";
tail j=6100 line= img="/imgs/btn/kob.png";
tail j=6101 line= if( color=="w" ) { img="/imgs/btn/kow.png"; }
tail j=6102 line=// alert( "BUGS_kolines_beg color="+color+" count="+count+" img="+img );
tail j=6103 line=
tail j=6104 line= for( j=1; j<=count; j++ ) {
tail j=6105 line=// alert( "BUGS_kolines_loop color="+color+" count="+count+" img="+img );
tail j=6106 line= htmout += '<img class="drg" height=20 src="'+img+'">';
tail j=6107 line=// alert( "BUGS_kolines_loop j="+j+" color="+color+" count="+count+" htmout="+htmout );
tail j=6108 line= }
tail j=6109 line=
tail j=6110 line=// alert( "BUGS_kolines_end j="+j+" color="+color+" count="+count+" htmout="+htmout );
tail j=6111 line=// htmout += '<img src="/imgs/btn/kop34.png">';
tail j=6112 line=
tail j=6113 line= if( color == 'b' ) {
tail j=6114 line=// div_kolineb = document.getElementById('div_kolineb');
tail j=6115 line=// if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
tail j=6116 line=// if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
tail j=6117 line=// if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6118 line=// if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6119 line=// if( position == "ih" ) div_kolineb.innerHTML( htmout);
tail j=6120 line=
tail j=6121 line=`j if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6122 line= if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6123 line=// if( position == "ae" ) img_kolineb.insertAdjacentElement('afterend', htmout);
tail j=6124 line= }
tail j=6125 line= if( color == 'w' ) {
tail j=6126 line=// div_kolinew = document.getElementById('div_kolinew');
tail j=6127 line=// if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
tail j=6128 line=// if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
tail j=6129 line=// if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6130 line=// if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6131 line=// if( position == "ih" ) div_kolineb.innerHTML( htmout);
tail j=6132 line=
tail j=6133 line= img_kolinew = document.getElementById('img_kolinew' );
tail j=6134 line= if( position == "bb" ) img_kolineb.insertAdjacentHTML('beforebegin', htmout);
tail j=6135 line= if( position == "ab" ) img_kolineb.insertAdjacentHTML('afterbegin', htmout);
tail j=6136 line= if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6137 line= if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6138 line= }
tail j=6139 line= }
tail j=6140 line= </script id="script_kolines">
tail j=6141 line=
tail j=6142 line=
tail j=6143 line=
tail j=6144 line= <hr color=white>
tail j=6145 line= <hr color=black>
tail j=6146 line=
tail j=6147 line= <div id="drag" name="div_drag_2>
tail j=6148 line=<!--
tail j=6149 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
tail j=6150 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','ab' )" >
tail j=6151 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','ih' )" >
tail j=6152 line= <img src="/imgs/btn/kop12.png" onclick="kolines('b','3','ae" )" >
tail j=6153 line= <img src="/imgs/btn/kop34.png" onclick="kolines('b','3','bb" )" >
tail j=6154 line= -->
tail j=6155 line=
tail j=6156 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','256','bb' )" >
tail j=6157 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','16','bb' )" >
tail j=6158 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','8','bb' )" >
tail j=6159 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','4','bb' )" >
tail j=6160 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','2','bb' )" >
tail j=6161 line= <img height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
tail j=6162 line= <img height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','ae' )" >
tail j=6163 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','2','ae' )" >
tail j=6164 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','4','ae' )" >
tail j=6165 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','8','ae' )" >
tail j=6166 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','16','ae' )" >
tail j=6167 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','256','ae' )" >
tail j=6168 line= </div id="drag" name="div_drag_2>
tail j=6169 line=
tail j=6170 line= <hr color=black>
tail j=6171 line= <div id="div_kolineb">
tail j=6172 line= <img id="img_kolineb" height=30 class="drg" src="/imgs/btn/kop12.png">
tail j=6173 line= </div id="div_kolineb">
tail j=6174 line= <div id="div_kolinew">
tail j=6175 line= <img id="img_kolinew" height=30 class="drg" src="/imgs/btn/kop34.png">
tail j=6176 line= </div id="div_kolinew">
tail j=6177 line= <hr color=white>
tail j=6178 line=
tail j=6179 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','2','bb' )" >
tail j=6180 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','4','bb' )" >
tail j=6181 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','8','bb' )" >
tail j=6182 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','16','bb' )" >
tail j=6183 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','256','bb' )" >
tail j=6184 line=
tail j=6185 line= <img height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','bb' )" >
tail j=6186 line= <img height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','ae' )" >
tail j=6187 line=
tail j=6188 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','2','ae' )" >
tail j=6189 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','4','ae' )" >
tail j=6190 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','8','ae' )" >
tail j=6191 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','16','ae' )" >
tail j=6192 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','256','ae' )" >
tail j=6193 line=<!--
tail j=6194 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','be' )" >
tail j=6195 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','ab' )" >
tail j=6196 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','ih' )" >
tail j=6197 line= -->
tail j=6198 line= </div>
tail j=6199 line=<br><br><br><br>
tail j=6200 line=
tail j=6201 line= <hr color=black>
tail j=6202 line= <hr color=white>
tail j=6203 line=
tail j=6204 line= <div id="div_sllist" >
tail j=6205 line= <h3>div_sllist</h3>
tail j=6206 line= </div id="div_sllist" >
tail j=6207 line=
tail j=6208 line=
tail j=6209 line= <script id="script_bugs" >
tail j=6210 line= function script_bugs(bugid) {
tail j=6211 line= alert( "BUGS_5033 script_bugs="+bugid );
tail j=6212 line= }
tail j=6213 line= </script id="script_bugs" >
tail j=6214 line=
tail j=6215 line=
tail j=6216 line=<!--
tail j=6217 line= <img src="/imgs/btn/koeye_handhither.gif" onclick="script_bugs('')">
tail j=6218 line= <img src="/imgs/btn/koeyew.png" onclick="script_bugs('aaaaaaaaaaa' )" >
tail j=6219 line= <img src="/imgs/btn/koeyeb.png" onclick="script_bugs('bbbbbbbbbbbbb' )" >
tail j=6220 line= <img src="/imgs/btn/koeye.png" onclick="script_bugs('ccccccccccccc')" >
tail j=6221 line= <img src="/imgs/btn/koeyew.png" onclick="script_slist_show()" >
tail j=6222 line= -->
tail j=6223 line=
tail j=6224 line=
tail j=6225 line=
tail j=6226 line= <script id="script_sllist_load">
tail j=6227 line= function script_sllist_load() {
tail j=6228 line= alert( "BUGS_5107 script_sllist_load" );
tail j=6229 line= sllist = new Array();
tail j=6230 line= z = 0;
tail j=6231 line= sllist[z++] = 'sllist1';
tail j=6232 line= sllist[z++] = 'sllist2';
tail j=6233 line= sllist[z++] = 'sllist3';
tail j=6234 line= sllist[z++] = 'sllist4';
tail j=6235 line= sllist[z++] = 'sllist5';
tail j=6236 line= sllist[z++] = 'sllist6';
tail j=6237 line= sllist[z++] = 'sllist7';
tail j=6238 line= sllist[z++] = 'sllist8';
tail j=6239 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
tail j=6240 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
tail j=6241 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
tail j=6242 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
tail j=6245 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
tail j=6246 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
tail j=6247 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
tail j=6248 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
tail j=6249 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
tail j=6250 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
tail j=6251 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
tail j=6252 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
tail j=6253 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
tail j=6254 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
tail j=6255 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 246402 Jun 9 2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
tail j=6256 line= sllist[z++] = '-rw-r--r-- 1 konet staff 208180 Apr 8 2015 kb/books/Atlas_1931/IMG_3851.JPG';
tail j=6257 line= sllist[z++] = '-rw-r--r-- 1 konet staff 208180 Apr 8 2015 kb/books/Atlas_1931/IMG_3851.JPG';
tail j=6258 line= sllist[z++] = '-rw-r--r-- 1 konet staff 180223 Apr 8 2015 kb/books/Atlas_1931/IMG_3852.JPG';
tail j=6259 line= sllist[z++] = '-rw-r--r-- 1 konet staff 170251 Apr 8 2015 kb/books/Atlas_1931/IMG_3853.JPG';
tail j=6260 line= sllist[z++] = '-rw-r--r-- 1 konet staff 157741 Apr 8 2015 kb/books/Atlas_1931/IMG_3854.JPG';
tail j=6261 line= sllist[z++] = '-rw-r--r-- 1 konet staff 231492 Apr 8 2015 kb/books/Atlas_1931/IMG_3855.JPG';
tail j=6262 line= sllist[z++] = '-rw-r--r-- 1 konet staff 225773 Apr 8 2015 kb/books/Atlas_1931/IMG_3856.JPG';
tail j=6263 line= sllist[z++] = '-rw-r--r-- 1 konet staff 285875 Apr 8 2015 kb/books/Atlas_1931/IMG_3857.JPG';
tail j=6264 line= sllist[z++] = '-rw-r--r-- 1 konet staff 303677 Apr 8 2015 kb/books/Atlas_1931/IMG_3858.JPG';
tail j=6265 line= sllist[z++] = '-rw-r--r-- 1 konet staff 286921 Apr 8 2015 kb/books/Atlas_1931/IMG_3859.JPG';
tail j=6266 line= sllist[z++] = '-rw-r--r-- 1 konet staff 327242 Apr 8 2015 kb/books/Atlas_1931/IMG_3860.JPG';
tail j=6267 line= sllist[z++] = '-rw-r--r-- 1 konet staff 305251 Apr 8 2015 kb/books/Atlas_1931/IMG_3861.JPG';
tail j=6268 line= sllist[z++] = '-rw-r--r-- 1 konet staff 275734 Apr 8 2015 kb/books/Atlas_1931/IMG_3862.JPG';
tail j=6269 line= sllist[z++] = '-rw-r--r-- 1 konet staff 306566 Apr 8 2015 kb/books/Atlas_1931/IMG_3863.JPG';
tail j=6270 line= sllist[z++] = '-rw-r--r-- 1 konet staff 295127 Apr 8 2015 kb/books/Atlas_1931/IMG_3864.JPG';
tail j=6271 line= sllist[z++] = '-rw-r--r-- 1 konet staff 346338 Apr 8 2015 kb/books/Atlas_1931/IMG_3865.JPG';
tail j=6272 line= sllist[z++] = '-rw-r--r-- 1 konet staff 307752 Apr 8 2015 kb/books/Atlas_1931/IMG_3866.JPG';
tail j=6273 line= sllist[z++] = '-rw-r--r-- 1 konet staff 268685 Apr 8 2015 kb/books/Atlas_1931/IMG_3867.JPG';
tail j=6274 line= sllist[z++] = '-rw-r--r-- 1 konet staff 276633 Apr 8 2015 kb/books/Atlas_1931/IMG_3868.JPG';
tail j=6275 line= sllist[z++] = '-rw-r--r-- 1 konet staff 278776 Apr 8 2015 kb/books/Atlas_1931/IMG_3869.JPG';
tail j=6276 line= sllist[z++] = '-rw-r--r-- 1 konet staff 312322 Apr 8 2015 kb/books/Atlas_1931/IMG_3870.JPG';
tail j=6277 line= sllist[z++] = '-rw-r--r-- 1 konet staff 293924 Apr 8 2015 kb/books/Atlas_1931/IMG_3871.JPG';
tail j=6278 line= sllist[z++] = '-rw-r--r-- 1 konet staff 314761 Apr 8 2015 kb/books/Atlas_1931/IMG_3872.JPG';
tail j=6279 line= sllist[z++] = '-rw-r--r-- 1 konet staff 319755 Apr 8 2015 kb/books/Atlas_1931/IMG_3873.JPG';
tail j=6280 line= sllist[z++] = '-rw-r--r-- 1 konet staff 260878 Apr 8 2015 kb/books/Atlas_1931/IMG_3874.JPG';
tail j=6281 line= sllist[z++] = '-rw-r--r-- 1 konet staff 282075 Apr 8 2015 kb/books/Atlas_1931/IMG_3875.JPG';
tail j=6282 line= sllist[z++] = '-rw-r--r-- 1 konet staff 347889 Apr 8 2015 kb/books/Atlas_1931/IMG_3876.JPG';
tail j=6283 line= sllist[z++] = '-rw-r--r-- 1 konet staff 187358 Mar 31 2015 kb/books/music/Theory/IMG_7247.JPG';
tail j=6284 line= sllist[z++] = '-rw-r--r-- 1 konet staff 233375 Mar 31 2015 kb/books/music/Theory/IMG_7248.JPG';
tail j=6285 line= sllist[z++] = '-rw-r--r-- 1 konet staff 216447 Mar 31 2015 kb/books/music/Theory/IMG_7249.JPG';
tail j=6286 line= sllist[z++] = '-rw-r--r-- 1 konet staff 216059 Mar 31 2015 kb/books/music/Theory/IMG_7250.JPG';
tail j=6287 line= sllist[z++] = '-rw-r--r-- 1 konet staff 222009 Mar 31 2015 kb/books/music/Theory/IMG_7251.JPG';
tail j=6288 line= sllist[z++] = '-rw-r--r-- 1 konet staff 213330 Mar 31 2015 kb/books/music/Theory/IMG_7252.JPG';
tail j=6289 line= sllist[z++] = '-rw-r--r-- 1 konet staff 199485 Mar 31 2015 kb/books/music/Theory/IMG_7253.JPG';
tail j=6290 line= sllist[z++] = '-rw-r--r-- 1 konet staff 239114 Mar 31 2015 kb/books/music/Theory/IMG_7254.JPG';
tail j=6291 line= sllist[z++] = '-rw-r--r-- 1 konet staff 162254 Mar 31 2015 kb/books/music/Theory/IMG_7255.JPG';
tail j=6292 line=// alert( "BUGS_10895 script_sllist_load len="+sllist.length );
tail j=6293 line= return( sllist );
tail j=6294 line= }
tail j=6295 line= </script id="script_sllist_load">
tail j=6296 line=
tail j=6297 line= <script id="script_pdflist_load">
tail j=6298 line= function script_pdflist_load() {
tail j=6299 line= pdflist = new Array();
tail j=6300 line= z = 0;
tail j=6301 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
tail j=6302 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
tail j=6303 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
tail j=6304 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
tail j=6307 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
tail j=6308 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
tail j=6309 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
tail j=6310 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
tail j=6311 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
tail j=6312 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
tail j=6313 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
tail j=6314 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
tail j=6315 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
tail j=6316 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
tail j=6317 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 246402 Jun 9 2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
tail j=6318 line=// alert( "BUGS_10925 script_pdflist_load len="+pdflist.length );
tail j=6319 line= return( pdflist );
tail j=6320 line= }
tail j=6321 line= </script id="script_pdflist_load">
tail j=6322 line=
tail j=6323 line=<!--
tail j=6324 line= <script id="script_startup2" >
tail j=6325 line= function startup2( url ) {
tail j=6326 line=// url="index.html";
tail j=6327 line= alert( "BUGS_10930_startup" );
tail j=6328 line= htmout="htmout";
tail j=6329 line= img="/imgs/btn/koeye.gif";
tail j=6330 line= imgurl="/imgs/btn/koeye_handhither.gif";
tail j=6331 line= if( urlexists(url)) { img=imgurl; }
tail j=6332 line=
tail j=6333 line= htmout += '<a href="'+url+'" target=_blank class="drag" id="drg">
tail j=6334 line= htmout += ' <img src="'+img+'" border=0>";
tail j=6335 line= htmout += ' <span><img src="'+img+'" border=0></span>';
tail j=6336 line= htmout += ' </a>';
tail j=6337 line= document.write( htmout );
tail j=6338 line= alert("BUGS_10934_startup isurl="+isurl(url) );
tail j=6339 line= }
tail j=6340 line= </script>
tail j=6341 line= -->
tail j=6342 line=
tail j=6343 line= <script id="script_isurl">
tail j=6344 line= function isurl(url) {
tail j=6345 line= $.get(url).done(function() {
tail j=6346 line= return("ok");
tail j=6347 line= }).fail(function() {
tail j=6348 line= return("ko");
tail j=6349 line= })
tail j=6350 line= }
tail j=6351 line= </script id="script_isurl">
tail j=6352 line=
tail j=6353 line= <script id="script_urlexists">
tail j=6354 line= function urlexists(url) {
tail j=6355 line= var http = new XMLHttpRequest();
tail j=6356 line= http.open('HEAD', url, false);
tail j=6357 line= http.send();
tail j=6358 line= return http.status!=404;
tail j=6359 line= }
tail j=6360 line= </script id="script_urlexists">
tail j=6361 line=
tail j=6362 line= <script id="script_mth2mm">
tail j=6363 line= function mth2mm(mth) {
tail j=6364 line= if( mth == "Jan" ) return("01");
tail j=6365 line= if( mth == "Feb" ) return("02");
tail j=6366 line= if( mth == "Mar" ) return("03");
tail j=6367 line= if( mth == "Apr" ) return("04");
tail j=6368 line= if( mth == "May" ) return("05");
tail j=6369 line= if( mth == "Jun" ) return("06");
tail j=6370 line= if( mth == "Jul" ) return("07");
tail j=6371 line= if( mth == "Aug" ) return("08");
tail j=6372 line= if( mth == "Sep" ) return("09");
tail j=6373 line= if( mth == "Oct" ) return("10");
tail j=6374 line= if( mth == "Nov" ) return("11");
tail j=6375 line= if( mth == "Dec" ) return("12");
tail j=6376 line= return( "00" );
tail j=6377 line= }
tail j=6378 line= </script id="script_mth2mm">
tail j=6379 line=
tail j=6380 line= <script id="script_unique">
tail j=6381 line= function unique() {
tail j=6382 line= alert( "BUGS_11334 unique" );
tail j=6383 line= }
tail j=6384 line= function uniquelist(list) {
tail j=6385 line= alert( "BUGS_11336 uniquelist" );
tail j=6386 line= for (i = 0; i<list.length; i++) {
tail j=6387 line= for (j=i+1; j<list.length; j++) {
tail j=6388 line= if (list[i] == list[j]) {
tail j=6389 line= list.splice(j, 1);
tail j=6390 line= j--;
tail j=6391 line= }
tail j=6392 line= }
tail j=6393 line= }
tail j=6394 line= }
tail j=6395 line= </script id="script_unique">
tail j=6396 line=
tail j=6397 line= <script id="script_file2array" >
tail j=6398 line= script_file2array(url) {
tail j=6399 line= if( urlexists(url) ) {
tail j=6400 line= alert( BUGS_11350 FOUND urlexists="+url );
tail j=6401 line= }
tail j=6402 line= else {
tail j=6403 line= alert( BUGS_11351 NOTFOUND urlexists="+url );
tail j=6404 line= }
tail j=6405 line=// $.ajax({
tail j=6406 line=//// url: "/kb/csv/sl.csv",
tail j=6407 line=//// url: "/kb/csv/sl.csv",
tail j=6408 line=//// url: "sl.csv",
tail j=6409 line=// url: url,
tail j=6410 line=// async: false,
tail j=6411 line=// success: function(csvd) {
tail j=6412 line=// kolist = $.csv.toArrays(csvd);
tail j=6413 line=// },
tail j=6414 line=//
tail j=6415 line=// dataType: "text",
tail j=6416 line=//// call a function on complete
tail j=6417 line=// complete: function () {
tail j=6418 line=// alert( "BUGS_11363 ajax rul="+url+" kolist="+kolist );
tail j=6419 line=//// script_kolist_load(kolist);
tail j=6420 line=// script_kolist_show(kolist);
tail j=6421 line=// }
tail j=6422 line=// });
tail j=6423 line= }
tail j=6424 line= </script id="script_file2array" >
tail j=6425 line=
tail j=6426 line=<!-- <script id="script_async_sljs" src="sl.js" async></script> -->
tail j=6427 line= <script id="script_requestcsv" >
tail j=6428 line= function callback() {
tail j=6429 line= alert( "BUGS_11480 callback" );
tail j=6430 line= }
tail j=6431 line=// var foo = requestCSV("sl.csv",drawlines(lines));
tail j=6432 line=// var foo = requestCSV("sl.csv",script_kolist(kolist));
tail j=6433 line=//// function requestCSV(f,c){return new csvajax(f,c);};
tail j=6434 line= filecsv="sl.csv";
tail j=6435 line= function csvajax(filecsv,callback) {
tail j=6436 line= alert( "BUGS_11383 script_requestcsv filepath="+filepath+" callback="+callback );
tail j=6437 line=// this.request = new XMLHttpRequest();
tail j=6438 line=// this.request.timeout = 10000;
tail j=6439 line=// this.request.open("GET", filepath, true);
tail j=6440 line=// this.request.parent = this;
tail j=6441 line=// this.callback = callback;
tail j=6442 line=// this.request.onload = function() {
tail j=6443 line=// var d = this.response.split('\n'); /*1st separator*/
tail j=6444 line=// var i = d.length;
tail j=6445 line=// while(i--) {
tail j=6446 line=// if(d[i] !== "")
tail j=6447 line=// d[i] = d[i].split(','); /*2nd separator*/
tail j=6448 line=// else
tail j=6449 line=// d.splice(i,1);
tail j=6450 line=// }
tail j=6451 line=// this.parent.response = d;
tail j=6452 line=// if(typeof this.parent.callback !== "undefined")
tail j=6453 line=// this.parent.callback(d);
tail j=6454 line=// };
tail j=6455 line=// this.request.send();
tail j=6456 line= };
tail j=6457 line= </script id="script_requestcsv" >
tail j=6458 line=
tail j=6459 line=<!--
tail j=6460 line= <script id="script_db32array" >
tail j=6461 line=//// function script_db2array("sl.db3", "select * from kolist where koid='koid'" ) {
tail j=6462 line=//// function script_db2array("/kb/db3/sl.db3", "/kb/sql/sl.sql" ) {
tail j=6463 line=// function script_db2array( db3, sql ) {
tail j=6464 line=// var dblist = new Array();
tail j=6465 line=// alert( "BUGS_11400 script_db2array db3="+db3+" sql="+sql+" dblist="+dblist );
tail j=6466 line=// return( dblist );
tail j=6467 line=// }
tail j=6468 line=
tail j=6469 line=// filedb3="sl.db3";
tail j=6470 line=// filepsv="sl.psv";
tail j=6471 line=// tblnam="sl";
tail j=6472 line=// $rr=exec("sqlite3 filedb3 \".separator '|'\" ");
tail j=6473 line=// $rr=exec("sqlite3 filedb3 \".import filepsv tblnam\" ");
tail j=6474 line=// $rr= exec ("sqlite3 filedb3 \"pragma encoding = 'utf-8'\" ");
tail j=6475 line=// $rr=exec("sqlite3 filedb3 \".separator '|'\" && sqlite3 fildb3 \"pragma encoding = 'utf-8'\" && sqlite3 filedb3 \".import filepsv tablename\" ");
tail j=6476 line= </script>
tail j=6477 line= -->
tail j=6478 line=
tail j=6479 line=<!-- Create the database -->
tail j=6480 line=<!--
tail j=6481 line= <script id="script_sqljs_include" src='js/sql.js'></script>
tail j=6482 line= <script id="script_sqljs">
tail j=6483 line= function script_sqljs() {
tail j=6484 line= var db = new SQL.Database();
tail j=6485 line=
tail j=6486 line=// Run a query without reading the results
tail j=6487 line= db.run("CREATE TABLE test (col1, col2);");
tail j=6488 line=
tail j=6489 line=// Insert two rows: (1,111) and (2,222)
tail j=6490 line= db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]);
tail j=6491 line=
tail j=6492 line=// Prepare a statement
tail j=6493 line= var stmt = db.prepare("SELECT * FROM test WHERE a BETWEEN $start AND $end");
tail j=6494 line= stmt.getAsObject({$start:1, $end:1}); // {col1:1, col2:111}
tail j=6495 line=
tail j=6496 line=// Bind new values
tail j=6497 line= stmt.bind({$start:1, $end:2});
tail j=6498 line= while(stmt.step()) { //
tail j=6499 line= var row = stmt.getAsObject();
tail j=6500 line=// [...] do something with the row of result
tail j=6501 line= }
tail j=6502 line= }
tail j=6503 line= </script>
tail j=6504 line= -->
tail j=6505 line= <a href=+ class="popover" >
tail j=6506 line= <img src="/imgs/btn/kb.png" onclick="script_startup('timejak_startup')">
tail j=6507 line= <span><img src="/imgs/btn/kw.png" onclick="script_startup('timejak_startup')"></span>
tail j=6508 line= </a>
tail j=6509 line= <script id="script_startup" >
tail j=6510 line= function script_startup( msg ) {
tail j=6511 line= alert( "BUGS_6200 script_startup msg="+msg );
tail j=6512 line=
tail j=6513 line= }
tail j=6514 line= </script id="script_startup" >
tail j=6515 line=
tail j=6516 line=<!-- <div id="div_balls_n_cubes_btn"> -->
tail j=6517 line=
tail j=6518 line= <div id="div_kobuttonset" >
tail j=6519 line= <a href=+ class="popover" >
tail j=6520 line= <img height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_b('5400')">
tail j=6521 line= <span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeye_b('5400')"></span>
tail j=6522 line= </a>
tail j=6523 line=
tail j=6524 line= <a href=+ class="popover" >
tail j=6525 line= <img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyeb_w('5400')">
tail j=6526 line= <span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_bw('5400')"></span>
tail j=6527 line= </a>
tail j=6528 line=
tail j=6529 line=
tail j=6530 line= <a href=+ class="popover" >
tail j=6531 line= <img height=50 src="/imgs/btn/kobubble_b1.png" onclick="script_bubble('5400')">
tail j=6532 line= <span><img height=50 src="/imgs/btn/kobubblew.png" onclick="script_bubble('5400')"></span>
tail j=6533 line= </a>
tail j=6534 line=
tail j=6535 line=
tail j=6536 line= <a href=+ class="popover" >
tail j=6537 line= <img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeyew_b('5500')">
tail j=6538 line= <span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyew_b('5400')"></span>
tail j=6539 line= </a>
tail j=6540 line=
tail j=6541 line=
tail j=6542 line= <a href=+ class="popover" >
tail j=6543 line= <img height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_w('5400')">
tail j=6544 line= <span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_w('5400')"></span>
tail j=6545 line= </a>
tail j=6546 line=
tail j=6547 line=
tail j=6548 line= <a href=+ class="popover" >
tail j=6549 line= <img src="/imgs/btn/kw.png" onclick="script_kw('timejak_shutdown')">
tail j=6550 line= <span><img src="/imgs/btn/kb.png" onclick="script_kw('timejak_shutdown')"></span>
tail j=6551 line= </a>
tail j=6552 line= </div id="div_kobuttonset" >
tail j=6553 line=
tail j=6554 line=
tail j=6555 line=
tail j=6556 line= <div id="div_ajax2php_form" class="drg" >
tail j=6557 line= <form id="comment">
tail j=6558 line= <input type="text" id="userInput" name="comment" placeholder="needdb3data4me" /></input>
tail j=6559 line= <input type="submit" value="Submit" /></input>
tail j=6560 line= </form>
tail j=6561 line= </div id="div_ajax2php_form" >
tail j=6562 line=
tail j=6563 line=
tail j=6564 line=<!--
tail j=6565 line= <button onclice="script_ajax2php">script_ajax2php</button>
tail j=6566 line= -->
tail j=6567 line=
tail j=6568 line=<script id="script_ajax2php">
tail j=6569 line= function script_ajax2php () {
tail j=6570 line= alert( "BUGS_5396 script_ajax2php" );
tail j=6571 line=
tail j=6572 line=// Stop the form from being submitted the standard way
tail j=6573 line= $("#comment").on('submit', function(e) {
tail j=6574 line= e.preventDefault();
tail j=6575 line=
tail j=6576 line=// Put the user's input into a variable
tail j=6577 line= var userInput = $('#userInput').val();
tail j=6578 line=
tail j=6579 line=// Do some validation of the data if needed
tail j=6580 line=// ...
tail j=6581 line=
tail j=6582 line=
tail j=6583 line=// Perform AJAX request (a.k.a send the data to the server)
tail j=6584 line=// There are many parameters one can use here
tail j=6585 line=// Browse the documentation to get familiar with the most useful ones
tail j=6586 line= $.ajax({
tail j=6587 line= url: 'index_zm.php', // The PHP script that will handle the request
tail j=6588 line= db3 = "index_zm.db3",
tail j=6589 line= sql: "select * from list",
tail j=6590 line= type: 'POST', // This can be set to GET, but in this case we'd use POST
tail j=6591 line= data: {
tail j=6592 line= db3: sql,
tail j=6593 line= sql: sql,
tail j=6594 line= }, // "comment" will result in $_POST['comment'], and userInput is the value of it
tail j=6595 line=
tail j=6596 line=// If the script returns a 200 status (meaning the request was successful)
tail j=6597 line=// The data variable will be the response from the PHP script
tail j=6598 line=// Depending on what you are going to do with the data returned,
tail j=6599 line=// you may want to ensure it is returned as valid JSON
tail j=6600 line= success: function(data) {
tail j=6601 line= alert( "BUGS ajaxphp MSG data="+data );
tail j=6602 line= },
tail j=6603 line=
tail j=6604 line=// The request failed - So something here
tail j=6605 line= error: function() {
tail j=6606 line= alert( "BUGS ajaxphp ERR data="+data );
tail j=6607 line= }
tail j=6608 line= });
tail j=6609 line=
tail j=6610 line= });
tail j=6611 line= }
tail j=6612 line= </script id="script_ajax2php">
tail j=6613 line=
tail j=6614 line=
tail j=6615 line= <button type="button" onclick="balls_n_cubes('/imgs/btn/ok.png')">balls_n_cubes</button>
tail j=6616 line=
tail j=6617 line= <button onclick="showFillText();return true;">filltxt</button>
tail j=6618 line= <button onclick="showStrokeText();return true;">stroketxt</button>
tail j=6619 line= <button onclick="Clear_text();return true;">cleartxt</button>
tail j=6620 line=
tail j=6621 line= <button onclick="draw_dragon();return true;">dragon</button>
tail j=6622 line= <button onclick="draw_smaller_dragon();return true;">dragonette</button>
tail j=6623 line= <button onclick="draw_dragon_head();return true;">draghead</button>
tail j=6624 line= <button onclick="Clear_image();return true;">clearimg</button>
tail j=6625 line=<!-- orphan div </div> -->
tail j=6626 line=
tail j=6627 line=
tail j=6628 line=
tail j=6629 line= <div id="div_canvas_balls" style="background:tan; position:relative; width:800px; height:120px">
tail j=6630 line= <canvas id="layer1"
tail j=6631 line= style="z-index: 1;
tail j=6632 line= position:absolute;
tail j=6633 line= left:0px;
tail j=6634 line= top:0px;
tail j=6635 line= " height="100px" width="800">
tail j=6636 line= unauthorized access logged
tail j=6637 line= </canvas>
tail j=6638 line= <canvas id="layer2"
tail j=6639 line= style="z-index: 2;
tail j=6640 line= position:absolute;
tail j=6641 line= left:0px;
tail j=6642 line= top:0px;
tail j=6643 line= " height="100px" width="800">
tail j=6644 line= unauthorized access logged
tail j=6645 line= </canvas>
tail j=6646 line= <canvas id="layer3"
tail j=6647 line= style="z-index: 3;
tail j=6648 line= position:absolute;
tail j=6649 line= left:0px;
tail j=6650 line= top:0px;
tail j=6651 line= " height="100px" width="800">
tail j=6652 line= unauthorized access logged
tail j=6653 line= </canvas>
tail j=6654 line=
tail j=6655 line= <canvas id="layer4"
tail j=6656 line= style="z-index: 4;
tail j=6657 line= position:absolute;
tail j=6658 line= left:0px;
tail j=6659 line= top:0px;
tail j=6660 line= " height="100px" width="800">
tail j=6661 line= unauthorized access logged b
tail j=6662 line= </canvas>
tail j=6663 line= <canvas id="layer5"
tail j=6664 line= style="z-index: 5;
tail j=6665 line= position:absolute;
tail j=6666 line= left:0px;
tail j=6667 line= top:0px;
tail j=6668 line= " height="100px" width="800">
tail j=6669 line= unauthorized access logged
tail j=6670 line= </canvas>
tail j=6671 line= <canvas id="layer6"
tail j=6672 line= style="z-index: 6;
tail j=6673 line= position:absolute;
tail j=6674 line= left:0px;
tail j=6675 line= top:0px;
tail j=6676 line= " height="100px" width="800">
tail j=6677 line= unauthorized access logged
tail j=6678 line= </canvas>
tail j=6679 line= <canvas id="layer7"
tail j=6680 line= style="z-index: 7;
tail j=6681 line= position:absolute;
tail j=6682 line= left:0px;
tail j=6683 line= top:0px;
tail j=6684 line= " height="100px" width="800">
tail j=6685 line= unauthorized access logged
tail j=6686 line= </canvas>
tail j=6687 line= </div>
tail j=6688 line= </div id="div_canvas_balls" >
tail j=6689 line=
tail j=6690 line=
tail j=6691 line=
tail j=6692 line=
tail j=6693 line= <script id="script_canvas_balls_n_cubes_w" type="text/javascript">
tail j=6694 line= var layer1; var layer2; var layer3;
tail j=6695 line= var layer4; var layer5; var layer6; var layer7;
tail j=6696 line= var layer_b; var layer_w; var layer_i; var layer_t;
tail j=6697 line=
tail j=6698 line= var ctx1; var ctx2; var ctx3;
tail j=6699 line= var ctx_b; var ctx_w; var ctx_i; var ctx_t;
tail j=6700 line= var x = 800; var y = 100; var dx = 2; var dy = 4;
tail j=6701 line= var b_x = 800; var b_y = 100; var b_dx = 2; var b_dy = 4;
tail j=6702 line= var w_x = 800; var w_y = 100; var w_dx = 2; var w_dy = 4;
tail j=6703 line= var i_x = 800; var i_y = 100; var i_dx = 2; var i_dy = 4;
tail j=6704 line= var t_x = 800; var t_y = 100; var t_dx = 2; var t_dy = 4;
tail j=6705 line=
tail j=6706 line= var WIDTH = 800;
tail j=6707 line= var HEIGHT = 100;
tail j=6708 line=
tail j=6709 line= var city = new Image();
tail j=6710 line= var city_b = new Image();
tail j=6711 line= var city_w = new Image();
tail j=6712 line= var img_b = new Image();
tail j=6713 line= var img_w = new Image();
tail j=6714 line= var gif = new Image();
tail j=6715 line= var img = new Image();
tail j=6716 line= var txt = new Image();
tail j=6717 line= img_new = new Image();
tail j=6718 line=
tail j=6719 line= img_mask = new Image();
tail j=6720 line= img_mask_w = new Image();
tail j=6721 line= img_mask_b = new Image();
tail j=6722 line= img_mask_ko = new Image();
tail j=6723 line= img_mask_kow = new Image();
tail j=6724 line= img_mask_kob = new Image();
tail j=6725 line= img_mask_koeye = new Image();
tail j=6726 line= img_mask_koeyew = new Image();
tail j=6727 line= img_mask_koeyeb = new Image();
tail j=6728 line=
tail j=6729 line= myimg="";
tail j=6730 line= myimg="/imgs/btn/koeye_handhi.gif";
tail j=6731 line= myimg="/imgs/btn/koeye_handhither.gif";
tail j=6732 line= balls_n_cubes( myimg );
tail j=6733 line=
tail j=6734 line= function showFillText() {
tail j=6735 line= ctx_t.fillStyle = '#f00';
tail j=6736 line= ctx_t.fillStyle = 'yellow';
tail j=6737 line=// ctx_t.font = 'italic bold 30px sans-serif';
tail j=6738 line= ctx_t.font = 'italic bold 40px yokkmokkOT';
tail j=6739 line= ctx_t.textBaseline = 'bottom';
tail j=6740 line= ctx_t.fillText('timejaks: jkwii is here', 50, 100);
tail j=6741 line= }
tail j=6742 line=
tail j=6743 line= function showStrokeText() {
tail j=6744 line= ctx_t.strokeStyle = "#003300";
tail j=6745 line= ctx_t.font = '40px san-serif';
tail j=6746 line= ctx_t.textBaseline = 'bottom';
tail j=6747 line= ctx_t.strokeText('timejaks jkwii is us', 300, 100);
tail j=6748 line= }
tail j=6749 line=
tail j=6750 line=// textBaseline top,hanging,middle,alphabetic,ideographic,bottom default: alphabetic
tail j=6751 line= function Clear_text() {
tail j=6752 line= ctx_t.textBaseline = "top";
tail j=6753 line= ctx_t.fillText('Top', 5, 100);
tail j=6754 line= ctx_t.textBaseline = "bottom";
tail j=6755 line= ctx_t.fillText('Bottom', 80, 100);
tail j=6756 line= ctx_t.textBaseline = "middle";
tail j=6757 line= ctx_t.fillText('Middle', 200, 100);
tail j=6758 line= ctx_t.textBaseline = "alphabetic";
tail j=6759 line= ctx_t.fillText('Alphabetic', 300, 100);
tail j=6760 line= ctx_t.textBaseline = "hanging";
tail j=6761 line= ctx_t.fillText('Hanging', 400, 100);
tail j=6762 line= ctx_t.clearRect(1, 1, 600, 300);
tail j=6763 line= }
tail j=6764 line=
tail j=6765 line=// var c5 = document.getElementById("c5");
tail j=6766 line=// var c5_context = c5.getContext("2d");
tail j=6767 line=
tail j=6768 line= var dragon = new Image();
tail j=6769 line= dragon.src = '/imgs/btn/dragon.png';
tail j=6770 line=
tail j=6771 line= function draw_dragon() {
tail j=6772 line= ctx_i.drawImage(dragon, 100, 5);
tail j=6773 line= }
tail j=6774 line=
tail j=6775 line= function draw_smaller_dragon() {
tail j=6776 line= ctx_i.drawImage(dragon, 10, 5, 58, 100);
tail j=6777 line= }
tail j=6778 line=
tail j=6779 line= function draw_dragon_head() {
tail j=6780 line= ctx_i.drawImage(dragon, 0, 19, 69, 97, 300, 100, 103, 145);
tail j=6781 line= }
tail j=6782 line=
tail j=6783 line= function Clear_image() {
tail j=6784 line= ctx_i.clearRect(1, 1, 600, 300);
tail j=6785 line= }
tail j=6786 line=
tail j=6787 line=
tail j=6788 line=
tail j=6789 line=
tail j=6790 line= function balls_n_cubes(myimg) {
tail j=6791 line=// alert( "BUGS_5780 myimg="+myimg );
tail j=6792 line= imgs_new = new Array(); z=0;
tail j=6793 line= imgs_new[z++] = "/imgs/btn/koeye_handhi.gif";
tail j=6794 line= imgs_new[z++] = "/imgs/btn/ko.png";
tail j=6795 line= imgs_new[z++] = "/imgs/btn/ok.png";
tail j=6796 line= imgs_new[z++] = "/imgs/btn/koeyew.png";
tail j=6797 line= imgs_new[z++] = "/imgs/btn/koeyeb.png";
tail j=6798 line= imgs_new[z++] = "/imgs/btn/koeye.png";
tail j=6799 line= imgs_new[z++] = "/imgs/btn/koeye_handhither.gif";
tail j=6800 line=// alert( "BUGS_5790 myimg="+myimg );
tail j=6801 line= if( myimg == "" ) {
tail j=6802 line=// alert( "BUGS_5791 OLD myimg="+myimg );
tail j=6803 line=// img_new.src = myimg;
tail j=6804 line=// img_new.src = "/imgs/btn/ko.png";
tail j=6805 line= img_new.src = "/imgs/btn/koeye_handhither.gif";
tail j=6806 line= img_new.src = "/imgs/btn/koeye_handhi.gif";
tail j=6807 line= }
tail j=6808 line= else {
tail j=6809 line=// alert( "BUGS_5792 NEW myimg="+myimg );
tail j=6810 line=// img_new.src = "/imgs/btn/ok.png";
tail j=6811 line= img_new.src = "/imgs/btn/koeye_handhither.gif";
tail j=6812 line= img_new.src = myimg;
tail j=6813 line= }
tail j=6814 line= return( img_new );
tail j=6815 line= }
tail j=6816 line=
tail j=6817 line=// function init() {
tail j=6818 line=// myimg = "/imgs/btn/ko.png";
tail j=6819 line=// myimg = "";
tail j=6820 line= function init_balls_n_cubes(myimg) {
tail j=6821 line=// alert( "BUGS_5810 balls_n_cubes myimg="+myimg );
tail j=6822 line= city.src ="/imgs/btn/koeye.png";
tail j=6823 line= city_b.src ="/imgs/btn/koeyeb.png";
tail j=6824 line= city_w.src ="/imgs/btn/koeyew.png";
tail j=6825 line=
tail j=6826 line= img.src ="/imgs/btn/kob.png";
tail j=6827 line= txt.src ="/imgs/btn/kow.png";
tail j=6828 line= img_b.src ="/imgs/btn/koeyeb.png";
tail j=6829 line= img_w.src ="/imgs/btn/koeyew.png";
tail j=6830 line=
tail j=6831 line= img_mask.src ="/imgs/btn/kob.png";
tail j=6832 line= img_mask_w.src ="/imgs/btn/kob.png";
tail j=6833 line= img_mask_b.src ="/imgs/btn/kob.png";
tail j=6834 line= img_mask_koeye.src = "/imgs/btn/koeye_mask.png";
tail j=6835 line= img_mask_koeyew.src = "/imgs/btn/koeyew_mask.png";
tail j=6836 line= img_mask_koeyeb.src = "/imgs/btn/koeyeb_mask.png";
tail j=6837 line= img_mask_ko.src = "/imgs/btn/ko_mask.png";
tail j=6838 line= img_mask_kow.src = "/imgs/btn/kow_mask.png";
tail j=6839 line= img_mask_kob.src = "/imgs/btn/kob_mask.png";
tail j=6840 line=
tail j=6841 line=
tail j=6842 line= gif.src = "/imgs/btn/koeye_handhither.gif";
tail j=6843 line=// gif.src = "/imgs/btn/ok.png";
tail j=6844 line=// img_new = balls_n_cubes('');
tail j=6845 line=// img_new = balls_n_cubes(myimg);
tail j=6846 line= gif.src = img_new.src;
tail j=6847 line=
tail j=6848 line= layer1 = document.getElementById("layer1");
tail j=6849 line= ctx1 = layer1.getContext("2d");
tail j=6850 line= layer2 = document.getElementById("layer2");
tail j=6851 line= ctx2 = layer2.getContext("2d");
tail j=6852 line= layer3 = document.getElementById("layer3");
tail j=6853 line= ctx3 = layer3.getContext("2d");
tail j=6854 line=
tail j=6855 line= layer4 = document.getElementById("layer4");
tail j=6856 line= ctx_b = layer4.getContext("2d");
tail j=6857 line= layer5 = document.getElementById("layer5");
tail j=6858 line= ctx_w = layer5.getContext("2d");
tail j=6859 line= layer6 = document.getElementById("layer6");
tail j=6860 line= ctx_i = layer6.getContext("2d");
tail j=6861 line= layer7 = document.getElementById("layer7");
tail j=6862 line= ctx_t = layer7.getContext("2d");
tail j=6863 line=
tail j=6864 line= setInterval(drawAll, 20);
tail j=6865 line= }
tail j=6866 line=
tail j=6867 line= function draw1() {
tail j=6868 line= ctx1.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6869 line= ctx1.fillStyle = "#FAF7F8";
tail j=6870 line= ctx1.fillStyle = "darkslaegrey";
tail j=6871 line= ctx1.beginPath();
tail j=6872 line= ctx1.rect(0,0,WIDTH,HEIGHT);
tail j=6873 line= ctx1.closePath();
tail j=6874 line= ctx1.fill();
tail j=6875 line= ctx1.fillStyle = "#444444";
tail j=6876 line=// ctx1.fillStyle = "yellow";
tail j=6877 line= ctx1.beginPath();
tail j=6878 line= ctx1.arc(x, y, 10, 0, Math.PI*2, true);
tail j=6879 line= ctx1.closePath();
tail j=6880 line= ctx1.fill();
tail j=6881 line=
tail j=6882 line= if (x + dx > WIDTH || x + dx < 0) dx = -dx;
tail j=6883 line= if (y + dy > HEIGHT || y + dy < 0) dy = -dy;
tail j=6884 line=
tail j=6885 line= x += dx;
tail j=6886 line= y += dy;
tail j=6887 line= }
tail j=6888 line=
tail j=6889 line=
tail j=6890 line=
tail j=6891 line= function draw_b() {
tail j=6892 line= ctx_b.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6893 line= ctx_b.fillStyle = "#FAF7F8";
tail j=6894 line= ctx_b.fillStyle = "darkslaegrey";
tail j=6895 line= ctx_b.beginPath();
tail j=6896 line= ctx_b.rect(0,0,WIDTH,HEIGHT);
tail j=6897 line= ctx_b.closePath();
tail j=6898 line= ctx_b.fill();
tail j=6899 line=// ctx_b.fillStyle = "#444444";
tail j=6900 line= ctx_b.fillStyle = "red";
tail j=6901 line= ctx_b.beginPath();
tail j=6902 line= ctx_b.arc(b_x, b_y, 10, 0, Math.PI*2, true);
tail j=6903 line= ctx_b.closePath();
tail j=6904 line= ctx_b.fill();
tail j=6905 line=
tail j=6906 line= if (b_x + b_dx > WIDTH || b_x + b_dx < 0) b_dx = -b_dx;
tail j=6907 line= if (b_y + b_dy > HEIGHT || b_y + b_dy < 0) b_dy = -b_dy;
tail j=6908 line=
tail j=6909 line= b_x += b_dx;
tail j=6910 line= b_y += b_dy;
tail j=6911 line= }
tail j=6912 line=
tail j=6913 line= function draw_w() {
tail j=6914 line= ctx_w.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6915 line=// ctx_w.fillStyle = "#FAF7F8";
tail j=6916 line= ctx_w.fillStyle = "darkslaegrey";
tail j=6917 line= ctx_w.beginPath();
tail j=6918 line= ctx_w.rect(0,0,WIDTH,HEIGHT);
tail j=6919 line= ctx_w.closePath();
tail j=6920 line= ctx_w.fill();
tail j=6921 line= ctx_w.fillStyle = "#444444";
tail j=6922 line= ctx_w.fillStyle = "yellow";
tail j=6923 line= ctx_w.fillStyle = "darkslategrey";
tail j=6924 line= ctx_w.beginPath();
tail j=6925 line= ctx_w.arc(w_x, w_y, 10, 0, Math.PI*2, true);
tail j=6926 line= ctx_w.closePath();
tail j=6927 line= ctx_w.fill();
tail j=6928 line=
tail j=6929 line= if (w_x + w_dx > WIDTH || w_x + w_dx < 0) w_dx = -w_dx;
tail j=6930 line= if (w_y + w_dy > HEIGHT || w_y + w_dy < 0) w_dy = -w_dy;
tail j=6931 line=
tail j=6932 line= w_x += w_dx; w_y += w_dy;
tail j=6933 line= }
tail j=6934 line=
tail j=6935 line=
tail j=6936 line=
tail j=6937 line=
tail j=6938 line=
tail j=6939 line= function draw2() {
tail j=6940 line= ctx2.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6941 line= ctx2.drawImage(city, WIDTH/2-100, 10 );
tail j=6942 line= ctx2.drawImage(city_w, WIDTH/2-100, 10 );
tail j=6943 line= ctx2.drawImage(city_b, WIDTH/2-100, 10 );
tail j=6944 line= ctx2.drawImage(gif, WIDTH/2-100, 10 );
tail j=6945 line=
tail j=6946 line=
tail j=6947 line=// ctx2.drawImage(img_mask, 0, 0);
tail j=6948 line=// ctx2.globalCompositeOperation = 'source-in';
tail j=6949 line=// ctx2.drawImage(city_w, 10 , 10);
tail j=6950 line=// ctx2.drawImage(img_mask, 0, 0);
tail j=6951 line= }
tail j=6952 line=
tail j=6953 line= function draw_i() {
tail j=6954 line=// img_mask="/imgs/btn/koeye_mask.png";
tail j=6955 line=// ctx_i.drawImage(img_mask, 0, 0);
tail j=6956 line=// ctx_i.globalCompositeOperation = 'source-in';
tail j=6957 line=// ctx_i.drawImage(img_w, 0 , 0);
tail j=6958 line=
tail j=6959 line=
tail j=6960 line=
tail j=6961 line= ctx_i.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6962 line= ctx_i.drawImage(img, WIDTH/2-100, 10 );
tail j=6963 line=// ctx_i.drawImage(img_i, WIDTH/2-100, 10 );
tail j=6964 line= }
tail j=6965 line=
tail j=6966 line= function draw_t() {
tail j=6967 line= txt="timejaks: jkwii";
tail j=6968 line=// ctx_t.drawImage(txt, 0, 0);
tail j=6969 line=// ctx_t.drawImage(img_t, WIDTH/2-100, 10 );
tail j=6970 line=// ctx_t.fillStyle = '#f00';
tail j=6971 line=// ctx_t.font = 'italic bold 30px sans-serif';
tail j=6972 line=// ctx_t.fillText(txt, 50, 100);
tail j=6973 line=// ctx_t.fillText("timejaks: jkwii is me", 0, 0);
tail j=6974 line=// ctx_t.fillText("timejaks: jkwii is he", x, y);
tail j=6975 line=
tail j=6976 line= ctx_t.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6977 line= ctx_t.fillStyle = 'black';
tail j=6978 line= ctx_t.fillStyle = 'goldenrod';
tail j=6979 line= ctx_t.fillStyle = 'darkslategrey';
tail j=6980 line= ctx_t.font = '50px yokkmokkOT';
tail j=6981 line= ctx_t.textBaseline = 'bottom';
tail j=6982 line= ctx_t.fillText("timejaks: jkwii is where", x, y);
tail j=6983 line=
tail j=6984 line=// alert( "BUGS_5900 drat_t txt="+txt );
tail j=6985 line= }
tail j=6986 line=
tail j=6987 line=
tail j=6988 line=
tail j=6989 line=
tail j=6990 line=
tail j=6991 line= function draw3() {
tail j=6992 line= ctx3.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6993 line= ctx3.fillStyle = "#444444";
tail j=6994 line=// ctx3.fillStyle = "darkslategrey";
tail j=6995 line=// ctx3.translate(100,100);
tail j=6996 line=// ctx3.fillRect(-15, -15, 50, 50);
tail j=6997 line= ctx3.save();
tail j=6998 line= ctx3.translate(400,50);
tail j=6999 line= ctx3.rotate(x/20);
tail j=7000 line= ctx3.fillRect(10, 0, 25, 25);
tail j=7001 line= ctx3.restore();
tail j=7002 line= }
tail j=7003 line=
tail j=7004 line=
tail j=7005 line=
tail j=7006 line=
tail j=7007 line=
tail j=7008 line=
tail j=7009 line= function drawAll() {
tail j=7010 line= draw_b();
tail j=7011 line= draw_w();
tail j=7012 line= draw_i();
tail j=7013 line= draw_t();
tail j=7014 line=
tail j=7015 line= draw1();
tail j=7016 line= draw2();
tail j=7017 line= draw3();
tail j=7018 line= }
tail j=7019 line=
tail j=7020 line=
tail j=7021 line=
tail j=7022 line=
tail j=7023 line=
tail j=7024 line=
tail j=7025 line=
tail j=7026 line=// init(img_new);
tail j=7027 line= init_balls_n_cubes(myimg);
tail j=7028 line= </script id="script_canvas_balls_n_cubes_w" >
tail j=7029 line=
tail j=7030 line= <script id="script_load_urlbtn">
tail j=7031 line= function load_urlbtn(btnid) {
tail j=7032 line= img_dragon: url("/imgs/links/tn/tn_dragon.png" );
tail j=7033 line= img_ko: url("/imgs/btn/ko.png");
tail j=7034 line= img_ok: url("/imgs/btn/ok.png");
tail j=7035 line= img_kb: url("/imgs/btn/kb.png");
tail j=7036 line= img_kw: url("/imgs/btn/kw.png");
tail j=7037 line= img_ki: url("/imgs/btn/ki.png");
tail j=7038 line=
tail j=7039 line= img_kob: url("/imgs/btn/kob.png");
tail j=7040 line= img_kow: url("/imgs/btn/kow.png");
tail j=7041 line= img_kib: url("/imgs/btn/kib.png");
tail j=7042 line= img_kiw: url("/imgs/btn/kiw.png");
tail j=7043 line=
tail j=7044 line= img_koeye: url("/imgs/btn/koeye.png");
tail j=7045 line= img_koeyeb: url("/imgs/btn/koeyeb.png");
tail j=7046 line= img_koeyew: url("/imgs/btn/koeyew.png");
tail j=7047 line= img_koeye_handhither: url("/imgs/btn/koeye_handhither.gif");
tail j=7048 line= img_koeye_handhi: url("/imgs/btn/koeye_handhi.gif");
tail j=7049 line=
tail j=7050 line= img_kop1: url("/imgs/btn/kop1.png");
tail j=7051 line= img_kop2: url("/imgs/btn/kop2.png");
tail j=7052 line= img_kop3: url("/imgs/btn/kop3.png");
tail j=7053 line= img_kop4: url("/imgs/btn/kop4.png");
tail j=7054 line=
tail j=7055 line= img_kop12: url("/imgs/btn/kop12.png");
tail j=7056 line= img_kop23: url("/imgs/btn/ko23.png");
tail j=7057 line= img_kop34: url("/imgs/btn/kop34.png");
tail j=7058 line= img_kop14: url("/imgs/btn/kop14.png");
tail j=7059 line=
tail j=7060 line= img_btn: url("/imgs/btn/btn.png");
tail j=7061 line= img_btn_n: url("/imgs/btn/btn_n.png");
tail j=7062 line= img_btn_s: url("/imgs/btn/btn_s.png");
tail j=7063 line= img_btn_e: url("/imgs/btn/btn_e.png");
tail j=7064 line= img_btn_w: url("/imgs/btn/btn_w.png");
tail j=7065 line= return(img);
tail j=7066 line= }
tail j=7067 line= </script id="script_load_urlbtn">
tail j=7068 line=
tail j=7069 line=
tail j=7070 line= <script id="script_load_b64btn" >
tail j=7071 line= function load_b64btn(btnid) {
tail j=7072 line= ko_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAE1FJREFUeNq0m09sI9d5wH/fG1I7FEXJWi4trow0cpKDgSBA4FzUS9tL29W5h0WSNg0QA/WaVNEI9tWHRZGitSEXEendAknhokWBHHr1Oj0VPRQC2hpt3AB7KBDFi11zJVFckZI4FGfe18ObIWck6t/aJRbickgO3+99f9/3vSfK1R/bQYWOT4MaNF8LcPeQBffUQgFRcpH7uKKegEaCAFrlqXrFe6/9cAOGsAYbQfGw0gcgYJ4d/8WrDkmuzrHX+I5IVYlQAdj1whwQ3nS3CslJC0ATDjT3H98qtwkFQaHiSUv/63fxRHmqOYBp78AP3tpYZSOgOLWt/1gvXA3mihx7eyILUU5FeZqM0aIS5cPrnYqheKW7HWJ3UJ2b6a2Orq2vueeNnl4vFP5fOHrbVRgTAEqOSKKXnkjhQOWl6StK9vY9P3rv+28BrANgjTUAOJi/bb1Y+sI5tiwLjkBFIQcMRbDT/ZsHxW6vFAhF/7h8RR0NV1kHbPayscaxbByYpS+UY+vFlqNQcgzBmeyc8CxXfvLiERxjEcoBlasIBNZHECvu6cEIxrmAme2lL4zj7h+qOIYhIIi+eNykTqEXlMMjgCDyDFiE4qVJbsN6DLHyiTqn4XzdUSdBWYMfyVe+II6tSBLvqSY0M6ZZv/PLTX6wMTvgCPCfffwqonz8KiBl3nv7ShQr/EJJj0PAfOPBygMAswY/8pa+CI6735U4BACl5lvf/yWfHHauBXP0PMAP/u1VkMT0ReUyIrkdU6wA/62MZBHfSDDfcCpmWLsEyGU4/ldywxyUoV2c2Z1nmc39ta//mR75AeDzjOxcqpS5yM/cHlPwScSpUQiYo2VnLYY1/nLp83P82gplgGhY/+kym+yv/U2e4/jdyOhUW1IeRwCKpnxJYWwyrXYSiJij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");
tail j=7073 line= ok_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD9/f0bIQwZHgowLzEoKCohISIvMDU1NjoqLDOCg4S1trQUGQemqZ54e28fIxE0NiyFiXaSlYZNTkkuMCNZWlRvcGonKRo9PzEKCgUREQtBQUDU1NMZGBQfHhp9fHozLiv8/Pz5+fn39/f09PTv7+/n5+fe3t4AAADXRk1jAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////6eH29uXl7e3t7e3t9uHs4elWVlbk5OTp6elW5YHq39zd9PTc3d3d3dzc297f39/e29zc3d3d3d3d3eDc3N3c3Nzc3d319PT09PT03dzc3Nzc3N3d5YHs7OyBge3t5fb24en/////////////////////////////////////////////////////////////////////AP//////////////////////////////////////////////////////////6eH27YHb3PLs4eHpVlbpVuHp4e3q4ODg4ODc3fT09fTx8azc3fX08dzc3N3d3Nzb39/y36zg3N3d3d3d3d3d4Nzd3d3d3fX08PD09PT09PT13ODg4ODc4N3x8fHx8fDx8fT09d3c24Ht//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////9u3b3OlWVlZWVlZW5FZWVlZWVlZWVlbp9urb3N3d8vT0//////////////////////////////////////////////////////////////T08t3u3ODb3t3e3uDc3d3d3d3d3fT09fT18fTd3Nvt/////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////8tz0VlZWVlZW5OTk5OTk4uTi5OTk5OTkVlZWVlbhgfL17Vb////////////////////////////////////////////////////////////////12tna5t3c9tve3eDg3Nzd3d3d3d3d3d3d9PT19PT03PL/////////////////////////////////////////////////////////AP//////////////////////////////////////////////////393pVlZWVuTk5OLk4uLi4uLi4uLi4uLi4uLi5OTk5FZW6e3//////////////////////////////////////////////////////////////+zy6t/f3ubZ5vTp9dzl293d3Nvg4ODg3Nzc3dzd3d3d3d303d3f//////////////////////////////////////////////////////8A////////////////////////////////////////////////3/XpVlZW5OTk4uLi4uLi4uLiKysrKysrK+Li4uLi4uLk5ORWVlb//////////////////////////////////////////////////////////+rq8t/f3t7g4Obm5vDa9OHd7e3s3d3d3dzc29vb4ODc3N3d3d3d9N313////////////////////////////////////////////////////wD//////////////////////////////////////////////93cVlZW5OTi4uLi4uLi8/38/Pz8/f39/f39/P3+K+Li4uLi4uTkVlZW/////////////////////////////////////////////////////+rq39/e3uDg4N7b3ubm5ubm8PTh6fbt7YGB7PLc3dzc29vb2+Dc3N3d3d3c3YH/////////////////////////////////////////////////AP///////////////////////////////////////////9/cVlZW5OLi4uLiK+Ir/vz8/Pv7+/v7+/v7+/v7+/z8/Ssr4uLi4uLk5FZWVv///////////////////////////////////////////////4Hy8t/e3t7erN7e397erN7u5ubm5vDw9+lW8/MrVu2B7Ore3ODe39/e29zc3d3d3N////////////////////////////////////////////////8A///////////////////////////////////////////f3FZW5OTi4uLi4isr/vz8+/v7+/v7+vr6+vr7+/v7+/v7/CsrKyvi4uLi5ORWVv/////////////////////////////////////////////q6t/e397f39/f39/f397e3qzm7ubm5ubj8PDh6eLz/isrVvaB7N/f39/f397b3Nzd3IH//////////////////////////////////////////////wD/////////////////////////////////////////31ZW5OTi4uLiKysr8/37+/v6+vr6+vr6+vr6+vr6+vr6+vv7/isrKysr4uLi4uTkVv//////////////////////////////////////////8vLf3t/f397e3t7e3t7e3t7e3t7u7ubm5ubu5vDxgVbk8ysr8/Pi9urf8vLy39/f2+Dc2///////////////////////////////////////////////AP///////////////////////////////////////+BWVuTk4uLiKysrK/P9+/r6+fn5+fn5+fn5+fn5+fn5+fn6+vz98/MrKysr4uLi4uTkVlb/////////////////////////////////////7Orf39/f397e3t7e3t7e3t7g4N/y7O3r7u7u7u7u7u709O9W5PPzKyvzVurv8vLy8vLf397g//////////////////////////////////////////////8A///////////////////////////////////////yVlbk4uLiKysrKyvz/v38+/z8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/f7+/vPzKysrK+Li4uLkVlb//////////////////////////////////+ry39/f39/e3t6s3t7e3t7g4PLt4eHh4eHn6+vr6+vr5+fr693y5OQr8/Mr7fLy8vLq8vLy39/b4P///////////////////////////////////////////wD/////////////////////////////////////6lbk5OLi4uIrKyvz/v7+/f39/fz9/Pz8/Pz8/Pz8/Pz8/P38/P39/f39/v7+8ysrKyvi4uLkVlb////////////////////////////////q8t/f39/f36ze3t7g3t7e4PKB4eHh4eHh4eHv7+/n7+/v7+/v5+fc9+Hk4uTt6urq6urq6vLy8t/e8v//////////////////////////////////////////AP///////////////////////////////////+pWVuTi4uIrKyvz8/7+/v39/fz8/Pz8/Pz8+/v7+/v7+/v7/Pz8/Pz8/f39/v7+8/MrKyvi4uLkVlb/////////////////////////////6t/f39/f39/e4ODg4N7g4ODy7fbh9uHh4eHh4eHv7+/v7+/v7+/v7+/y3+/q7Ozs7Orq7Ozq6vLy8vLf8v////////////////////////////////////////8A////////////////////////////////////VuTk4uIrKysr8/7+/v39/fz8/Pz8+/v7+/v7+/v7+/v7+/v7+/v8/Pz8/P39/f7+8/MrKyvi4uLkVlb//////////////////////////+ry39/f39/e4ODg4ODe3t7g34Hh4eHh4eHh4eHh4eHy8vLy8vLy8vLy8vLq6urs7Ozs7Ozs7IHq6ury8vLf6v///////////////////////////////////////wD/////////////////////////////////7VZW5OLi4isrK/7+/v39/fz8/Pz7+/v7+/r6+vn5+vr6+vn5+vr7+/v7+/z8/Pz9/f3+/vMrKyvi4uLkVv/////////////////////////s8t/f3t/e4ODg4ODg4N7e4ODfgeHh4eHh4eHh4eHh4eHq6urq6urq6urq6vLq6uzsgYHsgezs7Ozs6urq6t/f6v//////////////////////////////////////AP///////////////////////////////4FWVuTi4isrK/Pz/v79/fz8/Pz7+/v7+vn6+fn5+fn5+fn5+fn5+fr5+vr7+/v8/Pz8/f3+/vMrKyvi4uLkVv//////////////////////gd/f3t/e4ODg3uDg4N7e4N7g3t/sge329uH29u2B7e3tgerq6oLqgurqgurs6urs7OzsgeyBgYGB7Ozs7Orq6vLf6v////////////////////////////////////8A////////////////////////////////Vlbk4uLiKyvz8/7+/f38/Pz7+/v6+vr5+fn5+fn4+Pj4+Pj4+fn5+fn5+fn6+/v7/Pz8/f3+/v4rKyvi4uLkVv///////////////////+Xf3t7e4ODg4N7g4N7e3uDe3t7e3t7y6vLy8vLf397e4ODe6+qC6urs7Ozs7Ozs7Ozs7IHsgYGBgYGBgYHs7Ozs6vLf8v///////////////////////////////////wD//////////////////////////////1ZW5OLi4isrK/P+/v39/Pz8+/v7+vn5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+fn5+fn6+/v7/Pz8/f3+/vPzKyvi4uTkVv//////////////////3+Dg4ODg4ODe3uDg4ODg3uDe3t7e3uDg4N7e4ODg4ODe3t7g2+zs7OyC7Ozs7IGCgYGB7IHtge3t7e2BgYGB7Ors6vLq////////////////////////////////////AP/////////////////////////////tVlbk4uIrKyvz/v39/fz8+/v7+vr5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5+fn6+vv7+/z8/f3+/vMrKyvi4uRW/////////////////+rg4ODg4ODg4N7g4ODg4ODe3uDg3t7g4ODg4N7g3t7e3t7e3t7e2+zs7IGBgu2BgYGBge3tge3t7e3t7eXt7YGB7Ozq6vLs//////////////////////////////////8A/////////////////////////////1ZW5OLi4isr8/7+/f38/Pz7+/r5+fn5+Pj4+Pj4+Pj42NjY2NjY+Pj4+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrKyvi4uRW//////////////+B4ODg4ODg4ODg4N7b4ODg4ODg4ODg4ODg3t7e3t7e3t7e4N7e3t7e7+yBgu3t7e3t7e3t7e3t7e3t5eXl5eXl7e2Bgezq6vL//////////////////////////////////wD////////////////////////////hVlbi4uIrK/P+/v39/Pz8+/r6+fn5+Pj4+Pj4+NjY2NjY2NjY2NjY2NjY+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrK+Li5OT///////////////Lf4ODg4ODg4ODg4ODg4ODc4Nzg4ODg4N7e3t6s3t/f397e3t7e3t/f7+3t7e3t7eXl7eXt5eXl5eX29vb29vbl5e2Bgezs8v//////////////////////////////////AP///////////////////////////1ZW5OLiKyvz8/79/f38/Pv6+vn5+fj4+Pj4+NjY2NjY2NjY2NjY2NjY2NjY2Pj4+Pj4+Pn5+vr7+/z8/f3+/vMrK+Li5Fb/////////////8t7g4ODg4ODg4ODg4ODg4ODg4ODb4N7e397f3t/f397e3qze3t7e3t7frIHt7e3l5eXl5eXl5eXl6Ojo4eHh4eH29uXtgezs8uz///////////////////////////////8A//////////////////////////9WVuTi4isrK/P+/v39/Pz8+/r6+fn4+Pj4+PjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz8/f7+8ysr4uLi5P////////////Lf3+Dg4ODg4ODg4ODg4ODg4ODg297e39/f39/e3t7e3uDg4ODg4ODe4N7b5+3t5eXl5ejo6Ojo6Ojo6Ojo6Onp4eHh9vbtgezs6v///////////////////////////////wD//////////////////////////1ZW4uLi4ivz/v79/f38/Pv7+vn5+Pj4+Pj42NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz9/f7z8ysr4uLkVv/////////q8t/e3t7e4ODg4ODg4ODg4ODb3t7e3t/frN7e3uDg4ODc4Nzg3ODg4ODg4ODb6+Xl5ejo6Ojo6Ono6ejp6enp6enp6enh4fbtgezqgf//////////////////////////////AP/////////////////////////lVuTi4isr8/P+/v39/fz8+/r5+fn5+Pj4+NjY2NjY2NjY2NgAAAAAAAAA2NjY2NjY2Nj4+Pj4+Pn5+vv7/Pz9/f7zKysr4uTk//////////Lf4N7e3uDg4ODg4ODg4ODg3t7g3t7e3uDg4ODg3ODc4ODg4ODg4ODg4ODc4Nzg6+Xo6Ojo6ejp6enp6enp6enp6elWVunp6eHtgYHq7f////////////////////////////8A////////////////////////7Vbk4uLiKyvz8/7+/f38/Pv7+vn5+fn4+Pj42NjY2NjY2NjYAAAAAAAAAAAAANjY2NjY2Nj4+Pj4+fn5+vv7/Pz9/v7zK+Li4uT////////t397e3t7g4ODg3t7e3t7g4ODg4N7g4ODg4ODg4ODg4N7e3t7e3uDg4ODg4ODc3Nzc4Ojo6Ojo6enp6enp6enp6enp6elWVlbp6eHt7YHs7f///////////////////////////wD//////////////////////+WBVuTi4isr8/P+/v39/fz7+/r6+fn5+fj4+PjY2NjY2NjY2AAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn5+vv8/P39/vPzKyvi5Fb//////+zf4ODg4ODg4N7f39/f39/e3uDg4ODg4ODg4ODg4ODg4N7e3t7e4ODg4ODg3Nzc3Nzc3Ojo6enp6enpVuTkVuTk5ORW5OlW5FZW6eH27YHs////////////////////////////AP/////////////////////27O3k4uIrKyvz/v7+/f38/Pv7+vn5+fn5+Pj4+NjY2NjY2NjYAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn6+/z8/P3+/vMr4uLi5P//////8t7g4N7e39/f39/f39/f39/e3t7g4ODg3uDg4ODg4ODg4ODg4ODg4ODg4ODg4ODc3Nzc3O7p6enp6eTp5Onk5OTk5OTk5OTkVuRWVuH27YHs9v////////////////////////8A//////////////////+s4eyB4eLi4isr8/P+/v39/fz7+/r7+/r6+vn5+Pj4+NjY2NjY2AAAAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj5+fn6+/z8/f3+8ysr4uLk///////e4ODe39/f39/f39/f39/f397e3t7g3t7g4ODg4ODg4ODe3t7e3uDg3t7e2+Dg4Nzg4Nzd8fXp6Vbk5OTk5OTk5OTk5OTk5OTk5Fbp4eH27YHs/////////////////////////wD////////////////y4ezsgYHi4isrKyvz/v79/f39/Pz8+/v6+vr6+fn4+Pj4+NjY2NgA+fn5+fj4+fn5AAAAAAAAAADY2NjY2Pj4+Pj5+fr7+/z9/f7z8yvi4uRW////7ODg4N7f39/f39/f3t/f39/e3t7g4ODg4ODg4ODg4N7e3t7e3t/f3t7f397f39/f4ODg4ODd9PTu5OTk5OTk5OQs5CzkLOTk5OTk6enp4fbt7YH/////////////////////////AP/////////////t4ezq7IGB7eLiKysr8/7+/v39/fz8/Pz7+/r6+vr5+fj5+Pj4+NjYAPn6+vr6+vr6+vn5AAAAAAAAAADY2NjY2Pj4+Pn5+fr7/Pz9/v4rKyvi4lb////y4ODe3t/f39/f397e3t7e4N7g4ODg4ODc4ODg4ODg3t7e3t7e3t7e3t7e3t/f39/g4ODg4ODd8fHj5unk5OQs5OLk4uTi5Czk5OTk5Ono6OXtgYHs6v////////////////////8A/////////////4Hq6uzs7IHt4uIr8/P+/v79/f38/Pz8+/v7+/r6+fn5+fj4+Pj42Nj5+/r8+/v7+/v7+fr4AAAAAAAAANjY2NjY+Pj4+Pn5+vv8/P39/vMrK+Lk5P///97g4N7e3t/f3t7e4ODg4ODg3ODc4ODc4Nzc3ODg4N7g3uDe3t7e3t7e3t7g3t7g4ODg3Nzc3dz19PT049nk5OTk5OTk5OTi5OTk5OTp6eno5eWB7Ozs/////////////////////wD//////////+Xs6urq7Ozt6OTiKyvz8/7+/f39/Pz8/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+fn5+fv7+vr4AAAAAAAAANjY2NjY+Pj4+fn6+/v8/f3+8ysr4uLk///s4ODe3t7f3t7e3uDg3Nzc3Nzc3Nzg3ODc3d3c4ODe4N7g3t7e3t7g4ODg4N7g4ODc4ODg3N319fX09PX08fDx5uTk5OTk5OTk5OTk5OTp6eno5eXt7Ozq6ur/////////////////AP///////+3s6urq7OyB7e3o5OIrK/P+/v39/fz8/Pz7+/v6+vn5+fn5+fn5+fj5+Pn6+/v7+djY2NjY+fv6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT///Lg4N7e3t7e4ODg3Nzc3N3c3dzc4Nzg3fX19PXd3ODg4ODe4N7e4N7e4ODe4ODg3ODg3ODd9fX09PT09fX18fDw8OPu6eTk5OTk5Onp6enp6Ojo5e3t7Ozs6urq7P////////////8A5Fbh7IHs7Ors7Ozs7O3t5eji4isr8/7+/f38/fz8+/v7+vr6+fn5+fn5+fn5+fn5+vr7+/nY2NjY2NjY+fv6+fkAAAAAAAAA2NjY2Pj4+Pn5+fr7/Pz9/v4rK+LiVv/t3t7g4ODe4ODg3Nzd3Nzc3fX13dzg3Nz19fX19fX13dzg4ODg4ODe4ODg4ODg4ODg4ODg3PX19fT09PT19fX19fX19fXu7urs6enk6eTp6enp6Ojl5e3tguzs7Ozq7OyB7IH26eXt9wD19fX19Nrj4+Pj49ra4+Pa2lbiKyvz/v39/fz8/Pz7+/r6+fn5+fn5+fn5+vn5+fn7+/v6+NjY2NjY2NjY+fv6+QAAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMrK+LkK+zd3uDg3ODg4Nzg3fX13d319fX13eDg9fX13fX19fX09d3c3ODc4Nzg4Nzc3Nzg3ODb4Nz19fX19PT09PT19fX19fX19fX13Ovc6+vr5u7q7IHt9unpVuTi4uLi4isrKysr4uLi5FboAP//////////////////////K+IrK/P+/v39/Pz8+/v6+vn5+fn5+fn5+vr6+vr5+vv7+vjY2NjY2NjY2NjY+fn5AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8yvi4uQr8vXb3dzd3dzg3N319fXd9fX09fXc3Nz19d3u9fX19PT03dzg4ODc3N3c3d3d3d3d3dzc9fX19PT09PT09PX09PX19fX19fX13dzc4ODe7P////////////////////////////////8A///////////////////////i4isr8/7+/f38/Pv7+vr5+fn5+fn5+fn5+vr5+vn6+/v52NjY2NjY2NjY2Nj6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7/Pz9/v7zKyvi4ivn9d319d313d319fX19fX19PT09Nzc3PT19fX19PX19fX03Nzg3d313fX19fX19fX19fT09fT09PTx9PT09fTx9PX19fX19fX13d3c297s/////////////////////////////////wD//////////////////////+LiKyvz8/79/fz8+/r6+fn5+fn5+fn5+vr6+/r7+vv8/PnY2NjY2NjY2NjY2Pn6+fgAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMr4uLk/ef19fT09fX19fX09fXd9fX09PT13dzd9fX09fX09PT09PXd4Nz19PT19PT09fX13fX19PT19PT09PT09PT19PH09PT09fX09fX19d3c3uz/////////////////////////////////AP//////////////////////4uLiK/Pz/v39/Pz7+vn5+fn5+fn5+fn6+vv6+/r7+/v8+fjY2NjY2NjY2Nj4+fn4AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8ysr4uLz5/X09PX19fX19fX19fX19fX09PT19fX19PT09PT09PT09PXc3fTx9PH09PT09PT09PT09PT09PT08fT09PX08fHx8fT09PT09fX19e7e7P////////////+GchQ3AAAfU0lEQVT///////////////////8A///////////////////////i4uIr8/P+/vz8+/v6+fn5+fn4+fn5+fr6+vr7+/v7/Pz5+PjY2NjY2NjY2Pj5+fkAAAAAAADY2NjY2Nj4+Pj5+fr7/Pz9/v7zK+Li5OLv9PHx8fHx9PT09PT09PX19fX09Nr09PX19fT09PT09PX19fX19PH08fTx8fH09PT09PT09PT09PTx9PH09PX08fT09PT09PT19fT13d7s/////////////////////////////////wD//////////////////////+Li4isr8/79/fz8+/r5+fn5+Pj5+fn5+fn6+vv7+vz8/Pr4+NjY2NjY2Nj4+fn5+djYAAAAANjY2NjY2Pj4+Pn5+vv8/P3+/vMrK+Li/+ra8fHx8fD09PHx8fT09PT09PTa2ub19fTd9fX19fXd9fXm5ub09PT08fHx8fH09PX09Ob09PT09PHx9PT09fTx9PX09PT09fX19PX12+z/////////////////////////////////AP///////////////////////+TiKyvz/v39/Pz7+vn5+fn4+Pn5+fn5+fr6+vv7/Pz8/Pr4+NjY2NjY+Pn5+fj42NjY2NjY2NjY2NjY+Pj4+fn6+/z8/f7+8yvi4uT/gebw8fHw8PDx8fHx8fT09PT09PTa9PT09PX19d313fXd9ebm5ubZ9fT08fH09fX15ubm5ubm5vT09PTj2trm5vT09eb19fX09fX05t3r6v////////////////////////////////8A8u/n6+vr6+vn7+/y6uzt6Fbk4ivz/v38/Pz8/PP+/v7+/fz6+fn5+fn5+fn6+vr7+/z8+/r42NjY2Pj5+fn5+dj42PjY2NjY2NjY2Pj4+Pn5+fr7/Pz9/v7zKyvi5P//5+Pw8fHx8PDw8PHx9PTx8fH08fT09PT09PT19fX19fXd9fTm5ubm5ub02tnm5ubm5tnZ2ubm5tra2trZ2ebm5ubm5ubm5ubm5ubm3evc/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+QDu9+3l6faB7IHs7Orq7Ozs7IHt5eXo6Ojp6enpVlZWVunp6eriK/v5+fn4+fn6+/v7/Pz8+/r5+fn5+fn5+fj4+Pj4+Pj42NjY2NjY+Pj4+fn5+/v8/P398ysr4uLk///q2uPj4/Hw8PDw8fH08fH08fHx4/T09PT09PT19fX19fX13eb05vTm5ubZ2dra2tra49ra2drZ2dnZ2dnZ2uba2tna5tn05ubm5u7m6+rp6enp6Ojl5e2Bgezs6uzq7OyB7IH26eXtAP/////////////t7Ozq6uzsge3t5ejo6enpVuTk6eTk5OTk6eTp5P35+fj4+Pn6+vv7/Pz8+/v6+vr6+fn5+Pj4+Pj4+PjY2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT//+3u2uPj4/Dw8PDx8fHx8fH08fH08fT09PT09PT09fX13fXd9ebm2dna2dnZ2drZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tnm5ub17u7r8unp6ejo6OXtgYLs7Orq6uz///////////8A////////////////5ezq6uqC7IHl5ejo6enp5OTk5OTk5OTk5OTkVlbk/fj4+Pn6+/v7+/v7+/r6+vr5+fj5+fj4+Pj4+Pj42PjY+Pj4+Pn5+vv8/P39/vMrK+Li5P///+fa4+Pj4/Dw8PHx8fHx8fHx8fTx8fT09PT09PX19fX13fXd9eba2dra2tra2trZ2tna2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ5vT19fXu3efs5Onp6ejl5YHs7Orq6uz//////////////wD//////////////////4Hq6uzs7IHl6OjpVunk5OTk5OTk5OTk5OTk5ORW5Pz4+Pr6+/v7+/v7+vr6+fn5+Pn5+fj4+Pj4+Pj42Pj4+Pj5+fn7+/z8/f7+8ysr4uTi////8tna2uPj8PDw8PDw8fHx8fHj9PT08fT09PT19PX19fXd9fX12tra2tra2tra2tra2tra2tra2dnm5tna2tra2trZ2vT09fX13d3u5+3p6eno5eWBgezs6uqB////////////////AP//////////////////7eHs6uyBge3l6Onp5OTk5OQs4iziLOLkLOTk5OTk6eT8+fr6+/v7+/r6+vn5+fn5+fn5+fj4+Pj4+Pj4+fj4+Pn5+vv7/Pz9/v7zK+Li4v/////t7tna4+Pw8PDx8PDw8fHx8eP09PTx9PT09PX09fX19fX13fX02tra4+Pj2tra2tra2tra2trZ2dra2tra2uPj2tr08fT09PX19e7v7eTp6Ojl7YGB7Ors//////////////////8A////////////////////5fLh7OyB7e324ejp6eTk5OTk5OTi5OLk5OTk5OTkVunk/Pr5+/v7+/v6+/r6+fn5+fn5+fj4+fn5+fn4+Pj4+fn6+/v8/f3+8/Mr4uJW///////n5trj4/Hx8PHx8fHx8PHj8fT09PT09PT09PT19fX19fX19OPj4+Pj4+Pj2uPa2tra2tra2tra4+Pa2trj4+Pa2vHx9PT09fX17vLp6enh9u3tgers//L//////////////////wD///////////////////////Ks4eyB7eXh6elW5OTk5OTk5OTk5OTk5OTk6eTp6enp9vv6+vv7+/v7+/v6+fr5+fn5+fn5+fn5+fn5+fn5+fr7/Pz9/f7zKyvi4uL//////+rm2drj4/Hw8fHx8fDx4+P09PT09PT08fHx8fT09fX19PT04+Pj2uPj4+Pj2tra2tra2trj2ub09ebm49rj4+P09PHx9PH09PXr7Onp6eHl7YHs////////////////////////AP/////////////////////////y9uyB7fbh6Vbk5OTk5OTk5OTk5OTk6eTk6enp6enoVvn6+vv7+/v7+/r6+vr5+fn5+fn5+fn5+fn5+fn6+/v8/P3+/vMr4uLk4v///////+7m2drj4+Pj4/Dx8fDj4+Pj4/Tj9PHx8fHx8fTx9PT04+Pj4+Pj4+Pj4+Pa2tra49rj4/T19fT19e7m4+Pj4/Tx8fHx8Nr09OeBVlbh9u2B7Pb///////////////////////8A///////////////////////////c7eyB7fbh6Vbp5Onp5Onk5Onk6enk6enp6enp6Ono6fz6+/v7+/v7+/r6+vn5+fn5+fn5+fn5+fn5+vv7/Pz9/f7zKyvi4uT/////////5+bZ2ePj4/Hj4+P02uPj4+Px4+Pj4+Px8fHw8PDw8fHx4+Pj4+Pj49ra2dra2trj4/Tm9fX09PX09fX04+Pj9PHx8fHj9PH03+lW4fbtgezl8v///////////////////////wD////////////////////////////g7eqB7e3h6VbpVuTp6enp6enp5Onp6enp6ejp6Ojo5fv6+/v7+/v6+vr6+fn5+fn5+fn5+fr6+fr7+/z8/P3+/vMrK+Li///////////q5tnZ2drj4+Pj8Nr04+Px4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj8ePj2tra2uPj4+Pa9fX09PT09PTa9OPj4+Pj8fH09PTj8e7s6fbt7YHs7fL/////////////////////////AP/////////////////////////////bgeqBge3h4enp6Vbp6enp6enp6enp6eno6ejo6Ojl7fr6+vv7+/v7+vr6+vr6+vr6+vr6+vr6+/v8/Pz9/f7z8yvi4lb////////////u5tnZ2dna4+Pj9OPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Px4+Pj2trj4+Pj4+Pa2ub02vTa9OPj4+Pj4+Pj4+Pj4+bm2tra5/bh7YGB6oHy//////////////////////////8A///////////////////////////////bgezsge324eHp6enp6enp6eno6ejp6Ojo6Ojo5eXlgfr6+/v7+/r7+vr6+vr6+vr6+vr6+vv7+/z8/f3+/vMrK+Li4v////////////Lm5tnZ2tna2tra4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj8ePj4/Ta2uPj2tra4+Pj4+Pj9Nrm5u7y9u2B7OqB8v///////////////////////////wD////////////////////////////////f8uzsge329uHh6enp6Ojo6Ojo6Ojo6Ojo5eXl5eXt7Pv6+vv7+/v6+vv6+/r6+/v7+/v7+/v8/Pz9/f7zKyvi4lb//////////////+7m2dnZ2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj2tra4+Pj2uPj49rZ5ubu5+3tgezs6vL/////////////////////////////AP///////////////////////////////9/s8uzsge3l9vbh9uHh4ejo6OXl6OXl5eXl5e3t7e3t7Pv6+/v7+vv7+/v7+/v7+/v7+/v8/Pz8/f3+8/MrK+JW4v//////////////8ubm2dnZ2tra2tra2trj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj2uPj49ra2trj4+Pj4+Pj4+Pa2tra2dnZ2dnZ2ebm7uvf7YHs7PLs7P////////////////////////////8A/////////////////////////////////9zq6ursgYHt5eX29vb29uXl9uXt5eXl5eXl5e3tgu2B7Pv6+/v7+/v7+/v7+/v8+/z8/Pz8/P39/v7zKyvi4uT/////////////////6+bZ2dna2tra2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pa2tra2uPj4+Pa4+Pa2tnZ2dnZ2dnZ2dnZ5ubm5+yB7Ozy7PL//////////////////////////////wD//////////////////////////////////9/f6uzs7IHt7eXl5eXl5e3t7e3t7e3t7e3t7e3tgYLs7Pv7+/v7+/v7/Pz8/Pz8/Pz8/Pz9/f7+8ysr4uJW4v/////////////////q7ubZ2dnZ2tra2tra2tra2tra2trj4+Pj49ra49ra2uPj4+Pa2uPj4+Pj4+Pj2tra2tnm2dnZ2dnZ2drZ2dnm5uvf7Ozq6vLy////////////////////////////////AP//////////////////////////////////8urf6uzs7Ozt7e3t7e3t7e3t7YGBgYGBgoGCgYKB7Ozs6vv7+/v8/Pz8/Pz8/Pz8/Pz9/f3+/vPzKyvi5OL////////////////////v5ubZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2uPj4+Pj4+Pj49ra2trZ2dnZ2dnZ2tnZ2dnZ2dnZ5ubu7+zs7Orf7IH///////////////////////////////8A////////////////////////////////////3/Ly6urs7IGB7e3t7e3t7YGBgoGC7OyB7IHs7OyC7Ozs6vv7/Pz8/Pz8/fz9/P39/f39/v7z8ysr4uLk///////////////////////r5ubZ2drZ2dnZ2tra2tra2dra2tra2tra2tra2tra2tra2tra2tna2dnZ2dnZ2dra2trZ2dnZ2dnZ2dnm7ufq6uzq3+zq/////////////////////////////////wD/////////////////////////////////////3t/y6urs7OyBgYGBgYGBgYHsgYHs7OyC7Ozs7Ozsgurq7Pz8/Pz8/f39/f39/f39/v7+8/MrK+LiVv/////////////////////////u5tnZ2dra2tra2tra2tra2tra2tra2dra2tra2tra2tnZ2dra2dnZ2dnZ2tra2tnZ2dnZ2dnZ2dnZ5u7n5+zs8vLf8v//////////////////////////////////AP/////////////////////////////////////e8t/y6urq6uzs7OzsgYHsgezs7Ozq6uzs6oLq6urqgurq6vz8/f39/f39/v7+/v7+/vMrKyvi4v///////////////////////////+rm5tnZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2drZ2tra2tra2tra2trZ2dnZ2dnZ2dnm2ebu79vq6ury3+rs//////////////////////////////////8A///////////////////////////////////////c39/y6urq6uzsgezs7OyB7Ozs6urq6urq6uqC6urq6urq/f39/f39/v7+/v7z8/MrKysr4uL///////////////////////////////Lm5tnZ2dna2tra2tra2tra2tra2tra2tnZ2dna2dnZ2dra2tra2tra2trZ2dna2drZ2dnZ2ebu7uvc6urq8t/q8v///////////////////////////////////wD////////////////////////////////////////c39/f8urq6urs7Ozs7OyB7Orq6vLy7+/v7+/v7+/v7+/v9vz8/f3+8/PzK/MrKysr4uLi/////////////////////////////////+/m5tnZ2dnZ2trZ2tra2tra2dna2tnZ2tra2tra2tra2tra2tna2tnZ2drZ2dna2dnZ2ebm5uvr3Ory8vLe6vL/////////////////////////////////////AP/////////////////////////////////////////b39/y8vLy6uzs7Ors7Ozs7Orv7/Ly7+/v7+/v7+/v7+/v8vz8/vPzKysrK+Ir4uLi4v///////////////////////////////////+/m5tnZ2dna2tra2tra2tra2tra2dna2tra2tra2tra2dnZ2dnZ2drZ2tna2tnZ2dnm5u7r7tzy8vLy3vLq//////////////////////////////////////8A///////////////////////////////////////////c397f8vLy6urq6vLq6u3k4uTh9+vn5+/v7+/v7+/v7+/v/P3zKysrK+Li4uLi4lb///////////////////////////////////////Lu5tnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnm5ubu5+7c8vLy397y6v///////////////////////////////////////wD////////////////////////////////////////////c3Nve3/Ly8ury8vLy7Svz8yvk5PLu6+vn5+vr6+vr6+frKysr4uLi4uLi5Fb//////////////////////////////////////////+/u5tnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ5ubm7ufu3PLy397b4PL/////////////////////////////////////////AP/////////////////////////////////////////////03ODe3t/y8vLy8vLqVvMrK/Pz5Fbv9PTu7uvu7u7u7uvu4uLi4uTk5FZW//////////////////////////////////////////////Ln5ubZ2dnZ2trZ2dra2trZ2dra2tra2dra2tra2tnZ2dnZ2dnZ2dnZ5ubm7u7u9dzy39/e4N/c7P////////////////////////////////////////8A///////////////////////////////////////////////f3Nzg29/f3/Ly79/q9uLz8yvz8+RWgfHw5ubm5ubm7u7u4uTk5FZW/////////////////////////////////////////////////+rv7ubm5tnZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2tra2trZ2drZ2dnZ2ebm5u7r7t3f39/b4Nzb3////////////////////////////////////////////wD////////////////////////////////////////////////f3N3c3Nve3t/y39/f6oH2VuLz8/Pi6eHw8OPm5ubm7ubuVlZWVv/////////////////////////////////////////////////////g5+7m5tnZ2dnZ2dnZ2dnZ2dnZ2tra2trZ2dna2dnZ2dnZ2ebm5ubu7u7d3t7b3Nzd3N//////////////////////////////////////////////AP/////////////////////////////////////////////////f3N3d3Nzc297f397e3N7q7IHtViv+81bp5/Dw5ubm5ubu6v/////////////////////////////////////////////////////////y3Ofm5tnm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ5ubm5ubu5+713tvc3Nzd3dzf//////////////////////////////////////////////8A///////////////////////////////////////////////////s3d3d3d3d3Nzg29vb29zc3eDy7IGB7e324en08Obm5ubm6///////////////////////////////////////////////////////////8uvr7ubm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnm5ubm5ubu5+713dzc3d3d3dzd8v///////////////////////////////////////////////wD/////////////////////////////////////////////////////3/Xd9N3d3d3c3Nzc4Nvb2+Dd3d3d3eztgd3h9Nrw5ubu7v///////////////////////////////////////////////////////////9/n6+7m5ubm2dnZ2dnZ2dnZ2dnZ5ubm5ubm7u7r7t303d3d3d3d9N303///////////////////////////////////////////////////AP///////////////////////////////////////////////////////9/d3fTd9d3d3d3c3Nzc3Nzg4ODb3N3d2+Xc3ena5tnm5v/////////////////////////////////////////////////////////////y2+fr7u7m5ubm5ubm5ubm5u7m7u7u6+fu3fT09d3d3d3d9N3d3/////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////f4PTx9PT03d313d3d3d3d3Nzc3Nzb3dvb9tz15trZ2uv//////////////////////////////////////////////////////////////93d9+fr6+vr7u7u6+vr6+v19OPd9PT03d3d9PT08fTc8v///////////////////////////////////////////////////////wD////////////////////////////////////////////////////////////////e3N3x9PT09PX03d313d3d3Nzg3t7d29vg3O718vT///////////////////////////////////////////////////////////T08vXd3d3d3fH08fHx8fHx9PX09PT19PT09PHd3N7t////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////+B3uDd3fX09PTd3d3d3d3d3dzc4ODg3N319PX19d3f39/f/////////////////////////////+Xtgezs6vLy8urs9PT09PT03dys8vLq8t736+vr6+719PTd9N3d4OCB//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////////////////////////9u3t7dze3d3c8t3d29/f8t703dze3ODd3d3d3dzc34Hs6vLf29zc3Nzb39zh7YHq8t/b8vLy8t/e3Nzc3t/p6enh4YHh4eHs8vLf8t7f3t7f8vLy8uzsgYHt9v///////////////////////////////////////////////////////////////////5cpK5EsZ8r3AAAAAElFTkSuQmCC");
tail j=7074 line= kb_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAABRCAMAAAB7eHFAAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAyMjc2NjpCQkZJSUxUVFc8PD6Dg4YmJywrLDEtLjMvMDUpLDQsLzd9f4UoKi9wcnclKzcjJCYvMik1OC8jKBYUGQYSFgYYHQkZHgoVGQkQEwcbIA0eIxAqLSEYGg8KCgYPDwoiIh8bGhUUEw8gHxseHBgYFhMAAAD3jX3ZAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGvBJREFUeNoB5Roa5QD///////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////d/d2ebh4eDg////////////////////////////////////////////////////AP////////////////////////////////////////ys29rd2dis2KzZ2dnd2trd2Nna/////////////////////////////////////////////wD////////////////////////////////////qrNrZ4N/f39/f5ubm5ubm4ODg4djZ3dvZ2v////////////////////////////////////////8A/////////////////////////////////9zb2ODp39/f3+Dg5ubm5ubm5ubg4ODg4OHi2Nnb2dv/////////////////////////////////////AP//////////////////////////////6qys5uDm4ODg4ODg4ODg4ODm5ubm4ODg4ODg4OHi2Nnd293//////////////////////////////////wD////////////////////////////q6tnh4eHh4eDh4eDg4OHh4eHh4eHg4eHh4ODh4eDg4ODh2Njd293///////////////////////////////8A/////////////////////////+vq3eLh4uHh4eLi4uLi4uLi4tji4uLi4uLi4eLi4tjY4uLi4uLi4tnd3dz/////////////////////////////AP///////////////////////+rbrOHh4ODg4eLY2NjY2NjY2NjY2NjY2OLi4uLi4tjY2NjY2NjY2NjY2dnb2v///////////////////////////wD//////////////////////+rd4eDg4ODi2NjY2NnZ2NjY2NjZ3d3d3djk4uLi4uLi4eLi4tjY2NjY2NjY2d3a//////////////////////////8A/////////////////////9nY4Obg4OLY2NnZ2dnZ2dnY2Nvn3t7e3uXe5efc2tjj4+Ph4eLi4uLi4uLZ2djZ2dvb////////////////////////AP///////////////////9vh5ubh4tjZ2dnZ3d3d3dnZ2oHe3t7e3t7e3uXl5eXl59ro5OLi4uHh4uLi4tnZ2dnZ2tr//////////////////////wD//////////////////93m5uDi2NnZ2NjZ2d3d2dnZ3OXe3t7e3t7e5d7l5eXl5eXlgdno4eHg4OHh4uLY2dnZ2dnd3f////////////////////8A/////////////////93g4OHY2dnZ2d3d2d3Z2d3d2ufe3t7e3t7e3t7e3uXl5eXl5eXn2ujj4+Pg4+Dh4tjZ2djZ2d3a////////////////////AP///////////////93i2NjZ2d3d3d3d3d3d3d3d3drn3t7e3t7e3t7e5d7l5eXl5eXl5YHk6OHh4eDj4+Pj5NjZ2NnZ3dr//////////////////wD//////////////9vZ2dnd3d3d3d3d3d3d3d3d3d3d3OXe3t7e3uXe3uXl5eXl5eXl5eWB2ePh4eHg4+Pj6Ojj5NjY2Nnd3P////////////////8A/////////////9/d3dnd3d3d3d3d3d3d3d3d3d3Z2d3b3NzcgYGBgeeB5+fn5eXl5+eB3OTk4eHh4ePg4+Pk4+Po5Njk2Nnb////////////////AP/////////////d3d3d3d3Z2dnZ2d3d3d3d2dnZ2azY4uHh4Obj5OHj5OHY3dra2tra2uTY4uHh4eDh4eHg4eHk4+jk5OTk2Nv//////////////wD////////////a3d3d3dnZ2NjYrNis2dnYrNjYrOLh4ODg4ODg4eHh4eDg4ODg4OHg4ODh4uHh4eHg4ODg4ODh4ePj6Ojo6Ojk3P////////////8A///////////b3d3Z2dnY4uHg4ODg4eHg4ODm4ODg4ODg4eHh4eLi4uHh4eHh4eHg4ODg4OHh4ODg4eDg4ODg4OPg4+Pj5Ojo6Nn/////////////AP//////////3dnY2Nji4Obf39/f39/f39/m4ODg4eHi2NjY4uHh4eDh4eLi4eLi4uHg4ODg4ODg5uDm5uPg4OHg4+Pm4+Pj6Ojk2v///////////wD/////////2tji4eDm39/f3+bg4ODg4OHirNji4uLY2NnZ2dji4uLi4uLY2Nji4uLh4eHg4ODm5ubm5ubm4+Pg4OPj4+Pj6Ojo5N3///////////8A/////////djg5t/f3+bg4eLYrKysrKzZ2Nji4uLY2KzYrOLi4uLh4uLi4tjY2Nji2NjY4eHg4ODm5ubm4+bj4+Pj6Ojo6Ojo5OTZ2v//////////AP///////93g39/f5uDY2ays4Pn9/fz54OLh4eHi4uLi4eHg4ODg4Obm4ODg4eLi4tjYrNnY4uHg4ODg4+Pj4+Pm5uPj6Ojk6OTY2d3//////////wD////////h39/f4OLY2OHf/Pr6+vr+/vng4ODh4eHg4ODm5ubg4Obm5ubm5ubm5uDg4eLi2Nji4uHh4eDg4+bj4+Pj4+Pj5OTk5Njd2/////////8A///////a5t/f5uDh4N/9+v7++v7++/796ebg4ODg5ubm5ubj4+jj4+Pg4ODg5ubf3+bm4OHh4eHh4eHh4OPj4+Pj4+Pj4+Ph5OTk2N3/////////AP//////2Obm4ODg3/n6+v7+/f77/v7++vrp39/f39/f3+bj4+Pj6OTk4uLk4uTj4+Pj5ubm5ubg4ODg4OPg4eTi5OTj4+Pj4+Hk5OTZ2////////wD//////ODf39/f3/n6/v7++vr7/v7+/v7++unf39/f39/m5uPj4+Pj5OTk5OTk4+Po6Ojo4+bm5ubg4ODh4djZ2dnZ2OTk4+Pk5OPk2Nr///////8A/////93f39/f6fn9+v7+/v7+/v7+/v77+/7p39/f39/f5uDg4+Pj4+Dj4+Pj4+Pj4+jo4+Pk4+Pj4+Hi4tjZ2dnZ2dnZ2NjY5OTk4+TZ////////AP/////Y3+np6en9/fr+/v7++/7+/v7+/vv76d/f3+bm4ODh4eHi4eDj4eTk5OTj4+Pk4+Pg4eHj4+Dh4uLY2djZ2NjZ2dnZ2djY5OPj2N3//////wD////65unp6en8/fr+/v7++/v7+/j7+/v7+ebm4Obg2dnZ2djY2OLi2Nji4uHk4eHg4+bm5ubg4ODg4OHh4tjY2NjY2NnZ2dnZ2OTj4+Pa//////8A////2t/p6en8+v36/v76/vv4+Pj4+Pj76eDg5ubg4NjZ2OLi4uLi4uLi4uLh4eHh4OPm5ubm5ubm5ubm4ODh4eHh4eLY2NjZ2dni5Obj2f//////AP///9nf6fnp/v7+/vv+/vv39/f4+/7+/N/53+bm5uDm4ODh4eHh4eHg4eLi4eHh4ODg5ubm39/f5ubf39/m5ubm4ODg4eLi2NnY2OTj5uTa/////wD////Y3+np6fr7/vv7+/j31/f7+v39+vr9/fnf5ubm5ubm4ODg4ODg4ODh4uLh4ODg4ODm3/z83+bm39/f39/f39/f5uDh4eLi2OLi4ePj3f////8A////4t/p6d/6+/v4+/j49/f7/f39+v76+v386ebm5ubm5uDg4ODg4ODg4ODg4ODg4Obf+f39/fzp5ubf3+np6enf39/f5uDg4eHi5OHj49jc////AP///+Hm5t/f6en8/Pr6/fz9/f39+vr+/vr9/f3f5uDg4Obg4ODg4ODg4ODg5ubm5t/5/fz9/fz8/enm39/5/Pz539/p+d/m5uDg4OPj4+Hg3P///wD///ng4ODm39/p/P39/fz9/fr9/f7+/v7++v39/Ong4Obm5t/f39/m5ubm5ubm3+n9+vz8/Pz5/P3839/p/f36/fzp+fz53+bm5ubm5ubh+d3///8A///f4eDg5t/5/Pz8/f39/fr++v3+/v7+/v76/f396d/5/On5/Pz56fnp6d/m5t/8+vr6/f38+fz8/d/f6fr6+vr9/P39/fnf39/p+en54Pms3P//AP//5uLg3/n8/f39/P38/fr++/79/v7++/v+/v39+vr9/Pz8/Pz9/f38+fzp5ubp/fr9/f36/fz9/frp5un6+v76+v38/P39/Pn5/fz9/fz99dz//wD//+Di6fz8/P36+vr6+vv++/v+/f7+/vv+/v7++vr6/fz8/f36+vr6+vr++t/f6fr6/v76+v39/f36+d/5+v7++v38/Pz9+vr9/fz8+vr6/PX///8A///f4vn9+v39+vr6+v77+/v7+vr+/vv7/v7+/v7+/vr6+vr6/v77+/v7+/7p6fn6/v7+/v76+v76/f38/fr6+v39/f39/f39+vr9+vr7/v31////AP//rKz5/fr9/fr6+vr+/vv7+/r6/v77+/7+/v7++v7++vv++/v7+/v7+/v+/fz6+vr6+v76/vr6+vr69vb29vr9+v36+v7++vr++Pv7+/j+9f///wD//93h/P3++v36+vr6+vr++/b9+vb7+/v+/vr6+vr6+vr6/vv4+Pv7/v729vr0+v38/P38/P39/P36+vb29vr++vr6/v77+Pv++/f4+Pj49vX///8A///f9fn99vr9+vr6/fT6+vb0+u/29vv79vb6+vPz8/P9/f36+/Ly+vb6+vr09P38/Pz8/Pz9+vr6+v729vb++/77+v77+Pj4+Pf3+Pj48vT1////AP///vXs9PT09PT09PTz8/Pz+vPz8PD29vbz9PPz8/P29PP69PP29vT69PT0+v38/Pz8/Pz9/fr+/v7+/vb7+/v7+/77+Pj39/f3+PLy8vbs/////wD///f17Pz0/fT0+vPz8/Pz8/Pz8/Pz8/Pz8/Pz8O/v8PDw8PPz8/P09PPz8/38/Pn8/fz9/fr+/v7+/vv2+/j7+/j4+/j49/f39/Ly8vHw9f////8A///+9ez8/PT98/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Dw8PPw8PDw8PPz8/Pz8/r8/Pn8/f39+vr6/v7+/vv7+/L4+/v7+Pj4+Pf39/jx7vL29PX/////AP//9+r5+fz9/frz8/Dw8PDw8PPz8/Pz8/Pw8/Pw8PDw8PDw8PDw8PDw8PP9/Pz8/P39/fr6/v7+/vv7+/7y+Pv4+Pj4+Pj39/fy8fHx8PX//////wD////r+fn5/f36+vbw8PDv7+/w8PPz8/Pz8PDv8O/v7+/v7+/v7+/v8PD2/fz5/Pz8/f39/f7+/v77/v728vj7+/j4+Pf39/f37vHx8fPr//////8A////6vn8/P36+v779u/v8fHx7+/v8PDw8PDw7+/v7+/v7+/t7e3t7e3v9vr8/Pz8/fz6+v36/v7++/76+u7y+Pj4+Pf3+Pf39+7x8fPs9f//////AP////31/Pr6/v7++/v28e3t8e/v8PHx8e/w8O/v7+/x7+3v7e3t7e3t8fH6/fz9/f39/fr+/v7+/v7++vr78vL3+Pj4+Pj39/Lu8e/09f///////wD////39f36+/v++/v79vHt8e/x8/39+v3x8fHv7+/w7+/v8fHt7e3t7e3x9vr6/fz6+v77+Pv7+/7+/v7+8e7y8vLy8vLy9/Lu8fHz9Ov///////8A/////+r++/b3+Pv4+/bx8e7x+vn9/fr9/fbx7fHx7+/v7/Hx7e3t7e3t7vHx+/77+/v4+Pj4+/v79vHx7vLu7vLy8vLy8u7u7fHz8+z1////////AP/////q+vvx8vj4+Pv77vHx9v39+v36+vr9+vHx8fHx7/bz7+/t7u7u7e3u8vLy9/f39/Ly8vLy7u7y7u7u7vH2/vLy7u7u7fHw8/T1/////////wD/////9/ny+/b6+/Ly7u7u8fHx9vH29vr69v399u7u7fHv7+/v8e7y7u7u7u7u8vHx8e7u7u7t7e7t7u7u8u7x+/by8u7u8e/z8/P06/////////8A///////q9vD28/rx7vHt7vLu7u7u7vH29vb29vbv7+3u7u7u8fb28e7u7u7t8fHx8fHt7fHu7u7x7e3t7fHx7u728fHx7/Dz8/Pz9f//////////AP//////+/X08/D28e7u8e3t7+/v8fH29vHt7u7u7u7t8fHx7fHv8PDv8e3t7e3t7u3t7u7u7u3t7e3u7e3t7e3x7+/v7/Dw8PDz9Ov//////////wD////////q7Oz08/Px8fHv8e3x7+/v7fHx7e3t7e7u7u3t8fHx8fHt7e3t7e3t7fHu7u3t7e3t7e7u7u7u7e3x7+/v7+/w8PPz9Oz8//////////8A////////+/Xs9PTz8/Pz8/Pw7+/v8e3t7e3t7e3t8fHv7+/x8fHx8e3t7e3t7fHx7u3t7e7u7u7u7u3t7fHv7+/v7/Dw8PPz8/Tr////////////AP/////////q7PT08/Pz8/Pz8/Pz8/Pv7/Ht7e3t7e3v9vDx7/Hx8fHx7e3t7e3t7u7u7e3t7e3t7e3v7/Dw8PDw8O/w8PDz8/T1/////////////wD/////////9/X09PPz8PDz8/Pz8/Pz8/Pw8PDv7e3t7e7t7fHv7/Ht7fHv8e3t7e3t7e3t7e3v7+/v7+/v8PDw7+/v8PPz8/Ts6/////////////8A///////////r7PT08/Pw8/Pz8/Pw8PDz8/Pz8O/w7/Hx8e3t7u3t7e3v7+/v7+/x7+3t7e3v7+/v7/Dw7/Dw8PDw8PDz8/T06v//////////////AP///////////+rs9PPz8/Pw8PPz8/Dv7/Dz8/Pz8/Pw8PDw8O/v7+/v7+/v7/Dw8PDw8O/w7+/w8O/v8O/w8/Pz8PDw8/P09f///////////////wD/////////////6uz08/Pw8PPz9vPz8/P27+/w8/Pz8/Dz8PPz8/Dw8O/w7+/w8PDw8PDw8O/v7+/v7+/v7/Dw8PDz8/P07Pn///////////////8A///////////////r7PTz9PPz8/Pz8/Pz8/bx8e/w8PDz8PDz8PDz8/Dz8/Pw8O/v8PDv8PDv7+/v7+/w7+/w8PDw8/P07Ov/////////////////AP//////////////9+r19PPz8/Dw8PDw8PDz8+/v7/Dv7/Dw7+/w8PDw8PDw8PDw8PDw8PDv7+/v7+/v7+/w8PDw8PPz9Or//////////////////wD////////////////39fXs9PTz8/Dw8PDw8+/w8PDv7/Dv7+/v7+/v7+/v7+/w8PDw8PDw8O/v7+/w8PDw8PDz8/Pz9Or///////////////////8A//////////////////f19ez08/Pz8PDv7/Dw8PDw8PDz8PDw8O/v7+/v8O/v7/Dw7+/v7+/v7+/v8O/v8PDz8PP07Or/////////////////////AP//////////////////1/nq7Oz09PPz8PDw7+/v8PDv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7/Dw8PPz8PP07Ov//////////////////////wD/////////////////////+ers9PT08/Pw8/Pz8/Dw8PDw7+/v7+/v7+/v8O/v7/Dv7+/w8O/v7+/v8PPw8/P09er///////////////////////8A///////////////////////+9fXs9PTz8/Pz8/Pz8/Dw8/Pw8PDw7/Dw8PDv7+/w8O/w8O/w8O/v8PDw8/Ts6t//////////////////////////AP////////////////////////j86uz09PPz8PPz8O/w8O/w7+/v8PPw8PDw8O/v8PDw8PDw8PDw8PP09PT16+b//////////////////////////wD///////////////////////////ns9fT09PTz8/Pz8/Pw8PDw8PDv7+/w8PDw8PDw8PDw8PDz8/P09Ozq6eH///////////////////////////8A////////////////////////////+/nq7PT08/P08/Pz8/Dw8/Dz8PDw8/Pz8PDw8PDw8/Pz8/P07Orp6f//////////////////////////////AP/////////////////////////////4+/nq9ez09PTz9PPz8/Pw8PDw8PDz8/Dz8PDz8/Dz8/Ts9fXp/////////////////////////////////wD////////////////////////////////4+/ns6vXs9PT09PTz8/Pz8/Pz8/Pz8/Pz8/T09Oz16+D///////////////////////////////////8A//////////////////////////////////////787Or19ezs7PT09PT09PT09PT09Ozs6urf3///////////////////////////////////////AP////////////////////////////////////////j+/Pb7/PX19fX19fX19fX16urq6f37/////////////////////////////////////////wD/////////////////////////////////////////////+vr78vj4+/v7+/v9/Pnp/Pr///////////////////////////////////////////8A//////////////////////////////////////////////////X19fX19azd3Nz/////////////////////////////////////////////////AP////////////////////////////////////////////////////f39+np+fn8//////////////////////////////////////////////////1fE+3PNdRKAAAAAElFTkSuQmCC");
tail j=7075 line= kw_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAABRCAMAAAB2ZgEHAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD+/v79/f38/Pz7+/v6+vr5+fn4+Pj39/f29vb19fX09PTz8/P8+/z5+vl/f379/fz6+vn39/b29vX19fT09PN0c3P6+fn49/f29fX5+fny8vLw8PDv7+/t7e3p6enj4+Pc3NzU1NTAwMC1tbWoqKiVlZWQkJAAAABtqN+JAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGk5JREFUeNoBQxq85QD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////7+/v7+/v7+/v7+/v////////////////////////////////////////////////8A/////////////////////////////////////////v79/f1WVlZWVlZWVlZWVlb9/f7+/////////////////////////////////////////wD///////////////////////////////////7+/VZWVvxW/Pz8/Pz8/Pz8/Pz8VvxWVlZW/f7/////////////////////////////////////AP/////////////////////////////////9/VZW/Pz8/Pz7/Pv7+/v7+/v7/Pv8/Pz8/PxWVlb9/v////////////////////////////////8A///////////////////////////////9Vlb8/Pz8+/v7+/v7+vor+iv6+vr6+/v7+/v8/Pz8VlZW/f7//////////////////////////////wD////////////////////////////9Vlb8/Pz7+/v7+/r49fX19fX19fT09fX19iv6+/r7+/v7/PxWVv3/////////////////////////////AP/////////////////////////9Vlb8/Pz7+/v6+iv28/Lj4+Pj4uLi4uLj4+Py9PX4K/r6+/v7/Pz8Vlb9//////////////////////////8A/////////////////////////Vb8/Pz7+/r6+isr9ePi4uHh4eHg4ODg4OHh4eHi4vL1+Cv6+vr7+/z8/FZW/////////////////////////wD//////////////////////1ZW/Pz7+/r6+isrK/fi4eDg39/f39/f39/f39/f4ODg4eHy9vgr+vr6+/v8/FZW/f//////////////////////AP////////////////////1W/Pz7+/v6+isr+fn49/Lg3t7e3d3d3d3d3d3d3d7e3t7e3+Dy9vkrK/r6+vv7/PxW/f////////////////////8A///////////////////9Vvz8+/v6+isr+fn4+Pj39vX19fX19PT09PT09PT09fX09PPy8vP2+Pn5Kyv6+vv7/PxW/f///////////////////wD//////////////////Vb8/Pv7+isr+fn4+Pf39/b29vX19fX09PT08/T09PT09fX19fb29vf3+Pj5+Ssr+vr7/PxWVv//////////////////AP////////////////1W/Pz7+vorK/n5+Pj39/b29fX19PPy8vLy4+Pj4/Ly8vLy8/T09fX29vf3+Pj4+Ssr+vr7+/xWVv////////////////8A///////////////9Vvz8+/r6Kyv5+Pj39/b29fT08vLy4+Li4eHh4eHh4eHi4uLj8vLz9PT19vb39/j4+fkr+vr7+/xW/f3//////////////wD//////////////1b8/Pv6+iv5+fj49/b29fTz8vLj4uHh4ODe3t/f39/e3t/g4OHh4uPy8vP09fb29/j4+fkr+vr7+/xW/eb/////////////AP////////////9W/Pz7+vor+fn49/f29vX08vLi4eDg3t/e3t3d3d3d3d3d3d7e397g4eHi8vL09fX29/f4+Pkr+vr7/PxW/f////////////8A////////////Vvz8+/r6K/n5+Pf39vX08/Lj4d/e3t7d3dzc3Nvb29vb29vc3Nzd3d7f39/h4/Lz9fX29vf4+fkr+vr7/PxWVub//////////wD//////////1ZW/Pv6+isr+Pj39vb19PLj4uHf3t3d3Nzb29vb29ra2trb29vb29vc3N3e3t/h4uPy9PX29/f4+Pkr+vr7/PxWVv//////////AP//////////Vvz7+/or+fn49/b29fTy4+Hg397d3Nvb29ra2tra2tra2tra2tra29vb3Nzd3t/g4ePy9PX29vf4+fkr+vv7/Fb97f////////8A/////////1b8/Pv6Kyv5+Pf39vXz8uLh397d3Nvb29ra2tra2tnZ2dnZ2dra2tra2trb29zc3d7f4ePy9PX29/f4+Ssr+vv7/FZW/////////wD/////////Vvz7+vor+fj39/b18/Li4N/e3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dra2trb29vc3d7f4OLy9PX29/j4+Ssr+vv8/P3t////////AP///////1b8+/v6K/n4+Pf29fTy4uDf3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3d3f4OPz9fb29/j4Kyv6+/v8Vlb///////8A/////////Pz7+isr+fj39vX08uLg393c29va2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3uDg4vL09fb39/j5Kyv6+/z8Vu3//////wD//////1b8+/v6K/n49/b29fLj4N/d3Nvb2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3eDi8vP19vb3+Pj5K/r6+/z8Vv//////AP//////Vvz7+isr+Pj39vXz4+Hf3dzb29ra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dna2tvb3Nzd3t/i8/X29/f3+PkrK/r7+/xW5v////8A///////8+/v6K/n49/b19PLi397c3Nva2trZ2dnZ2dnZ2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra29vc3N3e3+Hi8/X29/f4+fkrK/r7/Pz8/////wD/////Vvz7+isr+Pj39vXy4+De3dzb2tra2dnZ2dnZ2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2trb29zc3N3f4OHy9Pb29/j4+fkr+vr7/Fb/////AP/////8/Pv6K/n49/b19PLh393c29va2tnZ2dnZ2djY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2trb3Nzc3d7f4ePy9Pb39/j4+Ssr+vv7/P////8A//////z7+/or+fj39vXy4uDe3dzb2trZ2dnZ2dnY2NjY2NjYAAAAAAAAAADY2dnZ2dnZ2trb29zd3+Dg4eHg4uP09vb39/j4+Ssr+vv8/v///wD///9W/Pv6Kyv4+Pf29fLh393c29va2tnZ2dnZ2NjY2NjY2ADc3Nzb29zc3N3Y2dnZ2dra2tvb3d3f4ODg4uPy9PX29vb3+Pj5+Sv6+vv7////AP///1b8+/or+fj39vXz4+De3dzb2trZ2dnZ2djY2NjY2NgA3N7p39/f3+Dq39zY2dna2tra3Nvd3d/f4ODh4/Lz9PX29vf39/j5+Sv6+vv///8A/////Pz7+iv5+Pf29fLi4N7c29va2tnZ2dnZ2NjY2NjYANvg3uPs7Ozs4/Lf4dzZ2dra29rb3Nze3t/g4eLj8vL09PX19vf3+Pj5+Sv6+////wD////8+/srK/n49/b08uHf3dzb2trZ2dnZ2djY2NjY2ADb6eDh8t3d3d3d8uPr4dza2trb3Nvd3N3e3t/f4OHi8vL09fX29vf3+Pj5K/r7+v//AP////z7+isr+Pj29fTy4d/d3Nva2tnZ2dnZ2NjY2NjY293f4OLd2dnZ2dne4uLi39zb3Nvd3Nzd3d3d3t7f4OHj8vP09fX29vf4+fkr+vv6//8A/////Pv7Kyv49/b18+Pg3t3c29ra2dnZ2djY2NjY2Nje3uDh3NnZ2dnZ2dne4uLg39zd3N7e3t3e3t3e3t/g4OHi8vP09fb29vf4+Sv6+vv//wD////8+/or+fj39/Xz4+De3dvb2tnZ2dnZ2NjY2NjY2N3p8NzZ2dnZ2dnZ2drf4+zh3t3e3t/e3t7e3d3d3d7f4OHj8vP09fb29/j5Kyv6+///AP////z7+isr+Pf29fPi4N7c29va2dnZ2dnY2NjY2NgA3N3e2dnZ2dnZ2dnZ2dvf4+Lf3t/g39/f3t7d3t7e3d7f4OHj8vT19vf3+Pkr+vr7//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2djY2NjY2Nve3+/Z2dnZ2dnZ2dnZ2dzi4uDe397f4N7e3t3d3d3e3d7f4OLj8vT29/j4+Sv6+/v//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2NjY2NjY297f3tnZ2dnZ2dnZ2dnZ3PLy4uDh3+Lg39/e3d3c3N3d3d3f4OLy9Pb39/j5K/r7/P//AP////z7+iv5+Pf29fLi4N7c29ra2dnZ2dnY2NjY2NjY29zd2tnZ2dnZ2dnZ2drc8vLy4+Dh4OHf4N7d3Nzc3N3d3d3f4fL09vf4+Csr+vv8//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2dnY2NjY2Njc3d3b2dnZ2dnZ2dna2tzy8vLi4eHg4N/f3t3c3Nvc3Nzd3eDi8vT19/j5Kyv7+/z//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2djY2NjZ2dzd3d3b2dnZ2dnZ2dra4PTz8uDh4eDf3t7d3dzc29vc3Nzd4OLy9fb39/kr+vr8/P//AP////z7+iv5+Pf29fPi4N7d29va2dnZ2dnZ2dnZ2dnZ29vl3dzb2dnZ2dna2uDy9PLz4eHg39/e3dzd3dzb29zc3N7g4vL19vf4+Sv6+/z///8A/////Pv6K/n49/b19OPg3t3c29ra2dnZ2dnZ2dna2drZ3N3o7tzb2dnZ2eTg8vPz8uLg4N/e3d3c3Nzc3Nzb3N3c3uHy8/T29/j5K/r7/P///wD////8+/r6+fj49vXz4+He3dzb2trZ2dnZ2dna2tra2trb293d3d7c6N3e6fLy9PLi4eHf3t3b3Nzc3Nzd3d3c3d7e4fLz9fb3+Pkr+vv7////AP////z7+ysr+Pj39fTy4d/d3Nva2tnZ2dnZ2dra2trb29vb3N3d39/p6uLi8/Pz4+Lg393b29vc29zc3N3e3d3e3t/j8vT19/f4+fr6+vz///8A////Vvz6+iv5+Pf29PLh397c29va2tna2dra2tra29vb3Nzb3N7f39/g4ezy8uPi4eDd29va3Nzc3Nzd3d3e3t7f4OPy9PX3+Pgr+iv7/P///wD//////Pv6K/n49/b18uLh3t3c29ra2tna2tra2tvb293d3Nvd3t7f4ODh4eLi4+Hg39va2tvb3Nzc3N3d3t/f4ODh4/P19vf4+Sv6+vv/////AP/////8+/or+fj39vXz4+Hf3dzb2tvc29vb2tvb29vd3d3c3N3e3t7f3+Di4uLh4N/c2dna2tvb3Nzd3d7e3t/g4OPy9PX29/j5Kyv6+/////8A//////77+isr+Pj39vTy4d/e3Nvb29vc3Nzc3Nvb3N3d3d3c3t/g4eDi4uLi4d7f3NnZ2dra2tvc3d3e3t/g4ODi4/P09vf4+fn5K/v8/////wD/////Vvv7+iv5+Pf29fPj4N7d3Nzc3Nzc3Nzc3Nzd3d3d397f4eHh4+Li4eDf4tzn2tra2dra29zd3t7f3+Dh4ePy9PX29/j5+Sv6+///////AP/////t/Pv6K/n49/b29PLh4N7e3dzd3Nzc3N3c3d3e3t/f3+Dh4uLj4uPg397Z2dra2tva2tvc3N3e3t/g4eHi8vP19vf4+Pkr+vv8//////8A//////9W+/orK/j49/b18+Ph397d3d3d3d3d3d7d3t7e3+Dg4eHj4+Pi4d/f2tnZ2tra29vb3Nzd3t7f3+Hi4/L09Pb29/j4+Sv6+/z//////wD//////4H7+/or+fj39vX08uPh397f397e3t3e3t7e3t7f4ODg4uLi4uHf39vZ2dnZ2tvb29vc3N3e3t/h4ePy8/X19/f4+Csr+vv8////////AP///////1b7+isr+Pj39vX08uLh3+Df39/f39/f39/f39/g4eHi4eLg4Nzb2tna2dra2tvb3Nzd3d7f4OHj8vT09fb3+Pj5K/r7+/z///////8A////////7fv7+iv5+Pf39vX08uLh4ODg4ODg4N/g4ODg4OHg4eLh4eDc3Nrb2dra2tvb29zc3d7e3+Dh4/Lz9fX39/j4+Sv6+vv8/////////wD/////////Vvv6Kyv5+Pf29fTz8uPi4uHh4eHg4OHg4eDg4eHi4uDg4Nza2tra2tva29zd3N3e3t/g4uLy8/X29vf4+Pkr+vr7/Fb/////////AP/////////t/fv6K/n4+Pf29fTz8vLj4+Pi4uLi4uHh4eHg4eHh4N/e29va2tvb29vc3N3e39/g4eHj8vT19vb3+PgrKyv6+/z8//////////8A//////////9W+/r6K/n49/f29fT08/Ly8vLy8uPj4uLi4eLi4eDg3dzb2trb3Nzc3N3e3t/f4OLi4/L09fb29/j4+Sv6+vv8/Fb//////////wD//////////+ZW+/orK/n49/f29fX09PPz8/Pz8/Ly4+Pj4+Hh4N3c3Nvb29vc3d3e3t/f3+Di4/Lz9PX29/f4+CsrK/r7/PxW////////////AP////////////9W+/or+fn49/f29vX19PT09fT09PPz8vLj4uHg3Nzc3Nzd3d7e3+Df4eHi4/Ly9PT19vb3+Pn5K/r6+/v8Vv////////////8A/////////////+b7+vor+fj49/f39vb19vX29fX19fTz8vLj4t7e3d7e3t7e3uDh4eLi4/Ly8/T19vb3+Pj5+Sv6+vv8/Fb//////////////wD///////////////37+vorK/n4+Pf39/b39vb29vb19fT08vLg4N/f3+Dg4OHh4uLj8vLy9PT19fb29/j4+Ssr+vr7/PxW/f//////////////AP/////////////////7+vorK/n4+Pj49/f39/f39vb29fX08+Ph4eHh4eLi4/Ly8vP09PX19vb39/j4+fkrK/r6+/z8Vlb///////////////8A///////////////////7+vorKyv5+fj5+Pj4+Pf39vb29vXz8vLy8vLy8/Pz9PX19fX29vb39/f4+Pn5Kyv6+/v8/FZW/////////////////wD////////////////////7+/r6KysrK/n5+fn49/b19fX19PT08/Pz9PT09PT09fX19fX29/j4+Pn5Kyv6+vv7/PxW/f//////////////////AP/////////////////////8+/v7+vr6Kysr+fn39fTy4+Df39/e3d3e3t3d3d3d3t7e4PT3+Pn5Kyv6+vv7+/z8Vv3///////////////////8A///////////////////////9/Pv7+/r6+vorK/n39PLi4eHg39/f39/f39/f39/f4ODh4vcrKyv6+vr7+/z8Vlb//////////////////////wD/////////////////////////Vvz8/Pv7+/r6+iv49fPj4uHh4eHg4ODg4OHh4eHi4uP1+Sv6+vr7+/z8/Fb9////////////////////////AP///////////////////////////Vb8/Pz7+/v6+vor+PX08uPj4+Li4uLi4+Pj4/L09iv6+vv7+/z8/Fb9/f////////////////////////8A//////////////////////////////1WVvz8/Pv7+/r6+iv29fX19fX19fX19fX19/r7+/v7+/z8/FZW/f///////////////////////////wD///////////////////////////////79Vlb8/Pz8+/v7+/v7+vorKysrK/r6+/v7+/v7/Pz8VlZW/f//////////////////////////////AP/////////////////////////////////+/f1WVvz8/Pz8+/v7+/z7+/z7+/v7/Pz8/Pz8VlZW/f////////////////////////////////8A//////////////////////////////////////79VlZWVvxW/Pz8/Pz8/Pz8/Pz8/PxWVlb9/v7//////////////////////////////////wD//////////////////////////////////////////v5W/VZWVlZWVlZWVlZW/f39/v7+////////////////////////////////////////AP////////////////////////////////////////////////7+/v7+/f7+/v7+/v7///////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////8kfX8xueSoCAAAAAElFTkSuQmCC");
tail j=7076 line= ki_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
tail j=7077 line= kob_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAACgxJREFUeNrcm0tvJNd1gL9zz62q7iJnTIG0ARGhIujh1SiGgcSL/BID3vtHGd4GQXbZee+FFwaMIDA3yUgDWQtrQcXSZMiu1z33eHGrujlKwhnZmO6eNIaD6nqxPp73ObfE+X/xkb+CI3+R06MJ52/fVg771x+5Jr9+cv0JREMnkY/fNo6bX/+dNw7QADCCdBJzPiTKd+b4zG213gBCPe8aAUQ2EnL46O3guPk1/zjW425HvXAUkpjDB8fPccPXKwAXHKTsdAFHcEA6qsOQfAeOr/xF5bIDgE27Q9kwf+ki/uERc9w8//d/wEFk89L+8vj39gnBPz5ajpsX0YFQTNwBJALTab4nk/mm0T4+Uo7/9FU9EjZbq0BPO6AZmnCX8wnk5VCHC4H9eq7weqd9unpcT6HvRIgxRgj/oh3AAHl98ih2lQq4A2sEsj89Qnk8WzOGjeAIkQS6HsqRZijBkF/+9HsDjiBsBCDywbFxPFOkEyCSYiJij7rd0RkkvHg8gamJbAQX9mokr6NXz6q+76XoUyTGlw4226zxn1OVs5gGOTlxcZI+PSqOT1Mn1ctPr3fNFmILwt00b1Tx5AT3pJ8dkV59nkkvi4BEzAL/BPz8Fz+HDIFf/GyFAcEUcap0e3ore8u3Xs3xbH50IC5bv3/SOl6bWBDrKisB8bb1OU0R1KsE3OpHR8LxVIGEw/WT60/w6ydc/8R9jtzg29uI+O47gQog9R8eBcengQTeui9xfM52pfz4EhaXw/MN1bQE/Oc/PAo7D2lyX69idnfP2b0eQST0XSe4ZxBBJAglCtZe1wpiiuITnOzHacVXaFVu3euBgWauln7zpIUNUrLdklS1W1lBDQoGGFSAHoFe5aereoBmFNlcA3zitLDh+sn1T+bkkA3QbmA9k2BqFAZI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");
tail j=7078 line= kow_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAB8VJREFUeNrsm02OG8cZhp+3mjIEy6OmBvEiNxCQVVPxWcZDnSC7nCBn8C4nCAe6Spx0bwMoeyNQMCaRSHIsdr1ZVFV3z4QzGi3Cpg1T0A+bGqAefv9ffZ/Mz+KlE+GYHkM/VQ5juJw8uEKfSDM7h/ElbNabybP1Zg1cST8djsglGwAPJ5HT+defgjIvR0wQzpJpuqYr9qFPI5mTI1EYwLEvaibQV10SilhzFU6bY6Awzbe9d0UugjqoetEhEA8kmY0jXm6yo2r487XxhAOxrKoXHcltrXl1shwXbAoFf3lj3w4g4tkiFJIHiGQejni5yRpFi/3hOk4jYbJznS+qFYXkYyCzcCSMTAG2b4R0YWxUBbGiexDIHBwZI1E423r+rdFEECKT6GNGMgNHvNzgIgxnFBvYAXVSKsovlEVyP8jxOUaMTGEi7EZLF6hGGmlWCeSKcEIcFwmjTQi2zc7GRJQCoRBSjVRgCsg/fn0yHCNGEkZkaxPlqZ3LQWhJKEJZJRu529iPzXEDw7Z3MZrB3ofoIUEItQJCShIRa765QyLhyBgk23B6xe02RtvR0UXJSO+jHeN22+cnbYPNht9zEhxsDE2bxRF3MWOkF5AIE4tjjLuYP2kbMFxdn4JeXWywG9pE4W0iGBP3SVWbjF0h1CGZ+4ruHu97bHnYjBgx5i8fijiGf2Xzif02JtSWxrC5QyCL44rD0LT52Nvo6Emie6PYFUYGh7hbljdgXR4WyFHlsQE3+SuPI4Z9uH9ibKlYP1kgXM/NcYGB1jbE3YhxZyPIuU7MOVgLNpvfnYB9uEkHPIAx8VkFRAhiv805MCSf9d3M/qo3btocOHpHRld1u/oYPBaSgp6FlKGs6CSoZpXHxSAO4i4WPzV4sUOdxfRRcmrJRLBZzyuPHg/i+D4mrfKBo2uS94oSRELKs+iEqnn97nDcuC0hYvr8ef70b5oEwiCEvXuGZbldNZ1ytTUTx8VmUCtuWHTB+HvpXn3QtBmHQ6iDcq3YrjD9Ym5/1WI77qbiGDDCWbVYVIunYeGhtB18bvoJm7Y56KiPx7G5kZvcjn3PXy/48ezs7Kx6zKNF7jbIcjISj+lK28ycl5gm/50D9EQcz18/fV/Vb9KRHr8jAsGyZSxtlzFAAhPw4dHMdu6DSQi8Du+kN3uAfy7eq8KysIoO7WqTIDR//aHMsrsZtQEqST/uAfiwB1WSFAK52+64HS2EQ/4qHFUe7RAdbuVVfrL8kDvu7Ht9EQIh30nZMdrejS6umT2/WjHpu02t3P++7gem/f69JGVpSHJycsWFdbNztKMq+aZ5hGeTDldvBDElG7aVOxKehpUZ66j7Xt9P3yzZolhFDT1Thxi40Tidt669I/Xq+4ntClhWDlFo0MLofDuyOon6/JAPKw3dG4+sSYjxEA7zJdVpykMCwniURRBxbDkMjkHC0B1wu3NwKCezhUECx8co5I8/OyfV5WCPfaDJD1cnwTFcb4yFX9QPT84TyOefnct879SKyyQCLe+rlY7qrzoj45sKntq59tu3CvrirR49RXFrRTtm5ySn71uHS8aj5yXNCoTq/7HUYsOVzhb/kbzDMfZxuMGVUInvHfPax1ruBnXS2EYoFawtePfOn9tbmxhJWaGwVBItsaLRrHr1qldp4Cr0wsMkiSCkFqIEb98h29HDoImGzgkIupn7JVMtSucPuZ1DKNmwbUG0+5jbEMqtq1Dr7izxqBwBWCFJNYPCKGjwxAqVqgDu3feTVpyCyPc5okUzx8GvUZeOrJAOVdQmhUEFUYFjXPRPpFELQVKd//fqoFodk+OPY+irFVJHZ+zv5AtaZPt9/y+YGLdQnblX3eFBpiNynK+zYiEF5VtAJZVJUpEgmv0Q6cvdbViGj8xhHdPOf1MUC9UhSCHdNA0lYqqX2JsbsTIUaYgXq06HuonH5fjDy8HSQ63kqxTyEVMSGN3vXXxUNg1CHcpEQHeXVI56P3j9NDXcsZ17o2NpZMl4T1TUePmcmZO/WnXcIY7jxo/zl8AqabqWIYRxYiHJwzCE8VAsKYsuY6xPQB5cL6ObNl9hmh1jL84C2302DRUzD3UOli+gk6jmt3M4v4RulQKCguq6Xi6XyT6CSElViixJBkEDhug6iTWnwME3L5U0q5xV0rJeSkGG3uXKI3myoOUyFE8FEutXp2DnABd/8jAkk3LFVIfvbO/HuOiAVJONZJj4uXME6+gc331pmjbfk+WOOml4aV8qi+Rmbw8u3SONWebI4jBEVobB0/TV9dAOEarJjVEpT8TdP6N4/Lw9LETHSuXbzn8EVQohKITwbLlchlApKChIA8Z9h51lXnRvGmizOPJoRhzGZCaNiDxomYZ4T2s+EWCfL3VaJnMxlPZtGeAVPHjwdaZ56j4du4GWGB13fWlWldnw8KtKheJE53cp7do0atHGPm5vXVQJ6cvfMoxTf3TCfb59g4uybUDz1364UR/7jeeL1TCo//GNgxn3P/LGQSZx3E046hC+GhYnrh7gVWfdx5msgNB8Oz1JqEpH6IGLLPPuFdm3FosAutFrrXngOs7se172sOiVTqPhGvATKE5if9C+5PbmXd7xevgS4Wnsc5qvryZ7kFd3XjudOAdFsYZe+qfupuqXPeFfOP4f1cDPA4P/DgAwWJQLXj/G2gAAAABJRU5ErkJggg==");
tail j=7079 line= kib_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrC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");
tail j=7080 line= kiw_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD9/f38/Pz6+vr5+fk9PD0iISMoJykuLS8bGh2ys7CTl4mgpZFPU0FdYU9qbl2JjH6pq6E3OilCRTV+gXAfIhArLhtzdGtSUk9ISEf9/fz6+vkXFg9bWlZiYV19fHkKCQf39/f09PTx8fHs7Ozj4+PX19e/v7////8FWx1+AAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
tail j=7081 line= koeye_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
tail j=7082 line= koeyew_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
tail j=7083 line= koeyeb_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAbGx8xMTYiIiUNDQ42Njo8PD6CgoMtLjMpKzEnKCussZ8ZHgueo49UVVETFwYWGggdIQ9PU0GEiHYjJxQ4OyyQk4RwcmcqLB9DRjMwMiUUFQ16e3JgYVcPDwkICAVKSklDQ0LV1dQeHRgiIR0+PDUbGRQWFRP///+CbnrVAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrCoUsF4rMcASW9M3MvnuccSyV/UujbgGR3qgz3h0+B0ASbjCiZEnmPX5Io4CHBjUpnEo4++fqpY10l4Z3DrkX/I++99ZUHx/GeRxxIAVCLVic5yrnnefIVbksUkgzGhxbCuDOgAKQAItzkiQyfFFMjQMxYpegfznMezrG0s9UDNO88JcTey5sA2QqO9+NACqZoTIdfeOMo51h65buCFpEdgc148thlZIYCUHIqWjYfx7u7Ft1swEACTJFbuT60icCObMbQn/umeVn/4ixO0UArV0xdeuIBcfzSCaSYQgs74s7Hz3H0Sb6r28avYgvG0hB5Q4jYgBCAZuq15/PjjO+4oQlwCdwAJPAIOZWsWcl4wA7xOc6fO8rPdgBaNNDvPBWKjzwQjl86SjDFrSrQcr78TUo//dSPP5Hd35X87i9p+khQEoEGrz861Bufl2bCBAeC3ArcCgcf/4tPEXV45VseQrNSFQ20DNUTD4Djl//70SnQK1BdgQrS+f4zAG2IsIlSGFcsoc8eAQRaaART4fLQQN954TsvvHF8CS2SOAJqyEluODaRHdlQBhZ/8Uyo8LGj5F01InEvIJvgeL9nT2mhUfhQwaeKgN7gfiXVxiIyCcXJzygOgO+I5wo6NbtAAnkgrdDOHi2iWaECPlT8qtCi8YuP3XniPnG8//ZHa8BKBd9I7GOPtbL7D6e+0RgGAVoU++vHe+PziT0lSJQUxVp22yf9m7HWWCsavCUfqtC8F5B74ni/N61XqitmvJPzZsBWZI/iaPYYSUDQiNoKlZPm29zJ+eUJwvqxrhxMK6APkly+dUsNPkb22EqmbnyqK1WxWLwrkHvh0It79QpUSKSZB3wqfsWHSienjn5jkBUO8kMFuGYdBuwp0ILFQSQRGgQ6AB7LgPh9oJTMYd5eOrMPVXF9ulPePo7LorYClZMwC/XZOvPZvVNznag2gKEFGhTvcoR3jrxzGHBTP0ixGf928ymw0WG/nJnWTSJen8vJcHK2PgvUmfeh2tThE9vGcVnUVqhwctZ8rc/WYZYsnKVFTrOHJimXMukSDAG4w8JnwFJbjA5kk978p7khDPVkdurz+FQb3AXIPXD869MrVE7O4pj6zlx0A8zLHsBYXdUKKOQcROs0x3KHJxvxoFSf07l4eLPESHqWzl+f96n+8M/EdnH0VjjDrJNVqjghTpjA2Tl47H1cROoXGgLePcy7hzFZXuAmYrkDJKNz9u18QXLTcQM3QeKE+enrHKOaT2a2gqPXLHKGOViGcruMB9D16HohwADGiedcIUBrAvkOAEfSVefdw0AmVOY0IzCQQ+Xu114GcLpe1wOgC22ACcL6MXbp4rZwXClyZtZZNrEuWw/xQifMwaB/Q4DWZ4+8w6eW9iG4FriJX2RCD3IRhbseSV+KoQrxay8DDt3BhXZZ4gMTYf0Yvf3bwdHxKydnnWWz+Cmz6qsUSQ7GiRcs0P13D7vWXvNU3NCpM5hFSQuN0KAJ3j1s7EvktQHYtaGX3Akir5tWKvkwORHW5/1Kaes4ThxXJ2fXqPASp3OXEyQTOfO7CVojxF5s47nR1UIaSfSwj+vclYGmhA5wA3v4Ja863VEQvHQafMbr8/K1r2wVx4njrzG7VnkJTnldrwupraLAy4WihdjRgKhZCCK7XRJodbWQZ3x0zsaEThcqDUEWYgI5VVwHRBoz6Hpdr4vX9V4CTvvjdY5vAGRDHKvdM7POcuUlTg1d9gyQnDZohoamOYBA0ymbN3y5MFh/M/ZnJG0JTM3oGgmC6RGObjUCCV2vm786B9+YCOvHvJ1bwdFunZl1ll9lBIZBUh120SWgzz4pyKVYlwo5Am5gQNmvfNEI4AqtDoy+y2g9DJjjtD8R1o/1ZzbHsVA4M+ssV+gSW/EIseINwzjxXLEP7EOSUVXt8qWCAaEhcMUgGzH1VcJDJLW9UYrQox4C123ZJUcvAlZs4eFPnOJYf493b95ngZkzeQJ28DEGpoZhcKzQB2IkaEGbdrfdbpeVq7UmiiIVBAT9fmAioRAghBAIXBelQBkuggDhrnudeydcL503lSF5r3OcKYiF7j1x7G12wOmW6eZRmNJoavThqgDixxPrl12JlFwy2a8yYrpDuYkw7i6E67qu66KUAone0L7LVXdEwBi6lAHOrOwdQrIOxwowC3LEMC3r0XUoeFYAMUIKEO2eEHhesVgIhABRsI2oAyDauIcwP5YQQhRcDBRQG5RdTEy5WNbwa+/KLrPMs7JSEwt38Y8eragS4HQldDO7spjaOMp83unDvl65TbkroLFfYUdwtZCS7IlzBy4ILRB0DzRzJZdOIj2uQO3fOCKv6m4mSGzhgfLC+rxPFQbZ1gBHT4BPVIGAiARHYk93yyRPPFekX3gU2hIEUZGEgbvqmiRdI1KbEYCoaeCqC6Kf0PZ6QMoHB++asa7qvHV4CrwQlw5UEvIfEX6d5wuT3//4oKYIcLpGnu69MAB0lgWCPvF+iQKpkAiNgut6/ZIr+vvM96sF6M9ctgr0KaDNA1o4tXtMdaPcNabuAcrgwDcVthxf6otVK4ZyF6QC2ig7sin5dgSPbNqdWtICQX/GSC1VUkspuK61EGkYNLFyn1QILdCiST/eD2JhRotmshTrUO7fAmV+vdyBUiexyjLtigKv3bqP/mAuCl5HCNLXjERJI7mCq4UaCzPAgumZiO7joEyedZ3+ASVRQnPFKkB/plm79si1fQ8gyoPh+MFvi1oatqVol5QUtMsQIVHp2AIWCjrYJxPTU/JyoX8gMUC4cgBT8HbGH0AUiwf5OSxqWiOllNIWbSnSLMpOWV4ppbQseQCBRMqEh0+SCiUEyP1aX9Hm1gP82A/257VUnaINSsvMr4VMlNEGyn1mjEkZJDULtEr4Icn+jcrE3yAOTbI8gC51pMovUFroBEO73GafsIzHG2aFJjWVrAsaQoW8S939m7GrfL1dViUF7fYgdGNMrl0GzS2UipWKlIqVolkDWyKFaHc7oiMe1KoezM+f/btqWdtaSSVN7rocUjFBaBmoguxIVQKWzR4OLdBIELpZMwtbRw6EuF14ED8XftwaK3dHL/sVeGjz9aob5SiI0ElILofQCVPaqbaMwWQaCkihyQxODkjHlr17s+luk9Ll+ejebo1ZazXxtzxfmFwz0pisxOkOormH8sp3H7i5o7xWWamu5K+FDhBiR3aUY9GqSe1hGoa0y+2lSaTp+YD2KftjY3eVX5hY7nU90pwEEwr52TNL/Tf464FdmfSKEgFEIHPpFZ7YeRd99INxbVJko4HQSTQR5unA0KFqSvK0R9JG0pxMe3Batcu+cxezGsqtPFAeIS6+neVWw/7RQ2haUYXA6SYw4sFSsDGUzn9+BjRyOdxkdVaJ9SQ42mW6qKVawvquAao8flcQcbYkeQovdPHtMcQQIZetV8ViEyJ8CD2Fl1VicRzH3TuN9e2lAQ87kWV4juPkV3XbtoHmoJlgYkYZ7ZudHCJJIYWj1g+/3LjTjeN8QegZotkngmbxbuvujL5erUI9YUaGCrGYYD2S+jMkC1AF28gchiFgm692gqUik1iTrq+aMlKagl2AIFq/8i43giEMRi2eV3ehWr2uZ+6x7na5UeAMs8ay4tFI47nDTt9ZqpaQAtrlhmHhIhuIsKMkwJrKo1RSaQ6mE0K70zYrj7I1vojWeUc76A7zA1ix5aG8kPox+ntGX/VwHPS6e3b2j5EQw/mK0rKAbrB8Pf94qdhCdtq0ZXsKRISY3PWwwLYj246iKCVHdRspuSKl3el22hnLmVCGPhFy2KyuLwfdEfGs2JqDNtSP9Xfu6XqbxMFnv6H2DNNXsZW3TmXvHHL0P+0gUdJjCS0ejjVS0esAkdFJkvKWKLfTYpFymzZQ8SsGjIgcuXsddzVYMVMBUhJu7IZ89Xubx/Nnv93biE40zKiSQ0Ce/a7oJDx6W5T8SaSSKORNE47AToav+BUTB/2Kn+YxidYREcNmtRoZZqu7IQXnFb/4va3kV9/7YvHM8Xo47p9mbg7PGKKX+r4iyu0herIXQ6eokG00stfrSJCSXZHWGtsepF8+vh/5a76PP9Blp1SpACoC+dAIJaoU4Hlmdg+PuTlO+xOn6sfPbAhjw/zq2W//fUq381KebkcBHmGmkZWf/g44E5nVI3i441O7mZiUotIe8Lt5mkpoyh2IAIe8OlYduqQkdcq1cxqf8TrHX/urDWFsnCeueHG+/YGSoBJX9AhxBx2IVa/XJ7TRlNuCyIaSnwiOoXwj7GGiN5tRDSK+vSvX+xh0cAb7hsCHibA+L5W1MYy75LsLge0ZICPdKDxCJw9k4dzvowhtiOyUmNIbtDXXM4YiMjmYE+a9oxOM9KJA4kPZC+vH6IXuzHby9g86+3LtQSjnQmMI0K1lColUkl+ZsKHXgdD5nnN2NzKbYBxy6rjp5JLLrDc4QdIbvLrd/QwX9olbVE7OOqa7SSpq2n0O070MC4+togiTuUNTYWqhRTQoNkenEMYtBlaVqeOm4xJgmsKOSZ3N7GF93r8XjLviaO/4t6dXqJxMGs/hSBUInYdThQTd9L4TJjLYCQUiorTbxmDfRmSnKBJ1yJ1ys955HdM775S3W9eWLx5pVvHnqYehyZmo4+K6rusGp+BUycQIdl4vFMjtFQhN5FAIIUBKjUjkFkIIAUSpMpLfIg/jlOum9DZ1CMMwDBMYjSPvle+jrr3gDG0vIb+7BL/SiUqVpGHy2KpKbM5JC8JMgXbqBwMNjLxvL62f/D6U4NRcbl8Gs9TZbG/JvfmSR0qLzdoK/jwn67lMpMSpF+3o9S9h902ROUNHSMxeB1NHEQ4QmaA+kN58GdSKAIUdORicmuu8yKm5ZLOPy2wdzBGNpjXduT+e4cKO3rSGlfwuKOwkpzUrolln2qf+5nY/sSsndEJsoo1fWpT8y9QhRbJWDe29IoKK2fKV7L1qRsU7T9wf7/PVO8XFJlSrvp9dHBsbqLCQfiqfX7IKktC4RwhRZG+o5wg7sm3s9K4DKQzsrEatpqX6POD71SrVpi7e+er98j4L/R2hmDKknw8V8O0x0Sv2cn+ezNgsx5EaXtbMax/1CJucUWWBvJUTo9grarOpz+xNBNGIincKM/fNX7WvSW0zhV5JBKpIZ82fNvWJKZnch1LqxApMHBk1pcQS08oqGlhWzqhuOKnBlgHWxkOFT7UVwS5oEAn1SPkBeLjVJWm27+qVqtBEL36TaFf8k0+QhYsxhoAYJIkuErnT/azJ/5lvDALH0N7dT/7kDzq88roNsLILs3d3cueD8KI73xKhjHQDURX0RXh+cvJP/vL2MxXpOI7jIB2HtZQT+cdYIJNIYmSNIrPmRhGRHSUfMxiF/05hrOE40owpP/PMl976vcnJ86FwhGAXDR3JULy18wF50QscaOp0e3v0Qm57e5Q6QFrKdVRMpMy6laUwRjepHuxkGXaQ7tpjyRN32dseNabSve2bH2XZlN898dkD17UODPFXHEuPG/xzq3Jbmg1NanAU58pjdzLbGkTB9T8OFFR7Ovm2JJPkvKT1X3D+3NFzLO20nUVAK1eIvZe3cCBnc576xGfN8Y/Dct3xjzXLdNMGQDq3xtKtxLmAPoLFAemuxfsyGAqIx9ed/VCYsx9bOVe0tXMsFy0KxGfhcEH0pm+dmf3y+XM8f/qnf8QtB4kKH8mpJO6PpsfrUfQfT75ec6QCxgijl97g6JPfcv1di0XdfxeesugTH9wSjK31DS5w6CIHFgpoDYgAd8+tM8DccmW8f8tBquyYV/N/PmnFxk0IN4Ih7dYABUtIFGOFNX8irMOxXTeCAlqffUoI+jOXt3rKa6v9j84H2XE1iLPjajzUMsfV8sfuuruw4qSjEA76CEYV2D95KuvLJmfV1sa+PpudVauuiu2dVdtOH6fZGjk+iM6OD95xhoBAs7yjbRFHZHU9EmyLtbefLg7BCHeMLez2Qwo6Ozq4zbOD2+tHdT4gO85pJRkWcbjBcU6A/lLN6nhtrNzWkDUey5fsDZgUC3s/DIRjJRsuEybUnMfdOopt9tU68iowXbx4cHA49W7Ha5O80OoZBpGLB5rxUJ9/k7O128FwX/3Bjl+9mn6ehsbUtYJGC20lx511BI0pnbZfW7EV04rVIz/4WBDxBO8b09mHRHEdtKAfH7x4EC6mkswUfjN9zg/S4+dU4bW5Ehfh0ICHvTK9OL3I9OJUA+0A/fgx3n8ckZzcHtjeQehRvAgH6TWjg1wq2OnZ80fvA8f/DwDTUKemLuRV3gAAAABJRU5ErkJggg==");
tail j=7084 line= kop1_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAoJygjIiUrKi0uLTAwMDM/P0AcHSAHCAWdoo+IjHywtaJMUD5aXkxqblx0eGZ+gnCnq5iSlYcvMiE4Oyo/QjEnKhZRU0cfIRBFRjsWFg1eXld4eHRJSUjV1dS+vr0zMSmBgHxjYl9wb2wlIh5UU1IaGBc6OTn///+GcmWRAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA7JJREFUeNrs2b9vG2Ucx/H39/zjHjvJ1aQJhlCI6khZUZYwds0IGZhYCl3ToQKBxYYUZHWAISsSHVnIf8AAIxM/guQmSFFU1NYiOGrOPt8P3z0Mjt2UpK7DQO7Q851Oz9c6+aXP8zz3+Cyai1aPmC8+CcqAD4UwmbZOtxMAi/+45OKO+CAcXiqAUEAgLi5yKQQA8hf7ePcBoJaBAwAdIZIjzmmdLHUuDXHBPJrA8gBAVIgAbSG5RL9+UOuAhQPpdzRZmD4AiEBjAUIshaT6sNZWCVS4zJrU0RwkEaGtwWoQgKWEP3LXOu3KZTMmdDRZPoBIW4igdSKSm7cRgrZS7QpcOmMyR3Phrwhtyc/Am/HOmorlvXuam1vOYypAMgsZcDSXf9fk5Kd12F5PNu98cE+DuFceMZuQDsZEG+XynuR3lmor7PN29+GH1m961b2ZU48qlQRI0sCYKI89kdo+wHXv/a9X+RH39rvvdPrDx+I8mXDsWlLbhyp9KPc1q9/d/iY+YgZ3cIM5MuHYzdX2oap8AN0Ni3J85Ycb398Y9tPBeKFj99f1fa7mFRzjeOU4Km+vXG/Ptof9q2TCcT8v1cEhtowHlI+Lw3XRz/fz/bQwXnBOvL+zUoXQ8cADKAN5jkb9a2lhjM9j75eVqvIVHmBDAGWOR0ffVDnGPT+OZaWqUF5sf+m6DRo2eI8d76SmpqbSwxjrmLGqCmK7cVifB7mFbduO5ziD47nnvZQexrh5pfEUnt2oA4dz/PnVrWeavEY2HN+uKWKEAMCdOxx8+xOG6FQxxs2rNUXckCCAQqczE8wAMiiQdKUxJo9ua9GzJYACLaocwXTnZEZp0SyQEYdOPFuCAi0UPkAxLIbFk6XBq2TEEeY8WxJaavCWalRFQKeP8TxHGBWQpKXYYGs06A8lr5ARx2efxkLyhA3YAnqUeqURpZhCxvmOyNqsB221AXdPD5cGjjfIiKNT2qwH7Y/grvJRvhqtkBLwMmTEEeQ360GhpXrqmWEfoJRSxllHYBMKQeEJPQXh6X3KZ5G01pnfH/183OBOJ1Q99VQBYRE/vYpz8og9XJFQ0eNpHkXSrfhnHl1Cz3FFgN5oOoGfcsTpPLp9cKfwHFeQEEUPUL5K9ao45Yg+5+O8tf0WMIWH4yJCCAp6Kd6fzjiaiw9Ilrzzeg7ZqX/x/6BxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxTFDW/4PB3wMA+/KA0gruu+gAAAAASUVORK5CYII=");
tail j=7085 line= kop2_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAoJykuLTAcHB4iIiQ4ODpNTU8+Pj+coY6mq5hFSTdNUUBWWkhfY1Fqblx0eGd/g3GwtKKJjXqSlYc5PCsfIRAnKRcwMiI/QDIVFQxjY2DV1dS+vr1fXlp6eXWGhYFZWFVwb2xRT0oIBwZDQkEYFhVTUlJJSEj///8kGCiHAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABARJREFUeNrs2b9vm0Ucx/H397nH9pPYjZ2koSnUzQ+IitRWRN0y8T+whAEhho6VqFRERqSqEnIFgoEFESSGLDDwH8DarVClQ7o4Vt02bUOaOLWb+LHv+TI8sZNKQXRB9aE7T36e8yO/9Lk73/csyv+iiXd4h3d4h3d4h3c43wJ8Hj4Pn4d3eId3eId3eId3eId3eId3+DrK5+Ed3uEd3uEd3uEd3uEdA+m4pzBhjrtVdMkRTua2Sw+LewCSvoQAgdY2kFd72qlxpRY2EEEECRBa6U1RGHbAcjg/qjNA56mICIHQQvqdlHz3tDvzfC9ifTq2DZFAaAlE6fV9QIkmXalrh7p71KDwgyYKfQZRFEUi7c3Hzqy7HTqPp5s5rDSPBpJGgubtpBsONkt0c82cFZqtdH5E+9H+wSSBvOaKTjhY/CnsRDeWrHwCFQRUDgyQB6yedsIBiytJ5saSleYVKkev5w88g7kIH7MvWVz58qOTOZImV6iQp9VTgEJC8qYj+6vFlb2/Tn29lNB86XLaM2EgIcfuEzdL8dCezVmBZu/79xCg6OBBjj0XnehG60OmbRQKBeRET5EEoAry0JF9+5Ptc7WpOM5h091JA0Ya0htdCskZR+qPtXNobEOwwO5IajkyUQYN8k/n7WeTXyVruhUMMNKg0QA0baAqdUfqwbUMsxoTf7sEPBujwuWXl66k7EIevNuhJtls9lq7ssVYZWuJQqFQPJrIfSccnJ3u1ITAmGvL7a3Ly22MMTvjSl8S7LhxzrAmdy8pZ8IYu1OyGDDZOOApoOnHhk46kAdf6IXbMvNAgsCUdp4bgG5A5i1VRQHVFy6MK36e0gu3a2fJEDCuxgAhmbrVE72hxc62E+dXL+6Hd+aDMkbjbJcwxmZe/HZpNL3ZDYFupuiAg/Z6mJiAsllnhgen9HG0P7w98Tvv93uYURccXP90M1mdD5jGUi/bjrJw/mZ3dPONw5+SMRccrGGU1XkCyvXR4ofLC9zi2effn+hvU2QwIP96vrv7yCTC6jxBEiQy+XyYhVtc/i6nw7vpA9DxwV6v0jbyi30n0Av2z9sk/LEx8Y05LwvLUZDthiMhoCpbLuQBrM1VBYusAhf17gftOPfxj8o+2zPsAqJh0QUHa8xVkV4xophkrn3zag4rzezB8Bp3wUGrzlwVBEvfAsx2uF/Kdkd2Xz/kVf/H2a8xRxWQtLQCUVFDMlXXUvD6E3n1/6NadTiwHIRijUWCOxfPPNIxCAvGCQfQehKTYmarqcYirL535yIBoyUwbjgAdgtyr//mbaCapqPBLAC1KeqUzfpsv1Nj47A4GxwHNAO+umpMFmqw8lmOKswB1gCsQxkwh899vnG0zPyPHH8PAM6XwR7zuxV1AAAAAElFTkSuQmCC");
tail j=7086 line= kop3_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAYFhcnJigvLjAiISQcHB8wMDQqKi0/P0Cus6GSl4SboIyIjHykqZZbX01qbl05PCtMTz5SVUV/gnFydGknKhZAQzFFRzofIRAwMiFiY1oWFwx4eHLV1dS+vr0zMSmQj4sIBwRbWleAf30lIR06OTlSUVFISEj/////csusAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/xJREFUeNrs2c9vG0UUwPHv2x3ba+IoKXXqCsVKFaQSCVqJU/8Fjpw5tCoSHHqKUPghlCMCCYnABd+olFvpgb+CSw9VL1wqIMk2UkPiTXBqQ3azOzMc1kmhpGlSiXoXzZzWI+9oPnrz3ozHYvlfNHEO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53CO/6Sp0sy0f1RnfQXa67O/lsDRl54RAAseNSRlbKCwAD++3Zj6gk+hVfB1FcUWz3iAAYtHTUjHBgpbhTMlyY/oT/EAsnzRGKxXQ1KLmgKkJPnRjT0fMoAsn6cFJB0LFJBVypHn3djzckTeMgV4NenwCUJmaqWoV929fEX9Y572XFQHFJmhVoa62981gsFDDdeVAjDnaCUxi9pgg3+94xWxRhksYAyglFIK4IMFooTOojb2alCG/TyKwTxZjxZgOZqMO4s741e/L8W5ZEOR5NvFkGLFygLL+MkSi599fDSjcI4NRVJLwHjmsO/DZcDf7cyP92tPYRTN8Wg/n0/yuKsJRK0krgZqUDsiw4uY5w/3yQSgdlhZm0SR30riTqBs1wtKcW5/KFDJ922osweTbLYgIa4G6sHM/bmnvlqkeGwNS5SIiEhMvU6PVpIk8VI1UHIco0jx2AoGh7U2Pz3lqyjuMB8o+eGN2UoZHJv6iU3jYNad+QAlhp/nyvC79ve9w8fGoAF8A9ygwzyBQsL2sYzC5MdO6is1PEkNIAhgnvfSKvNBQyFh+st0Ge4ZfpO/LakmZMT5c6AACY0kx4ajKPGogR22qanuMMmDQRCoSETCu1lyoQT3PrsasWIPIjLZZRKIzmf0poDw7iXTmC6+o/9H9eBxYndivY3XD1BRk0wJIe3QZK9WKL5j93GpYmK/uq1RtbOARULahCZrNp81RgHyY5t63iYmHjWr7++81WyeodfrhfIgpB2umNbtZzIKEI9tdXCdUNXj73zZ5Ap33r1l1gHaoVYmZY7iO3ra1z5Aff/rj67dvMIdorMv2fX2eptQq9RP504yzKgdvRzhV+k2jQW5/t3Sog1nIESr1NP2RIwRO/pa+0AdI9duIte/rQaV1Uz8e2/eu6xSD8lOyBhtnvc0PtQ3u1YPXtdfqVv9rbU1LejLckm0Lzo9KWOk8egB9T2/oj6/8fIKgBFQkOIhZFjmTjzWCB09wK+otfMbghEFkIKXH95Ppxiho4/2dQO75lujSPM/B/KTSYaFUylG5rgPrcZKJfONh6CHggy4sHpqw4t3rJICnmSA0hUgzT+g0uFXXpPnGvnF1iutPd/385lOz+wbs2/19E8++PbixdnZV25PT+8938h/DQAMRqY09QFaLwAAAABJRU5ErkJggg==");
tail j=7087 line= kop4_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/tJREFUeNrs2b1vHEUYwOHfzO5yu3c+nz/OCXEIkWMjuYA4pVuQoKCipKLgS8hSRGkKKwVCikxEYSG5cERFgcSfEDoqd7GRkSLZYCw5duy7893lvtbZnZ0Ud2efFIGdAnyDZqrd2ZV2nn3fmXm1KzT/Qnv095emgBj80x5F3d8bLV2H0EsWv2SQt1aZ3Xi5J4r/2DG1NUWM1wZsO4BCTsQubHVvGS+Nh25a9IPjHE1BJbvtsH7ztxmUhPZAJkFvAanXPDMcqBrKUdmd8X20QMlEghZdzSYwbYQDVVPg8KyiXy1oknaOAZ3YTLL5EpILdAAlIFen+uynuZE/gLYGBVIDk+eXXKyDigLIiVJrKFqeR8WHOqFjkWgmN88JkRfKYMgBqNZGrhaS36Mo+Gzo9WtX1hXr6xsbItHiT6kefW1APDq5BTgD8UEw1oDMhytLC9trt2CNGYW8sfnzHRMcXQjkYvERPzC7SnnwSAPotRmUSCZSJjgoCdDZ+kAdmX36xb0RZln95L5ygYJemyFJpo1wcKSczlLsFCaOP733/iqZUgo0goJem9HXfCMcHKnT41/fPvIkOvdK9HSwxKigoLVW00Y4KpF7elIee3Br3I3wj0mFfl1A4eHNsyD94eBINE5me5VBvFToEQFeTATFh2/qaRMcsAvdEjeLB9qDIuQj/zgC8eAMSN84Cs86wxHDZT2iwSMBWcwT+cdPyJ8BkX3CYCwtEAIhqCDLVD1YpFy6nySe0tfR7zlvVE2IB+zK09QCRiivwOduvDIvI5+6OIymjXDwWLZHJIbLAKzMgRcBy/My8utF/Q+QfnLwWJ4EpLMOe5EHRGRl5Nd/+cDp//kBcFULwHVdt83wPBQueF7trhMOvNswI6+APQkuPbv7ABTzxBBlld/Qg4Y42PdAOQoI/dAPAQJa5ImjrHT+umGKg33ZVvR0BUAGWlnpKM+E+QFwRSsIQyDoNrjNxw2C2l21e2xKPOCJIOxEgWa6CWm4DXyfaS3P7/14xxQHxUZX0ds7D98ORcsLtZwReQXkM34ANJvtAUopJZJFCNxg7pts1ZR4QHgQNF94yQlpMvESC62Ua4gDDkSzXaV0OzQkaTIxSyzsXHpBIvuTweVLQZL01o1CIJsUQyC6fNhsxGbEA+CgxWkJrIEkTct34tHI3xnFyZjigGLS7MmYBNItHyfWejiC0oQxDqDY0MhEQgKkaeE7xBqt0eSy5jiAStwIaO+HtPBxYjS6/eNn9Z2U/o6vjHCceHpP/E4dmd6GscKESQ4jvpdYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3V0mvx/MHg+AP4/vJxNJjIqAAAAAElFTkSuQmCC");
tail j=7088 line= kop12_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABqpJREFUeNrs209MHNcdwPHvb3aX2Rl2vdiw65iNsaGyFCmJipAacU2q5t5TLlZkiUo9xdwsEalVVVd1zaESOfVQoirqpZHaa2/u1afILhywYhvbsCCz2Ga9uzO7O8z79bB/WGLjQKuWmYp3QDBvBumj937z3pv3fqIctdQJ+GLWtlKwmi8P60DpUn+1V6K4/8r/osjRHVrd6P0+DqyFAqAWxVKxVHQ5jnJEx8MWMB6WOg9DiLD0QwOaGMLleBBHdKwAY3sEgFCwDBOPJp673jEqjuJYaRsECLsSTWAK2xNN9WCE4yyHdbQVnY7UFgA/2OVxUb1s9bgZh3SsMFZCegYS4ajt41K30ScjcOyMwzlWxkpCiCwB7+vyx7bvXv5SSbBmiITicI6VsY0QWWIKvpm6eP3qz79UECsVEnpEg3Eox7cGWZoygKVnmoNM356+lW2lEtXOvxg+fgbWYQY+WU5NmnyeMyNzyR9Pc9t7t76e8msigkgkGIdoj/tmacpQQAGnpUzf+uy349+OCO0n5QyxcNw3KUNeyuTZGTUvlFNrmv/Hh73nosH4Xsf9u5PkkUyQMlgBZkO++ai//jSxcNxbniyAS8B2AQMpPBR2uvVjxMJxb3myUM67hMaikgUrZTaGdnrhr5FhvPl9dW/5J1ImEwamWikPNLEINkddEQEB6U4Wo94e3vpbkiHANKktMrswa1ez1pbd7LXH2/FwrBoZJzBNd6vA1uLcVgZavcomRIjxJseqKWQC/IU5oJxna3GmfX2gBQNAnng4/vpxJjDzc9QBvHwZ6N08EDHGmxzVTOAvzNWBTNkBPADX63CKxMNR1Wzgu3XIwPZIGRz8dngDGjXGwY4HE82mW8+wnYNKb8Do9q1RYuJo2M2mK2zn6DH6WiNyjIPGwcpGc96VIMhx5enTRqd0vy5I9BgHtMevLw+7SMAV5nXfXWlAzxETR5C8Pldv5K4wz/4ulW6k4S1i4tjJXZ+rN2Zh3vFxfAf6XlUXISaO3cT1uXomYMvZd9kH0IgyXnXsJqm41DPBU3H6BnAE8C9AXBwP3zbzXPWlIQ79dRJlxWscGphnItJA2GsPIdqK7zqquJt2S1y/6+iGRrQR/Y6qsiOITUsQoYEAju/EAQFI+Bs+N/VbHwCMbtq0EEHoDN6RfT+94liR4W0uNV5X5xKf8m/sD544ThwnjhPHieM/cdxT/g+GD5JnXTGVWx+gArJvOBdQ0umhWPWrg6ZXPmCb0RjFh67maU93hf3TXXx0YDQ+cb77JF8e7y0/9q0+8Bk4F2VH//erZNFhFTJ/dDQNfm85qKrqOK3Hm7F57zZJPBl/+eryXFTAR+1z8XDgWyQSL916JmCrHSAqKnufS9Kn7ej3K8D51IThqRuDtQrXrvm+Dw3Ex/d9QJXG841YOPiL82m4+4sbg+kKXAPfx/c7baGQTou1EYd+BfDJVzf3f94V7d6VBsUU4+Hgk69uXh6dn5MAuHKzezXdSAMokYS8dp7oW/r67Q9t/9Bi5OOjHe2JtYe27WltJFWBXA+h0g4TKcfDwbOwULUdb7BWS6dSKUZUVdNoZzxRba3Hw3H2nZLUUo73xSC1GiM1HMfxVFW1O1VZj0N8ALutv/dvn7c3nffuHaBxPh7rwRV7/3EGbsz0KSBikIPXtSt253jJwkyBGzOLzNJ3vqQJZiwWjp2B9YSMm9A0F2ZrLDIzDNUcvfM+KoOn4+BgRZYnhQuEmGq2id20ra1Cgk26JwIYPBPx9xUAF/S9O5p/7CVSVrbasrGhmNjwNKfaOQ5Qi057JH51YFVq6PnZf2YLBEnLOC8zooiQ0PROtnuSDOO50e9XsHs/eXdqmL7joqmXmgz77tC0GwMHwYPk3vFdXPNCJbumy3y4BxmOfHwAqa/PW8Edq7yVz+sLrTM46P5o6Jcf/bS8TWd0l2dxaA9YIaEsTRny5XyY/NniNLfxPvuD3VlbCehIHBxUNhNG6KQbXKw0B5m+jdefbhAJyPfmG+S+Ds9b+l5w545l8bcXhd/vvivTbph8mchm3fakazsO7cGB6Tgzf1q7QLtRXDcOjlfTo8w5+3ezLvVGTjvdKxb5UTQeddLVQr6TrpZottPV4pGvBq2HB6QPjj9upw/GJH8QGo/opXN2szlBLMOExXGncx5tX62xsS+9FoFQwLr7PnrpuXucW1hH3h+snKqVen+MA2tGhU66M8VSchhAyhO9m7wnvV/fiY4D6nvp5/DnqwMl4BLQnvs+aB98l8xeaK32PfzfkvxrALevHeCpERZIAAAAAElFTkSuQmCC");
tail j=7089 line= kop23_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAoJyglIyYrKi0uLTAhICQaGh0wMDM/P0Cdoo6IjHywtaJaXkxqblx0eGd+gnGnq5iSlYdMTz4nKhY5PCpAQzFFRztRU0ZdXlcfIRAwMiEJCQZiYl7V1dS+vr0XFg8zMSl4d3OBgHxvbmsjIR06OTlTUlJJSEgAAAA68G0oAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9SmnbfAAAfU0lEQVT///////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A2PfY2PH79vb29vb29vb29vb29vb29vbw9vb2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vb29vb29vb29vb29vb29vb29vb2+9jx2PfY+wD7gfr5/fys6enp6e7u4+Pv5OTl5ubh4eHo6Ojg4ODo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9uXh6Ojg4ODo6Ojo4eHm5uXk5O/j4+7u6enp6az8/fn6gdn7AP///////////u3t7enu4+Pv5OXl5uHh6Ojg4ODg4Ofn5+Dg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l4eDg4ODn5+fg4ODg6Ojh4ebl5eTv4+7u6e3t7f////////////8A//////////////////7+7uPv5OXm5uHo4ODg5+fn5+fn5+fn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Xo4ODn5+fn5+fn5+fn4ODg6OHm5uXk8+Pu/v7+/v///////////////wD//////////////////////e/v5OXm4ejo4ODn5+fi4uLi4uLn5+fn4P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn5+Li4uLi4uLn5+fn4Ojo4ebl8/P9/f3+/vn/////////////////AP/////////////////////+/fOBgfjm4ejg5+fi4uLi4uLi4uLi4uLn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn4uLi4uLi4uLi4uLi5+fg6OHm+PqB8/3+/vny//////////////////8A//////////////////////n//4H6+vn54ejg5+fn4uLi4uLi4uLi5+fn5+fg/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bo4ODn5+fn4uLi4uLi4uLi5+fn4Ojo+fn6gYH9/fny/////////////////////wD////////////////////////5/YH6+Pno6ODn5+fn5+fn5+fn4ufn5+Dg4ODg6P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Lh6ODg4ODn5+fn5+fn5+fn5+fn5+Dg6Oj5+PqB/fny////////////////////////AP/////////////////////////4/YH6+OFWVlbg5+Dn4Ofn5+fg4ODg4ODg6Ojo6P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l5ujo6ODg4ODg4ODn5+fn5+fg4ODgVlbo4fj6gf34//////////////////////////8A///////////////////////////6/YH6+PnoVlZW4ODg4ODg4ODg4ODg4Ojo6Ojh4eH/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eHh4eHo6Ojo4ODg4ODg4ODg4ODg4FZWVuH4+oH9+P///////////////////////////wD///////////////////////////+B/YGB+Pno6FZWVujo6Ojg4Ojg6Ojo6Ojh4eHm4eb//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Tm5uHh4eHo6Ojo6ODo4Ojg6OjoVlZWVuj5+vrz/YH/////////////////////////////AP////////////////////////////+B/vOB+vnh6OjoVujo6Ojo6Ojo6Ojh4eHh4eHm5ub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////k5ubm4eHh4eHo6Ojo6Ojo6Ojo6FboVujh+fqB8/6B//////////////////////////////8A///////////////////////////////z/e/z+vn54ejo6Ojh4eHh4eHh4eHh4eHm5ubm5eX/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5OXl5ubm5uHh4eHh4eHh4eHh4ejo6Oj5+fn68+/98////////////////////////////////wD////////////////////////////////8/e/z+vj5+fnh6Ojh4eHh4ebh5uHm5ubm5eXl5eX//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pl5eXl5ebm5ubh5uHm4eHh4eHo6OHh+fn4+vPv/fz/////////////////////////////////AP////////////////////////////////7f/e/z+vj4+fn5+eH55vnm5vjm5ubm5ubl5eTl5OT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j5OTk5eXl5ubm5ubm+Obm5vn5+eH5+fn4+Prz7/3f/v////////////////////////////////8A///////////////////////////////////+/e/zgfr4+Pj5+ebm+Pj45eXl5eXl5eXl5eTk5OT/////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+Tk5OTl5eXl5eXl5eXl+Pj45ub5+Pn4+PqB8+/9/v7//////////////////////////////////wD//////////////////////////////////6z+/f3zgfr6+Pj4+Pjl5eXl5frk5OTk5OTk5OTj5OP//////////////////////////////////////////////////////////////////////////////////////////////////////////////+7k4+Tk5OTk5OTk5OX65eX65fjl+Pj4+Pr6ge/v/f6s9v//////////////////////////////////AP///////////////////////////////////Pz+/f3v84H6+vr65fr6+oHk5OTk5OTk5OTk5OTj4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////p4+Pj7+Tk5OTk5OTk5OTkgeT6+vrl+vr6gfPv/f3+/PzX//////////////////////////////////8A/////////////////////////////////////N/+/f3v8/P65Pr6geT65PPz8/Pv7+/v7+Pj4+Pj4+P/////////////////////////////////////////////////////////////////////////////////////////////////////////7ePu4+Pj4+Pv7+/v7/Pz8/Pk+oH6+vqB+vPz/f39/t/81////////////////////////////////////wD////////////////////////////////////229/+/f397/PzgeTkgfOB8+/v7/3j4+Pj4+Pj4+7u7u7//////////////////////////////////////////////////////////////////////////////////////////////////////+zu7u7j4+Pj4+Pj4+Pj7+/v84HzgeTk8/Pz7/39/f7f2/b4////////////////////////////////////AP/////////////////////////////////////arN/+/f79/e/v7/Pz8/Pz7/394+7u7u7u7u7u7u7p6en////////////////////////////////////////////////////////////////////////////////////////////////////r6enp7u7u7u7u7u7u7v394+/v8/Pz7+/v7/397v3+36za1/////////////////////////////////////8A///////////////////////////////////////YrN/+/v7u/e/v7+/v7/Pv7/397v7+6enp6enp6enp6f///////////////////////////////////////////////////////////////////////////////////////////////////+3p6enp6enp6enp6f7+7v3v7/Pv7+/v7+/97v7+/t+s2Nf//////////////////////////////////////wD////////////////////////////////////////Y3t/+/v7+7u/v/f3v7+/v/e7+7e3t7e3t7e3s7ezt7P////////////////////////////////////////////////////////////////////////////////////////////////Hs7O3s7ezt7e3t7e3t7f7u/f3v7+/j/e/v7v7+/v7frNjX////////////////////////////////////////AP/////////////////////////////////////////ZrPzf3+3+/f397u794/3z/vys3/zs/Ozs7Ozs7Ozs7P/////////////////////////////////////////////////////////////////////////////////////////////26+zs7Ozs7Ozs/Oz8/N+s/P7z7+P97u79/f3+39/f/KzZ1/////////////////////////////////////////8A///////////////////////////////////////////c3vzf39/+/f3+/v7++Ofi5+jb8ffr6+vr6+vr6+vr6/////////////////////////////////////////////////////////////////////////////////////////////Hr6+vr6+vr6+vr6/f39+Hi4uf4/v7p/v79/t/f/Pzb2df//////////////////////////////////////////wD////////////////////////////////////////////Z297839/f/v7t7e369fT0K+dW3/vY9/fx8fHx8fHx6//////////////////////////////////////////////////////////////////////////////////////////q6/Hx8fHx8ff38dj731bnK/T09frt7d/+/v7f3/ys29ny////////////////////////////////////////////AP//////////////////////////////////////////////2t7e/N/f39/f/P5W9Csr9PTnVvz29vHq6urq6urq6v//////////////////////////////////////////////////////////////////////////////////////6vHq6urq6urq6vbd/Fbn9PQrK/RW/vzf39/f/Pze3tr71/////////////////////////////////////////////8A///////////////////////////////////////////////d2NrerPz83/zf/P344vT0K/Qr51bz8vLw8PDw8PDq6v////////////////////////////////////////////////////////////////////////////////////Dq6vDw8PDw8PLy8+jnK/Qr9PTi+P38/N/f/Pze3trY3dfz/////////////////////////////////////////////wD//////////////////////////////////////////////9f23Nja296s/Pz8rPz9gfhW9fT09PXo4fLy9vDw8PDw6v/////////////////////////////////////////////////////////////////////////////////w6vDw8PDw9vLy4ej19PT09Vb4gf38rPz8/Kze29rY3PbXgf//////////////////////////////////////////////AP///////////////////////////////////////////////9f23dzZ2NrbrKysrNvY3v7v8/pW9fT0Vujb8tfw8PDw6v/////////////////////////////////////////////////////////////////////////////28Orw8PDw8tfb6Fb09PVW+vPv/qzY26ysrKzb2tnZ3N321/r///////////////////////////////////////////////8A/////////////////////////////////////////////////9fX9t3d3NnY2trb3t7b2tnc2v7v8/P6+vjh6Pby8PDw8PD/////////////////////////////////////////////////////////////////////////8PDw8PDw8vbh6Pj6+vPz7/7a2dna29ve29ra2Nzc3N321////////////////////////////////////////////////////wD////////////////////////////////////////////////////X1/bd3d3c3NnY2tra29vb2Nnc3Nzc/fr63OH28Nfw8PD///////////////////////////////////////////////////////////////////////Dw8PDy9vbh3Pr6/dzc3NzZ2Nvb29ra2tjZ3Nzd3d3219f/////////////////////////////////////////////////////AP//////////////////////////////////////////////////////19f23d3d3N3c3NnZ2Nra2tra29vY3Nzb+Nz76Pbw8PD/////////////////////////////////////////////////////////////////9vbw8PDw9uj72fjb3NzY29ra2tra2NjY2dzc3N3d3d3219f///////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////9fX19f23d3d3dzd3dzc3NnZ2dna2tvc3tv52fvw8PD29v////////////////////////////////////////////////////////////b29vDw8Pvc+dve3Nva2tnZ2dnc3Nzc3d3d3d3d9tfX19f//////////////////////////////////////////////////////////wD//////////////////////////////////////////////////////////////tfX19fX9t3d3d3d3d3d3NzZ2tre3tze29rY+93w9vb////////////////////////////////////////////////////////d9vbw+9ja3t7c3t7a2tnc3Nzd3d3d3d3d9tfX19fX/u//////////////////////////////////////////////////////////////AP///////////////////////////////////////////////////////////////////f7X19fX19fX19fy8vLy8tnY2trb29vY+9323fbd9v/////y8tfX19fX19fX19fX19fX19fX19fX19fX19fy1/Ly8vb29t323fvY29vb2trY2fLy8vLy19fX19fX19fX/v3z+Pn1//////////////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////////////19fj4gfPv7/39/f7+/oH49t3/////////////////9t3w3fbX19fX19fX19fX19fX19fX19fX19fX19fX19fy8vLy8vb//////////////932+IH+/v79/f3v7/OB+Pj19Sv09Cv//////////////////////////////////////////////////////////////62tvpqb3Y+CAAAAAElFTkSuQmCC");
tail j=7090 line= kop34_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAYFhcpJygkIyYrKi0gICQcHB8wMDQuLjE/P0CcoY6IjHymq5iwtaJLTz1qblx+gnAwNCA5PCtbXk1ydGknKhZAQzGSlIdSVEYfIRBFRjsWFgwICAVdXVd4eHNiYl6AgHzV1dS+vr0zMSklIR1TUlE6OTlJSEj///9WIeiUAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABrFJREFUeNrs201vG8cZwPH/DHep5ctKZCwZUhPKTQzDApK2QHUu0PYDBPCtBZq0gFFAMNBLUl4iJAVSpEAt5VjCtwIuCjQ+xB8ih16kAkZTIC5qJ6LUWJYoS/KulxRndqaHJSXasiPaRc3dwnNaragVf5wZztvzCMv/oHzxDb97BcD6RzduUlt+Hwx0kEu/xuH7q8x//nT/UTxnR6LgawDXOKDBzgBs9F9y3nStlPk0OIYoN2G6dFs61khirAQBKMACnI9K2XAQYKSh9GVtkzinsYAk0aCwwFwmHAQYQOrd+OWtmDivAQwCpOhZ5rLgAPaBXCz17jjVrwzS2DxoMEIiQA0vGa2DfQBy/y6Wx5apY4q3LMIBNEZIgbJDQuRIGUxINMTT1btbv/qHlO5PKq986+xql9UbN/7uWh07+ZtffJiB+gD2tQMgBbvlkgXx1h+XF8X1C7CG6JLT9toHWXCwr3GS5mWdzsJV5ldpVccErNdYE9o43TOFLDjY7zi9qxbnfvrxFPOsvv0Xuw5QWxNadufS3j+STuLopIxXXtv+c/z2Nqv8aSesVmdnWZezN6QbZKI+4K44vPzsTdiUWO8UYJBNaqwZNZcJR9Dutywqe5X1lQuiY/ACfJBNqF3/bjyXBQd3XRzt6L7Gx3QAjw5qAmiufMfMZcFBMgPulZl9nw5IA+Ahh4CkxrGlodirjQD/3ksdmcy38ADZXPmensuCg3uyN28HoAhyqb4HFTAeyKY9qBWz4OBrdxAB8KDBJWjUyYNsrrw+lwlHAtFHP7uNS8lFo248pOWfc5lwsKeOFG6/ZoCIxrt48tM3zmfDwV77UNBT3K9ggKhRN55EZMTBtsZV7lGtVPYqbE9hICoZb2NWZMTBtnbRjgaUq1wFUCZkChOVjCdkVhzcSWpDDdwqAwUIS8brFlI8332ozChAKaDcL7DAz9uUH3zc9T7MSn3AHYHq1ULgB4APC8CVQtio5z/6ICsOWu2e4qG7dVg+FTUWD4qZaFfAZMEtQxAk709KKSWSJSjvFC99NBZlpT4g2CsHxz9l41MwyywqXc6IAzbHAgkcjXy252CZRY5LZDoZTFfzxgwwEAIZsH0f6HbGSp0wG/UBsNlFHlIsYPBD11HjHkgOvKw4oJULBlqMwSd0cVQldCcG21zqHUCrbZFGggF8QlwHNR65RGUYz44DCA7aZXoDYoiLo6iELkSAM2nVZd7LhOPQ87ibhdvw6pevZcmRif2SF44XjheOF44TivN/MXrcyoAjyO0ki5Gj0Xw8wo0A/nrhrLrMezCd8nbValtAGjk4u6qEbsRDs6t0949HZ7v4oYujHI7NdtPcPza7SImworf6kMYHHDWOB4+sPtLr2OySbOcmH7vAAqHrNKjnJQfH1rXpbFePX52HnIoo5VGachb2fYL1sQBjAGstFmuTD7s8BY28amt1fL8khY7WgzK+DyahYDEY826d0NBYVHr3YpUMOFptFYbgA5ikYOr1JQqnouXFXX2x9kkW5iUDu7sQgB/4BHWuUDDLvP/bdy5+kon51R3B4bFHvyxwhXAqbNS9JzLS5nj86Uc41Tv9iFX1CX+Yrv6x7eI4gOsOMMJCjyGazpMY6XJsa6VUMjS7bsF1XXeKQmEKYy6XjLchrJeJ9UfvtLYfLZOc1oLpn9bezEYcwBNOzyMa1I0nP33jjJcFx6PRDIfn6ENEM6TIcf/g6LoogSXgEg3qGO+k6JL0OO7JqPhotM/SL4eN9kmNY0tTjA7faBJFBhhpkugrE+tvjodLyfeuBxFRFEVRNDExASCNCUOMF0gpm0bp32Rg3+euS8cbiE7cxwWilwaiE7/tpd8RtJ3+oKEn94KVH1UjPAh8kMEutTUdn8RIxbo2Err/jfvZm61Xf/ygbb0kJE42YcWYePIkRhr6xw42KdXq3g9zxZ/9YGryNEEQ+HKjSc3M69PXJk98yOjb1c5hv8gb/7HR7cMks4zcsd8PP85Z5xccZRus1+hlGwyVySJHz8ABmcvt7uWuXkW8Hv9+2mtC7fpaM1bCDscYcX0ERjtAbuNsuHAV8dYfSqb4lcrbv8G8tkgxdF7RSB297CirGVuGuineEsbmAY3JIbKS55Vkq20WZ37H4m0kz56tNlLHPiC1T3dLYfMaSAJjEsRTZQ+O0BFgpCmhN63JaSP4r7I5R+YYyK4VuteOkm2Slzee2vD8Hf8ygJBCAW4sAJMTCsDt9l5yXjzTk5/v+CFyuZyTS97p6ZlYxrHVpz93wInPnavVzlybnVXP9uT/DADjuRVfTGbbYQAAAABJRU5ErkJggg== ");
tail j=7091 line= kop14_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABtVJREFUeNrs2c1vG8cZx/Hv7Ctt0qRkhrIpW9zENhADKVqgBqpTb7mkJ6MnB0gLFL4rgIFGEODm4AoVnAICqrvRoscCLfwH5NZehCJB7fogJ7VdipaoWJUorkSK+/r0sKREN3EiSpQSFPs7kTvk7Hz4zA5nSSUMmjY6d2+F5EHBr6fj+qX+5t16caNcffXbLwAYp/YPPC1rd38FAi7G/DQRP1pk8tFgg1KDO2L1+KUx1UVDQXR5uVwv18ungG1WXslYuQAG1Mv1yhMdhFiVgf13vCltU4Wnj9UhjwGceu8pkcIg1iKJLy8XLU4duKenZfzsE80g1ggRHVTSkNTyzebIsTmWegRRCESAQiktqvz7UgsGUQC74EO2OrGsxyIIoNPTlKvA1WNxLOHUQZQQIRqAIjKQiefORt6HwqDzcxcfsNziU6emCHUBiEF1a1OuDiA5qKOrIBINFERKB96IWDZLfr18CAZAE9AM1oMK+jMgEh0EYqWjBpIczLGEU0ci0VA6kYgeX2ka2MRf2PkwhkMyEghoxro9ouERFv4lKIUeCbEBqlw9IEQ7EMOxVsMg1h49fPgg8vUrY+dev2Ep9d5mbbThx+AXDsmgYOFD7I82apvvKWXdeH187MqDKHrw8OEjiaNw1dpdCoZVjyVnNdSU/ul1uH9dzU7//PcCatsbxfAB/BJHSNO3AKyQhn1GQP3ij3dvy/3rcP+HkcTGePVPHw7H8TTQjE+vU5uoTajgxVkmFyc/fv+eEAPgcyQGNH2s7txQLXl7cXKRzTFTqDHBMmFs+hdzQ5lXkWVUrtVq1Ca0d8N3Jlncfqv0B106vu/7/pEZFLCTnjodvVV6a3uRyXfCdzWgVqtUDCu68nwY9fhM0ys1cGjAmUCY/Pj9uxefOPhJs/8aR866Sgpi4dcvP5/+3duLKHMb14EqE/d/EJfPHNnxRKvUwBEU4DcCU22PWTv77UNggOvvP87BC4U5arFeQlSVCZ7F8dUjzqvP/lGpkXcEtrZkxcxdLP3NyLZGVS9DYWDS629Umeba38cv5nZXxNwSxKFWe+Of2tLR6vHYUg6wpcjjAvnmSKO3t1KipMhw4gYoUdLdYjG6VcCFnXEXGQGqn3xPrh7B8fjRNQe2Ci4ARkie5gjre+1jDC2b4f7jElsFFyM5km+OHADytY7PH15zRAkuGABhntXsXmswVMd/YjD71rDVHAaEQJ5mQVU/+X509ZDXx6665gjito2FVnOeeXDd8VY3YJpDZPCabpr0Om+tujmMeeZbLcNouwXEuaYc75AOy3AEt23YzZmxezftmxiG4eZyuRxAq9UaZZgpSqu7YOVyuZxhGNy0GRuz522jDeIY1rPDzasITXCN+RlgvQRzN/tvqOAiQ84LH3Kt/ef3bo51z3wrzKNiPr96GMeffyq052eS7ccGQOkF+4vV0BnQaO+tWKjSOqX14kYR0JibIq/+8pNTh3GIuMb8TAyKDc52Kb1iJLfmw85ztXdHCFCETYqiBG3uVphXfU0Hdki14hp2jALWzm8UNzi72UWIkuNhJBDVo5zdhCKsnQdB88L8sqMGdkTKNexYwZqNB2AGZmB2i8E4x5Tn3TtmCMzADABsPM4jmhfmRR/UsXPaNWxhzQa8l3YQIMfHgJVk9vTfPNnAKCgvzLdzg627d7LtBVvWGjZTYHcDEASgjpHBBVHJWfZOa8MUP2usib3Qzt4ZqB53bs8yrRpMwQLQIdPJkFTGDMwyx5oVjaBbBTqZTqaTgSlgYVThnZ798OCOQJ+diVVjCj7qP5xJJBWOOathl9HpP/oB/PacNnc7sA/q8MzZmfiLX8JHtmd7fVdIBjjH8WdVaXuIZNQe8AEL3ishX+HwjdmZWDXo7L8+MLuWzEkwYLthd/YMex8vGUZFm7sdeme++Tr3sWZnUN0SBEkIwLZtnJNhcKYSZxJG0EtXpWDWyPrb3+gw4x3m4o01u2Mny8beJt0773BiKZ+z8PqX3yDA7rC2Ec/Qxsz9r+RL8yp2aSkV2HSwe/2YgHeCiG7q/v4QkjFk8EzJcxoUgfVqh7DVyrWUIrA7/dPzW0AkF7ze6R8FZDwTkcJWduSljVifQxoQmi1yLYUKsJP1wgaPbwnRW4SlNw7I4GEKkt3JEhhwdt8R/GZGDLn/Y8CkRa6FUiRXVefE1qevz24jtOn0vr9MRMjukCUA/npdhWruxiW15FQpn/7Sb8G+xWB/y5yE5yt/MnpSrjvVy4f4f/A7mdSROlJH6kgdqSN1pI7UkTpSR+pIHakjdaSO1JE6UkfqSB2pI3WkjtSROlJH6kgdqSN1pI7vWrT/Dwb/HQCWcg5gw1gsvgAAAABJRU5ErkJggg== ");
tail j=7092 line= btn_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAACT1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgID///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAABAgID///+AAAD/AP+lmdfcAAAAwHRSTlM8ODQwLCgkIBwYFBAMCAQAQERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+PxTzsGTAAAAAWJLR0TEFAwb4QAAARNJREFUeJxjOEwLwHD4ABzY29naWFtZWpibmZoYGxka6Ovp6mhraWqoq6mqKCspKsjLycpIS0lKiIuJiggLCQowMDIxs7CysXNwcnHz8PLxw8GoqaOmjpo6auqoqaOm0szUg3BQX1dbU11VWVFeVlpSXFRYkJ+Xm5OdlZmRnpaakpyUmBAfFxsTHRUZER4WGhIcFBjg7+fr4+3l6eHu5uri7OToAAejpo6aOmrqqKmjpo6aSjNTD8HB/n179+zetXPH9m1bt2zetHHD+nVr16xetXLF8mVLlyxetHDB/Hlz58yeNXPG9GlTp0yeNHFCf19vT3dXZ0d7W2tLc1NjAxyMmjpq6qipo6aOmjpqKs1MpQUAAIrvy8PKBZ9nAAAAAElFTkSuQmCC");
tail j=7093 line= btn_n_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0CRzonygAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6SgsCoMgp1Q3Iv75/UqMBh2QXplGAK7Ib0SDIXfIL0iDIM9kF4BhsNeSC8PI+B3SC8HI2EfpJeFUbAf0svAaDgA6V/AGPgD0kvDWDgI6aVgHByC9JLwLRyG9BLwHRyB9AL4Ho5CejX4AY5BenUYD8chvQZMgBOQXhMmwp+QXgsmwUlI/xImwylIrw1T4C9IrwNT4TSk14VpcAbS68GPcBbS68N0OAfpDWAGnIf0hjATLkB6I/gJLkJ6Y5gFlyC9CcyGy5DeFObAFUhvBnPhKqQ3h3lwDdJbwHz4G9JbwgK4DumtYCHcgPTWsAhuQnobWAy3IL0tLIHbkN4OfoY7kN4elsJdSO8Ay+AfSO8Iy+FfSO8EK+AepHeGX+A+pH8FK+E/SP8aVsEDSO8Cq+EhpHeFX+ERpHeDNfAY0rvDWvgf0nvAOngC6d/AengK6T1hAzyD9F6wEZ5Dem/YBC8gvQ9shpeQ3he2wCtI7wdb4TWk94dt8AbSB8B2eAvpA2EHvIP09/ABPkJxL+6f14vkEzs8y8O5aXg1AAAAAElFTkSuQmCC");
tail j=7094 line= btn_s_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0Us+6SmwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6Sg8D18gI9Q3Iv75/WBsAPeQfoA2A5vIb0/bIM3kN4PtsJrSO8LW+AVpPeBzfAS0nvDJngB6b1gIzyH9J6wAZ5B+jewHp5Ceg9YB08gvTushf8hvRusgceQ3hV+hUeQ3gVWw0NI/xpWwQNI/wpWwn+Q3hl+gfuQ3glWwD1I7wjL4V9I7wDL4B9Ibw9L4S6kt4Of4Q6kt4UlcBvS28BiuAXprWER3IT0VrAQbkB6S1gA1yG9BcyHvyG9OcyDa5DeDObCVUhvCnPgCqQ3gdlwGdIbwyy4BOmN4Ce4COkNYSZcgPQGMAPOQ3p9mA7nIL0e/AhnIb0uTIMzkF4HpsJpSK8NU+AvSP8SJsMpSK8Fk+AkpNeEifAnpNeACXAC0qvDeDgO6dXgBzgG6QXwPRyF9BLwHRyB9JLwLRyG9FIwDg5BemkYCwch/QsYA39AehkYDQcgvSyMgv2QXg5Gwj5ILw8j4HdIrwDDYS+kV4RhsAfSK8FQ+A3SK8MQ2A3pVWAw7IL0qjAIdkJxL+6f14vkE2w6y8NwNQP6AAAAAElFTkSuQmCC");
tail j=7095 line= btn_e_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwh/EZn+QAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8Bw+AAc2NvZ2lhbWVqYm5maGBsZGujr6epoa2lqqKupqigrKSrIy8nKSEtJSoiLiYoICwkKMDAyMbOwsrFzcHJx8/Dy8cPBqKmjpo6aOmrqqKmjptLM1INwUF9XW1NdVVlRXlZaUlxUWJCfl5uTnZWZkZ6WmpKclJgQHxcbEx0VGREeFhoSHBQY4O/n6+Pt5enh7ubq4uzk6AAHo6aOmjpq6qipo6aOmkozUw/Bwf59e/fs3rVzx/ZtW7ds3rRxw/p1a9esXrVyxfJlS5csXrRwwfx5c+fMnjVzxvRpU6dMnjRxQn9fb093V2dHe1trS3NTYwMcjJo6auqoqaOmjpo6airNTKUFAACK78vDr8GZlgAAAABJRU5ErkJggg==");
tail j=7096 line= btn_w_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwV3fKTTAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8BwmB8O+Hh5uLk4OdjZWFmYmRgZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTS1tHV09fQNDI2MTUzNzC0sraxtbO3sD8DBqKmjpo6aOmrqqKmjptLMVAc4cHRydnF1c/fw9PL28fXzDwgMCg4JDQuPiIyKjomNi09ITEpOSU1Lz8jMys7JzcsvKCwqLiktK6+orKquqa2rPwgHo6aOmjpq6qipo6aOmkozUxvgoLGpuaW1rb2js6u7p7evf8LESZOnTJ02fcbMWbPnzJ03f8HCRYuXLF22fMXKVavXrF23fsPGTZu3bN22fcfOXbv37N23/xAcjJo6auqoqaOmjpo6airNTKUFAACeeMvDg3itZwAAAABJRU5ErkJggg==");
tail j=7097 line= dragon_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV0AAAH+CAMAAAAI3i3FAAAAB3RJTUUH4wIIEhsKtTHtmQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFsCIdvScaqS0xtiwvyQ4SxCUgwDEbwjAu1QkO0hQR0B4S0hwezi0U1i0U0ioh0ist3gAI3ggI5wAI4wER3gwM5BUI4goU4xIX4SIL5ykI3ikQ5C4N3hwY4i0U5CQZ4Sco8wAE9wAI7wgI7xAI9wgI9xAI/wAA/wAI/wgI/xAI7wAQ7wgQ7wAY7wgY7xAQ7xAc7xgI9xgI/xgI7yEI7ykI9yUI7zUI9zkI7xwQ/yEI/y0I/zkI7xwY8SsQ7yMi6zEku0MezkUY2j8W2U8VxWEd0WQa3l4U2GwZ6jwQ60YQ6VIK7EoV61oI61QU614Q52wU9z0M+UQK904M/0oI/1II91IQ91oI/1oI814Q92MI92MQ/2MI72sI82cQ8XEQ/28InUY3mE5OsUktsUlCmGJJk2dXsGY0rGlKxUgsx0tA40oo3k0/yWQ7xnVE5Ggy330+jWtommpklntnkntzjH5+l358kIiKlJCStGlitH1rrYx6q5CP1Gdh035u0ZFr046KnJyUpZyUnJycoJygpaWcnKWlpZylpaWlrZ6OuZ2KraCcu6SUrZylramlt56evamcpaWtpa2traWttaWltampra2tra21rbW1uampva2lubWpu6+xtbW1tbW9tb29vbe3yqCE0KSG2qN52aSGxqSYz6GW26SP3LCUzKWj1qKi2qae46efyrKn0bao4bOi376jxq21xrW1vb29vcHGzre11rm1yMC9zsa53rKv27215bax67u42sex2sq96cay6867xr3GxsbGxsbOxs7OzsbGzsbOzs7Gzs7O1sbG1srK3sbGzs7W09DT1tbO1tbW1tbe3sbO3tDI4s7K6c7I4tbS597O4djY597W887I79bO99bO79bW797G897O797W99bW1t7e3t7e3t7n4uLi5+Li797e7+fW7+fe5+fn7+fn7+/n5+fv5+/v7+fv7+/v7+/37/f3997W997e997n9+fW9+fe9+fn9+/n9+/v9/fv9/f39/f/9/////f3///3/////ZWRgQAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAINoSURBVHja7Jz/a9v2uscTyUJ2BbGPFOxfzOz8qq3rP1Daf8U6wgzhXywU23Isozbh3NyO02yjS7fRrP0lGXG7Xu7SpqTJLzdbIKkJGScJaYOhLCSm9j0Hc+BC8dW9Yff5SP4i+Vv8ra7p3QMdi2M70kuP3s+Xz6PPyO9/2Luzkfd9AB+0/UH3XdofdN+lDR1dLf8yq73vg+iXDRtd7Wzn1mL2fR9Fv2zY6BbTS7Kc/lCcd9joZlMyr6zmPhC8w0Y3owpOYXG78L6Poz82ZHS1A8Vpd8bnTz4M5x0uulr+UYihKe7GbuF/3vex9MOGi24+nfSxE24uuvX3D8J5h4tuNqVcmZhgApFnH0ZcGy66ENM+Abq8dO/DEN7hovsq6WSBLiZ+u9dl1qAV85nMq1fHmXzx/H2fzdDRVSiD7p0uczItn15Wk4qSVNcOi+/7bIaUbkD868/N6Z5rxUZ+ibz2+GBNVQSn0ynISzv59302w0Z3Q7DrdMMt6J4XzvYb+WV+/zF4bch35ROWZUj+1tYfdK2mbYSY1nTPi9mDjUdqKmPxXng1c7COvJZCn5+gHbiceHBSKBTz+SxYpmLwQz6fLxQHFDOHia6WXwu5/Iiu9NfGuntezKSQf4ZSRybvPS8cptSS18LHJxgCEyOx25t7hy9W11KppSUVWTIJ/1lKpZ6u7vztZWEweIeJbvFQ9dETOt3bjeiCi6ZTitPDME51q5wQw4vHGz+A27qR1yLHZYhAcDIaTcwtL6EAByZUDP0EmFPps4HgHSa6b5YVD+LDcI3pFg9TyZAPVJXiEw/2jGoOeTP47TVw2xJcO86FAW4kLgtO37UrYJcvfwLGwr/L6Mdr13whdXUgqjxEdLWDJKoldN/9ereO7vnbA3BcXZdJOXF3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");
tail j=7098 line= koeye_handhither_gif = url("data:/img/png;base64,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
tail j=7099 line=");
tail j=7100 line= koeye_handhi_gif = url("data:/img/png;base64,R0lGODlhUAA8AIcAAQAAAAAAABgQCCkhEDEhGDEpGDkpGEIxGEIxIUoxIUI5KUI5MUo5IVI5IVI5KVJCKVpCKWNCKWNKMWNKOWtKMVpSSmtSMXNSMXNSOWNaSnNaOWtaUnNaQntaOYRaOXtjSoRjOYRjQoxjQnNrY4xrQoxrSpRrQpRrSoRzWoxzUoRza4xzWpRzSoxzY5RzUpxzSqVzSpx7WqV7SqV7Wq17UoyEe5yEY62EUrWEUrWEWq2MY6WMe7WMY72MUpyUhL2MWsaMWq2Ue8aUWqWclM6UWrWce86UY7WchL2cc72chM6cY9acY7WljL2lhMaljN6la+ela86tjN6tc+eta8a1nOete9a1lOe1e+e1jNa9pe+9jN7Gte/OrTEhEFJCMWNKKWtSQoxjOYRrSntzY5xrQpxzQpR7Y6V7Uq2EY5SMhKWcjL2llMalhM6lc96lY72tlN6lc8atlN6thO+ta861nO+tc961hO+1e9a9nN69lN69pefGpefGrQAAAEIpGGNSOWtaQnNjUntza617SqWEWpyMe72MY72Ua8aUY8aca8ace9alc8atjNathN6te+e9nO/GnFpKOWtjUoRjSrWMWr2Uc86ca86le9a1jNa1nOe9lN7GpefGnIxrUpSEc6WEa72EUrWUc7WllN6cY961lOe9jGNSSqWUhGtSOa2EWr2UY62cjHtrYwAAABAQCEpCMXtjQntrWoRrWoR7a4x7a5x7UpyEa5yEc6WMa6WUjOfOrQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+/0FuaW1hdGlvbiBjcmVhdGVkIGJ5IFByb01vdGlvbi4NCg0KUHJvTW90aW9uDQooNDE0KSA2OTctMTk3OQ0KdGltQHdlYnByb21vdGlvbi5jb20NCmh0dHA6Ly93d3cud2VicHJvbW90aW9uLmNvbQ0KDQoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQpQcm9Nb3Rpb24gLSAiVGhlIFdlYidzIEFuaW1hdGlvbiBhbmQgQ3JlYXRpdml0eSBTb3VyY2UiDQpUaGlzIGFuaW1hdGlvboYgcmVxdWlyZXMgYSBMaW5rIHRvIFByb01vdGlvbg0KSnVzdCBjb3B5IHRoaXMgbGluayB0byB5b3VyIHBhZ2U6DQo8YSBocmVmPSJodHRwOi8vd3d3LndlYnByb21vdGlvbi5jb20iPlByb01vdGlvbiAzRCBXZWIgQW5pbWF0aW9uPC9hPgAh/wtORVRTQ0FQRTIuMAMB6AMAIfkECQMAAQAsAAAAAFAAPAAHCPwAAwgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48MsciIMAKkSSsvMCD8QeIBAZMfueAgYeHAQRkiGgwoCZNjlhMdJBxYYBBGCAgDXvbkKAIDBAQDahRsIkKCgQFLOQax8JQAVoJUhRLgmTVjBwgJCIwtSIICVKVlMe7gesBrwSRHDcCN23DLTA4GNUhQoFYBQScpH+zk67CHUQh7BWJw65VsABkh3H5lvDAG0AcFNgt0IRjBVYKYKSRYzHkhCQxpDVgOEKJDA7WbedBkcLq1wiBOk4oOYCKEBARqeToxgeHBgeG+DdL1SnQglddQe18O0Xxt9IT7FFxerUCQRAcGuHnieCGCggHD3xEOocBbrVSBQc7WVSsQh4zXocWX0A7HXbXXa08FGMANMLSlHURSLMHSBCYFlcBVmx2BYF0lOSFDCRQUYIBEUEAhhAe8weTUfvAFYB5kdgWQwwsaIDfbQlNAYYQGDBRQHUgEoucVeQEEocEDBpZkxHoYPPdQiUKE0IBeGjnBBEJcIaedfnphJeENIiDnkBZTLPECBAUQ0KJFT+Ag5Y0BSOCcWkodcZQCCWCggxD+hcDAAEQuBMUTN1hgWmQV5SCDB5AFOhCIEIDGGg1NdUACDjnA8EIHb92X0BVP/BCCA1f9eNERIgQFlaP7AnUQlAG9GYETCSbcgAMLIhhKp0JcQLGEDMclxVEHXF1IAKsBOKXWVVbISsKzLMBwAqMYAppQFaEeJSJ0F1kQwQOmDbBmAEwcR4ABDwBxwwkiiGCCCCcYd+gBEkCwAUI6vmCudxxxAAEEDawWWQuRQtABDUbVprAFAjvQwQkkSJCBQaD+oEFs427EgQQch2tZCiKEIMIL5nWAAQYWSDDlARjIQAMNL6pA0BUmisCbsCZ9gPJTsE48EMIkhMAdxwAzcAACHeTwww0yaJqqDVEs8YSvZz7HL0goS8AAAghAQKFAQsgQLwgRNHCAAVw/0MEPP/gnww050CDDD0b7SL3EDRgciuhH9T7wAMcqS4DEEg2eXN8AXR+8NAwuY2rrDT9IiFlXrC01QQMSoEyBBSfgIGpQENQ1gAEQePA2DS+UcALjNOTgXw4zGtfAW3z5EAEFGGjQwQv/hXe2VwQ8MPILmgotQgkvwI66DC+EkKVeGS/FgQUYhEAyBlMCTwACGLAAMQkeYNCB9TgI8UMMLzT/fIycrRCCCeZFkCZuCFAQAgkhE2vp3EIs+QIL3OFZUkzFGBvQ4AQU2E9SECABDXigNpPBwKWAYAQjCGEG7DlLfbziqdbMgFPao5f4QhA+6pngB/1TghEyRQIQhOctaRKQBeZXAAZaYHz7QnPVC35ABAsKIQczKA5XNkgAAvrGAUeDAPV0RysSkgByPeSTDIqDATkhJz0CEggEKKCBk40PfrUhAQ3Y1jbmmadY+4lhFiWDshuKIGgjZIEMcOAfkg0tQcDjVnQIFAELeAAErsodCEYmg6axi1gAQ0Bd0gSn73RxfK7qwAVOFoIT8I5kxIoABBQwvwetkTZCgyDKRkiCE7Crig9IwBWTsjcBFaE4gKSeLDvwwNpYYHZnEw77PimQF5jAA120gAUosLncoSwCh6MTzngpkCQEjVjDBJwEiAmBHtEJNwQoADPLA0EKSPNf1USOLke3y226SphEi5QDEiC6cxVZ4J3Aa+QaOUDMeiVSkXSqIdcUiCxmooBoqgyNWmqYAAao0kDl3KZAuHYVvRTgaAzwW0CxqdCDbO0AB0iAAvz2L4m+pTIVLQgTqggBjnkTnA+YHQEEADyOBAQAIfkECQMAAAAsDQAEADgAOAAHCPwAAQgcSLAggB4hJBgcSGehw4cQHcqR0UECgYVwWDCIyLFjwSgnMDC4WHAPjjAIRnhcGZEOCQsjVRLEQ6ODAZIscxokQWEkToFWaGi4qdNjmzIY0hQM+aDLTwBRZGAgWpQjjRMWDBRsUrEAAZkCo7zIOqAqxxcnvhhYQDBJCAo3f4rFgOCpWYNlTjR9eqLDAwJlB9LUgGBAjbsP3UIg8JXgi7cFCoAFgCPE38mIC4b44vUnGxYd6v7EkVZyZoch6AIuKCPEYpx6boRRy/a0wTcemg6oQJAGCc6NAeipLIGq7YJhsjoleIOEBKck99zYbPz4wCR+GYOlsTkyST77lS0Utr6TQmGcbE4UZ3w4z48Tue0WbbjwiAafMum88OtVpfsXJPyVGREyWDDGQhV14dVAV6lFAG9W/PCYA/LlhMNYwREUQlaAyXTVemzp0cNj4yH22FR2HSESdAI1MRsBC+7xA0V1ZXbEhnUFNlATHoi3GgBOONcZAHYYwV1hhyHmAQV7YUZCRXV52AEDy9mhxA1pZWjWGhZIIFpBRzyZo0BClGHBAw9Y4MYPN7yAgWksWSGEEDe4MJAZX3jJmGYYHLAnAEtwh4EHJ/xAA1pfaMmRFG4sIUSBCAyEgQRfjDmQfaIVYIcQj4UQQhk35DXljx1NMcUTRpDggHH7a2iggQRe1SZQB5Ui8IWE8IUQBglobRgXZg6Z+gQOU940mQsd9MQYbwIlQYIGFnTgmwcddODpCW/9BZiOD01RxxM/jPqgQRiceVMBSVJGRggd9IWBBhhU+xaVjC0IkbfDWrbsQmpIIMEDDDBggExGTGetBRR8gXDC9CLAAKVePHTHqT8kZEAXshq0wxcUUCABAwg8gAOnqXUAAQMAozwSAhqQcAIJlgFL5KlCnGDechDtAG/CX4TwArEVfUGvAQ4z8AULOOAgA7bFGcTFHE/U3JNT6T5kxrvxktHXvwAzRoABDnwh7Q84HPpyGBiAQVAbpxpRhpdOybxQCbr7elrRxQRAR4AE1tKQ9AuAyyDDGSSAUMbIStCcVlxVc3QCDaAVpzdjDIRAxgs0HOpyGYPLAPgZOCgh+g8iWJR34xzFQZqDXsP4QLssnAB4GLrKfgYNbbLwAxA4wECddkW5GVe9BkgwqKeeeqCBByGw8DObJ5RxxgslVCQwARmz9EaiMDIW8hfxdoDBBe+GwYLfPxgx4wkvi/+FAwjYW5UY8RP9AATgu3oBwhqQccMP6VOCEXDggvZJwAECoxpi/PWFBiosfBawgAde8IM5GUGAPzjDCdD2seEx6y5B6IAGPGY8dmGAAh14QQ8uaIQ54QBLz+rJ8Cqkk9T4CwP7IFAewkIgg/TNiWwaZFeeRAO806AtWuKDF8dAcIL/AdBs7GISvbyigOMc4WXsgpcF8mQt0JXtBSwIQ7I62DrylKFX4uuYBTDAq8zJYF0bel9dOlNF60iIBdSKIMcwEALZee5JCANYXArALdtEgQZliCIFurTGMJwgdj3y16qGJzfEHCoM0EIYpaJVNwy8D2T1IkAdyQMANISxA5qklPE04L4HIGB4A6DhaWAmPlUyMGH/Gl5nCkmeNYjvhJK8379eqbdY7oaUBbEBKvOEJgSCrJitq+RxrnZAkBngmnmDkQG8MoD+INMgYBDYTaBzTQSYM36AUdQ3ASBDohEqjQEIBNgrGWOYdS6lIv6SpAQgcDJ0xhJ132xCak7YpTw54GMIgE4BdBIQACH5BAkDAH0ALBUAAwA2ADkABwj8APsIHEiwYEEcHf4YXMiwoUOHi15gQPCwosWLQERYMDDioseHewgVMohQgoEFBrEMUvjxYg4TEgQVvNEBQgECBn+YYNCxZcVBJCIUmFnzZsFGOEJw9PkQDw0SDgr0FEgjhM0uBYncsECgBtOHg0QY6DK1z9MIBLAS/PFCQtevDl+EQEAA5UAcJCQYHZhFpwOccBvKZUAAsMCXGPYKRBqCcOCGhEQ8IDBgrYwOBgz3WYQw82OGTkh8oUwQyJm5BKYuQYig8ueFJijcnPrjBuqpSmB0QGAX7hqGEg0MoH2ZbgWBe4C80HAS7qOkLAsWV/wDBvO6Ah293Hj8ayIZ+yESdCc4qHHhgS/1Yu/jBq/Q8T6dvNitWWD5v4Z7vLBQoIDdJbZBQAB8LTVBQgcODFeQISQIqGAfP8iAgR/+9QHJEuDp5RVcJmBgk2sDKZLXbAL9MIgGCBRwnCNGhIXWY0fUNFZZjHQoHGBsbdTFcUtEGMJkn3VAAWGaMSLXA3vhYAJab7mRw2WePaaRSQNsKJAMsRXgGltuAfZEDhJVCGMIGEymGVBCDdWHEjLwhxMWbujkFoFfmdCBm1OdAVUXaj2B0AMGBPKEVidwZWVgR4RggR/nCeSEZIVl4Ihyd1rQARA4nGECV68JpChhD/YxHwMGSMCWCB2kSsIN+yccWV9gYlgAAV2GgYmBpXJ1gEEHIZAAAwkiTPRqYBhgIEGKdvkZLK/FapCqCHZq4GBZjwURQgfHEuDFIUvoaSkFElhgAQYahBACBRBkltpHViByAyG/GRQCCGUyYEEISWFbpgMQRCCBBMamSNmAFz2yxBJK/PAUIAatIQK9FogQgrQSQHCsAQYwwK8DB/RnQAFRPuTGFE/0iIMGf8H2ggnXXuCAAQggQGF/CGgccwSp3srAoQY9MkUdU6xmlboLNWHiuYAS0F8BfBLArwQamHADDb96OKxAWPw8hRE3YECYmAs9aUECNxXWRWEEQKCBCC8MgsMNWF6rF0Mj+5OcIwP9UVtQeYwOjDYCEkD7ggw40PDCCSaY8PDcBdW9xHZRqeVQExr0h3Z/DEjQAQkmvPACDSZw3vnK2H7QRBOM5ODGE08gcpkEhEn+EGZlF4CAAxJckKq5oZvLtucvAOvrDz8sEfR2C/TtkUYOMOA8AxaLW+yuIIQAbedn3PBrCDcQ/4NyKFO4rkdNkCmBAw484C+4/95rAgwy3IBDDj+Aab0MMsAg17H9yX4RHvORwAOiZwEJ+Ctqg/Ae8ZTgLsUB61oWiEDs6HQRO1GAAuPCAAUGiAETJHAJRDCCEozwAxwED4L/al5mKHgRGLBMV+KKwABB8IIcEAER+0QgXg4y9cLzMQABmVFRYAYhg1wVEAJI7MAJcKDAG5zhhMZygMAKw0KP5OAGL0CVuJAItSXWDweDWJkWBaguKn4mETiQwYEiWDHNmeAMYCwiCSAYASneZAAE+4wVcACDMf5LcyRo2xPneCfYUQiP69GjCUWggQsaEGoiOIEcySQrOzKtUZ0qIgrbeC/RKepfsyobJjtFCJbdKoLRw4C5OnABJKpQaYXh2WsIGcE/IDECGYzgD2mFtk4Z5IVH5Jf6KibFj5UNj75cCAQhgD6NNW+KZysMiJJJkA5EAALOg1nMjHnJgfWGmgNpgteUtjSQGcAPH0PkW8BJkCicLABbEGjA856XACBKk50FiQIMyHQrcCGRmT+849WS2Yh9pgqGoHxlYb7JlIAAACH5BAkDAAAALBwABAAzADgABwj8AAEIHEiwoEFHMiSMMciwocOHDI2QkFAAosWLAPbg6BCpYKONDwhgHNnwkAwMCAq2OZmgIsmXA3HcoFBgBEEgLCggGGBwDwwfMB/ikAGhQAWCP05QMCCS4B4jLFIGbYjjRMujAymdoNh04BJKHVxONSjjBAOjBHGQ+EJgAcFHRGCwHcvwDIkEXWwK3KQWAgGsApf8IIHALd2CN0QkIKAXQJuqDwrUIGjkBgYDgA8LpEGY8UAjkAlMFihHyAm2o0c+whFCEsMbIRD8HaikagPJA5/8CLEYpiUZHfykjhmCQRcFn9XKHshlyY0OBgyTPMQCeteBN0AsNpxHyBno+2IdCWGBAffLSic0MDV4hncBw22S0uz6BIcJv0GdkEB5HcCmMyAggBYAtYlwVhcCObIEcAz0N5IIFjTo2kB50BBbF1gRQYkIsjU1RVKXSffSCRY0MNtAl8gQYAHIASAEDhy2BQAk9YXwxYAwlaHBjdddYiFebm0ixHOyHQXFEgAWNVYTIFDQ20BRnHFCUW418oNc6wHwxHggOIDgVE6c0EFIEwKAyQ2nodUIEGYRIBIWgr2gnogwsWAjAWJF2SVuUAzW4FFTgDalgy+V0YEEBvAkECYAGpAXAFCY1uAInEwhhAwXHhaDBoh6BkAW3zFVgYI5hACBAQY8sUQO+yeUl9lUHWDQoKIaTWlAAleS0AEFX1iAw1BbmUeXCCHwZxMnSO5IAQsiaIDBsyHIwAILIEDw5WFMgsCjCgoCKEEHsVqAgQUdiPCCCCJ0sJxmALwAAgYJGMAADFV1AEEHX0hAgbgdkJCuvQS0qFkT7krwBbjOUiCBBA088MW+GISA76kyskvFGTBIzCkCCTwAwQJ+IODxwxZAgABTFbMLhFYYQNBSAbcW0AXMD9TMAMpu0knXi2MK2IWbQHchsgMJIMAABA+gSqhDVLBBRUM5lNES0FQXkAAFFGBQ7rQiYHAjRnkYIcQPUk5i0EYFyAz0AAQYAAEIIpxQxhk4+9AAAwk7GtBYQ0uouoQRP1RlgRcFORFW1QY8QC4JctMArL8aWJDA3gVhAgUUUzwBGoTx9udEtX4YkLbREpAbAuPSngDCCf7uKlVBjzwxxRRw6EbezQWIVlAW1X2BwO8dP4yBBiCsLkLxJ8gt5gOED7TJEpmrKgQNIkjgR9plEqTHGSJQ8ADHHkNgsARahwB38mWwwDq4IZRBb99LLOEdhKfiaBAmmFIAwf4QfFFz/xggAQxgIIMXyIAGZ7hBxjAgghvk4AfxIxv94iUshmSBBicolsIk4LIESAAEL8DBD0ZICUr84EXV6QALzkC3HFCLYSezX0P4UpZ3GewB+x3TwAlEKAQhAOGEgJMBseAGN4lJgII1wYgegHCDMoTAAvrD4b1e8MCxjTBwUpJYB6BoAQ4KSIYQyUPgnIgB/TnAYx2g1w9++KszqE9jSKtZ0WQGEzHiwF0W+AL/JBACFvyqbjB4wQmOpwH9UXBm7wnKHiTYpIXtjwIgxMEZaKC+48VKjwIKGuVGkglg7cpg4tNACE4AAxqUQXUahEADTkaAn+luLG5MVxc5CAFInoAFp5RYGSHAgEwCTTMwYFYhaamvciUvVrzipc/cpKjDVMJOW6RlLYkHrpbpMWm5Yya7BMKsXenRC+LLGhR5yYA5ulJnwwIBpx5wxobtXe8BvVRaK920ycPIwHtEQ4AfEpAABoQum2urp2Zy0L2ToepkBk0b23K2TYP8gFoY4OD3vvc7VhKAbQ0tiCa0Aq4OcMp/SGtA59j2qoY+xgQdAIHEsEbL7ymtmZoJCAAh+QQJAwAAACwfAAQAMQA4AAcI/AABCBxIsKBBAFY+HVzIsKFDAJxwdEDwsKJDSyHAGFTywoIBiyANYroRgsEIgnuAhIhQIKRLgYlwhEBAgGAjHBoc1HwZEgiOCwZ2Cmwj4wLNg014LsTx4guBBQSBvAAqVCAXJSYoKi3I9MFTgj9YWCgAlaASUB1abiWIw4TOCgOtUDoRgQDcgaWMyIgwYC3BGycYEKgxsA0oEg/UDlzyY+ZdizTELLwhQjBhgUpwBK4qRQmMsSH1YvBicBONmQMuA8gsAoFiAKN+iNAZkqmFwQVJ3ZiIGwAWIySPCuQ06oYGA2Ut3iAx9qRNGRNTC1wi5MyFAkKfGHlR1yUNEfsUCvQlaInGdaFKfpyA8BXiEsqCvYeQELTgdgzYrerlfRfKdg0IPGYRIx1EgMB4AwnREQE72SHEZ0ERBskTbTmlmkVshGDBgQWpd9tOSmwnAYMCQaEEdPG9JMIFDgzgnEBt3TaeEkCw4FVNkEDxA3MIJBfSCx1IQBZBlEyVHwBCyJTAV1A8QdmIL4YkgwgeIQgAJTAACJUVenmEm3YyhOCVUmeIgAGHAm2imVNwSWEEC+zVdAVjMBjlY0iEaHigc5ssR9NJ/pHxwABwTZEZnFa6lEQHGw6wkxWn/TmnECSwF8gVbgABXY9riVCgAeNZ8YNbBhjwAw0sdAABA/sIGCEEDSfcFuVLZHgq2ElXnGjBA1/IQAKjFlhwAQ40vBACe341YcJK2Hmi3RkFdtDBBRZgcAEGIrxAQqoprnUCCRiwygAMNJigAQRBSiBBtRqQIEIIIXwRoF8AyPAClRFc0MEXGKgrgQMRRCCBvp5Se+CFSl2CwxkhYGABBAgw4ADEBjjgLwYaQswgwjw1AlwIFDhAEwERF2AyAw9A8AXE2JFILyZSyXugowTQXIDEDrA6QMuJKoUJDvgxKPTQAEcAAQQRWAtBffQCcMaNQzNowBcdwGvCC2e8YMK+CMzaUBShhCKKQTA4EJSjA5T6wAUhmMACDGfQYO+vEvt0y5AVSighBCg4sNBJQTJowCoBJz9QbQgimCCD3CaI4KkFtDFkBxRQLKEdJeUaxRZzDBiAQMQQDKwBCNmaQALiJJy+IcfuUT7FEnrFy8CRMJ5wwQPiOvCAwANXDa8IJJBxwtZffERQHm480eQSmZlgwezYRXmDuRE4MDEE1h9tQQckmOD91S9oyyj3J5RhhOXMC3FDqg+M7DVTj38RAe4IPICtDDjgcAMNN/R/AwwNC4EMboADJcAOCDQgwQX+taeD7OEHNzBWv74gMgZYQAQy+AEQfsBBDvokVRcgAdxu8IO2gICBNBFQQRrhE2MtcFUSwwALcPADIWywg/tFEoPvEPcuFn0uKCo0SCOSBMAX5gwCGHgBDTmYP2KVKQQd6FewJLCqlnntICxcH8hWZj2qKTF/+8saC97lMOxJjAHQu+JCGvGDM2zNAlTUXgheQEAawOAFJ3gXo0KGAAOYzI93ekgU/vc4gYUOY1grFgtOByzsjUxoamwII1DVMDhK4AEDa9sdGwdFOOasj0PbigyWRS2j7Q5j2yIltVBYMwYFMiRZa5i/Qrc9xIVglY5sZc2C6BIysOCWVNQdBIRlrYdhr31BYVABIgmSUHRyftabmLqMxqofKrMqa0mECMworjN+TjzYQRsBmOkSBR3rc+j8YQH8SLNxNjEtKgDUgAUigMZqWpNBhHrnQB5RI3hFcZ5Hy9nghKbPgSyiRh7wp8OMZkaaOIqcIQkIACH5BAkDAAAALBwABAAzADgABwj8AAEIHEiwoEEsMiSMMciwocOHDI2QkFAAosWLAPbc6BCpYCMcHR4QwEiy4aEzFxAUbCPjQoKRJWMOxEHDgoERBIG8oIBggME9L07JfNhDBgQCFQj+OCHBAMyBe4ywUDm0IY4TDAokHZiDRdOnApf06FCxKsMzJl5uFZiDxBcCCwg+MmK0rNmCNEgwIIBT4CYcJI6uBbDkh4gEce8WvHGY78CPJo7WIGjkhgYDgxUDuBFib18ARpaKnCwQk07JMTnhCBGI4eoEA9Ya6dqAAGkAT3p0BovRkowOBm4P5JyggIKBRlYrsD3wyUYDx2MeOgGcN4DXxgVqAnKmw4Gn+1V0WiggHGMlE5etnwlRPPqiH14JPH2CQ8TboU5IpOS9aVAIBFoJZIRuDRQAUxVL/OaAdRjp5xlBmqyHQBdbDRjCcjA9AZ9NiclkggUiDXbJGR4AGN0SrxFwHCT0hUBRZiS9gAEEBvg00IjsFRDXHkDQ4F2ATyxBIgR2ydRECPsRFAVaX3QRVx4/vEARc08IIYMHC5rlhAkhOVYaDiZ8EWAjPbBQ20ilFPbCZdFVdYKL8g0UBQ0iLDiZI0CQoBYAU6B4wlGKvdBBUzYCgEl3BRSA0xRAiCDSCCwCIcN/DJYUgwZf9ZWFjwYUYAqCbdFoQJA4sHBBgIp5YMFe+zZuksOfBiDwgwwkYCqBBTjgcAZTzClmApIIOMZJghh8QcELIXRwwbIhnFEGsoBq1gQJgzqlgiNL3OCBBB0oa4EFGHQgwgsekIDBd5oJZIIIFyhgAAMvXIVpBxBQQAG4HZBALb1xptvEul9IoIEHGlhAQcAPPCDBvRckKwGNcKULQCY0TKqsBAkk8AAEDsS68cIzIuBUxBID0dYFGCcaawEDFGCAAwlnJZ98HWomxA8hdTqzgfIl0MADCSDAAAQPHGBgSZk0QYVVJxQ388wtM7DwBeK+8IIIFjSFUR5GAPEDDSxMYhBIIz9NgAHcimDCCzTcIMML1Db1WUNL+zwRZGhgWuBFQU6kR8AABLj8AAUdmLA2DThY/SsGFiAwd0FYTDGF3ZVhLTJvToTwAIAuH+DArR2EQMIJb69Lwrod2MSQJna3HuUFDOhcnh5lDBo0AghsTAHV4q4bQggmlMECdRDsPVAmrdstxHoSAOhlQXrIIAIFDCTAwMcSZE/178CbcMILJlCrQQjP4lB3kNyx+4VTMA6EyaQWEA3Bww/8LAEGa7/w9hk3tI0s/jfIARCWMKC8XAACCXBKeQqyKRN4AAMUyB4CpeaBeAGhBz/I4A9MJqgO6K9tOfiNBBggMsxYRA+6+hXKvgC0B2jgBDcAghCEAAQZei0G+yTwwO9E8LtBicxAj3PIJn6QuBAYjGgJgIAHBUjDH+TAiWhJVuruJYHNJap9DskDEIp4AQpwTGEdkMETnYiDG5wBfMnKGgMc0ICgFaALC4SIFYBwgzKo6mFE+4IHcZADmrztBDksGAIN0KlEOWAoQ6TBrywQMAgYKwQv4N/bWMBDDaAMApcL3ACCiJEsJI5aEXzYwsgngzP+imBetOLT4kgSGlytA6FUmAU88D00dkADXnSjfACnmRewII14XJi4TqesCEKAhCzjWboqgSxYSnB+4/NA6vCIzJb9TWIAuBouISC/hX0rldbrVBfk06Z0/Q4DD3OAOh/wBaI9UoCQiXoaJ+8iAwrUD3e4yxghn8ay52HzOhNJICFLCE+eBa6c/4xSB9CJRAcg4HY1+lulNJOHHvyqWxCUX8ISqEksamYROeCSFA2WvY3qbKIyCQgAIfkECQMAAAAsFQADADYAOQAHCPwAAQgcSLBgQRwdJhhcyLChQ4eLXmhA8LCixYtARFgwMOKix4d7UhUyiFCCgQUGschA9dHjDxISBBW80QECAQIGhZxg0LFlRRoiJOAkeMMDhAIDCjb6AYKjz4d4buwk0FPgjRAQDBgoSOTMxhpPH9IAcYAqwTMisiYlKOSFULBhG8rwgGAAyoE4SGwcKjDLDxEP1sZl+AIEg5sEcZxAZUAwgEY4QCRwPLggGsAEHP+A0QEBXwCLECLYWnmhExJfMrOVEcJz1SWpOlMuPfAEBaRVhZwBUfe1jM53464hfMGAWYFAznQ2UEHgHiAvMJyM+6gHCIUGaXRgMIBvj+j7xu86+mGbedxEuxk0LziXQeOB5C0gvfskcur1T528kG3wTIjApAHw3UbTAbCEf0fh55MTJ3TgwABVCaRKWpn1JAQMGNSFEiQHgmASXGGdcIFNlCkCk3E9/XCGdOY5YgRQXwQY1hEaxAghQYycIJ1qAODwwl7NLSGEDCIsMJtPHkjgnmOMFOYAYj2SIdQAYC3xw351lSYCBhDUBSIAMJwg31rQqSXQE1deQEBwcR0RwgUOvDcQDagZJ5ASMljgGQBYLJGDWwQoGBcJIZh0o0AykPDkWvU5WEAgTxBxwwsUEPBlmx7oKScAp5GYQRVtFWpBB0DgcIaYR4YFAir7CTRW1X4LGCDBlSJ0YOsJZ7xQGASpPiWGBV3yCECaoxbWAQYdgEACDCGIMFGvTx0rQQJrCrQEDluC4IEGGFyggQch7KdBnIfSFoQHHXyBQAFeHLLEVaNaIIEFFmCgAQggAGvccRdZccgNhAxnEAghcMmABSJEliQGDjgAwbwSYCDBaI0NIGhDj7ixhBFdiQCIQWuIAMIFFoQAgoMSQKCuVgk0/EBdWhmQZUVuQPGEkMrFuZCuJ4RwbJwIBN0YAQgwwEACCEhgKyoWJHBpQY9AUQcUsIEAQVlHOmGqCF88oNVN3RFQgMMWXIDrGTBsaVNDWEwxtRI3wNkYmwX7Ddm0cWEPLYEGIuCKAw4yvOCzSQzdMYXNbWXoqkNjeRY2UkR/0fcLNJj6wgknkCBCCF8UYBAUoPup16IVOaHBTWATcNKoJJDwAgyBi+A6z5x/cIQTjPxw+BOIsKYkUhd1YABSBRSAgANfXNCBB/hmri0JJ+j6ggh9y4ADEEto7KMF7tl5kUYQLJCA0Q/Ti8oFyCYr++sy3AADCSCc8QMQqrSlQayLe9TEm19A4DAE9JKAAC0AgtedgQY36MEPUiE4EdAgcCcIygH25RM8NMgCDpuXvARoNhr84INAEIIRVCGVvoXAZ/JKQAECFaIOyKteGKCAw8x2AyEQgWP7qjCCEHwkMhdKoGutYmFYZBDBYwXQYR2AQSpEKIT5LfByg3sA0oZnscHcgIgiuMAFUvYwDbzgek3EwRVfAD8MfMEBE7yJeQbTAxyUgQQuBJbKaPiDv+WqiGZ0gOMyczGfHAIH7/NhypR2AhkgEAaXOxmw0Ig6IVbGCqkgUgcoIEABdmBZZwgc/Fzov3V1xy60AUAUAOmsDQoQAyJ43fQ8gAF5oXFfKwwlogTnQkqW74SYC8ERPQk2WQqEECcAQSsF+DAKXABfHRiR/1oFy6eVhlCChED50CcvBgRthajzJUGoN0xp/i9letTKAIYGrdIo0n8NYEDDrCnORpZLszQdSFkDhCa0oaUOlNosiBMUp8bhxWxdjXSmLxlBhniuMwEJEN/RPAm8fBYkCmfYFsmI6U1rYvMzDn0MDECgAVsNs39SbCfdfBIQACH5BAkDAAAALA0ABAA4ADgABwj8AAEIHEiwIIAfIiQYHEhnocOHEB3KkdEBQoGFcFgwiMixY8EoJjQ4IGBwD44wCEZ4XMmRBAUGBFQSxEOjgwGSLHMuPGGBQZcuBa3Q0GAAqM6OSl5oSFPQBIYHBHAOjCIDw82jHXGIIFqwSYcIBbrIFBjlhQUERrFCfGEigoEFBOmEoICAQFoAZa1KVevwBQmodwGEBExQz5kOCAbU4PswiQjAYwG8SFggJkEcIR6IZfwwhITKd52w6KDA7mUSnyNzJhgGA9q9AGQ8Ni3QsAkJb1c7rEhgQAWCNFCHlann5OfAugWKsHDz7pnbUY0W93w1ecEkHaAOGCv7c2+B+yZJnB1g3WAYuj8HOnF5s8BiPD9OZEd+tOHCIxq0y6RD8cFwAHn8IINn5DFGhAwWjLFQRaANFBxuBPxmxQ+TwcQZDiFZVtByN20nEA233QSXSS+EkBhnflFQlEFHPBWdQE2IYJFpewiIGGxHHTEXTAUO1AQIEtRVoBMmUNCgHUbQYKJinIFAAWQbdhDkZgDUBBVJdihxxgsSaMjXGhZAIOR1JGhQl1FCmOXAAxY88QMOZhWgGkd6CCHEGS4MZIYEYtI2EAmudYHTE0pq0IEJP5whA2pUeiTFE0/cedZAGFgQ5HcD4XdmAXZQCAIIYbxAAwvy8bjSFFMsYcRf+2ENtEYHGngH10AgiImABAKaEMKuJrAVwgXNzbnQFHU8gUMHDNwUmQsdvBTVbwIdUaYFHdAgQgfYhiCCrk9GhSlExLqZnV3QElSpfwQYsJhAOJxw7WgaxJuts4IScBFEcxT7AwhXlkvQKnw+4ECyMikRnAZzURABBRRIIAFMBCDAgMOzLnQHqghBEFXFBqkRgQYUQPAAAhDQYESJhkLAwAMMMDBwxBqQYAIJmQlrh763QRzRDhpgEHIEIrxwrJQRQGyAxBOzgAMOMuiKm0FcTBEplzB1sS5EZhhqqAkmVKQyxF0U8EAEHZyBQ6JsmRCGBmAQ1IbURpxwqZcR+4kBqggkVFRXdFFBcCgNS78guAwynEECCEoLoYTUQpjQJwFXd2QCiHrXG90DIZzwgtlpb67o4D8ooYQRP5jwQHORd0RHu2IKGra9DxzKNQss7Lqt4DhsecIPb8oWwZnCcvSCXt6mKwEGIGgbhgggdADCtmajzYIML5QgJQOVcczSGxK8HjYCDxyPAawYXKAB9GeTLgOpIvz6MAKtqiUG/Ec/AIEE8sZKgQaT/yCEEaLDgQtMcC0JjOwmkGOMwxx2v/11wGcUAMEL/GcEAJLuOQVMVnT8hZUgwKph+2seyDowQcURQQi8OwMLtiIBByAwKroJQazwh61mUSBo+z+oIApz565m9cl1wdPJVi5Qww5YilpC4x0OaNC0EEhJTEWxl/b44pgwOBEDPpPA/kRgtiXK4ARODFOyvFceFrBFhAyzAAaCdgZFuQsElhpZ8abIGB684ATNswAIEdYrGPjlgXxKVmUK0KPkRGFUYWiWHrV4PtqZwEkB25uggsgXGpTIiBKwVCY7EAIrYiACLDuTXei4GjSwIJGLXGD+QImAF4atPBu6YsP4FIGFhcwBr6nXAAoJy1cZkQJfgIAw7fcyu0SnMhyEpQ1+OUyXMQB+xozKLukGS4GYwVIqQ0ArEViAblbGW5RMDhieCZqoGOBoEoPfAAgZzuTQKuWcrUSaAwbWSm+lrpoCkU/D7idMkWVTmkzCZ1dCgIF4pVKYuPwmjjgSEAAh+QQJAwAAACwFAAYAOAA2AAcI/AABCBxIsKBBgVhgfGF1sKHDhwetvMDQ8AeJBwQgatxIkAsOEhYQHJQRogGBERxTPqTzooMEAwsMwhCBMaPKmwZJYIBggECNgk1EfCkwAKfRgUEsQEBAwOZAKiJenjx6tAMEk1MJmghJoChVnDssPOjpVGATDxAKdPnqcAsOEw8MapDQoACBmAOdtHzQBSVbgz9IppX7hWlWgTKEMv1rMIaJDjULutBQ2C5Bklz9Mh5oAgNWzQJFaODbdCAPERYYdCm7OYhnu6xNhCjc1G8UFjt7bi6otOeAslR0GnYKI8QFjKB3i4VdQauGul394mCBmuhugkwkqG76U2AQq/tkbeKQsVX39YE76Nr1Gno0AssAcLzQudqolCUWIzmkvN3pERKQ9YSSEzKUYAF8Kj3xhBAh8PXQBZGQhRcAj6X1m0A5TMRUchBN8cQSHag24UE7fAEdAc0BEMRoq00lhHwXIMCeRlNMwWBdBQgUBRMNicXUhQJ1EIEBsAGA3w0hMMCaQ1rUscQLPBGgAABS0EAThwBIMJZvAh0xWwMMWKCDEDkkpmSKEClIQ0jwlekBX2gOZCBdAgpkpQYXmIDDDzCw0MGP3Tl0BRQ/NLjalAAcIYKQTMUZ5FxkCaQESSS8QAMN1F1A1owGcfGhDFyV1YFSDNjlKAAQEtWUFftCJEaCCSyQ18FQTaEoKKEhpFUaQRZE8AACBnQxIgCifGHAsQ+8eIIIzJJwQggSGFbAF19s0NATSrwQAQJdFMAhBxBA8CuCArUg7hcd0PBCCCF00G4HMXbRxQMdsEDCF6de8cQPGJRaAKIGcfCFBNvaBVoK7IbAwmPwYmCBlgUYoIEMNMhwglUqEDSoEDS1+NAHGFywFJEZEKSuCSSgZsEX4jKAAAIh5PDDDTK8MF8HNkShBBQfQkkWlgQ5TBcCDEAwwUBC0GCCByH4SiQCCdC7Jw4V35BDxT8oscSHN2Dw3q4QSSDuAxIo9cAXRSwhg07LNYUABOnODAPFOPvkcAMON/yAn2DcHgZRJA9EYMHgGOhZ6FxREtBFBB7QfYIJJ8xNQw7j5VAmtGORq5EPgmOAQQcvkOcjbAQ8IILNfSZcggyWqysDC8YtZRfAKXFgwQUhvCACBmPVSoABHcCK8rsK7xmYzSEoxa3mKbXgwQsVttiUARaEkLIH8F4gggw/CKFEhrDv9LWUVNlAwwnRSo8AukxrMHieOAghxBKturBoBKXWGqhRMfzpuwFf+By7HHaBF+RAfvTLgWNG1TsCMA8nxmpKAdaHAQ0krAOgOyD9jFCmE3hgJw9QS1OGdZQGGOBtt9NAB14VAg+QgAbyMwIHyROCuYyrVvtAw8kDLKCBkHVABCjD3gkmJ4QfVEx3o4IAA8jyQKp4bnDuEkG7LMgCGuDtZMYRG7B8d50Sla1d7bqACk8nAxnA4FmjikQD3iPCHB7Fh+/C0wXcFbkY3KxXSgxWrc4jkBBIEXshc5i7XmUCEVxAS0t04B75WATZtMsCDguZBpj2yF+Fpymc2s3CjHOBwT0MknjqVSJr9ZslbaYJsoHXBB4mgVZSgAKRGCUmMcnHgUgRXqwkWLgeYEJSztKUu8HgKh+2ywfI0oEFsAtR3PiXDwxObOJKALBgM8GXwWYApzoPCqC5RGp24WVgAlYpgXkeafrumwhoQAOMucWukCPzPJY8oQMeQE9xqdMAA1gPMzcjCpdEQAID+2cxmSKARR4kIAAh+QQJAwCtACwAAAgANQA0AAcI/ABbCRxIsCDBLKIMKlzIsGHDR4MsGHBIsWLFHiYkFKhgsaPHgU1ESDBQ4KPJgTnKSKihUISFBAMGnPyo5EyIkSwL1rLgwACBETM7hsQAAcGAnASJGogZtGMHC0ULyCxoi6cBA0CbVpQAIcHVqQRDEDWqteItCA4QECAAVuDQom3LLkSB1ufSgiQ6SICZVW4rOgpRcEXgkwDBGB4kMPAZVJcVNLFaPepxwsIrgx8sSFDgsy0JDIrvmqzyJOLEH2dcik4KWi3bgSw8aMCg1uSdKTj2lgxCIrHRuK08WHhQeGqTFyZCQBjQtyKkKUowJJAqsISGoksXFDzVAULhn/sCZbwgMRJ4wylLTHjfOPBD2s4KCmqQQPir2+TlmzeE9KQH7QETEQRGA4SxFZdmDzBAmHatnOCSaxZVocQJ3q1lUCwEGkDYUQOJ0gFonHFIwwtiMVCAfgs9gUMHGzJYkCcQKKgWcwPZoBdMFlrxw4j/UfSIEjLQByBHCq0yGAFLEdmKUp1xJEQOMsACk5ILSXjCSGshZdBZ2LHlogRpIcBACDjs+IJ0UlFpkBI9eNDTaw3ByBlJBTAoCgYWWKCBDEDgMN5/S0WykC5L0GCBUQa4yJAnDRDoFXutoGGCCCK8cMMNL6i2FAIQ/KGQHUqw8KZ5CskCAQS6dcGRHfs4sGDCCzDAYEJ3m3bAgkhatuLGDywOAGcrItDgQQOCKJTZSwMUUEAgi+BwggkknFCCSD4h0AENfj7liUDPPUFhYS6+8MKNlxkkC31INhCCETJMKkIIsjEwAAIi/JDDDYOc8UIZNDwBxRM/eLBYkgNJIIJeDSSAAIq5OCqBCc6GAEsH82EXwg993pCDED/8oMQSTwBRmQJGGUaQZhAkmEACkbBSUC4QYBDCCe16gGeMCkuAgxA4aAxExx0bAUQMN9pXEBgQNODAAw+sHMkYBb06ngnzeaUhBCb8gEasZ1xq7w04pDaWT4oOdMoDqErwhQMMMCDoQFFgGoJLA/sb4EAHZ+BQBgkkvErDDzjIQAMLehVI40KAWHDzqYrLkksruuQAQwjzdWYtrJl24EEILJR5Ri0kDreUhXFKwJUDEHRAcQcyGNFDXugC+LCrJMzWwQk3cKyvCa1dRbpDDTDggASqe0BCDj2M693olyf3FAYQC2HEDy+cIByBvjJWESuRoIpBByTQMHmFaxlgMAliaRasEEo8mel8bxrd0R8SWCBCGSEcOnoBD3QQArx58sANgCAEIfDgDLOCymKQ9LuO0EICJBhXA9ayFgbIjATv8p8MpPckGpwgBHp5D0l+9RFcvABLvkKABeZmAldVamMcwwEMeqOZDCmLAPtl84gZGFC+BFigAyIgAQyQQwIZ5KBjN4DBrZ4SIwQgoAA+UdNHZnEVBchsc5ij1AsERwPx9KZiJPMdeLTiQ9X5zwQnQN/cTvCC3R0MKu+hIAmDggLN/PB/IPSfCFggruSAxgFe8ZUgTVaWARHvf6rTgOrmhsH8dUmOc2zKB77ngUR+T5FmBA322MJJX0kxKGLwn+owgKcL5ClPg+nMWqRiIL8IBJEXMCUqNcOVQK4SQCMco18Ohqc8UcB0pyJQAcqnoQK10pUe6iUwT8UAr7BFQwpIAGc6iaKmnMJ02ESLwgqjoQS07VEUJFVTaHEqB2SIkwVw4gMcwLYNrShlAJ8sSySsRkENMSBlKWunK54pzrII4ioIUEADuMKVUy0PQFBkSUAAADs=
tail j=7101 line=");
tail j=7102 line=
tail j=7103 line= return(img);
tail j=7104 line= }
tail j=7105 line= </script id="script_load_b64btn" >
tail j=7106 line=
tail j=7107 line= <script id="script_pdflist_show">
tail j=7108 line= function script_pdflist_show() {
tail j=7109 line= var z = 0; var pdfout=""; var len=pdflist.length;
tail j=7110 line= var pdfid = ""; var pdfurl = "";
tail j=7111 line= img_pdfid="/imgs/links/tn/tn_dragons_koo.png";
tail j=7112 line= tn_pdfid="/imgs/links/tn/tn_dragons_oko.png";
tail j=7113 line= for( z=0; z< pdflist.length; z++ ) {
tail j=7114 line= pdfid = pdflist[z].split(" " )[10];
tail j=7115 line=// alert( 'BUGS_1000 script_pdflist_show z="+z+" pdfid="+pdfid+" pdflist="+pdflist[z] );
tail j=7116 line= pdfid_code = pdflist[z].replace('.json','' );
tail j=7117 line=// img_pdfid = pdflist[z].replace('.json','.jpg' );
tail j=7118 line=// tn_pdfid = pdflist[z].replace('.json','.png' );
tail j=7119 line=// pdfout += "<h1><b>pdflist_"+z+"</b><h1>";
tail j=7120 line= pdfurl = pdfid;
tail j=7121 line=
tail j=7122 line=// http://ka12/kb/pdf/pdf_20190126/kou_20190125_2400_Understand
tail j=7123 line=// pdfout += "<a href='./index_vu.html?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
tail j=7124 line=// pdfout += "<a href='?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
tail j=7125 line= pdfout += '<a href='+pdfurl+' class="popover" target=_blank>';
tail j=7126 line= pdfout += " <img name='img_" + pdfid + "' height=100 src='"+tn_pdfid+"' border=0 height=100 >\n";
tail j=7127 line= pdfout += " <span><img name='img_" + pdfid + "' height=100 src='"+img_pdfid+"' border=0 height=100 ></span>\n";
tail j=7128 line= pdfout += " </a>";
tail j=7129 line=// alert( "bugs_196 pdfid=" + pdfid + " tn_pdfid=" + tn_pdfid );
tail j=7130 line= }
tail j=7131 line=// document.write( "bugs_198 pdfout=" + pdfout );
tail j=7132 line=
tail j=7133 line=// alert( "BUGS432_show pdflist("+len+")="+pdflist[z] + " len="+pdflist.length );
tail j=7134 line=// document.getElementById('div_tllist').innerHTML += pdfout;
tail j=7135 line= var parent = document.getElementById('div_pdflist');
tail j=7136 line= parent.insertAdjacentHTML('beforeend', pdfout);
tail j=7137 line= }
tail j=7138 line= </script id="script_pdflist_show">
tail j=7139 line=
tail j=7140 line= <div id="div_pdflist">
tail j=7141 line= <h1>div_pdflist</h1>
tail j=7142 line= </div id="div_pdflist">
tail j=7143 line=
tail j=7144 line= <hr color=yellow>
tail j=7145 line=
tail j=7146 line=
tail j=7147 line=
tail j=7148 line=
tail j=7149 line=
tail j=7150 line= <a href=# class="popover" alt="script_bugs">
tail j=7151 line= <img height=150 src="/imgs/links/tn/tn_dragon_b2.png" onclick="script_bugs('5400')">
tail j=7152 line= <span><img height=150 src="/imgs/links/tn/tn_dragon_w1.png" onclick="script_bugs('5400')"></span>
tail j=7153 line= </a>
tail j=7154 line=
tail j=7155 line= <script id="script_kob" >
tail j=7156 line= function script_kob(kobid) {
tail j=7157 line= alert( "BUGS_kob_6500 script_kob="+kobid );
tail j=7158 line= }
tail j=7159 line= </script id="script_kob" >
tail j=7160 line=
tail j=7161 line= <script id="script_kow" >
tail j=7162 line= function script_kow(kowid) {
tail j=7163 line= alert( "BUGS_kow_6500 script_kow="+kowid );
tail j=7164 line= }
tail j=7165 line= </script id="script_kow" >
tail j=7166 line=
tail j=7167 line=
tail j=7168 line= <button onclick="script_ajax2php">ajax2php</button>
tail j=7169 line= <button onclick="script_sllist">sllist</button>
tail j=7170 line= <button onclick="script_pdflist">pdflist</button>
tail j=7171 line=
tail j=7172 line= <button id="btn_sllist" onclick="script_sllist()">-= slflist =-</button>
tail j=7173 line= <a href=# class="popover" alt="script_slist()">
tail j=7174 line= <img height=100 src="/imgs/links/tn/tn_dragons_oko.png" onclick="script_sllist();" >
tail j=7175 line= <span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_sllist();" ></span>
tail j=7176 line= </a>
tail j=7177 line=
tail j=7178 line=
tail j=7179 line= <button id="btn_pdflist" onclick="script_pdflist()">-= pdflist =-</button>
tail j=7180 line= <a href=# class="popover" alt="script_pdflist()">
tail j=7181 line= <img height=100 src="imgs/links/tn/tn_dragons_oko.png" onclick="script_pdflist();" >
tail j=7182 line= <span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_pdflist();" ></span>
tail j=7183 line= </a>
tail j=7184 line=
tail j=7185 line= <script id="script_pdflist">
tail j=7186 line= function script_pdflist() {
tail j=7187 line= script_pdflist_load();
tail j=7188 line= script_pdflist_show();
tail j=7189 line= }
tail j=7190 line= </script id="script_pdflist">
tail j=7191 line=
tail j=7192 line= <script id="script_sllist">
tail j=7193 line= function script_sllist() {
tail j=7194 line= script_sllist_load();
tail j=7195 line= script_sllist_show();
tail j=7196 line= }
tail j=7197 line= </script id="script_sllist">
tail j=7198 line=
tail j=7199 line=
tail j=7200 line= <a href="/?js=script_shutdown" class="popover" alt="script_shutdown">
tail j=7201 line= <img height=150 src="/imgs/links/tn/tn_dragon_w2.png" onclick="script_shutdown('5600')">
tail j=7202 line= <span><img height=150 src="/imgs/links/tn/tn_dragon_b1.png" onclick="script_shutdown('5600')"></span>
tail j=7203 line= </a>
tail j=7204 line=
tail j=7205 line=
tail j=7206 line= <br><br><br><br><br><br><br>
tail j=7207 line= <div id="txtName"><h1>txtName</h1>
tail j=7208 line= </div id="txtName">
tail j=7209 line=
tail j=7210 line=
tail j=7211 line= <script id="script_ajaxdb3">
tail j=7212 line=// exit function if nothing has been typed in the textbox
tail j=7213 line= function showName(str){
tail j=7214 line= if (str.length == 0){
tail j=7215 line= document.getElementById("txtName").innerHTML=""; //clear previous results
tail j=7216 line= return;
tail j=7217 line= }
tail j=7218 line=
tail j=7219 line=// code for IE7+, Firefox, Chrome, Opera, Safari
tail j=7220 line=// code for IE6, IE5
tail j=7221 line= if (window.XMLHttpRequest) {
tail j=7222 line= xmlhttp=new XMLHttpRequest();
tail j=7223 line= }
tail j=7224 line= else {
tail j=7225 line= xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
tail j=7226 line= }
tail j=7227 line= xmlhttp.onreadystatechange=function() {
tail j=7228 line= if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
tail j=7229 line= document.getElementById("txtName").innerHTML=xmlhttp.responseText;
tail j=7230 line= }
tail j=7231 line= }
tail j=7232 line=// xmlhttp.open("POST","idx.php?name="+str,true);
tail j=7233 line= xmlhttp.open("GET","ajaxdb_page.php?name="+str,true);
tail j=7234 line= xmlhttp.send();
tail j=7235 line= </script id="script_ajaxdb3">
tail j=7236 line=
tail j=7237 line=
tail j=7238 line= <br><br><br><br><br>
tail j=7239 line= <div id="div_kogrids_b"></div>
tail j=7240 line=
tail j=7241 line=
tail j=7242 line= <script id="script_gethint_ajax">
tail j=7243 line= function showHint(str) {
tail j=7244 line= if (str.length == 0) {
tail j=7245 line= document.getElementById("txtHint").innerHTML = "";
tail j=7246 line= return;
tail j=7247 line= }
tail j=7248 line= else {
tail j=7249 line= var xmlhttp = new XMLHttpRequest();
tail j=7250 line= xmlhttp.onreadystatechange = function() {
tail j=7251 line= if (this.readyState == 4 && this.status == 200) {
tail j=7252 line= document.getElementById("txtHint").innerHTML = this.responseText;
tail j=7253 line= }
tail j=7254 line= };
tail j=7255 line= xmlhttp.open("GET", "gethint.php?q=" + str, true);
tail j=7256 line= xmlhttp.send();
tail j=7257 line= }
tail j=7258 line= }
tail j=7259 line= </script id="script_gethint_ajax">
tail j=7260 line=
tail j=7261 line= <script id="script_ajaxjs" >
tail j=7262 line=
tail j=7263 line=
tail j=7264 line=function js_ajax() {
tail j=7265 line= $(document).ready(function(){
tail j=7266 line= $.ajax({
tail j=7267 line= url: 'idx.php',
tail j=7268 line= type: 'get',
tail j=7269 line= dataType: 'JSON',
tail j=7270 line= success: function(response){
tail j=7271 line= var len = response.length;
tail j=7272 line= for(var i=0; i<len; i++){
tail j=7273 line= var id = response[i].id;
tail j=7274 line= var username = response[i].username;
tail j=7275 line= var name = response[i].name;
tail j=7276 line= var email = response[i].email;
tail j=7277 line=
tail j=7278 line= var tr_str = "<tr>" +
tail j=7279 line= "<td align='center'>" + (i+1) + "</td>" +
tail j=7280 line= "<td align='center'>" + username + "</td>" +
tail j=7281 line= "<td align='center'>" + name + "</td>" +
tail j=7282 line= "<td align='center'>" + email + "</td>" +
tail j=7283 line= "</tr>";
tail j=7284 line= $("#userTable tbody").append(tr_str);
tail j=7285 line= }
tail j=7286 line=
tail j=7287 line= }
tail j=7288 line= });
tail j=7289 line= });
tail j=7290 line= return( $ajaxjs );
tail j=7291 line= }
tail j=7292 line=
tail j=7293 line= </script id="script_ajaxjs" >
tail j=7294 line=
tail j=7295 line=
tail j=7296 line= <h1>gethint_ajax</h1>
tail j=7297 line= <script id="script_gethint_ajax">
tail j=7298 line= function showHint(str) {
tail j=7299 line= if (str.length == 0) {
tail j=7300 line= document.getElementById("txtHint").innerHTML = "";
tail j=7301 line= return;
tail j=7302 line= }
tail j=7303 line= else {
tail j=7304 line= var xmlhttp = new XMLHttpRequest();
tail j=7305 line= xmlhttp.onreadystatechange = function() {
tail j=7306 line= if (this.readyState == 4 && this.status == 200) {
tail j=7307 line= document.getElementById("txtHint").innerHTML = this.responseText;
tail j=7308 line= }
tail j=7309 line= };
tail j=7310 line= xmlhttp.open("POST", "idx.php?hint=" + str, true);
tail j=7311 line= xmlhttp.send();
tail j=7312 line= }
tail j=7313 line= }
tail j=7314 line= </script id="script_gethint_ajax">
tail j=7315 line=
tail j=7316 line= </body>
tail j=7317 line= </html>
tail j=7318 line=<!--
tail j=7319 line=elise legrow - who do you love:https://www.youtube.com/watch?v=4BYzRmiBwRE
tail j=7320 line= -->
ko 20190222_062304 MAIN 0-0 fildb3=ko.db3 sqltbl=ko fillogd=ko_20190222.log
MSG_7500 FINDDT: ifile=index.html findmath=style_byte_content tailmatch=style_byte_content ofile=style_byte_content
MSG_400: ko 20190222_062304 -= findt =- 0-0 ifile=index.html findmatch=style_byte_contentstyle_byte_content ofile=style_byte_content
EXIT_500 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ko 20190222_062304 -= findt =- 0-0 ___FOUND ifile=index.html findmatch=style_byte_content ofile=style_byte_content
match j=1591 line= <style id="style_byte_content" >
FIND j=1592 line= #byte_content {
FIND j=1593 line= margin: 5px 0;
FIND j=1594 line= max-height: 100px;
FIND j=1595 line= overflow-y: auto;
FIND j=1596 line= overflow-x: hidden;
FIND j=1597 line= }
FIND j=1598 line= #byte_range { margin-top: 5px; }
FIND j=1599 line= </style>
FIND j=1600 line=
FIND j=1601 line= <script id="load_vues" >
FIND j=1602 line= function load_vues(args) {
FIND j=1603 line=// alert( "BUG_1000 load_vues"+args );
FIND j=1604 line= vues = "";
FIND j=1605 line= vues += "old|\n";
FIND j=1606 line= vues += "ko|\n";
FIND j=1607 line= vues += "new|\n";
FIND j=1608 line= vues += "work|\n";
FIND j=1609 line= vues += "focus|\n";
FIND j=1610 line= vues += "where|";
FIND j=1611 line= vues += "courtreport|\n";
FIND j=1612 line= vues += "jtfdc|\n";
FIND j=1613 line= vues += "jtrdcr|\n";
FIND j=1614 line= vues += "jtfinc|\n";
FIND j=1615 line= vues += "byrdpuckers|\n";
FIND j=1616 line=
FIND j=1617 line= vues += "kassil|\n";
FIND j=1618 line= vues += "konet|\n";
FIND j=1619 line= vues += "iperms|\n";
FIND j=1620 line=
FIND j=1621 line= vues += "memes|\n";
FIND j=1622 line= vues += "food|\n";
FIND j=1623 line= vues += "kids|\n";
FIND j=1624 line= vues += "dogs|\n";
FIND j=1625 line=
FIND j=1626 line= vues += "jkwii|\n";
FIND j=1627 line= vues += "kou|\n";
FIND j=1628 line= vues += "konabus|\n";
FIND j=1629 line= vues += "go|\n";
FIND j=1630 line= vues += "kt|\n";
FIND j=1631 line= vues += "ka|\n";
FIND j=1632 line= vues += "ko|\n";
FIND j=1633 line=
FIND j=1634 line= vues += "ko0|\n";
FIND j=1635 line= vues += "ko1|\n";
FIND j=1636 line= vues += "ko2|\n";
FIND j=1637 line= vues += "ka1|\n";
FIND j=1638 line= vues += "ka2|\n";
FIND j=1639 line=
FIND j=1640 line= vues += "ka11|\n";
FIND j=1641 line= vues += "ka12|\n";
FIND j=1642 line= vues += "ka21|\n";
FIND j=1643 line= vues += "ka22|\n";
FIND j=1644 line=
FIND j=1645 line= vues += "av|\n";
FIND j=1646 line= vues += "bb|\n";
FIND j=1647 line= vues += "dd|\n";
FIND j=1648 line= vues += "pn|\n";
FIND j=1649 line= vues += "sl|\n";
FIND j=1650 line= vues += "tm|\n";
FIND j=1651 line= vues += "tl|\n";
FIND j=1652 line= vues += "vu|\n";
FIND j=1653 line= vues += "yt|\n";
FIND j=1654 line= vues += "zm|\n";
FIND j=1655 line=
FIND j=1656 line= vues += "old|\n";
FIND j=1657 line=
FIND j=1658 line=// alert( "BUG_1100 end load_vues vues="+vues );
FIND j=1659 line= return( vues );
FIND j=1660 line= }
FIND j=1661 line= </script>
FIND j=1662 line=
FIND j=1663 line= <script id="script_show_vues">
FIND j=1664 line= function show_vues(args) {
FIND j=1665 line= alert( "BUGS_1060 BEG show_vues args="+args );
FIND j=1666 line=
FIND j=1667 line= vues = load_vues('').split("|");
FIND j=1668 line= vuelen = vues.length;
FIND j=1669 line= alert( "BUGS_1070 show_vues AAA htmout="+vuelen );
FIND j=1670 line=
FIND j=1671 line= htmout="";
FIND j=1672 line= htmout_script_vues="";
FIND j=1673 line= htmout_button_vues="";
FIND j=1674 line= htmout_div_vues="";
FIND j=1675 line= htmout="";
FIND j=1676 line= htmout="";
FIND j=1677 line=
FIND j=1678 line= z=0;
FIND j=1679 line=
FIND j=1680 line= for( z=0; z<vuelen; z++ ) {
FIND j=1681 line= vue = vues[z];
FIND j=1682 line= url = '/?vuid="'+vue+'"';
FIND j=1683 line= tn = "/imgs/gif/ringd.gif"; img = "/imgs/gif/ringb.gif";
FIND j=1684 line= tn = "/imgs/gif/ringsd.gif"; img = "/imgs/gif/ringsb.png";
FIND j=1685 line=
FIND j=1686 line= background="yellow";
FIND j=1687 line= color="black";
FIND j=1688 line= font="yokkmokkOT";
FIND j=1689 line= fontsize="12pt";
FIND j=1690 line= width="35%";
FIND j=1691 line=
FIND j=1692 line= alert( "BUGS_1090 show_vues z="+z+" vue="+vue );
FIND j=1693 line=
FIND j=1694 line= htmout += "<hr color=yellow";
FIND j=1695 line= htmout += "<hr color=red";
FIND j=1696 line= htmout += '<img src="/imgs/gif/rings.gif" >\n';
FIND j=1697 line= htmout += '<a href="'+url+'" alt="'+vue+'" class="popover" id="drg" target=_blank>';
FIND j=1698 line= htmout += ' <img class="drg" src="'+tn+'" border=0>';
FIND j=1699 line= htmout += ' <span><img class="drg" src="'+img+'" border=0></span>';
FIND j=1700 line= htmout += ' </a>';
FIND j=1701 line= htmout += "<hr color=yellow";
FIND j=1702 line= htmout += "<hr color=red";
FIND j=1703 line=
FIND j=1704 line=// htmout_script_vues += '<script id="'+z+'" >';
FIND j=1705 line= htmout_script_vues += '<script id="vue_kov_'+vue+'" >';
FIND j=1706 line= htmout_script_vues += ' var kov = new Vue({ el: "#kov'+kovid+'",';
FIND j=1707 line= htmout_script_vues += 'data: {collapsed: false},';
FIND j=1708 line=
FIND j=1709 line= htmout_script_vues += 'methods: {\n';
FIND j=1710 line= htmout_script_vues += ' showhide_kov: function() {\n';
FIND j=1711 line= htmout_script_vues += ' if (!this.collapsed) this.collapsed = true;\n';
FIND j=1712 line= htmout_script_vues += ' else this.collapsed = false;\n';
FIND j=1713 line= htmout_script_vues += ' },\n';
FIND j=1714 line= htmout_script_vues += 'document.body.style.background = "'+background+'"';
FIND j=1715 line=
FIND j=1716 line= htmout_script_vues += 'document.body.style.color = "'+color+'"';
FIND j=1717 line= htmout_script_vues += 'document.body.style.fontfamily = "'+font+'"';
FIND j=1718 line= htmout_script_vues += 'document.body.style.fontsize = "'+fontsize+'"';
FIND j=1719 line= htmout_script_vues += ' },\n';
FIND j=1720 line= htmout_script_vues += ' </script" >';
FIND j=1721 line=
FIND j=1722 line= htmout_style_vues = '<style id="style_kov_'+vue+'\n';
FIND j=1723 line= htmout_style_vues += ' .detail_'+vue+' { \n';
FIND j=1724 line= htmout_style_vues += ' background: '+background+';\n';
FIND j=1725 line= htmout_style_vues += ' width: '+width+';\n';
FIND j=1726 line= htmout_style_vues += ' padding: 20px;\n';
FIND j=1727 line= htmout_style_vues += ' border: 1px solid black;\n';
FIND j=1728 line= htmout_style_vues += ' font-family: '+font+';\n';
FIND j=1729 line= htmout_style_vues += ' color: '+color+';\n';
FIND j=1730 line= htmout_style_vues += ' }\n';
FIND j=1731 line= htmout_style_vues += ' </style>\n';
FIND j=1732 line=
FIND j=1733 line=// alert( "BUGS_1092 show_vues VUEHTM vuelen="+vuelen+" htmout_style_vues=\n"+htmout_style_vues );
FIND j=1734 line= alert( "BUGS_1733 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues=\n"+htmout_script_vues );
FIND j=1735 line= }
FIND j=1736 line=
FIND j=1737 line=
FIND j=1738 line=// alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout="+htmout );
FIND j=1739 line=// alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues="+htmout_script_vues );
FIND j=1740 line=
FIND j=1741 line= div_style_vues = document.getElementById('div_style_vues');
FIND j=1742 line= div_style_vues.insertAdjacentHTML('afterbegin', htmout_style_vues );
FIND j=1743 line=
FIND j=1744 line= div_script_vues = document.getElementById('div_script_vues');
FIND j=1745 line= div_script_vues.insertAdjacentHTML('afterbegin', htmout_script_vues );
FIND j=1746 line=
FIND j=1747 line=
FIND j=1748 line= div_show_vues = document.getElementById('div_show_vues');
FIND j=1749 line= div_show_vues.insertAdjacentHTML('afterbegin', htmout);
FIND j=1750 line=
FIND j=1751 line=
FIND j=1752 line=// div_show_vues.insertAdjacentHTML('beforebegin', htmout);
FIND j=1753 line=
FIND j=1754 line=// div_show_vues = getelementbyID('div_show_vues");
FIND j=1755 line=// div_show_vues.innerHTML = htmout;
FIND j=1756 line=
FIND j=1757 line=// alert("BUGS_2892 vuelen=" + vues.length + "\nStatus: " + status);
FIND j=1758 line=// document.write( htmout );
FIND j=1759 line=
FIND j=1760 line=// alert( "BUGS_1100 END show_vues htmout="+htmout );
FIND j=1761 line= return(htmout);
FIND j=1762 line= }
FIND j=1763 line= </script id="script_show_vues">
FIND j=1764 line=
FIND j=1765 line=
FIND j=1766 line= <div id="div_style_vues"></div>
FIND j=1767 line=
FIND j=1768 line= <div id="div_script_vues"></div>
FIND j=1769 line=
FIND j=1770 line= <script id="script_kovs_hideshow">
FIND j=1771 line=
FIND j=1772 line= function kovs_hideshow( todo, kovs ) {
FIND j=1773 line= kovlist = "";
FIND j=1774 line= kovlist += "ko|go|kt|old|new|";
FIND j=1775 line= kovlist += "kassil|konet|iperms|konabus|courtreport|";
FIND j=1776 line= kovlist += "jkwii|byrdpucker|kou|jtfdc|jtfinc|";
FIND j=1777 line= kovlist += "where|work|memes|focus|food|";
FIND j=1778 line= kovlist += "dogs|kids|preserve|protect";
FIND j=1779 line= kovs = kovlist.split('|');
FIND j=1780 line= kovs_len = kovs.length;
FIND j=1781 line=// alert( "BUS_1340 kovs_hideshow todo="+todo+" kovlist="+kovlist+" kovs_len="+kovs_len );
FIND j=1782 line= htmout = "";
FIND j=1783 line= z=0;
FIND j=1784 line= for( z=0; z<kovs_len; z++ ) {
FIND j=1785 line= kov=kovs[z];
FIND j=1786 line= kovid="kov_"+kov;
FIND j=1787 line= if( todo == "hide" ) {
FIND j=1788 line= document.getElementById(kovid).style.visibility = "hidden";
FIND j=1789 line= }
FIND j=1790 line= if( todo == "show" ) {
FIND j=1791 line= document.getElementById(kovid).style.visibility = "visible";
FIND j=1792 line= }
FIND j=1793 line= htmout += "z="+z+" todo="+todo+ " kovid="+kovid+"<br>\n";
FIND j=1794 line=// alert( "BUS_1350 kovs_hideshow todo="+todo+" z="+z+" kovid="+kovid );
FIND j=1795 line= }
FIND j=1796 line= alert( "BUGS_1371 htmout="+htmout );
FIND j=1797 line=// alert( "BUS_1370 kovs_hideshow todo="+todo+" kovs="+kovs );
FIND j=1798 line= }
FIND j=1799 line= </script>
FIND j=1800 line=
FIND j=1801 line= <script id="script_vues_hideshow">
FIND j=1802 line= function vues_hideshow(hideshow,kovs) {
FIND j=1803 line= alert( "BUGS_1220 vues_hideshow kovs="+kovs );
FIND j=1804 line= kovs = "";
FIND j=1805 line= kovs += "ko new focus work where memes ";
FIND j=1806 line= kovs += "jtfdc jtfdcr jtfinc byrdpucker courtreport ";
FIND j=1807 line= kovs += "jkwii kou kids dogs ";
FIND j=1808 line= kovs += "kassil konet iperms konabus ko go kt old";
FIND j=1809 line= alert( "BUGS_1221 vues_hideshow kovs="+kovs );
FIND j=1810 line= z=0;
FIND j=1811 line= for( kov in kovs.split(" ") ) {
FIND j=1812 line= z=z+1;
FIND j=1813 line= alert( "BUGS vues_hideshow z="+z+" kov="+kov );
FIND j=1814 line= }
FIND j=1815 line= }
FIND j=1816 line= function vues_hideshow1(hideshow,divid) {
FIND j=1817 line= alert( "BUGS_1230 vues_hideshow args="+args );
FIND j=1818 line= htmout_vues_all="";
FIND j=1819 line= if( hideshow == 'hide' ) {
FIND j=1820 line= if( divid == "" ) or ( divid == "all" ) {
FIND j=1821 line= alert( "MGS_1261 vues_showhide HIDE" );
FIND j=1822 line= document.getElementById("btn_vues_hide").style.visibility = "hidden";
FIND j=1823 line= document.getElementById("btn_vues_show").style.visibility = "visible";
FIND j=1824 line=
FIND j=1825 line= document.getElementById("kov_ko").style.visibility = "hidden";
FIND j=1826 line= document.getElementById("kov_new").style.visibility = "hidden";
FIND j=1827 line= document.getElementById("kov_focus").style.visibility = "hidden";
FIND j=1828 line= document.getElementById("kov_food").style.visibility = "hidden";
FIND j=1829 line= document.getElementById("kov_courtreport").style.visibility = "hidden";
FIND j=1830 line= document.getElementById("kov_where").style.visibility = "hidden";
FIND j=1831 line= document.getElementById("kov_work").style.visibility = "hidden";
FIND j=1832 line= document.getElementById("kov_memes").style.visibility = "hidden";
FIND j=1833 line= document.getElementById("kov_kids").style.visibility = "hidden";
FIND j=1834 line= document.getElementById("kov_dogs").style.visibility = "hidden";
FIND j=1835 line= document.getElementById("kov_preserve").style.visibility = "hidden";
FIND j=1836 line= document.getElementById("kov_protect").style.visibility = "hidden";
FIND j=1837 line= document.getElementById("kov_jtfdc").style.visibility = "hidden";
FIND j=1838 line= document.getElementById("kov_jtfinc").style.visibility = "hidden";
FIND j=1839 line= document.getElementById("kov_byrdpucker").style.visibility = "hidden";
FIND j=1840 line= document.getElementById("kov_jkwii").style.visibility = "hidden";
FIND j=1841 line= document.getElementById("kov_kou").style.visibility = "hidden";
FIND j=1842 line= document.getElementById("kov_kassil").style.visibility = "hidden";
FIND j=1843 line= document.getElementById("kov_konet").style.visibility = "hidden";
FIND j=1844 line= document.getElementById("kov_iperms").style.visibility = "hidden";
FIND j=1845 line= document.getElementById("kov_konabus").style.visibility = "hidden";
FIND j=1846 line= document.getElementById("kov_kt").style.visibility = "hidden";
FIND j=1847 line= document.getElementById("kov_go").style.visibility = "hidden";
FIND j=1848 line= document.getElementById("kov_old").style.visibility = "hidden";
FIND j=1849 line= }
FIND j=1850 line= else {
FIND j=1851 line= document.getElementById(divid).style.visibility = "hiddtn";
FIND j=1852 line= }
FIND j=1853 line=
FIND j=1854 line=// var div_vues_all = document.getElementById('div_vues_all');
FIND j=1855 line=// htmout_vues= div_vues_all.innerHTML;
FIND j=1856 line=// div_vues_all.innerHTML = '<div id="div_vues_all" hidden><h1>div_vues_all_hidden</h1>\n';
FIND j=1857 line=// htmout_vues = document.getElementById('div_vues_all').innerHTML;
FIND j=1858 line= alert( "BUGS_1291 vues_hideshow HIDE=");
FIND j=1859 line=// div_vues.innerHTML = '<h1>div_vues</h1><div id="div_vues" hidden>\n";
FIND j=1860 line= }
FIND j=1861 line= if( args == 'show' ) {
FIND j=1862 line= if( divid == "" ) or ( divid == "all" ) {
FIND j=1863 line= alert( "MGS_1262 vues_showhide HIDE" );
FIND j=1864 line= document.getElementById("btn_vues_hide").style.visibility = "visible";
FIND j=1865 line= document.getElementById("btn_vues_show").style.visibility = "hidden";
FIND j=1866 line=
FIND j=1867 line=
FIND j=1868 line=
FIND j=1869 line= document.getElementById("kov_ko").style.visibility = "visible";
FIND j=1870 line= document.getElementById("kov_new").style.visibility = "visible";
FIND j=1871 line= document.getElementById("kov_focus").style.visibility = "visible";
FIND j=1872 line= document.getElementById("kov_food").style.visibility = "visible";
FIND j=1873 line= document.getElementById("kov_courtreport").style.visibility = "visible";
FIND j=1874 line= document.getElementById("kov_where").style.visibility = "visible";
FIND j=1875 line= document.getElementById("kov_work").style.visibility = "visible";
FIND j=1876 line= document.getElementById("kov_memes").style.visibility = "visible";
FIND j=1877 line= document.getElementById("kov_kids").style.visibility = "visible";
FIND j=1878 line= document.getElementById("kov_dogs").style.visibility = "visible";
FIND j=1879 line= document.getElementById("kov_preserve").style.visibility = "visible";
FIND j=1880 line= document.getElementById("kov_protect").style.visibility = "visible";
FIND j=1881 line= document.getElementById("kov_jtfdc").style.visibility = "visible";
FIND j=1882 line= document.getElementById("kov_jtfinc").style.visibility = "visible";
FIND j=1883 line= document.getElementById("kov_byrdpucker").style.visibility = "visible";
FIND j=1884 line= document.getElementById("kov_jkwii").style.visibility = "visible";
FIND j=1885 line= document.getElementById("kov_kou").style.visibility = "visible";
FIND j=1886 line= document.getElementById("kov_kassil").style.visibility = "visible";
FIND j=1887 line= document.getElementById("kov_konet").style.visibility = "visible";
FIND j=1888 line= document.getElementById("kov_iperms").style.visibility = "visible";
FIND j=1889 line= document.getElementById("kov_konabus").style.visibility = "visible";
FIND j=1890 line= document.getElementById("kov_kt").style.visibility = "visible";
FIND j=1891 line= document.getElementById("kov_go").style.visibility = "visible";
FIND j=1892 line= document.getElementById("kov_old").style.visibility = "visible";
FIND j=1893 line= }
FIND j=1894 line= else {
FIND j=1895 line= document.getElementById(divid).style.visibility = "visible";
FIND j=1896 line= }
FIND j=1897 line= alert( "BUGS_1292 vues_hideshow SHOW htmout_vues=");
FIND j=1898 line= }
FIND j=1899 line= }
FIND j=1900 line= </script id="script_vues_hideshow">
FIND j=1901 line=
FIND j=1902 line= <script id="script_kb" >function script_kb(args) {
FIND j=1903 line= alert( "script_kb args="+args );
FIND j=1904 line= }
FIND j=1905 line= <script id="script_kw" >function script_kw(args) {
FIND j=1906 line= alert( "script_kw args="+args );
FIND j=1907 line= }
FIND j=1908 line= <script id="script_koeyeb_w" >function script_koeyeb_w(args) {
FIND j=1909 line= alert( "script_koeyeb_w args="+args );
FIND j=1910 line= }
FIND j=1911 line= <script id="script_koeyew_b" >function script_koeyew_b(args) {
FIND j=1912 line= alert( "script_koeyew_b args="+args );
FIND j=1913 line= }
FIND j=1914 line= <script id="script_koeye_b" >function script_koeye_b(args) {
FIND j=1915 line= alert( "script_koeye_b args="+args );
FIND j=1916 line= }
FIND j=1917 line= <script id="script_koeye_w" >function script_koeye_w(args) {
FIND j=1918 line= alert( "script_koeye_w args="+args );
FIND j=1919 line= }
FIND j=1920 line= <script id="script_bubble" >function script_bubble(args) {
FIND j=1921 line= alert( "script_bubble args="+args );
FIND j=1922 line= }
FIND j=1923 line=
FIND j=1924 line= <script id="script_shutdown" >
FIND j=1925 line= function script_shutdown( msg ) {
FIND j=1926 line= alert( "BUGS_6100 script_shutdown msg="+msg );
FIND j=1927 line= }
FIND j=1928 line= </script id="script_shutdown" >
FIND j=1929 line=
FIND j=1930 line=
FIND j=1931 line=
FIND j=1932 line= </head>
FIND j=1933 line=
FIND j=1934 line=
FIND j=1935 line=
FIND j=1936 line=<!-- <body onload="init_pano('canvas'); kogrids();"> -->
FIND j=1937 line=
FIND j=1938 line=
FIND j=1939 line=<body onload="startup();">
FIND j=1940 line=
FIND j=1941 line=<br><br><br><br>
FIND j=1942 line=<br><br><br><br>
FIND j=1943 line=
FIND j=1944 line= <div id="div_kogrids_w"></div>
FIND j=1945 line=
FIND j=1946 line=
FIND j=1947 line=<br><br><br><br><br>
FIND j=1948 line=<hr color=yellow>
FIND j=1949 line= <button type="btn_kovs_hideshow" id="kovs_hideshow" onclick="kovs_hideshow()">kovs_hideshow</button>
FIND j=1950 line= <a href=# onclick="kovs_hideshow("hide","all"); return false;" class="popover">
FIND j=1951 line= <img height=200 src=/imgs/gif/ringb.gif onclick="kovs_hideshow('hide','all')">
FIND j=1952 line= <span><img height=200 src=/imgs/gif/ringp.gif onclick="kovs_hideshow('hide','all')"></span>
FIND j=1953 line= <a>
FIND j=1954 line=
FIND j=1955 line=<!-- <img src=/imgs/gif/rings.gif onclick="kovs_hideshow('show','all')"> -->
FIND j=1956 line=
FIND j=1957 line= <a href=# onclick="kovs_hideshow("show","all"); return false;" class="popover">
FIND j=1958 line= <img height=200 src=/imgs/gif/ringd.gif onclick="kovs_hideshow('show','all')">
FIND j=1959 line= <span><img height=200 src=/imgs/gif/ringq.gif onclick="kovs_hideshow('show','all')"></span>
FIND j=1960 line= <a>
FIND j=1961 line=
FIND j=1962 line= <script id="script_bugs" >
FIND j=1963 line= function bugs(h,d) {
FIND j=1964 line= alert( "BUGS " );
FIND j=1965 line= }
FIND j=1966 line= </script>
FIND j=1967 line=
FIND j=1968 line= <button type="btn_kovs_hide" id="btn_kovs_hide" onclick="kovs_hideshow('hide','all')>
FIND j=1969 line= -= kovs_hide_all =-
FIND j=1970 line= </button>
FIND j=1971 line= <button type="btn_kovs_show" id="btn_kovs_show" onclick="kovs_hideshow('show','all')>
FIND j=1972 line= -= kovs_show_all =-
FIND j=1973 line= </button>
FIND j=1974 line=
FIND j=1975 line=<hr color=yellow>
FIND j=1976 line=<br><br><br><br><br>
FIND j=1977 line=<br><br><br><br><br>
FIND j=1978 line=<br><br><br><br><br>
FIND j=1979 line=<br><br><br><br><br>
FIND j=1980 line=
FIND j=1981 line= <button type="show_vues" id="show_vues" onclick="show_vues('')">show_vues</button>
FIND j=1982 line=<!--
FIND j=1983 line= <a href=# class=popover id="drag" >
FIND j=1984 line= <img height=400 width=600 src="/imgs/gif/ringsb.gif" onclick="show_vues('')" >
FIND j=1985 line= <span><img height=400 width=600 src="/imgs/gif/ringsq.gif" onclick="show_vues('')" ></span>
FIND j=1986 line= </a>
FIND j=1987 line= -->
FIND j=1988 line=
FIND j=1989 line=<button type="show_vues" id="show_vues" onclick="show_vues('')">show_vuew</button>
FIND j=1990 line= <div id="div_show_vues" ><h1>div_show_vues_w</h1></div>
FIND j=1991 line=
FIND j=1992 line=
FIND j=1993 line=<button type="kov_links_main" id="kov_links_main" onclick="kov_links()">kov_links_main</button>
FIND j=1994 line=<!-- <button type="clear_div_kov" id="clear_div_kov" onclick="clear_div_kov()">clear_div_kov</button> -->
FIND j=1995 line=<!-- <button type="load_kov_links" id="load_kov_links" onclick="load_kov_links()">load_kov_links</button> -->
FIND j=1996 line=<!-- <button type="show_kov_links" id="show_kov_links" onclick="show_kov_links()">show_kov_links</button> -->
FIND j=1997 line=
FIND j=1998 line=
FIND j=1999 line= <div id="div_kov_links"></div>
FIND j=2000 line=
FIND j=2001 line= <div id="v_hoverdate">
FIND j=2002 line= <span v-bind:title="message"><font style="font-family: times, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
FIND j=2003 line= <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
FIND j=2004 line= </div>
FIND j=2005 line= <script id="script_hoverdate" >
FIND j=2006 line= kotxt = "";
FIND j=2007 line= kotxt += "-== kako =- preview embed vu emchat -= 20190218_0800 =-";
FIND j=2008 line=// kotxt += new Date().toLocaleString();
FIND j=2009 line=// message: 'hoverdate ' + kotxt;
FIND j=2010 line= var app2 = new Vue({el: '#v_hoverdate',
FIND j=2011 line= data: {
FIND j=2012 line= message: 'hover_dttm ' + new Date().toLocaleString() + kotxt
FIND j=2013 line= }
FIND j=2014 line= })
FIND j=2015 line= </script id="script_hoverdate" >
FIND j=2016 line=
FIND j=2017 line=
FIND j=2018 line= <dic id="div_vues" ><h1>div_vues</h1></div>
FIND j=2019 line=<!-- <button type="button" onclick="script_ajax()">loadlist</button> -->
FIND j=2020 line=
FIND j=2021 line=
FIND j=2022 line= <hr color=yellow>
FIND j=2023 line= <div id="dynDataField"></div>
FIND j=2024 line= <hr color=yellow>
FIND j=2025 line=
FIND j=2026 line= <h1 id="ajaxdb3">ajaxdb3.</h1>
FIND j=2027 line= <button type="button" onclick="script_ajaxdb3()">ajaxdb3</button>
FIND j=2028 line=
FIND j=2029 line= <script id="script_ajaxdb3">
FIND j=2030 line= db3=indexx.db3;
FIND j=2031 line= sql="select * from list limit 5";
FIND j=2032 line= function script_ajaxdb3(db3,sql) {
FIND j=2033 line= $("button").click(function(){
FIND j=2034 line= $.post("indexx.php", {
FIND j=2035 line= db3: db3,
FIND j=2036 line= sql: "select * from list limit 10"
FIND j=2037 line= },
FIND j=2038 line= function(data, status){
FIND j=2039 line= lines = data.split("\n");
FIND j=2040 line= linelen=lines.length;
FIND j=2041 line= htmout="";
FIND j=2042 line= alert( "BUGS1240 linelen="+linelen );
FIND j=2043 line= for( z=0; z<lines.length; z++ ) {
FIND j=2044 line= line=lines[z];
FIND j=2045 line= if( line.length < 3 ) continue;
FIND j=2046 line= z=z+1;
FIND j=2047 line= flds = line.split(" ");
FIND j=2048 line= img = flds[8];
FIND j=2049 line= dd = flds[7];
FIND j=2050 line= mth = flds[5];
FIND j=2051 line= yyyy = flds[6];
FIND j=2052 line= size = flds[4];
FIND j=2053 line=// htmout += line+"\n";
FIND j=2054 line= htmout += "img="+img+" dd="+dd+" "+yyyy+" "+mth+"\n";
FIND j=2055 line=// alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
FIND j=2056 line= }
FIND j=2057 line= alert( "BUGS_1400 ajaxdb3 z="+z+" htmout="+htmout );
FIND j=2058 line= for( z=0; z<lines.length; z++ ) {
FIND j=2059 line= line=lines[z];
FIND j=2060 line= alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
FIND j=2061 line= flds = lines.split(" ");
FIND j=2062 line= fldlen = flds.length;
FIND j=2063 line= alert( "BUGS_1260 ajaxdb3 z="+z+" fldlen="+fldlen );
FIND j=2064 line= psv=parseline(line);
FIND j=2065 line= alert( "BUGS_1251 ajaxdb3 psv="+psv );
FIND j=2066 line=// (url,img,id,tn,grp,desc) = parseline(line);
FIND j=2067 line=// url = line.split(" ")[0];
FIND j=2068 line=// img = line.split(" ")[1];
FIND j=2069 line=// alert( "BUGS_1251 ajaxdb3 url="+url+" img="+img );
FIND j=2070 line=// id = line.split("|")[2];
FIND j=2071 line=// tn = line.split("|")[3];
FIND j=2072 line=// grp = line.split("|")[4];
FIND j=2073 line=// desc = line.split("|")[5];
FIND j=2074 line=
FIND j=2075 line= htmout += '<div id="drag">\n';
FIND j=2076 line= htmout += '<div class="drg" >\n';
FIND j=2077 line= htmout += '<a href="+url+" class="thumbnail" target=_blank>\n';
FIND j=2078 line= htmout += ' <img class="drg" src="+img+" border=0>\n';
FIND j=2079 line= htmout += ' <span><img class="drg" src="+img+" border=0></span>\n';
FIND j=2080 line= htmout += ' </a>\n';
FIND j=2081 line= htmout += ' </div>\n';
FIND j=2082 line= htmout += ' </div>\n';
FIND j=2083 line=// alert( "BUGS_1248 ajaxdb3 htmout="+htmout );
FIND j=2084 line= }
FIND j=2085 line=
FIND j=2086 line=// getelementbyID('div_ajaxdb3");
FIND j=2087 line=// alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
FIND j=2088 line=
FIND j=2089 line= div_ajaxdb3 = document.getElementById('div_ajaxdb3');
FIND j=2090 line= div_ajaxdb3.insertAdjacentHTML('afterbegin', htmout);
FIND j=2091 line=// document.write( htmout );
FIND j=2092 line= });
FIND j=2093 line= });
FIND j=2094 line= }
FIND j=2095 line= </script id="script_ajaxdb3">
FIND j=2096 line=
FIND j=2097 line=
FIND j=2098 line= <script id="script_parseline">
FIND j=2099 line= function parseline(line) {
FIND j=2100 line= alert( "BUGS_1280 line="+line );
FIND j=2101 line= flds=line.split(" ");
FIND j=2102 line=
FIND j=2103 line= url="index.html";
FIND j=2104 line= img="/imgs/gif/ringsb.gif";
FIND j=2105 line= id="jkwii";
FIND j=2106 line= tn="/imgs/btn/ringsd.gif";
FIND j=2107 line= grp="group";
FIND j=2108 line= desc="timejak jkwii";
FIND j=2109 line= psv=url+"|"+img+"|"+id+"|"+tn+"|"+grp+"|"+desc
FIND j=2110 line=
FIND j=2111 line=// return(url,img,id,tn,grp,desc);
FIND j=2112 line= return(psv);
FIND j=2113 line= }
FIND j=2114 line= </script id="script_parseline">
FIND j=2115 line=
FIND j=2116 line= <hr color=yellow>
FIND j=2117 line= <div id="div_ajaxdb3"></div>
FIND j=2118 line= <hr color=yellow>
FIND j=2119 line=
FIND j=2120 line=
FIND j=2121 line=<!-- <div id="ajax_loadlist">xxx ajax_loadlist xxx</div> -->
FIND j=2122 line= <hr color=yellow>
FIND j=2123 line=
FIND j=2124 line=
FIND j=2125 line=
FIND j=2126 line= <div id="div_vues" >
FIND j=2127 line=
FIND j=2128 line= <div id="app_jkwii">
FIND j=2129 line= <div>
FIND j=2130 line=
FIND j=2131 line= <h1 v-on:click="showhide" >= = : : jkwii is me : : = =</h1>
FIND j=2132 line= <h2 v-on:click="showhide" >:: -=ko0us=- preview 20190218_0800 us_med_rectin</h2>
FIND j=2133 line= <h2>private tours available on request</h2>
FIND j=2134 line=
FIND j=2135 line=<a id="drag" class="popover" href="/ani.html" target=_blank>
FIND j=2136 line= <img class="drg" height=450 width=800 src="/imgs/gif/firebubblesb.gif" alt="firebubbles" border=0>
FIND j=2137 line= <span><img height=450 width=800 class="drg" src="/imgs/gif/firebubblesq.gif" border=0></span>
FIND j=2138 line= </a>
FIND j=2139 line=
FIND j=2140 line= <iframe frameborder='0' height='200' width=800 marginheight='0' marginwidth='0' scrolling='no'
FIND j=2141 line= src='/ani.html'
FIND j=2142 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
FIND j=2143 line= </iframe>
FIND j=2144 line=
FIND j=2145 line= <hr color=blue>
FIND j=2146 line= <hr color=white>
FIND j=2147 line= <hr color=red>
FIND j=2148 line=
FIND j=2149 line=<!--
FIND j=2150 line= <iframe id="myframe" src="/svc/emchat/index.html" width="600" height="500"
FIND j=2151 line= frameborder="0" scrolling="yes"></iframe>
FIND j=2152 line= -->
FIND j=2153 line=
FIND j=2154 line=<!--
FIND j=2155 line= <img height=50 src="/imgs/btn/kob.png">
FIND j=2156 line= <img height=50 src="/imgs/btn/koeyeb.png">
FIND j=2157 line= <img height=50 src="/imgs/btn/koeye.png">
FIND j=2158 line= <img height=50 src="/imgs/btn/koeyew.png">
FIND j=2159 line= <img height=50 src="/imgs/btn/kow.png">
FIND j=2160 line= -->
FIND j=2161 line=
FIND j=2162 line= <a href=/svc/emchat/index.html class="thumbnail" target=_blank>
FIND j=2163 line= <img class="drg" height=200 src=/imgs/links/tn/tn_chat.png border=0>
FIND j=2164 line= <span><img class="drg" height=400 src=/imgs/links/tn/tn_chat.png border=0></span>
FIND j=2165 line= </a>
FIND j=2166 line=
FIND j=2167 line= <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
FIND j=2168 line= <img class="drg" height=200 src=/imgs/links/tn/tn_meet.png border=0>
FIND j=2169 line= <span><img class="drg" height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
FIND j=2170 line= </a>
FIND j=2171 line=
FIND j=2172 line= <a class="thumbnail" href=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin target=_blank>
FIND j=2173 line= <img class="drg" height=200 src=/tl/imgs/tn/tn_jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0>
FIND j=2174 line= <span><img class="drg" height=800 src=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0></span>
FIND j=2175 line= </a>
FIND j=2176 line=
FIND j=2177 line= <a href=# v-on:click="showhide" class=thumbnail >
FIND j=2178 line= <img class="drg" v-on:click="showhide" height=200 src=/tl/imgs/construction_sawhorse.gif border=0>
FIND j=2179 line= <span><img class="drg" v-on:click="showhide" height=400 src=/tl/imgs/construction_sawhorse.gif border=0></span>
FIND j=2180 line= </a>
FIND j=2181 line=
FIND j=2182 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.jpg alt=jtf31_streetswing_sawhorse_n_speedbump=_blank>
FIND j=2183 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0>
FIND j=2184 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0></span>
FIND j=2185 line= </a>
FIND j=2186 line=
FIND j=2187 line= <a class="thumbnail" v-on:click="showhide" href=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0>
FIND j=2188 line= <img class="drg" v-on:click="showhide" height=200 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
FIND j=2189 line= <span><img class="drg" v-on:click="showhide" height=400 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0></span>
FIND j=2190 line= </a>
FIND j=2191 line=
FIND j=2192 line=
FIND j=2193 line=
FIND j=2194 line= <br><br>
FIND j=2195 line= <hr color=red>
FIND j=2196 line= <hr color=white>
FIND j=2197 line= <hr color=blue>
FIND j=2198 line= <h2 v-on:click="showhide" >== jtfdc OPEN BORDER problem ==</h2>
FIND j=2199 line= !! NO wall !! NO sawhorse !! NO tape !! NO chalk !!
FIND j=2200 line= <br>
FIND j=2201 line= !! NO EAGLES - OUR NO EAGLES !!
FIND j=2202 line=
FIND j=2203 line= <h1>
FIND j=2204 line= <a href=/imgs/links_201901/great_wall_of_china_1870.jpg class="thumbnail_not" target=_blank>
FIND j=2205 line= <img src=/imgs/links_201901/tn/tn_great_wall_of_china_1870.png border=0>
FIND j=2206 line= </a>
FIND j=2207 line= <a href=https://www.youtube.com/watch?v=OfCS1yXg8gk class="thumbnail_not" target=_blank>
FIND j=2208 line= <img src=/imgs/links_201901/tn/tn_youb_across_the_border.png border=0>
FIND j=2209 line= </a>
FIND j=2210 line=
FIND j=2211 line= <a href=/imgs/links/Image332.png class="thumbnail_not" target=_blank>
FIND j=2212 line= <img src=/imgs/links/tn/tn_Image332.png border=0>
FIND j=2213 line=<!-- <span><img src=/imgs/links/Image332.png border=0></span> -- >
FIND j=2214 line= </a>
FIND j=2215 line=
FIND j=2216 line=
FIND j=2217 line=
FIND j=2218 line=<!--
FIND j=2219 line= <a href=https://https://www.youtube.com/watch?v=Gj3UdRmhgvM&start_radio=1&list=RDGj3UdRmhgvM class="thumbnail_not" target=_blank>
FIND j=2220 line= <img src=/imgs/links_201901/tn/tn_youb_dark_end_ofthe_street.png border=0>
FIND j=2221 line= </a>
FIND j=2222 line= -->
FIND j=2223 line=<!-- -->
FIND j=2224 line= <br>
FIND j=2225 line=
FIND j=2226 line=
FIND j=2227 line= <a href=https://en.wikipedia.org/wiki/Moat class="thumbnail_not" target=_blank>
FIND j=2228 line= <img src=/imgs/links_201901/tn/tn_Vellorefort.png border=0>
FIND j=2229 line= </a>
FIND j=2230 line=
FIND j=2231 line= - ?? moat ?? -
FIND j=2232 line= <a href=https://upload.wikimedia.org/wikipedia/commons/0/00/Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.JPG class="thumbnail_not" target=_blank>
FIND j=2233 line= <img src=/imgs/links_201901/tn/tn_Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.png border=0></span>
FIND j=2234 line= </a>
FIND j=2235 line= </h1>
FIND j=2236 line= <br>
FIND j=2237 line= <a href=https://en.wikipedia.org/wiki/American_Gothic class="thumbnail_not" target=_blank>
FIND j=2238 line= <img src=/imgs/links_201901/tn/tn_Grant_Wood_-_American_Gothic_-_Google_Art_Project.png border=0>
FIND j=2239 line= </a>
FIND j=2240 line=
FIND j=2241 line= <hr color=blue>
FIND j=2242 line= <hr color=white>
FIND j=2243 line= <hr color=red>
FIND j=2244 line=
FIND j=2245 line=
FIND j=2246 line=
FIND j=2247 line=
FIND j=2248 line=
FIND j=2249 line=
FIND j=2250 line=
FIND j=2251 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5320_jtfdc_eagle_n.JPG alt=jtfdc_eagle_n target=_blank>
FIND j=2252 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0>
FIND j=2253 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0></span>
FIND j=2254 line= </a>
FIND j=2255 line=
FIND j=2256 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.jpg alt=jtfdc_original_notresspassing_willprosecuted target=_blank>
FIND j=2257 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0>
FIND j=2258 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0></span>
FIND j=2259 line= </a>
FIND j=2260 line=
FIND j=2261 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5704_jtfdc_eagle_s.JPG alt=jtfdc_eagle_s target=_blank>
FIND j=2262 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0>
FIND j=2263 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0></span>
FIND j=2264 line= </a>
FIND j=2265 line=
FIND j=2266 line= <a href=# class=thumbnail>
FIND j=2267 line= <img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
FIND j=2268 line= <span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
FIND j=2269 line= </a>
FIND j=2270 line=
FIND j=2271 line= <a class="thumbnail" href="mailto:adminihe@ko0.us?subject=adminihe_what?">
FIND j=2272 line= <img height=50 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0>
FIND j=2273 line= <span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0></span>
FIND j=2274 line= </a>
FIND j=2275 line=
FIND j=2276 line= <a href=# class=thumbnail>
FIND j=2277 line= <img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" >
FIND j=2278 line= <span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
FIND j=2279 line= </a>
FIND j=2280 line= <a class="thumbnail" href="mailto:adminishe@ko0.us?subject=adminishe_what?">
FIND j=2281 line= <img class="drg" height=50 src="/imgs/links/email.gif" alt="adminiwii_what" border=0>
FIND j=2282 line= <span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminiwii_what" border=0></span>
FIND j=2283 line= </a>
FIND j=2284 line=
FIND j=2285 line=<br><br><br>
FIND j=2286 line= <div id="drag">
FIND j=2287 line= <div class="drg">
FIND j=2288 line= <h3>us_med_rechtin</h3>
FIND j=2289 line= <a class="thumbnail" href=/us/med/rechtin target=_blank>
FIND j=2290 line= <img height=200 src=/imgs/us/tn/tn_med_rechtin.png border=0>
FIND j=2291 line= <span><img height=400 src=/imgs/us/med_rechtin.png border=0></span>
FIND j=2292 line= </a>
FIND j=2293 line= </div>
FIND j=2294 line= </div>
FIND j=2295 line=<br><br><br>
FIND j=2296 line=<br><br><br>
FIND j=2297 line= <div id="drag" >
FIND j=2298 line= <div class="drg" >
FIND j=2299 line= <h3>jtfdc_defford_courtreport</h3>
FIND j=2300 line= <a class="thumbnail" href=/imgs/links/jtfdc_defford_courtreport.jpg target=_blank>
FIND j=2301 line= <img height=200 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0>
FIND j=2302 line= <span><img height=400 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0></span>
FIND j=2303 line= </a>
FIND j=2304 line= </div>
FIND j=2305 line= </div>
FIND j=2306 line=
FIND j=2307 line=
FIND j=2308 line=
FIND j=2309 line=
FIND j=2310 line=
FIND j=2311 line=
FIND j=2312 line=
FIND j=2313 line=
FIND j=2314 line=
FIND j=2315 line=<hr color=yellow>
FIND j=2316 line=
FIND j=2317 line= <a href="index_tl.html" class="thumbnail" target=_blank>
FIND j=2318 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
FIND j=2319 line= <span><img src="/imgs/links/index_tl.png" alt="tl" width="300px" height="200px" border="0"></span>
FIND j=2320 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="tl" width="200px" height="150px" border="0"></span> -->
FIND j=2321 line= </a>
FIND j=2322 line=
FIND j=2323 line= <a class="thumbnail" href="index_sl.html" target=_blank>
FIND j=2324 line= <img src="/imgs/btn/koeyeb.png" alt="sl" width="200px" height="100px" border="0">
FIND j=2325 line= <span><img src="/imgs/links/index_sl.png" alt="sl" width="400px" height="300px" border="0"></span>
FIND j=2326 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="sl" width="200px" height="150px" border="0"></span> -->
FIND j=2327 line= </a>
FIND j=2328 line=
FIND j=2329 line= <a class="thumbnail" href="sl/index_slv.html" target=_blank>
FIND j=2330 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
FIND j=2331 line= <span><img src="/imgs/links/index_slv.jpg" alt="slv" width="400px" height=300px" border="0"></span>
FIND j=2332 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="slv" width="200px" height=150px" border="0"></span> -->
FIND j=2333 line= </a>
FIND j=2334 line=
FIND j=2335 line= <a class="thumbnail" href="index_pn.html" target=_blank>
FIND j=2336 line= <img src="/imgs/btn/koeyeb.png" alt="pn" width="200px" height="100px" border="0">
FIND j=2337 line= <span><img src="/imgs/links/index_pn.jpg" alt="pn" width="400px" height="300px" border="0"></span>
FIND j=2338 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="pn" width="200px" height="150px" border="0"></span> -->
FIND j=2339 line= </a>
FIND j=2340 line=
FIND j=2341 line= <a class="thumbnail" href="index_zm.html" target=_blank>
FIND j=2342 line= <img src="/imgs/btn/koeyew.png" alt="zm" width="200px" height="100px" border="0">
FIND j=2343 line= <span><img src="/imgs/links/index_zm.png" alt="zm" width="400px" height="300px" border="0"></span>
FIND j=2344 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="zm" width="200px" height="150px" border="0"></span> -->
FIND j=2345 line= </a>
FIND j=2346 line=
FIND j=2347 line= <a class="thumbnail" href="index_dd.html" target=_blank>
FIND j=2348 line= <img src="/imgs/btn/koeyeb.png" alt="dd" width="200px" height="100px" border="0">
FIND j=2349 line= <span><img src="/imgs/links/index_dd.jpg" alt="dd" width="400px" height="300px" border="0"></span>
FIND j=2350 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="dd" width="200px" height="150px" border="0"></span> -->
FIND j=2351 line= </a>
FIND j=2352 line=
FIND j=2353 line= <a class="thumbnail" href="index_av.html" target=_blank>
FIND j=2354 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
FIND j=2355 line= <span><img src="/imgs/links/index_av.jpg" alt="av" width="400px" height="300px" border="0"></span>
FIND j=2356 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="av" width="200px" height="150px" border="0"></span> -->
FIND j=2357 line= </a>
FIND j=2358 line=
FIND j=2359 line=
FIND j=2360 line= <a class="thumbnail" href="index_vu.html" target=_blank>
FIND j=2361 line= <img src="/imgs/btn/koeyeb.png" alt="vu" width="200px" height="100px" border="0">
FIND j=2362 line= <span><img src="/imgs/links/index_vu.jpg" alt="vu" width="400px" height="300px" border="0"></span>
FIND j=2363 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="vu" width="200px" height="150px" border="0"></span> -->
FIND j=2364 line= </a>
FIND j=2365 line=
FIND j=2366 line=
FIND j=2367 line=
FIND j=2368 line=
FIND j=2369 line=
FIND j=2370 line=
FIND j=2371 line=
FIND j=2372 line= <hr color=red>
FIND j=2373 line= <hr color=white>
FIND j=2374 line=
FIND j=2375 line=
FIND j=2376 line=
FIND j=2377 line=
FIND j=2378 line=
FIND j=2379 line=
FIND j=2380 line=
FIND j=2381 line=<!--
FIND j=2382 line=
FIND j=2383 line= <img v-on:click="showhidr" src="/tl/imgs/jtfdc_private_court_since_1979_viewin.png">
FIND j=2384 line= <img v-on:click="showhide" src="/heart/heart.gif" alt="koeye.png" border=0>
FIND j=2385 line= <span><img v-on:click="showhide" src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
FIND j=2386 line= <img v-on:click="showhide" src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
FIND j=2387 line= <button v-on:click="showhide">showhide</button>
FIND j=2388 line= <button v-on:click="showhide">yokkmokk</button>
FIND j=2389 line= -->
FIND j=2390 line=
FIND j=2391 line=
FIND j=2392 line= <hr>
FIND j=2393 line= </div>
FIND j=2394 line=
FIND j=2395 line= <div v-show="collapsed" class="detail">
FIND j=2396 line= jaokim kopernicus wundersteine ii
FIND j=2397 line=
FIND j=2398 line= <hr>
FIND j=2399 line= <a class="thumbnail" href=https://meet.jit.si/ko target=_blank>
FIND j=2400 line= <img src=/imgs/links/tn/tn_meet_jkwii.png border=0>
FIND j=2401 line= <span><img src=/imgs/links/meet_jkwii.png border=0></span>
FIND j=2402 line= </a>
FIND j=2403 line= <a class="thumbnail" href=./?q=jkwii4trustee target=_blank>
FIND j=2404 line= <img src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
FIND j=2405 line= <span><img src=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0></span>
FIND j=2406 line= </a>
FIND j=2407 line=
FIND j=2408 line= <a class="thumbnail" href="/?q=unclesam">
FIND j=2409 line= <img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
FIND j=2410 line= <span> <img height=400 width=220 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
FIND j=2411 line= </a>
FIND j=2412 line=
FIND j=2413 line=
FIND j=2414 line= <a class="thumbnail" href=/ko_jtf/zm/jtf_parcels/jtfdc_012.html target=_blank>
FIND j=2415 line= <img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
FIND j=2416 line= <span> <img height=400 width=220 src="/tn_snap_20170123_110294.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
FIND j=2417 line= </a>
FIND j=2418 line=<!-- -->
FIND j=2419 line= <a class="thumbnail" href="/?q=columgia">
FIND j=2420 line= <img src="/imgs/btn/koeyew.png" alt="koeyew.png" width="200px" height="80" border="0" >
FIND j=2421 line= <span> <img height=400 width=220 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
FIND j=2422 line= </a>
FIND j=2423 line= <a class="popover" href=./?q=handhither target=_blank>
FIND j=2424 line= <img src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
FIND j=2425 line= <span><img src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
FIND j=2426 line= </a>
FIND j=2427 line=
FIND j=2428 line=<!--
FIND j=2429 line= <h1>link_kludge</h1>
FIND j=2430 line= <div id="link_kludge" >
FIND j=2431 line= <a class="thumbnail" href="/?q=tn1">
FIND j=2432 line= <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0">
FIND j=2433 line= <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
FIND j=2434 line=
FIND j=2435 line= <a class="thumbnail" href="/?q=tn2">
FIND j=2436 line= <img src="/imgs/btn/koeyew.png" alt="ok" width="50px" height="25px" border="0">
FIND j=2437 line= <span><img src="/imgs/globes/globedragon.png" alt="globedragon"></span></a>
FIND j=2438 line=
FIND j=2439 line= <a class="thumbnail" href="/?q=tn2">
FIND j=2440 line= <img src="/imgs/btn/koeyeb.png" alt="ok" width="50px" height="25px" border="0">
FIND j=2441 line= <span><img src="/imgs/globes/globewrap.png" alt="globewrap"></span></a>
FIND j=2442 line=
FIND j=2443 line= <h1>overview</h1>
FIND j=2444 line= <a class="thumbnail" href="/?q=overview"> <img src="/tl/imgs/tn/tn_construction_lights.gif" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/construction_lights.gif" alt="construction_lights"></span></a>
FIND j=2445 line= <a class="thumbnail" href="/?q=ein_hundes_leben"> <img src="/tl/imgs/tn/tn_index_book-ein_hundes_leben.png" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/index_book-ein_hundes_leben.gif" alt="construction_lights"></span></a>
FIND j=2446 line= <a class="thumbnail" href="/?q=deffords_charm"> <img src="/tl/imgs/tn/tn_tl_jtf28_jd.jpg" alt="deffords_charm" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_jtf28_jd.png" alt="deffords_charm"></span></a>
FIND j=2447 line= <a class="thumbnail" href="/?q=jtf29_jak3busstop"> <img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop"></span></a>
FIND j=2448 line= <a class="thumbnail" href="/?q=jtf29_pre_jtf31"> <img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31"></span></a>
FIND j=2449 line= <a class="thumbnail" href="/?q=jtf29_private_court_since_1979_viewin"> <img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin"></span></a>
FIND j=2450 line= <a class="thumbnail" href="/?q=jtfinc"> <img src="/tl/imgs/jtfinc.png" alt="jtfinc" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtfinc.png" alt="jtfinc"></span></a>
FIND j=2451 line= <a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
FIND j=2452 line= <a class="thumbnail" href="/?q=tl_kassil_walter_mil"> <img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter_mil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter"></span></a>
FIND j=2453 line= <a class="thumbnail" href="/?q=tl_kassil_walter"> <img src="/tl/imgs/tl_kassil_mil.png" alt="tl_kassil_walter" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter.png" alt="tl_kassil_walter"></span></a>
FIND j=2454 line= <a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
FIND j=2455 line= <a class="thumbnail" href="/?q=tl_konet_text"> <img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text"></span></a>
FIND j=2456 line= <a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
FIND j=2457 line= <a class="thumbnail" href="/?q=iperms_hub"> <img src="/tl/imgs/img575.png" alt="iperms_hub" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms_hub.png" alt="iperms_hub"></span></a>
FIND j=2458 line= <a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
FIND j=2459 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot"></span></a>
FIND j=2460 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones"></span></a>
FIND j=2461 line= <a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye"></span></a>
FIND j=2462 line= <a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc"></span></a>
FIND j=2463 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief"></span></a>
FIND j=2464 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
FIND j=2465 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
FIND j=2466 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
FIND j=2467 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
FIND j=2468 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
FIND j=2469 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0"> <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
FIND j=2470 line= </div>
FIND j=2471 line= -->
FIND j=2472 line=
FIND j=2473 line= </div>
FIND j=2474 line= </div>
FIND j=2475 line=
FIND j=2476 line= <script id="script_new_vue">
FIND j=2477 line= var app = new Vue({ el: "#app_jkwii",
FIND j=2478 line= data: {
FIND j=2479 line= collapsed: false
FIND j=2480 line= },
FIND j=2481 line= methods: {
FIND j=2482 line= showhide: function() {
FIND j=2483 line= if (!this.collapsed)
FIND j=2484 line= this.collapsed = true;
FIND j=2485 line= else
FIND j=2486 line= this.collapsed = false;
FIND j=2487 line= }
FIND j=2488 line= }
FIND j=2489 line= });
FIND j=2490 line= </script id="script_new_vue">
FIND j=2491 line=
FIND j=2492 line=<!-- jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj -->
FIND j=2493 line=
FIND j=2494 line= <script id="script_resize" >
FIND j=2495 line= document.body.style.fontfamily = "arial";
FIND j=2496 line= function resizeText(multiplier) {
FIND j=2497 line= if (document.body.style.fontSize == "") {
FIND j=2498 line= document.body.style.fontSize = "1.0em";
FIND j=2499 line= }
FIND j=2500 line= document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
FIND j=2501 line= }
FIND j=2502 line= function refontText(multiplier) {
FIND j=2503 line= if (document.body.style.fontSize == "") {
FIND j=2504 line= document.body.style.fontSize = "2.0em";
FIND j=2505 line= }
FIND j=2506 line= document.body.style.font = "yokkmokkOT";
FIND j=2507 line= }
FIND j=2508 line= </script id="script_resize">
FIND j=2509 line=<!--
FIND j=2510 line= <img id="plustext" alt="Increase text size" height=50 src="/imgs/btn/kob.png" onclick="resizeText(1)" />
FIND j=2511 line= < >
FIND j=2512 line= <img id="minustext" alt="Decrease text size" height=50 src="/imgs/btn/kow.png" onclick="resizeText(-1)" />
FIND j=2513 line= <img id="plusfont" alt="fontup" height=50 src="/imgs/btn/kob.png" onclick="refontText(1)" />
FIND j=2514 line= < >
FIND j=2515 line= <img id="minusfont" alt="fontdown" height=50 src="/imgs/btn/kow.png" onclick="refontText(-1)" />
FIND j=2516 line= -->
FIND j=2517 line= <hr>
FIND j=2518 line= <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:48pt; font-style:italic" >
FIND j=2519 line= abcdefghijklmnopqrstuvwxyz <br>
FIND j=2520 line= ABCDEFGHIJKLMNOPQRSTUVWXYZ <br>
FIND j=2521 line= 01234567890
FIND j=2522 line= </font></span>
FIND j=2523 line= <hr>
FIND j=2524 line=
FIND j=2525 line=<!-- <button type="kogrids" id="kogrids" onclick="kogrids('')">-= kogrids =-</button> -->
FIND j=2526 line= <div id="div_kogrids"></div>
FIND j=2527 line=
FIND j=2528 line=
FIND j=2529 line=<!--
FIND j=2530 line= <div id="kov">
FIND j=2531 line= <div>
FIND j=2532 line= kov is it: kov
FIND j=2533 line= </div>
FIND j=2534 line= <button v-on:click="showhide_kov">showhide_kov</button>
FIND j=2535 line= <img v-on:click="showhide_kov1" src="/imgs/btn/kob.png" >
FIND j=2536 line= <img v-on:click="showhide_kov" src="/imgs/btn/koeye.png" >
FIND j=2537 line= <img v-on:click="showhide_kov2" src="/imgs/btn/kow.png" >
FIND j=2538 line=
FIND j=2539 line= <div v-show="collapsed" class="detail">
FIND j=2540 line= kov detail
FIND j=2541 line= <hr>
FIND j=2542 line= <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
FIND j=2543 line= <img src=/imgs/links/tn/tn_meet.png border=0>
FIND j=2544 line= <span><img src=/imgs/links/meet.png border=0></span>
FIND j=2545 line= </a>
FIND j=2546 line= <hr>
FIND j=2547 line= </div>
FIND j=2548 line= </div>
FIND j=2549 line= <script id="script_new_vue_kov">
FIND j=2550 line= var kov = new Vue({ el: "#kov",
FIND j=2551 line= data: {collapsed: false},
FIND j=2552 line= methods: {
FIND j=2553 line= showhide_kov: function() {
FIND j=2554 line= if (!this.collapsed) this.collapsed = true;
FIND j=2555 line= else this.collapsed = false;
FIND j=2556 line=// document.body.style.background = "darkslategrey";
FIND j=2557 line=// document.body.style.color = "black";
FIND j=2558 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=2559 line=// document.body.style.fontsize = "24pt";
FIND j=2560 line= },
FIND j=2561 line= showhide_kov1: function() {
FIND j=2562 line= if (!this.collapsed) this.collapsed = true;
FIND j=2563 line= else this.collapsed = false;
FIND j=2564 line= },
FIND j=2565 line= showhide_kov2: function() {
FIND j=2566 line= if (!this.collapsed) this.collapsed = true;
FIND j=2567 line= else this.collapsed = false;
FIND j=2568 line= }
FIND j=2569 line= }
FIND j=2570 line= });
FIND j=2571 line= </script id="script_new_vue_kov">
FIND j=2572 line=
FIND j=2573 line= <hr>
FIND j=2574 line=abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 01234567890
FIND j=2575 line= <hr>
FIND j=2576 line= -->
FIND j=2577 line=
FIND j=2578 line=
FIND j=2579 line= <div id="kov_ko">
FIND j=2580 line= <div>
FIND j=2581 line= ko: kov_ko
FIND j=2582 line= </div>
FIND j=2583 line= <button v-on:click="showhide_kov_ko">showhide_kov_ko</button>
FIND j=2584 line= <img v-on:click="showhide_kov_ko1" src="/imgs/btn/kob.png" >
FIND j=2585 line= <img v-on:click="showhide_kov_ko" src="/imgs/btn/koeye.png" >
FIND j=2586 line= <img v-on:click="showhide_kov_ko2" src="/imgs/btn/kow.png" >
FIND j=2587 line=
FIND j=2588 line= <div v-show="collapsed" class="detail_ko">
FIND j=2589 line= ko
FIND j=2590 line= <hr>
FIND j=2591 line= <a href=kov_ko.html class="thumbnail" target=_blank>
FIND j=2592 line= <img src=/imgs/kov/tn/tn_kov_ko.png border=0>
FIND j=2593 line= <span><img src=/imgs/kov/tn/tn_kov_ko.png border=0></span>
FIND j=2594 line= </a>
FIND j=2595 line= <hr>
FIND j=2596 line=
FIND j=2597 line=
FIND j=2598 line=
FIND j=2599 line= <div id="drag" >
FIND j=2600 line= <a class="popover" href="/?q=bigtn_drag1">
FIND j=2601 line= <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
FIND j=2602 line= <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
FIND j=2603 line= </a>
FIND j=2604 line= </div>
FIND j=2605 line=
FIND j=2606 line=
FIND j=2607 line=
FIND j=2608 line=<!--
FIND j=2609 line= <div id="drop">
FIND j=2610 line= <span id="sw"><h1>droptop</h2></span>
FIND j=2611 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
FIND j=2612 line= <img height=200 width=300
FIND j=2613 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
FIND j=2614 line= </a>
FIND j=2615 line= </div>
FIND j=2616 line= -->
FIND j=2617 line=
FIND j=2618 line=
FIND j=2619 line=
FIND j=2620 line= </div>
FIND j=2621 line= </div>
FIND j=2622 line=
FIND j=2623 line=
FIND j=2624 line=
FIND j=2625 line= <div id="div_showhide" hidden>
FIND j=2626 line= <button type="button" id="show">Show Content</button>
FIND j=2627 line= <button type="button" id="hide">Hide Content</button>
FIND j=2628 line= <button type="show_dd" id="show_dd">Show_dd</button>
FIND j=2629 line= <button type="hide_dd" id="hide_dd">Hide_dd</button>
FIND j=2630 line= <button type="show_bb" id="show_bb">Show_bb</button>
FIND j=2631 line= <button type="hide_bb" id="hide_bb">Hide_bb</button>
FIND j=2632 line= <button type="show_tl" id="show_tl">Show_tl</button>
FIND j=2633 line= <button type="hide_tl" id="hide_tl">Hide_tl</button>
FIND j=2634 line= <button type="show_colors" id="show_colors">Show_colors</button>
FIND j=2635 line= <button type="hide_colors" id="hide_colors">Hide_colors</button>
FIND j=2636 line= <button type="show_fonts" id="show_fonts">Show_fonts</button>
FIND j=2637 line= <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
FIND j=2638 line= <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
FIND j=2639 line= <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
FIND j=2640 line= </div>
FIND j=2641 line=
FIND j=2642 line= <div id="item" hidden>
FIND j=2643 line= <hr><h1>div_showhide</h1><hr>
FIND j=2644 line= </div>
FIND j=2645 line=
FIND j=2646 line= <script id="script_showhide">
FIND j=2647 line= $( "#show" ).click(function() {$('#item').show(); });
FIND j=2648 line= $( "#hide" ).click(function() {$('#item').hide();});
FIND j=2649 line= $( "#show_dd" ).click(function() {$('#div_dd').show(); });
FIND j=2650 line= $( "#hide_dd" ).click(function() {$('#div_dd').hide();});
FIND j=2651 line= $( "#show_bb" ).click(function() {$('#div_bb').show(); });
FIND j=2652 line= $( "#hide_bb" ).click(function() {$('#div_bb').hide();});
FIND j=2653 line= $( "#show_tl" ).click(function() {$('#div_tl').show(); });
FIND j=2654 line= $( "#hide_tl" ).click(function() {$('#div_tl').hide();});
FIND j=2655 line= $( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
FIND j=2656 line= $( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
FIND j=2657 line= $( "#show_colors" ).click(function() {$('#div_colors').show(); });
FIND j=2658 line= $( "#hide_colors" ).click(function() {$('#div_colors').hide();});
FIND j=2659 line= $( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
FIND j=2660 line= $( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
FIND j=2661 line= $( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
FIND j=2662 line= $( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
FIND j=2663 line= </script id="script_showhide">
FIND j=2664 line=
FIND j=2665 line=
FIND j=2666 line= </div>
FIND j=2667 line= </div>
FIND j=2668 line= </div>
FIND j=2669 line=
FIND j=2670 line= <script id="script_kov_ko" >
FIND j=2671 line= var kov_ko = new Vue({ el: "#kov_ko",
FIND j=2672 line= data: {collapsed: false},
FIND j=2673 line= methods: {
FIND j=2674 line= showhide_kov_ko: function() {
FIND j=2675 line= if (!this.collapsed) this.collapsed = true;
FIND j=2676 line= else this.collapsed = false;
FIND j=2677 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
FIND j=2678 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=2679 line=
FIND j=2680 line= },
FIND j=2681 line= showhide_kov_ko1: function() {
FIND j=2682 line= if (!this.collapsed) this.collapsed = true;
FIND j=2683 line= else this.collapsed = false;
FIND j=2684 line= },
FIND j=2685 line= showhide_kov_ko2: function() {
FIND j=2686 line= if (!this.collapsed) this.collapsed = true;
FIND j=2687 line= else this.collapsed = false;
FIND j=2688 line= }
FIND j=2689 line= }
FIND j=2690 line= });
FIND j=2691 line= </script id="script_kov_ko" >
FIND j=2692 line=
FIND j=2693 line=
FIND j=2694 line=
FIND j=2695 line=
FIND j=2696 line=
FIND j=2697 line=
FIND j=2698 line= <div id="kov_new">
FIND j=2699 line= <div>
FIND j=2700 line= new: kov_new
FIND j=2701 line= </div>
FIND j=2702 line= <button v-on:click="showhide_kov_new">showhide_kov_new</button>
FIND j=2703 line= <img v-on:click="showhide_kov_new" src="/imgs/btn/koeye.png" >
FIND j=2704 line= <img v-on:click="showhide_kov_new1" src="/imgs/btn/kob.png" >
FIND j=2705 line= <img v-on:click="showhide_kov_new2" src="/imgs/btn/kow.png" >
FIND j=2706 line=
FIND j=2707 line= <div v-show="collapsed" class="detail_new">
FIND j=2708 line= new
FIND j=2709 line= <hr>
FIND j=2710 line= <a href=https://meet.jit.si/new class="thumbnail" target=_blank>
FIND j=2711 line= <img src=/imgs/links/tn/tn_meet_new.png border=0>
FIND j=2712 line= <span><img src=/imgs/links/tn/tn_meet_new.png border=0></span>
FIND j=2713 line= </a>
FIND j=2714 line=
FIND j=2715 line=
FIND j=2716 line= <hr color=yellow>
FIND j=2717 line= <h1>atwist_page</h1>
FIND j=2718 line= <div id="container" class="">
FIND j=2719 line= <div class="box"></div>
FIND j=2720 line= <div class="box-back"></div>
FIND j=2721 line= </div>
FIND j=2722 line=
FIND j=2723 line=
FIND j=2724 line= <button id="animate" class="kogo">kogo</button>
FIND j=2725 line= <script id="script_atwist_page">
FIND j=2726 line= var goButton = document.getElementById("animate");
FIND j=2727 line= var container = document.getElementById("container");
FIND j=2728 line= goButton.addEventListener('click', function() {
FIND j=2729 line= container.classList.toggle('active');
FIND j=2730 line= });
FIND j=2731 line= </script id="script_atwist_page">
FIND j=2732 line=
FIND j=2733 line= <hr color=yellow>
FIND j=2734 line=
FIND j=2735 line=
FIND j=2736 line=
FIND j=2737 line=
FIND j=2738 line=
FIND j=2739 line=<a id="drag" class="thumbnail" href="/index_zm.html?zmid=zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility" target=_blank>
FIND j=2740 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility/TileGroup0/0-0-0.jpg" border=0>
FIND j=2741 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_donovanlaw_containment_facility.png" border=0></span>
FIND j=2742 line= </a>
FIND j=2743 line=
FIND j=2744 line=<a id="drag" class="thumbnail" href="/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus" target=_blank>
FIND j=2745 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus/TileGroup0/0-0-0.jpg" border=0>
FIND j=2746 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_byrdpuckers_dogpony_campus.png" border=0></span>
FIND j=2747 line= </a>
FIND j=2748 line=
FIND j=2749 line=<a id="drag" class="popover" href=/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_kou_campus target=_blank>
FIND j=2750 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_kou_campus/TileGroup0/0-0-0.jpg" border=0>
FIND j=2751 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_kou_campus.png" border=0></span>
FIND j=2752 line= </a>
FIND j=2753 line=
FIND j=2754 line=<img src="/imgs/links/eyes_023.gif">
FIND j=2755 line=
FIND j=2756 line=
FIND j=2757 line=
FIND j=2758 line=
FIND j=2759 line=
FIND j=2760 line= </div>
FIND j=2761 line= </div>
FIND j=2762 line=
FIND j=2763 line= <script id="script_kov_new">
FIND j=2764 line= var kov_new = new Vue({ el: "#kov_new",
FIND j=2765 line= data: {collapsed: false},
FIND j=2766 line= methods: {
FIND j=2767 line= showhide_kov_new: function() {
FIND j=2768 line= if (!this.collapsed) this.collapsed = true;
FIND j=2769 line= else this.collapsed = false;
FIND j=2770 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
FIND j=2771 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=2772 line=
FIND j=2773 line=// document.body.style.background = "darkslategrey";
FIND j=2774 line=// document.body.style.color = "black";
FIND j=2775 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=2776 line=// document.body.style.fontsize = "24pt";
FIND j=2777 line= },
FIND j=2778 line= showhide_kov_new1: function() {
FIND j=2779 line= if (!this.collapsed) this.collapsed = true;
FIND j=2780 line= else this.collapsed = false;
FIND j=2781 line= },
FIND j=2782 line= showhide_kov_new2: function() {
FIND j=2783 line= if (!this.collapsed) this.collapsed = true;
FIND j=2784 line= else this.collapsed = false;
FIND j=2785 line= }
FIND j=2786 line= }
FIND j=2787 line= });
FIND j=2788 line= </script id="script_kov_new">
FIND j=2789 line=
FIND j=2790 line=
FIND j=2791 line= <div id="div_kov_focus">
FIND j=2792 line= <div>
FIND j=2793 line= focus: kov_focus
FIND j=2794 line= </div>
FIND j=2795 line= <button v-on:click="showhide_kov_focus">showhide_kov_focus</button>
FIND j=2796 line= <img v-on:click="showhide_kov_focus" src="/imgs/btn/koeye.png" >
FIND j=2797 line= <img v-on:click="showhide_kov_focus1" src="/imgs/btn/kob.png" >
FIND j=2798 line= <img v-on:click="showhide_kov_focus2" src="/imgs/btn/kow.png" >
FIND j=2799 line=
FIND j=2800 line= <div v-show="collapsed" class="detail_focus">
FIND j=2801 line= focus2
FIND j=2802 line= <hr>
FIND j=2803 line= <a href=https://meet.jit.si/focus class="thumbnail" target=_blank>
FIND j=2804 line= <img height=200 src=/imgs/links/tn/tn_meet.png border=0>
FIND j=2805 line= <span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
FIND j=2806 line= </a>
FIND j=2807 line= <hr>
FIND j=2808 line=
FIND j=2809 line= <a href=/imgs/links/warning_light.gif id="drag" target=_blank>
FIND j=2810 line= <img class="drg" height=200 src=/imgs/links/warning_light.gif border=0>
FIND j=2811 line= </a>
FIND j=2812 line=
FIND j=2813 line= <div id="drag">
FIND j=2814 line= <div class="drg">
FIND j=2815 line= <h3>preview_deck_rocksoup</h3>
FIND j=2816 line= <div id="div_deck_rocksoup">
FIND j=2817 line= <a class="popover" href=http://ka12/index_dk.html#rocksoup alt=index_dk_rocksoup target=_blank>
FIND j=2818 line= <img width=200 height=200 src=imgs/links/rocksoup_rock.png alt=rocksoup_rock border=0>
FIND j=2819 line= <span><img width=200 height=200 src=/imgs/links/rocksoup_pot.png alt=rocksoup_pot border=0></span>
FIND j=2820 line= </a>
FIND j=2821 line= </div>
FIND j=2822 line= </div>
FIND j=2823 line= </div>
FIND j=2824 line=
FIND j=2825 line=
FIND j=2826 line=
FIND j=2827 line= <a id="drag" class="thumbnail" href="svc/emchat/index.html" target=_blank>
FIND j=2828 line= <img class="drg" src="/imgs/links/links_emchat.png" border=0>
FIND j=2829 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_emchat.png" border=0></span>
FIND j=2830 line= </a>
FIND j=2831 line=
FIND j=2832 line= <a id="drag" class="thumbnail" href="svc/ol/ht/index.html" target=_blank>
FIND j=2833 line= <img class="drg" src="/imgs/links/links_ol.png" border=0>
FIND j=2834 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_ol.png" border=0></span>
FIND j=2835 line= </a>
FIND j=2836 line=
FIND j=2837 line=<!--
FIND j=2838 line= <button type="button" onclick="script_ajax()">ajax</button>
FIND j=2839 line= <img src="/imgs/btn/koeye_handhi.gif" onclick="script_ajax()">
FIND j=2840 line= <div id="div_ajaxdb"><h2>div_ajaxdb</h2></div>
FIND j=2841 line= -->
FIND j=2842 line=
FIND j=2843 line= </div>
FIND j=2844 line= </div id="div_kov_focus">
FIND j=2845 line=
FIND j=2846 line= <script id="script_kov_focus" >
FIND j=2847 line= var kov_focus = new Vue({ el: "#kov_focus",
FIND j=2848 line= data: {collapsed: false},
FIND j=2849 line= methods: {
FIND j=2850 line= showhide_kov_focus: function() {
FIND j=2851 line= if (!this.collapsed) this.collapsed = true;
FIND j=2852 line= else this.collapsed = false;
FIND j=2853 line= document.getElementById("kov_focus").style.font = "italic bold 20px arial,serif";
FIND j=2854 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=2855 line=
FIND j=2856 line=// document.body.style.background = "darkslategrey";
FIND j=2857 line=// document.body.style.color = "black";
FIND j=2858 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=2859 line=// document.body.style.fontsize = "24pt";
FIND j=2860 line= },
FIND j=2861 line= showhide_kov_focus1: function() {
FIND j=2862 line= if (!this.collapsed) this.collapsed = true;
FIND j=2863 line= else this.collapsed = false;
FIND j=2864 line= },
FIND j=2865 line= showhide_kov_focus2: function() {
FIND j=2866 line= if (!this.collapsed) this.collapsed = true;
FIND j=2867 line= else this.collapsed = false;
FIND j=2868 line= }
FIND j=2869 line= }
FIND j=2870 line= });
FIND j=2871 line= </script id="script_kov_focus" >
FIND j=2872 line=
FIND j=2873 line=
FIND j=2874 line=
FIND j=2875 line=
FIND j=2876 line=
FIND j=2877 line= <div id="kov_food">
FIND j=2878 line= <div>
FIND j=2879 line= kov_food:
FIND j=2880 line= </div>
FIND j=2881 line= <button v-on:click="showhide_kov_food">showhide_kov_food</button>
FIND j=2882 line= <img v-on:click="showhide_kov_food" src="/imgs/btn/koeye.png" >
FIND j=2883 line= <img v-on:click="showhide_kov_food1" src="/imgs/btn/kob.png" >
FIND j=2884 line= <img v-on:click="showhide_kov_food2" src="/imgs/btn/kow.png" >
FIND j=2885 line=
FIND j=2886 line= <div v-show="collapsed" class="detail_food">
FIND j=2887 line= kov_food
FIND j=2888 line= <div id="drag"> kov_food:<br />
FIND j=2889 line= <a href=kov_food.html class="thumbnail" target=_blank>
FIND j=2890 line= <img class="drg" src="/imgs/kov/tn/tn_kov_food.png" alt="kov_food" width="50" class="drg"/>
FIND j=2891 line= <span><img class="drg" src="/imgs/kov/kov_food.png" alt="kov_food" width="50" class="drg"/></span>
FIND j=2892 line= </a>
FIND j=2893 line= </div>
FIND j=2894 line=
FIND j=2895 line=
FIND j=2896 line= </div>
FIND j=2897 line= </div>
FIND j=2898 line=
FIND j=2899 line= <script>var kov_food = new Vue({ el: "#kov_food",
FIND j=2900 line= data: {collapsed: false},
FIND j=2901 line= methods: {
FIND j=2902 line= showhide_kov_food: function() {
FIND j=2903 line= if (!this.collapsed) this.collapsed = true;
FIND j=2904 line= else this.collapsed = false;
FIND j=2905 line= document.getElementById("kov_food").style.font = "italic bold 20px arial,serif";
FIND j=2906 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=2907 line=
FIND j=2908 line=// document.body.style.background = "darkslategrey";
FIND j=2909 line=// document.body.style.color = "black";
FIND j=2910 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=2911 line=// document.body.style.fontsize = "24pt";
FIND j=2912 line= },
FIND j=2913 line= showhide_kov_food1: function() {
FIND j=2914 line= if (!this.collapsed) this.collapsed = true;
FIND j=2915 line= else this.collapsed = false;
FIND j=2916 line= },
FIND j=2917 line= showhide_kov_food2: function() {
FIND j=2918 line= if (!this.collapsed) this.collapsed = true;
FIND j=2919 line= else this.collapsed = false;
FIND j=2920 line= }
FIND j=2921 line= }
FIND j=2922 line= });
FIND j=2923 line= </script>
FIND j=2924 line=
FIND j=2925 line=
FIND j=2926 line=
FIND j=2927 line=
FIND j=2928 line= <div id="kov_courtreport">
FIND j=2929 line= <div>
FIND j=2930 line= kov_courtreport:
FIND j=2931 line= </div>
FIND j=2932 line= <button v-on:click="showhide_kov_courtreport">showhide_kov_courtreport</button>
FIND j=2933 line= <img v-on:click="showhide_kov_courtreport" src="/imgs/btn/koeye.png" >
FIND j=2934 line= <img v-on:click="showhide_kov_courtreport1" src="/imgs/btn/kob.png" >
FIND j=2935 line= <img v-on:click="showhide_kov_courtreport2" src="/imgs/btn/kow.png" >
FIND j=2936 line=
FIND j=2937 line= <div v-show="collapsed" class="detail_courtreport">
FIND j=2938 line= kov_courtreport
FIND j=2939 line= <div id="drag"> kov_courtreport:<br />
FIND j=2940 line= <a href=kov_food.html class="thumbnail" target=_blank>
FIND j=2941 line= <img class="drg" src="/imgs/kov/tn/tn_kov_courtreport.png" alt="kov_food" width="50" class="drg"/>
FIND j=2942 line= <span><img class="drg" src="/imgs/kov/kov_courtreport.png" alt="kov_food" width="50" class="drg"/></span>
FIND j=2943 line= </a>
FIND j=2944 line= </div>
FIND j=2945 line=
FIND j=2946 line= </div>
FIND j=2947 line= </div>
FIND j=2948 line=
FIND j=2949 line= <script>var kov_courtreport = new Vue({ el: "#kov_courtreport",
FIND j=2950 line= data: {collapsed: false},
FIND j=2951 line= methods: {
FIND j=2952 line= showhide_kov_courtreport: function() {
FIND j=2953 line= if (!this.collapsed) this.collapsed = true;
FIND j=2954 line= else this.collapsed = false;
FIND j=2955 line= document.getElementById("kov_courtreport").style.font = "italic bold 20px arial,serif";
FIND j=2956 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=2957 line=
FIND j=2958 line=// document.body.style.background = "darkslategrey";
FIND j=2959 line=// document.body.style.color = "black";
FIND j=2960 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=2961 line=// document.body.style.fontsize = "24pt";
FIND j=2962 line= },
FIND j=2963 line= showhide_kov_courtreport1: function() {
FIND j=2964 line= if (!this.collapsed) this.collapsed = true;
FIND j=2965 line= else this.collapsed = false;
FIND j=2966 line= },
FIND j=2967 line= showhide_kov_courtreport2: function() {
FIND j=2968 line= if (!this.collapsed) this.collapsed = true;
FIND j=2969 line= else this.collapsed = false;
FIND j=2970 line= }
FIND j=2971 line= }
FIND j=2972 line= });
FIND j=2973 line= </script>
FIND j=2974 line=
FIND j=2975 line=
FIND j=2976 line=
FIND j=2977 line=
FIND j=2978 line= <div id="kov_where">
FIND j=2979 line= <div>
FIND j=2980 line= kov_where:
FIND j=2981 line= </div>
FIND j=2982 line= <button v-on:click="showhide_kov_where">showhide_kov_where</button>
FIND j=2983 line= <img v-on:click="showhide_kov_where" src="/imgs/btn/koeye.png" >
FIND j=2984 line= <img v-on:click="showhide_kov_where1" src="/imgs/btn/kob.png" >
FIND j=2985 line= <img v-on:click="showhide_kov_where2" src="/imgs/btn/kow.png" >
FIND j=2986 line=
FIND j=2987 line= <div v-show="collapsed" class="detail_where">
FIND j=2988 line=
FIND j=2989 line= where
FIND j=2990 line= <hr color=yellow>
FIND j=2991 line=
FIND j=2992 line= <a id="drag" class="thumbnail" href="/svc/ol/ht/index.html" target=_blank>
FIND j=2993 line= <img class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0>
FIND j=2994 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0></span>
FIND j=2995 line= </a>
FIND j=2996 line=
FIND j=2997 line=
FIND j=2998 line= <div id="div_gigapan" id="drag" >
FIND j=2999 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
FIND j=3000 line= <img class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
FIND j=3001 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
FIND j=3002 line= </a>
FIND j=3003 line=
FIND j=3004 line=
FIND j=3005 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com" target=_blank>
FIND j=3006 line= <img height=200 class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0>
FIND j=3007 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0></span>
FIND j=3008 line= </a>
FIND j=3009 line= </div>
FIND j=3010 line=
FIND j=3011 line=
FIND j=3012 line=
FIND j=3013 line= <div id="drag"> where:<br />
FIND j=3014 line=
FIND j=3015 line=<!--
FIND j=3016 line= <a href=https://meet.jit.si/where class="thumbnail" target=_blank>
FIND j=3017 line= <img height=100 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/>
FIND j=3018 line= <span><img height=200 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/></span>
FIND j=3019 line= </a>
FIND j=3020 line= -->
FIND j=3021 line=
FIND j=3022 line=<!--
FIND j=3023 line= <div class="drg"><h1>konet llc </h1>
FIND j=3024 line= <pre>timejask jkwii</pre>
FIND j=3025 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
FIND j=3026 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
FIND j=3027 line= <pre>timesak where</pre>
FIND j=3028 line= </div>
FIND j=3029 line= -->
FIND j=3030 line=
FIND j=3031 line= <div class="drg"><h1>jitsimeet/where </h1>
FIND j=3032 line= <a href="https://jit.si.meee/where" id="drag" targer=_blank class="thumbnail">
FIND j=3033 line= <img height=200 src=/imgs/links/tn/tn_meet.png border=0>
FIND j=3034 line= <span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
FIND j=3035 line= </a>
FIND j=3036 line= </div>
FIND j=3037 line=
FIND j=3038 line= <div id="drag"> where:<br />
FIND j=3039 line= <a class="drg" href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
FIND j=3040 line= <img height=200 src=/imgs/links/warning_light.gif border=0>
FIND j=3041 line= <span><img src=/links/warning_light.gif border=0></span>
FIND j=3042 line= </a>
FIND j=3043 line= </div>
FIND j=3044 line= </div>
FIND j=3045 line= </div>
FIND j=3046 line= <hr>
FIND j=3047 line=
FIND j=3048 line=
FIND j=3049 line=
FIND j=3050 line=
FIND j=3051 line=
FIND j=3052 line= </div>
FIND j=3053 line= </div>
FIND j=3054 line=
FIND j=3055 line= <script>var kov_where = new Vue({ el: "#kov_where",
FIND j=3056 line= data: {collapsed: false},
FIND j=3057 line= methods: {
FIND j=3058 line= showhide_kov_where: function() {
FIND j=3059 line= if (!this.collapsed) this.collapsed = true;
FIND j=3060 line= else this.collapsed = false;
FIND j=3061 line= document.getElementById("kov_where").style.font = "italic bold 20px arial,serif";
FIND j=3062 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=3063 line=
FIND j=3064 line=// document.body.style.background = "darkslategrey";
FIND j=3065 line=// document.body.style.color = "black";
FIND j=3066 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3067 line=// document.body.style.fontsize = "24pt";
FIND j=3068 line= },
FIND j=3069 line= showhide_kov_where1: function() {
FIND j=3070 line= if (!this.collapsed) this.collapsed = true;
FIND j=3071 line= else this.collapsed = false;
FIND j=3072 line= },
FIND j=3073 line= showhide_kov_where2: function() {
FIND j=3074 line= if (!this.collapsed) this.collapsed = true;
FIND j=3075 line= else this.collapsed = false;
FIND j=3076 line= }
FIND j=3077 line= }
FIND j=3078 line= });
FIND j=3079 line= </script>
FIND j=3080 line=
FIND j=3081 line=
FIND j=3082 line=
FIND j=3083 line=
FIND j=3084 line=
FIND j=3085 line=
FIND j=3086 line=
FIND j=3087 line=
FIND j=3088 line=
FIND j=3089 line=
FIND j=3090 line=
FIND j=3091 line=
FIND j=3092 line=
FIND j=3093 line=
FIND j=3094 line=
FIND j=3095 line=
FIND j=3096 line=
FIND j=3097 line= <div id="kov_work">
FIND j=3098 line= <div>
FIND j=3099 line= kov_work:
FIND j=3100 line= </div>
FIND j=3101 line= <button v-on:click="showhide_kov_work">showhide_kov_work</button>
FIND j=3102 line= <img v-on:click="showhide_kov_work" src="/imgs/btn/koeye.png" >
FIND j=3103 line= <img v-on:click="showhide_kov_work1" src="/imgs/btn/kob.png" >
FIND j=3104 line= <img v-on:click="showhide_kov_work2" src="/imgs/btn/kow.png" >
FIND j=3105 line=
FIND j=3106 line= <div v-show="collapsed" class="detail_work">
FIND j=3107 line= kov_work
FIND j=3108 line= <div id="drag"> kov_work:<br />
FIND j=3109 line= <a href=kov_work.html class="thumbnail" target=_blank>
FIND j=3110 line= <img class="drg" src="/imgs/kov/tn/tn_kov_work.png" alt="kov_food" width="50" class="drg"/>
FIND j=3111 line= <span><img class="drg" src="/imgs/kov/kov_work.png" alt="kov_food" width="50" class="drg"/></span>
FIND j=3112 line= </a>
FIND j=3113 line= </div>
FIND j=3114 line=
FIND j=3115 line=
FIND j=3116 line= </div>
FIND j=3117 line= </div>
FIND j=3118 line=
FIND j=3119 line= <script>var kov = new Vue({ el: "#kov_work",
FIND j=3120 line= data: {collapsed: false},
FIND j=3121 line= methods: {
FIND j=3122 line= showhide_kov_work: function() {
FIND j=3123 line= if (!this.collapsed) this.collapsed = true;
FIND j=3124 line= else this.collapsed = false;
FIND j=3125 line=// document.body.style.background = "darkslategrey";
FIND j=3126 line=// document.body.style.color = "black";
FIND j=3127 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3128 line=// document.body.style.fontsize = "24pt";
FIND j=3129 line= },
FIND j=3130 line= showhide_kov_work1: function() {
FIND j=3131 line= if (!this.collapsed) this.collapsed = true;
FIND j=3132 line= else this.collapsed = false;
FIND j=3133 line= },
FIND j=3134 line= showhide_kov_work2: function() {
FIND j=3135 line= if (!this.collapsed) this.collapsed = true;
FIND j=3136 line= else this.collapsed = false;
FIND j=3137 line= }
FIND j=3138 line= }
FIND j=3139 line= });
FIND j=3140 line= </script>
FIND j=3141 line=
FIND j=3142 line=
FIND j=3143 line=
FIND j=3144 line= <div id="kov_memes">
FIND j=3145 line= <div>
FIND j=3146 line= memes: kov_memes
FIND j=3147 line= </div>
FIND j=3148 line= <button v-on:click="showhide_kov_memes">showhide_kov_memes</button>
FIND j=3149 line= <img v-on:click="showhide_kov_memes" src="/imgs/btn/koeye.png" >
FIND j=3150 line= <img v-on:click="showhide_kov_memes1" src="/imgs/btn/kob.png" >
FIND j=3151 line= <img v-on:click="showhide_kov_memes2" src="/imgs/btn/kow.png" >
FIND j=3152 line=
FIND j=3153 line= <div v-show="collapsed" class="detail_memes">
FIND j=3154 line= kov_memes
FIND j=3155 line= <div id="drag"> kov_memes:<br />
FIND j=3156 line= <a href=kov_memes.html class="thumbnail" target=_blank>
FIND j=3157 line= <img class="drg" src="/imgs/kov/tn/tn_kov_memes.png" alt="kov_food" width="50" class="drg"/>
FIND j=3158 line= <span><img class="drg" src="/imgs/kov/kov_memes.png" alt="kov_food" width="50" class="drg"/></span>
FIND j=3159 line= </a>
FIND j=3160 line= </div>
FIND j=3161 line=
FIND j=3162 line= </div>
FIND j=3163 line= </div>
FIND j=3164 line=
FIND j=3165 line= <script>var kov_memes = new Vue({ el: "#kov_memes",
FIND j=3166 line= data: {collapsed: false},
FIND j=3167 line= methods: {
FIND j=3168 line= showhide_kov_memes: function() {
FIND j=3169 line= if (!this.collapsed) this.collapsed = true;
FIND j=3170 line= else this.collapsed = false;
FIND j=3171 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
FIND j=3172 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=3173 line=
FIND j=3174 line=// document.body.style.background = "darkslategrey";
FIND j=3175 line=// document.body.style.color = "black";
FIND j=3176 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3177 line=// document.body.style.fontsize = "24pt";
FIND j=3178 line= },
FIND j=3179 line= showhide_kov_memes1: function() {
FIND j=3180 line= if (!this.collapsed) this.collapsed = true;
FIND j=3181 line= else this.collapsed = false;
FIND j=3182 line= },
FIND j=3183 line= showhide_kov_memes2: function() {
FIND j=3184 line= if (!this.collapsed) this.collapsed = true;
FIND j=3185 line= else this.collapsed = false;
FIND j=3186 line= }
FIND j=3187 line= }
FIND j=3188 line= });
FIND j=3189 line= </script>
FIND j=3190 line=
FIND j=3191 line=
FIND j=3192 line= <div id="kov_kids">
FIND j=3193 line= <div>
FIND j=3194 line= kids: kov_kids
FIND j=3195 line= </div>
FIND j=3196 line= <button v-on:click="showhide_kov_kids">showhide_kov_kids</button>
FIND j=3197 line= <img v-on:click="showhide_kov_kids" src="/imgs/btn/koeye.png" >
FIND j=3198 line= <img v-on:click="showhide_kov_kids1" src="/imgs/btn/kob.png" >
FIND j=3199 line= <img v-on:click="showhide_kov_kids2" src="/imgs/btn/kow.png" >
FIND j=3200 line=
FIND j=3201 line= <div v-show="collapsed" class="detail_kids">
FIND j=3202 line= kov_kids
FIND j=3203 line= <div id="drag"> kov_kids:<br />
FIND j=3204 line= <a href=kov_kids.html class="thumbnail" target=_blank>
FIND j=3205 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kids.png" alt="kov_food" width="200" class="drg"/>
FIND j=3206 line= <span><img class="drg" src="/imgs/kov/kov_kids.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3207 line= </a>
FIND j=3208 line=
FIND j=3209 line=
FIND j=3210 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
FIND j=3211 line= <img class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
FIND j=3212 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
FIND j=3213 line= </a>
FIND j=3214 line=
FIND j=3215 line=
FIND j=3216 line= <a href=/ko/svc/js/stemkoskijs/Three.js/Voxel-Painter.html class="thumbnail" target=_blank>
FIND j=3217 line= <img height =200 src="/imgs/links/tn/tn_voxelpainter.png">
FIND j=3218 line= <span><img height=400 src="/imgs/links/tn/tn_voxelpainter.png"></span>
FIND j=3219 line= </a>
FIND j=3220 line=
FIND j=3221 line= <a href=/ko/svc/js/stemkoskijs/Three.js/ class="thumbnail" target=_blank>
FIND j=3222 line= <img height =200 src="/imgs/links/tn/tn_stemkoskijs.png">
FIND j=3223 line= <span><img height=400 src="/imgs/links/tn/tn_stemkoskijs.png"></span>
FIND j=3224 line= </a>
FIND j=3225 line=
FIND j=3226 line= <a href=ko/svc/js/stemkoskijs/Three.js/ target=_blank>
FIND j=3227 line=
FIND j=3228 line= </a>
FIND j=3229 line=
FIND j=3230 line=
FIND j=3231 line= </div>
FIND j=3232 line= </div>
FIND j=3233 line=
FIND j=3234 line=<!--
FIND j=3235 line=harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
FIND j=3236 line=morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
FIND j=3237 line=morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
FIND j=3238 line=harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
FIND j=3239 line=georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
FIND j=3240 line= -->
FIND j=3241 line=
FIND j=3242 line=
FIND j=3243 line=
FIND j=3244 line= </div>
FIND j=3245 line=
FIND j=3246 line= </a>
FIND j=3247 line=
FIND j=3248 line=
FIND j=3249 line= </div>
FIND j=3250 line= </div>
FIND j=3251 line=
FIND j=3252 line=<!--
FIND j=3253 line=harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
FIND j=3254 line=morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
FIND j=3255 line=morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
FIND j=3256 line=harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
FIND j=3257 line=georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
FIND j=3258 line= -->
FIND j=3259 line=
FIND j=3260 line=
FIND j=3261 line=
FIND j=3262 line= </div>
FIND j=3263 line= </div>
FIND j=3264 line=
FIND j=3265 line= <script>var kov_kids = new Vue({ el: "#kov_kids",
FIND j=3266 line= data: {collapsed: false},
FIND j=3267 line= methods: {
FIND j=3268 line= showhide_kov_kids: function() {
FIND j=3269 line= if (!this.collapsed) this.collapsed = true;
FIND j=3270 line= else this.collapsed = false;
FIND j=3271 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
FIND j=3272 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=3273 line=
FIND j=3274 line=// document.body.style.background = "darkslategrey";
FIND j=3275 line=// document.body.style.color = "black";
FIND j=3276 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3277 line=// document.body.style.fontsize = "24pt";
FIND j=3278 line= },
FIND j=3279 line= showhide_kov_kids1: function() {
FIND j=3280 line= if (!this.collapsed) this.collapsed = true;
FIND j=3281 line= else this.collapsed = false;
FIND j=3282 line= },
FIND j=3283 line= showhide_kov_kids2: function() {
FIND j=3284 line= if (!this.collapsed) this.collapsed = true;
FIND j=3285 line= else this.collapsed = false;
FIND j=3286 line= }
FIND j=3287 line= }
FIND j=3288 line= });
FIND j=3289 line= </script>
FIND j=3290 line=
FIND j=3291 line=
FIND j=3292 line=
FIND j=3293 line=
FIND j=3294 line=
FIND j=3295 line=
FIND j=3296 line= <div id="kov_dogs">
FIND j=3297 line= <div>
FIND j=3298 line= dogs: kov_dogs
FIND j=3299 line= </div>
FIND j=3300 line= <button v-on:click="showhide_kov_dogs">showhide_kov_dogs</button>
FIND j=3301 line= <img v-on:click="showhide_kov_dogs" src="/imgs/btn/koeye.png" >
FIND j=3302 line= <img v-on:click="showhide_kov_dogs1" src="/imgs/btn/kob.png" >
FIND j=3303 line= <img v-on:click="showhide_kov_dogs2" src="/imgs/btn/kow.png" >
FIND j=3304 line=
FIND j=3305 line= <div v-show="collapsed" class="detail_dogs">
FIND j=3306 line= kov_dogs
FIND j=3307 line= <div id="drag"> kov_dogs:<br />
FIND j=3308 line= <a href=kov_dogs.html class="thumbnail" target=_blank>
FIND j=3309 line= <img class="drg" src="/imgs/kov/tn/tn_kov_dogs.png" alt="kov_food" width="200" class="drg"/>
FIND j=3310 line= <span><img class="drg" src="/imgs/kov/kov_dogs.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3311 line= </a>
FIND j=3312 line= </div>
FIND j=3313 line=
FIND j=3314 line= <a href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
FIND j=3315 line= <img height=200 src=/imgs/links/warning_light.gif border=0>
FIND j=3316 line= <span><img src=/links/warning_light.gif border=0></span>
FIND j=3317 line= </a>
FIND j=3318 line=
FIND j=3319 line=<!-- kov_dogs_end -->
FIND j=3320 line= </div>
FIND j=3321 line= </div>
FIND j=3322 line=
FIND j=3323 line= <script>var kov_dogs = new Vue({ el: "#kov_dogs",
FIND j=3324 line= data: {collapsed: false},
FIND j=3325 line= methods: {
FIND j=3326 line= showhide_kov_dogs: function() {
FIND j=3327 line= if (!this.collapsed) this.collapsed = true;
FIND j=3328 line= else this.collapsed = false;
FIND j=3329 line= document.getElementById("kov_dogs").style.font = "italic bold 20px arial,serif";
FIND j=3330 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=3331 line=
FIND j=3332 line=// document.body.style.background = "darkslategrey";
FIND j=3333 line=// document.body.style.color = "black";
FIND j=3334 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3335 line=// document.body.style.fontsize = "24pt";
FIND j=3336 line= },
FIND j=3337 line= showhide_kov_dogs1: function() {
FIND j=3338 line= if (!this.collapsed) this.collapsed = true;
FIND j=3339 line= else this.collapsed = false;
FIND j=3340 line= },
FIND j=3341 line= showhide_kov_dogs2: function() {
FIND j=3342 line= if (!this.collapsed) this.collapsed = true;
FIND j=3343 line= else this.collapsed = false;
FIND j=3344 line= }
FIND j=3345 line= }
FIND j=3346 line= });
FIND j=3347 line= </script>
FIND j=3348 line=
FIND j=3349 line=
FIND j=3350 line= <div id="kov_preserve">
FIND j=3351 line= <div>
FIND j=3352 line= preserve: kov_preserve
FIND j=3353 line= </div>
FIND j=3354 line= <button v-on:click="showhide_kov_preserve">showhide_kov_preserve</button>
FIND j=3355 line= <img v-on:click="showhide_kov_preserve" src="/imgs/btn/koeye.png" >
FIND j=3356 line= <img v-on:click="showhide_kov_preserve1" src="/imgs/btn/kob.png" >
FIND j=3357 line= <img v-on:click="showhide_kov_preserve2" src="/imgs/btn/kow.png" >
FIND j=3358 line=
FIND j=3359 line= <div v-show="collapsed" class="detail_preserve">
FIND j=3360 line= <div id="drag"> kov_preserve:<br />
FIND j=3361 line= <a href=kov_preserve.html class="thumbnail" target=_blank>
FIND j=3362 line= <img class="drg" src="/imgs/kov/tn/tn_kov_preserve.png" alt="kov_food" width="200" class="drg"/>
FIND j=3363 line= <span><img class="drg" src="/imgs/kov/kov_preserve.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3364 line= </a>
FIND j=3365 line= </div>
FIND j=3366 line=
FIND j=3367 line=
FIND j=3368 line= </div>
FIND j=3369 line= </div>
FIND j=3370 line=
FIND j=3371 line= <script>var kov_preserve = new Vue({ el: "#kov_preserve",
FIND j=3372 line= data: {collapsed: false},
FIND j=3373 line= methods: {
FIND j=3374 line= showhide_kov_preserve: function() {
FIND j=3375 line= if (!this.collapsed) this.collapsed = true;
FIND j=3376 line= else this.collapsed = false;
FIND j=3377 line= document.getElementById("kov_preserve").style.font = "italic bold 20px arial,serif";
FIND j=3378 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=3379 line=
FIND j=3380 line=// document.body.style.background = "darkslategrey";
FIND j=3381 line=// document.body.style.color = "black";
FIND j=3382 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3383 line=// document.body.style.fontsize = "24pt";
FIND j=3384 line= },
FIND j=3385 line= showhide_kov_preserve1: function() {
FIND j=3386 line= if (!this.collapsed) this.collapsed = true;
FIND j=3387 line= else this.collapsed = false;
FIND j=3388 line= },
FIND j=3389 line= showhide_kov_preserve2: function() {
FIND j=3390 line= if (!this.collapsed) this.collapsed = true;
FIND j=3391 line= else this.collapsed = false;
FIND j=3392 line= }
FIND j=3393 line= }
FIND j=3394 line= });
FIND j=3395 line= </script>
FIND j=3396 line=
FIND j=3397 line=
FIND j=3398 line=
FIND j=3399 line= <div id="kov_protect">
FIND j=3400 line= <div>
FIND j=3401 line= protect: kov_protect
FIND j=3402 line= </div>
FIND j=3403 line= <button v-on:click="showhide_kov_protect">showhide_kov_protect</button>
FIND j=3404 line= <img v-on:click="showhide_kov_protect" src="/imgs/btn/koeye.png" >
FIND j=3405 line= <img v-on:click="showhide_kov_protect1" src="/imgs/btn/kob.png" >
FIND j=3406 line= <img v-on:click="showhide_kov_protect2" src="/imgs/btn/kow.png" >
FIND j=3407 line=
FIND j=3408 line= <div v-show="collapsed" class="detail_protect">
FIND j=3409 line= <div id="drag"> kov_protect:<br />
FIND j=3410 line= <a href=kov_protect.html class="thumbnail" target=_blank>
FIND j=3411 line= <img class="drg" src="/imgs/kov/tn/tn_kov_protect.png" alt="kov_food" width="200" class="drg"/>
FIND j=3412 line= <span><img class="drg" src="/imgs/kov/kov_protect.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3413 line= </a>
FIND j=3414 line= </div>
FIND j=3415 line=
FIND j=3416 line=
FIND j=3417 line= </div>
FIND j=3418 line= </div>
FIND j=3419 line=
FIND j=3420 line=
FIND j=3421 line= <script>var kov_protect = new Vue({ el: "#kov_protect",
FIND j=3422 line= data: {collapsed: false},
FIND j=3423 line= methods: {
FIND j=3424 line= showhide_kov_protect: function() {
FIND j=3425 line= if (!this.collapsed) this.collapsed = true;
FIND j=3426 line= else this.collapsed = false;
FIND j=3427 line= document.getElementById("kov_protect").style.font = "italic bold 20px arial,serif";
FIND j=3428 line= },
FIND j=3429 line= showhide_kov_protect1: function() {
FIND j=3430 line= if (!this.collapsed) this.collapsed = true;
FIND j=3431 line= else this.collapsed = false;
FIND j=3432 line= },
FIND j=3433 line= showhide_kov_protect2: function() {
FIND j=3434 line= if (!this.collapsed) this.collapsed = true;
FIND j=3435 line= else this.collapsed = false;
FIND j=3436 line= }
FIND j=3437 line= }
FIND j=3438 line= });
FIND j=3439 line= </script>
FIND j=3440 line=
FIND j=3441 line=
FIND j=3442 line=
FIND j=3443 line= <div id="kov_jtfdc">
FIND j=3444 line= <div>
FIND j=3445 line= jtfdc: kov_jtfdc
FIND j=3446 line= </div>
FIND j=3447 line= <button v-on:click="showhide_kov_jtfdc">showhide_kov_jtfdc</button>
FIND j=3448 line= <img v-on:click="showhide_kov_jtfdc" src="/imgs/btn/koeye.png" >
FIND j=3449 line= <img v-on:click="showhide_kov_jtfdc1" src="/imgs/btn/kob.png" >
FIND j=3450 line= <img v-on:click="showhide_kov_jtfdc2" src="/imgs/btn/kow.png" >
FIND j=3451 line=
FIND j=3452 line= <div v-show="collapsed" class="detail_jtfdc">
FIND j=3453 line= <div id="drag"> kov_jtfdc:<br />
FIND j=3454 line= <a href=kov_jtfdc.html class="thumbnail" target=_blank>
FIND j=3455 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jtfdc.png" alt="kov_food" width="200" class="drg"/>
FIND j=3456 line= <span><img class="drg" src="/imgs/kov/kov_jtfdc.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3457 line= </a>
FIND j=3458 line= </div>
FIND j=3459 line=
FIND j=3460 line=
FIND j=3461 line= </div>
FIND j=3462 line= </div>
FIND j=3463 line=
FIND j=3464 line=
FIND j=3465 line= <script>var kov_jtfdc = new Vue({ el: "#kov_jtfdc",
FIND j=3466 line= data: {collapsed: false},
FIND j=3467 line= methods: {
FIND j=3468 line= showhide_kov_jtfdc: function() {
FIND j=3469 line= if (!this.collapsed) this.collapsed = true;
FIND j=3470 line= else this.collapsed = false;
FIND j=3471 line= },
FIND j=3472 line= showhide_kov_jtfdc1: function() {
FIND j=3473 line= if (!this.collapsed) this.collapsed = true;
FIND j=3474 line= else this.collapsed = false;
FIND j=3475 line= },
FIND j=3476 line= showhide_kov_jtfdc2: function() {
FIND j=3477 line= if (!this.collapsed) this.collapsed = true;
FIND j=3478 line= else this.collapsed = false;
FIND j=3479 line= }
FIND j=3480 line= }
FIND j=3481 line= });
FIND j=3482 line= </script>
FIND j=3483 line=
FIND j=3484 line= <div id="kov_jtfinc">
FIND j=3485 line= <div>
FIND j=3486 line= jtfinc: kov_jtfinc
FIND j=3487 line= </div>
FIND j=3488 line= <button v-on:click="showhide_kov_jtfinc">showhide_kov_jtfinc</button>
FIND j=3489 line= <img v-on:click="showhide_kov_jtfinc" src="/imgs/btn/koeye.png" >
FIND j=3490 line= <img v-on:click="showhide_kov_jtfinc1" src="/imgs/btn/kob.png" >
FIND j=3491 line= <img v-on:click="showhide_kov_jtfinc2" src="/imgs/btn/kow.png" >
FIND j=3492 line=
FIND j=3493 line= <div v-show="collapsed" class="detail_jtfinc">
FIND j=3494 line= <div id="drag"> kov_jtfinc:<br />
FIND j=3495 line= <a href=kov_jtfinc.html class="thumbnail" target=_blank>
FIND j=3496 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jtfinc.png" alt="kov_food" width="200" class="drg"/>
FIND j=3497 line= <span><img class="drg" src="/imgs/kov/kov_jtfinc.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3498 line= </a>
FIND j=3499 line= </div>
FIND j=3500 line=
FIND j=3501 line=
FIND j=3502 line= </div>
FIND j=3503 line= </div>
FIND j=3504 line=
FIND j=3505 line=
FIND j=3506 line= <script>var kov_jtfinc = new Vue({ el: "#kov_jtfinc",
FIND j=3507 line= data: {collapsed: false},
FIND j=3508 line= methods: {
FIND j=3509 line= showhide_kov_jtfinc: function() {
FIND j=3510 line= if (!this.collapsed) this.collapsed = true;
FIND j=3511 line= else this.collapsed = false;
FIND j=3512 line= },
FIND j=3513 line= showhide_kov_jtfinc1: function() {
FIND j=3514 line= if (!this.collapsed) this.collapsed = true;
FIND j=3515 line= else this.collapsed = false;
FIND j=3516 line= },
FIND j=3517 line= showhide_kov_jtfinc2: function() {
FIND j=3518 line= if (!this.collapsed) this.collapsed = true;
FIND j=3519 line= else this.collapsed = false;
FIND j=3520 line= }
FIND j=3521 line= }
FIND j=3522 line= });
FIND j=3523 line= </script>
FIND j=3524 line=
FIND j=3525 line=
FIND j=3526 line=
FIND j=3527 line=
FIND j=3528 line= <div id="kov_byrdpucker">
FIND j=3529 line= <div>
FIND j=3530 line= byrdpucker is dogs-n-ponies:
FIND j=3531 line= </div>
FIND j=3532 line= <button v-on:click="showhide_kov_byrdpucker">showhide_kov_byrdpucker</button>
FIND j=3533 line= <img v-on:click="showhide_kov_byrdpucker" src="/imgs/btn/koeye.png" >
FIND j=3534 line= <img v-on:click="showhide_kov_byrdpucker1" src="/imgs/btn/kob.png" >
FIND j=3535 line= <img v-on:click="showhide_kov_byrdpucker2" src="/imgs/btn/kow.png" >
FIND j=3536 line=
FIND j=3537 line= <div v-show="collapsed" class="detail_byrdpucker">
FIND j=3538 line= byrdpucker dog and pony club cyclers and donuts too
FIND j=3539 line= <hr>
FIND j=3540 line= <div id="drag"> kov_byrpucker:<br />
FIND j=3541 line= <a href=kov_byrpucker.html class="thumbnail" target=_blank>
FIND j=3542 line= <img class="drg" src="/imgs/kov/tn/tn_kov_byrpucker.png" alt="kov_food" width="200" class="drg"/>
FIND j=3543 line= <span><img class="drg" src="/imgs/kov/kov_byrpucker.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3544 line= </a>
FIND j=3545 line= </div>
FIND j=3546 line=
FIND j=3547 line=
FIND j=3548 line= </div>
FIND j=3549 line= </div>
FIND j=3550 line=
FIND j=3551 line= <script>var kov_byrdpucker = new Vue({ el: "#kov_byrdpucker",
FIND j=3552 line= data: {collapsed: false},
FIND j=3553 line= methods: {
FIND j=3554 line= showhide_kov_byrdpucker: function() {
FIND j=3555 line= if (!this.collapsed) this.collapsed = true;
FIND j=3556 line= else this.collapsed = false;
FIND j=3557 line=// document.body.style.background = "darkslategrey";
FIND j=3558 line=// document.body.style.color = "black";
FIND j=3559 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3560 line=// document.body.style.fontsize = "24pt";
FIND j=3561 line= },
FIND j=3562 line= showhide_kov_byrdpucker1: function() {
FIND j=3563 line= if (!this.collapsed) this.collapsed = true;
FIND j=3564 line= else this.collapsed = false;
FIND j=3565 line= },
FIND j=3566 line= showhide_kov_byrdpucker2: function() {
FIND j=3567 line= if (!this.collapsed) this.collapsed = true;
FIND j=3568 line= else this.collapsed = false;
FIND j=3569 line= }
FIND j=3570 line= }
FIND j=3571 line= });
FIND j=3572 line= </script>
FIND j=3573 line=
FIND j=3574 line=
FIND j=3575 line=
FIND j=3576 line= <div id="kov_jkwii">
FIND j=3577 line= <div>
FIND j=3578 line= jkwii is me: kov_jkwii
FIND j=3579 line= </div>
FIND j=3580 line= <button v-on:click="showhide_kov_jkwii">showhide_kov_jkwii</button>
FIND j=3581 line= <img v-on:click="showhide_kov_jkwii" src="/imgs/btn/koeye.png" >
FIND j=3582 line= <img v-on:click="showhide_kov_jkwii1" src="/imgs/btn/kob.png" >
FIND j=3583 line= <img v-on:click="showhide_kov_jkwii2" src="/imgs/btn/kow.png" >
FIND j=3584 line=
FIND j=3585 line= <div v-show="collapsed" class="detail_jkwii">
FIND j=3586 line= jookiim kopernicus wundersteine ii
FIND j=3587 line= <hr>
FIND j=3588 line= <div id="drag"> kov_jkwii:<br />
FIND j=3589 line= <a href=kov_jkwii.html class="thumbnail" target=_blank>
FIND j=3590 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jkwii.png" alt="kov_food" width="200" class="drg"/>
FIND j=3591 line= <span><img class="drg" src="/imgs/kov/kov_jkwii.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3592 line= </a>
FIND j=3593 line= </div>
FIND j=3594 line=
FIND j=3595 line= <a href="mailto:jkwii@ko0.us?subject=jkwii?"><img src="/imgs/links/email.gif" alt="jkwii_what" border=0></a>
FIND j=3596 line=
FIND j=3597 line= <a href="mailto:skwii@ko0.us?subject=skwii?"><img src="/imgs/links/email.gif" alt="skwii_what" border=0></a>
FIND j=3598 line= <hr>
FIND j=3599 line=
FIND j=3600 line= <a href=/imgs/links/eurodoor_Image429.png class="thumbnail" target=_blank>
FIND j=3601 line= <img height=200 src=/imgs/links/tn/tn_eurodoor_Image429.png alt="eurodoor" border=0>
FIND j=3602 line= <span><img src=/imgs/links/eurodoor_Image429.png alt="eurodoor" border=0></span>
FIND j=3603 line= </a>
FIND j=3604 line=
FIND j=3605 line=
FIND j=3606 line= </div>
FIND j=3607 line= </div>
FIND j=3608 line=
FIND j=3609 line= <script>var kov_jkwii = new Vue({ el: "#kov_jkwii",
FIND j=3610 line= data: {collapsed: false},
FIND j=3611 line= methods: {
FIND j=3612 line= showhide_kov_jkwii: function() {
FIND j=3613 line= if (!this.collapsed) this.collapsed = true;
FIND j=3614 line= else this.collapsed = false;
FIND j=3615 line=// document.body.style.background = "darkslategrey";
FIND j=3616 line=// document.body.style.color = "black";
FIND j=3617 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3618 line=// document.body.style.fontsize = "24pt";
FIND j=3619 line= },
FIND j=3620 line= showhide_kov_jkwii1: function() {
FIND j=3621 line= if (!this.collapsed) this.collapsed = true;
FIND j=3622 line= else this.collapsed = false;
FIND j=3623 line= },
FIND j=3624 line= showhide_kov_jkwii2: function() {
FIND j=3625 line= if (!this.collapsed) this.collapsed = true;
FIND j=3626 line= else this.collapsed = false;
FIND j=3627 line= }
FIND j=3628 line= }
FIND j=3629 line= });
FIND j=3630 line= </script>
FIND j=3631 line=
FIND j=3632 line=
FIND j=3633 line=
FIND j=3634 line= <div id="kov_kou">
FIND j=3635 line= <div>
FIND j=3636 line= ko university digital ars technica:
FIND j=3637 line= </div>
FIND j=3638 line= <button v-on:click="showhide_kov_kou">showhide_kov_kou</button>
FIND j=3639 line= <img v-on:click="showhide_kov_kou" src="/imgs/btn/koeye.png" >
FIND j=3640 line= <img v-on:click="showhide_kov_kou1" src="/imgs/btn/kob.png" >
FIND j=3641 line= <img v-on:click="showhide_kov_kou2" src="/imgs/btn/kow.png" >
FIND j=3642 line=
FIND j=3643 line= <div v-show="collapsed" class="detail_kou">
FIND j=3644 line= kou digital ars technica
FIND j=3645 line= <hr>
FIND j=3646 line= <div id="drag"> kov_kou:<br />
FIND j=3647 line= <a href=kov_kou.html class="thumbnail" target=_blank>
FIND j=3648 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kou.png" alt="kov_food" width="200" class="drg"/>
FIND j=3649 line= <span><img class="drg" src="/imgs/kov/kov_kou.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3650 line= </a>
FIND j=3651 line= </div>
FIND j=3652 line=
FIND j=3653 line= </div>
FIND j=3654 line= </div>
FIND j=3655 line=
FIND j=3656 line=
FIND j=3657 line=
FIND j=3658 line= <script>var kov_kou = new Vue({ el: "#kov_kou",
FIND j=3659 line= data: {collapsed: false},
FIND j=3660 line= methods: {
FIND j=3661 line= showhide_kov_kou: function() {
FIND j=3662 line= if (!this.collapsed) this.collapsed = true;
FIND j=3663 line= else this.collapsed = false;
FIND j=3664 line=// document.body.style.background = "darkslategrey";
FIND j=3665 line=// document.body.style.color = "black";
FIND j=3666 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3667 line=// document.body.style.fontsize = "24pt";
FIND j=3668 line= },
FIND j=3669 line= showhide_kov_kou1: function() {
FIND j=3670 line= if (!this.collapsed) this.collapsed = true;
FIND j=3671 line= else this.collapsed = false;
FIND j=3672 line= },
FIND j=3673 line= showhide_kov_kou2: function() {
FIND j=3674 line= if (!this.collapsed) this.collapsed = true;
FIND j=3675 line= else this.collapsed = false;
FIND j=3676 line= }
FIND j=3677 line= }
FIND j=3678 line= });
FIND j=3679 line= </script>
FIND j=3680 line=
FIND j=3681 line=
FIND j=3682 line=
FIND j=3683 line=
FIND j=3684 line= <div id="kov_kassil">
FIND j=3685 line= <div>
FIND j=3686 line= kassil and others are us: kov_kassil
FIND j=3687 line= </div>
FIND j=3688 line= <button v-on:click="showhide_kov_kassil">showhide_kov_kassil</button>
FIND j=3689 line= <img v-on:click="showhide_kov_kassil" src="/imgs/btn/koeye.png" >
FIND j=3690 line= <img v-on:click="showhide_kov_kassil1" src="/imgs/btn/kob.png" >
FIND j=3691 line= <img v-on:click="showhide_kov_kassil2" src="/imgs/btn/kow.png" >
FIND j=3692 line=
FIND j=3693 line= <div v-show="collapsed" class="detail_kassil">
FIND j=3694 line= kassil & others
FIND j=3695 line= <div id="drag"> kov_kassil:<br />
FIND j=3696 line= <a href=kov_kassil.html class="thumbnail" target=_blank>
FIND j=3697 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kassil.png" alt="kov_food" width="200" class="drg"/>
FIND j=3698 line= <span><img class="drg" src="/imgs/kov/kov_kassil.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3699 line= </a>
FIND j=3700 line= </div>
FIND j=3701 line= <hr>
FIND j=3702 line=
FIND j=3703 line=
FIND j=3704 line= </div>
FIND j=3705 line= </div>
FIND j=3706 line=
FIND j=3707 line= <script>var kov_kassil = new Vue({ el: "#kov_kassil",
FIND j=3708 line= data: {collapsed: false},
FIND j=3709 line= methods: {
FIND j=3710 line= showhide_kov_kassil: function() {
FIND j=3711 line= if (!this.collapsed) this.collapsed = true;
FIND j=3712 line= else this.collapsed = false;
FIND j=3713 line=// document.body.style.background = "darkslategrey";
FIND j=3714 line=// document.body.style.color = "black";
FIND j=3715 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3716 line=// document.body.style.fontsize = "24pt";
FIND j=3717 line= },
FIND j=3718 line= showhide_kov_kassil1: function() {
FIND j=3719 line= if (!this.collapsed) this.collapsed = true;
FIND j=3720 line= else this.collapsed = false;
FIND j=3721 line= },
FIND j=3722 line= showhide_kov_kassil2: function() {
FIND j=3723 line= if (!this.collapsed) this.collapsed = true;
FIND j=3724 line= else this.collapsed = false;
FIND j=3725 line= }
FIND j=3726 line= }
FIND j=3727 line= });
FIND j=3728 line= </script>
FIND j=3729 line=
FIND j=3730 line=
FIND j=3731 line=
FIND j=3732 line=
FIND j=3733 line= <div id="kov_konet">
FIND j=3734 line= <div>
FIND j=3735 line= konet is biz: kov_konet
FIND j=3736 line= </div>
FIND j=3737 line= <button v-on:click="showhide_kov_konet">showhide_kov_konet</button>
FIND j=3738 line= <img v-on:click="showhide_kov_konet" src="/imgs/btn/koeye.png" >
FIND j=3739 line= <img v-on:click="showhide_kov_konet1" src="/imgs/btn/kob.png" >
FIND j=3740 line= <img v-on:click="showhide_kov_konet2" src="/imgs/btn/kow.png" >
FIND j=3741 line=
FIND j=3742 line= <div v-show="collapsed" class="detail_konet">
FIND j=3743 line= konet is biz
FIND j=3744 line= <hr>
FIND j=3745 line= <div id="drag"> kov_konet:<br />
FIND j=3746 line= <a href=kov_konet.html class="thumbnail" target=_blank>
FIND j=3747 line= <img class="drg" src="/imgs/kov/tn/tn_kov_konet.png" alt="kov_food" width="200" class="drg"/>
FIND j=3748 line= <span><img class="drg" src="/imgs/kov/kov_konet.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3749 line= </a>
FIND j=3750 line= </div>
FIND j=3751 line=
FIND j=3752 line=
FIND j=3753 line= </div>
FIND j=3754 line= </div>
FIND j=3755 line=
FIND j=3756 line= <script>var kov_konet = new Vue({ el: "#kov_konet",
FIND j=3757 line= data: {collapsed: false},
FIND j=3758 line= methods: {
FIND j=3759 line= showhide_kov_konet: function() {
FIND j=3760 line= if (!this.collapsed) this.collapsed = true;
FIND j=3761 line= else this.collapsed = false;
FIND j=3762 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
FIND j=3763 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=3764 line=
FIND j=3765 line=// document.body.style.background = "darkslategrey";
FIND j=3766 line=// document.body.style.color = "black";
FIND j=3767 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3768 line=// document.body.style.fontsize = "24pt";
FIND j=3769 line= },
FIND j=3770 line= showhide_kov_konet1: function() {
FIND j=3771 line= if (!this.collapsed) this.collapsed = true;
FIND j=3772 line= else this.collapsed = false;
FIND j=3773 line= },
FIND j=3774 line= showhide_kov_konet2: function() {
FIND j=3775 line= if (!this.collapsed) this.collapsed = true;
FIND j=3776 line= else this.collapsed = false;
FIND j=3777 line= }
FIND j=3778 line= }
FIND j=3779 line= });
FIND j=3780 line= </script>
FIND j=3781 line=
FIND j=3782 line=
FIND j=3783 line=
FIND j=3784 line=
FIND j=3785 line= <div id="kov_iperms">
FIND j=3786 line= <div>
FIND j=3787 line= iperms
FIND j=3788 line=<!-- <h1 v-on:click="showhide_kov_iperms" >= = : : iperms : : = =</h1> -->
FIND j=3789 line= </div>
FIND j=3790 line= <button v-on:click="showhide_kov_iperms">showhide_kov_iperms</button>
FIND j=3791 line= <img v-on:click="showhide_kov_iperms" src="/imgs/btn/koeye.png" >
FIND j=3792 line= <img v-on:click="showhide_kov_iperms1" src="/imgs/btn/kob.png" >
FIND j=3793 line= <img v-on:click="showhide_kov_iperms2" src="/imgs/btn/kow.png" >
FIND j=3794 line=
FIND j=3795 line= <div v-show="collapsed" class="detail_iperms">
FIND j=3796 line= iperms
FIND j=3797 line= <hr>
FIND j=3798 line= <div id="drag"> kov_iperms:<br />
FIND j=3799 line= <a href=kov_iperms.html class="thumbnail" target=_blank>
FIND j=3800 line= <img class="drg" src="/imgs/kov/tn/tn_kov_iperms.png" alt="kov_food" width="200" class="drg"/>
FIND j=3801 line= <span><img class="drg" src="/imgs/kov/kov_iperms.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3802 line= </a>
FIND j=3803 line= </div>
FIND j=3804 line=
FIND j=3805 line=
FIND j=3806 line= </div>
FIND j=3807 line= </div>
FIND j=3808 line=
FIND j=3809 line= <script>var kov_iperms = new Vue({ el: "#kov_iperms",
FIND j=3810 line= data: {collapsed: false},
FIND j=3811 line= methods: {
FIND j=3812 line= showhide_kov_iperms: function() {
FIND j=3813 line= if (!this.collapsed) this.collapsed = true;
FIND j=3814 line= else this.collapsed = false;
FIND j=3815 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
FIND j=3816 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=3817 line=
FIND j=3818 line=// document.body.style.background = "darkslategrey";
FIND j=3819 line=// document.body.style.color = "black";
FIND j=3820 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3821 line=// document.body.style.fontsize = "24pt";
FIND j=3822 line= },
FIND j=3823 line= showhide_kov_iperms1: function() {
FIND j=3824 line= if (!this.collapsed) this.collapsed = true;
FIND j=3825 line= else this.collapsed = false;
FIND j=3826 line= },
FIND j=3827 line= showhide_kov_iperms2: function() {
FIND j=3828 line= if (!this.collapsed) this.collapsed = true;
FIND j=3829 line= else this.collapsed = false;
FIND j=3830 line= }
FIND j=3831 line= }
FIND j=3832 line= });
FIND j=3833 line= </script>
FIND j=3834 line=
FIND j=3835 line=
FIND j=3836 line=
FIND j=3837 line=
FIND j=3838 line= <div id="kov_konabus">
FIND j=3839 line= <div>
FIND j=3840 line= konabus: kov_konabus
FIND j=3841 line= </div>
FIND j=3842 line= <button v-on:click="showhide_kov_konabus">showhide_kov_konabus</button>
FIND j=3843 line= <img v-on:click="showhide_kov_konabus" src="/imgs/btn/koeye.png" >
FIND j=3844 line= <img v-on:click="showhide_kov_konabus1" src="/imgs/btn/kob.png" >
FIND j=3845 line= <img v-on:click="showhide_kov_konabus2" src="/imgs/btn/kow.png" >
FIND j=3846 line=
FIND j=3847 line= <div v-show="collapsed" class="detail_konabus">
FIND j=3848 line= konabus
FIND j=3849 line= <hr>
FIND j=3850 line= <div id="drag"> kov_konabus:<br />
FIND j=3851 line= <a href=kov_konabus.html class="thumbnail" target=_blank>
FIND j=3852 line= <img class="drg" src="/imgs/kov/tn/tn_kov_konabus.png" alt="kov_food" width="200" class="drg"/>
FIND j=3853 line= <span><img class="drg" src="/imgs/kov/kov_konabus.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3854 line= </a>
FIND j=3855 line= </div>
FIND j=3856 line=
FIND j=3857 line= </div>
FIND j=3858 line= </div>
FIND j=3859 line=
FIND j=3860 line= <script>var kov_konabus = new Vue({ el: "#kov_konabus",
FIND j=3861 line= data: {collapsed: false},
FIND j=3862 line= methods: {
FIND j=3863 line= showhide_kov_konabus: function() {
FIND j=3864 line= if (!this.collapsed) this.collapsed = true;
FIND j=3865 line= else this.collapsed = false;
FIND j=3866 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
FIND j=3867 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=3868 line=
FIND j=3869 line=// document.body.style.background = "darkslategrey";
FIND j=3870 line=// document.body.style.color = "black";
FIND j=3871 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3872 line=// document.body.style.fontsize = "24pt";
FIND j=3873 line= },
FIND j=3874 line= showhide_kov_konabus1: function() {
FIND j=3875 line= if (!this.collapsed) this.collapsed = true;
FIND j=3876 line= else this.collapsed = false;
FIND j=3877 line= },
FIND j=3878 line= showhide_kov_konabus2: function() {
FIND j=3879 line= if (!this.collapsed) this.collapsed = true;
FIND j=3880 line= else this.collapsed = false;
FIND j=3881 line= }
FIND j=3882 line= }
FIND j=3883 line= });
FIND j=3884 line= </script>
FIND j=3885 line=
FIND j=3886 line=
FIND j=3887 line=
FIND j=3888 line=
FIND j=3889 line= <div id="kov_kt">
FIND j=3890 line= <div>
FIND j=3891 line= kt: kov_kt
FIND j=3892 line= </div>
FIND j=3893 line= <button v-on:click="showhide_kov_kt">showhide_kov_kt</button>
FIND j=3894 line= <img v-on:click="showhide_kov_kt" src="/imgs/btn/koeye.png" >
FIND j=3895 line= <img v-on:click="showhide_kov_kt1" src="/imgs/btn/kob.png" >
FIND j=3896 line= <img v-on:click="showhide_kov_kt2" src="/imgs/btn/kow.png" >
FIND j=3897 line=
FIND j=3898 line= <div v-show="collapsed" class="detail_kt">
FIND j=3899 line= kt
FIND j=3900 line= <hr>
FIND j=3901 line= <div id="drag"> kov_kt:<br />
FIND j=3902 line= <a href=kov_kt.html class="thumbnail" target=_blank>
FIND j=3903 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kt.png" alt="kov_food" width="200" class="drg"/>
FIND j=3904 line= <span><img class="drg" src="/imgs/kov/kov_kt.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3905 line= </a>
FIND j=3906 line= </div>
FIND j=3907 line=
FIND j=3908 line=
FIND j=3909 line= </div>
FIND j=3910 line= </div>
FIND j=3911 line=
FIND j=3912 line= <script>var kov_kt = new Vue({ el: "#kov_kt",
FIND j=3913 line= data: {collapsed: false},
FIND j=3914 line= methods: {
FIND j=3915 line= showhide_kov_kt: function() {
FIND j=3916 line= if (!this.collapsed) this.collapsed = true;
FIND j=3917 line= else this.collapsed = false;
FIND j=3918 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
FIND j=3919 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=3920 line=
FIND j=3921 line=// document.body.style.background = "darkslategrey";
FIND j=3922 line=// document.body.style.color = "black";
FIND j=3923 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3924 line=// document.body.style.fontsize = "24pt";
FIND j=3925 line= },
FIND j=3926 line= showhide_kov_kt1: function() {
FIND j=3927 line= if (!this.collapsed) this.collapsed = true;
FIND j=3928 line= else this.collapsed = false;
FIND j=3929 line= },
FIND j=3930 line= showhide_kov_kt2: function() {
FIND j=3931 line= if (!this.collapsed) this.collapsed = true;
FIND j=3932 line= else this.collapsed = false;
FIND j=3933 line= }
FIND j=3934 line= }
FIND j=3935 line= });
FIND j=3936 line= </script>
FIND j=3937 line=
FIND j=3938 line=
FIND j=3939 line=
FIND j=3940 line= <div id="kov_go">
FIND j=3941 line= <div>
FIND j=3942 line= go: kov_go
FIND j=3943 line= </div>
FIND j=3944 line= <button v-on:click="showhide_kov_go">showhide_kov_go</button>
FIND j=3945 line= <img v-on:click="showhide_kov_go" src="/imgs/btn/koeye.png" >
FIND j=3946 line= <img v-on:click="showhide_kov_go1" src="/imgs/btn/kob.png" >
FIND j=3947 line= <img v-on:click="showhide_kov_go2" src="/imgs/btn/kow.png" >
FIND j=3948 line=
FIND j=3949 line= <div v-show="collapsed" class="detail_go">
FIND j=3950 line= go
FIND j=3951 line= <hr>
FIND j=3952 line= <div id="drag"> kov_go:<br />
FIND j=3953 line= <a href=kov_go.html class="thumbnail" target=_blank>
FIND j=3954 line= <img class="drg" src="/imgs/kov/tn/tn_kov_go.png" alt="kov_food" width="200" class="drg"/>
FIND j=3955 line= <span><img class="drg" src="/imgs/kov/kov_go.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=3956 line= </a>
FIND j=3957 line= </div>
FIND j=3958 line=
FIND j=3959 line=
FIND j=3960 line= </div>
FIND j=3961 line= </div>
FIND j=3962 line=
FIND j=3963 line= <script>var kov_go = new Vue({ el: "#kov_go",
FIND j=3964 line= data: {collapsed: false},
FIND j=3965 line= methods: {
FIND j=3966 line= showhide_kov_go: function() {
FIND j=3967 line= if (!this.collapsed) this.collapsed = true;
FIND j=3968 line= else this.collapsed = false;
FIND j=3969 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
FIND j=3970 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=3971 line=
FIND j=3972 line=// document.body.style.background = "darkslategrey";
FIND j=3973 line=// document.body.style.color = "black";
FIND j=3974 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=3975 line=// document.body.style.fontsize = "24pt";
FIND j=3976 line= },
FIND j=3977 line= showhide_kov_go1: function() {
FIND j=3978 line= if (!this.collapsed) this.collapsed = true;
FIND j=3979 line= else this.collapsed = false;
FIND j=3980 line= },
FIND j=3981 line= showhide_kov_go2: function() {
FIND j=3982 line= if (!this.collapsed) this.collapsed = true;
FIND j=3983 line= else this.collapsed = false;
FIND j=3984 line= }
FIND j=3985 line= }
FIND j=3986 line= });
FIND j=3987 line= </script>
FIND j=3988 line=
FIND j=3989 line=
FIND j=3990 line=
FIND j=3991 line= <div id="div_kov_old">
FIND j=3992 line= <div>
FIND j=3993 line= old: kov_old
FIND j=3994 line= </div>
FIND j=3995 line= <button v-on:click="showhide_kov_old">showhide_kov_old</button>
FIND j=3996 line= <img v-on:click="showhide_kov_old" src="/imgs/btn/koeye.png" >
FIND j=3997 line= <img v-on:click="showhide_kov_old1" src="/imgs/btn/kob.png" >
FIND j=3998 line= <img v-on:click="showhide_kov_old2" src="/imgs/btn/kow.png" >
FIND j=3999 line=
FIND j=4000 line= <div v-show="collapsed" class="detail_old">
FIND j=4001 line=
FIND j=4002 line= old
FIND j=4003 line= <hr>
FIND j=4004 line= <div id="drag"> kov_old:<br />
FIND j=4005 line= <a href=kov_old.html class="thumbnail" target=_blank>
FIND j=4006 line= <img class="drg" src="/imgs/kov/tn/tn_kov_old.png" alt="kov_food" width="200" class="drg"/>
FIND j=4007 line= <span><img class="drg" src="/imgs/kov/kov_old.png" alt="kov_food" width="400" class="drg"/></span>
FIND j=4008 line= </a>
FIND j=4009 line= </div>
FIND j=4010 line=
FIND j=4011 line=
FIND j=4012 line= </div>
FIND j=4013 line= </div id="div_kov_old">
FIND j=4014 line=
FIND j=4015 line= <script id="script_kov_old">
FIND j=4016 line= var kov_old = new Vue({ el: "#kov_old",
FIND j=4017 line= data: {collapsed: false},
FIND j=4018 line= methods: {
FIND j=4019 line= showhide_kov_old: function() {
FIND j=4020 line= if (!this.collapsed) this.collapsed = true;
FIND j=4021 line= else this.collapsed = false;
FIND j=4022 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
FIND j=4023 line=// font-style font-variant font-weight font-size line-height font-family
FIND j=4024 line=
FIND j=4025 line=// document.body.style.background = "darkslategrey";
FIND j=4026 line=// document.body.style.color = "black";
FIND j=4027 line=// document.body.style.fontfamily = "yokkmokkOT";
FIND j=4028 line=// document.body.style.fontsize = "24pt";
FIND j=4029 line= },
FIND j=4030 line= showhide_kov_old1: function() {
FIND j=4031 line= if (!this.collapsed) this.collapsed = true;
FIND j=4032 line= else this.collapsed = false;
FIND j=4033 line= },
FIND j=4034 line= showhide_kov_old2: function() {
FIND j=4035 line= if (!this.collapsed) this.collapsed = true;
FIND j=4036 line= else this.collapsed = false;
FIND j=4037 line= }
FIND j=4038 line= }
FIND j=4039 line= });
FIND j=4040 line= </script id="script_kov_old">
FIND j=4041 line=
FIND j=4042 line= </div id="div_vues_end" >
FIND j=4043 line=
FIND j=4044 line=<!-- kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk -->
FIND j=4045 line=
FIND j=4046 line=
FIND j=4047 line=
FIND j=4048 line=
FIND j=4049 line=
FIND j=4050 line=
FIND j=4051 line=
FIND j=4052 line=
FIND j=4053 line=
FIND j=4054 line=
FIND j=4055 line=
FIND j=4056 line= <ul id="kov_list">
FIND j=4057 line= <li v-for="(item, index) in items">
FIND j=4058 line= {{ parentMessage }} - {{ index }} - {{ item.message }}
FIND j=4059 line= </li>
FIND j=4060 line= </ul>
FIND j=4061 line= <script id="script_kov_list" >
FIND j=4062 line= var kov_list = new Vue({el: '#kov_list',
FIND j=4063 line= data: {
FIND j=4064 line= parentMessage: 'Parent',
FIND j=4065 line= items: [
FIND j=4066 line= { message: 'new' },
FIND j=4067 line= { message: 'focus' },
FIND j=4068 line= { message: 'work' },
FIND j=4069 line= { message: 'memes' },
FIND j=4070 line= { message: 'jtfdc' },
FIND j=4071 line= { message: 'jtfinc' },
FIND j=4072 line= { message: 'byrdpucker',
FIND j=4073 line= { message: 'jkwii' },
FIND j=4074 line= { message: 'kou' },
FIND j=4075 line= { message: 'kassil' },
FIND j=4076 line= { message: 'konet' },
FIND j=4077 line= { message: 'iperms' },
FIND j=4078 line= { message: 'konabus' },
FIND j=4079 line= { message: 'kt' },
FIND j=4080 line= { message: 'go' },
FIND j=4081 line= { message: 'old' }
FIND j=4082 line= ]
FIND j=4083 line= }
FIND j=4084 line= })
FIND j=4085 line= </script id="script_kov_list" >
FIND j=4086 line=
FIND j=4087 line=
FIND j=4088 line= <div id="div_url">
FIND j=4089 line= <script id="script_url">
FIND j=4090 line= var url = document.createElement("a");
FIND j=4091 line= url.href=location.href;
FIND j=4092 line= var output = "output";
FIND j=4093 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
FIND j=4094 line=
FIND j=4095 line=// if( url.search != "" ) {
FIND j=4096 line=// script_zm_view( url.search );
FIND j=4097 line=// }
FIND j=4098 line=
FIND j=4099 line=// alert(location.href)
FIND j=4100 line=// alert(url.protocol)
FIND j=4101 line=// alert(url.hostname)
FIND j=4102 line=// alert(url.pathname)
FIND j=4103 line=// alert(url.search)
FIND j=4104 line=// alert(url.hash)
FIND j=4105 line=
FIND j=4106 line=
FIND j=4107 line=// document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
FIND j=4108 line=// document.write( "pathname=" + url.pathname + " search=" + url.search );
FIND j=4109 line= </script>
FIND j=4110 line= </script id="script_url">
FIND j=4111 line= </div id="div_url">
FIND j=4112 line=
FIND j=4113 line=
FIND j=4114 line=
FIND j=4115 line= <script id="script_document_ready" type="text/javascript">
FIND j=4116 line= $(document).ready(function() {
FIND j=4117 line=// sets the draggable
FIND j=4118 line= $('#drag .drg').draggable({
FIND j=4119 line= cursor: 'move', // sets the cursor apperance
FIND j=4120 line= revert: 'valid'
FIND j=4121 line= });
FIND j=4122 line=
FIND j=4123 line=// sets droppable
FIND j=4124 line=// after the draggable is droped, hides it with a hide() effect
FIND j=4125 line= $('#drop').droppable({
FIND j=4126 line= drop: function(event, ui) {
FIND j=4127 line= ui.draggable.hide(1000);
FIND j=4128 line= }
FIND j=4129 line= });
FIND j=4130 line=
FIND j=4131 line=// after the draggable is droped, hides it with a hide() effect
FIND j=4132 line= $('#drop1').droppable({
FIND j=4133 line= drop: function(event, ui) {
FIND j=4134 line= ui.draggable.hide(1000);
FIND j=4135 line= }
FIND j=4136 line= });
FIND j=4137 line=
FIND j=4138 line=// after the draggable is droped, hides it with a hide() effect
FIND j=4139 line= $('#drop2').droppable({
FIND j=4140 line= drop: function(event, ui) {
FIND j=4141 line= ui.draggable.hide(1000);
FIND j=4142 line= }
FIND j=4143 line= });
FIND j=4144 line=
FIND j=4145 line=// when the "#sw" element (inside the "#drop") is clicked
FIND j=4146 line=// show the items with class "drg", contained in "#drag"
FIND j=4147 line=// $('#drag .drg').slideDown(1000);
FIND j=4148 line= $('#drop #sw').click(function(){
FIND j=4149 line= var url = "/ko_center/ko_center.php?q=jqui/dragdrop1/"
FIND j=4150 line= $(location).attr('href',url);
FIND j=4151 line= });
FIND j=4152 line= });
FIND j=4153 line= </script id="script_document_ready" >
FIND j=4154 line=
FIND j=4155 line=
FIND j=4156 line=
FIND j=4157 line= <script id="script_load_liks" >
FIND j=4158 line= var svc_links = new Array();
FIND j=4159 line= var ko_links = new Array();
FIND j=4160 line= var us_links = new Array();
FIND j=4161 line= var u_links = new Array();
FIND j=4162 line= var now_links = new Array();
FIND j=4163 line= var srv_links = new Array();
FIND j=4164 line= var kov_links = new Array();
FIND j=4165 line= function load_svc_links() {
FIND j=4166 line= var j=0;
FIND j=4167 line= svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
FIND j=4168 line= svc_links[j++]="/index_bb.html|/imgs/links/index_bb.png|index_bb|/imgs/btn/kob.png";
FIND j=4169 line= svc_links[j++]="/index_bp.html|/imgs/links/index_bp.png|index_bb|/imgs/btn/kob.png";
FIND j=4170 line= svc_links[j++]="/index_dd.html|/imgs/links/index_dd.png|index_dd|/imgs/btn/kob.png";
FIND j=4171 line= svc_links[j++]="/index_dl.html|/imgs/links/index_dl.png|index_dl|/imgs/btn/kob.png";
FIND j=4172 line= svc_links[j++]="/index_dp.html|/imgs/links/index_dp.png|index_dp|/imgs/btn/kob.png";
FIND j=4173 line= svc_links[j++]="/index_fl.html|/imgs/links/index_fl.png|index_fl|/imgs/btn/kob.png";
FIND j=4174 line= svc_links[j++]="/index_jg.html|/imgs/links/index_jg.png|index_jg|/imgs/btn/kob.png";
FIND j=4175 line= svc_links[j++]="/index_pn.html|/imgs/links/index_pn.png|index_pn|/imgs/btn/kob.png";
FIND j=4176 line= svc_links[j++]="/index_sc.html|/imgs/links/index_sc.png|index_sc|/imgs/btn/kob.png";
FIND j=4177 line= svc_links[j++]="/index_sl.html|/imgs/links/index_sl.png|index_sl|/imgs/btn/kob.png";
FIND j=4178 line= svc_links[j++]="/index_tl.html|/imgs/links/index_tl.png|index_tl|/imgs/btn/kob.png";
FIND j=4179 line= svc_links[j++]="/index_tm.html|/imgs/links/index_tm.png|index_tm|/imgs/btn/kob.png";
FIND j=4180 line= svc_links[j++]="/index_us.html|/imgs/links/index_us.png|index_us|/imgs/btn/kob.png";
FIND j=4181 line= svc_links[j++]="/index_wc.html|/imgs/links/index_wc.png|index_wc|/imgs/btn/kob.png";
FIND j=4182 line= svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
FIND j=4183 line= svc_links[j++]="/index_zm.html|/imgs/links/index_zm.png|index_zm|/imgs/btn/kob.png";
FIND j=4184 line= return( svc_links );
FIND j=4185 line= }
FIND j=4186 line=
FIND j=4187 line= function load_srv_links() {
FIND j=4188 line= srv_links[0]="ko0.us/index.html|/imgs/btn/koeyeb.png|ko0us|/imgs/btn/kob.png";
FIND j=4189 line= srv_links[1]="ko1.us/index.html|/imgs/btn/koeye.png|ko1us|/imgs/btn/kop1234.png";
FIND j=4190 line= srv_links[2]="ko2.us/index.html|/imgs/btn/koeyew.png|ko2us|/imgs/btn/kow.png";
FIND j=4191 line= srv_links[3]="konet.org/index.html|/imgs/btn/ko.png|konet-org|/imgs/btn/kib.png";
FIND j=4192 line= srv_links[4]="iperms.com/index.html|/imgs/links/iperms.png|iperms-com|/imgs/btn/kop34.png";
FIND j=4193 line= srv_links[5]="kassil.com/index.html|/imgs/links/kassil.png|kassil-com|/imgs/btn/kop12.png";
FIND j=4194 line= return( srv_links );
FIND j=4195 line= }
FIND j=4196 line=
FIND j=4197 line= function load_ko_links() {
FIND j=4198 line= var j=0;
FIND j=4199 line= ko_links[j++]="/jkwii/blackboard.html|/imgs/links/blackboard.png|blackboard|/imgs/btn/koeye.png";
FIND j=4200 line= ko_links[j++]="/jkwii/js/threejs/examples/index.html|/imgs/links/index_js3d.png|index_js3d|/imgs/btn/koeye.png";
FIND j=4201 line= ko_links[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
FIND j=4202 line= ko_links[j++]="/jkwii/js/gojs/index.html|/imgs/links/index_jsgo.png|index_jsgo|/imgs/btn/koeye.png";
FIND j=4203 line= ko_links[j++]="/index_jsdk.html|/imgs/links/index_jsdk.png|index_jsdk|/imgs/btn/koeye.png";
FIND j=4204 line= ko_links[j++]="/jkwii/koh5_globe/koh5_globe.html|/imgs/links/koh5_globe.png|koh5_globe|/imgs/btn/koeye.png";
FIND j=4205 line= ko_links[j++]="/jkwii/aud/keybd/index.html|/imgs/links/index_jskb.png|index_jskb|/imgs/btn/koeye.png";
FIND j=4206 line= ko_links[j++]="/svc/kokbdm/index.html|/imgs/links/index_jskb-dm.png|index_jskb-dm|/imgs/btn/koeye.png";
FIND j=4207 line= ko_links[j++]="/svc/kokbdms/index.html|/imgs/links/index_jskb-dms.png|index_jskb-dms|/imgs/btn/koeye.png";
FIND j=4208 line= ko_links[j++]="/piano.html|/imgs/links/index_piano.png|index_piano|/imgs/btn/koeye.png";
FIND j=4209 line= ko_links[j++]="/jkwii/aud/piano_uri/koh5_piano_uri.html|/imgs/links/index_jskb-uri.png|index_jskb_uri|/imgs/btn/koeye.png";
FIND j=4210 line= ko_links[j++]="/ko/svc/js/stemkoskijs/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
FIND j=4211 line= ko_links[j++]="/ko/svc/aud/mrcoles/koh5_mrcoles.html|/imgs/links/mrcoles.png|mrcoles|/imgs/btn/koeye.png";
FIND j=4212 line= ko_links[j++]="http://effectgames.com/demos/canvascycle/|/imgs/links/index_effectgames.png|index_effectgames|/imgs/btn/koeye.png";
FIND j=4213 line= ko_links[j++]="https://www.leshylabs.com/apps/sfMaker/|/imgs/links/index_sfmaker.png|index_sfmaker|/imgs/btn/koeye.png";
FIND j=4214 line= ko_links[j++]="https://dragongoserver.net/|/imgs/links/index_dgs.png|index_dgs|/imgs/btn/koeye.png";
FIND j=4215 line= ko_links[j++]="/ko_center/ko_center.php|/imgs/links/ko_center.png|ko_center|/imgs/btn/kob.png";
FIND j=4216 line= ko_links[j++]="/ko_saic/ko_saic.php|/imgs/links/ko_saic.png|ko_saic|/imgs/btn/kob.png";
FIND j=4217 line= ko_links[j++]="/index_kt.html|/imgs/links/index_kt.png|index_kt|/imgs/btn/kob.png";
FIND j=4218 line= ko_links[j++]="/index_jtf.html|/imgs/links/index_jtf.png|index_jtf|/imgs/btn/kob.png";
FIND j=4219 line= ko_links[j++]="/index2big.html|/imgs/links/index2big.png|index2big|/imgs/btn/kob.png";
FIND j=4220 line= ko_links[j++]="/index2big.htm|/imgs/links/index2big_noel.png|index2big_noel|/imgs/btn/kob.png";
FIND j=4221 line= ko_links[j++]="/jkwii/whiteboard.html|/imgs/links/whiteboard.png|whiteboard|/imgs/btn/koeye.png";
FIND j=4222 line= return( ko_links );
FIND j=4223 line= }
FIND j=4224 line=
FIND j=4225 line=
FIND j=4226 line=
FIND j=4227 line= function load_us_links() {
FIND j=4228 line= var j=0;
FIND j=4229 line=// https://www.yelp.com/biz_photos/rechtin-family-and-cosmetic-dental-care-st-louis-2?adjust_creative=dWJMtmYxpd5N5yoyzSuhtA&utm_campaign=yelp_api&utm_medium=api_v2_business&utm_source=dWJMtmYxpd5N5yoyzSuhtA|
FIND j=4230 line= us_links[j++]="/us/med/kov_rechtin.html|/imgs/us/med_rechtin.png|med_rechtin|/imgs/btn/koeye.png|med";
FIND j=4231 line= us_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
FIND j=4232 line= us_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
FIND j=4233 line=
FIND j=4234 line= us_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
FIND j=4235 line= us_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
FIND j=4236 line= us_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
FIND j=4237 line= us_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
FIND j=4238 line= us_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
FIND j=4239 line= us_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
FIND j=4240 line= us_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
FIND j=4241 line= us_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
FIND j=4242 line= us_links[j++]="http://www.fdazol.com/|/imgs/us/law_azol.png|law_azol_f|/imgs/btn/koeye.png|law";
FIND j=4243 line=
FIND j=4244 line= us_links[j++]="https://jmhalumni.com|/imgs/us/jmhalumni.png|ed_jmhalumni|/imgs/btn/koeye.png|edu";
FIND j=4245 line= us_links[j++]="https://johnmarshallhighschool.com|/imgs/us/johnmarshallhighschool.png|ed_johnmarshallhighschool|/imgs/btn/koeye.png|edu";
FIND j=4246 line= us_links[j++]="https://www.greatschools.org/kentucky/brandenburg/1993-Brandenburg-High-School/|/imgs/us/brandenburg_highschool.png|ed_brandenburg-highschool|/imgs/btn/koeye.png|edu";
FIND j=4247 line= us_links[j++]="https://www.hazelwoodschools.org/Page/3143|/imgs/us/hazelwood_schools.png|ed_hazelwood_schools|/imgs/btn/koeye.png|edu";
FIND j=4248 line= us_links[j++]="https://bw.edu|/imgs/us/bw.png|ed_bw|/imgs/btn/koeye.png|edu";
FIND j=4249 line=
FIND j=4250 line= us_links[j++]="http://oldtowndonuts.com|/imgs/us/oldtowndonuts.png|food_oldtowndonuts|/imgs/btn/koeye.png|food";
FIND j=4251 line= us_links[j++]="http://farkaspastries.com|/imgs/us/farkaspastries.png|food_farkaspastries|/imgs/btn/koeye.png|food";
FIND j=4252 line= us_links[j++]="https://www.facebook.com/HansaImportHouse|/imgs/us/hansaimporthouse.png|food_hansaimporthouse|/imgs/btn/koeye.png|food";
FIND j=4253 line= us_links[j++]="http://havanagrillco.com|/imgs/us/havanagrillco.png|food_havanagrillco|/imgs/btn/koeye.png|food";
FIND j=4254 line= us_links[j++]="http://spiros-restaurant.com|/imgs/us/spiros_restaurant.png|food_spiros_restaurant|/imgs/btn/koeye.png|food";
FIND j=4255 line= us_links[j++]="https://www.opentable.com/jake-and-tellys-greek-taverna?page=1|/imgs/us/food_jake_tellys.png|food_jake_tellys|/imgs/btn/koeye.png|food";
FIND j=4256 line= us_links[j++]="http://edelweissrest.com|/imgs/us/edelweissrest.png|food_edelweissrest|/imgs/btn/koeye.png|food";
FIND j=4257 line= us_links[j++]="http://bierwerks.com|/imgs/us/food_bierwerks.png|food_bierwerks|/imgs/btn/koeye.png|food";
FIND j=4258 line= us_links[j++]="http://www.savellispizzapastasubs.com/|/imgs/us/food_savellispizza.png|food_savellispizza|/imgs/bmtn/koeye.png|food";
FIND j=4259 line= us_links[j++]="https://www.facebook.com/woohoogreekfood2/|/imgs/us/woohoogreekfood2.png|food_woohoogreekfood2|/imgs/btn/koeye.png|food";
FIND j=4260 line=
FIND j=4261 line= us_links[j++]="https://bdo.com/about/us-locations/bdo-st-louis|/imgs/us/bdo-stl.png|acct_bdo-stl|/imgs/btn/koeye.png|acct";
FIND j=4262 line= us_links[j++]="https://bdo.com/about/us-locations/bdo-cleveland-office|/imgs/us/bdo-cle.png|acct_bdo-cle|/imgs/btn/koeye.png|acct";
FIND j=4263 line= us_links[j++]="http://www.gatewayloan.com/|/imgs/us/gateway_mortgage.png|gateway_mortgage|/imgs/btn/koeye.png|acct";
FIND j=4264 line= us_links[j++]="https://chesonsulting.com|/imgs/us/checonsulting.png|biz_checonsulting|/imgs/btn/koeye.png|biz";
FIND j=4265 line= us_links[j++]="http://saic.com|/imgs/us/saic.png|saic|/imgs/btn/koeye.png|biz";
FIND j=4266 line= us_links[j++]="http://leidos.com|/imgs/us/leidos.png|leidos|/imgs/btn/koeye.png|biz";
FIND j=4267 line=
FIND j=4268 line=
FIND j=4269 line= us_links[j++]="http://ko2.us/index_focus.com|/imgs/us/focus_solutions.png|focus_solutions|/imgs/btn/koeye.png|biz";
FIND j=4270 line= us_links[j++]="http://www.finduslocal.com/hardware-stores/kentucky/brandenburg/allens-s-t-hardware-inc|/imgs/us/biz_allens_hardware.png|biz_allens_hardware|/imgs/btn/koeye.png|biz";
FIND j=4271 line= us_links[j++]="http://growwarehouse.com|/imgs/us/grow_warehouse.png|grow_warehouse|/imgs/btn/koeye.png|biz";
FIND j=4272 line= us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
FIND j=4273 line= us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
FIND j=4274 line= us_links[j++]="http://www.savellidanceandmartialarts.com/?load=html|/imgs/us/savelli_dance_martialarts.png|savelli_dance_martialarts|/imgs/btn/koeye.png|phy";
FIND j=4275 line= us_links[j++]="http://myfusiondance.com/?load=html|/imgs/us/fusion_dance.png|fusion_dance|/imgs/btn/koeye.png|phy";
FIND j=4276 line= us_links[j++]="http://www.superseriesbaseball.com/|/imgs/us/super_series_baseball.png|super_series_baseball|/imgs/btn/koeye.png|phy";
FIND j=4277 line=
FIND j=4278 line= us_links[j++]="https://ftknox.afceachapters.org/|/imgs/us/afcea_knox.png|afcea_knox|/imgs/btn/koeye.png|org";
FIND j=4279 line= us_links[j++]="https://scott.afceachapters.org/|/imgs/us/afcea_scott.png|afcea_scott|/imgs/btn/koeye.png|org";
FIND j=4280 line= us_links[j++]="https://www.ble-t.org/|/imgs/us/ble.png|ble|/imgs/btn/koeye.png|org";
FIND j=4281 line= us_links[j++]="http://www.doevalley.org/|/imgs/us/doe_valley.png|doe_valley|/imgs/btn/koeye.png|org";
FIND j=4282 line=
FIND j=4283 line= us_links[j++]="http://www.chapelofthecross.org/|/imgs/us/chapel_of_the_cross.png|chapel_of_the_cross|/imgs/btn/koeye.png|rel";
FIND j=4284 line= us_links[j++]="https://www.lds.org/temples/details/st.-louis-missouri-temple|/imgs/us/lds_stl.png|lds_stl|/imgs/btn/koeye.png|rel";
FIND j=4285 line= us_links[j++]="https://www.bethanyenglish.org/|/imgs/us/bethany_english_lutheran.png|bethany_english_lutheran|/imgs/btn/koeye.png|rel";
FIND j=4286 line= us_links[j++]="https://www.meadecountymessenger.com/|/imgs/us/meade_county_messenger.png|meade_county_messenger|/imgs/btn/koeye.png|media";
FIND j=4287 line= us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
FIND j=4288 line= us_links[j++]="https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2088|/imgs/us/mars_jpl_nasa.png|mars_jpl_nasa|/imgs/btn/koeye.png|sci";
FIND j=4289 line= us_links[j++]="https://mars.nasa.gov/mer/gallery/all/opportunity.html|/imgs/us/mars_nasa_gov.png|mars_nasa_gov|/imgs/btn/koeye.png|sci";
FIND j=4290 line= us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
FIND j=4291 line= return( us_links );
FIND j=4292 line= }
FIND j=4293 line=
FIND j=4294 line=
FIND j=4295 line=
FIND j=4296 line= function load_u_links() {
FIND j=4297 line= var j=0;
FIND j=4298 line= u_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
FIND j=4299 line= u_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
FIND j=4300 line=
FIND j=4301 line= u_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
FIND j=4302 line= u_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
FIND j=4303 line= u_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
FIND j=4304 line= u_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
FIND j=4305 line= u_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
FIND j=4306 line= u_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
FIND j=4307 line= u_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
FIND j=4308 line= u_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
FIND j=4309 line= return( u_links );
FIND j=4310 line= }
FIND j=4311 line=
FIND j=4312 line=
FIND j=4313 line=
FIND j=4314 line= function load_now_links() {
FIND j=4315 line= var j=0;
FIND j=4316 line= now_links[j++]="http://index_party.html|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
FIND j=4317 line= now_links[j++]="http://index_jtfdc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
FIND j=4318 line= now_links[j++]="http://index_jtfinc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
FIND j=4319 line= now_links[j++]="http://index_stlc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
FIND j=4320 line= now_links[j++]="http://index_jtfdcr.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
FIND j=4321 line= now_links[j++]="http://index_byrdpucker.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
FIND j=4322 line= return( now_links );
FIND j=4323 line= }
FIND j=4324 line=
FIND j=4325 line=
FIND j=4326 line= function show_svc_links(mode) {
FIND j=4327 line= svc_links = load_svc_links();
FIND j=4328 line= htmout_svc_links = "";
FIND j=4329 line= htmout_svc_linkz = "";
FIND j=4330 line= for (i = 0; i < svc_links.length; i++) {
FIND j=4331 line= my_btnimg = "/imgs/btn/kib.png";
FIND j=4332 line= my_href = svc_links[i].split("|")[0];
FIND j=4333 line= my_popimg = svc_links[i].split("|")[1];
FIND j=4334 line= my_alt = svc_links[i].split("|")[2];
FIND j=4335 line=
FIND j=4336 line=// htmout_svc_linkz += '<div class="drag" name="'+my_alt+'" >\n';
FIND j=4337 line= htmout_svc_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
FIND j=4338 line= htmout_svc_linkz += '<img id="drg" src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
FIND j=4339 line=// htmout_svc_linkz += '</div >';
FIND j=4340 line=
FIND j=4341 line=// htmout_svc_links += '<div class="drag" name="'+my_alt+'" >\n';
FIND j=4342 line= htmout_svc_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
FIND j=4343 line= htmout_svc_links += '<img class="drag" id="drg" src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
FIND j=4344 line= htmout_svc_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
FIND j=4345 line=// htmout_svc_links += '</div >';
FIND j=4346 line= }
FIND j=4347 line= if( mode === 'pop' ) {
FIND j=4348 line= htmout_svc_links += "<br><br>\n";
FIND j=4349 line= var div_svc_links = document.getElementById('div_svc_links');
FIND j=4350 line= div_svc_links.insertAdjacentHTML('beforeend', htmout_svc_links);
FIND j=4351 line= return( htmout_svc_links );
FIND j=4352 line= }
FIND j=4353 line=
FIND j=4354 line= htmout_svc_linkz += "<br><br>\n";
FIND j=4355 line= var div_svc_linkz = document.getElementById('div_svc_linkz');
FIND j=4356 line= div_svc_linkz.insertAdjacentHTML('beforeend', htmout_svc_linkz);
FIND j=4357 line= return( htmout_svc_linkz );
FIND j=4358 line= }
FIND j=4359 line=
FIND j=4360 line= function show_ko_links(mode) {
FIND j=4361 line= ko_links = load_ko_links();
FIND j=4362 line= htmout_ko_links = "";
FIND j=4363 line= htmout_ko_linkz = "";
FIND j=4364 line= for (i = 0; i < ko_links.length; i++) {
FIND j=4365 line= my_btnimg = "/imgs/btn/koeye.png";
FIND j=4366 line= my_href = ko_links[i].split("|")[0];
FIND j=4367 line= my_popimg = ko_links[i].split("|")[1];
FIND j=4368 line= my_alt = ko_links[i].split("|")[2];
FIND j=4369 line=
FIND j=4370 line= htmout_ko_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
FIND j=4371 line= htmout_ko_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
FIND j=4372 line=
FIND j=4373 line= htmout_ko_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
FIND j=4374 line= htmout_ko_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
FIND j=4375 line= htmout_ko_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
FIND j=4376 line= }
FIND j=4377 line=
FIND j=4378 line= if( mode === 'pop' ) {
FIND j=4379 line= htmout_ko_links += "<br><br>";
FIND j=4380 line= var div_ko_links = document.getElementById('div_ko_links');
FIND j=4381 line= div_ko_links.insertAdjacentHTML('beforeend', htmout_ko_links);
FIND j=4382 line= return( htmout_ko_links );
FIND j=4383 line= }
FIND j=4384 line=
FIND j=4385 line= htmout_ko_linkz += "<br><br>";
FIND j=4386 line= var div_ko_linkz = document.getElementById('div_ko_linkz');
FIND j=4387 line= div_ko_linkz.insertAdjacentHTML('beforeend', htmout_ko_linkz);
FIND j=4388 line= return( htmout_ko_linkz );
FIND j=4389 line= }
FIND j=4390 line=
FIND j=4391 line=
FIND j=4392 line= function show_us_links(mode) {
FIND j=4393 line= us_links = load_us_links();
FIND j=4394 line= htmout_us_links = "";
FIND j=4395 line= htmout_us_linkz = "";
FIND j=4396 line= for (i = 0; i < us_links.length; i++) {
FIND j=4397 line= my_btnimg = "/imgs/btn/koeye.png";
FIND j=4398 line= my_href = us_links[i].split("|")[0];
FIND j=4399 line= my_popimg = us_links[i].split("|")[1];
FIND j=4400 line= my_alt = us_links[i].split("|")[2];
FIND j=4401 line=
FIND j=4402 line= htmout_us_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
FIND j=4403 line= htmout_us_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
FIND j=4404 line=
FIND j=4405 line= htmout_us_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
FIND j=4406 line= htmout_us_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
FIND j=4407 line= htmout_us_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
FIND j=4408 line= }
FIND j=4409 line=
FIND j=4410 line= if( mode === 'pop' ) {
FIND j=4411 line= htmout_us_links += "<br><br>";
FIND j=4412 line= var div_us_links = document.getElementById('div_us_links');
FIND j=4413 line= div_us_links.insertAdjacentHTML('beforeend', htmout_us_links);
FIND j=4414 line= return( htmout_us_links );
FIND j=4415 line= }
FIND j=4416 line=
FIND j=4417 line= htmout_us_linkz += "<br><br>";
FIND j=4418 line= var div_us_linkz = document.getElementById('div_us_linkz');
FIND j=4419 line= div_us_linkz.insertAdjacentHTML('beforeend', htmout_us_linkz);
FIND j=4420 line= return( htmout_us_linkz );
FIND j=4421 line= }
FIND j=4422 line=
FIND j=4423 line=
FIND j=4424 line=
FIND j=4425 line=
FIND j=4426 line=
FIND j=4427 line=
FIND j=4428 line=
FIND j=4429 line= function show_u_links(mode) {
FIND j=4430 line= u_links = load_u_links();
FIND j=4431 line= htmout_u_links = "";
FIND j=4432 line= htmout_u_linkz = "";
FIND j=4433 line= for (i = 0; i < u_links.length; i++) {
FIND j=4434 line= my_btnimg = "/imgs/btn/koeye.png";
FIND j=4435 line= my_href = u_links[i].split("|")[0];
FIND j=4436 line= my_popimg = u_links[i].split("|")[1];
FIND j=4437 line= my_alt = u_links[i].split("|")[2];
FIND j=4438 line=
FIND j=4439 line= htmout_u_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
FIND j=4440 line= htmout_u_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
FIND j=4441 line=
FIND j=4442 line= htmout_u_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
FIND j=4443 line= htmout_u_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
FIND j=4444 line= htmout_u_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
FIND j=4445 line= }
FIND j=4446 line=
FIND j=4447 line= if( mode === 'pop' ) {
FIND j=4448 line= htmout_u_links += "<br><br>";
FIND j=4449 line= var div_u_links = document.getElementById('div_u_links');
FIND j=4450 line= div_u_links.insertAdjacentHTML('beforeend', htmout_u_links);
FIND j=4451 line= return( htmout_u_links );
FIND j=4452 line= }
FIND j=4453 line=
FIND j=4454 line= htmout_u_linkz += "<br><br>";
FIND j=4455 line= var div_u_linkz = document.getElementById('div_u_linkz');
FIND j=4456 line= div_u_linkz.insertAdjacentHTML('beforeend', htmout_u_linkz);
FIND j=4457 line= return( htmout_u_linkz );
FIND j=4458 line= }
FIND j=4459 line=
FIND j=4460 line=
FIND j=4461 line=
FIND j=4462 line= function show_now_links(mode) {
FIND j=4463 line= now_links = load_now_links();
FIND j=4464 line= htmout_now_links = "";
FIND j=4465 line= htmout_now_linkz = "";
FIND j=4466 line= for (i = 0; i < now_links.length; i++) {
FIND j=4467 line= my_btnimg = "/imgs/btn/koeye.png";
FIND j=4468 line= my_href = now_links[i].split("|")[0];
FIND j=4469 line= my_popimg = now_links[i].split("|")[1];
FIND j=4470 line= my_alt = now_links[i].split("|")[2];
FIND j=4471 line=
FIND j=4472 line= htmout_now_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
FIND j=4473 line= htmout_now_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
FIND j=4474 line=
FIND j=4475 line= htmout_now_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
FIND j=4476 line= htmout_now_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
FIND j=4477 line= htmout_now_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
FIND j=4478 line= }
FIND j=4479 line=
FIND j=4480 line= if( mode === 'pop' ) {
FIND j=4481 line= htmout_now_links += "<br><br>";
FIND j=4482 line= var div_now_links = document.getElementById('div_now_links');
FIND j=4483 line= div_now_links.insertAdjacentHTML('beforeend', htmout_now_links);
FIND j=4484 line= return( htmout_now_links );
FIND j=4485 line= }
FIND j=4486 line=
FIND j=4487 line= htmout_now_linkz += "<br><br>";
FIND j=4488 line= var div_now_linkz = document.getElementById('div_now_linkz');
FIND j=4489 line= div_now_linkz.insertAdjacentHTML('beforeend', htmout_now_linkz);
FIND j=4490 line= return( htmout_now_linkz );
FIND j=4491 line= }
FIND j=4492 line=
FIND j=4493 line= function show_srv_links(mode) {
FIND j=4494 line= srv_links = load_srv_links();
FIND j=4495 line= htmout_srv_links = "";
FIND j=4496 line= htmout_srv_linkz = "";
FIND j=4497 line= for (i = 0; i < srv_links.length; i++) {
FIND j=4498 line= my_btnimg = "/imgs/btn/kiw.png";
FIND j=4499 line= my_href = srv_links[i].split("|")[0];
FIND j=4500 line= my_popimg = srv_links[i].split("|")[1];
FIND j=4501 line= my_alt = srv_links[i].split("|")[2];
FIND j=4502 line=
FIND j=4503 line= htmout_srv_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
FIND j=4504 line= htmout_srv_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
FIND j=4505 line=
FIND j=4506 line= htmout_srv_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
FIND j=4507 line= htmout_srv_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
FIND j=4508 line= htmout_srv_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
FIND j=4509 line= }
FIND j=4510 line= if( mode === 'pop' ) {
FIND j=4511 line= htmout_srv_links += "<br><br>\n"
FIND j=4512 line= var div_srv_links = document.getElementById('div_srv_links');
FIND j=4513 line= div_srv_links.insertAdjacentHTML('beforeend', htmout_srv_links);
FIND j=4514 line= return( htmout_srv_links );
FIND j=4515 line= }
FIND j=4516 line=
FIND j=4517 line= htmout_srv_linkz += "<br><br>\n"
FIND j=4518 line= var div_srv_linkz = document.getElementById('div_srv_linkz');
FIND j=4519 line= div_srv_linkz.insertAdjacentHTML('beforeend', htmout_srv_linkz);
FIND j=4520 line= return( htmout_srv_linkz );
FIND j=4521 line= }
FIND j=4522 line=
FIND j=4523 line=// document.write( htmout_svc_links );
FIND j=4524 line=// document.write( htmout_ko_links );
FIND j=4525 line=// document.write( htmout_srv_links );
FIND j=4526 line=
FIND j=4527 line=// var div_ko_links = document.getElementById("div_ko_links");
FIND j=4528 line=// var div_ko_links_orig = div_ko_links.innerHTML;
FIND j=4529 line=// alert( "BUGS_500 div_ko_links_orig="+div_ko_links_orig );
FIND j=4530 line=
FIND j=4531 line=// div_ko_links.innerHTML = "";
FIND j=4532 line=// div_ko_links.appendChild( htmout_ko_links);
FIND j=4533 line=
FIND j=4534 line=
FIND j=4535 line=// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
FIND j=4536 line=//
FIND j=4537 line=// getElementById("foo").insertAdjacentHTML
FIND j=4538 line=// <!-- beforebegin / before -->
FIND j=4539 line=// <p>
FIND j=4540 line=// <!-- afterbegin / prepend -->
FIND j=4541 line=// foo
FIND j=4542 line=// <!-- beforeend / append -->
FIND j=4543 line=// </p>
FIND j=4544 line=// <!-- afterend / after-->
FIND j=4545 line=//
FIND j=4546 line=// document.getElementById('foo').insertAdjacentHTML("beforebegin", "<hr>")
FIND j=4547 line=// $('#foo').before("<hr>")
FIND j=4548 line=// document.getElementById('foo').insertAdjacentHTML("afterend", "<hr>")
FIND j=4549 line=// $('#foo').append("<hr>")
FIND j=4550 line=// document.getElementById('foo').insertAdjacentHTML("beforeend", "<hr>")
FIND j=4551 line=// $('#foo').append("<hr>")
FIND j=4552 line=// document.getElementById('foo').insertAdjacentHTML("afterbegin", "<hr>")
FIND j=4553 line=// $('#foo').prepend("<hr>")
FIND j=4554 line=//
FIND j=4555 line=// var btn = document.getElementById('btn'); // The button itself with an ID of 'btn'
FIND j=4556 line=// var newButton = '<button>New button</button>'; // New button to be inserted
FIND j=4557 line=// btn.insertAdjacentHTML('afterend', newButton);
FIND j=4558 line=//
FIND j=4559 line=// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
FIND j=4560 line= function show_all_links(mode) {
FIND j=4561 line= show_svc_links(mode);
FIND j=4562 line= show_ko_links(mode);
FIND j=4563 line= show_us_links(mode);
FIND j=4564 line= show_u_links(mode);
FIND j=4565 line= show_now_links(mode);
FIND j=4566 line= show_srv_links(mode);
FIND j=4567 line= }
FIND j=4568 line=
FIND j=4569 line= </script id="script_load_liks" >
FIND j=4570 line=
FIND j=4571 line= <div id="div_links" >
FIND j=4572 line= <hr color=red>
FIND j=4573 line= <div id="div_svc_links" > </div>
FIND j=4574 line= <hr color=red>
FIND j=4575 line=
FIND j=4576 line= <hr color=white>
FIND j=4577 line= <div id="div_ko_links" > </div>
FIND j=4578 line= <hr color=white>
FIND j=4579 line=
FIND j=4580 line= <hr color=white>
FIND j=4581 line= <div id="div_us_links" > </div>
FIND j=4582 line= <hr color=white>
FIND j=4583 line=
FIND j=4584 line= <hr color=white>
FIND j=4585 line= <div id="div_u_links" > </div>
FIND j=4586 line= <hr color=white>
FIND j=4587 line=
FIND j=4588 line= <hr color=white>
FIND j=4589 line= <div id="div_now_links" > </div>
FIND j=4590 line= <hr color=white>
FIND j=4591 line=
FIND j=4592 line= <hr color=blue>
FIND j=4593 line= <div id="div_srv_links" > </div>
FIND j=4594 line= <hr color=blue>
FIND j=4595 line= </div id="div_links" >
FIND j=4596 line=
FIND j=4597 line= <div id="div_linkz" >
FIND j=4598 line= <hr color=red>
FIND j=4599 line= <div id="div_svc_linkz" > </div>
FIND j=4600 line= <hr color=red>
FIND j=4601 line=
FIND j=4602 line= <hr color=black>
FIND j=4603 line= <div id="div_ko_linkz" > </div>
FIND j=4604 line= <hr color=black>
FIND j=4605 line=
FIND j=4606 line= <hr color=black>
FIND j=4607 line= <div id="div_us_linkz" > </div>
FIND j=4608 line= <hr color=black>
FIND j=4609 line=
FIND j=4610 line= <hr color=black>
FIND j=4611 line= <div id="div_u_linkz" > </div>
FIND j=4612 line= <hr color=black>
FIND j=4613 line=
FIND j=4614 line= <hr color=black>
FIND j=4615 line= <div id="div_now_linkz" > </div>
FIND j=4616 line= <hr color=black>
FIND j=4617 line=
FIND j=4618 line= <hr color=blue>
FIND j=4619 line= <div id="div_srv_linkz" > </div>
FIND j=4620 line= <hr color=blue>
FIND j=4621 line= </div id="div_linkz" >
FIND j=4622 line=
FIND j=4623 line= <div id="div_cfaa" class=ko>
FIND j=4624 line=<!-- -->
FIND j=4625 line=
FIND j=4626 line= <script id="script_cfaa">
FIND j=4627 line= var text_cfaa =
FIND j=4628 line=`
FIND j=4629 line=pqpqpqpqpqpqpqpqpqpq Warning pqpqpqpqpqpqpqpqpqpq<br>
FIND j=4630 line=<br>
FIND j=4631 line=This site may be protected under the
FIND j=4632 line=<br>
FIND j=4633 line=<br>
FIND j=4634 line=<b>CFAA</b>
FIND j=4635 line=<br>
FIND j=4636 line=Computer Fraud and Abuse Act
FIND j=4637 line=<br>
FIND j=4638 line=<br>
FIND j=4639 line=your attemped access has been logged
FIND j=4640 line=<br>
FIND j=4641 line=repeated attemps by unauthorized guests will be reported
FIND j=4642 line=<br>
FIND j=4643 line=<br>
FIND j=4644 line=By continuing You are acknowledging
FIND j=4645 line=<br>
FIND j=4646 line=you are fully authorized and
FIND j=4647 line=<br>
FIND j=4648 line=understand the responsibilites to access the content on the site
FIND j=4649 line=<br>
FIND j=4650 line=<br>
FIND j=4651 line=This page must not be removed
FIND j=4652 line=<br>
FIND j=4653 line=bdbdbdbdbdbdbdbdbdbd Warning bdbdbdbdbdbdbdbdbdbd
FIND j=4654 line=<br>
FIND j=4655 line=<br>
FIND j=4656 line=unauthoriced users should
FIND j=4657 line=<br>
FIND j=4658 line=consider browsing elsewhere:
FIND j=4659 line=
FIND j=4660 line=
FIND j=4661 line=<hr color=black>
FIND j=4662 line=<hr color=ivory>
FIND j=4663 line=<hr color=red>
FIND j=4664 line=<hr color=blue>
FIND j=4665 line=<hr color=ebony>
FIND j=4666 line=<hr color=white>
FIND j=4667 line=
FIND j=4668 line=<a href=duckduckgo.com > <img src="ok.png" alt="duckduckgo" height=10 border=0></a>
FIND j=4669 line=     
FIND j=4670 line=<a href=bing.com > <img src="ok.png" alt="bing" height=10 border=0></a>
FIND j=4671 line=     
FIND j=4672 line=<a href=google.com > <img src="ok.png" alt="google" height=10 border=0></a>
FIND j=4673 line=     
FIND j=4674 line=<a href=yahoo.com > <img src="ok.png" alt="yahoo" height=10 border=0></a>
FIND j=4675 line=     
FIND j=4676 line= <a href=https://mars.jpl.nasa.gov/msl/multimedia/raw target=_blank>
FIND j=4677 line= <img src="ok.png" border=0 height=10>
FIND j=4678 line= </a>
FIND j=4679 line=     
FIND j=4680 line= <a href=http://youtube.com target=_blank>
FIND j=4681 line= <img src="ok.png" border=0 height=10>
FIND j=4682 line= </a>
FIND j=4683 line= </div id="div_cfaa" class=ko>
FIND j=4684 line=
FIND j=4685 line=<hr color=white>
FIND j=4686 line=<hr color=ebony>
FIND j=4687 line=<hr color=blue>
FIND j=4688 line=<hr color=red>
FIND j=4689 line=<hr color=ivory>
FIND j=4690 line=<hr color=black>
FIND j=4691 line=
FIND j=4692 line= <div id="div_warn2" class=ko>
FIND j=4693 line= <p id=p_warn2 class=ko>
FIND j=4694 line= <hr color=black>
FIND j=4695 line= <hr color=white>
FIND j=4696 line= <hr color=red>
FIND j=4697 line= If you are seeing this page
FIND j=4698 line= <br>
FIND j=4699 line= you are probably unauthorized
FIND j=4700 line= <br>
FIND j=4701 line= you should <b>NOT</b> continue
FIND j=4702 line= <br>
FIND j=4703 line= accessing site content here may be
FIND j=4704 line= <br>
FIND j=4705 line= protected under <b>CFAA</b>
FIND j=4706 line= <hr color=red>
FIND j=4707 line= <hr color=white>
FIND j=4708 line= <hr color=black>
FIND j=4709 line= </p>
FIND j=4710 line=
FIND j=4711 line= authorized sites are available from bluehost
FIND j=4712 line=
FIND j=4713 line= <a href="https://www.bluehost.com/?utm_source=%28direct%29&utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype" target=_blank>
FIND j=4714 line= <img src=/imgs/bh/bh_anim.gif height=30 border=0 alt=bluehost.com affiliate></a>
FIND j=4715 line= <div id=kobh_offer class=ko>
FIND j=4716 line= bluehost offers
FIND j=4717 line= 50 gb space
FIND j=4718 line= 999 gb bandwidth
FIND j=4719 line=
FIND j=4720 line= 6 domains on 1 account
FIND j=4721 line= and more for only $6.95/month
FIND j=4722 line= </div>
FIND j=4723 line= </div id="div_warn2" class=ko>
FIND j=4724 line=
FIND j=4725 line=
FIND j=4726 line= <script id="script_url">
FIND j=4727 line= var url = document.createElement("a");
FIND j=4728 line= url.href=location.href
FIND j=4729 line= var output = "output"
FIND j=4730 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
FIND j=4731 line=// alert(location.href)
FIND j=4732 line=// alert(url.protocol)
FIND j=4733 line=// alert(url.hostname)
FIND j=4734 line=// alert(url.pathname)
FIND j=4735 line=// alert(url.search)
FIND j=4736 line=// alert(url.hash)
FIND j=4737 line=
FIND j=4738 line= if( url.search == "" ) {document.write( text_cfaa );}
FIND j=4739 line= if( url.search == "?q=cfaa" ) {document.write( text_cfaa ); }
FIND j=4740 line= </script id="script_url">
FIND j=4741 line= </div>
FIND j=4742 line=
FIND j=4743 line=
FIND j=4744 line=
FIND j=4745 line=<!--
FIND j=4746 line= <iframe id="myframe" src="/svc/kokbdm/index.html" width="1000" height="500"
FIND j=4747 line= frameborder="0" scrolling="yes"></iframe>
FIND j=4748 line= -->
FIND j=4749 line=
FIND j=4750 line= <hr color=red><hr color=black><hr color=white>
FIND j=4751 line= <button type="button" onclick="show_all_links('pop')">show_all_links</button>
FIND j=4752 line=<!-- <button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
FIND j=4753 line= <hr color=red><hr color=white><hr color=blue>
FIND j=4754 line= <button type="button" onclick="show_svc_links('pop')">show_svc_links</button>
FIND j=4755 line= <button type="button" onclick="show_ko_links('pop')">show_ko_links</button>
FIND j=4756 line= <button type="button" onclick="show_us_links('pop')">show_us_links</button>
FIND j=4757 line= <button type="button" onclick="show_u_links('pop')">show_u_links</button>
FIND j=4758 line= <button type="button" onclick="show_now_links('pop')">show_now_links</button>
FIND j=4759 line= <button type="button" onclick="show_srv_links('pop')">show_srv_links</button>
FIND j=4760 line= <hr color=blue><hr color=white><hr color=black>
FIND j=4761 line=
FIND j=4762 line=<!--
FIND j=4763 line= <img src="/imgs/btn/kib.png" height="50" size="150" alt="koeye" onclick="show_svc_links()">
FIND j=4764 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_ko_links()">
FIND j=4765 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_us_links()">
FIND j=4766 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_u_links()">
FIND j=4767 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_now_links()">
FIND j=4768 line= <img src="/imgs/btn/kiw.png" height="50" size="150" alt="koeyew" onclick="show_srv_links()">
FIND j=4769 line= -->
FIND j=4770 line=
FIND j=4771 line= <div id="div_kobuttons">
FIND j=4772 line= <a href=# class="popover" onclick="show_svc_links();">
FIND j=4773 line= <img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" >
FIND j=4774 line= <span><img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" ></span>
FIND j=4775 line= </a>
FIND j=4776 line=
FIND j=4777 line= <a href=# class="popover" onclick="show_ko_links();">
FIND j=4778 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
FIND j=4779 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
FIND j=4780 line= </a>
FIND j=4781 line=
FIND j=4782 line= <a href=# class="popover" onclick="show_us_links();">
FIND j=4783 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
FIND j=4784 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
FIND j=4785 line= </a>
FIND j=4786 line=
FIND j=4787 line= <a href=# class="popover" onclick="show_u_links();">
FIND j=4788 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
FIND j=4789 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
FIND j=4790 line= </a>
FIND j=4791 line=
FIND j=4792 line= <a href=# class="popover" onclick="show_now_links();">
FIND j=4793 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
FIND j=4794 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
FIND j=4795 line= </a>
FIND j=4796 line=
FIND j=4797 line= <a href=# class="popover" onclick="show_srv_links();">
FIND j=4798 line= <img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" >
FIND j=4799 line= <span><img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" ></span>
FIND j=4800 line= </a>
FIND j=4801 line= </div id="div_kobuttons">
FIND j=4802 line=
FIND j=4803 line= <hr color=blue><hr color=white><hr color=red>
FIND j=4804 line=
FIND j=4805 line=<!--
FIND j=4806 line= <div id="div_drop">
FIND j=4807 line= <span id="sw"><h1>drop jtfinc</h2></span>
FIND j=4808 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
FIND j=4809 line= <img height=200 width=300
FIND j=4810 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
FIND j=4811 line= </a>
FIND j=4812 line= <div id="div_drop">
FIND j=4813 line= -->
FIND j=4814 line= <hr color=red>
FIND j=4815 line= <hr color=white>
FIND j=4816 line= <hr color=blue>
FIND j=4817 line=
FIND j=4818 line= <div id="div_drag" >
FIND j=4819 line= <a class="popover" href="/?q=bigtn_drag1">
FIND j=4820 line= <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
FIND j=4821 line= <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
FIND j=4822 line= </a>
FIND j=4823 line= </div id="div_drag" >
FIND j=4824 line=
FIND j=4825 line=
FIND j=4826 line=
FIND j=4827 line= <div id="div_drop_zm">
FIND j=4828 line= <span id="sw"><h3>droptop</h3></span>
FIND j=4829 line= <a class="thumbnail" href=/index_vu.html?zmid=/zm/komap target=_blank>
FIND j=4830 line= <img height=200 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 >
FIND j=4831 line= <span><img height=400 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 ></span>
FIND j=4832 line= </a>
FIND j=4833 line= </div id="div_drop_zm">
FIND j=4834 line=
FIND j=4835 line=
FIND j=4836 line= <div id="div_drag_main"> drag:<br />
FIND j=4837 line= <img class="drg" src="/images/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
FIND j=4838 line=
FIND j=4839 line= <div class="drg"><h1>konet llc </h1>
FIND j=4840 line= <pre>timesak skwii</pre>
FIND j=4841 line= <img class="drg" src="/imgs/links/keyeb.png" alt="keyeb.png" width="50" >
FIND j=4842 line= <img class="drg" src="/imgs/links/keyw.png" alt="keyew.png" width="50" >
FIND j=4843 line= <pre>timesak skwii</pre>
FIND j=4844 line= </div>
FIND j=4845 line=
FIND j=4846 line= <div class="drg"><h3>jtf29 </h3>
FIND j=4847 line= <a href=/ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
FIND j=4848 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
FIND j=4849 line= </a>
FIND j=4850 line= </div>
FIND j=4851 line=
FIND j=4852 line=
FIND j=4853 line= <div class="drg"><h3>dogheads</h3>
FIND j=4854 line= <div id="div_jtf_vid5">
FIND j=4855 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
FIND j=4856 line= <source src="/ko_jtf/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=4857 line= </video>
FIND j=4858 line= </div>
FIND j=4859 line= </div>
FIND j=4860 line=
FIND j=4861 line= <div class="drg"><h3>jtfdc night court lights action 3720</h3>
FIND j=4862 line= <div id="div_vid">
FIND j=4863 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
FIND j=4864 line= <source src="index.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=4865 line= <source src="index.webm" type="video/webm;codecs="vp8, vorbis"">
FIND j=4866 line= </video>
FIND j=4867 line= </div>
FIND j=4868 line= </div>
FIND j=4869 line=
FIND j=4870 line= <div class="drg"><h3>vid1: </h3>
FIND j=4871 line= <div id="div_vid1">
FIND j=4872 line= <video controls="controls" defaultmuted="" muted="true" style="width:320;height:180;" poster="index1_mp4.png">
FIND j=4873 line= <source src="index1.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=4874 line= <source src="index1.webm" type="video/webm;codecs="vp8, vorbis"">
FIND j=4875 line= </video>
FIND j=4876 line= </div>
FIND j=4877 line= </div>
FIND j=4878 line=
FIND j=4879 line= <div class="drg"><h3>vid2_avril</h3>
FIND j=4880 line= <div id="div_vid2_avril">
FIND j=4881 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index2_mp4.png">
FIND j=4882 line= <source src="index2.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=4883 line= <source src="index2.webm" type="video/webm;codecs="vp8, vorbis"">
FIND j=4884 line= </video>
FIND j=4885 line= </div>
FIND j=4886 line= </div>
FIND j=4887 line=
FIND j=4888 line= <div class="drg"><h3>vid3_jtfinc_dogpatrol_tresspass</h3>
FIND j=4889 line= <div id="div_vid3">
FIND j=4890 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index3_mp4.png">
FIND j=4891 line= <source src="index3.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=4892 line= <source src="index3.webm" type="video/webm;codecs="vp8, vorbis"">
FIND j=4893 line= </video>
FIND j=4894 line= </div>
FIND j=4895 line= </div>
FIND j=4896 line=
FIND j=4897 line=
FIND j=4898 line= <div class="drg">konet llc
FIND j=4899 line= <img src="/imgs/btn/kob.png" alt="ko.png" width="50" class="drg" />
FIND j=4900 line=
FIND j=4901 line= </div>
FIND j=4902 line= </div id="div_drag_main">
FIND j=4903 line=
FIND j=4904 line=
FIND j=4905 line= <hr color=yellow>
FIND j=4906 line= <hr color=white>
FIND j=4907 line= <hr color=yellow>
FIND j=4908 line=
FIND j=4909 line= <div id="div_neave_im" >
FIND j=4910 line= <iframe frameborder='0' height='250' marginheight='0' marginwidth='0' scrolling='no'
FIND j=4911 line= src='/index_neave_im.html'
FIND j=4912 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
FIND j=4913 line= </iframe>
FIND j=4914 line= <a class="popover" href="/index_neave_im.html" target=_blank>
FIND j=4915 line= <img height=50 width=1600 src="/imgs/links/index_neave_im.png" alt="index_neave_im" border=0>
FIND j=4916 line= <span><img height=50 width=1600 src="/imgs/links/index_neave_im_pop.png" border=0></span>
FIND j=4917 line= </a>
FIND j=4918 line= </div id="div_neave_im" >
FIND j=4919 line=
FIND j=4920 line= <div id="div_iframe" height-"150" >
FIND j=4921 line= </div id="div_ifram" >
FIND j=4922 line=
FIND j=4923 line= <div id="div_neave_wobble" >
FIND j=4924 line=
FIND j=4925 line= <a class="popover" href="/index_neave_wobble.html" target=_blank>
FIND j=4926 line= <img height=50 width=1600 src="/imgs/links/index_neave_wobble.png" alt="index_neave_wobble" border=0>
FIND j=4927 line= <span><img height=50 width=1600 src="/imgs/links/index_neave_wobble_pop.png" border=0></span>
FIND j=4928 line= </a>
FIND j=4929 line= <iframe frameborder='0' height='150' marginheight='0' marginwidth='0' scrolling='no'
FIND j=4930 line= src='/index_neave_wobble.html'
FIND j=4931 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
FIND j=4932 line= </iframe>
FIND j=4933 line= </div id="div_neave_wobble" >
FIND j=4934 line=
FIND j=4935 line=
FIND j=4936 line=
FIND j=4937 line=
FIND j=4938 line= <div id="div_files" >
FIND j=4939 line= <output id="zonelist"></output>
FIND j=4940 line= <div id="dropzone">
FIND j=4941 line= dropzone
FIND j=4942 line= <div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
FIND j=4943 line= <canvas id="canvas_dropzone" style="z-index: 1;
FIND j=4944 line= position:absolute;
FIND j=4945 line= left:0px;
FIND j=4946 line= top:0px;
FIND j=4947 line= " height="100px" width="200" background-color="darkSlategrey" color="ivory">
FIND j=4948 line= WARN_1387 unauthorized access has been logged
FIND j=4949 line= </canvas>
FIND j=4950 line= </div id="div_files" >
FIND j=4951 line=
FIND j=4952 line= <script id="scrip_fileselect" name="script_fileselect">
FIND j=4953 line= function handleFileSelect(evt) {
FIND j=4954 line= evt.stopPropagation();
FIND j=4955 line= evt.preventDefault();
FIND j=4956 line=
FIND j=4957 line= var files = evt.dataTransfer.files; // FileList object.
FIND j=4958 line=
FIND j=4959 line=// files is a FileList of File objects. List some properties.
FIND j=4960 line= var output = [];
FIND j=4961 line= for (var i = 0, f; f = files[i]; i++) {
FIND j=4962 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
FIND j=4963 line= f.size, ' bytes, last modified: ',
FIND j=4964 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
FIND j=4965 line= '</li>');
FIND j=4966 line= }
FIND j=4967 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
FIND j=4968 line= }
FIND j=4969 line=
FIND j=4970 line= function handleDragOver(evt) {
FIND j=4971 line= evt.stopPropagation();
FIND j=4972 line= evt.preventDefault();
FIND j=4973 line= evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
FIND j=4974 line= }
FIND j=4975 line=
FIND j=4976 line= // Setup the dnd listeners.
FIND j=4977 line= var dropZone = document.getElementById('dropzone');
FIND j=4978 line= dropZone.addEventListener('dragover', handleDragOver, false);
FIND j=4979 line= dropZone.addEventListener('drop', handleFileSelect, false);
FIND j=4980 line= </script id="scrip_fileselect" name="script_fileselect">
FIND j=4981 line=
FIND j=4982 line=<hr><hr><hr>
FIND j=4983 line= <div id="div_zonelist">
FIND j=4984 line= <label class="fileContainer">
FIND j=4985 line= files
FIND j=4986 line= <input id="files" name="files[]" multiple="" type="file">
FIND j=4987 line= </label>
FIND j=4988 line= <output id="zonelist"></output>
FIND j=4989 line= <div id="div_zonelist">
FIND j=4990 line=
FIND j=4991 line= <script id="script_hfileselect" >
FIND j=4992 line= function handleFileSelect(evt) {
FIND j=4993 line= var files = evt.target.files; // FileList object
FIND j=4994 line=
FIND j=4995 line= // files is a FileList of File objects. List some properties.
FIND j=4996 line= var output = [];
FIND j=4997 line= for (var i = 0, f; f = files[i]; i++) {
FIND j=4998 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
FIND j=4999 line= f.size, ' bytes, last modified: ',
FIND j=5000 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
FIND j=5001 line= '</li>');
FIND j=5002 line= }
FIND j=5003 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
FIND j=5004 line= }
FIND j=5005 line=
FIND j=5006 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
FIND j=5007 line= </script id="script_hfileselect" >
FIND j=5008 line=
FIND j=5009 line= <div id="div_files2" hidden >
FIND j=5010 line= <label class="fileContainer">
FIND j=5011 line= files2
FIND j=5012 line= <input id="files" name="files[]" multiple="" type="file">
FIND j=5013 line= </label>
FIND j=5014 line= <output id="zonelist"></output>
FIND j=5015 line= </div id="div_files2" hidden >
FIND j=5016 line=
FIND j=5017 line= <script id="script_hfileselect2" >
FIND j=5018 line= function handleFileSelect(evt) {
FIND j=5019 line= var files = evt.target.files; // FileList object
FIND j=5020 line=
FIND j=5021 line= // Loop through the FileList and render image files as thumbnails.
FIND j=5022 line= for (var i = 0, f; f = files[i]; i++) {
FIND j=5023 line=
FIND j=5024 line=// Only process image files.
FIND j=5025 line= if (!f.type.match('image.*')) { continue; }
FIND j=5026 line=
FIND j=5027 line= var reader = new FileReader();
FIND j=5028 line=
FIND j=5029 line= // Closure to capture the file information.
FIND j=5030 line= reader.onload = (function(theFile) {
FIND j=5031 line= return function(e) {
FIND j=5032 line= // Render thumbnail.
FIND j=5033 line= var span = document.createElement('span');
FIND j=5034 line= span.innerHTML = ['<img class="thumb" src="', e.target.result,
FIND j=5035 line= '" title="', escape(theFile.name), '"/>'].join('');
FIND j=5036 line= document.getElementById('zonelist').insertBefore(span, null);
FIND j=5037 line= };
FIND j=5038 line= })(f);
FIND j=5039 line=
FIND j=5040 line= // Read in the image file as a data URL.
FIND j=5041 line= reader.readAsDataURL(f);
FIND j=5042 line= }
FIND j=5043 line= }
FIND j=5044 line=
FIND j=5045 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
FIND j=5046 line= </script id="script_hfileselect2" >
FIND j=5047 line=
FIND j=5048 line= <script id="script_previewfile">
FIND j=5049 line= function previewfile(file) {
FIND j=5050 line= if (tests.filereader === true && acceptedTypes[file.type] === true) {
FIND j=5051 line= var reader = new FileReader();
FIND j=5052 line= reader.onload = function (event) {
FIND j=5053 line= var image = new Image();
FIND j=5054 line= image.src = event.target.result;
FIND j=5055 line= image.width = 250; // a fake resize
FIND j=5056 line= holder.appendChild(image);
FIND j=5057 line= };
FIND j=5058 line=
FIND j=5059 line= reader.readAsDataURL(file);
FIND j=5060 line= }
FIND j=5061 line= else {
FIND j=5062 line= holder.innerHTML +=
FIND j=5063 line= '<p>done: koupload'
FIND j=5064 line= + file.name
FIND j=5065 line= + ' '
FIND j=5066 line= + (file.size ? (file.size/1024|0) + 'K' : '');
FIND j=5067 line= console.log(file);
FIND j=5068 line= }
FIND j=5069 line= }
FIND j=5070 line=
FIND j=5071 line= function readfiles(files) {
FIND j=5072 line= debugger;
FIND j=5073 line= var formData = tests.formdata ? new FormData() : null;
FIND j=5074 line= for (var i = 0; i < files.length; i++) {
FIND j=5075 line= if (tests.formdata) formData.append('file', files[i]);
FIND j=5076 line= previewfile(files[i]);
FIND j=5077 line= }
FIND j=5078 line=
FIND j=5079 line=// now post a new XHR request
FIND j=5080 line= if (tests.formdata) {
FIND j=5081 line= var xhr = new XMLHttpRequest();
FIND j=5082 line= xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
FIND j=5083 line=// xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
FIND j=5084 line= xhr.onload = function() {
FIND j=5085 line= progress.value = progress.innerHTML = 100;
FIND j=5086 line= };
FIND j=5087 line=
FIND j=5088 line= if (tests.progress) {
FIND j=5089 line= xhr.upload.onprogress = function (event) {
FIND j=5090 line= if (event.lengthComputable) {
FIND j=5091 line= var complete = (event.loaded / event.total * 100 | 0);
FIND j=5092 line= progress.value = progress.innerHTML = complete;
FIND j=5093 line= }
FIND j=5094 line= }
FIND j=5095 line= }
FIND j=5096 line=
FIND j=5097 line= xhr.send(formData);
FIND j=5098 line= }
FIND j=5099 line= }
FIND j=5100 line=
FIND j=5101 line= if (tests.dnd) {
FIND j=5102 line= holder.ondragover = function () { this.className = 'hover'; return false; };
FIND j=5103 line= holder.ondragend = function () { this.className = ''; return false; };
FIND j=5104 line= holder.ondrop = function (e) {
FIND j=5105 line= this.className = '';
FIND j=5106 line= e.preventDefault();
FIND j=5107 line= readfiles(e.dataTransfer.files);
FIND j=5108 line= }
FIND j=5109 line= }
FIND j=5110 line= else {
FIND j=5111 line= fileupload.className = 'hidden';
FIND j=5112 line= fileupload.querySelector('input').onchange = function () {
FIND j=5113 line= readfiles(this.files);
FIND j=5114 line= };
FIND j=5115 line= }
FIND j=5116 line= </script id="script_previewfile">
FIND j=5117 line=
FIND j=5118 line= <script id="script_myfilework>
FIND j=5119 line= funtion myfilework( j, file ) {
FIND j=5120 line=
FIND j=5121 line= alert( j+" file="+file );
FIND j=5122 line= }
FIND j=5123 line=
FIND j=5124 line= </script id="script_myfilework>
FIND j=5125 line=
FIND j=5126 line=
FIND j=5127 line=
FIND j=5128 line=
FIND j=5129 line=
FIND j=5130 line= <script id="script_upload_input">>
FIND j=5131 line= var upload = document.getElementsByTagName('input')[0],
FIND j=5132 line= holder2 = document.getElementById('holder2'),
FIND j=5133 line= state = document.getElementById('status');
FIND j=5134 line=
FIND j=5135 line= if (typeof window.FileReader === 'undefined') {
FIND j=5136 line= state.className = 'fail';
FIND j=5137 line= }
FIND j=5138 line= else {
FIND j=5139 line= state.className = 'success';
FIND j=5140 line= state.innerHTML = 'File API & FileReader available';
FIND j=5141 line= }
FIND j=5142 line=
FIND j=5143 line= upload.onchange = function (e) {
FIND j=5144 line= e.preventDefault();
FIND j=5145 line=
FIND j=5146 line= var file = upload.files[0],
FIND j=5147 line= reader = new FileReader();
FIND j=5148 line= reader.onload = function (event) {
FIND j=5149 line= var img = new Image();
FIND j=5150 line= img.src = event.target.result;
FIND j=5151 line=// note: no onload required since we've got the dataurl...I think! :)
FIND j=5152 line= if (img.width > 560) { // holder width
FIND j=5153 line= img.width = 560;
FIND j=5154 line= }
FIND j=5155 line= holder2.innerHTML = '';
FIND j=5156 line= holder.appendChild(img);
FIND j=5157 line= };
FIND j=5158 line= reader.readAsDataURL(file);
FIND j=5159 line=
FIND j=5160 line= return false;
FIND j=5161 line= };
FIND j=5162 line=
FIND j=5163 line=// var formData = new FormData();
FIND j=5164 line=// formData.append("part_num", "123ABC");
FIND j=5165 line=// formData.append("part_price", 7.95);
FIND j=5166 line=// formData.append("part_image", somefile)
FIND j=5167 line=//
FIND j=5168 line=// var xhr = new XMLHttpRequest();
FIND j=5169 line=// xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");
FIND j=5170 line=// xhr.send(formData);
FIND j=5171 line= </script id="script_upload_input">>
FIND j=5172 line=
FIND j=5173 line= <canvas id="canvas_1" color="darkSlategrey" height="100" width="400">
FIND j=5174 line= </canvas id="canvas_1" >
FIND j=5175 line=
FIND j=5176 line=
FIND j=5177 line= <script id="script_canvas_1" >
FIND j=5178 line= var canvas = document.getElementsByTagName('canvas_1')[0],
FIND j=5179 line= ctx = null,
FIND j=5180 line= grad = null,
FIND j=5181 line= body = document.getElementsByTagName('body')[0],
FIND j=5182 line= color = 255;
FIND j=5183 line= color = lightblue;
FIND j=5184 line=
FIND j=5185 line=if (canvas.getContext('2d')) {
FIND j=5186 line= ctx = canvas.getContext('2d');
FIND j=5187 line= ctx.clearRect(0, 0, 600, 600);
FIND j=5188 line= ctx.save();
FIND j=5189 line=
FIND j=5190 line=// Create radial gradient
FIND j=5191 line=// grad = ctx.createRadialGradient(0,0,0,0,0,600);
FIND j=5192 line=// grad.addColorStop(0, '#000');
FIND j=5193 line=// grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');
FIND j=5194 line=
FIND j=5195 line= // assign gradients to fill
FIND j=5196 line=// ctx.fillStyle = grad;
FIND j=5197 line= ctx.fillstyle = "lightblue";
FIND j=5198 line=
FIND j=5199 line= // draw 600x600 fill
FIND j=5200 line= ctx.fillRect(0,0,600,600);
FIND j=5201 line= ctx.save();
FIND j=5202 line=
FIND j=5203 line= body.onmousemove = function (event) {
FIND j=5204 line= var width = window.innerWidth,
FIND j=5205 line= height = window.innerHeight,
FIND j=5206 line= x = event.clientX,
FIND j=5207 line= y = event.clientY,
FIND j=5208 line= rx = 600 * x / width,
FIND j=5209 line= ry = 600 * y / height;
FIND j=5210 line=
FIND j=5211 line= var xc = ~~(256 * x / width);
FIND j=5212 line= var yc = ~~(256 * y / height);
FIND j=5213 line=
FIND j=5214 line= grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600);
FIND j=5215 line= grad.addColorStop(0, '#000');
FIND j=5216 line= grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
FIND j=5217 line= // ctx.restore();
FIND j=5218 line=// ctx.fillStyle = grad;
FIND j=5219 line= ctx.fillstyle="lightblue";
FIND j=5220 line= ctx.fillRect(0,0,600,600);
FIND j=5221 line= // ctx.save();
FIND j=5222 line= };
FIND j=5223 line=}
FIND j=5224 line= </script id="script_canvas_1" >
FIND j=5225 line=
FIND j=5226 line= <div id="div_csv"><h3></h3>
FIND j=5227 line= </div id="div_csv">
FIND j=5228 line=
FIND j=5229 line= <script id="script_upload" type="text/javascript">
FIND j=5230 line=// function upload_csv() {
FIND j=5231 line= function Upload() {
FIND j=5232 line=// var files = evt.dataTransfer.files; // FileList object.
FIND j=5233 line=// var fileUpload = document.getElementById("upload_files");
FIND j=5234 line= var fileUpload = document.getElementById("fileUpload");
FIND j=5235 line= var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
FIND j=5236 line=// if (regex.test(fileUpload.value.toLowerCase())) {
FIND j=5237 line= if (regex.test(fileUpload.value.toLowerCase())) {
FIND j=5238 line= if (typeof (FileReader) != "undefined") {
FIND j=5239 line= var reader = new FileReader();
FIND j=5240 line= reader.onload = function (e) {
FIND j=5241 line= var table = document.createElement("table");
FIND j=5242 line= var rows = e.target.result.split("\n");
FIND j=5243 line= for (var i = 0; i < rows.length; i++) {
FIND j=5244 line= var row = table.insertRow(-1);
FIND j=5245 line=
FIND j=5246 line=// var cells = rows[i].split("|");
FIND j=5247 line= var cells = rows[i].split(",");
FIND j=5248 line= for (var j = 0; j < cells.length; j++) {
FIND j=5249 line= var cell = row.insertCell(-1);
FIND j=5250 line= cell.innerHTML = cells[j];
FIND j=5251 line= }
FIND j=5252 line= }
FIND j=5253 line= var csv2tbl = document.getElementById("csv2tbl");
FIND j=5254 line= csv2tbl.innerHTML = "";
FIND j=5255 line= csv2tbl.appendChild(table);
FIND j=5256 line= }
FIND j=5257 line= reader.readAsText(fileUpload.files[0]);
FIND j=5258 line= file_csv=fileUpload.files[0];
FIND j=5259 line= file_csvlen = fileUpload.files.length;
FIND j=5260 line= alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
FIND j=5261 line= load_file_csv(file_csv);
FIND j=5262 line= }
FIND j=5263 line= else {
FIND j=5264 line= alert("csv2tbl warn: unauthorized access noted");
FIND j=5265 line= }
FIND j=5266 line= }
FIND j=5267 line= else {
FIND j=5268 line= alert("csv2tbl fail: unsuppoted format");
FIND j=5269 line= }
FIND j=5270 line= }
FIND j=5271 line= </script id="script_upload" type="text/javascript">
FIND j=5272 line=
FIND j=5273 line= <script id="script_load_file_csv">
FIND j=5274 line= function load_file_csv(file_csv) {
FIND j=5275 line= alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
FIND j=5276 line= file_psv=file_csv;
FIND j=5277 line= return(file_psv);
FIND j=5278 line= }
FIND j=5279 line= </script id="script_load_file_csv">
FIND j=5280 line=
FIND j=5281 line= <div id="div_filecontainer" >
FIND j=5282 line= <label class="fileContainer">
FIND j=5283 line= files.csv.psv.txt
FIND j=5284 line= <input id="fileUpload" type="file"></input>
FIND j=5285 line= </label>
FIND j=5286 line=
FIND j=5287 line=      
FIND j=5288 line= <label class="fileContainer">
FIND j=5289 line= parse.csv.psv.txt
FIND j=5290 line= <input id="upload" value="Upload" onclick="Upload()" type="button"></input>
FIND j=5291 line= </label>
FIND j=5292 line= </div id="div_filecontainer" >
FIND j=5293 line=
FIND j=5294 line=
FIND j=5295 line=
FIND j=5296 line= <div id="div_csv2tbl"><h3>csv2tbl</h3>
FIND j=5297 line= </div id="div_csv2tbl" >
FIND j=5298 line=
FIND j=5299 line=<!--
FIND j=5300 line= <button type="button" id="fileUpload" type="file" >select</button>
FIND j=5301 line= <button type="button" id="upload" value="Upload" onclick="Upload()">upload</button>
FIND j=5302 line= -->
FIND j=5303 line=
FIND j=5304 line=<!--
FIND j=5305 line=
FIND j=5306 line= <div id="div_showhide" hidden>
FIND j=5307 line= <script id="script_showhide" >
FIND j=5308 line= function show_files() {
FIND j=5309 line= var div_files = document.getElementbyID("div_files");
FIND j=5310 line= div_files.show();
FIND j=5311 line= }
FIND j=5312 line= function hide_files() {
FIND j=5313 line= var div_files = document.getElementbyID("div_files");
FIND j=5314 line= div_files.hide();
FIND j=5315 line= }
FIND j=5316 line= </script id="script_showhide" hidden>
FIND j=5317 line=
FIND j=5318 line= <button type="button" id="show">show</button>
FIND j=5319 line= <button type="button" id="hide">hide</button>
FIND j=5320 line= <button type="show_files" id="show_files" onclick="show_files()">Show_files</button>
FIND j=5321 line= <button type="hide_files" id="hide_files" onclick="hide_files()">Hide_files</button>
FIND j=5322 line= <button type="show_neave_wobble" id="show_neave_wobble">Show_neave_wobble</button>
FIND j=5323 line= <button type="hide_neave_wobble" id="hide_neave_wobble">Hide_neave_wobble</button>
FIND j=5324 line= -->
FIND j=5325 line=<!--
FIND j=5326 line= <button type="show_dd" id="show_dd">Show_dd</button>
FIND j=5327 line= <button type="hide_dd" id="hide_dd">Hide_dd</button>
FIND j=5328 line= <button type="show_bb" id="show_bb">Show_bb</button>
FIND j=5329 line= <button type="hide_bb" id="hide_bb">Hide_bb</button>
FIND j=5330 line= <button type="show_tl" id="show_tl">Show_tl</button>
FIND j=5331 line= <button type="hide_tl" id="hide_tl">Hide_tl</button>
FIND j=5332 line= <button type="show_colors" id="show_colors">Show_colors</button>
FIND j=5333 line= <button type="hide_colors" id="hide_colors">Hide_colors</button>
FIND j=5334 line= <button type="show_fonts" id="show_fonts">Show_fonts</button>
FIND j=5335 line= <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
FIND j=5336 line= <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
FIND j=5337 line= <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
FIND j=5338 line= -->
FIND j=5339 line= </div id="dvi_showhide" >
FIND j=5340 line=
FIND j=5341 line=
FIND j=5342 line= <div id="item" >div_item
FIND j=5343 line= </div id="item">
FIND j=5344 line=
FIND j=5345 line=<!--
FIND j=5346 line= <script id="script_showhide">
FIND j=5347 line= $( "#show" ).click(function() {$('#item').show(); });
FIND j=5348 line= $( "#hide" ).click(function() {$('#item').hide();});
FIND j=5349 line= $( "#show_files" ).click(function() {$('#div_files').show(); });
FIND j=5350 line= $( "#hide_files" ).click(function() {$('#div_files').hide();});
FIND j=5351 line= $( "#show_neave_wobble" ).click(function() {$('#div_neave_wobble').show(); });
FIND j=5352 line= $( "#hide_neave_wobble" ).click(function() {$('#div_neave_wobble').hide();});
FIND j=5353 line=// $( "#show_dd" ).click(function() {$('#div_dd').show(); });
FIND j=5354 line=// $( "#hide_dd" ).click(function() {$('#div_dd').hide();});
FIND j=5355 line=// $( "#show_bb" ).click(function() {$('#div_bb').show(); });
FIND j=5356 line=// $( "#hide_bb" ).click(function() {$('#div_bb').hide();});
FIND j=5357 line=// $( "#show_tl" ).click(function() {$('#div_tl').show(); });
FIND j=5358 line=// $( "#hide_tl" ).click(function() {$('#div_tl').hide();});
FIND j=5359 line=// $( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
FIND j=5360 line=// $( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
FIND j=5361 line=// $( "#show_colors" ).click(function() {$('#div_colors').show(); });
FIND j=5362 line=// $( "#hide_colors" ).click(function() {$('#div_colors').hide();});
FIND j=5363 line=// $( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
FIND j=5364 line=// $( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
FIND j=5365 line=// $( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
FIND j=5366 line=// $( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
FIND j=5367 line= </script id="script_showhide" >
FIND j=5368 line= -->
FIND j=5369 line=
FIND j=5370 line=
FIND j=5371 line=<!--[if IE] -->
FIND j=5372 line=<!--
FIND j=5373 line= <script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
FIND j=5374 line= -->
FIND j=5375 line=<!-- <![endif]-->
FIND j=5376 line=<!--
FIND j=5377 line= <div class="la-anim-10" hidden></div>
FIND j=5378 line= -->
FIND j=5379 line=
FIND j=5380 line=<!-- .corner-preloader -->
FIND j=5381 line=<!--
FIND j=5382 line= <div id="wrapper" hidden>
FIND j=5383 line= <div id="upload-widget">
FIND j=5384 line= <h1>
FIND j=5385 line= <i class="fa fa-cloud-upload"></i> File Uploader
FIND j=5386 line= </h1>
FIND j=5387 line=
FIND j=5388 line= <form id="file-upload-form">
FIND j=5389 line= <div class="file-input-wrap">
FIND j=5390 line= fups
FIND j=5391 line= <input type="file" name="file" id="file" multiple>
FIND j=5392 line= </div><!-- .file-input-wrap -->
FIND j=5393 line= </form><!-- #file-upload-form -->
FIND j=5394 line= </div><!-- #upload-widget -->
FIND j=5395 line=
FIND j=5396 line= <div id="upload-result">
FIND j=5397 line= </div><!-- #upload-result -->
FIND j=5398 line= </div><!-- #wrapper -->
FIND j=5399 line=
FIND j=5400 line= <div id="preloader">
FIND j=5401 line= <img height=50 src="/imgs/btn/kob.png" alt="preloader_up" />
FIND j=5402 line= </a>
FIND j=5403 line= </div>
FIND j=5404 line=
FIND j=5405 line= <!-- SCRIPTS -->
FIND j=5406 line=<!-- <script type="text/javascript" src="js/libraries/jquery-2.1.1.min.js"></script> -->
FIND j=5407 line=<!-- <script type="text/javascript" src="/js/vue.js" > -->
FIND j=5408 line= <script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIFZ1ZS5qcyB2Mi41LjE3CiAqIChjKSAyMDE0LTIwMTggRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDoKCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6CgkoZ2xvYmFsLlZ1ZSA9IGZhY3RvcnkoKSk7Cn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOwoKLyogICovCgp2YXIgZW1wdHlPYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTsKCi8vIHRoZXNlIGhlbHBlcnMgcHJvZHVjZXMgYmV0dGVyIHZtIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXIKLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZwpmdW5jdGlvbiBpc1VuZGVmICh2KSB7CiAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsCn0KCmZ1bmN0aW9uIGlzRGVmICh2KSB7CiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsCn0KCmZ1bmN0aW9uIGlzVHJ1ZSAodikgewogIHJldHVybiB2ID09PSB0cnVlCn0KCmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHsKICByZXR1cm4gdiA9PT0gZmFsc2UKfQoKLyoqCiAqIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZQogKi8KZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbHVlKSB7CiAgcmV0dXJuICgKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwKICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fAogICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicKICApCn0KCi8qKgogKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGwKICogT2JqZWN0cyBmcm9tIHByaW1pdGl2ZSB2YWx1ZXMgd2hlbiB3ZSBrbm93IHRoZSB2YWx1ZQogKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuCiAqLwpmdW5jdGlvbiBpc09iamVjdCAob2JqKSB7CiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jwp9CgovKioKICogR2V0IHRoZSByYXcgdHlwZSBzdHJpbmcgb2YgYSB2YWx1ZSBlLmcuIFtvYmplY3QgT2JqZWN0XQogKi8KdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpmdW5jdGlvbiB0b1Jhd1R5cGUgKHZhbHVlKSB7CiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSkKfQoKLyoqCiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWUKICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy4KICovCmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJwp9CgpmdW5jdGlvbiBpc1JlZ0V4cCAodikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXScKfQoKLyoqCiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LgogKi8KZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkgewogIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodmFsKSk7CiAgcmV0dXJuIG4gPj0gMCAmJiBNYXRoLmZsb29yKG4pID09PSBuICYmIGlzRmluaXRlKHZhbCkKfQoKLyoqCiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLgogKi8KZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkgewogIHJldHVybiB2YWwgPT0gbnVsbAogICAgPyAnJwogICAgOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JwogICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMikKICAgICAgOiBTdHJpbmcodmFsKQp9CgovKioKICogQ29udmVydCBhIGlucHV0IHZhbHVlIHRvIGEgbnVtYmVyIGZvciBwZXJzaXN0ZW5jZS4KICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuCiAqLwpmdW5jdGlvbiB0b051bWJlciAodmFsKSB7CiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7CiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbgp9CgovKioKICogTWFrZSBhIG1hcCBhbmQgcmV0dXJuIGEgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGEga2V5CiAqIGlzIGluIHRoYXQgbWFwLgogKi8KZnVuY3Rpb24gbWFrZU1hcCAoCiAgc3RyLAogIGV4cGVjdHNMb3dlckNhc2UKKSB7CiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7CiAgfQogIHJldHVybiBleHBlY3RzTG93ZXJDYXNlCiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH0KICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH0KfQoKLyoqCiAqIENoZWNrIGlmIGEgdGFnIGlzIGEgYnVpbHQtaW4gdGFnLgogKi8KdmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7CgovKioKICogQ2hlY2sgaWYgYSBhdHRyaWJ1dGUgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUuCiAqLwp2YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzJyk7CgovKioKICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheQogKi8KZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHsKICBpZiAoYXJyLmxlbmd0aCkgewogICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSkKICAgIH0KICB9Cn0KCi8qKgogKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS4KICovCnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHsKICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkKfQoKLyoqCiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi4KICovCmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHsKICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHJldHVybiAoZnVuY3Rpb24gY2FjaGVkRm4gKHN0cikgewogICAgdmFyIGhpdCA9IGNhY2hlW3N0cl07CiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSkKICB9KQp9CgovKioKICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy4KICovCnZhciBjYW1lbGl6ZVJFID0gLy0oXHcpL2c7CnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIGZ1bmN0aW9uIChfLCBjKSB7IHJldHVybiBjID8gYy50b1VwcGVyQ2FzZSgpIDogJyc7IH0pCn0pOwoKLyoqCiAqIENhcGl0YWxpemUgYSBzdHJpbmcuCiAqLwp2YXIgY2FwaXRhbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKQp9KTsKCi8qKgogKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLgogKi8KdmFyIGh5cGhlbmF0ZVJFID0gL1xCKFtBLVpdKS9nOwp2YXIgaHlwaGVuYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsICctJDEnKS50b0xvd2VyQ2FzZSgpCn0pOwoKLyoqCiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdC4uLiBlLmcuCiAqIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5IHdlIGRvbid0IG5lZWQgdGhpcyBhbnltb3JlIHNpbmNlIG5hdGl2ZSBiaW5kIGlzCiAqIG5vdyBtb3JlIHBlcmZvcm1hbnQgaW4gbW9zdCBicm93c2VycywgYnV0IHJlbW92aW5nIGl0IHdvdWxkIGJlIGJyZWFraW5nIGZvcgogKiBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluIFBoYW50b21KUyAxLngsIHNvIHRoaXMgbXVzdCBiZSBrZXB0IGZvcgogKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICovCgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBwb2x5ZmlsbEJpbmQgKGZuLCBjdHgpIHsKICBmdW5jdGlvbiBib3VuZEZuIChhKSB7CiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICByZXR1cm4gbAogICAgICA/IGwgPiAxCiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cykKICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKQogICAgICA6IGZuLmNhbGwoY3R4KQogIH0KCiAgYm91bmRGbi5fbGVuZ3RoID0gZm4ubGVuZ3RoOwogIHJldHVybiBib3VuZEZuCn0KCmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHsKICByZXR1cm4gZm4uYmluZChjdHgpCn0KCnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQKICA/IG5hdGl2ZUJpbmQKICA6IHBvbHlmaWxsQmluZDsKCi8qKgogKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS4KICovCmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7CiAgc3RhcnQgPSBzdGFydCB8fCAwOwogIHZhciBpID0gbGlzdC5sZW5ndGggLSBzdGFydDsKICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpOwogIHdoaWxlIChpLS0pIHsKICAgIHJldFtpXSA9IGxpc3RbaSArIHN0YXJ0XTsKICB9CiAgcmV0dXJuIHJldAp9CgovKioKICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LgogKi8KZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHsKICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHsKICAgIHRvW2tleV0gPSBfZnJvbVtrZXldOwogIH0KICByZXR1cm4gdG8KfQoKLyoqCiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuCiAqLwpmdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7CiAgdmFyIHJlcyA9IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoYXJyW2ldKSB7CiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyoqCiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLgogKiBTdHViYmluZyBhcmdzIHRvIG1ha2UgRmxvdyBoYXBweSB3aXRob3V0IGxlYXZpbmcgdXNlbGVzcyB0cmFuc3BpbGVkIGNvZGUKICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pCiAqLwpmdW5jdGlvbiBub29wIChhLCBiLCBjKSB7fQoKLyoqCiAqIEFsd2F5cyByZXR1cm4gZmFsc2UuCiAqLwp2YXIgbm8gPSBmdW5jdGlvbiAoYSwgYiwgYykgeyByZXR1cm4gZmFsc2U7IH07CgovKioKICogUmV0dXJuIHNhbWUgdmFsdWUKICovCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9OwoKLyoqCiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy4KICovCmZ1bmN0aW9uIGdlblN0YXRpY0tleXMgKG1vZHVsZXMpIHsKICByZXR1cm4gbW9kdWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGtleXMsIG0pIHsKICAgIHJldHVybiBrZXlzLmNvbmNhdChtLnN0YXRpY0tleXMgfHwgW10pCiAgfSwgW10pLmpvaW4oJywnKQp9CgovKioKICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsCiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT8KICovCmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHsKICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9CiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpOwogIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTsKICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0QikgewogICAgdHJ5IHsKICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTsKICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTsKICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7CiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKQogICAgICAgIH0pCiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5QikgewogICAgICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKGEpOwogICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpOwogICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChhW2tleV0sIGJba2V5XSkKICAgICAgICB9KQogICAgICB9IGVsc2UgewogICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHsKICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2UKICB9Cn0KCmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgaWYgKGxvb3NlRXF1YWwoYXJyW2ldLCB2YWwpKSB7IHJldHVybiBpIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qKgogKiBFbnN1cmUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlLgogKi8KZnVuY3Rpb24gb25jZSAoZm4pIHsKICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgIGlmICghY2FsbGVkKSB7CiAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfQp9Cgp2YXIgU1NSX0FUVFIgPSAnZGF0YS1zZXJ2ZXItcmVuZGVyZWQnOwoKdmFyIEFTU0VUX1RZUEVTID0gWwogICdjb21wb25lbnQnLAogICdkaXJlY3RpdmUnLAogICdmaWx0ZXInCl07Cgp2YXIgTElGRUNZQ0xFX0hPT0tTID0gWwogICdiZWZvcmVDcmVhdGUnLAogICdjcmVhdGVkJywKICAnYmVmb3JlTW91bnQnLAogICdtb3VudGVkJywKICAnYmVmb3JlVXBkYXRlJywKICAndXBkYXRlZCcsCiAgJ2JlZm9yZURlc3Ryb3knLAogICdkZXN0cm95ZWQnLAogICdhY3RpdmF0ZWQnLAogICdkZWFjdGl2YXRlZCcsCiAgJ2Vycm9yQ2FwdHVyZWQnCl07CgovKiAgKi8KCnZhciBjb25maWcgPSAoewogIC8qKgogICAqIE9wdGlvbiBtZXJnZSBzdHJhdGVnaWVzICh1c2VkIGluIGNvcmUvdXRpbC9vcHRpb25zKQogICAqLwogIC8vICRmbG93LWRpc2FibGUtbGluZQogIG9wdGlvbk1lcmdlU3RyYXRlZ2llczogT2JqZWN0LmNyZWF0ZShudWxsKSwKCiAgLyoqCiAgICogV2hldGhlciB0byBzdXBwcmVzcyB3YXJuaW5ncy4KICAgKi8KICBzaWxlbnQ6IGZhbHNlLAoKICAvKioKICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290PwogICAqLwogIHByb2R1Y3Rpb25UaXA6ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJywKCiAgLyoqCiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHMKICAgKi8KICBkZXZ0b29sczogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nLAoKICAvKioKICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmCiAgICovCiAgcGVyZm9ybWFuY2U6IGZhbHNlLAoKICAvKioKICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9ycwogICAqLwogIGVycm9ySGFuZGxlcjogbnVsbCwKCiAgLyoqCiAgICogV2FybiBoYW5kbGVyIGZvciB3YXRjaGVyIHdhcm5zCiAgICovCiAgd2FybkhhbmRsZXI6IG51bGwsCgogIC8qKgogICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50cwogICAqLwogIGlnbm9yZWRFbGVtZW50czogW10sCgogIC8qKgogICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uCiAgICovCiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCgogIC8qKgogICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYQogICAqIGNvbXBvbmVudC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi4KICAgKi8KICBpc1Jlc2VydmVkVGFnOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnQKICAgKiBwcm9wLiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLgogICAqLwogIGlzUmVzZXJ2ZWRBdHRyOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LgogICAqIFBsYXRmb3JtLWRlcGVuZGVudC4KICAgKi8KICBpc1Vua25vd25FbGVtZW50OiBubywKCiAgLyoqCiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudAogICAqLwogIGdldFRhZ05hbWVzcGFjZTogbm9vcCwKCiAgLyoqCiAgICogUGFyc2UgdGhlIHJlYWwgdGFnIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybS4KICAgKi8KICBwYXJzZVBsYXRmb3JtVGFnTmFtZTogaWRlbnRpdHksCgogIC8qKgogICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIGJvdW5kIHVzaW5nIHByb3BlcnR5LCBlLmcuIHZhbHVlCiAgICogUGxhdGZvcm0tZGVwZW5kZW50LgogICAqLwogIG11c3RVc2VQcm9wOiBubywKCiAgLyoqCiAgICogRXhwb3NlZCBmb3IgbGVnYWN5IHJlYXNvbnMKICAgKi8KICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LUwp9KQoKLyogICovCgovKioKICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfCiAqLwpmdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHsKICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTsKICByZXR1cm4gYyA9PT0gMHgyNCB8fCBjID09PSAweDVGCn0KCi8qKgogKiBEZWZpbmUgYSBwcm9wZXJ0eS4KICovCmZ1bmN0aW9uIGRlZiAob2JqLCBrZXksIHZhbCwgZW51bWVyYWJsZSkgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgdmFsdWU6IHZhbCwKICAgIGVudW1lcmFibGU6ICEhZW51bWVyYWJsZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7Cn0KCi8qKgogKiBQYXJzZSBzaW1wbGUgcGF0aC4KICovCnZhciBiYWlsUkUgPSAvW15cdy4kXS87CmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkgewogIGlmIChiYWlsUkUudGVzdChwYXRoKSkgewogICAgcmV0dXJuCiAgfQogIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy4nKTsKICByZXR1cm4gZnVuY3Rpb24gKG9iaikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIW9iaikgeyByZXR1cm4gfQogICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dOwogICAgfQogICAgcmV0dXJuIG9iagogIH0KfQoKLyogICovCgovLyBjYW4gd2UgdXNlIF9fcHJvdG9fXz8KdmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307CgovLyBCcm93c2VyIGVudmlyb25tZW50IHNuaWZmaW5nCnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJzsKdmFyIGluV2VleCA9IHR5cGVvZiBXWEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhIVdYRW52aXJvbm1lbnQucGxhdGZvcm07CnZhciB3ZWV4UGxhdGZvcm0gPSBpbldlZXggJiYgV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOwp2YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKdmFyIGlzSUUgPSBVQSAmJiAvbXNpZXx0cmlkZW50Ly50ZXN0KFVBKTsKdmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7CnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDsKdmFyIGlzQW5kcm9pZCA9IChVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwKSB8fCAod2VleFBsYXRmb3JtID09PSAnYW5kcm9pZCcpOwp2YXIgaXNJT1MgPSAoVUEgJiYgL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KFVBKSkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2lvcycpOwp2YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXC9cZCsvLnRlc3QoVUEpICYmICFpc0VkZ2U7CgovLyBGaXJlZm94IGhhcyBhICJ3YXRjaCIgZnVuY3Rpb24gb24gT2JqZWN0LnByb3RvdHlwZS4uLgp2YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoOwoKdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlOwppZiAoaW5Ccm93c2VyKSB7CiAgdHJ5IHsKICAgIHZhciBvcHRzID0ge307CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOwogICAgICB9CiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODUKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTsKICB9IGNhdGNoIChlKSB7fQp9CgovLyB0aGlzIG5lZWRzIHRvIGJlIGxhenktZXZhbGVkIGJlY2F1c2UgdnVlIG1heSBiZSByZXF1aXJlZCBiZWZvcmUKLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlYKdmFyIF9pc1NlcnZlcjsKdmFyIGlzU2VydmVyUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkgewogIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWluQnJvd3NlciAmJiAhaW5XZWV4ICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZAogICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzCiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJzsKICAgIH0gZWxzZSB7CiAgICAgIF9pc1NlcnZlciA9IGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gX2lzU2VydmVyCn07CgovLyBkZXRlY3QgZGV2dG9vbHMKdmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fOwoKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHsKICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSkKfQoKdmFyIGhhc1N5bWJvbCA9CiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJgogIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpOwoKdmFyIF9TZXQ7Ci8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLyAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHsKICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS4KICBfU2V0ID0gU2V0Owp9IGVsc2UgewogIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy4KICBfU2V0ID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFNldCAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWUKICAgIH07CiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoa2V5KSB7CiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlOwogICAgfTsKICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH07CgogICAgcmV0dXJuIFNldDsKICB9KCkpOwp9CgovKiAgKi8KCnZhciB3YXJuID0gbm9vcDsKdmFyIHRpcCA9IG5vb3A7CnZhciBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gKG5vb3ApOyAvLyB3b3JrIGFyb3VuZCBmbG93IGNoZWNrCnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApOwoKewogIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnOwogIHZhciBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXHcpL2c7CiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyCiAgICAucmVwbGFjZShjbGFzc2lmeVJFLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KQogICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9OwoKICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHsKICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJzsKCiAgICBpZiAoY29uZmlnLndhcm5IYW5kbGVyKSB7CiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTsKICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoKCJbVnVlIHdhcm5dOiAiICsgbXNnICsgdHJhY2UpKTsKICAgIH0KICB9OwoKICB0aXAgPSBmdW5jdGlvbiAobXNnLCB2bSkgewogICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkgewogICAgICBjb25zb2xlLndhcm4oIltWdWUgdGlwXTogIiArIG1zZyArICgKICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJycKICAgICAgKSk7CiAgICB9CiAgfTsKCiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHsKICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHsKICAgICAgcmV0dXJuICc8Um9vdD4nCiAgICB9CiAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiB2bSA9PT0gJ2Z1bmN0aW9uJyAmJiB2bS5jaWQgIT0gbnVsbAogICAgICA/IHZtLm9wdGlvbnMKICAgICAgOiB2bS5faXNWdWUKICAgICAgICA/IHZtLiRvcHRpb25zIHx8IHZtLmNvbnN0cnVjdG9yLm9wdGlvbnMKICAgICAgICA6IHZtIHx8IHt9OwogICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnOwogICAgdmFyIGZpbGUgPSBvcHRpb25zLl9fZmlsZTsKICAgIGlmICghbmFtZSAmJiBmaWxlKSB7CiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXF0rKVwudnVlJC8pOwogICAgICBuYW1lID0gbWF0Y2ggJiYgbWF0Y2hbMV07CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgKG5hbWUgPyAoIjwiICsgKGNsYXNzaWZ5KG5hbWUpKSArICI+IikgOiAiPEFub255bW91cz4iKSArCiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/ICgiIGF0ICIgKyBmaWxlKSA6ICcnKQogICAgKQogIH07CgogIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7CiAgICB2YXIgcmVzID0gJyc7CiAgICB3aGlsZSAobikgewogICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfQogICAgICBpZiAobiA+IDEpIHsgc3RyICs9IHN0cjsgfQogICAgICBuID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlcwogIH07CgogIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSBmdW5jdGlvbiAodm0pIHsKICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkgewogICAgICB2YXIgdHJlZSA9IFtdOwogICAgICB2YXIgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgd2hpbGUgKHZtKSB7CiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07CiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7CiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDsKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkgewogICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJlZS5wdXNoKHZtKTsKICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuICdcblxuZm91bmQgaW5cblxuJyArIHRyZWUKICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKCIiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSkKICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArICIuLi4gKCIgKyAodm1bMV0pICsgIiByZWN1cnNpdmUgY2FsbHMpIikKICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KQogICAgICAgIC5qb2luKCdcbicpCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gKCJcblxuKGZvdW5kIGluICIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgIikiKQogICAgfQogIH07Cn0KCi8qICAqLwoKCnZhciB1aWQgPSAwOwoKLyoqCiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZQogKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LgogKi8KdmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7CiAgdGhpcy5pZCA9IHVpZCsrOwogIHRoaXMuc3VicyA9IFtdOwp9OwoKRGVwLnByb3RvdHlwZS5hZGRTdWIgPSBmdW5jdGlvbiBhZGRTdWIgKHN1YikgewogIHRoaXMuc3Vicy5wdXNoKHN1Yik7Cn07CgpEZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7CiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTsKfTsKCkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHsKICBpZiAoRGVwLnRhcmdldCkgewogICAgRGVwLnRhcmdldC5hZGREZXAodGhpcyk7CiAgfQp9OwoKRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkgewogIC8vIHN0YWJpbGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0CiAgdmFyIHN1YnMgPSB0aGlzLnN1YnMuc2xpY2UoKTsKICBmb3IgKHZhciBpID0gMCwgbCA9IHN1YnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICBzdWJzW2ldLnVwZGF0ZSgpOwogIH0KfTsKCi8vIHRoZSBjdXJyZW50IHRhcmdldCB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZC4KLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZQovLyB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZCBhdCBhbnkgdGltZS4KRGVwLnRhcmdldCA9IG51bGw7CnZhciB0YXJnZXRTdGFjayA9IFtdOwoKZnVuY3Rpb24gcHVzaFRhcmdldCAoX3RhcmdldCkgewogIGlmIChEZXAudGFyZ2V0KSB7IHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldCk7IH0KICBEZXAudGFyZ2V0ID0gX3RhcmdldDsKfQoKZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHsKICBEZXAudGFyZ2V0ID0gdGFyZ2V0U3RhY2sucG9wKCk7Cn0KCi8qICAqLwoKdmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUgKAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIHRleHQsCiAgZWxtLAogIGNvbnRleHQsCiAgY29tcG9uZW50T3B0aW9ucywKICBhc3luY0ZhY3RvcnkKKSB7CiAgdGhpcy50YWcgPSB0YWc7CiAgdGhpcy5kYXRhID0gZGF0YTsKICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgdGhpcy50ZXh0ID0gdGV4dDsKICB0aGlzLmVsbSA9IGVsbTsKICB0aGlzLm5zID0gdW5kZWZpbmVkOwogIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7CiAgdGhpcy5mbk9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgdGhpcy5mblNjb3BlSWQgPSB1bmRlZmluZWQ7CiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5OwogIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7CiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDsKICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDsKICB0aGlzLnJhdyA9IGZhbHNlOwogIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTsKICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7CiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTsKICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7CiAgdGhpcy5pc09uY2UgPSBmYWxzZTsKICB0aGlzLmFzeW5jRmFjdG9yeSA9IGFzeW5jRmFjdG9yeTsKICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDsKICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlOwp9OwoKdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTsKCi8vIERFUFJFQ0FURUQ6IGFsaWFzIGZvciBjb21wb25lbnRJbnN0YW5jZSBmb3IgYmFja3dhcmRzIGNvbXBhdC4KLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KcHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZQp9OwoKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZOb2RlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7Cgp2YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgaWYgKCB0ZXh0ID09PSB2b2lkIDAgKSB0ZXh0ID0gJyc7CgogIHZhciBub2RlID0gbmV3IFZOb2RlKCk7CiAgbm9kZS50ZXh0ID0gdGV4dDsKICBub2RlLmlzQ29tbWVudCA9IHRydWU7CiAgcmV0dXJuIG5vZGUKfTsKCmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7CiAgcmV0dXJuIG5ldyBWTm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBTdHJpbmcodmFsKSkKfQoKLy8gb3B0aW1pemVkIHNoYWxsb3cgY2xvbmUKLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zcwovLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHkKLy8gb24gdGhlaXIgZWxtIHJlZmVyZW5jZS4KZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHsKICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKAogICAgdm5vZGUudGFnLAogICAgdm5vZGUuZGF0YSwKICAgIHZub2RlLmNoaWxkcmVuLAogICAgdm5vZGUudGV4dCwKICAgIHZub2RlLmVsbSwKICAgIHZub2RlLmNvbnRleHQsCiAgICB2bm9kZS5jb21wb25lbnRPcHRpb25zLAogICAgdm5vZGUuYXN5bmNGYWN0b3J5CiAgKTsKICBjbG9uZWQubnMgPSB2bm9kZS5uczsKICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYzsKICBjbG9uZWQua2V5ID0gdm5vZGUua2V5OwogIGNsb25lZC5pc0NvbW1lbnQgPSB2bm9kZS5pc0NvbW1lbnQ7CiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDsKICBjbG9uZWQuZm5PcHRpb25zID0gdm5vZGUuZm5PcHRpb25zOwogIGNsb25lZC5mblNjb3BlSWQgPSB2bm9kZS5mblNjb3BlSWQ7CiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTsKICByZXR1cm4gY2xvbmVkCn0KCi8qCiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aAogKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGUKICovCgp2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTsKdmFyIGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90byk7Cgp2YXIgbWV0aG9kc1RvUGF0Y2ggPSBbCiAgJ3B1c2gnLAogICdwb3AnLAogICdzaGlmdCcsCiAgJ3Vuc2hpZnQnLAogICdzcGxpY2UnLAogICdzb3J0JywKICAncmV2ZXJzZScKXTsKCi8qKgogKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHMKICovCm1ldGhvZHNUb1BhdGNoLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZAogIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTsKICBkZWYoYXJyYXlNZXRob2RzLCBtZXRob2QsIGZ1bmN0aW9uIG11dGF0b3IgKCkgewogICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07CgogICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgdmFyIG9iID0gdGhpcy5fX29iX187CiAgICB2YXIgaW5zZXJ0ZWQ7CiAgICBzd2l0Y2ggKG1ldGhvZCkgewogICAgICBjYXNlICdwdXNoJzoKICAgICAgY2FzZSAndW5zaGlmdCc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzOwogICAgICAgIGJyZWFrCiAgICAgIGNhc2UgJ3NwbGljZSc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpOwogICAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfQogICAgLy8gbm90aWZ5IGNoYW5nZQogICAgb2IuZGVwLm5vdGlmeSgpOwogICAgcmV0dXJuIHJlc3VsdAogIH0pOwp9KTsKCi8qICAqLwoKdmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7CgovKioKICogSW4gc29tZSBjYXNlcyB3ZSBtYXkgd2FudCB0byBkaXNhYmxlIG9ic2VydmF0aW9uIGluc2lkZSBhIGNvbXBvbmVudCdzCiAqIHVwZGF0ZSBjb21wdXRhdGlvbi4KICovCnZhciBzaG91bGRPYnNlcnZlID0gdHJ1ZTsKCmZ1bmN0aW9uIHRvZ2dsZU9ic2VydmluZyAodmFsdWUpIHsKICBzaG91bGRPYnNlcnZlID0gdmFsdWU7Cn0KCi8qKgogKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWQKICogb2JqZWN0LiBPbmNlIGF0dGFjaGVkLCB0aGUgb2JzZXJ2ZXIgY29udmVydHMgdGhlIHRhcmdldAogKiBvYmplY3QncyBwcm9wZXJ0eSBrZXlzIGludG8gZ2V0dGVyL3NldHRlcnMgdGhhdAogKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy4KICovCnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkgewogIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB0aGlzLmRlcCA9IG5ldyBEZXAoKTsKICB0aGlzLnZtQ291bnQgPSAwOwogIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpOwogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90bwogICAgICA/IHByb3RvQXVnbWVudAogICAgICA6IGNvcHlBdWdtZW50OwogICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpOwogICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpOwogIH0gZWxzZSB7CiAgICB0aGlzLndhbGsodmFsdWUpOwogIH0KfTsKCi8qKgogKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG8KICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCiAqIHZhbHVlIHR5cGUgaXMgT2JqZWN0LgogKi8KT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBkZWZpbmVSZWFjdGl2ZShvYmosIGtleXNbaV0pOwogIH0KfTsKCi8qKgogKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy4KICovCk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9ic2VydmUoaXRlbXNbaV0pOwogIH0KfTsKCi8vIGhlbHBlcnMKCi8qKgogKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nCiAqIHRoZSBwcm90b3R5cGUgY2hhaW4gdXNpbmcgX19wcm90b19fCiAqLwpmdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7CiAgLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi8KICB0YXJnZXQuX19wcm90b19fID0gc3JjOwogIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi8KfQoKLyoqCiAqIEF1Z21lbnQgYW4gdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZwogKiBoaWRkZW4gcHJvcGVydGllcy4KICovCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmZ1bmN0aW9uIGNvcHlBdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykgewogIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgZGVmKHRhcmdldCwga2V5LCBzcmNba2V5XSk7CiAgfQp9CgovKioKICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsCiAqIHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBpZiBzdWNjZXNzZnVsbHkgb2JzZXJ2ZWQsCiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLgogKi8KZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIGFzUm9vdERhdGEpIHsKICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIG9iOwogIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikgewogICAgb2IgPSB2YWx1ZS5fX29iX187CiAgfSBlbHNlIGlmICgKICAgIHNob3VsZE9ic2VydmUgJiYKICAgICFpc1NlcnZlclJlbmRlcmluZygpICYmCiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpICYmCiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJgogICAgIXZhbHVlLl9pc1Z1ZQogICkgewogICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpOwogIH0KICBpZiAoYXNSb290RGF0YSAmJiBvYikgewogICAgb2Iudm1Db3VudCsrOwogIH0KICByZXR1cm4gb2IKfQoKLyoqCiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC4KICovCmZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlICgKICBvYmosCiAga2V5LAogIHZhbCwKICBjdXN0b21TZXR0ZXIsCiAgc2hhbGxvdwopIHsKICB2YXIgZGVwID0gbmV3IERlcCgpOwoKICB2YXIgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTsKICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkgewogICAgcmV0dXJuCiAgfQoKICAvLyBjYXRlciBmb3IgcHJlLWRlZmluZWQgZ2V0dGVyL3NldHRlcnMKICB2YXIgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0OwogIGlmICghZ2V0dGVyICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgIHZhbCA9IG9ialtrZXldOwogIH0KICB2YXIgc2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuc2V0OwoKICB2YXIgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUodmFsKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHsKICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsKICAgICAgaWYgKERlcC50YXJnZXQpIHsKICAgICAgICBkZXAuZGVwZW5kKCk7CiAgICAgICAgaWYgKGNoaWxkT2IpIHsKICAgICAgICAgIGNoaWxkT2IuZGVwLmRlcGVuZCgpOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlCiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7CiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7CiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7CiAgICAgICAgY3VzdG9tU2V0dGVyKCk7CiAgICAgIH0KICAgICAgaWYgKHNldHRlcikgewogICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWwgPSBuZXdWYWw7CiAgICAgIH0KICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTsKICAgICAgZGVwLm5vdGlmeSgpOwogICAgfQogIH0pOwp9CgovKioKICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kCiAqIHRyaWdnZXJzIGNoYW5nZSBub3RpZmljYXRpb24gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QKICogYWxyZWFkeSBleGlzdC4KICovCmZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbCkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3Qgc2V0IHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5sZW5ndGggPSBNYXRoLm1heCh0YXJnZXQubGVuZ3RoLCBrZXkpOwogICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7CiAgICB0YXJnZXRba2V5XSA9IHZhbDsKICAgIHJldHVybiB2YWwKICB9CiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fOwogIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICdBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICsKICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLicKICAgICk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmICghb2IpIHsKICAgIHRhcmdldFtrZXldID0gdmFsOwogICAgcmV0dXJuIHZhbAogIH0KICBkZWZpbmVSZWFjdGl2ZShvYi52YWx1ZSwga2V5LCB2YWwpOwogIG9iLmRlcC5ub3RpZnkoKTsKICByZXR1cm4gdmFsCn0KCi8qKgogKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5LgogKi8KZnVuY3Rpb24gZGVsICh0YXJnZXQsIGtleSkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3QgZGVsZXRlIHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxKTsKICAgIHJldHVybgogIH0KICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187CiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArCiAgICAgICctIGp1c3Qgc2V0IGl0IHRvIG51bGwuJwogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIHsKICAgIHJldHVybgogIH0KICBkZWxldGUgdGFyZ2V0W2tleV07CiAgaWYgKCFvYikgewogICAgcmV0dXJuCiAgfQogIG9iLmRlcC5ub3RpZnkoKTsKfQoKLyoqCiAqIENvbGxlY3QgZGVwZW5kZW5jaWVzIG9uIGFycmF5IGVsZW1lbnRzIHdoZW4gdGhlIGFycmF5IGlzIHRvdWNoZWQsIHNpbmNlCiAqIHdlIGNhbm5vdCBpbnRlcmNlcHQgYXJyYXkgZWxlbWVudCBhY2Nlc3MgbGlrZSBwcm9wZXJ0eSBnZXR0ZXJzLgogKi8KZnVuY3Rpb24gZGVwZW5kQXJyYXkgKHZhbHVlKSB7CiAgZm9yICh2YXIgZSA9ICh2b2lkIDApLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZSA9IHZhbHVlW2ldOwogICAgZSAmJiBlLl9fb2JfXyAmJiBlLl9fb2JfXy5kZXAuZGVwZW5kKCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICBkZXBlbmRBcnJheShlKTsKICAgIH0KICB9Cn0KCi8qICAqLwoKLyoqCiAqIE9wdGlvbiBvdmVyd3JpdGluZyBzdHJhdGVnaWVzIGFyZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb24KICogdmFsdWUgaW50byB0aGUgZmluYWwgdmFsdWUuCiAqLwp2YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llczsKCi8qKgogKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zCiAqLwp7CiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7CiAgICBpZiAoIXZtKSB7CiAgICAgIHdhcm4oCiAgICAgICAgIm9wdGlvbiBcIiIgKyBrZXkgKyAiXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgIiArCiAgICAgICAgJ2NyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJwogICAgICApOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRTdHJhdChwYXJlbnQsIGNoaWxkKQogIH07Cn0KCi8qKgogKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci4KICovCmZ1bmN0aW9uIG1lcmdlRGF0YSAodG8sIGZyb20pIHsKICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH0KICB2YXIga2V5LCB0b1ZhbCwgZnJvbVZhbDsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyb20pOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAga2V5ID0ga2V5c1tpXTsKICAgIHRvVmFsID0gdG9ba2V5XTsKICAgIGZyb21WYWwgPSBmcm9tW2tleV07CiAgICBpZiAoIWhhc093bih0bywga2V5KSkgewogICAgICBzZXQodG8sIGtleSwgZnJvbVZhbCk7CiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodG9WYWwpICYmIGlzUGxhaW5PYmplY3QoZnJvbVZhbCkpIHsKICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTsKICAgIH0KICB9CiAgcmV0dXJuIHRvCn0KCi8qKgogKiBEYXRhCiAqLwpmdW5jdGlvbiBtZXJnZURhdGFPckZuICgKICBwYXJlbnRWYWwsCiAgY2hpbGRWYWwsCiAgdm0KKSB7CiAgaWYgKCF2bSkgewogICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnMKICAgIGlmICghY2hpbGRWYWwpIHsKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgaWYgKCFwYXJlbnRWYWwpIHsKICAgICAgcmV0dXJuIGNoaWxkVmFsCiAgICB9CiAgICAvLyB3aGVuIHBhcmVudFZhbCAmIGNoaWxkVmFsIGFyZSBib3RoIHByZXNlbnQsCiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0bwogICAgLy8gY2hlY2sgaWYgcGFyZW50VmFsIGlzIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlCiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy4KICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkgewogICAgICByZXR1cm4gbWVyZ2VEYXRhKAogICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCwKICAgICAgICB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nID8gcGFyZW50VmFsLmNhbGwodGhpcywgdGhpcykgOiBwYXJlbnRWYWwKICAgICAgKQogICAgfQogIH0gZWxzZSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkSW5zdGFuY2VEYXRhRm4gKCkgewogICAgICAvLyBpbnN0YW5jZSBtZXJnZQogICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBjaGlsZFZhbC5jYWxsKHZtLCB2bSkKICAgICAgICA6IGNoaWxkVmFsOwogICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSwgdm0pCiAgICAgICAgOiBwYXJlbnRWYWw7CiAgICAgIGlmIChpbnN0YW5jZURhdGEpIHsKICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRhCiAgICAgIH0KICAgIH0KICB9Cn0KCnN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bQopIHsKICBpZiAoIXZtKSB7CiAgICBpZiAoY2hpbGRWYWwgJiYgdHlwZW9mIGNoaWxkVmFsICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdUaGUgImRhdGEiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICsKICAgICAgICAndGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCAnICsKICAgICAgICAnZGVmaW5pdGlvbnMuJywKICAgICAgICB2bQogICAgICApOwoKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCkKICB9CgogIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKQp9OwoKLyoqCiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy4KICovCmZ1bmN0aW9uIG1lcmdlSG9vayAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsCikgewogIHJldHVybiBjaGlsZFZhbAogICAgPyBwYXJlbnRWYWwKICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKQogICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpCiAgICAgICAgPyBjaGlsZFZhbAogICAgICAgIDogW2NoaWxkVmFsXQogICAgOiBwYXJlbnRWYWwKfQoKTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHsKICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7Cn0pOwoKLyoqCiAqIEFzc2V0cwogKgogKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvCiAqIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gY29uc3RydWN0b3Igb3B0aW9ucywgaW5zdGFuY2UKICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuCiAqLwpmdW5jdGlvbiBtZXJnZUFzc2V0cyAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICB2YXIgcmVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCk7CiAgaWYgKGNoaWxkVmFsKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgICByZXR1cm4gZXh0ZW5kKHJlcywgY2hpbGRWYWwpCiAgfSBlbHNlIHsKICAgIHJldHVybiByZXMKICB9Cn0KCkFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0czsKfSk7CgovKioKICogV2F0Y2hlcnMuCiAqCiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmUKICogYW5vdGhlciwgc28gd2UgbWVyZ2UgdGhlbSBhcyBhcnJheXMuCiAqLwpzdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLgogIGlmIChwYXJlbnRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IHBhcmVudFZhbCA9IHVuZGVmaW5lZDsgfQogIGlmIChjaGlsZFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgY2hpbGRWYWwgPSB1bmRlZmluZWQ7IH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKSB9CiAgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IHt9OwogIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7CiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHsKICAgIHZhciBwYXJlbnQgPSByZXRba2V5JDFdOwogICAgdmFyIGNoaWxkID0gY2hpbGRWYWxba2V5JDFdOwogICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7CiAgICAgIHBhcmVudCA9IFtwYXJlbnRdOwogICAgfQogICAgcmV0W2tleSQxXSA9IHBhcmVudAogICAgICA/IHBhcmVudC5jb25jYXQoY2hpbGQpCiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07CiAgfQogIHJldHVybiByZXQKfTsKCi8qKgogKiBPdGhlciBvYmplY3QgaGFzaGVzLgogKi8Kc3RyYXRzLnByb3BzID0Kc3RyYXRzLm1ldGhvZHMgPQpzdHJhdHMuaW5qZWN0ID0Kc3RyYXRzLmNvbXB1dGVkID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bSwKICBrZXkKKSB7CiAgaWYgKGNoaWxkVmFsICYmICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTsKICBpZiAoY2hpbGRWYWwpIHsgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOyB9CiAgcmV0dXJuIHJldAp9OwpzdHJhdHMucHJvdmlkZSA9IG1lcmdlRGF0YU9yRm47CgovKioKICogRGVmYXVsdCBzdHJhdGVneS4KICovCnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkgewogIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkCiAgICA/IHBhcmVudFZhbAogICAgOiBjaGlsZFZhbAp9OwoKLyoqCiAqIFZhbGlkYXRlIGNvbXBvbmVudCBuYW1lcwogKi8KZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7CiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykgewogICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7CiAgfQp9CgpmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUgKG5hbWUpIHsKICBpZiAoIS9eW2EtekEtWl1bXHctXSokLy50ZXN0KG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogIicgKyBuYW1lICsgJyIuIENvbXBvbmVudCBuYW1lcyAnICsKICAgICAgJ2NhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHRoZSBoeXBoZW4sICcgKwogICAgICAnYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci4nCiAgICApOwogIH0KICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCAnICsKICAgICAgJ2lkOiAnICsgbmFtZQogICAgKTsKICB9Cn0KCi8qKgogKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGUKICogT2JqZWN0LWJhc2VkIGZvcm1hdC4KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkgewogIHZhciBwcm9wcyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKCFwcm9wcykgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICB2YXIgaSwgdmFsLCBuYW1lOwogIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgewogICAgaSA9IHByb3BzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdmFsID0gcHJvcHNbaV07CiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgICAgIG5hbWUgPSBjYW1lbGl6ZSh2YWwpOwogICAgICAgIHJlc1tuYW1lXSA9IHsgdHlwZTogbnVsbCB9OwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oJ3Byb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4nKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgICB2YWwgPSBwcm9wc1trZXldOwogICAgICBuYW1lID0gY2FtZWxpemUoa2V5KTsKICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpCiAgICAgICAgPyB2YWwKICAgICAgICA6IHsgdHlwZTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJwcm9wc1wiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsICIgKwogICAgICAiYnV0IGdvdCAiICsgKHRvUmF3VHlwZShwcm9wcykpICsgIi4iLAogICAgICB2bQogICAgKTsKICB9CiAgb3B0aW9ucy5wcm9wcyA9IHJlczsKfQoKLyoqCiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXQKICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdCAob3B0aW9ucywgdm0pIHsKICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7CiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH0KICB2YXIgbm9ybWFsaXplZCA9IG9wdGlvbnMuaW5qZWN0ID0ge307CiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHsKICAgICAgbm9ybWFsaXplZFtpbmplY3RbaV1dID0geyBmcm9tOiBpbmplY3RbaV0gfTsKICAgIH0KICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkgewogICAgZm9yICh2YXIga2V5IGluIGluamVjdCkgewogICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07CiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKQogICAgICAgID8gZXh0ZW5kKHsgZnJvbToga2V5IH0sIHZhbCkKICAgICAgICA6IHsgZnJvbTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJpbmplY3RcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUoaW5qZWN0KSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogIH0KfQoKLyoqCiAqIE5vcm1hbGl6ZSByYXcgZnVuY3Rpb24gZGlyZWN0aXZlcyBpbnRvIG9iamVjdCBmb3JtYXQuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7CiAgdmFyIGRpcnMgPSBvcHRpb25zLmRpcmVjdGl2ZXM7CiAgaWYgKGRpcnMpIHsKICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7CiAgICAgIHZhciBkZWYgPSBkaXJzW2tleV07CiAgICAgIGlmICh0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkgewogIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsgbmFtZSArICJcIjogZXhwZWN0ZWQgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUodmFsdWUpKSArICIuIiwKICAgICAgdm0KICAgICk7CiAgfQp9CgovKioKICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLgogKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLgogKi8KZnVuY3Rpb24gbWVyZ2VPcHRpb25zICgKICBwYXJlbnQsCiAgY2hpbGQsCiAgdm0KKSB7CiAgewogICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTsKICB9CgogIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHsKICAgIGNoaWxkID0gY2hpbGQub3B0aW9uczsKICB9CgogIG5vcm1hbGl6ZVByb3BzKGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7CiAgdmFyIGV4dGVuZHNGcm9tID0gY2hpbGQuZXh0ZW5kczsKICBpZiAoZXh0ZW5kc0Zyb20pIHsKICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGV4dGVuZHNGcm9tLCB2bSk7CiAgfQogIGlmIChjaGlsZC5taXhpbnMpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTsKICAgIH0KICB9CiAgdmFyIG9wdGlvbnMgPSB7fTsKICB2YXIga2V5OwogIGZvciAoa2V5IGluIHBhcmVudCkgewogICAgbWVyZ2VGaWVsZChrZXkpOwogIH0KICBmb3IgKGtleSBpbiBjaGlsZCkgewogICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7CiAgICAgIG1lcmdlRmllbGQoa2V5KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7CiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7CiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7CiAgfQogIHJldHVybiBvcHRpb25zCn0KCi8qKgogKiBSZXNvbHZlIGFuIGFzc2V0LgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3MKICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLgogKi8KZnVuY3Rpb24gcmVzb2x2ZUFzc2V0ICgKICBvcHRpb25zLAogIHR5cGUsCiAgaWQsCiAgd2Fybk1pc3NpbmcKKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHsKICAgIHJldHVybgogIH0KICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTsKICAvLyBjaGVjayBsb2NhbCByZWdpc3RyYXRpb24gdmFyaWF0aW9ucyBmaXJzdAogIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfQogIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTsKICBpZiAoaGFzT3duKGFzc2V0cywgY2FtZWxpemVkSWQpKSB7IHJldHVybiBhc3NldHNbY2FtZWxpemVkSWRdIH0KICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7CiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH0KICAvLyBmYWxsYmFjayB0byBwcm90b3R5cGUgY2hhaW4KICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykgewogICAgd2FybigKICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCwKICAgICAgb3B0aW9ucwogICAgKTsKICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIHZhbGlkYXRlUHJvcCAoCiAga2V5LAogIHByb3BPcHRpb25zLAogIHByb3BzRGF0YSwKICB2bQopIHsKICB2YXIgcHJvcCA9IHByb3BPcHRpb25zW2tleV07CiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpOwogIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldOwogIC8vIGJvb2xlYW4gY2FzdGluZwogIHZhciBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTsKICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHsKICAgIGlmIChhYnNlbnQgJiYgIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7CiAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHsKICAgICAgLy8gb25seSBjYXN0IGVtcHR5IHN0cmluZyAvIHNhbWUgbmFtZSB0byBib29sZWFuIGlmCiAgICAgIC8vIGJvb2xlYW4gaGFzIGhpZ2hlciBwcmlvcml0eQogICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpOwogICAgICBpZiAoc3RyaW5nSW5kZXggPCAwIHx8IGJvb2xlYW5JbmRleCA8IHN0cmluZ0luZGV4KSB7CiAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQogIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUKICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpOwogICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LAogICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuCiAgICB2YXIgcHJldlNob3VsZE9ic2VydmUgPSBzaG91bGRPYnNlcnZlOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogICAgb2JzZXJ2ZSh2YWx1ZSk7CiAgICB0b2dnbGVPYnNlcnZpbmcocHJldlNob3VsZE9ic2VydmUpOwogIH0KICB7CiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpOwogIH0KICByZXR1cm4gdmFsdWUKfQoKLyoqCiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuCiAqLwpmdW5jdGlvbiBnZXRQcm9wRGVmYXVsdFZhbHVlICh2bSwgcHJvcCwga2V5KSB7CiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZAogIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHsKICAgIHJldHVybiB1bmRlZmluZWQKICB9CiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDsKICAvLyB3YXJuIGFnYWluc3Qgbm9uLWZhY3RvcnkgZGVmYXVsdHMgZm9yIE9iamVjdCAmIEFycmF5CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wICInICsga2V5ICsgJyI6ICcgKwogICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArCiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJywKICAgICAgdm0KICAgICk7CiAgfQogIC8vIHRoZSByYXcgcHJvcCB2YWx1ZSB3YXMgYWxzbyB1bmRlZmluZWQgZnJvbSBwcmV2aW91cyByZW5kZXIsCiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyCiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJgogICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhW2tleV0gPT09IHVuZGVmaW5lZCAmJgogICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZAogICkgewogICAgcmV0dXJuIHZtLl9wcm9wc1trZXldCiAgfQogIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzCiAgLy8gYSB2YWx1ZSBpcyBGdW5jdGlvbiBpZiBpdHMgcHJvdG90eXBlIGlzIGZ1bmN0aW9uIGV2ZW4gYWNyb3NzIGRpZmZlcmVudCBleGVjdXRpb24gY29udGV4dAogIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJwogICAgPyBkZWYuY2FsbCh2bSkKICAgIDogZGVmCn0KCi8qKgogKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuCiAqLwpmdW5jdGlvbiBhc3NlcnRQcm9wICgKICBwcm9wLAogIG5hbWUsCiAgdmFsdWUsCiAgdm0sCiAgYWJzZW50CikgewogIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkgewogICAgd2FybigKICAgICAgJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogIicgKyBuYW1lICsgJyInLAogICAgICB2bQogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkgewogICAgcmV0dXJuCiAgfQogIHZhciB0eXBlID0gcHJvcC50eXBlOwogIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7CiAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTsKICBpZiAodHlwZSkgewogICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7CiAgICAgIHR5cGUgPSBbdHlwZV07CiAgICB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7CiAgICAgIHZhciBhc3NlcnRlZFR5cGUgPSBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlW2ldKTsKICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpOwogICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDsKICAgIH0KICB9CiAgaWYgKCF2YWxpZCkgewogICAgd2FybigKICAgICAgIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIiICsgbmFtZSArICJcIi4iICsKICAgICAgIiBFeHBlY3RlZCAiICsgKGV4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oJywgJykpICsKICAgICAgIiwgZ290ICIgKyAodG9SYXdUeXBlKHZhbHVlKSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjsKICBpZiAodmFsaWRhdG9yKSB7CiAgICBpZiAoIXZhbGlkYXRvcih2YWx1ZSkpIHsKICAgICAgd2FybigKICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJyArIG5hbWUgKyAnIi4nLAogICAgICAgIHZtCiAgICAgICk7CiAgICB9CiAgfQp9Cgp2YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87CgpmdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkgewogIHZhciB2YWxpZDsKICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTsKICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTsKICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzCiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlOwogICAgfQogIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0JykgewogICAgdmFsaWQgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTsKICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5JykgewogICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTsKICB9IGVsc2UgewogICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7CiAgfQogIHJldHVybiB7CiAgICB2YWxpZDogdmFsaWQsCiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZQogIH0KfQoKLyoqCiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcywKICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nCiAqIGFjcm9zcyBkaWZmZXJlbnQgdm1zIC8gaWZyYW1lcy4KICovCmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7CiAgdmFyIG1hdGNoID0gZm4gJiYgZm4udG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7CiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJwp9CgpmdW5jdGlvbiBpc1NhbWVUeXBlIChhLCBiKSB7CiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYikKfQoKZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7CiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMQogIH0KICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgaWYgKGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlc1tpXSwgdHlwZSkpIHsKICAgICAgcmV0dXJuIGkKICAgIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qICAqLwoKZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAodm0pIHsKICAgIHZhciBjdXIgPSB2bTsKICAgIHdoaWxlICgoY3VyID0gY3VyLiRwYXJlbnQpKSB7CiAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkOwogICAgICBpZiAoaG9va3MpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7CiAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7IHJldHVybiB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKQogICAgfSBjYXRjaCAoZSkgewogICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpOwogICAgfQogIH0KICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICB7CiAgICB3YXJuKCgiRXJyb3IgaW4gIiArIGluZm8gKyAiOiBcIiIgKyAoZXJyLnRvU3RyaW5nKCkpICsgIlwiIiksIHZtKTsKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAoKGluQnJvd3NlciB8fCBpbldlZXgpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgewogICAgY29uc29sZS5lcnJvcihlcnIpOwogIH0gZWxzZSB7CiAgICB0aHJvdyBlcnIKICB9Cn0KCi8qICAqLwovKiBnbG9iYWxzIE1lc3NhZ2VDaGFubmVsICovCgp2YXIgY2FsbGJhY2tzID0gW107CnZhciBwZW5kaW5nID0gZmFsc2U7CgpmdW5jdGlvbiBmbHVzaENhbGxiYWNrcyAoKSB7CiAgcGVuZGluZyA9IGZhbHNlOwogIHZhciBjb3BpZXMgPSBjYWxsYmFja3Muc2xpY2UoMCk7CiAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHsKICAgIGNvcGllc1tpXSgpOwogIH0KfQoKLy8gSGVyZSB3ZSBoYXZlIGFzeW5jIGRlZmVycmluZyB3cmFwcGVycyB1c2luZyBib3RoIG1pY3JvdGFza3MgYW5kIChtYWNybykgdGFza3MuCi8vIEluIDwgMi40IHdlIHVzZWQgbWljcm90YXNrcyBldmVyeXdoZXJlLCBidXQgdGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZXJlCi8vIG1pY3JvdGFza3MgaGF2ZSB0b28gaGlnaCBhIHByaW9yaXR5IGFuZCBmaXJlIGluIGJldHdlZW4gc3VwcG9zZWRseQovLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTApIG9yIGV2ZW4gYmV0d2VlbiBidWJibGluZyBvZiB0aGUgc2FtZQovLyBldmVudCAoIzY1NjYpLiBIb3dldmVyLCB1c2luZyAobWFjcm8pIHRhc2tzIGV2ZXJ5d2hlcmUgYWxzbyBoYXMgc3VidGxlIHByb2JsZW1zCi8vIHdoZW4gc3RhdGUgaXMgY2hhbmdlZCByaWdodCBiZWZvcmUgcmVwYWludCAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS4KLy8gSGVyZSB3ZSB1c2UgbWljcm90YXNrIGJ5IGRlZmF1bHQsIGJ1dCBleHBvc2UgYSB3YXkgdG8gZm9yY2UgKG1hY3JvKSB0YXNrIHdoZW4KLy8gbmVlZGVkIChlLmcuIGluIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIGJ5IHYtb24pLgp2YXIgbWljcm9UaW1lckZ1bmM7CnZhciBtYWNyb1RpbWVyRnVuYzsKdmFyIHVzZU1hY3JvVGFzayA9IGZhbHNlOwoKLy8gRGV0ZXJtaW5lIChtYWNybykgdGFzayBkZWZlciBpbXBsZW1lbnRhdGlvbi4KLy8gVGVjaG5pY2FsbHkgc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBidXQgaXQncyBvbmx5IGF2YWlsYWJsZQovLyBpbiBJRS4gVGhlIG9ubHkgcG9seWZpbGwgdGhhdCBjb25zaXN0ZW50bHkgcXVldWVzIHRoZSBjYWxsYmFjayBhZnRlciBhbGwgRE9NCi8vIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIHNhbWUgbG9vcCBpcyBieSB1c2luZyBNZXNzYWdlQ2hhbm5lbC4KLyogaXN0YW5idWwgaWdub3JlIGlmICovCmlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShzZXRJbW1lZGlhdGUpKSB7CiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpOwogIH07Cn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJyAmJiAoCiAgaXNOYXRpdmUoTWVzc2FnZUNoYW5uZWwpIHx8CiAgLy8gUGhhbnRvbUpTCiAgTWVzc2FnZUNoYW5uZWwudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgTWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvcl0nCikpIHsKICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjsKICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoQ2FsbGJhY2tzOwogIG1hY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcG9ydC5wb3N0TWVzc2FnZSgxKTsKICB9Owp9IGVsc2UgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRUaW1lb3V0KGZsdXNoQ2FsbGJhY2tzLCAwKTsKICB9Owp9CgovLyBEZXRlcm1pbmUgbWljcm90YXNrIGRlZmVyIGltcGxlbWVudGF0aW9uLgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovCmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHsKICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpOwogIG1pY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcC50aGVuKGZsdXNoQ2FsbGJhY2tzKTsKICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dAogICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlCiAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYnV0IHRoZSBxdWV1ZSBpc24ndCBiZWluZyBmbHVzaGVkLCB1bnRpbCB0aGUgYnJvd3NlcgogICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuCiAgICAvLyAiZm9yY2UiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuCiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfQogIH07Cn0gZWxzZSB7CiAgLy8gZmFsbGJhY2sgdG8gbWFjcm8KICBtaWNyb1RpbWVyRnVuYyA9IG1hY3JvVGltZXJGdW5jOwp9CgovKioKICogV3JhcCBhIGZ1bmN0aW9uIHNvIHRoYXQgaWYgYW55IGNvZGUgaW5zaWRlIHRyaWdnZXJzIHN0YXRlIGNoYW5nZSwKICogdGhlIGNoYW5nZXMgYXJlIHF1ZXVlZCB1c2luZyBhIChtYWNybykgdGFzayBpbnN0ZWFkIG9mIGEgbWljcm90YXNrLgogKi8KZnVuY3Rpb24gd2l0aE1hY3JvVGFzayAoZm4pIHsKICByZXR1cm4gZm4uX3dpdGhUYXNrIHx8IChmbi5fd2l0aFRhc2sgPSBmdW5jdGlvbiAoKSB7CiAgICB1c2VNYWNyb1Rhc2sgPSB0cnVlOwogICAgdmFyIHJlcyA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB1c2VNYWNyb1Rhc2sgPSBmYWxzZTsKICAgIHJldHVybiByZXMKICB9KQp9CgpmdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkgewogIHZhciBfcmVzb2x2ZTsKICBjYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7CiAgICBpZiAoY2IpIHsKICAgICAgdHJ5IHsKICAgICAgICBjYi5jYWxsKGN0eCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7CiAgICAgIF9yZXNvbHZlKGN0eCk7CiAgICB9CiAgfSk7CiAgaWYgKCFwZW5kaW5nKSB7CiAgICBwZW5kaW5nID0gdHJ1ZTsKICAgIGlmICh1c2VNYWNyb1Rhc2spIHsKICAgICAgbWFjcm9UaW1lckZ1bmMoKTsKICAgIH0gZWxzZSB7CiAgICAgIG1pY3JvVGltZXJGdW5jKCk7CiAgICB9CiAgfQogIC8vICRmbG93LWRpc2FibGUtbGluZQogIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgX3Jlc29sdmUgPSByZXNvbHZlOwogICAgfSkKICB9Cn0KCi8qICAqLwoKdmFyIG1hcms7CnZhciBtZWFzdXJlOwoKewogIHZhciBwZXJmID0gaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoCiAgICBwZXJmICYmCiAgICBwZXJmLm1hcmsgJiYKICAgIHBlcmYubWVhc3VyZSAmJgogICAgcGVyZi5jbGVhck1hcmtzICYmCiAgICBwZXJmLmNsZWFyTWVhc3VyZXMKICApIHsKICAgIG1hcmsgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiBwZXJmLm1hcmsodGFnKTsgfTsKICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykgewogICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpOwogICAgICBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSk7CiAgICB9OwogIH0KfQoKLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovCgp2YXIgaW5pdFByb3h5OwoKewogIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoCiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICsKICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICsKICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArCiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeQogICk7CgogIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgewogICAgd2FybigKICAgICAgIlByb3BlcnR5IG9yIG1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCAiICsKICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArCiAgICAgICdlaXRoZXIgaW4gdGhlIGRhdGEgb3B0aW9uLCBvciBmb3IgY2xhc3MtYmFzZWQgY29tcG9uZW50cywgYnkgJyArCiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICsKICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsCiAgICAgIHRhcmdldAogICAgKTsKICB9OwoKICB2YXIgaGFzUHJveHkgPQogICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7CgogIGlmIChoYXNQcm94eSkgewogICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpOwogICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2RlcywgewogICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7CiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHsKICAgICAgICAgIHdhcm4oKCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC4iICsga2V5KSk7CiAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZhciBoYXNIYW5kbGVyID0gewogICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7CiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0OwogICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fCBrZXkuY2hhckF0KDApID09PSAnXyc7CiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkCiAgICB9CiAgfTsKCiAgdmFyIGdldEhhbmRsZXIgPSB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHsKICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldFtrZXldCiAgICB9CiAgfTsKCiAgaW5pdFByb3h5ID0gZnVuY3Rpb24gaW5pdFByb3h5ICh2bSkgewogICAgaWYgKGhhc1Byb3h5KSB7CiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZQogICAgICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogICAgICB2YXIgaGFuZGxlcnMgPSBvcHRpb25zLnJlbmRlciAmJiBvcHRpb25zLnJlbmRlci5fd2l0aFN0cmlwcGVkCiAgICAgICAgPyBnZXRIYW5kbGVyCiAgICAgICAgOiBoYXNIYW5kbGVyOwogICAgICB2bS5fcmVuZGVyUHJveHkgPSBuZXcgUHJveHkodm0sIGhhbmRsZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtOwogICAgfQogIH07Cn0KCi8qICAqLwoKdmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTsKCi8qKgogKiBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZAogKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdAogKiBpcyBjb2xsZWN0ZWQgYXMgYSAiZGVlcCIgZGVwZW5kZW5jeS4KICovCmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHsKICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7CiAgc2Vlbk9iamVjdHMuY2xlYXIoKTsKfQoKZnVuY3Rpb24gX3RyYXZlcnNlICh2YWwsIHNlZW4pIHsKICB2YXIgaSwga2V5czsKICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpOwogIGlmICgoIWlzQSAmJiAhaXNPYmplY3QodmFsKSkgfHwgT2JqZWN0LmlzRnJvemVuKHZhbCkgfHwgdmFsIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybgogIH0KICBpZiAodmFsLl9fb2JfXykgewogICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7CiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7CiAgICAgIHJldHVybgogICAgfQogICAgc2Vlbi5hZGQoZGVwSWQpOwogIH0KICBpZiAoaXNBKSB7CiAgICBpID0gdmFsLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtpXSwgc2Vlbik7IH0KICB9IGVsc2UgewogICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7CiAgICBpID0ga2V5cy5sZW5ndGg7CiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9CiAgfQp9CgovKiAgKi8KCnZhciBub3JtYWxpemVFdmVudCA9IGNhY2hlZChmdW5jdGlvbiAobmFtZSkgewogIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJzsKICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lOwogIHZhciBvbmNlJCQxID0gbmFtZS5jaGFyQXQoMCkgPT09ICd+JzsgLy8gUHJlZml4ZWQgbGFzdCwgY2hlY2tlZCBmaXJzdAogIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnOwogIG5hbWUgPSBjYXB0dXJlID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgcmV0dXJuIHsKICAgIG5hbWU6IG5hbWUsCiAgICBvbmNlOiBvbmNlJCQxLAogICAgY2FwdHVyZTogY2FwdHVyZSwKICAgIHBhc3NpdmU6IHBhc3NpdmUKICB9Cn0pOwoKZnVuY3Rpb24gY3JlYXRlRm5JbnZva2VyIChmbnMpIHsKICBmdW5jdGlvbiBpbnZva2VyICgpIHsKICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50czsKCiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7CiAgICAgIHZhciBjbG9uZWQgPSBmbnMuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVycwogICAgICByZXR1cm4gZm5zLmFwcGx5KG51bGwsIGFyZ3VtZW50cykKICAgIH0KICB9CiAgaW52b2tlci5mbnMgPSBmbnM7CiAgcmV0dXJuIGludm9rZXIKfQoKZnVuY3Rpb24gdXBkYXRlTGlzdGVuZXJzICgKICBvbiwKICBvbGRPbiwKICBhZGQsCiAgcmVtb3ZlJCQxLAogIHZtCikgewogIHZhciBuYW1lLCBkZWYsIGN1ciwgb2xkLCBldmVudDsKICBmb3IgKG5hbWUgaW4gb24pIHsKICAgIGRlZiA9IGN1ciA9IG9uW25hbWVdOwogICAgb2xkID0gb2xkT25bbmFtZV07CiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNVbmRlZihjdXIpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50IFwiIiArIChldmVudC5uYW1lKSArICJcIjogZ290ICIgKyBTdHJpbmcoY3VyKSwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHsKICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHsKICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZUZuSW52b2tlcihjdXIpOwogICAgICB9CiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50Lm9uY2UsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7CiAgICAgIG9sZC5mbnMgPSBjdXI7CiAgICAgIG9uW25hbWVdID0gb2xkOwogICAgfQogIH0KICBmb3IgKG5hbWUgaW4gb2xkT24pIHsKICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkgewogICAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpOwogICAgfQogIH0KfQoKLyogICovCgpmdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7CiAgaWYgKGRlZiBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pOwogIH0KICB2YXIgaW52b2tlcjsKICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTsKCiAgZnVuY3Rpb24gd3JhcHBlZEhvb2sgKCkgewogICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgLy8gaW1wb3J0YW50OiByZW1vdmUgbWVyZ2VkIGhvb2sgdG8gZW5zdXJlIGl0J3MgY2FsbGVkIG9ubHkgb25jZQogICAgLy8gYW5kIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spOwogIH0KCiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHsKICAgIC8vIG5vIGV4aXN0aW5nIGhvb2sKICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW3dyYXBwZWRIb29rXSk7CiAgfSBlbHNlIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKGlzRGVmKG9sZEhvb2suZm5zKSAmJiBpc1RydWUob2xkSG9vay5tZXJnZWQpKSB7CiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlcgogICAgICBpbnZva2VyID0gb2xkSG9vazsKICAgICAgaW52b2tlci5mbnMucHVzaCh3cmFwcGVkSG9vayk7CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBwbGFpbiBob29rCiAgICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW29sZEhvb2ssIHdyYXBwZWRIb29rXSk7CiAgICB9CiAgfQoKICBpbnZva2VyLm1lcmdlZCA9IHRydWU7CiAgZGVmW2hvb2tLZXldID0gaW52b2tlcjsKfQoKLyogICovCgpmdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhICgKICBkYXRhLAogIEN0b3IsCiAgdGFnCikgewogIC8vIHdlIGFyZSBvbmx5IGV4dHJhY3RpbmcgcmF3IHZhbHVlcyBoZXJlLgogIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZAogIC8vIGNvbXBvbmVudCBpdHNlbGYuCiAgdmFyIHByb3BPcHRpb25zID0gQ3Rvci5vcHRpb25zLnByb3BzOwogIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkgewogICAgcmV0dXJuCiAgfQogIHZhciByZXMgPSB7fTsKICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzOwogIHZhciBwcm9wcyA9IGRhdGEucHJvcHM7CiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykgewogICAgICB2YXIgYWx0S2V5ID0gaHlwaGVuYXRlKGtleSk7CiAgICAgIHsKICAgICAgICB2YXIga2V5SW5Mb3dlckNhc2UgPSBrZXkudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoCiAgICAgICAgICBrZXkgIT09IGtleUluTG93ZXJDYXNlICYmCiAgICAgICAgICBhdHRycyAmJiBoYXNPd24oYXR0cnMsIGtleUluTG93ZXJDYXNlKQogICAgICAgICkgewogICAgICAgICAgdGlwKAogICAgICAgICAgICAiUHJvcCBcIiIgKyBrZXlJbkxvd2VyQ2FzZSArICJcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50ICIgKwogICAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh0YWcgfHwgQ3RvcikpICsgIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXMiICsKICAgICAgICAgICAgIiBcIiIgKyBrZXkgKyAiXCIuICIgKwogICAgICAgICAgICAiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCAiICsKICAgICAgICAgICAgInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gIiArCiAgICAgICAgICAgICJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFwiIiArIGFsdEtleSArICJcIiBpbnN0ZWFkIG9mIFwiIiArIGtleSArICJcIi4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGVja1Byb3AocmVzLCBwcm9wcywga2V5LCBhbHRLZXksIHRydWUpIHx8CiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrUHJvcCAoCiAgcmVzLAogIGhhc2gsCiAga2V5LAogIGFsdEtleSwKICBwcmVzZXJ2ZQopIHsKICBpZiAoaXNEZWYoaGFzaCkpIHsKICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkgewogICAgICByZXNba2V5XSA9IGhhc2hba2V5XTsKICAgICAgaWYgKCFwcmVzZXJ2ZSkgewogICAgICAgIGRlbGV0ZSBoYXNoW2tleV07CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWUKICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHsKICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07CiAgICAgIGlmICghcHJlc2VydmUpIHsKICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQogIHJldHVybiBmYWxzZQp9CgovKiAgKi8KCi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieQovLyBzdGF0aWNhbGx5IGFuYWx5emluZyB0aGUgdGVtcGxhdGUgYXQgY29tcGlsZSB0aW1lLgovLwovLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZQovLyBnZW5lcmF0ZWQgcmVuZGVyIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIEFycmF5PFZOb2RlPi4gVGhlcmUgYXJlCi8vIHR3byBjYXNlcyB3aGVyZSBleHRyYSBub3JtYWxpemF0aW9uIGlzIG5lZWRlZDoKCi8vIDEuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbXBvbmVudHMgLSBiZWNhdXNlIGEgZnVuY3Rpb25hbCBjb21wb25lbnQKLy8gbWF5IHJldHVybiBhbiBBcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJvb3QuIEluIHRoaXMgY2FzZSwganVzdCBhIHNpbXBsZQovLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGUKLy8gdGhpbmcgd2l0aCBBcnJheS5wcm90b3R5cGUuY29uY2F0LiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9ubHkgMS1sZXZlbCBkZWVwCi8vIGJlY2F1c2UgZnVuY3Rpb25hbCBjb21wb25lbnRzIGFscmVhZHkgbm9ybWFsaXplIHRoZWlyIG93biBjaGlsZHJlbi4KZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW5baV0pKSB7CiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbikKICAgIH0KICB9CiAgcmV0dXJuIGNoaWxkcmVuCn0KCi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsCi8vIGUuZy4gPHRlbXBsYXRlPiwgPHNsb3Q+LCB2LWZvciwgb3Igd2hlbiB0aGUgY2hpbGRyZW4gaXMgcHJvdmlkZWQgYnkgdXNlcgovLyB3aXRoIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zIC8gSlNYLiBJbiBzdWNoIGNhc2VzIGEgZnVsbCBub3JtYWxpemF0aW9uCi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLgpmdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbiAoY2hpbGRyZW4pIHsKICByZXR1cm4gaXNQcmltaXRpdmUoY2hpbGRyZW4pCiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXQogICAgOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKQogICAgICA/IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oY2hpbGRyZW4pCiAgICAgIDogdW5kZWZpbmVkCn0KCmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHsKICByZXR1cm4gaXNEZWYobm9kZSkgJiYgaXNEZWYobm9kZS50ZXh0KSAmJiBpc0ZhbHNlKG5vZGUuaXNDb21tZW50KQp9CgpmdW5jdGlvbiBub3JtYWxpemVBcnJheUNoaWxkcmVuIChjaGlsZHJlbiwgbmVzdGVkSW5kZXgpIHsKICB2YXIgcmVzID0gW107CiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDsKICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgIGMgPSBjaGlsZHJlbltpXTsKICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfQogICAgbGFzdEluZGV4ID0gcmVzLmxlbmd0aCAtIDE7CiAgICBsYXN0ID0gcmVzW2xhc3RJbmRleF07CiAgICAvLyAgbmVzdGVkCiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgewogICAgICBpZiAoYy5sZW5ndGggPiAwKSB7CiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyAiXyIgKyBpKSk7CiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcwogICAgICAgIGlmIChpc1RleHROb2RlKGNbMF0pICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIChjWzBdKS50ZXh0KTsKICAgICAgICAgIGMuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBjKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZShjKSkgewogICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkgewogICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMKICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgU1NSIGh5ZHJhdGlvbiBiZWNhdXNlIHRleHQgbm9kZXMgYXJlCiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7CiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHsKICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0byB2bm9kZQogICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBkZWZhdWx0IGtleSBmb3IgbmVzdGVkIGFycmF5IGNoaWxkcmVuIChsaWtlbHkgZ2VuZXJhdGVkIGJ5IHYtZm9yKQogICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmCiAgICAgICAgICBpc0RlZihjLnRhZykgJiYKICAgICAgICAgIGlzVW5kZWYoYy5rZXkpICYmCiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHsKICAgICAgICAgIGMua2V5ID0gIl9fdmxpc3QiICsgbmVzdGVkSW5kZXggKyAiXyIgKyBpICsgIl9fIjsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2goYyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIGVuc3VyZUN0b3IgKGNvbXAsIGJhc2UpIHsKICBpZiAoCiAgICBjb21wLl9fZXNNb2R1bGUgfHwKICAgIChoYXNTeW1ib2wgJiYgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJykKICApIHsKICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7CiAgfQogIHJldHVybiBpc09iamVjdChjb21wKQogICAgPyBiYXNlLmV4dGVuZChjb21wKQogICAgOiBjb21wCn0KCmZ1bmN0aW9uIGNyZWF0ZUFzeW5jUGxhY2Vob2xkZXIgKAogIGZhY3RvcnksCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7CiAgbm9kZS5hc3luY01ldGEgPSB7IGRhdGE6IGRhdGEsIGNvbnRleHQ6IGNvbnRleHQsIGNoaWxkcmVuOiBjaGlsZHJlbiwgdGFnOiB0YWcgfTsKICByZXR1cm4gbm9kZQp9CgpmdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKAogIGZhY3RvcnksCiAgYmFzZUN0b3IsCiAgY29udGV4dAopIHsKICBpZiAoaXNUcnVlKGZhY3RvcnkuZXJyb3IpICYmIGlzRGVmKGZhY3RvcnkuZXJyb3JDb21wKSkgewogICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHsKICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkCiAgfQoKICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHsKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5jb250ZXh0cykpIHsKICAgIC8vIGFscmVhZHkgcGVuZGluZwogICAgZmFjdG9yeS5jb250ZXh0cy5wdXNoKGNvbnRleHQpOwogIH0gZWxzZSB7CiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdOwogICAgdmFyIHN5bmMgPSB0cnVlOwoKICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb250ZXh0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBjb250ZXh0c1tpXS4kZm9yY2VVcGRhdGUoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykgewogICAgICAvLyBjYWNoZSByZXNvbHZlZAogICAgICBmYWN0b3J5LnJlc29sdmVkID0gZW5zdXJlQ3RvcihyZXMsIGJhc2VDdG9yKTsKICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZQogICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUikKICAgICAgaWYgKCFzeW5jKSB7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgYXN5bmMgY29tcG9uZW50OiAiICsgKFN0cmluZyhmYWN0b3J5KSkgKwogICAgICAgIChyZWFzb24gPyAoIlxuUmVhc29uOiAiICsgcmVhc29uKSA6ICcnKQogICAgICApOwogICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7CiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTsKCiAgICBpZiAoaXNPYmplY3QocmVzKSkgewogICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZQogICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7CiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc0RlZihyZXMuY29tcG9uZW50KSAmJiB0eXBlb2YgcmVzLmNvbXBvbmVudC50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7CgogICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7CiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7CiAgICAgICAgICBmYWN0b3J5LmxvYWRpbmdDb21wID0gZW5zdXJlQ3RvcihyZXMubG9hZGluZywgYmFzZUN0b3IpOwogICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkgewogICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCByZXMuZGVsYXkgfHwgMjAwKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc0RlZihyZXMudGltZW91dCkpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgICAgICAgIHJlamVjdCgKICAgICAgICAgICAgICAgICJ0aW1lb3V0ICgiICsgKHJlcy50aW1lb3V0KSArICJtcykiCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgcmVzLnRpbWVvdXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHN5bmMgPSBmYWxzZTsKICAgIC8vIHJldHVybiBpbiBjYXNlIHJlc29sdmVkIHN5bmNocm9ub3VzbHkKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmcKICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wCiAgICAgIDogZmFjdG9yeS5yZXNvbHZlZAogIH0KfQoKLyogICovCgpmdW5jdGlvbiBpc0FzeW5jUGxhY2Vob2xkZXIgKG5vZGUpIHsKICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3RvcnkKfQoKLyogICovCgpmdW5jdGlvbiBnZXRGaXJzdENvbXBvbmVudENoaWxkIChjaGlsZHJlbikgewogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkgewogICAgICAgIHJldHVybiBjCiAgICAgIH0KICAgIH0KICB9Cn0KCi8qICAqLwoKLyogICovCgpmdW5jdGlvbiBpbml0RXZlbnRzICh2bSkgewogIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTsKICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHMKICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczsKICBpZiAobGlzdGVuZXJzKSB7CiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycyk7CiAgfQp9Cgp2YXIgdGFyZ2V0OwoKZnVuY3Rpb24gYWRkIChldmVudCwgZm4sIG9uY2UpIHsKICBpZiAob25jZSkgewogICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7CiAgfSBlbHNlIHsKICAgIHRhcmdldC4kb24oZXZlbnQsIGZuKTsKICB9Cn0KCmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHsKICB0YXJnZXQuJG9mZihldmVudCwgZm4pOwp9CgpmdW5jdGlvbiB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnMgKAogIHZtLAogIGxpc3RlbmVycywKICBvbGRMaXN0ZW5lcnMKKSB7CiAgdGFyZ2V0ID0gdm07CiAgdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzIHx8IHt9LCBhZGQsIHJlbW92ZSQxLCB2bSk7CiAgdGFyZ2V0ID0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7CiAgdmFyIGhvb2tSRSA9IC9eaG9vazovOwogIFZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHRoaXMkMS4kb24oZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKHZtLl9ldmVudHNbZXZlbnRdIHx8ICh2bS5fZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChmbik7CiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uCiAgICAgIC8vIGluc3RlYWQgb2YgYSBoYXNoIGxvb2t1cAogICAgICBpZiAoaG9va1JFLnRlc3QoZXZlbnQpKSB7CiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07CgogIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgZnVuY3Rpb24gb24gKCkgewogICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7CiAgICAgIGZuLmFwcGx5KHZtLCBhcmd1bWVudHMpOwogICAgfQogICAgb24uZm4gPSBmbjsKICAgIHZtLiRvbihldmVudCwgb24pOwogICAgcmV0dXJuIHZtCiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kb2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIC8vIGFsbAogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIGFycmF5IG9mIGV2ZW50cwogICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgdGhpcyQxLiRvZmYoZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIHNwZWNpZmljIGV2ZW50CiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07CiAgICBpZiAoIWNicykgewogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmICghZm4pIHsKICAgICAgdm0uX2V2ZW50c1tldmVudF0gPSBudWxsOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmIChmbikgewogICAgICAvLyBzcGVjaWZpYyBoYW5kbGVyCiAgICAgIHZhciBjYjsKICAgICAgdmFyIGkkMSA9IGNicy5sZW5ndGg7CiAgICAgIHdoaWxlIChpJDEtLSkgewogICAgICAgIGNiID0gY2JzW2kkMV07CiAgICAgICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHsKICAgICAgICAgIGNicy5zcGxpY2UoaSQxLCAxKTsKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdm0KICB9OwoKICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgewogICAgICB2YXIgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7CiAgICAgICAgdGlwKAogICAgICAgICAgIkV2ZW50IFwiIiArIGxvd2VyQ2FzZUV2ZW50ICsgIlwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICIgKwogICAgICAgICAgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArICIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFwiIiArIGV2ZW50ICsgIlwiLiAiICsKICAgICAgICAgICJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSAiICsKICAgICAgICAgICJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gIiArCiAgICAgICAgICAiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIiICsgKGh5cGhlbmF0ZShldmVudCkpICsgIlwiIGluc3RlYWQgb2YgXCIiICsgZXZlbnQgKyAiXCIuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTsKICAgIGlmIChjYnMpIHsKICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7CiAgICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgY2JzW2ldLmFwcGx5KHZtLCBhcmdzKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKCJldmVudCBoYW5kbGVyIGZvciBcIiIgKyBldmVudCArICJcIiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07Cn0KCi8qICAqLwoKCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC4KICovCmZ1bmN0aW9uIHJlc29sdmVTbG90cyAoCiAgY2hpbGRyZW4sCiAgY29udGV4dAopIHsKICB2YXIgc2xvdHMgPSB7fTsKICBpZiAoIWNoaWxkcmVuKSB7CiAgICByZXR1cm4gc2xvdHMKICB9CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgdmFyIGRhdGEgPSBjaGlsZC5kYXRhOwogICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZQogICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHsKICAgICAgZGVsZXRlIGRhdGEuYXR0cnMuc2xvdDsKICAgIH0KICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZQogICAgLy8gc2FtZSBjb250ZXh0LgogICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiYKICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbAogICAgKSB7CiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90OwogICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpOwogICAgICBpZiAoY2hpbGQudGFnID09PSAndGVtcGxhdGUnKSB7CiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbG90LnB1c2goY2hpbGQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAoc2xvdHMuZGVmYXVsdCB8fCAoc2xvdHMuZGVmYXVsdCA9IFtdKSkucHVzaChjaGlsZCk7CiAgICB9CiAgfQogIC8vIGlnbm9yZSBzbG90cyB0aGF0IGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZQogIGZvciAodmFyIG5hbWUkMSBpbiBzbG90cykgewogICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkgewogICAgICBkZWxldGUgc2xvdHNbbmFtZSQxXTsKICAgIH0KICB9CiAgcmV0dXJuIHNsb3RzCn0KCmZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAobm9kZSkgewogIHJldHVybiAobm9kZS5pc0NvbW1lbnQgJiYgIW5vZGUuYXN5bmNGYWN0b3J5KSB8fCBub2RlLnRleHQgPT09ICcgJwp9CgpmdW5jdGlvbiByZXNvbHZlU2NvcGVkU2xvdHMgKAogIGZucywgLy8gc2VlIGZsb3cvdm5vZGUKICByZXMKKSB7CiAgcmVzID0gcmVzIHx8IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnNbaV0pKSB7CiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7CiAgICB9IGVsc2UgewogICAgICByZXNbZm5zW2ldLmtleV0gPSBmbnNbaV0uZm47CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsOwp2YXIgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7CgpmdW5jdGlvbiBpbml0TGlmZWN5Y2xlICh2bSkgewogIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7CgogIC8vIGxvY2F0ZSBmaXJzdCBub24tYWJzdHJhY3QgcGFyZW50CiAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7CiAgICB9CiAgICBwYXJlbnQuJGNoaWxkcmVuLnB1c2godm0pOwogIH0KCiAgdm0uJHBhcmVudCA9IHBhcmVudDsKICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtOwoKICB2bS4kY2hpbGRyZW4gPSBbXTsKICB2bS4kcmVmcyA9IHt9OwoKICB2bS5fd2F0Y2hlciA9IG51bGw7CiAgdm0uX2luYWN0aXZlID0gbnVsbDsKICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTsKICB2bS5faXNNb3VudGVkID0gZmFsc2U7CiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2U7CiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTsKfQoKZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkgewogIFZ1ZS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICh2bm9kZSwgaHlkcmF0aW5nKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKHZtLl9pc01vdW50ZWQpIHsKICAgICAgY2FsbEhvb2sodm0sICdiZWZvcmVVcGRhdGUnKTsKICAgIH0KICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7CiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlOwogICAgdmFyIHByZXZBY3RpdmVJbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlOwogICAgYWN0aXZlSW5zdGFuY2UgPSB2bTsKICAgIHZtLl92bm9kZSA9IHZub2RlOwogICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzCiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC4KICAgIGlmICghcHJldlZub2RlKSB7CiAgICAgIC8vIGluaXRpYWwgcmVuZGVyCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXygKICAgICAgICB2bS4kZWwsIHZub2RlLCBoeWRyYXRpbmcsIGZhbHNlIC8qIHJlbW92ZU9ubHkgKi8sCiAgICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSwKICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtCiAgICAgICk7CiAgICAgIC8vIG5vIG5lZWQgZm9yIHRoZSByZWYgbm9kZXMgYWZ0ZXIgaW5pdGlhbCBwYXRjaAogICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKQogICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtID0gdm0uJG9wdGlvbnMuX3JlZkVsbSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICAvLyB1cGRhdGVzCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhwcmV2Vm5vZGUsIHZub2RlKTsKICAgIH0KICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlOwogICAgLy8gdXBkYXRlIF9fdnVlX18gcmVmZXJlbmNlCiAgICBpZiAocHJldkVsKSB7CiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDsKICAgIH0KICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTsKICAgIH0KICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGwKICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7CiAgICAgIHZtLiRwYXJlbnQuJGVsID0gdm0uJGVsOwogICAgfQogICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZQogICAgLy8gdXBkYXRlZCBpbiBhIHBhcmVudCdzIHVwZGF0ZWQgaG9vay4KICB9OwoKICBWdWUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX2lzQmVpbmdEZXN0cm95ZWQpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZURlc3Ryb3knKTsKICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTsKICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50CiAgICB2YXIgcGFyZW50ID0gdm0uJHBhcmVudDsKICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHsKICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTsKICAgIH0KICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzCiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudGVhcmRvd24oKTsKICAgIH0KICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7CiAgICB9CiAgICAvLyByZW1vdmUgcmVmZXJlbmNlIGZyb20gZGF0YSBvYgogICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuCiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7CiAgICAgIHZtLl9kYXRhLl9fb2JfXy52bUNvdW50LS07CiAgICB9CiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi4KICAgIHZtLl9pc0Rlc3Ryb3llZCA9IHRydWU7CiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWUKICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpOwogICAgLy8gZmlyZSBkZXN0cm95ZWQgaG9vawogICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTsKICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuCiAgICB2bS4kb2ZmKCk7CiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2UKICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSBudWxsOwogICAgfQogICAgLy8gcmVsZWFzZSBjaXJjdWxhciByZWZlcmVuY2UgKCM2NzU5KQogICAgaWYgKHZtLiR2bm9kZSkgewogICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBtb3VudENvbXBvbmVudCAoCiAgdm0sCiAgZWwsCiAgaHlkcmF0aW5nCikgewogIHZtLiRlbCA9IGVsOwogIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7CiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlOwogICAgewogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHwKICAgICAgICB2bS4kb3B0aW9ucy5lbCB8fCBlbCkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArCiAgICAgICAgICAnY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIHByZS1jb21waWxlIHRoZSB0ZW1wbGF0ZXMgaW50byAnICsKICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgfQogIH0KICBjYWxsSG9vayh2bSwgJ2JlZm9yZU1vdW50Jyk7CgogIHZhciB1cGRhdGVDb21wb25lbnQ7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lOwogICAgICB2YXIgaWQgPSB2bS5fdWlkOwogICAgICB2YXIgc3RhcnRUYWcgPSAidnVlLXBlcmYtc3RhcnQ6IiArIGlkOwogICAgICB2YXIgZW5kVGFnID0gInZ1ZS1wZXJmLWVuZDoiICsgaWQ7CgogICAgICBtYXJrKHN0YXJ0VGFnKTsKICAgICAgdmFyIHZub2RlID0gdm0uX3JlbmRlcigpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHJlbmRlciIpLCBzdGFydFRhZywgZW5kVGFnKTsKCiAgICAgIG1hcmsoc3RhcnRUYWcpOwogICAgICB2bS5fdXBkYXRlKHZub2RlLCBoeWRyYXRpbmcpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHBhdGNoIiksIHN0YXJ0VGFnLCBlbmRUYWcpOwogICAgfTsKICB9IGVsc2UgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2bS5fdXBkYXRlKHZtLl9yZW5kZXIoKSwgaHlkcmF0aW5nKTsKICAgIH07CiAgfQoKICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvcgogIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkCiAgLy8gY29tcG9uZW50J3MgbW91bnRlZCBob29rKSwgd2hpY2ggcmVsaWVzIG9uIHZtLl93YXRjaGVyIGJlaW5nIGFscmVhZHkgZGVmaW5lZAogIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIG51bGwsIHRydWUgLyogaXNSZW5kZXJXYXRjaGVyICovKTsKICBoeWRyYXRpbmcgPSBmYWxzZTsKCiAgLy8gbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSwgY2FsbCBtb3VudGVkIG9uIHNlbGYKICAvLyBtb3VudGVkIGlzIGNhbGxlZCBmb3IgcmVuZGVyLWNyZWF0ZWQgY2hpbGQgY29tcG9uZW50cyBpbiBpdHMgaW5zZXJ0ZWQgaG9vawogIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkgewogICAgdm0uX2lzTW91bnRlZCA9IHRydWU7CiAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTsKICB9CiAgcmV0dXJuIHZtCn0KCmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50ICgKICB2bSwKICBwcm9wc0RhdGEsCiAgbGlzdGVuZXJzLAogIHBhcmVudFZub2RlLAogIHJlbmRlckNoaWxkcmVuCikgewogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7CiAgfQoKICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW4KICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG92ZXJ3cml0aW5nICRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbgogIHZhciBoYXNDaGlsZHJlbiA9ICEhKAogICAgcmVuZGVyQ2hpbGRyZW4gfHwgICAgICAgICAgICAgICAvLyBoYXMgbmV3IHN0YXRpYyBzbG90cwogICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90cwogICAgcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyB8fCAvLyBoYXMgbmV3IHNjb3BlZCBzbG90cwogICAgdm0uJHNjb3BlZFNsb3RzICE9PSBlbXB0eU9iamVjdCAvLyBoYXMgb2xkIHNjb3BlZCBzbG90cwogICk7CgogIHZtLiRvcHRpb25zLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlOwogIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyCgogIGlmICh2bS5fdm5vZGUpIHsgLy8gdXBkYXRlIGNoaWxkIHRyZWUncyBwYXJlbnQKICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTsKICB9CiAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW47CgogIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5lcnMgaGFzaAogIC8vIHRoZXNlIGFyZSBhbHNvIHJlYWN0aXZlIHNvIHRoZXkgbWF5IHRyaWdnZXIgY2hpbGQgdXBkYXRlIGlmIHRoZSBjaGlsZAogIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyCiAgdm0uJGF0dHJzID0gcGFyZW50Vm5vZGUuZGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdDsKICB2bS4kbGlzdGVuZXJzID0gbGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0OwoKICAvLyB1cGRhdGUgcHJvcHMKICBpZiAocHJvcHNEYXRhICYmIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgdmFyIHByb3BzID0gdm0uX3Byb3BzOwogICAgdmFyIHByb3BLZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07CiAgICAgIHZhciBwcm9wT3B0aW9ucyA9IHZtLiRvcHRpb25zLnByb3BzOyAvLyB3dGYgZmxvdz8KICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTsKICAgIH0KICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGEKICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YSA9IHByb3BzRGF0YTsKICB9CgogIC8vIHVwZGF0ZSBsaXN0ZW5lcnMKICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7CiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTsKCiAgLy8gcmVzb2x2ZSBzbG90cyArIGZvcmNlIHVwZGF0ZSBpZiBoYXMgY2hpbGRyZW4KICBpZiAoaGFzQ2hpbGRyZW4pIHsKICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7CiAgICB2bS4kZm9yY2VVcGRhdGUoKTsKICB9CgogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlOwogIH0KfQoKZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHsKICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHsKICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfQogIH0KICByZXR1cm4gZmFsc2UKfQoKZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlOwogICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7CiAgICAgIHJldHVybgogICAgfQogIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7CiAgICByZXR1cm4KICB9CiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHsKICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pOwogICAgfQogICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7CiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgfQogIGlmICghdm0uX2luYWN0aXZlKSB7CiAgICB2bS5faW5hY3RpdmUgPSB0cnVlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7CiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHsKICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzCiAgcHVzaFRhcmdldCgpOwogIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdOwogIGlmIChoYW5kbGVycykgewogICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgdHJ5IHsKICAgICAgICBoYW5kbGVyc1tpXS5jYWxsKHZtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoaG9vayArICIgaG9vayIpKTsKICAgICAgfQogICAgfQogIH0KICBpZiAodm0uX2hhc0hvb2tFdmVudCkgewogICAgdm0uJGVtaXQoJ2hvb2s6JyArIGhvb2spOwogIH0KICBwb3BUYXJnZXQoKTsKfQoKLyogICovCgoKdmFyIE1BWF9VUERBVEVfQ09VTlQgPSAxMDA7Cgp2YXIgcXVldWUgPSBbXTsKdmFyIGFjdGl2YXRlZENoaWxkcmVuID0gW107CnZhciBoYXMgPSB7fTsKdmFyIGNpcmN1bGFyID0ge307CnZhciB3YWl0aW5nID0gZmFsc2U7CnZhciBmbHVzaGluZyA9IGZhbHNlOwp2YXIgaW5kZXggPSAwOwoKLyoqCiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS4KICovCmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkgewogIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDsKICBoYXMgPSB7fTsKICB7CiAgICBjaXJjdWxhciA9IHt9OwogIH0KICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTsKfQoKLyoqCiAqIEZsdXNoIGJvdGggcXVldWVzIGFuZCBydW4gdGhlIHdhdGNoZXJzLgogKi8KZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7CiAgZmx1c2hpbmcgPSB0cnVlOwogIHZhciB3YXRjaGVyLCBpZDsKCiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guCiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6CiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5cwogIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZCkKICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlCiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKQogIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sCiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLgogIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTsKCiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkCiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzCiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7CiAgICB3YXRjaGVyID0gcXVldWVbaW5kZXhdOwogICAgaWQgPSB3YXRjaGVyLmlkOwogICAgaGFzW2lkXSA9IG51bGw7CiAgICB3YXRjaGVyLnJ1bigpOwogICAgLy8gaW4gZGV2IGJ1aWxkLCBjaGVjayBhbmQgc3RvcCBjaXJjdWxhciB1cGRhdGVzLgogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHsKICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7CiAgICAgIGlmIChjaXJjdWxhcltpZF0gPiBNQVhfVVBEQVRFX0NPVU5UKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArICgKICAgICAgICAgICAgd2F0Y2hlci51c2VyCiAgICAgICAgICAgICAgPyAoImluIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uIFwiIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgIlwiIikKICAgICAgICAgICAgICA6ICJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uIgogICAgICAgICAgKSwKICAgICAgICAgIHdhdGNoZXIudm0KICAgICAgICApOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICB9CgogIC8vIGtlZXAgY29waWVzIG9mIHBvc3QgcXVldWVzIGJlZm9yZSByZXNldHRpbmcgc3RhdGUKICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpOwogIHZhciB1cGRhdGVkUXVldWUgPSBxdWV1ZS5zbGljZSgpOwoKICByZXNldFNjaGVkdWxlclN0YXRlKCk7CgogIC8vIGNhbGwgY29tcG9uZW50IHVwZGF0ZWQgYW5kIGFjdGl2YXRlZCBob29rcwogIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7CiAgY2FsbFVwZGF0ZWRIb29rcyh1cGRhdGVkUXVldWUpOwoKICAvLyBkZXZ0b29sIGhvb2sKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoZGV2dG9vbHMgJiYgY29uZmlnLmRldnRvb2xzKSB7CiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpOwogIH0KfQoKZnVuY3Rpb24gY2FsbFVwZGF0ZWRIb29rcyAocXVldWUpIHsKICB2YXIgaSA9IHF1ZXVlLmxlbmd0aDsKICB3aGlsZSAoaS0tKSB7CiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2ldOwogICAgdmFyIHZtID0gd2F0Y2hlci52bTsKICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkKSB7CiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpOwogICAgfQogIH0KfQoKLyoqCiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC4KICogVGhlIHF1ZXVlIHdpbGwgYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSBlbnRpcmUgdHJlZSBoYXMgYmVlbiBwYXRjaGVkLgogKi8KZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7CiAgLy8gc2V0dGluZyBfaW5hY3RpdmUgdG8gZmFsc2UgaGVyZSBzbyB0aGF0IGEgcmVuZGVyIGZ1bmN0aW9uIGNhbgogIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpCiAgdm0uX2luYWN0aXZlID0gZmFsc2U7CiAgYWN0aXZhdGVkQ2hpbGRyZW4ucHVzaCh2bSk7Cn0KCmZ1bmN0aW9uIGNhbGxBY3RpdmF0ZWRIb29rcyAocXVldWUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlOwogICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChxdWV1ZVtpXSwgdHJ1ZSAvKiB0cnVlICovKTsKICB9Cn0KCi8qKgogKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLgogKiBKb2JzIHdpdGggZHVwbGljYXRlIElEcyB3aWxsIGJlIHNraXBwZWQgdW5sZXNzIGl0J3MKICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuCiAqLwpmdW5jdGlvbiBxdWV1ZVdhdGNoZXIgKHdhdGNoZXIpIHsKICB2YXIgaWQgPSB3YXRjaGVyLmlkOwogIGlmIChoYXNbaWRdID09IG51bGwpIHsKICAgIGhhc1tpZF0gPSB0cnVlOwogICAgaWYgKCFmbHVzaGluZykgewogICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZAogICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LgogICAgICB2YXIgaSA9IHF1ZXVlLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7CiAgICAgICAgaS0tOwogICAgICB9CiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7CiAgICB9CiAgICAvLyBxdWV1ZSB0aGUgZmx1c2gKICAgIGlmICghd2FpdGluZykgewogICAgICB3YWl0aW5nID0gdHJ1ZTsKICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciB1aWQkMSA9IDA7CgovKioKICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsCiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuCiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLgogKi8KdmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGNiLAogIG9wdGlvbnMsCiAgaXNSZW5kZXJXYXRjaGVyCikgewogIHRoaXMudm0gPSB2bTsKICBpZiAoaXNSZW5kZXJXYXRjaGVyKSB7CiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7CiAgfQogIHZtLl93YXRjaGVycy5wdXNoKHRoaXMpOwogIC8vIG9wdGlvbnMKICBpZiAob3B0aW9ucykgewogICAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7CiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjsKICAgIHRoaXMubGF6eSA9ICEhb3B0aW9ucy5sYXp5OwogICAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7CiAgfSBlbHNlIHsKICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlOwogIH0KICB0aGlzLmNiID0gY2I7CiAgdGhpcy5pZCA9ICsrdWlkJDE7IC8vIHVpZCBmb3IgYmF0Y2hpbmcKICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnMKICB0aGlzLmRlcHMgPSBbXTsKICB0aGlzLm5ld0RlcHMgPSBbXTsKICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7CiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpOwogIHRoaXMuZXhwcmVzc2lvbiA9IGV4cE9yRm4udG9TdHJpbmcoKTsKICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXIKICBpZiAodHlwZW9mIGV4cE9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjsKICB9IGVsc2UgewogICAgdGhpcy5nZXR0ZXIgPSBwYXJzZVBhdGgoZXhwT3JGbik7CiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7CiAgICAgIHRoaXMuZ2V0dGVyID0gZnVuY3Rpb24gKCkge307CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXCIiICsgZXhwT3JGbiArICJcIiAiICsKICAgICAgICAnV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuICcgKwogICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsCiAgICAgICAgdm0KICAgICAgKTsKICAgIH0KICB9CiAgdGhpcy52YWx1ZSA9IHRoaXMubGF6eQogICAgPyB1bmRlZmluZWQKICAgIDogdGhpcy5nZXQoKTsKfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkgewogIHB1c2hUYXJnZXQodGhpcyk7CiAgdmFyIHZhbHVlOwogIHZhciB2bSA9IHRoaXMudm07CiAgdHJ5IHsKICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIGlmICh0aGlzLnVzZXIpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICgiZ2V0dGVyIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZQogICAgfQogIH0gZmluYWxseSB7CiAgICAvLyAidG91Y2giIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzCiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmcKICAgIGlmICh0aGlzLmRlZXApIHsKICAgICAgdHJhdmVyc2UodmFsdWUpOwogICAgfQogICAgcG9wVGFyZ2V0KCk7CiAgICB0aGlzLmNsZWFudXBEZXBzKCk7CiAgfQogIHJldHVybiB2YWx1ZQp9OwoKLyoqCiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5hZGREZXAgPSBmdW5jdGlvbiBhZGREZXAgKGRlcCkgewogIHZhciBpZCA9IGRlcC5pZDsKICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHsKICAgIHRoaXMubmV3RGVwSWRzLmFkZChpZCk7CiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApOwogICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7CiAgICAgIGRlcC5hZGRTdWIodGhpcyk7CiAgICB9CiAgfQp9OwoKLyoqCiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGRlcCA9IHRoaXMkMS5kZXBzW2ldOwogICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7CiAgICAgIGRlcC5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICB9CiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzOwogIHRoaXMuZGVwSWRzID0gdGhpcy5uZXdEZXBJZHM7CiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7CiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTsKICB0bXAgPSB0aGlzLmRlcHM7CiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzOwogIHRoaXMubmV3RGVwcyA9IHRtcDsKICB0aGlzLm5ld0RlcHMubGVuZ3RoID0gMDsKfTsKCi8qKgogKiBTdWJzY3JpYmVyIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy4KICovCldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAodGhpcy5sYXp5KSB7CiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICB9IGVsc2UgaWYgKHRoaXMuc3luYykgewogICAgdGhpcy5ydW4oKTsKICB9IGVsc2UgewogICAgcXVldWVXYXRjaGVyKHRoaXMpOwogIH0KfTsKCi8qKgogKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci4KICovCldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7CiAgaWYgKHRoaXMuYWN0aXZlKSB7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpOwogICAgaWYgKAogICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fAogICAgICAvLyBEZWVwIHdhdGNoZXJzIGFuZCB3YXRjaGVycyBvbiBPYmplY3QvQXJyYXlzIHNob3VsZCBmaXJlIGV2ZW4KICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heQogICAgICAvLyBoYXZlIG11dGF0ZWQuCiAgICAgIGlzT2JqZWN0KHZhbHVlKSB8fAogICAgICB0aGlzLmRlZXAKICAgICkgewogICAgICAvLyBzZXQgbmV3IHZhbHVlCiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgaWYgKHRoaXMudXNlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoImNhbGxiYWNrIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgfQogICAgfQogIH0KfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuCiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy4KICovCldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkgewogIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpOwogIHRoaXMuZGlydHkgPSBmYWxzZTsKfTsKCi8qKgogKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci4KICovCldhdGNoZXIucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIHRoaXMkMS5kZXBzW2ldLmRlcGVuZCgpOwogIH0KfTsKCi8qKgogKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC4KICovCldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogIGlmICh0aGlzLmFjdGl2ZSkgewogICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdAogICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdAogICAgLy8gaWYgdGhlIHZtIGlzIGJlaW5nIGRlc3Ryb3llZC4KICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkgewogICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpOwogICAgfQogICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogICAgd2hpbGUgKGktLSkgewogICAgICB0aGlzJDEuZGVwc1tpXS5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgfQp9OwoKLyogICovCgp2YXIgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uID0gewogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGdldDogbm9vcCwKICBzZXQ6IG5vb3AKfTsKCmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHsKICAgIHJldHVybiB0aGlzW3NvdXJjZUtleV1ba2V5XQogIH07CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHsKICAgIHRoaXNbc291cmNlS2V5XVtrZXldID0gdmFsOwogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pOwp9CgpmdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7CiAgdm0uX3dhdGNoZXJzID0gW107CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9uczsKICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9CiAgaWYgKG9wdHMubWV0aG9kcykgeyBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKTsgfQogIGlmIChvcHRzLmRhdGEpIHsKICAgIGluaXREYXRhKHZtKTsKICB9IGVsc2UgewogICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pOwogIH0KICBpZiAob3B0cy5jb21wdXRlZCkgeyBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpOyB9CiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHsKICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7CiAgfQp9CgpmdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHsKICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9OwogIHZhciBwcm9wcyA9IHZtLl9wcm9wcyA9IHt9OwogIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5CiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uCiAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBbXTsKICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7CiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkCiAgaWYgKCFpc1Jvb3QpIHsKICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7CiAgfQogIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICBrZXlzLnB1c2goa2V5KTsKICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7CiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwogICAgewogICAgICB2YXIgaHlwaGVuYXRlZEtleSA9IGh5cGhlbmF0ZShrZXkpOwogICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShoeXBoZW5hdGVkS2V5KSB8fAogICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiXCIiICsgaHlwaGVuYXRlZEtleSArICJcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuIiksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgZGVmaW5lUmVhY3RpdmUocHJvcHMsIGtleSwgdmFsdWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodm0uJHBhcmVudCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlICIgKwogICAgICAgICAgICAib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgIiArCiAgICAgICAgICAgICJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcIiIgKyBrZXkgKyAiXCIiLAogICAgICAgICAgICB2bQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZQogICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXQKICAgIC8vIGluc3RhbnRpYXRpb24gaGVyZS4KICAgIGlmICghKGtleSBpbiB2bSkpIHsKICAgICAgcHJveHkodm0sICJfcHJvcHMiLCBrZXkpOwogICAgfQogIH07CgogIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApOwogIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKfQoKZnVuY3Rpb24gaW5pdERhdGEgKHZtKSB7CiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhOwogIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nCiAgICA/IGdldERhdGEoZGF0YSwgdm0pCiAgICA6IGRhdGEgfHwge307CiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7CiAgICBkYXRhID0ge307CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ2RhdGEgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0OlxuJyArCiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLAogICAgICB2bQogICAgKTsKICB9CiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgdmFyIG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzOwogIHZhciBpID0ga2V5cy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICB7CiAgICAgIGlmIChtZXRob2RzICYmIGhhc093bihtZXRob2RzLCBrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiTWV0aG9kIFwiIiArIGtleSArICJcIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBkYXRhIHByb3BlcnR5LiIpLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBpZiAocHJvcHMgJiYgaGFzT3duKHByb3BzLCBrZXkpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJUaGUgZGF0YSBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuICIgKwogICAgICAgICJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuIiwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgIHByb3h5KHZtLCAiX2RhdGEiLCBrZXkpOwogICAgfQogIH0KICAvLyBvYnNlcnZlIGRhdGEKICBvYnNlcnZlKGRhdGEsIHRydWUgLyogYXNSb290RGF0YSAqLyk7Cn0KCmZ1bmN0aW9uIGdldERhdGEgKGRhdGEsIHZtKSB7CiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVycwogIHB1c2hUYXJnZXQoKTsKICB0cnkgewogICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pCiAgfSBjYXRjaCAoZSkgewogICAgaGFuZGxlRXJyb3IoZSwgdm0sICJkYXRhKCkiKTsKICAgIHJldHVybiB7fQogIH0gZmluYWxseSB7CiAgICBwb3BUYXJnZXQoKTsKICB9Cn0KCnZhciBjb21wdXRlZFdhdGNoZXJPcHRpb25zID0geyBsYXp5OiB0cnVlIH07CgpmdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkgewogIC8vICRmbG93LWRpc2FibGUtbGluZQogIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUgogIHZhciBpc1NTUiA9IGlzU2VydmVyUmVuZGVyaW5nKCk7CgogIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkgewogICAgdmFyIHVzZXJEZWYgPSBjb21wdXRlZFtrZXldOwogICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0OwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBnZXR0ZXIgPT0gbnVsbCkgewogICAgICB3YXJuKAogICAgICAgICgiR2V0dGVyIGlzIG1pc3NpbmcgZm9yIGNvbXB1dGVkIHByb3BlcnR5IFwiIiArIGtleSArICJcIi4iKSwKICAgICAgICB2bQogICAgICApOwogICAgfQoKICAgIGlmICghaXNTU1IpIHsKICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKAogICAgICAgIHZtLAogICAgICAgIGdldHRlciB8fCBub29wLAogICAgICAgIG5vb3AsCiAgICAgICAgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucwogICAgICApOwogICAgfQoKICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGUKICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkCiAgICAvLyBhdCBpbnN0YW50aWF0aW9uIGhlcmUuCiAgICBpZiAoIShrZXkgaW4gdm0pKSB7CiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkgewogICAgICAgIHdhcm4oKCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLiIpLCB2bSk7CiAgICAgIH0gZWxzZSBpZiAodm0uJG9wdGlvbnMucHJvcHMgJiYga2V5IGluIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICAgICAgd2FybigoIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC4iKSwgdm0pOwogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBkZWZpbmVDb21wdXRlZCAoCiAgdGFyZ2V0LAogIGtleSwKICB1c2VyRGVmCikgewogIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpOwogIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlCiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KQogICAgICA6IHVzZXJEZWY7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDsKICB9IGVsc2UgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHVzZXJEZWYuZ2V0CiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2UKICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSkKICAgICAgICA6IHVzZXJEZWYuZ2V0CiAgICAgIDogbm9vcDsKICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldAogICAgICA/IHVzZXJEZWYuc2V0CiAgICAgIDogbm9vcDsKICB9CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICB3YXJuKAogICAgICAgICgiQ29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIHdhcyBhc3NpZ25lZCB0byBidXQgaXQgaGFzIG5vIHNldHRlci4iKSwKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbik7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXB1dGVkR2V0dGVyIChrZXkpIHsKICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkgewogICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTsKICAgIGlmICh3YXRjaGVyKSB7CiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7CiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpOwogICAgICB9CiAgICAgIGlmIChEZXAudGFyZ2V0KSB7CiAgICAgICAgd2F0Y2hlci5kZXBlbmQoKTsKICAgICAgfQogICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZQogICAgfQogIH0KfQoKZnVuY3Rpb24gaW5pdE1ldGhvZHMgKHZtLCBtZXRob2RzKSB7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHsKICAgIHsKICAgICAgaWYgKG1ldGhvZHNba2V5XSA9PSBudWxsKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiAiICsKICAgICAgICAgICJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAoIk1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgcHJvcC4iKSwKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuICIgKwogICAgICAgICAgIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pOwogIH0KfQoKZnVuY3Rpb24gaW5pdFdhdGNoICh2bSwgd2F0Y2gpIHsKICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHsKICAgIHZhciBoYW5kbGVyID0gd2F0Y2hba2V5XTsKICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykgewogICAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcltpXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcik7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGhhbmRsZXIsCiAgb3B0aW9ucwopIHsKICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkgewogICAgb3B0aW9ucyA9IGhhbmRsZXI7CiAgICBoYW5kbGVyID0gaGFuZGxlci5oYW5kbGVyOwogIH0KICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7CiAgICBoYW5kbGVyID0gdm1baGFuZGxlcl07CiAgfQogIHJldHVybiB2bS4kd2F0Y2goZXhwT3JGbiwgaGFuZGxlciwgb3B0aW9ucykKfQoKZnVuY3Rpb24gc3RhdGVNaXhpbiAoVnVlKSB7CiAgLy8gZmxvdyBzb21laG93IGhhcyBwcm9ibGVtcyB3aXRoIGRpcmVjdGx5IGRlY2xhcmVkIGRlZmluaXRpb24gb2JqZWN0CiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwCiAgLy8gdGhlIG9iamVjdCBoZXJlLgogIHZhciBkYXRhRGVmID0ge307CiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07CiAgdmFyIHByb3BzRGVmID0ge307CiAgcHJvcHNEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHJvcHMgfTsKICB7CiAgICBkYXRhRGVmLnNldCA9IGZ1bmN0aW9uIChuZXdEYXRhKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICsKICAgICAgICAnVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4nLAogICAgICAgIHRoaXMKICAgICAgKTsKICAgIH07CiAgICBwcm9wc0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHdhcm4oIiRwcm9wcyBpcyByZWFkb25seS4iLCB0aGlzKTsKICAgIH07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGRhdGEnLCBkYXRhRGVmKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTsKCiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0OwogIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDsKCiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoCiAgICBleHBPckZuLAogICAgY2IsCiAgICBvcHRpb25zCiAgKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKGlzUGxhaW5PYmplY3QoY2IpKSB7CiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucykKICAgIH0KICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy51c2VyID0gdHJ1ZTsKICAgIHZhciB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKTsKICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZSkgewogICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiB1bndhdGNoRm4gKCkgewogICAgICB3YXRjaGVyLnRlYXJkb3duKCk7CiAgICB9CiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0UHJvdmlkZSAodm0pIHsKICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7CiAgaWYgKHByb3ZpZGUpIHsKICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nCiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKQogICAgICA6IHByb3ZpZGU7CiAgfQp9CgpmdW5jdGlvbiBpbml0SW5qZWN0aW9ucyAodm0pIHsKICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTsKICBpZiAocmVzdWx0KSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgICAgewogICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSAiICsKICAgICAgICAgICAgIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXCIiICsga2V5ICsgIlwiIiwKICAgICAgICAgICAgdm0KICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkgewogIGlmIChpbmplY3QpIHsKICAgIC8vIGluamVjdCBpcyA6YW55IGJlY2F1c2UgZmxvdyBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgY2FjaGVkCiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBrZXlzID0gaGFzU3ltYm9sCiAgICAgID8gUmVmbGVjdC5vd25LZXlzKGluamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwogICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluamVjdCwga2V5KS5lbnVtZXJhYmxlCiAgICAgIH0pCiAgICAgIDogT2JqZWN0LmtleXMoaW5qZWN0KTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTsKICAgICAgdmFyIHNvdXJjZSA9IHZtOwogICAgICB3aGlsZSAoc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDsKICAgICAgfQogICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHsKICAgICAgICAgIHZhciBwcm92aWRlRGVmYXVsdCA9IGluamVjdFtrZXldLmRlZmF1bHQ7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pCiAgICAgICAgICAgIDogcHJvdmlkZURlZmF1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm4oKCJJbmplY3Rpb24gXCIiICsga2V5ICsgIlwiIG5vdCBmb3VuZCIpLCB2bSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLgogKi8KZnVuY3Rpb24gcmVuZGVyTGlzdCAoCiAgdmFsLAogIHJlbmRlcgopIHsKICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpOwogICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHsKICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpOwogICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBrZXkgPSBrZXlzW2ldOwogICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7CiAgICB9CiAgfQogIGlmIChpc0RlZihyZXQpKSB7CiAgICAocmV0KS5faXNWTGlzdCA9IHRydWU7CiAgfQogIHJldHVybiByZXQKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyA8c2xvdD4KICovCmZ1bmN0aW9uIHJlbmRlclNsb3QgKAogIG5hbWUsCiAgZmFsbGJhY2ssCiAgcHJvcHMsCiAgYmluZE9iamVjdAopIHsKICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07CiAgdmFyIG5vZGVzOwogIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3QKICAgIHByb3BzID0gcHJvcHMgfHwge307CiAgICBpZiAoYmluZE9iamVjdCkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc09iamVjdChiaW5kT2JqZWN0KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7CiAgICB9CiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7CiAgfSBlbHNlIHsKICAgIHZhciBzbG90Tm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXTsKICAgIC8vIHdhcm4gZHVwbGljYXRlIHNsb3QgdXNhZ2UKICAgIGlmIChzbG90Tm9kZXMpIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzbG90Tm9kZXMuX3JlbmRlcmVkKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcIiIgKyBuYW1lICsgIlwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlICIgKwogICAgICAgICAgIi0gdGhpcyB3aWxsIGxpa2VseSBjYXVzZSByZW5kZXIgZXJyb3JzLiIsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBzbG90Tm9kZXMuX3JlbmRlcmVkID0gdHJ1ZTsKICAgIH0KICAgIG5vZGVzID0gc2xvdE5vZGVzIHx8IGZhbGxiYWNrOwogIH0KCiAgdmFyIHRhcmdldCA9IHByb3BzICYmIHByb3BzLnNsb3Q7CiAgaWYgKHRhcmdldCkgewogICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpCiAgfSBlbHNlIHsKICAgIHJldHVybiBub2RlcwogIH0KfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzCiAqLwpmdW5jdGlvbiByZXNvbHZlRmlsdGVyIChpZCkgewogIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHkKfQoKLyogICovCgpmdW5jdGlvbiBpc0tleU5vdE1hdGNoIChleHBlY3QsIGFjdHVhbCkgewogIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHsKICAgIHJldHVybiBleHBlY3QuaW5kZXhPZihhY3R1YWwpID09PSAtMQogIH0gZWxzZSB7CiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWwKICB9Cn0KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgY2hlY2tpbmcga2V5Q29kZXMgZnJvbSBjb25maWcuCiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fawogKiBwYXNzaW5nIGluIGV2ZW50S2V5TmFtZSBhcyBsYXN0IGFyZ3VtZW50IHNlcGFyYXRlbHkgZm9yIGJhY2t3YXJkcyBjb21wYXQKICovCmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKAogIGV2ZW50S2V5Q29kZSwKICBrZXksCiAgYnVpbHRJbktleUNvZGUsCiAgZXZlbnRLZXlOYW1lLAogIGJ1aWx0SW5LZXlOYW1lCikgewogIHZhciBtYXBwZWRLZXlDb2RlID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbktleUNvZGU7CiAgaWYgKGJ1aWx0SW5LZXlOYW1lICYmIGV2ZW50S2V5TmFtZSAmJiAhY29uZmlnLmtleUNvZGVzW2tleV0pIHsKICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpCiAgfSBlbHNlIGlmIChtYXBwZWRLZXlDb2RlKSB7CiAgICByZXR1cm4gaXNLZXlOb3RNYXRjaChtYXBwZWRLZXlDb2RlLCBldmVudEtleUNvZGUpCiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHsKICAgIHJldHVybiBoeXBoZW5hdGUoZXZlbnRLZXlOYW1lKSAhPT0ga2V5CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgbWVyZ2luZyB2LWJpbmQ9Im9iamVjdCIgaW50byBhIFZOb2RlJ3MgZGF0YS4KICovCmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoCiAgZGF0YSwKICB0YWcsCiAgdmFsdWUsCiAgYXNQcm9wLAogIGlzU3luYwopIHsKICBpZiAodmFsdWUpIHsKICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICd2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCBvciBBcnJheSB2YWx1ZScsCiAgICAgICAgdGhpcwogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgdmFsdWUgPSB0b09iamVjdCh2YWx1ZSk7CiAgICAgIH0KICAgICAgdmFyIGhhc2g7CiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8CiAgICAgICAgICBrZXkgPT09ICdzdHlsZScgfHwKICAgICAgICAgIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUoa2V5KQogICAgICAgICkgewogICAgICAgICAgaGFzaCA9IGRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7CiAgICAgICAgICBoYXNoID0gYXNQcm9wIHx8IGNvbmZpZy5tdXN0VXNlUHJvcCh0YWcsIHR5cGUsIGtleSkKICAgICAgICAgICAgPyBkYXRhLmRvbVByb3BzIHx8IChkYXRhLmRvbVByb3BzID0ge30pCiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2V5IGluIGhhc2gpKSB7CiAgICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZVtrZXldOwoKICAgICAgICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgICAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICAgICAgICAgICAgb25bKCJ1cGRhdGU6IiArIGtleSldID0gZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuCiAqLwpmdW5jdGlvbiByZW5kZXJTdGF0aWMgKAogIGluZGV4LAogIGlzSW5Gb3IKKSB7CiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTsKICB2YXIgdHJlZSA9IGNhY2hlZFtpbmRleF07CiAgLy8gaWYgaGFzIGFscmVhZHktcmVuZGVyZWQgc3RhdGljIHRyZWUgYW5kIG5vdCBpbnNpZGUgdi1mb3IsCiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuCiAgaWYgKHRyZWUgJiYgIWlzSW5Gb3IpIHsKICAgIHJldHVybiB0cmVlCiAgfQogIC8vIG90aGVyd2lzZSwgcmVuZGVyIGEgZnJlc2ggdHJlZS4KICB0cmVlID0gY2FjaGVkW2luZGV4XSA9IHRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2luZGV4XS5jYWxsKAogICAgdGhpcy5fcmVuZGVyUHJveHksCiAgICBudWxsLAogICAgdGhpcyAvLyBmb3IgcmVuZGVyIGZucyBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9uYWwgY29tcG9uZW50IHRlbXBsYXRlcwogICk7CiAgbWFya1N0YXRpYyh0cmVlLCAoIl9fc3RhdGljX18iICsgaW5kZXgpLCBmYWxzZSk7CiAgcmV0dXJuIHRyZWUKfQoKLyoqCiAqIFJ1bnRpbWUgaGVscGVyIGZvciB2LW9uY2UuCiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LgogKi8KZnVuY3Rpb24gbWFya09uY2UgKAogIHRyZWUsCiAgaW5kZXgsCiAga2V5CikgewogIG1hcmtTdGF0aWModHJlZSwgKCJfX29uY2VfXyIgKyBpbmRleCArIChrZXkgPyAoIl8iICsga2V5KSA6ICIiKSksIHRydWUpOwogIHJldHVybiB0cmVlCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMgKAogIHRyZWUsCiAga2V5LAogIGlzT25jZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykgewogICAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWVbaV0sIChrZXkgKyAiXyIgKyBpKSwgaXNPbmNlKTsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBtYXJrU3RhdGljTm9kZSh0cmVlLCBrZXksIGlzT25jZSk7CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljTm9kZSAobm9kZSwga2V5LCBpc09uY2UpIHsKICBub2RlLmlzU3RhdGljID0gdHJ1ZTsKICBub2RlLmtleSA9IGtleTsKICBub2RlLmlzT25jZSA9IGlzT25jZTsKfQoKLyogICovCgpmdW5jdGlvbiBiaW5kT2JqZWN0TGlzdGVuZXJzIChkYXRhLCB2YWx1ZSkgewogIGlmICh2YWx1ZSkgewogICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJywKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICB2YXIgb24gPSBkYXRhLm9uID0gZGF0YS5vbiA/IGV4dGVuZCh7fSwgZGF0YS5vbikgOiB7fTsKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7CiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTsKICAgICAgICB2YXIgb3VycyA9IHZhbHVlW2tleV07CiAgICAgICAgb25ba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBvdXJzKSA6IG91cnM7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgpmdW5jdGlvbiBpbnN0YWxsUmVuZGVySGVscGVycyAodGFyZ2V0KSB7CiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7CiAgdGFyZ2V0Ll9uID0gdG9OdW1iZXI7CiAgdGFyZ2V0Ll9zID0gdG9TdHJpbmc7CiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDsKICB0YXJnZXQuX3QgPSByZW5kZXJTbG90OwogIHRhcmdldC5fcSA9IGxvb3NlRXF1YWw7CiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mOwogIHRhcmdldC5fbSA9IHJlbmRlclN0YXRpYzsKICB0YXJnZXQuX2YgPSByZXNvbHZlRmlsdGVyOwogIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7CiAgdGFyZ2V0Ll9iID0gYmluZE9iamVjdFByb3BzOwogIHRhcmdldC5fdiA9IGNyZWF0ZVRleHRWTm9kZTsKICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlOwogIHRhcmdldC5fdSA9IHJlc29sdmVTY29wZWRTbG90czsKICB0YXJnZXQuX2cgPSBiaW5kT2JqZWN0TGlzdGVuZXJzOwp9CgovKiAgKi8KCmZ1bmN0aW9uIEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0ICgKICBkYXRhLAogIHByb3BzLAogIGNoaWxkcmVuLAogIHBhcmVudCwKICBDdG9yCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIC8vIGVuc3VyZSB0aGUgY3JlYXRlRWxlbWVudCBmdW5jdGlvbiBpbiBmdW5jdGlvbmFsIGNvbXBvbmVudHMKICAvLyBnZXRzIGEgdW5pcXVlIGNvbnRleHQgLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBuYW1lZCBzbG90IGNoZWNrCiAgdmFyIGNvbnRleHRWbTsKICBpZiAoaGFzT3duKHBhcmVudCwgJ191aWQnKSkgewogICAgY29udGV4dFZtID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQpOwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBjb250ZXh0Vm0uX29yaWdpbmFsID0gcGFyZW50OwogIH0gZWxzZSB7CiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC4KICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYWJsZSB0byBnZXQgYSBob2xkIHRvIHRoZQogICAgLy8gcmVhbCBjb250ZXh0IGluc3RhbmNlLgogICAgY29udGV4dFZtID0gcGFyZW50OwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBwYXJlbnQgPSBwYXJlbnQuX29yaWdpbmFsOwogIH0KICB2YXIgaXNDb21waWxlZCA9IGlzVHJ1ZShvcHRpb25zLl9jb21waWxlZCk7CiAgdmFyIG5lZWROb3JtYWxpemF0aW9uID0gIWlzQ29tcGlsZWQ7CgogIHRoaXMuZGF0YSA9IGRhdGE7CiAgdGhpcy5wcm9wcyA9IHByb3BzOwogIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICB0aGlzLmxpc3RlbmVycyA9IGRhdGEub24gfHwgZW1wdHlPYmplY3Q7CiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTsKICB0aGlzLnNsb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpOyB9OwoKICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlCiAgaWYgKGlzQ29tcGlsZWQpIHsKICAgIC8vIGV4cG9zaW5nICRvcHRpb25zIGZvciByZW5kZXJTdGF0aWMoKQogICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAvLyBwcmUtcmVzb2x2ZSBzbG90cyBmb3IgcmVuZGVyU2xvdCgpCiAgICB0aGlzLiRzbG90cyA9IHRoaXMuc2xvdHMoKTsKICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gZGF0YS5zY29wZWRTbG90cyB8fCBlbXB0eU9iamVjdDsKICB9CgogIGlmIChvcHRpb25zLl9zY29wZUlkKSB7CiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsKICAgICAgdmFyIHZub2RlID0gY3JlYXRlRWxlbWVudChjb250ZXh0Vm0sIGEsIGIsIGMsIGQsIG5lZWROb3JtYWxpemF0aW9uKTsKICAgICAgaWYgKHZub2RlICYmICFBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7CiAgICAgICAgdm5vZGUuZm5Db250ZXh0ID0gcGFyZW50OwogICAgICB9CiAgICAgIHJldHVybiB2bm9kZQogICAgfTsKICB9IGVsc2UgewogICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9OwogIH0KfQoKaW5zdGFsbFJlbmRlckhlbHBlcnMoRnVuY3Rpb25hbFJlbmRlckNvbnRleHQucHJvdG90eXBlKTsKCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKAogIEN0b3IsCiAgcHJvcHNEYXRhLAogIGRhdGEsCiAgY29udGV4dFZtLAogIGNoaWxkcmVuCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIHZhciBwcm9wcyA9IHt9OwogIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKGlzRGVmKHByb3BPcHRpb25zKSkgewogICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7CiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YS5wcm9wcykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5wcm9wcyk7IH0KICB9CgogIHZhciByZW5kZXJDb250ZXh0ID0gbmV3IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0KAogICAgZGF0YSwKICAgIHByb3BzLAogICAgY2hpbGRyZW4sCiAgICBjb250ZXh0Vm0sCiAgICBDdG9yCiAgKTsKCiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTsKCiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucykKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICB2YXIgdm5vZGVzID0gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUpIHx8IFtdOwogICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc1tpXSA9IGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQodm5vZGVzW2ldLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucyk7CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0ICh2bm9kZSwgZGF0YSwgY29udGV4dFZtLCBvcHRpb25zKSB7CiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWQKICAvLyAoZS5nLiBpdCB3YXMgZnJvbSBhIGNhY2hlZCBub3JtYWwgc2xvdCkgdGhlIGZuQ29udGV4dCBjYXVzZXMgbmFtZWQgc2xvdHMKICAvLyB0aGF0IHNob3VsZCBub3QgYmUgbWF0Y2hlZCB0byBtYXRjaC4KICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTsKICBjbG9uZS5mbkNvbnRleHQgPSBjb250ZXh0Vm07CiAgY2xvbmUuZm5PcHRpb25zID0gb3B0aW9uczsKICBpZiAoZGF0YS5zbG90KSB7CiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDsKICB9CiAgcmV0dXJuIGNsb25lCn0KCmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRvLCBmcm9tKSB7CiAgZm9yICh2YXIga2V5IGluIGZyb20pIHsKICAgIHRvW2NhbWVsaXplKGtleSldID0gZnJvbVtrZXldOwogIH0KfQoKLyogICovCgoKCgovLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGhvb2sgdG8gd2VleCBuYXRpdmUgcmVuZGVyIGVuZ2luZS4KLy8gVGhlIGhvb2sgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgbmF0aXZlLCBub3QgamF2YXNjcmlwdC4KCgovLyBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHRvIHdlZXggbmF0aXZlIHJlbmRlciBlbmdpbmUuCgovKiAgKi8KCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYW5rczEwMTAwL3dlZXgtbmF0aXZlLWRpcmVjdGl2ZS90cmVlL21hc3Rlci9jb21wb25lbnQKCi8vIGxpc3RlbmluZyBvbiBuYXRpdmUgY2FsbGJhY2sKCi8qICAqLwoKLyogICovCgovLyBpbmxpbmUgaG9va3MgdG8gYmUgaW52b2tlZCBvbiBjb21wb25lbnQgVk5vZGVzIGR1cmluZyBwYXRjaAp2YXIgY29tcG9uZW50Vk5vZGVIb29rcyA9IHsKICBpbml0OiBmdW5jdGlvbiBpbml0ICgKICAgIHZub2RlLAogICAgaHlkcmF0aW5nLAogICAgcGFyZW50RWxtLAogICAgcmVmRWxtCiAgKSB7CiAgICBpZiAoCiAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmCiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiYKICAgICAgdm5vZGUuZGF0YS5rZWVwQWxpdmUKICAgICkgewogICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2gKICAgICAgdmFyIG1vdW50ZWROb2RlID0gdm5vZGU7IC8vIHdvcmsgYXJvdW5kIGZsb3cKICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKAogICAgICAgIHZub2RlLAogICAgICAgIGFjdGl2ZUluc3RhbmNlLAogICAgICAgIHBhcmVudEVsbSwKICAgICAgICByZWZFbG0KICAgICAgKTsKICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTsKICAgIH0KICB9LAoKICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkgewogICAgdmFyIG9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTsKICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KAogICAgICBjaGlsZCwKICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHMKICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzCiAgICAgIHZub2RlLCAvLyBuZXcgcGFyZW50IHZub2RlCiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuCiAgICApOwogIH0sCgogIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkgewogICAgdmFyIGNvbnRleHQgPSB2bm9kZS5jb250ZXh0OwogICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7CiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHsKICAgICAgY29tcG9uZW50SW5zdGFuY2UuX2lzTW91bnRlZCA9IHRydWU7CiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpOwogICAgfQogICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7CiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHsKICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTIKICAgICAgICAvLyBEdXJpbmcgdXBkYXRlcywgYSBrZXB0LWFsaXZlIGNvbXBvbmVudCdzIGNoaWxkIGNvbXBvbmVudHMgbWF5CiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzCiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbAogICAgICAgIC8vIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgd2hvbGUgcGF0Y2ggcHJvY2VzcyBlbmRlZC4KICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pOwogICAgICB9CiAgICB9CiAgfSwKCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHsKICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkgewogICAgICAgIGNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7CiAgICAgIH0KICAgIH0KICB9Cn07Cgp2YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7CgpmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKAogIEN0b3IsCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICBpZiAoaXNVbmRlZihDdG9yKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgYmFzZUN0b3IgPSBjb250ZXh0LiRvcHRpb25zLl9iYXNlOwoKICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3IKICBpZiAoaXNPYmplY3QoQ3RvcikpIHsKICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7CiAgfQoKICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksCiAgLy8gcmVqZWN0LgogIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJykgewogICAgewogICAgICB3YXJuKCgiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4KICB9CgogIC8vIGFzeW5jIGNvbXBvbmVudAogIHZhciBhc3luY0ZhY3Rvcnk7CiAgaWYgKGlzVW5kZWYoQ3Rvci5jaWQpKSB7CiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yOwogICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTsKICAgIGlmIChDdG9yID09PSB1bmRlZmluZWQpIHsKICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZAogICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS4KICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgYXN5bmMgc2VydmVyLXJlbmRlcmluZyBhbmQgaHlkcmF0aW9uLgogICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcigKICAgICAgICBhc3luY0ZhY3RvcnksCiAgICAgICAgZGF0YSwKICAgICAgICBjb250ZXh0LAogICAgICAgIGNoaWxkcmVuLAogICAgICAgIHRhZwogICAgICApCiAgICB9CiAgfQoKICBkYXRhID0gZGF0YSB8fCB7fTsKCiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlcgogIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvbgogIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvcik7CgogIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHMKICBpZiAoaXNEZWYoZGF0YS5tb2RlbCkpIHsKICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7CiAgfQoKICAvLyBleHRyYWN0IHByb3BzCiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTsKCiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnQKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkgewogICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoQ3RvciwgcHJvcHNEYXRhLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbikKICB9CgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzLCBzaW5jZSB0aGVzZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzCiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnMKICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjsKICAvLyByZXBsYWNlIHdpdGggbGlzdGVuZXJzIHdpdGggLm5hdGl2ZSBtb2RpZmllcgogIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLgogIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uOwoKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHsKICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmcKICAgIC8vIG90aGVyIHRoYW4gcHJvcHMgJiBsaXN0ZW5lcnMgJiBzbG90CgogICAgLy8gd29yayBhcm91bmQgZmxvdwogICAgdmFyIHNsb3QgPSBkYXRhLnNsb3Q7CiAgICBkYXRhID0ge307CiAgICBpZiAoc2xvdCkgewogICAgICBkYXRhLnNsb3QgPSBzbG90OwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlCiAgaW5zdGFsbENvbXBvbmVudEhvb2tzKGRhdGEpOwoKICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZQogIHZhciBuYW1lID0gQ3Rvci5vcHRpb25zLm5hbWUgfHwgdGFnOwogIHZhciB2bm9kZSA9IG5ldyBWTm9kZSgKICAgICgidnVlLWNvbXBvbmVudC0iICsgKEN0b3IuY2lkKSArIChuYW1lID8gKCItIiArIG5hbWUpIDogJycpKSwKICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHQsCiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LAogICAgYXN5bmNGYWN0b3J5CiAgKTsKCiAgLy8gV2VleCBzcGVjaWZpYzogaW52b2tlIHJlY3ljbGUtbGlzdCBvcHRpbWl6ZWQgQHJlbmRlciBmdW5jdGlvbiBmb3IKICAvLyBleHRyYWN0aW5nIGNlbGwtc2xvdCB0ZW1wbGF0ZS4KICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGFua3MxMDEwMC93ZWV4LW5hdGl2ZS1kaXJlY3RpdmUvdHJlZS9tYXN0ZXIvY29tcG9uZW50CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgcmV0dXJuIHZub2RlCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUgKAogIHZub2RlLCAvLyB3ZSBrbm93IGl0J3MgTW91bnRlZENvbXBvbmVudFZOb2RlIGJ1dCBmbG93IGRvZXNuJ3QKICBwYXJlbnQsIC8vIGFjdGl2ZUluc3RhbmNlIGluIGxpZmVjeWNsZSBzdGF0ZQogIHBhcmVudEVsbSwKICByZWZFbG0KKSB7CiAgdmFyIG9wdGlvbnMgPSB7CiAgICBfaXNDb21wb25lbnQ6IHRydWUsCiAgICBwYXJlbnQ6IHBhcmVudCwKICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsCiAgICBfcGFyZW50RWxtOiBwYXJlbnRFbG0gfHwgbnVsbCwKICAgIF9yZWZFbG06IHJlZkVsbSB8fCBudWxsCiAgfTsKICAvLyBjaGVjayBpbmxpbmUtdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9ucwogIHZhciBpbmxpbmVUZW1wbGF0ZSA9IHZub2RlLmRhdGEuaW5saW5lVGVtcGxhdGU7CiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkgewogICAgb3B0aW9ucy5yZW5kZXIgPSBpbmxpbmVUZW1wbGF0ZS5yZW5kZXI7CiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZuczsKICB9CiAgcmV0dXJuIG5ldyB2bm9kZS5jb21wb25lbnRPcHRpb25zLkN0b3Iob3B0aW9ucykKfQoKZnVuY3Rpb24gaW5zdGFsbENvbXBvbmVudEhvb2tzIChkYXRhKSB7CiAgdmFyIGhvb2tzID0gZGF0YS5ob29rIHx8IChkYXRhLmhvb2sgPSB7fSk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBob29rc1RvTWVyZ2VbaV07CiAgICBob29rc1trZXldID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldOwogIH0KfQoKLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50bwovLyBwcm9wIGFuZCBldmVudCBoYW5kbGVyIHJlc3BlY3RpdmVseS4KZnVuY3Rpb24gdHJhbnNmb3JtTW9kZWwgKG9wdGlvbnMsIGRhdGEpIHsKICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJzsKICB2YXIgZXZlbnQgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLmV2ZW50KSB8fCAnaW5wdXQnOyhkYXRhLnByb3BzIHx8IChkYXRhLnByb3BzID0ge30pKVtwcm9wXSA9IGRhdGEubW9kZWwudmFsdWU7CiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICBpZiAoaXNEZWYob25bZXZlbnRdKSkgewogICAgb25bZXZlbnRdID0gW2RhdGEubW9kZWwuY2FsbGJhY2tdLmNvbmNhdChvbltldmVudF0pOwogIH0gZWxzZSB7CiAgICBvbltldmVudF0gPSBkYXRhLm1vZGVsLmNhbGxiYWNrOwogIH0KfQoKLyogICovCgp2YXIgU0lNUExFX05PUk1BTElaRSA9IDE7CnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjsKCi8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHByb3ZpZGluZyBhIG1vcmUgZmxleGlibGUgaW50ZXJmYWNlCi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvdwpmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlLAogIGFsd2F5c05vcm1hbGl6ZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gZGF0YTsKICAgIGRhdGEgPSB1bmRlZmluZWQ7CiAgfQogIGlmIChpc1RydWUoYWx3YXlzTm9ybWFsaXplKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFOwogIH0KICByZXR1cm4gX2NyZWF0ZUVsZW1lbnQoY29udGV4dCwgdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUpCn0KCmZ1bmN0aW9uIF9jcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlCikgewogIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICJBdm9pZCB1c2luZyBvYnNlcnZlZCBkYXRhIG9iamVjdCBhcyB2bm9kZSBkYXRhOiAiICsgKEpTT04uc3RyaW5naWZ5KGRhdGEpKSArICJcbiIgKwogICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJywKICAgICAgY29udGV4dAogICAgKTsKICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKCkKICB9CiAgLy8gb2JqZWN0IHN5bnRheCBpbiB2LWJpbmQKICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHsKICAgIHRhZyA9IGRhdGEuaXM7CiAgfQogIGlmICghdGFnKSB7CiAgICAvLyBpbiBjYXNlIG9mIGNvbXBvbmVudCA6aXMgc2V0IHRvIGZhbHN5IHZhbHVlCiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQogIC8vIHdhcm4gYWdhaW5zdCBub24tcHJpbWl0aXZlIGtleQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIGlzRGVmKGRhdGEpICYmIGlzRGVmKGRhdGEua2V5KSAmJiAhaXNQcmltaXRpdmUoZGF0YS5rZXkpCiAgKSB7CiAgICB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCAnICsKICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLAogICAgICAgIGNvbnRleHQKICAgICAgKTsKICAgIH0KICB9CiAgLy8gc3VwcG9ydCBzaW5nbGUgZnVuY3Rpb24gY2hpbGRyZW4gYXMgZGVmYXVsdCBzY29wZWQgc2xvdAogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJgogICAgdHlwZW9mIGNoaWxkcmVuWzBdID09PSAnZnVuY3Rpb24nCiAgKSB7CiAgICBkYXRhID0gZGF0YSB8fCB7fTsKICAgIGRhdGEuc2NvcGVkU2xvdHMgPSB7IGRlZmF1bHQ6IGNoaWxkcmVuWzBdIH07CiAgICBjaGlsZHJlbi5sZW5ndGggPSAwOwogIH0KICBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IEFMV0FZU19OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gbm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0KICB2YXIgdm5vZGUsIG5zOwogIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJykgewogICAgdmFyIEN0b3I7CiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpOwogICAgaWYgKGNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHMKICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHRhZyksIGRhdGEsIGNoaWxkcmVuLAogICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0CiAgICAgICk7CiAgICB9IGVsc2UgaWYgKGlzRGVmKEN0b3IgPSByZXNvbHZlQXNzZXQoY29udGV4dC4kb3B0aW9ucywgJ2NvbXBvbmVudHMnLCB0YWcpKSkgewogICAgICAvLyBjb21wb25lbnQKICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7CiAgICB9IGVsc2UgewogICAgICAvLyB1bmtub3duIG9yIHVubGlzdGVkIG5hbWVzcGFjZWQgZWxlbWVudHMKICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHMKICAgICAgLy8gcGFyZW50IG5vcm1hbGl6ZXMgY2hpbGRyZW4KICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbiwKICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dAogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBkaXJlY3QgY29tcG9uZW50IG9wdGlvbnMgLyBjb25zdHJ1Y3RvcgogICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7CiAgfQogIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgcmV0dXJuIHZub2RlCiAgfSBlbHNlIGlmIChpc0RlZih2bm9kZSkpIHsKICAgIGlmIChpc0RlZihucykpIHsgYXBwbHlOUyh2bm9kZSwgbnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH0KICAgIHJldHVybiB2bm9kZQogIH0gZWxzZSB7CiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQp9CgpmdW5jdGlvbiBhcHBseU5TICh2bm9kZSwgbnMsIGZvcmNlKSB7CiAgdm5vZGUubnMgPSBuczsKICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHsKICAgIC8vIHVzZSBkZWZhdWx0IG5hbWVzcGFjZSBpbnNpZGUgZm9yZWlnbk9iamVjdAogICAgbnMgPSB1bmRlZmluZWQ7CiAgICBmb3JjZSA9IHRydWU7CiAgfQogIGlmIChpc0RlZih2bm9kZS5jaGlsZHJlbikpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoY2hpbGQudGFnKSAmJiAoCiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7CiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMsIGZvcmNlKTsKICAgICAgfQogICAgfQogIH0KfQoKLy8gcmVmICM1MzE4Ci8vIG5lY2Vzc2FyeSB0byBlbnN1cmUgcGFyZW50IHJlLXJlbmRlciB3aGVuIGRlZXAgYmluZGluZ3MgbGlrZSA6c3R5bGUgYW5kCi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzCmZ1bmN0aW9uIHJlZ2lzdGVyRGVlcEJpbmRpbmdzIChkYXRhKSB7CiAgaWYgKGlzT2JqZWN0KGRhdGEuc3R5bGUpKSB7CiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTsKICB9CiAgaWYgKGlzT2JqZWN0KGRhdGEuY2xhc3MpKSB7CiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHsKICB2bS5fdm5vZGUgPSBudWxsOyAvLyB0aGUgcm9vdCBvZiB0aGUgY2hpbGQgdHJlZQogIHZtLl9zdGF0aWNUcmVlcyA9IG51bGw7IC8vIHYtb25jZSBjYWNoZWQgdHJlZXMKICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogIHZhciBwYXJlbnRWbm9kZSA9IHZtLiR2bm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZQogIHZhciByZW5kZXJDb250ZXh0ID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuY29udGV4dDsKICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpOwogIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0OwogIC8vIGJpbmQgdGhlIGNyZWF0ZUVsZW1lbnQgZm4gdG8gdGhpcyBpbnN0YW5jZQogIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuCiAgLy8gYXJncyBvcmRlcjogdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUsIGFsd2F5c05vcm1hbGl6ZQogIC8vIGludGVybmFsIHZlcnNpb24gaXMgdXNlZCBieSByZW5kZXIgZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gdGVtcGxhdGVzCiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9OwogIC8vIG5vcm1hbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgZm9yIHRoZSBwdWJsaWMgdmVyc2lvbiwgdXNlZCBpbgogIC8vIHVzZXItd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zLgogIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9OwoKICAvLyAkYXR0cnMgJiAkbGlzdGVuZXJzIGFyZSBleHBvc2VkIGZvciBlYXNpZXIgSE9DIGNyZWF0aW9uLgogIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWQKICB2YXIgcGFyZW50RGF0YSA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmRhdGE7CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgewogICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkYXR0cnMgaXMgcmVhZG9ubHkuIiwgdm0pOwogICAgfSwgdHJ1ZSk7CiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LiIsIHZtKTsKICAgIH0sIHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVuZGVyTWl4aW4gKFZ1ZSkgewogIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzCiAgaW5zdGFsbFJlbmRlckhlbHBlcnMoVnVlLnByb3RvdHlwZSk7CgogIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpCiAgfTsKCiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHZtID0gdGhpczsKICAgIHZhciByZWYgPSB2bS4kb3B0aW9uczsKICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyOwogICAgdmFyIF9wYXJlbnRWbm9kZSA9IHJlZi5fcGFyZW50Vm5vZGU7CgogICAgLy8gcmVzZXQgX3JlbmRlcmVkIGZsYWcgb24gc2xvdHMgZm9yIGR1cGxpY2F0ZSBzbG90IGNoZWNrCiAgICB7CiAgICAgIGZvciAodmFyIGtleSBpbiB2bS4kc2xvdHMpIHsKICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgICB2bS4kc2xvdHNba2V5XS5fcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChfcGFyZW50Vm5vZGUpIHsKICAgICAgdm0uJHNjb3BlZFNsb3RzID0gX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMgfHwgZW1wdHlPYmplY3Q7CiAgICB9CgogICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2VzcwogICAgLy8gdG8gdGhlIGRhdGEgb24gdGhlIHBsYWNlaG9sZGVyIG5vZGUuCiAgICB2bS4kdm5vZGUgPSBfcGFyZW50Vm5vZGU7CiAgICAvLyByZW5kZXIgc2VsZgogICAgdmFyIHZub2RlOwogICAgdHJ5IHsKICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXIiKTsKICAgICAgLy8gcmV0dXJuIGVycm9yIHJlbmRlciByZXN1bHQsCiAgICAgIC8vIG9yIHByZXZpb3VzIHZub2RlIHRvIHByZXZlbnQgcmVuZGVyIGVycm9yIGNhdXNpbmcgYmxhbmsgY29tcG9uZW50CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgICAgIHsKICAgICAgICBpZiAodm0uJG9wdGlvbnMucmVuZGVyRXJyb3IpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXJFcnJvciIpOwogICAgICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGUgPSB2bS5fdm5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0CiAgICBpZiAoISh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdNdWx0aXBsZSByb290IG5vZGVzIHJldHVybmVkIGZyb20gcmVuZGVyIGZ1bmN0aW9uLiBSZW5kZXIgZnVuY3Rpb24gJyArCiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICB2bm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICAgIH0KICAgIC8vIHNldCBwYXJlbnQKICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTsKICAgIHJldHVybiB2bm9kZQogIH07Cn0KCi8qICAqLwoKdmFyIHVpZCQzID0gMDsKCmZ1bmN0aW9uIGluaXRNaXhpbiAoVnVlKSB7CiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgLy8gYSB1aWQKICAgIHZtLl91aWQgPSB1aWQkMysrOwoKICAgIHZhciBzdGFydFRhZywgZW5kVGFnOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgIHN0YXJ0VGFnID0gInZ1ZS1wZXJmLXN0YXJ0OiIgKyAodm0uX3VpZCk7CiAgICAgIGVuZFRhZyA9ICJ2dWUtcGVyZi1lbmQ6IiArICh2bS5fdWlkKTsKICAgICAgbWFyayhzdGFydFRhZyk7CiAgICB9CgogICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWQKICAgIHZtLl9pc1Z1ZSA9IHRydWU7CiAgICAvLyBtZXJnZSBvcHRpb25zCiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkgewogICAgICAvLyBvcHRpbWl6ZSBpbnRlcm5hbCBjb21wb25lbnQgaW5zdGFudGlhdGlvbgogICAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlCiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LgogICAgICBpbml0SW50ZXJuYWxDb21wb25lbnQodm0sIG9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyh2bS5jb25zdHJ1Y3RvciksCiAgICAgICAgb3B0aW9ucyB8fCB7fSwKICAgICAgICB2bQogICAgICApOwogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIHsKICAgICAgaW5pdFByb3h5KHZtKTsKICAgIH0KICAgIC8vIGV4cG9zZSByZWFsIHNlbGYKICAgIHZtLl9zZWxmID0gdm07CiAgICBpbml0TGlmZWN5Y2xlKHZtKTsKICAgIGluaXRFdmVudHModm0pOwogICAgaW5pdFJlbmRlcih2bSk7CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZUNyZWF0ZScpOwogICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHMKICAgIGluaXRTdGF0ZSh2bSk7CiAgICBpbml0UHJvdmlkZSh2bSk7IC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzCiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHsKICAgICAgdm0uX25hbWUgPSBmb3JtYXRDb21wb25lbnROYW1lKHZtLCBmYWxzZSk7CiAgICAgIG1hcmsoZW5kVGFnKTsKICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHZtLl9uYW1lKSArICIgaW5pdCIpLCBzdGFydFRhZywgZW5kVGFnKTsKICAgIH0KCiAgICBpZiAodm0uJG9wdGlvbnMuZWwpIHsKICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBpbml0SW50ZXJuYWxDb21wb25lbnQgKHZtLCBvcHRpb25zKSB7CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7CiAgLy8gZG9pbmcgdGhpcyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZHluYW1pYyBlbnVtZXJhdGlvbi4KICB2YXIgcGFyZW50Vm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsKICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIG9wdHMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7CiAgb3B0cy5fcGFyZW50RWxtID0gb3B0aW9ucy5fcGFyZW50RWxtOwogIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTsKCiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgb3B0cy5wcm9wc0RhdGEgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhOwogIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7CiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47CiAgb3B0cy5fY29tcG9uZW50VGFnID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZzsKCiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7CiAgICBvcHRzLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyOwogICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuczsKICB9Cn0KCmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHsKICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9uczsKICBpZiAoQ3Rvci5zdXBlcikgewogICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7CiAgICB2YXIgY2FjaGVkU3VwZXJPcHRpb25zID0gQ3Rvci5zdXBlck9wdGlvbnM7CiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHsKICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsCiAgICAgIC8vIG5lZWQgdG8gcmVzb2x2ZSBuZXcgb3B0aW9ucy4KICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7CiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NikKICAgICAgdmFyIG1vZGlmaWVkT3B0aW9ucyA9IHJlc29sdmVNb2RpZmllZE9wdGlvbnMoQ3Rvcik7CiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zCiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHsKICAgICAgICBleHRlbmQoQ3Rvci5leHRlbmRPcHRpb25zLCBtb2RpZmllZE9wdGlvbnMpOwogICAgICB9CiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpOwogICAgICBpZiAob3B0aW9ucy5uYW1lKSB7CiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBvcHRpb25zCn0KCmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHsKICB2YXIgbW9kaWZpZWQ7CiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9uczsKICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7CiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9uczsKICBmb3IgKHZhciBrZXkgaW4gbGF0ZXN0KSB7CiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7CiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfQogICAgICBtb2RpZmllZFtrZXldID0gZGVkdXBlKGxhdGVzdFtrZXldLCBleHRlbmRlZFtrZXldLCBzZWFsZWRba2V5XSk7CiAgICB9CiAgfQogIHJldHVybiBtb2RpZmllZAp9CgpmdW5jdGlvbiBkZWR1cGUgKGxhdGVzdCwgZXh0ZW5kZWQsIHNlYWxlZCkgewogIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkCiAgLy8gYmV0d2VlbiBtZXJnZXMKICBpZiAoQXJyYXkuaXNBcnJheShsYXRlc3QpKSB7CiAgICB2YXIgcmVzID0gW107CiAgICBzZWFsZWQgPSBBcnJheS5pc0FycmF5KHNlYWxlZCkgPyBzZWFsZWQgOiBbc2VhbGVkXTsKICAgIGV4dGVuZGVkID0gQXJyYXkuaXNBcnJheShleHRlbmRlZCkgPyBleHRlbmRlZCA6IFtleHRlbmRlZF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykgewogICAgICAvLyBwdXNoIG9yaWdpbmFsIG9wdGlvbnMgYW5kIG5vdCBzZWFsZWQgb3B0aW9ucyB0byBleGNsdWRlIGR1cGxpY2F0ZWQgb3B0aW9ucwogICAgICBpZiAoZXh0ZW5kZWQuaW5kZXhPZihsYXRlc3RbaV0pID49IDAgfHwgc2VhbGVkLmluZGV4T2YobGF0ZXN0W2ldKSA8IDApIHsKICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfSBlbHNlIHsKICAgIHJldHVybiBsYXRlc3QKICB9Cn0KCmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSkKICApIHsKICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTsKICB9CiAgdGhpcy5faW5pdChvcHRpb25zKTsKfQoKaW5pdE1peGluKFZ1ZSk7CnN0YXRlTWl4aW4oVnVlKTsKZXZlbnRzTWl4aW4oVnVlKTsKbGlmZWN5Y2xlTWl4aW4oVnVlKTsKcmVuZGVyTWl4aW4oVnVlKTsKCi8qICAqLwoKZnVuY3Rpb24gaW5pdFVzZSAoVnVlKSB7CiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHsKICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpOwogICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID4gLTEpIHsKICAgICAgcmV0dXJuIHRoaXMKICAgIH0KCiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgYXJncy51bnNoaWZ0KHRoaXMpOwogICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTsKICAgIH0KICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChwbHVnaW4pOwogICAgcmV0dXJuIHRoaXMKICB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHsKICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHsKICAgIHRoaXMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG1peGluKTsKICAgIHJldHVybiB0aGlzCiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHsKICAvKioKICAgKiBFYWNoIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgVnVlLCBoYXMgYSB1bmlxdWUKICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCAiY2hpbGQKICAgKiBjb25zdHJ1Y3RvcnMiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLgogICAqLwogIFZ1ZS5jaWQgPSAwOwogIHZhciBjaWQgPSAxOwoKICAvKioKICAgKiBDbGFzcyBpbmhlcml0YW5jZQogICAqLwogIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbiAoZXh0ZW5kT3B0aW9ucykgewogICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307CiAgICB2YXIgU3VwZXIgPSB0aGlzOwogICAgdmFyIFN1cGVySWQgPSBTdXBlci5jaWQ7CiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pOwogICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7CiAgICAgIHJldHVybiBjYWNoZWRDdG9yc1tTdXBlcklkXQogICAgfQoKICAgIHZhciBuYW1lID0gZXh0ZW5kT3B0aW9ucy5uYW1lIHx8IFN1cGVyLm9wdGlvbnMubmFtZTsKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkgewogICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSk7CiAgICB9CgogICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFZ1ZUNvbXBvbmVudCAob3B0aW9ucykgewogICAgICB0aGlzLl9pbml0KG9wdGlvbnMpOwogICAgfTsKICAgIFN1Yi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSk7CiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViOwogICAgU3ViLmNpZCA9IGNpZCsrOwogICAgU3ViLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgIFN1cGVyLm9wdGlvbnMsCiAgICAgIGV4dGVuZE9wdGlvbnMKICAgICk7CiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjsKCiAgICAvLyBGb3IgcHJvcHMgYW5kIGNvbXB1dGVkIHByb3BlcnRpZXMsIHdlIGRlZmluZSB0aGUgcHJveHkgZ2V0dGVycyBvbgogICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXMKICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC4KICAgIGlmIChTdWIub3B0aW9ucy5wcm9wcykgewogICAgICBpbml0UHJvcHMkMShTdWIpOwogICAgfQogICAgaWYgKFN1Yi5vcHRpb25zLmNvbXB1dGVkKSB7CiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7CiAgICB9CgogICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlCiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kOwogICAgU3ViLm1peGluID0gU3VwZXIubWl4aW47CiAgICBTdWIudXNlID0gU3VwZXIudXNlOwoKICAgIC8vIGNyZWF0ZSBhc3NldCByZWdpc3RlcnMsIHNvIGV4dGVuZGVkIGNsYXNzZXMKICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby4KICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgU3ViW3R5cGVdID0gU3VwZXJbdHlwZV07CiAgICB9KTsKICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXAKICAgIGlmIChuYW1lKSB7CiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7CiAgICB9CgogICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS4KICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlCiAgICAvLyBiZWVuIHVwZGF0ZWQuCiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9uczsKICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9uczsKICAgIFN1Yi5zZWFsZWRPcHRpb25zID0gZXh0ZW5kKHt9LCBTdWIub3B0aW9ucyk7CgogICAgLy8gY2FjaGUgY29uc3RydWN0b3IKICAgIGNhY2hlZEN0b3JzW1N1cGVySWRdID0gU3ViOwogICAgcmV0dXJuIFN1YgogIH07Cn0KCmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7CiAgdmFyIHByb3BzID0gQ29tcC5vcHRpb25zLnByb3BzOwogIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgcHJveHkoQ29tcC5wcm90b3R5cGUsICJfcHJvcHMiLCBrZXkpOwogIH0KfQoKZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHsKICB2YXIgY29tcHV0ZWQgPSBDb21wLm9wdGlvbnMuY29tcHV0ZWQ7CiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7CiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHsKICAvKioKICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuCiAgICovCiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKAogICAgICBpZCwKICAgICAgZGVmaW5pdGlvbgogICAgKSB7CiAgICAgIGlmICghZGVmaW5pdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50JykgewogICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHsKICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDsKICAgICAgICAgIGRlZmluaXRpb24gPSB0aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKGRlZmluaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGRlZmluaXRpb24gPSB7IGJpbmQ6IGRlZmluaXRpb24sIHVwZGF0ZTogZGVmaW5pdGlvbiB9OwogICAgICAgIH0KICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjsKICAgICAgICByZXR1cm4gZGVmaW5pdGlvbgogICAgICB9CiAgICB9OwogIH0pOwp9CgovKiAgKi8KCmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHsKICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZykKfQoKZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkgewogIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgcmV0dXJuIGZhbHNlCn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHsKICB2YXIgY2FjaGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5jYWNoZTsKICB2YXIga2V5cyA9IGtlZXBBbGl2ZUluc3RhbmNlLmtleXM7CiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTsKICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpIHsKICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTsKICAgIGlmIChjYWNoZWROb2RlKSB7CiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjYWNoZWROb2RlLmNvbXBvbmVudE9wdGlvbnMpOwogICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7CiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoCiAgY2FjaGUsCiAga2V5LAogIGtleXMsCiAgY3VycmVudAopIHsKICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTsKICBpZiAoY2FjaGVkJCQxICYmICghY3VycmVudCB8fCBjYWNoZWQkJDEudGFnICE9PSBjdXJyZW50LnRhZykpIHsKICAgIGNhY2hlZCQkMS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpOwogIH0KICBjYWNoZVtrZXldID0gbnVsbDsKICByZW1vdmUoa2V5cywga2V5KTsKfQoKdmFyIHBhdHRlcm5UeXBlcyA9IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldOwoKdmFyIEtlZXBBbGl2ZSA9IHsKICBuYW1lOiAna2VlcC1hbGl2ZScsCiAgYWJzdHJhY3Q6IHRydWUsCgogIHByb3BzOiB7CiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl0KICB9LAoKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHsKICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5rZXlzID0gW107CiAgfSwKCiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQgKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgZm9yICh2YXIga2V5IGluIHRoaXMkMS5jYWNoZSkgewogICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlLCBrZXksIHRoaXMkMS5rZXlzKTsKICAgIH0KICB9LAoKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7CiAgICB9KTsKICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICFtYXRjaGVzKHZhbCwgbmFtZSk7IH0pOwogICAgfSk7CiAgfSwKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkgewogICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0OwogICAgdmFyIHZub2RlID0gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChzbG90KTsKICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9uczsKICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7CiAgICAgIC8vIGNoZWNrIHBhdHRlcm4KICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpOwogICAgICB2YXIgcmVmID0gdGhpczsKICAgICAgdmFyIGluY2x1ZGUgPSByZWYuaW5jbHVkZTsKICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTsKICAgICAgaWYgKAogICAgICAgIC8vIG5vdCBpbmNsdWRlZAogICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8CiAgICAgICAgLy8gZXhjbHVkZWQKICAgICAgICAoZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpCiAgICAgICkgewogICAgICAgIHJldHVybiB2bm9kZQogICAgICB9CgogICAgICB2YXIgcmVmJDEgPSB0aGlzOwogICAgICB2YXIgY2FjaGUgPSByZWYkMS5jYWNoZTsKICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGwKICAgICAgICAvLyBzYW1lIGNvbnN0cnVjdG9yIG1heSBnZXQgcmVnaXN0ZXJlZCBhcyBkaWZmZXJlbnQgbG9jYWwgY29tcG9uZW50cwogICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSkKICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoIjo6IiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpCiAgICAgICAgOiB2bm9kZS5rZXk7CiAgICAgIGlmIChjYWNoZVtrZXldKSB7CiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlOwogICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3QKICAgICAgICByZW1vdmUoa2V5cywga2V5KTsKICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYWNoZVtrZXldID0gdm5vZGU7CiAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5CiAgICAgICAgaWYgKHRoaXMubWF4ICYmIGtleXMubGVuZ3RoID4gcGFyc2VJbnQodGhpcy5tYXgpKSB7CiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKQogIH0KfQoKdmFyIGJ1aWx0SW5Db21wb25lbnRzID0gewogIEtlZXBBbGl2ZTogS2VlcEFsaXZlCn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7CiAgLy8gY29uZmlnCiAgdmFyIGNvbmZpZ0RlZiA9IHt9OwogIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07CiAgewogICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgd2FybigKICAgICAgICAnRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4nCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTsKCiAgLy8gZXhwb3NlZCB1dGlsIG1ldGhvZHMuCiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uCiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay4KICBWdWUudXRpbCA9IHsKICAgIHdhcm46IHdhcm4sCiAgICBleHRlbmQ6IGV4dGVuZCwKICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLAogICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlCiAgfTsKCiAgVnVlLnNldCA9IHNldDsKICBWdWUuZGVsZXRlID0gZGVsOwogIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrOwoKICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0pOwoKICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlICJiYXNlIiBjb25zdHJ1Y3RvciB0byBleHRlbmQgYWxsIHBsYWluLW9iamVjdAogIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLgogIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlOwoKICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpOwoKICBpbml0VXNlKFZ1ZSk7CiAgaW5pdE1peGluJDEoVnVlKTsKICBpbml0RXh0ZW5kKFZ1ZSk7CiAgaW5pdEFzc2V0UmVnaXN0ZXJzKFZ1ZSk7Cn0KCmluaXRHbG9iYWxBUEkoVnVlKTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywgewogIGdldDogaXNTZXJ2ZXJSZW5kZXJpbmcKfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRzc3JDb250ZXh0JywgewogIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICByZXR1cm4gdGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dAogIH0KfSk7CgovLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb24KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0JywgewogIHZhbHVlOiBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dAp9KTsKClZ1ZS52ZXJzaW9uID0gJzIuNS4xNyc7CgovKiAgKi8KCi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheQovLyBkdXJpbmcgdGVtcGxhdGUgY29tcGlsYXRpb24KdmFyIGlzUmVzZXJ2ZWRBdHRyID0gbWFrZU1hcCgnc3R5bGUsY2xhc3MnKTsKCi8vIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgdXNpbmcgcHJvcHMgZm9yIGJpbmRpbmcKdmFyIGFjY2VwdFZhbHVlID0gbWFrZU1hcCgnaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcycpOwp2YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7CiAgcmV0dXJuICgKICAgIChhdHRyID09PSAndmFsdWUnICYmIGFjY2VwdFZhbHVlKHRhZykpICYmIHR5cGUgIT09ICdidXR0b24nIHx8CiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fAogICAgKGF0dHIgPT09ICdjaGVja2VkJyAmJiB0YWcgPT09ICdpbnB1dCcpIHx8CiAgICAoYXR0ciA9PT0gJ211dGVkJyAmJiB0YWcgPT09ICd2aWRlbycpCiAgKQp9OwoKdmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTsKCnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcCgKICAnYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSwnICsKICAnZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLCcgKwogICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgKwogICdtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LCcgKwogICdyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLCcgKwogICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJwopOwoKdmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7Cgp2YXIgaXNYbGluayA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJwp9OwoKdmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIGlzWGxpbmsobmFtZSkgPyBuYW1lLnNsaWNlKDYsIG5hbWUubGVuZ3RoKSA6ICcnCn07Cgp2YXIgaXNGYWxzeUF0dHJWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsKICByZXR1cm4gdmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZQp9OwoKLyogICovCgpmdW5jdGlvbiBnZW5DbGFzc0ZvclZub2RlICh2bm9kZSkgewogIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlOwogIHZhciBjaGlsZE5vZGUgPSB2bm9kZTsKICB3aGlsZSAoaXNEZWYoY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlKSkgewogICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEpIHsKICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGNoaWxkTm9kZS5kYXRhLCBkYXRhKTsKICAgIH0KICB9CiAgd2hpbGUgKGlzRGVmKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHsKICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkgewogICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoZGF0YSwgcGFyZW50Tm9kZS5kYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlbmRlckNsYXNzKGRhdGEuc3RhdGljQ2xhc3MsIGRhdGEuY2xhc3MpCn0KCmZ1bmN0aW9uIG1lcmdlQ2xhc3NEYXRhIChjaGlsZCwgcGFyZW50KSB7CiAgcmV0dXJuIHsKICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksCiAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpCiAgICAgID8gW2NoaWxkLmNsYXNzLCBwYXJlbnQuY2xhc3NdCiAgICAgIDogcGFyZW50LmNsYXNzCiAgfQp9CgpmdW5jdGlvbiByZW5kZXJDbGFzcyAoCiAgc3RhdGljQ2xhc3MsCiAgZHluYW1pY0NsYXNzCikgewogIGlmIChpc0RlZihzdGF0aWNDbGFzcykgfHwgaXNEZWYoZHluYW1pY0NsYXNzKSkgewogICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSkKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7CiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJykKfQoKZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpCiAgfQogIGlmIChpc09iamVjdCh2YWx1ZSkpIHsKICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpCiAgfQogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICByZXR1cm4gdmFsdWUKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIHZhciBzdHJpbmdpZmllZDsKICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgaWYgKHZhbHVlW2tleV0pIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBrZXk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgbmFtZXNwYWNlTWFwID0gewogIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywKICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcKfTsKCnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKAogICdodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSwnICsKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLCcgKwogICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICsKICAnYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LCcgKwogICdzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbywnICsKICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArCiAgJ2NhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLCcgKwogICdidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLCcgKwogICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgKwogICdkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksJyArCiAgJ2NvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QnCik7CgovLyB0aGlzIG1hcCBpcyBpbnRlbnRpb25hbGx5IHNlbGVjdGl2ZSwgb25seSBjb3ZlcmluZyBTVkcgZWxlbWVudHMgdGhhdCBtYXkKLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy4KdmFyIGlzU1ZHID0gbWFrZU1hcCgKICAnc3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLCcgKwogICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICsKICAncG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldycsCiAgdHJ1ZQopOwoKdmFyIGlzUHJlVGFnID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gdGFnID09PSAncHJlJzsgfTsKCnZhciBpc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKHRhZykgewogIHJldHVybiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWRyh0YWcpCn07CgpmdW5jdGlvbiBnZXRUYWdOYW1lc3BhY2UgKHRhZykgewogIGlmIChpc1NWRyh0YWcpKSB7CiAgICByZXR1cm4gJ3N2ZycKICB9CiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MCiAgLy8gbm90ZSBpdCBkb2Vzbid0IHN1cHBvcnQgb3RoZXIgTWF0aE1MIGVsZW1lbnRzIGJlaW5nIGNvbXBvbmVudCByb290cwogIGlmICh0YWcgPT09ICdtYXRoJykgewogICAgcmV0dXJuICdtYXRoJwogIH0KfQoKdmFyIHVua25vd25FbGVtZW50Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpmdW5jdGlvbiBpc1Vua25vd25FbGVtZW50ICh0YWcpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWluQnJvd3NlcikgewogICAgcmV0dXJuIHRydWUKICB9CiAgaWYgKGlzUmVzZXJ2ZWRUYWcodGFnKSkgewogICAgcmV0dXJuIGZhbHNlCiAgfQogIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkgewogICAgcmV0dXJuIHVua25vd25FbGVtZW50Q2FjaGVbdGFnXQogIH0KICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgaWYgKHRhZy5pbmRleE9mKCctJykgPiAtMSkgewogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjgyMTAzNjQvMTA3MDI0NAogICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoCiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTFVua25vd25FbGVtZW50IHx8CiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTEVsZW1lbnQKICAgICkpCiAgfSBlbHNlIHsKICAgIHJldHVybiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddID0gL0hUTUxVbmtub3duRWxlbWVudC8udGVzdChlbC50b1N0cmluZygpKSkKICB9Cn0KCnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpOwoKLyogICovCgovKioKICogUXVlcnkgYW4gZWxlbWVudCBzZWxlY3RvciBpZiBpdCdzIG5vdCBhbiBlbGVtZW50IGFscmVhZHkuCiAqLwpmdW5jdGlvbiBxdWVyeSAoZWwpIHsKICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgewogICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7CiAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdDYW5ub3QgZmluZCBlbGVtZW50OiAnICsgZWwKICAgICAgKTsKICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpCiAgICB9CiAgICByZXR1cm4gc2VsZWN0ZWQKICB9IGVsc2UgewogICAgcmV0dXJuIGVsCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQkMSAodGFnTmFtZSwgdm5vZGUpIHsKICB2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHsKICAgIHJldHVybiBlbG0KICB9CiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3QKICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMubXVsdGlwbGUgIT09IHVuZGVmaW5lZCkgewogICAgZWxtLnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnbXVsdGlwbGUnKTsKICB9CiAgcmV0dXJuIGVsbQp9CgpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkgewogIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlTWFwW25hbWVzcGFjZV0sIHRhZ05hbWUpCn0KCmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlICh0ZXh0KSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHsKICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KQp9CgpmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHsKICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTsKfQoKZnVuY3Rpb24gcmVtb3ZlQ2hpbGQgKG5vZGUsIGNoaWxkKSB7CiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Cn0KCmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkgewogIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwp9CgpmdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7CiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZQp9CgpmdW5jdGlvbiBuZXh0U2libGluZyAobm9kZSkgewogIHJldHVybiBub2RlLm5leHRTaWJsaW5nCn0KCmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHsKICByZXR1cm4gbm9kZS50YWdOYW1lCn0KCmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7CiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7Cn0KCmZ1bmN0aW9uIHNldFN0eWxlU2NvcGUgKG5vZGUsIHNjb3BlSWQpIHsKICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7Cn0KCgp2YXIgbm9kZU9wcyA9IE9iamVjdC5mcmVlemUoewoJY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCQxLAoJY3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsCgljcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsCgljcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LAoJaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsCglyZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsCglhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsCglwYXJlbnROb2RlOiBwYXJlbnROb2RlLAoJbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLAoJdGFnTmFtZTogdGFnTmFtZSwKCXNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCwKCXNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGUKfSk7CgovKiAgKi8KCnZhciByZWYgPSB7CiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7CiAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgICBpZiAob2xkVm5vZGUuZGF0YS5yZWYgIT09IHZub2RlLmRhdGEucmVmKSB7CiAgICAgIHJlZ2lzdGVyUmVmKG9sZFZub2RlLCB0cnVlKTsKICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpOwogICAgfQogIH0sCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHJlZ2lzdGVyUmVmKHZub2RlLCB0cnVlKTsKICB9Cn0KCmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7CiAgdmFyIGtleSA9IHZub2RlLmRhdGEucmVmOwogIGlmICghaXNEZWYoa2V5KSkgeyByZXR1cm4gfQoKICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0OwogIHZhciByZWYgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5lbG07CiAgdmFyIHJlZnMgPSB2bS4kcmVmczsKICBpZiAoaXNSZW1vdmFsKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7CiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7CiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7CiAgICAgIHJlZnNba2V5XSA9IHVuZGVmaW5lZDsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHZub2RlLmRhdGEucmVmSW5Gb3IpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsKICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsKICAgICAgfSBlbHNlIGlmIChyZWZzW2tleV0uaW5kZXhPZihyZWYpIDwgMCkgewogICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlZnNba2V5XSA9IHJlZjsKICAgIH0KICB9Cn0KCi8qKgogKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnkKICogU2ltb24gRnJpaXMgVmluZHVtIChAcGFsZGVwaW5kKQogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UKICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFCiAqCiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKQogKgogKiBOb3QgdHlwZS1jaGVja2luZyB0aGlzIGJlY2F1c2UgdGhpcyBmaWxlIGlzIHBlcmYtY3JpdGljYWwgYW5kIHRoZSBjb3N0CiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LgogKi8KCnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7Cgp2YXIgaG9va3MgPSBbJ2NyZWF0ZScsICdhY3RpdmF0ZScsICd1cGRhdGUnLCAncmVtb3ZlJywgJ2Rlc3Ryb3knXTsKCmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikgewogIHJldHVybiAoCiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKAogICAgICAoCiAgICAgICAgYS50YWcgPT09IGIudGFnICYmCiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmCiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJgogICAgICAgIHNhbWVJbnB1dFR5cGUoYSwgYikKICAgICAgKSB8fCAoCiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJgogICAgICAgIGEuYXN5bmNGYWN0b3J5ID09PSBiLmFzeW5jRmFjdG9yeSAmJgogICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpCiAgICAgICkKICAgICkKICApCn0KCmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHsKICBpZiAoYS50YWcgIT09ICdpbnB1dCcpIHsgcmV0dXJuIHRydWUgfQogIHZhciBpOwogIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7CiAgdmFyIHR5cGVCID0gaXNEZWYoaSA9IGIuZGF0YSkgJiYgaXNEZWYoaSA9IGkuYXR0cnMpICYmIGkudHlwZTsKICByZXR1cm4gdHlwZUEgPT09IHR5cGVCIHx8IGlzVGV4dElucHV0VHlwZSh0eXBlQSkgJiYgaXNUZXh0SW5wdXRUeXBlKHR5cGVCKQp9CgpmdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeCAoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHsKICB2YXIgaSwga2V5OwogIHZhciBtYXAgPSB7fTsKICBmb3IgKGkgPSBiZWdpbklkeDsgaSA8PSBlbmRJZHg7ICsraSkgewogICAga2V5ID0gY2hpbGRyZW5baV0ua2V5OwogICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9CiAgfQogIHJldHVybiBtYXAKfQoKZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkgewogIHZhciBpLCBqOwogIHZhciBjYnMgPSB7fTsKCiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7CiAgdmFyIG5vZGVPcHMgPSBiYWNrZW5kLm5vZGVPcHM7CgogIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkgewogICAgY2JzW2hvb2tzW2ldXSA9IFtdOwogICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHsKICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkgewogICAgICAgIGNic1tob29rc1tpXV0ucHVzaChtb2R1bGVzW2pdW2hvb2tzW2ldXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHsKICAgIHJldHVybiBuZXcgVk5vZGUobm9kZU9wcy50YWdOYW1lKGVsbSkudG9Mb3dlckNhc2UoKSwge30sIFtdLCB1bmRlZmluZWQsIGVsbSkKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZVJtQ2IgKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHsKICAgIGZ1bmN0aW9uIHJlbW92ZSAoKSB7CiAgICAgIGlmICgtLXJlbW92ZS5saXN0ZW5lcnMgPT09IDApIHsKICAgICAgICByZW1vdmVOb2RlKGNoaWxkRWxtKTsKICAgICAgfQogICAgfQogICAgcmVtb3ZlLmxpc3RlbmVycyA9IGxpc3RlbmVyczsKICAgIHJldHVybiByZW1vdmUKICB9CgogIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7CiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTsKICAgIC8vIGVsZW1lbnQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZHVlIHRvIHYtaHRtbCAvIHYtdGV4dAogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQkJDEgKHZub2RlLCBpblZQcmUpIHsKICAgIHJldHVybiAoCiAgICAgICFpblZQcmUgJiYKICAgICAgIXZub2RlLm5zICYmCiAgICAgICEoCiAgICAgICAgY29uZmlnLmlnbm9yZWRFbGVtZW50cy5sZW5ndGggJiYKICAgICAgICBjb25maWcuaWdub3JlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGlnbm9yZSkgewogICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSkKICAgICAgICAgICAgPyBpZ25vcmUudGVzdCh2bm9kZS50YWcpCiAgICAgICAgICAgIDogaWdub3JlID09PSB2bm9kZS50YWcKICAgICAgICB9KQogICAgICApICYmCiAgICAgIGNvbmZpZy5pc1Vua25vd25FbGVtZW50KHZub2RlLnRhZykKICAgICkKICB9CgogIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7CgogIGZ1bmN0aW9uIGNyZWF0ZUVsbSAoCiAgICB2bm9kZSwKICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgIHBhcmVudEVsbSwKICAgIHJlZkVsbSwKICAgIG5lc3RlZCwKICAgIG93bmVyQXJyYXksCiAgICBpbmRleAogICkgewogICAgaWYgKGlzRGVmKHZub2RlLmVsbSkgJiYgaXNEZWYob3duZXJBcnJheSkpIHsKICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciEKICAgICAgLy8gbm93IGl0J3MgdXNlZCBhcyBhIG5ldyBub2RlLCBvdmVyd3JpdGluZyBpdHMgZWxtIHdvdWxkIGNhdXNlCiAgICAgIC8vIHBvdGVudGlhbCBwYXRjaCBlcnJvcnMgZG93biB0aGUgcm9hZCB3aGVuIGl0J3MgdXNlZCBhcyBhbiBpbnNlcnRpb24KICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmcKICAgICAgLy8gYXNzb2NpYXRlZCBET00gZWxlbWVudCBmb3IgaXQuCiAgICAgIHZub2RlID0gb3duZXJBcnJheVtpbmRleF0gPSBjbG9uZVZOb2RlKHZub2RlKTsKICAgIH0KCiAgICB2bm9kZS5pc1Jvb3RJbnNlcnQgPSAhbmVzdGVkOyAvLyBmb3IgdHJhbnNpdGlvbiBlbnRlciBjaGVjawogICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47CiAgICB2YXIgdGFnID0gdm5vZGUudGFnOwogICAgaWYgKGlzRGVmKHRhZykpIHsKICAgICAgewogICAgICAgIGlmIChkYXRhICYmIGRhdGEucHJlKSB7CiAgICAgICAgICBjcmVhdGluZ0VsbUluVlByZSsrOwogICAgICAgIH0KICAgICAgICBpZiAoaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgY3JlYXRpbmdFbG1JblZQcmUpKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArCiAgICAgICAgICAgICdyZWdpc3RlciB0aGUgY29tcG9uZW50IGNvcnJlY3RseT8gRm9yIHJlY3Vyc2l2ZSBjb21wb25lbnRzLCAnICsKICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSAibmFtZSIgb3B0aW9uLicsCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2bm9kZS5lbG0gPSB2bm9kZS5ucwogICAgICAgID8gbm9kZU9wcy5jcmVhdGVFbGVtZW50TlModm5vZGUubnMsIHRhZykKICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTsKICAgICAgc2V0U2NvcGUodm5vZGUpOwoKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIHsKICAgICAgICBjcmVhdGVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9CiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgICB9CgogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRhdGEgJiYgZGF0YS5wcmUpIHsKICAgICAgICBjcmVhdGluZ0VsbUluVlByZS0tOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpKSB7CiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlQ29tbWVudCh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfSBlbHNlIHsKICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgdmFyIGkgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIHZhciBpc1JlYWN0aXZhdGVkID0gaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpICYmIGkua2VlcEFsaXZlOwogICAgICBpZiAoaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsKICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8sIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgICAgfQogICAgICAvLyBhZnRlciBjYWxsaW5nIHRoZSBpbml0IGhvb2ssIGlmIHRoZSB2bm9kZSBpcyBhIGNoaWxkIGNvbXBvbmVudAogICAgICAvLyBpdCBzaG91bGQndmUgY3JlYXRlZCBhIGNoaWxkIGluc3RhbmNlIGFuZCBtb3VudGVkIGl0LiB0aGUgY2hpbGQKICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uCiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGVsZW1lbnQgYW5kIGJlIGRvbmUuCiAgICAgIGlmIChpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHsKICAgICAgICAgIHJlYWN0aXZhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0Q29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkgewogICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaC5hcHBseShpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCk7CiAgICAgIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCA9IG51bGw7CiAgICB9CiAgICB2bm9kZS5lbG0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS4kZWw7CiAgICBpZiAoaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICBzZXRTY29wZSh2bm9kZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC4KICAgICAgLy8gc2tpcCBhbGwgZWxlbWVudC1yZWxhdGVkIG1vZHVsZXMgZXhjZXB0IGZvciByZWYgKCMzNDU1KQogICAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rCiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKHZub2RlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlYWN0aXZhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7CiAgICB2YXIgaTsKICAgIC8vIGhhY2sgZm9yICM0MzM5OiBhIHJlYWN0aXZhdGVkIGNvbXBvbmVudCB3aXRoIGlubmVyIHRyYW5zaXRpb24KICAgIC8vIGRvZXMgbm90IHRyaWdnZXIgYmVjYXVzZSB0aGUgaW5uZXIgbm9kZSdzIGNyZWF0ZWQgaG9va3MgYXJlIG5vdCBjYWxsZWQKICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dAogICAgLy8gdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyBpdC4KICAgIHZhciBpbm5lck5vZGUgPSB2bm9kZTsKICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgaW5uZXJOb2RlID0gaW5uZXJOb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgICAgaWYgKGlzRGVmKGkgPSBpbm5lck5vZGUuZGF0YSkgJiYgaXNEZWYoaSA9IGkudHJhbnNpdGlvbikpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBjYnMuYWN0aXZhdGVbaV0oZW1wdHlOb2RlLCBpbm5lck5vZGUpOwogICAgICAgIH0KICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICAgIC8vIHVubGlrZSBhIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50LAogICAgLy8gYSByZWFjdGl2YXRlZCBrZWVwLWFsaXZlIGNvbXBvbmVudCBkb2Vzbid0IGluc2VydCBpdHNlbGYKICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkgewogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgaWYgKGlzRGVmKHJlZiQkMSkpIHsKICAgICAgICBpZiAocmVmJCQxLnBhcmVudE5vZGUgPT09IHBhcmVudCkgewogICAgICAgICAgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50LCBlbG0sIHJlZiQkMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQocGFyZW50LCBlbG0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgICB7CiAgICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKGNoaWxkcmVuKTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSwgY2hpbGRyZW4sIGkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7CiAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQodm5vZGUuZWxtLCBub2RlT3BzLmNyZWF0ZVRleHROb2RlKFN0cmluZyh2bm9kZS50ZXh0KSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNQYXRjaGFibGUgKHZub2RlKSB7CiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7CiAgICB9CiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKQogIH0KCiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICBjYnMuY3JlYXRlW2kkMV0oZW1wdHlOb2RlLCB2bm9kZSk7CiAgICB9CiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZQogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH0KICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH0KICAgIH0KICB9CgogIC8vIHNldCBzY29wZSBpZCBhdHRyaWJ1dGUgZm9yIHNjb3BlZCBDU1MuCiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuCiAgZnVuY3Rpb24gc2V0U2NvcGUgKHZub2RlKSB7CiAgICB2YXIgaTsKICAgIGlmIChpc0RlZihpID0gdm5vZGUuZm5TY29wZUlkKSkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlOwogICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkgewogICAgICAgICAgbm9kZU9wcy5zZXRTdHlsZVNjb3BlKHZub2RlLmVsbSwgaSk7CiAgICAgICAgfQogICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50OwogICAgICB9CiAgICB9CiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuCiAgICBpZiAoaXNEZWYoaSA9IGFjdGl2ZUluc3RhbmNlKSAmJgogICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmCiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJgogICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkKICAgICkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7CiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnZva2VEZXN0cm95SG9vayAodm5vZGUpIHsKICAgIHZhciBpLCBqOwogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9CiAgICB9CiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkgewogICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHsKICAgICAgICBpbnZva2VEZXN0cm95SG9vayh2bm9kZS5jaGlsZHJlbltqXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHsKICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHsKICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTsKICAgICAgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihjaC50YWcpKSB7CiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTsKICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTsKICAgICAgICB9IGVsc2UgeyAvLyBUZXh0IG5vZGUKICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkgewogICAgaWYgKGlzRGVmKHJtKSB8fCBpc0RlZih2bm9kZS5kYXRhKSkgewogICAgICB2YXIgaTsKICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTsKICAgICAgaWYgKGlzRGVmKHJtKSkgewogICAgICAgIC8vIHdlIGhhdmUgYSByZWN1cnNpdmVseSBwYXNzZWQgZG93biBybSBjYWxsYmFjawogICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnQKICAgICAgICBybS5saXN0ZW5lcnMgKz0gbGlzdGVuZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nCiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTsKICAgICAgfQogICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpc0RlZihpID0gaS5fdm5vZGUpICYmIGlzRGVmKGkuZGF0YSkpIHsKICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGksIHJtKTsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkgewogICAgICAgIGNicy5yZW1vdmVbaV0odm5vZGUsIHJtKTsKICAgICAgfQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkgewogICAgICAgIGkodm5vZGUsIHJtKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBybSgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZW1vdmVOb2RlKHZub2RlLmVsbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbiAocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDsKICAgIHZhciBuZXdTdGFydElkeCA9IDA7CiAgICB2YXIgb2xkRW5kSWR4ID0gb2xkQ2gubGVuZ3RoIC0gMTsKICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07CiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdOwogICAgdmFyIG5ld0VuZElkeCA9IG5ld0NoLmxlbmd0aCAtIDE7CiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdOwogICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTsKICAgIHZhciBvbGRLZXlUb0lkeCwgaWR4SW5PbGQsIHZub2RlVG9Nb3ZlLCByZWZFbG07CgogICAgLy8gcmVtb3ZlT25seSBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgYnkgPHRyYW5zaXRpb24tZ3JvdXA+CiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zCiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9ucwogICAgdmFyIGNhbk1vdmUgPSAhcmVtb3ZlT25seTsKCiAgICB7CiAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhuZXdDaCk7CiAgICB9CgogICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHsKICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnQKICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkgewogICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07CiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7CiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07CiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07CiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCByaWdodAogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpOwogICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsKICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTsKICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnQKICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBvbGRFbmRWbm9kZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsKICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9CiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSkKICAgICAgICAgID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldCiAgICAgICAgICA6IGZpbmRJZHhJbk9sZChuZXdTdGFydFZub2RlLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7CiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50CiAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBmYWxzZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07CiAgICAgICAgICBpZiAoc2FtZVZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgICAgICBwYXRjaFZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCB2bm9kZVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnQKICAgICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsKICAgICAgfQogICAgfQogICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7CiAgICAgIHJlZkVsbSA9IGlzVW5kZWYobmV3Q2hbbmV3RW5kSWR4ICsgMV0pID8gbnVsbCA6IG5ld0NoW25ld0VuZElkeCArIDFdLmVsbTsKICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHsKICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgb2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVLZXlzIChjaGlsZHJlbikgewogICAgdmFyIHNlZW5LZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB2bm9kZSA9IGNoaWxkcmVuW2ldOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5OwogICAgICBpZiAoaXNEZWYoa2V5KSkgewogICAgICAgIGlmIChzZWVuS2V5c1trZXldKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAoIkR1cGxpY2F0ZSBrZXlzIGRldGVjdGVkOiAnIiArIGtleSArICInLiBUaGlzIG1heSBjYXVzZSBhbiB1cGRhdGUgZXJyb3IuIiksCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZW5LZXlzW2tleV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZElkeEluT2xkIChub2RlLCBvbGRDaCwgc3RhcnQsIGVuZCkgewogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGMgPSBvbGRDaFtpXTsKICAgICAgaWYgKGlzRGVmKGMpICYmIHNhbWVWbm9kZShub2RlLCBjKSkgeyByZXR1cm4gaSB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgaWYgKG9sZFZub2RlID09PSB2bm9kZSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtOwoKICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkgewogICAgICBpZiAoaXNEZWYodm5vZGUuYXN5bmNGYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgIGh5ZHJhdGUob2xkVm5vZGUuZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybgogICAgfQoKICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy4KICAgIC8vIG5vdGUgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgLQogICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuCiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc1N0YXRpYykgJiYKICAgICAgaXNUcnVlKG9sZFZub2RlLmlzU3RhdGljKSAmJgogICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJgogICAgICAoaXNUcnVlKHZub2RlLmlzQ2xvbmVkKSB8fCBpc1RydWUodm5vZGUuaXNPbmNlKSkKICAgICkgewogICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgaTsKICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHsKICAgICAgaShvbGRWbm9kZSwgdm5vZGUpOwogICAgfQoKICAgIHZhciBvbGRDaCA9IG9sZFZub2RlLmNoaWxkcmVuOwogICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47CiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKSB7IGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTsgfQogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICAgIGlmIChpc1VuZGVmKHZub2RlLnRleHQpKSB7CiAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7CiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfQogICAgICB9IGVsc2UgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9CiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkQ2gpKSB7CiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpOwogICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7CiAgICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sICcnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7CiAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCB2bm9kZS50ZXh0KTsKICAgIH0KICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucG9zdHBhdGNoKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkgewogICAgLy8gZGVsYXkgaW5zZXJ0IGhvb2tzIGZvciBjb21wb25lbnQgcm9vdCBub2RlcywgaW52b2tlIHRoZW0gYWZ0ZXIgdGhlCiAgICAvLyBlbGVtZW50IGlzIHJlYWxseSBpbnNlcnRlZAogICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7CiAgICAgIHZub2RlLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQgPSBxdWV1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHsKICAgICAgICBxdWV1ZVtpXS5kYXRhLmhvb2suaW5zZXJ0KHF1ZXVlW2ldKTsKICAgICAgfQogICAgfQogIH0KCiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlOwogIC8vIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBza2lwIGNyZWF0ZSBob29rIGR1cmluZyBoeWRyYXRpb24gYmVjYXVzZSB0aGV5CiAgLy8gYXJlIGFscmVhZHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCBvciBoYXMgbm8gbmVlZCBmb3IgaW5pdGlhbGl6YXRpb24KICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmUKICAvLyBkZWVwIHVwZGF0ZXMgKCM3MDYzKS4KICB2YXIgaXNSZW5kZXJlZE1vZHVsZSA9IG1ha2VNYXAoJ2F0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleScpOwoKICAvLyBOb3RlOiB0aGlzIGlzIGEgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uIHNvIHdlIGNhbiBhc3N1bWUgZWxtcyBhcmUgRE9NIG5vZGVzLgogIGZ1bmN0aW9uIGh5ZHJhdGUgKGVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSB7CiAgICB2YXIgaTsKICAgIHZhciB0YWcgPSB2bm9kZS50YWc7CiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjsKICAgIGluVlByZSA9IGluVlByZSB8fCAoZGF0YSAmJiBkYXRhLnByZSk7CiAgICB2bm9kZS5lbG0gPSBlbG07CgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpICYmIGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeSkpIHsKICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIC8vIGFzc2VydCBub2RlIG1hdGNoCiAgICB7CiAgICAgIGlmICghYXNzZXJ0Tm9kZU1hdGNoKGVsbSwgdm5vZGUsIGluVlByZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgfQogICAgfQogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH0KICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS4KICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0KICAgIGlmIChpc0RlZih0YWcpKSB7CiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHsKICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW4KICAgICAgICBpZiAoIWVsbS5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gdi1odG1sIGFuZCBkb21Qcm9wczogaW5uZXJIVE1MCiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7CiAgICAgICAgICAgIGlmIChpICE9PSBlbG0uaW5uZXJIVE1MKSB7CiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkCiAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NlcnZlciBpbm5lckhUTUw6ICcsIGkpOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdjbGllbnQgaW5uZXJIVE1MOiAnLCBlbG0uaW5uZXJIVE1MKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGNvbXBhcmUgY2hpbGRyZW4gbGlzdHMKICAgICAgICAgICAgdmFyIGNoaWxkcmVuTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHsKICAgICAgICAgICAgICBpZiAoIWNoaWxkTm9kZSB8fCAhaHlkcmF0ZShjaGlsZE5vZGUsIGNoaWxkcmVuW2kkMV0sIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSkgewogICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIGNoaWxkTm9kZSBpcyBub3QgbnVsbCwgaXQgbWVhbnMgdGhlIGFjdHVhbCBjaGlsZE5vZGVzIGxpc3QgaXMKICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC4KICAgICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoIHx8IGNoaWxkTm9kZSkgewogICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZAogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgaHlkcmF0aW9uQmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGVsbS5jaGlsZE5vZGVzLCBjaGlsZHJlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgIGlmICghaXNSZW5kZXJlZE1vZHVsZShrZXkpKSB7CiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlOwogICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICAgICAgYnJlYWsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFmdWxsSW52b2tlICYmIGRhdGFbJ2NsYXNzJ10pIHsKICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzCiAgICAgICAgICB0cmF2ZXJzZShkYXRhWydjbGFzcyddKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHsKICAgICAgZWxtLmRhdGEgPSB2bm9kZS50ZXh0OwogICAgfQogICAgcmV0dXJuIHRydWUKICB9CgogIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUsIGluVlByZSkgewogICAgaWYgKGlzRGVmKHZub2RlLnRhZykpIHsKICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKAogICAgICAgICFpc1Vua25vd25FbGVtZW50JCQxKHZub2RlLCBpblZQcmUpICYmCiAgICAgICAgdm5vZGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IChub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpCiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAodm5vZGUuaXNDb21tZW50ID8gOCA6IDMpCiAgICB9CiAgfQoKICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5LCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7CiAgICAgIGlmIChpc0RlZihvbGRWbm9kZSkpIHsgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOyB9CiAgICAgIHJldHVybgogICAgfQoKICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlOwogICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdOwoKICAgIGlmIChpc1VuZGVmKG9sZFZub2RlKSkgewogICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50CiAgICAgIGlzSW5pdGlhbFBhdGNoID0gdHJ1ZTsKICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpOwogICAgICBpZiAoIWlzUmVhbEVsZW1lbnQgJiYgc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHsKICAgICAgICAvLyBwYXRjaCBleGlzdGluZyByb290IG5vZGUKICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNSZWFsRWxlbWVudCkgewogICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnQKICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQgYW5kIGlmIHdlIGNhbiBwZXJmb3JtCiAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgaHlkcmF0aW9uLgogICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHsKICAgICAgICAgICAgb2xkVm5vZGUucmVtb3ZlQXR0cmlidXRlKFNTUl9BVFRSKTsKICAgICAgICAgICAgaHlkcmF0aW5nID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1RydWUoaHlkcmF0aW5nKSkgewogICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHsKICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpOwogICAgICAgICAgICAgIHJldHVybiBvbGRWbm9kZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgICAnVGhlIGNsaWVudC1zaWRlIHJlbmRlcmVkIHZpcnR1YWwgRE9NIHRyZWUgaXMgbm90IG1hdGNoaW5nICcgKwogICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgKwogICAgICAgICAgICAgICAgJ0hUTUwgbWFya3VwLCBmb3IgZXhhbXBsZSBuZXN0aW5nIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSAnICsKICAgICAgICAgICAgICAgICc8cD4sIG9yIG1pc3NpbmcgPHRib2R5Pi4gQmFpbGluZyBoeWRyYXRpb24gYW5kIHBlcmZvcm1pbmcgJyArCiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIGVpdGhlciBub3Qgc2VydmVyLXJlbmRlcmVkLCBvciBoeWRyYXRpb24gZmFpbGVkLgogICAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5vZGUgYW5kIHJlcGxhY2UgaXQKICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnQKICAgICAgICB2YXIgb2xkRWxtID0gb2xkVm5vZGUuZWxtOwogICAgICAgIHZhciBwYXJlbnRFbG0kMSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pOwoKICAgICAgICAvLyBjcmVhdGUgbmV3IG5vZGUKICAgICAgICBjcmVhdGVFbG0oCiAgICAgICAgICB2bm9kZSwKICAgICAgICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhCiAgICAgICAgICAvLyBsZWF2aW5nIHRyYW5zaXRpb24uIE9ubHkgaGFwcGVucyB3aGVuIGNvbWJpbmluZyB0cmFuc2l0aW9uICsKICAgICAgICAgIC8vIGtlZXAtYWxpdmUgKyBIT0NzLiAoIzQ1OTApCiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtJDEsCiAgICAgICAgICBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVsbSkKICAgICAgICApOwoKICAgICAgICAvLyB1cGRhdGUgcGFyZW50IHBsYWNlaG9sZGVyIG5vZGUgZWxlbWVudCwgcmVjdXJzaXZlbHkKICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkgewogICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50OwogICAgICAgICAgdmFyIHBhdGNoYWJsZSA9IGlzUGF0Y2hhYmxlKHZub2RlKTsKICAgICAgICAgIHdoaWxlIChhbmNlc3RvcikgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgY2JzLmRlc3Ryb3lbaV0oYW5jZXN0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFuY2VzdG9yLmVsbSA9IHZub2RlLmVsbTsKICAgICAgICAgICAgaWYgKHBhdGNoYWJsZSkgewogICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICAgICAgICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgYW5jZXN0b3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyAjNjUxMwogICAgICAgICAgICAgIC8vIGludm9rZSBpbnNlcnQgaG9va3MgdGhhdCBtYXkgaGF2ZSBiZWVuIG1lcmdlZCBieSBjcmVhdGUgaG9va3MuCiAgICAgICAgICAgICAgLy8gZS5nLiBmb3IgZGlyZWN0aXZlcyB0aGF0IHVzZXMgdGhlICJpbnNlcnRlZCIgaG9vay4KICAgICAgICAgICAgICB2YXIgaW5zZXJ0ID0gYW5jZXN0b3IuZGF0YS5ob29rLmluc2VydDsKICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkgewogICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgaW5kZXggMSB0byBhdm9pZCByZS1pbnZva2luZyBjb21wb25lbnQgbW91bnRlZCBob29rCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDIgPSAxOyBpJDIgPCBpbnNlcnQuZm5zLmxlbmd0aDsgaSQyKyspIHsKICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlZ2lzdGVyUmVmKGFuY2VzdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRlc3Ryb3kgb2xkIG5vZGUKICAgICAgICBpZiAoaXNEZWYocGFyZW50RWxtJDEpKSB7CiAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtJDEsIFtvbGRWbm9kZV0sIDAsIDApOwogICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkgewogICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpOwogICAgcmV0dXJuIHZub2RlLmVsbQogIH0KfQoKLyogICovCgp2YXIgZGlyZWN0aXZlcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsCiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLAogIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7CiAgICB1cGRhdGVEaXJlY3RpdmVzKHZub2RlLCBlbXB0eU5vZGUpOwogIH0KfQoKZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7CiAgaWYgKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcyB8fCB2bm9kZS5kYXRhLmRpcmVjdGl2ZXMpIHsKICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTsKICB9Cn0KCmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBpc0NyZWF0ZSA9IG9sZFZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTsKICB2YXIgbmV3RGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSh2bm9kZS5kYXRhLmRpcmVjdGl2ZXMsIHZub2RlLmNvbnRleHQpOwoKICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTsKICB2YXIgZGlyc1dpdGhQb3N0cGF0Y2ggPSBbXTsKCiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7CiAgZm9yIChrZXkgaW4gbmV3RGlycykgewogICAgb2xkRGlyID0gb2xkRGlyc1trZXldOwogICAgZGlyID0gbmV3RGlyc1trZXldOwogICAgaWYgKCFvbGREaXIpIHsKICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZAogICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmluc2VydGVkKSB7CiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZQogICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7CiAgICAgIGNhbGxIb29rJDEoZGlyLCAndXBkYXRlJywgdm5vZGUsIG9sZFZub2RlKTsKICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5jb21wb25lbnRVcGRhdGVkKSB7CiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZGlyc1dpdGhJbnNlcnQubGVuZ3RoKSB7CiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzV2l0aEluc2VydC5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhJbnNlcnRbaV0sICdpbnNlcnRlZCcsIHZub2RlLCBvbGRWbm9kZSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaXNDcmVhdGUpIHsKICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxJbnNlcnQoKTsKICAgIH0KICB9CgogIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHsKICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAncG9zdHBhdGNoJywgZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoUG9zdHBhdGNoLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICB9CiAgICB9KTsKICB9CgogIGlmICghaXNDcmVhdGUpIHsKICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHsKICAgICAgaWYgKCFuZXdEaXJzW2tleV0pIHsKICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kCiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CgpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKAogIGRpcnMsCiAgdm0KKSB7CiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFkaXJzKSB7CiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgIHJldHVybiByZXMKICB9CiAgdmFyIGksIGRpcjsKICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIGlmICghZGlyLm1vZGlmaWVycykgewogICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgZGlyLm1vZGlmaWVycyA9IGVtcHR5TW9kaWZpZXJzOwogICAgfQogICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7CiAgICBkaXIuZGVmID0gcmVzb2x2ZUFzc2V0KHZtLiRvcHRpb25zLCAnZGlyZWN0aXZlcycsIGRpci5uYW1lLCB0cnVlKTsKICB9CiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBnZXRSYXdEaXJOYW1lIChkaXIpIHsKICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyAiLiIgKyAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycyB8fCB7fSkuam9pbignLicpKSkKfQoKZnVuY3Rpb24gY2FsbEhvb2skMSAoZGlyLCBob29rLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSkgewogIHZhciBmbiA9IGRpci5kZWYgJiYgZGlyLmRlZltob29rXTsKICBpZiAoZm4pIHsKICAgIHRyeSB7CiAgICAgIGZuKHZub2RlLmVsbSwgZGlyLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGhhbmRsZUVycm9yKGUsIHZub2RlLmNvbnRleHQsICgiZGlyZWN0aXZlICIgKyAoZGlyLm5hbWUpICsgIiAiICsgaG9vayArICIgaG9vayIpKTsKICAgIH0KICB9Cn0KCnZhciBiYXNlTW9kdWxlcyA9IFsKICByZWYsCiAgZGlyZWN0aXZlcwpdCgovKiAgKi8KCmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHsKICB2YXIgb3B0cyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgaWYgKGlzRGVmKG9wdHMpICYmIG9wdHMuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRycyA9PT0gZmFsc2UpIHsKICAgIHJldHVybgogIH0KICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLmF0dHJzKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEuYXR0cnMpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIGtleSwgY3VyLCBvbGQ7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzIHx8IHt9OwogIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKGF0dHJzLl9fb2JfXykpIHsKICAgIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYXR0cnMpOwogIH0KCiAgZm9yIChrZXkgaW4gYXR0cnMpIHsKICAgIGN1ciA9IGF0dHJzW2tleV07CiAgICBvbGQgPSBvbGRBdHRyc1trZXldOwogICAgaWYgKG9sZCAhPT0gY3VyKSB7CiAgICAgIHNldEF0dHIoZWxtLCBrZXksIGN1cik7CiAgICB9CiAgfQogIC8vICM0MzkxOiBpbiBJRTksIHNldHRpbmcgdHlwZSBjYW4gcmVzZXQgdmFsdWUgZm9yIGlucHV0W3R5cGU9cmFkaW9dCiAgLy8gIzY2NjY6IElFL0VkZ2UgZm9yY2VzIHByb2dyZXNzIHZhbHVlIGRvd24gdG8gMSBiZWZvcmUgc2V0dGluZyBhIG1heAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICgoaXNJRSB8fCBpc0VkZ2UpICYmIGF0dHJzLnZhbHVlICE9PSBvbGRBdHRycy52YWx1ZSkgewogICAgc2V0QXR0cihlbG0sICd2YWx1ZScsIGF0dHJzLnZhbHVlKTsKICB9CiAgZm9yIChrZXkgaW4gb2xkQXR0cnMpIHsKICAgIGlmIChpc1VuZGVmKGF0dHJzW2tleV0pKSB7CiAgICAgIGlmIChpc1hsaW5rKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpOwogICAgICB9IGVsc2UgaWYgKCFpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7CiAgaWYgKGVsLnRhZ05hbWUuaW5kZXhPZignLScpID4gLTEpIHsKICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTsKICB9IGVsc2UgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkgewogICAgLy8gc2V0IGF0dHJpYnV0ZSBmb3IgYmxhbmsgdmFsdWUKICAgIC8vIGUuZy4gPG9wdGlvbiBkaXNhYmxlZD5TZWxlY3Qgb25lPC9vcHRpb24+CiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICB9IGVsc2UgewogICAgICAvLyB0ZWNobmljYWxseSBhbGxvd2Z1bGxzY3JlZW4gaXMgYSBib29sZWFuIGF0dHJpYnV0ZSBmb3IgPGlmcmFtZT4sCiAgICAgIC8vIGJ1dCBGbGFzaCBleHBlY3RzIGEgdmFsdWUgb2YgInRydWUiIHdoZW4gdXNlZCBvbiA8ZW1iZWQ+IHRhZwogICAgICB2YWx1ZSA9IGtleSA9PT0gJ2FsbG93ZnVsbHNjcmVlbicgJiYgZWwudGFnTmFtZSA9PT0gJ0VNQkVEJwogICAgICAgID8gJ3RydWUnCiAgICAgICAgOiBrZXk7CiAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzRW51bWVyYXRlZEF0dHIoa2V5KSkgewogICAgZWwuc2V0QXR0cmlidXRlKGtleSwgaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZScgPyAnZmFsc2UnIDogJ3RydWUnKTsKICB9IGVsc2UgaWYgKGlzWGxpbmsoa2V5KSkgewogICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpOwogICAgfQogIH0gZWxzZSB7CiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7CiAgfQp9CgpmdW5jdGlvbiBiYXNlU2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHsKICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpOwogIH0gZWxzZSB7CiAgICAvLyAjNzEzODogSUUxMCAmIDExIGZpcmVzIGlucHV0IGV2ZW50IHdoZW4gc2V0dGluZyBwbGFjZWhvbGRlciBvbgogICAgLy8gPHRleHRhcmVhPi4uLiBibG9jayB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYW5kIHJlbW92ZSB0aGUgYmxvY2tlcgogICAgLy8gaW1tZWRpYXRlbHkuCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgKICAgICAgaXNJRSAmJiAhaXNJRTkgJiYKICAgICAgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyAmJgogICAgICBrZXkgPT09ICdwbGFjZWhvbGRlcicgJiYgIWVsLl9faWVwaAogICAgKSB7CiAgICAgIHZhciBibG9ja2VyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIH07CiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICBlbC5fX2llcGggPSB0cnVlOyAvKiBJRSBwbGFjZWhvbGRlciBwYXRjaGVkICovCiAgICB9CiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CiAgfQp9Cgp2YXIgYXR0cnMgPSB7CiAgY3JlYXRlOiB1cGRhdGVBdHRycywKICB1cGRhdGU6IHVwZGF0ZUF0dHJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlQ2xhc3MgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBlbCA9IHZub2RlLmVsbTsKICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhOwogIGlmICgKICAgIGlzVW5kZWYoZGF0YS5zdGF0aWNDbGFzcykgJiYKICAgIGlzVW5kZWYoZGF0YS5jbGFzcykgJiYgKAogICAgICBpc1VuZGVmKG9sZERhdGEpIHx8ICgKICAgICAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljQ2xhc3MpICYmCiAgICAgICAgaXNVbmRlZihvbGREYXRhLmNsYXNzKQogICAgICApCiAgICApCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjbHMgPSBnZW5DbGFzc0ZvclZub2RlKHZub2RlKTsKCiAgLy8gaGFuZGxlIHRyYW5zaXRpb24gY2xhc3NlcwogIHZhciB0cmFuc2l0aW9uQ2xhc3MgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXM7CiAgaWYgKGlzRGVmKHRyYW5zaXRpb25DbGFzcykpIHsKICAgIGNscyA9IGNvbmNhdChjbHMsIHN0cmluZ2lmeUNsYXNzKHRyYW5zaXRpb25DbGFzcykpOwogIH0KCiAgLy8gc2V0IHRoZSBjbGFzcwogIGlmIChjbHMgIT09IGVsLl9wcmV2Q2xhc3MpIHsKICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbHMpOwogICAgZWwuX3ByZXZDbGFzcyA9IGNsczsKICB9Cn0KCnZhciBrbGFzcyA9IHsKICBjcmVhdGU6IHVwZGF0ZUNsYXNzLAogIHVwZGF0ZTogdXBkYXRlQ2xhc3MKfQoKLyogICovCgp2YXIgdmFsaWREaXZpc2lvbkNoYXJSRSA9IC9bXHcpLitcLV8kXF1dLzsKCmZ1bmN0aW9uIHBhcnNlRmlsdGVycyAoZXhwKSB7CiAgdmFyIGluU2luZ2xlID0gZmFsc2U7CiAgdmFyIGluRG91YmxlID0gZmFsc2U7CiAgdmFyIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsKICB2YXIgaW5SZWdleCA9IGZhbHNlOwogIHZhciBjdXJseSA9IDA7CiAgdmFyIHNxdWFyZSA9IDA7CiAgdmFyIHBhcmVuID0gMDsKICB2YXIgbGFzdEZpbHRlckluZGV4ID0gMDsKICB2YXIgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsKCiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykgewogICAgcHJldiA9IGM7CiAgICBjID0gZXhwLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoaW5TaW5nbGUpIHsKICAgICAgaWYgKGMgPT09IDB4MjcgJiYgcHJldiAhPT0gMHg1QykgeyBpblNpbmdsZSA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7CiAgICAgIGlmIChjID09PSAweDIyICYmIHByZXYgIT09IDB4NUMpIHsgaW5Eb3VibGUgPSBmYWxzZTsgfQogICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7CiAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NUMpIHsgaW5UZW1wbGF0ZVN0cmluZyA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHsKICAgICAgaWYgKGMgPT09IDB4MmYgJiYgcHJldiAhPT0gMHg1QykgeyBpblJlZ2V4ID0gZmFsc2U7IH0KICAgIH0gZWxzZSBpZiAoCiAgICAgIGMgPT09IDB4N0MgJiYgLy8gcGlwZQogICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYKICAgICAgZXhwLmNoYXJDb2RlQXQoaSAtIDEpICE9PSAweDdDICYmCiAgICAgICFjdXJseSAmJiAhc3F1YXJlICYmICFwYXJlbgogICAgKSB7CiAgICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBmaXJzdCBmaWx0ZXIsIGVuZCBvZiBleHByZXNzaW9uCiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaEZpbHRlcigpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlIDB4MjI6IGluRG91YmxlID0gdHJ1ZTsgYnJlYWsgICAgICAgICAvLyAiCiAgICAgICAgY2FzZSAweDI3OiBpblNpbmdsZSA9IHRydWU7IGJyZWFrICAgICAgICAgLy8gJwogICAgICAgIGNhc2UgMHg2MDogaW5UZW1wbGF0ZVN0cmluZyA9IHRydWU7IGJyZWFrIC8vIGAKICAgICAgICBjYXNlIDB4Mjg6IHBhcmVuKys7IGJyZWFrICAgICAgICAgICAgICAgICAvLyAoCiAgICAgICAgY2FzZSAweDI5OiBwYXJlbi0tOyBicmVhayAgICAgICAgICAgICAgICAgLy8gKQogICAgICAgIGNhc2UgMHg1Qjogc3F1YXJlKys7IGJyZWFrICAgICAgICAgICAgICAgIC8vIFsKICAgICAgICBjYXNlIDB4NUQ6IHNxdWFyZS0tOyBicmVhayAgICAgICAgICAgICAgICAvLyBdCiAgICAgICAgY2FzZSAweDdCOiBjdXJseSsrOyBicmVhayAgICAgICAgICAgICAgICAgLy8gewogICAgICAgIGNhc2UgMHg3RDogY3VybHktLTsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgfQogICAgICBpZiAoYyA9PT0gMHgyZikgeyAvLyAvCiAgICAgICAgdmFyIGogPSBpIC0gMTsKICAgICAgICB2YXIgcCA9ICh2b2lkIDApOwogICAgICAgIC8vIGZpbmQgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgcHJldiBjaGFyCiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICBwID0gZXhwLmNoYXJBdChqKTsKICAgICAgICAgIGlmIChwICE9PSAnICcpIHsgYnJlYWsgfQogICAgICAgIH0KICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkgewogICAgICAgICAgaW5SZWdleCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsKICB9IGVsc2UgaWYgKGxhc3RGaWx0ZXJJbmRleCAhPT0gMCkgewogICAgcHVzaEZpbHRlcigpOwogIH0KCiAgZnVuY3Rpb24gcHVzaEZpbHRlciAoKSB7CiAgICAoZmlsdGVycyB8fCAoZmlsdGVycyA9IFtdKSkucHVzaChleHAuc2xpY2UobGFzdEZpbHRlckluZGV4LCBpKS50cmltKCkpOwogICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgfQoKICBpZiAoZmlsdGVycykgewogICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSk7CiAgICB9CiAgfQoKICByZXR1cm4gZXhwcmVzc2lvbgp9CgpmdW5jdGlvbiB3cmFwRmlsdGVyIChleHAsIGZpbHRlcikgewogIHZhciBpID0gZmlsdGVyLmluZGV4T2YoJygnKTsKICBpZiAoaSA8IDApIHsKICAgIC8vIF9mOiByZXNvbHZlRmlsdGVyCiAgICByZXR1cm4gKCJfZihcIiIgKyBmaWx0ZXIgKyAiXCIpKCIgKyBleHAgKyAiKSIpCiAgfSBlbHNlIHsKICAgIHZhciBuYW1lID0gZmlsdGVyLnNsaWNlKDAsIGkpOwogICAgdmFyIGFyZ3MgPSBmaWx0ZXIuc2xpY2UoaSArIDEpOwogICAgcmV0dXJuICgiX2YoXCIiICsgbmFtZSArICJcIikoIiArIGV4cCArIChhcmdzICE9PSAnKScgPyAnLCcgKyBhcmdzIDogYXJncykpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGJhc2VXYXJuIChtc2cpIHsKICBjb25zb2xlLmVycm9yKCgiW1Z1ZSBjb21waWxlcl06ICIgKyBtc2cpKTsKfQoKZnVuY3Rpb24gcGx1Y2tNb2R1bGVGdW5jdGlvbiAoCiAgbW9kdWxlcywKICBrZXkKKSB7CiAgcmV0dXJuIG1vZHVsZXMKICAgID8gbW9kdWxlcy5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1ba2V5XTsgfSkuZmlsdGVyKGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9KQogICAgOiBbXQp9CgpmdW5jdGlvbiBhZGRQcm9wIChlbCwgbmFtZSwgdmFsdWUpIHsKICAoZWwucHJvcHMgfHwgKGVsLnByb3BzID0gW10pKS5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOwogIGVsLnBsYWluID0gZmFsc2U7Cn0KCmZ1bmN0aW9uIGFkZEF0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIChlbC5hdHRycyB8fCAoZWwuYXR0cnMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7CiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKLy8gYWRkIGEgcmF3IGF0dHIgKHVzZSB0aGlzIGluIHByZVRyYW5zZm9ybXMpCmZ1bmN0aW9uIGFkZFJhd0F0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIGVsLmF0dHJzTWFwW25hbWVdID0gdmFsdWU7CiAgZWwuYXR0cnNMaXN0LnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7Cn0KCmZ1bmN0aW9uIGFkZERpcmVjdGl2ZSAoCiAgZWwsCiAgbmFtZSwKICByYXdOYW1lLAogIHZhbHVlLAogIGFyZywKICBtb2RpZmllcnMKKSB7CiAgKGVsLmRpcmVjdGl2ZXMgfHwgKGVsLmRpcmVjdGl2ZXMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCByYXdOYW1lOiByYXdOYW1lLCB2YWx1ZTogdmFsdWUsIGFyZzogYXJnLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9KTsKICBlbC5wbGFpbiA9IGZhbHNlOwp9CgpmdW5jdGlvbiBhZGRIYW5kbGVyICgKICBlbCwKICBuYW1lLAogIHZhbHVlLAogIG1vZGlmaWVycywKICBpbXBvcnRhbnQsCiAgd2FybgopIHsKICBtb2RpZmllcnMgPSBtb2RpZmllcnMgfHwgZW1wdHlPYmplY3Q7CiAgLy8gd2FybiBwcmV2ZW50IGFuZCBwYXNzaXZlIG1vZGlmaWVyCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKAogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4gJiYKICAgIG1vZGlmaWVycy5wcmV2ZW50ICYmIG1vZGlmaWVycy5wYXNzaXZlCiAgKSB7CiAgICB3YXJuKAogICAgICAncGFzc2l2ZSBhbmQgcHJldmVudCBjYW5cJ3QgYmUgdXNlZCB0b2dldGhlci4gJyArCiAgICAgICdQYXNzaXZlIGhhbmRsZXIgY2FuXCd0IHByZXZlbnQgZGVmYXVsdCBldmVudC4nCiAgICApOwogIH0KCiAgLy8gY2hlY2sgY2FwdHVyZSBtb2RpZmllcgogIGlmIChtb2RpZmllcnMuY2FwdHVyZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5jYXB0dXJlOwogICAgbmFtZSA9ICchJyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIGNhcHR1cmVkCiAgfQogIGlmIChtb2RpZmllcnMub25jZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5vbmNlOwogICAgbmFtZSA9ICd+JyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIG9uY2UKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKG1vZGlmaWVycy5wYXNzaXZlKSB7CiAgICBkZWxldGUgbW9kaWZpZXJzLnBhc3NpdmU7CiAgICBuYW1lID0gJyYnICsgbmFtZTsgLy8gbWFyayB0aGUgZXZlbnQgYXMgcGFzc2l2ZQogIH0KCiAgLy8gbm9ybWFsaXplIGNsaWNrLnJpZ2h0IGFuZCBjbGljay5taWRkbGUgc2luY2UgdGhleSBkb24ndCBhY3R1YWxseSBmaXJlCiAgLy8gdGhpcyBpcyB0ZWNobmljYWxseSBicm93c2VyLXNwZWNpZmljLCBidXQgYXQgbGVhc3QgZm9yIG5vdyBicm93c2VycyBhcmUKICAvLyB0aGUgb25seSB0YXJnZXQgZW52cyB0aGF0IGhhdmUgcmlnaHQvbWlkZGxlIGNsaWNrcy4KICBpZiAobmFtZSA9PT0gJ2NsaWNrJykgewogICAgaWYgKG1vZGlmaWVycy5yaWdodCkgewogICAgICBuYW1lID0gJ2NvbnRleHRtZW51JzsKICAgICAgZGVsZXRlIG1vZGlmaWVycy5yaWdodDsKICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLm1pZGRsZSkgewogICAgICBuYW1lID0gJ21vdXNldXAnOwogICAgfQogIH0KCiAgdmFyIGV2ZW50czsKICBpZiAobW9kaWZpZXJzLm5hdGl2ZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5uYXRpdmU7CiAgICBldmVudHMgPSBlbC5uYXRpdmVFdmVudHMgfHwgKGVsLm5hdGl2ZUV2ZW50cyA9IHt9KTsKICB9IGVsc2UgewogICAgZXZlbnRzID0gZWwuZXZlbnRzIHx8IChlbC5ldmVudHMgPSB7fSk7CiAgfQoKICB2YXIgbmV3SGFuZGxlciA9IHsKICAgIHZhbHVlOiB2YWx1ZS50cmltKCkKICB9OwogIGlmIChtb2RpZmllcnMgIT09IGVtcHR5T2JqZWN0KSB7CiAgICBuZXdIYW5kbGVyLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKICB9CgogIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoQXJyYXkuaXNBcnJheShoYW5kbGVycykpIHsKICAgIGltcG9ydGFudCA/IGhhbmRsZXJzLnVuc2hpZnQobmV3SGFuZGxlcikgOiBoYW5kbGVycy5wdXNoKG5ld0hhbmRsZXIpOwogIH0gZWxzZSBpZiAoaGFuZGxlcnMpIHsKICAgIGV2ZW50c1tuYW1lXSA9IGltcG9ydGFudCA/IFtuZXdIYW5kbGVyLCBoYW5kbGVyc10gOiBbaGFuZGxlcnMsIG5ld0hhbmRsZXJdOwogIH0gZWxzZSB7CiAgICBldmVudHNbbmFtZV0gPSBuZXdIYW5kbGVyOwogIH0KCiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0QmluZGluZ0F0dHIgKAogIGVsLAogIG5hbWUsCiAgZ2V0U3RhdGljCikgewogIHZhciBkeW5hbWljVmFsdWUgPQogICAgZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJzonICsgbmFtZSkgfHwKICAgIGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWJpbmQ6JyArIG5hbWUpOwogIGlmIChkeW5hbWljVmFsdWUgIT0gbnVsbCkgewogICAgcmV0dXJuIHBhcnNlRmlsdGVycyhkeW5hbWljVmFsdWUpCiAgfSBlbHNlIGlmIChnZXRTdGF0aWMgIT09IGZhbHNlKSB7CiAgICB2YXIgc3RhdGljVmFsdWUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCBuYW1lKTsKICAgIGlmIChzdGF0aWNWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0aWNWYWx1ZSkKICAgIH0KICB9Cn0KCi8vIG5vdGU6IHRoaXMgb25seSByZW1vdmVzIHRoZSBhdHRyIGZyb20gdGhlIEFycmF5IChhdHRyc0xpc3QpIHNvIHRoYXQgaXQKLy8gZG9lc24ndCBnZXQgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NBdHRycy4KLy8gQnkgZGVmYXVsdCBpdCBkb2VzIE5PVCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwIChhdHRyc01hcCkgYmVjYXVzZSB0aGUgbWFwIGlzCi8vIG5lZWRlZCBkdXJpbmcgY29kZWdlbi4KZnVuY3Rpb24gZ2V0QW5kUmVtb3ZlQXR0ciAoCiAgZWwsCiAgbmFtZSwKICByZW1vdmVGcm9tTWFwCikgewogIHZhciB2YWw7CiAgaWYgKCh2YWwgPSBlbC5hdHRyc01hcFtuYW1lXSkgIT0gbnVsbCkgewogICAgdmFyIGxpc3QgPSBlbC5hdHRyc0xpc3Q7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICBsaXN0LnNwbGljZShpLCAxKTsKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQogIGlmIChyZW1vdmVGcm9tTWFwKSB7CiAgICBkZWxldGUgZWwuYXR0cnNNYXBbbmFtZV07CiAgfQogIHJldHVybiB2YWwKfQoKLyogICovCgovKioKICogQ3Jvc3MtcGxhdGZvcm0gY29kZSBnZW5lcmF0aW9uIGZvciBjb21wb25lbnQgdi1tb2RlbAogKi8KZnVuY3Rpb24gZ2VuQ29tcG9uZW50TW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgcmVmID0gbW9kaWZpZXJzIHx8IHt9OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CgogIHZhciBiYXNlVmFsdWVFeHByZXNzaW9uID0gJyQkdic7CiAgdmFyIHZhbHVlRXhwcmVzc2lvbiA9IGJhc2VWYWx1ZUV4cHJlc3Npb247CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9CiAgICAgICIodHlwZW9mICIgKyBiYXNlVmFsdWVFeHByZXNzaW9uICsgIiA9PT0gJ3N0cmluZyciICsKICAgICAgIj8gIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiLnRyaW0oKSIgKwogICAgICAiOiAiICsgYmFzZVZhbHVlRXhwcmVzc2lvbiArICIpIjsKICB9CiAgaWYgKG51bWJlcikgewogICAgdmFsdWVFeHByZXNzaW9uID0gIl9uKCIgKyB2YWx1ZUV4cHJlc3Npb24gKyAiKSI7CiAgfQogIHZhciBhc3NpZ25tZW50ID0gZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIHZhbHVlRXhwcmVzc2lvbik7CgogIGVsLm1vZGVsID0gewogICAgdmFsdWU6ICgiKCIgKyB2YWx1ZSArICIpIiksCiAgICBleHByZXNzaW9uOiAoIlwiIiArIHZhbHVlICsgIlwiIiksCiAgICBjYWxsYmFjazogKCJmdW5jdGlvbiAoIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiKSB7IiArIGFzc2lnbm1lbnQgKyAifSIpCiAgfTsKfQoKLyoqCiAqIENyb3NzLXBsYXRmb3JtIGNvZGVnZW4gaGVscGVyIGZvciBnZW5lcmF0aW5nIHYtbW9kZWwgdmFsdWUgYXNzaWdubWVudCBjb2RlLgogKi8KZnVuY3Rpb24gZ2VuQXNzaWdubWVudENvZGUgKAogIHZhbHVlLAogIGFzc2lnbm1lbnQKKSB7CiAgdmFyIHJlcyA9IHBhcnNlTW9kZWwodmFsdWUpOwogIGlmIChyZXMua2V5ID09PSBudWxsKSB7CiAgICByZXR1cm4gKHZhbHVlICsgIj0iICsgYXNzaWdubWVudCkKICB9IGVsc2UgewogICAgcmV0dXJuICgiJHNldCgiICsgKHJlcy5leHApICsgIiwgIiArIChyZXMua2V5KSArICIsICIgKyBhc3NpZ25tZW50ICsgIikiKQogIH0KfQoKLyoqCiAqIFBhcnNlIGEgdi1tb2RlbCBleHByZXNzaW9uIGludG8gYSBiYXNlIHBhdGggYW5kIGEgZmluYWwga2V5IHNlZ21lbnQuCiAqIEhhbmRsZXMgYm90aCBkb3QtcGF0aCBhbmQgcG9zc2libGUgc3F1YXJlIGJyYWNrZXRzLgogKgogKiBQb3NzaWJsZSBjYXNlczoKICoKICogLSB0ZXN0CiAqIC0gdGVzdFtrZXldCiAqIC0gdGVzdFt0ZXN0MVtrZXldXQogKiAtIHRlc3RbImEiXVtrZXldCiAqIC0geHh4LnRlc3RbYVthXS50ZXN0MVtrZXldXQogKiAtIHRlc3QueHh4LmFbImFzYSJdW3Rlc3QxW2tleV1dCiAqCiAqLwoKdmFyIGxlbjsKdmFyIHN0cjsKdmFyIGNocjsKdmFyIGluZGV4JDE7CnZhciBleHByZXNzaW9uUG9zOwp2YXIgZXhwcmVzc2lvbkVuZFBvczsKCgoKZnVuY3Rpb24gcGFyc2VNb2RlbCAodmFsKSB7CiAgLy8gRml4IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvcHVsbC83NzMwCiAgLy8gYWxsb3cgdi1tb2RlbD0ib2JqLnZhbCAiICh0cmFpbGluZyB3aGl0ZXNwYWNlKQogIHZhbCA9IHZhbC50cmltKCk7CiAgbGVuID0gdmFsLmxlbmd0aDsKCiAgaWYgKHZhbC5pbmRleE9mKCdbJykgPCAwIHx8IHZhbC5sYXN0SW5kZXhPZignXScpIDwgbGVuIC0gMSkgewogICAgaW5kZXgkMSA9IHZhbC5sYXN0SW5kZXhPZignLicpOwogICAgaWYgKGluZGV4JDEgPiAtMSkgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLnNsaWNlKDAsIGluZGV4JDEpLAogICAgICAgIGtleTogJyInICsgdmFsLnNsaWNlKGluZGV4JDEgKyAxKSArICciJwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLAogICAgICAgIGtleTogbnVsbAogICAgICB9CiAgICB9CiAgfQoKICBzdHIgPSB2YWw7CiAgaW5kZXgkMSA9IGV4cHJlc3Npb25Qb3MgPSBleHByZXNzaW9uRW5kUG9zID0gMDsKCiAgd2hpbGUgKCFlb2YoKSkgewogICAgY2hyID0gbmV4dCgpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QikgewogICAgICBwYXJzZUJyYWNrZXQoY2hyKTsKICAgIH0KICB9CgogIHJldHVybiB7CiAgICBleHA6IHZhbC5zbGljZSgwLCBleHByZXNzaW9uUG9zKSwKICAgIGtleTogdmFsLnNsaWNlKGV4cHJlc3Npb25Qb3MgKyAxLCBleHByZXNzaW9uRW5kUG9zKQogIH0KfQoKZnVuY3Rpb24gbmV4dCAoKSB7CiAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgkMSkKfQoKZnVuY3Rpb24gZW9mICgpIHsKICByZXR1cm4gaW5kZXgkMSA+PSBsZW4KfQoKZnVuY3Rpb24gaXNTdHJpbmdTdGFydCAoY2hyKSB7CiAgcmV0dXJuIGNociA9PT0gMHgyMiB8fCBjaHIgPT09IDB4MjcKfQoKZnVuY3Rpb24gcGFyc2VCcmFja2V0IChjaHIpIHsKICB2YXIgaW5CcmFja2V0ID0gMTsKICBleHByZXNzaW9uUG9zID0gaW5kZXgkMTsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAoY2hyID09PSAweDVCKSB7IGluQnJhY2tldCsrOyB9CiAgICBpZiAoY2hyID09PSAweDVEKSB7IGluQnJhY2tldC0tOyB9CiAgICBpZiAoaW5CcmFja2V0ID09PSAwKSB7CiAgICAgIGV4cHJlc3Npb25FbmRQb3MgPSBpbmRleCQxOwogICAgICBicmVhawogICAgfQogIH0KfQoKZnVuY3Rpb24gcGFyc2VTdHJpbmcgKGNocikgewogIHZhciBzdHJpbmdRdW90ZSA9IGNocjsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoY2hyID09PSBzdHJpbmdRdW90ZSkgewogICAgICBicmVhawogICAgfQogIH0KfQoKLyogICovCgp2YXIgd2FybiQxOwoKLy8gaW4gc29tZSBjYXNlcywgdGhlIGV2ZW50IHVzZWQgaGFzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZQovLyBzbyB3ZSB1c2VkIHNvbWUgcmVzZXJ2ZWQgdG9rZW5zIGR1cmluZyBjb21waWxlLgp2YXIgUkFOR0VfVE9LRU4gPSAnX19yJzsKdmFyIENIRUNLQk9YX1JBRElPX1RPS0VOID0gJ19fYyc7CgpmdW5jdGlvbiBtb2RlbCAoCiAgZWwsCiAgZGlyLAogIF93YXJuCikgewogIHdhcm4kMSA9IF93YXJuOwogIHZhciB2YWx1ZSA9IGRpci52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVyczsKICB2YXIgdGFnID0gZWwudGFnOwogIHZhciB0eXBlID0gZWwuYXR0cnNNYXAudHlwZTsKCiAgewogICAgLy8gaW5wdXRzIHdpdGggdHlwZT0iZmlsZSIgYXJlIHJlYWQgb25seSBhbmQgc2V0dGluZyB0aGUgaW5wdXQncwogICAgLy8gdmFsdWUgd2lsbCB0aHJvdyBhbiBlcnJvci4KICAgIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2ZpbGUnKSB7CiAgICAgIHdhcm4kMSgKICAgICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIiB0eXBlPVwiZmlsZVwiPjpcbiIgKwogICAgICAgICJGaWxlIGlucHV0cyBhcmUgcmVhZCBvbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLiIKICAgICAgKTsKICAgIH0KICB9CgogIGlmIChlbC5jb21wb25lbnQpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgIGdlblNlbGVjdChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2NoZWNrYm94JykgewogICAgZ2VuQ2hlY2tib3hNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ3JhZGlvJykgewogICAgZ2VuUmFkaW9Nb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7CiAgICBnZW5EZWZhdWx0TW9kZWwoZWwsIHZhbHVlLCBtb2RpZmllcnMpOwogIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgewogICAgd2FybiQxKAogICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIj46ICIgKwogICAgICAidi1tb2RlbCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZWxlbWVudCB0eXBlLiAiICsKICAgICAgJ0lmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbnRlbnRlZGl0YWJsZSwgaXRcJ3MgcmVjb21tZW5kZWQgdG8gJyArCiAgICAgICd3cmFwIGEgbGlicmFyeSBkZWRpY2F0ZWQgZm9yIHRoYXQgcHVycG9zZSBpbnNpZGUgYSBjdXN0b20gY29tcG9uZW50LicKICAgICk7CiAgfQoKICAvLyBlbnN1cmUgcnVudGltZSBkaXJlY3RpdmUgbWV0YWRhdGEKICByZXR1cm4gdHJ1ZQp9CgpmdW5jdGlvbiBnZW5DaGVja2JveE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciB2YWx1ZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3ZhbHVlJykgfHwgJ251bGwnOwogIHZhciB0cnVlVmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICd0cnVlLXZhbHVlJykgfHwgJ3RydWUnOwogIHZhciBmYWxzZVZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnZmFsc2UtdmFsdWUnKSB8fCAnZmFsc2UnOwogIGFkZFByb3AoZWwsICdjaGVja2VkJywKICAgICJBcnJheS5pc0FycmF5KCIgKyB2YWx1ZSArICIpIiArCiAgICAiP19pKCIgKyB2YWx1ZSArICIsIiArIHZhbHVlQmluZGluZyArICIpPi0xIiArICgKICAgICAgdHJ1ZVZhbHVlQmluZGluZyA9PT0gJ3RydWUnCiAgICAgICAgPyAoIjooIiArIHZhbHVlICsgIikiKQogICAgICAgIDogKCI6X3EoIiArIHZhbHVlICsgIiwiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpIikKICAgICkKICApOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLAogICAgInZhciAkJGE9IiArIHZhbHVlICsgIiwiICsKICAgICAgICAnJCRlbD0kZXZlbnQudGFyZ2V0LCcgKwogICAgICAgICIkJGM9JCRlbC5jaGVja2VkPygiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpOigiICsgZmFsc2VWYWx1ZUJpbmRpbmcgKyAiKTsiICsKICAgICdpZihBcnJheS5pc0FycmF5KCQkYSkpeycgKwogICAgICAidmFyICQkdj0iICsgKG51bWJlciA/ICdfbignICsgdmFsdWVCaW5kaW5nICsgJyknIDogdmFsdWVCaW5kaW5nKSArICIsIiArCiAgICAgICAgICAnJCRpPV9pKCQkYSwkJHYpOycgKwogICAgICAiaWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIgKyAoZ2VuQXNzaWdubWVudENvZGUodmFsdWUsICckJGEuY29uY2F0KFskJHZdKScpKSArICIpfSIgKwogICAgICAiZWxzZXskJGk+LTEmJigiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSknKSkgKyAiKX0iICsKICAgICJ9ZWxzZXsiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRjJykpICsgIn0iLAogICAgbnVsbCwgdHJ1ZQogICk7Cn0KCmZ1bmN0aW9uIGdlblJhZGlvTW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgbnVtYmVyID0gbW9kaWZpZXJzICYmIG1vZGlmaWVycy5udW1iZXI7CiAgdmFyIHZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKSB8fCAnbnVsbCc7CiAgdmFsdWVCaW5kaW5nID0gbnVtYmVyID8gKCJfbigiICsgdmFsdWVCaW5kaW5nICsgIikiKSA6IHZhbHVlQmluZGluZzsKICBhZGRQcm9wKGVsLCAnY2hlY2tlZCcsICgiX3EoIiArIHZhbHVlICsgIiwiICsgdmFsdWVCaW5kaW5nICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsIGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCB2YWx1ZUJpbmRpbmcpLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuU2VsZWN0ICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciBzZWxlY3RlZFZhbCA9ICJBcnJheS5wcm90b3R5cGUuZmlsdGVyIiArCiAgICAiLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLGZ1bmN0aW9uKG8pe3JldHVybiBvLnNlbGVjdGVkfSkiICsKICAgICIubWFwKGZ1bmN0aW9uKG8pe3ZhciB2YWwgPSBcIl92YWx1ZVwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7IiArCiAgICAicmV0dXJuICIgKyAobnVtYmVyID8gJ19uKHZhbCknIDogJ3ZhbCcpICsgIn0pIjsKCiAgdmFyIGFzc2lnbm1lbnQgPSAnJGV2ZW50LnRhcmdldC5tdWx0aXBsZSA/ICQkc2VsZWN0ZWRWYWwgOiAkJHNlbGVjdGVkVmFsWzBdJzsKICB2YXIgY29kZSA9ICJ2YXIgJCRzZWxlY3RlZFZhbCA9ICIgKyBzZWxlY3RlZFZhbCArICI7IjsKICBjb2RlID0gY29kZSArICIgIiArIChnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgYXNzaWdubWVudCkpOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLCBjb2RlLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuRGVmYXVsdE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIHR5cGUgPSBlbC5hdHRyc01hcC50eXBlOwoKICAvLyB3YXJuIGlmIHYtYmluZDp2YWx1ZSBjb25mbGljdHMgd2l0aCB2LW1vZGVsCiAgLy8gZXhjZXB0IGZvciBpbnB1dHMgd2l0aCB2LWJpbmQ6dHlwZQogIHsKICAgIHZhciB2YWx1ZSQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddIHx8IGVsLmF0dHJzTWFwWyc6dmFsdWUnXTsKICAgIHZhciB0eXBlQmluZGluZyA9IGVsLmF0dHJzTWFwWyd2LWJpbmQ6dHlwZSddIHx8IGVsLmF0dHJzTWFwWyc6dHlwZSddOwogICAgaWYgKHZhbHVlJDEgJiYgIXR5cGVCaW5kaW5nKSB7CiAgICAgIHZhciBiaW5kaW5nID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddID8gJ3YtYmluZDp2YWx1ZScgOiAnOnZhbHVlJzsKICAgICAgd2FybiQxKAogICAgICAgIGJpbmRpbmcgKyAiPVwiIiArIHZhbHVlJDEgKyAiXCIgY29uZmxpY3RzIHdpdGggdi1tb2RlbCBvbiB0aGUgc2FtZSBlbGVtZW50ICIgKwogICAgICAgICdiZWNhdXNlIHRoZSBsYXR0ZXIgYWxyZWFkeSBleHBhbmRzIHRvIGEgdmFsdWUgYmluZGluZyBpbnRlcm5hbGx5JwogICAgICApOwogICAgfQogIH0KCiAgdmFyIHJlZiA9IG1vZGlmaWVycyB8fCB7fTsKICB2YXIgbGF6eSA9IHJlZi5sYXp5OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CiAgdmFyIG5lZWRDb21wb3NpdGlvbkd1YXJkID0gIWxhenkgJiYgdHlwZSAhPT0gJ3JhbmdlJzsKICB2YXIgZXZlbnQgPSBsYXp5CiAgICA/ICdjaGFuZ2UnCiAgICA6IHR5cGUgPT09ICdyYW5nZScKICAgICAgPyBSQU5HRV9UT0tFTgogICAgICA6ICdpbnB1dCc7CgogIHZhciB2YWx1ZUV4cHJlc3Npb24gPSAnJGV2ZW50LnRhcmdldC52YWx1ZSc7CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKSI7CiAgfQogIGlmIChudW1iZXIpIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICJfbigiICsgdmFsdWVFeHByZXNzaW9uICsgIikiOwogIH0KCiAgdmFyIGNvZGUgPSBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgdmFsdWVFeHByZXNzaW9uKTsKICBpZiAobmVlZENvbXBvc2l0aW9uR3VhcmQpIHsKICAgIGNvZGUgPSAiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIgKyBjb2RlOwogIH0KCiAgYWRkUHJvcChlbCwgJ3ZhbHVlJywgKCIoIiArIHZhbHVlICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgZXZlbnQsIGNvZGUsIG51bGwsIHRydWUpOwogIGlmICh0cmltIHx8IG51bWJlcikgewogICAgYWRkSGFuZGxlcihlbCwgJ2JsdXInLCAnJGZvcmNlVXBkYXRlKCknKTsKICB9Cn0KCi8qICAqLwoKLy8gbm9ybWFsaXplIHYtbW9kZWwgZXZlbnQgdG9rZW5zIHRoYXQgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLgovLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlCi8vIHRoZSB3aG9sZSBwb2ludCBpcyBlbnN1cmluZyB0aGUgdi1tb2RlbCBjYWxsYmFjayBnZXRzIGNhbGxlZCBiZWZvcmUKLy8gdXNlci1hdHRhY2hlZCBoYW5kbGVycy4KZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltSQU5HRV9UT0tFTl0pKSB7CiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50CiAgICB2YXIgZXZlbnQgPSBpc0lFID8gJ2NoYW5nZScgOiAnaW5wdXQnOwogICAgb25bZXZlbnRdID0gW10uY29uY2F0KG9uW1JBTkdFX1RPS0VOXSwgb25bZXZlbnRdIHx8IFtdKTsKICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07CiAgfQogIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gZml4ICM0NTIxIGJ1dCBubyBsb25nZXIgbmVjZXNzYXJ5CiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltDSEVDS0JPWF9SQURJT19UT0tFTl0pKSB7CiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pOwogICAgZGVsZXRlIG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXTsKICB9Cn0KCnZhciB0YXJnZXQkMTsKCmZ1bmN0aW9uIGNyZWF0ZU9uY2VIYW5kbGVyIChoYW5kbGVyLCBldmVudCwgY2FwdHVyZSkgewogIHZhciBfdGFyZ2V0ID0gdGFyZ2V0JDE7IC8vIHNhdmUgY3VycmVudCB0YXJnZXQgZWxlbWVudCBpbiBjbG9zdXJlCiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHsKICAgIHZhciByZXMgPSBoYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzICE9PSBudWxsKSB7CiAgICAgIHJlbW92ZSQyKGV2ZW50LCBvbmNlSGFuZGxlciwgY2FwdHVyZSwgX3RhcmdldCk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBhZGQkMSAoCiAgZXZlbnQsCiAgaGFuZGxlciwKICBvbmNlJCQxLAogIGNhcHR1cmUsCiAgcGFzc2l2ZQopIHsKICBoYW5kbGVyID0gd2l0aE1hY3JvVGFzayhoYW5kbGVyKTsKICBpZiAob25jZSQkMSkgeyBoYW5kbGVyID0gY3JlYXRlT25jZUhhbmRsZXIoaGFuZGxlciwgZXZlbnQsIGNhcHR1cmUpOyB9CiAgdGFyZ2V0JDEuYWRkRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlciwKICAgIHN1cHBvcnRzUGFzc2l2ZQogICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9CiAgICAgIDogY2FwdHVyZQogICk7Cn0KCmZ1bmN0aW9uIHJlbW92ZSQyICgKICBldmVudCwKICBoYW5kbGVyLAogIGNhcHR1cmUsCiAgX3RhcmdldAopIHsKICAoX3RhcmdldCB8fCB0YXJnZXQkMSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlci5fd2l0aFRhc2sgfHwgaGFuZGxlciwKICAgIGNhcHR1cmUKICApOwp9CgpmdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEub24pICYmIGlzVW5kZWYodm5vZGUuZGF0YS5vbikpIHsKICAgIHJldHVybgogIH0KICB2YXIgb24gPSB2bm9kZS5kYXRhLm9uIHx8IHt9OwogIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307CiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07CiAgbm9ybWFsaXplRXZlbnRzKG9uKTsKICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpOwogIHRhcmdldCQxID0gdW5kZWZpbmVkOwp9Cgp2YXIgZXZlbnRzID0gewogIGNyZWF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzLAogIHVwZGF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlRE9NUHJvcHMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuZG9tUHJvcHMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5kb21Qcm9wcykpIHsKICAgIHJldHVybgogIH0KICB2YXIga2V5LCBjdXI7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkUHJvcHMgPSBvbGRWbm9kZS5kYXRhLmRvbVByb3BzIHx8IHt9OwogIHZhciBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKHByb3BzLl9fb2JfXykpIHsKICAgIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHMpOwogIH0KCiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHsKICAgIGlmIChpc1VuZGVmKHByb3BzW2tleV0pKSB7CiAgICAgIGVsbVtrZXldID0gJyc7CiAgICB9CiAgfQogIGZvciAoa2V5IGluIHByb3BzKSB7CiAgICBjdXIgPSBwcm9wc1trZXldOwogICAgLy8gaWdub3JlIGNoaWxkcmVuIGlmIHRoZSBub2RlIGhhcyB0ZXh0Q29udGVudCBvciBpbm5lckhUTUwsCiAgICAvLyBhcyB0aGVzZSB3aWxsIHRocm93IGF3YXkgZXhpc3RpbmcgRE9NIG5vZGVzIGFuZCBjYXVzZSByZW1vdmFsIGVycm9ycwogICAgLy8gb24gc3Vic2VxdWVudCBwYXRjaGVzICgjMzM2MCkKICAgIGlmIChrZXkgPT09ICd0ZXh0Q29udGVudCcgfHwga2V5ID09PSAnaW5uZXJIVE1MJykgewogICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHsgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID0gMDsgfQogICAgICBpZiAoY3VyID09PSBvbGRQcm9wc1trZXldKSB7IGNvbnRpbnVlIH0KICAgICAgLy8gIzY2MDEgd29yayBhcm91bmQgQ2hyb21lIHZlcnNpb24gPD0gNTUgYnVnIHdoZXJlIHNpbmdsZSB0ZXh0Tm9kZQogICAgICAvLyByZXBsYWNlZCBieSBpbm5lckhUTUwvdGV4dENvbnRlbnQgcmV0YWlucyBpdHMgcGFyZW50Tm9kZSBwcm9wZXJ0eQogICAgICBpZiAoZWxtLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5jaGlsZE5vZGVzWzBdKTsKICAgICAgfQogICAgfQoKICAgIGlmIChrZXkgPT09ICd2YWx1ZScpIHsKICAgICAgLy8gc3RvcmUgdmFsdWUgYXMgX3ZhbHVlIGFzIHdlbGwgc2luY2UKICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZAogICAgICBlbG0uX3ZhbHVlID0gY3VyOwogICAgICAvLyBhdm9pZCByZXNldHRpbmcgY3Vyc29yIHBvc2l0aW9uIHdoZW4gdmFsdWUgaXMgdGhlIHNhbWUKICAgICAgdmFyIHN0ckN1ciA9IGlzVW5kZWYoY3VyKSA/ICcnIDogU3RyaW5nKGN1cik7CiAgICAgIGlmIChzaG91bGRVcGRhdGVWYWx1ZShlbG0sIHN0ckN1cikpIHsKICAgICAgICBlbG0udmFsdWUgPSBzdHJDdXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVsbVtrZXldID0gY3VyOwogICAgfQogIH0KfQoKLy8gY2hlY2sgcGxhdGZvcm1zL3dlYi91dGlsL2F0dHJzLmpzIGFjY2VwdFZhbHVlCgoKZnVuY3Rpb24gc2hvdWxkVXBkYXRlVmFsdWUgKGVsbSwgY2hlY2tWYWwpIHsKICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmICgKICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fAogICAgaXNOb3RJbkZvY3VzQW5kRGlydHkoZWxtLCBjaGVja1ZhbCkgfHwKICAgIGlzRGlydHlXaXRoTW9kaWZpZXJzKGVsbSwgY2hlY2tWYWwpCiAgKSkKfQoKZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHsKICAvLyByZXR1cm4gdHJ1ZSB3aGVuIHRleHRib3ggKC5udW1iZXIgYW5kIC50cmltKSBsb3NlcyBmb2N1cyBhbmQgaXRzIHZhbHVlIGlzCiAgLy8gbm90IGVxdWFsIHRvIHRoZSB1cGRhdGVkIHZhbHVlCiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlOwogIC8vICM2MTU3CiAgLy8gd29yayBhcm91bmQgSUUgYnVnIHdoZW4gYWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW4gYW4gaWZyYW1lCiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge30KICByZXR1cm4gbm90SW5Gb2N1cyAmJiBlbG0udmFsdWUgIT09IGNoZWNrVmFsCn0KCmZ1bmN0aW9uIGlzRGlydHlXaXRoTW9kaWZpZXJzIChlbG0sIG5ld1ZhbCkgewogIHZhciB2YWx1ZSA9IGVsbS52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWUKICBpZiAoaXNEZWYobW9kaWZpZXJzKSkgewogICAgaWYgKG1vZGlmaWVycy5sYXp5KSB7CiAgICAgIC8vIGlucHV0cyB3aXRoIGxhenkgc2hvdWxkIG9ubHkgYmUgdXBkYXRlZCB3aGVuIG5vdCBpbiBmb2N1cwogICAgICByZXR1cm4gZmFsc2UKICAgIH0KICAgIGlmIChtb2RpZmllcnMubnVtYmVyKSB7CiAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgIT09IHRvTnVtYmVyKG5ld1ZhbCkKICAgIH0KICAgIGlmIChtb2RpZmllcnMudHJpbSkgewogICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSBuZXdWYWwudHJpbSgpCiAgICB9CiAgfQogIHJldHVybiB2YWx1ZSAhPT0gbmV3VmFsCn0KCnZhciBkb21Qcm9wcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLAogIHVwZGF0ZTogdXBkYXRlRE9NUHJvcHMKfQoKLyogICovCgp2YXIgcGFyc2VTdHlsZVRleHQgPSBjYWNoZWQoZnVuY3Rpb24gKGNzc1RleHQpIHsKICB2YXIgcmVzID0ge307CiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXCkpL2c7CiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLzsKICBjc3NUZXh0LnNwbGl0KGxpc3REZWxpbWl0ZXIpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmIChpdGVtKSB7CiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTsKICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJlc1t0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpOwogICAgfQogIH0pOwogIHJldHVybiByZXMKfSk7CgovLyBtZXJnZSBzdGF0aWMgYW5kIGR5bmFtaWMgc3R5bGUgZGF0YSBvbiB0aGUgc2FtZSB2bm9kZQpmdW5jdGlvbiBub3JtYWxpemVTdHlsZURhdGEgKGRhdGEpIHsKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZGF0YS5zdHlsZSk7CiAgLy8gc3RhdGljIHN0eWxlIGlzIHByZS1wcm9jZXNzZWQgaW50byBhbiBvYmplY3QgZHVyaW5nIGNvbXBpbGF0aW9uCiAgLy8gYW5kIGlzIGFsd2F5cyBhIGZyZXNoIG9iamVjdCwgc28gaXQncyBzYWZlIHRvIG1lcmdlIGludG8gaXQKICByZXR1cm4gZGF0YS5zdGF0aWNTdHlsZQogICAgPyBleHRlbmQoZGF0YS5zdGF0aWNTdHlsZSwgc3R5bGUpCiAgICA6IHN0eWxlCn0KCi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3QKZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHsKICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nU3R5bGUpKSB7CiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKQogIH0KICBpZiAodHlwZW9mIGJpbmRpbmdTdHlsZSA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpCiAgfQogIHJldHVybiBiaW5kaW5nU3R5bGUKfQoKLyoqCiAqIHBhcmVudCBjb21wb25lbnQgc3R5bGUgc2hvdWxkIGJlIGFmdGVyIGNoaWxkJ3MKICogc28gdGhhdCBwYXJlbnQgY29tcG9uZW50J3Mgc3R5bGUgY291bGQgb3ZlcnJpZGUgaXQKICovCmZ1bmN0aW9uIGdldFN0eWxlICh2bm9kZSwgY2hlY2tDaGlsZCkgewogIHZhciByZXMgPSB7fTsKICB2YXIgc3R5bGVEYXRhOwoKICBpZiAoY2hlY2tDaGlsZCkgewogICAgdmFyIGNoaWxkTm9kZSA9IHZub2RlOwogICAgd2hpbGUgKGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZSkgewogICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlOwogICAgICBpZiAoCiAgICAgICAgY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhICYmCiAgICAgICAgKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YShjaGlsZE5vZGUuZGF0YSkpCiAgICAgICkgewogICAgICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICgoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHZub2RlLmRhdGEpKSkgewogICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICB9CgogIHZhciBwYXJlbnROb2RlID0gdm5vZGU7CiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7CiAgICBpZiAocGFyZW50Tm9kZS5kYXRhICYmIChzdHlsZURhdGEgPSBub3JtYWxpemVTdHlsZURhdGEocGFyZW50Tm9kZS5kYXRhKSkpIHsKICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCnZhciBjc3NWYXJSRSA9IC9eLS0vOwp2YXIgaW1wb3J0YW50UkUgPSAvXHMqIWltcG9ydGFudCQvOwp2YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGNzc1ZhclJFLnRlc3QobmFtZSkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7CiAgfSBlbHNlIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCAnJyksICdpbXBvcnRhbnQnKTsKICB9IGVsc2UgewogICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplKG5hbWUpOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAvLyBTdXBwb3J0IHZhbHVlcyBhcnJheSBjcmVhdGVkIGJ5IGF1dG9wcmVmaXhlciwgZS5nLgogICAgICAvLyB7ZGlzcGxheTogWyItd2Via2l0LWJveCIsICItbXMtZmxleGJveCIsICJmbGV4Il19CiAgICAgIC8vIFNldCB0aGVtIG9uZSBieSBvbmUsIGFuZCB0aGUgYnJvd3NlciB3aWxsIG9ubHkgc2V0IHRob3NlIGl0IGNhbiByZWNvZ25pemUKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbC5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbFtpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsOwogICAgfQogIH0KfTsKCnZhciB2ZW5kb3JOYW1lcyA9IFsnV2Via2l0JywgJ01veicsICdtcyddOwoKdmFyIGVtcHR5U3R5bGU7CnZhciBub3JtYWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHByb3ApIHsKICBlbXB0eVN0eWxlID0gZW1wdHlTdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKICBwcm9wID0gY2FtZWxpemUocHJvcCk7CiAgaWYgKHByb3AgIT09ICdmaWx0ZXInICYmIChwcm9wIGluIGVtcHR5U3R5bGUpKSB7CiAgICByZXR1cm4gcHJvcAogIH0KICB2YXIgY2FwTmFtZSA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBuYW1lID0gdmVuZG9yTmFtZXNbaV0gKyBjYXBOYW1lOwogICAgaWYgKG5hbWUgaW4gZW1wdHlTdHlsZSkgewogICAgICByZXR1cm4gbmFtZQogICAgfQogIH0KfSk7CgpmdW5jdGlvbiB1cGRhdGVTdHlsZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTsKCiAgaWYgKGlzVW5kZWYoZGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihkYXRhLnN0eWxlKSAmJgogICAgaXNVbmRlZihvbGREYXRhLnN0YXRpY1N0eWxlKSAmJiBpc1VuZGVmKG9sZERhdGEuc3R5bGUpCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjdXIsIG5hbWU7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwogIHZhciBvbGRTdGF0aWNTdHlsZSA9IG9sZERhdGEuc3RhdGljU3R5bGU7CiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZERhdGEubm9ybWFsaXplZFN0eWxlIHx8IG9sZERhdGEuc3R5bGUgfHwge307CgogIC8vIGlmIHN0YXRpYyBzdHlsZSBleGlzdHMsIHN0eWxlYmluZGluZyBhbHJlYWR5IG1lcmdlZCBpbnRvIGl0IHdoZW4gZG9pbmcgbm9ybWFsaXplU3R5bGVEYXRhCiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nOwoKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcodm5vZGUuZGF0YS5zdHlsZSkgfHwge307CgogIC8vIHN0b3JlIG5vcm1hbGl6ZWQgc3R5bGUgdW5kZXIgYSBkaWZmZXJlbnQga2V5IGZvciBuZXh0IGRpZmYKICAvLyBtYWtlIHN1cmUgdG8gY2xvbmUgaXQgaWYgaXQncyByZWFjdGl2ZSwgc2luY2UgdGhlIHVzZXIgbGlrZWx5IHdhbnRzCiAgLy8gdG8gbXV0YXRlIGl0LgogIHZub2RlLmRhdGEubm9ybWFsaXplZFN0eWxlID0gaXNEZWYoc3R5bGUuX19vYl9fKQogICAgPyBleHRlbmQoe30sIHN0eWxlKQogICAgOiBzdHlsZTsKCiAgdmFyIG5ld1N0eWxlID0gZ2V0U3R5bGUodm5vZGUsIHRydWUpOwoKICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHsKICAgIGlmIChpc1VuZGVmKG5ld1N0eWxlW25hbWVdKSkgewogICAgICBzZXRQcm9wKGVsLCBuYW1lLCAnJyk7CiAgICB9CiAgfQogIGZvciAobmFtZSBpbiBuZXdTdHlsZSkgewogICAgY3VyID0gbmV3U3R5bGVbbmFtZV07CiAgICBpZiAoY3VyICE9PSBvbGRTdHlsZVtuYW1lXSkgewogICAgICAvLyBpZTkgc2V0dGluZyB0byBudWxsIGhhcyBubyBlZmZlY3QsIG11c3QgdXNlIGVtcHR5IHN0cmluZwogICAgICBzZXRQcm9wKGVsLCBuYW1lLCBjdXIgPT0gbnVsbCA/ICcnIDogY3VyKTsKICAgIH0KICB9Cn0KCnZhciBzdHlsZSA9IHsKICBjcmVhdGU6IHVwZGF0ZVN0eWxlLAogIHVwZGF0ZTogdXBkYXRlU3R5bGUKfQoKLyogICovCgovKioKICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gYWRkQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbHMpOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgY3VyID0gIiAiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAiICI7CiAgICBpZiAoY3VyLmluZGV4T2YoJyAnICsgY2xzICsgJyAnKSA8IDApIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIChjdXIgKyBjbHMpLnRyaW0oKSk7CiAgICB9CiAgfQp9CgovKioKICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gcmVtb3ZlQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbHMpOwogICAgfQogICAgaWYgKCFlbC5jbGFzc0xpc3QubGVuZ3RoKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgIH0KICB9IGVsc2UgewogICAgdmFyIGN1ciA9ICIgIiArIChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiOwogICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJzsKICAgIHdoaWxlIChjdXIuaW5kZXhPZih0YXIpID49IDApIHsKICAgICAgY3VyID0gY3VyLnJlcGxhY2UodGFyLCAnICcpOwogICAgfQogICAgY3VyID0gY3VyLnRyaW0oKTsKICAgIGlmIChjdXIpIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGN1cik7CiAgICB9IGVsc2UgewogICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uIChkZWYpIHsKICBpZiAoIWRlZikgewogICAgcmV0dXJuCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKHR5cGVvZiBkZWYgPT09ICdvYmplY3QnKSB7CiAgICB2YXIgcmVzID0ge307CiAgICBpZiAoZGVmLmNzcyAhPT0gZmFsc2UpIHsKICAgICAgZXh0ZW5kKHJlcywgYXV0b0Nzc1RyYW5zaXRpb24oZGVmLm5hbWUgfHwgJ3YnKSk7CiAgICB9CiAgICBleHRlbmQocmVzLCBkZWYpOwogICAgcmV0dXJuIHJlcwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZiA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYpCiAgfQp9Cgp2YXIgYXV0b0Nzc1RyYW5zaXRpb24gPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHsKICByZXR1cm4gewogICAgZW50ZXJDbGFzczogKG5hbWUgKyAiLWVudGVyIiksCiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgIi1lbnRlci10byIpLAogICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyAiLWVudGVyLWFjdGl2ZSIpLAogICAgbGVhdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlIiksCiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgIi1sZWF2ZS10byIpLAogICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlLWFjdGl2ZSIpCiAgfQp9KTsKCnZhciBoYXNUcmFuc2l0aW9uID0gaW5Ccm93c2VyICYmICFpc0lFOTsKdmFyIFRSQU5TSVRJT04gPSAndHJhbnNpdGlvbic7CnZhciBBTklNQVRJT04gPSAnYW5pbWF0aW9uJzsKCi8vIFRyYW5zaXRpb24gcHJvcGVydHkvZXZlbnQgc25pZmZpbmcKdmFyIHRyYW5zaXRpb25Qcm9wID0gJ3RyYW5zaXRpb24nOwp2YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3RyYW5zaXRpb25lbmQnOwp2YXIgYW5pbWF0aW9uUHJvcCA9ICdhbmltYXRpb24nOwp2YXIgYW5pbWF0aW9uRW5kRXZlbnQgPSAnYW5pbWF0aW9uZW5kJzsKaWYgKGhhc1RyYW5zaXRpb24pIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAod2luZG93Lm9udHJhbnNpdGlvbmVuZCA9PT0gdW5kZWZpbmVkICYmCiAgICB3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kICE9PSB1bmRlZmluZWQKICApIHsKICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nOwogICAgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnOwogIH0KICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiYKICAgIHdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCAhPT0gdW5kZWZpbmVkCiAgKSB7CiAgICBhbmltYXRpb25Qcm9wID0gJ1dlYmtpdEFuaW1hdGlvbic7CiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnOwogIH0KfQoKLy8gYmluZGluZyB0byB3aW5kb3cgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaG90IHJlbG9hZCB3b3JrIGluIElFIGluIHN0cmljdCBtb2RlCnZhciByYWYgPSBpbkJyb3dzZXIKICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUKICAgID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykKICAgIDogc2V0VGltZW91dAogIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9OwoKZnVuY3Rpb24gbmV4dEZyYW1lIChmbikgewogIHJhZihmdW5jdGlvbiAoKSB7CiAgICByYWYoZm4pOwogIH0pOwp9CgpmdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICB2YXIgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXMgfHwgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcyA9IFtdKTsKICBpZiAodHJhbnNpdGlvbkNsYXNzZXMuaW5kZXhPZihjbHMpIDwgMCkgewogICAgdHJhbnNpdGlvbkNsYXNzZXMucHVzaChjbHMpOwogICAgYWRkQ2xhc3MoZWwsIGNscyk7CiAgfQp9CgpmdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7CiAgICByZW1vdmUoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpOwogIH0KICByZW1vdmVDbGFzcyhlbCwgY2xzKTsKfQoKZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzICgKICBlbCwKICBleHBlY3RlZFR5cGUsCiAgY2IKKSB7CiAgdmFyIHJlZiA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpOwogIHZhciB0eXBlID0gcmVmLnR5cGU7CiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDsKICB2YXIgcHJvcENvdW50ID0gcmVmLnByb3BDb3VudDsKICBpZiAoIXR5cGUpIHsgcmV0dXJuIGNiKCkgfQogIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDsKICB2YXIgZW5kZWQgPSAwOwogIHZhciBlbmQgPSBmdW5jdGlvbiAoKSB7CiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7CiAgICBjYigpOwogIH07CiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHsKICAgIGlmIChlLnRhcmdldCA9PT0gZWwpIHsKICAgICAgaWYgKCsrZW5kZWQgPj0gcHJvcENvdW50KSB7CiAgICAgICAgZW5kKCk7CiAgICAgIH0KICAgIH0KICB9OwogIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7CiAgICAgIGVuZCgpOwogICAgfQogIH0sIHRpbWVvdXQgKyAxKTsKICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7Cn0KCnZhciB0cmFuc2Zvcm1SRSA9IC9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLzsKCmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvIChlbCwgZXhwZWN0ZWRUeXBlKSB7CiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTsKICB2YXIgdHJhbnNpdGlvbkRlbGF5cyA9IHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEZWxheSddLnNwbGl0KCcsICcpOwogIHZhciB0cmFuc2l0aW9uRHVyYXRpb25zID0gc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7CiAgdmFyIHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTsKICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uRHVyYXRpb25zID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRHVyYXRpb24nXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpOwoKICB2YXIgdHlwZTsKICB2YXIgdGltZW91dCA9IDA7CiAgdmFyIHByb3BDb3VudCA9IDA7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gVFJBTlNJVElPTikgewogICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkgewogICAgICB0eXBlID0gVFJBTlNJVElPTjsKICAgICAgdGltZW91dCA9IHRyYW5zaXRpb25UaW1lb3V0OwogICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDsKICAgIH0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gQU5JTUFUSU9OKSB7CiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHsKICAgICAgdHlwZSA9IEFOSU1BVElPTjsKICAgICAgdGltZW91dCA9IGFuaW1hdGlvblRpbWVvdXQ7CiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7CiAgICB9CiAgfSBlbHNlIHsKICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7CiAgICB0eXBlID0gdGltZW91dCA+IDAKICAgICAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQKICAgICAgICA/IFRSQU5TSVRJT04KICAgICAgICA6IEFOSU1BVElPTgogICAgICA6IG51bGw7CiAgICBwcm9wQ291bnQgPSB0eXBlCiAgICAgID8gdHlwZSA9PT0gVFJBTlNJVElPTgogICAgICAgID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgOiAwOwogIH0KICB2YXIgaGFzVHJhbnNmb3JtID0KICAgIHR5cGUgPT09IFRSQU5TSVRJT04gJiYKICAgIHRyYW5zZm9ybVJFLnRlc3Qoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ1Byb3BlcnR5J10pOwogIHJldHVybiB7CiAgICB0eXBlOiB0eXBlLAogICAgdGltZW91dDogdGltZW91dCwKICAgIHByb3BDb3VudDogcHJvcENvdW50LAogICAgaGFzVHJhbnNmb3JtOiBoYXNUcmFuc2Zvcm0KICB9Cn0KCmZ1bmN0aW9uIGdldFRpbWVvdXQgKGRlbGF5cywgZHVyYXRpb25zKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICB3aGlsZSAoZGVsYXlzLmxlbmd0aCA8IGR1cmF0aW9ucy5sZW5ndGgpIHsKICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTsKICB9CgogIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBkdXJhdGlvbnMubWFwKGZ1bmN0aW9uIChkLCBpKSB7CiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKQogIH0pKQp9CgpmdW5jdGlvbiB0b01zIChzKSB7CiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKSkgKiAxMDAwCn0KCi8qICAqLwoKZnVuY3Rpb24gZW50ZXIgKHZub2RlLCB0b2dnbGVEaXNwbGF5KSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHsKICAgIGVsLl9sZWF2ZUNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fbGVhdmVDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsKICAgIHJldHVybgogIH0KCiAgdmFyIGNzcyA9IGRhdGEuY3NzOwogIHZhciB0eXBlID0gZGF0YS50eXBlOwogIHZhciBlbnRlckNsYXNzID0gZGF0YS5lbnRlckNsYXNzOwogIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzczsKICB2YXIgZW50ZXJBY3RpdmVDbGFzcyA9IGRhdGEuZW50ZXJBY3RpdmVDbGFzczsKICB2YXIgYXBwZWFyQ2xhc3MgPSBkYXRhLmFwcGVhckNsYXNzOwogIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzOwogIHZhciBhcHBlYXJBY3RpdmVDbGFzcyA9IGRhdGEuYXBwZWFyQWN0aXZlQ2xhc3M7CiAgdmFyIGJlZm9yZUVudGVyID0gZGF0YS5iZWZvcmVFbnRlcjsKICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyOwogIHZhciBhZnRlckVudGVyID0gZGF0YS5hZnRlckVudGVyOwogIHZhciBlbnRlckNhbmNlbGxlZCA9IGRhdGEuZW50ZXJDYW5jZWxsZWQ7CiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyOwogIHZhciBhcHBlYXIgPSBkYXRhLmFwcGVhcjsKICB2YXIgYWZ0ZXJBcHBlYXIgPSBkYXRhLmFmdGVyQXBwZWFyOwogIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDsKICB2YXIgZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uOwoKICAvLyBhY3RpdmVJbnN0YW5jZSB3aWxsIGFsd2F5cyBiZSB0aGUgPHRyYW5zaXRpb24+IGNvbXBvbmVudCBtYW5hZ2luZyB0aGlzCiAgLy8gdHJhbnNpdGlvbi4gT25lIGVkZ2UgY2FzZSB0byBjaGVjayBpcyB3aGVuIHRoZSA8dHJhbnNpdGlvbj4gaXMgcGxhY2VkCiAgLy8gYXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNoaWxkIGNvbXBvbmVudC4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY2hlY2sKICAvLyA8dHJhbnNpdGlvbj4ncyBwYXJlbnQgZm9yIGFwcGVhciBjaGVjay4KICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlOwogIHZhciB0cmFuc2l0aW9uTm9kZSA9IGFjdGl2ZUluc3RhbmNlLiR2bm9kZTsKICB3aGlsZSAodHJhbnNpdGlvbk5vZGUgJiYgdHJhbnNpdGlvbk5vZGUucGFyZW50KSB7CiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDsKICAgIGNvbnRleHQgPSB0cmFuc2l0aW9uTm9kZS5jb250ZXh0OwogIH0KCiAgdmFyIGlzQXBwZWFyID0gIWNvbnRleHQuX2lzTW91bnRlZCB8fCAhdm5vZGUuaXNSb290SW5zZXJ0OwoKICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBzdGFydENsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyQ2xhc3MKICAgID8gYXBwZWFyQ2xhc3MKICAgIDogZW50ZXJDbGFzczsKICB2YXIgYWN0aXZlQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJBY3RpdmVDbGFzcwogICAgPyBhcHBlYXJBY3RpdmVDbGFzcwogICAgOiBlbnRlckFjdGl2ZUNsYXNzOwogIHZhciB0b0NsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyVG9DbGFzcwogICAgPyBhcHBlYXJUb0NsYXNzCiAgICA6IGVudGVyVG9DbGFzczsKCiAgdmFyIGJlZm9yZUVudGVySG9vayA9IGlzQXBwZWFyCiAgICA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpCiAgICA6IGJlZm9yZUVudGVyOwogIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAodHlwZW9mIGFwcGVhciA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGVhciA6IGVudGVyKQogICAgOiBlbnRlcjsKICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAoYWZ0ZXJBcHBlYXIgfHwgYWZ0ZXJFbnRlcikKICAgIDogYWZ0ZXJFbnRlcjsKICB2YXIgZW50ZXJDYW5jZWxsZWRIb29rID0gaXNBcHBlYXIKICAgID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkKICAgIDogZW50ZXJDYW5jZWxsZWQ7CgogIHZhciBleHBsaWNpdEVudGVyRHVyYXRpb24gPSB0b051bWJlcigKICAgIGlzT2JqZWN0KGR1cmF0aW9uKQogICAgICA/IGR1cmF0aW9uLmVudGVyCiAgICAgIDogZHVyYXRpb24KICApOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV4cGxpY2l0RW50ZXJEdXJhdGlvbiAhPSBudWxsKSB7CiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbiwgJ2VudGVyJywgdm5vZGUpOwogIH0KCiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTsKICB2YXIgdXNlcldhbnRzQ29udHJvbCA9IGdldEhvb2tBcmd1bWVudHNMZW5ndGgoZW50ZXJIb29rKTsKCiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHsKICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgdG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgfQogICAgaWYgKGNiLmNhbmNlbGxlZCkgewogICAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7CiAgICAgIH0KICAgICAgZW50ZXJDYW5jZWxsZWRIb29rICYmIGVudGVyQ2FuY2VsbGVkSG9vayhlbCk7CiAgICB9IGVsc2UgewogICAgICBhZnRlckVudGVySG9vayAmJiBhZnRlckVudGVySG9vayhlbCk7CiAgICB9CiAgICBlbC5fZW50ZXJDYiA9IG51bGw7CiAgfSk7CgogIGlmICghdm5vZGUuZGF0YS5zaG93KSB7CiAgICAvLyByZW1vdmUgcGVuZGluZyBsZWF2ZSBlbGVtZW50IG9uIGVudGVyIGJ5IGluamVjdGluZyBhbiBpbnNlcnQgaG9vawogICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlOwogICAgICB2YXIgcGVuZGluZ05vZGUgPSBwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nICYmIHBhcmVudC5fcGVuZGluZ1t2bm9kZS5rZXldOwogICAgICBpZiAocGVuZGluZ05vZGUgJiYKICAgICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJgogICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYgogICAgICApIHsKICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTsKICAgICAgfQogICAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgICB9KTsKICB9CgogIC8vIHN0YXJ0IGVudGVyIHRyYW5zaXRpb24KICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTsKICBpZiAoZXhwZWN0c0NTUykgewogICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHsKICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpOwogICAgICAgIGlmICghdXNlcldhbnRzQ29udHJvbCkgewogICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdEVudGVyRHVyYXRpb24pKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0RW50ZXJEdXJhdGlvbik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgaWYgKHZub2RlLmRhdGEuc2hvdykgewogICAgdG9nZ2xlRGlzcGxheSAmJiB0b2dnbGVEaXNwbGF5KCk7CiAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgfQoKICBpZiAoIWV4cGVjdHNDU1MgJiYgIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgIGNiKCk7CiAgfQp9CgpmdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikpIHsKICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fZW50ZXJDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7CiAgICByZXR1cm4gcm0oKQogIH0KCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGlzRGVmKGVsLl9sZWF2ZUNiKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgY3NzID0gZGF0YS5jc3M7CiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7CiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7CiAgdmFyIGxlYXZlVG9DbGFzcyA9IGRhdGEubGVhdmVUb0NsYXNzOwogIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzOwogIHZhciBiZWZvcmVMZWF2ZSA9IGRhdGEuYmVmb3JlTGVhdmU7CiAgdmFyIGxlYXZlID0gZGF0YS5sZWF2ZTsKICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTsKICB2YXIgbGVhdmVDYW5jZWxsZWQgPSBkYXRhLmxlYXZlQ2FuY2VsbGVkOwogIHZhciBkZWxheUxlYXZlID0gZGF0YS5kZWxheUxlYXZlOwogIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247CgogIHZhciBleHBlY3RzQ1NTID0gY3NzICE9PSBmYWxzZSAmJiAhaXNJRTk7CiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGxlYXZlKTsKCiAgdmFyIGV4cGxpY2l0TGVhdmVEdXJhdGlvbiA9IHRvTnVtYmVyKAogICAgaXNPYmplY3QoZHVyYXRpb24pCiAgICAgID8gZHVyYXRpb24ubGVhdmUKICAgICAgOiBkdXJhdGlvbgogICk7CgogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZXhwbGljaXRMZWF2ZUR1cmF0aW9uKSkgewogICAgY2hlY2tEdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24sICdsZWF2ZScsIHZub2RlKTsKICB9CgogIHZhciBjYiA9IGVsLl9sZWF2ZUNiID0gb25jZShmdW5jdGlvbiAoKSB7CiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7CiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7CiAgICB9CiAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7CiAgICB9CiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgfQogICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7CiAgICB9IGVsc2UgewogICAgICBybSgpOwogICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpOwogICAgfQogICAgZWwuX2xlYXZlQ2IgPSBudWxsOwogIH0pOwoKICBpZiAoZGVsYXlMZWF2ZSkgewogICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpOwogIH0gZWxzZSB7CiAgICBwZXJmb3JtTGVhdmUoKTsKICB9CgogIGZ1bmN0aW9uIHBlcmZvcm1MZWF2ZSAoKSB7CiAgICAvLyB0aGUgZGVsYXllZCBsZWF2ZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkCiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIHJldHVybgogICAgfQogICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudAogICAgaWYgKCF2bm9kZS5kYXRhLnNob3cpIHsKICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlOwogICAgfQogICAgYmVmb3JlTGVhdmUgJiYgYmVmb3JlTGVhdmUoZWwpOwogICAgaWYgKGV4cGVjdHNDU1MpIHsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTsKICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpOwogICAgICAgIGlmICghY2IuY2FuY2VsbGVkKSB7CiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgICAgICBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24pKSB7CiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpOwogICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7CiAgICAgIGNiKCk7CiAgICB9CiAgfQp9CgovLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGUKZnVuY3Rpb24gY2hlY2tEdXJhdGlvbiAodmFsLCBuYW1lLCB2bm9kZSkgewogIGlmICh0eXBlb2YgdmFsICE9PSAnbnVtYmVyJykgewogICAgd2FybigKICAgICAgIjx0cmFuc2l0aW9uPiBleHBsaWNpdCAiICsgbmFtZSArICIgZHVyYXRpb24gaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gIiArCiAgICAgICJnb3QgIiArIChKU09OLnN0cmluZ2lmeSh2YWwpKSArICIuIiwKICAgICAgdm5vZGUuY29udGV4dAogICAgKTsKICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHsKICAgIHdhcm4oCiAgICAgICI8dHJhbnNpdGlvbj4gZXhwbGljaXQgIiArIG5hbWUgKyAiIGR1cmF0aW9uIGlzIE5hTiAtICIgKwogICAgICAndGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LicsCiAgICAgIHZub2RlLmNvbnRleHQKICAgICk7CiAgfQp9CgpmdW5jdGlvbiBpc1ZhbGlkRHVyYXRpb24gKHZhbCkgewogIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKQp9CgovKioKICogTm9ybWFsaXplIGEgdHJhbnNpdGlvbiBob29rJ3MgYXJndW1lbnQgbGVuZ3RoLiBUaGUgaG9vayBtYXkgYmU6CiAqIC0gYSBtZXJnZWQgaG9vayAoaW52b2tlcikgd2l0aCB0aGUgb3JpZ2luYWwgaW4gLmZucwogKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aCkKICogLSBhIHBsYWluIGZ1bmN0aW9uICgubGVuZ3RoKQogKi8KZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHsKICBpZiAoaXNVbmRlZihmbikpIHsKICAgIHJldHVybiBmYWxzZQogIH0KICB2YXIgaW52b2tlckZucyA9IGZuLmZuczsKICBpZiAoaXNEZWYoaW52b2tlckZucykpIHsKICAgIC8vIGludm9rZXIKICAgIHJldHVybiBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKAogICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpCiAgICAgICAgPyBpbnZva2VyRm5zWzBdCiAgICAgICAgOiBpbnZva2VyRm5zCiAgICApCiAgfSBlbHNlIHsKICAgIHJldHVybiAoZm4uX2xlbmd0aCB8fCBmbi5sZW5ndGgpID4gMQogIH0KfQoKZnVuY3Rpb24gX2VudGVyIChfLCB2bm9kZSkgewogIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgIGVudGVyKHZub2RlKTsKICB9Cn0KCnZhciB0cmFuc2l0aW9uID0gaW5Ccm93c2VyID8gewogIGNyZWF0ZTogX2VudGVyLAogIGFjdGl2YXRlOiBfZW50ZXIsCiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUkJDEgKHZub2RlLCBybSkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgICAgbGVhdmUodm5vZGUsIHJtKTsKICAgIH0gZWxzZSB7CiAgICAgIHJtKCk7CiAgICB9CiAgfQp9IDoge30KCnZhciBwbGF0Zm9ybU1vZHVsZXMgPSBbCiAgYXR0cnMsCiAga2xhc3MsCiAgZXZlbnRzLAogIGRvbVByb3BzLAogIHN0eWxlLAogIHRyYW5zaXRpb24KXQoKLyogICovCgovLyB0aGUgZGlyZWN0aXZlIG1vZHVsZSBzaG91bGQgYmUgYXBwbGllZCBsYXN0LCBhZnRlciBhbGwKLy8gYnVpbHQtaW4gbW9kdWxlcyBoYXZlIGJlZW4gYXBwbGllZC4KdmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTsKCnZhciBwYXRjaCA9IGNyZWF0ZVBhdGNoRnVuY3Rpb24oeyBub2RlT3BzOiBub2RlT3BzLCBtb2R1bGVzOiBtb2R1bGVzIH0pOwoKLyoqCiAqIE5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBsaWtlIGF0dGFjaGluZwogKiBwcm9wZXJ0aWVzIHRvIEVsZW1lbnRzLgogKi8KCi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwppZiAoaXNJRTkpIHsKICAvLyBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L2ludGVybmV0LWV4cGxvcmVyLTktb25pbnB1dC8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgaWYgKGVsICYmIGVsLnZtb2RlbCkgewogICAgICB0cmlnZ2VyKGVsLCAnaW5wdXQnKTsKICAgIH0KICB9KTsKfQoKdmFyIGRpcmVjdGl2ZSA9IHsKICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVm5vZGUpIHsKICAgIGlmICh2bm9kZS50YWcgPT09ICdzZWxlY3QnKSB7CiAgICAgIC8vICM2OTAzCiAgICAgIGlmIChvbGRWbm9kZS5lbG0gJiYgIW9sZFZub2RlLmVsbS5fdk9wdGlvbnMpIHsKICAgICAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGRpcmVjdGl2ZS5jb21wb25lbnRVcGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICB9CiAgICAgIGVsLl92T3B0aW9ucyA9IFtdLm1hcC5jYWxsKGVsLm9wdGlvbnMsIGdldFZhbHVlKTsKICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGlzVGV4dElucHV0VHlwZShlbC50eXBlKSkgewogICAgICBlbC5fdk1vZGlmaWVycyA9IGJpbmRpbmcubW9kaWZpZXJzOwogICAgICBpZiAoIWJpbmRpbmcubW9kaWZpZXJzLmxhenkpIHsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpOwogICAgICAgIC8vIFNhZmFyaSA8IDEwLjIgJiBVSVdlYlZpZXcgZG9lc24ndCBmaXJlIGNvbXBvc2l0aW9uZW5kIHdoZW4KICAgICAgICAvLyBzd2l0Y2hpbmcgZm9jdXMgYmVmb3JlIGNvbmZpcm1pbmcgY29tcG9zaXRpb24gY2hvaWNlCiAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZQogICAgICAgIC8vIGZpcmVzICJjaGFuZ2UiIGluc3RlYWQgb2YgImlucHV0IiBvbiBhdXRvY29tcGxldGUuCiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKGlzSUU5KSB7CiAgICAgICAgICBlbC52bW9kZWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIGNvbXBvbmVudFVwZGF0ZWQ6IGZ1bmN0aW9uIGNvbXBvbmVudFVwZGF0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSkgewogICAgaWYgKHZub2RlLnRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICAvLyBpbiBjYXNlIHRoZSBvcHRpb25zIHJlbmRlcmVkIGJ5IHYtZm9yIGhhdmUgY2hhbmdlZCwKICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHRoZSB2YWx1ZSBpcyBvdXQtb2Ytc3luYyB3aXRoIHRoZSByZW5kZXJlZCBvcHRpb25zLgogICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmcKICAgICAgLy8gb3B0aW9uIGluIHRoZSBET00uCiAgICAgIHZhciBwcmV2T3B0aW9ucyA9IGVsLl92T3B0aW9uczsKICAgICAgdmFyIGN1ck9wdGlvbnMgPSBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7CiAgICAgIGlmIChjdXJPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG8sIGkpIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHByZXZPcHRpb25zW2ldKTsgfSkpIHsKICAgICAgICAvLyB0cmlnZ2VyIGNoYW5nZSBldmVudCBpZgogICAgICAgIC8vIG5vIG1hdGNoaW5nIG9wdGlvbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlCiAgICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlCiAgICAgICAgICA/IGJpbmRpbmcudmFsdWUuc29tZShmdW5jdGlvbiAodikgeyByZXR1cm4gaGFzTm9NYXRjaGluZ09wdGlvbih2LCBjdXJPcHRpb25zKTsgfSkKICAgICAgICAgIDogYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSAmJiBoYXNOb01hdGNoaW5nT3B0aW9uKGJpbmRpbmcudmFsdWUsIGN1ck9wdGlvbnMpOwogICAgICAgIGlmIChuZWVkUmVzZXQpIHsKICAgICAgICAgIHRyaWdnZXIoZWwsICdjaGFuZ2UnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgpmdW5jdGlvbiBzZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0lFIHx8IGlzRWRnZSkgewogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIGFjdHVhbGx5U2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZtKTsKICAgIH0sIDApOwogIH0KfQoKZnVuY3Rpb24gYWN0dWFsbHlTZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgdmFyIHZhbHVlID0gYmluZGluZy52YWx1ZTsKICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlOwogIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICI8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw9XCIiICsgKGJpbmRpbmcuZXhwcmVzc2lvbikgKyAiXCI+ICIgKwogICAgICAiZXhwZWN0cyBhbiBBcnJheSB2YWx1ZSBmb3IgaXRzIGJpbmRpbmcsIGJ1dCBnb3QgIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSksCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciBzZWxlY3RlZCwgb3B0aW9uOwogIGZvciAodmFyIGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07CiAgICBpZiAoaXNNdWx0aXBsZSkgewogICAgICBzZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgZ2V0VmFsdWUob3B0aW9uKSkgPiAtMTsKICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHsKICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7CiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIHsKICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgICAgfQogICAgfQogIH0KICBpZiAoIWlzTXVsdGlwbGUpIHsKICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTsKICB9Cn0KCmZ1bmN0aW9uIGhhc05vTWF0Y2hpbmdPcHRpb24gKHZhbHVlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG9wdGlvbnMuZXZlcnkoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHZhbHVlKTsgfSkKfQoKZnVuY3Rpb24gZ2V0VmFsdWUgKG9wdGlvbikgewogIHJldHVybiAnX3ZhbHVlJyBpbiBvcHRpb24KICAgID8gb3B0aW9uLl92YWx1ZQogICAgOiBvcHRpb24udmFsdWUKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0IChlKSB7CiAgZS50YXJnZXQuY29tcG9zaW5nID0gdHJ1ZTsKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZCAoZSkgewogIC8vIHByZXZlbnQgdHJpZ2dlcmluZyBhbiBpbnB1dCBldmVudCBmb3Igbm8gcmVhc29uCiAgaWYgKCFlLnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuIH0KICBlLnRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTsKICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTsKfQoKZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHsKICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7CiAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7CiAgZWwuZGlzcGF0Y2hFdmVudChlKTsKfQoKLyogICovCgovLyByZWN1cnNpdmVseSBzZWFyY2ggZm9yIHBvc3NpYmxlIHRyYW5zaXRpb24gZGVmaW5lZCBpbnNpZGUgdGhlIGNvbXBvbmVudCByb290CmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7CiAgcmV0dXJuIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmICghdm5vZGUuZGF0YSB8fCAhdm5vZGUuZGF0YS50cmFuc2l0aW9uKQogICAgPyBsb2NhdGVOb2RlKHZub2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkKICAgIDogdm5vZGUKfQoKdmFyIHNob3cgPSB7CiAgYmluZDogZnVuY3Rpb24gYmluZCAoZWwsIHJlZiwgdm5vZGUpIHsKICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTsKCiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPQogICAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7CiAgICBpZiAodmFsdWUgJiYgdHJhbnNpdGlvbiQkMSkgewogICAgICB2bm9kZS5kYXRhLnNob3cgPSB0cnVlOwogICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkgewogICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gb3JpZ2luYWxEaXNwbGF5IDogJ25vbmUnOwogICAgfQogIH0sCgogIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkgewogICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlOwogICAgdmFyIG9sZFZhbHVlID0gcmVmLm9sZFZhbHVlOwoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKSB7IHJldHVybiB9CiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIGlmICh0cmFuc2l0aW9uJCQxKSB7CiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGVudGVyKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgOiAnbm9uZSc7CiAgICB9CiAgfSwKCiAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQgKAogICAgZWwsCiAgICBiaW5kaW5nLAogICAgdm5vZGUsCiAgICBvbGRWbm9kZSwKICAgIGlzRGVzdHJveQogICkgewogICAgaWYgKCFpc0Rlc3Ryb3kpIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheTsKICAgIH0KICB9Cn0KCnZhciBwbGF0Zm9ybURpcmVjdGl2ZXMgPSB7CiAgbW9kZWw6IGRpcmVjdGl2ZSwKICBzaG93OiBzaG93Cn0KCi8qICAqLwoKLy8gUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBhIHNpbmdsZSBlbGVtZW50L2NvbXBvbmVudC4KLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpCgp2YXIgdHJhbnNpdGlvblByb3BzID0gewogIG5hbWU6IFN0cmluZywKICBhcHBlYXI6IEJvb2xlYW4sCiAgY3NzOiBCb29sZWFuLAogIG1vZGU6IFN0cmluZywKICB0eXBlOiBTdHJpbmcsCiAgZW50ZXJDbGFzczogU3RyaW5nLAogIGxlYXZlQ2xhc3M6IFN0cmluZywKICBlbnRlclRvQ2xhc3M6IFN0cmluZywKICBsZWF2ZVRvQ2xhc3M6IFN0cmluZywKICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsCiAgbGVhdmVBY3RpdmVDbGFzczogU3RyaW5nLAogIGFwcGVhckNsYXNzOiBTdHJpbmcsCiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZywKICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsCiAgZHVyYXRpb246IFtOdW1iZXIsIFN0cmluZywgT2JqZWN0XQp9OwoKLy8gaW4gY2FzZSB0aGUgY2hpbGQgaXMgYWxzbyBhbiBhYnN0cmFjdCBjb21wb25lbnQsIGUuZy4gPGtlZXAtYWxpdmU+Ci8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkCmZ1bmN0aW9uIGdldFJlYWxDaGlsZCAodm5vZGUpIHsKICB2YXIgY29tcE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHJldHVybiBnZXRSZWFsQ2hpbGQoZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChjb21wT3B0aW9ucy5jaGlsZHJlbikpCiAgfSBlbHNlIHsKICAgIHJldHVybiB2bm9kZQogIH0KfQoKZnVuY3Rpb24gZXh0cmFjdFRyYW5zaXRpb25EYXRhIChjb21wKSB7CiAgdmFyIGRhdGEgPSB7fTsKICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7CiAgLy8gcHJvcHMKICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5wcm9wc0RhdGEpIHsKICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTsKICB9CiAgLy8gZXZlbnRzLgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kcwogIHZhciBsaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgZm9yICh2YXIga2V5JDEgaW4gbGlzdGVuZXJzKSB7CiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdOwogIH0KICByZXR1cm4gZGF0YQp9CgpmdW5jdGlvbiBwbGFjZWhvbGRlciAoaCwgcmF3Q2hpbGQpIHsKICBpZiAoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHJhd0NoaWxkLnRhZykpIHsKICAgIHJldHVybiBoKCdrZWVwLWFsaXZlJywgewogICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEKICAgIH0pCiAgfQp9CgpmdW5jdGlvbiBoYXNQYXJlbnRUcmFuc2l0aW9uICh2bm9kZSkgewogIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7CiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBpc1NhbWVDaGlsZCAoY2hpbGQsIG9sZENoaWxkKSB7CiAgcmV0dXJuIG9sZENoaWxkLmtleSA9PT0gY2hpbGQua2V5ICYmIG9sZENoaWxkLnRhZyA9PT0gY2hpbGQudGFnCn0KCnZhciBUcmFuc2l0aW9uID0gewogIG5hbWU6ICd0cmFuc2l0aW9uJywKICBwcm9wczogdHJhbnNpdGlvblByb3BzLAogIGFic3RyYWN0OiB0cnVlLAoKICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdDsKICAgIGlmICghY2hpbGRyZW4pIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcykKICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH0pOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigKICAgICAgICAnPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudC4gVXNlICcgKwogICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsCiAgICAgICAgdGhpcy4kcGFyZW50CiAgICAgICk7CiAgICB9CgogICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7CgogICAgLy8gd2FybiBpbnZhbGlkIG1vZGUKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJwogICAgKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLAogICAgICAgIHRoaXMuJHBhcmVudAogICAgICApOwogICAgfQoKICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdOwoKICAgIC8vIGlmIHRoaXMgaXMgYSBjb21wb25lbnQgcm9vdCBub2RlIGFuZCB0aGUgY29tcG9uZW50J3MKICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLgogICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7CiAgICAgIHJldHVybiByYXdDaGlsZAogICAgfQoKICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gZGF0YSB0byBjaGlsZAogICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZQogICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCFjaGlsZCkgewogICAgICByZXR1cm4gcmF3Q2hpbGQKICAgIH0KCiAgICBpZiAodGhpcy5fbGVhdmluZykgewogICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICB9CgogICAgLy8gZW5zdXJlIGEga2V5IHRoYXQgaXMgdW5pcXVlIHRvIHRoZSB2bm9kZSB0eXBlIGFuZCB0byB0aGlzIHRyYW5zaXRpb24KICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXMKICAgIC8vIGR1cmluZyBlbnRlcmluZy4KICAgIHZhciBpZCA9ICJfX3RyYW5zaXRpb24tIiArICh0aGlzLl91aWQpICsgIi0iOwogICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGwKICAgICAgPyBjaGlsZC5pc0NvbW1lbnQKICAgICAgICA/IGlkICsgJ2NvbW1lbnQnCiAgICAgICAgOiBpZCArIGNoaWxkLnRhZwogICAgICA6IGlzUHJpbWl0aXZlKGNoaWxkLmtleSkKICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KQogICAgICAgIDogY2hpbGQua2V5OwoKICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7CiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTsKICAgIHZhciBvbGRDaGlsZCA9IGdldFJlYWxDaGlsZChvbGRSYXdDaGlsZCk7CgogICAgLy8gbWFyayB2LXNob3cKICAgIC8vIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gbW9kdWxlIGNhbiBoYW5kIG92ZXIgdGhlIGNvbnRyb2wgdG8gdGhlIGRpcmVjdGl2ZQogICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5uYW1lID09PSAnc2hvdyc7IH0pKSB7CiAgICAgIGNoaWxkLmRhdGEuc2hvdyA9IHRydWU7CiAgICB9CgogICAgaWYgKAogICAgICBvbGRDaGlsZCAmJgogICAgICBvbGRDaGlsZC5kYXRhICYmCiAgICAgICFpc1NhbWVDaGlsZChjaGlsZCwgb2xkQ2hpbGQpICYmCiAgICAgICFpc0FzeW5jUGxhY2Vob2xkZXIob2xkQ2hpbGQpICYmCiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlCiAgICAgICEob2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UgJiYgb2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkKICAgICkgewogICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmUKICAgICAgLy8gaW1wb3J0YW50IGZvciBkeW5hbWljIHRyYW5zaXRpb25zIQogICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkLmRhdGEudHJhbnNpdGlvbiA9IGV4dGVuZCh7fSwgZGF0YSk7CiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGUKICAgICAgaWYgKG1vZGUgPT09ICdvdXQtaW4nKSB7CiAgICAgICAgLy8gcmV0dXJuIHBsYWNlaG9sZGVyIG5vZGUgYW5kIHF1ZXVlIHVwZGF0ZSB3aGVuIGxlYXZlIGZpbmlzaGVzCiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2FmdGVyTGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aGlzJDEuX2xlYXZpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHsKICAgICAgICBpZiAoaXNBc3luY1BsYWNlaG9sZGVyKGNoaWxkKSkgewogICAgICAgICAgcmV0dXJuIG9sZFJhd0NoaWxkCiAgICAgICAgfQogICAgICAgIHZhciBkZWxheWVkTGVhdmU7CiAgICAgICAgdmFyIHBlcmZvcm1MZWF2ZSA9IGZ1bmN0aW9uICgpIHsgZGVsYXllZExlYXZlKCk7IH07CiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpOwogICAgICAgIG1lcmdlVk5vZGVIb29rKGRhdGEsICdlbnRlckNhbmNlbGxlZCcsIHBlcmZvcm1MZWF2ZSk7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2RlbGF5TGVhdmUnLCBmdW5jdGlvbiAobGVhdmUpIHsgZGVsYXllZExlYXZlID0gbGVhdmU7IH0pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJhd0NoaWxkCiAgfQp9CgovKiAgKi8KCi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgbGlzdCBpdGVtcy4KLy8gc3VwcG9ydHMgbW92ZSB0cmFuc2l0aW9ucyB1c2luZyB0aGUgRkxJUCB0ZWNobmlxdWUuCgovLyBCZWNhdXNlIHRoZSB2ZG9tJ3MgY2hpbGRyZW4gdXBkYXRlIGFsZ29yaXRobSBpcyAidW5zdGFibGUiIC0gaS5lLgovLyBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcmVtb3ZlZCBlbGVtZW50cywKLy8gd2UgZm9yY2UgdHJhbnNpdGlvbi1ncm91cCB0byB1cGRhdGUgaXRzIGNoaWxkcmVuIGludG8gdHdvIHBhc3NlczoKLy8gaW4gdGhlIGZpcnN0IHBhc3MsIHdlIHJlbW92ZSBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQsCi8vIHRyaWdnZXJpbmcgdGhlaXIgbGVhdmluZyB0cmFuc2l0aW9uOyBpbiB0aGUgc2Vjb25kIHBhc3MsIHdlIGluc2VydC9tb3ZlCi8vIGludG8gdGhlIGZpbmFsIGRlc2lyZWQgc3RhdGUuIFRoaXMgd2F5IGluIHRoZSBzZWNvbmQgcGFzcyByZW1vdmVkCi8vIG5vZGVzIHdpbGwgcmVtYWluIHdoZXJlIHRoZXkgc2hvdWxkIGJlLgoKdmFyIHByb3BzID0gZXh0ZW5kKHsKICB0YWc6IFN0cmluZywKICBtb3ZlQ2xhc3M6IFN0cmluZwp9LCB0cmFuc2l0aW9uUHJvcHMpOwoKZGVsZXRlIHByb3BzLm1vZGU7Cgp2YXIgVHJhbnNpdGlvbkdyb3VwID0gewogIHByb3BzOiBwcm9wcywKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHsKICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7CiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdOwogICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTsKICAgICAgaWYgKGMudGFnKSB7CiAgICAgICAgaWYgKGMua2V5ICE9IG51bGwgJiYgU3RyaW5nKGMua2V5KS5pbmRleE9mKCdfX3ZsaXN0JykgIT09IDApIHsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7CiAgICAgICAgICBtYXBbYy5rZXldID0gYwogICAgICAgICAgOyhjLmRhdGEgfHwgKGMuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25EYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgb3B0cyA9IGMuY29tcG9uZW50T3B0aW9uczsKICAgICAgICAgIHZhciBuYW1lID0gb3B0cyA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnIHx8ICcnKSA6IGMudGFnOwogICAgICAgICAgd2FybigoIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8IiArIG5hbWUgKyAiPiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJldkNoaWxkcmVuKSB7CiAgICAgIHZhciBrZXB0ID0gW107CiAgICAgIHZhciByZW1vdmVkID0gW107CiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7CiAgICAgICAgdmFyIGMkMSA9IHByZXZDaGlsZHJlbltpJDFdOwogICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTsKICAgICAgICBjJDEuZGF0YS5wb3MgPSBjJDEuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmIChtYXBbYyQxLmtleV0pIHsKICAgICAgICAgIGtlcHQucHVzaChjJDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZW1vdmVkLnB1c2goYyQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5rZXB0ID0gaCh0YWcsIG51bGwsIGtlcHQpOwogICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkOwogICAgfQoKICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pCiAgfSwKCiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkgewogICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzcwogICAgdGhpcy5fX3BhdGNoX18oCiAgICAgIHRoaXMuX3Zub2RlLAogICAgICB0aGlzLmtlcHQsCiAgICAgIGZhbHNlLCAvLyBoeWRyYXRpbmcKICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpCiAgICApOwogICAgdGhpcy5fdm5vZGUgPSB0aGlzLmtlcHQ7CiAgfSwKCiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCAoKSB7CiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjsKICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7CiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5oYXNNb3ZlKGNoaWxkcmVuWzBdLmVsbSwgbW92ZUNsYXNzKSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3ZSBkaXZpZGUgdGhlIHdvcmsgaW50byB0aHJlZSBsb29wcyB0byBhdm9pZCBtaXhpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMKICAgIC8vIGluIGVhY2ggaXRlcmF0aW9uIC0gd2hpY2ggaGVscHMgcHJldmVudCBsYXlvdXQgdGhyYXNoaW5nLgogICAgY2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7CiAgICBjaGlsZHJlbi5mb3JFYWNoKHJlY29yZFBvc2l0aW9uKTsKICAgIGNoaWxkcmVuLmZvckVhY2goYXBwbHlUcmFuc2xhdGlvbik7CgogICAgLy8gZm9yY2UgcmVmbG93IHRvIHB1dCBldmVyeXRoaW5nIGluIHBvc2l0aW9uCiAgICAvLyBhc3NpZ24gdG8gdGhpcyB0byBhdm9pZCBiZWluZyByZW1vdmVkIGluIHRyZWUtc2hha2luZwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICB0aGlzLl9yZWZsb3cgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDsKCiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmRhdGEubW92ZWQpIHsKICAgICAgICB2YXIgZWwgPSBjLmVsbTsKICAgICAgICB2YXIgcyA9IGVsLnN0eWxlOwogICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTsKICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJzsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmRFdmVudCwgZWwuX21vdmVDYiA9IGZ1bmN0aW9uIGNiIChlKSB7CiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7CiAgICAgICAgICAgIGVsLl9tb3ZlQ2IgPSBudWxsOwogICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0sCgogIG1ldGhvZHM6IHsKICAgIGhhc01vdmU6IGZ1bmN0aW9uIGhhc01vdmUgKGVsLCBtb3ZlQ2xhc3MpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikgewogICAgICAgIHJldHVybiBmYWxzZQogICAgICB9CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAodGhpcy5faGFzTW92ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNNb3ZlCiAgICAgIH0KICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBtb3ZlIGNsYXNzIGFwcGxpZWQgaGFzCiAgICAgIC8vIENTUyB0cmFuc2l0aW9ucy4gU2luY2UgdGhlIGVsZW1lbnQgbWF5IGJlIGluc2lkZSBhbiBlbnRlcmluZwogICAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlCiAgICAgIC8vIGFsbCBvdGhlciB0cmFuc2l0aW9uIGNsYXNzZXMgYXBwbGllZCB0byBlbnN1cmUgb25seSB0aGUgbW92ZSBjbGFzcwogICAgICAvLyBpcyBhcHBsaWVkLgogICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTsKICAgICAgaWYgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcykgewogICAgICAgIGVsLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHsgcmVtb3ZlQ2xhc3MoY2xvbmUsIGNscyk7IH0pOwogICAgICB9CiAgICAgIGFkZENsYXNzKGNsb25lLCBtb3ZlQ2xhc3MpOwogICAgICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB0aGlzLiRlbC5hcHBlbmRDaGlsZChjbG9uZSk7CiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpOwogICAgICB0aGlzLiRlbC5yZW1vdmVDaGlsZChjbG9uZSk7CiAgICAgIHJldHVybiAodGhpcy5faGFzTW92ZSA9IGluZm8uaGFzVHJhbnNmb3JtKQogICAgfQogIH0KfQoKZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMgKGMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX21vdmVDYikgewogICAgYy5lbG0uX21vdmVDYigpOwogIH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX2VudGVyQ2IpIHsKICAgIGMuZWxtLl9lbnRlckNiKCk7CiAgfQp9CgpmdW5jdGlvbiByZWNvcmRQb3NpdGlvbiAoYykgewogIGMuZGF0YS5uZXdQb3MgPSBjLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKfQoKZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbiAoYykgewogIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zOwogIHZhciBuZXdQb3MgPSBjLmRhdGEubmV3UG9zOwogIHZhciBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7CiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7CiAgaWYgKGR4IHx8IGR5KSB7CiAgICBjLmRhdGEubW92ZWQgPSB0cnVlOwogICAgdmFyIHMgPSBjLmVsbS5zdHlsZTsKICAgIHMudHJhbnNmb3JtID0gcy5XZWJraXRUcmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBkeCArICJweCwiICsgZHkgKyAicHgpIjsKICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJzsKICB9Cn0KCnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7CiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbiwKICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cAp9CgovKiAgKi8KCi8vIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMgdXRpbHMKVnVlLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyID0gaXNSZXNlcnZlZEF0dHI7ClZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZ2V0VGFnTmFtZXNwYWNlOwpWdWUuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50OwoKLy8gaW5zdGFsbCBwbGF0Zm9ybSBydW50aW1lIGRpcmVjdGl2ZXMgJiBjb21wb25lbnRzCmV4dGVuZChWdWUub3B0aW9ucy5kaXJlY3RpdmVzLCBwbGF0Zm9ybURpcmVjdGl2ZXMpOwpleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgcGxhdGZvcm1Db21wb25lbnRzKTsKCi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb24KVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gPSBpbkJyb3dzZXIgPyBwYXRjaCA6IG5vb3A7CgovLyBwdWJsaWMgbW91bnQgbWV0aG9kClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDsKICByZXR1cm4gbW91bnRDb21wb25lbnQodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8vIGRldnRvb2xzIGdsb2JhbCBob29rCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmlmIChpbkJyb3dzZXIpIHsKICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIGlmIChjb25maWcuZGV2dG9vbHMpIHsKICAgICAgaWYgKGRldnRvb2xzKSB7CiAgICAgICAgZGV2dG9vbHMuZW1pdCgnaW5pdCcsIFZ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgICAgaXNDaHJvbWUKICAgICAgKSB7CiAgICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oCiAgICAgICAgICAnRG93bmxvYWQgdGhlIFZ1ZSBEZXZ0b29scyBleHRlbnNpb24gZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6XG4nICsKICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWRldnRvb2xzJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgIGNvbmZpZy5wcm9kdWN0aW9uVGlwICE9PSBmYWxzZSAmJgogICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcKICAgICkgewogICAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/ICdpbmZvJyA6ICdsb2cnXSgKICAgICAgICAiWW91IGFyZSBydW5uaW5nIFZ1ZSBpbiBkZXZlbG9wbWVudCBtb2RlLlxuIiArCiAgICAgICAgIk1ha2Ugc3VyZSB0byB0dXJuIG9uIHByb2R1Y3Rpb24gbW9kZSB3aGVuIGRlcGxveWluZyBmb3IgcHJvZHVjdGlvbi5cbiIgKwogICAgICAgICJTZWUgbW9yZSB0aXBzIGF0IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2RlcGxveW1lbnQuaHRtbCIKICAgICAgKTsKICAgIH0KICB9LCAwKTsKfQoKLyogICovCgp2YXIgZGVmYXVsdFRhZ1JFID0gL1x7XHsoKD86LnxcbikrPylcfVx9L2c7CnZhciByZWdleEVzY2FwZVJFID0gL1stLiorP14ke30oKXxbXF1cL1xcXS9nOwoKdmFyIGJ1aWxkUmVnZXggPSBjYWNoZWQoZnVuY3Rpb24gKGRlbGltaXRlcnMpIHsKICB2YXIgb3BlbiA9IGRlbGltaXRlcnNbMF0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHZhciBjbG9zZSA9IGRlbGltaXRlcnNbMV0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHJldHVybiBuZXcgUmVnRXhwKG9wZW4gKyAnKCg/Oi58XFxuKSs/KScgKyBjbG9zZSwgJ2cnKQp9KTsKCgoKZnVuY3Rpb24gcGFyc2VUZXh0ICgKICB0ZXh0LAogIGRlbGltaXRlcnMKKSB7CiAgdmFyIHRhZ1JFID0gZGVsaW1pdGVycyA/IGJ1aWxkUmVnZXgoZGVsaW1pdGVycykgOiBkZWZhdWx0VGFnUkU7CiAgaWYgKCF0YWdSRS50ZXN0KHRleHQpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIHRva2VucyA9IFtdOwogIHZhciByYXdUb2tlbnMgPSBbXTsKICB2YXIgbGFzdEluZGV4ID0gdGFnUkUubGFzdEluZGV4ID0gMDsKICB2YXIgbWF0Y2gsIGluZGV4LCB0b2tlblZhbHVlOwogIHdoaWxlICgobWF0Y2ggPSB0YWdSRS5leGVjKHRleHQpKSkgewogICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgIC8vIHB1c2ggdGV4dCB0b2tlbgogICAgaWYgKGluZGV4ID4gbGFzdEluZGV4KSB7CiAgICAgIHJhd1Rva2Vucy5wdXNoKHRva2VuVmFsdWUgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTsKICAgICAgdG9rZW5zLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW5WYWx1ZSkpOwogICAgfQogICAgLy8gdGFnIHRva2VuCiAgICB2YXIgZXhwID0gcGFyc2VGaWx0ZXJzKG1hdGNoWzFdLnRyaW0oKSk7CiAgICB0b2tlbnMucHVzaCgoIl9zKCIgKyBleHAgKyAiKSIpKTsKICAgIHJhd1Rva2Vucy5wdXNoKHsgJ0BiaW5kaW5nJzogZXhwIH0pOwogICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CiAgfQogIGlmIChsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgcmF3VG9rZW5zLnB1c2godG9rZW5WYWx1ZSA9IHRleHQuc2xpY2UobGFzdEluZGV4KSk7CiAgICB0b2tlbnMucHVzaChKU09OLnN0cmluZ2lmeSh0b2tlblZhbHVlKSk7CiAgfQogIHJldHVybiB7CiAgICBleHByZXNzaW9uOiB0b2tlbnMuam9pbignKycpLAogICAgdG9rZW5zOiByYXdUb2tlbnMKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gdHJhbnNmb3JtTm9kZSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljQ2xhc3MgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnY2xhc3MnKTsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHN0YXRpY0NsYXNzKSB7CiAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY0NsYXNzLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgaWYgKHJlcykgewogICAgICB3YXJuKAogICAgICAgICJjbGFzcz1cIiIgKyBzdGF0aWNDbGFzcyArICJcIjogIiArCiAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArCiAgICAgICAgJ1VzZSB2LWJpbmQgb3IgdGhlIGNvbG9uIHNob3J0aGFuZCBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgJyArCiAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBjbGFzcz0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpjbGFzcz0idmFsIj4uJwogICAgICApOwogICAgfQogIH0KICBpZiAoc3RhdGljQ2xhc3MpIHsKICAgIGVsLnN0YXRpY0NsYXNzID0gSlNPTi5zdHJpbmdpZnkoc3RhdGljQ2xhc3MpOwogIH0KICB2YXIgY2xhc3NCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdjbGFzcycsIGZhbHNlIC8qIGdldFN0YXRpYyAqLyk7CiAgaWYgKGNsYXNzQmluZGluZykgewogICAgZWwuY2xhc3NCaW5kaW5nID0gY2xhc3NCaW5kaW5nOwogIH0KfQoKZnVuY3Rpb24gZ2VuRGF0YSAoZWwpIHsKICB2YXIgZGF0YSA9ICcnOwogIGlmIChlbC5zdGF0aWNDbGFzcykgewogICAgZGF0YSArPSAic3RhdGljQ2xhc3M6IiArIChlbC5zdGF0aWNDbGFzcykgKyAiLCI7CiAgfQogIGlmIChlbC5jbGFzc0JpbmRpbmcpIHsKICAgIGRhdGEgKz0gImNsYXNzOiIgKyAoZWwuY2xhc3NCaW5kaW5nKSArICIsIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIGtsYXNzJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNDbGFzcyddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUsCiAgZ2VuRGF0YTogZ2VuRGF0YQp9CgovKiAgKi8KCmZ1bmN0aW9uIHRyYW5zZm9ybU5vZGUkMSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljU3R5bGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc3R5bGUnKTsKICBpZiAoc3RhdGljU3R5bGUpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY1N0eWxlLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgICBpZiAocmVzKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJzdHlsZT1cIiIgKyBzdGF0aWNTdHlsZSArICJcIjogIiArCiAgICAgICAgICAnSW50ZXJwb2xhdGlvbiBpbnNpZGUgYXR0cmlidXRlcyBoYXMgYmVlbiByZW1vdmVkLiAnICsKICAgICAgICAgICdVc2Ugdi1iaW5kIG9yIHRoZSBjb2xvbiBzaG9ydGhhbmQgaW5zdGVhZC4gRm9yIGV4YW1wbGUsICcgKwogICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBzdHlsZT0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpzdHlsZT0idmFsIj4uJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGVsLnN0YXRpY1N0eWxlID0gSlNPTi5zdHJpbmdpZnkocGFyc2VTdHlsZVRleHQoc3RhdGljU3R5bGUpKTsKICB9CgogIHZhciBzdHlsZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3N0eWxlJywgZmFsc2UgLyogZ2V0U3RhdGljICovKTsKICBpZiAoc3R5bGVCaW5kaW5nKSB7CiAgICBlbC5zdHlsZUJpbmRpbmcgPSBzdHlsZUJpbmRpbmc7CiAgfQp9CgpmdW5jdGlvbiBnZW5EYXRhJDEgKGVsKSB7CiAgdmFyIGRhdGEgPSAnJzsKICBpZiAoZWwuc3RhdGljU3R5bGUpIHsKICAgIGRhdGEgKz0gInN0YXRpY1N0eWxlOiIgKyAoZWwuc3RhdGljU3R5bGUpICsgIiwiOwogIH0KICBpZiAoZWwuc3R5bGVCaW5kaW5nKSB7CiAgICBkYXRhICs9ICJzdHlsZTooIiArIChlbC5zdHlsZUJpbmRpbmcpICsgIiksIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIHN0eWxlJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNTdHlsZSddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUkMSwKICBnZW5EYXRhOiBnZW5EYXRhJDEKfQoKLyogICovCgp2YXIgZGVjb2RlcjsKCnZhciBoZSA9IHsKICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZSAoaHRtbCkgewogICAgZGVjb2RlciA9IGRlY29kZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkZWNvZGVyLmlubmVySFRNTCA9IGh0bWw7CiAgICByZXR1cm4gZGVjb2Rlci50ZXh0Q29udGVudAogIH0KfQoKLyogICovCgp2YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoCiAgJ2FyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLCcgKwogICdsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicKKTsKCi8vIEVsZW1lbnRzIHRoYXQgeW91IGNhbiwgaW50ZW50aW9uYWxseSwgbGVhdmUgb3BlbgovLyAoYW5kIHdoaWNoIGNsb3NlIHRoZW1zZWx2ZXMpCnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcCgKICAnY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZScKKTsKCi8vIEhUTUw1IHRhZ3MgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sI2VsZW1lbnRzLTMKLy8gUGhyYXNpbmcgQ29udGVudCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNwaHJhc2luZy1jb250ZW50CnZhciBpc05vblBocmFzaW5nVGFnID0gbWFrZU1hcCgKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLCcgKwogICdkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sJyArCiAgJ2gxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLCcgKwogICdvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsJyArCiAgJ3RpdGxlLHRyLHRyYWNrJwopOwoKLyoqCiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGl0J3MgbW9zdGx5IHZlbmRvciBjb2RlLgogKi8KCi8qIQogKiBIVE1MIFBhcnNlciBCeSBKb2huIFJlc2lnIChlam9obi5vcmcpCiAqIE1vZGlmaWVkIGJ5IEp1cml5ICJrYW5nYXgiIFpheXRzZXYKICogT3JpZ2luYWwgY29kZSBieSBFcmlrIEFydmlkc3NvbiwgTW96aWxsYSBQdWJsaWMgTGljZW5zZQogKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qcwogKi8KCi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlcwp2YXIgYXR0cmlidXRlID0gL15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vOwovLyBjb3VsZCB1c2UgaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhtbC1uYW1lcy0xOTk5MDExNC8jTlQtUU5hbWUKLy8gYnV0IGZvciBWdWUgdGVtcGxhdGVzIHdlIGNhbiBlbmZvcmNlIGEgc2ltcGxlIGNoYXJzZXQKdmFyIG5jbmFtZSA9ICdbYS16QS1aX11bXFx3XFwtXFwuXSonOwp2YXIgcW5hbWVDYXB0dXJlID0gIigoPzoiICsgbmNuYW1lICsgIlxcOik/IiArIG5jbmFtZSArICIpIjsKdmFyIHN0YXJ0VGFnT3BlbiA9IG5ldyBSZWdFeHAoKCJePCIgKyBxbmFtZUNhcHR1cmUpKTsKdmFyIHN0YXJ0VGFnQ2xvc2UgPSAvXlxzKihcLz8pPi87CnZhciBlbmRUYWcgPSBuZXcgUmVnRXhwKCgiXjxcXC8iICsgcW5hbWVDYXB0dXJlICsgIltePl0qPiIpKTsKdmFyIGRvY3R5cGUgPSAvXjwhRE9DVFlQRSBbXj5dKz4vaTsKLy8gIzcyOTg6IGVzY2FwZSAtIHRvIGF2b2lkIGJlaW5nIHBhc2VkIGFzIEhUTUwgY29tbWVudCB3aGVuIGlubGluZWQgaW4gcGFnZQp2YXIgY29tbWVudCA9IC9ePCFcLS0vOwp2YXIgY29uZGl0aW9uYWxDb21tZW50ID0gL148IVxbLzsKCnZhciBJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOID0gZmFsc2U7Cid4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobSwgZykgewogIElTX1JFR0VYX0NBUFRVUklOR19CUk9LRU4gPSBnID09PSAnJzsKfSk7CgovLyBTcGVjaWFsIEVsZW1lbnRzIChjYW4gY29udGFpbiBhbnl0aGluZykKdmFyIGlzUGxhaW5UZXh0RWxlbWVudCA9IG1ha2VNYXAoJ3NjcmlwdCxzdHlsZSx0ZXh0YXJlYScsIHRydWUpOwp2YXIgcmVDYWNoZSA9IHt9OwoKdmFyIGRlY29kaW5nTWFwID0gewogICcmbHQ7JzogJzwnLAogICcmZ3Q7JzogJz4nLAogICcmcXVvdDsnOiAnIicsCiAgJyZhbXA7JzogJyYnLAogICcmIzEwOyc6ICdcbicsCiAgJyYjOTsnOiAnXHQnCn07CnZhciBlbmNvZGVkQXR0ciA9IC8mKD86bHR8Z3R8cXVvdHxhbXApOy9nOwp2YXIgZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgPSAvJig/Omx0fGd0fHF1b3R8YW1wfCMxMHwjOSk7L2c7CgovLyAjNTk5Mgp2YXIgaXNJZ25vcmVOZXdsaW5lVGFnID0gbWFrZU1hcCgncHJlLHRleHRhcmVhJywgdHJ1ZSk7CnZhciBzaG91bGRJZ25vcmVGaXJzdE5ld2xpbmUgPSBmdW5jdGlvbiAodGFnLCBodG1sKSB7IHJldHVybiB0YWcgJiYgaXNJZ25vcmVOZXdsaW5lVGFnKHRhZykgJiYgaHRtbFswXSA9PT0gJ1xuJzsgfTsKCmZ1bmN0aW9uIGRlY29kZUF0dHIgKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykgewogIHZhciByZSA9IHNob3VsZERlY29kZU5ld2xpbmVzID8gZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgOiBlbmNvZGVkQXR0cjsKICByZXR1cm4gdmFsdWUucmVwbGFjZShyZSwgZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBkZWNvZGluZ01hcFttYXRjaF07IH0pCn0KCmZ1bmN0aW9uIHBhcnNlSFRNTCAoaHRtbCwgb3B0aW9ucykgewogIHZhciBzdGFjayA9IFtdOwogIHZhciBleHBlY3RIVE1MID0gb3B0aW9ucy5leHBlY3RIVE1MOwogIHZhciBpc1VuYXJ5VGFnJCQxID0gb3B0aW9ucy5pc1VuYXJ5VGFnIHx8IG5vOwogIHZhciBjYW5CZUxlZnRPcGVuVGFnJCQxID0gb3B0aW9ucy5jYW5CZUxlZnRPcGVuVGFnIHx8IG5vOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxhc3QsIGxhc3RUYWc7CiAgd2hpbGUgKGh0bWwpIHsKICAgIGxhc3QgPSBodG1sOwogICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBpbiBhIHBsYWludGV4dCBjb250ZW50IGVsZW1lbnQgbGlrZSBzY3JpcHQvc3R5bGUKICAgIGlmICghbGFzdFRhZyB8fCAhaXNQbGFpblRleHRFbGVtZW50KGxhc3RUYWcpKSB7CiAgICAgIHZhciB0ZXh0RW5kID0gaHRtbC5pbmRleE9mKCc8Jyk7CiAgICAgIGlmICh0ZXh0RW5kID09PSAwKSB7CiAgICAgICAgLy8gQ29tbWVudDoKICAgICAgICBpZiAoY29tbWVudC50ZXN0KGh0bWwpKSB7CiAgICAgICAgICB2YXIgY29tbWVudEVuZCA9IGh0bWwuaW5kZXhPZignLS0+Jyk7CgogICAgICAgICAgaWYgKGNvbW1lbnRFbmQgPj0gMCkgewogICAgICAgICAgICBpZiAob3B0aW9ucy5zaG91bGRLZWVwQ29tbWVudCkgewogICAgICAgICAgICAgIG9wdGlvbnMuY29tbWVudChodG1sLnN1YnN0cmluZyg0LCBjb21tZW50RW5kKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZShjb21tZW50RW5kICsgMyk7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmRpdGlvbmFsX2NvbW1lbnQjRG93bmxldmVsLXJldmVhbGVkX2NvbmRpdGlvbmFsX2NvbW1lbnQKICAgICAgICBpZiAoY29uZGl0aW9uYWxDb21tZW50LnRlc3QoaHRtbCkpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25hbEVuZCA9IGh0bWwuaW5kZXhPZignXT4nKTsKCiAgICAgICAgICBpZiAoY29uZGl0aW9uYWxFbmQgPj0gMCkgewogICAgICAgICAgICBhZHZhbmNlKGNvbmRpdGlvbmFsRW5kICsgMik7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEb2N0eXBlOgogICAgICAgIHZhciBkb2N0eXBlTWF0Y2ggPSBodG1sLm1hdGNoKGRvY3R5cGUpOwogICAgICAgIGlmIChkb2N0eXBlTWF0Y2gpIHsKICAgICAgICAgIGFkdmFuY2UoZG9jdHlwZU1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgLy8gRW5kIHRhZzoKICAgICAgICB2YXIgZW5kVGFnTWF0Y2ggPSBodG1sLm1hdGNoKGVuZFRhZyk7CiAgICAgICAgaWYgKGVuZFRhZ01hdGNoKSB7CiAgICAgICAgICB2YXIgY3VySW5kZXggPSBpbmRleDsKICAgICAgICAgIGFkdmFuY2UoZW5kVGFnTWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgIHBhcnNlRW5kVGFnKGVuZFRhZ01hdGNoWzFdLCBjdXJJbmRleCwgaW5kZXgpOwogICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIC8vIFN0YXJ0IHRhZzoKICAgICAgICB2YXIgc3RhcnRUYWdNYXRjaCA9IHBhcnNlU3RhcnRUYWcoKTsKICAgICAgICBpZiAoc3RhcnRUYWdNYXRjaCkgewogICAgICAgICAgaGFuZGxlU3RhcnRUYWcoc3RhcnRUYWdNYXRjaCk7CiAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKGxhc3RUYWcsIGh0bWwpKSB7CiAgICAgICAgICAgIGFkdmFuY2UoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHRleHQgPSAodm9pZCAwKSwgcmVzdCA9ICh2b2lkIDApLCBuZXh0ID0gKHZvaWQgMCk7CiAgICAgIGlmICh0ZXh0RW5kID49IDApIHsKICAgICAgICByZXN0ID0gaHRtbC5zbGljZSh0ZXh0RW5kKTsKICAgICAgICB3aGlsZSAoCiAgICAgICAgICAhZW5kVGFnLnRlc3QocmVzdCkgJiYKICAgICAgICAgICFzdGFydFRhZ09wZW4udGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbW1lbnQudGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbmRpdGlvbmFsQ29tbWVudC50ZXN0KHJlc3QpCiAgICAgICAgKSB7CiAgICAgICAgICAvLyA8IGluIHBsYWluIHRleHQsIGJlIGZvcmdpdmluZyBhbmQgdHJlYXQgaXQgYXMgdGV4dAogICAgICAgICAgbmV4dCA9IHJlc3QuaW5kZXhPZignPCcsIDEpOwogICAgICAgICAgaWYgKG5leHQgPCAwKSB7IGJyZWFrIH0KICAgICAgICAgIHRleHRFbmQgKz0gbmV4dDsKICAgICAgICAgIHJlc3QgPSBodG1sLnNsaWNlKHRleHRFbmQpOwogICAgICAgIH0KICAgICAgICB0ZXh0ID0gaHRtbC5zdWJzdHJpbmcoMCwgdGV4dEVuZCk7CiAgICAgICAgYWR2YW5jZSh0ZXh0RW5kKTsKICAgICAgfQoKICAgICAgaWYgKHRleHRFbmQgPCAwKSB7CiAgICAgICAgdGV4dCA9IGh0bWw7CiAgICAgICAgaHRtbCA9ICcnOwogICAgICB9CgogICAgICBpZiAob3B0aW9ucy5jaGFycyAmJiB0ZXh0KSB7CiAgICAgICAgb3B0aW9ucy5jaGFycyh0ZXh0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGVuZFRhZ0xlbmd0aCA9IDA7CiAgICAgIHZhciBzdGFja2VkVGFnID0gbGFzdFRhZy50b0xvd2VyQ2FzZSgpOwogICAgICB2YXIgcmVTdGFja2VkVGFnID0gcmVDYWNoZVtzdGFja2VkVGFnXSB8fCAocmVDYWNoZVtzdGFja2VkVGFnXSA9IG5ldyBSZWdFeHAoJyhbXFxzXFxTXSo/KSg8LycgKyBzdGFja2VkVGFnICsgJ1tePl0qPiknLCAnaScpKTsKICAgICAgdmFyIHJlc3QkMSA9IGh0bWwucmVwbGFjZShyZVN0YWNrZWRUYWcsIGZ1bmN0aW9uIChhbGwsIHRleHQsIGVuZFRhZykgewogICAgICAgIGVuZFRhZ0xlbmd0aCA9IGVuZFRhZy5sZW5ndGg7CiAgICAgICAgaWYgKCFpc1BsYWluVGV4dEVsZW1lbnQoc3RhY2tlZFRhZykgJiYgc3RhY2tlZFRhZyAhPT0gJ25vc2NyaXB0JykgewogICAgICAgICAgdGV4dCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCAnJDEnKSAvLyAjNzI5OAogICAgICAgICAgICAucmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csICckMScpOwogICAgICAgIH0KICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKHN0YWNrZWRUYWcsIHRleHQpKSB7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnMpIHsKICAgICAgICAgIG9wdGlvbnMuY2hhcnModGV4dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJwogICAgICB9KTsKICAgICAgaW5kZXggKz0gaHRtbC5sZW5ndGggLSByZXN0JDEubGVuZ3RoOwogICAgICBodG1sID0gcmVzdCQxOwogICAgICBwYXJzZUVuZFRhZyhzdGFja2VkVGFnLCBpbmRleCAtIGVuZFRhZ0xlbmd0aCwgaW5kZXgpOwogICAgfQoKICAgIGlmIChodG1sID09PSBsYXN0KSB7CiAgICAgIG9wdGlvbnMuY2hhcnMgJiYgb3B0aW9ucy5jaGFycyhodG1sKTsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiAhc3RhY2subGVuZ3RoICYmIG9wdGlvbnMud2FybikgewogICAgICAgIG9wdGlvbnMud2FybigoIk1hbC1mb3JtYXR0ZWQgdGFnIGF0IGVuZCBvZiB0ZW1wbGF0ZTogXCIiICsgaHRtbCArICJcIiIpKTsKICAgICAgfQogICAgICBicmVhawogICAgfQogIH0KCiAgLy8gQ2xlYW4gdXAgYW55IHJlbWFpbmluZyB0YWdzCiAgcGFyc2VFbmRUYWcoKTsKCiAgZnVuY3Rpb24gYWR2YW5jZSAobikgewogICAgaW5kZXggKz0gbjsKICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhuKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3RhcnRUYWcgKCkgewogICAgdmFyIHN0YXJ0ID0gaHRtbC5tYXRjaChzdGFydFRhZ09wZW4pOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIHZhciBtYXRjaCA9IHsKICAgICAgICB0YWdOYW1lOiBzdGFydFsxXSwKICAgICAgICBhdHRyczogW10sCiAgICAgICAgc3RhcnQ6IGluZGV4CiAgICAgIH07CiAgICAgIGFkdmFuY2Uoc3RhcnRbMF0ubGVuZ3RoKTsKICAgICAgdmFyIGVuZCwgYXR0cjsKICAgICAgd2hpbGUgKCEoZW5kID0gaHRtbC5tYXRjaChzdGFydFRhZ0Nsb3NlKSkgJiYgKGF0dHIgPSBodG1sLm1hdGNoKGF0dHJpYnV0ZSkpKSB7CiAgICAgICAgYWR2YW5jZShhdHRyWzBdLmxlbmd0aCk7CiAgICAgICAgbWF0Y2guYXR0cnMucHVzaChhdHRyKTsKICAgICAgfQogICAgICBpZiAoZW5kKSB7CiAgICAgICAgbWF0Y2gudW5hcnlTbGFzaCA9IGVuZFsxXTsKICAgICAgICBhZHZhbmNlKGVuZFswXS5sZW5ndGgpOwogICAgICAgIG1hdGNoLmVuZCA9IGluZGV4OwogICAgICAgIHJldHVybiBtYXRjaAogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVTdGFydFRhZyAobWF0Y2gpIHsKICAgIHZhciB0YWdOYW1lID0gbWF0Y2gudGFnTmFtZTsKICAgIHZhciB1bmFyeVNsYXNoID0gbWF0Y2gudW5hcnlTbGFzaDsKCiAgICBpZiAoZXhwZWN0SFRNTCkgewogICAgICBpZiAobGFzdFRhZyA9PT0gJ3AnICYmIGlzTm9uUGhyYXNpbmdUYWcodGFnTmFtZSkpIHsKICAgICAgICBwYXJzZUVuZFRhZyhsYXN0VGFnKTsKICAgICAgfQogICAgICBpZiAoY2FuQmVMZWZ0T3BlblRhZyQkMSh0YWdOYW1lKSAmJiBsYXN0VGFnID09PSB0YWdOYW1lKSB7CiAgICAgICAgcGFyc2VFbmRUYWcodGFnTmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdW5hcnkgPSBpc1VuYXJ5VGFnJCQxKHRhZ05hbWUpIHx8ICEhdW5hcnlTbGFzaDsKCiAgICB2YXIgbCA9IG1hdGNoLmF0dHJzLmxlbmd0aDsKICAgIHZhciBhdHRycyA9IG5ldyBBcnJheShsKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBhcmdzID0gbWF0Y2guYXR0cnNbaV07CiAgICAgIC8vIGhhY2tpc2ggd29yayBhcm91bmQgRkYgYnVnIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTM2OTc3OAogICAgICBpZiAoSVNfUkVHRVhfQ0FQVFVSSU5HX0JST0tFTiAmJiBhcmdzWzBdLmluZGV4T2YoJyIiJykgPT09IC0xKSB7CiAgICAgICAgaWYgKGFyZ3NbM10gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzNdOyB9CiAgICAgICAgaWYgKGFyZ3NbNF0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzRdOyB9CiAgICAgICAgaWYgKGFyZ3NbNV0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzVdOyB9CiAgICAgIH0KICAgICAgdmFyIHZhbHVlID0gYXJnc1szXSB8fCBhcmdzWzRdIHx8IGFyZ3NbNV0gfHwgJyc7CiAgICAgIHZhciBzaG91bGREZWNvZGVOZXdsaW5lcyA9IHRhZ05hbWUgPT09ICdhJyAmJiBhcmdzWzFdID09PSAnaHJlZicKICAgICAgICA/IG9wdGlvbnMuc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmCiAgICAgICAgOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzOwogICAgICBhdHRyc1tpXSA9IHsKICAgICAgICBuYW1lOiBhcmdzWzFdLAogICAgICAgIHZhbHVlOiBkZWNvZGVBdHRyKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykKICAgICAgfTsKICAgIH0KCiAgICBpZiAoIXVuYXJ5KSB7CiAgICAgIHN0YWNrLnB1c2goeyB0YWc6IHRhZ05hbWUsIGxvd2VyQ2FzZWRUYWc6IHRhZ05hbWUudG9Mb3dlckNhc2UoKSwgYXR0cnM6IGF0dHJzIH0pOwogICAgICBsYXN0VGFnID0gdGFnTmFtZTsKICAgIH0KCiAgICBpZiAob3B0aW9ucy5zdGFydCkgewogICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIGF0dHJzLCB1bmFyeSwgbWF0Y2guc3RhcnQsIG1hdGNoLmVuZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZUVuZFRhZyAodGFnTmFtZSwgc3RhcnQsIGVuZCkgewogICAgdmFyIHBvcywgbG93ZXJDYXNlZFRhZ05hbWU7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgeyBzdGFydCA9IGluZGV4OyB9CiAgICBpZiAoZW5kID09IG51bGwpIHsgZW5kID0gaW5kZXg7IH0KCiAgICBpZiAodGFnTmFtZSkgewogICAgICBsb3dlckNhc2VkVGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIH0KCiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG9wZW5lZCB0YWcgb2YgdGhlIHNhbWUgdHlwZQogICAgaWYgKHRhZ05hbWUpIHsKICAgICAgZm9yIChwb3MgPSBzdGFjay5sZW5ndGggLSAxOyBwb3MgPj0gMDsgcG9zLS0pIHsKICAgICAgICBpZiAoc3RhY2tbcG9zXS5sb3dlckNhc2VkVGFnID09PSBsb3dlckNhc2VkVGFnTmFtZSkgewogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIG5vIHRhZyBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhbiBzaG9wCiAgICAgIHBvcyA9IDA7CiAgICB9CgogICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrCiAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IHBvczsgaS0tKSB7CiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgKGkgPiBwb3MgfHwgIXRhZ05hbWUpICYmCiAgICAgICAgICBvcHRpb25zLndhcm4KICAgICAgICApIHsKICAgICAgICAgIG9wdGlvbnMud2FybigKICAgICAgICAgICAgKCJ0YWcgPCIgKyAoc3RhY2tbaV0udGFnKSArICI+IGhhcyBubyBtYXRjaGluZyBlbmQgdGFnLiIpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy5lbmQpIHsKICAgICAgICAgIG9wdGlvbnMuZW5kKHN0YWNrW2ldLnRhZywgc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZW1vdmUgdGhlIG9wZW4gZWxlbWVudHMgZnJvbSB0aGUgc3RhY2sKICAgICAgc3RhY2subGVuZ3RoID0gcG9zOwogICAgICBsYXN0VGFnID0gcG9zICYmIHN0YWNrW3BvcyAtIDFdLnRhZzsKICAgIH0gZWxzZSBpZiAobG93ZXJDYXNlZFRhZ05hbWUgPT09ICdicicpIHsKICAgICAgaWYgKG9wdGlvbnMuc3RhcnQpIHsKICAgICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIFtdLCB0cnVlLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChsb3dlckNhc2VkVGFnTmFtZSA9PT0gJ3AnKSB7CiAgICAgIGlmIChvcHRpb25zLnN0YXJ0KSB7CiAgICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBbXSwgZmFsc2UsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmVuZCkgewogICAgICAgIG9wdGlvbnMuZW5kKHRhZ05hbWUsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciBvblJFID0gL15AfF52LW9uOi87CnZhciBkaXJSRSA9IC9edi18XkB8XjovOwp2YXIgZm9yQWxpYXNSRSA9IC8oW15dKj8pXHMrKD86aW58b2YpXHMrKFteXSopLzsKdmFyIGZvckl0ZXJhdG9yUkUgPSAvLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLzsKdmFyIHN0cmlwUGFyZW5zUkUgPSAvXlwofFwpJC9nOwoKdmFyIGFyZ1JFID0gLzooLiopJC87CnZhciBiaW5kUkUgPSAvXjp8XnYtYmluZDovOwp2YXIgbW9kaWZpZXJSRSA9IC9cLlteLl0rL2c7Cgp2YXIgZGVjb2RlSFRNTENhY2hlZCA9IGNhY2hlZChoZS5kZWNvZGUpOwoKLy8gY29uZmlndXJhYmxlIHN0YXRlCnZhciB3YXJuJDI7CnZhciBkZWxpbWl0ZXJzOwp2YXIgdHJhbnNmb3JtczsKdmFyIHByZVRyYW5zZm9ybXM7CnZhciBwb3N0VHJhbnNmb3JtczsKdmFyIHBsYXRmb3JtSXNQcmVUYWc7CnZhciBwbGF0Zm9ybU11c3RVc2VQcm9wOwp2YXIgcGxhdGZvcm1HZXRUYWdOYW1lc3BhY2U7CgoKCmZ1bmN0aW9uIGNyZWF0ZUFTVEVsZW1lbnQgKAogIHRhZywKICBhdHRycywKICBwYXJlbnQKKSB7CiAgcmV0dXJuIHsKICAgIHR5cGU6IDEsCiAgICB0YWc6IHRhZywKICAgIGF0dHJzTGlzdDogYXR0cnMsCiAgICBhdHRyc01hcDogbWFrZUF0dHJzTWFwKGF0dHJzKSwKICAgIHBhcmVudDogcGFyZW50LAogICAgY2hpbGRyZW46IFtdCiAgfQp9CgovKioKICogQ29udmVydCBIVE1MIHN0cmluZyB0byBBU1QuCiAqLwpmdW5jdGlvbiBwYXJzZSAoCiAgdGVtcGxhdGUsCiAgb3B0aW9ucwopIHsKICB3YXJuJDIgPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CgogIHBsYXRmb3JtSXNQcmVUYWcgPSBvcHRpb25zLmlzUHJlVGFnIHx8IG5vOwogIHBsYXRmb3JtTXVzdFVzZVByb3AgPSBvcHRpb25zLm11c3RVc2VQcm9wIHx8IG5vOwogIHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlID0gb3B0aW9ucy5nZXRUYWdOYW1lc3BhY2UgfHwgbm87CgogIHRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3RyYW5zZm9ybU5vZGUnKTsKICBwcmVUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwcmVUcmFuc2Zvcm1Ob2RlJyk7CiAgcG9zdFRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3Bvc3RUcmFuc2Zvcm1Ob2RlJyk7CgogIGRlbGltaXRlcnMgPSBvcHRpb25zLmRlbGltaXRlcnM7CgogIHZhciBzdGFjayA9IFtdOwogIHZhciBwcmVzZXJ2ZVdoaXRlc3BhY2UgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSAhPT0gZmFsc2U7CiAgdmFyIHJvb3Q7CiAgdmFyIGN1cnJlbnRQYXJlbnQ7CiAgdmFyIGluVlByZSA9IGZhbHNlOwogIHZhciBpblByZSA9IGZhbHNlOwogIHZhciB3YXJuZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gd2Fybk9uY2UgKG1zZykgewogICAgaWYgKCF3YXJuZWQpIHsKICAgICAgd2FybmVkID0gdHJ1ZTsKICAgICAgd2FybiQyKG1zZyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbG9zZUVsZW1lbnQgKGVsZW1lbnQpIHsKICAgIC8vIGNoZWNrIHByZSBzdGF0ZQogICAgaWYgKGVsZW1lbnQucHJlKSB7CiAgICAgIGluVlByZSA9IGZhbHNlOwogICAgfQogICAgaWYgKHBsYXRmb3JtSXNQcmVUYWcoZWxlbWVudC50YWcpKSB7CiAgICAgIGluUHJlID0gZmFsc2U7CiAgICB9CiAgICAvLyBhcHBseSBwb3N0LXRyYW5zZm9ybXMKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zdFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgcG9zdFRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucyk7CiAgICB9CiAgfQoKICBwYXJzZUhUTUwodGVtcGxhdGUsIHsKICAgIHdhcm46IHdhcm4kMiwKICAgIGV4cGVjdEhUTUw6IG9wdGlvbnMuZXhwZWN0SFRNTCwKICAgIGlzVW5hcnlUYWc6IG9wdGlvbnMuaXNVbmFyeVRhZywKICAgIGNhbkJlTGVmdE9wZW5UYWc6IG9wdGlvbnMuY2FuQmVMZWZ0T3BlblRhZywKICAgIHNob3VsZERlY29kZU5ld2xpbmVzOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzLAogICAgc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiwKICAgIHNob3VsZEtlZXBDb21tZW50OiBvcHRpb25zLmNvbW1lbnRzLAogICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0ICh0YWcsIGF0dHJzLCB1bmFyeSkgewogICAgICAvLyBjaGVjayBuYW1lc3BhY2UuCiAgICAgIC8vIGluaGVyaXQgcGFyZW50IG5zIGlmIHRoZXJlIGlzIG9uZQogICAgICB2YXIgbnMgPSAoY3VycmVudFBhcmVudCAmJiBjdXJyZW50UGFyZW50Lm5zKSB8fCBwbGF0Zm9ybUdldFRhZ05hbWVzcGFjZSh0YWcpOwoKICAgICAgLy8gaGFuZGxlIElFIHN2ZyBidWcKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmIChpc0lFICYmIG5zID09PSAnc3ZnJykgewogICAgICAgIGF0dHJzID0gZ3VhcmRJRVNWR0J1ZyhhdHRycyk7CiAgICAgIH0KCiAgICAgIHZhciBlbGVtZW50ID0gY3JlYXRlQVNURWxlbWVudCh0YWcsIGF0dHJzLCBjdXJyZW50UGFyZW50KTsKICAgICAgaWYgKG5zKSB7CiAgICAgICAgZWxlbWVudC5ucyA9IG5zOwogICAgICB9CgogICAgICBpZiAoaXNGb3JiaWRkZW5UYWcoZWxlbWVudCkgJiYgIWlzU2VydmVyUmVuZGVyaW5nKCkpIHsKICAgICAgICBlbGVtZW50LmZvcmJpZGRlbiA9IHRydWU7CiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4kMigKICAgICAgICAgICdUZW1wbGF0ZXMgc2hvdWxkIG9ubHkgYmUgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgdGhlIHN0YXRlIHRvIHRoZSAnICsKICAgICAgICAgICdVSS4gQXZvaWQgcGxhY2luZyB0YWdzIHdpdGggc2lkZS1lZmZlY3RzIGluIHlvdXIgdGVtcGxhdGVzLCBzdWNoIGFzICcgKwogICAgICAgICAgIjwiICsgdGFnICsgIj4iICsgJywgYXMgdGhleSB3aWxsIG5vdCBiZSBwYXJzZWQuJwogICAgICAgICk7CiAgICAgIH0KCiAgICAgIC8vIGFwcGx5IHByZS10cmFuc2Zvcm1zCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlVHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGVsZW1lbnQgPSBwcmVUcmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgICAgIH0KCiAgICAgIGlmICghaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1ByZShlbGVtZW50KTsKICAgICAgICBpZiAoZWxlbWVudC5wcmUpIHsKICAgICAgICAgIGluVlByZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwbGF0Zm9ybUlzUHJlVGFnKGVsZW1lbnQudGFnKSkgewogICAgICAgIGluUHJlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1Jhd0F0dHJzKGVsZW1lbnQpOwogICAgICB9IGVsc2UgaWYgKCFlbGVtZW50LnByb2Nlc3NlZCkgewogICAgICAgIC8vIHN0cnVjdHVyYWwgZGlyZWN0aXZlcwogICAgICAgIHByb2Nlc3NGb3IoZWxlbWVudCk7CiAgICAgICAgcHJvY2Vzc0lmKGVsZW1lbnQpOwogICAgICAgIHByb2Nlc3NPbmNlKGVsZW1lbnQpOwogICAgICAgIC8vIGVsZW1lbnQtc2NvcGUgc3R1ZmYKICAgICAgICBwcm9jZXNzRWxlbWVudChlbGVtZW50LCBvcHRpb25zKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2hlY2tSb290Q29uc3RyYWludHMgKGVsKSB7CiAgICAgICAgewogICAgICAgICAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnIHx8IGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8IiArIChlbC50YWcpICsgIj4gYXMgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlIGl0IG1heSAiICsKICAgICAgICAgICAgICAnY29udGFpbiBtdWx0aXBsZSBub2Rlcy4nCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZWwuYXR0cnNNYXAuaGFzT3duUHJvcGVydHkoJ3YtZm9yJykpIHsKICAgICAgICAgICAgd2Fybk9uY2UoCiAgICAgICAgICAgICAgJ0Nhbm5vdCB1c2Ugdi1mb3Igb24gc3RhdGVmdWwgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlICcgKwogICAgICAgICAgICAgICdpdCByZW5kZXJzIG11bHRpcGxlIGVsZW1lbnRzLicKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIHRyZWUgbWFuYWdlbWVudAogICAgICBpZiAoIXJvb3QpIHsKICAgICAgICByb290ID0gZWxlbWVudDsKICAgICAgICBjaGVja1Jvb3RDb25zdHJhaW50cyhyb290KTsKICAgICAgfSBlbHNlIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgLy8gYWxsb3cgcm9vdCBlbGVtZW50cyB3aXRoIHYtaWYsIHYtZWxzZS1pZiBhbmQgdi1lbHNlCiAgICAgICAgaWYgKHJvb3QuaWYgJiYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkpIHsKICAgICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKGVsZW1lbnQpOwogICAgICAgICAgYWRkSWZDb25kaXRpb24ocm9vdCwgewogICAgICAgICAgICBleHA6IGVsZW1lbnQuZWxzZWlmLAogICAgICAgICAgICBibG9jazogZWxlbWVudAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm5PbmNlKAogICAgICAgICAgICAiQ29tcG9uZW50IHRlbXBsYXRlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gIiArCiAgICAgICAgICAgICJJZiB5b3UgYXJlIHVzaW5nIHYtaWYgb24gbXVsdGlwbGUgZWxlbWVudHMsICIgKwogICAgICAgICAgICAidXNlIHYtZWxzZS1pZiB0byBjaGFpbiB0aGVtIGluc3RlYWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgJiYgIWVsZW1lbnQuZm9yYmlkZGVuKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkgewogICAgICAgICAgcHJvY2Vzc0lmQ29uZGl0aW9ucyhlbGVtZW50LCBjdXJyZW50UGFyZW50KTsKICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc2xvdFNjb3BlKSB7IC8vIHNjb3BlZCBzbG90CiAgICAgICAgICBjdXJyZW50UGFyZW50LnBsYWluID0gZmFsc2U7CiAgICAgICAgICB2YXIgbmFtZSA9IGVsZW1lbnQuc2xvdFRhcmdldCB8fCAnImRlZmF1bHQiJzsoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyB8fCAoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyA9IHt9KSlbbmFtZV0gPSBlbGVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goZWxlbWVudCk7CiAgICAgICAgICBlbGVtZW50LnBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdW5hcnkpIHsKICAgICAgICBjdXJyZW50UGFyZW50ID0gZWxlbWVudDsKICAgICAgICBzdGFjay5wdXNoKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgICAgfQogICAgfSwKCiAgICBlbmQ6IGZ1bmN0aW9uIGVuZCAoKSB7CiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgIHZhciBlbGVtZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIHZhciBsYXN0Tm9kZSA9IGVsZW1lbnQuY2hpbGRyZW5bZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDMgJiYgbGFzdE5vZGUudGV4dCA9PT0gJyAnICYmICFpblByZSkgewogICAgICAgIGVsZW1lbnQuY2hpbGRyZW4ucG9wKCk7CiAgICAgIH0KICAgICAgLy8gcG9wIHN0YWNrCiAgICAgIHN0YWNrLmxlbmd0aCAtPSAxOwogICAgICBjdXJyZW50UGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgIH0sCgogICAgY2hhcnM6IGZ1bmN0aW9uIGNoYXJzICh0ZXh0KSB7CiAgICAgIGlmICghY3VycmVudFBhcmVudCkgewogICAgICAgIHsKICAgICAgICAgIGlmICh0ZXh0ID09PSB0ZW1wbGF0ZSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAnQ29tcG9uZW50IHRlbXBsYXRlIHJlcXVpcmVzIGEgcm9vdCBlbGVtZW50LCByYXRoZXIgdGhhbiBqdXN0IHRleHQuJwogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIGlmICgodGV4dCA9IHRleHQudHJpbSgpKSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAoInRleHQgXCIiICsgdGV4dCArICJcIiBvdXRzaWRlIHJvb3QgZWxlbWVudCB3aWxsIGJlIGlnbm9yZWQuIikKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgLy8gSUUgdGV4dGFyZWEgcGxhY2Vob2xkZXIgYnVnCiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoaXNJRSAmJgogICAgICAgIGN1cnJlbnRQYXJlbnQudGFnID09PSAndGV4dGFyZWEnICYmCiAgICAgICAgY3VycmVudFBhcmVudC5hdHRyc01hcC5wbGFjZWhvbGRlciA9PT0gdGV4dAogICAgICApIHsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50UGFyZW50LmNoaWxkcmVuOwogICAgICB0ZXh0ID0gaW5QcmUgfHwgdGV4dC50cmltKCkKICAgICAgICA/IGlzVGV4dFRhZyhjdXJyZW50UGFyZW50KSA/IHRleHQgOiBkZWNvZGVIVE1MQ2FjaGVkKHRleHQpCiAgICAgICAgLy8gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGlmIGl0cyBub3QgcmlnaHQgYWZ0ZXIgYSBzdGFydGluZyB0YWcKICAgICAgICA6IHByZXNlcnZlV2hpdGVzcGFjZSAmJiBjaGlsZHJlbi5sZW5ndGggPyAnICcgOiAnJzsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIGlmICghaW5WUHJlICYmIHRleHQgIT09ICcgJyAmJiAocmVzID0gcGFyc2VUZXh0KHRleHQsIGRlbGltaXRlcnMpKSkgewogICAgICAgICAgY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHR5cGU6IDIsCiAgICAgICAgICAgIGV4cHJlc3Npb246IHJlcy5leHByZXNzaW9uLAogICAgICAgICAgICB0b2tlbnM6IHJlcy50b2tlbnMsCiAgICAgICAgICAgIHRleHQ6IHRleHQKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAodGV4dCAhPT0gJyAnIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dCAhPT0gJyAnKSB7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgdHlwZTogMywKICAgICAgICAgICAgdGV4dDogdGV4dAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY29tbWVudDogZnVuY3Rpb24gY29tbWVudCAodGV4dCkgewogICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goewogICAgICAgIHR5cGU6IDMsCiAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICBpc0NvbW1lbnQ6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJvb3QKfQoKZnVuY3Rpb24gcHJvY2Vzc1ByZSAoZWwpIHsKICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtcHJlJykgIT0gbnVsbCkgewogICAgZWwucHJlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSYXdBdHRycyAoZWwpIHsKICB2YXIgbCA9IGVsLmF0dHJzTGlzdC5sZW5ndGg7CiAgaWYgKGwpIHsKICAgIHZhciBhdHRycyA9IGVsLmF0dHJzID0gbmV3IEFycmF5KGwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgYXR0cnNbaV0gPSB7CiAgICAgICAgbmFtZTogZWwuYXR0cnNMaXN0W2ldLm5hbWUsCiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVsLmF0dHJzTGlzdFtpXS52YWx1ZSkKICAgICAgfTsKICAgIH0KICB9IGVsc2UgaWYgKCFlbC5wcmUpIHsKICAgIC8vIG5vbiByb290IG5vZGUgaW4gcHJlIGJsb2NrcyB3aXRoIG5vIGF0dHJpYnV0ZXMKICAgIGVsLnBsYWluID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50IChlbGVtZW50LCBvcHRpb25zKSB7CiAgcHJvY2Vzc0tleShlbGVtZW50KTsKCiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgYWZ0ZXIKICAvLyByZW1vdmluZyBzdHJ1Y3R1cmFsIGF0dHJpYnV0ZXMKICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFlbGVtZW50LmF0dHJzTGlzdC5sZW5ndGg7CgogIHByb2Nlc3NSZWYoZWxlbWVudCk7CiAgcHJvY2Vzc1Nsb3QoZWxlbWVudCk7CiAgcHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgIGVsZW1lbnQgPSB0cmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgfQogIHByb2Nlc3NBdHRycyhlbGVtZW50KTsKfQoKZnVuY3Rpb24gcHJvY2Vzc0tleSAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QmluZGluZ0F0dHIoZWwsICdrZXknKTsKICBpZiAoZXhwKSB7CiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICB3YXJuJDIoIjx0ZW1wbGF0ZT4gY2Fubm90IGJlIGtleWVkLiBQbGFjZSB0aGUga2V5IG9uIHJlYWwgZWxlbWVudHMgaW5zdGVhZC4iKTsKICAgIH0KICAgIGVsLmtleSA9IGV4cDsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSZWYgKGVsKSB7CiAgdmFyIHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAncmVmJyk7CiAgaWYgKHJlZikgewogICAgZWwucmVmID0gcmVmOwogICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NGb3IgKGVsKSB7CiAgdmFyIGV4cDsKICBpZiAoKGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWZvcicpKSkgewogICAgdmFyIHJlcyA9IHBhcnNlRm9yKGV4cCk7CiAgICBpZiAocmVzKSB7CiAgICAgIGV4dGVuZChlbCwgcmVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdhcm4kMigKICAgICAgICAoIkludmFsaWQgdi1mb3IgZXhwcmVzc2lvbjogIiArIGV4cCkKICAgICAgKTsKICAgIH0KICB9Cn0KCgoKZnVuY3Rpb24gcGFyc2VGb3IgKGV4cCkgewogIHZhciBpbk1hdGNoID0gZXhwLm1hdGNoKGZvckFsaWFzUkUpOwogIGlmICghaW5NYXRjaCkgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICByZXMuZm9yID0gaW5NYXRjaFsyXS50cmltKCk7CiAgdmFyIGFsaWFzID0gaW5NYXRjaFsxXS50cmltKCkucmVwbGFjZShzdHJpcFBhcmVuc1JFLCAnJyk7CiAgdmFyIGl0ZXJhdG9yTWF0Y2ggPSBhbGlhcy5tYXRjaChmb3JJdGVyYXRvclJFKTsKICBpZiAoaXRlcmF0b3JNYXRjaCkgewogICAgcmVzLmFsaWFzID0gYWxpYXMucmVwbGFjZShmb3JJdGVyYXRvclJFLCAnJyk7CiAgICByZXMuaXRlcmF0b3IxID0gaXRlcmF0b3JNYXRjaFsxXS50cmltKCk7CiAgICBpZiAoaXRlcmF0b3JNYXRjaFsyXSkgewogICAgICByZXMuaXRlcmF0b3IyID0gaXRlcmF0b3JNYXRjaFsyXS50cmltKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJlcy5hbGlhcyA9IGFsaWFzOwogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIHByb2Nlc3NJZiAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtaWYnKTsKICBpZiAoZXhwKSB7CiAgICBlbC5pZiA9IGV4cDsKICAgIGFkZElmQ29uZGl0aW9uKGVsLCB7CiAgICAgIGV4cDogZXhwLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScpICE9IG51bGwpIHsKICAgICAgZWwuZWxzZSA9IHRydWU7CiAgICB9CiAgICB2YXIgZWxzZWlmID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZS1pZicpOwogICAgaWYgKGVsc2VpZikgewogICAgICBlbC5lbHNlaWYgPSBlbHNlaWY7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBwcm9jZXNzSWZDb25kaXRpb25zIChlbCwgcGFyZW50KSB7CiAgdmFyIHByZXYgPSBmaW5kUHJldkVsZW1lbnQocGFyZW50LmNoaWxkcmVuKTsKICBpZiAocHJldiAmJiBwcmV2LmlmKSB7CiAgICBhZGRJZkNvbmRpdGlvbihwcmV2LCB7CiAgICAgIGV4cDogZWwuZWxzZWlmLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICB3YXJuJDIoCiAgICAgICJ2LSIgKyAoZWwuZWxzZWlmID8gKCdlbHNlLWlmPSInICsgZWwuZWxzZWlmICsgJyInKSA6ICdlbHNlJykgKyAiICIgKwogICAgICAidXNlZCBvbiBlbGVtZW50IDwiICsgKGVsLnRhZykgKyAiPiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdi1pZi4iCiAgICApOwogIH0KfQoKZnVuY3Rpb24gZmluZFByZXZFbGVtZW50IChjaGlsZHJlbikgewogIHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIGlmIChjaGlsZHJlbltpXS50eXBlID09PSAxKSB7CiAgICAgIHJldHVybiBjaGlsZHJlbltpXQogICAgfSBlbHNlIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGlsZHJlbltpXS50ZXh0ICE9PSAnICcpIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAidGV4dCBcIiIgKyAoY2hpbGRyZW5baV0udGV4dC50cmltKCkpICsgIlwiIGJldHdlZW4gdi1pZiBhbmQgdi1lbHNlKC1pZikgIiArCiAgICAgICAgICAid2lsbCBiZSBpZ25vcmVkLiIKICAgICAgICApOwogICAgICB9CiAgICAgIGNoaWxkcmVuLnBvcCgpOwogICAgfQogIH0KfQoKZnVuY3Rpb24gYWRkSWZDb25kaXRpb24gKGVsLCBjb25kaXRpb24pIHsKICBpZiAoIWVsLmlmQ29uZGl0aW9ucykgewogICAgZWwuaWZDb25kaXRpb25zID0gW107CiAgfQogIGVsLmlmQ29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NPbmNlIChlbCkgewogIHZhciBvbmNlJCQxID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Ytb25jZScpOwogIGlmIChvbmNlJCQxICE9IG51bGwpIHsKICAgIGVsLm9uY2UgPSB0cnVlOwogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc1Nsb3QgKGVsKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnKSB7CiAgICBlbC5zbG90TmFtZSA9IGdldEJpbmRpbmdBdHRyKGVsLCAnbmFtZScpOwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBlbC5rZXkpIHsKICAgICAgd2FybiQyKAogICAgICAgICJga2V5YCBkb2VzIG5vdCB3b3JrIG9uIDxzbG90PiBiZWNhdXNlIHNsb3RzIGFyZSBhYnN0cmFjdCBvdXRsZXRzICIgKwogICAgICAgICJhbmQgY2FuIHBvc3NpYmx5IGV4cGFuZCBpbnRvIG11bHRpcGxlIGVsZW1lbnRzLiAiICsKICAgICAgICAiVXNlIHRoZSBrZXkgb24gYSB3cmFwcGluZyBlbGVtZW50IGluc3RlYWQuIgogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgc2xvdFNjb3BlOwogICAgaWYgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICBzbG90U2NvcGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2NvcGUnKTsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgc2xvdFNjb3BlKSB7CiAgICAgICAgd2FybiQyKAogICAgICAgICAgInRoZSBcInNjb3BlXCIgYXR0cmlidXRlIGZvciBzY29wZWQgc2xvdHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kICIgKwogICAgICAgICAgInJlcGxhY2VkIGJ5IFwic2xvdC1zY29wZVwiIHNpbmNlIDIuNS4gVGhlIG5ldyBcInNsb3Qtc2NvcGVcIiBhdHRyaWJ1dGUgIiArCiAgICAgICAgICAiY2FuIGFsc28gYmUgdXNlZCBvbiBwbGFpbiBlbGVtZW50cyBpbiBhZGRpdGlvbiB0byA8dGVtcGxhdGU+IHRvICIgKwogICAgICAgICAgImRlbm90ZSBzY29wZWQgc2xvdHMuIiwKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICB9CiAgICAgIGVsLnNsb3RTY29wZSA9IHNsb3RTY29wZSB8fCBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2xvdC1zY29wZScpOwogICAgfSBlbHNlIGlmICgoc2xvdFNjb3BlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Nsb3Qtc2NvcGUnKSkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgZWwuYXR0cnNNYXBbJ3YtZm9yJ10pIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAiQW1iaWd1b3VzIGNvbWJpbmVkIHVzYWdlIG9mIHNsb3Qtc2NvcGUgYW5kIHYtZm9yIG9uIDwiICsgKGVsLnRhZykgKyAiPiAiICsKICAgICAgICAgICIodi1mb3IgdGFrZXMgaGlnaGVyIHByaW9yaXR5KS4gVXNlIGEgd3JhcHBlciA8dGVtcGxhdGU+IGZvciB0aGUgIiArCiAgICAgICAgICAic2NvcGVkIHNsb3QgdG8gbWFrZSBpdCBjbGVhcmVyLiIsCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgfQogICAgICBlbC5zbG90U2NvcGUgPSBzbG90U2NvcGU7CiAgICB9CiAgICB2YXIgc2xvdFRhcmdldCA9IGdldEJpbmRpbmdBdHRyKGVsLCAnc2xvdCcpOwogICAgaWYgKHNsb3RUYXJnZXQpIHsKICAgICAgZWwuc2xvdFRhcmdldCA9IHNsb3RUYXJnZXQgPT09ICciIicgPyAnImRlZmF1bHQiJyA6IHNsb3RUYXJnZXQ7CiAgICAgIC8vIHByZXNlcnZlIHNsb3QgYXMgYW4gYXR0cmlidXRlIGZvciBuYXRpdmUgc2hhZG93IERPTSBjb21wYXQKICAgICAgLy8gb25seSBmb3Igbm9uLXNjb3BlZCBzbG90cy4KICAgICAgaWYgKGVsLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICAgICAgYWRkQXR0cihlbCwgJ3Nsb3QnLCBzbG90VGFyZ2V0KTsKICAgICAgfQogICAgfQogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc0NvbXBvbmVudCAoZWwpIHsKICB2YXIgYmluZGluZzsKICBpZiAoKGJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2lzJykpKSB7CiAgICBlbC5jb21wb25lbnQgPSBiaW5kaW5nOwogIH0KICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ2lubGluZS10ZW1wbGF0ZScpICE9IG51bGwpIHsKICAgIGVsLmlubGluZVRlbXBsYXRlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NBdHRycyAoZWwpIHsKICB2YXIgbGlzdCA9IGVsLmF0dHJzTGlzdDsKICB2YXIgaSwgbCwgbmFtZSwgcmF3TmFtZSwgdmFsdWUsIG1vZGlmaWVycywgaXNQcm9wOwogIGZvciAoaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgbmFtZSA9IHJhd05hbWUgPSBsaXN0W2ldLm5hbWU7CiAgICB2YWx1ZSA9IGxpc3RbaV0udmFsdWU7CiAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAvLyBtYXJrIGVsZW1lbnQgYXMgZHluYW1pYwogICAgICBlbC5oYXNCaW5kaW5ncyA9IHRydWU7CiAgICAgIC8vIG1vZGlmaWVycwogICAgICBtb2RpZmllcnMgPSBwYXJzZU1vZGlmaWVycyhuYW1lKTsKICAgICAgaWYgKG1vZGlmaWVycykgewogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UobW9kaWZpZXJSRSwgJycpOwogICAgICB9CiAgICAgIGlmIChiaW5kUkUudGVzdChuYW1lKSkgeyAvLyB2LWJpbmQKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGJpbmRSRSwgJycpOwogICAgICAgIHZhbHVlID0gcGFyc2VGaWx0ZXJzKHZhbHVlKTsKICAgICAgICBpc1Byb3AgPSBmYWxzZTsKICAgICAgICBpZiAobW9kaWZpZXJzKSB7CiAgICAgICAgICBpZiAobW9kaWZpZXJzLnByb3ApIHsKICAgICAgICAgICAgaXNQcm9wID0gdHJ1ZTsKICAgICAgICAgICAgbmFtZSA9IGNhbWVsaXplKG5hbWUpOwogICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2lubmVySHRtbCcpIHsgbmFtZSA9ICdpbm5lckhUTUwnOyB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobW9kaWZpZXJzLmNhbWVsKSB7CiAgICAgICAgICAgIG5hbWUgPSBjYW1lbGl6ZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb2RpZmllcnMuc3luYykgewogICAgICAgICAgICBhZGRIYW5kbGVyKAogICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICgidXBkYXRlOiIgKyAoY2FtZWxpemUobmFtZSkpKSwKICAgICAgICAgICAgICBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgIiRldmVudCIpCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1Byb3AgfHwgKAogICAgICAgICAgIWVsLmNvbXBvbmVudCAmJiBwbGF0Zm9ybU11c3RVc2VQcm9wKGVsLnRhZywgZWwuYXR0cnNNYXAudHlwZSwgbmFtZSkKICAgICAgICApKSB7CiAgICAgICAgICBhZGRQcm9wKGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZEF0dHIoZWwsIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob25SRS50ZXN0KG5hbWUpKSB7IC8vIHYtb24KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9uUkUsICcnKTsKICAgICAgICBhZGRIYW5kbGVyKGVsLCBuYW1lLCB2YWx1ZSwgbW9kaWZpZXJzLCBmYWxzZSwgd2FybiQyKTsKICAgICAgfSBlbHNlIHsgLy8gbm9ybWFsIGRpcmVjdGl2ZXMKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGRpclJFLCAnJyk7CiAgICAgICAgLy8gcGFyc2UgYXJnCiAgICAgICAgdmFyIGFyZ01hdGNoID0gbmFtZS5tYXRjaChhcmdSRSk7CiAgICAgICAgdmFyIGFyZyA9IGFyZ01hdGNoICYmIGFyZ01hdGNoWzFdOwogICAgICAgIGlmIChhcmcpIHsKICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC0oYXJnLmxlbmd0aCArIDEpKTsKICAgICAgICB9CiAgICAgICAgYWRkRGlyZWN0aXZlKGVsLCBuYW1lLCByYXdOYW1lLCB2YWx1ZSwgYXJnLCBtb2RpZmllcnMpOwogICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSA9PT0gJ21vZGVsJykgewogICAgICAgICAgY2hlY2tGb3JBbGlhc01vZGVsKGVsLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBsaXRlcmFsIGF0dHJpYnV0ZQogICAgICB7CiAgICAgICAgdmFyIHJlcyA9IHBhcnNlVGV4dCh2YWx1ZSwgZGVsaW1pdGVycyk7CiAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgd2FybiQyKAogICAgICAgICAgICBuYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIjogIiArCiAgICAgICAgICAgICdJbnRlcnBvbGF0aW9uIGluc2lkZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIHJlbW92ZWQuICcgKwogICAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICsKICAgICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBpZD0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDppZD0idmFsIj4uJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkQXR0cihlbCwgbmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgICAgLy8gIzY4ODcgZmlyZWZveCBkb2Vzbid0IHVwZGF0ZSBtdXRlZCBzdGF0ZSBpZiBzZXQgdmlhIGF0dHJpYnV0ZQogICAgICAvLyBldmVuIGltbWVkaWF0ZWx5IGFmdGVyIGVsZW1lbnQgY3JlYXRpb24KICAgICAgaWYgKCFlbC5jb21wb25lbnQgJiYKICAgICAgICAgIG5hbWUgPT09ICdtdXRlZCcgJiYKICAgICAgICAgIHBsYXRmb3JtTXVzdFVzZVByb3AoZWwudGFnLCBlbC5hdHRyc01hcC50eXBlLCBuYW1lKSkgewogICAgICAgIGFkZFByb3AoZWwsIG5hbWUsICd0cnVlJyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrSW5Gb3IgKGVsKSB7CiAgdmFyIHBhcmVudCA9IGVsOwogIHdoaWxlIChwYXJlbnQpIHsKICAgIGlmIChwYXJlbnQuZm9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgfQogIHJldHVybiBmYWxzZQp9CgpmdW5jdGlvbiBwYXJzZU1vZGlmaWVycyAobmFtZSkgewogIHZhciBtYXRjaCA9IG5hbWUubWF0Y2gobW9kaWZpZXJSRSk7CiAgaWYgKG1hdGNoKSB7CiAgICB2YXIgcmV0ID0ge307CiAgICBtYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7IHJldFttLnNsaWNlKDEpXSA9IHRydWU7IH0pOwogICAgcmV0dXJuIHJldAogIH0KfQoKZnVuY3Rpb24gbWFrZUF0dHJzTWFwIChhdHRycykgewogIHZhciBtYXAgPSB7fTsKICBmb3IgKHZhciBpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKAogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbWFwW2F0dHJzW2ldLm5hbWVdICYmICFpc0lFICYmICFpc0VkZ2UKICAgICkgewogICAgICB3YXJuJDIoJ2R1cGxpY2F0ZSBhdHRyaWJ1dGU6ICcgKyBhdHRyc1tpXS5uYW1lKTsKICAgIH0KICAgIG1hcFthdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlOwogIH0KICByZXR1cm4gbWFwCn0KCi8vIGZvciBzY3JpcHQgKGUuZy4gdHlwZT0ieC90ZW1wbGF0ZSIpIG9yIHN0eWxlLCBkbyBub3QgZGVjb2RlIGNvbnRlbnQKZnVuY3Rpb24gaXNUZXh0VGFnIChlbCkgewogIHJldHVybiBlbC50YWcgPT09ICdzY3JpcHQnIHx8IGVsLnRhZyA9PT0gJ3N0eWxlJwp9CgpmdW5jdGlvbiBpc0ZvcmJpZGRlblRhZyAoZWwpIHsKICByZXR1cm4gKAogICAgZWwudGFnID09PSAnc3R5bGUnIHx8CiAgICAoZWwudGFnID09PSAnc2NyaXB0JyAmJiAoCiAgICAgICFlbC5hdHRyc01hcC50eXBlIHx8CiAgICAgIGVsLmF0dHJzTWFwLnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnCiAgICApKQogICkKfQoKdmFyIGllTlNCdWcgPSAvXnhtbG5zOk5TXGQrLzsKdmFyIGllTlNQcmVmaXggPSAvXk5TXGQrOi87CgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBndWFyZElFU1ZHQnVnIChhdHRycykgewogIHZhciByZXMgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldOwogICAgaWYgKCFpZU5TQnVnLnRlc3QoYXR0ci5uYW1lKSkgewogICAgICBhdHRyLm5hbWUgPSBhdHRyLm5hbWUucmVwbGFjZShpZU5TUHJlZml4LCAnJyk7CiAgICAgIHJlcy5wdXNoKGF0dHIpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrRm9yQWxpYXNNb2RlbCAoZWwsIHZhbHVlKSB7CiAgdmFyIF9lbCA9IGVsOwogIHdoaWxlIChfZWwpIHsKICAgIGlmIChfZWwuZm9yICYmIF9lbC5hbGlhcyA9PT0gdmFsdWUpIHsKICAgICAgd2FybiQyKAogICAgICAgICI8IiArIChlbC50YWcpICsgIiB2LW1vZGVsPVwiIiArIHZhbHVlICsgIlwiPjogIiArCiAgICAgICAgIllvdSBhcmUgYmluZGluZyB2LW1vZGVsIGRpcmVjdGx5IHRvIGEgdi1mb3IgaXRlcmF0aW9uIGFsaWFzLiAiICsKICAgICAgICAiVGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgdi1mb3Igc291cmNlIGFycmF5IGJlY2F1c2UgIiArCiAgICAgICAgIndyaXRpbmcgdG8gdGhlIGFsaWFzIGlzIGxpa2UgbW9kaWZ5aW5nIGEgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGUuICIgKwogICAgICAgICJDb25zaWRlciB1c2luZyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCB1c2Ugdi1tb2RlbCBvbiBhbiBvYmplY3QgcHJvcGVydHkgaW5zdGVhZC4iCiAgICAgICk7CiAgICB9CiAgICBfZWwgPSBfZWwucGFyZW50OwogIH0KfQoKLyogICovCgovKioKICogRXhwYW5kIGlucHV0W3YtbW9kZWxdIHdpdGggZHlhbm1pYyB0eXBlIGJpbmRpbmdzIGludG8gdi1pZi1lbHNlIGNoYWlucwogKiBUdXJuIHRoaXM6CiAqICAgPGlucHV0IHYtbW9kZWw9ImRhdGFbdHlwZV0iIDp0eXBlPSJ0eXBlIj4KICogaW50byB0aGlzOgogKiAgIDxpbnB1dCB2LWlmPSJ0eXBlID09PSAnY2hlY2tib3gnIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iZGF0YVt0eXBlXSI+CiAqICAgPGlucHV0IHYtZWxzZS1pZj0idHlwZSA9PT0gJ3JhZGlvJyIgdHlwZT0icmFkaW8iIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKiAgIDxpbnB1dCB2LWVsc2UgOnR5cGU9InR5cGUiIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKi8KCmZ1bmN0aW9uIHByZVRyYW5zZm9ybU5vZGUgKGVsLCBvcHRpb25zKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ2lucHV0JykgewogICAgdmFyIG1hcCA9IGVsLmF0dHJzTWFwOwogICAgaWYgKCFtYXBbJ3YtbW9kZWwnXSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgdHlwZUJpbmRpbmc7CiAgICBpZiAobWFwWyc6dHlwZSddIHx8IG1hcFsndi1iaW5kOnR5cGUnXSkgewogICAgICB0eXBlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndHlwZScpOwogICAgfQogICAgaWYgKCFtYXAudHlwZSAmJiAhdHlwZUJpbmRpbmcgJiYgbWFwWyd2LWJpbmQnXSkgewogICAgICB0eXBlQmluZGluZyA9ICIoIiArIChtYXBbJ3YtYmluZCddKSArICIpLnR5cGUiOwogICAgfQoKICAgIGlmICh0eXBlQmluZGluZykgewogICAgICB2YXIgaWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1pZicsIHRydWUpOwogICAgICB2YXIgaWZDb25kaXRpb25FeHRyYSA9IGlmQ29uZGl0aW9uID8gKCImJigiICsgaWZDb25kaXRpb24gKyAiKSIpIDogIiI7CiAgICAgIHZhciBoYXNFbHNlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScsIHRydWUpICE9IG51bGw7CiAgICAgIHZhciBlbHNlSWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1lbHNlLWlmJywgdHJ1ZSk7CiAgICAgIC8vIDEuIGNoZWNrYm94CiAgICAgIHZhciBicmFuY2gwID0gY2xvbmVBU1RFbGVtZW50KGVsKTsKICAgICAgLy8gcHJvY2VzcyBmb3Igb24gdGhlIG1haW4gbm9kZQogICAgICBwcm9jZXNzRm9yKGJyYW5jaDApOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDAsICd0eXBlJywgJ2NoZWNrYm94Jyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDAsIG9wdGlvbnMpOwogICAgICBicmFuY2gwLnByb2Nlc3NlZCA9IHRydWU7IC8vIHByZXZlbnQgaXQgZnJvbSBkb3VibGUtcHJvY2Vzc2VkCiAgICAgIGJyYW5jaDAuaWYgPSAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J2NoZWNrYm94JyIgKyBpZkNvbmRpdGlvbkV4dHJhOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiBicmFuY2gwLmlmLAogICAgICAgIGJsb2NrOiBicmFuY2gwCiAgICAgIH0pOwogICAgICAvLyAyLiBhZGQgcmFkaW8gZWxzZS1pZiBjb25kaXRpb24KICAgICAgdmFyIGJyYW5jaDEgPSBjbG9uZUFTVEVsZW1lbnQoZWwpOwogICAgICBnZXRBbmRSZW1vdmVBdHRyKGJyYW5jaDEsICd2LWZvcicsIHRydWUpOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDEsICd0eXBlJywgJ3JhZGlvJyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDEsIG9wdGlvbnMpOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J3JhZGlvJyIgKyBpZkNvbmRpdGlvbkV4dHJhLAogICAgICAgIGJsb2NrOiBicmFuY2gxCiAgICAgIH0pOwogICAgICAvLyAzLiBvdGhlcgogICAgICB2YXIgYnJhbmNoMiA9IGNsb25lQVNURWxlbWVudChlbCk7CiAgICAgIGdldEFuZFJlbW92ZUF0dHIoYnJhbmNoMiwgJ3YtZm9yJywgdHJ1ZSk7CiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMiwgJzp0eXBlJywgdHlwZUJpbmRpbmcpOwogICAgICBwcm9jZXNzRWxlbWVudChicmFuY2gyLCBvcHRpb25zKTsKICAgICAgYWRkSWZDb25kaXRpb24oYnJhbmNoMCwgewogICAgICAgIGV4cDogaWZDb25kaXRpb24sCiAgICAgICAgYmxvY2s6IGJyYW5jaDIKICAgICAgfSk7CgogICAgICBpZiAoaGFzRWxzZSkgewogICAgICAgIGJyYW5jaDAuZWxzZSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoZWxzZUlmQ29uZGl0aW9uKSB7CiAgICAgICAgYnJhbmNoMC5lbHNlaWYgPSBlbHNlSWZDb25kaXRpb247CiAgICAgIH0KCiAgICAgIHJldHVybiBicmFuY2gwCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFTVEVsZW1lbnQgKGVsKSB7CiAgcmV0dXJuIGNyZWF0ZUFTVEVsZW1lbnQoZWwudGFnLCBlbC5hdHRyc0xpc3Quc2xpY2UoKSwgZWwucGFyZW50KQp9Cgp2YXIgbW9kZWwkMiA9IHsKICBwcmVUcmFuc2Zvcm1Ob2RlOiBwcmVUcmFuc2Zvcm1Ob2RlCn0KCnZhciBtb2R1bGVzJDEgPSBbCiAga2xhc3MkMSwKICBzdHlsZSQxLAogIG1vZGVsJDIKXQoKLyogICovCgpmdW5jdGlvbiB0ZXh0IChlbCwgZGlyKSB7CiAgaWYgKGRpci52YWx1ZSkgewogICAgYWRkUHJvcChlbCwgJ3RleHRDb250ZW50JywgKCJfcygiICsgKGRpci52YWx1ZSkgKyAiKSIpKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaHRtbCAoZWwsIGRpcikgewogIGlmIChkaXIudmFsdWUpIHsKICAgIGFkZFByb3AoZWwsICdpbm5lckhUTUwnLCAoIl9zKCIgKyAoZGlyLnZhbHVlKSArICIpIikpOwogIH0KfQoKdmFyIGRpcmVjdGl2ZXMkMSA9IHsKICBtb2RlbDogbW9kZWwsCiAgdGV4dDogdGV4dCwKICBodG1sOiBodG1sCn0KCi8qICAqLwoKdmFyIGJhc2VPcHRpb25zID0gewogIGV4cGVjdEhUTUw6IHRydWUsCiAgbW9kdWxlczogbW9kdWxlcyQxLAogIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXMkMSwKICBpc1ByZVRhZzogaXNQcmVUYWcsCiAgaXNVbmFyeVRhZzogaXNVbmFyeVRhZywKICBtdXN0VXNlUHJvcDogbXVzdFVzZVByb3AsCiAgY2FuQmVMZWZ0T3BlblRhZzogY2FuQmVMZWZ0T3BlblRhZywKICBpc1Jlc2VydmVkVGFnOiBpc1Jlc2VydmVkVGFnLAogIGdldFRhZ05hbWVzcGFjZTogZ2V0VGFnTmFtZXNwYWNlLAogIHN0YXRpY0tleXM6IGdlblN0YXRpY0tleXMobW9kdWxlcyQxKQp9OwoKLyogICovCgp2YXIgaXNTdGF0aWNLZXk7CnZhciBpc1BsYXRmb3JtUmVzZXJ2ZWRUYWc7Cgp2YXIgZ2VuU3RhdGljS2V5c0NhY2hlZCA9IGNhY2hlZChnZW5TdGF0aWNLZXlzJDEpOwoKLyoqCiAqIEdvYWwgb2YgdGhlIG9wdGltaXplcjogd2FsayB0aGUgZ2VuZXJhdGVkIHRlbXBsYXRlIEFTVCB0cmVlCiAqIGFuZCBkZXRlY3Qgc3ViLXRyZWVzIHRoYXQgYXJlIHB1cmVseSBzdGF0aWMsIGkuZS4gcGFydHMgb2YKICogdGhlIERPTSB0aGF0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZS4KICoKICogT25jZSB3ZSBkZXRlY3QgdGhlc2Ugc3ViLXRyZWVzLCB3ZSBjYW46CiAqCiAqIDEuIEhvaXN0IHRoZW0gaW50byBjb25zdGFudHMsIHNvIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8KICogICAgY3JlYXRlIGZyZXNoIG5vZGVzIGZvciB0aGVtIG9uIGVhY2ggcmUtcmVuZGVyOwogKiAyLiBDb21wbGV0ZWx5IHNraXAgdGhlbSBpbiB0aGUgcGF0Y2hpbmcgcHJvY2Vzcy4KICovCmZ1bmN0aW9uIG9wdGltaXplIChyb290LCBvcHRpb25zKSB7CiAgaWYgKCFyb290KSB7IHJldHVybiB9CiAgaXNTdGF0aWNLZXkgPSBnZW5TdGF0aWNLZXlzQ2FjaGVkKG9wdGlvbnMuc3RhdGljS2V5cyB8fCAnJyk7CiAgaXNQbGF0Zm9ybVJlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIC8vIGZpcnN0IHBhc3M6IG1hcmsgYWxsIG5vbi1zdGF0aWMgbm9kZXMuCiAgbWFya1N0YXRpYyQxKHJvb3QpOwogIC8vIHNlY29uZCBwYXNzOiBtYXJrIHN0YXRpYyByb290cy4KICBtYXJrU3RhdGljUm9vdHMocm9vdCwgZmFsc2UpOwp9CgpmdW5jdGlvbiBnZW5TdGF0aWNLZXlzJDEgKGtleXMpIHsKICByZXR1cm4gbWFrZU1hcCgKICAgICd0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzJyArCiAgICAoa2V5cyA/ICcsJyArIGtleXMgOiAnJykKICApCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMkMSAobm9kZSkgewogIG5vZGUuc3RhdGljID0gaXNTdGF0aWMobm9kZSk7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgLy8gZG8gbm90IG1ha2UgY29tcG9uZW50IHNsb3QgY29udGVudCBzdGF0aWMuIHRoaXMgYXZvaWRzCiAgICAvLyAxLiBjb21wb25lbnRzIG5vdCBhYmxlIHRvIG11dGF0ZSBzbG90IG5vZGVzCiAgICAvLyAyLiBzdGF0aWMgc2xvdCBjb250ZW50IGZhaWxzIGZvciBob3QtcmVsb2FkaW5nCiAgICBpZiAoCiAgICAgICFpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcobm9kZS50YWcpICYmCiAgICAgIG5vZGUudGFnICE9PSAnc2xvdCcgJiYKICAgICAgbm9kZS5hdHRyc01hcFsnaW5saW5lLXRlbXBsYXRlJ10gPT0gbnVsbAogICAgKSB7CiAgICAgIHJldHVybgogICAgfQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldOwogICAgICBtYXJrU3RhdGljJDEoY2hpbGQpOwogICAgICBpZiAoIWNoaWxkLnN0YXRpYykgewogICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICB2YXIgYmxvY2sgPSBub2RlLmlmQ29uZGl0aW9uc1tpJDFdLmJsb2NrOwogICAgICAgIG1hcmtTdGF0aWMkMShibG9jayk7CiAgICAgICAgaWYgKCFibG9jay5zdGF0aWMpIHsKICAgICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljUm9vdHMgKG5vZGUsIGlzSW5Gb3IpIHsKICBpZiAobm9kZS50eXBlID09PSAxKSB7CiAgICBpZiAobm9kZS5zdGF0aWMgfHwgbm9kZS5vbmNlKSB7CiAgICAgIG5vZGUuc3RhdGljSW5Gb3IgPSBpc0luRm9yOwogICAgfQogICAgLy8gRm9yIGEgbm9kZSB0byBxdWFsaWZ5IGFzIGEgc3RhdGljIHJvb3QsIGl0IHNob3VsZCBoYXZlIGNoaWxkcmVuIHRoYXQKICAgIC8vIGFyZSBub3QganVzdCBzdGF0aWMgdGV4dC4gT3RoZXJ3aXNlIHRoZSBjb3N0IG9mIGhvaXN0aW5nIG91dCB3aWxsCiAgICAvLyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgYW5kIGl0J3MgYmV0dGVyIG9mZiB0byBqdXN0IGFsd2F5cyByZW5kZXIgaXQgZnJlc2guCiAgICBpZiAobm9kZS5zdGF0aWMgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgISgKICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYKICAgICAgbm9kZS5jaGlsZHJlblswXS50eXBlID09PSAzCiAgICApKSB7CiAgICAgIG5vZGUuc3RhdGljUm9vdCA9IHRydWU7CiAgICAgIHJldHVybgogICAgfSBlbHNlIHsKICAgICAgbm9kZS5zdGF0aWNSb290ID0gZmFsc2U7CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgbWFya1N0YXRpY1Jvb3RzKG5vZGUuY2hpbGRyZW5baV0sIGlzSW5Gb3IgfHwgISFub2RlLmZvcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICBtYXJrU3RhdGljUm9vdHMobm9kZS5pZkNvbmRpdGlvbnNbaSQxXS5ibG9jaywgaXNJbkZvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGlzU3RhdGljIChub2RlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMikgeyAvLyBleHByZXNzaW9uCiAgICByZXR1cm4gZmFsc2UKICB9CiAgaWYgKG5vZGUudHlwZSA9PT0gMykgeyAvLyB0ZXh0CiAgICByZXR1cm4gdHJ1ZQogIH0KICByZXR1cm4gISEobm9kZS5wcmUgfHwgKAogICAgIW5vZGUuaGFzQmluZGluZ3MgJiYgLy8gbm8gZHluYW1pYyBiaW5kaW5ncwogICAgIW5vZGUuaWYgJiYgIW5vZGUuZm9yICYmIC8vIG5vdCB2LWlmIG9yIHYtZm9yIG9yIHYtZWxzZQogICAgIWlzQnVpbHRJblRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgYnVpbHQtaW4KICAgIGlzUGxhdGZvcm1SZXNlcnZlZFRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgY29tcG9uZW50CiAgICAhaXNEaXJlY3RDaGlsZE9mVGVtcGxhdGVGb3Iobm9kZSkgJiYKICAgIE9iamVjdC5rZXlzKG5vZGUpLmV2ZXJ5KGlzU3RhdGljS2V5KQogICkpCn0KCmZ1bmN0aW9uIGlzRGlyZWN0Q2hpbGRPZlRlbXBsYXRlRm9yIChub2RlKSB7CiAgd2hpbGUgKG5vZGUucGFyZW50KSB7CiAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICBpZiAobm9kZS50YWcgIT09ICd0ZW1wbGF0ZScpIHsKICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgICBpZiAobm9kZS5mb3IpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlCn0KCi8qICAqLwoKdmFyIGZuRXhwUkUgPSAvXihbXHckX10rfFwoW14pXSo/XCkpXHMqPT58XmZ1bmN0aW9uXHMqXCgvOwp2YXIgc2ltcGxlUGF0aFJFID0gL15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLzsKCi8vIEtleWJvYXJkRXZlbnQua2V5Q29kZSBhbGlhc2VzCnZhciBrZXlDb2RlcyA9IHsKICBlc2M6IDI3LAogIHRhYjogOSwKICBlbnRlcjogMTMsCiAgc3BhY2U6IDMyLAogIHVwOiAzOCwKICBsZWZ0OiAzNywKICByaWdodDogMzksCiAgZG93bjogNDAsCiAgJ2RlbGV0ZSc6IFs4LCA0Nl0KfTsKCi8vIEtleWJvYXJkRXZlbnQua2V5IGFsaWFzZXMKdmFyIGtleU5hbWVzID0gewogIGVzYzogJ0VzY2FwZScsCiAgdGFiOiAnVGFiJywKICBlbnRlcjogJ0VudGVyJywKICBzcGFjZTogJyAnLAogIC8vICM3ODA2OiBJRTExIHVzZXMga2V5IG5hbWVzIHdpdGhvdXQgYEFycm93YCBwcmVmaXggZm9yIGFycm93IGtleXMuCiAgdXA6IFsnVXAnLCAnQXJyb3dVcCddLAogIGxlZnQ6IFsnTGVmdCcsICdBcnJvd0xlZnQnXSwKICByaWdodDogWydSaWdodCcsICdBcnJvd1JpZ2h0J10sCiAgZG93bjogWydEb3duJywgJ0Fycm93RG93biddLAogICdkZWxldGUnOiBbJ0JhY2tzcGFjZScsICdEZWxldGUnXQp9OwoKLy8gIzQ4Njg6IG1vZGlmaWVycyB0aGF0IHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbGlzdGVuZXIKLy8gbmVlZCB0byBleHBsaWNpdGx5IHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIHRvIHJlbW92ZQovLyB0aGUgbGlzdGVuZXIgZm9yIC5vbmNlCnZhciBnZW5HdWFyZCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHsgcmV0dXJuICgiaWYoIiArIGNvbmRpdGlvbiArICIpcmV0dXJuIG51bGw7Iik7IH07Cgp2YXIgbW9kaWZpZXJDb2RlID0gewogIHN0b3A6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JywKICBwcmV2ZW50OiAnJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JywKICBzZWxmOiBnZW5HdWFyZCgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSwKICBjdHJsOiBnZW5HdWFyZCgiISRldmVudC5jdHJsS2V5IiksCiAgc2hpZnQ6IGdlbkd1YXJkKCIhJGV2ZW50LnNoaWZ0S2V5IiksCiAgYWx0OiBnZW5HdWFyZCgiISRldmVudC5hbHRLZXkiKSwKICBtZXRhOiBnZW5HdWFyZCgiISRldmVudC5tZXRhS2V5IiksCiAgbGVmdDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAwIiksCiAgbWlkZGxlOiBnZW5HdWFyZCgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSwKICByaWdodDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyIikKfTsKCmZ1bmN0aW9uIGdlbkhhbmRsZXJzICgKICBldmVudHMsCiAgaXNOYXRpdmUsCiAgd2FybgopIHsKICB2YXIgcmVzID0gaXNOYXRpdmUgPyAnbmF0aXZlT246eycgOiAnb246eyc7CiAgZm9yICh2YXIgbmFtZSBpbiBldmVudHMpIHsKICAgIHJlcyArPSAiXCIiICsgbmFtZSArICJcIjoiICsgKGdlbkhhbmRsZXIobmFtZSwgZXZlbnRzW25hbWVdKSkgKyAiLCI7CiAgfQogIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ30nCn0KCmZ1bmN0aW9uIGdlbkhhbmRsZXIgKAogIG5hbWUsCiAgaGFuZGxlcgopIHsKICBpZiAoIWhhbmRsZXIpIHsKICAgIHJldHVybiAnZnVuY3Rpb24oKXt9JwogIH0KCiAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHsKICAgIHJldHVybiAoIlsiICsgKGhhbmRsZXIubWFwKGZ1bmN0aW9uIChoYW5kbGVyKSB7IHJldHVybiBnZW5IYW5kbGVyKG5hbWUsIGhhbmRsZXIpOyB9KS5qb2luKCcsJykpICsgIl0iKQogIH0KCiAgdmFyIGlzTWV0aG9kUGF0aCA9IHNpbXBsZVBhdGhSRS50ZXN0KGhhbmRsZXIudmFsdWUpOwogIHZhciBpc0Z1bmN0aW9uRXhwcmVzc2lvbiA9IGZuRXhwUkUudGVzdChoYW5kbGVyLnZhbHVlKTsKCiAgaWYgKCFoYW5kbGVyLm1vZGlmaWVycykgewogICAgaWYgKGlzTWV0aG9kUGF0aCB8fCBpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gaGFuZGxlci52YWx1ZQogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICByZXR1cm4gKCJmdW5jdGlvbigkZXZlbnQpeyIgKyAoaGFuZGxlci52YWx1ZSkgKyAifSIpIC8vIGlubGluZSBzdGF0ZW1lbnQKICB9IGVsc2UgewogICAgdmFyIGNvZGUgPSAnJzsKICAgIHZhciBnZW5Nb2RpZmllckNvZGUgPSAnJzsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gaGFuZGxlci5tb2RpZmllcnMpIHsKICAgICAgaWYgKG1vZGlmaWVyQ29kZVtrZXldKSB7CiAgICAgICAgZ2VuTW9kaWZpZXJDb2RlICs9IG1vZGlmaWVyQ29kZVtrZXldOwogICAgICAgIC8vIGxlZnQvcmlnaHQKICAgICAgICBpZiAoa2V5Q29kZXNba2V5XSkgewogICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4YWN0JykgewogICAgICAgIHZhciBtb2RpZmllcnMgPSAoaGFuZGxlci5tb2RpZmllcnMpOwogICAgICAgIGdlbk1vZGlmaWVyQ29kZSArPSBnZW5HdWFyZCgKICAgICAgICAgIFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnbWV0YSddCiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleU1vZGlmaWVyKSB7IHJldHVybiAhbW9kaWZpZXJzW2tleU1vZGlmaWVyXTsgfSkKICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5TW9kaWZpZXIpIHsgcmV0dXJuICgiJGV2ZW50LiIgKyBrZXlNb2RpZmllciArICJLZXkiKTsgfSkKICAgICAgICAgICAgLmpvaW4oJ3x8JykKICAgICAgICApOwogICAgICB9IGVsc2UgewogICAgICAgIGtleXMucHVzaChrZXkpOwogICAgICB9CiAgICB9CiAgICBpZiAoa2V5cy5sZW5ndGgpIHsKICAgICAgY29kZSArPSBnZW5LZXlGaWx0ZXIoa2V5cyk7CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgbW9kaWZpZXJzIGxpa2UgcHJldmVudCBhbmQgc3RvcCBnZXQgZXhlY3V0ZWQgYWZ0ZXIga2V5IGZpbHRlcmluZwogICAgaWYgKGdlbk1vZGlmaWVyQ29kZSkgewogICAgICBjb2RlICs9IGdlbk1vZGlmaWVyQ29kZTsKICAgIH0KICAgIHZhciBoYW5kbGVyQ29kZSA9IGlzTWV0aG9kUGF0aAogICAgICA/ICgicmV0dXJuICIgKyAoaGFuZGxlci52YWx1ZSkgKyAiKCRldmVudCkiKQogICAgICA6IGlzRnVuY3Rpb25FeHByZXNzaW9uCiAgICAgICAgPyAoInJldHVybiAoIiArIChoYW5kbGVyLnZhbHVlKSArICIpKCRldmVudCkiKQogICAgICAgIDogaGFuZGxlci52YWx1ZTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgcmV0dXJuICgiZnVuY3Rpb24oJGV2ZW50KXsiICsgY29kZSArIGhhbmRsZXJDb2RlICsgIn0iKQogIH0KfQoKZnVuY3Rpb24gZ2VuS2V5RmlsdGVyIChrZXlzKSB7CiAgcmV0dXJuICgiaWYoISgnYnV0dG9uJyBpbiAkZXZlbnQpJiYiICsgKGtleXMubWFwKGdlbkZpbHRlckNvZGUpLmpvaW4oJyYmJykpICsgIilyZXR1cm4gbnVsbDsiKQp9CgpmdW5jdGlvbiBnZW5GaWx0ZXJDb2RlIChrZXkpIHsKICB2YXIga2V5VmFsID0gcGFyc2VJbnQoa2V5LCAxMCk7CiAgaWYgKGtleVZhbCkgewogICAgcmV0dXJuICgiJGV2ZW50LmtleUNvZGUhPT0iICsga2V5VmFsKQogIH0KICB2YXIga2V5Q29kZSA9IGtleUNvZGVzW2tleV07CiAgdmFyIGtleU5hbWUgPSBrZXlOYW1lc1trZXldOwogIHJldHVybiAoCiAgICAiX2soJGV2ZW50LmtleUNvZGUsIiArCiAgICAoSlNPTi5zdHJpbmdpZnkoa2V5KSkgKyAiLCIgKwogICAgKEpTT04uc3RyaW5naWZ5KGtleUNvZGUpKSArICIsIiArCiAgICAiJGV2ZW50LmtleSwiICsKICAgICIiICsgKEpTT04uc3RyaW5naWZ5KGtleU5hbWUpKSArCiAgICAiKSIKICApCn0KCi8qICAqLwoKZnVuY3Rpb24gb24gKGVsLCBkaXIpIHsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRpci5tb2RpZmllcnMpIHsKICAgIHdhcm4oInYtb24gd2l0aG91dCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IG1vZGlmaWVycy4iKTsKICB9CiAgZWwud3JhcExpc3RlbmVycyA9IGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiAoIl9nKCIgKyBjb2RlICsgIiwiICsgKGRpci52YWx1ZSkgKyAiKSIpOyB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGJpbmQkMSAoZWwsIGRpcikgewogIGVsLndyYXBEYXRhID0gZnVuY3Rpb24gKGNvZGUpIHsKICAgIHJldHVybiAoIl9iKCIgKyBjb2RlICsgIiwnIiArIChlbC50YWcpICsgIicsIiArIChkaXIudmFsdWUpICsgIiwiICsgKGRpci5tb2RpZmllcnMgJiYgZGlyLm1vZGlmaWVycy5wcm9wID8gJ3RydWUnIDogJ2ZhbHNlJykgKyAoZGlyLm1vZGlmaWVycyAmJiBkaXIubW9kaWZpZXJzLnN5bmMgPyAnLHRydWUnIDogJycpICsgIikiKQogIH07Cn0KCi8qICAqLwoKdmFyIGJhc2VEaXJlY3RpdmVzID0gewogIG9uOiBvbiwKICBiaW5kOiBiaW5kJDEsCiAgY2xvYWs6IG5vb3AKfQoKLyogICovCgp2YXIgQ29kZWdlblN0YXRlID0gZnVuY3Rpb24gQ29kZWdlblN0YXRlIChvcHRpb25zKSB7CiAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICB0aGlzLndhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CiAgdGhpcy50cmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICd0cmFuc2Zvcm1Db2RlJyk7CiAgdGhpcy5kYXRhR2VuRm5zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdnZW5EYXRhJyk7CiAgdGhpcy5kaXJlY3RpdmVzID0gZXh0ZW5kKGV4dGVuZCh7fSwgYmFzZURpcmVjdGl2ZXMpLCBvcHRpb25zLmRpcmVjdGl2ZXMpOwogIHZhciBpc1Jlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIHRoaXMubWF5YmVDb21wb25lbnQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICFpc1Jlc2VydmVkVGFnKGVsLnRhZyk7IH07CiAgdGhpcy5vbmNlSWQgPSAwOwogIHRoaXMuc3RhdGljUmVuZGVyRm5zID0gW107Cn07CgoKCmZ1bmN0aW9uIGdlbmVyYXRlICgKICBhc3QsCiAgb3B0aW9ucwopIHsKICB2YXIgc3RhdGUgPSBuZXcgQ29kZWdlblN0YXRlKG9wdGlvbnMpOwogIHZhciBjb2RlID0gYXN0ID8gZ2VuRWxlbWVudChhc3QsIHN0YXRlKSA6ICdfYygiZGl2IiknOwogIHJldHVybiB7CiAgICByZW5kZXI6ICgid2l0aCh0aGlzKXtyZXR1cm4gIiArIGNvZGUgKyAifSIpLAogICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMKICB9Cn0KCmZ1bmN0aW9uIGdlbkVsZW1lbnQgKGVsLCBzdGF0ZSkgewogIGlmIChlbC5zdGF0aWNSb290ICYmICFlbC5zdGF0aWNQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5TdGF0aWMoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwub25jZSAmJiAhZWwub25jZVByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbk9uY2UoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuZm9yICYmICFlbC5mb3JQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5Gb3IoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuaWYgJiYgIWVsLmlmUHJvY2Vzc2VkKSB7CiAgICByZXR1cm4gZ2VuSWYoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwudGFnID09PSAndGVtcGxhdGUnICYmICFlbC5zbG90VGFyZ2V0KSB7CiAgICByZXR1cm4gZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlKSB8fCAndm9pZCAwJwogIH0gZWxzZSBpZiAoZWwudGFnID09PSAnc2xvdCcpIHsKICAgIHJldHVybiBnZW5TbG90KGVsLCBzdGF0ZSkKICB9IGVsc2UgewogICAgLy8gY29tcG9uZW50IG9yIGVsZW1lbnQKICAgIHZhciBjb2RlOwogICAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgICBjb2RlID0gZ2VuQ29tcG9uZW50KGVsLmNvbXBvbmVudCwgZWwsIHN0YXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBkYXRhID0gZWwucGxhaW4gPyB1bmRlZmluZWQgOiBnZW5EYXRhJDIoZWwsIHN0YXRlKTsKCiAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmlubGluZVRlbXBsYXRlID8gbnVsbCA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSwgdHJ1ZSk7CiAgICAgIGNvZGUgPSAiX2MoJyIgKyAoZWwudGFnKSArICInIiArIChkYXRhID8gKCIsIiArIGRhdGEpIDogJycpICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKSArICIpIjsKICAgIH0KICAgIC8vIG1vZHVsZSB0cmFuc2Zvcm1zCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLnRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29kZSA9IHN0YXRlLnRyYW5zZm9ybXNbaV0oZWwsIGNvZGUpOwogICAgfQogICAgcmV0dXJuIGNvZGUKICB9Cn0KCi8vIGhvaXN0IHN0YXRpYyBzdWItdHJlZXMgb3V0CmZ1bmN0aW9uIGdlblN0YXRpYyAoZWwsIHN0YXRlKSB7CiAgZWwuc3RhdGljUHJvY2Vzc2VkID0gdHJ1ZTsKICBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMucHVzaCgoIndpdGgodGhpcyl7cmV0dXJuICIgKyAoZ2VuRWxlbWVudChlbCwgc3RhdGUpKSArICJ9IikpOwogIHJldHVybiAoIl9tKCIgKyAoc3RhdGUuc3RhdGljUmVuZGVyRm5zLmxlbmd0aCAtIDEpICsgKGVsLnN0YXRpY0luRm9yID8gJyx0cnVlJyA6ICcnKSArICIpIikKfQoKLy8gdi1vbmNlCmZ1bmN0aW9uIGdlbk9uY2UgKGVsLCBzdGF0ZSkgewogIGVsLm9uY2VQcm9jZXNzZWQgPSB0cnVlOwogIGlmIChlbC5pZiAmJiAhZWwuaWZQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5JZihlbCwgc3RhdGUpCiAgfSBlbHNlIGlmIChlbC5zdGF0aWNJbkZvcikgewogICAgdmFyIGtleSA9ICcnOwogICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgaWYgKHBhcmVudC5mb3IpIHsKICAgICAgICBrZXkgPSBwYXJlbnQua2V5OwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGlmICgha2V5KSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzdGF0ZS53YXJuKAogICAgICAgICJ2LW9uY2UgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgdi1mb3IgdGhhdCBpcyBrZXllZC4gIgogICAgICApOwogICAgICByZXR1cm4gZ2VuRWxlbWVudChlbCwgc3RhdGUpCiAgICB9CiAgICByZXR1cm4gKCJfbygiICsgKGdlbkVsZW1lbnQoZWwsIHN0YXRlKSkgKyAiLCIgKyAoc3RhdGUub25jZUlkKyspICsgIiwiICsga2V5ICsgIikiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuU3RhdGljKGVsLCBzdGF0ZSkKICB9Cn0KCmZ1bmN0aW9uIGdlbklmICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0RW1wdHkKKSB7CiAgZWwuaWZQcm9jZXNzZWQgPSB0cnVlOyAvLyBhdm9pZCByZWN1cnNpb24KICByZXR1cm4gZ2VuSWZDb25kaXRpb25zKGVsLmlmQ29uZGl0aW9ucy5zbGljZSgpLCBzdGF0ZSwgYWx0R2VuLCBhbHRFbXB0eSkKfQoKZnVuY3Rpb24gZ2VuSWZDb25kaXRpb25zICgKICBjb25kaXRpb25zLAogIHN0YXRlLAogIGFsdEdlbiwKICBhbHRFbXB0eQopIHsKICBpZiAoIWNvbmRpdGlvbnMubGVuZ3RoKSB7CiAgICByZXR1cm4gYWx0RW1wdHkgfHwgJ19lKCknCiAgfQoKICB2YXIgY29uZGl0aW9uID0gY29uZGl0aW9ucy5zaGlmdCgpOwogIGlmIChjb25kaXRpb24uZXhwKSB7CiAgICByZXR1cm4gKCIoIiArIChjb25kaXRpb24uZXhwKSArICIpPyIgKyAoZ2VuVGVybmFyeUV4cChjb25kaXRpb24uYmxvY2spKSArICI6IiArIChnZW5JZkNvbmRpdGlvbnMoY29uZGl0aW9ucywgc3RhdGUsIGFsdEdlbiwgYWx0RW1wdHkpKSkKICB9IGVsc2UgewogICAgcmV0dXJuICgiIiArIChnZW5UZXJuYXJ5RXhwKGNvbmRpdGlvbi5ibG9jaykpKQogIH0KCiAgLy8gdi1pZiB3aXRoIHYtb25jZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBsaWtlIChhKT9fbSgwKTpfbSgxKQogIGZ1bmN0aW9uIGdlblRlcm5hcnlFeHAgKGVsKSB7CiAgICByZXR1cm4gYWx0R2VuCiAgICAgID8gYWx0R2VuKGVsLCBzdGF0ZSkKICAgICAgOiBlbC5vbmNlCiAgICAgICAgPyBnZW5PbmNlKGVsLCBzdGF0ZSkKICAgICAgICA6IGdlbkVsZW1lbnQoZWwsIHN0YXRlKQogIH0KfQoKZnVuY3Rpb24gZ2VuRm9yICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0SGVscGVyCikgewogIHZhciBleHAgPSBlbC5mb3I7CiAgdmFyIGFsaWFzID0gZWwuYWxpYXM7CiAgdmFyIGl0ZXJhdG9yMSA9IGVsLml0ZXJhdG9yMSA/ICgiLCIgKyAoZWwuaXRlcmF0b3IxKSkgOiAnJzsKICB2YXIgaXRlcmF0b3IyID0gZWwuaXRlcmF0b3IyID8gKCIsIiArIChlbC5pdGVyYXRvcjIpKSA6ICcnOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICBzdGF0ZS5tYXliZUNvbXBvbmVudChlbCkgJiYKICAgIGVsLnRhZyAhPT0gJ3Nsb3QnICYmCiAgICBlbC50YWcgIT09ICd0ZW1wbGF0ZScgJiYKICAgICFlbC5rZXkKICApIHsKICAgIHN0YXRlLndhcm4oCiAgICAgICI8IiArIChlbC50YWcpICsgIiB2LWZvcj1cIiIgKyBhbGlhcyArICIgaW4gIiArIGV4cCArICJcIj46IGNvbXBvbmVudCBsaXN0cyByZW5kZXJlZCB3aXRoICIgKwogICAgICAidi1mb3Igc2hvdWxkIGhhdmUgZXhwbGljaXQga2V5cy4gIiArCiAgICAgICJTZWUgaHR0cHM6Ly92dWVqcy5vcmcvZ3VpZGUvbGlzdC5odG1sI2tleSBmb3IgbW9yZSBpbmZvLiIsCiAgICAgIHRydWUgLyogdGlwICovCiAgICApOwogIH0KCiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuIChhbHRIZWxwZXIgfHwgJ19sJykgKyAiKCgiICsgZXhwICsgIiksIiArCiAgICAiZnVuY3Rpb24oIiArIGFsaWFzICsgaXRlcmF0b3IxICsgaXRlcmF0b3IyICsgIil7IiArCiAgICAgICJyZXR1cm4gIiArICgoYWx0R2VuIHx8IGdlbkVsZW1lbnQpKGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuRGF0YSQyIChlbCwgc3RhdGUpIHsKICB2YXIgZGF0YSA9ICd7JzsKCiAgLy8gZGlyZWN0aXZlcyBmaXJzdC4KICAvLyBkaXJlY3RpdmVzIG1heSBtdXRhdGUgdGhlIGVsJ3Mgb3RoZXIgcHJvcGVydGllcyBiZWZvcmUgdGhleSBhcmUgZ2VuZXJhdGVkLgogIHZhciBkaXJzID0gZ2VuRGlyZWN0aXZlcyhlbCwgc3RhdGUpOwogIGlmIChkaXJzKSB7IGRhdGEgKz0gZGlycyArICcsJzsgfQoKICAvLyBrZXkKICBpZiAoZWwua2V5KSB7CiAgICBkYXRhICs9ICJrZXk6IiArIChlbC5rZXkpICsgIiwiOwogIH0KICAvLyByZWYKICBpZiAoZWwucmVmKSB7CiAgICBkYXRhICs9ICJyZWY6IiArIChlbC5yZWYpICsgIiwiOwogIH0KICBpZiAoZWwucmVmSW5Gb3IpIHsKICAgIGRhdGEgKz0gInJlZkluRm9yOnRydWUsIjsKICB9CiAgLy8gcHJlCiAgaWYgKGVsLnByZSkgewogICAgZGF0YSArPSAicHJlOnRydWUsIjsKICB9CiAgLy8gcmVjb3JkIG9yaWdpbmFsIHRhZyBuYW1lIGZvciBjb21wb25lbnRzIHVzaW5nICJpcyIgYXR0cmlidXRlCiAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgZGF0YSArPSAidGFnOlwiIiArIChlbC50YWcpICsgIlwiLCI7CiAgfQogIC8vIG1vZHVsZSBkYXRhIGdlbmVyYXRpb24gZnVuY3Rpb25zCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5kYXRhR2VuRm5zLmxlbmd0aDsgaSsrKSB7CiAgICBkYXRhICs9IHN0YXRlLmRhdGFHZW5GbnNbaV0oZWwpOwogIH0KICAvLyBhdHRyaWJ1dGVzCiAgaWYgKGVsLmF0dHJzKSB7CiAgICBkYXRhICs9ICJhdHRyczp7IiArIChnZW5Qcm9wcyhlbC5hdHRycykpICsgIn0sIjsKICB9CiAgLy8gRE9NIHByb3BzCiAgaWYgKGVsLnByb3BzKSB7CiAgICBkYXRhICs9ICJkb21Qcm9wczp7IiArIChnZW5Qcm9wcyhlbC5wcm9wcykpICsgIn0sIjsKICB9CiAgLy8gZXZlbnQgaGFuZGxlcnMKICBpZiAoZWwuZXZlbnRzKSB7CiAgICBkYXRhICs9IChnZW5IYW5kbGVycyhlbC5ldmVudHMsIGZhbHNlLCBzdGF0ZS53YXJuKSkgKyAiLCI7CiAgfQogIGlmIChlbC5uYXRpdmVFdmVudHMpIHsKICAgIGRhdGEgKz0gKGdlbkhhbmRsZXJzKGVsLm5hdGl2ZUV2ZW50cywgdHJ1ZSwgc3RhdGUud2FybikpICsgIiwiOwogIH0KICAvLyBzbG90IHRhcmdldAogIC8vIG9ubHkgZm9yIG5vbi1zY29wZWQgc2xvdHMKICBpZiAoZWwuc2xvdFRhcmdldCAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICBkYXRhICs9ICJzbG90OiIgKyAoZWwuc2xvdFRhcmdldCkgKyAiLCI7CiAgfQogIC8vIHNjb3BlZCBzbG90cwogIGlmIChlbC5zY29wZWRTbG90cykgewogICAgZGF0YSArPSAoZ2VuU2NvcGVkU2xvdHMoZWwuc2NvcGVkU2xvdHMsIHN0YXRlKSkgKyAiLCI7CiAgfQogIC8vIGNvbXBvbmVudCB2LW1vZGVsCiAgaWYgKGVsLm1vZGVsKSB7CiAgICBkYXRhICs9ICJtb2RlbDp7dmFsdWU6IiArIChlbC5tb2RlbC52YWx1ZSkgKyAiLGNhbGxiYWNrOiIgKyAoZWwubW9kZWwuY2FsbGJhY2spICsgIixleHByZXNzaW9uOiIgKyAoZWwubW9kZWwuZXhwcmVzc2lvbikgKyAifSwiOwogIH0KICAvLyBpbmxpbmUtdGVtcGxhdGUKICBpZiAoZWwuaW5saW5lVGVtcGxhdGUpIHsKICAgIHZhciBpbmxpbmVUZW1wbGF0ZSA9IGdlbklubGluZVRlbXBsYXRlKGVsLCBzdGF0ZSk7CiAgICBpZiAoaW5saW5lVGVtcGxhdGUpIHsKICAgICAgZGF0YSArPSBpbmxpbmVUZW1wbGF0ZSArICIsIjsKICAgIH0KICB9CiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLCQvLCAnJykgKyAnfSc7CiAgLy8gdi1iaW5kIGRhdGEgd3JhcAogIGlmIChlbC53cmFwRGF0YSkgewogICAgZGF0YSA9IGVsLndyYXBEYXRhKGRhdGEpOwogIH0KICAvLyB2LW9uIGRhdGEgd3JhcAogIGlmIChlbC53cmFwTGlzdGVuZXJzKSB7CiAgICBkYXRhID0gZWwud3JhcExpc3RlbmVycyhkYXRhKTsKICB9CiAgcmV0dXJuIGRhdGEKfQoKZnVuY3Rpb24gZ2VuRGlyZWN0aXZlcyAoZWwsIHN0YXRlKSB7CiAgdmFyIGRpcnMgPSBlbC5kaXJlY3RpdmVzOwogIGlmICghZGlycykgeyByZXR1cm4gfQogIHZhciByZXMgPSAnZGlyZWN0aXZlczpbJzsKICB2YXIgaGFzUnVudGltZSA9IGZhbHNlOwogIHZhciBpLCBsLCBkaXIsIG5lZWRSdW50aW1lOwogIGZvciAoaSA9IDAsIGwgPSBkaXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIG5lZWRSdW50aW1lID0gdHJ1ZTsKICAgIHZhciBnZW4gPSBzdGF0ZS5kaXJlY3RpdmVzW2Rpci5uYW1lXTsKICAgIGlmIChnZW4pIHsKICAgICAgLy8gY29tcGlsZS10aW1lIGRpcmVjdGl2ZSB0aGF0IG1hbmlwdWxhdGVzIEFTVC4KICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IGFsc28gbmVlZHMgYSBydW50aW1lIGNvdW50ZXJwYXJ0LgogICAgICBuZWVkUnVudGltZSA9ICEhZ2VuKGVsLCBkaXIsIHN0YXRlLndhcm4pOwogICAgfQogICAgaWYgKG5lZWRSdW50aW1lKSB7CiAgICAgIGhhc1J1bnRpbWUgPSB0cnVlOwogICAgICByZXMgKz0gIntuYW1lOlwiIiArIChkaXIubmFtZSkgKyAiXCIscmF3TmFtZTpcIiIgKyAoZGlyLnJhd05hbWUpICsgIlwiIiArIChkaXIudmFsdWUgPyAoIix2YWx1ZTooIiArIChkaXIudmFsdWUpICsgIiksZXhwcmVzc2lvbjoiICsgKEpTT04uc3RyaW5naWZ5KGRpci52YWx1ZSkpKSA6ICcnKSArIChkaXIuYXJnID8gKCIsYXJnOlwiIiArIChkaXIuYXJnKSArICJcIiIpIDogJycpICsgKGRpci5tb2RpZmllcnMgPyAoIixtb2RpZmllcnM6IiArIChKU09OLnN0cmluZ2lmeShkaXIubW9kaWZpZXJzKSkpIDogJycpICsgIn0sIjsKICAgIH0KICB9CiAgaWYgKGhhc1J1bnRpbWUpIHsKICAgIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ10nCiAgfQp9CgpmdW5jdGlvbiBnZW5JbmxpbmVUZW1wbGF0ZSAoZWwsIHN0YXRlKSB7CiAgdmFyIGFzdCA9IGVsLmNoaWxkcmVuWzBdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgKAogICAgZWwuY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGFzdC50eXBlICE9PSAxCiAgKSkgewogICAgc3RhdGUud2FybignSW5saW5lLXRlbXBsYXRlIGNvbXBvbmVudHMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGVsZW1lbnQuJyk7CiAgfQogIGlmIChhc3QudHlwZSA9PT0gMSkgewogICAgdmFyIGlubGluZVJlbmRlckZucyA9IGdlbmVyYXRlKGFzdCwgc3RhdGUub3B0aW9ucyk7CiAgICByZXR1cm4gKCJpbmxpbmVUZW1wbGF0ZTp7cmVuZGVyOmZ1bmN0aW9uKCl7IiArIChpbmxpbmVSZW5kZXJGbnMucmVuZGVyKSArICJ9LHN0YXRpY1JlbmRlckZuczpbIiArIChpbmxpbmVSZW5kZXJGbnMuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gKCJmdW5jdGlvbigpeyIgKyBjb2RlICsgIn0iKTsgfSkuam9pbignLCcpKSArICJdfSIpCiAgfQp9CgpmdW5jdGlvbiBnZW5TY29wZWRTbG90cyAoCiAgc2xvdHMsCiAgc3RhdGUKKSB7CiAgcmV0dXJuICgic2NvcGVkU2xvdHM6X3UoWyIgKyAoT2JqZWN0LmtleXMoc2xvdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7CiAgICAgIHJldHVybiBnZW5TY29wZWRTbG90KGtleSwgc2xvdHNba2V5XSwgc3RhdGUpCiAgICB9KS5qb2luKCcsJykpICsgIl0pIikKfQoKZnVuY3Rpb24gZ2VuU2NvcGVkU2xvdCAoCiAga2V5LAogIGVsLAogIHN0YXRlCikgewogIGlmIChlbC5mb3IgJiYgIWVsLmZvclByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbkZvclNjb3BlZFNsb3Qoa2V5LCBlbCwgc3RhdGUpCiAgfQogIHZhciBmbiA9ICJmdW5jdGlvbigiICsgKFN0cmluZyhlbC5zbG90U2NvcGUpKSArICIpeyIgKwogICAgInJldHVybiAiICsgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJwogICAgICA/IGVsLmlmCiAgICAgICAgPyAoKGVsLmlmKSArICI/IiArIChnZW5DaGlsZHJlbihlbCwgc3RhdGUpIHx8ICd1bmRlZmluZWQnKSArICI6dW5kZWZpbmVkIikKICAgICAgICA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSkgfHwgJ3VuZGVmaW5lZCcKICAgICAgOiBnZW5FbGVtZW50KGVsLCBzdGF0ZSkpICsgIn0iOwogIHJldHVybiAoIntrZXk6IiArIGtleSArICIsZm46IiArIGZuICsgIn0iKQp9CgpmdW5jdGlvbiBnZW5Gb3JTY29wZWRTbG90ICgKICBrZXksCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGV4cCA9IGVsLmZvcjsKICB2YXIgYWxpYXMgPSBlbC5hbGlhczsKICB2YXIgaXRlcmF0b3IxID0gZWwuaXRlcmF0b3IxID8gKCIsIiArIChlbC5pdGVyYXRvcjEpKSA6ICcnOwogIHZhciBpdGVyYXRvcjIgPSBlbC5pdGVyYXRvcjIgPyAoIiwiICsgKGVsLml0ZXJhdG9yMikpIDogJyc7CiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuICJfbCgoIiArIGV4cCArICIpLCIgKwogICAgImZ1bmN0aW9uKCIgKyBhbGlhcyArIGl0ZXJhdG9yMSArIGl0ZXJhdG9yMiArICIpeyIgKwogICAgICAicmV0dXJuICIgKyAoZ2VuU2NvcGVkU2xvdChrZXksIGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuQ2hpbGRyZW4gKAogIGVsLAogIHN0YXRlLAogIGNoZWNrU2tpcCwKICBhbHRHZW5FbGVtZW50LAogIGFsdEdlbk5vZGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47CiAgaWYgKGNoaWxkcmVuLmxlbmd0aCkgewogICAgdmFyIGVsJDEgPSBjaGlsZHJlblswXTsKICAgIC8vIG9wdGltaXplIHNpbmdsZSB2LWZvcgogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJgogICAgICBlbCQxLmZvciAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3Nsb3QnCiAgICApIHsKICAgICAgcmV0dXJuIChhbHRHZW5FbGVtZW50IHx8IGdlbkVsZW1lbnQpKGVsJDEsIHN0YXRlKQogICAgfQogICAgdmFyIG5vcm1hbGl6YXRpb25UeXBlID0gY2hlY2tTa2lwCiAgICAgID8gZ2V0Tm9ybWFsaXphdGlvblR5cGUoY2hpbGRyZW4sIHN0YXRlLm1heWJlQ29tcG9uZW50KQogICAgICA6IDA7CiAgICB2YXIgZ2VuID0gYWx0R2VuTm9kZSB8fCBnZW5Ob2RlOwogICAgcmV0dXJuICgiWyIgKyAoY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBnZW4oYywgc3RhdGUpOyB9KS5qb2luKCcsJykpICsgIl0iICsgKG5vcm1hbGl6YXRpb25UeXBlID8gKCIsIiArIG5vcm1hbGl6YXRpb25UeXBlKSA6ICcnKSkKICB9Cn0KCi8vIGRldGVybWluZSB0aGUgbm9ybWFsaXphdGlvbiBuZWVkZWQgZm9yIHRoZSBjaGlsZHJlbiBhcnJheS4KLy8gMDogbm8gbm9ybWFsaXphdGlvbiBuZWVkZWQKLy8gMTogc2ltcGxlIG5vcm1hbGl6YXRpb24gbmVlZGVkIChwb3NzaWJsZSAxLWxldmVsIGRlZXAgbmVzdGVkIGFycmF5KQovLyAyOiBmdWxsIG5vcm1hbGl6YXRpb24gbmVlZGVkCmZ1bmN0aW9uIGdldE5vcm1hbGl6YXRpb25UeXBlICgKICBjaGlsZHJlbiwKICBtYXliZUNvbXBvbmVudAopIHsKICB2YXIgcmVzID0gMDsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZWwgPSBjaGlsZHJlbltpXTsKICAgIGlmIChlbC50eXBlICE9PSAxKSB7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAobmVlZHNOb3JtYWxpemF0aW9uKGVsKSB8fAogICAgICAgIChlbC5pZkNvbmRpdGlvbnMgJiYgZWwuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIG5lZWRzTm9ybWFsaXphdGlvbihjLmJsb2NrKTsgfSkpKSB7CiAgICAgIHJlcyA9IDI7CiAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAobWF5YmVDb21wb25lbnQoZWwpIHx8CiAgICAgICAgKGVsLmlmQ29uZGl0aW9ucyAmJiBlbC5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gbWF5YmVDb21wb25lbnQoYy5ibG9jayk7IH0pKSkgewogICAgICByZXMgPSAxOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIG5lZWRzTm9ybWFsaXphdGlvbiAoZWwpIHsKICByZXR1cm4gZWwuZm9yICE9PSB1bmRlZmluZWQgfHwgZWwudGFnID09PSAndGVtcGxhdGUnIHx8IGVsLnRhZyA9PT0gJ3Nsb3QnCn0KCmZ1bmN0aW9uIGdlbk5vZGUgKG5vZGUsIHN0YXRlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgcmV0dXJuIGdlbkVsZW1lbnQobm9kZSwgc3RhdGUpCiAgfSBpZiAobm9kZS50eXBlID09PSAzICYmIG5vZGUuaXNDb21tZW50KSB7CiAgICByZXR1cm4gZ2VuQ29tbWVudChub2RlKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuVGV4dChub2RlKQogIH0KfQoKZnVuY3Rpb24gZ2VuVGV4dCAodGV4dCkgewogIHJldHVybiAoIl92KCIgKyAodGV4dC50eXBlID09PSAyCiAgICA/IHRleHQuZXhwcmVzc2lvbiAvLyBubyBuZWVkIGZvciAoKSBiZWNhdXNlIGFscmVhZHkgd3JhcHBlZCBpbiBfcygpCiAgICA6IHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyhKU09OLnN0cmluZ2lmeSh0ZXh0LnRleHQpKSkgKyAiKSIpCn0KCmZ1bmN0aW9uIGdlbkNvbW1lbnQgKGNvbW1lbnQpIHsKICByZXR1cm4gKCJfZSgiICsgKEpTT04uc3RyaW5naWZ5KGNvbW1lbnQudGV4dCkpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5TbG90IChlbCwgc3RhdGUpIHsKICB2YXIgc2xvdE5hbWUgPSBlbC5zbG90TmFtZSB8fCAnImRlZmF1bHQiJzsKICB2YXIgY2hpbGRyZW4gPSBnZW5DaGlsZHJlbihlbCwgc3RhdGUpOwogIHZhciByZXMgPSAiX3QoIiArIHNsb3ROYW1lICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKTsKICB2YXIgYXR0cnMgPSBlbC5hdHRycyAmJiAoInsiICsgKGVsLmF0dHJzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChjYW1lbGl6ZShhLm5hbWUpKSArICI6IiArIChhLnZhbHVlKSk7IH0pLmpvaW4oJywnKSkgKyAifSIpOwogIHZhciBiaW5kJCQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZCddOwogIGlmICgoYXR0cnMgfHwgYmluZCQkMSkgJiYgIWNoaWxkcmVuKSB7CiAgICByZXMgKz0gIixudWxsIjsKICB9CiAgaWYgKGF0dHJzKSB7CiAgICByZXMgKz0gIiwiICsgYXR0cnM7CiAgfQogIGlmIChiaW5kJCQxKSB7CiAgICByZXMgKz0gKGF0dHJzID8gJycgOiAnLG51bGwnKSArICIsIiArIGJpbmQkJDE7CiAgfQogIHJldHVybiByZXMgKyAnKScKfQoKLy8gY29tcG9uZW50TmFtZSBpcyBlbC5jb21wb25lbnQsIHRha2UgaXQgYXMgYXJndW1lbnQgdG8gc2h1biBmbG93J3MgcGVzc2ltaXN0aWMgcmVmaW5lbWVudApmdW5jdGlvbiBnZW5Db21wb25lbnQgKAogIGNvbXBvbmVudE5hbWUsCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuaW5saW5lVGVtcGxhdGUgPyBudWxsIDogZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlLCB0cnVlKTsKICByZXR1cm4gKCJfYygiICsgY29tcG9uZW50TmFtZSArICIsIiArIChnZW5EYXRhJDIoZWwsIHN0YXRlKSkgKyAoY2hpbGRyZW4gPyAoIiwiICsgY2hpbGRyZW4pIDogJycpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5Qcm9wcyAocHJvcHMpIHsKICB2YXIgcmVzID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgdmFyIHByb3AgPSBwcm9wc1tpXTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICByZXMgKz0gIlwiIiArIChwcm9wLm5hbWUpICsgIlwiOiIgKyAodHJhbnNmb3JtU3BlY2lhbE5ld2xpbmVzKHByb3AudmFsdWUpKSArICIsIjsKICAgIH0KICB9CiAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkKfQoKLy8gIzM4OTUsICM0MjY4CmZ1bmN0aW9uIHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyAodGV4dCkgewogIHJldHVybiB0ZXh0CiAgICAucmVwbGFjZSgvXHUyMDI4L2csICdcXHUyMDI4JykKICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKQp9CgovKiAgKi8KCi8vIHRoZXNlIGtleXdvcmRzIHNob3VsZCBub3QgYXBwZWFyIGluc2lkZSBleHByZXNzaW9ucywgYnV0IG9wZXJhdG9ycyBsaWtlCi8vIHR5cGVvZiwgaW5zdGFuY2VvZiBhbmQgaW4gYXJlIGFsbG93ZWQKdmFyIHByb2hpYml0ZWRLZXl3b3JkUkUgPSBuZXcgUmVnRXhwKCdcXGInICsgKAogICdkbyxpZixmb3IsbGV0LG5ldyx0cnksdmFyLGNhc2UsZWxzZSx3aXRoLGF3YWl0LGJyZWFrLGNhdGNoLGNsYXNzLGNvbnN0LCcgKwogICdzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsJyArCiAgJ2V4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMnCikuc3BsaXQoJywnKS5qb2luKCdcXGJ8XFxiJykgKyAnXFxiJyk7CgovLyB0aGVzZSB1bmFyeSBvcGVyYXRvcnMgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHByb3BlcnR5L21ldGhvZCBuYW1lcwp2YXIgdW5hcnlPcGVyYXRvcnNSRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyAoCiAgJ2RlbGV0ZSx0eXBlb2Ysdm9pZCcKKS5zcGxpdCgnLCcpLmpvaW4oJ1xccypcXChbXlxcKV0qXFwpfFxcYicpICsgJ1xccypcXChbXlxcKV0qXFwpJyk7CgovLyBzdHJpcCBzdHJpbmdzIGluIGV4cHJlc3Npb25zCnZhciBzdHJpcFN0cmluZ1JFID0gLycoPzpbXidcXF18XFwuKSonfCIoPzpbXiJcXF18XFwuKSoifGAoPzpbXmBcXF18XFwuKSpcJFx7fFx9KD86W15gXFxdfFxcLikqYHxgKD86W15gXFxdfFxcLikqYC9nOwoKLy8gZGV0ZWN0IHByb2JsZW1hdGljIGV4cHJlc3Npb25zIGluIGEgdGVtcGxhdGUKZnVuY3Rpb24gZGV0ZWN0RXJyb3JzIChhc3QpIHsKICB2YXIgZXJyb3JzID0gW107CiAgaWYgKGFzdCkgewogICAgY2hlY2tOb2RlKGFzdCwgZXJyb3JzKTsKICB9CiAgcmV0dXJuIGVycm9ycwp9CgpmdW5jdGlvbiBjaGVja05vZGUgKG5vZGUsIGVycm9ycykgewogIGlmIChub2RlLnR5cGUgPT09IDEpIHsKICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZS5hdHRyc01hcCkgewogICAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuYXR0cnNNYXBbbmFtZV07CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAobmFtZSA9PT0gJ3YtZm9yJykgewogICAgICAgICAgICBjaGVja0Zvcihub2RlLCAoInYtZm9yPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9IGVsc2UgaWYgKG9uUkUudGVzdChuYW1lKSkgewogICAgICAgICAgICBjaGVja0V2ZW50KHZhbHVlLCAobmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIiKSwgZXJyb3JzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoZWNrRXhwcmVzc2lvbih2YWx1ZSwgKG5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGVja05vZGUobm9kZS5jaGlsZHJlbltpXSwgZXJyb3JzKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAyKSB7CiAgICBjaGVja0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBub2RlLnRleHQsIGVycm9ycyk7CiAgfQp9CgpmdW5jdGlvbiBjaGVja0V2ZW50IChleHAsIHRleHQsIGVycm9ycykgewogIHZhciBzdGlwcGVkID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpOwogIHZhciBrZXl3b3JkTWF0Y2ggPSBzdGlwcGVkLm1hdGNoKHVuYXJ5T3BlcmF0b3JzUkUpOwogIGlmIChrZXl3b3JkTWF0Y2ggJiYgc3RpcHBlZC5jaGFyQXQoa2V5d29yZE1hdGNoLmluZGV4IC0gMSkgIT09ICckJykgewogICAgZXJyb3JzLnB1c2goCiAgICAgICJhdm9pZCB1c2luZyBKYXZhU2NyaXB0IHVuYXJ5IG9wZXJhdG9yIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAiXCIiICsgKGtleXdvcmRNYXRjaFswXSkgKyAiXCIgaW4gZXhwcmVzc2lvbiAiICsgKHRleHQudHJpbSgpKQogICAgKTsKICB9CiAgY2hlY2tFeHByZXNzaW9uKGV4cCwgdGV4dCwgZXJyb3JzKTsKfQoKZnVuY3Rpb24gY2hlY2tGb3IgKG5vZGUsIHRleHQsIGVycm9ycykgewogIGNoZWNrRXhwcmVzc2lvbihub2RlLmZvciB8fCAnJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5hbGlhcywgJ3YtZm9yIGFsaWFzJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5pdGVyYXRvcjEsICd2LWZvciBpdGVyYXRvcicsIHRleHQsIGVycm9ycyk7CiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuaXRlcmF0b3IyLCAndi1mb3IgaXRlcmF0b3InLCB0ZXh0LCBlcnJvcnMpOwp9CgpmdW5jdGlvbiBjaGVja0lkZW50aWZpZXIgKAogIGlkZW50LAogIHR5cGUsCiAgdGV4dCwKICBlcnJvcnMKKSB7CiAgaWYgKHR5cGVvZiBpZGVudCA9PT0gJ3N0cmluZycpIHsKICAgIHRyeSB7CiAgICAgIG5ldyBGdW5jdGlvbigoInZhciAiICsgaWRlbnQgKyAiPV8iKSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGVycm9ycy5wdXNoKCgiaW52YWxpZCAiICsgdHlwZSArICIgXCIiICsgaWRlbnQgKyAiXCIgaW4gZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkpKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrRXhwcmVzc2lvbiAoZXhwLCB0ZXh0LCBlcnJvcnMpIHsKICB0cnkgewogICAgbmV3IEZ1bmN0aW9uKCgicmV0dXJuICIgKyBleHApKTsKICB9IGNhdGNoIChlKSB7CiAgICB2YXIga2V5d29yZE1hdGNoID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpLm1hdGNoKHByb2hpYml0ZWRLZXl3b3JkUkUpOwogICAgaWYgKGtleXdvcmRNYXRjaCkgewogICAgICBlcnJvcnMucHVzaCgKICAgICAgICAiYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAgICJcIiIgKyAoa2V5d29yZE1hdGNoWzBdKSArICJcIlxuICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9ycy5wdXNoKAogICAgICAgICJpbnZhbGlkIGV4cHJlc3Npb246ICIgKyAoZS5tZXNzYWdlKSArICIgaW5cblxuIiArCiAgICAgICAgIiAgICAiICsgZXhwICsgIlxuXG4iICsKICAgICAgICAiICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkgKyAiXG4iCiAgICAgICk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uIChjb2RlLCBlcnJvcnMpIHsKICB0cnkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlKQogIH0gY2F0Y2ggKGVycikgewogICAgZXJyb3JzLnB1c2goeyBlcnI6IGVyciwgY29kZTogY29kZSB9KTsKICAgIHJldHVybiBub29wCiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuIChjb21waWxlKSB7CiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBpbGVUb0Z1bmN0aW9ucyAoCiAgICB0ZW1wbGF0ZSwKICAgIG9wdGlvbnMsCiAgICB2bQogICkgewogICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICB2YXIgd2FybiQkMSA9IG9wdGlvbnMud2FybiB8fCB3YXJuOwogICAgZGVsZXRlIG9wdGlvbnMud2FybjsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIHsKICAgICAgLy8gZGV0ZWN0IHBvc3NpYmxlIENTUCByZXN0cmljdGlvbgogICAgICB0cnkgewogICAgICAgIG5ldyBGdW5jdGlvbigncmV0dXJuIDEnKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLnRvU3RyaW5nKCkubWF0Y2goL3Vuc2FmZS1ldmFsfENTUC8pKSB7CiAgICAgICAgICB3YXJuJCQxKAogICAgICAgICAgICAnSXQgc2VlbXMgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhbG9uZSBidWlsZCBvZiBWdWUuanMgaW4gYW4gJyArCiAgICAgICAgICAgICdlbnZpcm9ubWVudCB3aXRoIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IHRoYXQgcHJvaGliaXRzIHVuc2FmZS1ldmFsLiAnICsKICAgICAgICAgICAgJ1RoZSB0ZW1wbGF0ZSBjb21waWxlciBjYW5ub3Qgd29yayBpbiB0aGlzIGVudmlyb25tZW50LiBDb25zaWRlciAnICsKICAgICAgICAgICAgJ3JlbGF4aW5nIHRoZSBwb2xpY3kgdG8gYWxsb3cgdW5zYWZlLWV2YWwgb3IgcHJlLWNvbXBpbGluZyB5b3VyICcgKwogICAgICAgICAgICAndGVtcGxhdGVzIGludG8gcmVuZGVyIGZ1bmN0aW9ucy4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIGNoZWNrIGNhY2hlCiAgICB2YXIga2V5ID0gb3B0aW9ucy5kZWxpbWl0ZXJzCiAgICAgID8gU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVycykgKyB0ZW1wbGF0ZQogICAgICA6IHRlbXBsYXRlOwogICAgaWYgKGNhY2hlW2tleV0pIHsKICAgICAgcmV0dXJuIGNhY2hlW2tleV0KICAgIH0KCiAgICAvLyBjb21waWxlCiAgICB2YXIgY29tcGlsZWQgPSBjb21waWxlKHRlbXBsYXRlLCBvcHRpb25zKTsKCiAgICAvLyBjaGVjayBjb21waWxhdGlvbiBlcnJvcnMvdGlwcwogICAgewogICAgICBpZiAoY29tcGlsZWQuZXJyb3JzICYmIGNvbXBpbGVkLmVycm9ycy5sZW5ndGgpIHsKICAgICAgICB3YXJuJCQxKAogICAgICAgICAgIkVycm9yIGNvbXBpbGluZyB0ZW1wbGF0ZTpcblxuIiArIHRlbXBsYXRlICsgIlxuXG4iICsKICAgICAgICAgIGNvbXBpbGVkLmVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuICgiLSAiICsgZSk7IH0pLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChjb21waWxlZC50aXBzICYmIGNvbXBpbGVkLnRpcHMubGVuZ3RoKSB7CiAgICAgICAgY29tcGlsZWQudGlwcy5mb3JFYWNoKGZ1bmN0aW9uIChtc2cpIHsgcmV0dXJuIHRpcChtc2csIHZtKTsgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyB0dXJuIGNvZGUgaW50byBmdW5jdGlvbnMKICAgIHZhciByZXMgPSB7fTsKICAgIHZhciBmbkdlbkVycm9ycyA9IFtdOwogICAgcmVzLnJlbmRlciA9IGNyZWF0ZUZ1bmN0aW9uKGNvbXBpbGVkLnJlbmRlciwgZm5HZW5FcnJvcnMpOwogICAgcmVzLnN0YXRpY1JlbmRlckZucyA9IGNvbXBpbGVkLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKGNvZGUsIGZuR2VuRXJyb3JzKQogICAgfSk7CgogICAgLy8gY2hlY2sgZnVuY3Rpb24gZ2VuZXJhdGlvbiBlcnJvcnMuCiAgICAvLyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29tcGlsZXIgaXRzZWxmLgogICAgLy8gbW9zdGx5IGZvciBjb2RlZ2VuIGRldmVsb3BtZW50IHVzZQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICB7CiAgICAgIGlmICgoIWNvbXBpbGVkLmVycm9ycyB8fCAhY29tcGlsZWQuZXJyb3JzLmxlbmd0aCkgJiYgZm5HZW5FcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgd2FybiQkMSgKICAgICAgICAgICJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVuZGVyIGZ1bmN0aW9uOlxuXG4iICsKICAgICAgICAgIGZuR2VuRXJyb3JzLm1hcChmdW5jdGlvbiAocmVmKSB7CiAgICAgICAgICAgIHZhciBlcnIgPSByZWYuZXJyOwogICAgICAgICAgICB2YXIgY29kZSA9IHJlZi5jb2RlOwoKICAgICAgICAgICAgcmV0dXJuICgoZXJyLnRvU3RyaW5nKCkpICsgIiBpblxuXG4iICsgY29kZSArICJcbiIpOwogICAgICAgIH0pLmpvaW4oJ1xuJyksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKGNhY2hlW2tleV0gPSByZXMpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBpbGVyQ3JlYXRvciAoYmFzZUNvbXBpbGUpIHsKICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQ29tcGlsZXIgKGJhc2VPcHRpb25zKSB7CiAgICBmdW5jdGlvbiBjb21waWxlICgKICAgICAgdGVtcGxhdGUsCiAgICAgIG9wdGlvbnMKICAgICkgewogICAgICB2YXIgZmluYWxPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShiYXNlT3B0aW9ucyk7CiAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgdmFyIHRpcHMgPSBbXTsKICAgICAgZmluYWxPcHRpb25zLndhcm4gPSBmdW5jdGlvbiAobXNnLCB0aXApIHsKICAgICAgICAodGlwID8gdGlwcyA6IGVycm9ycykucHVzaChtc2cpOwogICAgICB9OwoKICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAvLyBtZXJnZSBjdXN0b20gbW9kdWxlcwogICAgICAgIGlmIChvcHRpb25zLm1vZHVsZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5tb2R1bGVzID0KICAgICAgICAgICAgKGJhc2VPcHRpb25zLm1vZHVsZXMgfHwgW10pLmNvbmNhdChvcHRpb25zLm1vZHVsZXMpOwogICAgICAgIH0KICAgICAgICAvLyBtZXJnZSBjdXN0b20gZGlyZWN0aXZlcwogICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5kaXJlY3RpdmVzID0gZXh0ZW5kKAogICAgICAgICAgICBPYmplY3QuY3JlYXRlKGJhc2VPcHRpb25zLmRpcmVjdGl2ZXMgfHwgbnVsbCksCiAgICAgICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlcwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy8gY29weSBvdGhlciBvcHRpb25zCiAgICAgICAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgICAgICAgIGlmIChrZXkgIT09ICdtb2R1bGVzJyAmJiBrZXkgIT09ICdkaXJlY3RpdmVzJykgewogICAgICAgICAgICBmaW5hbE9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBjb21waWxlZCA9IGJhc2VDb21waWxlKHRlbXBsYXRlLCBmaW5hbE9wdGlvbnMpOwogICAgICB7CiAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBkZXRlY3RFcnJvcnMoY29tcGlsZWQuYXN0KSk7CiAgICAgIH0KICAgICAgY29tcGlsZWQuZXJyb3JzID0gZXJyb3JzOwogICAgICBjb21waWxlZC50aXBzID0gdGlwczsKICAgICAgcmV0dXJuIGNvbXBpbGVkCiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgY29tcGlsZTogY29tcGlsZSwKICAgICAgY29tcGlsZVRvRnVuY3Rpb25zOiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuKGNvbXBpbGUpCiAgICB9CiAgfQp9CgovKiAgKi8KCi8vIGBjcmVhdGVDb21waWxlckNyZWF0b3JgIGFsbG93cyBjcmVhdGluZyBjb21waWxlcnMgdGhhdCB1c2UgYWx0ZXJuYXRpdmUKLy8gcGFyc2VyL29wdGltaXplci9jb2RlZ2VuLCBlLmcgdGhlIFNTUiBvcHRpbWl6aW5nIGNvbXBpbGVyLgovLyBIZXJlIHdlIGp1c3QgZXhwb3J0IGEgZGVmYXVsdCBjb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCBwYXJ0cy4KdmFyIGNyZWF0ZUNvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXJDcmVhdG9yKGZ1bmN0aW9uIGJhc2VDb21waWxlICgKICB0ZW1wbGF0ZSwKICBvcHRpb25zCikgewogIHZhciBhc3QgPSBwYXJzZSh0ZW1wbGF0ZS50cmltKCksIG9wdGlvbnMpOwogIGlmIChvcHRpb25zLm9wdGltaXplICE9PSBmYWxzZSkgewogICAgb3B0aW1pemUoYXN0LCBvcHRpb25zKTsKICB9CiAgdmFyIGNvZGUgPSBnZW5lcmF0ZShhc3QsIG9wdGlvbnMpOwogIHJldHVybiB7CiAgICBhc3Q6IGFzdCwKICAgIHJlbmRlcjogY29kZS5yZW5kZXIsCiAgICBzdGF0aWNSZW5kZXJGbnM6IGNvZGUuc3RhdGljUmVuZGVyRm5zCiAgfQp9KTsKCi8qICAqLwoKdmFyIHJlZiQxID0gY3JlYXRlQ29tcGlsZXIoYmFzZU9wdGlvbnMpOwp2YXIgY29tcGlsZVRvRnVuY3Rpb25zID0gcmVmJDEuY29tcGlsZVRvRnVuY3Rpb25zOwoKLyogICovCgovLyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgYnJvd3NlciBlbmNvZGVzIGEgY2hhciBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcwp2YXIgZGl2OwpmdW5jdGlvbiBnZXRTaG91bGREZWNvZGUgKGhyZWYpIHsKICBkaXYgPSBkaXYgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGl2LmlubmVySFRNTCA9IGhyZWYgPyAiPGEgaHJlZj1cIlxuXCIvPiIgOiAiPGRpdiBhPVwiXG5cIi8+IjsKICByZXR1cm4gZGl2LmlubmVySFRNTC5pbmRleE9mKCcmIzEwOycpID4gMAp9CgovLyAjMzY2MzogSUUgZW5jb2RlcyBuZXdsaW5lcyBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcyB3aGlsZSBvdGhlciBicm93c2VycyBkb24ndAp2YXIgc2hvdWxkRGVjb2RlTmV3bGluZXMgPSBpbkJyb3dzZXIgPyBnZXRTaG91bGREZWNvZGUoZmFsc2UpIDogZmFsc2U7Ci8vICM2ODI4OiBjaHJvbWUgZW5jb2RlcyBjb250ZW50IGluIGFbaHJlZl0KdmFyIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiA9IGluQnJvd3NlciA/IGdldFNob3VsZERlY29kZSh0cnVlKSA6IGZhbHNlOwoKLyogICovCgp2YXIgaWRUb1RlbXBsYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChpZCkgewogIHZhciBlbCA9IHF1ZXJ5KGlkKTsKICByZXR1cm4gZWwgJiYgZWwuaW5uZXJIVE1MCn0pOwoKdmFyIG1vdW50ID0gVnVlLnByb3RvdHlwZS4kbW91bnQ7ClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIHF1ZXJ5KGVsKTsKCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5IHx8IGVsID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAiRG8gbm90IG1vdW50IFZ1ZSB0byA8aHRtbD4gb3IgPGJvZHk+IC0gbW91bnQgdG8gbm9ybWFsIGVsZW1lbnRzIGluc3RlYWQuIgogICAgKTsKICAgIHJldHVybiB0aGlzCiAgfQoKICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7CiAgLy8gcmVzb2x2ZSB0ZW1wbGF0ZS9lbCBhbmQgY29udmVydCB0byByZW5kZXIgZnVuY3Rpb24KICBpZiAoIW9wdGlvbnMucmVuZGVyKSB7CiAgICB2YXIgdGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlOwogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdCgwKSA9PT0gJyMnKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IGlkVG9UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgKCJUZW1wbGF0ZSBlbGVtZW50IG5vdCBmb3VuZCBvciBpcyBlbXB0eTogIiArIChvcHRpb25zLnRlbXBsYXRlKSksCiAgICAgICAgICAgICAgdGhpcwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkgewogICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuaW5uZXJIVE1MOwogICAgICB9IGVsc2UgewogICAgICAgIHsKICAgICAgICAgIHdhcm4oJ2ludmFsaWQgdGVtcGxhdGUgb3B0aW9uOicgKyB0ZW1wbGF0ZSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWwpIHsKICAgICAgdGVtcGxhdGUgPSBnZXRPdXRlckhUTUwoZWwpOwogICAgfQogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgICAgbWFyaygnY29tcGlsZScpOwogICAgICB9CgogICAgICB2YXIgcmVmID0gY29tcGlsZVRvRnVuY3Rpb25zKHRlbXBsYXRlLCB7CiAgICAgICAgc2hvdWxkRGVjb2RlTmV3bGluZXM6IHNob3VsZERlY29kZU5ld2xpbmVzLAogICAgICAgIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjogc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmLAogICAgICAgIGRlbGltaXRlcnM6IG9wdGlvbnMuZGVsaW1pdGVycywKICAgICAgICBjb21tZW50czogb3B0aW9ucy5jb21tZW50cwogICAgICB9LCB0aGlzKTsKICAgICAgdmFyIHJlbmRlciA9IHJlZi5yZW5kZXI7CiAgICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zOwogICAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlcjsKICAgICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnM7CgogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgICAgIG1hcmsoJ2NvbXBpbGUgZW5kJyk7CiAgICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHRoaXMuX25hbWUpICsgIiBjb21waWxlIiksICdjb21waWxlJywgJ2NvbXBpbGUgZW5kJyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG1vdW50LmNhbGwodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8qKgogKiBHZXQgb3V0ZXJIVE1MIG9mIGVsZW1lbnRzLCB0YWtpbmcgY2FyZQogKiBvZiBTVkcgZWxlbWVudHMgaW4gSUUgYXMgd2VsbC4KICovCmZ1bmN0aW9uIGdldE91dGVySFRNTCAoZWwpIHsKICBpZiAoZWwub3V0ZXJIVE1MKSB7CiAgICByZXR1cm4gZWwub3V0ZXJIVE1MCiAgfSBlbHNlIHsKICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbC5jbG9uZU5vZGUodHJ1ZSkpOwogICAgcmV0dXJuIGNvbnRhaW5lci5pbm5lckhUTUwKICB9Cn0KClZ1ZS5jb21waWxlID0gY29tcGlsZVRvRnVuY3Rpb25zOwoKcmV0dXJuIFZ1ZTsKCn0pKSk7Cg==" >
FIND j=5409 line=
FIND j=5410 line=<!-- <script type="text/javascript" src="/jquery-3.3.1.js" > -->
FIND j=5411 line= <script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkgewoKCSJ1c2Ugc3RyaWN0IjsKCglpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2AKCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgoJCS8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgCgkJLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuCgkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uCgkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPwoJCQlmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6CgkJCWZ1bmN0aW9uKCB3ICkgewoJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50IiApOwoJCQkJfQoJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKCQkJfTsKCX0gZWxzZSB7CgkJZmFjdG9yeSggZ2xvYmFsICk7Cgl9CgovLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAp9ICkoIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CgovLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjEKLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlCi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uCi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLgoidXNlIHN0cmljdCI7Cgp2YXIgYXJyID0gW107Cgp2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cgp2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7Cgp2YXIgc2xpY2UgPSBhcnIuc2xpY2U7Cgp2YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKCnZhciBwdXNoID0gYXJyLnB1c2g7Cgp2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOwoKdmFyIGNsYXNzMnR5cGUgPSB7fTsKCnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7Cgp2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKCnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nOwoKdmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTsKCnZhciBzdXBwb3J0ID0ge307Cgp2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHsKCiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTIKICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgImZ1bmN0aW9uIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50cwogICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib2JqZWN0IiApID09PSAiZnVuY3Rpb24iYCkuCiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi4KICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gIm51bWJlciI7CiAgfTsKCgp2YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Cgl9OwoKCgoKCXZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0gewoJCXR5cGU6IHRydWUsCgkJc3JjOiB0cnVlLAoJCW5vTW9kdWxlOiB0cnVlCgl9OwoKCWZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYywgbm9kZSApIHsKCQlkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7CgoJCXZhciBpLAoJCQlzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsKCgkJc2NyaXB0LnRleHQgPSBjb2RlOwoJCWlmICggbm9kZSApIHsKCQkJZm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkgewoJCQkJaWYgKCBub2RlWyBpIF0gKSB7CgkJCQkJc2NyaXB0WyBpIF0gPSBub2RlWyBpIF07CgkJCQl9CgkJCX0KCQl9CgkJZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJfQoKCmZ1bmN0aW9uIHRvVHlwZSggb2JqICkgewoJaWYgKCBvYmogPT0gbnVsbCApIHsKCQlyZXR1cm4gb2JqICsgIiI7Cgl9CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApCglyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CgkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CgkJdHlwZW9mIG9iajsKfQovKiBnbG9iYWwgU3ltYm9sICovCi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsCi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlCgoKCnZhcgoJdmVyc2lvbiA9ICIzLjMuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfSwKCgkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHkKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAoJcnRyaW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogdmVyc2lvbiwKCgljb25zdHJ1Y3RvcjogalF1ZXJ5LAoKCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVuZ3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgoJCS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKCQlpZiAoIG51bSA9PSBudWxsICkgewoJCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApOwoJCX0KCgkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAoJCXJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoKCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAoJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSApICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpOwoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KCXB1c2g6IHB1c2gsCglzb3J0OiBhcnIuc29ydCwKCXNwbGljZTogYXJyLnNwbGljZQp9OwoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKCQl0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSwKCQlpID0gMSwKCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAoJCWRlZXAgPSBmYWxzZTsKCgkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKCQlkZWVwID0gdGFyZ2V0OwoKCQkvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CgkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CgkJaSsrOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGkgPT09IGxlbmd0aCApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCWktLTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgewoKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHwKCQkJCQkoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHsKCgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCWV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAoKCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCglpc1JlYWR5OiB0cnVlLAoKCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewoJCXRocm93IG5ldyBFcnJvciggbXNnICk7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgcHJvdG8sIEN0b3I7CgoJCS8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlcwoJCS8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0cwoJCWlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gIltvYmplY3QgT2JqZWN0XSIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXByb3RvID0gZ2V0UHJvdG8oIG9iaiApOwoKCQkvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluCgkJaWYgKCAhcHJvdG8gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb24KCQlDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCAiY29uc3RydWN0b3IiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7CgkJcmV0dXJuIHR5cGVvZiBDdG9yID09PSAiZnVuY3Rpb24iICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZzsKCX0sCgoJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCgkJLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KCQkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjUKCQl2YXIgbmFtZTsKCgkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHsKCQlET01FdmFsKCBjb2RlICk7Cgl9LAoKCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkgewoJCXZhciBsZW5ndGgsIGkgPSAwOwoKCQlpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHsKCQkJbGVuZ3RoID0gb2JqLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvciAoIGkgaW4gb2JqICkgewoJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seQoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CgkJCSIiIDoKCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCX0sCgoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIGFyciAhPSBudWxsICkgewoJCQlpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKCQlyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seQoJLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdAoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJCXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNoZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKCQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2YXIgbGVuZ3RoLCB2YWx1ZSwKCQkJaSA9IDAsCgkJCXJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwoJCWlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7CgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBpIGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldC5wdXNoKCB2YWx1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCgkvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgoJc3VwcG9ydDogc3VwcG9ydAp9ICk7CgppZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CglqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTsKfQoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCAiICIgKSwKZnVuY3Rpb24oIGksIG5hbWUgKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9ICk7CgpmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkgewoKCS8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcikKCS8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSkKCS8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwoJLy8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRQoJdmFyIGxlbmd0aCA9ICEhb2JqICYmICJsZW5ndGgiIGluIG9iaiAmJiBvYmoubGVuZ3RoLAoJCXR5cGUgPSB0b1R5cGUoIG9iaiApOwoKCWlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKCQl0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKfQp2YXIgU2l6emxlID0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNi0wOC0wOAogKi8KKGZ1bmN0aW9uKCB3aW5kb3cgKSB7Cgp2YXIgaSwKCXN1cHBvcnQsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJdG9rZW5pemUsCgljb21waWxlLAoJc2VsZWN0LAoJb3V0ZXJtb3N0Q29udGV4dCwKCXNvcnRJbnB1dCwKCWhhc0R1cGxpY2F0ZSwKCgkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCglzZXREb2N1bWVudCwKCWRvY3VtZW50LAoJZG9jRWxlbSwKCWRvY3VtZW50SXNIVE1MLAoJcmJ1Z2d5UVNBLAoJcmJ1Z2d5TWF0Y2hlcywKCW1hdGNoZXMsCgljb250YWlucywKCgkvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCglleHBhbmRvID0gInNpenpsZSIgKyAxICogbmV3IERhdGUoKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMgPSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVybiAwOwoJfSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNlLAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlCgkvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81CglpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7CgkJdmFyIGkgPSAwLAoJCQlsZW4gPSBsaXN0Lmxlbmd0aDsKCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfSwKCglib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCgoJLy8gUmVndWxhciBleHByZXNzaW9ucwoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRpZmllciA9ICIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsCgoJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGlkZW50aWZpZXIgKyAiKSg/OiIgKyB3aGl0ZXNwYWNlICsKCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQoJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKwoJCS8vICJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdIgoJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCgkJIipcXF0iLAoKCXBzZXVkb3MgPSAiOigiICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKwoJCS8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgoJcndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgIisiLCAiZyIgKSwKCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAoKCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAoJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAoKCXJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCAiPSIgKyB3aGl0ZXNwYWNlICsgIiooW15cXF0nXCJdKj8pIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsICJnIiApLAoKCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCglyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoICJeIiArIGlkZW50aWZpZXIgKyAiJCIgKSwKCgltYXRjaEV4cHIgPSB7CgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBpZGVudGlmaWVyICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50aWZpZXIgKyAiKSIgKSwKCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGlkZW50aWZpZXIgKyAifFsqXSkiICksCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCgkJIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwKCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKCQkvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgCgkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCgkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQoJfSwKCglyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJoZWFkZXIgPSAvXmhcZCQvaSwKCglybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCgoJcnNpYmxpbmcgPSAvWyt+XS8sCgoJLy8gQ1NTIGVzY2FwZXMKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKCXJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJcXFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIpfC4pIiwgImlnIiApLAoJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgewoJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwoJCS8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CgkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAoJCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKCQlyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/CgkJCWVzY2FwZWQgOgoJCQloaWdoIDwgMCA/CgkJCQkvLyBCTVAgY29kZXBvaW50CgkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQoJCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Cgl9LAoKCS8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uCgkvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXMKCXJjc3Nlc2NhcGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywKCWZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkgewoJCWlmICggYXNDb2RlUG9pbnQgKSB7CgoJCQkvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIKCQkJaWYgKCBjaCA9PT0gIlwwIiApIHsKCQkJCXJldHVybiAiXHVGRkZEIjsKCQkJfQoKCQkJLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHMKCQkJcmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgIlxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArICIgIjsKCQl9CgoJCS8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWQKCQlyZXR1cm4gIlxcIiArIGNoOwoJfSwKCgkvLyBVc2VkIGZvciBpZnJhbWVzCgkvLyBTZWUgc2V0RG9jdW1lbnQoKQoJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgoJLy8gZXJyb3IgaW4gSUUKCXVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKCQlzZXREb2N1bWVudCgpOwoJfSwKCglkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcigKCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgKCJmb3JtIiBpbiBlbGVtIHx8ICJsYWJlbCIgaW4gZWxlbSk7CgkJfSwKCQl7IGRpcjogInBhcmVudE5vZGUiLCBuZXh0OiAibGVnZW5kIiB9CgkpOwoKLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKdHJ5IHsKCXB1c2guYXBwbHkoCgkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAoJCXByZWZlcnJlZERvYy5jaGlsZE5vZGVzCgkpOwoJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKCS8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHkKCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cn0gY2F0Y2ggKCBlICkgewoJcHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggPwoKCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQoJCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CgkJfSA6CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5CgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCgkJCQlpID0gMDsKCQkJLy8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoCgkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Cgl2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3RvciwKCQluZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsCgoJCS8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnQKCQlub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTsKCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCgkvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dAoJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciIHx8ICFzZWxlY3RvciB8fAoJCW5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHsKCgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgoJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50cwoJaWYgKCAhc2VlZCApIHsKCgkJaWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHsKCQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CgoJCQkvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgImdldCpCeSoiIERPTSBtZXRob2QKCQkJLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQoJCQlpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewoKCQkJCS8vIElEIHNlbGVjdG9yCgkJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgewoKCQkJCQkvLyBEb2N1bWVudCBjb250ZXh0CgkJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJCS8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zCgkJCQkJCQkvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoKCQkJCQkvLyBFbGVtZW50IGNvbnRleHQKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJLy8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnMKCQkJCQkJLy8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCgkJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmCgkJCQkJCQllbGVtLmlkID09PSBtICkgewoKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9CgoJCQkJLy8gVHlwZSBzZWxlY3RvcgoJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwoJCQkJCXJldHVybiByZXN1bHRzOwoKCQkJCS8vIENsYXNzIHNlbGVjdG9yCgkJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYKCQkJCQljb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CgoJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CgkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQl9CgkJCX0KCgkJCS8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGwKCQkJaWYgKCBzdXBwb3J0LnFzYSAmJgoJCQkJIWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF0gJiYKCQkJCSghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgoJCQkJaWYgKCBub2RlVHlwZSAhPT0gMSApIHsKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IHNlbGVjdG9yOwoKCQkJCS8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudAoJCQkJLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKCQkJCS8vIFN1cHBvcnQ6IElFIDw9OAoJCQkJLy8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHMKCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgoJCQkJCS8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CgkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIChuaWQgPSBleHBhbmRvKSApOwoJCQkJCX0KCgkJCQkJLy8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7CgkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCWdyb3Vwc1tpXSA9ICIjIiArIG5pZCArICIgIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwoJCQkJCX0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCAiLCIgKTsKCgkJCQkJLy8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzCgkJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8CgkJCQkJCWNvbnRleHQ7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAoJCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCgkJCQkJCSk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0gY2F0Y2ggKCBxc2FFcnJvciApIHsKCQkJCQl9IGZpbmFsbHkgewoJCQkJCQlpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQWxsIG90aGVycwoJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwp9CgovKioKICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGgKICoJcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQogKi8KZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7Cgl2YXIga2V5cyA9IFtdOwoKCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgewoJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQoJCWlmICgga2V5cy5wdXNoKCBrZXkgKyAiICIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwoJCX0KCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsKCX0KCXJldHVybiBjYWNoZTsKfQoKLyoqCiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCiAqLwpmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewoJZm5bIGV4cGFuZG8gXSA9IHRydWU7CglyZXR1cm4gZm47Cn0KCi8qKgogKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkgewoJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTsKCgl0cnkgewoJCXJldHVybiAhIWZuKCBlbCApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVybiBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CgkJaWYgKCBlbC5wYXJlbnROb2RlICkgewoJCQllbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApOwoJCX0KCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCWVsID0gbnVsbDsKCX0KfQoKLyoqCiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQKICovCmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Cgl2YXIgYXJyID0gYXR0cnMuc3BsaXQoInwiKSwKCQlpID0gYXJyLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBhCiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBiICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkCiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWQKICovCmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHsKCgkvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGUKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWQKCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkCgkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWQKCQlpZiAoICJmb3JtIiBpbiBlbGVtICkgewoKCQkJLy8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOgoJCQkvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldAoJCQkvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkCgkJCS8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkCgkJCS8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkCgkJCS8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSAiZm9ybSIgcHJvcGVydHkuCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkgewoKCQkJCS8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50CgkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbSApIHsKCQkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQlyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFN1cHBvcnQ6IElFIDYgLSAxMQoJCQkJLy8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnMKCQkJCXJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8CgoJCQkJCS8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5CgkJCQkJLyoganNoaW50IC1XMDE4ICovCgkJCQkJZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiYKCQkJCQkJZGlzYWJsZWRBbmNlc3RvciggZWxlbSApID09PSBkaXNhYmxlZDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkOwoKCQkvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuCgkJLy8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0CgkJLy8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuCgkJfSBlbHNlIGlmICggImxhYmVsIiBpbiBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJfQoKCQkvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZAoJCXJldHVybiBmYWxzZTsKCX07Cn0KCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCiAqLwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAogKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dAogKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKICovCmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkgewoJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1MIG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LAoJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKCgkvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZAoJaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgoJLy8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXMKCWRvY3VtZW50ID0gZG9jOwoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCWRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApOwoKCS8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2UKCS8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpCglpZiAoIHByZWZlcnJlZERvYyAhPT0gZG9jdW1lbnQgJiYKCQkoc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHsKCgkJLy8gU3VwcG9ydDogSUUgMTEsIEVkZ2UKCQlpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJCQlzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5CgkJfSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkgewoJCQlzdWJXaW5kb3cuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIHVubG9hZEhhbmRsZXIgKTsKCQl9Cgl9CgoJLyogQXR0cmlidXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFN1cHBvcnQ6IElFPDgKCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcwoJLy8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCglzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Cgl9KTsKCgkvKiBnZXRFbGVtZW50KHMpQnkqCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCXN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Cgl9KTsKCgkvLyBTdXBwb3J0OiBJRTw5CglzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsKCgkvLyBTdXBwb3J0OiBJRTwxMAoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lCgkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcywKCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAoJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbzsKCQlyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKCX0pOwoKCS8vIElEIGZpbHRlciBhbmQgZmluZAoJaWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7CgkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJCUV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCQl2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJCQlyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107CgkJCX0KCQl9OwoJfSBlbHNlIHsKCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCQkJZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOwoJCQl9OwoJCX07CgoJCS8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHkKCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CgkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBub2RlLCBpLCBlbGVtcywKCQkJCQllbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCgkJCQlpZiAoIGVsZW0gKSB7CgoJCQkJCS8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlCgkJCQkJbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7CgkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQl9CgoJCQkJCS8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZQoJCQkJCWVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTsKCQkJCQlpID0gMDsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7CgkJCQkJCW5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgkJCQkJCWlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHsKCQkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gW107CgkJCX0KCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROCgkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgewoJCQkJcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CgkJCX0KCQl9IDoKCgkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJdmFyIGVsZW0sCgkJCQl0bXAgPSBbXSwKCQkJCWkgPSAwLAoJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbwoJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdG1wOwoJCQl9CgkJCXJldHVybiByZXN1bHRzOwoJCX07CgoJLy8gQ2xhc3MKCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCX0KCX07CgoJLyogUVNBL21hdGNoZXNTZWxlY3RvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKCgkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJcmJ1Z2d5TWF0Y2hlcyA9IFtdOwoKCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCgkvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3IKCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKCS8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCgkvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CglyYnVnZ3lRU0EgPSBbXTsKCglpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHsKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQoJCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCgkJCQkiPHNlbGVjdCBpZD0nIiArIGV4cGFuZG8gKyAiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPiIgKwoJCQkJIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKCgkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQoJCQkvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCAic2FmZSIgZm9yIFdpblJUCgkJCS8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IElFOAoJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44KwoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgifj0iKTsKCQkJfQoKCQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKCQkJaWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MQoJCQkvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzCgkJCWlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCIuIy4rWyt+XSIpOwoJCQl9CgkJfSk7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCWVsLmlubmVySFRNTCA9ICI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPiIgKwoJCQkJIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iOwoKCQkJLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzCgkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAoJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKCQkJZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiApOwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJuYW1lIiArIHdoaXRlc3BhY2UgKyAiKlsqXiR8IX5dPz0iICk7CgkJCX0KCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggIT09IDIgKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogSUU5LTExKwoJCQkvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHMKCQkJZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7CgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoICE9PSAyICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CgkJCX0KCgkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCgkJCWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQoJCQlzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgIioiICk7CgoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBlbCwgIltzIT0nJ106eCIgKTsKCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CgkJfSk7Cgl9CgoJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CglyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCJ8IikgKTsKCgkvKiBDb250YWlucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwoKCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgoJLy8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlCgkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8KCQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBiICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYgKCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJaWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKCQkJcmV0dXJuIHNvcnRJbnB1dCA/CgkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVudE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJYnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsKCQkJcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgoJCQkJYiA9PT0gZG9jdW1lbnQgPyAxIDoKCQkJCWF1cCA/IC0xIDoKCQkJCWJ1cCA/IDEgOgoJCQkJc29ydElucHV0ID8KCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJCX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2N1bWVudDsKfTsKClNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKfTsKClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCglleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOwoKCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkhY29tcGlsZXJDYWNoZVsgZXhwciArICIgIiBdICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoIChlKSB7fQoJfQoKCXJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cn07CgpTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7Cgl9CglyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxlbSApOwoJfQoKCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCgkJLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCgkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwoJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgoJCQl1bmRlZmluZWQ7CgoJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KCQl2YWwgOgoJCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwoJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CgkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKfTsKClNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkgewoJcmV0dXJuIChzZWwgKyAiIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8qKgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRlcyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKCWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJbnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hFeHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwKCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHktY29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJCX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJCXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKCQkJCX0pOwoJCX0sCgoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CgoJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CgkJCQl9CgkJCQlpZiAoICFvcGVyYXRvciApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCgkJCQlyZXN1bHQgKz0gIiI7CgoJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgoJCQkJCW9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJCQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAoJCQkJCQlkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIsCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCXVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLAoJCQkJCQlkaWZmID0gZmFsc2U7CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJCXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZUeXBlID8KCQkJCQkJCQkJCW5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CgkJCQkJCQkJCQlub2RlLm5vZGVUeXBlID09PSAxICkgewoKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewoKCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAoKCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCW5vZGUgPSBwYXJlbnQ7CgkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUgPDkgb25seQoJCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCShvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQkJY2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdOwoJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOwoJCQkJCQkJbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CgoJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKCgkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKCgkJCQkJCQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CgkJCQkJCQkJCXVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCgkJCQkJCQlpZiAoIHVzZUNhY2hlICkgewoJCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCQlub2RlID0gZWxlbTsKCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQljYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJCWRpZmYgPSBub2RlSW5kZXg7CgkJCQkJCQl9CgoJCQkJCQkJLy8geG1sIDpudGgtY2hpbGQoLi4uKQoJCQkJCQkJLy8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQoJCQkJCQkJaWYgKCBkaWZmID09PSBmYWxzZSApIHsKCQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CgkJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewoKCQkJCQkJCQkJaWYgKCAoIG9mVHlwZSA/CgkJCQkJCQkJCQlub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOgoJCQkJCQkJCQkJbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmCgkJCQkJCQkJCQkrK2RpZmYgKSB7CgoJCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAoJCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKCQkJCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQoJCQkJCQlkaWZmIC09IGxhc3Q7CgkJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJCX07CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwoJCQkvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCgkJCXZhciBhcmdzLAoJCQkJZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOwoKCQkJLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCgkJCWlmICggZm5bIGV4cGFuZG8gXSApIHsKCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKCQkJfQoKCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKCQkJCWFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKCQkJCQkJdmFyIGlkeCwKCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOwoJCQkJCQl9CgkJCQkJfSkgOgoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKCQkJCQl9OwoJCQl9CgoJCQlyZXR1cm4gZm47CgkJfQoJfSwKCglwc2V1ZG9zOiB7CgkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwoJCQl2YXIgaW5wdXQgPSBbXSwKCQkJCXJlc3VsdHMgPSBbXSwKCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CgoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsKCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pIDoKCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCQkJaW5wdXRbMF0gPSBlbGVtOwoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKCQkJCQkvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQoJCQkJCWlucHV0WzBdID0gbnVsbDsKCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7CgkJCQl9OwoJCX0pLAoKCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwoJCQl9OwoJCX0pLAoKCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CgkJCX07CgkJfSksCgoJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCgkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKCQkvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAoJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgoJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoJCS8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgoJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CgkJCS8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7CgkJCX0KCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgZWxlbUxhbmc7CgkJCQlkbyB7CgkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/CgkJCQkJCWVsZW0ubGFuZyA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgewoKCQkJCQkJZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwoJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOwoJCQkJCX0KCQkJCX0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJCX0pLAoKCQkvLyBNaXNjZWxsYW5lb3VzCgkJInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwoJCX0sCgoJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBkb2NFbGVtOwoJCX0sCgoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOwoJCX0sCgoJCS8vIEJvb2xlYW4gcHJvcGVydGllcwoJCSJlbmFibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksCgkJImRpc2FibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSwKCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwoJCX0sCgoJCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCgkJLy8gQ29udGVudHMKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAoJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQoJCQkvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwoJCX0sCgoJCS8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGF0dHI7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCgoJCQkJLy8gU3VwcG9ydDogSUU8OAoJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgoJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKCQl9LAoKCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CgkJfSksCgoJCSJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwoJCX0pLAoKCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDA7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CgkJCXZhciBpID0gMTsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwoJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CgkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KQoJfQp9OwoKRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKCi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwp9CmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CglFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwp9CgovLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOwpFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwoKdG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAoJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKCglpZiAoIGNhY2hlZCApIHsKCQlyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwoJfQoKCXNvRmFyID0gc2VsZWN0b3I7Cglncm91cHMgPSBbXTsKCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKCgl3aGlsZSAoIHNvRmFyICkgewoKCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CgkJCWlmICggbWF0Y2ggKSB7CgkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CgkJCX0KCQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKCQl9CgoJCW1hdGNoZWQgPSBmYWxzZTsKCgkJLy8gQ29tYmluYXRvcnMKCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKCQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCXRva2Vucy5wdXNoKHsKCQkJCXZhbHVlOiBtYXRjaGVkLAoJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCgkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKCQkJfSk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJfQoKCQkvLyBGaWx0ZXJzCgkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CgkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKCQkJCXRva2Vucy5wdXNoKHsKCQkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCW1hdGNoZXM6IG1hdGNoCgkJCQl9KTsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJCX0KCQl9CgoJCWlmICggIW1hdGNoZWQgKSB7CgkJCWJyZWFrOwoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCglyZXR1cm4gcGFyc2VPbmx5ID8KCQlzb0Zhci5sZW5ndGggOgoJCXNvRmFyID8KCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKCQkJLy8gQ2FjaGUgdGhlIHRva2VucwoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKfTsKCmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKCXZhciBpID0gMCwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCXNlbGVjdG9yID0gIiI7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7Cgl9CglyZXR1cm4gc2VsZWN0b3I7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJc2tpcCA9IGNvbWJpbmF0b3IubmV4dCwKCQlrZXkgPSBza2lwIHx8IGRpciwKCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewoJCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSA6CgoJCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsCgkJCQluZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTsKCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZwoJCQlpZiAoIHhtbCApIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKCgkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCXVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQlpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoJCQkJCQkJZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07CgkJCQkJCX0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiYKCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CgoJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKCQkJCQkJCXJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cwoJCQkJCQkJdW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7CgoJCQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Owp9CgpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IDoKCQltYXRjaGVyc1swXTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Cgl9CglyZXR1cm4gcmVzdWx0czsKfQoKZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsKCXZhciBlbGVtLAoJCW5ld1VubWF0Y2hlZCA9IFtdLAoJCWkgPSAwLAoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCgkJbWFwcGVkID0gbWFwICE9IG51bGw7CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCWlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCWlmICggbWFwcGVkICkgewoJCQkJCW1hcC5wdXNoKCBpICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG5ld1VubWF0Y2hlZDsKfQoKZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgewoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKCX0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKCX0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKCQl2YXIgdGVtcCwgaSwgZWxlbSwKCQkJcHJlTWFwID0gW10sCgkJCXBvc3RNYXAgPSBbXSwKCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0CgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCgoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CgkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6CgkJCQllbGVtcywKCgkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CgoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQoJCQkJCVtdIDoKCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5CgkJCQkJcmVzdWx0cyA6CgkJCQltYXRjaGVySW47CgoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCgkJaWYgKCBtYXRjaGVyICkgewoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwoJCX0KCgkJLy8gQXBwbHkgcG9zdEZpbHRlcgoJCWlmICggcG9zdEZpbHRlciApIHsKCQkJdGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKCgkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KCQkJaSA9IHRlbXAubGVuZ3RoOwoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggc2VlZCApIHsKCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKCQkJCWlmICggcG9zdEZpbmRlciApIHsKCQkJCQkvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHMKCQkJCQl0ZW1wID0gW107CgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAoJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CgkJCQl9CgoJCQkJLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCXdoaWxlICggaS0tICkgewoJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCQkvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSkKCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKCQkJcmV0dXJuIHJldDsKCQl9IF07CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKCQl9IGVsc2UgewoJCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7CgoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgoJCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZwoJCQkJaiA9ICsraTsKCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoCgkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCgkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmAKCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCgkJCQkJbWF0Y2hlciwKCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCgkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7CgkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAoJCQkJbWF0Y2hlZENvdW50ID0gMCwKCQkJCWkgPSAiMCIsCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAoJCQkJc2V0TWF0Y2hlZCA9IFtdLAoJCQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJtb3N0ICksCgkJCQkvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCgkJCQlsZW4gPSBlbGVtcy5sZW5ndGg7CgoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDsKCQkJfQoKCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCgkJCS8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlqID0gMDsKCQkJCQlpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7CgkJCQkJCXNldERvY3VtZW50KCBlbGVtICk7CgkJCQkJCXhtbCA9ICFkb2N1bWVudElzSFRNTDsKCQkJCQl9CgkJCQkJd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKCQkJCWlmICggYnlTZXQgKSB7CgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKCQkJCQkJbWF0Y2hlZENvdW50LS07CgkJCQkJfQoKCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CgkJCQkJaWYgKCBzZWVkICkgewoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YAoJCQkvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLgoJCQltYXRjaGVkQ291bnQgKz0gaTsKCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQkvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgCgkJCS8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQoJCQkvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLgoJCQkvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyAiMCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdAoJCQkvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvCgkJCS8vIG51bWVyaWNhbGx5IHplcm8uCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNlZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJCQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJaWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsKCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9ucwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKCS8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dCkKCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgoJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewoKCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbAoJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7CgkJCX0KCgkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOwoJCX0KCgkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJdG9rZW4gPSB0b2tlbnNbaV07CgoJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKCQkJCS8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycwoJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAoJCQkJCXJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKCQkJCSkpICkgewoKCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CgkJCQkJc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKCQkJCQlpZiAoICFzZWxlY3RvciApIHsKCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZAoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAoJCXNlZWQsCgkJY29udGV4dCwKCQkhZG9jdW1lbnRJc0hUTUwsCgkJcmVzdWx0cywKCQkhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CgkpOwoJcmV0dXJuIHJlc3VsdHM7Cn07CgovLyBPbmUtdGltZSBhc3NpZ25tZW50cwoKLy8gU29ydCBzdGFiaWxpdHkKc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CgovLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24Kc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7CgovLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKc2V0RG9jdW1lbnQoKTsKCi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgpzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKCXJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgovLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAppZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cn0pICkgewoJYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CgkJfQoJfSk7Cn0KCi8vIFN1cHBvcnQ6IElFPDkKLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKCWVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCXJldHVybiBlbC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKfSkgKSB7CglhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJdmFyIHZhbDsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CgkJCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KCQkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKCQl9Cgl9KTsKfQoKcmV0dXJuIFNpenpsZTsKCn0pKCB3aW5kb3cgKTsKCgoKalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKCi8vIERlcHJlY2F0ZWQKalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwpqUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlOwoKCgoKdmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJdmFyIG1hdGNoZWQgPSBbXSwKCQl0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CgoJd2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQlpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJbWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJfQoJfQoJcmV0dXJuIG1hdGNoZWQ7Cn07CgoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7Cgl2YXIgbWF0Y2hlZCA9IFtdOwoKCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CgkJCW1hdGNoZWQucHVzaCggbiApOwoJCX0KCX0KCglyZXR1cm4gbWF0Y2hlZDsKfTsKCgp2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKCgoKZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7CgogIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKfTsKdmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pICk7CgoKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewoJaWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwoJCX0gKTsKCX0KCgkvLyBTaW5nbGUgZWxlbWVudAoJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7CgkJfSApOwoJfQoKCS8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KQoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDsKCQl9ICk7Cgl9CgoJLy8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9ycwoJcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJfQoKCWlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJcmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTsKCX0KCglyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCX0gKSApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCByZXQsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfSApICk7CgkJfQoKCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTsKCgkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJcmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7Cgl9LAoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKCX0sCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5ndGg7Cgl9Cn0gKTsKCgovLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAoKCi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQp2YXIgcm9vdGpRdWVyeSwKCgkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCgkvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkCglycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLywKCglpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7CgkJdmFyIG1hdGNoLCBlbGVtOwoKCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCgkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CgkJLy8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKQoJCXJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCgkJCQlzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYKCQkJCXNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewoKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsgMSBdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDsKCgkJCQkJLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWyAxIF0sCgkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCgkJCQkJCXRydWUKCQkJCQkpICk7CgoJCQkJCS8vIEhBTkRMRTogJChodG1sLCBwcm9wcykKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCWZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7CgoJCQkJCQkJLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZQoJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CgkJCQkJCQkJdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOwoKCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQoJCQkJfSBlbHNlIHsKCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTsKCgkJCQkJaWYgKCBlbGVtICkgewoKCQkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpc1sgMCBdID0gZWxlbTsKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKCQkJdGhpc1sgMCBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID8KCQkJCXJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgoKCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKCQkJCXNlbGVjdG9yKCBqUXVlcnkgKTsKCQl9CgoJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwoJfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgovLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CgoKdmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoKCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWwgPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSAwOwoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CgkJdmFyIGN1ciwKCQkJaSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJbWF0Y2hlZCA9IFtdLAoJCQl0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTsKCgkJLy8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dAoJCWlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgoJCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID8KCQkJCQkJdGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6CgoJCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKCQkJCQkJY3VyLm5vZGVUeXBlID09PSAxICYmCgkJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKCgkJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBJbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLAoKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQoJCSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZVNvcnQoCgkJCQlqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCgkJCSkKCQkpOwoJfSwKCglhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Cn0gKTsKCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJd2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goIHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewogICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDsKICAgICAgICB9CgogICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seQogICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdAogICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgInRlbXBsYXRlIiApICkgewogICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CgoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcwoJCQlpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCQltYXRjaGVkLnJldmVyc2UoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7Cgl9Owp9ICk7CnZhciBybm90aHRtbHdoaXRlID0gKCAvW15ceDIwXHRcclxuXGZdKy9nICk7CgoKCi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0ge307CglqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9ICk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoKICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCWNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZwoJCWZpcmluZywKCgkJLy8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMKCQltZW1vcnksCgoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCgkJZmlyZWQsCgoJCS8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmcKCQlsb2NrZWQsCgoJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoKCQkvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXF1ZXVlID0gW10sCgoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKQoJCWZpcmluZ0luZGV4ID0gLTEsCgoJCS8vIEZpcmUgY2FsbGJhY2tzCgkJZmlyZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nCgkJCWxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7CgoJCQkvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucywKCQkJLy8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlcwoJCQlmaXJlZCA9IGZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkgewoJCQkJbWVtb3J5ID0gcXVldWUuc2hpZnQoKTsKCQkJCXdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgewoKCQkJCQkvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvbgoJCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmCgkJCQkJCW9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgoJCQkJCQkvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCgkJCQkJCWZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7CgkJCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdAoJCQlpZiAoICFvcHRpb25zLm1lbW9yeSApIHsKCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQl9CgoJCQlmaXJpbmcgPSBmYWxzZTsKCgkJCS8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kCgkJCWlmICggbG9ja2VkICkgewoKCQkJCS8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHMKCQkJCWlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCgkJCQkvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50CgkJCQl9IGVsc2UgewoJCQkJCWxpc3QgPSAiIjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCgkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCgkJCQkJLy8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmcKCQkJCQlpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewoJCQkJCQlmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTsKCQkJCQkJcXVldWUucHVzaCggbWVtb3J5ICk7CgkJCQkJfQoKCQkJCQkoIGZ1bmN0aW9uIGFkZCggYXJncyApIHsKCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCQlpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gInN0cmluZyIgKSB7CgoJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKCQkJCQkJCQlhZGQoIGFyZyApOwoJCQkJCQkJfQoJCQkJCQl9ICk7CgkJCQkJfSApKCBhcmd1bWVudHMgKTsKCgkJCQkJaWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHsKCQkJCQkJZmlyZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJCQl2YXIgaW5kZXg7CgkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7CgkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoKCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQlmaXJpbmdJbmRleC0tOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CgkJCQlyZXR1cm4gZm4gPwoJCQkJCWpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOgoJCQkJCWxpc3QubGVuZ3RoID4gMDsKCQkJfSwKCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZAoJCQkvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnMKCQkJLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbG9ja2VkID0gcXVldWUgPSBbXTsKCQkJCWxpc3QgPSBtZW1vcnkgPSAiIjsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgoJCQkvLyBEaXNhYmxlIC5maXJlCgkJCS8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpCgkJCS8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlsb2NrZWQgPSBxdWV1ZSA9IFtdOwoJCQkJaWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7CgkJCQkJbGlzdCA9IG1lbW9yeSA9ICIiOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFsb2NrZWQ7CgkJCX0sCgoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWlmICggIWxvY2tlZCApIHsKCQkJCQlhcmdzID0gYXJncyB8fCBbXTsKCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOwoJCQkJCXF1ZXVlLnB1c2goIGFyZ3MgKTsKCQkJCQlpZiAoICFmaXJpbmcgKSB7CgkJCQkJCWZpcmUoKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CgoKZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7CglyZXR1cm4gdjsKfQpmdW5jdGlvbiBUaHJvd2VyKCBleCApIHsKCXRocm93IGV4Owp9CgpmdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkgewoJdmFyIG1ldGhvZDsKCgl0cnkgewoKCQkvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yCgkJaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkgewoJCQltZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7CgoJCS8vIE90aGVyIHRoZW5hYmxlcwoJCX0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7CgkJCW1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7CgoJCS8vIE90aGVyIG5vbi10aGVuYWJsZXMKCQl9IGVsc2UgewoKCQkJLy8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOgoJCQkvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApCgkJCS8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpCgkJCXJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTsKCQl9CgoJLy8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zCgkvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluCgkvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLgoJfSBjYXRjaCAoIHZhbHVlICkgewoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5CgkJLy8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dAoJCXJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCggewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoKCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsCgkJCQkvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJtZW1vcnkiICksIDIgXSwKCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKCQkJCQlqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIDAsICJyZXNvbHZlZCIgXSwKCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwgMSwgInJlamVjdGVkIiBdCgkJCV0sCgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJCSJjYXRjaCI6IGZ1bmN0aW9uKCBmbiApIHsKCQkJCQlyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApOwoJCQkJfSwKCgkJCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJCQlwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CgkJCQkJdmFyIGZucyA9IGFyZ3VtZW50czsKCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgoJCQkJCQkJLy8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpCgkJCQkJCQl2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdOwoKCQkJCQkJCS8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KQoJCQkJCQkJLy8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pCgkJCQkJCQkvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KQoJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKAoJCQkJCQkJCQkJdGhpcywKCQkJCQkJCQkJCWZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzCgkJCQkJCQkJCSk7CgkJCQkJCQkJfQoJCQkJCQkJfSApOwoJCQkJCQl9ICk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSApLnByb21pc2UoKTsKCQkJCX0sCgkJCQl0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7CgkJCQkJdmFyIG1heERlcHRoID0gMDsKCQkJCQlmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7CgkJCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkJCXZhciB0aGF0ID0gdGhpcywKCQkJCQkJCQlhcmdzID0gYXJndW1lbnRzLAoJCQkJCQkJCW1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyIHJldHVybmVkLCB0aGVuOwoKCQkJCQkJCQkJLy8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjMKCQkJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTkKCQkJCQkJCQkJLy8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzCgkJCQkJCQkJCWlmICggZGVwdGggPCBtYXhEZXB0aCApIHsKCQkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7CgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xCgkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4CgkJCQkJCQkJCWlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHsKCQkJCQkJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iICk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNQoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NAoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NQoJCQkJCQkJCQkvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlCgkJCQkJCQkJCXRoZW4gPSByZXR1cm5lZCAmJgoKCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjQKCQkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0CgkJCQkJCQkJCQkvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHkKCQkJCQkJCQkJCSggdHlwZW9mIHJldHVybmVkID09PSAib2JqZWN0IiB8fAoJCQkJCQkJCQkJCXR5cGVvZiByZXR1cm5lZCA9PT0gImZ1bmN0aW9uIiApICYmCgkJCQkJCQkJCQlyZXR1cm5lZC50aGVuOwoKCQkJCQkJCQkJLy8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGUKCQkJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7CgoJCQkJCQkJCQkJLy8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvbgoJCQkJCQkJCQkJaWYgKCBzcGVjaWFsICkgewoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICkKCQkJCQkJCQkJCQkpOwoKCQkJCQkJCQkJCS8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzcwoJCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkJLy8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlcwoJCQkJCQkJCQkJCW1heERlcHRoKys7CgoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksCgkJCQkJCQkJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoICkKCQkJCQkJCQkJCQkpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXMKCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0CgkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCWlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7CgkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQlhcmdzID0gWyByZXR1cm5lZCBdOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpCgkJCQkJCQkJCQkvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZQoJCQkJCQkJCQkJKCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0sCgoJCQkJCQkJCS8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9ucwoJCQkJCQkJCXByb2Nlc3MgPSBzcGVjaWFsID8KCQkJCQkJCQkJbWlnaHRUaHJvdyA6CgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJCQltaWdodFRocm93KCk7CgkJCQkJCQkJCQl9IGNhdGNoICggZSApIHsKCgkJCQkJCQkJCQkJaWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHsKCQkJCQkJCQkJCQkJalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsCgkJCQkJCQkJCQkJCQlwcm9jZXNzLnN0YWNrVHJhY2UgKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjEKCQkJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MQoJCQkJCQkJCQkJCS8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9ucwoJCQkJCQkJCQkJCWlmICggZGVwdGggKyAxID49IG1heERlcHRoICkgewoKCQkJCQkJCQkJCQkJLy8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dAoJCQkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCQkJaWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkgewoJCQkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQkJCWFyZ3MgPSBbIGUgXTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJfTsKCgkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMQoJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTcKCQkJCQkJCS8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb20KCQkJCQkJCS8vIHN1YnNlcXVlbnQgZXJyb3JzCgkJCQkJCQlpZiAoIGRlcHRoICkgewoJCQkJCQkJCXByb2Nlc3MoKTsKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCS8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvbgoJCQkJCQkJCS8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luYwoJCQkJCQkJCWlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHsKCQkJCQkJCQkJcHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpOwoJCQkJCQkJCX0KCQkJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApOwoJCQkJCQkJfQoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoKCQkJCQkJLy8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKQoJCQkJCQl0dXBsZXNbIDAgXVsgMyBdLmFkZCgKCQkJCQkJCXJlc29sdmUoCgkJCQkJCQkJMCwKCQkJCQkJCQluZXdEZWZlciwKCQkJCQkJCQlpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgPwoJCQkJCQkJCQlvblByb2dyZXNzIDoKCQkJCQkJCQkJSWRlbnRpdHksCgkJCQkJCQkJbmV3RGVmZXIubm90aWZ5V2l0aAoJCQkJCQkJKQoJCQkJCQkpOwoKCQkJCQkJLy8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAxIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/CgkJCQkJCQkJCW9uRnVsZmlsbGVkIDoKCQkJCQkJCQkJSWRlbnRpdHkKCQkJCQkJCSkKCQkJCQkJKTsKCgkJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAyIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25SZWplY3RlZCApID8KCQkJCQkJCQkJb25SZWplY3RlZCA6CgkJCQkJCQkJCVRocm93ZXIKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQl9ICkucHJvbWlzZSgpOwoJCQkJfSwKCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwKCQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdOwoKCQkJLy8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkCgkJCXByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVTdHJpbmcgKSB7CgkJCQlsaXN0LmFkZCgKCQkJCQlmdW5jdGlvbigpIHsKCgkJCQkJCS8vIHN0YXRlID0gInJlc29sdmVkIiAoaS5lLiwgZnVsZmlsbGVkKQoJCQkJCQkvLyBzdGF0ZSA9ICJyZWplY3RlZCIKCQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKCQkJCQl9LAoKCQkJCQkvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCS8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsCgoJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGUKCQkJCQkvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsCgoJCQkJCS8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDIgXS5sb2NrLAoKCQkJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDMgXS5sb2NrCgkJCQkpOwoJCQl9CgoJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlCgkJCS8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlCgkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmUKCQkJbGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApOwoKCQkJLy8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfQoJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7CgkJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgoJCQkvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aAoJCQkvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJLy8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSApOwoKCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CgoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoKCQkvLyBBbGwgZG9uZSEKCQlyZXR1cm4gZGVmZXJyZWQ7Cgl9LAoKCS8vIERlZmVycmVkIGhlbHBlcgoJd2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkgewoJCXZhcgoKCQkJLy8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCgkJCXJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsCgoJCQkvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHMKCQkJaSA9IHJlbWFpbmluZywKCgkJCS8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGEKCQkJcmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSwKCQkJcmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoKCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZAoJCQltYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCgkJCS8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3RvcnkKCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwoJCQkJCWlmICggISggLS1yZW1haW5pbmcgKSApIHsKCQkJCQkJbWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoKCQkvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmUKCQlpZiAoIHJlbWFpbmluZyA8PSAxICkgewoJCQlhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsCgkJCQkhcmVtYWluaW5nICk7CgoJCQkvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApCgkJCWlmICggbWFzdGVyLnN0YXRlKCkgPT09ICJwZW5kaW5nIiB8fAoJCQkJaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7CgoJCQkJcmV0dXJuIG1hc3Rlci50aGVuKCk7CgkJCX0KCQl9CgoJCS8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzCgkJd2hpbGUgKCBpLS0gKSB7CgkJCWFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7CgkJfQoKCQlyZXR1cm4gbWFzdGVyLnByb21pc2UoKTsKCX0KfSApOwoKCi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LAovLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC4KdmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87CgpqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7CgoJLy8gU3VwcG9ydDogSUUgOCAtIDkgb25seQoJLy8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKCWlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7CgkJd2luZG93LmNvbnNvbGUud2FybiggImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTsKCX0KfTsKCgoKCmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQl0aHJvdyBlcnJvcjsKCX0gKTsKfTsKCgoKCi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQp2YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgoJcmVhZHlMaXN0CgkJLnRoZW4oIGZuICkKCgkJLy8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXAKCQkvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2sKCQkvLyByZWdpc3RyYXRpb24uCgkJLmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7CgkJCWpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTsKCQl9ICk7CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KCWlzUmVhZHk6IGZhbHNlLAoKCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCglyZWFkeVdhaXQ6IDEsCgoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewoKCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CgkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCX0KfSApOwoKalF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjsKCi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHsKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKCWpRdWVyeS5yZWFkeSgpOwp9CgovLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZAovLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seQovLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyAiaW50ZXJhY3RpdmUiIHRvbyBzb29uCmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fAoJKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkgewoKCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwoKfSBlbHNlIHsKCgkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCApOwoKCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKfQoKCgoKLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgp2YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGVsZW1zLmxlbmd0aCwKCQlidWxrID0ga2V5ID09IG51bGw7CgoJLy8gU2V0cyBtYW55IHZhbHVlcwoJaWYgKCB0b1R5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKCQljaGFpbmFibGUgPSB0cnVlOwoJCWZvciAoIGkgaW4ga2V5ICkgewoJCQlhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8gU2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmF3ID0gdHJ1ZTsKCQl9CgoJCWlmICggYnVsayApIHsKCgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0KCQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQkJZm4oCgkJCQkJZWxlbXNbIGkgXSwga2V5LCByYXcgPwoJCQkJCXZhbHVlIDoKCQkJCQl2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQoJCQkJKTsKCQkJfQoJCX0KCX0KCglpZiAoIGNoYWluYWJsZSApIHsKCQlyZXR1cm4gZWxlbXM7Cgl9CgoJLy8gR2V0cwoJaWYgKCBidWxrICkgewoJCXJldHVybiBmbi5jYWxsKCBlbGVtcyApOwoJfQoKCXJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDsKfTsKCgovLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKdmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7CgovLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7CglyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Cn0KCi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQovLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkgewoJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwp9CnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgewoKCS8vIEFjY2VwdHMgb25seToKCS8vICAtIE5vZGUKCS8vICAgIC0gTm9kZS5FTEVNRU5UX05PREUKCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCgkvLyAgLSBPYmplY3QKCS8vICAgIC0gQW55CglyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cn07CgoKCgpmdW5jdGlvbiBEYXRhKCkgewoJdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwp9CgpEYXRhLnVpZCA9IDE7CgpEYXRhLnByb3RvdHlwZSA9IHsKCgljYWNoZTogZnVuY3Rpb24oIG93bmVyICkgewoKCQkvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUKCQl2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCS8vIElmIG5vdCwgY3JlYXRlIG9uZQoJCWlmICggIXZhbHVlICkgewoJCQl2YWx1ZSA9IHt9OwoKCQkJLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCgkJCS8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCgkJCS8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LgoJCQlpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CgoJCQkJLy8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlcgoJCQkJLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQKCQkJCWlmICggb3duZXIubm9kZVR5cGUgKSB7CgkJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7CgoJCQkJLy8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5CgkJCQkvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQoJCQkJLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoJCQkJfSBlbHNlIHsKCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHsKCQkJCQkJdmFsdWU6IHZhbHVlLAoJCQkJCQljb25maWd1cmFibGU6IHRydWUKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB2YWx1ZTsKCX0sCglzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CgkJdmFyIHByb3AsCgkJCWNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJncwoJCS8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1NykKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJY2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKCQl9IGVsc2UgewoKCQkJLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKCQkJZm9yICggcHJvcCBpbiBkYXRhICkgewoJCQkJY2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07CgkJCX0KCQl9CgkJcmV0dXJuIGNhY2hlOwoJfSwKCWdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcy5jYWNoZSggb3duZXIgKSA6CgoJCQkvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpCgkJCW93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTsKCX0sCglhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHsKCgkJLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAoJCS8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAoJCS8vCgkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQoJCS8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKCQkvLwoJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKCQkvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5CgkJLy8KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CgkJCQkoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7CgkJfQoKCQkvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQoJCS8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwoJCS8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCgkJLy8KCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKCgkJLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cwoJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQoJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7Cgl9LAoJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKCQl2YXIgaSwKCQkJY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCWlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzCgkJCWlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7CgoJCQkJLy8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KCQkJCS8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LgoJCQkJa2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7CgkJCX0gZWxzZSB7CgkJCQlrZXkgPSBjYW1lbENhc2UoIGtleSApOwoKCQkJCS8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC4KCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCgkJCQlrZXkgPSBrZXkgaW4gY2FjaGUgPwoJCQkJCVsga2V5IF0gOgoJCQkJCSgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTsKCQkJfQoKCQkJaSA9IGtleS5sZW5ndGg7CgoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKCgkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUKCQkJLy8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKCQkJLy8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZAoJCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKQoJCQlpZiAoIG93bmVyLm5vZGVUeXBlICkgewoJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKCQkJfQoJCX0KCX0sCgloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CgkJdmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdOwoJCXJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTsKCX0KfTsKdmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTsKCnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7CgoKCi8vCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKLy8KLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAovLwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLy8JCXBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS4KLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgovLwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQovLwk1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcykKLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0Cgp2YXIgcmJyYWNlID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvW0EtWl0vZzsKCmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7CglpZiAoIGRhdGEgPT09ICJ0cnVlIiApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGRhdGEgPT09ICJmYWxzZSIgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggZGF0YSA9PT0gIm51bGwiICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCglpZiAoIGRhdGEgPT09ICtkYXRhICsgIiIgKSB7CgkJcmV0dXJuICtkYXRhOwoJfQoKCWlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHsKCQlyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApOwoJfQoKCXJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewoJdmFyIG5hbWU7CgoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNhc2UoKTsKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0gZ2V0RGF0YSggZGF0YSApOwoJCQl9IGNhdGNoICggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCXJldHVybiBkYXRhOwp9CgpqUXVlcnkuZXh0ZW5kKCB7CgloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTsKCX0sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWQKCS8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKCX0sCgoJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaSwgbmFtZSwgZGF0YSwKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJYXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgImhhc0RhdGFBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUgMTEgb25seQoJCQkJCQkvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NCkKCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgewoJCQkJCQkJbmFtZSA9IGF0dHJzWyBpIF0ubmFtZTsKCQkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CgkJCQkJCQkJbmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTsKCQkJfSApOwoJCX0KCgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZGF0YTsKCgkJCS8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CgkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCgkJCS8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0CgkJCS8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KCQkJaWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZQoJCQkJLy8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGEKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gQXR0ZW1wdCB0byAiZGlzY292ZXIiIHRoZSBkYXRhIGluCgkJCQkvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCgkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRhdGEuLi4KCQkJdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCgkJCQkvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5CgkJCQlkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApOwoJCX0gKTsKCX0KfSApOwoKCmpRdWVyeS5leHRlbmQoIHsKCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKCQl2YXIgcXVldWU7CgoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwoJCQlxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApOwoKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJcXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWV1ZS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOwoJCX0KCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCgkJCW5leHQgPSBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CgkJCX07CgoJCS8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkJc3RhcnRMZW5ndGgtLTsKCQl9CgoJCWlmICggZm4gKSB7CgoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CgkJCX0KCgkJCS8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CgkJfQoKCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCX0KCX0sCgoJLy8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmUKCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKCQlyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwgewoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLmFkZCggZnVuY3Rpb24oKSB7CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1ZSIsIGtleSBdICk7CgkJCX0gKQoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWyAwIF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9ICk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSApOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoKCS8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsKCQl2YXIgdG1wLAoJCQljb3VudCA9IDEsCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IHRoaXMubGVuZ3RoLAoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwoJCQkJfQoJCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJb2JqID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJd2hpbGUgKCBpLS0gKSB7CgkJCXRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0gKTsKdmFyIHBudW0gPSAoIC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8gKS5zb3VyY2U7Cgp2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CgoKdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKCnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgoJCS8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwoJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAoJCWVsZW0gPSBlbCB8fCBlbGVtOwoKCQkvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbAoJCXJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fAoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmCgoJCQkvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlCgkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1CgkJCS8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpcwoJCQkvLyBpbiB0aGUgZG9jdW1lbnQuCgkJCWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiYKCgkJCWpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSI7Cgl9OwoKdmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Cgl2YXIgcmV0LCBuYW1lLAoJCW9sZCA9IHt9OwoKCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCX0KCglyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwoKCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQoKCXJldHVybiByZXQ7Cn07CgoKCgpmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgewoJdmFyIGFkanVzdGVkLCBzY2FsZSwKCQltYXhJdGVyYXRpb25zID0gMjAsCgkJY3VycmVudFZhbHVlID0gdHdlZW4gPwoJCQlmdW5jdGlvbigpIHsKCQkJCXJldHVybiB0d2Vlbi5jdXIoKTsKCQkJfSA6CgkJCWZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsICIiICk7CgkJCX0sCgkJaW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLAoJCXVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAoKCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCWluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKCQkJcmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTsKCglpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgewoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTQKCQkvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpCgkJaW5pdGlhbCA9IGluaXRpYWwgLyAyOwoKCQkvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzCgkJdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdOwoKCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCWluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxOwoKCQl3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHsKCgkJCS8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuCgkJCS8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS4KCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApOwoJCQlpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHsKCQkJCW1heEl0ZXJhdGlvbnMgPSAwOwoJCQl9CgkJCWluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CgoJCX0KCgkJaW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyOwoJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTsKCgkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCXZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdOwoJfQoKCWlmICggdmFsdWVQYXJ0cyApIHsKCQlpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDsKCgkJLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkCgkJYWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gPwoJCQlpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOgoJCQkrdmFsdWVQYXJ0c1sgMiBdOwoJCWlmICggdHdlZW4gKSB7CgkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQl0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7CgkJCXR3ZWVuLmVuZCA9IGFkanVzdGVkOwoJCX0KCX0KCXJldHVybiBhZGp1c3RlZDsKfQoKCnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9OwoKZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7Cgl2YXIgdGVtcCwKCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCgkJbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLAoJCWRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTsKCglpZiAoIGRpc3BsYXkgKSB7CgkJcmV0dXJuIGRpc3BsYXk7Cgl9CgoJdGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApOwoJZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsICJkaXNwbGF5IiApOwoKCXRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApOwoKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCWRpc3BsYXkgPSAiYmxvY2siOwoJfQoJZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZGlzcGxheSwgZWxlbSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCS8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZQoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoKCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwoJCWlmICggc2hvdyApIHsKCgkJCS8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdykKCQkJLy8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyCgkJCS8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZCkKCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJkaXNwbGF5IiApIHx8IG51bGw7CgkJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CgkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQl9CgkJCX0KCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gIm5vbmUiOwoKCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmcKCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvdwoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkgewoJCQllbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgewoJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CgkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0gKTsKCX0KfSApOwp2YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7Cgp2YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pICk7Cgp2YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApOwoKCgovLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKQp2YXIgd3JhcE1hcCA9IHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCgkvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZQoJLy8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlbgoJLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgoJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgljb2w6IFsgMiwgIjx0YWJsZT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAoKCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCn07CgovLyBTdXBwb3J0OiBJRSA8PTkgb25seQp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Cgp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5CgkvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpCgl2YXIgcmV0OwoKCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgewoJCXJldCA9IFtdOwoJfQoKCWlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHsKCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKCi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZApmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Cgl2YXIgaSA9IDAsCgkJbCA9IGVsZW1zLmxlbmd0aDsKCglmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJZGF0YVByaXYuc2V0KAoJCQllbGVtc1sgaSBdLAoJCQkiZ2xvYmFsRXZhbCIsCgkJCSFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCgkJKTsKCX0KfQoKCnZhciByaHRtbCA9IC88fCYjP1x3KzsvOwoKZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKCXZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlub2RlcyA9IFtdLAoJCWkgPSAwLAoJCWwgPSBlbGVtcy5sZW5ndGg7CgoJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1sgaSBdOwoKCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKCgkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQoJCQlpZiAoIHRvVHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQoJCQl9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CgoJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKCQkJfSBlbHNlIHsKCQkJCXRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CgoJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgoJCQkJdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwoJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07CgoJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CgkJCQlqID0gd3JhcFsgMCBdOwoJCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQkJdG1wID0gdG1wLmxhc3RDaGlsZDsKCQkJCX0KCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CgoJCQkJLy8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIKCQkJCXRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQkJLy8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKQoJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9Cgl9CgoJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAoJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKCglpID0gMDsKCXdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CgoJCS8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpCgkJaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7CgkJCWlmICggaWdub3JlZCApIHsKCQkJCWlnbm9yZWQucHVzaCggZWxlbSApOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCgkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKCQl0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlpZiAoIGNvbnRhaW5zICkgewoJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKCQl9CgoJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKCQlpZiAoIHNjcmlwdHMgKSB7CgkJCWogPSAwOwoJCQl3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHsKCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGZyYWdtZW50Owp9CgoKKCBmdW5jdGlvbigpIHsKCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApLAoJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHkKCS8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpCgkvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCgkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAicmFkaW8iICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seQoJLy8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZAoJZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOwp9ICkoKTsKdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgoKdmFyCglya2V5RXZlbnQgPSAvXmtleS8sCglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkvOwoKZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKCXJldHVybiBmYWxzZTsKfQoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvCmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewoJdHJ5IHsKCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCX0gY2F0Y2ggKCBlcnIgKSB7IH0KfQoKZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHsKCXZhciBvcmlnRm4sIHR5cGU7CgoJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCglpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCW9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJfQoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgoJCS8vICggdHlwZXMsIGZuICkKCQlmbiA9IHNlbGVjdG9yOwoJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0gZWxzZSB7CgoJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9Cgl9CglpZiAoIGZuID09PSBmYWxzZSApIHsKCQlmbiA9IHJldHVybkZhbHNlOwoJfSBlbHNlIGlmICggIWZuICkgewoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggb25lID09PSAxICkgewoJCW9yaWdGbiA9IGZuOwoJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCgkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKCX0KCXJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkgewoJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCX0gKTsKfQoKLyoKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCWdsb2JhbDoge30sCgoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewoKCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCgkJCWV2ZW50cywgdCwgaGFuZGxlT2JqLAoJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCgkJCWVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZQoJCS8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KQoJCWlmICggc2VsZWN0b3IgKSB7CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAoJCWlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7CgkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OwoJCX0KCQlpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7CgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPwoJCQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCgkJCWlmICggIXR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCgkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9yaWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oICIuIiApCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQlpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fAoJCQkJCXNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CgoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2UgewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJfSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCgkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCWlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwoJCQl0bXAgPSB0bXBbIDIgXSAmJgoJCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOwoJCQl3aGlsZSAoIGotLSApIHsKCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CgoJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgoJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCgkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgoJCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwKCQkJCQkJc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CgkJCQkJfQoJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwKCQkJCQlzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCgkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CgkJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgImhhbmRsZSBldmVudHMiICk7CgkJfQoJfSwKCglkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkgewoKCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKCQl2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApOwoKCQl2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSwKCQkJYXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLAoJCQloYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJCS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1sgMCBdID0gZXZlbnQ7CgoJCWZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewoJCQlhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTsKCQl9CgoJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJd2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CgoJCQlqID0gMDsKCQkJd2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiYKCQkJCSFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoKCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2UocykKCQkJCS8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgoJCQkJaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKCgkJCQkJcmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fAoJCQkJCQloYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycywKCQkJaGFuZGxlclF1ZXVlID0gW10sCgkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAoJCQljdXIgPSBldmVudC50YXJnZXQ7CgoJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OQoJCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MCkKCQkJY3VyLm5vZGVUeXBlICYmCgoJCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDIKCQkJLy8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKQoJCQkvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrCgkJCS8vIFN1cHBvcnQ6IElFIDExIG9ubHkKCQkJLy8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgImNsaWNrcyIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0MykKCQkJISggZXZlbnQudHlwZSA9PT0gImNsaWNrIiAmJiBldmVudC5idXR0b24gPj0gMSApICkgewoKCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CgoJCQkJLy8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpCgkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09ICJjbGljayIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7CgkJCQkJbWF0Y2hlZEhhbmRsZXJzID0gW107CgkJCQkJbWF0Y2hlZFNlbGVjdG9ycyA9IHt9OwoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgewoJCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwoKCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwoKCQkJCQkJaWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7CgkJCQkJCQltYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycwoJCWN1ciA9IHRoaXM7CgkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewoJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTsKCQl9CgoJCXJldHVybiBoYW5kbGVyUXVldWU7Cgl9LAoKCWFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkgewoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwgewoJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQljb25maWd1cmFibGU6IHRydWUsCgoJCQlnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/CgkJCQlmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHsKCQkJCQkJCXJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTsKCQkJCQl9CgkJCQl9IDoKCQkJCWZ1bmN0aW9uKCkgewoJCQkJCWlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkgewoJCQkJCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdOwoJCQkJCX0KCQkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwgewoJCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCQkJCXdyaXRhYmxlOiB0cnVlLAoJCQkJCXZhbHVlOiB2YWx1ZQoJCQkJfSApOwoJCQl9CgkJfSApOwoJfSwKCglmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkgewoJCXJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KCQkJb3JpZ2luYWxFdmVudCA6CgkJCW5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCgkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKCQkJbm9CdWJibGU6IHRydWUKCQl9LAoJCWZvY3VzOiB7CgoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgoJCX0sCgkJYmx1cjogewoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKCQl9LAoJCWNsaWNrOiB7CgoJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKCQkJCQl0aGlzLmNsaWNrKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoKCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCgkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlyZXR1cm4gbm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCgkvLyBUaGlzICJpZiIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzCglpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApOwoJfQp9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKCQkJCXNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiYKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkKCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7CgoJCS8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllcwoJCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHkKCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCXRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/CgkJCXNyYy50YXJnZXQucGFyZW50Tm9kZSA6CgkJCXNyYy50YXJnZXQ7CgoJCXRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0OwoJCXRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0OwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwovLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzU2ltdWxhdGVkOiBmYWxzZSwKCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJfQoKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfQp9OwoKLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHMKalF1ZXJ5LmVhY2goIHsKCWFsdEtleTogdHJ1ZSwKCWJ1YmJsZXM6IHRydWUsCgljYW5jZWxhYmxlOiB0cnVlLAoJY2hhbmdlZFRvdWNoZXM6IHRydWUsCgljdHJsS2V5OiB0cnVlLAoJZGV0YWlsOiB0cnVlLAoJZXZlbnRQaGFzZTogdHJ1ZSwKCW1ldGFLZXk6IHRydWUsCglwYWdlWDogdHJ1ZSwKCXBhZ2VZOiB0cnVlLAoJc2hpZnRLZXk6IHRydWUsCgl2aWV3OiB0cnVlLAoJImNoYXIiOiB0cnVlLAoJY2hhckNvZGU6IHRydWUsCglrZXk6IHRydWUsCglrZXlDb2RlOiB0cnVlLAoJYnV0dG9uOiB0cnVlLAoJYnV0dG9uczogdHJ1ZSwKCWNsaWVudFg6IHRydWUsCgljbGllbnRZOiB0cnVlLAoJb2Zmc2V0WDogdHJ1ZSwKCW9mZnNldFk6IHRydWUsCglwb2ludGVySWQ6IHRydWUsCglwb2ludGVyVHlwZTogdHJ1ZSwKCXNjcmVlblg6IHRydWUsCglzY3JlZW5ZOiB0cnVlLAoJdGFyZ2V0VG91Y2hlczogdHJ1ZSwKCXRvRWxlbWVudDogdHJ1ZSwKCXRvdWNoZXM6IHRydWUsCgoJd2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uOwoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJcmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkgewoJCQlpZiAoIGJ1dHRvbiAmIDEgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCBidXR0b24gJiAyICkgewoJCQkJcmV0dXJuIDM7CgkJCX0KCgkJCWlmICggYnV0dG9uICYgNCApIHsKCQkJCXJldHVybiAyOwoJCQl9CgoJCQlyZXR1cm4gMDsKCQl9CgoJCXJldHVybiBldmVudC53aGljaDsKCX0KfSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwovLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LgovLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dAovLwovLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5Ci8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNTgKLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4KalF1ZXJ5LmVhY2goIHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKCXBvaW50ZXJlbnRlcjogInBvaW50ZXJvdmVyIiwKCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCWRlbGVnYXRlVHlwZTogZml4LAoJCWJpbmRUeXBlOiBmaXgsCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcmV0LAoJCQkJdGFyZ2V0ID0gdGhpcywKCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAoJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwoKCQkJLy8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewoJCXJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8KCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDoKCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9ICk7Cgl9Cn0gKTsKCgp2YXIKCgkvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgoJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5CglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksCgoJLyogZXNsaW50LWVuYWJsZSAqLwoKCS8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHkKCS8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuCgkvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLwoJcm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksCgoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKCi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93cwpmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglpZiAoIG5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgKSB7CgoJCXJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggInRib2R5IiApWyAwIF0gfHwgZWxlbTsKCX0KCglyZXR1cm4gZWxlbTsKfQoKLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgpmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgewoJZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICkgIT09IG51bGwgKSArICIvIiArIGVsZW0udHlwZTsKCXJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CglpZiAoICggZWxlbS50eXBlIHx8ICIiICkuc2xpY2UoIDAsIDUgKSA9PT0gInRydWUvIiApIHsKCQllbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTsKCX0gZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoICJ0eXBlIiApOwoJfQoKCXJldHVybiBlbGVtOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoJdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgoJaWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKCQlwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7CgkJcGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CgkJZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CgoJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyAyLiBDb3B5IHVzZXIgZGF0YQoJaWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHsKCQl1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7CgkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKCgkJZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOwoJfQp9CgovLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoJfQp9CgpmdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7CgoJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJYXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgl2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsCgkJaSA9IDAsCgkJbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAoJCWlOb0Nsb25lID0gbCAtIDEsCgkJdmFsdWUgPSBhcmdzWyAwIF0sCgkJdmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCWlmICggdmFsdWVJc0Z1bmN0aW9uIHx8CgkJCSggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJgoJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQl2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7CgkJCWlmICggdmFsdWVJc0Z1bmN0aW9uICkgewoJCQkJYXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7CgkJCX0KCQkJZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CgkJfSApOwoJfQoKCWlmICggbCApIHsKCQlmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApOwoJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQl9CgoJCS8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjawoJCWlmICggZmlyc3QgfHwgaWdub3JlZCApIHsKCQkJc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOwoKCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbQoJCQkvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJbm9kZSA9IGZyYWdtZW50OwoKCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CgkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwoKCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJCQkJaWYgKCBoYXNTY3JpcHRzICkgewoKCQkJCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJCQl9CgkJCQl9CgoJCQkJY2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7CgkJCX0KCgkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CgoJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwoJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOwoKCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewoJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07CgkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgoJCQkJCQkhZGF0YVByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgoJCQkJCQlqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJaWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCAiIiApLnRvTG93ZXJDYXNlKCkgICE9PSAibW9kdWxlIiApIHsKCgkJCQkJCQkvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudAoJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CgkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICksIGRvYywgbm9kZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBjb2xsZWN0aW9uOwp9CgpmdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCXZhciBub2RlLAoJCW5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSwKCQlpID0gMDsKCglmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7CgkJaWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKCQl9CgoJCWlmICggbm9kZS5wYXJlbnROb2RlICkgewoJCQlpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7CgkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJfQoJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTsKCQl9Cgl9CgoJcmV0dXJuIGVsZW07Cn0KCmpRdWVyeS5leHRlbmQoIHsKCWh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAoJCQlpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCgkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgoJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJCX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKCQkJaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCQlpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkgewoJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CgkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CgoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJaWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgkJfQoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOwoJfSwKCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwoJCQkJCX0KCQkJCX0gKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0gKTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKCQkJCXRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0gKTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwoKCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7CgkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOwoKCQlyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0gKTsKCX0sCgoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CgoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2ggKCBlICkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgaWdub3JlZCA9IFtdOwoKCQkvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnQKCQlyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQlpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkgewoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKCQkJCWlmICggcGFyZW50ICkgewoJCQkJCXBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJCX0KCQkJfQoKCQkvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uCgkJfSwgaWdub3JlZCApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAoJCQlpID0gMDsKCgkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKCQkJalF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0gKTsKdmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApOwoKdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApCgkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCgkJLy8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoICJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlIgoJCXZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQlpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHsKCQkJdmlldyA9IHdpbmRvdzsKCQl9CgoJCXJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTsKCX07Cgp2YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oICJ8IiApLCAiaSIgKTsKCgoKKCBmdW5jdGlvbigpIHsKCgkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQKCS8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uCglmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHsKCgkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZQoJCWlmICggIWRpdiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4OyIgKwoJCQkibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIjsKCQlkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7IiArCgkJCSJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4OyIgKwoJCQkid2lkdGg6NjAlO3RvcDoxJSI7CgkJZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTsKCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0CgkJcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjMKCQkvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3QKCQlkaXYuc3R5bGUucmlnaHQgPSAiNjAlIjsKCQlwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkJLy8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50cwoJCWJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjsKCgkJLy8gU3VwcG9ydDogSUUgOSBvbmx5CgkJLy8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KQoJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgImFic29sdXRlIjsKCgkJZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCgkJLy8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZAoJCS8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQKCQlkaXYgPSBudWxsOwoJfQoKCWZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHsKCQlyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7Cgl9CgoJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCwKCQlyZWxpYWJsZU1hcmdpbkxlZnRWYWwsCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFkaXYuc3R5bGUgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCS8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CglkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOwoKCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKCQl9LAoJCXBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsOwoJCX0sCgkJcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgkJcmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKCQl9LAoJCXNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkgewoJCQljb21wdXRlU3R5bGVUZXN0cygpOwoJCQlyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDsKCQl9Cgl9ICk7Cn0gKSgpOwoKCmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7Cgl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDUxKwoJCS8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3cKCQkvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzCgkJLy8gb24gZGV0YWNoZWQgZWxlbWVudHMKCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6CgkvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNykKCS8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KQoJaWYgKCBjb21wdXRlZCApIHsKCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKCgkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQl9CgoJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJLy8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsCgkJLy8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy4KCQkvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQlpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CgkJfQoJfQoKCXJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CgoJCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCQkvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgoJCXJldCArICIiIDoKCQlyZXQ7Cn0KCgpmdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgoJLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KCXJldHVybiB7CgkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJaWYgKCBjb25kaXRpb25GbigpICkgewoKCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZQoJCQkJLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCQkJcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfTsKfQoKCnZhcgoKCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUKCS8vIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglyY3VzdG9tUHJvcCA9IC9eLS0vLAoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogIjAiLAoJCWZvbnRXZWlnaHQ6ICI0MDAiCgl9LAoKCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk1veiIsICJtcyIgXSwKCWVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLnN0eWxlOwoKLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHsKCgkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAoJaWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHsKCQkJcmV0dXJuIG5hbWU7CgkJfQoJfQp9CgovLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG8KLy8gYSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkuCmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7Cgl2YXIgcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF07CglpZiAoICFyZXQgKSB7CgkJcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7Cgl9CglyZXR1cm4gcmV0Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoKCS8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4KCS8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludAoJdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CglyZXR1cm4gbWF0Y2hlcyA/CgoJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcwoJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgInB4IiApIDoKCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7Cgl2YXIgaSA9IGRpbWVuc2lvbiA9PT0gIndpZHRoIiA/IDEgOiAwLAoJCWV4dHJhID0gMCwKCQlkZWx0YSA9IDA7CgoJLy8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeQoJaWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApICkgewoJCXJldHVybiAwOwoJfQoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCgkJLy8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luCgkJaWYgKCBib3ggPT09ICJtYXJnaW4iICkgewoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgkJfQoKCQkvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgInBhZGRpbmciIG9yICJib3JkZXIiIG9yICJtYXJnaW4iCgkJaWYgKCAhaXNCb3JkZXJCb3ggKSB7CgoJCQkvLyBBZGQgcGFkZGluZwoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgoJCQkvLyBGb3IgImJvcmRlciIgb3IgIm1hcmdpbiIsIGFkZCBib3JkZXIKCQkJaWYgKCBib3ggIT09ICJwYWRkaW5nIiApIHsKCQkJCWRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKCgkJCS8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZQoJCQl9IGVsc2UgewoJCQkJZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgoJCS8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgImNvbnRlbnQiIG9yCgkJLy8gInBhZGRpbmciIG9yICJtYXJnaW4iCgkJfSBlbHNlIHsKCgkJCS8vIEZvciAiY29udGVudCIsIHN1YnRyYWN0IHBhZGRpbmcKCQkJaWYgKCBib3ggPT09ICJjb250ZW50IiApIHsKCQkJCWRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQkJfQoKCQkJLy8gRm9yICJjb250ZW50IiBvciAicGFkZGluZyIsIHN1YnRyYWN0IGJvcmRlcgoJCQlpZiAoIGJveCAhPT0gIm1hcmdpbiIgKSB7CgkJCQlkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CgkJCX0KCQl9Cgl9CgoJLy8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWwKCWlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7CgoJCS8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXIKCQkvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duCgkJZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbCgKCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCWNvbXB1dGVkVmFsIC0KCQkJZGVsdGEgLQoJCQlleHRyYSAtCgkJCTAuNQoJCSkgKTsKCX0KCglyZXR1cm4gZGVsdGE7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7CgoJLy8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZQoJdmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAoJCXZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7CgoJLy8gU3VwcG9ydDogRmlyZWZveCA8PTU0CgkvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS4KCWlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkgewoJCWlmICggIWV4dHJhICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCQl2YWwgPSAiYXV0byI7Cgl9CgoJLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKCXZhbHVlSXNCb3JkZXJCb3ggPSB2YWx1ZUlzQm9yZGVyQm94ICYmCgkJKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSApOwoKCS8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyAiYXV0byIKCS8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSkKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seQoJLy8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMikKCWlmICggdmFsID09PSAiYXV0byIgfHwKCQkhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiLCBmYWxzZSwgc3R5bGVzICkgPT09ICJpbmxpbmUiICkgewoKCQl2YWwgPSBlbGVtWyAib2Zmc2V0IiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdOwoKCQkvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlcwoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlOwoJfQoKCS8vIE5vcm1hbGl6ZSAiIiBhbmQgYXV0bwoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsCglyZXR1cm4gKCB2YWwgKwoJCWJveE1vZGVsQWRqdXN0bWVudCgKCQkJZWxlbSwKCQkJZGltZW5zaW9uLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveCwKCQkJc3R5bGVzLAoKCQkJLy8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSkKCQkJdmFsCgkJKQoJKSArICJweCI7Cn0KCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCgljc3NOdW1iZXI6IHsKCQkiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAoJCSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHt9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndAoJCS8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eQoJCS8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC4KCQlpZiAoICFpc0N1c3RvbVByb3AgKSB7CgkJCW5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApOwoJCX0KCgkJLy8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOwoKCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsKCQkJCXZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTsKCgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNikKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gIiIgOiAicHgiICk7CgkJCX0KCgkJCS8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXMKCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CgkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISggInNldCIgaW4gaG9va3MgKSB8fAoJCQkJKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggaXNDdXN0b21Qcm9wICkgewoJCQkJCXN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJfSBlbHNlIHsKCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKCQl2YXIgdmFsLCBudW0sIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3QKCQkvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5CgkJLy8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLgoJCWlmICggIWlzQ3VzdG9tUHJvcCApIHsKCQkJbmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7CgkJfQoKCQkvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwoJCX0KCgkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwoJCX0KCgkJLy8gQ29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQoJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CgkJfQoKCQkvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgoJCXJldHVybiB2YWw7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBkaW1lbnNpb24gKSB7CglqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0CgkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKCgkJCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrCgkJCQkJLy8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm8KCQkJCQkvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQoJCQkJCS8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGUKCQkJCQkvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuCgkJCQkJKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID8KCQkJCQkJc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApOwoJCQkJCQl9ICkgOgoJCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXZhciBtYXRjaGVzLAoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCgkJCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQkJCXN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KAoJCQkJCWVsZW0sCgkJCQkJZGltZW5zaW9uLAoJCQkJCWV4dHJhLAoJCQkJCWlzQm9yZGVyQm94LAoJCQkJCXN0eWxlcwoJCQkJKTsKCgkJCS8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZAoJCQkvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KQoJCQlpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7CgkJCQlzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoCgkJCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCQkJcGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC0KCQkJCQlib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgImJvcmRlciIsIGZhbHNlLCBzdHlsZXMgKSAtCgkJCQkJMC41CgkJCQkpOwoJCQl9CgoJCQkvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZAoJCQlpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmCgkJCQkoIG1hdGNoZXNbIDMgXSB8fCAicHgiICkgIT09ICJweCIgKSB7CgoJCQkJZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTsKCQkJCXZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7CgkJCX0KCgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CgkJfQoJfTsKfSApOwoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LAoJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCWlmICggY29tcHV0ZWQgKSB7CgkJCXJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgIm1hcmdpbkxlZnQiICkgKSB8fAoJCQkJZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KCQkJCQlzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CgkJCQkJfSApCgkJCQkpICsgInB4IjsKCQl9Cgl9Cik7CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKCB7CgltYXJnaW46ICIiLAoJcGFkZGluZzogIiIsCglib3JkZXI6ICJXaWR0aCIKfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKCQlleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGkgPSAwLAoJCQkJZXhwYW5kZWQgPSB7fSwKCgkJCQkvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCAiICIgKSA6IFsgdmFsdWUgXTsKCgkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggcHJlZml4ICE9PSAibWFyZ2luIiApIHsKCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZXMsIGxlbiwKCQkJCW1hcCA9IHt9LAoJCQkJaSA9IDA7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApOwoJCQkJbGVuID0gbmFtZS5sZW5ndGg7CgoJCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwoJCQkJfQoKCQkJCXJldHVybiBtYXA7CgkJCX0KCgkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CgkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9Cn0gKTsKCgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJLy8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCwKCQkJLy8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy4KCQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgoJCQkvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7CgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOwoKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCgkJCS8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LgoJCQkvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuCgkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7CgkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKCQkJCSggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8CgkJCQkJalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwoJCQl9IGVsc2UgewoJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCQl9CgkJfQoJfQp9OwoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKCX0sCglfZGVmYXVsdDogInN3aW5nIgp9OwoKalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CgovLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKCgoKdmFyCglmeE5vdywgaW5Qcm9ncmVzcywKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC87CgpmdW5jdGlvbiBzY2hlZHVsZSgpIHsKCWlmICggaW5Qcm9ncmVzcyApIHsKCQlpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApOwoJCX0KCgkJalF1ZXJ5LmZ4LnRpY2soKTsKCX0KfQoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0gKTsKCXJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApOwp9CgovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNoLAoJCWkgPSAwLAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKCgkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCgkvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7Cglmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJaWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHsKCgkJCS8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCXJldHVybiB0d2VlbjsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewoJdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LAoJCWlzQm94ID0gIndpZHRoIiBpbiBwcm9wcyB8fCAiaGVpZ2h0IiBpbiBwcm9wcywKCQlhbmltID0gdGhpcywKCQlvcmlnID0ge30sCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCWhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksCgkJZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzCglpZiAoICFvcHRzLnF1ZXVlICkgewoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7CgkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewoJCQlob29rcy51bnF1ZXVlZCA9IDA7CgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwoJCQlob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKCQkJCQlvbGRmaXJlKCk7CgkJCQl9CgkJCX07CgkJfQoJCWhvb2tzLnVucXVldWVkKys7CgoJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9ICk7CgkJfSApOwoJfQoKCS8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CgkJaWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCgkJCQkvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgInNob3ciIGFuZAoJCQkJLy8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGUKCQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsKCgkJCQkvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhCgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgkJfQoJfQoKCS8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpCglwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7CglpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKCQlyZXR1cm47Cgl9CgoJLy8gUmVzdHJpY3QgIm92ZXJmbG93IiBhbmQgImRpc3BsYXkiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnMKCWlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZAoJCS8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9ycwoJCS8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZQoJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTsKCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCAiZGlzcGxheSIgKTsKCQl9CgkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ICkgewoJCQkJZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQl9IGVsc2UgewoKCQkJCS8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHkKCQkJCXNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApOwoJCQkJcmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7CgkJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0gKTsKCQkJfQoJCX0KCgkJLy8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrCgkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkgewoJCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoKCQkJCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zCgkJCQlpZiAoICFwcm9wVHdlZW4gKSB7CgkJCQkJYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKCQkJCQkJc3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQkJCX0gKTsKCQkJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCQkJCWRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5OwoJCQkJCQlyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/ICIiIDogZGlzcGxheTsKCQkJCQl9CgkJCQl9CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJYW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOwoJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJfSApOwoJfQoKCS8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJcHJvcFR3ZWVuID0gZmFsc2U7Cglmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgoJCS8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uCgkJaWYgKCAhcHJvcFR3ZWVuICkgewoJCQlpZiAoIGRhdGFTaG93ICkgewoJCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApOwoJCQl9CgoJCQkvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCAicmV2ZXJzZXMiCgkJCWlmICggdG9nZ2xlICkgewoJCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKCQkJfQoKCQkJLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW0KCQkJaWYgKCBoaWRkZW4gKSB7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTsKCQkJfQoKCQkJLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovCgoJCQlhbmltLmRvbmUoIGZ1bmN0aW9uKCkgewoKCQkJLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi8KCgkJCQkvLyBUaGUgZmluYWwgc3RlcCBvZiBhICJoaWRlIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50CgkJCQlpZiAoICFoaWRkZW4gKSB7CgkJCQkJc2hvd0hpZGUoIFsgZWxlbSBdICk7CgkJCQl9CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CgkJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gUGVyLXByb3BlcnR5IHNldHVwCgkJcHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CgkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCWRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7CgkJCWlmICggaGlkZGVuICkgewoJCQkJcHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDsKCQkJCXByb3BUd2Vlbi5zdGFydCA9IDA7CgkJCX0KCQl9Cgl9Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7CgkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCgkJCS8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAoJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0gKSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoKCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHkKCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJCWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApOwoKCQkJLy8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZAoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvbgoJCQlpZiAoICFsZW5ndGggKSB7CgkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7CgkJCX0KCgkJCS8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uCgkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsKCQkJCXNwZWNpYWxFYXNpbmc6IHt9LAoJCQkJZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CgkJCX0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4gdHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJdmFyIGluZGV4ID0gMCwKCgkJCQkJLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCQkJCWlmICggc3RvcHBlZCApIHsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJCXN0b3BwZWQgPSB0cnVlOwoJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOwoJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSApLAoJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOwoKCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwoJCWlmICggcmVzdWx0ICkgewoJCQlpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7CgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQoJCQkJCXJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApOwoJCQl9CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfQoKCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CgoJaWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwoJfQoKCS8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglhbmltYXRpb24KCQkucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQllbGVtOiBlbGVtLAoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQoJCX0gKQoJKTsKCglyZXR1cm4gYW5pbWF0aW9uOwp9CgpqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CgoJdHdlZW5lcnM6IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApOwoJCQlhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTsKCQkJcmV0dXJuIHR3ZWVuOwoJCX0gXQoJfSwKCgl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewoJCWlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0KCX0sCgoJcHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCUFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CgkJfQoJfQp9ICk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJZHVyYXRpb246IHNwZWVkLAoJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCS8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZgoJaWYgKCBqUXVlcnkuZngub2ZmICkgewoJCW9wdC5kdXJhdGlvbiA9IDA7CgoJfSBlbHNlIHsKCQlpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09ICJudW1iZXIiICkgewoJCQlpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07CgoJCQl9IGVsc2UgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCQkJfQoJCX0KCX0KCgkvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCglpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKCQlvcHQucXVldWUgPSAiZngiOwoJfQoKCS8vIFF1ZXVlaW5nCglvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoKCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoKCQkvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CgkJCQl2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CgoJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CgkJCQlpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJgoJCQkJCSggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgewoKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuCgkJCS8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSApOwoJfSwKCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CgkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0cnVlOwoKCQkJLy8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7CgkJfSApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCggewoJc2xpZGVEb3duOiBnZW5GeCggInNob3ciICksCglzbGlkZVVwOiBnZW5GeCggImhpZGUiICksCglzbGlkZVRvZ2dsZTogZ2VuRngoICJ0b2dnbGUiICksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCWkgPSAwLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJZnhOb3cgPSBEYXRlLm5vdygpOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoKCQkvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWpRdWVyeS5meC5zdGFydCgpOwp9OwoKalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewoJaWYgKCBpblByb2dyZXNzICkgewoJCXJldHVybjsKCX0KCglpblByb2dyZXNzID0gdHJ1ZTsKCXNjaGVkdWxlKCk7Cn07CgpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgewoJaW5Qcm9ncmVzcyA9IG51bGw7Cn07CgpqUXVlcnkuZnguc3BlZWRzID0gewoJc2xvdzogNjAwLAoJZmFzdDogMjAwLAoKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKCQl2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CgkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsKCX0gKTsKfTsKCgooIGZ1bmN0aW9uKCkgewoJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAoJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCgkJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib3B0aW9uIiApICk7CgoJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5CgkvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSAib24iCglzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdAoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKCgkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHkKCS8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQudHlwZSA9ICJyYWRpbyI7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwp9ICkoKTsKCgp2YXIgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOwoJCX0KCgkJLy8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgoJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CgkJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTsKCgkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQlyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKCQkJCQlub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLAoJCQlpID0gMCwKCgkJCS8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKCQkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7CgoJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCXdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJfQoJCX0KCX0KfSApOwoKLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCXZhciByZXQsIGhhbmRsZSwKCQkJbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCgkJaWYgKCAhaXNYTUwgKSB7CgoJCQkvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCgkJCWhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTsKCQkJYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0OwoJCQlyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CgkJCQlsb3dlcmNhc2VOYW1lIDoKCQkJCW51bGw7CgkJCWF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gKTsKCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYKCQkJCSggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seQoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCgkJCQkvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKCgkJCQlpZiAoIHRhYmluZGV4ICkgewoJCQkJCXJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7CgkJCQl9CgoJCQkJaWYgKAoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CgkJCQkJcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYKCQkJCQllbGVtLmhyZWYKCQkJCSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCX0sCgoJcHJvcEZpeDogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNsYXNzIjogImNsYXNzTmFtZSIKCX0KfSApOwoKLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5Ci8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eQovLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCi8vIG9uIHRoZSBvcHRpb24KLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWQKLy8gd2hlbiBpbiBhbiBvcHRncm91cAovLyBlc2xpbnQgcnVsZSAibm8tdW51c2VkLWV4cHJlc3Npb25zIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlCi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcAppZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJLyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogIm9mZiIgKi8KCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJCWlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiAib2ZmIiAqLwoKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgpqUXVlcnkuZWFjaCggWwoJInRhYkluZGV4IiwKCSJyZWFkT25seSIsCgkibWF4TGVuZ3RoIiwKCSJjZWxsU3BhY2luZyIsCgkiY2VsbFBhZGRpbmciLAoJInJvd1NwYW4iLAoJImNvbFNwYW4iLAoJInVzZU1hcCIsCgkiZnJhbWVCb3JkZXIiLAoJImNvbnRlbnRFZGl0YWJsZSIKXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOwp9ICk7CgoKCgoJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlYwoJLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlCglmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHsKCQl2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTsKCQlyZXR1cm4gdG9rZW5zLmpvaW4oICIgIiApOwoJfQoKCmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgewoJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCAiY2xhc3MiICkgfHwgIiI7Cn0KCmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHsKCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CglpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107Cgl9CglyZXR1cm4gW107Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJY2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApOwoKCQlpZiAoIGNsYXNzZXMubGVuZ3RoICkgewoJCQl3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7CgkJCQljdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgewoJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgoJCQkJCWZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTsKCQkJCQlpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggImNsYXNzIiwgZmluYWxWYWx1ZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuYXR0ciggImNsYXNzIiwgIiIgKTsKCQl9CgoJCWNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJaWYgKCBjbGFzc2VzLmxlbmd0aCApIHsKCQkJd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgewoJCQkJY3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApOwoKCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgoJCQkJCQkvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPiAtMSApIHsKCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApOwoJCQkJCWlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7CgkJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09ICJzdHJpbmciIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7CgoJCWlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgaXNWYWxpZFZhbHVlICkgewoJCQlyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcygKCQkJCQl2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLAoJCQkJCXN0YXRlVmFsCgkJCQkpOwoJCQl9ICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJdmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lczsKCgkJCWlmICggaXNWYWxpZFZhbHVlICkgewoKCQkJCS8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCQlpID0gMDsKCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJCQl3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHsKCgkJCQkJLy8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQljbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApOwoJCQkJaWYgKCBjbGFzc05hbWUgKSB7CgoJCQkJCS8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlkYXRhUHJpdi5zZXQoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKCQkJCS8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCgkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAoJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgoJCQkJaWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHsKCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSggImNsYXNzIiwKCQkJCQkJY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CgkJCQkJCSIiIDoKCQkJCQkJZGF0YVByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIgoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSwgZWxlbSwKCQkJaSA9IDA7CgoJCWNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiOwoJCXdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCgkJCQkoICIgIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArICIgIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KfSApOwoKCgoKdmFyIHJyZXR1cm4gPSAvXHIvZzsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sCgkJCWVsZW0gPSB0aGlzWyAwIF07CgoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fAoJCQkJCWpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJgoJCQkJCSJnZXQiIGluIGhvb2tzICYmCgkJCQkJKCByZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSApICE9PSB1bmRlZmluZWQKCQkJCSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJcmV0ID0gZWxlbS52YWx1ZTsKCgkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCgkJCQlpZiAoIHR5cGVvZiByZXQgPT09ICJzdHJpbmciICkgewoJCQkJCXJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgIiIgKTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCXJldHVybiByZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQl2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewoJCQkJdmFsICs9ICIiOwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKCQkJCX0gKTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7CgkJCX0KCQl9ICk7Cgl9Cn0gKTsKCmpRdWVyeS5leHRlbmQoIHsKCXZhbEhvb2tzOiB7CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CgkJCQkJdmFsIDoKCgkJCQkJLy8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHkKCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCgkJCQkJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UKCQkJCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZQoJCQkJCXN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKCQkJfQoJCX0sCgkJc2VsZWN0OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgdmFsdWUsIG9wdGlvbiwgaSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsKCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlpID0gbWF4OwoKCQkJCX0gZWxzZSB7CgkJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAoJCQkJCQkJIW9wdGlvbi5kaXNhYmxlZCAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwKCQkJCQkJCQkhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxlbmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovCgoJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkID0KCQkJCQkJalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMQoJCQkJCSkgewoJCQkJCQlvcHRpb25TZXQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqLwoJCQkJfQoKCQkJCS8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CgkJCQlpZiAoICFvcHRpb25TZXQgKSB7CgkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9CgkJfQoJfQp9ICk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVlcnkuZWFjaCggWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7CgkJCX0KCQl9Cgl9OwoJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgewoJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwoJCX07Cgl9Cn0gKTsKCgoKCi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KCgpzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CgoKdmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAoJc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwgewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoKCQl2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCwKCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCgkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAoJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOwoKCQljdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewoKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggIi4iICk7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoICI6IiApIDwgMCAmJiAib24iICsgdHlwZTsKCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CgkJCWV2ZW50IDoKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwoKCQkvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCgkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKCQlldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID8KCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoKCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsKCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCQl9CgkJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKCQkJCXRtcCA9IGN1cjsKCQkJfQoKCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCgkJCWlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkgewoJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwoJCQl9CgkJfQoKCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCgkJaSA9IDA7CgkJd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbGFzdEVsZW1lbnQgPSBjdXI7CgkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CgkJCQlidWJibGVUeXBlIDoKCQkJCXNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKCgkJCS8vIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmCgkJCQlkYXRhUHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBOYXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgewoJCQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9CgkJfQoJCWV2ZW50LnR5cGUgPSB0eXBlOwoKCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCgkJCWlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAoJCQkJc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiYKCQkJCWFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJaWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKCgkJCQkJaWYgKCB0bXAgKSB7CgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQl9CgoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgoJCQkJCWlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQkJbGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTsKCQkJCQl9CgoJCQkJCWVsZW1bIHR5cGUgXSgpOwoKCQkJCQlpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCWxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7CgkJCQkJfQoKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoKCQkJCQlpZiAoIHRtcCApIHsKCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUKCS8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCglzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkgewoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVudCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlCgkJCX0KCQkpOwoKCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJfQoKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0gKTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIGVsZW0gPSB0aGlzWyAwIF07CgkJaWYgKCBlbGVtICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKCQl9Cgl9Cn0gKTsKCgovLyBTdXBwb3J0OiBGaXJlZm94IDw9NDQKLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50cwovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4NwovLwovLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjEKLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlcgovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1NwppZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7CglqUXVlcnkuZWFjaCggeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsKCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCQlkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7CgoJCQkJfSBlbHNlIHsKCQkJCQlkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOwoJCQkJfQoJCQl9CgkJfTsKCX0gKTsKfQp2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247Cgp2YXIgbm9uY2UgPSBEYXRlLm5vdygpOwoKdmFyIHJxdWVyeSA9ICggL1w/LyApOwoKCgovLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkgewoJdmFyIHhtbDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC4KCXRyeSB7CgkJeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7Cgl9IGNhdGNoICggZSApIHsKCQl4bWwgPSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKCX0KCXJldHVybiB4bWw7Cn07CgoKdmFyCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLAoJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwoKZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgewoJdmFyIG5hbWU7CgoJaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHsKCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCgkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CgkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CgoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcygKCQkJCQlwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKCQkJCQl2LAoJCQkJCXRyYWRpdGlvbmFsLAoJCQkJCWFkZAoJCQkJKTsKCQkJfQoJCX0gKTsKCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7CgoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlCgkJCXZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID8KCQkJCXZhbHVlT3JGdW5jdGlvbigpIDoKCQkJCXZhbHVlT3JGdW5jdGlvbjsKCgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsKCQkJCWVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQl9OwoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9ICk7CgoJfSBlbHNlIHsKCgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKCX0sCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0gKQoJCS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQl2YXIgdHlwZSA9IHRoaXMudHlwZTsKCgkJCS8vIFVzZSAuaXMoICI6ZGlzYWJsZWQiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTsKCQl9ICkKCQkubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJcmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQl9ICk7CgkJCX0KCgkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9ICkuZ2V0KCk7Cgl9Cn0gKTsKCgp2YXIKCXIyMCA9IC8lMjAvZywKCXJoYXNoID0gLyMuKiQvLAoJcmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCglybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKCXJwcm90b2NvbCA9IC9eXC9cLy8sCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKCgkvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW4KCW9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJb3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsCgkJCWkgPSAwLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdOwoKCQlpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJd2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkgewoKCQkJCS8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCgkJCQlpZiAoIGRhdGFUeXBlWyAwIF0gPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgIioiOwoJCQkJCSggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApOwoKCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKCQkJCX0gZWxzZSB7CgkJCQkJKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKCgl2YXIgaW5zcGVjdGVkID0ge30sCgkJc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7CgoJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CgkJdmFyIHNlbGVjdGVkOwoJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKCQkJdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkJaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYKCQkJCSFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9ICk7CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCglmb3IgKCBrZXkgaW4gc3JjICkgewoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgewoJCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCgkJY29udGVudHMgPSBzLmNvbnRlbnRzLAoJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCiAqLwpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7Cgl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKCQljb252ZXJ0ZXJzID0ge30sCgoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOwoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCgl3aGlsZSAoIGN1cnJlbnQgKSB7CgoJCWlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewoJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKCQl9CgoJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCgkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCQl9CgoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkJaWYgKCBjdXJyZW50ICkgewoKCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCQlpZiAoIGN1cnJlbnQgPT09ICIqIiApIHsKCgkJCQljdXJyZW50ID0gcHJldjsKCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7CgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CgoJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0CgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKCQkJCQkJCWlmICggY29udiApIHsKCgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzLnRocm93cyApIHsKCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJcmV0dXJuIHsKCQkJCQkJCQlzdGF0ZTogInBhcnNlcmVycm9yIiwKCQkJCQkJCQllcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudAoJCQkJCQkJfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQl0eXBlOiAiR0VUIiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLAoJCWdsb2JhbDogdHJ1ZSwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czogZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAvXGJ4bWxcYi8sCgkJCWh0bWw6IC9cYmh0bWwvLAoJCQlqc29uOiAvXGJqc29uXGIvCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKCQkJanNvbjogInJlc3BvbnNlSlNPTiIKCQl9LAoKCQkvLyBEYXRhIGNvbnZlcnRlcnMKCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0IjogU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogSlNPTi5wYXJzZSwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJdXJsOiB0cnVlLAoJCQljb250ZXh0OiB0cnVlCgkJfQoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJcmV0dXJuIHNldHRpbmdzID8KCgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKCgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIHRyYW5zcG9ydCwKCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KCQkJY2FjaGVVUkwsCgoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVXJsIGNsZWFudXAgdmFyCgkJCXVybEFuY2hvciwKCgkJCS8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbikKCQkJY29tcGxldGVkLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoKCQkJLy8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsCgkJCXVuY2FjaGVkLAoKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CgkJCQkJalF1ZXJ5LmV2ZW50LAoKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoKCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKCQkJcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAoKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID0KCQkJCQkJCXJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJCXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIGNvbXBsZXRlZCApIHsKCgkJCQkJCQkvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzCgkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CgkJCQkJfQoJCQkJCWRvbmUoIDAsIGZpbmFsVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCgkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgIiIgKQoJCQkucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKTsKCgkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CgkJcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAoJCXMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQl1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTUKCQkJLy8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCwKCQkJLy8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4LwoJCQl0cnkgewoJCQkJdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKCgkJCQkvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5CgkJCQkvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQoJCQkJdXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjsKCQkJCXMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyAiLy8iICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09CgkJCQkJdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiArIHVybEFuY2hvci5ob3N0OwoJCQl9IGNhdGNoICggZSApIHsKCgkJCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbiwKCQkJCS8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWQKCQkJCXMuY3Jvc3NEb21haW4gPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggY29tcGxldGVkICkgewoJCQlyZXR1cm4ganFYSFI7CgkJfQoKCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwoJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCgkJZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCgkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCgkJLy8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvbgoJCWNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrCgkJCXVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApOwoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgKSApIHsKCQkJCWNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgkJCQljYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsICIkMSIgKTsKCQkJCXVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7CgkJCX0KCgkJCS8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMikKCQkJcy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkOwoKCQkvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OCkKCQl9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJgoJCQkoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiApID09PSAwICkgewoJCQlzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCAiKyIgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAoJCQkiQWNjZXB0IiwKCQkJcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArCgkJCQkJKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CgkJCQlzLmFjY2VwdHNbICIqIiBdCgkJKTsKCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCgkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CgkJfQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYKCQkJKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHsKCgkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKCQl9CgoJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJY29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTsKCQlqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTsKCQlqcVhIUi5mYWlsKCBzLmVycm9yICk7CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCgkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50CgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CgkJCX0KCgkJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuIGpxWEhSOwoJCQl9CgoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJY29tcGxldGVkID0gZmFsc2U7CgkJCQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJLy8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9ucwoJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCgkJCQkvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHMKCQkJCWRvbmUoIC0xLCBlICk7CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb21wbGV0ZWQgPSB0cnVlOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImV0YWciICk7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaWYgbm8gY29udGVudAoJCQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7CgoJCQkJLy8gaWYgbm90IG1vZGlmaWVkCgkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKCQkJCX0gZWxzZSB7CgkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwoJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoKCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKCQkJCWlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOwoJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKCQkJCQkJc3RhdHVzID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0CgkJCWpxWEhSLnN0YXR1cyA9IHN0YXR1czsKCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKCgkJCS8vIFN1Y2Nlc3MvRXJyb3IKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKCQkJfSBlbHNlIHsKCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7CgkJCXN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBDb21wbGV0ZQoJCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CgoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCgkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKCQlpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKQoJCXJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCggewoJCQl1cmw6IHVybCwKCQkJdHlwZTogbWV0aG9kLAoJCQlkYXRhVHlwZTogdHlwZSwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2sKCQl9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTsKCX07Cn0gKTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KCB7CgkJdXJsOiB1cmwsCgoJCS8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KQoJCXR5cGU6ICJHRVQiLAoJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQljYWNoZTogdHJ1ZSwKCQlhc3luYzogZmFsc2UsCgkJZ2xvYmFsOiBmYWxzZSwKCQkidGhyb3dzIjogdHJ1ZQoJfSApOwp9OwoKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciB3cmFwOwoKCQlpZiAoIHRoaXNbIDAgXSApIHsKCQkJaWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCQlodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTsKCQkJfQoKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CgoJCQlpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOwoJCQl9CgoJCQl3cmFwLm1hcCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9ICkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7CgkJCX0gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSApOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApOwoJCX0gKTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCAiYm9keSIgKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCX0gKTsKCQlyZXR1cm4gdGhpczsKCX0KfSApOwoKCmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApOwp9OwpqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCXJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7Cn07CgoKCgpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoIGUgKSB7fQp9OwoKdmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7CgoJCS8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCgkJMDogMjAwLAoKCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCS8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCTEyMjM6IDIwNAoJfSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7CgpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwpzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKCmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHsKCXZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKCgkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CglpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoJCQkJdmFyIGksCgkJCQkJeGhyID0gb3B0aW9ucy54aHIoKTsKCgkJCQl4aHIub3BlbigKCQkJCQlvcHRpb25zLnR5cGUsCgkJCQkJb3B0aW9ucy51cmwsCgkJCQkJb3B0aW9ucy5hc3luYywKCQkJCQlvcHRpb25zLnVzZXJuYW1lLAoJCQkJCW9wdGlvbnMucGFzc3dvcmQKCQkJCSk7CgoJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKCQkJCQlmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgewoJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOwoJCQkJfQoKCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCgkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdICkgewoJCQkJCWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCX0KCgkJCQkvLyBTZXQgaGVhZGVycwoJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCX0KCgkJCQkvLyBDYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQljYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID0KCQkJCQkJCQl4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsKCQkJCQkJCQl4aHIuYWJvcnQoKTsKCQkJCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJCQkJLy8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzCgkJCQkJCQkJLy8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZQoJCQkJCQkJCWlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgewoJCQkJCQkJCQljb21wbGV0ZSggMCwgImVycm9yIiApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWNvbXBsZXRlKAoKCQkJCQkJCQkJCS8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CgkJCQkJCQkJCQl4aHIuc3RhdHVzLAoJCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKCQkJCQkJCQkJKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWNvbXBsZXRlKAoJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCQkJCQkJCQkvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpCgkJCQkJCQkJCS8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpCgkJCQkJCQkJCSggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRleHQiICB8fAoJCQkJCQkJCQl0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gInN0cmluZyIgPwoJCQkJCQkJCQkJeyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDoKCQkJCQkJCQkJCXsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAoJCQkJCQkJCQl4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX07CgoJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cwoJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CgkJCQllcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soICJlcnJvciIgKTsKCgkJCQkvLyBTdXBwb3J0OiBJRSA5IG9ubHkKCQkJCS8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CgkJCQkvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzCgkJCQlpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJeGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrOwoJCQkJfSBlbHNlIHsKCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgoJCQkJCQkvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXMKCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCgkJCQkJCQkvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCwKCQkJCQkJCS8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydAoJCQkJCQkJLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKCQkJCQkJCS8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZAoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQkJCWVycm9yQ2FsbGJhY2soKTsKCQkJCQkJCQl9CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoKCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIgKTsKCgkJCQl0cnkgewoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pCgkJCQkJeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwoJCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJdGhyb3cgZTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9ICk7CgoKCgovLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKQpqUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTsKCX0KfSApOwoKLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCggewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgIiArCgkJCSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSApOwoKLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpbgpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJfQp9ICk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJdmFyIHNjcmlwdCwgY2FsbGJhY2s7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewoJCQkJc2NyaXB0ID0galF1ZXJ5KCAiPHNjcmlwdD4iICkucHJvcCggewoJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKCQkJCQlzcmM6IHMudXJsCgkJCQl9ICkub24oCgkJCQkJImxvYWQgZXJyb3IiLAoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKCQkJCQkJc2NyaXB0LnJlbW92ZSgpOwoJCQkJCQljYWxsYmFjayA9IG51bGw7CgkJCQkJCWlmICggZXZ0ICkgewoJCQkJCQkJY29tcGxldGUoIGV2dC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwLCBldnQudHlwZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJKTsKCgkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CgkJCX0sCgkJCWFib3J0OiBmdW5jdGlvbigpIHsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0KCQkJfQoJCX07Cgl9Cn0gKTsKCgoKCnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoIHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwoJCXRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOwoJCXJldHVybiBjYWxsYmFjazsKCX0KfSApOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KCQkJInVybCIgOgoJCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJgoJCQkJKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkKCQkJCQkuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgoJCQkJcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgoJCSk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KCQkJcy5qc29ucENhbGxiYWNrKCkgOgoJCQlzLmpzb25wQ2FsbGJhY2s7CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIGpzb25Qcm9wICkgewoJCQlzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBGb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7CgoJCQkvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXQKCQkJaWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkgewoJCQkJalF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKCgkJCS8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCgkJCX0gZWxzZSB7CgkJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgkJCX0KCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCgkJCWlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgewoJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoKCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDsKCQl9ICk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSApOwoKCgoKLy8gU3VwcG9ydDogU2FmYXJpIDggb25seQovLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50Ci8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLgovLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzcKc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkgewoJdmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICkuYm9keTsKCWJvZHkuaW5uZXJIVE1MID0gIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IjsKCXJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwp9ICkoKTsKCgovLyBBcmd1bWVudCAiZGF0YSIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sCi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwKLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnQKLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwpqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkgewoJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIFtdOwoJfQoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9CgoJdmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0czsKCglpZiAoICFjb250ZXh0ICkgewoKCQkvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKCQkvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbgoJCWlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICk7CgoJCQkvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnQKCQkJLy8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHMKCQkJLy8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSkKCQkJYmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggImJhc2UiICk7CgkJCWJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CgkJCWNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApOwoJCX0gZWxzZSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudDsKCQl9Cgl9CgoJcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7CglzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwoKCS8vIFNpbmdsZSB0YWcKCWlmICggcGFyc2VkICkgewoJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdOwoJfQoKCXBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwp9OwoKCi8qKgogKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCiAqLwpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7Cgl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAoJCXNlbGYgPSB0aGlzLAoJCW9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCglpZiAoIG9mZiA+IC0xICkgewoJCXNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoKCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCWNhbGxiYWNrID0gcGFyYW1zOwoJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJdHlwZSA9ICJQT1NUIjsKCX0KCgkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAoJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CgkJalF1ZXJ5LmFqYXgoIHsKCQkJdXJsOiB1cmwsCgoJCQkvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCgkJCS8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZQoJCQkvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2QKCQkJdHlwZTogdHlwZSB8fCAiR0VUIiwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CgoJCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKCQkJCS8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwoJCQkJalF1ZXJ5KCAiPGRpdj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQgKTsKCgkJLy8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyAiZGF0YSIsICJzdGF0dXMiLCAianFYSFIiCgkJLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLgoJCS8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgImpxWEhSIiwgInN0YXR1cyIsICJlcnJvciIKCQl9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJc2VsZi5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJCX0gKTsKCQl9ICk7Cgl9CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWwoJImFqYXhTdGFydCIsCgkiYWpheFN0b3AiLAoJImFqYXhDb21wbGV0ZSIsCgkiYWpheEVycm9yIiwKCSJhamF4U3VjY2VzcyIsCgkiYWpheFNlbmQiCl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cgl9Owp9ICk7CgoKCgpqUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKCX0gKS5sZW5ndGg7Cn07CgoKCgpqUXVlcnkub2Zmc2V0ID0gewoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOwoKCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlcgoJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7CgkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwoJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0OwoKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCgkJCS8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KQoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoKCQl9IGVsc2UgewoJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKCQl9Cgl9Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJLy8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luCglvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQkvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KCQkJCXRoaXMgOgoJCQkJdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSApOwoJCX0KCgkJdmFyIHJlY3QsIHdpbiwKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApCgkJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkJLy8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYQoJCS8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvcgoJCWlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJLy8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUgoJCXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsKCQlyZXR1cm4gewoJCQl0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LAoJCQlsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQKCQl9OwoJfSwKCgkvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveAoJLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1sgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYywKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJLy8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKCgkJCS8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3QKCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJfSBlbHNlIHsKCQkJb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCgkJCS8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50CgkJCS8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYKCQkJCSggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJgoJCQkJalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlOwoJCQl9CgkJCWlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luCgkJCQlwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpOwoJCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUgKTsKCQkJfQoJCX0KCgkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwoJCXJldHVybiB7CgkJCXRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKCQl9OwoJfSwKCgkvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKCS8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KCS8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvdwoJLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAoJLy8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZgoJLy8KCS8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcwoJLy8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuCgkvLwoJLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OwoKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoKCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CgkJfSApOwoJfQp9ICk7CgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gInBhZ2VZT2Zmc2V0IiA9PT0gcHJvcDsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CgoJCQkvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3MKCQkJdmFyIHdpbjsKCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoJCQkJd2luID0gZWxlbTsKCQkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7CgkJCX0KCgkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCwKCQkJCQl0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXQKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApOwoJfTsKfSApOwoKLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OQovLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgovLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDcKLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUKalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCgkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCgkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7CgkJCX0KCQl9CgkpOwp9ICk7CgoKLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LAoJCWZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgewoKCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKCQkJCXZhciBkb2M7CgoJCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KQoJCQkJCXJldHVybiBmdW5jTmFtZS5pbmRleE9mKCAib3V0ZXIiICkgPT09IDAgPwoJCQkJCQllbGVtWyAiaW5uZXIiICsgbmFtZSBdIDoKCQkJCQkJZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAoJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoKCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApOwoJCX07Cgl9ICk7Cn0gKTsKCgpqUXVlcnkuZWFjaCggKCAiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIgKS5zcGxpdCggIiAiICksCglmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewoJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwoJfQp9ICk7CgoKCgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPwoJCQl0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6CgkJCXRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0KfSApOwoKLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55Ci8vIGFyZ3VtZW50cy4KLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKQovLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb24KalF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJdmFyIHRtcCwgYXJncywgcHJveHk7CgoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJdG1wID0gZm5bIGNvbnRleHQgXTsKCQljb250ZXh0ID0gZm47CgkJZm4gPSB0bXA7Cgl9CgoJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCglpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkgewoJCXJldHVybiB1bmRlZmluZWQ7Cgl9CgoJLy8gU2ltdWxhdGVkIGJpbmQKCWFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Cgl9OwoKCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJcmV0dXJuIHByb3h5Owp9OwoKalF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkgewoJaWYgKCBob2xkICkgewoJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCX0gZWxzZSB7CgkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7Cgl9Cn07CmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKalF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7CmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lOwpqUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93OwpqUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlOwpqUXVlcnkudHlwZSA9IHRvVHlwZTsKCmpRdWVyeS5ub3cgPSBEYXRlLm5vdzsKCmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkgewoKCS8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvCgkvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpCgkvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKQoJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CglyZXR1cm4gKCB0eXBlID09PSAibnVtYmVyIiB8fCB0eXBlID09PSAic3RyaW5nIiApICYmCgoJCS8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzICgiIikKCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQoJCS8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgoJCSFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTsKfTsKCgoKCi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgovLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAovLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQovLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoKLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhbgovLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQovLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCgppZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5OwoJfSApOwp9CgoKCgp2YXIKCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoKCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfJCA9IHdpbmRvdy4kOwoKalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cuJCA9IF8kOwoJfQoKCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CgkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Cgl9CgoJcmV0dXJuIGpRdWVyeTsKfTsKCi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1ECi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQppZiAoICFub0dsb2JhbCApIHsKCXdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKfQoKCgoKcmV0dXJuIGpRdWVyeTsKfSApOwo=" >
FIND j=5412 line=
FIND j=5413 line= </script>
FIND j=5414 line=
FIND j=5415 line=<!-- <script type="text/javascript" src="js/custom.js"></script> -->
FIND j=5416 line=<!-- <script type="text/javascript" src="js/custom.js"></script> -->
FIND j=5417 line=
FIND j=5418 line=
FIND j=5419 line= <script id="script_file" type="text/javascript">
FIND j=5420 line= $(function() {
FIND j=5421 line=// grab the file input and bind a change event onto it
FIND j=5422 line= $('#file').bind("change", function() {
FIND j=5423 line=// new html5 formdata object.
FIND j=5424 line= var formData = new FormData();
FIND j=5425 line=// for each entry, add to formdata to later access via $_FILES["file" + i]
FIND j=5426 line= for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
FIND j=5427 line= formData.append("file" + i, document.getElementById('file').files[i]);
FIND j=5428 line= }
FIND j=5429 line=
FIND j=5430 line=//send formdata to server-side
FIND j=5431 line= $.ajax({
FIND j=5432 line=// url: "file-upload.php", // our php file
FIND j=5433 line=// url: "ka1_fileupload.php", // our php file
FIND j=5434 line=// nurl: "http://ka1/ka1.php?q=up", // our php file
FIND j=5435 line=// url: "/kup.php", // our php file
FIND j=5436 line=// url: "/ka1_up.php", // our php file
FIND j=5437 line=// url: "/ka1.php?q=kup", // our php file
FIND j=5438 line=// url: "/ko0.php?q=kup", // our php file
FIND j=5439 line=// url: "/ko1.php?q=kup", // our php file
FIND j=5440 line= url: "/ko2.php?q=kup", // our php file
FIND j=5441 line=// bugs url: "10.0.0.112:/ka1.php?q=up", // our php file
FIND j=5442 line= type: 'post',
FIND j=5443 line= data: formData,
FIND j=5444 line= dataType: 'html', // we return html from our php file
FIND j=5445 line= async: true,
FIND j=5446 line= processData: false, // tell jQuery not to process the data
FIND j=5447 line= contentType: false, // tell jQuery not to set contentType
FIND j=5448 line= success : function(data) {
FIND j=5449 line= $('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
FIND j=5450 line= $('#upload-result .alert').append(data);
FIND j=5451 line= },
FIND j=5452 line= error : function(request) {
FIND j=5453 line= console.log(request.responseText);
FIND j=5454 line= }
FIND j=5455 line= });
FIND j=5456 line= });
FIND j=5457 line= });
FIND j=5458 line= </script id="script_file" >
FIND j=5459 line=
FIND j=5460 line= <hr color=white>
FIND j=5461 line= <hr color=black>
FIND j=5462 line= <div id='editableDiv' contenteditable='true'>paste
FIND j=5463 line= </div id="editableDiv" >
FIND j=5464 line= <hr color=black>
FIND j=5465 line= <hr color=white>
FIND j=5466 line= <hr color=black>
FIND j=5467 line= <div id="div_ffpaste" contenteditable='true'>ffpaste
FIND j=5468 line= </div id="div_ffpaste">
FIND j=5469 line= <hr color=black>
FIND j=5470 line= <hr color=white>
FIND j=5471 line=
FIND j=5472 line= <script id="script_clipboard" >
FIND j=5473 line= function handlePaste (e) {
FIND j=5474 line= var clipboardData, pastedData;
FIND j=5475 line=
FIND j=5476 line=// Stop data actually being pasted into div
FIND j=5477 line= e.stopPropagation();
FIND j=5478 line= e.preventDefault();
FIND j=5479 line=
FIND j=5480 line=// Get pasted data via clipboard API
FIND j=5481 line= clipboardData = e.clipboardData || window.clipboardData;
FIND j=5482 line= pastedData = clipboardData.getData('Text');
FIND j=5483 line=
FIND j=5484 line=// Do whatever with pasteddata
FIND j=5485 line= alert(pastedData);
FIND j=5486 line= }
FIND j=5487 line=
FIND j=5488 line= document.getElementById('editableDiv').addEventListener('paste', handlePaste);
FIND j=5489 line= </script id="script_clipboard" >
FIND j=5490 line=
FIND j=5491 line=
FIND j=5492 line= <script id="script_clipboard_ff" >
FIND j=5493 line= function handlepaste_ff (e) {
FIND j=5494 line= var types, pastedData, savedContent;
FIND j=5495 line=
FIND j=5496 line=// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
FIND j=5497 line= if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {
FIND j=5498 line=
FIND j=5499 line=// Check for 'text/html' in types list. See abligh's answer below for deatils on
FIND j=5500 line=// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
FIND j=5501 line=// Safari/Edge don't advertise HTML data even if it is available
FIND j=5502 line= types = e.clipboardData.types;
FIND j=5503 line= if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {
FIND j=5504 line=
FIND j=5505 line=// Extract data and pass it to callback
FIND j=5506 line= pastedData = e.clipboardData.getData('text/html');
FIND j=5507 line=// processPaste(editableDiv, pastedData);
FIND j=5508 line= processPaste_ff(editableDiv, pastedData);
FIND j=5509 line=
FIND j=5510 line=// Stop the data from actually being pasted
FIND j=5511 line= e.stopPropagation();
FIND j=5512 line= e.preventDefault();
FIND j=5513 line= return false;
FIND j=5514 line= }
FIND j=5515 line= }
FIND j=5516 line=
FIND j=5517 line=// Everything else: Move existing element contents to a DocumentFragment for safekeeping
FIND j=5518 line= savedContent = document.createDocumentFragment();
FIND j=5519 line= while(editableDiv.childNodes.length > 0) {
FIND j=5520 line= savedContent.appendChild(editableDiv.childNodes[0]);
FIND j=5521 line= }
FIND j=5522 line=
FIND j=5523 line=// Then wait for browser to paste content into it and cleanup
FIND j=5524 line= waitForPastedData(editableDiv, savedContent);
FIND j=5525 line= return true;
FIND j=5526 line= }
FIND j=5527 line=
FIND j=5528 line= function waitForPastedData (elem, savedContent) {
FIND j=5529 line=
FIND j=5530 line=// If data has been processes by browser, process it
FIND j=5531 line= if (elem.childNodes && elem.childNodes.length > 0) {
FIND j=5532 line=
FIND j=5533 line=// Retrieve pasted content via innerHTML
FIND j=5534 line=// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
FIND j=5535 line= var pastedData = elem.innerHTML;
FIND j=5536 line=
FIND j=5537 line=// Restore saved content
FIND j=5538 line= elem.innerHTML = "";
FIND j=5539 line= elem.appendChild(savedContent);
FIND j=5540 line=
FIND j=5541 line=// Call callback
FIND j=5542 line= processPaste_ff(elem, pastedData);
FIND j=5543 line= }
FIND j=5544 line=
FIND j=5545 line=// Else wait 20ms and try again
FIND j=5546 line= else {
FIND j=5547 line= setTimeout(function () {
FIND j=5548 line= waitForPastedData(elem, savedContent)
FIND j=5549 line= }, 20);
FIND j=5550 line= }
FIND j=5551 line= }
FIND j=5552 line=
FIND j=5553 line= function processPaste_ff (elem, pastedData) {
FIND j=5554 line=// Do whatever with gathered data;
FIND j=5555 line= alert(pastedData);
FIND j=5556 line= elem.focus();
FIND j=5557 line= }
FIND j=5558 line=
FIND j=5559 line=// Modern browsers. Note: 3rd argument is required for Firefox <= 6
FIND j=5560 line= if (editableDiv.addEventListener) {
FIND j=5561 line= editableDiv.addEventListener('paste', handlepaste, false);
FIND j=5562 line= }
FIND j=5563 line=// IE <= 8
FIND j=5564 line= else {
FIND j=5565 line= editableDiv.attachEvent('onpaste', handlepaste);
FIND j=5566 line= }
FIND j=5567 line=
FIND j=5568 line= $(document).on('paste','[contenteditable]',function(e) {
FIND j=5569 line= e.preventDefault();
FIND j=5570 line= var text = (e.originalEvent || e).clipboardData.getData('text/plain');
FIND j=5571 line= window.document.execCommand('insertText', false, text);
FIND j=5572 line= });
FIND j=5573 line= </script id="script_clipboard_ff" >
FIND j=5574 line=
FIND j=5575 line= <script id="script_clipboard_jskit" >
FIND j=5576 line= function getSelectionText(){
FIND j=5577 line= var selectedText = ""
FIND j=5578 line= if (window.getSelection){ // all modern browsers and IE9+
FIND j=5579 line= selectedText = window.getSelection().toString()
FIND j=5580 line= }
FIND j=5581 line= return selectedText
FIND j=5582 line= }
FIND j=5583 line=
FIND j=5584 line=
FIND j=5585 line= document.addEventListener('mouseup', function(){
FIND j=5586 line= var thetext = getSelectionText()
FIND j=5587 line= if (thetext.length > 0){ // check there's some text selected
FIND j=5588 line= console.log(thetext) // logs whatever textual content the user has selected on the page
FIND j=5589 line= }
FIND j=5590 line= }, false)
FIND j=5591 line=
FIND j=5592 line= function copySelectionText(){
FIND j=5593 line= var copysuccess // var to check whether execCommand successfully executed
FIND j=5594 line= try{
FIND j=5595 line= copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
FIND j=5596 line= }
FIND j=5597 line= catch(e){
FIND j=5598 line= copysuccess = false
FIND j=5599 line= }
FIND j=5600 line= return copysuccess
FIND j=5601 line= }
FIND j=5602 line=
FIND j=5603 line= </script id="script_clipboard_jskit" >
FIND j=5604 line=
FIND j=5605 line=<!--
FIND j=5606 line= <div name="div_dd" id="div_dd" hidden>
FIND j=5607 line= <div id="drop">
FIND j=5608 line= <span id="sw"><h1>drop jtfinc</h2></span>
FIND j=5609 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
FIND j=5610 line= <img height=200 width=300
FIND j=5611 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
FIND j=5612 line= </a>
FIND j=5613 line= </div>
FIND j=5614 line=
FIND j=5615 line= <div id="drag"> jtfdc:<br />
FIND j=5616 line= <img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
FIND j=5617 line=
FIND j=5618 line= <div class="drg"><h1>konet llc </h1>
FIND j=5619 line= <pre>timejask jkwii</pre>
FIND j=5620 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
FIND j=5621 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
FIND j=5622 line= <pre>timesak skwii</pre>
FIND j=5623 line= </div>
FIND j=5624 line=
FIND j=5625 line= <div class="drg"><h1>jtf29 </h1>
FIND j=5626 line= <a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
FIND j=5627 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
FIND j=5628 line= </a>
FIND j=5629 line= </div>
FIND j=5630 line=
FIND j=5631 line=
FIND j=5632 line= <div class="drg"><h1>dogheads</h1>
FIND j=5633 line= <div id="div_jtf_vid5">
FIND j=5634 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
FIND j=5635 line= <source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=5636 line= </video>
FIND j=5637 line= </div>
FIND j=5638 line= </div>
FIND j=5639 line=
FIND j=5640 line= <div class="drg"><h1>jtfdc night court lights action 3720</h1>
FIND j=5641 line= <div id="div_vid">
FIND j=5642 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
FIND j=5643 line= <source src="index_avril.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=5644 line= <source src="index_avril.webm" type="video/webm;codecs="vp8, vorbis"">
FIND j=5645 line= </video>
FIND j=5646 line= </div>
FIND j=5647 line= </div>
FIND j=5648 line= </div>
FIND j=5649 line= </div>
FIND j=5650 line= -->
FIND j=5651 line=
FIND j=5652 line= <script id="script_ytlist_load" >
FIND j=5653 line= function ytlist_load() {
FIND j=5654 line= j=0;;
FIND j=5655 line=
FIND j=5656 line= ytlist[j++] = 'ko0|ko0|ko0.us|';
FIND j=5657 line= ytlist[j++] = 'ko2|ko2|ko2.us|';
FIND j=5658 line= ytlist[j++] = '|duckduck_go|https://duckduckgo.com/';
FIND j=5659 line= ytlist[j++] = '|jpl_curiosity|https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2287';
FIND j=5660 line= ytlist[j++] = '|jpl_insight|https://mars.nasa.gov/insight/';
FIND j=5661 line= ytlist[j++] = '|jpl_bennu|http://pluto.jhuapl.edu/';
FIND j=5662 line= ytlist[j++] = '|jpl_osirisrex_thule|https://www.asteroidmission.org/';
FIND j=5663 line= ytlist[j++] = '|whatsitmean|http://whatdoesitmean.com/|';
FIND j=5664 line= ytlist[j++] = '|dailymail|https://www.dailymail.co.uk/ushome/index.html';
FIND j=5665 line= ytlist[j++] = '|zerohedge|http://zerohedge.com/';
FIND j=5666 line= ytlist[j++] = 'bluehost|http://bluehost.com/track/konet/ko2.us|';
FIND j=5667 line= ytlist[j++] = '|webb|webb_george|https://www.youtube.com/results?search_query=webb_george';
FIND j=5668 line= ytlist[j++] = '|preppy|preppy_kitty|https://www.youtube.com/results?search_query=prepper+kitty';
FIND j=5669 line= ytlist[j++] = '|quinn|quinn_micheals||https://www.youtube.com/user/quinnmichaels';
FIND j=5670 line= ytlist[j++] = '|kennedy|kennedy|https://www.youtube.com/channel/UCl609oqTRx-zBZ4vPfN2mqA';
FIND j=5671 line= ytlist[j++] = '|stropyme|stroppy_me|https://www.youtube.com/results?search_query=stroppy+me|';
FIND j=5672 line= ytlist[j++] = '|outerlite|outer_light|https://www.youtube.com/results?search_query=outer+light|';
FIND j=5673 line= ytlist[j++] = '|munder|munder|https://www.youtube.com/user/1Munder1|';
FIND j=5674 line= ytlist[j++] = '|dahboo77|dahboo77|https://www.youtube.com/results?search_query=dahboo77';
FIND j=5675 line= ytlist[j++] = '|secureteam|secureteam10|https://www.youtube.com/results?search_query=secureteam10';
FIND j=5676 line= ytlist[j++] = '|vlad96|vlad9t|https://www.youtube.com/results?search_query=vlad9t';
FIND j=5677 line= ytlist[j++] = '|newearth|newearth|https://www.youtube.com/results?search_query=new+earth';
FIND j=5678 line= ytlist[j++] = '|forester|forester_brian|https://www.youtube.com/results?search_query=brian+forrester';
FIND j=5679 line= ytlist[j++] = '|hoagland|hoagland|https://www.youtube.com/results?search_query=hoagland+richard';
FIND j=5680 line= ytlist[j++] = '|levenda||levenda|https://www.youtube.com/results?search_query=levenda+peter|';
FIND j=5681 line= ytlist[j++] = 'borealus|borealus_forum|https://www.youtube.com/results?search_query=borealis+forum';
FIND j=5682 line= ytlist[j++] = '|earthfiles|howe_linda_moultan|https://www.youtube.com/results?search_query=howe+linda';
FIND j=5683 line= ytlist[j++] = '|newsbud|https://www.youtube.com/results?search_query=newsbud|';
FIND j=5684 line= ytlist[j++] = '|lional|lional_nation|https://www.youtube.com/results?search_query=lionel+nation|';
FIND j=5685 line= ytlist[j++] = '|gooman|jason_goodman|https://www.youtube.com/channel/UC8Cl9QaRtuW9CNjP7pP4BBQ|';
FIND j=5686 line= ytlist[j++] = '|cernovich|cernovich|https://www.youtube.com/results?search_query=cernovich|';
FIND j=5687 line= ytlist[j++] = '|conte|conte_marcus|https://www.youtube.com/results?search_query=conte+marcus|';
FIND j=5688 line= ytlist[j++] = '|fulford|fulford_benjamin|https://www.youtube.com/results?search_query=fulford+benjamin';
FIND j=5689 line= ytlist[j++] = '||Julijana Sarac I Put A Spell On You|https://www.youtube.com/watch?v=jGhA2_ZcRVY&list=RDjGhA2_ZcRVY&start_radio=1';
FIND j=5690 line=
FIND j=5691 line= ytlist[j++] = 'redding|dreams_to_remeber|pn://www.youtube.com/watch?v=8UOf6kngJGw&list=RD8UOf6kngJGw&start_radio=1';
FIND j=5692 line=
FIND j=5693 line= ytlist[j++] = '|haggard|A place to fall apart Merle Haggard Janie Fricke|https://www.youtube.com/watch?v=iXPdB1ykWHE&list=RDiXPdB1ykWHE&start_radio=1|';
FIND j=5694 line=
FIND j=5695 line= ytlist[j++] = '|dreamers|Freddie & The Dreamers ~ I Understand/Auld Lang Syne|http://www.youtube.com/watch?v=Hy0AGS13dqc';
FIND j=5696 line=
FIND j=5697 line= ytlist[j++] = '|dreamers|telln_you_now_dreamers|https://www.youtube.com/watch?v=Qu3Yk_0oRy0&start_radio=1&list=RDQu3Yk_0oRy0';
FIND j=5698 line=
FIND j=5699 line= ytlist[j++] = '|drezmers|hog4u|https://www.youtube.com/watch?v=911rMO4l0sA';
FIND j=5700 line=
FIND j=5701 line= ytlist[j++] = '|cher|sony_cher-gotubabe|https://www.youtube.com/watch?v=Vp2Du8j2_L0';
FIND j=5702 line=
FIND j=5703 line= ytlist[j++] = '|remR|Everybody Hurts (Live at Glastonbury 2003) HQ|http://www.youtube.com/watch?v=NLlOeGeVih4';
FIND j=5704 line=
FIND j=5705 line= ytlist[j++] = '|once|once_upontime_west|https://www.youtube.com/watch?v=kOy6M_X2MO8';
FIND j=5706 line=
FIND j=5707 line= ytlist[j++] = '|pale|procol_harme_litershade_denmark|https://www.youtube.com/watch?v=St6jyEFe5WM';
FIND j=5708 line=
FIND j=5709 line= ytlist[j++] = '|pale|Procol Harum Whiter Shade of Pale 2verses|http://www.youtube.com/watch?v=vIWCSrG1d-Y';
FIND j=5710 line=
FIND j=5711 line= ytlist[j++] = 'deadsouth| - In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY|';
FIND j=5712 line= ytlist[j++] = '|pale|shadofpale_ships|https://www.youtube.com/watch?v=PYBqv3NIqho';
FIND j=5713 line=
FIND j=5714 line= ytlist[j++] = '|caro| nightlikethis|https://www.youtube.com/watch?v=Fc6izYdLhNE';
FIND j=5715 line=
FIND j=5716 line= ytlist[j++] = '|waits|time_cover_guitar|http://www.youtube.com/watch?v=uja4SHnfogo';
FIND j=5717 line=
FIND j=5718 line= ytlist[j++] = 'morrison|4seasons_back_on_top|https://www.youtube.com/watch?v=7fjTY_ABMj0&list=PL5A2209DE63BA79B8';
FIND j=5719 line=
FIND j=5720 line= ytlist[j++] = 'gurumal|delta_Delta Bayini|https://www.youtube.com/watch?v=oi6zbPjtO6I';
FIND j=5721 line=
FIND j=5722 line= ytlist[j++] = '|cohen|youb_you_got_me_singin|https://www.youtube.com/watch?v=3sFsT9vT6Fo';
FIND j=5723 line=
FIND j=5724 line= ytlist[j++] = 'dreamers|iunderst|https://www.youtube.com/watch?v=yo-1Des8i5M&list=PL9DF20D3DD3895F1C&index=4';
FIND j=5725 line=
FIND j=5726 line= ytlist[j++] = 'sledge|dark_end_of_the_street|https://www.youtube.com/watch?v=Gj3UdRmhgvM';
FIND j=5727 line=
FIND j=5728 line= ytlist[j++] = 'oesch|bavaria_yodl| https://www.youtube.com/watch?v=hVjNxV7qM90';
FIND j=5729 line=
FIND j=5730 line= ytlist[j++] = 'hagardlife_isgone2hellhttps://www.youtube.com/watch?v=iXPdB1ykWHE&start_radio=1&list=RDMMiXPdB1ykWHE';
FIND j=5731 line=
FIND j=5732 line= ytlist[j++] = 'claypton|xmas| https://www.youtube.com/watch?v=R7iKUCWTNWc&list=RDR7iKUCWTNWc&start_radio=1';
FIND j=5733 line=
FIND j=5734 line= ytlist[j++] = 'Guadalupe Pineda|Historia De Un Amor|https://www.youtube.com/watch?v=HzjE33U_gy8';
FIND j=5735 line=
FIND j=5736 line= ytlist[j++] = 'deadsouth|In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY';
FIND j=5737 line=
FIND j=5738 line= ytlist[j++] = 'morisson|4seasons|https://www.youtube.com/watch?v=zbxUXAMUeGk&list=PLFCFB9B1A93E89756&index=10';
FIND j=5739 line=
FIND j=5740 line= ytlist[j++] = 'morisan|playhousedown|https://www.youtube.com/watch?v=b0jqe40gmH4&list=PLFCFB9B1A93E89756&index=5';
FIND j=5741 line=
FIND j=5742 line= ytlist[j++] = '|van_morison|end_ofthe_land|https://www.youtube.com/watch?v=dui7_N0g_VY&index=6&list=PLFCFB9B1A93E89756';
FIND j=5743 line=
FIND j=5744 line= ytlist[j++] = '|vanloss|stariway|https://www.youtube.com/watch?v=gCE0MapWKJ8&index=7&list=PLFCFB9B1A93E89756';
FIND j=5745 line=
FIND j=5746 line= ytlist[j++] = 'fureys|last lovesong| https://www.youtube.com/watch?v=yNFiD1ZQZLU';
FIND j=5747 line=
FIND j=5748 line= ytlist[j++] = '|rush|cirlce_game|https://www.youtube.com/watch?v=q_C_rOOdXxs';
FIND j=5749 line=
FIND j=5750 line= ytlist[j++] = '|rush|circlgam2|https://www.youtube.com/watch?v=9yN-6PbqAPM';
FIND j=5751 line=
FIND j=5752 line= ytlist[j++] = 'rush|remberbergame| https://www.youtube.com/watch?v=xMFtm02rgF0';
FIND j=5753 line=
FIND j=5754 line= ytlist[j++] = 'lucinda_williams|broken_butterflies|https://www.youtube.com/watch?v=gLQ23LLtKJk';
FIND j=5755 line=
FIND j=5756 line=
FIND j=5757 line= ytlist[j++] = 'kou|python|https://www.youtube.com/watch?v=rfscVS0vtbw';
FIND j=5758 line=
FIND j=5759 line= ytlist[j++] = 'kou|blender28|https://www.youtube.com/watch?v=jBqYTgaFDxU';
FIND j=5760 line=
FIND j=5761 line= ytlist[j++] = 'kou|html|https://www.youtube.com/watch?v=pQN-pnXPaVg';
FIND j=5762 line=
FIND j=5763 line= ytlist[j++] = 'kou|sqlite3|https://www.youtube.com/watch?v=2eDKoXaJhPs';
FIND j=5764 line=
FIND j=5765 line=
FIND j=5766 line= ytlist[j++] = 'kou|visual_studio|https://www.youtube.com/watch?v=fnPhJHN0jTE';
FIND j=5767 line=
FIND j=5768 line= ytlist[j++] = 'kou|visual_studio_py|https://www.youtube.com/watch?v=72Alzsz8RyI';
FIND j=5769 line=
FIND j=5770 line=
FIND j=5771 line= ytlist[j++] = 'kou|php|https://www.youtube.com/watch?v=OK_JCtrrv-c';
FIND j=5772 line=
FIND j=5773 line= ytlist[j++] = 'kou|tensor|https://www.youtube.com/watch?v=tYYVSEHq-io';
FIND j=5774 line=
FIND j=5775 line= ytlist[j++] = 'kou|go|https://www.youtube.com/watch?v=5PTXdR8hLlQ';
FIND j=5776 line=
FIND j=5777 line= ytlist[j++] = 'kou|vi|https://www.youtube.com/watch?v=HMpB28l1sLc';
FIND j=5778 line=
FIND j=5779 line= ytlist[j++] = 'kou|tech_ingredients_speakers|https://www.youtube.com/watch?v=zdkyGDqU7xA';
FIND j=5780 line=
FIND j=5781 line= ytlist[j++] = 'kou|tech_ingredients_labshop|https://www.youtube.com/watch?v=nZefdoHmtJo';
FIND j=5782 line=
FIND j=5783 line= ytlist[j++] = 'kou|tech_ingredients_magnetics|https://www.youtube.com/watch?v=LS3GQk9ETRU';
FIND j=5784 line=
FIND j=5785 line= ytlist[j++] = 'kou|3dprint|https://www.youtube.com/watch?v=3LBTkLsjHGQ';
FIND j=5786 line=
FIND j=5787 line= ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
FIND j=5788 line=
FIND j=5789 line= ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
FIND j=5790 line=
FIND j=5791 line= alert( "BUGS_4715 ytlist len="+j );
FIND j=5792 line= }
FIND j=5793 line=
FIND j=5794 line= </script id="script_ytlist_load" >
FIND j=5795 line=
FIND j=5796 line=
FIND j=5797 line=<!---
FIND j=5798 line= <script id="script_dragable" type="text/javascript">
FIND j=5799 line=
FIND j=5800 line= $(document).ready(function() {
FIND j=5801 line=// sets the draggable
FIND j=5802 line= $('#drag .drg').draggable({
FIND j=5803 line= cursor: 'move', // sets the cursor apperance
FIND j=5804 line= revert: 'valid'
FIND j=5805 line= });
FIND j=5806 line=
FIND j=5807 line=
FIND j=5808 line=// sets droppable
FIND j=5809 line=// after the draggable is droped, hides it with a hide() effect
FIND j=5810 line= $('#drop').droppable({
FIND j=5811 line= drop: function(event, ui) {
FIND j=5812 line= ui.draggable.hide(1000);
FIND j=5813 line=
FIND j=5814 line= }
FIND j=5815 line= });
FIND j=5816 line=
FIND j=5817 line=// after the draggable is droped, hides it with a hide() effect
FIND j=5818 line= $('#drop1').droppable({
FIND j=5819 line= drop: function(event, ui) {
FIND j=5820 line= ui.draggable.hide(1000);
FIND j=5821 line= }
FIND j=5822 line= });
FIND j=5823 line=
FIND j=5824 line= $('#drop2').droppable({
FIND j=5825 line= drop: function(event, ui) {
FIND j=5826 line=// after the draggable is droped, hides it with a hide() effect
FIND j=5827 line= ui.draggable.hide(1000);
FIND j=5828 line= }
FIND j=5829 line= });
FIND j=5830 line=
FIND j=5831 line=// when the "#sw" element (inside the "#drop") is clicked
FIND j=5832 line=// show the items with class "drg", contained in "#drag"
FIND j=5833 line=// $('#drag .drg').slideDown(1000);
FIND j=5834 line= $('#drop #sw').click(function(){
FIND j=5835 line= var url = "https://ka6//ko_center/ko_center.php?q=jqui/dragdrop1/"
FIND j=5836 line= $(location).attr('href',url);
FIND j=5837 line= });
FIND j=5838 line= });
FIND j=5839 line= </script>
FIND j=5840 line= -->
FIND j=5841 line=<!--
FIND j=5842 line=
FIND j=5843 line= <style type="text/css">
FIND j=5844 line= #drop {
FIND j=5845 line= width:200px;
FIND j=5846 line= height:150px;
FIND j=5847 line= margin:3px auto;
FIND j=5848 line= background:#eddaa8;
FIND j=5849 line= font-size:16px;
FIND j=5850 line= }
FIND j=5851 line= #drop #sw { text-decoration:underline; cursor:pointer; }
FIND j=5852 line= #drag {
FIND j=5853 line=// width:450px;
FIND j=5854 line=// height:180px;
FIND j=5855 line= width:50px;
FIND j=5856 line= height:50px;
FIND j=5857 line=
FIND j=5858 line= margin:12px auto;
FIND j=5859 line= border:1px solid darkslategrey;
FIND j=5860 line=// border:1px solid silver;
FIND j=5861 line= font-size:16px;
FIND j=5862 line= }
FIND j=5863 line= #drag .drg { margin:10px 12px; }
FIND j=5864 line= #drag div.drg {
FIND j=5865 line= width:150px;
FIND j=5866 line= height:50px;
FIND j=5867 line= background:#07da08;
FIND j=5868 line= border:2px solid lightblue;
FIND j=5869 line= }
FIND j=5870 line= </style>
FIND j=5871 line= -->
FIND j=5872 line=
FIND j=5873 line=
FIND j=5874 line=
FIND j=5875 line=<!--
FIND j=5876 line= <div name="div_dd" id="div_dd" hidden>
FIND j=5877 line= <div id="drop">
FIND j=5878 line= <span id="sw"><h1>drop jtfinc</h2></span>
FIND j=5879 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
FIND j=5880 line= <img height=200 width=300
FIND j=5881 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
FIND j=5882 line= </a>
FIND j=5883 line= </div>
FIND j=5884 line= -->
FIND j=5885 line=<!--
FIND j=5886 line= <div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
FIND j=5887 line= <img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
FIND j=5888 line=
FIND j=5889 line= <div class="drg"><h1>konet llc </h1>
FIND j=5890 line= <pre>timejask jkwii</pre>
FIND j=5891 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
FIND j=5892 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
FIND j=5893 line= <pre>timesak skwii</pre>
FIND j=5894 line= </div>
FIND j=5895 line=
FIND j=5896 line= <div class="drg"><h1>jtf29 </h1>
FIND j=5897 line= <a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
FIND j=5898 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
FIND j=5899 line= </a>
FIND j=5900 line= </div>
FIND j=5901 line=
FIND j=5902 line=
FIND j=5903 line= <div class="drg"><h1>dogheads</h1>
FIND j=5904 line= <div id="div_jtf_vid5">
FIND j=5905 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
FIND j=5906 line= <source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=5907 line= </video>
FIND j=5908 line= </div>
FIND j=5909 line= </div>
FIND j=5910 line=
FIND j=5911 line= <div class="drg"><h1>jtfdc night court lights action 3720</h1>
FIND j=5912 line= <div id="div_vid">
FIND j=5913 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
FIND j=5914 line= <source src="index_avril.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=5915 line= <source src="index_avril.webm" type="video/webm;codecs="vp8, vorbis"">
FIND j=5916 line= </video>
FIND j=5917 line= </div>
FIND j=5918 line= </div>
FIND j=5919 line= </div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
FIND j=5920 line= </div>
FIND j=5921 line= -->
FIND j=5922 line=
FIND j=5923 line= <div id="myCanvas_jkwii" ></div>
FIND j=5924 line=
FIND j=5925 line=<!--
FIND j=5926 line= <script id="script_js_bb_onload" type='text/javascript'>
FIND j=5927 line= window.onload = function() {
FIND j=5928 line=// startup();
FIND j=5929 line= var myCanvas = document.getElementById('myCanvas_jkwii');
FIND j=5930 line= var ctx = myCanvas.getContext('2d');
FIND j=5931 line=
FIND j=5932 line= myCanvas.width = window.innerWidth; myCanvas.height = window.innerHeight;
FIND j=5933 line= myCanvas.width = window.innerWidth / 2; myCanvas.height = window.innerHeight / 2 ;
FIND j=5934 line= ctx.fillStyle='black'
FIND j=5935 line= ctx.fillStyle='white'
FIND j=5936 line= ctx.fillStyle='blue'
FIND j=5937 line= ctx.fillRect(0, 0, myCanvas.width, myCanvas.height);
FIND j=5938 line= }
FIND j=5939 line= </script id="script_js_bb_onload" >
FIND j=5940 line=
FIND j=5941 line= <script id="script_js_bb_mouse" >
FIND j=5942 line=// Mouse Event Handlers
FIND j=5943 line= if(myCanvas){
FIND j=5944 line= var isDown = false;
FIND j=5945 line= var canvasX, canvasY;
FIND j=5946 line= ctx.lineWidth = 5;
FIND j=5947 line=
FIND j=5948 line=
FIND j=5949 line= $(myCanvas)
FIND j=5950 line= .mousedown(function(e){
FIND j=5951 line= isDown = true;
FIND j=5952 line= ctx.beginPath();
FIND j=5953 line= canvasX = e.pageX - myCanvas.offsetLeft;
FIND j=5954 line= canvasY = e.pageY - myCanvas.offsetTop;
FIND j=5955 line= ctx.moveTo(canvasX, canvasY);
FIND j=5956 line= })
FIND j=5957 line= .mousemove(function(e){
FIND j=5958 line= if(isDown !== false) {
FIND j=5959 line= canvasX = e.pageX - myCanvas.offsetLeft;
FIND j=5960 line= canvasY = e.pageY - myCanvas.offsetTop;
FIND j=5961 line= ctx.lineTo(canvasX, canvasY);
FIND j=5962 line=// ctx.strokeStyle = '#000';
FIND j=5963 line= ctx.strokeStyle = '#fff';
FIND j=5964 line=
FIND j=5965 line= ctx.stroke();
FIND j=5966 line= }
FIND j=5967 line= })
FIND j=5968 line= .mouseup(function(e){
FIND j=5969 line= isDown = false;
FIND j=5970 line= ctx.closePath();
FIND j=5971 line= });
FIND j=5972 line= }
FIND j=5973 line=
FIND j=5974 line=// Touch Events Handlers
FIND j=5975 line= draw = {
FIND j=5976 line= started: false,
FIND j=5977 line= start: function(evt) {
FIND j=5978 line=
FIND j=5979 line= ctx.beginPath();
FIND j=5980 line= ctx.moveTo(
FIND j=5981 line= evt.touches[0].pageX,
FIND j=5982 line= evt.touches[0].pageY
FIND j=5983 line= );
FIND j=5984 line=
FIND j=5985 line= this.started = true;
FIND j=5986 line=
FIND j=5987 line= },
FIND j=5988 line= move: function(evt) {
FIND j=5989 line=
FIND j=5990 line= if (this.started) {
FIND j=5991 line= ctx.lineTo(
FIND j=5992 line= evt.touches[0].pageX,
FIND j=5993 line= evt.touches[0].pageY
FIND j=5994 line= );
FIND j=5995 line=
FIND j=5996 line= ctx.strokeStyle = '#000';
FIND j=5997 line= ctx.lineWidth = 5;
FIND j=5998 line= ctx.stroke();
FIND j=5999 line= }
FIND j=6000 line=
FIND j=6001 line= },
FIND j=6002 line= end: function(evt) {
FIND j=6003 line= this.started = false;
FIND j=6004 line= }
FIND j=6005 line= };
FIND j=6006 line=
FIND j=6007 line=// Touch Events
FIND j=6008 line= myCanvas.addEventListener('touchstart', draw.start, false);
FIND j=6009 line= myCanvas.addEventListener('touchend', draw.end, false);
FIND j=6010 line= myCanvas.addEventListener('touchmove', draw.move, false);
FIND j=6011 line=
FIND j=6012 line=// Disable Page Move
FIND j=6013 line= document.body.addEventListener('touchmove',function(evt){
FIND j=6014 line= evt.preventDefault();
FIND j=6015 line= },false);
FIND j=6016 line= };
FIND j=6017 line= </script id="script_js_bb_mouse" >
FIND j=6018 line=
FIND j=6019 line= <script id="script_js_bb">
FIND j=6020 line=// var c5 = document.getElementById("c5");
FIND j=6021 line=// var c5_context = c5.getContext("2d");
FIND j=6022 line= var c5 = document.getElementById("myCanvas");
FIND j=6023 line= var c5_context = c5.getContext("2d");
FIND j=6024 line=
FIND j=6025 line= var dragon = new Image();
FIND j=6026 line= dragon.src = 'dragon.png';
FIND j=6027 line= var img = new Image();
FIND j=6028 line= img.src = 'dragon.png';
FIND j=6029 line=
FIND j=6030 line= function draw_img() {
FIND j=6031 line= c5_context.drawImage(img, 100, 5);
FIND j=6032 line= }
FIND j=6033 line= </script id="script_js_bb">
FIND j=6034 line=
FIND j=6035 line=
FIND j=6036 line= <script id=script_mycanvas_write >
FIND j=6037 line=// mycanvas_write( context, x, y, font, fontsize, fillstyle, text );
FIND j=6038 line= function mycanvas_write( ctx, x, y, font, fontsize, fillstyle, text ) {
FIND j=6039 line=// ctx.font = 'italic bold 30px sans-serif';
FIND j=6040 line= ctx.fillStyle = 'white';
FIND j=6041 line= ctx.fillStyle = 'black';
FIND j=6042 line= ctx.fillStyle = "'" + fillstyle + "'";
FIND j=6043 line= ctx.fillStyle = fillstyle;
FIND j=6044 line= ctx.font = 'italic bold 30px roman';
FIND j=6045 line= ctx.font = 'italic bold 30px arial';
FIND j=6046 line= ctx.font = 'italic bold 30px monospace';
FIND j=6047 line= ctx.font = 'italic bold 30px cursive';
FIND j=6048 line= ctx.font = 'italic bold 30px fantasy';
FIND j=6049 line= ctx.font = 'italic bold 30px yokkmokkOT';
FIND j=6050 line= ctx.font = 'bold 30px sans-serif';
FIND j=6051 line=// ctx.font = 'italic bold ' + fontsize + " " + font;
FIND j=6052 line= ctx.font = '' + fontsize + " " + font;
FIND j=6053 line= ctx.textBaseline = 'bottom';
FIND j=6054 line= ctx.fillText( text, x, y);
FIND j=6055 line= }
FIND j=6056 line=
FIND j=6057 line= function mycanvas_write0( ctx0, text, fillstyle, x, y ) {
FIND j=6058 line= ctx0.fillStyle = 'white';
FIND j=6059 line= ctx0.fillStyle = fillstyle;
FIND j=6060 line= ctx0.font = 'italic bold 30px yokkmokkOT';
FIND j=6061 line= ctx0.textBaseline = 'bottom';
FIND j=6062 line=// ctx0.fillText('timejak-0: jkwii', x, y);
FIND j=6063 line= ctx0.fillText( text, x, y);
FIND j=6064 line= }
FIND j=6065 line= </script id=script_mycanvas_write >
FIND j=6066 line= -->
FIND j=6067 line=
FIND j=6068 line= <img src="/imgs/btn/koeye.png" onclick="script_ajax()">
FIND j=6069 line= <script id="script_ajax">
FIND j=6070 line= php="index_ko.php";
FIND j=6071 line= db3="index_ko.db3";
FIND j=6072 line= sql="select * from list limit 5";
FIND j=6073 line= script_ajax(php,db3,sql)
FIND j=6074 line= function script_ajax(php, db3,sql) {
FIND j=6075 line= alert( "BUGS_4895" )
FIND j=6076 line= $("button").click(function(){
FIND j=6077 line= $.post( php, {
FIND j=6078 line= db3: db3,
FIND j=6079 line= sql: "select * from list limit 10"
FIND j=6080 line= },
FIND j=6081 line= function(data, status){
FIND j=6082 line= line = data.split("\n");
FIND j=6083 line= htmout="";
FIND j=6084 line= for( z=0; z<line.length; z++ ) {
FIND j=6085 line= htmout += "<a href="+line+" target=_blank>";
FIND j=6086 line= htmout += " <img src="+line+" border=0>";
FIND j=6087 line= htmout += " </a>";
FIND j=6088 line= }
FIND j=6089 line= getelementbyID('div_ajaxdb");
FIND j=6090 line=// alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
FIND j=6091 line= document.write( htmout );
FIND j=6092 line= });
FIND j=6093 line= });
FIND j=6094 line= }
FIND j=6095 line= </script id="script_ajax">
FIND j=6096 line=
FIND j=6097 line= <script id="script_kolines">
FIND j=6098 line= function kolines(color,count,position) {
FIND j=6099 line= var htmout = "";
FIND j=6100 line= img="/imgs/btn/kob.png";
FIND j=6101 line= if( color=="w" ) { img="/imgs/btn/kow.png"; }
FIND j=6102 line=// alert( "BUGS_kolines_beg color="+color+" count="+count+" img="+img );
FIND j=6103 line=
FIND j=6104 line= for( j=1; j<=count; j++ ) {
FIND j=6105 line=// alert( "BUGS_kolines_loop color="+color+" count="+count+" img="+img );
FIND j=6106 line= htmout += '<img class="drg" height=20 src="'+img+'">';
FIND j=6107 line=// alert( "BUGS_kolines_loop j="+j+" color="+color+" count="+count+" htmout="+htmout );
FIND j=6108 line= }
FIND j=6109 line=
FIND j=6110 line=// alert( "BUGS_kolines_end j="+j+" color="+color+" count="+count+" htmout="+htmout );
FIND j=6111 line=// htmout += '<img src="/imgs/btn/kop34.png">';
FIND j=6112 line=
FIND j=6113 line= if( color == 'b' ) {
FIND j=6114 line=// div_kolineb = document.getElementById('div_kolineb');
FIND j=6115 line=// if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
FIND j=6116 line=// if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
FIND j=6117 line=// if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
FIND j=6118 line=// if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
FIND j=6119 line=// if( position == "ih" ) div_kolineb.innerHTML( htmout);
FIND j=6120 line=
FIND j=6121 line=`j if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
FIND j=6122 line= if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
FIND j=6123 line=// if( position == "ae" ) img_kolineb.insertAdjacentElement('afterend', htmout);
FIND j=6124 line= }
FIND j=6125 line= if( color == 'w' ) {
FIND j=6126 line=// div_kolinew = document.getElementById('div_kolinew');
FIND j=6127 line=// if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
FIND j=6128 line=// if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
FIND j=6129 line=// if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
FIND j=6130 line=// if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
FIND j=6131 line=// if( position == "ih" ) div_kolineb.innerHTML( htmout);
FIND j=6132 line=
FIND j=6133 line= img_kolinew = document.getElementById('img_kolinew' );
FIND j=6134 line= if( position == "bb" ) img_kolineb.insertAdjacentHTML('beforebegin', htmout);
FIND j=6135 line= if( position == "ab" ) img_kolineb.insertAdjacentHTML('afterbegin', htmout);
FIND j=6136 line= if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
FIND j=6137 line= if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
FIND j=6138 line= }
FIND j=6139 line= }
FIND j=6140 line= </script id="script_kolines">
FIND j=6141 line=
FIND j=6142 line=
FIND j=6143 line=
FIND j=6144 line= <hr color=white>
FIND j=6145 line= <hr color=black>
FIND j=6146 line=
FIND j=6147 line= <div id="drag" name="div_drag_2>
FIND j=6148 line=<!--
FIND j=6149 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
FIND j=6150 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','ab' )" >
FIND j=6151 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','ih' )" >
FIND j=6152 line= <img src="/imgs/btn/kop12.png" onclick="kolines('b','3','ae" )" >
FIND j=6153 line= <img src="/imgs/btn/kop34.png" onclick="kolines('b','3','bb" )" >
FIND j=6154 line= -->
FIND j=6155 line=
FIND j=6156 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','256','bb' )" >
FIND j=6157 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','16','bb' )" >
FIND j=6158 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','8','bb' )" >
FIND j=6159 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','4','bb' )" >
FIND j=6160 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','2','bb' )" >
FIND j=6161 line= <img height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
FIND j=6162 line= <img height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','ae' )" >
FIND j=6163 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','2','ae' )" >
FIND j=6164 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','4','ae' )" >
FIND j=6165 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','8','ae' )" >
FIND j=6166 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','16','ae' )" >
FIND j=6167 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','256','ae' )" >
FIND j=6168 line= </div id="drag" name="div_drag_2>
FIND j=6169 line=
FIND j=6170 line= <hr color=black>
FIND j=6171 line= <div id="div_kolineb">
FIND j=6172 line= <img id="img_kolineb" height=30 class="drg" src="/imgs/btn/kop12.png">
FIND j=6173 line= </div id="div_kolineb">
FIND j=6174 line= <div id="div_kolinew">
FIND j=6175 line= <img id="img_kolinew" height=30 class="drg" src="/imgs/btn/kop34.png">
FIND j=6176 line= </div id="div_kolinew">
FIND j=6177 line= <hr color=white>
FIND j=6178 line=
FIND j=6179 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','2','bb' )" >
FIND j=6180 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','4','bb' )" >
FIND j=6181 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','8','bb' )" >
FIND j=6182 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','16','bb' )" >
FIND j=6183 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','256','bb' )" >
FIND j=6184 line=
FIND j=6185 line= <img height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','bb' )" >
FIND j=6186 line= <img height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','ae' )" >
FIND j=6187 line=
FIND j=6188 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','2','ae' )" >
FIND j=6189 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','4','ae' )" >
FIND j=6190 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','8','ae' )" >
FIND j=6191 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','16','ae' )" >
FIND j=6192 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','256','ae' )" >
FIND j=6193 line=<!--
FIND j=6194 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','be' )" >
FIND j=6195 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','ab' )" >
FIND j=6196 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','ih' )" >
FIND j=6197 line= -->
FIND j=6198 line= </div>
FIND j=6199 line=<br><br><br><br>
FIND j=6200 line=
FIND j=6201 line= <hr color=black>
FIND j=6202 line= <hr color=white>
FIND j=6203 line=
FIND j=6204 line= <div id="div_sllist" >
FIND j=6205 line= <h3>div_sllist</h3>
FIND j=6206 line= </div id="div_sllist" >
FIND j=6207 line=
FIND j=6208 line=
FIND j=6209 line= <script id="script_bugs" >
FIND j=6210 line= function script_bugs(bugid) {
FIND j=6211 line= alert( "BUGS_5033 script_bugs="+bugid );
FIND j=6212 line= }
FIND j=6213 line= </script id="script_bugs" >
FIND j=6214 line=
FIND j=6215 line=
FIND j=6216 line=<!--
FIND j=6217 line= <img src="/imgs/btn/koeye_handhither.gif" onclick="script_bugs('')">
FIND j=6218 line= <img src="/imgs/btn/koeyew.png" onclick="script_bugs('aaaaaaaaaaa' )" >
FIND j=6219 line= <img src="/imgs/btn/koeyeb.png" onclick="script_bugs('bbbbbbbbbbbbb' )" >
FIND j=6220 line= <img src="/imgs/btn/koeye.png" onclick="script_bugs('ccccccccccccc')" >
FIND j=6221 line= <img src="/imgs/btn/koeyew.png" onclick="script_slist_show()" >
FIND j=6222 line= -->
FIND j=6223 line=
FIND j=6224 line=
FIND j=6225 line=
FIND j=6226 line= <script id="script_sllist_load">
FIND j=6227 line= function script_sllist_load() {
FIND j=6228 line= alert( "BUGS_5107 script_sllist_load" );
FIND j=6229 line= sllist = new Array();
FIND j=6230 line= z = 0;
FIND j=6231 line= sllist[z++] = 'sllist1';
FIND j=6232 line= sllist[z++] = 'sllist2';
FIND j=6233 line= sllist[z++] = 'sllist3';
FIND j=6234 line= sllist[z++] = 'sllist4';
FIND j=6235 line= sllist[z++] = 'sllist5';
FIND j=6236 line= sllist[z++] = 'sllist6';
FIND j=6237 line= sllist[z++] = 'sllist7';
FIND j=6238 line= sllist[z++] = 'sllist8';
FIND j=6239 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
FIND j=6240 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
FIND j=6241 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
FIND j=6242 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
FIND j=6245 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
FIND j=6246 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
FIND j=6247 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
FIND j=6248 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
FIND j=6249 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
FIND j=6250 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
FIND j=6251 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
FIND j=6252 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
FIND j=6253 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
FIND j=6254 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
FIND j=6255 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 246402 Jun 9 2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
FIND j=6256 line= sllist[z++] = '-rw-r--r-- 1 konet staff 208180 Apr 8 2015 kb/books/Atlas_1931/IMG_3851.JPG';
FIND j=6257 line= sllist[z++] = '-rw-r--r-- 1 konet staff 208180 Apr 8 2015 kb/books/Atlas_1931/IMG_3851.JPG';
FIND j=6258 line= sllist[z++] = '-rw-r--r-- 1 konet staff 180223 Apr 8 2015 kb/books/Atlas_1931/IMG_3852.JPG';
FIND j=6259 line= sllist[z++] = '-rw-r--r-- 1 konet staff 170251 Apr 8 2015 kb/books/Atlas_1931/IMG_3853.JPG';
FIND j=6260 line= sllist[z++] = '-rw-r--r-- 1 konet staff 157741 Apr 8 2015 kb/books/Atlas_1931/IMG_3854.JPG';
FIND j=6261 line= sllist[z++] = '-rw-r--r-- 1 konet staff 231492 Apr 8 2015 kb/books/Atlas_1931/IMG_3855.JPG';
FIND j=6262 line= sllist[z++] = '-rw-r--r-- 1 konet staff 225773 Apr 8 2015 kb/books/Atlas_1931/IMG_3856.JPG';
FIND j=6263 line= sllist[z++] = '-rw-r--r-- 1 konet staff 285875 Apr 8 2015 kb/books/Atlas_1931/IMG_3857.JPG';
FIND j=6264 line= sllist[z++] = '-rw-r--r-- 1 konet staff 303677 Apr 8 2015 kb/books/Atlas_1931/IMG_3858.JPG';
FIND j=6265 line= sllist[z++] = '-rw-r--r-- 1 konet staff 286921 Apr 8 2015 kb/books/Atlas_1931/IMG_3859.JPG';
FIND j=6266 line= sllist[z++] = '-rw-r--r-- 1 konet staff 327242 Apr 8 2015 kb/books/Atlas_1931/IMG_3860.JPG';
FIND j=6267 line= sllist[z++] = '-rw-r--r-- 1 konet staff 305251 Apr 8 2015 kb/books/Atlas_1931/IMG_3861.JPG';
FIND j=6268 line= sllist[z++] = '-rw-r--r-- 1 konet staff 275734 Apr 8 2015 kb/books/Atlas_1931/IMG_3862.JPG';
FIND j=6269 line= sllist[z++] = '-rw-r--r-- 1 konet staff 306566 Apr 8 2015 kb/books/Atlas_1931/IMG_3863.JPG';
FIND j=6270 line= sllist[z++] = '-rw-r--r-- 1 konet staff 295127 Apr 8 2015 kb/books/Atlas_1931/IMG_3864.JPG';
FIND j=6271 line= sllist[z++] = '-rw-r--r-- 1 konet staff 346338 Apr 8 2015 kb/books/Atlas_1931/IMG_3865.JPG';
FIND j=6272 line= sllist[z++] = '-rw-r--r-- 1 konet staff 307752 Apr 8 2015 kb/books/Atlas_1931/IMG_3866.JPG';
FIND j=6273 line= sllist[z++] = '-rw-r--r-- 1 konet staff 268685 Apr 8 2015 kb/books/Atlas_1931/IMG_3867.JPG';
FIND j=6274 line= sllist[z++] = '-rw-r--r-- 1 konet staff 276633 Apr 8 2015 kb/books/Atlas_1931/IMG_3868.JPG';
FIND j=6275 line= sllist[z++] = '-rw-r--r-- 1 konet staff 278776 Apr 8 2015 kb/books/Atlas_1931/IMG_3869.JPG';
FIND j=6276 line= sllist[z++] = '-rw-r--r-- 1 konet staff 312322 Apr 8 2015 kb/books/Atlas_1931/IMG_3870.JPG';
FIND j=6277 line= sllist[z++] = '-rw-r--r-- 1 konet staff 293924 Apr 8 2015 kb/books/Atlas_1931/IMG_3871.JPG';
FIND j=6278 line= sllist[z++] = '-rw-r--r-- 1 konet staff 314761 Apr 8 2015 kb/books/Atlas_1931/IMG_3872.JPG';
FIND j=6279 line= sllist[z++] = '-rw-r--r-- 1 konet staff 319755 Apr 8 2015 kb/books/Atlas_1931/IMG_3873.JPG';
FIND j=6280 line= sllist[z++] = '-rw-r--r-- 1 konet staff 260878 Apr 8 2015 kb/books/Atlas_1931/IMG_3874.JPG';
FIND j=6281 line= sllist[z++] = '-rw-r--r-- 1 konet staff 282075 Apr 8 2015 kb/books/Atlas_1931/IMG_3875.JPG';
FIND j=6282 line= sllist[z++] = '-rw-r--r-- 1 konet staff 347889 Apr 8 2015 kb/books/Atlas_1931/IMG_3876.JPG';
FIND j=6283 line= sllist[z++] = '-rw-r--r-- 1 konet staff 187358 Mar 31 2015 kb/books/music/Theory/IMG_7247.JPG';
FIND j=6284 line= sllist[z++] = '-rw-r--r-- 1 konet staff 233375 Mar 31 2015 kb/books/music/Theory/IMG_7248.JPG';
FIND j=6285 line= sllist[z++] = '-rw-r--r-- 1 konet staff 216447 Mar 31 2015 kb/books/music/Theory/IMG_7249.JPG';
FIND j=6286 line= sllist[z++] = '-rw-r--r-- 1 konet staff 216059 Mar 31 2015 kb/books/music/Theory/IMG_7250.JPG';
FIND j=6287 line= sllist[z++] = '-rw-r--r-- 1 konet staff 222009 Mar 31 2015 kb/books/music/Theory/IMG_7251.JPG';
FIND j=6288 line= sllist[z++] = '-rw-r--r-- 1 konet staff 213330 Mar 31 2015 kb/books/music/Theory/IMG_7252.JPG';
FIND j=6289 line= sllist[z++] = '-rw-r--r-- 1 konet staff 199485 Mar 31 2015 kb/books/music/Theory/IMG_7253.JPG';
FIND j=6290 line= sllist[z++] = '-rw-r--r-- 1 konet staff 239114 Mar 31 2015 kb/books/music/Theory/IMG_7254.JPG';
FIND j=6291 line= sllist[z++] = '-rw-r--r-- 1 konet staff 162254 Mar 31 2015 kb/books/music/Theory/IMG_7255.JPG';
FIND j=6292 line=// alert( "BUGS_10895 script_sllist_load len="+sllist.length );
FIND j=6293 line= return( sllist );
FIND j=6294 line= }
FIND j=6295 line= </script id="script_sllist_load">
FIND j=6296 line=
FIND j=6297 line= <script id="script_pdflist_load">
FIND j=6298 line= function script_pdflist_load() {
FIND j=6299 line= pdflist = new Array();
FIND j=6300 line= z = 0;
FIND j=6301 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
FIND j=6302 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
FIND j=6303 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
FIND j=6304 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
FIND j=6307 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
FIND j=6308 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
FIND j=6309 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
FIND j=6310 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
FIND j=6311 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
FIND j=6312 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
FIND j=6313 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
FIND j=6314 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
FIND j=6315 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
FIND j=6316 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
FIND j=6317 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 246402 Jun 9 2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
FIND j=6318 line=// alert( "BUGS_10925 script_pdflist_load len="+pdflist.length );
FIND j=6319 line= return( pdflist );
FIND j=6320 line= }
FIND j=6321 line= </script id="script_pdflist_load">
FIND j=6322 line=
FIND j=6323 line=<!--
FIND j=6324 line= <script id="script_startup2" >
FIND j=6325 line= function startup2( url ) {
FIND j=6326 line=// url="index.html";
FIND j=6327 line= alert( "BUGS_10930_startup" );
FIND j=6328 line= htmout="htmout";
FIND j=6329 line= img="/imgs/btn/koeye.gif";
FIND j=6330 line= imgurl="/imgs/btn/koeye_handhither.gif";
FIND j=6331 line= if( urlexists(url)) { img=imgurl; }
FIND j=6332 line=
FIND j=6333 line= htmout += '<a href="'+url+'" target=_blank class="drag" id="drg">
FIND j=6334 line= htmout += ' <img src="'+img+'" border=0>";
FIND j=6335 line= htmout += ' <span><img src="'+img+'" border=0></span>';
FIND j=6336 line= htmout += ' </a>';
FIND j=6337 line= document.write( htmout );
FIND j=6338 line= alert("BUGS_10934_startup isurl="+isurl(url) );
FIND j=6339 line= }
FIND j=6340 line= </script>
FIND j=6341 line= -->
FIND j=6342 line=
FIND j=6343 line= <script id="script_isurl">
FIND j=6344 line= function isurl(url) {
FIND j=6345 line= $.get(url).done(function() {
FIND j=6346 line= return("ok");
FIND j=6347 line= }).fail(function() {
FIND j=6348 line= return("ko");
FIND j=6349 line= })
FIND j=6350 line= }
FIND j=6351 line= </script id="script_isurl">
FIND j=6352 line=
FIND j=6353 line= <script id="script_urlexists">
FIND j=6354 line= function urlexists(url) {
FIND j=6355 line= var http = new XMLHttpRequest();
FIND j=6356 line= http.open('HEAD', url, false);
FIND j=6357 line= http.send();
FIND j=6358 line= return http.status!=404;
FIND j=6359 line= }
FIND j=6360 line= </script id="script_urlexists">
FIND j=6361 line=
FIND j=6362 line= <script id="script_mth2mm">
FIND j=6363 line= function mth2mm(mth) {
FIND j=6364 line= if( mth == "Jan" ) return("01");
FIND j=6365 line= if( mth == "Feb" ) return("02");
FIND j=6366 line= if( mth == "Mar" ) return("03");
FIND j=6367 line= if( mth == "Apr" ) return("04");
FIND j=6368 line= if( mth == "May" ) return("05");
FIND j=6369 line= if( mth == "Jun" ) return("06");
FIND j=6370 line= if( mth == "Jul" ) return("07");
FIND j=6371 line= if( mth == "Aug" ) return("08");
FIND j=6372 line= if( mth == "Sep" ) return("09");
FIND j=6373 line= if( mth == "Oct" ) return("10");
FIND j=6374 line= if( mth == "Nov" ) return("11");
FIND j=6375 line= if( mth == "Dec" ) return("12");
FIND j=6376 line= return( "00" );
FIND j=6377 line= }
FIND j=6378 line= </script id="script_mth2mm">
FIND j=6379 line=
FIND j=6380 line= <script id="script_unique">
FIND j=6381 line= function unique() {
FIND j=6382 line= alert( "BUGS_11334 unique" );
FIND j=6383 line= }
FIND j=6384 line= function uniquelist(list) {
FIND j=6385 line= alert( "BUGS_11336 uniquelist" );
FIND j=6386 line= for (i = 0; i<list.length; i++) {
FIND j=6387 line= for (j=i+1; j<list.length; j++) {
FIND j=6388 line= if (list[i] == list[j]) {
FIND j=6389 line= list.splice(j, 1);
FIND j=6390 line= j--;
FIND j=6391 line= }
FIND j=6392 line= }
FIND j=6393 line= }
FIND j=6394 line= }
FIND j=6395 line= </script id="script_unique">
FIND j=6396 line=
FIND j=6397 line= <script id="script_file2array" >
FIND j=6398 line= script_file2array(url) {
FIND j=6399 line= if( urlexists(url) ) {
FIND j=6400 line= alert( BUGS_11350 FOUND urlexists="+url );
FIND j=6401 line= }
FIND j=6402 line= else {
FIND j=6403 line= alert( BUGS_11351 NOTFOUND urlexists="+url );
FIND j=6404 line= }
FIND j=6405 line=// $.ajax({
FIND j=6406 line=//// url: "/kb/csv/sl.csv",
FIND j=6407 line=//// url: "/kb/csv/sl.csv",
FIND j=6408 line=//// url: "sl.csv",
FIND j=6409 line=// url: url,
FIND j=6410 line=// async: false,
FIND j=6411 line=// success: function(csvd) {
FIND j=6412 line=// kolist = $.csv.toArrays(csvd);
FIND j=6413 line=// },
FIND j=6414 line=//
FIND j=6415 line=// dataType: "text",
FIND j=6416 line=//// call a function on complete
FIND j=6417 line=// complete: function () {
FIND j=6418 line=// alert( "BUGS_11363 ajax rul="+url+" kolist="+kolist );
FIND j=6419 line=//// script_kolist_load(kolist);
FIND j=6420 line=// script_kolist_show(kolist);
FIND j=6421 line=// }
FIND j=6422 line=// });
FIND j=6423 line= }
FIND j=6424 line= </script id="script_file2array" >
FIND j=6425 line=
FIND j=6426 line=<!-- <script id="script_async_sljs" src="sl.js" async></script> -->
FIND j=6427 line= <script id="script_requestcsv" >
FIND j=6428 line= function callback() {
FIND j=6429 line= alert( "BUGS_11480 callback" );
FIND j=6430 line= }
FIND j=6431 line=// var foo = requestCSV("sl.csv",drawlines(lines));
FIND j=6432 line=// var foo = requestCSV("sl.csv",script_kolist(kolist));
FIND j=6433 line=//// function requestCSV(f,c){return new csvajax(f,c);};
FIND j=6434 line= filecsv="sl.csv";
FIND j=6435 line= function csvajax(filecsv,callback) {
FIND j=6436 line= alert( "BUGS_11383 script_requestcsv filepath="+filepath+" callback="+callback );
FIND j=6437 line=// this.request = new XMLHttpRequest();
FIND j=6438 line=// this.request.timeout = 10000;
FIND j=6439 line=// this.request.open("GET", filepath, true);
FIND j=6440 line=// this.request.parent = this;
FIND j=6441 line=// this.callback = callback;
FIND j=6442 line=// this.request.onload = function() {
FIND j=6443 line=// var d = this.response.split('\n'); /*1st separator*/
FIND j=6444 line=// var i = d.length;
FIND j=6445 line=// while(i--) {
FIND j=6446 line=// if(d[i] !== "")
FIND j=6447 line=// d[i] = d[i].split(','); /*2nd separator*/
FIND j=6448 line=// else
FIND j=6449 line=// d.splice(i,1);
FIND j=6450 line=// }
FIND j=6451 line=// this.parent.response = d;
FIND j=6452 line=// if(typeof this.parent.callback !== "undefined")
FIND j=6453 line=// this.parent.callback(d);
FIND j=6454 line=// };
FIND j=6455 line=// this.request.send();
FIND j=6456 line= };
FIND j=6457 line= </script id="script_requestcsv" >
FIND j=6458 line=
FIND j=6459 line=<!--
FIND j=6460 line= <script id="script_db32array" >
FIND j=6461 line=//// function script_db2array("sl.db3", "select * from kolist where koid='koid'" ) {
FIND j=6462 line=//// function script_db2array("/kb/db3/sl.db3", "/kb/sql/sl.sql" ) {
FIND j=6463 line=// function script_db2array( db3, sql ) {
FIND j=6464 line=// var dblist = new Array();
FIND j=6465 line=// alert( "BUGS_11400 script_db2array db3="+db3+" sql="+sql+" dblist="+dblist );
FIND j=6466 line=// return( dblist );
FIND j=6467 line=// }
FIND j=6468 line=
FIND j=6469 line=// filedb3="sl.db3";
FIND j=6470 line=// filepsv="sl.psv";
FIND j=6471 line=// tblnam="sl";
FIND j=6472 line=// $rr=exec("sqlite3 filedb3 \".separator '|'\" ");
FIND j=6473 line=// $rr=exec("sqlite3 filedb3 \".import filepsv tblnam\" ");
FIND j=6474 line=// $rr= exec ("sqlite3 filedb3 \"pragma encoding = 'utf-8'\" ");
FIND j=6475 line=// $rr=exec("sqlite3 filedb3 \".separator '|'\" && sqlite3 fildb3 \"pragma encoding = 'utf-8'\" && sqlite3 filedb3 \".import filepsv tablename\" ");
FIND j=6476 line= </script>
FIND j=6477 line= -->
FIND j=6478 line=
FIND j=6479 line=<!-- Create the database -->
FIND j=6480 line=<!--
FIND j=6481 line= <script id="script_sqljs_include" src='js/sql.js'></script>
FIND j=6482 line= <script id="script_sqljs">
FIND j=6483 line= function script_sqljs() {
FIND j=6484 line= var db = new SQL.Database();
FIND j=6485 line=
FIND j=6486 line=// Run a query without reading the results
FIND j=6487 line= db.run("CREATE TABLE test (col1, col2);");
FIND j=6488 line=
FIND j=6489 line=// Insert two rows: (1,111) and (2,222)
FIND j=6490 line= db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]);
FIND j=6491 line=
FIND j=6492 line=// Prepare a statement
FIND j=6493 line= var stmt = db.prepare("SELECT * FROM test WHERE a BETWEEN $start AND $end");
FIND j=6494 line= stmt.getAsObject({$start:1, $end:1}); // {col1:1, col2:111}
FIND j=6495 line=
FIND j=6496 line=// Bind new values
FIND j=6497 line= stmt.bind({$start:1, $end:2});
FIND j=6498 line= while(stmt.step()) { //
FIND j=6499 line= var row = stmt.getAsObject();
FIND j=6500 line=// [...] do something with the row of result
FIND j=6501 line= }
FIND j=6502 line= }
FIND j=6503 line= </script>
FIND j=6504 line= -->
FIND j=6505 line= <a href=+ class="popover" >
FIND j=6506 line= <img src="/imgs/btn/kb.png" onclick="script_startup('timejak_startup')">
FIND j=6507 line= <span><img src="/imgs/btn/kw.png" onclick="script_startup('timejak_startup')"></span>
FIND j=6508 line= </a>
FIND j=6509 line= <script id="script_startup" >
FIND j=6510 line= function script_startup( msg ) {
FIND j=6511 line= alert( "BUGS_6200 script_startup msg="+msg );
FIND j=6512 line=
FIND j=6513 line= }
FIND j=6514 line= </script id="script_startup" >
FIND j=6515 line=
FIND j=6516 line=<!-- <div id="div_balls_n_cubes_btn"> -->
FIND j=6517 line=
FIND j=6518 line= <div id="div_kobuttonset" >
FIND j=6519 line= <a href=+ class="popover" >
FIND j=6520 line= <img height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_b('5400')">
FIND j=6521 line= <span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeye_b('5400')"></span>
FIND j=6522 line= </a>
FIND j=6523 line=
FIND j=6524 line= <a href=+ class="popover" >
FIND j=6525 line= <img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyeb_w('5400')">
FIND j=6526 line= <span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_bw('5400')"></span>
FIND j=6527 line= </a>
FIND j=6528 line=
FIND j=6529 line=
FIND j=6530 line= <a href=+ class="popover" >
FIND j=6531 line= <img height=50 src="/imgs/btn/kobubble_b1.png" onclick="script_bubble('5400')">
FIND j=6532 line= <span><img height=50 src="/imgs/btn/kobubblew.png" onclick="script_bubble('5400')"></span>
FIND j=6533 line= </a>
FIND j=6534 line=
FIND j=6535 line=
FIND j=6536 line= <a href=+ class="popover" >
FIND j=6537 line= <img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeyew_b('5500')">
FIND j=6538 line= <span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyew_b('5400')"></span>
FIND j=6539 line= </a>
FIND j=6540 line=
FIND j=6541 line=
FIND j=6542 line= <a href=+ class="popover" >
FIND j=6543 line= <img height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_w('5400')">
FIND j=6544 line= <span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_w('5400')"></span>
FIND j=6545 line= </a>
FIND j=6546 line=
FIND j=6547 line=
FIND j=6548 line= <a href=+ class="popover" >
FIND j=6549 line= <img src="/imgs/btn/kw.png" onclick="script_kw('timejak_shutdown')">
FIND j=6550 line= <span><img src="/imgs/btn/kb.png" onclick="script_kw('timejak_shutdown')"></span>
FIND j=6551 line= </a>
FIND j=6552 line= </div id="div_kobuttonset" >
FIND j=6553 line=
FIND j=6554 line=
FIND j=6555 line=
FIND j=6556 line= <div id="div_ajax2php_form" class="drg" >
FIND j=6557 line= <form id="comment">
FIND j=6558 line= <input type="text" id="userInput" name="comment" placeholder="needdb3data4me" /></input>
FIND j=6559 line= <input type="submit" value="Submit" /></input>
FIND j=6560 line= </form>
FIND j=6561 line= </div id="div_ajax2php_form" >
FIND j=6562 line=
FIND j=6563 line=
FIND j=6564 line=<!--
FIND j=6565 line= <button onclice="script_ajax2php">script_ajax2php</button>
FIND j=6566 line= -->
FIND j=6567 line=
FIND j=6568 line=<script id="script_ajax2php">
FIND j=6569 line= function script_ajax2php () {
FIND j=6570 line= alert( "BUGS_5396 script_ajax2php" );
FIND j=6571 line=
FIND j=6572 line=// Stop the form from being submitted the standard way
FIND j=6573 line= $("#comment").on('submit', function(e) {
FIND j=6574 line= e.preventDefault();
FIND j=6575 line=
FIND j=6576 line=// Put the user's input into a variable
FIND j=6577 line= var userInput = $('#userInput').val();
FIND j=6578 line=
FIND j=6579 line=// Do some validation of the data if needed
FIND j=6580 line=// ...
FIND j=6581 line=
FIND j=6582 line=
FIND j=6583 line=// Perform AJAX request (a.k.a send the data to the server)
FIND j=6584 line=// There are many parameters one can use here
FIND j=6585 line=// Browse the documentation to get familiar with the most useful ones
FIND j=6586 line= $.ajax({
FIND j=6587 line= url: 'index_zm.php', // The PHP script that will handle the request
FIND j=6588 line= db3 = "index_zm.db3",
FIND j=6589 line= sql: "select * from list",
FIND j=6590 line= type: 'POST', // This can be set to GET, but in this case we'd use POST
FIND j=6591 line= data: {
FIND j=6592 line= db3: sql,
FIND j=6593 line= sql: sql,
FIND j=6594 line= }, // "comment" will result in $_POST['comment'], and userInput is the value of it
FIND j=6595 line=
FIND j=6596 line=// If the script returns a 200 status (meaning the request was successful)
FIND j=6597 line=// The data variable will be the response from the PHP script
FIND j=6598 line=// Depending on what you are going to do with the data returned,
FIND j=6599 line=// you may want to ensure it is returned as valid JSON
FIND j=6600 line= success: function(data) {
FIND j=6601 line= alert( "BUGS ajaxphp MSG data="+data );
FIND j=6602 line= },
FIND j=6603 line=
FIND j=6604 line=// The request failed - So something here
FIND j=6605 line= error: function() {
FIND j=6606 line= alert( "BUGS ajaxphp ERR data="+data );
FIND j=6607 line= }
FIND j=6608 line= });
FIND j=6609 line=
FIND j=6610 line= });
FIND j=6611 line= }
FIND j=6612 line= </script id="script_ajax2php">
FIND j=6613 line=
FIND j=6614 line=
FIND j=6615 line= <button type="button" onclick="balls_n_cubes('/imgs/btn/ok.png')">balls_n_cubes</button>
FIND j=6616 line=
FIND j=6617 line= <button onclick="showFillText();return true;">filltxt</button>
FIND j=6618 line= <button onclick="showStrokeText();return true;">stroketxt</button>
FIND j=6619 line= <button onclick="Clear_text();return true;">cleartxt</button>
FIND j=6620 line=
FIND j=6621 line= <button onclick="draw_dragon();return true;">dragon</button>
FIND j=6622 line= <button onclick="draw_smaller_dragon();return true;">dragonette</button>
FIND j=6623 line= <button onclick="draw_dragon_head();return true;">draghead</button>
FIND j=6624 line= <button onclick="Clear_image();return true;">clearimg</button>
FIND j=6625 line=<!-- orphan div </div> -->
FIND j=6626 line=
FIND j=6627 line=
FIND j=6628 line=
FIND j=6629 line= <div id="div_canvas_balls" style="background:tan; position:relative; width:800px; height:120px">
FIND j=6630 line= <canvas id="layer1"
FIND j=6631 line= style="z-index: 1;
FIND j=6632 line= position:absolute;
FIND j=6633 line= left:0px;
FIND j=6634 line= top:0px;
FIND j=6635 line= " height="100px" width="800">
FIND j=6636 line= unauthorized access logged
FIND j=6637 line= </canvas>
FIND j=6638 line= <canvas id="layer2"
FIND j=6639 line= style="z-index: 2;
FIND j=6640 line= position:absolute;
FIND j=6641 line= left:0px;
FIND j=6642 line= top:0px;
FIND j=6643 line= " height="100px" width="800">
FIND j=6644 line= unauthorized access logged
FIND j=6645 line= </canvas>
FIND j=6646 line= <canvas id="layer3"
FIND j=6647 line= style="z-index: 3;
FIND j=6648 line= position:absolute;
FIND j=6649 line= left:0px;
FIND j=6650 line= top:0px;
FIND j=6651 line= " height="100px" width="800">
FIND j=6652 line= unauthorized access logged
FIND j=6653 line= </canvas>
FIND j=6654 line=
FIND j=6655 line= <canvas id="layer4"
FIND j=6656 line= style="z-index: 4;
FIND j=6657 line= position:absolute;
FIND j=6658 line= left:0px;
FIND j=6659 line= top:0px;
FIND j=6660 line= " height="100px" width="800">
FIND j=6661 line= unauthorized access logged b
FIND j=6662 line= </canvas>
FIND j=6663 line= <canvas id="layer5"
FIND j=6664 line= style="z-index: 5;
FIND j=6665 line= position:absolute;
FIND j=6666 line= left:0px;
FIND j=6667 line= top:0px;
FIND j=6668 line= " height="100px" width="800">
FIND j=6669 line= unauthorized access logged
FIND j=6670 line= </canvas>
FIND j=6671 line= <canvas id="layer6"
FIND j=6672 line= style="z-index: 6;
FIND j=6673 line= position:absolute;
FIND j=6674 line= left:0px;
FIND j=6675 line= top:0px;
FIND j=6676 line= " height="100px" width="800">
FIND j=6677 line= unauthorized access logged
FIND j=6678 line= </canvas>
FIND j=6679 line= <canvas id="layer7"
FIND j=6680 line= style="z-index: 7;
FIND j=6681 line= position:absolute;
FIND j=6682 line= left:0px;
FIND j=6683 line= top:0px;
FIND j=6684 line= " height="100px" width="800">
FIND j=6685 line= unauthorized access logged
FIND j=6686 line= </canvas>
FIND j=6687 line= </div>
FIND j=6688 line= </div id="div_canvas_balls" >
FIND j=6689 line=
FIND j=6690 line=
FIND j=6691 line=
FIND j=6692 line=
FIND j=6693 line= <script id="script_canvas_balls_n_cubes_w" type="text/javascript">
FIND j=6694 line= var layer1; var layer2; var layer3;
FIND j=6695 line= var layer4; var layer5; var layer6; var layer7;
FIND j=6696 line= var layer_b; var layer_w; var layer_i; var layer_t;
FIND j=6697 line=
FIND j=6698 line= var ctx1; var ctx2; var ctx3;
FIND j=6699 line= var ctx_b; var ctx_w; var ctx_i; var ctx_t;
FIND j=6700 line= var x = 800; var y = 100; var dx = 2; var dy = 4;
FIND j=6701 line= var b_x = 800; var b_y = 100; var b_dx = 2; var b_dy = 4;
FIND j=6702 line= var w_x = 800; var w_y = 100; var w_dx = 2; var w_dy = 4;
FIND j=6703 line= var i_x = 800; var i_y = 100; var i_dx = 2; var i_dy = 4;
FIND j=6704 line= var t_x = 800; var t_y = 100; var t_dx = 2; var t_dy = 4;
FIND j=6705 line=
FIND j=6706 line= var WIDTH = 800;
FIND j=6707 line= var HEIGHT = 100;
FIND j=6708 line=
FIND j=6709 line= var city = new Image();
FIND j=6710 line= var city_b = new Image();
FIND j=6711 line= var city_w = new Image();
FIND j=6712 line= var img_b = new Image();
FIND j=6713 line= var img_w = new Image();
FIND j=6714 line= var gif = new Image();
FIND j=6715 line= var img = new Image();
FIND j=6716 line= var txt = new Image();
FIND j=6717 line= img_new = new Image();
FIND j=6718 line=
FIND j=6719 line= img_mask = new Image();
FIND j=6720 line= img_mask_w = new Image();
FIND j=6721 line= img_mask_b = new Image();
FIND j=6722 line= img_mask_ko = new Image();
FIND j=6723 line= img_mask_kow = new Image();
FIND j=6724 line= img_mask_kob = new Image();
FIND j=6725 line= img_mask_koeye = new Image();
FIND j=6726 line= img_mask_koeyew = new Image();
FIND j=6727 line= img_mask_koeyeb = new Image();
FIND j=6728 line=
FIND j=6729 line= myimg="";
FIND j=6730 line= myimg="/imgs/btn/koeye_handhi.gif";
FIND j=6731 line= myimg="/imgs/btn/koeye_handhither.gif";
FIND j=6732 line= balls_n_cubes( myimg );
FIND j=6733 line=
FIND j=6734 line= function showFillText() {
FIND j=6735 line= ctx_t.fillStyle = '#f00';
FIND j=6736 line= ctx_t.fillStyle = 'yellow';
FIND j=6737 line=// ctx_t.font = 'italic bold 30px sans-serif';
FIND j=6738 line= ctx_t.font = 'italic bold 40px yokkmokkOT';
FIND j=6739 line= ctx_t.textBaseline = 'bottom';
FIND j=6740 line= ctx_t.fillText('timejaks: jkwii is here', 50, 100);
FIND j=6741 line= }
FIND j=6742 line=
FIND j=6743 line= function showStrokeText() {
FIND j=6744 line= ctx_t.strokeStyle = "#003300";
FIND j=6745 line= ctx_t.font = '40px san-serif';
FIND j=6746 line= ctx_t.textBaseline = 'bottom';
FIND j=6747 line= ctx_t.strokeText('timejaks jkwii is us', 300, 100);
FIND j=6748 line= }
FIND j=6749 line=
FIND j=6750 line=// textBaseline top,hanging,middle,alphabetic,ideographic,bottom default: alphabetic
FIND j=6751 line= function Clear_text() {
FIND j=6752 line= ctx_t.textBaseline = "top";
FIND j=6753 line= ctx_t.fillText('Top', 5, 100);
FIND j=6754 line= ctx_t.textBaseline = "bottom";
FIND j=6755 line= ctx_t.fillText('Bottom', 80, 100);
FIND j=6756 line= ctx_t.textBaseline = "middle";
FIND j=6757 line= ctx_t.fillText('Middle', 200, 100);
FIND j=6758 line= ctx_t.textBaseline = "alphabetic";
FIND j=6759 line= ctx_t.fillText('Alphabetic', 300, 100);
FIND j=6760 line= ctx_t.textBaseline = "hanging";
FIND j=6761 line= ctx_t.fillText('Hanging', 400, 100);
FIND j=6762 line= ctx_t.clearRect(1, 1, 600, 300);
FIND j=6763 line= }
FIND j=6764 line=
FIND j=6765 line=// var c5 = document.getElementById("c5");
FIND j=6766 line=// var c5_context = c5.getContext("2d");
FIND j=6767 line=
FIND j=6768 line= var dragon = new Image();
FIND j=6769 line= dragon.src = '/imgs/btn/dragon.png';
FIND j=6770 line=
FIND j=6771 line= function draw_dragon() {
FIND j=6772 line= ctx_i.drawImage(dragon, 100, 5);
FIND j=6773 line= }
FIND j=6774 line=
FIND j=6775 line= function draw_smaller_dragon() {
FIND j=6776 line= ctx_i.drawImage(dragon, 10, 5, 58, 100);
FIND j=6777 line= }
FIND j=6778 line=
FIND j=6779 line= function draw_dragon_head() {
FIND j=6780 line= ctx_i.drawImage(dragon, 0, 19, 69, 97, 300, 100, 103, 145);
FIND j=6781 line= }
FIND j=6782 line=
FIND j=6783 line= function Clear_image() {
FIND j=6784 line= ctx_i.clearRect(1, 1, 600, 300);
FIND j=6785 line= }
FIND j=6786 line=
FIND j=6787 line=
FIND j=6788 line=
FIND j=6789 line=
FIND j=6790 line= function balls_n_cubes(myimg) {
FIND j=6791 line=// alert( "BUGS_5780 myimg="+myimg );
FIND j=6792 line= imgs_new = new Array(); z=0;
FIND j=6793 line= imgs_new[z++] = "/imgs/btn/koeye_handhi.gif";
FIND j=6794 line= imgs_new[z++] = "/imgs/btn/ko.png";
FIND j=6795 line= imgs_new[z++] = "/imgs/btn/ok.png";
FIND j=6796 line= imgs_new[z++] = "/imgs/btn/koeyew.png";
FIND j=6797 line= imgs_new[z++] = "/imgs/btn/koeyeb.png";
FIND j=6798 line= imgs_new[z++] = "/imgs/btn/koeye.png";
FIND j=6799 line= imgs_new[z++] = "/imgs/btn/koeye_handhither.gif";
FIND j=6800 line=// alert( "BUGS_5790 myimg="+myimg );
FIND j=6801 line= if( myimg == "" ) {
FIND j=6802 line=// alert( "BUGS_5791 OLD myimg="+myimg );
FIND j=6803 line=// img_new.src = myimg;
FIND j=6804 line=// img_new.src = "/imgs/btn/ko.png";
FIND j=6805 line= img_new.src = "/imgs/btn/koeye_handhither.gif";
FIND j=6806 line= img_new.src = "/imgs/btn/koeye_handhi.gif";
FIND j=6807 line= }
FIND j=6808 line= else {
FIND j=6809 line=// alert( "BUGS_5792 NEW myimg="+myimg );
FIND j=6810 line=// img_new.src = "/imgs/btn/ok.png";
FIND j=6811 line= img_new.src = "/imgs/btn/koeye_handhither.gif";
FIND j=6812 line= img_new.src = myimg;
FIND j=6813 line= }
FIND j=6814 line= return( img_new );
FIND j=6815 line= }
FIND j=6816 line=
FIND j=6817 line=// function init() {
FIND j=6818 line=// myimg = "/imgs/btn/ko.png";
FIND j=6819 line=// myimg = "";
FIND j=6820 line= function init_balls_n_cubes(myimg) {
FIND j=6821 line=// alert( "BUGS_5810 balls_n_cubes myimg="+myimg );
FIND j=6822 line= city.src ="/imgs/btn/koeye.png";
FIND j=6823 line= city_b.src ="/imgs/btn/koeyeb.png";
FIND j=6824 line= city_w.src ="/imgs/btn/koeyew.png";
FIND j=6825 line=
FIND j=6826 line= img.src ="/imgs/btn/kob.png";
FIND j=6827 line= txt.src ="/imgs/btn/kow.png";
FIND j=6828 line= img_b.src ="/imgs/btn/koeyeb.png";
FIND j=6829 line= img_w.src ="/imgs/btn/koeyew.png";
FIND j=6830 line=
FIND j=6831 line= img_mask.src ="/imgs/btn/kob.png";
FIND j=6832 line= img_mask_w.src ="/imgs/btn/kob.png";
FIND j=6833 line= img_mask_b.src ="/imgs/btn/kob.png";
FIND j=6834 line= img_mask_koeye.src = "/imgs/btn/koeye_mask.png";
FIND j=6835 line= img_mask_koeyew.src = "/imgs/btn/koeyew_mask.png";
FIND j=6836 line= img_mask_koeyeb.src = "/imgs/btn/koeyeb_mask.png";
FIND j=6837 line= img_mask_ko.src = "/imgs/btn/ko_mask.png";
FIND j=6838 line= img_mask_kow.src = "/imgs/btn/kow_mask.png";
FIND j=6839 line= img_mask_kob.src = "/imgs/btn/kob_mask.png";
FIND j=6840 line=
FIND j=6841 line=
FIND j=6842 line= gif.src = "/imgs/btn/koeye_handhither.gif";
FIND j=6843 line=// gif.src = "/imgs/btn/ok.png";
FIND j=6844 line=// img_new = balls_n_cubes('');
FIND j=6845 line=// img_new = balls_n_cubes(myimg);
FIND j=6846 line= gif.src = img_new.src;
FIND j=6847 line=
FIND j=6848 line= layer1 = document.getElementById("layer1");
FIND j=6849 line= ctx1 = layer1.getContext("2d");
FIND j=6850 line= layer2 = document.getElementById("layer2");
FIND j=6851 line= ctx2 = layer2.getContext("2d");
FIND j=6852 line= layer3 = document.getElementById("layer3");
FIND j=6853 line= ctx3 = layer3.getContext("2d");
FIND j=6854 line=
FIND j=6855 line= layer4 = document.getElementById("layer4");
FIND j=6856 line= ctx_b = layer4.getContext("2d");
FIND j=6857 line= layer5 = document.getElementById("layer5");
FIND j=6858 line= ctx_w = layer5.getContext("2d");
FIND j=6859 line= layer6 = document.getElementById("layer6");
FIND j=6860 line= ctx_i = layer6.getContext("2d");
FIND j=6861 line= layer7 = document.getElementById("layer7");
FIND j=6862 line= ctx_t = layer7.getContext("2d");
FIND j=6863 line=
FIND j=6864 line= setInterval(drawAll, 20);
FIND j=6865 line= }
FIND j=6866 line=
FIND j=6867 line= function draw1() {
FIND j=6868 line= ctx1.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=6869 line= ctx1.fillStyle = "#FAF7F8";
FIND j=6870 line= ctx1.fillStyle = "darkslaegrey";
FIND j=6871 line= ctx1.beginPath();
FIND j=6872 line= ctx1.rect(0,0,WIDTH,HEIGHT);
FIND j=6873 line= ctx1.closePath();
FIND j=6874 line= ctx1.fill();
FIND j=6875 line= ctx1.fillStyle = "#444444";
FIND j=6876 line=// ctx1.fillStyle = "yellow";
FIND j=6877 line= ctx1.beginPath();
FIND j=6878 line= ctx1.arc(x, y, 10, 0, Math.PI*2, true);
FIND j=6879 line= ctx1.closePath();
FIND j=6880 line= ctx1.fill();
FIND j=6881 line=
FIND j=6882 line= if (x + dx > WIDTH || x + dx < 0) dx = -dx;
FIND j=6883 line= if (y + dy > HEIGHT || y + dy < 0) dy = -dy;
FIND j=6884 line=
FIND j=6885 line= x += dx;
FIND j=6886 line= y += dy;
FIND j=6887 line= }
FIND j=6888 line=
FIND j=6889 line=
FIND j=6890 line=
FIND j=6891 line= function draw_b() {
FIND j=6892 line= ctx_b.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=6893 line= ctx_b.fillStyle = "#FAF7F8";
FIND j=6894 line= ctx_b.fillStyle = "darkslaegrey";
FIND j=6895 line= ctx_b.beginPath();
FIND j=6896 line= ctx_b.rect(0,0,WIDTH,HEIGHT);
FIND j=6897 line= ctx_b.closePath();
FIND j=6898 line= ctx_b.fill();
FIND j=6899 line=// ctx_b.fillStyle = "#444444";
FIND j=6900 line= ctx_b.fillStyle = "red";
FIND j=6901 line= ctx_b.beginPath();
FIND j=6902 line= ctx_b.arc(b_x, b_y, 10, 0, Math.PI*2, true);
FIND j=6903 line= ctx_b.closePath();
FIND j=6904 line= ctx_b.fill();
FIND j=6905 line=
FIND j=6906 line= if (b_x + b_dx > WIDTH || b_x + b_dx < 0) b_dx = -b_dx;
FIND j=6907 line= if (b_y + b_dy > HEIGHT || b_y + b_dy < 0) b_dy = -b_dy;
FIND j=6908 line=
FIND j=6909 line= b_x += b_dx;
FIND j=6910 line= b_y += b_dy;
FIND j=6911 line= }
FIND j=6912 line=
FIND j=6913 line= function draw_w() {
FIND j=6914 line= ctx_w.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=6915 line=// ctx_w.fillStyle = "#FAF7F8";
FIND j=6916 line= ctx_w.fillStyle = "darkslaegrey";
FIND j=6917 line= ctx_w.beginPath();
FIND j=6918 line= ctx_w.rect(0,0,WIDTH,HEIGHT);
FIND j=6919 line= ctx_w.closePath();
FIND j=6920 line= ctx_w.fill();
FIND j=6921 line= ctx_w.fillStyle = "#444444";
FIND j=6922 line= ctx_w.fillStyle = "yellow";
FIND j=6923 line= ctx_w.fillStyle = "darkslategrey";
FIND j=6924 line= ctx_w.beginPath();
FIND j=6925 line= ctx_w.arc(w_x, w_y, 10, 0, Math.PI*2, true);
FIND j=6926 line= ctx_w.closePath();
FIND j=6927 line= ctx_w.fill();
FIND j=6928 line=
FIND j=6929 line= if (w_x + w_dx > WIDTH || w_x + w_dx < 0) w_dx = -w_dx;
FIND j=6930 line= if (w_y + w_dy > HEIGHT || w_y + w_dy < 0) w_dy = -w_dy;
FIND j=6931 line=
FIND j=6932 line= w_x += w_dx; w_y += w_dy;
FIND j=6933 line= }
FIND j=6934 line=
FIND j=6935 line=
FIND j=6936 line=
FIND j=6937 line=
FIND j=6938 line=
FIND j=6939 line= function draw2() {
FIND j=6940 line= ctx2.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=6941 line= ctx2.drawImage(city, WIDTH/2-100, 10 );
FIND j=6942 line= ctx2.drawImage(city_w, WIDTH/2-100, 10 );
FIND j=6943 line= ctx2.drawImage(city_b, WIDTH/2-100, 10 );
FIND j=6944 line= ctx2.drawImage(gif, WIDTH/2-100, 10 );
FIND j=6945 line=
FIND j=6946 line=
FIND j=6947 line=// ctx2.drawImage(img_mask, 0, 0);
FIND j=6948 line=// ctx2.globalCompositeOperation = 'source-in';
FIND j=6949 line=// ctx2.drawImage(city_w, 10 , 10);
FIND j=6950 line=// ctx2.drawImage(img_mask, 0, 0);
FIND j=6951 line= }
FIND j=6952 line=
FIND j=6953 line= function draw_i() {
FIND j=6954 line=// img_mask="/imgs/btn/koeye_mask.png";
FIND j=6955 line=// ctx_i.drawImage(img_mask, 0, 0);
FIND j=6956 line=// ctx_i.globalCompositeOperation = 'source-in';
FIND j=6957 line=// ctx_i.drawImage(img_w, 0 , 0);
FIND j=6958 line=
FIND j=6959 line=
FIND j=6960 line=
FIND j=6961 line= ctx_i.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=6962 line= ctx_i.drawImage(img, WIDTH/2-100, 10 );
FIND j=6963 line=// ctx_i.drawImage(img_i, WIDTH/2-100, 10 );
FIND j=6964 line= }
FIND j=6965 line=
FIND j=6966 line= function draw_t() {
FIND j=6967 line= txt="timejaks: jkwii";
FIND j=6968 line=// ctx_t.drawImage(txt, 0, 0);
FIND j=6969 line=// ctx_t.drawImage(img_t, WIDTH/2-100, 10 );
FIND j=6970 line=// ctx_t.fillStyle = '#f00';
FIND j=6971 line=// ctx_t.font = 'italic bold 30px sans-serif';
FIND j=6972 line=// ctx_t.fillText(txt, 50, 100);
FIND j=6973 line=// ctx_t.fillText("timejaks: jkwii is me", 0, 0);
FIND j=6974 line=// ctx_t.fillText("timejaks: jkwii is he", x, y);
FIND j=6975 line=
FIND j=6976 line= ctx_t.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=6977 line= ctx_t.fillStyle = 'black';
FIND j=6978 line= ctx_t.fillStyle = 'goldenrod';
FIND j=6979 line= ctx_t.fillStyle = 'darkslategrey';
FIND j=6980 line= ctx_t.font = '50px yokkmokkOT';
FIND j=6981 line= ctx_t.textBaseline = 'bottom';
FIND j=6982 line= ctx_t.fillText("timejaks: jkwii is where", x, y);
FIND j=6983 line=
FIND j=6984 line=// alert( "BUGS_5900 drat_t txt="+txt );
FIND j=6985 line= }
FIND j=6986 line=
FIND j=6987 line=
FIND j=6988 line=
FIND j=6989 line=
FIND j=6990 line=
FIND j=6991 line= function draw3() {
FIND j=6992 line= ctx3.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=6993 line= ctx3.fillStyle = "#444444";
FIND j=6994 line=// ctx3.fillStyle = "darkslategrey";
FIND j=6995 line=// ctx3.translate(100,100);
FIND j=6996 line=// ctx3.fillRect(-15, -15, 50, 50);
FIND j=6997 line= ctx3.save();
FIND j=6998 line= ctx3.translate(400,50);
FIND j=6999 line= ctx3.rotate(x/20);
FIND j=7000 line= ctx3.fillRect(10, 0, 25, 25);
FIND j=7001 line= ctx3.restore();
FIND j=7002 line= }
FIND j=7003 line=
FIND j=7004 line=
FIND j=7005 line=
FIND j=7006 line=
FIND j=7007 line=
FIND j=7008 line=
FIND j=7009 line= function drawAll() {
FIND j=7010 line= draw_b();
FIND j=7011 line= draw_w();
FIND j=7012 line= draw_i();
FIND j=7013 line= draw_t();
FIND j=7014 line=
FIND j=7015 line= draw1();
FIND j=7016 line= draw2();
FIND j=7017 line= draw3();
FIND j=7018 line= }
FIND j=7019 line=
FIND j=7020 line=
FIND j=7021 line=
FIND j=7022 line=
FIND j=7023 line=
FIND j=7024 line=
FIND j=7025 line=
FIND j=7026 line=// init(img_new);
FIND j=7027 line= init_balls_n_cubes(myimg);
FIND j=7028 line= </script id="script_canvas_balls_n_cubes_w" >
FIND j=7029 line=
FIND j=7030 line= <script id="script_load_urlbtn">
FIND j=7031 line= function load_urlbtn(btnid) {
FIND j=7032 line= img_dragon: url("/imgs/links/tn/tn_dragon.png" );
FIND j=7033 line= img_ko: url("/imgs/btn/ko.png");
FIND j=7034 line= img_ok: url("/imgs/btn/ok.png");
FIND j=7035 line= img_kb: url("/imgs/btn/kb.png");
FIND j=7036 line= img_kw: url("/imgs/btn/kw.png");
FIND j=7037 line= img_ki: url("/imgs/btn/ki.png");
FIND j=7038 line=
FIND j=7039 line= img_kob: url("/imgs/btn/kob.png");
FIND j=7040 line= img_kow: url("/imgs/btn/kow.png");
FIND j=7041 line= img_kib: url("/imgs/btn/kib.png");
FIND j=7042 line= img_kiw: url("/imgs/btn/kiw.png");
FIND j=7043 line=
FIND j=7044 line= img_koeye: url("/imgs/btn/koeye.png");
FIND j=7045 line= img_koeyeb: url("/imgs/btn/koeyeb.png");
FIND j=7046 line= img_koeyew: url("/imgs/btn/koeyew.png");
FIND j=7047 line= img_koeye_handhither: url("/imgs/btn/koeye_handhither.gif");
FIND j=7048 line= img_koeye_handhi: url("/imgs/btn/koeye_handhi.gif");
FIND j=7049 line=
FIND j=7050 line= img_kop1: url("/imgs/btn/kop1.png");
FIND j=7051 line= img_kop2: url("/imgs/btn/kop2.png");
FIND j=7052 line= img_kop3: url("/imgs/btn/kop3.png");
FIND j=7053 line= img_kop4: url("/imgs/btn/kop4.png");
FIND j=7054 line=
FIND j=7055 line= img_kop12: url("/imgs/btn/kop12.png");
FIND j=7056 line= img_kop23: url("/imgs/btn/ko23.png");
FIND j=7057 line= img_kop34: url("/imgs/btn/kop34.png");
FIND j=7058 line= img_kop14: url("/imgs/btn/kop14.png");
FIND j=7059 line=
FIND j=7060 line= img_btn: url("/imgs/btn/btn.png");
FIND j=7061 line= img_btn_n: url("/imgs/btn/btn_n.png");
FIND j=7062 line= img_btn_s: url("/imgs/btn/btn_s.png");
FIND j=7063 line= img_btn_e: url("/imgs/btn/btn_e.png");
FIND j=7064 line= img_btn_w: url("/imgs/btn/btn_w.png");
FIND j=7065 line= return(img);
FIND j=7066 line= }
FIND j=7067 line= </script id="script_load_urlbtn">
FIND j=7068 line=
FIND j=7069 line=
FIND j=7070 line= <script id="script_load_b64btn" >
FIND j=7071 line= function load_b64btn(btnid) {
FIND j=7072 line= ko_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAE1FJREFUeNq0m09sI9d5wH/fG1I7FEXJWi4trow0cpKDgSBA4FzUS9tL29W5h0WSNg0QA/WaVNEI9tWHRZGitSEXEendAknhokWBHHr1Oj0VPRQC2hpt3AB7KBDFi11zJVFckZI4FGfe18ObIWck6t/aJRbickgO3+99f9/3vSfK1R/bQYWOT4MaNF8LcPeQBffUQgFRcpH7uKKegEaCAFrlqXrFe6/9cAOGsAYbQfGw0gcgYJ4d/8WrDkmuzrHX+I5IVYlQAdj1whwQ3nS3CslJC0ATDjT3H98qtwkFQaHiSUv/63fxRHmqOYBp78AP3tpYZSOgOLWt/1gvXA3mihx7eyILUU5FeZqM0aIS5cPrnYqheKW7HWJ3UJ2b6a2Orq2vueeNnl4vFP5fOHrbVRgTAEqOSKKXnkjhQOWl6StK9vY9P3rv+28BrANgjTUAOJi/bb1Y+sI5tiwLjkBFIQcMRbDT/ZsHxW6vFAhF/7h8RR0NV1kHbPayscaxbByYpS+UY+vFlqNQcgzBmeyc8CxXfvLiERxjEcoBlasIBNZHECvu6cEIxrmAme2lL4zj7h+qOIYhIIi+eNykTqEXlMMjgCDyDFiE4qVJbsN6DLHyiTqn4XzdUSdBWYMfyVe+II6tSBLvqSY0M6ZZv/PLTX6wMTvgCPCfffwqonz8KiBl3nv7ShQr/EJJj0PAfOPBygMAswY/8pa+CI6735U4BACl5lvf/yWfHHauBXP0PMAP/u1VkMT0ReUyIrkdU6wA/62MZBHfSDDfcCpmWLsEyGU4/ldywxyUoV2c2Z1nmc39ta//mR75AeDzjOxcqpS5yM/cHlPwScSpUQiYo2VnLYY1/nLp83P82gplgGhY/+kym+yv/U2e4/jdyOhUW1IeRwCKpnxJYWwyrXYSiJij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");
FIND j=7073 line= ok_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD9/f0bIQwZHgowLzEoKCohISIvMDU1NjoqLDOCg4S1trQUGQemqZ54e28fIxE0NiyFiXaSlYZNTkkuMCNZWlRvcGonKRo9PzEKCgUREQtBQUDU1NMZGBQfHhp9fHozLiv8/Pz5+fn39/f09PTv7+/n5+fe3t4AAADXRk1jAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////6eH29uXl7e3t7e3t9uHs4elWVlbk5OTp6elW5YHq39zd9PTc3d3d3dzc297f39/e29zc3d3d3d3d3eDc3N3c3Nzc3d319PT09PT03dzc3Nzc3N3d5YHs7OyBge3t5fb24en/////////////////////////////////////////////////////////////////////AP//////////////////////////////////////////////////////////6eH27YHb3PLs4eHpVlbpVuHp4e3q4ODg4ODc3fT09fTx8azc3fX08dzc3N3d3Nzb39/y36zg3N3d3d3d3d3d4Nzd3d3d3fX08PD09PT09PT13ODg4ODc4N3x8fHx8fDx8fT09d3c24Ht//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////9u3b3OlWVlZWVlZW5FZWVlZWVlZWVlbp9urb3N3d8vT0//////////////////////////////////////////////////////////////T08t3u3ODb3t3e3uDc3d3d3d3d3fT09fT18fTd3Nvt/////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////8tz0VlZWVlZW5OTk5OTk4uTi5OTk5OTkVlZWVlbhgfL17Vb////////////////////////////////////////////////////////////////12tna5t3c9tve3eDg3Nzd3d3d3d3d3d3d9PT19PT03PL/////////////////////////////////////////////////////////AP//////////////////////////////////////////////////393pVlZWVuTk5OLk4uLi4uLi4uLi4uLi4uLi5OTk5FZW6e3//////////////////////////////////////////////////////////////+zy6t/f3ubZ5vTp9dzl293d3Nvg4ODg3Nzc3dzd3d3d3d303d3f//////////////////////////////////////////////////////8A////////////////////////////////////////////////3/XpVlZW5OTk4uLi4uLi4uLiKysrKysrK+Li4uLi4uLk5ORWVlb//////////////////////////////////////////////////////////+rq8t/f3t7g4Obm5vDa9OHd7e3s3d3d3dzc29vb4ODc3N3d3d3d9N313////////////////////////////////////////////////////wD//////////////////////////////////////////////93cVlZW5OTi4uLi4uLi8/38/Pz8/f39/f39/P3+K+Li4uLi4uTkVlZW/////////////////////////////////////////////////////+rq39/e3uDg4N7b3ubm5ubm8PTh6fbt7YGB7PLc3dzc29vb2+Dc3N3d3d3c3YH/////////////////////////////////////////////////AP///////////////////////////////////////////9/cVlZW5OLi4uLiK+Ir/vz8/Pv7+/v7+/v7+/v7+/z8/Ssr4uLi4uLk5FZWVv///////////////////////////////////////////////4Hy8t/e3t7erN7e397erN7u5ubm5vDw9+lW8/MrVu2B7Ore3ODe39/e29zc3d3d3N////////////////////////////////////////////////8A///////////////////////////////////////////f3FZW5OTi4uLi4isr/vz8+/v7+/v7+vr6+vr7+/v7+/v7/CsrKyvi4uLi5ORWVv/////////////////////////////////////////////q6t/e397f39/f39/f397e3qzm7ubm5ubj8PDh6eLz/isrVvaB7N/f39/f397b3Nzd3IH//////////////////////////////////////////////wD/////////////////////////////////////////31ZW5OTi4uLiKysr8/37+/v6+vr6+vr6+vr6+vr6+vr6+vv7/isrKysr4uLi4uTkVv//////////////////////////////////////////8vLf3t/f397e3t7e3t7e3t7e3t7u7ubm5ubu5vDxgVbk8ysr8/Pi9urf8vLy39/f2+Dc2///////////////////////////////////////////////AP///////////////////////////////////////+BWVuTk4uLiKysrK/P9+/r6+fn5+fn5+fn5+fn5+fn5+fn6+vz98/MrKysr4uLi4uTkVlb/////////////////////////////////////7Orf39/f397e3t7e3t7e3t7g4N/y7O3r7u7u7u7u7u709O9W5PPzKyvzVurv8vLy8vLf397g//////////////////////////////////////////////8A///////////////////////////////////////yVlbk4uLiKysrKyvz/v38+/z8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/f7+/vPzKysrK+Li4uLkVlb//////////////////////////////////+ry39/f39/e3t6s3t7e3t7g4PLt4eHh4eHn6+vr6+vr5+fr693y5OQr8/Mr7fLy8vLq8vLy39/b4P///////////////////////////////////////////wD/////////////////////////////////////6lbk5OLi4uIrKyvz/v7+/f39/fz9/Pz8/Pz8/Pz8/Pz8/P38/P39/f39/v7+8ysrKyvi4uLkVlb////////////////////////////////q8t/f39/f36ze3t7g3t7e4PKB4eHh4eHh4eHv7+/n7+/v7+/v5+fc9+Hk4uTt6urq6urq6vLy8t/e8v//////////////////////////////////////////AP///////////////////////////////////+pWVuTi4uIrKyvz8/7+/v39/fz8/Pz8/Pz8+/v7+/v7+/v7/Pz8/Pz8/f39/v7+8/MrKyvi4uLkVlb/////////////////////////////6t/f39/f39/e4ODg4N7g4ODy7fbh9uHh4eHh4eHv7+/v7+/v7+/v7+/y3+/q7Ozs7Orq7Ozq6vLy8vLf8v////////////////////////////////////////8A////////////////////////////////////VuTk4uIrKysr8/7+/v39/fz8/Pz8+/v7+/v7+/v7+/v7+/v7+/v8/Pz8/P39/f7+8/MrKyvi4uLkVlb//////////////////////////+ry39/f39/e4ODg4ODe3t7g34Hh4eHh4eHh4eHh4eHy8vLy8vLy8vLy8vLq6urs7Ozs7Ozs7IHq6ury8vLf6v///////////////////////////////////////wD/////////////////////////////////7VZW5OLi4isrK/7+/v39/fz8/Pz7+/v7+/r6+vn5+vr6+vn5+vr7+/v7+/z8/Pz9/f3+/vMrKyvi4uLkVv/////////////////////////s8t/f3t/e4ODg4ODg4N7e4ODfgeHh4eHh4eHh4eHh4eHq6urq6urq6urq6vLq6uzsgYHsgezs7Ozs6urq6t/f6v//////////////////////////////////////AP///////////////////////////////4FWVuTi4isrK/Pz/v79/fz8/Pz7+/v7+vn6+fn5+fn5+fn5+fn5+fr5+vr7+/v8/Pz8/f3+/vMrKyvi4uLkVv//////////////////////gd/f3t/e4ODg3uDg4N7e4N7g3t/sge329uH29u2B7e3tgerq6oLqgurqgurs6urs7OzsgeyBgYGB7Ozs7Orq6vLf6v////////////////////////////////////8A////////////////////////////////Vlbk4uLiKyvz8/7+/f38/Pz7+/v6+vr5+fn5+fn4+Pj4+Pj4+fn5+fn5+fn6+/v7/Pz8/f3+/v4rKyvi4uLkVv///////////////////+Xf3t7e4ODg4N7g4N7e3uDe3t7e3t7y6vLy8vLf397e4ODe6+qC6urs7Ozs7Ozs7Ozs7IHsgYGBgYGBgYHs7Ozs6vLf8v///////////////////////////////////wD//////////////////////////////1ZW5OLi4isrK/P+/v39/Pz8+/v7+vn5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+fn5+fn6+/v7/Pz8/f3+/vPzKyvi4uTkVv//////////////////3+Dg4ODg4ODe3uDg4ODg3uDe3t7e3uDg4N7e4ODg4ODe3t7g2+zs7OyC7Ozs7IGCgYGB7IHtge3t7e2BgYGB7Ors6vLq////////////////////////////////////AP/////////////////////////////tVlbk4uIrKyvz/v39/fz8+/v7+vr5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5+fn6+vv7+/z8/f3+/vMrKyvi4uRW/////////////////+rg4ODg4ODg4N7g4ODg4ODe3uDg3t7g4ODg4N7g3t7e3t7e3t7e2+zs7IGBgu2BgYGBge3tge3t7e3t7eXt7YGB7Ozq6vLs//////////////////////////////////8A/////////////////////////////1ZW5OLi4isr8/7+/f38/Pz7+/r5+fn5+Pj4+Pj4+Pj42NjY2NjY+Pj4+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrKyvi4uRW//////////////+B4ODg4ODg4ODg4N7b4ODg4ODg4ODg4ODg3t7e3t7e3t7e4N7e3t7e7+yBgu3t7e3t7e3t7e3t7e3t5eXl5eXl7e2Bgezq6vL//////////////////////////////////wD////////////////////////////hVlbi4uIrK/P+/v39/Pz8+/r6+fn5+Pj4+Pj4+NjY2NjY2NjY2NjY2NjY+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrK+Li5OT///////////////Lf4ODg4ODg4ODg4ODg4ODc4Nzg4ODg4N7e3t6s3t/f397e3t7e3t/f7+3t7e3t7eXl7eXt5eXl5eX29vb29vbl5e2Bgezs8v//////////////////////////////////AP///////////////////////////1ZW5OLiKyvz8/79/f38/Pv6+vn5+fj4+Pj4+NjY2NjY2NjY2NjY2NjY2NjY2Pj4+Pj4+Pn5+vr7+/z8/f3+/vMrK+Li5Fb/////////////8t7g4ODg4ODg4ODg4ODg4ODg4ODb4N7e397f3t/f397e3qze3t7e3t7frIHt7e3l5eXl5eXl5eXl6Ojo4eHh4eH29uXtgezs8uz///////////////////////////////8A//////////////////////////9WVuTi4isrK/P+/v39/Pz8+/r6+fn4+Pj4+PjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz8/f7+8ysr4uLi5P////////////Lf3+Dg4ODg4ODg4ODg4ODg4ODg297e39/f39/e3t7e3uDg4ODg4ODe4N7b5+3t5eXl5ejo6Ojo6Ojo6Ojo6Onp4eHh9vbtgezs6v///////////////////////////////wD//////////////////////////1ZW4uLi4ivz/v79/f38/Pv7+vn5+Pj4+Pj42NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz9/f7z8ysr4uLkVv/////////q8t/e3t7e4ODg4ODg4ODg4ODb3t7e3t/frN7e3uDg4ODc4Nzg3ODg4ODg4ODb6+Xl5ejo6Ojo6Ono6ejp6enp6enp6enh4fbtgezqgf//////////////////////////////AP/////////////////////////lVuTi4isr8/P+/v39/fz8+/r5+fn5+Pj4+NjY2NjY2NjY2NgAAAAAAAAA2NjY2NjY2Nj4+Pj4+Pn5+vv7/Pz9/f7zKysr4uTk//////////Lf4N7e3uDg4ODg4ODg4ODg3t7g3t7e3uDg4ODg3ODc4ODg4ODg4ODg4ODc4Nzg6+Xo6Ojo6ejp6enp6enp6enp6elWVunp6eHtgYHq7f////////////////////////////8A////////////////////////7Vbk4uLiKyvz8/7+/f38/Pv7+vn5+fn4+Pj42NjY2NjY2NjYAAAAAAAAAAAAANjY2NjY2Nj4+Pj4+fn5+vv7/Pz9/v7zK+Li4uT////////t397e3t7g4ODg3t7e3t7g4ODg4N7g4ODg4ODg4ODg4N7e3t7e3uDg4ODg4ODc3Nzc4Ojo6Ojo6enp6enp6enp6enp6elWVlbp6eHt7YHs7f///////////////////////////wD//////////////////////+WBVuTi4isr8/P+/v39/fz7+/r6+fn5+fj4+PjY2NjY2NjY2AAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn5+vv8/P39/vPzKyvi5Fb//////+zf4ODg4ODg4N7f39/f39/e3uDg4ODg4ODg4ODg4ODg4N7e3t7e4ODg4ODg3Nzc3Nzc3Ojo6enp6enpVuTkVuTk5ORW5OlW5FZW6eH27YHs////////////////////////////AP/////////////////////27O3k4uIrKyvz/v7+/f38/Pv7+vn5+fn5+Pj4+NjY2NjY2NjYAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn6+/z8/P3+/vMr4uLi5P//////8t7g4N7e39/f39/f39/f39/e3t7g4ODg3uDg4ODg4ODg4ODg4ODg4ODg4ODg4ODc3Nzc3O7p6enp6eTp5Onk5OTk5OTk5OTkVuRWVuH27YHs9v////////////////////////8A//////////////////+s4eyB4eLi4isr8/P+/v39/fz7+/r7+/r6+vn5+Pj4+NjY2NjY2AAAAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj5+fn6+/z8/f3+8ysr4uLk///////e4ODe39/f39/f39/f39/f397e3t7g3t7g4ODg4ODg4ODe3t7e3uDg3t7e2+Dg4Nzg4Nzd8fXp6Vbk5OTk5OTk5OTk5OTk5OTk5Fbp4eH27YHs/////////////////////////wD////////////////y4ezsgYHi4isrKyvz/v79/f39/Pz8+/v6+vr6+fn4+Pj4+NjY2NgA+fn5+fj4+fn5AAAAAAAAAADY2NjY2Pj4+Pj5+fr7+/z9/f7z8yvi4uRW////7ODg4N7f39/f39/f3t/f39/e3t7g4ODg4ODg4ODg4N7e3t7e3t/f3t7f397f39/f4ODg4ODd9PTu5OTk5OTk5OQs5CzkLOTk5OTk6enp4fbt7YH/////////////////////////AP/////////////t4ezq7IGB7eLiKysr8/7+/v39/fz8/Pz7+/r6+vr5+fj5+Pj4+NjYAPn6+vr6+vr6+vn5AAAAAAAAAADY2NjY2Pj4+Pn5+fr7/Pz9/v4rKyvi4lb////y4ODe3t/f39/f397e3t7e4N7g4ODg4ODc4ODg4ODg3t7e3t7e3t7e3t7e3t/f39/g4ODg4ODd8fHj5unk5OQs5OLk4uTi5Czk5OTk5Ono6OXtgYHs6v////////////////////8A/////////////4Hq6uzs7IHt4uIr8/P+/v79/f38/Pz8+/v7+/r6+fn5+fj4+Pj42Nj5+/r8+/v7+/v7+fr4AAAAAAAAANjY2NjY+Pj4+Pn5+vv8/P39/vMrK+Lk5P///97g4N7e3t/f3t7e4ODg4ODg3ODc4ODc4Nzc3ODg4N7g3uDe3t7e3t7e3t7g3t7g4ODg3Nzc3dz19PT049nk5OTk5OTk5OTi5OTk5OTp6eno5eWB7Ozs/////////////////////wD//////////+Xs6urq7Ozt6OTiKyvz8/7+/f39/Pz8/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+fn5+fv7+vr4AAAAAAAAANjY2NjY+Pj4+fn6+/v8/f3+8ysr4uLk///s4ODe3t7f3t7e3uDg3Nzc3Nzc3Nzg3ODc3d3c4ODe4N7g3t7e3t7g4ODg4N7g4ODc4ODg3N319fX09PX08fDx5uTk5OTk5OTk5OTk5OTp6eno5eXt7Ozq6ur/////////////////AP///////+3s6urq7OyB7e3o5OIrK/P+/v39/fz8/Pz7+/v6+vn5+fn5+fn5+fj5+Pn6+/v7+djY2NjY+fv6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT///Lg4N7e3t7e4ODg3Nzc3N3c3dzc4Nzg3fX19PXd3ODg4ODe4N7e4N7e4ODe4ODg3ODg3ODd9fX09PT09fX18fDw8OPu6eTk5OTk5Onp6enp6Ojo5e3t7Ozs6urq7P////////////8A5Fbh7IHs7Ors7Ozs7O3t5eji4isr8/7+/f38/fz8+/v7+vr6+fn5+fn5+fn5+fn5+vr7+/nY2NjY2NjY+fv6+fkAAAAAAAAA2NjY2Pj4+Pn5+fr7/Pz9/v4rK+LiVv/t3t7g4ODe4ODg3Nzd3Nzc3fX13dzg3Nz19fX19fX13dzg4ODg4ODe4ODg4ODg4ODg4ODg3PX19fT09PT19fX19fX19fXu7urs6enk6eTp6enp6Ojl5e3tguzs7Ozq7OyB7IH26eXt9wD19fX19Nrj4+Pj49ra4+Pa2lbiKyvz/v39/fz8/Pz7+/r6+fn5+fn5+fn5+vn5+fn7+/v6+NjY2NjY2NjY+fv6+QAAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMrK+LkK+zd3uDg3ODg4Nzg3fX13d319fX13eDg9fX13fX19fX09d3c3ODc4Nzg4Nzc3Nzg3ODb4Nz19fX19PT09PT19fX19fX19fX13Ovc6+vr5u7q7IHt9unpVuTi4uLi4isrKysr4uLi5FboAP//////////////////////K+IrK/P+/v39/Pz8+/v6+vn5+fn5+fn5+vr6+vr5+vv7+vjY2NjY2NjY2NjY+fn5AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8yvi4uQr8vXb3dzd3dzg3N319fXd9fX09fXc3Nz19d3u9fX19PT03dzg4ODc3N3c3d3d3d3d3dzc9fX19PT09PT09PX09PX19fX19fX13dzc4ODe7P////////////////////////////////8A///////////////////////i4isr8/7+/f38/Pv7+vr5+fn5+fn5+fn5+vr5+vn6+/v52NjY2NjY2NjY2Nj6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7/Pz9/v7zKyvi4ivn9d319d313d319fX19fX19PT09Nzc3PT19fX19PX19fX03Nzg3d313fX19fX19fX19fT09fT09PTx9PT09fTx9PX19fX19fX13d3c297s/////////////////////////////////wD//////////////////////+LiKyvz8/79/fz8+/r6+fn5+fn5+fn5+vr6+/r7+vv8/PnY2NjY2NjY2NjY2Pn6+fgAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMr4uLk/ef19fT09fX19fX09fXd9fX09PT13dzd9fX09fX09PT09PXd4Nz19PT19PT09fX13fX19PT19PT09PT09PT19PH09PT09fX09fX19d3c3uz/////////////////////////////////AP//////////////////////4uLiK/Pz/v39/Pz7+vn5+fn5+fn5+fn6+vv6+/r7+/v8+fjY2NjY2NjY2Nj4+fn4AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8ysr4uLz5/X09PX19fX19fX19fX19fX09PT19fX19PT09PT09PT09PXc3fTx9PH09PT09PT09PT09PT09PT08fT09PX08fHx8fT09PT09fX19e7e7P////////////+GchQ3AAAfU0lEQVT///////////////////8A///////////////////////i4uIr8/P+/vz8+/v6+fn5+fn4+fn5+fr6+vr7+/v7/Pz5+PjY2NjY2NjY2Pj5+fkAAAAAAADY2NjY2Nj4+Pj5+fr7/Pz9/v7zK+Li5OLv9PHx8fHx9PT09PT09PX19fX09Nr09PX19fT09PT09PX19fX19PH08fTx8fH09PT09PT09PT09PTx9PH09PX08fT09PT09PT19fT13d7s/////////////////////////////////wD//////////////////////+Li4isr8/79/fz8+/r5+fn5+Pj5+fn5+fn6+vv7+vz8/Pr4+NjY2NjY2Nj4+fn5+djYAAAAANjY2NjY2Pj4+Pn5+vv8/P3+/vMrK+Li/+ra8fHx8fD09PHx8fT09PT09PTa2ub19fTd9fX19fXd9fXm5ub09PT08fHx8fH09PX09Ob09PT09PHx9PT09fTx9PX09PT09fX19PX12+z/////////////////////////////////AP///////////////////////+TiKyvz/v39/Pz7+vn5+fn4+Pn5+fn5+fr6+vv7/Pz8/Pr4+NjY2NjY+Pn5+fj42NjY2NjY2NjY2NjY+Pj4+fn6+/z8/f7+8yvi4uT/gebw8fHw8PDx8fHx8fT09PT09PTa9PT09PX19d313fXd9ebm5ubZ9fT08fH09fX15ubm5ubm5vT09PTj2trm5vT09eb19fX09fX05t3r6v////////////////////////////////8A8u/n6+vr6+vn7+/y6uzt6Fbk4ivz/v38/Pz8/PP+/v7+/fz6+fn5+fn5+fn6+vr7+/z8+/r42NjY2Pj5+fn5+dj42PjY2NjY2NjY2Pj4+Pn5+fr7/Pz9/v7zKyvi5P//5+Pw8fHx8PDw8PHx9PTx8fH08fT09PT09PT19fX19fXd9fTm5ubm5ub02tnm5ubm5tnZ2ubm5tra2trZ2ebm5ubm5ubm5ubm5ubm3evc/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+QDu9+3l6faB7IHs7Orq7Ozs7IHt5eXo6Ojp6enpVlZWVunp6eriK/v5+fn4+fn6+/v7/Pz8+/r5+fn5+fn5+fj4+Pj4+Pj42NjY2NjY+Pj4+fn5+/v8/P398ysr4uLk///q2uPj4/Hw8PDw8fH08fH08fHx4/T09PT09PT19fX19fX13eb05vTm5ubZ2dra2tra49ra2drZ2dnZ2dnZ2uba2tna5tn05ubm5u7m6+rp6enp6Ojl5e2Bgezs6uzq7OyB7IH26eXtAP/////////////t7Ozq6uzsge3t5ejo6enpVuTk6eTk5OTk6eTp5P35+fj4+Pn6+vv7/Pz8+/v6+vr6+fn5+Pj4+Pj4+PjY2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT//+3u2uPj4/Dw8PDx8fHx8fH08fH08fT09PT09PT09fX13fXd9ebm2dna2dnZ2drZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tnm5ub17u7r8unp6ejo6OXtgYLs7Orq6uz///////////8A////////////////5ezq6uqC7IHl5ejo6enp5OTk5OTk5OTk5OTkVlbk/fj4+Pn6+/v7+/v7+/r6+vr5+fj5+fj4+Pj4+Pj42PjY+Pj4+Pn5+vv8/P39/vMrK+Li5P///+fa4+Pj4/Dw8PHx8fHx8fHx8fTx8fT09PT09PX19fX13fXd9eba2dra2tra2trZ2tna2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ5vT19fXu3efs5Onp6ejl5YHs7Orq6uz//////////////wD//////////////////4Hq6uzs7IHl6OjpVunk5OTk5OTk5OTk5OTk5ORW5Pz4+Pr6+/v7+/v7+vr6+fn5+Pn5+fj4+Pj4+Pj42Pj4+Pj5+fn7+/z8/f7+8ysr4uTi////8tna2uPj8PDw8PDw8fHx8fHj9PT08fT09PT19PX19fXd9fX12tra2tra2tra2tra2tra2tra2dnm5tna2tra2trZ2vT09fX13d3u5+3p6eno5eWBgezs6uqB////////////////AP//////////////////7eHs6uyBge3l6Onp5OTk5OQs4iziLOLkLOTk5OTk6eT8+fr6+/v7+/r6+vn5+fn5+fn5+fj4+Pj4+Pj4+fj4+Pn5+vv7/Pz9/v7zK+Li4v/////t7tna4+Pw8PDx8PDw8fHx8eP09PTx9PT09PX09fX19fX13fX02tra4+Pj2tra2tra2tra2trZ2dra2tra2uPj2tr08fT09PX19e7v7eTp6Ojl7YGB7Ors//////////////////8A////////////////////5fLh7OyB7e324ejp6eTk5OTk5OTi5OLk5OTk5OTkVunk/Pr5+/v7+/v6+/r6+fn5+fn5+fj4+fn5+fn4+Pj4+fn6+/v8/f3+8/Mr4uJW///////n5trj4/Hx8PHx8fHx8PHj8fT09PT09PT09PT19fX19fX19OPj4+Pj4+Pj2uPa2tra2tra2tra4+Pa2trj4+Pa2vHx9PT09fX17vLp6enh9u3tgers//L//////////////////wD///////////////////////Ks4eyB7eXh6elW5OTk5OTk5OTk5OTk5OTk6eTp6enp9vv6+vv7+/v7+/v6+fr5+fn5+fn5+fn5+fn5+fn5+fr7/Pz9/f7zKyvi4uL//////+rm2drj4/Hw8fHx8fDx4+P09PT09PT08fHx8fT09fX19PT04+Pj2uPj4+Pj2tra2tra2trj2ub09ebm49rj4+P09PHx9PH09PXr7Onp6eHl7YHs////////////////////////AP/////////////////////////y9uyB7fbh6Vbk5OTk5OTk5OTk5OTk6eTk6enp6enoVvn6+vv7+/v7+/r6+vr5+fn5+fn5+fn5+fn5+fn6+/v8/P3+/vMr4uLk4v///////+7m2drj4+Pj4/Dx8fDj4+Pj4/Tj9PHx8fHx8fTx9PT04+Pj4+Pj4+Pj4+Pa2tra49rj4/T19fT19e7m4+Pj4/Tx8fHx8Nr09OeBVlbh9u2B7Pb///////////////////////8A///////////////////////////c7eyB7fbh6Vbp5Onp5Onk5Onk6enk6enp6enp6Ono6fz6+/v7+/v7+/r6+vn5+fn5+fn5+fn5+fn5+vv7/Pz9/f7zKyvi4uT/////////5+bZ2ePj4/Hj4+P02uPj4+Px4+Pj4+Px8fHw8PDw8fHx4+Pj4+Pj49ra2dra2trj4/Tm9fX09PX09fX04+Pj9PHx8fHj9PH03+lW4fbtgezl8v///////////////////////wD////////////////////////////g7eqB7e3h6VbpVuTp6enp6enp5Onp6enp6ejp6Ojo5fv6+/v7+/v6+vr6+fn5+fn5+fn5+fr6+fr7+/z8/P3+/vMrK+Li///////////q5tnZ2drj4+Pj8Nr04+Px4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj8ePj2tra2uPj4+Pa9fX09PT09PTa9OPj4+Pj8fH09PTj8e7s6fbt7YHs7fL/////////////////////////AP/////////////////////////////bgeqBge3h4enp6Vbp6enp6enp6enp6eno6ejo6Ojl7fr6+vv7+/v7+vr6+vr6+vr6+vr6+vr6+/v8/Pz9/f7z8yvi4lb////////////u5tnZ2dna4+Pj9OPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Px4+Pj2trj4+Pj4+Pa2ub02vTa9OPj4+Pj4+Pj4+Pj4+bm2tra5/bh7YGB6oHy//////////////////////////8A///////////////////////////////bgezsge324eHp6enp6enp6eno6ejp6Ojo6Ojo5eXlgfr6+/v7+/r7+vr6+vr6+vr6+vr6+vv7+/z8/f3+/vMrK+Li4v////////////Lm5tnZ2tna2tra4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj8ePj4/Ta2uPj2tra4+Pj4+Pj9Nrm5u7y9u2B7OqB8v///////////////////////////wD////////////////////////////////f8uzsge329uHh6enp6Ojo6Ojo6Ojo6Ojo5eXl5eXt7Pv6+vv7+/v6+vv6+/r6+/v7+/v7+/v8/Pz9/f7zKyvi4lb//////////////+7m2dnZ2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj2tra4+Pj2uPj49rZ5ubu5+3tgezs6vL/////////////////////////////AP///////////////////////////////9/s8uzsge3l9vbh9uHh4ejo6OXl6OXl5eXl5e3t7e3t7Pv6+/v7+vv7+/v7+/v7+/v7+/v8/Pz8/f3+8/MrK+JW4v//////////////8ubm2dnZ2tra2tra2trj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj2uPj49ra2trj4+Pj4+Pj4+Pa2tra2dnZ2dnZ2ebm7uvf7YHs7PLs7P////////////////////////////8A/////////////////////////////////9zq6ursgYHt5eX29vb29uXl9uXt5eXl5eXl5e3tgu2B7Pv6+/v7+/v7+/v7+/v8+/z8/Pz8/P39/v7zKyvi4uT/////////////////6+bZ2dna2tra2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pa2tra2uPj4+Pa4+Pa2tnZ2dnZ2dnZ2dnZ5ubm5+yB7Ozy7PL//////////////////////////////wD//////////////////////////////////9/f6uzs7IHt7eXl5eXl5e3t7e3t7e3t7e3t7e3tgYLs7Pv7+/v7+/v7/Pz8/Pz8/Pz8/Pz9/f7+8ysr4uJW4v/////////////////q7ubZ2dnZ2tra2tra2tra2tra2trj4+Pj49ra49ra2uPj4+Pa2uPj4+Pj4+Pj2tra2tnm2dnZ2dnZ2drZ2dnm5uvf7Ozq6vLy////////////////////////////////AP//////////////////////////////////8urf6uzs7Ozt7e3t7e3t7e3t7YGBgYGBgoGCgYKB7Ozs6vv7+/v8/Pz8/Pz8/Pz8/Pz9/f3+/vPzKyvi5OL////////////////////v5ubZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2uPj4+Pj4+Pj49ra2trZ2dnZ2dnZ2tnZ2dnZ2dnZ5ubu7+zs7Orf7IH///////////////////////////////8A////////////////////////////////////3/Ly6urs7IGB7e3t7e3t7YGBgoGC7OyB7IHs7OyC7Ozs6vv7/Pz8/Pz8/fz9/P39/f39/v7z8ysr4uLk///////////////////////r5ubZ2drZ2dnZ2tra2tra2dra2tra2tra2tra2tra2tra2tra2tna2dnZ2dnZ2dra2trZ2dnZ2dnZ2dnm7ufq6uzq3+zq/////////////////////////////////wD/////////////////////////////////////3t/y6urs7OyBgYGBgYGBgYHsgYHs7OyC7Ozs7Ozsgurq7Pz8/Pz8/f39/f39/f39/v7+8/MrK+LiVv/////////////////////////u5tnZ2dra2tra2tra2tra2tra2tra2dra2tra2tra2tnZ2dra2dnZ2dnZ2tra2tnZ2dnZ2dnZ2dnZ5u7n5+zs8vLf8v//////////////////////////////////AP/////////////////////////////////////e8t/y6urq6uzs7OzsgYHsgezs7Ozq6uzs6oLq6urqgurq6vz8/f39/f39/v7+/v7+/vMrKyvi4v///////////////////////////+rm5tnZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2drZ2tra2tra2tra2trZ2dnZ2dnZ2dnm2ebu79vq6ury3+rs//////////////////////////////////8A///////////////////////////////////////c39/y6urq6uzsgezs7OyB7Ozs6urq6urq6uqC6urq6urq/f39/f39/v7+/v7z8/MrKysr4uL///////////////////////////////Lm5tnZ2dna2tra2tra2tra2tra2tra2tnZ2dna2dnZ2dra2tra2tra2trZ2dna2drZ2dnZ2ebu7uvc6urq8t/q8v///////////////////////////////////wD////////////////////////////////////////c39/f8urq6urs7Ozs7OyB7Orq6vLy7+/v7+/v7+/v7+/v9vz8/f3+8/PzK/MrKysr4uLi/////////////////////////////////+/m5tnZ2dnZ2trZ2tra2tra2dna2tnZ2tra2tra2tra2tra2tna2tnZ2drZ2dna2dnZ2ebm5uvr3Ory8vLe6vL/////////////////////////////////////AP/////////////////////////////////////////b39/y8vLy6uzs7Ors7Ozs7Orv7/Ly7+/v7+/v7+/v7+/v8vz8/vPzKysrK+Ir4uLi4v///////////////////////////////////+/m5tnZ2dna2tra2tra2tra2tra2dna2tra2tra2tra2dnZ2dnZ2drZ2tna2tnZ2dnm5u7r7tzy8vLy3vLq//////////////////////////////////////8A///////////////////////////////////////////c397f8vLy6urq6vLq6u3k4uTh9+vn5+/v7+/v7+/v7+/v/P3zKysrK+Li4uLi4lb///////////////////////////////////////Lu5tnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnm5ubu5+7c8vLy397y6v///////////////////////////////////////wD////////////////////////////////////////////c3Nve3/Ly8ury8vLy7Svz8yvk5PLu6+vn5+vr6+vr6+frKysr4uLi4uLi5Fb//////////////////////////////////////////+/u5tnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ5ubm7ufu3PLy397b4PL/////////////////////////////////////////AP/////////////////////////////////////////////03ODe3t/y8vLy8vLqVvMrK/Pz5Fbv9PTu7uvu7u7u7uvu4uLi4uTk5FZW//////////////////////////////////////////////Ln5ubZ2dnZ2trZ2dra2trZ2dra2tra2dra2tra2tnZ2dnZ2dnZ2dnZ5ubm7u7u9dzy39/e4N/c7P////////////////////////////////////////8A///////////////////////////////////////////////f3Nzg29/f3/Ly79/q9uLz8yvz8+RWgfHw5ubm5ubm7u7u4uTk5FZW/////////////////////////////////////////////////+rv7ubm5tnZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2tra2trZ2drZ2dnZ2ebm5u7r7t3f39/b4Nzb3////////////////////////////////////////////wD////////////////////////////////////////////////f3N3c3Nve3t/y39/f6oH2VuLz8/Pi6eHw8OPm5ubm7ubuVlZWVv/////////////////////////////////////////////////////g5+7m5tnZ2dnZ2dnZ2dnZ2dnZ2tra2trZ2dna2dnZ2dnZ2ebm5ubu7u7d3t7b3Nzd3N//////////////////////////////////////////////AP/////////////////////////////////////////////////f3N3d3Nzc297f397e3N7q7IHtViv+81bp5/Dw5ubm5ubu6v/////////////////////////////////////////////////////////y3Ofm5tnm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ5ubm5ubu5+713tvc3Nzd3dzf//////////////////////////////////////////////8A///////////////////////////////////////////////////s3d3d3d3d3Nzg29vb29zc3eDy7IGB7e324en08Obm5ubm6///////////////////////////////////////////////////////////8uvr7ubm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnm5ubm5ubu5+713dzc3d3d3dzd8v///////////////////////////////////////////////wD/////////////////////////////////////////////////////3/Xd9N3d3d3c3Nzc4Nvb2+Dd3d3d3eztgd3h9Nrw5ubu7v///////////////////////////////////////////////////////////9/n6+7m5ubm2dnZ2dnZ2dnZ2dnZ5ubm5ubm7u7r7t303d3d3d3d9N303///////////////////////////////////////////////////AP///////////////////////////////////////////////////////9/d3fTd9d3d3d3c3Nzc3Nzg4ODb3N3d2+Xc3ena5tnm5v/////////////////////////////////////////////////////////////y2+fr7u7m5ubm5ubm5ubm5u7m7u7u6+fu3fT09d3d3d3d9N3d3/////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////f4PTx9PT03d313d3d3d3d3Nzc3Nzb3dvb9tz15trZ2uv//////////////////////////////////////////////////////////////93d9+fr6+vr7u7u6+vr6+v19OPd9PT03d3d9PT08fTc8v///////////////////////////////////////////////////////wD////////////////////////////////////////////////////////////////e3N3x9PT09PX03d313d3d3Nzg3t7d29vg3O718vT///////////////////////////////////////////////////////////T08vXd3d3d3fH08fHx8fHx9PX09PT19PT09PHd3N7t////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////+B3uDd3fX09PTd3d3d3d3d3dzc4ODg3N319PX19d3f39/f/////////////////////////////+Xtgezs6vLy8urs9PT09PT03dys8vLq8t736+vr6+719PTd9N3d4OCB//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////////////////////////9u3t7dze3d3c8t3d29/f8t703dze3ODd3d3d3dzc34Hs6vLf29zc3Nzb39zh7YHq8t/b8vLy8t/e3Nzc3t/p6enh4YHh4eHs8vLf8t7f3t7f8vLy8uzsgYHt9v///////////////////////////////////////////////////////////////////5cpK5EsZ8r3AAAAAElFTkSuQmCC");
FIND j=7074 line= kb_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAABRCAMAAAB7eHFAAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAyMjc2NjpCQkZJSUxUVFc8PD6Dg4YmJywrLDEtLjMvMDUpLDQsLzd9f4UoKi9wcnclKzcjJCYvMik1OC8jKBYUGQYSFgYYHQkZHgoVGQkQEwcbIA0eIxAqLSEYGg8KCgYPDwoiIh8bGhUUEw8gHxseHBgYFhMAAAD3jX3ZAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGvBJREFUeNoB5Roa5QD///////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////d/d2ebh4eDg////////////////////////////////////////////////////AP////////////////////////////////////////ys29rd2dis2KzZ2dnd2trd2Nna/////////////////////////////////////////////wD////////////////////////////////////qrNrZ4N/f39/f5ubm5ubm4ODg4djZ3dvZ2v////////////////////////////////////////8A/////////////////////////////////9zb2ODp39/f3+Dg5ubm5ubm5ubg4ODg4OHi2Nnb2dv/////////////////////////////////////AP//////////////////////////////6qys5uDm4ODg4ODg4ODg4ODm5ubm4ODg4ODg4OHi2Nnd293//////////////////////////////////wD////////////////////////////q6tnh4eHh4eDh4eDg4OHh4eHh4eHg4eHh4ODh4eDg4ODh2Njd293///////////////////////////////8A/////////////////////////+vq3eLh4uHh4eLi4uLi4uLi4tji4uLi4uLi4eLi4tjY4uLi4uLi4tnd3dz/////////////////////////////AP///////////////////////+rbrOHh4ODg4eLY2NjY2NjY2NjY2NjY2OLi4uLi4tjY2NjY2NjY2NjY2dnb2v///////////////////////////wD//////////////////////+rd4eDg4ODi2NjY2NnZ2NjY2NjZ3d3d3djk4uLi4uLi4eLi4tjY2NjY2NjY2d3a//////////////////////////8A/////////////////////9nY4Obg4OLY2NnZ2dnZ2dnY2Nvn3t7e3uXe5efc2tjj4+Ph4eLi4uLi4uLZ2djZ2dvb////////////////////////AP///////////////////9vh5ubh4tjZ2dnZ3d3d3dnZ2oHe3t7e3t7e3uXl5eXl59ro5OLi4uHh4uLi4tnZ2dnZ2tr//////////////////////wD//////////////////93m5uDi2NnZ2NjZ2d3d2dnZ3OXe3t7e3t7e5d7l5eXl5eXlgdno4eHg4OHh4uLY2dnZ2dnd3f////////////////////8A/////////////////93g4OHY2dnZ2d3d2d3Z2d3d2ufe3t7e3t7e3t7e3uXl5eXl5eXn2ujj4+Pg4+Dh4tjZ2djZ2d3a////////////////////AP///////////////93i2NjZ2d3d3d3d3d3d3d3d3drn3t7e3t7e3t7e5d7l5eXl5eXl5YHk6OHh4eDj4+Pj5NjZ2NnZ3dr//////////////////wD//////////////9vZ2dnd3d3d3d3d3d3d3d3d3d3d3OXe3t7e3uXe3uXl5eXl5eXl5eWB2ePh4eHg4+Pj6Ojj5NjY2Nnd3P////////////////8A/////////////9/d3dnd3d3d3d3d3d3d3d3d3d3Z2d3b3NzcgYGBgeeB5+fn5eXl5+eB3OTk4eHh4ePg4+Pk4+Po5Njk2Nnb////////////////AP/////////////d3d3d3d3Z2dnZ2d3d3d3d2dnZ2azY4uHh4Obj5OHj5OHY3dra2tra2uTY4uHh4eDh4eHg4eHk4+jk5OTk2Nv//////////////wD////////////a3d3d3dnZ2NjYrNis2dnYrNjYrOLh4ODg4ODg4eHh4eDg4ODg4OHg4ODh4uHh4eHg4ODg4ODh4ePj6Ojo6Ojk3P////////////8A///////////b3d3Z2dnY4uHg4ODg4eHg4ODm4ODg4ODg4eHh4eLi4uHh4eHh4eHg4ODg4OHh4ODg4eDg4ODg4OPg4+Pj5Ojo6Nn/////////////AP//////////3dnY2Nji4Obf39/f39/f39/m4ODg4eHi2NjY4uHh4eDh4eLi4eLi4uHg4ODg4ODg5uDm5uPg4OHg4+Pm4+Pj6Ojk2v///////////wD/////////2tji4eDm39/f3+bg4ODg4OHirNji4uLY2NnZ2dji4uLi4uLY2Nji4uLh4eHg4ODm5ubm5ubm4+Pg4OPj4+Pj6Ojo5N3///////////8A/////////djg5t/f3+bg4eLYrKysrKzZ2Nji4uLY2KzYrOLi4uLh4uLi4tjY2Nji2NjY4eHg4ODm5ubm4+bj4+Pj6Ojo6Ojo5OTZ2v//////////AP///////93g39/f5uDY2ays4Pn9/fz54OLh4eHi4uLi4eHg4ODg4Obm4ODg4eLi4tjYrNnY4uHg4ODg4+Pj4+Pm5uPj6Ojk6OTY2d3//////////wD////////h39/f4OLY2OHf/Pr6+vr+/vng4ODh4eHg4ODm5ubg4Obm5ubm5ubm5uDg4eLi2Nji4uHh4eDg4+bj4+Pj4+Pj5OTk5Njd2/////////8A///////a5t/f5uDh4N/9+v7++v7++/796ebg4ODg5ubm5ubj4+jj4+Pg4ODg5ubf3+bm4OHh4eHh4eHh4OPj4+Pj4+Pj4+Ph5OTk2N3/////////AP//////2Obm4ODg3/n6+v7+/f77/v7++vrp39/f39/f3+bj4+Pj6OTk4uLk4uTj4+Pj5ubm5ubg4ODg4OPg4eTi5OTj4+Pj4+Hk5OTZ2////////wD//////ODf39/f3/n6/v7++vr7/v7+/v7++unf39/f39/m5uPj4+Pj5OTk5OTk4+Po6Ojo4+bm5ubg4ODh4djZ2dnZ2OTk4+Pk5OPk2Nr///////8A/////93f39/f6fn9+v7+/v7+/v7+/v77+/7p39/f39/f5uDg4+Pj4+Dj4+Pj4+Pj4+jo4+Pk4+Pj4+Hi4tjZ2dnZ2dnZ2NjY5OTk4+TZ////////AP/////Y3+np6en9/fr+/v7++/7+/v7+/vv76d/f3+bm4ODh4eHi4eDj4eTk5OTj4+Pk4+Pg4eHj4+Dh4uLY2djZ2NjZ2dnZ2djY5OPj2N3//////wD////65unp6en8/fr+/v7++/v7+/j7+/v7+ebm4Obg2dnZ2djY2OLi2Nji4uHk4eHg4+bm5ubg4ODg4OHh4tjY2NjY2NnZ2dnZ2OTj4+Pa//////8A////2t/p6en8+v36/v76/vv4+Pj4+Pj76eDg5ubg4NjZ2OLi4uLi4uLi4uLh4eHh4OPm5ubm5ubm5ubm4ODh4eHh4eLY2NjZ2dni5Obj2f//////AP///9nf6fnp/v7+/vv+/vv39/f4+/7+/N/53+bm5uDm4ODh4eHh4eHg4eLi4eHh4ODg5ubm39/f5ubf39/m5ubm4ODg4eLi2NnY2OTj5uTa/////wD////Y3+np6fr7/vv7+/j31/f7+v39+vr9/fnf5ubm5ubm4ODg4ODg4ODh4uLh4ODg4ODm3/z83+bm39/f39/f39/f5uDh4eLi2OLi4ePj3f////8A////4t/p6d/6+/v4+/j49/f7/f39+v76+v386ebm5ubm5uDg4ODg4ODg4ODg4ODg4Obf+f39/fzp5ubf3+np6enf39/f5uDg4eHi5OHj49jc////AP///+Hm5t/f6en8/Pr6/fz9/f39+vr+/vr9/f3f5uDg4Obg4ODg4ODg4ODg5ubm5t/5/fz9/fz8/enm39/5/Pz539/p+d/m5uDg4OPj4+Hg3P///wD///ng4ODm39/p/P39/fz9/fr9/f7+/v7++v39/Ong4Obm5t/f39/m5ubm5ubm3+n9+vz8/Pz5/P3839/p/f36/fzp+fz53+bm5ubm5ubh+d3///8A///f4eDg5t/5/Pz8/f39/fr++v3+/v7+/v76/f396d/5/On5/Pz56fnp6d/m5t/8+vr6/f38+fz8/d/f6fr6+vr9/P39/fnf39/p+en54Pms3P//AP//5uLg3/n8/f39/P38/fr++/79/v7++/v+/v39+vr9/Pz8/Pz9/f38+fzp5ubp/fr9/f36/fz9/frp5un6+v76+v38/P39/Pn5/fz9/fz99dz//wD//+Di6fz8/P36+vr6+vv++/v+/f7+/vv+/v7++vr6/fz8/f36+vr6+vr++t/f6fr6/v76+v39/f36+d/5+v7++v38/Pz9+vr9/fz8+vr6/PX///8A///f4vn9+v39+vr6+v77+/v7+vr+/vv7/v7+/v7+/vr6+vr6/v77+/v7+/7p6fn6/v7+/v76+v76/f38/fr6+v39/f39/f39+vr9+vr7/v31////AP//rKz5/fr9/fr6+vr+/vv7+/r6/v77+/7+/v7++v7++vv++/v7+/v7+/v+/fz6+vr6+v76/vr6+vr69vb29vr9+v36+v7++vr++Pv7+/j+9f///wD//93h/P3++v36+vr6+vr++/b9+vb7+/v+/vr6+vr6+vr6/vv4+Pv7/v729vr0+v38/P38/P39/P36+vb29vr++vr6/v77+Pv++/f4+Pj49vX///8A///f9fn99vr9+vr6/fT6+vb0+u/29vv79vb6+vPz8/P9/f36+/Ly+vb6+vr09P38/Pz8/Pz9+vr6+v729vb++/77+v77+Pj4+Pf3+Pj48vT1////AP///vXs9PT09PT09PTz8/Pz+vPz8PD29vbz9PPz8/P29PP69PP29vT69PT0+v38/Pz8/Pz9/fr+/v7+/vb7+/v7+/77+Pj39/f3+PLy8vbs/////wD///f17Pz0/fT0+vPz8/Pz8/Pz8/Pz8/Pz8/Pz8O/v8PDw8PPz8/P09PPz8/38/Pn8/fz9/fr+/v7+/vv2+/j7+/j4+/j49/f39/Ly8vHw9f////8A///+9ez8/PT98/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Dw8PPw8PDw8PPz8/Pz8/r8/Pn8/f39+vr6/v7+/vv7+/L4+/v7+Pj4+Pf39/jx7vL29PX/////AP//9+r5+fz9/frz8/Dw8PDw8PPz8/Pz8/Pw8/Pw8PDw8PDw8PDw8PDw8PP9/Pz8/P39/fr6/v7+/vv7+/7y+Pv4+Pj4+Pj39/fy8fHx8PX//////wD////r+fn5/f36+vbw8PDv7+/w8PPz8/Pz8PDv8O/v7+/v7+/v7+/v8PD2/fz5/Pz8/f39/f7+/v77/v728vj7+/j4+Pf39/f37vHx8fPr//////8A////6vn8/P36+v779u/v8fHx7+/v8PDw8PDw7+/v7+/v7+/t7e3t7e3v9vr8/Pz8/fz6+v36/v7++/76+u7y+Pj4+Pf3+Pf39+7x8fPs9f//////AP////31/Pr6/v7++/v28e3t8e/v8PHx8e/w8O/v7+/x7+3v7e3t7e3t8fH6/fz9/f39/fr+/v7+/v7++vr78vL3+Pj4+Pj39/Lu8e/09f///////wD////39f36+/v++/v79vHt8e/x8/39+v3x8fHv7+/w7+/v8fHt7e3t7e3x9vr6/fz6+v77+Pv7+/7+/v7+8e7y8vLy8vLy9/Lu8fHz9Ov///////8A/////+r++/b3+Pv4+/bx8e7x+vn9/fr9/fbx7fHx7+/v7/Hx7e3t7e3t7vHx+/77+/v4+Pj4+/v79vHx7vLu7vLy8vLy8u7u7fHz8+z1////////AP/////q+vvx8vj4+Pv77vHx9v39+v36+vr9+vHx8fHx7/bz7+/t7u7u7e3u8vLy9/f39/Ly8vLy7u7y7u7u7vH2/vLy7u7u7fHw8/T1/////////wD/////9/ny+/b6+/Ly7u7u8fHx9vH29vr69v399u7u7fHv7+/v8e7y7u7u7u7u8vHx8e7u7u7t7e7t7u7u8u7x+/by8u7u8e/z8/P06/////////8A///////q9vD28/rx7vHt7vLu7u7u7vH29vb29vbv7+3u7u7u8fb28e7u7u7t8fHx8fHt7fHu7u7x7e3t7fHx7u728fHx7/Dz8/Pz9f//////////AP//////+/X08/D28e7u8e3t7+/v8fH29vHt7u7u7u7t8fHx7fHv8PDv8e3t7e3t7u3t7u7u7u3t7e3u7e3t7e3x7+/v7/Dw8PDz9Ov//////////wD////////q7Oz08/Px8fHv8e3x7+/v7fHx7e3t7e7u7u3t8fHx8fHt7e3t7e3t7fHu7u3t7e3t7e7u7u7u7e3x7+/v7+/w8PPz9Oz8//////////8A////////+/Xs9PTz8/Pz8/Pw7+/v8e3t7e3t7e3t8fHv7+/x8fHx8e3t7e3t7fHx7u3t7e7u7u7u7u3t7fHv7+/v7/Dw8PPz8/Tr////////////AP/////////q7PT08/Pz8/Pz8/Pz8/Pv7/Ht7e3t7e3v9vDx7/Hx8fHx7e3t7e3t7u7u7e3t7e3t7e3v7/Dw8PDw8O/w8PDz8/T1/////////////wD/////////9/X09PPz8PDz8/Pz8/Pz8/Pw8PDv7e3t7e7t7fHv7/Ht7fHv8e3t7e3t7e3t7e3v7+/v7+/v8PDw7+/v8PPz8/Ts6/////////////8A///////////r7PT08/Pw8/Pz8/Pw8PDz8/Pz8O/w7/Hx8e3t7u3t7e3v7+/v7+/x7+3t7e3v7+/v7/Dw7/Dw8PDw8PDz8/T06v//////////////AP///////////+rs9PPz8/Pw8PPz8/Dv7/Dz8/Pz8/Pw8PDw8O/v7+/v7+/v7/Dw8PDw8O/w7+/w8O/v8O/w8/Pz8PDw8/P09f///////////////wD/////////////6uz08/Pw8PPz9vPz8/P27+/w8/Pz8/Dz8PPz8/Dw8O/w7+/w8PDw8PDw8O/v7+/v7+/v7/Dw8PDz8/P07Pn///////////////8A///////////////r7PTz9PPz8/Pz8/Pz8/bx8e/w8PDz8PDz8PDz8/Dz8/Pw8O/v8PDv8PDv7+/v7+/w7+/w8PDw8/P07Ov/////////////////AP//////////////9+r19PPz8/Dw8PDw8PDz8+/v7/Dv7/Dw7+/w8PDw8PDw8PDw8PDw8PDv7+/v7+/v7+/w8PDw8PPz9Or//////////////////wD////////////////39fXs9PTz8/Dw8PDw8+/w8PDv7/Dv7+/v7+/v7+/v7+/w8PDw8PDw8O/v7+/w8PDw8PDz8/Pz9Or///////////////////8A//////////////////f19ez08/Pz8PDv7/Dw8PDw8PDz8PDw8O/v7+/v8O/v7/Dw7+/v7+/v7+/v8O/v8PDz8PP07Or/////////////////////AP//////////////////1/nq7Oz09PPz8PDw7+/v8PDv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7/Dw8PPz8PP07Ov//////////////////////wD/////////////////////+ers9PT08/Pw8/Pz8/Dw8PDw7+/v7+/v7+/v8O/v7/Dv7+/w8O/v7+/v8PPw8/P09er///////////////////////8A///////////////////////+9fXs9PTz8/Pz8/Pz8/Dw8/Pw8PDw7/Dw8PDv7+/w8O/w8O/w8O/v8PDw8/Ts6t//////////////////////////AP////////////////////////j86uz09PPz8PPz8O/w8O/w7+/v8PPw8PDw8O/v8PDw8PDw8PDw8PP09PT16+b//////////////////////////wD///////////////////////////ns9fT09PTz8/Pz8/Pw8PDw8PDv7+/w8PDw8PDw8PDw8PDz8/P09Ozq6eH///////////////////////////8A////////////////////////////+/nq7PT08/P08/Pz8/Dw8/Dz8PDw8/Pz8PDw8PDw8/Pz8/P07Orp6f//////////////////////////////AP/////////////////////////////4+/nq9ez09PTz9PPz8/Pw8PDw8PDz8/Dz8PDz8/Dz8/Ts9fXp/////////////////////////////////wD////////////////////////////////4+/ns6vXs9PT09PTz8/Pz8/Pz8/Pz8/Pz8/T09Oz16+D///////////////////////////////////8A//////////////////////////////////////787Or19ezs7PT09PT09PT09PT09Ozs6urf3///////////////////////////////////////AP////////////////////////////////////////j+/Pb7/PX19fX19fX19fX16urq6f37/////////////////////////////////////////wD/////////////////////////////////////////////+vr78vj4+/v7+/v9/Pnp/Pr///////////////////////////////////////////8A//////////////////////////////////////////////////X19fX19azd3Nz/////////////////////////////////////////////////AP////////////////////////////////////////////////////f39+np+fn8//////////////////////////////////////////////////1fE+3PNdRKAAAAAElFTkSuQmCC");
FIND j=7075 line= kw_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAABRCAMAAAB2ZgEHAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD+/v79/f38/Pz7+/v6+vr5+fn4+Pj39/f29vb19fX09PTz8/P8+/z5+vl/f379/fz6+vn39/b29vX19fT09PN0c3P6+fn49/f29fX5+fny8vLw8PDv7+/t7e3p6enj4+Pc3NzU1NTAwMC1tbWoqKiVlZWQkJAAAABtqN+JAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGk5JREFUeNoBQxq85QD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////7+/v7+/v7+/v7+/v////////////////////////////////////////////////8A/////////////////////////////////////////v79/f1WVlZWVlZWVlZWVlb9/f7+/////////////////////////////////////////wD///////////////////////////////////7+/VZWVvxW/Pz8/Pz8/Pz8/Pz8VvxWVlZW/f7/////////////////////////////////////AP/////////////////////////////////9/VZW/Pz8/Pz7/Pv7+/v7+/v7/Pv8/Pz8/PxWVlb9/v////////////////////////////////8A///////////////////////////////9Vlb8/Pz8+/v7+/v7+vor+iv6+vr6+/v7+/v8/Pz8VlZW/f7//////////////////////////////wD////////////////////////////9Vlb8/Pz7+/v7+/r49fX19fX19fT09fX19iv6+/r7+/v7/PxWVv3/////////////////////////////AP/////////////////////////9Vlb8/Pz7+/v6+iv28/Lj4+Pj4uLi4uLj4+Py9PX4K/r6+/v7/Pz8Vlb9//////////////////////////8A/////////////////////////Vb8/Pz7+/r6+isr9ePi4uHh4eHg4ODg4OHh4eHi4vL1+Cv6+vr7+/z8/FZW/////////////////////////wD//////////////////////1ZW/Pz7+/r6+isrK/fi4eDg39/f39/f39/f39/f4ODg4eHy9vgr+vr6+/v8/FZW/f//////////////////////AP////////////////////1W/Pz7+/v6+isr+fn49/Lg3t7e3d3d3d3d3d3d3d7e3t7e3+Dy9vkrK/r6+vv7/PxW/f////////////////////8A///////////////////9Vvz8+/v6+isr+fn4+Pj39vX19fX19PT09PT09PT09fX09PPy8vP2+Pn5Kyv6+vv7/PxW/f///////////////////wD//////////////////Vb8/Pv7+isr+fn4+Pf39/b29vX19fX09PT08/T09PT09fX19fb29vf3+Pj5+Ssr+vr7/PxWVv//////////////////AP////////////////1W/Pz7+vorK/n5+Pj39/b29fX19PPy8vLy4+Pj4/Ly8vLy8/T09fX29vf3+Pj4+Ssr+vr7+/xWVv////////////////8A///////////////9Vvz8+/r6Kyv5+Pj39/b29fT08vLy4+Li4eHh4eHh4eHi4uLj8vLz9PT19vb39/j4+fkr+vr7+/xW/f3//////////////wD//////////////1b8/Pv6+iv5+fj49/b29fTz8vLj4uHh4ODe3t/f39/e3t/g4OHh4uPy8vP09fb29/j4+fkr+vr7+/xW/eb/////////////AP////////////9W/Pz7+vor+fn49/f29vX08vLi4eDg3t/e3t3d3d3d3d3d3d7e397g4eHi8vL09fX29/f4+Pkr+vr7/PxW/f////////////8A////////////Vvz8+/r6K/n5+Pf39vX08/Lj4d/e3t7d3dzc3Nvb29vb29vc3Nzd3d7f39/h4/Lz9fX29vf4+fkr+vr7/PxWVub//////////wD//////////1ZW/Pv6+isr+Pj39vb19PLj4uHf3t3d3Nzb29vb29ra2trb29vb29vc3N3e3t/h4uPy9PX29/f4+Pkr+vr7/PxWVv//////////AP//////////Vvz7+/or+fn49/b29fTy4+Hg397d3Nvb29ra2tra2tra2tra2tra29vb3Nzd3t/g4ePy9PX29vf4+fkr+vv7/Fb97f////////8A/////////1b8/Pv6Kyv5+Pf39vXz8uLh397d3Nvb29ra2tra2tnZ2dnZ2dra2tra2trb29zc3d7f4ePy9PX29/f4+Ssr+vv7/FZW/////////wD/////////Vvz7+vor+fj39/b18/Li4N/e3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dra2trb29vc3d7f4OLy9PX29/j4+Ssr+vv8/P3t////////AP///////1b8+/v6K/n4+Pf29fTy4uDf3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3d3f4OPz9fb29/j4Kyv6+/v8Vlb///////8A/////////Pz7+isr+fj39vX08uLg393c29va2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3uDg4vL09fb39/j5Kyv6+/z8Vu3//////wD//////1b8+/v6K/n49/b29fLj4N/d3Nvb2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3eDi8vP19vb3+Pj5K/r6+/z8Vv//////AP//////Vvz7+isr+Pj39vXz4+Hf3dzb29ra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dna2tvb3Nzd3t/i8/X29/f3+PkrK/r7+/xW5v////8A///////8+/v6K/n49/b19PLi397c3Nva2trZ2dnZ2dnZ2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra29vc3N3e3+Hi8/X29/f4+fkrK/r7/Pz8/////wD/////Vvz7+isr+Pj39vXy4+De3dzb2tra2dnZ2dnZ2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2trb29zc3N3f4OHy9Pb29/j4+fkr+vr7/Fb/////AP/////8/Pv6K/n49/b19PLh393c29va2tnZ2dnZ2djY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2trb3Nzc3d7f4ePy9Pb39/j4+Ssr+vv7/P////8A//////z7+/or+fj39vXy4uDe3dzb2trZ2dnZ2dnY2NjY2NjYAAAAAAAAAADY2dnZ2dnZ2trb29zd3+Dg4eHg4uP09vb39/j4+Ssr+vv8/v///wD///9W/Pv6Kyv4+Pf29fLh393c29va2tnZ2dnZ2NjY2NjY2ADc3Nzb29zc3N3Y2dnZ2dra2tvb3d3f4ODg4uPy9PX29vb3+Pj5+Sv6+vv7////AP///1b8+/or+fj39vXz4+De3dzb2trZ2dnZ2djY2NjY2NgA3N7p39/f3+Dq39zY2dna2tra3Nvd3d/f4ODh4/Lz9PX29vf39/j5+Sv6+vv///8A/////Pz7+iv5+Pf29fLi4N7c29va2tnZ2dnZ2NjY2NjYANvg3uPs7Ozs4/Lf4dzZ2dra29rb3Nze3t/g4eLj8vL09PX19vf3+Pj5+Sv6+////wD////8+/srK/n49/b08uHf3dzb2trZ2dnZ2djY2NjY2ADb6eDh8t3d3d3d8uPr4dza2trb3Nvd3N3e3t/f4OHi8vL09fX29vf3+Pj5K/r7+v//AP////z7+isr+Pj29fTy4d/d3Nva2tnZ2dnZ2NjY2NjY293f4OLd2dnZ2dne4uLi39zb3Nvd3Nzd3d3d3t7f4OHj8vP09fX29vf4+fkr+vv6//8A/////Pv7Kyv49/b18+Pg3t3c29ra2dnZ2djY2NjY2Nje3uDh3NnZ2dnZ2dne4uLg39zd3N7e3t3e3t3e3t/g4OHi8vP09fb29vf4+Sv6+vv//wD////8+/or+fj39/Xz4+De3dvb2tnZ2dnZ2NjY2NjY2N3p8NzZ2dnZ2dnZ2drf4+zh3t3e3t/e3t7e3d3d3d7f4OHj8vP09fb29/j5Kyv6+///AP////z7+isr+Pf29fPi4N7c29va2dnZ2dnY2NjY2NgA3N3e2dnZ2dnZ2dnZ2dvf4+Lf3t/g39/f3t7d3t7e3d7f4OHj8vT19vf3+Pkr+vr7//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2djY2NjY2Nve3+/Z2dnZ2dnZ2dnZ2dzi4uDe397f4N7e3t3d3d3e3d7f4OLj8vT29/j4+Sv6+/v//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2NjY2NjY297f3tnZ2dnZ2dnZ2dnZ3PLy4uDh3+Lg39/e3d3c3N3d3d3f4OLy9Pb39/j5K/r7/P//AP////z7+iv5+Pf29fLi4N7c29ra2dnZ2dnY2NjY2NjY29zd2tnZ2dnZ2dnZ2drc8vLy4+Dh4OHf4N7d3Nzc3N3d3d3f4fL09vf4+Csr+vv8//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2dnY2NjY2Njc3d3b2dnZ2dnZ2dna2tzy8vLi4eHg4N/f3t3c3Nvc3Nzd3eDi8vT19/j5Kyv7+/z//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2djY2NjZ2dzd3d3b2dnZ2dnZ2dra4PTz8uDh4eDf3t7d3dzc29vc3Nzd4OLy9fb39/kr+vr8/P//AP////z7+iv5+Pf29fPi4N7d29va2dnZ2dnZ2dnZ2dnZ29vl3dzb2dnZ2dna2uDy9PLz4eHg39/e3dzd3dzb29zc3N7g4vL19vf4+Sv6+/z///8A/////Pv6K/n49/b19OPg3t3c29ra2dnZ2dnZ2dna2drZ3N3o7tzb2dnZ2eTg8vPz8uLg4N/e3d3c3Nzc3Nzb3N3c3uHy8/T29/j5K/r7/P///wD////8+/r6+fj49vXz4+He3dzb2trZ2dnZ2dna2tra2trb293d3d7c6N3e6fLy9PLi4eHf3t3b3Nzc3Nzd3d3c3d7e4fLz9fb3+Pkr+vv7////AP////z7+ysr+Pj39fTy4d/d3Nva2tnZ2dnZ2dra2trb29vb3N3d39/p6uLi8/Pz4+Lg393b29vc29zc3N3e3d3e3t/j8vT19/f4+fr6+vz///8A////Vvz6+iv5+Pf29PLh397c29va2tna2dra2tra29vb3Nzb3N7f39/g4ezy8uPi4eDd29va3Nzc3Nzd3d3e3t7f4OPy9PX3+Pgr+iv7/P///wD//////Pv6K/n49/b18uLh3t3c29ra2tna2tra2tvb293d3Nvd3t7f4ODh4eLi4+Hg39va2tvb3Nzc3N3d3t/f4ODh4/P19vf4+Sv6+vv/////AP/////8+/or+fj39vXz4+Hf3dzb2tvc29vb2tvb29vd3d3c3N3e3t7f3+Di4uLh4N/c2dna2tvb3Nzd3d7e3t/g4OPy9PX29/j5Kyv6+/////8A//////77+isr+Pj39vTy4d/e3Nvb29vc3Nzc3Nvb3N3d3d3c3t/g4eDi4uLi4d7f3NnZ2dra2tvc3d3e3t/g4ODi4/P09vf4+fn5K/v8/////wD/////Vvv7+iv5+Pf29fPj4N7d3Nzc3Nzc3Nzc3Nzd3d3d397f4eHh4+Li4eDf4tzn2tra2dra29zd3t7f3+Dh4ePy9PX29/j5+Sv6+///////AP/////t/Pv6K/n49/b29PLh4N7e3dzd3Nzc3N3c3d3e3t/f3+Dh4uLj4uPg397Z2dra2tva2tvc3N3e3t/g4eHi8vP19vf4+Pkr+vv8//////8A//////9W+/orK/j49/b18+Ph397d3d3d3d3d3d7d3t7e3+Dg4eHj4+Pi4d/f2tnZ2tra29vb3Nzd3t7f3+Hi4/L09Pb29/j4+Sv6+/z//////wD//////4H7+/or+fj39vX08uPh397f397e3t3e3t7e3t7f4ODg4uLi4uHf39vZ2dnZ2tvb29vc3N3e3t/h4ePy8/X19/f4+Csr+vv8////////AP///////1b7+isr+Pj39vX08uLh3+Df39/f39/f39/f39/g4eHi4eLg4Nzb2tna2dra2tvb3Nzd3d7f4OHj8vT09fb3+Pj5K/r7+/z///////8A////////7fv7+iv5+Pf39vX08uLh4ODg4ODg4N/g4ODg4OHg4eLh4eDc3Nrb2dra2tvb29zc3d7e3+Dh4/Lz9fX39/j4+Sv6+vv8/////////wD/////////Vvv6Kyv5+Pf29fTz8uPi4uHh4eHg4OHg4eDg4eHi4uDg4Nza2tra2tva29zd3N3e3t/g4uLy8/X29vf4+Pkr+vr7/Fb/////////AP/////////t/fv6K/n4+Pf29fTz8vLj4+Pi4uLi4uHh4eHg4eHh4N/e29va2tvb29vc3N3e39/g4eHj8vT19vb3+PgrKyv6+/z8//////////8A//////////9W+/r6K/n49/f29fT08/Ly8vLy8uPj4uLi4eLi4eDg3dzb2trb3Nzc3N3e3t/f4OLi4/L09fb29/j4+Sv6+vv8/Fb//////////wD//////////+ZW+/orK/n49/f29fX09PPz8/Pz8/Ly4+Pj4+Hh4N3c3Nvb29vc3d3e3t/f3+Di4/Lz9PX29/f4+CsrK/r7/PxW////////////AP////////////9W+/or+fn49/f29vX19PT09fT09PPz8vLj4uHg3Nzc3Nzd3d7e3+Df4eHi4/Ly9PT19vb3+Pn5K/r6+/v8Vv////////////8A/////////////+b7+vor+fj49/f39vb19vX29fX19fTz8vLj4t7e3d7e3t7e3uDh4eLi4/Ly8/T19vb3+Pj5+Sv6+vv8/Fb//////////////wD///////////////37+vorK/n4+Pf39/b39vb29vb19fT08vLg4N/f3+Dg4OHh4uLj8vLy9PT19fb29/j4+Ssr+vr7/PxW/f//////////////AP/////////////////7+vorK/n4+Pj49/f39/f39vb29fX08+Ph4eHh4eLi4/Ly8vP09PX19vb39/j4+fkrK/r6+/z8Vlb///////////////8A///////////////////7+vorKyv5+fj5+Pj4+Pf39vb29vXz8vLy8vLy8/Pz9PX19fX29vb39/f4+Pn5Kyv6+/v8/FZW/////////////////wD////////////////////7+/r6KysrK/n5+fn49/b19fX19PT08/Pz9PT09PT09fX19fX29/j4+Pn5Kyv6+vv7/PxW/f//////////////////AP/////////////////////8+/v7+vr6Kysr+fn39fTy4+Df39/e3d3e3t3d3d3d3t7e4PT3+Pn5Kyv6+vv7+/z8Vv3///////////////////8A///////////////////////9/Pv7+/r6+vorK/n39PLi4eHg39/f39/f39/f39/f4ODh4vcrKyv6+vr7+/z8Vlb//////////////////////wD/////////////////////////Vvz8/Pv7+/r6+iv49fPj4uHh4eHg4ODg4OHh4eHi4uP1+Sv6+vr7+/z8/Fb9////////////////////////AP///////////////////////////Vb8/Pz7+/v6+vor+PX08uPj4+Li4uLi4+Pj4/L09iv6+vv7+/z8/Fb9/f////////////////////////8A//////////////////////////////1WVvz8/Pv7+/r6+iv29fX19fX19fX19fX19/r7+/v7+/z8/FZW/f///////////////////////////wD///////////////////////////////79Vlb8/Pz8+/v7+/v7+vorKysrK/r6+/v7+/v7/Pz8VlZW/f//////////////////////////////AP/////////////////////////////////+/f1WVvz8/Pz8+/v7+/z7+/z7+/v7/Pz8/Pz8VlZW/f////////////////////////////////8A//////////////////////////////////////79VlZWVvxW/Pz8/Pz8/Pz8/Pz8/PxWVlb9/v7//////////////////////////////////wD//////////////////////////////////////////v5W/VZWVlZWVlZWVlZW/f39/v7+////////////////////////////////////////AP////////////////////////////////////////////////7+/v7+/f7+/v7+/v7///////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////8kfX8xueSoCAAAAAElFTkSuQmCC");
FIND j=7076 line= ki_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
FIND j=7077 line= kob_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAACgxJREFUeNrcm0tvJNd1gL9zz62q7iJnTIG0ARGhIujh1SiGgcSL/BID3vtHGd4GQXbZee+FFwaMIDA3yUgDWQtrQcXSZMiu1z33eHGrujlKwhnZmO6eNIaD6nqxPp73ObfE+X/xkb+CI3+R06MJ52/fVg771x+5Jr9+cv0JREMnkY/fNo6bX/+dNw7QADCCdBJzPiTKd+b4zG213gBCPe8aAUQ2EnL46O3guPk1/zjW425HvXAUkpjDB8fPccPXKwAXHKTsdAFHcEA6qsOQfAeOr/xF5bIDgE27Q9kwf+ki/uERc9w8//d/wEFk89L+8vj39gnBPz5ajpsX0YFQTNwBJALTab4nk/mm0T4+Uo7/9FU9EjZbq0BPO6AZmnCX8wnk5VCHC4H9eq7weqd9unpcT6HvRIgxRgj/oh3AAHl98ih2lQq4A2sEsj89Qnk8WzOGjeAIkQS6HsqRZijBkF/+9HsDjiBsBCDywbFxPFOkEyCSYiJij7rd0RkkvHg8gamJbAQX9mokr6NXz6q+76XoUyTGlw4226zxn1OVs5gGOTlxcZI+PSqOT1Mn1ctPr3fNFmILwt00b1Tx5AT3pJ8dkV59nkkvi4BEzAL/BPz8Fz+HDIFf/GyFAcEUcap0e3ore8u3Xs3xbH50IC5bv3/SOl6bWBDrKisB8bb1OU0R1KsE3OpHR8LxVIGEw/WT60/w6ydc/8R9jtzg29uI+O47gQog9R8eBcengQTeui9xfM52pfz4EhaXw/MN1bQE/Oc/PAo7D2lyX69idnfP2b0eQST0XSe4ZxBBJAglCtZe1wpiiuITnOzHacVXaFVu3euBgWauln7zpIUNUrLdklS1W1lBDQoGGFSAHoFe5aereoBmFNlcA3zitLDh+sn1T+bkkA3QbmA9k2BqFAZI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");
FIND j=7078 line= kow_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAB8VJREFUeNrsm02OG8cZhp+3mjIEy6OmBvEiNxCQVVPxWcZDnSC7nCBn8C4nCAe6Spx0bwMoeyNQMCaRSHIsdr1ZVFV3z4QzGi3Cpg1T0A+bGqAefv9ffZ/Mz+KlE+GYHkM/VQ5juJw8uEKfSDM7h/ElbNabybP1Zg1cST8djsglGwAPJ5HT+defgjIvR0wQzpJpuqYr9qFPI5mTI1EYwLEvaibQV10SilhzFU6bY6Awzbe9d0UugjqoetEhEA8kmY0jXm6yo2r487XxhAOxrKoXHcltrXl1shwXbAoFf3lj3w4g4tkiFJIHiGQejni5yRpFi/3hOk4jYbJznS+qFYXkYyCzcCSMTAG2b4R0YWxUBbGiexDIHBwZI1E423r+rdFEECKT6GNGMgNHvNzgIgxnFBvYAXVSKsovlEVyP8jxOUaMTGEi7EZLF6hGGmlWCeSKcEIcFwmjTQi2zc7GRJQCoRBSjVRgCsg/fn0yHCNGEkZkaxPlqZ3LQWhJKEJZJRu529iPzXEDw7Z3MZrB3ofoIUEItQJCShIRa765QyLhyBgk23B6xe02RtvR0UXJSO+jHeN22+cnbYPNht9zEhxsDE2bxRF3MWOkF5AIE4tjjLuYP2kbMFxdn4JeXWywG9pE4W0iGBP3SVWbjF0h1CGZ+4ruHu97bHnYjBgx5i8fijiGf2Xzif02JtSWxrC5QyCL44rD0LT52Nvo6Emie6PYFUYGh7hbljdgXR4WyFHlsQE3+SuPI4Z9uH9ibKlYP1kgXM/NcYGB1jbE3YhxZyPIuU7MOVgLNpvfnYB9uEkHPIAx8VkFRAhiv805MCSf9d3M/qo3btocOHpHRld1u/oYPBaSgp6FlKGs6CSoZpXHxSAO4i4WPzV4sUOdxfRRcmrJRLBZzyuPHg/i+D4mrfKBo2uS94oSRELKs+iEqnn97nDcuC0hYvr8ef70b5oEwiCEvXuGZbldNZ1ytTUTx8VmUCtuWHTB+HvpXn3QtBmHQ6iDcq3YrjD9Ym5/1WI77qbiGDDCWbVYVIunYeGhtB18bvoJm7Y56KiPx7G5kZvcjn3PXy/48ezs7Kx6zKNF7jbIcjISj+lK28ycl5gm/50D9EQcz18/fV/Vb9KRHr8jAsGyZSxtlzFAAhPw4dHMdu6DSQi8Du+kN3uAfy7eq8KysIoO7WqTIDR//aHMsrsZtQEqST/uAfiwB1WSFAK52+64HS2EQ/4qHFUe7RAdbuVVfrL8kDvu7Ht9EQIh30nZMdrejS6umT2/WjHpu02t3P++7gem/f69JGVpSHJycsWFdbNztKMq+aZ5hGeTDldvBDElG7aVOxKehpUZ66j7Xt9P3yzZolhFDT1Thxi40Tidt669I/Xq+4ntClhWDlFo0MLofDuyOon6/JAPKw3dG4+sSYjxEA7zJdVpykMCwniURRBxbDkMjkHC0B1wu3NwKCezhUECx8co5I8/OyfV5WCPfaDJD1cnwTFcb4yFX9QPT84TyOefnct879SKyyQCLe+rlY7qrzoj45sKntq59tu3CvrirR49RXFrRTtm5ySn71uHS8aj5yXNCoTq/7HUYsOVzhb/kbzDMfZxuMGVUInvHfPax1ruBnXS2EYoFawtePfOn9tbmxhJWaGwVBItsaLRrHr1qldp4Cr0wsMkiSCkFqIEb98h29HDoImGzgkIupn7JVMtSucPuZ1DKNmwbUG0+5jbEMqtq1Dr7izxqBwBWCFJNYPCKGjwxAqVqgDu3feTVpyCyPc5okUzx8GvUZeOrJAOVdQmhUEFUYFjXPRPpFELQVKd//fqoFodk+OPY+irFVJHZ+zv5AtaZPt9/y+YGLdQnblX3eFBpiNynK+zYiEF5VtAJZVJUpEgmv0Q6cvdbViGj8xhHdPOf1MUC9UhSCHdNA0lYqqX2JsbsTIUaYgXq06HuonH5fjDy8HSQ63kqxTyEVMSGN3vXXxUNg1CHcpEQHeXVI56P3j9NDXcsZ17o2NpZMl4T1TUePmcmZO/WnXcIY7jxo/zl8AqabqWIYRxYiHJwzCE8VAsKYsuY6xPQB5cL6ObNl9hmh1jL84C2302DRUzD3UOli+gk6jmt3M4v4RulQKCguq6Xi6XyT6CSElViixJBkEDhug6iTWnwME3L5U0q5xV0rJeSkGG3uXKI3myoOUyFE8FEutXp2DnABd/8jAkk3LFVIfvbO/HuOiAVJONZJj4uXME6+gc331pmjbfk+WOOml4aV8qi+Rmbw8u3SONWebI4jBEVobB0/TV9dAOEarJjVEpT8TdP6N4/Lw9LETHSuXbzn8EVQohKITwbLlchlApKChIA8Z9h51lXnRvGmizOPJoRhzGZCaNiDxomYZ4T2s+EWCfL3VaJnMxlPZtGeAVPHjwdaZ56j4du4GWGB13fWlWldnw8KtKheJE53cp7do0atHGPm5vXVQJ6cvfMoxTf3TCfb59g4uybUDz1364UR/7jeeL1TCo//GNgxn3P/LGQSZx3E046hC+GhYnrh7gVWfdx5msgNB8Oz1JqEpH6IGLLPPuFdm3FosAutFrrXngOs7se172sOiVTqPhGvATKE5if9C+5PbmXd7xevgS4Wnsc5qvryZ7kFd3XjudOAdFsYZe+qfupuqXPeFfOP4f1cDPA4P/DgAwWJQLXj/G2gAAAABJRU5ErkJggg==");
FIND j=7079 line= kib_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrC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");
FIND j=7080 line= kiw_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
FIND j=7081 line= koeye_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
FIND j=7082 line= koeyew_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
FIND j=7083 line= koeyeb_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrC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");
FIND j=7084 line= kop1_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA7JJREFUeNrs2b9vG2Ucx/H39/zjHjvJ1aQJhlCI6khZUZYwds0IGZhYCl3ToQKBxYYUZHWAISsSHVnIf8AAIxM/guQmSFFU1NYiOGrOPt8P3z0Mjt2UpK7DQO7Q851Oz9c6+aXP8zz3+Cyai1aPmC8+CcqAD4UwmbZOtxMAi/+45OKO+CAcXiqAUEAgLi5yKQQA8hf7ePcBoJaBAwAdIZIjzmmdLHUuDXHBPJrA8gBAVIgAbSG5RL9+UOuAhQPpdzRZmD4AiEBjAUIshaT6sNZWCVS4zJrU0RwkEaGtwWoQgKWEP3LXOu3KZTMmdDRZPoBIW4igdSKSm7cRgrZS7QpcOmMyR3Phrwhtyc/Am/HOmorlvXuam1vOYypAMgsZcDSXf9fk5Kd12F5PNu98cE+DuFceMZuQDsZEG+XynuR3lmor7PN29+GH1m961b2ZU48qlQRI0sCYKI89kdo+wHXv/a9X+RH39rvvdPrDx+I8mXDsWlLbhyp9KPc1q9/d/iY+YgZ3cIM5MuHYzdX2oap8AN0Ni3J85Ycb398Y9tPBeKFj99f1fa7mFRzjeOU4Km+vXG/Ptof9q2TCcT8v1cEhtowHlI+Lw3XRz/fz/bQwXnBOvL+zUoXQ8cADKAN5jkb9a2lhjM9j75eVqvIVHmBDAGWOR0ffVDnGPT+OZaWqUF5sf+m6DRo2eI8d76SmpqbSwxjrmLGqCmK7cVifB7mFbduO5ziD47nnvZQexrh5pfEUnt2oA4dz/PnVrWeavEY2HN+uKWKEAMCdOxx8+xOG6FQxxs2rNUXckCCAQqczE8wAMiiQdKUxJo9ua9GzJYACLaocwXTnZEZp0SyQEYdOPFuCAi0UPkAxLIbFk6XBq2TEEeY8WxJaavCWalRFQKeP8TxHGBWQpKXYYGs06A8lr5ARx2efxkLyhA3YAnqUeqURpZhCxvmOyNqsB221AXdPD5cGjjfIiKNT2qwH7Y/grvJRvhqtkBLwMmTEEeQ360GhpXrqmWEfoJRSxllHYBMKQeEJPQXh6X3KZ5G01pnfH/183OBOJ1Q99VQBYRE/vYpz8og9XJFQ0eNpHkXSrfhnHl1Cz3FFgN5oOoGfcsTpPLp9cKfwHFeQEEUPUL5K9ao45Yg+5+O8tf0WMIWH4yJCCAp6Kd6fzjiaiw9Ilrzzeg7ZqX/x/6BxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxTFDW/4PB3wMA+/KA0gruu+gAAAAASUVORK5CYII=");
FIND j=7085 line= kop2_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABARJREFUeNrs2b9vm0Ucx/H397nH9pPYjZ2koSnUzQ+IitRWRN0y8T+whAEhho6VqFRERqSqEnIFgoEFESSGLDDwH8DarVClQ7o4Vt02bUOaOLWb+LHv+TI8sZNKQXRB9aE7T36e8yO/9Lk73/csyv+iiXd4h3d4h3d4h3c43wJ8Hj4Pn4d3eId3eId3eId3eId3eId3+DrK5+Ed3uEd3uEd3uEd3uEdA+m4pzBhjrtVdMkRTua2Sw+LewCSvoQAgdY2kFd72qlxpRY2EEEECRBa6U1RGHbAcjg/qjNA56mICIHQQvqdlHz3tDvzfC9ifTq2DZFAaAlE6fV9QIkmXalrh7p71KDwgyYKfQZRFEUi7c3Hzqy7HTqPp5s5rDSPBpJGgubtpBsONkt0c82cFZqtdH5E+9H+wSSBvOaKTjhY/CnsRDeWrHwCFQRUDgyQB6yedsIBiytJ5saSleYVKkev5w88g7kIH7MvWVz58qOTOZImV6iQp9VTgEJC8qYj+6vFlb2/Tn29lNB86XLaM2EgIcfuEzdL8dCezVmBZu/79xCg6OBBjj0XnehG60OmbRQKBeRET5EEoAry0JF9+5Ptc7WpOM5h091JA0Ya0htdCskZR+qPtXNobEOwwO5IajkyUQYN8k/n7WeTXyVruhUMMNKg0QA0baAqdUfqwbUMsxoTf7sEPBujwuWXl66k7EIevNuhJtls9lq7ssVYZWuJQqFQPJrIfSccnJ3u1ITAmGvL7a3Ly22MMTvjSl8S7LhxzrAmdy8pZ8IYu1OyGDDZOOApoOnHhk46kAdf6IXbMvNAgsCUdp4bgG5A5i1VRQHVFy6MK36e0gu3a2fJEDCuxgAhmbrVE72hxc62E+dXL+6Hd+aDMkbjbJcwxmZe/HZpNL3ZDYFupuiAg/Z6mJiAsllnhgen9HG0P7w98Tvv93uYURccXP90M1mdD5jGUi/bjrJw/mZ3dPONw5+SMRccrGGU1XkCyvXR4ofLC9zi2effn+hvU2QwIP96vrv7yCTC6jxBEiQy+XyYhVtc/i6nw7vpA9DxwV6v0jbyi30n0Av2z9sk/LEx8Y05LwvLUZDthiMhoCpbLuQBrM1VBYusAhf17gftOPfxj8o+2zPsAqJh0QUHa8xVkV4xophkrn3zag4rzezB8Bp3wUGrzlwVBEvfAsx2uF/Kdkd2Xz/kVf/H2a8xRxWQtLQCUVFDMlXXUvD6E3n1/6NadTiwHIRijUWCOxfPPNIxCAvGCQfQehKTYmarqcYirL535yIBoyUwbjgAdgtyr//mbaCapqPBLAC1KeqUzfpsv1Nj47A4GxwHNAO+umpMFmqw8lmOKswB1gCsQxkwh899vnG0zPyPHH8PAM6XwR7zuxV1AAAAAElFTkSuQmCC");
FIND j=7086 line= kop3_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/xJREFUeNrs2c9vG0UUwPHv2x3ba+IoKXXqCsVKFaQSCVqJU/8Fjpw5tCoSHHqKUPghlCMCCYnABd+olFvpgb+CSw9VL1wqIMk2UkPiTXBqQ3azOzMc1kmhpGlSiXoXzZzWI+9oPnrz3ozHYvlfNHEO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53CO/6Sp0sy0f1RnfQXa67O/lsDRl54RAAseNSRlbKCwAD++3Zj6gk+hVfB1FcUWz3iAAYtHTUjHBgpbhTMlyY/oT/EAsnzRGKxXQ1KLmgKkJPnRjT0fMoAsn6cFJB0LFJBVypHn3djzckTeMgV4NenwCUJmaqWoV929fEX9Y572XFQHFJmhVoa62981gsFDDdeVAjDnaCUxi9pgg3+94xWxRhksYAyglFIK4IMFooTOojb2alCG/TyKwTxZjxZgOZqMO4s741e/L8W5ZEOR5NvFkGLFygLL+MkSi599fDSjcI4NRVJLwHjmsO/DZcDf7cyP92tPYRTN8Wg/n0/yuKsJRK0krgZqUDsiw4uY5w/3yQSgdlhZm0SR30riTqBs1wtKcW5/KFDJ922osweTbLYgIa4G6sHM/bmnvlqkeGwNS5SIiEhMvU6PVpIk8VI1UHIco0jx2AoGh7U2Pz3lqyjuMB8o+eGN2UoZHJv6iU3jYNad+QAlhp/nyvC79ve9w8fGoAF8A9ygwzyBQsL2sYzC5MdO6is1PEkNIAhgnvfSKvNBQyFh+st0Ge4ZfpO/LakmZMT5c6AACY0kx4ajKPGogR22qanuMMmDQRCoSETCu1lyoQT3PrsasWIPIjLZZRKIzmf0poDw7iXTmC6+o/9H9eBxYndivY3XD1BRk0wJIe3QZK9WKL5j93GpYmK/uq1RtbOARULahCZrNp81RgHyY5t63iYmHjWr7++81WyeodfrhfIgpB2umNbtZzIKEI9tdXCdUNXj73zZ5Ap33r1l1gHaoVYmZY7iO3ra1z5Aff/rj67dvMIdorMv2fX2eptQq9RP504yzKgdvRzhV+k2jQW5/t3Sog1nIESr1NP2RIwRO/pa+0AdI9duIte/rQaV1Uz8e2/eu6xSD8lOyBhtnvc0PtQ3u1YPXtdfqVv9rbU1LejLckm0Lzo9KWOk8egB9T2/oj6/8fIKgBFQkOIhZFjmTjzWCB09wK+otfMbghEFkIKXH95Ppxiho4/2dQO75lujSPM/B/KTSYaFUylG5rgPrcZKJfONh6CHggy4sHpqw4t3rJICnmSA0hUgzT+g0uFXXpPnGvnF1iutPd/385lOz+wbs2/19E8++PbixdnZV25PT+8938h/DQAMRqY09QFaLwAAAABJRU5ErkJggg==");
FIND j=7087 line= kop4_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/tJREFUeNrs2b1vHEUYwOHfzO5yu3c+nz/OCXEIkWMjuYA4pVuQoKCipKLgS8hSRGkKKwVCikxEYSG5cERFgcSfEDoqd7GRkSLZYCw5duy7893lvtbZnZ0Ud2efFIGdAnyDZqrd2ZV2nn3fmXm1KzT/Qnv095emgBj80x5F3d8bLV2H0EsWv2SQt1aZ3Xi5J4r/2DG1NUWM1wZsO4BCTsQubHVvGS+Nh25a9IPjHE1BJbvtsH7ztxmUhPZAJkFvAanXPDMcqBrKUdmd8X20QMlEghZdzSYwbYQDVVPg8KyiXy1oknaOAZ3YTLL5EpILdAAlIFen+uynuZE/gLYGBVIDk+eXXKyDigLIiVJrKFqeR8WHOqFjkWgmN88JkRfKYMgBqNZGrhaS36Mo+Gzo9WtX1hXr6xsbItHiT6kefW1APDq5BTgD8UEw1oDMhytLC9trt2CNGYW8sfnzHRMcXQjkYvERPzC7SnnwSAPotRmUSCZSJjgoCdDZ+kAdmX36xb0RZln95L5ygYJemyFJpo1wcKSczlLsFCaOP733/iqZUgo0goJem9HXfCMcHKnT41/fPvIkOvdK9HSwxKigoLVW00Y4KpF7elIee3Br3I3wj0mFfl1A4eHNsyD94eBINE5me5VBvFToEQFeTATFh2/qaRMcsAvdEjeLB9qDIuQj/zgC8eAMSN84Cs86wxHDZT2iwSMBWcwT+cdPyJ8BkX3CYCwtEAIhqCDLVD1YpFy6nySe0tfR7zlvVE2IB+zK09QCRiivwOduvDIvI5+6OIymjXDwWLZHJIbLAKzMgRcBy/My8utF/Q+QfnLwWJ4EpLMOe5EHRGRl5Nd/+cDp//kBcFULwHVdt83wPBQueF7trhMOvNswI6+APQkuPbv7ABTzxBBlld/Qg4Y42PdAOQoI/dAPAQJa5ImjrHT+umGKg33ZVvR0BUAGWlnpKM+E+QFwRSsIQyDoNrjNxw2C2l21e2xKPOCJIOxEgWa6CWm4DXyfaS3P7/14xxQHxUZX0ds7D98ORcsLtZwReQXkM34ANJvtAUopJZJFCNxg7pts1ZR4QHgQNF94yQlpMvESC62Ua4gDDkSzXaV0OzQkaTIxSyzsXHpBIvuTweVLQZL01o1CIJsUQyC6fNhsxGbEA+CgxWkJrIEkTct34tHI3xnFyZjigGLS7MmYBNItHyfWejiC0oQxDqDY0MhEQgKkaeE7xBqt0eSy5jiAStwIaO+HtPBxYjS6/eNn9Z2U/o6vjHCceHpP/E4dmd6GscKESQ4jvpdYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3V0mvx/MHg+AP4/vJxNJjIqAAAAAElFTkSuQmCC");
FIND j=7088 line= kop12_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABqpJREFUeNrs209MHNcdwPHvb3aX2Rl2vdiw65iNsaGyFCmJipAacU2q5t5TLlZkiUo9xdwsEalVVVd1zaESOfVQoirqpZHaa2/u1afILhywYhvbsCCz2Ga9uzO7O8z79bB/WGLjQKuWmYp3QDBvBumj937z3pv3fqIctdQJ+GLWtlKwmi8P60DpUn+1V6K4/8r/osjRHVrd6P0+DqyFAqAWxVKxVHQ5jnJEx8MWMB6WOg9DiLD0QwOaGMLleBBHdKwAY3sEgFCwDBOPJp673jEqjuJYaRsECLsSTWAK2xNN9WCE4yyHdbQVnY7UFgA/2OVxUb1s9bgZh3SsMFZCegYS4ajt41K30ScjcOyMwzlWxkpCiCwB7+vyx7bvXv5SSbBmiITicI6VsY0QWWIKvpm6eP3qz79UECsVEnpEg3Eox7cGWZoygKVnmoNM356+lW2lEtXOvxg+fgbWYQY+WU5NmnyeMyNzyR9Pc9t7t76e8msigkgkGIdoj/tmacpQQAGnpUzf+uy349+OCO0n5QyxcNw3KUNeyuTZGTUvlFNrmv/Hh73nosH4Xsf9u5PkkUyQMlgBZkO++ai//jSxcNxbniyAS8B2AQMpPBR2uvVjxMJxb3myUM67hMaikgUrZTaGdnrhr5FhvPl9dW/5J1ImEwamWikPNLEINkddEQEB6U4Wo94e3vpbkiHANKktMrswa1ez1pbd7LXH2/FwrBoZJzBNd6vA1uLcVgZavcomRIjxJseqKWQC/IU5oJxna3GmfX2gBQNAnng4/vpxJjDzc9QBvHwZ6N08EDHGmxzVTOAvzNWBTNkBPADX63CKxMNR1Wzgu3XIwPZIGRz8dngDGjXGwY4HE82mW8+wnYNKb8Do9q1RYuJo2M2mK2zn6DH6WiNyjIPGwcpGc96VIMhx5enTRqd0vy5I9BgHtMevLw+7SMAV5nXfXWlAzxETR5C8Pldv5K4wz/4ulW6k4S1i4tjJXZ+rN2Zh3vFxfAf6XlUXISaO3cT1uXomYMvZd9kH0IgyXnXsJqm41DPBU3H6BnAE8C9AXBwP3zbzXPWlIQ79dRJlxWscGphnItJA2GsPIdqK7zqquJt2S1y/6+iGRrQR/Y6qsiOITUsQoYEAju/EAQFI+Bs+N/VbHwCMbtq0EEHoDN6RfT+94liR4W0uNV5X5xKf8m/sD544ThwnjhPHieM/cdxT/g+GD5JnXTGVWx+gArJvOBdQ0umhWPWrg6ZXPmCb0RjFh67maU93hf3TXXx0YDQ+cb77JF8e7y0/9q0+8Bk4F2VH//erZNFhFTJ/dDQNfm85qKrqOK3Hm7F57zZJPBl/+eryXFTAR+1z8XDgWyQSL916JmCrHSAqKnufS9Kn7ej3K8D51IThqRuDtQrXrvm+Dw3Ex/d9QJXG841YOPiL82m4+4sbg+kKXAPfx/c7baGQTou1EYd+BfDJVzf3f94V7d6VBsUU4+Hgk69uXh6dn5MAuHKzezXdSAMokYS8dp7oW/r67Q9t/9Bi5OOjHe2JtYe27WltJFWBXA+h0g4TKcfDwbOwULUdb7BWS6dSKUZUVdNoZzxRba3Hw3H2nZLUUo73xSC1GiM1HMfxVFW1O1VZj0N8ALutv/dvn7c3nffuHaBxPh7rwRV7/3EGbsz0KSBikIPXtSt253jJwkyBGzOLzNJ3vqQJZiwWjp2B9YSMm9A0F2ZrLDIzDNUcvfM+KoOn4+BgRZYnhQuEmGq2id20ra1Cgk26JwIYPBPx9xUAF/S9O5p/7CVSVrbasrGhmNjwNKfaOQ5Qi057JH51YFVq6PnZf2YLBEnLOC8zooiQ0PROtnuSDOO50e9XsHs/eXdqmL7joqmXmgz77tC0GwMHwYPk3vFdXPNCJbumy3y4BxmOfHwAqa/PW8Edq7yVz+sLrTM46P5o6Jcf/bS8TWd0l2dxaA9YIaEsTRny5XyY/NniNLfxPvuD3VlbCehIHBxUNhNG6KQbXKw0B5m+jdefbhAJyPfmG+S+Ds9b+l5w545l8bcXhd/vvivTbph8mchm3fakazsO7cGB6Tgzf1q7QLtRXDcOjlfTo8w5+3ezLvVGTjvdKxb5UTQeddLVQr6TrpZottPV4pGvBq2HB6QPjj9upw/GJH8QGo/opXN2szlBLMOExXGncx5tX62xsS+9FoFQwLr7PnrpuXucW1hH3h+snKqVen+MA2tGhU66M8VSchhAyhO9m7wnvV/fiY4D6nvp5/DnqwMl4BLQnvs+aB98l8xeaK32PfzfkvxrALevHeCpERZIAAAAAElFTkSuQmCC");
FIND j=7089 line= kop23_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAoJyglIyYrKi0uLTAhICQaGh0wMDM/P0Cdoo6IjHywtaJaXkxqblx0eGd+gnGnq5iSlYdMTz4nKhY5PCpAQzFFRztRU0ZdXlcfIRAwMiEJCQZiYl7V1dS+vr0XFg8zMSl4d3OBgHxvbmsjIR06OTlTUlJJSEgAAAA68G0oAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9SmnbfAAAfU0lEQVT///////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A2PfY2PH79vb29vb29vb29vb29vb29vbw9vb2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vb29vb29vb29vb29vb29vb29vb2+9jx2PfY+wD7gfr5/fys6enp6e7u4+Pv5OTl5ubh4eHo6Ojg4ODo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9uXh6Ojg4ODo6Ojo4eHm5uXk5O/j4+7u6enp6az8/fn6gdn7AP///////////u3t7enu4+Pv5OXl5uHh6Ojg4ODg4Ofn5+Dg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l4eDg4ODn5+fg4ODg6Ojh4ebl5eTv4+7u6e3t7f////////////8A//////////////////7+7uPv5OXm5uHo4ODg5+fn5+fn5+fn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Xo4ODn5+fn5+fn5+fn4ODg6OHm5uXk8+Pu/v7+/v///////////////wD//////////////////////e/v5OXm4ejo4ODn5+fi4uLi4uLn5+fn4P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn5+Li4uLi4uLn5+fn4Ojo4ebl8/P9/f3+/vn/////////////////AP/////////////////////+/fOBgfjm4ejg5+fi4uLi4uLi4uLi4uLn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn4uLi4uLi4uLi4uLi5+fg6OHm+PqB8/3+/vny//////////////////8A//////////////////////n//4H6+vn54ejg5+fn4uLi4uLi4uLi5+fn5+fg/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bo4ODn5+fn4uLi4uLi4uLi5+fn4Ojo+fn6gYH9/fny/////////////////////wD////////////////////////5/YH6+Pno6ODn5+fn5+fn5+fn4ufn5+Dg4ODg6P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Lh6ODg4ODn5+fn5+fn5+fn5+fn5+Dg6Oj5+PqB/fny////////////////////////AP/////////////////////////4/YH6+OFWVlbg5+Dn4Ofn5+fg4ODg4ODg6Ojo6P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l5ujo6ODg4ODg4ODn5+fn5+fg4ODgVlbo4fj6gf34//////////////////////////8A///////////////////////////6/YH6+PnoVlZW4ODg4ODg4ODg4ODg4Ojo6Ojh4eH/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eHh4eHo6Ojo4ODg4ODg4ODg4ODg4FZWVuH4+oH9+P///////////////////////////wD///////////////////////////+B/YGB+Pno6FZWVujo6Ojg4Ojg6Ojo6Ojh4eHm4eb//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Tm5uHh4eHo6Ojo6ODo4Ojg6OjoVlZWVuj5+vrz/YH/////////////////////////////AP////////////////////////////+B/vOB+vnh6OjoVujo6Ojo6Ojo6Ojh4eHh4eHm5ub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////k5ubm4eHh4eHo6Ojo6Ojo6Ojo6FboVujh+fqB8/6B//////////////////////////////8A///////////////////////////////z/e/z+vn54ejo6Ojh4eHh4eHh4eHh4eHm5ubm5eX/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5OXl5ubm5uHh4eHh4eHh4eHh4ejo6Oj5+fn68+/98////////////////////////////////wD////////////////////////////////8/e/z+vj5+fnh6Ojh4eHh4ebh5uHm5ubm5eXl5eX//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pl5eXl5ebm5ubh5uHm4eHh4eHo6OHh+fn4+vPv/fz/////////////////////////////////AP////////////////////////////////7f/e/z+vj4+fn5+eH55vnm5vjm5ubm5ubl5eTl5OT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j5OTk5eXl5ubm5ubm+Obm5vn5+eH5+fn4+Prz7/3f/v////////////////////////////////8A///////////////////////////////////+/e/zgfr4+Pj5+ebm+Pj45eXl5eXl5eXl5eTk5OT/////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+Tk5OTl5eXl5eXl5eXl+Pj45ub5+Pn4+PqB8+/9/v7//////////////////////////////////wD//////////////////////////////////6z+/f3zgfr6+Pj4+Pjl5eXl5frk5OTk5OTk5OTj5OP//////////////////////////////////////////////////////////////////////////////////////////////////////////////+7k4+Tk5OTk5OTk5OX65eX65fjl+Pj4+Pr6ge/v/f6s9v//////////////////////////////////AP///////////////////////////////////Pz+/f3v84H6+vr65fr6+oHk5OTk5OTk5OTk5OTj4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////p4+Pj7+Tk5OTk5OTk5OTkgeT6+vrl+vr6gfPv/f3+/PzX//////////////////////////////////8A/////////////////////////////////////N/+/f3v8/P65Pr6geT65PPz8/Pv7+/v7+Pj4+Pj4+P/////////////////////////////////////////////////////////////////////////////////////////////////////////7ePu4+Pj4+Pv7+/v7/Pz8/Pk+oH6+vqB+vPz/f39/t/81////////////////////////////////////wD////////////////////////////////////229/+/f397/PzgeTkgfOB8+/v7/3j4+Pj4+Pj4+7u7u7//////////////////////////////////////////////////////////////////////////////////////////////////////+zu7u7j4+Pj4+Pj4+Pj7+/v84HzgeTk8/Pz7/39/f7f2/b4////////////////////////////////////AP/////////////////////////////////////arN/+/f79/e/v7/Pz8/Pz7/394+7u7u7u7u7u7u7p6en////////////////////////////////////////////////////////////////////////////////////////////////////r6enp7u7u7u7u7u7u7v394+/v8/Pz7+/v7/397v3+36za1/////////////////////////////////////8A///////////////////////////////////////YrN/+/v7u/e/v7+/v7/Pv7/397v7+6enp6enp6enp6f///////////////////////////////////////////////////////////////////////////////////////////////////+3p6enp6enp6enp6f7+7v3v7/Pv7+/v7+/97v7+/t+s2Nf//////////////////////////////////////wD////////////////////////////////////////Y3t/+/v7+7u/v/f3v7+/v/e7+7e3t7e3t7e3s7ezt7P////////////////////////////////////////////////////////////////////////////////////////////////Hs7O3s7ezt7e3t7e3t7f7u/f3v7+/j/e/v7v7+/v7frNjX////////////////////////////////////////AP/////////////////////////////////////////ZrPzf3+3+/f397u794/3z/vys3/zs/Ozs7Ozs7Ozs7P/////////////////////////////////////////////////////////////////////////////////////////////26+zs7Ozs7Ozs/Oz8/N+s/P7z7+P97u79/f3+39/f/KzZ1/////////////////////////////////////////8A///////////////////////////////////////////c3vzf39/+/f3+/v7++Ofi5+jb8ffr6+vr6+vr6+vr6/////////////////////////////////////////////////////////////////////////////////////////////Hr6+vr6+vr6+vr6/f39+Hi4uf4/v7p/v79/t/f/Pzb2df//////////////////////////////////////////wD////////////////////////////////////////////Z297839/f/v7t7e369fT0K+dW3/vY9/fx8fHx8fHx6//////////////////////////////////////////////////////////////////////////////////////////q6/Hx8fHx8ff38dj731bnK/T09frt7d/+/v7f3/ys29ny////////////////////////////////////////////AP//////////////////////////////////////////////2t7e/N/f39/f/P5W9Csr9PTnVvz29vHq6urq6urq6v//////////////////////////////////////////////////////////////////////////////////////6vHq6urq6urq6vbd/Fbn9PQrK/RW/vzf39/f/Pze3tr71/////////////////////////////////////////////8A///////////////////////////////////////////////d2NrerPz83/zf/P344vT0K/Qr51bz8vLw8PDw8PDq6v////////////////////////////////////////////////////////////////////////////////////Dq6vDw8PDw8PLy8+jnK/Qr9PTi+P38/N/f/Pze3trY3dfz/////////////////////////////////////////////wD//////////////////////////////////////////////9f23Nja296s/Pz8rPz9gfhW9fT09PXo4fLy9vDw8PDw6v/////////////////////////////////////////////////////////////////////////////////w6vDw8PDw9vLy4ej19PT09Vb4gf38rPz8/Kze29rY3PbXgf//////////////////////////////////////////////AP///////////////////////////////////////////////9f23dzZ2NrbrKysrNvY3v7v8/pW9fT0Vujb8tfw8PDw6v/////////////////////////////////////////////////////////////////////////////28Orw8PDw8tfb6Fb09PVW+vPv/qzY26ysrKzb2tnZ3N321/r///////////////////////////////////////////////8A/////////////////////////////////////////////////9fX9t3d3NnY2trb3t7b2tnc2v7v8/P6+vjh6Pby8PDw8PD/////////////////////////////////////////////////////////////////////////8PDw8PDw8vbh6Pj6+vPz7/7a2dna29ve29ra2Nzc3N321////////////////////////////////////////////////////wD////////////////////////////////////////////////////X1/bd3d3c3NnY2tra29vb2Nnc3Nzc/fr63OH28Nfw8PD///////////////////////////////////////////////////////////////////////Dw8PDy9vbh3Pr6/dzc3NzZ2Nvb29ra2tjZ3Nzd3d3219f/////////////////////////////////////////////////////AP//////////////////////////////////////////////////////19f23d3d3N3c3NnZ2Nra2tra29vY3Nzb+Nz76Pbw8PD/////////////////////////////////////////////////////////////////9vbw8PDw9uj72fjb3NzY29ra2tra2NjY2dzc3N3d3d3219f///////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////9fX19f23d3d3dzd3dzc3NnZ2dna2tvc3tv52fvw8PD29v////////////////////////////////////////////////////////////b29vDw8Pvc+dve3Nva2tnZ2dnc3Nzc3d3d3d3d9tfX19f//////////////////////////////////////////////////////////wD//////////////////////////////////////////////////////////////tfX19fX9t3d3d3d3d3d3NzZ2tre3tze29rY+93w9vb////////////////////////////////////////////////////////d9vbw+9ja3t7c3t7a2tnc3Nzd3d3d3d3d9tfX19fX/u//////////////////////////////////////////////////////////////AP///////////////////////////////////////////////////////////////////f7X19fX19fX19fy8vLy8tnY2trb29vY+9323fbd9v/////y8tfX19fX19fX19fX19fX19fX19fX19fX19fy1/Ly8vb29t323fvY29vb2trY2fLy8vLy19fX19fX19fX/v3z+Pn1//////////////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////////////19fj4gfPv7/39/f7+/oH49t3/////////////////9t3w3fbX19fX19fX19fX19fX19fX19fX19fX19fX19fy8vLy8vb//////////////932+IH+/v79/f3v7/OB+Pj19Sv09Cv//////////////////////////////////////////////////////////////62tvpqb3Y+CAAAAAElFTkSuQmCC");
FIND j=7090 line= kop34_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABrFJREFUeNrs201vG8cZwPH/DHep5ctKZCwZUhPKTQzDApK2QHUu0PYDBPCtBZq0gFFAMNBLUl4iJAVSpEAt5VjCtwIuCjQ+xB8ih16kAkZTIC5qJ6LUWJYoS/KulxRndqaHJSXasiPaRc3dwnNaragVf5wZztvzCMv/oHzxDb97BcD6RzduUlt+Hwx0kEu/xuH7q8x//nT/UTxnR6LgawDXOKDBzgBs9F9y3nStlPk0OIYoN2G6dFs61khirAQBKMACnI9K2XAQYKSh9GVtkzinsYAk0aCwwFwmHAQYQOrd+OWtmDivAQwCpOhZ5rLgAPaBXCz17jjVrwzS2DxoMEIiQA0vGa2DfQBy/y6Wx5apY4q3LMIBNEZIgbJDQuRIGUxINMTT1btbv/qHlO5PKq986+xql9UbN/7uWh07+ZtffJiB+gD2tQMgBbvlkgXx1h+XF8X1C7CG6JLT9toHWXCwr3GS5mWdzsJV5ldpVccErNdYE9o43TOFLDjY7zi9qxbnfvrxFPOsvv0Xuw5QWxNadufS3j+STuLopIxXXtv+c/z2Nqv8aSesVmdnWZezN6QbZKI+4K44vPzsTdiUWO8UYJBNaqwZNZcJR9Dutywqe5X1lQuiY/ACfJBNqF3/bjyXBQd3XRzt6L7Gx3QAjw5qAmiufMfMZcFBMgPulZl9nw5IA+Ahh4CkxrGlodirjQD/3ksdmcy38ADZXPmensuCg3uyN28HoAhyqb4HFTAeyKY9qBWz4OBrdxAB8KDBJWjUyYNsrrw+lwlHAtFHP7uNS8lFo248pOWfc5lwsKeOFG6/ZoCIxrt48tM3zmfDwV77UNBT3K9ggKhRN55EZMTBtsZV7lGtVPYqbE9hICoZb2NWZMTBtnbRjgaUq1wFUCZkChOVjCdkVhzcSWpDDdwqAwUIS8brFlI8332ozChAKaDcL7DAz9uUH3zc9T7MSn3AHYHq1ULgB4APC8CVQtio5z/6ICsOWu2e4qG7dVg+FTUWD4qZaFfAZMEtQxAk709KKSWSJSjvFC99NBZlpT4g2CsHxz9l41MwyywqXc6IAzbHAgkcjXy252CZRY5LZDoZTFfzxgwwEAIZsH0f6HbGSp0wG/UBsNlFHlIsYPBD11HjHkgOvKw4oJULBlqMwSd0cVQldCcG21zqHUCrbZFGggF8QlwHNR65RGUYz44DCA7aZXoDYoiLo6iELkSAM2nVZd7LhOPQ87ibhdvw6pevZcmRif2SF44XjheOF44TivN/MXrcyoAjyO0ki5Gj0Xw8wo0A/nrhrLrMezCd8nbValtAGjk4u6qEbsRDs6t0949HZ7v4oYujHI7NdtPcPza7SImworf6kMYHHDWOB4+sPtLr2OySbOcmH7vAAqHrNKjnJQfH1rXpbFePX52HnIoo5VGachb2fYL1sQBjAGstFmuTD7s8BY28amt1fL8khY7WgzK+DyahYDEY826d0NBYVHr3YpUMOFptFYbgA5ikYOr1JQqnouXFXX2x9kkW5iUDu7sQgB/4BHWuUDDLvP/bdy5+kon51R3B4bFHvyxwhXAqbNS9JzLS5nj86Uc41Tv9iFX1CX+Yrv6x7eI4gOsOMMJCjyGazpMY6XJsa6VUMjS7bsF1XXeKQmEKYy6XjLchrJeJ9UfvtLYfLZOc1oLpn9bezEYcwBNOzyMa1I0nP33jjJcFx6PRDIfn6ENEM6TIcf/g6LoogSXgEg3qGO+k6JL0OO7JqPhotM/SL4eN9kmNY0tTjA7faBJFBhhpkugrE+tvjodLyfeuBxFRFEVRNDExASCNCUOMF0gpm0bp32Rg3+euS8cbiE7cxwWilwaiE7/tpd8RtJ3+oKEn94KVH1UjPAh8kMEutTUdn8RIxbo2Err/jfvZm61Xf/ygbb0kJE42YcWYePIkRhr6xw42KdXq3g9zxZ/9YGryNEEQ+HKjSc3M69PXJk98yOjb1c5hv8gb/7HR7cMks4zcsd8PP85Z5xccZRus1+hlGwyVySJHz8ABmcvt7uWuXkW8Hv9+2mtC7fpaM1bCDscYcX0ERjtAbuNsuHAV8dYfSqb4lcrbv8G8tkgxdF7RSB297CirGVuGuineEsbmAY3JIbKS55Vkq20WZ37H4m0kz56tNlLHPiC1T3dLYfMaSAJjEsRTZQ+O0BFgpCmhN63JaSP4r7I5R+YYyK4VuteOkm2Slzee2vD8Hf8ygJBCAW4sAJMTCsDt9l5yXjzTk5/v+CFyuZyTS97p6ZlYxrHVpz93wInPnavVzlybnVXP9uT/DADjuRVfTGbbYQAAAABJRU5ErkJggg== ");
FIND j=7091 line= kop14_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABtVJREFUeNrs2c1vG8cZx/Hv7Ctt0qRkhrIpW9zENhADKVqgBqpTb7mkJ6MnB0gLFL4rgIFGEODm4AoVnAICqrvRoscCLfwH5NZehCJB7fogJ7VdipaoWJUorkSK+/r0sKREN3EiSpQSFPs7kTvk7Hz4zA5nSSUMmjY6d2+F5EHBr6fj+qX+5t16caNcffXbLwAYp/YPPC1rd38FAi7G/DQRP1pk8tFgg1KDO2L1+KUx1UVDQXR5uVwv18ungG1WXslYuQAG1Mv1yhMdhFiVgf13vCltU4Wnj9UhjwGceu8pkcIg1iKJLy8XLU4duKenZfzsE80g1ggRHVTSkNTyzebIsTmWegRRCESAQiktqvz7UgsGUQC74EO2OrGsxyIIoNPTlKvA1WNxLOHUQZQQIRqAIjKQiefORt6HwqDzcxcfsNziU6emCHUBiEF1a1OuDiA5qKOrIBINFERKB96IWDZLfr18CAZAE9AM1oMK+jMgEh0EYqWjBpIczLGEU0ci0VA6kYgeX2ka2MRf2PkwhkMyEghoxro9ouERFv4lKIUeCbEBqlw9IEQ7EMOxVsMg1h49fPgg8vUrY+dev2Ep9d5mbbThx+AXDsmgYOFD7I82apvvKWXdeH187MqDKHrw8OEjiaNw1dpdCoZVjyVnNdSU/ul1uH9dzU7//PcCatsbxfAB/BJHSNO3AKyQhn1GQP3ij3dvy/3rcP+HkcTGePVPHw7H8TTQjE+vU5uoTajgxVkmFyc/fv+eEAPgcyQGNH2s7txQLXl7cXKRzTFTqDHBMmFs+hdzQ5lXkWVUrtVq1Ca0d8N3Jlncfqv0B106vu/7/pEZFLCTnjodvVV6a3uRyXfCdzWgVqtUDCu68nwY9fhM0ys1cGjAmUCY/Pj9uxefOPhJs/8aR866Sgpi4dcvP5/+3duLKHMb14EqE/d/EJfPHNnxRKvUwBEU4DcCU22PWTv77UNggOvvP87BC4U5arFeQlSVCZ7F8dUjzqvP/lGpkXcEtrZkxcxdLP3NyLZGVS9DYWDS629Umeba38cv5nZXxNwSxKFWe+Of2tLR6vHYUg6wpcjjAvnmSKO3t1KipMhw4gYoUdLdYjG6VcCFnXEXGQGqn3xPrh7B8fjRNQe2Ci4ARkie5gjre+1jDC2b4f7jElsFFyM5km+OHADytY7PH15zRAkuGABhntXsXmswVMd/YjD71rDVHAaEQJ5mQVU/+X509ZDXx6665gjito2FVnOeeXDd8VY3YJpDZPCabpr0Om+tujmMeeZbLcNouwXEuaYc75AOy3AEt23YzZmxezftmxiG4eZyuRxAq9UaZZgpSqu7YOVyuZxhGNy0GRuz522jDeIY1rPDzasITXCN+RlgvQRzN/tvqOAiQ84LH3Kt/ef3bo51z3wrzKNiPr96GMeffyq052eS7ccGQOkF+4vV0BnQaO+tWKjSOqX14kYR0JibIq/+8pNTh3GIuMb8TAyKDc52Kb1iJLfmw85ztXdHCFCETYqiBG3uVphXfU0Hdki14hp2jALWzm8UNzi72UWIkuNhJBDVo5zdhCKsnQdB88L8sqMGdkTKNexYwZqNB2AGZmB2i8E4x5Tn3TtmCMzADABsPM4jmhfmRR/UsXPaNWxhzQa8l3YQIMfHgJVk9vTfPNnAKCgvzLdzg627d7LtBVvWGjZTYHcDEASgjpHBBVHJWfZOa8MUP2usib3Qzt4ZqB53bs8yrRpMwQLQIdPJkFTGDMwyx5oVjaBbBTqZTqaTgSlgYVThnZ798OCOQJ+diVVjCj7qP5xJJBWOOathl9HpP/oB/PacNnc7sA/q8MzZmfiLX8JHtmd7fVdIBjjH8WdVaXuIZNQe8AEL3ishX+HwjdmZWDXo7L8+MLuWzEkwYLthd/YMex8vGUZFm7sdeme++Tr3sWZnUN0SBEkIwLZtnJNhcKYSZxJG0EtXpWDWyPrb3+gw4x3m4o01u2Mny8beJt0773BiKZ+z8PqX3yDA7rC2Ec/Qxsz9r+RL8yp2aSkV2HSwe/2YgHeCiG7q/v4QkjFk8EzJcxoUgfVqh7DVyrWUIrA7/dPzW0AkF7ze6R8FZDwTkcJWduSljVifQxoQmi1yLYUKsJP1wgaPbwnRW4SlNw7I4GEKkt3JEhhwdt8R/GZGDLn/Y8CkRa6FUiRXVefE1qevz24jtOn0vr9MRMjukCUA/npdhWruxiW15FQpn/7Sb8G+xWB/y5yE5yt/MnpSrjvVy4f4f/A7mdSROlJH6kgdqSN1pI7UkTpSR+pIHakjdaSO1JE6UkfqSB2pI3WkjtSROlJH6kgdqSN1pI7vWrT/Dwb/HQCWcg5gw1gsvgAAAABJRU5ErkJggg== ");
FIND j=7092 line= btn_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAACT1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgID///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAABAgID///+AAAD/AP+lmdfcAAAAwHRSTlM8ODQwLCgkIBwYFBAMCAQAQERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+PxTzsGTAAAAAWJLR0TEFAwb4QAAARNJREFUeJxjOEwLwHD4ABzY29naWFtZWpibmZoYGxka6Ovp6mhraWqoq6mqKCspKsjLycpIS0lKiIuJiggLCQowMDIxs7CysXNwcnHz8PLxw8GoqaOmjpo6auqoqaOm0szUg3BQX1dbU11VWVFeVlpSXFRYkJ+Xm5OdlZmRnpaakpyUmBAfFxsTHRUZER4WGhIcFBjg7+fr4+3l6eHu5uri7OToAAejpo6aOmrqqKmjpo6aSjNTD8HB/n179+zetXPH9m1bt2zetHHD+nVr16xetXLF8mVLlyxetHDB/Hlz58yeNXPG9GlTp0yeNHFCf19vT3dXZ0d7W2tLc1NjAxyMmjpq6qipo6aOmjpqKs1MpQUAAIrvy8PKBZ9nAAAAAElFTkSuQmCC");
FIND j=7093 line= btn_n_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0CRzonygAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6SgsCoMgp1Q3Iv75/UqMBh2QXplGAK7Ib0SDIXfIL0iDIM9kF4BhsNeSC8PI+B3SC8HI2EfpJeFUbAf0svAaDgA6V/AGPgD0kvDWDgI6aVgHByC9JLwLRyG9BLwHRyB9AL4Ho5CejX4AY5BenUYD8chvQZMgBOQXhMmwp+QXgsmwUlI/xImwylIrw1T4C9IrwNT4TSk14VpcAbS68GPcBbS68N0OAfpDWAGnIf0hjATLkB6I/gJLkJ6Y5gFlyC9CcyGy5DeFObAFUhvBnPhKqQ3h3lwDdJbwHz4G9JbwgK4DumtYCHcgPTWsAhuQnobWAy3IL0tLIHbkN4OfoY7kN4elsJdSO8Ay+AfSO8Iy+FfSO8EK+AepHeGX+A+pH8FK+E/SP8aVsEDSO8Cq+EhpHeFX+ERpHeDNfAY0rvDWvgf0nvAOngC6d/AengK6T1hAzyD9F6wEZ5Dem/YBC8gvQ9shpeQ3he2wCtI7wdb4TWk94dt8AbSB8B2eAvpA2EHvIP09/ABPkJxL+6f14vkEzs8y8O5aXg1AAAAAElFTkSuQmCC");
FIND j=7094 line= btn_s_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0Us+6SmwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6Sg8D18gI9Q3Iv75/WBsAPeQfoA2A5vIb0/bIM3kN4PtsJrSO8LW+AVpPeBzfAS0nvDJngB6b1gIzyH9J6wAZ5B+jewHp5Ceg9YB08gvTushf8hvRusgceQ3hV+hUeQ3gVWw0NI/xpWwQNI/wpWwn+Q3hl+gfuQ3glWwD1I7wjL4V9I7wDL4B9Ibw9L4S6kt4Of4Q6kt4UlcBvS28BiuAXprWER3IT0VrAQbkB6S1gA1yG9BcyHvyG9OcyDa5DeDObCVUhvCnPgCqQ3gdlwGdIbwyy4BOmN4Ce4COkNYSZcgPQGMAPOQ3p9mA7nIL0e/AhnIb0uTIMzkF4HpsJpSK8NU+AvSP8SJsMpSK8Fk+AkpNeEifAnpNeACXAC0qvDeDgO6dXgBzgG6QXwPRyF9BLwHRyB9JLwLRyG9FIwDg5BemkYCwch/QsYA39AehkYDQcgvSyMgv2QXg5Gwj5ILw8j4HdIrwDDYS+kV4RhsAfSK8FQ+A3SK8MQ2A3pVWAw7IL0qjAIdkJxL+6f14vkE2w6y8NwNQP6AAAAAElFTkSuQmCC");
FIND j=7095 line= btn_e_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwh/EZn+QAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8Bw+AAc2NvZ2lhbWVqYm5maGBsZGujr6epoa2lqqKupqigrKSrIy8nKSEtJSoiLiYoICwkKMDAyMbOwsrFzcHJx8/Dy8cPBqKmjpo6aOmrqqKmjptLM1INwUF9XW1NdVVlRXlZaUlxUWJCfl5uTnZWZkZ6WmpKclJgQHxcbEx0VGREeFhoSHBQY4O/n6+Pt5enh7ubq4uzk6AAHo6aOmjpq6qipo6aOmkozUw/Bwf59e/fs3rVzx/ZtW7ds3rRxw/p1a9esXrVyxfJlS5csXrRwwfx5c+fMnjVzxvRpU6dMnjRxQn9fb093V2dHe1trS3NTYwMcjJo6auqoqaOmjpo6airNTKUFAACK78vDr8GZlgAAAABJRU5ErkJggg==");
FIND j=7096 line= btn_w_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwV3fKTTAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8BwmB8O+Hh5uLk4OdjZWFmYmRgZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTS1tHV09fQNDI2MTUzNzC0sraxtbO3sD8DBqKmjpo6aOmrqqKmjptLMVAc4cHRydnF1c/fw9PL28fXzDwgMCg4JDQuPiIyKjomNi09ITEpOSU1Lz8jMys7JzcsvKCwqLiktK6+orKquqa2rPwgHo6aOmjpq6qipo6aOmkozUxvgoLGpuaW1rb2js6u7p7evf8LESZOnTJ02fcbMWbPnzJ03f8HCRYuXLF22fMXKVavXrF23fsPGTZu3bN22fcfOXbv37N23/xAcjJo6auqoqaOmjpo6airNTKUFAACeeMvDg3itZwAAAABJRU5ErkJggg==");
FIND j=7097 line= dragon_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV0AAAH+CAMAAAAI3i3FAAAAB3RJTUUH4wIIEhsKtTHtmQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFsCIdvScaqS0xtiwvyQ4SxCUgwDEbwjAu1QkO0hQR0B4S0hwezi0U1i0U0ioh0ist3gAI3ggI5wAI4wER3gwM5BUI4goU4xIX4SIL5ykI3ikQ5C4N3hwY4i0U5CQZ4Sco8wAE9wAI7wgI7xAI9wgI9xAI/wAA/wAI/wgI/xAI7wAQ7wgQ7wAY7wgY7xAQ7xAc7xgI9xgI/xgI7yEI7ykI9yUI7zUI9zkI7xwQ/yEI/y0I/zkI7xwY8SsQ7yMi6zEku0MezkUY2j8W2U8VxWEd0WQa3l4U2GwZ6jwQ60YQ6VIK7EoV61oI61QU614Q52wU9z0M+UQK904M/0oI/1II91IQ91oI/1oI814Q92MI92MQ/2MI72sI82cQ8XEQ/28InUY3mE5OsUktsUlCmGJJk2dXsGY0rGlKxUgsx0tA40oo3k0/yWQ7xnVE5Ggy330+jWtommpklntnkntzjH5+l358kIiKlJCStGlitH1rrYx6q5CP1Gdh035u0ZFr046KnJyUpZyUnJycoJygpaWcnKWlpZylpaWlrZ6OuZ2KraCcu6SUrZylramlt56evamcpaWtpa2traWttaWltampra2tra21rbW1uampva2lubWpu6+xtbW1tbW9tb29vbe3yqCE0KSG2qN52aSGxqSYz6GW26SP3LCUzKWj1qKi2qae46efyrKn0bao4bOi376jxq21xrW1vb29vcHGzre11rm1yMC9zsa53rKv27215bax67u42sex2sq96cay6867xr3GxsbGxsbOxs7OzsbGzsbOzs7Gzs7O1sbG1srK3sbGzs7W09DT1tbO1tbW1tbe3sbO3tDI4s7K6c7I4tbS597O4djY597W887I79bO99bO79bW797G897O797W99bW1t7e3t7e3t7n4uLi5+Li797e7+fW7+fe5+fn7+fn7+/n5+fv5+/v7+fv7+/v7+/37/f3997W997e997n9+fW9+fe9+fn9+/n9+/v9/fv9/f39/f/9/////f3///3/////ZWRgQAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAINoSURBVHja7Jz/a9v2uscTyUJ2BbGPFOxfzOz8qq3rP1Daf8U6wgzhXywU23Isozbh3NyO02yjS7fRrP0lGXG7Xu7SpqTJLzdbIKkJGScJaYOhLCSm9j0Hc+BC8dW9Yff5SP4i+Vv8ra7p3QMdi2M70kuP3s+Xz6PPyO9/2Luzkfd9AB+0/UH3XdofdN+lDR1dLf8yq73vg+iXDRtd7Wzn1mL2fR9Fv2zY6BbTS7Kc/lCcd9joZlMyr6zmPhC8w0Y3owpOYXG78L6Poz82ZHS1A8Vpd8bnTz4M5x0uulr+UYihKe7GbuF/3vex9MOGi24+nfSxE24uuvX3D8J5h4tuNqVcmZhgApFnH0ZcGy66ENM+Abq8dO/DEN7hovsq6WSBLiZ+u9dl1qAV85nMq1fHmXzx/H2fzdDRVSiD7p0uczItn15Wk4qSVNcOi+/7bIaUbkD868/N6Z5rxUZ+ibz2+GBNVQSn0ynISzv59302w0Z3Q7DrdMMt6J4XzvYb+WV+/zF4bch35ROWZUj+1tYfdK2mbYSY1nTPi9mDjUdqKmPxXng1c7COvJZCn5+gHbiceHBSKBTz+SxYpmLwQz6fLxQHFDOHia6WXwu5/Iiu9NfGuntezKSQf4ZSRybvPS8cptSS18LHJxgCEyOx25t7hy9W11KppSUVWTIJ/1lKpZ6u7vztZWEweIeJbvFQ9dETOt3bjeiCi6ZTitPDME51q5wQw4vHGz+A27qR1yLHZYhAcDIaTcwtL6EAByZUDP0EmFPps4HgHSa6b5YVD+LDcI3pFg9TyZAPVJXiEw/2jGoOeTP47TVw2xJcO86FAW4kLgtO37UrYJcvfwLGwr/L6Mdr13whdXUgqjxEdLWDJKoldN/9ereO7vnbA3BcXZdJOXF3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");
FIND j=7098 line= koeye_handhither_gif = url("data:/img/png;base64,R0lGODlhyAB9APcAAAgHBQkIBhQSBRkWBhURDRYWDh4aDhoVEBoZGiEdCCocFR8hEColCigrFyQiHisjGzozEiAgIycmKCwrLzQrITEyIzsxJT4zKDs+LDMzMz89NTc3Ojw8PlQHBWAAAG0AAGwOC2oRDWoXEnEcFkY8Ikg8LmMtI2Q+MG1hHFJGJ05AMUVJN2FTLm5OPGFQPnBfOUNCQUhIR01NT1FPSk1RQFZaSFNSUllYVV9dWl9iUXVhS2NjX2puXGZmZm9ua3R4Znh3c4QAAJAAAJgAAIsTD4MfGLMAALkAAKUfGIwpH5UoH6wkHLEnHrM/MdIAANgICN4UD+AjI5FGNohQPspJOu9COZZkToFnUIJsU5ZuWJB3XL9nVZZ8YOtYRfVpWn+CcZyBZJ2EaYCAfYiMfKKGaLCTa7mbbKWMca6RcbKUc7eYdbCVeLSZe+CDbe2WfsanccOifZKVh5mZmZ2ijqarmLC1or6+vcuogsCnjtCuic+wj8uymdy8m++2m+C+n+i7ndW7oPiwsOPGqPTHq+rOse7QsszMzNXV1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEKAIgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAyAB9AAAI/gARCRxIsKDBgwgTFrRjBwiQHjtw3LBBUUYMGTuAFECgcCCCjwgKdBxJMIBJkyIVhnxoUQZFGzdw7OjhkKGhQ4cMkdzJs6fPnwUtJjxpUoKECUiRSnAA8mNKgSaBGgyACGWBjSAdHE06wShRhTBs4AAixo7Us2jTIpRRECvICAgiyN06IUOEDEqZLriq9udVBAu0IrWLt6sEuXDhNuVIUAaOvpAj93SLuHIEo0aR3p0gxoGDBaD3SvZ5tUBoBxHE1I2gFLPlxCCfjp49mzJizJm5HmYNJIKDOKZB0/YbHHSBOHKBTJjL1bBRy7GHSz+7MfHl3EmfI7bhw0eEMYAD/oSeDjT0AvHHI3S3URl79spOycvvWJ150sKHJ8C4sWNHdyBjACeeefP9ZB5oARwXBxDd9XcDDMvRhd9ucMlWoHz1bZXBhnhJkEEM/Pkghx04yRFHBlQdeCFQpjVAICITxCEHTnbI4cMON8SQwVEcTlghIj6sKF1cGmawwZFG2kDTiDgdYkccYqB0YANCSnWgcSYFSCKNcjxkwwZGIokfXIj0UOVoCGh4JAdsciADEHXgdJMhdMiBQwEDmtcAlWeWt+eVJu0gBx1z4lQHEDK0yYGYXXG0Q5+QDbYBmzDAwIEGMcxoyE2H1JlBSHuGKiqkUolqagNXbTConDfJEYMG/hxUyiaYeEVAalqsGclmDDFUWqkPW9IpBwcOVGDsschWcGupyTbrAAeDcmqHD77CwOustVK1rE93TRrrRRbFQMMMPtBRBx1xTFDBhhi0624F7m4rFbzt0utuBhhkUMEEY9RxLhAziAtur9jaKu9OHm7gawww2TDDwzHhIAOYGlRssQbuxnuwXxm7azEGFh85g0Q3PDwDTBb5CqYEG3fk4bcxPIwDDjXcEHHJD/u6ws4899wyUPD2LPTOlcYM08w2i4VDztfu+PNBL18U8wwx3ZDDzEg7zCsNXHft9QpPS7Wz12SLa3LEOOSgtkRaW8SB02ELVBcMMtR9dNo59Ncf/sk1PFxDDTQADrjXcf+EAdmCB9431TbPrPfabM9Q99sTxF2AfgzDFFN/PEA008xX31BDDqP/bbrghQO1QuCKm0466VY73l8Pne8tkUuJTlAAEE9PmvnmPvDQXefBP6728cibnrrYriOP/A55z+QD7cNDxLYNiW7QOwcM2yx9dz78AD7tPJRf/g485FA+8sufRQPy6/OAvvnlBw+++N1BZLPb2rf84dE9+I9DBviDAhaQfgg8XvvQ8j71IdB84itg+AY4wPyxTUeMOVj3pDdAMYjhC18goAF/AIQR0m+BaakB/UbIQhI6BIRiIItDpocjG/BKg2EJkUM86MExfBCE/iEEIhBNyAMUqkWFPBihEEEIBCGKYQw+9OAMa2gteXFALP4hyxMDFAcoevELYwDjEkdoxL7kgIVCDKMavQjFLkaRQTXkwLZwgEUf9DAOeHQjG/cYRhAasIyQOeMP0sjHPeYRSh68ER0fQ6odOCaAT8yjiQ5JyT0KEZCR4QEQDUlJSk6yi2KYnsQe1aceYIQmYsCjHFZ5yDnMIQ6vPKQlIyMACpTgBC5QgQosQIEHGOAAAHiaJsHoRUq+8piSXKWJxtAgGZipSj5Qkg8AJKNVuvKa2MSmLKHYFwq44AVXuIIOXtACF5xAl+hUwQUM8LMfsLGV2YznHJQ5Bgb1wAa8/luRGKT5RGXOgQ7//CcdBirPQ/ZFAC7QghaygAUsiPMFLjBnOtFpgQO0bJB5lOdANwpQgM7TRIm8Zz7ns88AkiVAAuUoR89FUG325QFYAAMXFsrQh0aUBRNNJwUIsLECoPSaKg3qRl2JxxhOzwZRIo8YBOKfaaYSlhv1l1SnqtI5QKYEYMiqTBfa0Cu8AKISzSk6KdCyL8AypeaaKlUJCspQ9uCeMkjqcGQQk7c2EaUDVate/QXQyLjgDGjQ6ky5atOwilWXD/jZF1yZ172u9ZVhtCeOLCLX0RwtiWDEI1r1ylGrRkYHakADGsogWK5i4avlPOdh0RlMxTK2sWrt/iwew/iDiEwkXEuFDK9mMDrMZhaoQiUobdDwBtGWgQxZnWkWavpVF+B0tboka9h+cNbgthSyfkxf33h1kbP0CgarC5zakjjINp71tS2VjgXgAIfiiha5Ml3uaZubS+jqkqeFcydjU6pNN37hgGob3Aoq1REH+GefGsgA2Xg7Xt8WU7NEnc8L2AuH0AY2uYQdZ0RVC13pLq8A7oRwLGfbxx+sj3SD61oGNHADt3oGERKoAGYcUJoa29jGe+HLirhAYfdeWLlXmG85nwvdEmByIDdOspK1YhQZO+DIBEADheFg3NIy9Ktgta8uj8zl0RCADFMu7nExzFAsjDO1Wu6y/poho4IpU3m0gpUvag27WgGs+c5o4XGPqxzfmmqYyKvFs6CBYoE3TDm0pN1qmenL4cMO+tE9wUKY+cwF+Wp4lxYowWGNDOlOd0QBUqYwojH8Apw+wM4DIYABKGCBdF7A00BxDo2VTOvSQIoFkz7uC1KgAIEI4AGt1qUFGJCAVD8gBRY4cq2XzeQYL+UjiDjwDRLMtfAy2IGDJGZGrznbkconC1MeLQsQQQALnKAF4CRnRHWJUxJAgAHkTmzqdsdFbucRitlNH+nIRoMVt/hGntkIQr4b3tGpr4DaPu9rsTmGH5AH1BQuQwoQAdNK+xmsjVYBC1CAarUMoAOz0S82/q8bS3wDeN80GDAM0FI37jLYwRC2rkfj4PDhWEDKaCABIijAhfg6FMvkLGdEh+7cjkulBVfwgAeMjhbqojevnS15dkkXMF6xpS9isPply6vZqHJ2qHP4wnBUAAYIIMICWc2CV4HOdqDfdJcWBUoL9LCFD3hgAGpZ7GZjC3aT84BtuJVMALJOV5mE77dedyxLXSn20UCg2GTXwkPbzvZxqtu5wmb6SNb7BybYHeRn0TtsFc/WyHruBpTVluAH75KmUhOqo+f7UOPQ+L4QGxGRV7vlKf9VHfh+zo2+gAV4qQDNE0QAYPCDF4zweamY9emkZyuUvtAg7EVJ9aOJg0lK/upUvAaVpVXl9hgsJBV4P4ALQOY90Hc/ZxegW+gnUO0F5G2QFuShD04YgtJD4JefAjeq5hJ+oGRPSGUScTAdcjAGg8dPYuBPARVU8XRI/6UWZhdTlWZm7IdulfcCvqcDXiVO4vR7LSB06MROBZEFd0AFRiAE++cTGLVt/zdUHvVRoHRUUTIGcjAfchAA0WRSAWJN8pRN2wRFNScVCZAAuedQOiB0Q6eBvQeC4RSFUjh5I1hfcEcQYAAHSjAEQaB0ItAT7vRgCheEHwVS9vQmAZCDF7KDptRUT2VN8DRiQwhCRTQS5TZ8eNhqJcACYGVOLPCHROd+TuiBUdhQhthV/r+HWoDWawIhWkQgBF3oAfQ3EsP0TsZ0VhnFSlByhj2QhlXCho+kRZLUSUP4RXSoEA+whxlnXyfAAkSngb4nhV3lUIYYTr6Hfi+gAo2WWAQAB2cwBUXQASEgAh7WEZVITAFiXqSoiT4kShjhiWeifYt0YB5UioU0RiZmEATAh1aoZTmFS0TXe4QYZIdYi0GGBnfABrmYU6uWB3CABVZYjAlBXoRUSGIYRaEUEWIRAAcIKWKAAFdkeDwUSXrERmJUYiOUAwRBAa7ojVr2iuIYToZYZuH0AlggZXwABycAAiaQcRegB4CQBfE4EoJkQEtkj27EQ3BERxyAALkFKXWA/gi9AhNZpEU99EN+tET/dUDlUwOqtYoO+Y2uGFGD6IHlGIUvkIV64AdpgARBEAIq0I0qcAeCoAXrqALyaBBIRF7ZJkRd+QVPNJBTNBFVpEEbZFI79EMi1EI82ZNB6ZCt2IRYFotHCU5XgAZ54AeD0Acr6AEm0I0nkJdgoANjpRBbyZVsOUAwJEUOoT82FAMb84//U1cCREEs9ED0ozY08JZaNpROOJcVCU4/J05q4Ad8UAhtsIIfIALrhk54AAhccJWTWBANhJnl00IUxCANckGf8pLy4jua8z3dgT/TY5sndjybyZmH5Zkc2IFfdQVgoAW55AJe5XuS5geB4AZP/qCaJjBkuuQCcLAHsVmCCNFADWabb3U/4NMdWRMDixI2wEmTwkk8ntMfzpM8f7MCyvmNRCmOlsdjenAGqqUDDnUF4KYHUQAF+deFKkCCKsAFeiCeLYBOcVcQK3A693k8eiM81GM/tkUR7tk/P6MRmOMwWDQ7tdMDWJMDNlM6p/M3gaOfYsUCWJBOGsiEgfhNFmlmLaAFcJCXVzACIxCVP6cFfIAGS3AEXOiX31Rf4MkHesAFE3pfBnGhgoNirlMzWIMDEEE+tjMRNgQhuxM3c8MwJ9M4arM3tlUzfmM6rOM1GJBTL8AFaCCSX9VQDJUFCnUF8PdNWMBQSwgGecAH/n7QBFwoAirgUC2QfGhgBUkAAiJgAlGZBRBFdnDgB3ggpRRaEIfTNYNzOhCjpTJhn1iDMymDF4VzgFFjETKDN1s6ETNAAwLDbym3M7oEjllQBqKlB1rwp1rQc2GQXFdghSegA3rKBVjQAmjAB3wQCFVgBF1oAss1p3qAB/CYTi9AWgxlaH4AB2AwpSpQoQIxNrQ6q2e6omuDM1KzKCyjhmEzBjA2KdYyNRJRMzfzMASnAUPDMxhQAdMZam+QB3oABmEgZWtgBmhABuOZTlegBVlllXfwB26gnaopAr+qA8nnB2HQjXc5WmXwo4KQB9+KTgQRNPu6AvpaNBCDNBMR/hP42jQs45ths1R3EStF0zAPczczgDEXgwEr0DHukhIHkAWGBgd6cLSAAAh6QGVnIJ0TpQM9l1x6MAiF0AVKyoIm0HNZAKGFgAfDWl8+WlxqYLSFMLAvcE7JJhAF4LNAezEVs2IjkzQ5OxHfBQMrgwgyGzdBwhreYi0ttzXlci7psi74ArTvQhAtULR+UAiF4AfuqAbRCa66NKdnkGhM+QROoJodQHYKewaLuwdnoAP1lYVTpgdlG5vnVKH2YrgbYixxEIA+UHUDYymLshxAYkQ9UAC54i28Al6/Eix1ogFa0SzIwicCUQJSlpd84I4VFp2Vik5zKlpggAZ+cAZS/sCFIACVKjBaYGa6Ayu6ugRm7QUHd2C6eKAFopu2iNAAx8K+ySIBDaAB0UIj1IKyvYstXcGDR8YaddG3MFAxmZITnBK8C4AApzIqA6EAWZgHd3AH7JWwYHCt6HQFa4AHgbWscMCnjSZaGNm1g1lfoUZhepCRaqcCA8G+B4wqCCC/dMAqh+AqsCIri1IYBnNkj5ImkuItbPImcZITJRIHO4AnV/InBEEAkjZpzptOOtCtb6CrhOq06YQGasCtXRsGw6pLIUy+epAHZ0CpcbcAf3IgCbIDr1soh3AoMgArswImSpFBXGYmRDIYYQImG6AkQDAi0uJDUnIlBXHEFJaw/uhLrEv7ZqeZwS2gWuBJYYTgwVe8vVPWwN6KBSdgZ2B8IHgSAFC0JU7SJfdEx4zSFWQiaBkixxvSFR9yAwHEJC8cBxVgEnoiGgJxAFncxBFshVggCA/8BqbrB2jgVed0BUV7B37Qrb3aAjiVSzrwseylsC1gAMURGlRRATLCJTeSIztSFxyiFHIREp1WH5dxH2MyASACEf8BRUKsIgKhAkX7wGBAqdDrZruMBqeVSxPGXsLsB2zQq6WmvmfXXMkGKD61IA3SAzkSIRryHttMfnjGSN58HXTRGpXBHT7gAON3Hi+CCC6wzoFllc91AlpwBiJcCIBQp+CLdiKsB2iA/qy52FoHYR7oMQYOsB7t8dAQDRsK/Wg3oLZvcRuY0RW6IRcTAARLARwXfQLERWXOy2EHoABFu5QorXa5RAFtNmXRmaxZORDmcRyeoRz2kR24gRhNcdOexkg6vdOWgRuagRSd8RmmoWMAcAXtpbBXQGSJRbpHy8X6rALsRLrsVdUqgF9t0daB4QCqYRetoR3woRjQBmskITFtsRgfwdODsRld8RkhwRHrhdQSvEuIANfk645V/QJpawExVQZlIJL87BEbERgaQtmIHReQzdhosQM2pBBE4R6VHRsfYbMLIwPJVmiiJlNijQhp8tWL8c0IrdtuTBCQKdtn0RAP8aEV0FE3NNEUNYwIsvEAMVwtmfMS3m0D2DcVAQDWih0SVLEYeGIX1SEBFLE5NAEEZuHc8pKFfgAGVsiIApGKKXDV8t3fBaHOUFpfJcDS/l3gO+ECS3kFumSCBt7gJJEFhZAFE+rgFD4SD9DOL4DfFb7hBiGuHP7hIB7iIj7iJF7iJn7iKJ7iKr7iLN7iLv7iMB7jMj7jNF7jNn7jOJ7jOr7jPN7jPv7jQB7kQj7kRF7kRn7kSJ7kSr7kTN7kTv7kUB7lUj7lVF7lVn7lWJ7lWu7fAQEAIfkEAQoAggAsAAAAAMgAfQCHCAcFCQgGFBIFGRYGFRENFhYOHhoOGhUQGhkaIR0IKhwVHyEQKCsXJCIeKyMbOjMSICAjJyYoLCsvNCshMTIjOzElPjMoOz4sMzMzPz01Nzc6PDw+VAcFYAAAbQAAbA4LahENahcSRjwiSDwuUjYqYy0jZD4wXlMgTkAxRUk3YVMubUU2bk48YVA+cF85cmIyQ0JBSEhHTU1PUU9KTVFAVlpIU1JSWVhVX11aX2JRdWFLY2Nfam5cZmZmb25rdHhmeHdzhAAAkAAAmAAAswAAuQAAjCkflSgfrCQcsSceiDkssz8x0gAA4wcH8QICiFA+1E4970I5lmROgWdQgmxTlm5YkHdcv2dVlnxg61hF0mBO5WNOf4JxnIFknYRpgIB9iIx8ooZopYxxrpFxt5h1sJV4tJl7xpZ94INt7ZZ+xqdxw6J9kpWHmZmZnaKOpquYsLWivr69xqWBy6iCwKeO0K6Jz7CP0rGNy7KZ2LiV77ab4L6f1bug48ao6s6x7tCyzMzM1dXUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP4ABQkcSLCgwYMIExaMEwcIkB47cNywQVFGDBk7gBRAoHAggo8ICnQcSTCASZMiFYZ8aFEGRRs3cOzo4ZAhoECBAJHcybOnz58FLSY8aTJCBAlIkUZoAPJjSoEmgRoMIAhlgY0gGxxNKsEoUYUwbOAA8iWO1LNo0yKUURArSAgIIMjdKgEDBAxKmS64qvbnVQQLtCK1i7drBLlw4TblSFAGjr6QI/d0i7gyBKNGkd6V8KVBgwWg90r2ebVA6AYQvtSFoBSz5cQgn46ePZsyYsyZuR5mDQRCAzamQdP2Gxx0ATZygUiYy9WwUcuxh0s/uzHx5dxJnyO24cMHBDCAA/6Eng409ALxxyF0t1EZe/bKTsnL71idedLChyXAuLFjR3cgYAAnnnnz/WQeaAEcxwYQ3fV3AwzL0YXfbnDJVqB89W2FwYZ4RYBBDPz50EYcOLXBBgZUHXghUKYxQKAgErDRBk5xtOHDDjfEgMFRHE5YoSA+rChdXBpioMGRRtpA04g4BRIHG1+gdCADQkp1oHEmBUgijW08ZIMGRiKJH1yC9FDlaAhoeOQGbG4gAxBw4HQTIG+0gUMBA5rHAJVnlrfnlSbt0MYbc+IEBxAytLmBmF1xtEOfkA2mAZswwLBBBjHMCMhNgdSJQUh7hioqpFKJaioDV2kwqJw3tRFDBv4bVMommHhBQGparBnJZgwxVFqpD1vS2cYGDVBg7LHIUnBrqck228AGg3Iahw++wsDrrLVStaxPd00a60UWxUDDDD68AccbbEhAwYYXtOsuBe5uKxW87dLrLgYXYECBBGDAcS4QM4gLbq/Y2irvTh5q4GsMMNkww8Mx4SADmBlUbHEG7sZ7sF8Zu2vxBRYfOYNENzw8A0wW+QpmBBt35OG3MTyMAw413BBxyQ/7msLOPPfcMlDw9iz0zpXGDNPMNouFQ87X7vjzQS9fFPMMMd2Qw8xIO8wrDVx37XUKT0u1s9dki2tyxDjkoLZEWlu0gdNhC1QXDDLUfXTaOfTXH/7JNTxcQw00AA6413H/dAHZggfeN9U2z6z32mzPUPfbEsRdgH4MwxRTfzxANNPMV99QQw6j/2264IUDlULgiptOOulWO95fD53vLZFLiUpQABBPT5r55j7w0F3nwT+u9vHIm5662K4jj/wOec/kA+3DQ8S2DYlq0PsGDNssfXc+/AA+7TyUX/4OPORQPvLLn0UD8uvzgL755QcPvvjdQWSz29q3/OHRPfiPQwb4gwIWkH4IPF770PI+9SHQfOIrYPgGOMD8sU1HjDlY96Q3wC98gQtcIKABfwCEEdJvgWmpAf1GyEISOgSEXyCLQ6aHIxvwSoNhCZFDPOhBMHwQhP4hBCIQTcgDFKpFhTwYoRBBCAQhfgEMPvTgDGtoLXltQCz+IcsTA8QGKHqRC2AA4xJHaMS+5ICFQgyjGr0IxS5GkUE13MC2cIBFH/SQDXh0Ixv3GEYQGrCMkDnjD9LIxz3mEUoevBEdH0OqHTgmgE/Mo4kOSck9CjEyBHCABVAwggo4wAAHEEDYeABEQ1KSkpPs4hemJ7FH9akHGKHJF/DYhloe0g1uYEMuD2lJtRCgAipggQ504AIWtEAFKEhmMi1QgQO0jJRg9CIlc0lNSdbSRGBokAzMVCUfKMkHAJJRLXFJznKWk5dQVAsKqmCFKlCBClNwQTFbYAJl2rMCBP7Y2A/YeEtz+tMN1wQDg3pgA96t6AvffOI13fAGhjL0DRD95yF9yYIuYKGd7pwCMY2JTHvacwIAONgg8/hPiJq0oQ0FqIkSSVCDzgehASRLgB560pOeK6LnVIsCqNCFnl7UnVQYpgtaQE+PetQBByvATMlZ06aaFJd4jOH0bBAl8nxBIP4B5yx1aVJ/efWrNXVDXyzQhTH01KI/hScxidpRoyoTqQfjgi5paq6vgjWiqlxlDwgqg6oORwYx2WsTZwpRuxrWXw2FTAvGwNgwnDWtQR1qUd1qz5BujAu4LOxh75rLMA4URxbx62iOlkQw4pGuhj2pWCMTBjIwdgyOtf5oO98pz6G2lbIogGvLMEvTw6oWj2H8QUQmEq6rQoZXMxhdaU3LVKdGdDYOWMMaXMvYs1phthqVLG7tKcqn/WCuzsVpZ/2Yvr7x6iJn6RUMVhc4tSVxkG2ca2afulrasEC6anhtbNMaz2Kq4LaUnUDq9plZmp7TjVw4oNoGl4JKdaQB/kFoBjBAtuS6d7nSPC1U52MF6U63sdYFam2PuV1lLrAA+9TwLoHbxx+sj3SD6xoGMnADvXpGEBGgAGYaUJoe+9jHe+HLisbg4TW89rGzdcFaW1DiZHZXKgPggGWr9OMqW1krRtFxAwApEAEQ2cOuja1Fq5BReRK1niXOp/5ULPCBDnCAy3A2iAuKbGTY+vS67pQnR5vsTINMILcGSEgFriAEN8f50AIhQBiKnF87j7kK8dSBMZlc4j4TBAVemEIISqBmg3QBCoV+M6IPrQI6h/nOIp4nmnHbaYEYoAx2UEIHOvCAg6DgDEUIwqwHMOpDd4HRR/5pnplcAQU4oAKbRIEKrNCCECRzygKxAh7ukOsOlOAgWNACEXTdAQX0Os4iUEORqdtTK0xBBSIItCAG8IAECAQABrAoCKyNgoK0YA17yMK2OwCCVgsCBWVYwhAKbehvw3nOHm40FtItkAFUQNlDfcELTnACF9jhDASvQEHEsIc0NGHfHVD3QP6qIAYkDIHbtUa0c3hs5ZaXBlIE+LWHzeptYLqAtmbuqAnIsIcoDGHWnB6IAfAdhY9zW9QD6enAPTBr3RbI5VDHco6X8hFBRPgGE+Yaey3swEFGk6TkBK5L5VMBMni4C4FGgRV+OoXsGrOeVLBDGpgwBKaDQLcWsIMenEB3lBekp0oIgt2dPprdcTHseYQiedNHOrLRYMY1vpFnNoIQ9bJ3dOor4NflO99yguEH8jGBuLHA6xbcGecjXmy+mSAEpndAwAIxQR7Q0IQitH7WsB+IWamAzBKQIPeRIXA5xbtLxSu48TRoMAzQUrfzWhjDGg5vStkAeuncXJQuMKu5a/7LfXnqQO58v7218SkIF+zhCkUY+KxBAHxBMNYKLlBm+9Hy3fl2VbXFJy/pAsYrtvTlC/1HWvB1Wl2VWvTFBbQhALw2ADrQBVZABd0XgVTQcbUnfiWQTA5QBX8gBUsHdO0XBnLQBVOAZhqnFrxlU3aFf8bHA2xTXJIRAAAIWDIRPsxVgJt1U7iEgJKRANjngJAWgd1XBefHBCBnbURVUX9ABUYgeNZGAiWYdHaQaR31hFJxgnV1gzjYRSHkOTcQWtrygjDoElkVTlylWb71WzrYF+5WAVhwUfBUTCzAAkBoBXlwBURwcrPWASRATNn3B13gAquGAhZgaYLQBXQggv7KRIU+IVf2d4UG2FBRxQUNgj1R8oWjwQYmAVNaRVhNdVNhFXZgYCEjcQAE8GQC4W5U4Ib9BYdx2H1d8AdP0IGzhgJTAE9jsAdjoAOUdk9qRgVzMAbnlkyKuBNKxXl0ZS7IiH+qNFBUZRJsMB1tAAYwmFBfsFAO1VT+dEgJNorHhgKByEwi8HAQ6F/HpALHdISt6AJhsAdTsISuRwK0aIt7sAZVsIse5UxxJwZTQGnDOBIjBXbNpVoppVKqNFVRAgZtMB9tEADeFFMBMk7/ZE7oBEXVl2gOMAHF9nAA1mT29F/meITyNAZ/gAUusAK+p0y1SAW3aAddoAO4NQG3CP6MJOgT+5RhxhiR1wQlA/UmAZCQF7KQsJRVWzVO/bRiEwlCRXQALcACgciRTfaRSxmSfTAGQ+VR8DQFXbAHdhAGVGBPJrBqVbAGfwCMHWUBPQFN/DRNc0VStqST07NNPVklQPlIWiRJpzSRX4SUD2iPTrldHWWO5iiH67gGVMCXtVUFeVAHIrhqRKVMRDaWU2BPPIGW0RQg8XWXbelDrIQRcXkmmLhIEeZBeFlIY+Ri8deX22UCU1AFgJhM/9WKWWkHWGCYGtUFdjAHiKhMS8lk92YHfSAGXZlMI7AT70VIhWSTUbRKESEWAfCMkPIFCHBFM8hDkaRHbCRGLTZCOf6AmrjVAmJgVvWom7WVlXkAnB7lAho1BonZBcGZTC1gW1SwBnawB/oofyQhSAa0RMfpRjwER3S0AQhgXJACB4LQKzCRRVrUQz/kR0uUYAdUPjXAnW4Vn/lVBW3VAsSkA4iZB2NABYHYdvG5ByHooeLJAsu2BnlAn5GZTCKXEEj0Xl4nRDHKBU9EnVM0EVWkQRsUUzv0QyLUQg8KoRLqUTIXhbuIoZFmB3bQobuoAvAUlntAB17Ae8pkZi3QYXuAi8GIAqZ4EC8Ko0A6QDAkRQ6hPzYUAxsDnf8TWAJEQSz0QPSjNjSwXS1ABV5wjiiAnm2nA+KGb2ZwpO6kA3GHi/7h6Z4PiAX4FoX7qExU4E5doAZzkKXAyGRmqRANBKfl00IUxCANckGfIqDy4jua8z3dgT/Tg6kvdjw0IFlE1ao6gAVeUAZ3OkyNel0yJ59rYE9Xam62uQdlwGxoZnpV0AV10AeKuotVMAZ9Wgd+oKIsgAItahANdGGYulf3Az7dkTUxsChhI6oHSqrE4zn94TzJ8zcpUAEjUKe1+J1moAZmwJJUsHaw+p1rIAdncAdmUEwrsAIugAUOeIvzCH9/2VNjYAd/YAfAyZTJdKvy+Qd5IIItMH8EkQKnQ67HozfCQz32M1wUsa398zMagTkOg0WzUzs9gDU5YDOlczp/E/44YDMQBLBY+KWkYiAGZSBd7Yqic7AFWpAER6AETnpWarAHf7AGf0hpizUGZGCweNChVakCfSpdBiubOmAC/jaxLbuyrlMzWIMDEEE+tjMRNgQhuxM3c8MwJ9M4arM3w1UzfmM6rOM1F1AQBxCW0pWleLAHeFAHayBuc4CwWACBz8pT9Eq0h6iLyXRf4mawhIq4OlBkc5AHfbAG8MelCHE4XTM4pwMxXCsT44o1OJMyeFE4zxg1FiEzeNO1EzEDNCAwjpd8O3MQj7sGkfoHxjoHdKYGDliY6/SdRNYHf0AHWDAFJooC8Sldxeqr5kZPN+thdpAHS1oFLnm1AjE2r/7rummLsmuDM1KzKCzjk2EDBjg2KdYyNRJRMzfzMJaXAUPDMxegLPa2uFrJt3RmtIELiIg6XbUbhRDIZB0mXZEavfvYAvOIvEpqtKxJeAIRNO2bAuxbNBCDNBMRE+rbNCwDqmFzVXcRK0XTMA9zNzOAMRdzASnQMe4iiihAZHWAu/VLBj1VBca0tx62B37Av4jLsEo6BlaAuHxgBwCMu2JAkt5mEAVAwiZ8MRUzYyOTNB88EeoFAysjCBgcN0HCGt5iLc23NeVyLumyLvhiwu9yEBPAsHRmVoH7lT7svPPoBdJronRGsztMT7QLZlxpuQdhL2C8IcbCBsjoA/w3MP6WsijLASRG1AMFkCvewivr9SvBUicZoBXNgix8UhDxVr/SpX0uYI4FbMBGa27GlMYAvAZisLwtkF9dwJomoMAEwQDHwsrJEgEMkAHRQiPU4sCKjC1dwZBwxhp1ccUwUDGZkhOc4sgLgACnMioGUQFfRmeOFbhXSgf0S7t1UAanDIgyG7VmXLVMBlIkwcrHjCoIIMtvwCqB4CqwIiuLUhgGA2ePkiaS4i1s8iZxkhMlwgY7gCdX8icHUWpl3MyOGgZqELVGxp7x1wJtp7BnVgHQRhIL8CcHkiA7wMeFEgiHIgOwMitgohQZFGdmQiSDESZgogFKAgQjIi0+JCVXsv7PURsG2IWe7xSvy6x9XRmtZ9HQB4InAQBFW+IkXUJQIc0oXUEmBpchH70hXfEhNxBATFLObEABJqEnolEQbDgFItARCtACVYAF7qQC/cgigCIIFCAjXHIjObIjdcEhSiEXIWFwBFEfl3EfYyIBIAIR/wFF+KwiGwMoxcipM5EjEaIh76HWovhtjOTW10EXrVEZ3OEDDRCK5/Ei22Ie6AEGDbAe7YHYiQ0bg83WgnADAmEbc4EZXaEbciEBQLAUwAHZpGIex+EZymEf2YEbiNEUm83ZA8FIn90Ur3HYW8HLnfEZpiFkZ3IVexEYDaAadtEa2gEfilF1tt0TEtMWi+XxEbehIZvRFZ8REhs9H9odGNbtI2rd3CDx3H2xAzakEEThHtgdGx/BwQvjfwhR24KQJrK9GG8d2Oy93QOBpuStFg3xEBxbEXVDE7rd1gVxztWSOS+x4DZgiVMRALMt3ngy37QdAHZRHRFAEZtDE0BgFv394SAe4iI+4iRe4iZ+4iie4iq+4ize4i7+4jAe4zI+4zRe4zZ+4zie4zq+4zze4z7+40Ae5EI+5ERe5EZ+5Eie5Eq+5Eze5E7+5FAe5VI+5VRe5VZ+5Vie5Vq+5Vze5V7+5WAe5mI+5mRe5mZ+5mhOEAEBACH5BAEKAJAALAAAAADIAH0AhwgHBQkIBhQSBRURDRYWDh4aDhoVEBoZGiEdCCocFR8hEColCigrFyQiHisjGzozEiAgIycmKCwrLzQrITEyIzsxJT4zKDs+LDMzMz89NTc3Ojw8PlQHBWAAAG0AAGwOC2oRDWoXEkA5EEg8LlI2KmMtI2Q+MFRKFm1hHFJGJ15TIE5AMUVJN2FTLm1FNm5OPGFQPnBfOXJiMkNCQUhIR01NT1FPSk1RQFZaSFNSUllYVV9dWl9iUXdkRHVhS2NjX2puXGZmZm9ua3R4Znh3c4QAAJAAAJgAAIsTD7MAALkAAKUfGIwpH7EnHog5LNIAANgICOMHB/ECAuAjI/U5MZFGNohQPrBKOpF/OcpJOu9COYt3Q4FnUIJsU5ZuWJB3XL9nVZZ8YOtYRdJgTvVpWu1+aH+CcZiBUaGMQ5yBZJ2EaYCAfYiMfKKGaLCTa6WMca6RcbeYdbCVeLSZe+CDbe2WfsanccOifZKVh5mZmZ2ijqarmLC1or6+vcuogsCnjtCuic+wj8uymdi3lNi4ldy8m++2m+C+n+i7ndW7oPiwsOPGqOrOse7QsszMzNXV1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj+ACEJHEiwoMGDCBMW7NOHCJEgP3boyEGxBo0aP4gQOKBw4IGPBwh0HEkwgEmTIhWGfGixBsUcOnb8COKQoaNHjxyR3Mmzp8+fBS0mPGkyQgQJSJFGaADyY0qBJoEaDAAJJYGNIBscTSrBKFGFM3LsILKmj9SzaNMirFEQK0gIByDI3SoBAwQMSpkquKr259UDCrQitYu3awS5cOE25Uiwxo6+kCP3dIu4MgSjRpHelbCmQQMFoPdK9nmVQOgGENbUhaAUs+XEIJ+Onj2bMmLMmbkeZk0EQgM8pkHT9hscNAE8colImMvVsFHLsYdLP7sx8eXcSZ8jziFECAQ2gAP+hJ4ONLQC8cchdM9RGXv2yk7Jy+9YnXnSwoclzNDx40d3ImwAJ5558/1kHmgBHIcHEd31p8MMy9GF325wyVagfPVthcGGeEWAAQ38CZFHHzjlgQcGVB14IVCmMUAgJBLgkQdOfeQhxA860IDBURxOWCEkQqwoXVwaYqDBkUbmQNOIOD3SBx5roHQgA0JKdaBxJgVIIo15PJSDBkYiiR9ckARR5WgHaHjkBmxuUAMRfOB0kyN75LEDAQOaxwCVZ5a355Um/ZDHHnPixAcRNbS5gZhdcfRDn5ANpgGbM8ywQQY0zOjITY/UiUFIe4YqKqRSiWoqA1dpMKicN+VBQwb+G1TKJph4QUBqWqwZySYNNFRaqRBb0pnHBg1QYOyxyFJwa6nJNtvABoNy2ocQvs7A66y1UrWsT3dNGutFFtFwgw1C7MHHHnhIQMGGF7TrLgXubisVvO3S6y4GF2BAgQRs8HEuETaIC26v2Noq704eauArDTDlYMPDMe1QA5gZVGxxBu7Ge7BfGbtr8QUWH2mDRDo8bANMFvkKZgQbd+ThtzQ8vMMOOOgQcckP+8rCzjz33DJQ8PYs9M6VxgzTzDaLtUPO1+7480EvXxSzDTHpwMPMSDvM6w1cd+01C09LtbPXZItrcsQ78KC2RFpbtIHTYQtU1ww11H102jz01x/+yTg8jAMONwAOuNdx/3QB2YIH3jfVNs+s99ps21D32xLETYB+DMMUU39AQDTTzFfrgAMPo/9tuuCFA8VC4IqbTjrpVjveXxCd7y2RS4lKQAART0+a+eZCANFd58E/rvbxyJueutiuI4/8D3nPJATtw0PEdg6JatD7BgzbLH13QgwBPu1AlF/+D0DwUD7yy591A/LrA4G++eUHD7743UFks9vat/zh0UH4j0MGOIQCFpB+CDxe+9DyPvUh0HziK2D4BjjA/LFNR4w5WPekN8A1rMEMZiCgAYdAhBHSb4FpwQH9RshCEjoEhGsgi0Omh6Mc8EqDYQmRQzzoQTZ8EIT+IQQiEE0IBBSqRYVAGKEQQUgEIa6BDT704AxraC15bUAs/iHLEwOEByh60QxsAOMSR2jEvvCAhUIMoxq9CMUuRpFBNdzAtnaARSH0EA94dCMb9xhGEBqwjJA54xDSyMc95hFKHrwRHR9Dqh84JoBPzKOJDknJPQoRkJEBAhANSUlKTrKLa5iexB7VpyBghCZrwGMeVnlIPegBD688pCVpIwAUahKMXqTkK3cpyVWaiA0NqoGZqiQEJQkBQDJapSuXyUxmyhKKkjFABVYAg2quwAIVmIADCjCAsA2Bja1spjj14Es2MCgIOeDditZgzCf6Ug97gCc890DPcR4yMhX+gIEPusAFH/jgBTBowQoGStAVOAAAPxtkHsdJz4bGM57kNFEi0anO+bAzgGQJ0Dwd6tBz1dOZkBEADL7gBS90gZ8+iAFABVrQgY4gAT8jgEaXydGaNtSVeIzh9HIQJfKsQSD+OWYqYdlQfxn1qBzVQ2QS0IU0pOELXzhpP1VqzZYSdAQF+JkZYLlRcx0VqfUEZSiDgM4a9HQ4NYgJWZuoUXp+9a3+iqdkLBAGp6YhDCU16VQBagKrFrQC3WyZGVzpVriC9ZVhPCeOLHLW0RwtiWDEY1ff6lClSgYGb4BDG5waBpLqNaUr9etfwzbYjcK1sngM4xAiMpFw/RQyvLL+weggG1ma2rSetPEBHHa7Wc6SVKpUZaloB2qAuA2Bq7f9KGL9mL6+8eoiZ+nVDFYXOLUlcZBt5Cphb2rZ4cDBDrvVrF2hqtcYxKCqw11BBZb3TcJu1JluNMMB1TY4FlSqIw3wDzszgAGyyda6tM2lZHE6nwrc4Q5xCO9mw9DZz1I1vQTNavsI8M0BxzK1fRzC+kg3uK5hIAM6GKtnIBEBCmCmAaVJsYpVvBe+rCgGB76Dgn3r4NBC2AIKqWXhVszjHmvFKCZuACYFEoYYg3e3vo0qP6kKAwgPNLAESYAXSNABDuSYAzoespYHAocYy1izvW3wkh8sWhKUgLgFGYD+U0HQARBkuSACCEGVt0xnAbTBywkWr1NLitLgWvUFXpAzCVYg4YHEIBB0MEIHOgDTg/RgCR7oAJ3pvAIvf7m3T1UyF8wb0JaaAA5piHQICE2QAtjhEFQ4wqIfcJAVgOEIkX7zpAFZZCPzlrN8nip6B9qFQoihCIsmQaEh0QVC1OEJqm7zQbzQBFjPedZDroAd8Izku/K5C6Dt9EA/bQgoKLoDJSiuQCYQh0ZoQQnfBoG4B7ICNyTh21aG9pC74OUjh/m3mwaoCgjKhUCUAd2LDsG6VwAIQ0gB3ZFmdEHSAIZ3LxoEs3YOintM8dL0KQFdjnF4abyFLcggBQ9AQAL+HlABOCCCCkoA9qIdMJAXHIIOUUiCyjvA8oE4AA5XcHgHQlClivv8xyVeykcgoV8d8Jdr1P2vAweJy4UuM7UVJQ8M6n3rM2xBBSJAgEAE4IDiOsAPdYj5zEswEB8cAgxKcHabay6QFdjBCkZQOdmlszsuPj2PUGRu+khHtht8OMQ38sxGECJd6o5OfQVsuna3y0w2DIE8X/Dybs8gAh1Lk5oAbTIMBPFvmS8a3APpwiGucAQjJDwEbIcEDODwBSuUoAQhIAFt2stM5cYy7/Pl+w3sOwO01O25/w3wgJMLUTw8njY3NzIaFgCJCryAC1LNtgm4UIgxpD3hoBfIFw7+4YS4J7wEjRYIDOyQhi70daAIhcxxt1vUyt6euaQLGK/Y0pc1zP+x2JVsUSnLXTPQZgVxcAd2gAZaZwIMhm8pdV4w4AWCUAXvhn3rJRBpEAhdwARIwAEgcGbhp3oy9gUxQFBQhhal1VFf5X64BwRs41qSEQD2l1YyET61tX+G5VGu5H+jMX5YUEsvsGdTZV4+GANpwH2ll3AgQAIHBQlvcAhhcF4FlXqVxnofiGYiuF0zaFRhlVieowOMpS0ryIIuEVTIRFSFdVqoZYOQcQIoAAAG4ANp4AWb9oMv8INp8AdWgARFkHCDpl4DAAeNAAc+IFwGRRBP6IERdhZbxX7+XkWG8ZRTZtAg2BMlXDgaeGASFyVUbVVTHpVUT8cGFiIVD4ACkFAAX4BX2PaDphgDcJAIrecCr5eHK9BXcLAId9AFTUZQE0AQDjBtX+ADhegXM2Vb7ZeJHwVK58RTJoEH05EHbMCC7bQG7yRPNSVOhyRfanECADAATUWKCXiK5hWLasCEBeWDcHAIhBAGL1BQt0gQbfAHS9iLPaFQTgeMNwVREQVKOxUlbJAH85EHAVBMGBUgyjROzfRMUHR8Z3ECqmdtS8ZP1RSHP8iHc+ADtUhQPsAFXBCEgZAGXNBSD6BjDnAHidCOA7WBJPFNArZ4AhlREnVObxIA+ngh/Gj+SkE1VMoUThdGkCBURCMxAA7gAAlQAAYwAALwACfgAA3WT13QBnAQBrUIAw6JiocgCF4wkQO1T1ywfXeQBlHYUizHBYDQCCK5Aum4E7cETrrEVQvFSlDCkkHgklUSk4+kRZLUSQT5RTmZEAUwASNwfn7VAtUEAybwAgEoCF9QUE/ZBodwCFrZUtDXBV8QCHcQli1VcoEAllsZgSRRlrgUINlFl2rpQ6KEEW55JpO4SPrlQXVZSGOkYVtXAAlweVTpZCtAb4AACD1QAufnlOaFkRrZUifVVJApmXz5AndwCI3wBec4UGPZEddFSIV0klEUShEhFgGAjJCyBgdwRS/+yEORpEdsJEYZNkI8oG2yKVpFFgiD0ARxd2Yt8AJxWGwZuZEE1QL8xAVwEJy8SFBV1QWnFghfMJEkiRCCZEBL9JxuxENwREcbcACvBSl8AAm9AhNZpEU99EN+tETydUDlgwPlmV5vEAh1QAZT8IC46ZRxCAgZ2QXCBQP1aQeFEJlbSU2AuQJpUJyA8J8gOBJIdF1MJ0Q9agZPxJ1TNBFVpEEbhFE79EMi1EIauqEdKlpzMAhaIAZQ8G5F8AEmoJtdEAiB0AbmN5/95AXFCaMFBQNMmAZ+cAiROZE6ukJMWkADBENS5BD6Y0M0sDHY+T9qJUAUxEIPRD9qcwNP2lL+U9cIiiAGT2CluOmDE9ilU0lQ03eVaQqjfGmmAJUGgCCL5jhQmIkQDfSn5dNCFMQgDXJBn9Kg8uI7mvM93YE/0wOqG3Y8gjqoVRkIf5AF51Z6RahP/gQHhRAIcPCoFHmRgKCmaeADw6lSulWZN/oCfZV6BtFAAAaqZHU/4NMdWUMDixI2qiqhrEo8ntMfzpM8f8MCtLoCPvAHgpAGVcAETHBm1FSRunUIhRCsVMlPE8gIWSmR/FaRcWAHlXkHhDgCCsECpzOux6M3wkM99sNaFKGt/fMzGoE5DoNFs1M7QYA1PGAzpXM6fxM45mpVLKoGmoeuFskFYsoIasCv+in+Vad2CHLQBTHAUiYQVRPYCFlJiwTlVP96BwGLnCsQoANhsILDYa5TM1izAxBBPrYzETYEIbsTN3PDMCfTOGqzN6xVM35jOqzjNRdgAn5ZTT4QBmogB2nAq12QV0XGCILQBQBFUDEAVV3gB4twCHPgBeAIAwx2s4RQfs76im0wbdNWCDgrsysgawNxOF0zOKcDMUgrE+KKNTiTMnhROMgYNRYhM3iTtBNhAzcgMH23ezsDaBapBt9lB3IQCGqQtnubWcXZCH/wBVzwt1xQV5jKCHbrgbW4g2lwn41wCG8gs03mAwF4YIFgnLN4jiFIEGMTuqBbtRq7NjgjNYvCMi/+GTZsQGKTYi1TIxE1czMPU3gZMDQ8cwHKAgkmUKMHhqJq8AZycGBzEIDGGQjBGwN9dZG96we/G5n/VJXfdQdfCbPY1mRFNm13UAiLUK9uuwLrNhBBQ74sML5FAzFIMxExEb5NwzKoGjY/dRexUjQN8zB3YwMYczEXwAId4y4pIQD0dmCJmQiHkAiQOW2HsAgp+ofomgZKeQeMALt+K1BeYMDFeQhwMMCVFmPHewh+UH4fKGsEcMIpfDEV82EjkzQiPBHSNQMrAwkbHDdBwhreYi2/tzXlci7psi74ksLvQhAwULzGyQiJAAgH5geEcAgZ6QX8ygWBawdpKoury6/+b+BlifkGeNtXf4DEdsx6tDhsAmEvarwhxoIH5rIHQiB/A2Mpi7IcQGJEQUAAueItvDJdvxIsdZIBWtEsyMInbfddgUAIgSDHc8ylWSm75/gFguuzhBCZeGymgSC4KFqvhVxpkAnAfhAHTxUDyykQDHAsy5wsEcAAGRAtNEItERzK2NIV/ThkrFEXYTwDFZMpOcEppawAB3AqozIQJQfAsIzEkPlUs2sCczDMuJyVeNwC6RpjKAoIitxkf6CmAmgHm+UD0AoJy2zOqHIA0bwHrPIIrgIrsrIohWEwQ/YoaSIp3sImbxInOVEiePADeHIlf1JqNeoHlnYHfgBqUXX+jofMznIQBoZrAvLsB3L8VDKLinIMXm3wn4wMCQrwJweSID8gyYXyCIdSA7AyK2CiFBmkZWZCJIMRJmCiAUpCBCMiLT4kJVdCEGpW0geG0hsJAzHNpXbg0h8I01RH07ULartcAYjL0y5iHngSAFC0JU7SJegU1YzSFWQibxny1BvSFR+iAwHEJAyNBxRgEnoiGgKBcQd2y+DlzjDABTIcY35w0p3FBWYayHZgBwnGxNYEWApRHKFBFRQgI1xyIzmyI3XBIUohFyEhbwRRH5dxH2MiASACEf8BRR+tIm1nZI0Nang1toFcb2/wVF5AXrs8Ag6wvB0BKDK1IA0SBDn+EiEa8h6u3YnQxkiyfR100RqVwR1C0ACceB4vonqb3dWZ9pt59QV25bYClU3M3RPmgR5s0ADr0R7d7d2wgd2wDQk6IBC2MReY0RW6IRcSQARLARzlXQFtCAMNPB9wjQeeoRz2kR24gRhNwd/9PRCMBOBN8RrcvRXb3BmfYRoudiZXsReB0QCqYRetoR3woRhDt+E9ITFtsRgfcRsashld8RkhsdTz8eOBseM+4toyDhI03hc/YEMKQRTu0eOx8REfvDD0hxAaDglpcuGLMdvWHeVAPhB3muRq0RAP4bAVUTc08eGxXRAOXS2Z8xJwngOROBUBgOFHjidYnuEBYBd+1REBFLE5NEEEZiHmhF7ohn7oiJ7oir7ojN7ojv7okB7pkj7plF7pln7pmJ7pmr7pnN7pnv7poB7qoj7qpF7qpn7qqJ7qqr7qrN7qrv7qsB7rsj7rtF7rtn7ruJ7rur7rvN7rvv7rwB7swj7sxF7sxn7syJ7syr7szN7sBBEQACH5BAEKAIsALAAAAADIAH0AhwgHBQkIBhQSBRkWBhURDRYWDh4aDhoVEBoZGiocFR8hEColCigrFyQiHisjGzozEiAgIycmKCwrLzQrITEyIzsxJT4zKDs+LDMzMz89NTc3Ojw8PlQHBWAAAG0AAGwOC2oRDWoXEkA5EEg8LlI2KmMtI2Q+MFRKFmldHFJGJ15TIE5AMUVJN2FTLm5OPHRHN2NUNGFQPnBfOXJiMkNCQUhIR01NT1FPSk1RQFZaSFNSUllYVV9dWl9iUXVhS2NjX2puXGZmZm9ua3R4Znh3c4QAAJAAAJgAALMAALkAAKUfGIwpH5UoH7EnHrM/MdIAAPECAuAjI/U5MZFGNohQPrBKOspJOu9COZZkTot3Q4FnUIJsU5ZuWIVwWZB3XL9nVZZ8YO1+aH+CcZyBZJ2EaYCAfYiMfKKGaLCTa7mbbKWMca6RcbKUc7eYdbCVeLSZe8aWfeCDbe2WfsanccOifZKVh5mZmZ2ijqarmLC1or6+vcalgcuogsCnjtCuic+wj8uymdi3lNi4ldy8m+C+n9W7oOPGqOrOse7QsszMzNXV1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj+ABcJHEiwoMGDCBMW1KOHCJEgP3js0EHRRg0bP4gUQKBwIIKPCAp0HEkwgEmTIhWGfGjRBkUdO3j8COKQYSJFihKR3Mmzp8+fBS0mPGkyQgQJSJFGaADyY0qBJoEaDLAIZYGNIBscTSrBKFGFNHTwIFJGj9SzaNMitFEQK0gICCDI3SoBAwQMSpkquKr251UECrQitYu3awS5cOE25UjQBo++kCP3dIu4MgSjRpHelVCmQQMFoPdK9nm1QOgGEMrUhaAUs+XEIJ+Onj2bMmLMmbkeZk0EQoM6pkHT9hscdIE6colImMvVsFHLsYdLP7sx8eXcSZ8j1iFECAQzgAP+hJ4ONLQC8cchdNdRGXv2yk7Jy+9YnXnSwocl0Njx40d3ImYAJ5558/1kHmgBHFcHEd31twMNy9GF325wyVagfPVthcGGeEWAQQ38CWGHHjjZUQcGVB14IVCmMUDgIhLUYQdOetghxA871IDBURxOWOEiQqwoXVwaYqDBkUbqQNOIOCmiRx1loHQgA0JKdaBxJgVIIo12PKSDBkYiiR9ciwRR5WgIaHjkBmxuYAMReeB0UyJ42MFDAQOaxwCVZ5a355Um/WAHHnPilAcRNrS5gZhdcfRDn5ANpgGbNNCwQQY1zJjITYrUiUFIe4YqKqRSiWoqA1dpMKicN9lRQwb+G1TKJph4QUBqWqwZyWYNNVRaqRBb0mnHBg1QYOyxyFJwa6nJNtvABoNyqocQvtLA66y1UrWsT3dNGutFFtWAww1C4JEHHnVIQMGGF7TrLgXubisVvO3S6y4GF2BAgQRm5HEuETeIC26v2Noq704eauBrDTDpcMPDMfFgA5gZVGxxBu7Ge7BfGbtr8QUWH3mDRDs8fANMFvkKZgQbd+ThtzU8zAMPOewQcckP+8rCzjz33DJQ8PYs9M6VxgzTzDaLxUPO1+7480EvXxTzDTHt0MPMSDvMKw5cd+01C09LtbPXZItrcsQ89KC2RFpbtIHTYQtUFw021H102j301x/+yTk8nEMOOAAOuNdx/3QB2YIH3jfVNs+s99ps31D32xLEXYB+DMMUU39AQDTTzFfvkEMPo/9tuuCFA8VC4IqbTjrpVjveXxCd7y2RS4lKUAART0+a+eZCANFd58E/rvbxyJueutiuI4/8D3nPJATtw0PEtg6JatD7BgzbLH13QgwBPu1AlF/+D0D0UD7yy5+FA/LrA4G++eUHD7743UFks9vat/zh0UH4j0MGOIQCFpB+CDxe+9DyPvUh0HziK2D4BjjA/LFNR4w5WPekN8AylEEMYiCgAYdAhBHSb4FpyQH9RshCEjoEhGUgi0OmhyMd8EqDYQmRQzzoQTN8EIT+IQQiEE0IBBSqRYVAGKEQQUgEIZbBDD704AxraC15bUAs/iHLEwNUByh6UQxmAOMSR2jEvvSAhUIMoxq9CMUuRpFBNdzAtniARSH0sA54dCMb9xhGEBqwjJA54xDSyMc95hFKHrwRHR9Dqh84JoBPzKOJDknJPQoRkJEBAhANSUlKTrKLZZiexB7VpyBghCZlwKMdVnnIO9yhDq88pCUxKRlNgtGLlHylLiW5ShOZoUE2MFOVhKAkIQBIRqt0pTKXuUxZQpGWoxkCG1vJzGreoZdmYFAQdMC7FZWhmE/s5R3wMM5x4uGc1jykdA4wAQcYgAALHGQerXnOepKTnNf+NFEit9nN+XwzgGQJkDntac9zobOZs3HACFrgAhm4IAYtWMEKRlCBCkzAAAAIWwEEqkyCerSersRjDKengyiRpwwC8Y8xUwnLevrrpTAl6B1GIwATbIELW9CCFmQggxjEwAQSDepEExA3McByoOaCaUzRCcpQBmGbNjDpcGwQk6c2UaDnVKpW/UXO2RhAC2Dwghe2kFMfOBSiQhVqBQ5QVFdmdatLfWUYtYkji0h1NEdLIhjxiFSt2nOms6mAF8YABjBwAac65elDgZrWoFYAnmETg1vfqtS/4jGMQ4jIRMKFUsjw6gaj0+teO/pRdEqnBWNILWG9cFidmvWhEW3+rFAdULghHLW0B5WrH9PXN15d5Cy9osHqAqe2JA6yjUed7EGnQwAtrGENalBtWBG7057GQLYSJQEJVsBWhAxgANuSplsH2kw3iuGAahscCyrVkQb455sZwADZQFtc0eKSryEt0Bba8Nw1nEG1rOVCYnsaW9l2oAMkqMBBCDCBAwvgYAWQJn5jedk+DmF9pBtc1zCQgR041TOLiAAFMNOA0pj4xCfeC1+EtIY59Pe/q2VtWc8q2xhQwQMdCAF3DeKDKhyYA6lDsZCHrBWjjLgB0KwAHejg4ufCeLozXmxjx+CEIhw4wQVRshJw3AFoetknMlgyHfjr39RCOadnLbD+RF0AByVYuQMlWIEBCMKFOCCBy0RNCAAy+uUve0HMTS7zahGr2OsKdQxfOMKbQbCCCQzEAXSwwhG4DOSEcKADD+4zLQWwBkC/2Mwy1sJrfxrUGERa0QdGsKMFogU5JGHSP+6uQSZghA5UWtOYHIOYmexkACN21AXmAh9e/WYEK1gga0BDEoxQbNoaJAFVOMKBcU1LC6Rh12no9aDRbN2gjuEMxE41lhdxgDR8AQnMPjAInF0QLDSh1pimNia3sOsmP1nGWxg1Y9XABXQXe9wToAMWjpDuDoBg1QSZwLnhfWsvO6fEQ454ac7kgE6LmcwAHqtP0yzRNXCB4EXg8rj+LSBwZr85BAgfiBaqgO4fV0niMC+yiJfykUW8dwfx5dpw6evAQd5ynsq8bD+nE2ZPC/rbWohzQx8q0TZ4YQnMFvmxV8AHL7igBFjX7rEHYoA2RJvh09kdF4OeRyjuNn2kIxsOOOzhG3lmIwgJ7nBHp74C/jy5k12mGYawTjXsmsz/pcMbSoDgFvQ0BRVYAR3GoIUXmADrEl11DP7AeENLdOsCWcEaplDwEtBGvMvMbSzNjt6042C9NEBL3XxLX/viF7f4rAPfZ7OCORh9DG34AxuM4AEONHogAV/DFlzA2MgLJAZ+8LgLhGqBgrTA41TIOgkkY1vlZvWvo98t6QL+xiu29KUM3c/rcfnqUr+C9A5imA0Xdt1fPgRCCkiwcghGkAKJtmDJXvCB5X+/CAv4oQ9eoAX7VxAx0AZjsAWWx2dpIVl9VVnnR3pAwDacJRkBAH5UJRPhM1rlB1cG5UrpFxkJYHG8lgZ/EAZREH8HtgIu8FAxMAd/QAbDp1YCYQAuWHlCBVnHRwdrkH9BJWtSwYCUxYFMNVeeswN2pS0UWIEuoVLH1FJB6IAgVQcf2BcrcG1MNgNr8H4nGHIIFgMEtgaE4AZbIAPMNxBkQAgwuH8+OAI66AVkKFFz9oO3tYHmR04iJQYNgj1RgoSjUQcm8U8rhVUeZVAyFXRmYCH+Z+ECczAHMLAIdCAHV3CCvJdjXriCZxCGMRhUIzAQMoCGAihUPhh8PChR7DYZHEVaLmUuhQhK2lRSJlEH02EHZlCB4FQG4lROHlVNh3RekJEFKrAIDsAHcQAFT4BqcOaFPOUFhiCGy5dWjjZ5aoCAoEgQBJAGaTAGPhBUpbgT8gR0qAhS+JRPoERSUWIGdjAfdhAAxARQAZJM1sRMzgRFs4cWKPAAiyBYhPAFT4AEsNaFPCUDWjAIdDCGslUBXAAIbqAFzQiHBaFrY/CGK7CNIyFN94V375hP+qRNbxIA53gh6WhKKsVSyURNFBaPIFREZ/EAIrAIE+AFl8gFSkD+cD+2AsgIkH/QBwQpVCbQAs9HCGugkLNFEF1XCNjIWJg3ErY0Tbl0VPPESlCikUHAkVXykY+kRZLUSfH4RSd5FiewCASwBWBwiWRABUzwASBQAttVk1wwCH+Qk/bHU1pABz4pjY6lgDLAB4cABtkoUc23E0l5SwGCXFjplD4kShghlWfih4v0Xh6UlYU0RhcmFV0ZA4RFBn+QBj2VVjU5BgKZifanU/RmCMK3f6QoEGAwCHmpBZrol3a3SYWklE0VShEhFgEAi5BSBghwRRjIQ5GkR2wkRhY2Qj3QEQZgAAdwAAQgAACwACdgAGMwVmPwB21JmjV5iXTABRC5Aib+oAVb8GeEEI2kGVQGsAZ/QAhgAJFHiRCCZEBL9JpuxENwREcbgACdBSl5sAi9AhNZpEU99EN+tETndUDlkwMLlngtUHxCxZMQtQV74JPZuQIMxVNgSAdWl1ZkFZ0+yQX7V3wuQAd/IAhgsJAphxBIZFw+J0QnKgZPxJtTNBFVpEEbBFA79EMi1EICOqBcB6HYhV2mZgh7cJ4FFgMNFWaEQKEPeqHlqXxChVYrEJeE8AdeYHl5lhAlaqI2OkAwJEUOoT82VAMbg5v/U1UCREEs9ED0ozY4UAEjsKNsugJvYAh/oAafKFE+1VB8UKR6WWAtgKQ+6YZLilZOCqWW54P+BtFAZlo+LURBDNIgF/Qp9SkvvqM539Md+DM9h4phx4MDbcqmanAIgEAGc0qTQqoF5bl4obqnYFWeb+CGxcdT1+WkP2p5mXYQDVRfh/pU9wM+3ZE1NbAoYROp+jmpxOM5/eE8yfM3LLCpNdYHh1AIP7mQLSCkW/AHhmCqloeqXvAHh2CklvdaLRCX1ToGhpaeA8ECp2Osx6M3wkM99qNZFNGr/fMzGoE5DoNFs1M7QYA1PWAzpXM6fxM4yaqsQuUDfYAIhPAGOxVb0eoCDIoILzh8jBUDOTWtiNAH52loMfBaMtBpcBqlDHkQ5io4GeY6NYM1PAAR5GM7E2FDELL+O3EzNwxzMo2jNnujWTXjN6bDOl5zAQIbVFzwBwb7BmOIsTzFBXtgsMInAxGrU1qwB4fwBxcrUTIwhjKga3TgsBXalwZxOF0zOKcDMSUrE8WKNTiTMnhROLAYNRYhM3hjshNxAzggMGp3ejvTsxIFBkBrCG/QBT7QjBnrA01rsGKYmSqoU7qGCESpfxIFltxpe0A7nfxnEGMzt3Irs/q6NjgjNYvCMh0ZNmYQYpNiLVMjETVzMw8jdxkwNDxzARTQWKoZVNHqU9GJCNXaBQgIVBmrU1ert3xraGQFBrZ3CGjYtxKlBallcYRQsVywfCO6CEGjuiyQukUDMUgzETH+cbpNwzKPGjYodRexUjQN8zB3cwMYczEXwAId4y4FEFQ+AAZq0AWx6wNktQWWSbt0AAZjGFExwJ2heQhu0Ls0KVad5gdIq7grULUWp62IILRkeJQFcL7pezEVw2EjkzTiOxHBRQMrswjbGzdBwhreYi2rtzXlci7psi74kr7vIqRdQAbP9Qd8e1Nd0AVeoAbliadDuwLy6wWdlrz/m5mUabVA65MKCVQyQAZilrzfOYYmcJT2osIbYix1oIpCwH0DYymLshxAYkRBUAC54i28Ily/Eix1kgFa0SzIwgBgIGYk2AddAAZjoAZq0GIe+gdvcICKuwVdYLXJu6o+EFv+YIC8DhuNmekCImgIPnqASluKDHAsjZwsEcAAGRAtNEIt0RvG2NIV6khLrFEXIUwDFZMpOcEpZawACHAqomICIlikb+ChfSBm0rkGY8C3EQWWndagymvAwEsHfoDIewCDxOsCreyhhkAIaTBWy0cQjYzKqIIAk4wHrKIIrgIrsrIohWEwtPQoaSIp3sImbxInOVEidfADeHIlf+IAVtvLh1DMfwDLfyDLOdm+naatRSpgSrsCa+yhhyCQY2DPJuADReqhAnkGARgD7KYAf3IgCfIDU1woinAoNgArswImSpFB0GQmRDIYYQImGqAkRDAi0uJDUnIlB/BnHkq7g7D+B2LmB++Mv29YtXTAB6j5B24wVoqLxAK9B27Qz0CpBYCwZH7AB7LshpsoEAh9IHgSAFC0JU7SJdvE0YzSFWRCbRmi0RvSFR+yAwHEJNJcBxRgEnqyFz7guH/gB+58mbP8ic5FBw1apGqAvwoZAwEtnTpoWJ9oAnTNZP+1BSYgEMURGlRBATLCJTeSIztSFxyiFHIREvI2EPVxGfcxJhIAIhDxH1BUzgdSgHzAB7tG19GFU8u3Ba+8B9KZBmRg1z7102ImyzwttW5g1vx1gHK2CICyUQvSIEGQIxGiIe+x2IiIa4z02NdBF61RGdwhBA1wiOdhHiOwBpy90px9BmH+FYOkumScLct2LVF90M50kG2pxQXZqAWD9V/YOdu0Ddh7YQYNsB7tQdzFDRu/3dg74NdvcRuY0RW6IRcSQARLARzmoXi7tmTQ9ZwxeIaeRlgCpoJ4K+CqZc8O1cQ4aNShcRyeoRz2kR24gRhNEd+NPRCMRN/1bRm4oRlI0RmfYRpXEeA6GF3ILANuENDdzdrgLbE87GKERZAVMKttgeKB0QCqYRetoR3woRg11+E9ITFtsRgfYd+DsRld8RkhgQCeBmMCNlhtYHs6CGNjRVaixrw6fhBRHhga4uRCHhdKbuR98QM2pBBE4R5PHhsf8b0LYwM+ALjzS4YWUAEcvgi6aZLhiwHZvQ3nFk0QXormatEQD+GuFVE3NNEU2LwIIvGVW5AC1FwtmfMSmK4DfDgVAaDhRB4SVLEYeGIX1REBFLE5NEEEZmHorN7qrv7qsB7rsj7rtF7rtn7ruJ7rur7rvN7rvv7rwB7swj7sxF7sxn7syJ7syr7szN7szv7s0B7t0j7t1F7t1n7t2J7t2r7t3N7t3v7t4B7u4j7u5F7u5n7u6J7u6r7u7N7u7v7u8B7v8j7v9F7vBBEQACH5BAEKAH8ALAAAAADIAH0AhggHBQkIBhQSBRkWBhURDRYWDh4aDhoVEBoZGiEdCCocFR8hEColCigrFyQiHisjGzozEiAgIycmKCwrLzQrITEyIzsxJT4zKDs+LDMzMz89NTc3Ojw8PlQHBWAAAG0AAGwOC2oRDWoXEnEcFkg8LmMtI2E6LWQ+MFRKFk5AMUVJN2FTLm5OPGFQPnBfOUNCQUhIR01NT1FPSk1RQFZaSFNSUllYVV9dWl9iUXVhS2NjX2puXGZmZm9ua3R4Znh3c4QAAJAAAJgAAIsTD4MfGLMAALkAAKUfGIwpH5UoH7EnHog5LLM/MdIAAN4UD5FGNohQPrBKOpZkToFnUIJsU5ZuWJB3XL9nVZZ8YO1+aPV1aH+CcZyBZJ2EaYCAfYiMfKKGaKWMca6RcbeYdbCVeLSZe+2WfsanccOifZKVh5mZmZ2ijqarmLC1or6+vcuogsCnjtCuic+wj8uymdi3lNi4ldy8m++2m+C+n9W7oOPGqOrOse7QsszMzNXV1AAAAAf+gH+Cg4SFhoeIiYVubj8/PDo3NjWUMTAxOj8FCIqDCJ8IBZ2jhAGmpqKKoY+WMZQ1Njc6PI6MfX5+faS7vL2+v4WWiaemEhITyMgSDqCfqYKmwIYBf6gFm6AOx8kTxsSKLzU3P15u0ufo6YgxhdigEQgR8tsTGREZyswL1+q/1wgLtCGzh6+bBHnw4DXjRCjGjX4QI/Zyh7BiBGPGkN2b4MWBgwUg90n0da1ASAcRvNSLoAyjxYSgno2cOZMiQowZuR1k+SOCgzQmQdL0FxRkgTTyfkyYx82gMYsxh0o9tynhxZzJniKs0aNHhC8AA4ScCizkArFHI3StURFr1or+zsjK7VSVabKCBye8sKFDR9cfX4CKNTv3l1mQAY6m+dG1r40XS+nh3QlPZmG5dbdl2IxPQgYYfHuocYNLTZoM1A5fBmayAeE/E9KoweVGTQ8dNmBkOMZ5cuU/PVZLjac5w4bjxmvQGo3Lj5s0XlAdbiBc2mGjpgKTpq3mUY0NxpHjhfeHR/WRCDQf58CeQ4wfbXDd6sNGzY0Cg802oH6+7P7rpuigBhvz4dLGDzG0x4F43XCiQ38QDbQBey+8wIEGMMzWxy1+1JdBKPuFKCKE0ohoYgPXbDCgfLeoAYMGHFTIHnj4REBiOiwZxx4MMFRYYQ/b0acGBw5UYOSRSFb+cGOJSTbpAAcDcuhGDz6+wOOMNVKzpC/3TBjjJZbAMIMMPbDRBhtpTFDBZhi06WYFbm4pDZxt0ulmBhhkUMEEX7Rx5g8yiAlmj1jaKOcunm3gIwyw1CDDo7HcEAN4GlRqqQZuxnmoP5m6aSkGlh4ngyQ2PCoDLJb4CJ4Em3bi2ZcwPHrDDTTYEGmpj/qowq689toqMHD2KuyuFcYKy6y2inNDrlfu9ushr14Sqwyx2IDDrMg6yuMM3HbrrQrPSrOrt+SKaWqkN+CgriTaWsKBs+EKUs8LMdR7bLo49NUXqTQ8SgMNMwAMsLfx/oIBuQIH3C+1ts6q77rsylDvuxP+xFuAXozCEktfO0Ayy6zX2kADDiP/a7LABQOjQsAKm0wyydY63BcPHe8riSsJTlDAD89OmPHGPezQVcdBP6zu0UibnLK4LiONtA75ztIDzUNDwm4NCW7QMweM2ip1Vz34ADbNO5Rdtg474FA20kufMwPSa++AttllBw222F1BYqu7Wrf62bE8/OXI4D4UXjjdiB/dNjpvq4242WIXHvbgg+fNrm4MHdq11IN74cUWWxBuuA8/jE734unQQPforJPuCOhekOPI1LjVwKPm4YTmiOeef/E56KEDD7zpO6Cujuo7jC486D8I78UXvns+e+1WysmBOH6R83xgaUDv/Rb+X4C//OjG94MD68KHr7730HcfPWO1c7DlDdj30Hsa+LvP/v7hg254+RA5nw/Sx7/95Q86nrsN/R5CIh04JHDPy59pDkjB/QkPgBHZAfAMSEEKTrB7XpiapB7UHx5gghZewJ8aVnjANawhDS88oAUxKBENgs97FHyhDiW4QtN8oTExME91eqCcHgBGNit0oRKXuEQZQo+GI/EB+1rIxCquoYdfYAwPasCz1XihiM/r4RrYMMYxsuGMVjwgFGkywPxZ8YxwJCMZr2iaBG6xi3P5YuDIERgzxjGOZ0JjE9c4lAL0UYl/TCQcXYi/2E2tBtEhixcE4RcjphCGcPSTJjf++cc1TIUAFCBBClJAAgtQQAEGIEAhBgCAX20Bhn400yY5iUYQhpAHW4xBJIcSg1jgsnl9POMsh+knMg5FABZYgQtyMAUXuKAFLVjBKKdpgQf8oQMe8EArXelCYRKTli8MnxZxY4ldjuRYyQMf/mI5zDh6cigGyIEVqlAFKkwhBy5gATSnyc8LDOEDHuhAIjrQgW2eZwvd9OYs3Ym/8PkgEpMI0yQhwiMZjCyd6kSkItFIFgtUgQtWmKc98fnMFpyAn6M8wRGAkE2DEmIAABUoiXwAy40KMpz+S1u/eHSJc/ToBSsLmLqSN8D2wTKhgpxLC7jAVCyIdKQs0Kc0URr+hSKwNKCHIEIQsimALUmxm35sovu2cDh1DUwFFeqEA/zyRQ1kgFwWHSpGcbhORl7mAFMQAxiYygWn1rMKU/CACPbJzxYwwarZ9MABCmEBJgQhppsqgBTrGsOG9s8HayPZwLqVAQ3Y4JYe+YMEKoARB5TktKhF7T74IRwKYEEMeuWrX6twhiVkswQrOOk0qeAEITz2toWYghF+q82Upfa4yNWGMUjrgDVa4QywjS1TQwoGOhQBoCFYwVRTsAIuKMG3APVACQwwCAVcoQhCCK9MCcneUYgBDdGVrlPRYIbrZtME250CGI4A3myKwAKDYMF505vNELT3wIkgARrQAF3+2O61r1zAgxbsK1h+VgEMT0BCCUogghCUIAUKEAQXpFCEIFw1BORFsIoH4YIFo2EMDn4wGu7gBAp3gJ9WAIMVptAClJJAEGKQwhCGAAJshsCaiRhAQVdcPi64uMHSlYMZmkBhD5hAt68FaQ56zM+uioELVGDBNE1AgUQAYAhYZTLq3rvgM8A4ylkwAoHvO1UsnEHHVODyNFWpVyzkmZqJWAKBXarmglHBxQyOLhfAIIfDEtcDKeDyFODrZz2PcrGw5UIVctDlQ5CACQQeQHudYlrkmrok1XkAmxf8ZjCIQQ5J6G82Iz3KFkAXzGLmJ3ntrOMtTzPEhpDCcCErnFP+G1u5o13GJ/7AVhu4lVtBjavjBnhDNyqxoXiUSoufHF88QMHE4RVBpKf63jD8Wdd/YAF8d6xnABeCBOf97XppsjPuXTt/0Mtp2khGrhl09rO38cgmEPHToI5MbYWr9lETusQv+GAoBwADohs8BjxYYQkjGIEIPhxpLmNBDua2dArIq2A0gFnPPy6EFaTQ3xCoMopfYOJNY5jvsvJ7Bmh9ATrqxdO4zrWuNp1jGh4+khNMHLZn4AMXnolSaEpzCnIgAxVcgNLFEkAMcOjCuUdpiCAngQghEOxiIUJTpArTnTTPKckCxSN29MMLbUdnUdeZyXYucg1bGAkWEA3jMfD+gQy+LmwKLHCBFkR96ih9ORUOT/Vpjl0QBhjDyaeZ4nQglJ0LvXvNd8AuiUokAHDvpSzCltG6fzOQLsw7RChwBm5XHA5VEDmS/2B4NCC+03/Awhyk3vhRVv4PD1j3FH5t+YSeXpO1FKfHbFBOLX0e9K6o5BExqVC7LzINqlfHpF0shorjYem6HSUJSLACFFQBD2W4/TS7+gcx4EEMWx85IQxwaypMs8zSeKXZT3996GyhMVgTHc43EmlgCnpkScGUSIHUSdf2BZYBDFfHbXjwfcPHT1EFTRGWfiInCBSABnsQBjzGT7MHZF9GBVPlbiRxSBqVSWbCgCCkRZBkCmn+MBVq8AWgB0ZeIEZllEhVdEBkpQ4X0HoMxgVykAdckAPblQLOBE1isAfwt4F/kAJowAddEILTNIJ/wAVnMHkpcAG/0EbWtoKLNEd0BEKPFB1foAZzoQYBQER7FBhJZEVM5ETQQ3ToYGsmxwBlYAdcUIHTtIS25oTxlwKCkAJvQIGWhoWTpnVclnK8IEV0tXBySEd1pEXvEQBqeBlsaEKVdElJREWVRYegUzzpQAVYMAAEgAZ8aH+F5Uw54IFPiFIUcAApUAd4AAZWOEpY6AJyEIujxH6kYENTlEOw5EYsBB2WyAOYWB2b+EDaI0EdRIffM4roQAAM0FUsIAdyAGb+4RdprigH7zeIo8SLe4CLiVgIESZ1evZ7iiCMNxQYRhWNx+g7IoQJy3geBbhAbOU50lhA44NZ55AAguACryYHjNiKLgB1txh7KHVSi7cHXDhKwCYIFnAGeqCBxDcKREVABRSJ0RNCkSAOATCDEOIFCHA9o8c7EaQ/7CM+lzU6OAAMAyBqKcAFBXmQ09QCzrR432cFvTdKK9ACPAkGJiiChNACU0gGuciOhyBAhrM8Hek+vAM/9MMBCDBRENIGf9AjsJA92tM7v+M/y0NWh1M2NPALDPAHB/BRYlAHIMeQObmTcfB+VpBr04RPVSAHekCUImcBYzcFb8AH5rhnnYD+PERFbcKDmFvwPCo5PZNQPZqzOXu0O78jOq1TlmbpC2m5VFbgfr0YfzrpAlVwiGJgBZa2AlMwBVQwlxHJT36JBXHAB2KAhNNUmKtzmYUzOLAjPY6gN7YDA5tikn/jS4JDOazzOHSjLjNwCALwAM5pAAZwAARgABCgACLlfnUgBrG3XcqUkHN5BnVZWFQwnmeAB7ZnaZb2aoLJaeKnCI2DnGXTOpTDGI1xOR+ClXLiMxrzNV2BN1MDn5l1NMs5CAZgASnQjSjFXTU5gaXJdLXWAizQYubpk/zkAuNJBe6HBnAZafo0Ta92i+w5eInQOHIFn7h0N2DTFdkCAwsSLvr+2ZX8STQe0xdOkzT/ogIKQGsJuqOjxAV1sAdogAUO2nERWp5jQKF3eaHuB556ppPRNEqM9n0hin+GoAInU6NHoy9CQzV2A1GUwKJ98yuagDGOgj0zUzM8gC04YCslczL/EjAqwKNymgJYUAd8AAdYEHgdp5NgYJ5Cul0X+lx48AamGZfPJE1ESIGOdwhWKjCa5TK1gi03AAlkYzOTYDuQsTPxMi+McioNoy77AlG14i8mwzLeggFzuqNQxwcGOXVTBU0QGmFxsHRTtQL1RAUSN6hCmpM5gE9MCI5HOEpeaAgH0y0DczKQEqmyQKPYgiupgg8FM4PRYgmygi+SOgn+MjADgtJvOLcrqZqghseq5uYCrwpNLjAGbkmru0We4DgGuzpN95RPTgaOYNB4E0kI48Kt2+qparouuCItC8IqmRguXyBaE2Il0yIJtXIrj1JwGjAsvIIBFfCtOTmFcxByKQVNLFAFaIAHBkmuScqxeokGVkCbo5QDVICyrcegXMaOwQKxKvCwxQIpyDIJsdCwzcIq+Bkuk3QPMVIsjfIo9yIDmHIpGKACneImBUCxKUAFgfl95xaUzsQFcwkHINikU7B3daAHQWqyTQtmEicHewByXHavBXC0SXspldJZo5IsQjsJP/UCq/IHOxsvwcESXmIlPLctZXImabImeJL+tG/CtGHggXiAseO4TK82togbaTnABYfItSWrZxgKBwtmp9sIsiNoJ4K7GUaSBi3YA2w3KBayIEsBHMbDAwWQI17CI0D1I0FSHxqgDU2CJA3AT/EXlC1ABnLAB3igjoZanqzKiFzWAlUgBnGwB3R5qKNEWwv2BnrABxoKslTaAEdivUkiAQ2gAVFCG1QSs66LJd3QhjTEEvWQty9QKRmSCxwiuwuAACciIpFGBWFgBXuqmlbQsXwwB/DnoEH5intwp1X4TCflAlgwBr1Ll1vGZVYwBpfru2cwdT0GbNYbvyiCANzLBiziBy4CIzKyIAVhKDT0IOkhIV7CHu8RH7n+UBppoAP4cR3/gQVhgHVTh7JVYAUfF8Ct6qA6ybEBjAYD/KRU0AVokMBikKdM1wIHvGB4wAfZKcEp0FUL8B+HkRg6ALoF4gcHEgMwMiPgoQyZA0XmQRwDER7gsQHK8QOjISW+Ix3XAV9xYHs4jAU22btcq3VbdlItkAMfxwcCLMHS1JlFzKpkgAXN1GNK3HpxEL1oMK4tAGBTfBj4EQDQsx3O0R1bdMYM0g3kgWCZUcab0Q2fYQOBwxwcnAYVYAr6sQ8dSwZiQAZwYLl2nHUp+6QtMAVd0LvSa245wAKIumB5wKpHDMUrYAVyUMQeSwZgRnVFERLUUAGywR23kRv+u1EPnKEM8hAKalYXF3EX4zEBoAEJfwE9L3wY4KgHc4AHczDIe0DLzTRVGKrLQAxYTEfE+mu1fuagVGCeRQgHpZlnAGJIi9EYPJAbkaEZb5HND3hgDMTNV0EPLVERXNEDDuCAZ2EWduq7cvAGs1y/7zxKVIDAfHDH9Nxj9jyBVmsFUBxpcKCNcrCFO2YWaPEFDrAWbQHREQ0TC71iNiAINjEPGNENOiEPE/ADywAUGO2xbzDIeODPKh14kya2eTDPh3wCZXDMtkgGXZDPesa7cfxlVWAWR+ERSmEXWYETCNEMO11oDOTTzfASD70N5tsRH2ES17DUyGye9WtPHof+zHNQBl1QT0znfnGgjV/mZ1boAkR8Bl3ABdewDwHhACphDy2hFXChEMtWaLsgKe2wEJ9wE5qxEd3wEaGAAMhsB42M2Fz2XuDYiyC10niQB3IQB42NBYDVYy5gBX1VBaUdEKHtG9mM2aCg2emgA7ajCMTgFqMdE5/ws4sSAylQkHVAaSq91n+QHmi9EN2c0MwdxoQAnMSNDo3wCF5aCfVCC29NCAWABkvN0R5cJRnzCvJdAwM4DQGQ1sKNH9et1gFgD1UhAZSwMbTwA+YQ3hByAGz2Bl9d21XgTHs320u9V7bNY6Kp28s8eC9n4GpmAe/1Bm8gebJ1w0wlBq0neSqLzXTSZAFMqeGarWomxwIPgErQqQAPYAA0TuMUgIUsvuPzh4I8/uNAHuRCPuREXuRGfuRInuRKvuRM3uRO/uRQHuVSPuVUXuVWfuVYnuVavuVc3uVe/uVgHuZiPuZkXuZmfuZonuZqvuZs3uZu/uZwHudyPud0Xud2fud4nud6vud83ud+/ueA3gmBAAAh+QQBCgB+ACwAAAAAyAB9AIYIBwUJCAYUEgUZFgYVEQ0WFg4eGg4aFRAaGRohHQgqHBUfIRAqJQooKxckIh4rIxs6MxIgICMnJigsKy80KyExMiM7MSU+Myg7PiwzMzM/PTU3Nzo8PD5UBwVgAABtAABsDgtqFxJxHBZAORBIPC5SNipjLSNkPjBUShZpXRxtYRxeUyBOQDFFSTdhUy5tRTZuTjx0RzdhUD5wXzlDQkFISEdNTU9RT0pNUUBWWkhTUlJZWFVfXVpfYlF1YUtjY19qblxmZmZvbmt0eGZ4d3OEAACQAACYAACLEw+QGROzAAC5AAClHxiMKR+IOSyzPzGRRjaIUD7KSTqWZE6BZ1CCbFOWbliFcFmQd1y/Z1WWfGB/gnGVhCecgWSdhGmAgH2IjHyihmiwk2u5m2yljHGukXG3mHWwlXi0mXvGp3HDon2SlYeZmZmdoo6mq5iwtaK+vr3LqILAp47QronPsI/LspncvJvgvp/Vu6DjxqjqzrHu0LLMzMzV1dQAAAAAAAAH/oB+goOEhYaHiImFcHBEREE/PDs6lDY1Nj9EBQiKgwifCAWdo4QBpqaiiqGPljaUOjs8P0GOjHx9fXyku7y9vr+FlomnphISE8jIEg6gn6mCpsCGAX6oBZugDsfJE8bEijQ6PERfcNLn6OmINoXYoBEIEfLbExkRGcrMC9fqv9cIC7Qhs4evmwR58OA140TIBo9+ECP2coewYgRjxpDdm/DFgYMFIPdJ9HWtQEgHEb7Ui6AMo8WEoJ6NnDmTIkKMGbkdZEkkgoM1JkHS9BcUZIE18ohMmMfNoDGLMYdKPbcp4cWcyZ4i1CFESAQwAAOEnAos5AKxRyN01VERa9aK/s7Iyu1UlWmyggcn0Njx40dXImCAijU795dZkAGOriHSte8OGkvp4d0JT2ZhuXW3ZdiMT0KGGnyFsIGDi82aDNQOXwZmsgFhPxPWsMEFh42QHztqZDjGeXJlP0JWS42nOcOG48Z10BqNqw+cNV9QHW4gXNpho6YCk6bN5pGODcaR44XnJ0j1kQg0H+fAnoMNIm9w3eLjhg2PAoPNNqB+vuz+66b8wIYb8+HyBhE2tMeBeN1w8kN/EA20AXs00MCBBjXMxsctfdSXQSj7hSgihNKIaGID12wwoHy3sFGDBhxUyB54+ERAYjosGcdeDTVUWKEQ29HHBgcOVGDkkUhW/nBjiUk26QAHA3IIhxA+0sDjjDVSs6Qv90wY4yWW1IDDDUK48YYba0xQwWYYtOlmBW5uKQ2cbdLpZgYYZFDBBGC8cSYRN4gJZo9Y2ijnLp5t4GMNsOhww6Ox8GADeBpUaqkGbsZ5qD+ZumkpBpYed4MkOzx6AyyW+AieBJt24tmXNTzKAw857BBpqY/62MKuvPbaKjBw9irsrhXGCsustorDQ65X7vbrIa9eEusNsezQw6zIOsojDtx2620Lz0qzq7fkimlqpDz0oK4k2lrCgbPhClIPDTbUe2y6PfTVF6k5PJpDDjgADLC38f6CAbkCB9wvtbbOqu+67N5Q77sT/sRbgF6MwhJLX0BAMsus1+6QQw8j/2uywAUD00LACptMMsnWOtxXEB3vK4krCU5QABHPTpjxxkIA0VXHQT+s7tFIm5yyuC4jjfQP+c4iBM1DQ8KuDglu0DMHjNoqdVdCDAE2zUCUXfYPQPRQNtJLn4MD0msDgbbZZQcNtthdQWKru1q3+tmxQfzlyOBDFF443Ygf3TY6b6uNuNliFx724IPnza5uDB3atdSDf/HFFlsQbvgQRIxO9+Lp5ED36KyT7gjoX5DjyNS46cCj5uGE5ojnnoPxOeihAw+86UCgro7qQIwuPOhECP8FGL57PnvtVsrJgTh+kfN8YGtA7/0W/mCAv/zoxvfTA+vCh6++99B3Hz1jtXOwJQ/YC9H7Gvi7z/7+4YNuePkQOd8Q0se//eUPOp67Df0eQqIfOCRwz8ufaQ5Iwf0JD4ARAQLwDEhBCk6we1+YmqQe1J8gYIIWX8AfG1Z4wDa0YQ0vPKAFMSgRDYLPexR8oQ4luELTgKExNjBPdYSgHCEARjYrdKESl7hEGUKvPwAAwKGGwL4WMvGKbeghGBgTBB3wbDVfKOLzetgGN5SxjG5IIxYPSKIOeKADU9xC/rCYxjqa0YxZNE0Cu/jFuYQxcOQIDBrtaMczqbGJJBrAET7gAQEkQoqrKYAglUjIStbRhfiL3dR0/hAdsnxBEH4xYgphWEc/mfKUhGzDXAbgSER8QAmMhOMhBvDG6sjRhYU8JSrVCMIQBqGLNujkUGwQi182T5Bp1KUy/WTGwrjRAwo4AAEKQQAmLNIDHhjAIYrASG3aEpdmWuYuXxg+LuLGEsIcybGSBz78DTKcu1SjXAxwARfAoAmMPMEJWMCCC1jAAgZ4wRKOUARsypIQA2BCQTsAyW8Ocpl2jGH4hhCJSYTpkxDh0Q1Gxs52UtKS8pQLCahgBStUwQoK9UAI9snPllphoEbAZi0J4QQlFDSbJBoCDN9ZSSV2z39p6xePLnGOHtFgZQFTV/IG2L6dgvOQhSGADLSg/oWSWiELNsUmS1vqgy4ogaAyLQEhDPAEJcQUm1uiIi4H2UT3beFw6hpYCyrUCQf4JYwayAC5NqrUjuLQnZgUjgKq0IUuYAELVuiCFK6pUhe0lAVa6AIUnGCCyoZArIOQQVmNwEhoHqoAVARsDPEHPaCmjWQD61YGNLADX3rEDxKoAEYcUJLa2ta2++DHeS6gBS8UVguIDcNAb+oBFmy1sFioggweewBBCKALm+2sCVJ22+paVxvGkK0DaJjZMJQhDIXtQmTFMFyZmuC4ZTAsFR77AEFYIA1TaIIILGuCVnL3vryAQRn2m97wliEL5cVmCRzLzy6YQbxUWC4/LSAI/hKk1wozUDALDKAIANgXv/ftQhr4C97ClsEKZj2rBwbcUiyooQxaUO5jHXmBDXcBwi2lgCLceFAMY9AAZlDDhvfb4Q8fwQjEJTE/ZXDiLqi4pQrwgwWKbAUfPDYR1WRkQ21cPheo4cpm4HFhDxwFEYggBCEwAQsIzM8yoMHIEu6nHwhQhjSEAQtUIDOFD9EEWDaSyhiswpV1zGPwHrgKMCDzmI8rByPP4LEsaK4VTpxiCTPYECR4wjVrjOfFdWHPJ9byhrEQ4ce6gMxWoEMZqnDox1KYyGowMgxaeoFDTGGgnb0wDZ1CW+vauiTVCQOms/zdS6vBC0fmpwsk7ANR/pMa0RQ+QBlOfOyWTtkPLPAqZ7GZ5Eje+tbYje0yPuGHu+4gr9xCKl8dN8AbztGn3evjUFiA6UyHIQxpmAMZAP3YE8iApVW4Axqa3dL2+iHUoy41P5tLiJImAQkgwKa/abIz7qGbtP0bwtpIRi4crLa1t/HIJhBhVKSOTG2FM7dTwblEMAxhKL6+8o7DYAY6ADvN9iYwFu5wBn7z099duMO8V93SOQ+isFbgOQsWHhG1LvGQmHQrXCmOg7nSAB31Gipf/QpYkB5yDSeXyHsxzd9l7/yxMpABgbuQh5oL/eZ+OIAa8kCGBD+22j9P75Ef3Q+dPjWZEZUoUEkWKB6x/qMfX/D7OpnqzlIqM+9bkIie97zjMsyh5gJnQdjvzYIy7GHUZ2dBkkmgBj10wQdpJrofuvBgBZOgH1u4++Ev2YbSSpxdF5VIAAJPTFmEzaOGF6chXZj4fihg2XvmLx0g72kYiJ3dl6dC5jc/Bz14we39LgQWDgxjfj7bF6lHo+5NyctyemwH6NSS7GfvilAekZTJFGcq19D7dMwA0zu2A/EfO4MY2FMNe+gC9HsObTo4H/TsVQhUoAZhUH2JJg239E66d0mZtAWNgTXRIX4jsQam8EeihEyVZEip5FNgYBm/QABewHVmQHOAtlUssAIjwAAoEAd7MG9pNmH914IA/hh9hMBuHyZwPscLkjRyPHUmGnh1vsNFnGQKazAVbAAGsydGX0BGZ9RTTHRAb5UOLJAGwZcGevB1puYHAGABdHAHaIZsMdh2oVcIFhAHasBpMeYLA2RFHxVReJRHILRJ0QEGbDAXbBAARARIgZFEWPSE+cM+WXcOV8B4+Id5iDZmMgADXfhyiNZcLEAHlzeDaEcIiogHaLhgvUBFf8WDfdhD0MFF7xEAdXgZd2hCoTRKScSGHaQ/oFM853AAIbhne2B2iAYDMwADxaZzVvCCScYCLOgFkjh0hdAFXWiAdDcKNlRFObRTc8RCnzg1QSSK1VGKD6Q9ErSKf2hBrYgO/hawbGNghbT4WLYIA1QwB3fwYS+YAAygAJ1XBvsHg4MAAGVwB3TAb8eoCMl4Q4HRVKvojL4jQpggjedBgQt0V57jRAVUWsJzOOgAA2OgAl2gB2pAb2AHA+QYB+eIBZn3TxBQBhIZbCwwTYOwZPQYbDKGjCG3QQm5idETQpEgDgFQhBDyBQhwPbbHOxGkP+wjPhE3Oj0gDQnABSowehIZdIgmAzOQlGqQkZnHUjmnBrv4ZIRwAmsnB8EmeocgQIazPAnpPrwDP/TDAQiAURDyBn7QI7CQPdrTO7/jP8vzVodTNjkADFyAAn7gYHdwhpmHlEmJBudolC3lWCfgAk8Z/pVI1lBElgcTSWZwhwjIs1TltpDO05KxAz+TUD2aszmAtDu/IzqtE5dy6QsMkAJ+QAGkl5eX2FK2mJRkkJeAOWQz4ANdZQdn+IIsQAHTRGR6MGpblYOG8JiQ+ZmDAzvS4wh6Yzs1sCk0+TfFJDiUwzqPQzfqggO9kAIMYABYcJpzoAVORn9JOQNPqZGP5QNUUJ5mYAd0oAUSNmwtZQEzgJGjtmKJ0DjRWTatQzmM0RiX8yFkKSc+ozFf0xV4MzX1OXFHQ52DcAAPYAEsQAL/RAEP8AAGoAIHMANVRYx2oAXr1VInYJFJqQV2IAdaEAMcSgVVQFhLSQdY0J38FGhc/gWfVdCe8wk3BfpLdwM2XZEtNbAg4fKfaRmgROMxfeE0SfMvLWABF3CISjpmn6aIdqB/WzVsiTgDZUAHdNAFZ+cDJ7psdzAHK1qRCkYFGGkGMcpPvjkILXAyRHo0+iI0VGM3FUUJO9o3v6IJGOMo2DMzNRME2NIDtlIyJ/MvAdMCS1qoY6YGeACMZCal5JiiXRB5M3CiLXcHZqAFkYeUk1cGY7qhLIAIaSowqOUytYItPAAJZGMzk2A7kLEz8TIvjHIqDaMu+1JRteIvJsMy3oIBhqqkRHaOcQZ2YacFGJlqVbBVMnBSatCFZ2CpYOcDt2hiXZgGVeBYrWYIB9Mt/gNzMpAyqrIwpNiCK6mCDwVThNFiCbKCL6Q6CTeAA4JScU23K7t6iFogB+c4rcAqA8SYl/q3qFVgYnbwlzNAZjJABc6aY//6YY51eoYwLu7arrDap+uCK9KyIKwyiuECBrA1IVYyLZJQK7fyKB2nAcPCKxhQAfHaUmTQhejoaTIQA2Xwr2rAnZQ3ZlSgBUtpBx9mfKppBVRgYhjpqwpWCMEysi0gssUCKcgyCbEAss3CKv0ZLp90DzFSLI3yKPdyA5hyKRjQAp3iJgVwsr1aB2RgmLBJpXdAczKrYC7QVRiJsxA2s1SKB8vmf3Qghvwkkn5QAFvbtZdSKas1Ksli/rWTYFQ0sCp+8LTxEhws4SVWEnXbUiZnkiZrgidd+yYnCwPmWLe7KLBJmQZni2I+oLOSVwVkEAd6gLOcNrNdtWd3sAeFNoP2ZSeVuxlGsgZm4gZC0HeDYiELshTAYTxBUAA54iU8clQ/EiT1oQHa0CRI0gCB+auqiYtdKAfAJrqI6AOdV3af12ksAANY4Hh7cI6WenwsQAW+Ngd7sAdosKLLVa1+0ABHAr9JIgENoAFRQhtUUrTFiyXdgIc0xBL1wLg0UCkZkgsckrwLgAAnIiIn4ANXUAZXYE9IeaJaQAd5IAdjG2FbBQNVwILqq3/c21VpAIkZGboEhqLJGr4f/gaA/ga/C4wiCGC/bsAifeAiMCIjC1IQhkJDD5IeEuIl7PEe8ZELpbEGP4Af1/EfXkAGZSAHV6ClV3AFkUW3EBxhBOYCFgqJe5BqVKDBLPDAKSy23KmzJ4DCrWtsANhcC/Afh5EYP2C7BdIHB2IDMDIj4KEMmcNd5kEcAxEe4LEBykEEoyElviMd16EGZ0AHThxZwrcHeLCsoUtsxJi+Z9bFCmZiiLoHYmzJ/LS6Xei6wAZ6p7fGh4EfAQA92+Ec3dFFf8wg3UAeeJYZfbwZ3fAZOxA4zFHDa1ABpqAf+7CUcoAGaCAHcpDCNAfCM1sFYQCJEmlox3cFxdy6GJxi/twLA3JgpWebahDmAkUREtRQAbLBHbeRG7tRD5yhDPIQCpU2CHVxEXcxHhMAGpDwF9CDxIfhf3pwtnQQBySMBsDGveVbpXugB2dWBSbMAosnzV5AzQomA63ZhaJWVTMAIDuYn7OQG5GhGW+Rzh5IZQzUzldBDy1REVwhBA7QgWdhFneQB3pQB3NgzNRr0AHbogKtb13wxC6abxjZzCkmiVVwunRAgClmFmgBBg6wFm0h0iMNEx29zjsgCDYxDxjRDTohDxNABMsAFGZhpXNghiRMvVfAySyAvSS8rE2W0/T4uYbVZBI2A9dcZFhgFkfhEUphF1mBEwjRDE29zoPA/kBQ3QwvEdLbAMAd8REmcQ1mCNNekFzcewVWqsln8GJi3Xl3gLPAxbMKBgNXwMTgdQ37EBAOoBL20BJaARcKwW183QuS0g4L8Qk3oRkb0Q0fEQoIkKynqwZk0NMKVgV4YMGWbVLcSwUs7XJVBdyjS1VWQNsBAdu+kc6nDQqp3Q8/YDuKQAxuIdsx8QlTuyg24AJaQI+0mV7Jtdd+kB54vRDuvNHZnceEkJzRrQ6N8AhxWgn1QguATQgFoAZebQc3XCUZ8woArgMSOA0BkNfPjR/lrdcBYA9VIQGUsDG0QATm8N43QgBd4NVBHV7AZdBdQAZqMAdBnV5VZdBayskWlEBwFJ7iD3BpczAHH3aiJD4D5Wmi4bWLJACheJviOl4IAgCeM3CSnXB9Oz7kRF7kRn7kSJ7kSr7kTN7kTv7kUB7lUj7lVF7lVn7lWJ7lWr7lXN7lXv7lYB7mYj7mZF7mZn7maJ7mar7mbN7mbv7mcB7ncj7ndF7ndn7neJ7ner7nfN7nfv7ngB7ogj7ohF7ohl7kgQAAIfkEAQoAfwAsAAAAAMgAfQCGCAcFCQgGFBIFGRYGFRENFhYOHhoOGhUQGhkaKhwVHyEQKiUKKCsXJCIeKyMbOjMSICAjJyYoLCsvNCshMTIjOzElPjMoOz4sMzMzPz01Nzc6PDw+VAcFYAAAbQAAbA4LahENahcSQDkQSDwuUjYqYy0jYTotZD4wVEoWaV0cUkYnXlMgTkAxRUk3YVMubUU2bk48YVA+cF85e2wqcmIyQ0JBSEhHTU1PUU9KTVFAVlpIU1JSWVhVX11aX2JRdWFLY2Nfam5cZmZmb25rdHhmeHdzhAAAkAAAmAAAixMPswAAuQAApR8YjCkfsScesz8xkUY2iFA+sEo6lmROgWdQgmxTlm5YhXBZkHdcv2dVlnxgf4JxlYQnnIFknYRpgIB9iIx8ooZouZtspYxxrpFxt5h1sJV4tJl7yqxtxqdxw6J9kpWHmZmZnaKOpquYsLWivr69y6iCwKeO0K6Jz7CPy7KZ2LiV3Lyb4L6f1bug48ao6s6x7tCyzMzM1dXUAAAAB/6Af4KDhIWGh4iJhXBwRUVCQD08O5Q3NjdARQUIioMInwgFnaOEAaamooqhj5Y3lDs8PUBCjox9fn59pLu8vb6/hZaJp6YRERLIyBENoJ+pgqbAhgF/qAWboA3HyRLGxIo1Oz1FX3DS5+jpiDeF2KAQCBDy2xIYEBjKzArX6r/XCAq0IbOHr1sEefDgNeNE6EaPfhAj9nKHsCIEY8aQ3ZPwpUEDBSD3SfR1rUDIBhC+1IOgDKPFhKCejZw5kyJCjBm5HWRZBEKDNSZB0vQXFGSBNfKKSJjHzaAxizGHSj23KeHFnMmeItwxZAgEMAADhJwKLKQCsUchdN1REWvWiv7OyMrtVJVpsoIHJdTgAQRI1yJggIo1O/eXWZABjq4p0rUvjxpL6eHdCU9mYbl1t2HYjC8CBht8h7CBg4vNGgzUDl8GZpIB4T8S1rDBBYfNECA8bGA4xnly5T9DVkuNpxmDhuPGd9AajcsPnDVfUB1mIFzaYaOmApOmzebRDg3GkeOF90dI9ZEINB/fwH7DjSJvcN3q44ZNjwKDzTKgfr7s/uumAMGGG/Ph8kYRN7S3gXjdcAJEfxANpAF7NdSwQQY2zNbHLX7Uh0Eo+4UoIoTSiGgiA9doMKB8t7BhQwYbVMgeePhAQGI6LBnHng02VFjhENvRx8YGDVBg5JFIUv5wY4lJNtnABgNyCMcQPtbA44w1UrOkL/dMGOMlltiQAw5DuPGGG2tIQMFmF7TpJgVubikNnG3S6SYGF2BAgQRgvHFmETiICWaPWNoo5y6eaeCjDbDsgMOjsfRwA3gZVGppBm7Geag/mbpp6QWWHoeDJDw8igMslvgIXgSbduLZlzY82kMPOvAQaamP+tjCrrz22iowcPYq7K4VxgrLrLaK00OuV+726yGvXhIrDrHw4MOsyDrKYw7cduttC89Ks6u35IppaqQ9+KCuJNpasoGz4QpSTw031Htsuj701RepOjyqgw45AAywt/H+cgG5AgfcL7W2zqrvuuziUO+7Ev7EW4BejMISS19BQDLLrNfyoIMPI/9rssAFA9NCwAqbTDLJ1jrclxAd7yuJKwlKUEARz06Y8cZDBNFVx0E/rO7RSJucsrguI400EPnOMgTNQ0PC7g4JatDzBozaKnVXQxABNs1BlF02EEH4UDbSS5+TA9JrB4G22WUHDbbYXUFiq7tat/rZsUL85cjgRBReON2IH902Om+rjbjZYhce9uCD582ubgwd2rXUg3/xxRZbEG44EUWMTvfi6ehA9+isk+4I6F+Q48jUuO3Ao+bhhOaI556D8TnooQMPvOlBoK6O6kGMLjzoRQj/BRi+ez577VbKuYE4fpHzfGBrQO/9Fv5ggL/86Mb34wPrwoevvvfQdx89Y7VvsGUP2A/R+xr4u8/+/uGDbnj5EDkfEdLHv/3lDzqeuw39HkIiIDgkcM/Ln2kOSMH9CQ+AEQkC8AxIQQpOsHtfmJqkHtQfIWCCFl/AHxtWeMA2tGENLzygBTEoEQ2Cz3sUfKEOJbhC04ChMTcwT3WGoJwhAEY2K3ShEpe4RBlCj4YjIQL7WsjEKrahh2BgjBB2wLPVfKGIz+thG9wwxjG64YxWPCCJAMABDhxqgPmz4hnnSEYyXtE0CdxiF+fyxcCRIzBmpCMdz4TGJt6IAx7ogBsRAQABrKYAgFSiICc5RxfiL3ZT20F0yP7yBUH4xYgphOEc/UTKUgqyDVtighE60AEAIIIDihTOFmAYSDOV0pRoBGEIhbDFG2xyKDeIBS+bB8gz3vKYfiKjXAgwgRGwgAUjqIADHGAAArjyDy9QJSsXWQgOHIGV11zNFlxoTGTi8oXh0yJuLPHLkRwreeDDXy2PSUdUSkUAFYiBDH5ABRnIAAYxOMEzB1qBCUhBCUZIZAcOAQUkJJKbsiRnOW9ZT/yFjwiRmESYOgkRHuFgZPCMpyQpiUa5GOAHWLBCFapAhR/8M6ADHegPnoCEb26zECygqULDWR0i0JKkhUSn/9LWLx5d4hw9qsHKAqau5A2wfbSUaCELU/4BLHQBCyldKQxAYIIYwDSmWnBCTRUagkJMYQkOvemNpEjOQDbRfVs4nLoG1oIKdaIBfvliBjBAro82NaQ4lKclhRODLhjWCilVaRNY+YIYuCCmMiCDWI9A1gMMogJZUMIRVqlInpKoAFIUbAwt2j8irI1kA+sWBjLAg1165A8RoABGGlCS2trWtvvgR3UOUAUyhMGwWtBCYpmQyBJ4NaZVCEMTkJBQVoYgAYOoghU0y1kOQNdit81udrVhDNk2AIp/cIAWyOBbw3ZBuFjILGdP8NiBVmEMVYiCQFlAAhJMYBBdsEJNq3vfRAiAA54FLw2xkAbyjuG3h+2CTp37Vf4WYIEMWqiCDGJaAfxqIQolyHCGK5yIhwr4w2RIQxnIW97zhgGtnO3ACebr4DSEAQtUiEFMB/FbK/xAxs+0QCJCQNxWfhiKFVCDGgpMXgSHIQsoZmUHSNBeFlRBDWSAMY6faQBBkDe/Ex6oIw2RACmkFaI/Np4MhDzkIhuWDNNlrpJJMOUYQLkLMaawILBQhvz+IKbXLQQMxOrhMANQC2QmcnnJMIX9Ktm4LCaDGrpQBRjElAWCgAGUpUxQQxjACkugLCu37GfUKZrMJDZsGazQhCR8AAQcCAGbWawFOnih0Y925AjUYAYtxPmZIzDED6ar6Q7kGYpOoa12h12S6v48OdChrnOjm8yC4z6zCnQgg4QfTYA/EEDRr3b0QA2hBStAoQQhCPev50LscnM3tsv4xB/yyoO9cmupfnXcAG8YRyVadI9DScCnhRxqKNt4ys2esgzoYIZpx9Syf6iCHOCr7WciHL9YHqgDpLIz7tk7f9AbatpIRq4crLa1t/HIJhCR1KWOTG2Fo3dUJbpEMBBhKGNGtm/TIAZGA9wFX61CHs5g8IEi3ArRhvVAq0yIK1ehvRyWCFuXGNQYZlyuHM9BXWuAjnoZ1a+AFSxQ7biGl0uEAGMgsxpGHGI1ZDumOMcxFvBQ8Cz73Mp4GMOtnznuLii7vTqGiE+lasx6Ov59qCQLFI/Y0Y8vDP6dT5XnKOlZyTZsQSIsEDuRy7BooT8zBgAVaBf00HZq/8EAadjDqwE+cUIQOL8N78c450nRxj89COzaqEQCYPhgyiJsIl28OQnpwsdDBNBkJnvlG97szLOADHuQNsBZ4Mggi37uLCj9IKighjBYoeGcBsbqJ7r7XKbTYzxgp5ZmT3tXfPKIouR+6yu5Bt+nowKfTgOR1QBft7PABTRIQQpWkAY+KP/RrjRreuAFNxZT0icIkYdmDUd0vzBLfNd9uQQdW9AYWBMd4zcSa2AKfQRKxTRJhHRK9gYGlgEM1AdqZUAHDPdoD7AAAxBkfABfy+dKLP5ABwNYgBJXCCcwB3JgBW53gLsASStXS2YyhH4HQlqkSaawBlPBBmBAe2D0BWJURpNURQcUV+lgAPtWBmkQd1QAAyzGAgRgABNQATQYBlWwfAhIB/5ng8/kg9BWB5aXdLsAR/U2UvVkR3cEQpkUHWDABnPBBgFARH4UGElkRUzkRNDjdefAAmIgZPL3fMTXbDKgT3QQd5b3TK7kAmoIgwZICAJABniAB9c3UP01h1MkWoboQj0EHVr0HgHgh5cBiCb0SaGURFQ0WogIOsWDDmNGc/3nBV34aDDwTz9QiREXUyIgACdAB3sAX8x2gBOgBnogB2dIirxgQ6fYQrQUR/4sxIpTE0SvWB2y+EDaI0EdhIjfo4vpgAVowAXIB2fLh3kwUAVzgAdRFokVoAIuMAd6YHMxxYB/cAJqwAdqUI1tuAvYeEOBAVXn2I2+I0KYEI7nkYELlFeeg44FND6mdQ4CwAVcsABhIHqXKIkyQI/2OIqPdn9qYIkAV22DMGYEaZAsAJCJ4FQEVECBpUshFAniEABKCCFfgADXc3u8E0H6wz7iU1qj4wPSwAUzgE/I938xpU8yQH1sZ2OPxl4xAIoFCXAT4JJ/QAVz4H9H93adIECGszw46T68Az/0swEIwFEQ8gZ/0COwkD3a0zu/4z/LE1eHUzY68AsPwAX4pP4FaaAHCiiM/vQDK1lrMsBiMfADksmVWLB8LFAB0PUD9YhmMZV9h4A8TjVvwiOaW/A8RTk9k1A9mrM5frQ7vyM6rfOXgHkIAGAACWAAB5B9M4ACExBcYoAHYoAFkUiVkWWPWmB/VUkFVMCVVtBmzGaS0jZQeZcIoBmasTk4sCM9jqA3tmMDmxKUfyNMgkM5rPM4dKMuOWABY2gBFeBMXwhNFVABNOAAMIAFvWWPWGB/xedPY4AHcnCcLEYFK2UFanAHdKAFDecCAOVem1kFN5gIjWOeZdM6lMMYjXE5HyKXcuIzGvM1XYE3UyOhp3U0OZCSJmqiV5AHaqAFP/CF8v4oA16AB3TQBY/5TC6wUu+1knNwnAN1Ai8lUFpQj2VABVoGoXAjorx0N2DTFdliAwsSLhx6lx5KNB7TF06TNP/SAie6pc9UjAfaoj3qVcNIBnkwozX6bCtVBvW4aHc2UPs0idRXiWIApnJYCC1wMld6NPoiNFRjNxlFCU7aN7+iCRjjKNgzMzUjBNjiA7ZSMifzLwGjpVxqojFAB3VAgC7qVU+GB3XQBT/QZD+wUmpAg2zaZG8aWQVqj1QgUHU6CHcqMKjlMrWCLT0ACWRjM5NgO5CxM/EyL4xyKg2jLvuSUbXiLybDMt5yAZOakjIgB3kgd012Al5VWPWIgnMXA/5VgAUriQdqgAVsWJIopQZxEIpkQAWP1ap/cDDdMjAnAymzKgtWii24kir4UDBKGC2WICv4QquTgAM5ICgdJ3W7sqyP5gVyYI8yuZ9kwIyudobt5QI/0AUrqQfByYZUcF6KpoauVoDTSQjjErAAC6yLui64Ii0LwiqwGC5gAFsTYiXTIgm1ciuPUnIZMCy8cgEUQLD3dwaViGYAp08/sIV8IAevNomX11sDiZ8/AAPtlaNChgdDS6MylmuEECw22wI1WyyQgiyTEAsz2yysoqHh0kn3ECPF0iiPci84gCmXcgEt0CluUgAxdQJEOlA4BwNWmQdmIJxT5gJVKY0ECf5nkyhQMvBgash23rqgLGAFEiuufECQ/wZNhFAAbgu3l1IpqzUqyZK2k5BUNbAqfyC28RIcLOElVmJ121ImZ5Ima4IncPsmNvoDWjAGV8ACwxiqVdBqeJAHUTa4lycDBPq4lXdjj3Wxo8oHxulSMuYCXfBph2sGkXuAdvK6m2EkazCEQyB4g2IhC7IUwGE8QlAAOeIlPKJUPxIk9ZEB2tAkSMIAVGBVY2AG1CigVXAFWuAFDEsGV7C0OBYDF6uGgVsF/OtkGcsH0WZrRltYn6YHBgxfBQiWDHAkEZwkEcAAGRAltEElWFu+WNINgUhDLFEPplsDlZIhucAh6asACP5wIiJCZjzbrcFlBmRgBmq4czBmtM2WXABsdgJstHR2vHIAYRImYzEwXmrAj0NbtC4wnRHMwiiCABfsBiziBy4CIzKyIAVhKDT0IOkhIV7CHu8RH7lQGmsABPhxHf8hdnsgB2egBnIgB8eLB2cQYf/0TCdgBQsrvK+mvCxgmCtpwEJcgDGABXQQB5Uox4z2mKWnAP9xGIkBBNdbIH5wIDcAIzMCHsqQOVBkHsQxEOEBHhqgHEUwGlLiO9JxHWRmB3uwB6FIB3HMwy7lXieIvJXXTzLmx3iwxmMQYQV4o3TwyzIqxBNWbYx8GPgRANCzHc7RHVsEygzSDeThZ5nhyf6b0Q2fwQOBwxxUvAYUYAr6sQ/imssyOgfHuwf0dwW2/Gyv7AVWkM5nIAdxkAdy7AW8jGMw4AV68MuLZp8xUAFFERLUQAGywR23kRu7UQ+coQzyEAqdNgh1cRF3MR4SABqQ8BfQc8aHMaq/HAdCdrjnLMA4Bmg0SAdnkF9DzAL9OQd0YAdkcF6R+0wx6sotnZ8sACBAaKGzkBuRoRlvsdAjGGYM9NBXQQ8tURFcMQQNIIJnYRajytEdHYr0Z59x5gIZK6NmcFUnzQKhaAcoeFXtvLwyAGhXFmEnYBZoAQYNsBZtQdRFDRM/3dA8IAg2MQ8Y0Q06IQ8SUATLABRM7f7URyyjZ0DPLIVjY/DLdhDEWG2DyGcHi4ZeDluSWmBY3hoDE2AWR+ERSmEXWYETCNEMb93Qg8BAct0MLzHU2xDCHfERJnENTm3Ic3AGu2yfE9asMirTWB1nhfvLM51V/ORPMTAC13UN+xAQDaAS9tASWgEXCqFuoN0LktIOC/EJN6EZG9ENHxEKCCCuMj0GLj2JgDbO9OfSMTaPVuAFM33SDuCZ2B0Q1O0bC73coNDc/QAEtqMIxOAW1h0Tn2C2i3IDZyZkYuAF54UFn/0H6cHZCwHRPa3fmkwI3inf6tAIj/CnlVAvtEDak9ub4qoGVlwlGfMKIL4DFzgNAdDZ8ImNHwbu2QFgD1URAZSwMbRQBOYA4XKCrWBI4zie4zq+4zze4z7+40Ae5EI+5ERe5EZ+5Eie5Eq+5Eze5E7+5FAe5VI+5VRe5VZ+5Vie5Vq+5Vze5V7+5WAe5mI+5mRe5mZ+5mie5mq+5mze5m7+5nAe53I+53Re53Z+53ie53q+53ze537+504eCAAh+QQBCgCNACwAAAAAyAB9AIcIBwUJCAYUEgUZFgYVEQ0WFg4eGg4aFRAaGRohHQgqHBUfIRAoKxckIh4rIxs6MxIgICMnJigsKy80KyExMiM7MSU+Myg7PiwzMzM/PTU3Nzo8PD5UBwVgAABtAABsDgtqEQ1qFxJIPC5SNipjLSNkPjBUShZtYRxeUyBOQDFFSTdhUy5uTjxhUD5wXzlDQkFISEdNTU9RT0pNUUBWWkhTUlJZWFVfXVpfYlF3ZER1YUtjY19qblxmZmZvbmt0eGZ4d3OEAACQAACYAACDHxiQGROzAAC5AAClHxiMKR+sJByIOSyzPzHSAADYCAjeFA/gIyORRjaIUD6wSjqRfznUTj3vQjmWZE6BZ1CCbFOWbliFcFmQd1y/Z1WWfGDrWEXSYE7lY07tfmh/gnGYgVGhjEOkjkucgWSdhGmAgH2IjHyihmiwk2u5m2yljHGukXG3mHWwlXi0mXvGln3gg23tln7Gp3HDon2SlYeZmZmdoo6mq5iwtaK+vr3LqILAp47QronPsI/LspncvJvgvp/ou53Vu6DjxqjqzrHu0LLx1bjMzMzV1dQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/gAbCRxIsKDBgwgTFuzTBwiQHjtu2KhBMQaMGDuAFECgcCCCjwgKdBxJMIBJkyIVhnxoMQbFGjZu7OjhkOEiRowWkdzJs6fPnwUtJjxpMkIECUiRRmgA8mNKgSaBGgzQCGWBjSAbHE0qwShRhS9q3ACSpo/Us2jTIoxRECtICAggyN0qAQMEDEqZLriq9udVBAu0IrWLt2sEuXDhNuVIMMaNvpAj93SLuDIEo0aR3pWQpkGDBaD3SvZ5tUDoBhDS1IWgFLPlxCCfjp49mzJizJm5HmYNBEIDPKZB0/YbHHQBPHKBSJjL1bBRy7GHSz+7MfHl3EmfI67hwwcENYAD/oSeDjT0AvHHIXSvURl79spOycvvWJ150sKHJbywsWNHdyBqACeeefP9ZB5oARyHBxDd9WfDC8vRhd9ucMlWoHz1bYXBhnhFgAEM/PmQRx845YEHBlQdeCFQpjFAYCMS4JEHTn3k4cMONsCAwVEcTlhhIz6sKF1cGmKgwZFG1kDTiDgx0gceaaB0IANCSnWgcSYFSCKNeTxUgwZGIokfXI30UOVoCGh45AZsbhADEHzgdNMie+RxQwEDmscAlWeWt+eVJu2Qxx5z4sQHEDG0uYGYXXG0Q5+QDaYBmy+8sEEGMMy4yE2M1IlBSHuGKiqkUolqKgNXaTConDflAUMG/htUyiaYeEFAalqsGckmDDBUWqkPW9KZxwYNUGDsschScGupyTbbwAaDctqHD76+wOustVK1rE93TRrrRRbBMIMMPuzBxx54SEDBhhe06y4F7m4rFbzt0usuBhdgQIEEavBxLhAyiAtur9jaKu9OHmrgKwww1SDDwzHdEAOYGVRscQbuxnuwXxm7a/EFFh8pg0Q2PCwDTBb5CmYEG3fk4bcwPHzDDTTYEHHJD/uqws4899wyUPD2LPTOlcYM08w2i3VDztfu+PNBL18Uswwx2YDDzEg7zOsMXHfttQpPS7Wz12SLa3LEN+CgtkRaW7SB02ELVNcLMdR9dNo49Ncf/sk0PEwDDTMADrjXcf90AdmCB9431TbPrPfabMtQ99sSxF2AfgzDFFN/PEA008xX20ADDqP/bbrghQOlQuCKm0466VY73l8Pne8tkUuJSlAAEE9PmvnmPvDQXefBP6728cibnrrYriOP/A55z+QD7cNDxHYNiWrQ+wYM2yx9dz78AD7tPJRf/g484FA+8sufNQPy6/OAvvnlBw+++N1BZLPb2rf84dE9+I9DBviDAhaQfgg8XvvQ8j71IdB84itg+AY4wPyxTUeMOVj3pDfANKRhDGMgoAF/AIQR0m+BaaEB/UbIQhI6BIRpIItDpoejGvBKg2EJkUM86EE1fBCE/iEEIhBNyAMUqkWFPBihEEEIBCGmQQ0+9OAMa2gteW1ALP4hyxMDhAcoenEMagDjEkdoxL7ggIVCDKMavQjFLkaRQTXcwLZugEUf9BAPeHQjG/cYRhAasIyQOeMP0sjHPeYRSh68ER0fQ6odOCaAT8yjiQ5JyT0KEZCR4QEQDUlJSk6yi2mYnsQe1aceYIQmacBjHlZ5SD3oAQ+vPKQlMSkZTYLRi5R8pS4luUoTqaFBMTBTlXygJB8ASEardKUyl7lMWUKRlqP5ARtbycxq6qGXamBQD2rAuxWloZhP7KUe9jDOce7hnNY8JG0MUIEUlCAFIpiAAxRgAAIUbpB5/rTmOfdJTnJe00SJ3GY35/PNAJIlQObkJz/Phc5mSuYAKWiBC7CgAxewoAUtSIFGN1oBBYStAAhVpkJHuk9X4jGG06tBlMiTBoH4x5iphOU+/UXTmipUD6OpQBa4oIUsZIGiFm3BOzfK0QOEbQywTKi5ampTdIIylD3YZgxWOpwYxCSqTUToOZnKVX+RczYt8IIXuMDTn1b0ohklKlErYM+njcGVW+1qU18ZRm3iyCJUHc3RkghGPCqVq/zE6WgMkIUzGHasPf2pC4I6VLVudAIdAcAAAHCmtya0q4HFYxh/EJGJhKulkOGVDEbH176KlKToHM4EvPCGNRj2DGTt/ilQL7oCx26UBB0IQUIEwIEOcABSP0gqahtKVz+mr2+8ushZevWC1QVObUkcZBuTCteSCnY4JWDDG9jAhteSoaxZyEFQ0+pYLHygAyAwqkEmcAYi+JaypJImXBPaTDeO4YBqG5wKKtWRBvjnmxnAANlGC93S4tKvJi3QGezwhu129wyIlW1FMWpbHbAhCB3oAAkOwoU5CCHDA5BXAaSJ4Fhqto8/WB/pBtc1DGTABlD1TCMiQAHMNKA0OM5xjvfClxUZAA53gMN23/BaL2hBwoslL1HfQIcP59YABalAIJqc4d/uNsSQ0rGWt6wVo9S4AdBswR3uwOAGPxixPxXv/kUbq1EXBEIMTu5ABQqihUJYwckeEABCBpBhPUPzzwLJwpjJbObDlhULWFisC2pL1DMU4glC8ECGR+BRgTjgDnU4QpwrbZAkfNjKgIbmGgZd5tYe9shmdQGFN9oCQNTBCHEOgQMGggVCVMEIGM6wbg2SAiZ8OtR/fsOgCc1dQyNZ1Y3NAiHCAOsMo3fWAjlDIJ4whFzn1iAC6IKm+wxsWrpg2HdoMJEhbOSfJhrZG+XCH6AwhDiDALLRjoMRqu3sDRekBF1odgcS0G1MEoANwy5zkVFNUbRu9AxtUEK7JZ1beDfiDW5ot7VHYBAuTAHXVe43JksQcHG7NsJARXcK/s7gBiQIIQgMl7VABGAHNBTh5M4WQZTfEAV6XzvUzrnxlndemj6RoePbNSxZfZpo2moU4i9HeYZJAG0F3AENOUgCCUJAghGkoCAtYMMSIq3rKvH8612m8VI+0oj/2iDAXHMugR04yFvmU5maHeh0KmCHYRf6DGTQAhYkWtFF1xYOccBCEogQAqqnAN5SlkMWlJwC+ArEBWvgQg40WvXp7I6LcM8jFI2bPtKRbQYuhvGNPLMRhDDXuaNTXwHdTt3qLlMNP5gOFoYt5AeTPAckSMEKTPCABCTgAXXXAgvYPOdGVMAPgeCCC9jcVoHoAA5nWPxGaSPfZRI3lpvHr+dn/rDfF6ClbsklsIERPFx/4iH2szkAwAdtZjYA4gwg0LDMCTBPAMBBEF5Q9VoFYoA7EAINe0dU6vV4d8AGyrdRftYXwVVdMxVY2GdcpBMwvMIWfZEGE7hX0uVXMwVY1jUGs5ECdTdmDWYGdjAIYFBtHDACJRBUKQAH/xeAGyVzAvEGiRAHWcACAkgQK1CAB6hRA4gWlrVQTOWA2ccDbPNZkhEAFmhVMhE+prWBcsVQruSBkoEFIWgHZUAGgVAHT4BxIZACQbUCb0AIiucCajUQZ1CDN0hUUDYQKRBukrdRbXgWQbhUUSiFXRRCnmMDeKUtSaiELvFSxyRTcYVZmUWF/n0hAF5AZmWQAGtACF/gBBjXASnAApaYdYjwB1pghkSFZSyACG6whnJIEApgB23gBTqwUZz2E0jFgHbIgeR0UmPQINgTJX44GnhgEgUFU1o1Ugx1U3CnBhZyFgbABlQQYphmBU5QbZJGAhK1WGSACHLQgzFYAQKQAoFggzg4igSxBn9wBpyYAqvIEyDVekplLujogKCkTSplEngwHXmgBkoITmkgTuU0UtV0SPfVFydwAgDgADowZU/QBDbnjIqmbHewibalU4FQhmxIEBNwB4YAjo/1E/j0dqcVWP70T6CUUlGiBnkwH3kQAMRkUAGSTNbETM4EReh3Fg9wAo2g/gBcIG1d0ATzxnAj8IwuEJDJF44atQIY5QaDYIM+CW0CgQWBgAioyFE+IU0HZo4p2UtQok1vEgAheSEjaUovFVPJRE0mtpIgVERncQICcACFdQaIcAXzlmsgEFEHOQiBoJAbtQI6UJd2QAjaSFQiMIdnMAhKGY7FtxO2NE25lFT5xEpTOT3BZJVVkpWPpEWS1Ekr+UVhOZaN4AJ4dwaEcAZSQAQfAAJV55aLxQWEcAfU6E6IJmiE8AbSp1YWQE9wMAiEwAXbeHg8MZi3FCDTJZmI6UOihBGMeSa5uEj/5UGTWUhjlGIJQX/tlAIWUAEVIE8OgAIOQHTS9gb6R1Q6/qmZpumTKeBTXOB/b6AFjLdRLOB/yVebRtkR0UVIhfSUURRKESEWAfCOkJIGCHBFTchDkaRHbCRGKDZCOCAQB2AAAqAAzWlbCpoFgfAHrclqLLBYbFCa+adWPuUFf7CaW1Cb7rRRWoCeXEBec6gQgmRAS/SebsRDcERHG4AAoAUpfNAIvQITWaRFPfRDfrRE93VA5UMDCvqjjsWgq7l82hmhLjCGd7CUROVT0kYIcCCXGrVqH0oIgBCiG9V8CYFE0dV2QsSlY/BE/DlFE1FFGrRBBrVDPyRCLcSjPQqkbhpR/ncH4EheGBWhdymnOqBkP9Wk0+iTEVpbqimn5DUS/lq6pWs6QDAkRQ6hPzYEAxuDn/9zVQJEQSz0QPSjNjPwpkB6B4cQCGiQp6zWAiygA3GKBg9aAojWpHKanWCIbIJ2CHdABmnlcAjRQJZaPi1EQQzSIBf0KS8qL76jOd/THfgzPbeqYseTqZrqWDuYiWjAqqLKAlmQoZ76oCvwU1wQCIkACKhIXosVoW8ACJlopSmApQbRQAV2q1F1P+DTHVkDA4sSNsFKo8NKPJ7TH86TPH+jAsuqVgGZCIHgBjrAAoz2jFsgroHAmhf1kzqABVkACAD7qWnVAkU3ahAblzgYmAehAqeTr8ejN8JDPfbTWRQBr/3zMxqBOQ6DRbNT/js9gDU4YDOlczp/Ezj82q8atQXaagismZ18pwUQi5ebOLE+BbQA6wZYsI06QAY6wAV1p62BIH3rWRAcKzgr5jo1gzU3ABHkYzsTYUMQsjtxMzcMczKNozZ701k14zemwzpecwG21QJbQKeX6AU7a4OgGlEOK2iJcAjTmLcucGRs4AeJ8ILbeJYhSAiJcAdrOLUDcThdMzinAzFZKxP4ijU4kzJ4UTjvGDUWITN4o7UTIQMzIDCfx307o1YU6wVx4AXPuLdZ8AaBoAhkuAUDq1HSugWvigimmbTvlAVksH6E8H9ZwIlacAZAdgfaurhJa5sb61yfZ7pmC7NrgzNS/rMoLHOVYaMGMzYp1jI1ElEzN/Mwp5cBQ8MzF0ABRUtybxAHmuiwZCVWslu401i8taUDW+AFZ+B/vOsFvtsChlV3foAIiECUGpUFbjBmfqC4m3mDJUCrAhE056sC5ls0EIM0ExET5Ns0LPOrYdNSdxErRdMwD3M3MoAxF3MBKtAx7lIAI0dqDSpWaBAHcvAGcAAIwysHXpAFoLpTyOt/i8sFzcsCZyBsyosIpVm876QDcTBm4tq/SjyijVAAKszCF1MxLjYySVPCE8FcL7AyjeDBcRMkrOEt1gJ+W1Mu55Iu64IvLPwuAtECRux/f3AHf9CggxYIDbnDoLoFRTxm/orbu2mFBgo8vAmrBbdLqmMmmwnLBTeosRH8xveiLxSAB+joAxI4MJayKMsBJEbUAwWQK97CK831K8FSJxmgFc2CLHwyAQl8xImAxIGQxwl7BrZ7wAt2BwscxK25iMo7vHKqd2a4BYagy3r8dIjcAlLMAMfCzMkSAQyQAdFCI9RCwaSMLV1BkrTEGnVhxi9QMZmSE5yCyguAAKcyKo1gAPt7B35JCLNMZncACIBAZMV7wEYcCMP7BzvMiXIwZoEAl0TWU2bIBYjgB34ACOF2BpsIycx8zqiCANK8B6zCCK4CK7KyKIVhMLT0KGkiKd7CJm8SJzlRIniwA3hyJX8i/hAEIGjKGwh+MGzyHNCcGJ7+7M6t+1MEW8fxPMsBvYYugAgITWaGlQVXRxAL8CcHkiA7YMmFwgiHEgOwMitgohQZBE1mQiSDESZgogFKAgQjIi0+JCVXMhAuYAcGDdMvTWSObIZogNDIN8tuUG7LJwh2Z1h6h1GzJ4KuRdRYetQHgicBAEVb4iRdsk1bzShdQSb9liFZvSFd8SE2EEBMQtF4QAEmoSei0QgtOGYhaNB24FqOnIp2S3sQdtcrcMdjJmR2naeF5QaupZA/WByhQRWVPCOEfSM5siN1wSFKIRchoXEDUR+XcR9jIgEgAhH/AUUnrSKNIGYvTdqljVH//lzXCr13WNDWhHZqPHy7bHUQgFKOuzoTORIhGvIevj2M3cZIwn0ddNEalcEdPtAAwngeL8LSnB1u3UUGxRu7tPdgeocFWkAGZ9BdxZtRE2Cu3j3be6EGDbAe7dHe7g0b6A3cNiAQtjEXmNEVuiEXEgAESwEcBEIA68x+D8ZThrUGQBZ0Cs3DyBZPjrcT5nEcnqEc9pEduIEYTTHhwD0QjGThTfEa7L0V3NwZn2EaV7HSY8YGOrACbGZ1USpRKSDFLGLkgdEAqmEXraEd8KEYZLfjPSExbbEYH3EbGrIZXfEZIYEAKQDJ05HmgVHmPuLbXA4SXt4XO2BDCkEU7nHmwLHxESK8MBSIEDreCGly44sx3Obd51VNEI5a52rREA9BshVRNzTx4wRhIRZdLZnzEpxeA7c4FQGA43OOJ4Se4wFgF9URARSxOTQBBGbh6LAe67I+67Re67Z+67ie67q+67ze677+68Ae7MI+7MRe7MZ+7Mie7Mq+7Mze7M7+7NAe7dI+7dRe7dZ+7die7dq+7dze7d7+7eAe7uI+7uRe7uZ+7uie7uq+7uze7u7+7vAe7/I+7/Re7/Z+7/ie7wQREAAh+QQBCgCNACwAAAAAyAB9AIcIBwUJCAYUEgUZFgYVEQ0WFg4eGg4aFRAaGRohHQgqHBUfIRAqJQooKxckIh4rIxs6MxIgICMnJigsKy80KyExMiM7MSU+Myg7PiwzMzM/PTU3Nzo8PD5UBwVgAABtAABqEQ1AORBGPCJIPC5SNipjLSNkPjBUShZYThZtYRxSRideUyBOQDFFSTdhUy5tRTZuTjxjVDRhUD5wXzlDQkFISEdNTU9RT0pNUUBWWkhTUlJZWFVfXVpfYlF1YUtjY19qblxmZmZvbmt0eGZ4d3OEAACQAACYAACQGROzAAC5AACMKR+xJx6IOSzSAADYCAjeFA/jBwfgIyP1OTGRRjaIUD6wSjqFdDKRfznvQjmWZE6BZ1CCbFOWbliFcFmQd1y/Z1WWfGDrWEXlY071aVrtfmj1dWh/gnGhjEOkjkucgWSdhGmAgH2IjHyihmiqjW2wk2uljHGukXG3mHWwlXi0mXvgg23tln7Gp3HDon2SlYeZmZmdoo6mq5iwtaK+vr3LqILAp47QronPsI/LspnYuJXvtpvgvp/jxqjqzrHu0LLMzMzV1dQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/gAbCRxIsKDBgwgTFvzzhwiRID947NBB0UYNGz+IFECgcCCCjwgKdBxJMIBJkyIVhnxo0QZFHTt4/AjikOEiRowWkdzJs6fPnwUtJjxpUoKECUiRSnAA8mNKgSaBGgzQCGWBjSAdHE06wShRhTR08CDC5o/Us2jTIrRRECvICAgiyN06IUOEDEqZLriq9udVBAu0IrWLt6sEuXDhNuVI0AaPvpAj93SLuHIEo0aR3p3AxoGDBaD3SvZ5tUBoBxHY1I2gFLPlxCCfjp49mzJizJm5HmZNJIIDPaZB0/YbHHQBPXKJTJjL1bBRy7GHSz+7MfHl3EmfI9YhREiENoAD/oSeDjT0AvHHI3TXURl79spOycvvWJ150sKHJ9DY8eNHdyJtACeeefP9ZB5oARynBxHd9bcDDcvRhd9ucMlWoHz1bZXBhnhJkEEN/Amxxx847aFHBlQdeCFQpjVAYCMT6LEHTn/sIcQPO9SQwVEcTlhhI0KsKF1cGmawwZFG6kDTiDgx8ocebKB0YANCSnWgcSYFSCKNezykwwZGIokfXI0EUeVoCGh4JAdscmADEX7gdNMifezBQwEDmtcAlWeWt+eVJv2wRx9z4uQHETa0yYGYXXH0Q5+QDbYBmzTQwIEGNcy4yE2M1JlBSHuGKiqkUolqagNXbTConDftUYMG/hxUyiaYeEVAalqsGclmDTVUWqkQW9K5BwcOVGDsschWcGupyTbrAAeDcvqHEL7SwOustVK1rE93TRrrRRbVgMMNQvThRx96TFDBhhi0624F7m4rFbzt0utuBhhkUMEEbfhxLhE3iAtur9jaKu9OHm7gaw0w6XDDwzHxYAOYGlRssQbuxnuwXxm7azEGFh95g0Q7PHwDTBb5CqYEG3fk4bc1PMwDDznsEHHJD/vaws4899wyUPD2LPTOlcYM08w2i8VDztfu+PNBL18U8w0x7dDDzEg7zCsOXHftdQtPS7Wz12SLa3LEPPSgtkRaW8SB02ELVBcNNtR9dNo99Ncf/sk5PJxDDjgADrjXcf+EAdmCB9431TbPrPfabN9Q99sTxF2AfgzDFFN/QEA008xX75BDD6P/bbrghQPVQuCKm0466VY73l8Qne8tkUuJTlAAEU9PmvnmQgDRXefBP6728cibnrrYriOP/A95zyQE7cNDxLYOiW7QOwcM2yx9d0IMAT7tQJRf/g9A9FA+8sufhQPy6wOBvvnlBw+++N1BZLPb2rf84dFB+I9DBjiEAhaQfgg8XvvQ8j71IdB84itg+AY4wPyxTUeMOVj3pDdANrDhDGcgoAGHQIQR0m+BackB/UbIQhI6BIRsIItDpocjHfBKg2EJkUM86ME2fBCE/iEEIhBNCAQUqkWFQBihEEFIBCGyoQ0+9OAMa2gteXFALP4hyxMDpAcoevEMbQDjEkdoxL70gIVCDKMavQjFLkaRQTXkwLZ4gEUh9FAPeHQjG/cYRhAasIyQOeMQ0sjHPeYRSh68ER0fQ6ofOCaAT8yjiQ5JyT0KEZCRAQIQDUlJSk6yi2yYnsQe1acgYIQmbMDjHlZ5SD7wQQ+vPKQlMSkZTYLRi5R8pS4luUoTtaFBNjBTlYSgJCEASEardKUyl7lMWUJxNgJ4gAUoYIADCGB5Q2BjK5nJTT70sg0MCoIOeLciNhTzib3kQx/Uqc4+uLObh5TMASzAAhnMYAYw/pCBC1jAzxFM0wBhG2Qeu+nOgq5znd40USLFSc75mDOAZAlQOw1q0HO9s5mRUcAMusAFLmxhC/iUgQxMwM+SsmAEAP1ZASSqTIq6tKCuxGMMp6eDKJGHDQLxjzFTCcuC+uunQKUoHyRjgS6E4Qsc9eg9RbpPk5bUAgd42hlgOVFzATWo7wRlKIMgThvYdDg2iAlXmyhRd171rP5a52hkoAY1hCEMXeDoR0MqA6c61QIEkKorzYpWrL4yjOHEkUW+OpqjJRGMeKzqWQ06VHluQQ5tdStSO7oFH8xApCS1a0lHEFW9ThStjMVjGIcQkYmEC6eQ4dUNRndYxLb0pe+k/g0F1CAHObghskdNqmXz2VTN8tMChRsCVWF70b/6MX1949VFztIrGqwucGpL4iDbSNW9wrSxwwkDHmrrhtuqoQuTVSpvfWvSlAa3DXudaDPdeIYDqm1wLahURxzgH3NqIANkW210W4vLxMZ0PgeQQx5qa9u25paylhUpeTeLwgJk07+xFG0fh7A+0g2uaxnQwA626plGSKACmHFAaUZMYhLvhS8rYkEe8rDd2rbVqJOt7GXrumB+KoCWAimxjnesFaOA2AE45sKK8zAHFxs4xrvVZ41PiuMmS0YNQ24xZL971I76wAf5pHGNnczltAhAwEMm8G1hLNeljnTJ1+yy/pp/IuQoczeySIZBPjO74Lyu+c47UQCYV1zkKRs1ruJVco3tjOdCKwQGQ17xmyVb5hkvmdCGjnRBCADlIff5tgfmQpJ769s0S5onzhHxjkddmj6ZINEDNjJcyzzeBdOS1LDu8YeX8pFG1HcH9+Xac/XrwEHecqDKFG1DyfOFRBfZu1/4QkevEAMVQCABDICACFRg1xEsb3dcDHYeoXjc9JGObDjI8IZv5JmNIKS5zx2d+gr46+pad5ltGMJ09Oxm26YBC1dYQQjSHE3zCiDaIhgBk9MygAHQJpvMLG4sue3eb+MgvjRAS92Uq1/++pe4CNWDvGkjg0TXFg0QGIgB/ixgAhlkmQX/9DQFgHsWA7jAAx7wtFqEa12fMnbhxyVdwHjFlr6wgeeGnW5ifbrY656BNl2IMhYY0IgRzKCjHk2woPl5Abw2orNAoTQYiuABg6vlDDW3KlYvynAgsO20kgnAz8Mqk/C5luh9tagrjy4ZSrMYCwlohAkka+V73jPLIlXwjc8yA0Aw4QMe6EBawN7OuP80q4D13A4Gq620q90lOj1mT/kK2tDSHTIKgMMVBAIDt3LB76hPvd9FOgJqypwkFshDGY6AeBCcZaphjztMZXqGBmEvSpUfjR5M8tCdltWlFhVqsNtgobOgIAWNEIAPwqBUv8NA9ajPclMt/pB3gjzgAJAeCADUAIgn0D7x4SfJSt1dVXO5/+agDGdNTaKH6eyhDWo/JxvSyU6XcvOQ7aUWEIACjUABXABXmoZ9qXdlf6dgVPcAD6AAD8AFXVBXWDcQI5AHYJAERgBzIJB+HSFQwPZajIVQCQVKNBUlbbAH87EHAUBMEBUgydRNzORMULRxZ3ECVxdXCGhZCnhPVxaEl+UCgcdUewcIalACJcByBNFxVnAEXOcBJfB6IahNEEaDrtRLUBJObxIALHghLmhKOsVTybRNEWaDIFREztcIM+BWcuWD16d6lhWEdOgDleWDaiAIh6AFH/ABJXCBbCgHTWAEUVgCPWFL/lbYSlQ1UKy0hdMTTF5YJWH4SFokSZ1kg1+UhlIBASfwAGoQXiCVT3ImZ353ZZX1UaiIilEHZYdgCFJAeyDAAg9AEFxQB13wAkpYAta2E4h4SwFCXZfYiD4kShgRiWcyfItUXx6EiYU0RhQ2EgJwANI4jSpAATIQaExVhCYHhHaYilXgA1BHWXIwCIdABk9gBIhHAixwAXb2BYWgBjNgUrzIbptUSIkYRaEUEWIRAPUHKWyAAFfUdjwUSXrERmI0YSPUAwkxT1NXYyZgAkQYeHE4A93IBd9FUuAIdVuAB4dwB2KgBOgohSUVVV9wCHSwBb1FEoJkQEtkj27EQ3BE/kccgACoBSl+0Ai9AhNZpEU99EN+tETtdUDlkwOTdgElx2lLVlIRKVJxeGVcIGBcoITXGI56OAZTAJKIVwImdQBdkAh1wAVaNhJIJF2+JkRleQZPNJBTNBFVpEEbBFE79EMi1EJCOZQD8QAgRWdJaVdLuY0z8FiDkAdL8AEdwAIZuQVfMAiAEAVOkARRqI6bxQWHEAdbkFm7mBBjSZZ0OUAwJEUOoT82VAMb84//I1YCREEs9ED0ozY4QAD1hJR76VQQGXh+R34diZUlcI2VFQaJ8AZKkATnF4ucxgWDIAco+VsK0UCqWT4tREEM0iAX9Ck1KS++oznf0x34Mz3L/llhx4MDsBmbshmRowgDclAIhjAGWOkBLPBRPqAGidAFSECIMFcCRGhSanAIxrl9CdFA+7WcXHU/4NMdWVMDixI21amT10k8ntMfzpM8f9MC4LlgLiCe+OQDedCRZMCBWWmKcpAIalAFS6CE6ohZ/DQDF+oGPqCfB9ECp9Ogx6M3wkM99lNaFEGg/fMzGoE5DoNFs1M7QYA1PWAzpXM6fxM4EBqhdjWb9uR3xHkHZpAFHMh1JfCXPuAGhzAHx1lS9nRmtrkGlYmcBsGigmNhrlMzWMMDEEE+tjMRNgQhuxM3c8MwJ9M4arM3pVUzfmM6rOM1GICkThWR3OgDiWkH/lDwm4/5l1twn3kQBpy2pURYnoegBlzwVAZxOF0zOKcDMWYqEwyKNTiTMnhROPUXNRYhM3hzphNxAzggMOD2cDvjpyzwkBRKkZXVlVrwm+dXmOx5nyY5A721pdd4oYfgBltAqQUxNq3KqnMKpGuDM1KzKCzzhWHTBh42KdYyNRJRMzfzMOimAUPDMxhQAX/qBXWlT93ogzNWhBRpZWqACF+wBPIJAuqoVF1wCIewqJfFT5pWV8Vmr5KaWbM4EEHzrS3grUUDMUgzETHBrU3DMtMZNjh1F7FSNA3zMHdzAxhzMRjQAh3jLgXATy5wgHKwBjLglHHlBeClbExVT08X/lc+EAeTCQMuAJn8xFFtSI558AXxyE9f8IlfIGD2Sqw0RmgFsLEdezEVk2EjkzQWOxHNRQMr0wgPGzdBwhreYi0TtzXlci7psi740rHvYk+0tV2BIKlGpQZrsAbdpQZZyk9bYFTUpwaFkAdty7PKhgfkaIsyy09qMAdzgAd4AAiJgJ9bUFcXQBD2ArYbYix64H5CsHMDYymLshxAYkRBUAC54i284ly/Eix1ogFa0SzI0gAWwAV/u2KDsAZxUAeBUAd14GI+4FSIGQaRZa9rAANOFVkX6pU621SVtmKCoAiH4KW4O3iN0ADHgrzJIgENoAHRQiPUUrCbiy1d8YK0/sQadXG1NFAxmZITnPK5C4AApzIqLABm5HgIiHAIgVlbX6BlJYq23nUIihAIYZCv9WRbAia8dKCzNOYGiSYIiUAIawCWTIi844sqCOC8fcAqjOAqsCIri1IYBkNLj5ImkuItbPImcZITJaIHP4AnV/InjeCJLCa/whuYeOAGOquXMxAGazBl8jsIcYBl/OQD2zUHgCC8tmi/e5YH5Ei/KZpmC/AnB5IgP9C4hcIIh2IDsDIrYKIUGYRjZkIkgxEmYLIBSkIEIyItPiQlVxJ9QgYIhTAIgrBieGB6p9dUMhAG3IW3ijAIkgoDGElkeBC8JtkFPlCueDBkgoCzXxC7/gDQCEN8IHgSAFC0JU7SJeJ0xYzSFWSyZhlSxRvSFR+yAwHEJA2sBxVgEnoiGjKAw4AACHxGYJKqZXEQCAN2oW8sB2nMAiaKuvqLx3XlBf8rCIIgB10wAyNQHKFBFRUgI1xyIzmyI3XBIUohFyFhaPVxGfcxJhMAIhDxH1AEwipiAT28XYCLy1pGB4qmyoHAyvm6BUN2vnHQBYXLAr+bB6I8B5LKAoCyfs85EzkSIRryHsjcfGrGSMt8HXTRGpXBHULgAMx3HgTiAqi2xz4cB7jLT2GQaPIbCGuQy3WVdMCrvnGgsjJQW0nVUTJgAQJgHujRBg6wHu3Rz/4MG/iM/mc7kGNvcRuY0RW6IRcTQARLARwEQtH/a5JatgZDBgj2CtGyjM6Jtr4qi3IgaB7H4RnKYR/ZgRuI0RQpHWmMxNItbRm4oRlI0RmfYRpX0cO2XAhy0Ftthrr3+l3n/JQ9nQdr8McmwIQEcRV7ERgOoBp20RraAR+KUWufNhIS0xaL8REuPRib0RWfERIIYMaDYAdlAAZUsARL8AIw8LMrBgiCwM4qC1wKkM6fWJnmJRCGHRgaMth3HRd/vddn8QM2pBBE4R6EHRsfMbELYwM39sqK9olR3Qhp4tSLwcz27NpRTBCiadpS0RAPQaMVUTc00RQT3AhPUWwPXC2Z8xLSsK0DwTcVAfDUeR0SVLEYeGIX1SEBFLE5NEEEZiHctyIAlXbGcDUDTMgCXeAGtlW/LACC5m3eB/BYtqWzbk0Q9F3f/j0QBPAAVPjfBF7gBn7gCJ7gCr7gDN7gDv7gEB7hEj7hFF7hFn7hGJ7hGr7hHN7hHv7hIB7iIj7iJF7iJn7iKJ7iKr7iLN7iLv7iMB7jMj7jNF7jNn7jOJ7jOr7jPN7jPv7jQB7kQj7kRF7kMR4QACH5BAEKAIoALAAAAADIAH0AhwgHBQkIBhQSBRkWBhURDRYWDh4aDhoVEBoZGiEdCCocFR8hECgrFyQiHisjGzozEiAgIycmKCwrLzQrITEyIzsxJT4zKDs+LDMzMz89NTc3Ojw8PlQHBWAAAG0AAGoRDUg8LlI2KmMtI2Q+MFRKFlhOFm1hHFJGJ15TIE5AMUVJN2FTLm5OPGFQPnBfOXJiMkNCQUhIR01NT1FPSk1RQFZaSFNSUllYVV9dWl9iUXVhS2NjX2puXGZmZm9ua3R4Znh3c4QAAJAAAJgAAIsTD4MfGJAZE7MAAKUfGIwpH6wkHLM/MdIAANgICOMHB/ECAvMMDPU5MZFGNoV0MspJOtROPe9COZZkTot3Q4FnUIJsU5ZuWJB3XJZ8YOtYReVjTvVpWu1+aH+CcZWEJ5iBUaGMQ5yBZJ2EaYCAfYiMfKKGaLCTa7mbbKWMca6RcbeYdbCVeLSZe+CDbcanccOifZKVh5mZmZ2ijqarmLC1or6+vcuogsCnjtCuic+wj8uymdi3lNy8m++2m+C+n+i7nePGqOrOse7QsszMzNXV1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj+ABUJHEiwoMGDCBMW1KMHCJAeO3DcsEFRRgwZO4AUQKBwIIKPCAp0HEkwgEmTIhWGfGhRBkUbN3Ds6OGQIaJEiRCR3Mmzp8+fBS0mPGkyQgQJSJFGaADyY0qBJoEaDKAIZYGNIBscTSrBKFGFMGzgAIJGj9SzaNMilFEQK0gICCDI3SoBAwQMSpkuuKr251UEC7QitYu3awS5cOE25UhQBo6+kCP3dIu4MgSjRpHelYCmQYMFoPdK9nm1QOgGENDUhaAUs+XEIJ+Onj2bMmLMmbkeZg0EQoM6pkHT9hscdIE6coFImMvVsFHLsYdLP7sx8eXcSZ8jtuHDB4Q0gAP+hJ4ONPQC8cchdLdRGXv2yk7Jy+9YnXnSwoclwLixY0d3IGkAJ5558/1kHmgBHFcHEN31dwMMy9GF325wyVagfPVthcGGeEWAQQz8+WCHHjjZUQcGVB14IVCmMUCgIhLUYQdOetjhww43xIDBURxOWKEiPqwoXVwaYqDBkUbaQNOIOCWiRx1ooHQgA0JKdaBxJgVIIo12PGSDBkYiiR9civRQ5WgIaHjkBmxuIAMQeeB0EyJ42IFDAQOaxwCVZ5a355Um7WAHHnPilAcQMrS5gZhdcbRDn5ANpgGbMMCwQQYxzIjITYnUiUFIe4YqKqRSiWoqA1dpMKicN9kRQwb+G1TKJph4QUBqWqwZyWYMMVRaqQ9b0mnHBg1QYOyxyFJwa6nJNtvABoNyqocPvsLA66y1UrWsT3dNGutFFsVAwww+4JEHHnVIQMGGF7TrLgXubisVvO3S6y4GF2BAgQRp5HEuEDOIC26v2Noq704eauBrDDDZMMPDMeEgA5gZVGxxBu7Ge7BfGbtr8QUWHzmDRDc8PANMFvkKZgQbd+ThtzE8jAMONdwQcckP+6rCzjz33DJQ8PYs9M6VxgzTzDaLhUPO1+7480EvXxTzDDHdkMPMSDvMKw1cd+21Ck9LtbPXZItrcsQ45KC2RFpbtIHTYQtUFwwy1H102jn01x/+yTU8XEMNNAAOuNdx/3QB2YIH3jfVNs+s99psz1D32xLEXYB+DMMUU388QDTTzFffUEMOo/9tuuCFA6VC4IqbTjrpVjveXw+d7y2RS4lKUAAQT0+a+eY+8NBd58E/rvbxyJueutiuI4/8DnnP5APtw0PEtg2JatD7BgzbLH13PvwAPu08lF/+DjzkUD7yy59FA/Lr84C++eUHD7743UFks9vat/zh0T34j0MG+IMCFpB+CDxe+9DyPvUh0HziK2D4BjjA/LFNR4w5WPekN0A0oEEMYiCgAX8AhBHSb4FpqQH9RshCEjoEhGggi0OmhyMb8EqDYQmRQzzowTR8EIT+IQQiEE3IAxSqRYU8GKEQQQgEIaIhDT704AxraC15bUAs/iHLEwNUByh6UQxpAOMSR2jEvuSAhUIMoxq9CMUuRpFBNdzAtnCARR/0sA54dCMb9xhGEBqwjJA54w/SyMc95hFKHrwRHR9Dqh04JoBPzKOJDknJPQoRkJHhARANSUlKTrKLaJiexB7Vpx5ghCZowKMdVnnIO9yhDq88pCUxKRlNgtGLlHylLiW5ShOloUEyMFOVfKAkHwBIRqt0pTKXuUxZQnE4AjDiD9jYSmZa8w69TAODemAD3q0IDcV8Yi/vgAdykhMP6LzmIWdjgAqkoAXwTIEFKjABBxiAAHH+G2Qer4nOfpaznNg0USK56c35gDOAZAnQOf3pz3Ols5mSsQALdKCFLOjABSyIZwo2ulEQKCBsBVCoMhlK0n66Eo8xnJ4NokQeNAjEP8ZMJSz76a+a2pShd5AMAVjQBS5sQQsVvahGOcpRCxggbGKA5ULNZdObphOUoewBN2XA0uHIICZSbaJC0dnUrvqrnKNxgBbM0FMuANWiGG3BCojK1gpE82licCVXverUV4ZxmziySFVHc7QkghGPS+2qP3M6GhCY4bBk9elZhdqCEbCVrROIW1wX6tXB4jGMP4jIRMLlUsjwagaj8+tfR1rSdA6HBW5wgxoQ69OfZiELLoD+p2MfS1QHFO4HSi3tQ+3qx/T1jVcXOUuvYLC6wKktiYNso1LlalLCDicLqVUtYnv6Uy0wdq20JWr7pinXhTbTjWI4oNoGp4JKdaQB/gFnBjBANtAeV7S4BOxJC+SGOUR3tWQlQ3VhG1vsZnejtl1gAaYp31heto8/WB/pBtc1DGTgBlH1jCIiQAHMNKA0GM5whvfClxVVgA50iO4aWLsF17ogti34L1HfSksNu/jFWjFKhRtAS0W4AMT2TS1+qVvRE2d0tiqObI2HHBkugJgOOR5xYvebViD/FwREjrJa3HDkEEv3sF0ocVD7q2KOSvnLUjFDlZOMZcXy98ddTgH+mNfcExBU2cpK5vFrm5xmNtuZJFsYs47LbOKMprjLdw50QibwhiPP4Q1uiLOZYStbFUNZ0D5xzoVfTOnS9EkHY16DdHnc44z6l7YVaHGlKx1jCi/lI4pI7w3Wy7XiuteBg7zlPpV52YJO5wBUPjKi8UsGM594BSg4wQmyG+rU7Y6LtM4jFHubPtKRjQYOhvCNPLMRhAy3uKNTXwFlvVzmLjMNP5jOCOZgaE1jmQxkwMILSPCAAQgkAQ94gLCHvdFiP427y9xtLJctXmfToLwwQEvdgOte+MpXtwCtQ7hpk+cjp3YNZZhCCR7w1gNMYJ4HYDG8H5ACex8Mt8yl6WD+991b0gWMV2zpCxpQ3tfkApamgm2uGNiZazq8YQ1TeKsC3smCE2uUnvcUyAECLK/JNrSpI+c3D9jGWckEYOVXlUn4RgtzujrUlTOXTAVyPYcpKEIALdCCls/c6BGYPQW2FQCLSWV0plr96l0MoeduoFdtOf3pLoHpMWc618paNuuQGTcbTPD1LJjBtRc9seIXn1a3KsLdkEpqyN0e83KiVAwNwl6U7D6aOpjkoDHdKkkdilNap8FCaClDCRRxgCyYlfGwX7yfUzABta+9QCHt9lLNxfuRg3KbKzVJHaZjhzQ8PZxoGKc5SWrNQ4a3L2MggSIUIHYtxP76GJ09CBz+cHv56HPWpB0sQAMKSpVGKQ12mI8dAkBMhAYomddkpjOhuPCzkED6E9iCYrGPfbVyFAQGcAAEAADeR00FFn+u1EtQsk1vEgDpdyHrZ0owJVPJVE0GNn8gVERnsXoVcFj7d306kHhz5nPwBE8rAGQVoAAESBu2ZICtpFT7xEoLOD3B5IBVEoGPpEWS1Enz90UZuIGKsAVm4Gv8d2KwZVEhqHiw5Wdn13HdlxYteEsBolw8KIM+JEoYYYNn4nmLlF4e1IOFNEYJBhT3lwKHx2QskIY9x3g68Fpu+IZuqHiexlFEpxbIRUiFFF9QFUoRIRYBMHyQggYIcEVSx0ORpEf+bCRGCDZCOfATJUAAWmBWZFeCLZCGi9eGbghUmnhWaOVjf9ZxChGA+NQRgmRAS5SHbsRDcERHG4AAnQUpeaAIvQITWaRFPfRDfrRE4XVA5VMDHUEABuAAE1ABFbBWI3CCG+VYK0CJ8LSGLtCGm5gFFRWNnYhR/uV4BsECZuACKXAACoFEyBVrQiSOYvBEhjhFE1FFGrRBCLVDPyRCLcSLvXgQBGABJehk/2V2lOiMLiCNr7WJ1FiNnyhPt3djfsACHcABCQGO4RiPAwRDUuQQ+mNDMbAxgvg/WCVAFMRCD0Q/akMDBQECKIaPaTYCJWiJRiiNAAmQbph4LPBpHpf+BXQwCIKgBEHQAQjRQB1ZPi1EQQzSIBf0Ka8oL76jOd/THfgzPTupYMcDkoowAc/YWGmWXSbZjEr4jyvJiXOWeFJJhwLBAnQQCIRgBUfgAThpEA30XjspVfcDPt2RNTGwKGFTlLR4lMTjOf3hPMnzNypgAVyQBSQ5lRx1jFZ5lSqpZVoJe/5HVPi0BXtwCF/gBEPQAR3gjQShAqejl8ejN8JDPfajWRQRl/3zMxqBOQ6DRbNTOz2ANTlgM6VzOn8TOCrAjYJJlctYmCl5mJoIh/14YkLlZB9lBocgB0/ABEKQkJYpEJgpOAvmOjWDNTgAEeRjOxNhQxCyO3EzNwz+czKNozZ7o1k14zemwzpecwG1SZVVWYmXiJXVVVFweIQXlVFENQEE8AaDQAVMUJYdIAIEcThdMzinAzHPKRN5iTU4kzJ4UTjDFzUWITN4A50TMQM0IDDP9m87c560RZgtEHuZuJuZ+J4+R1TEuAd+gARHcJwdEAKXWVzPRqHcyZprgzNSsygs84BhkwYTNinWMjUSUTM38zDXlgFDwzMXQAEYSlS36ZshmHjP2I/v+YbRmFZE1QKD4AZJIARmKQJCFjRDqgJCWjQQgzQTERNA2jQsM5Rh41J3EStF0zAPczczgDEXcwEq0DHuUgBHqqFr2IZLyoa8KYK7mVb+pQX+VQqYIgBgilAAdGqnF1MxDjYySfOmEzFcMLAyioCmcRMkrOEt1jJwW1Mu55Iu64IvdvouKkaJZqehhcmnsmeE0agDPXeYP+Vz/sUFfkAHgMlRH2UvpbohxlIHvOcDJzcwlrIoywEkRtQDBZAr3sIrxPUrwVInGaAVzYIsDEBUW3CSKumeJGiVKplWJdiPQNVn7ySN+tcFZsBoRNUFg+AHXOBfBsAAxyKvyRIBDJAB0UIj1OKlzootXcF+tMQadcGpMFAxmZITnCKtC4AApyIqKeACXeAGZyCu+scFXXCxXaAFjdYCFOVTGEVULCB2XDCyWcACs8UCW4CuiJUFA8n+Be26jRwlrw2LKgiAr3jAKongKrAiK4tSGAZDS4+SJpLiLWzyJnGSEyVSBzuAJ1fyJ24QB1R2BhZ7Bm0QXW2QrkA2AlmQsn9psoPpeiqrsRy1Ai5gsWaQWmYgthtlBi9LmwvwJweSIDsArIWSCIciA7AyK2CiFBlUY2ZCJIMRJmCiAUoCBCMiLT4kJVdyZH4AB3TAB39wq3DgBjBLVJHogS7waRB7BqvFBbQ5AmNFBjqgtVWbtilmkHRgBin2tgeCJwEARVviJF3CTYPLKF1BJmCWIYG7IV3xITcQQEySs3VAASahJ3tBB3swCIdwCIUQCH2QWlwwkCmgA+iqBmT+oLYbFXap1QYZ21hrQG5uILbQRbnWR2WDsAdmUByhQRUUICNcciM5siN1wSFKIRchcWf1cRn3MSYSACIQ8R9QxLQHQgd+YAjt2gd7MAdqwAUswFYucLYjpgUNTFQ6cAaTm7Y9B2J9MAhmwFEPZwZrgLyGQAeAkns/ORM5EiEa8h72i3pfxkj5ex100RqVwR0+0ACndx7mQcAIvAdIpgZbQJsc9cCTC8RCvFFacKuUywU6YGQkOghcwFFillog5geHYB7okQYNsB7tMcM0DBsuzGY3IBC2MReY0RW6IRcSAARLARzmUWi6NoQu4GRaELlLPMdEZQaFYHOrlQVq0Af+gRAIhnAFRkAEImBkVTYI5nEcnqEc9pEduIEYTRHGgcZIZNwUryHDWyGwnfEZpnEVcey5dFwIe6BaXcCylnurIXZ4czAIgBAGUdAEJ/oBYnZkV7EXgdEAqmEXraEd8KEYqAZpIyExbbEYH3EbGrIZXfEZIYEAP0wGsTWlgfDD3UtUNwZilEsGdGAIYAAFxXkEQTACcNzMgZHMPmK/wAwSwnwWO2BDCkEU7rHMsfERbLowMjAI2IzBKbCMlKwIaRLJi6G/LDzPfUsQFbnOUtEQDwGaFVE3NIHJBFEA12xfO1stmfMSGG0DnDcVASDJ6Ywn/jzJAWAX1REBFLE5NAH+BGaB0JCiBfmMve/UAlM8hG+AaNCcveRWaH1wCHSgA59oWykAxyB2eGrG0kYkAGewytlaW4ogk5Rbc2agA1J8ZMnrBxnr090oEBUwVmtABi1Qh0a9QC6tWp7L1C2AZG4Ax37wB1rAUdoMYlUNB3+ZYmENZphGBwt8xJH1YVTdB37gB0KMyHTg18+7BSz7aHUdZWBJB1Ir1V55AELtB37tB58okxrcB6n7Uy0gZIlNZBMAYm3guZ94VIoQwgTsB15QBXKwBEhQBCNAaHC9ykxsAZ39ZV2wypnLUULm0oM9CG9QBUuwBFIwAqGWAluQa6ulBYhd20Q21tXcUQLhZlXxTAddm2JE13oVlQKkzdxRZmTkO5BvxQLkhrxuYFZSnZzcfWdjfXgDmZwuMN6UG8Qfld6CdmMSuwUTvFHovdU9JdXbTd93lgJKfcRPCOAITQAXHMRAZuDMbQZvMISOrd8MntgEUF+N/dMTXtcKgM2n/ImcneEsndRwYLq6DeJhjWl+cAbY++EmLswfdqsr3uJG7QZr3QUYLuMInQUbfAafOIo4LswH0AaDYOP19uMsnQK3+mfobeSQ1gWHYOMex+RSPuVUXuVWfuVYnuVavuVc3uVe/uVgHuZiPuZkXuZmfuZonuZqvuZs3uZu/uZwHuYBAQA7
FIND j=7099 line=");
FIND j=7100 line= koeye_handhi_gif = url("data:/img/png;base64,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
FIND j=7101 line=");
FIND j=7102 line=
FIND j=7103 line= return(img);
FIND j=7104 line= }
FIND j=7105 line= </script id="script_load_b64btn" >
FIND j=7106 line=
FIND j=7107 line= <script id="script_pdflist_show">
FIND j=7108 line= function script_pdflist_show() {
FIND j=7109 line= var z = 0; var pdfout=""; var len=pdflist.length;
FIND j=7110 line= var pdfid = ""; var pdfurl = "";
FIND j=7111 line= img_pdfid="/imgs/links/tn/tn_dragons_koo.png";
FIND j=7112 line= tn_pdfid="/imgs/links/tn/tn_dragons_oko.png";
FIND j=7113 line= for( z=0; z< pdflist.length; z++ ) {
FIND j=7114 line= pdfid = pdflist[z].split(" " )[10];
FIND j=7115 line=// alert( 'BUGS_1000 script_pdflist_show z="+z+" pdfid="+pdfid+" pdflist="+pdflist[z] );
FIND j=7116 line= pdfid_code = pdflist[z].replace('.json','' );
FIND j=7117 line=// img_pdfid = pdflist[z].replace('.json','.jpg' );
FIND j=7118 line=// tn_pdfid = pdflist[z].replace('.json','.png' );
FIND j=7119 line=// pdfout += "<h1><b>pdflist_"+z+"</b><h1>";
FIND j=7120 line= pdfurl = pdfid;
FIND j=7121 line=
FIND j=7122 line=// http://ka12/kb/pdf/pdf_20190126/kou_20190125_2400_Understand
FIND j=7123 line=// pdfout += "<a href='./index_vu.html?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
FIND j=7124 line=// pdfout += "<a href='?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
FIND j=7125 line= pdfout += '<a href='+pdfurl+' class="popover" target=_blank>';
FIND j=7126 line= pdfout += " <img name='img_" + pdfid + "' height=100 src='"+tn_pdfid+"' border=0 height=100 >\n";
FIND j=7127 line= pdfout += " <span><img name='img_" + pdfid + "' height=100 src='"+img_pdfid+"' border=0 height=100 ></span>\n";
FIND j=7128 line= pdfout += " </a>";
FIND j=7129 line=// alert( "bugs_196 pdfid=" + pdfid + " tn_pdfid=" + tn_pdfid );
FIND j=7130 line= }
FIND j=7131 line=// document.write( "bugs_198 pdfout=" + pdfout );
FIND j=7132 line=
FIND j=7133 line=// alert( "BUGS432_show pdflist("+len+")="+pdflist[z] + " len="+pdflist.length );
FIND j=7134 line=// document.getElementById('div_tllist').innerHTML += pdfout;
FIND j=7135 line= var parent = document.getElementById('div_pdflist');
FIND j=7136 line= parent.insertAdjacentHTML('beforeend', pdfout);
FIND j=7137 line= }
FIND j=7138 line= </script id="script_pdflist_show">
FIND j=7139 line=
FIND j=7140 line= <div id="div_pdflist">
FIND j=7141 line= <h1>div_pdflist</h1>
FIND j=7142 line= </div id="div_pdflist">
FIND j=7143 line=
FIND j=7144 line= <hr color=yellow>
FIND j=7145 line=
FIND j=7146 line=
FIND j=7147 line=
FIND j=7148 line=
FIND j=7149 line=
FIND j=7150 line= <a href=# class="popover" alt="script_bugs">
FIND j=7151 line= <img height=150 src="/imgs/links/tn/tn_dragon_b2.png" onclick="script_bugs('5400')">
FIND j=7152 line= <span><img height=150 src="/imgs/links/tn/tn_dragon_w1.png" onclick="script_bugs('5400')"></span>
FIND j=7153 line= </a>
FIND j=7154 line=
FIND j=7155 line= <script id="script_kob" >
FIND j=7156 line= function script_kob(kobid) {
FIND j=7157 line= alert( "BUGS_kob_6500 script_kob="+kobid );
FIND j=7158 line= }
FIND j=7159 line= </script id="script_kob" >
FIND j=7160 line=
FIND j=7161 line= <script id="script_kow" >
FIND j=7162 line= function script_kow(kowid) {
FIND j=7163 line= alert( "BUGS_kow_6500 script_kow="+kowid );
FIND j=7164 line= }
FIND j=7165 line= </script id="script_kow" >
FIND j=7166 line=
FIND j=7167 line=
FIND j=7168 line= <button onclick="script_ajax2php">ajax2php</button>
FIND j=7169 line= <button onclick="script_sllist">sllist</button>
FIND j=7170 line= <button onclick="script_pdflist">pdflist</button>
FIND j=7171 line=
FIND j=7172 line= <button id="btn_sllist" onclick="script_sllist()">-= slflist =-</button>
FIND j=7173 line= <a href=# class="popover" alt="script_slist()">
FIND j=7174 line= <img height=100 src="/imgs/links/tn/tn_dragons_oko.png" onclick="script_sllist();" >
FIND j=7175 line= <span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_sllist();" ></span>
FIND j=7176 line= </a>
FIND j=7177 line=
FIND j=7178 line=
FIND j=7179 line= <button id="btn_pdflist" onclick="script_pdflist()">-= pdflist =-</button>
FIND j=7180 line= <a href=# class="popover" alt="script_pdflist()">
FIND j=7181 line= <img height=100 src="imgs/links/tn/tn_dragons_oko.png" onclick="script_pdflist();" >
FIND j=7182 line= <span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_pdflist();" ></span>
FIND j=7183 line= </a>
FIND j=7184 line=
FIND j=7185 line= <script id="script_pdflist">
FIND j=7186 line= function script_pdflist() {
FIND j=7187 line= script_pdflist_load();
FIND j=7188 line= script_pdflist_show();
FIND j=7189 line= }
FIND j=7190 line= </script id="script_pdflist">
FIND j=7191 line=
FIND j=7192 line= <script id="script_sllist">
FIND j=7193 line= function script_sllist() {
FIND j=7194 line= script_sllist_load();
FIND j=7195 line= script_sllist_show();
FIND j=7196 line= }
FIND j=7197 line= </script id="script_sllist">
FIND j=7198 line=
FIND j=7199 line=
FIND j=7200 line= <a href="/?js=script_shutdown" class="popover" alt="script_shutdown">
FIND j=7201 line= <img height=150 src="/imgs/links/tn/tn_dragon_w2.png" onclick="script_shutdown('5600')">
FIND j=7202 line= <span><img height=150 src="/imgs/links/tn/tn_dragon_b1.png" onclick="script_shutdown('5600')"></span>
FIND j=7203 line= </a>
FIND j=7204 line=
FIND j=7205 line=
FIND j=7206 line= <br><br><br><br><br><br><br>
FIND j=7207 line= <div id="txtName"><h1>txtName</h1>
FIND j=7208 line= </div id="txtName">
FIND j=7209 line=
FIND j=7210 line=
FIND j=7211 line= <script id="script_ajaxdb3">
FIND j=7212 line=// exit function if nothing has been typed in the textbox
FIND j=7213 line= function showName(str){
FIND j=7214 line= if (str.length == 0){
FIND j=7215 line= document.getElementById("txtName").innerHTML=""; //clear previous results
FIND j=7216 line= return;
FIND j=7217 line= }
FIND j=7218 line=
FIND j=7219 line=// code for IE7+, Firefox, Chrome, Opera, Safari
FIND j=7220 line=// code for IE6, IE5
FIND j=7221 line= if (window.XMLHttpRequest) {
FIND j=7222 line= xmlhttp=new XMLHttpRequest();
FIND j=7223 line= }
FIND j=7224 line= else {
FIND j=7225 line= xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
FIND j=7226 line= }
FIND j=7227 line= xmlhttp.onreadystatechange=function() {
FIND j=7228 line= if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
FIND j=7229 line= document.getElementById("txtName").innerHTML=xmlhttp.responseText;
FIND j=7230 line= }
FIND j=7231 line= }
FIND j=7232 line=// xmlhttp.open("POST","idx.php?name="+str,true);
FIND j=7233 line= xmlhttp.open("GET","ajaxdb_page.php?name="+str,true);
FIND j=7234 line= xmlhttp.send();
FIND j=7235 line= </script id="script_ajaxdb3">
FIND j=7236 line=
FIND j=7237 line=
FIND j=7238 line= <br><br><br><br><br>
FIND j=7239 line= <div id="div_kogrids_b"></div>
FIND j=7240 line=
FIND j=7241 line=
FIND j=7242 line= <script id="script_gethint_ajax">
FIND j=7243 line= function showHint(str) {
FIND j=7244 line= if (str.length == 0) {
FIND j=7245 line= document.getElementById("txtHint").innerHTML = "";
FIND j=7246 line= return;
FIND j=7247 line= }
FIND j=7248 line= else {
FIND j=7249 line= var xmlhttp = new XMLHttpRequest();
FIND j=7250 line= xmlhttp.onreadystatechange = function() {
FIND j=7251 line= if (this.readyState == 4 && this.status == 200) {
FIND j=7252 line= document.getElementById("txtHint").innerHTML = this.responseText;
FIND j=7253 line= }
FIND j=7254 line= };
FIND j=7255 line= xmlhttp.open("GET", "gethint.php?q=" + str, true);
FIND j=7256 line= xmlhttp.send();
FIND j=7257 line= }
FIND j=7258 line= }
FIND j=7259 line= </script id="script_gethint_ajax">
FIND j=7260 line=
FIND j=7261 line= <script id="script_ajaxjs" >
FIND j=7262 line=
FIND j=7263 line=
FIND j=7264 line=function js_ajax() {
FIND j=7265 line= $(document).ready(function(){
FIND j=7266 line= $.ajax({
FIND j=7267 line= url: 'idx.php',
FIND j=7268 line= type: 'get',
FIND j=7269 line= dataType: 'JSON',
FIND j=7270 line= success: function(response){
FIND j=7271 line= var len = response.length;
FIND j=7272 line= for(var i=0; i<len; i++){
FIND j=7273 line= var id = response[i].id;
FIND j=7274 line= var username = response[i].username;
FIND j=7275 line= var name = response[i].name;
FIND j=7276 line= var email = response[i].email;
FIND j=7277 line=
FIND j=7278 line= var tr_str = "<tr>" +
FIND j=7279 line= "<td align='center'>" + (i+1) + "</td>" +
FIND j=7280 line= "<td align='center'>" + username + "</td>" +
FIND j=7281 line= "<td align='center'>" + name + "</td>" +
FIND j=7282 line= "<td align='center'>" + email + "</td>" +
FIND j=7283 line= "</tr>";
FIND j=7284 line= $("#userTable tbody").append(tr_str);
FIND j=7285 line= }
FIND j=7286 line=
FIND j=7287 line= }
FIND j=7288 line= });
FIND j=7289 line= });
FIND j=7290 line= return( $ajaxjs );
FIND j=7291 line= }
FIND j=7292 line=
FIND j=7293 line= </script id="script_ajaxjs" >
FIND j=7294 line=
FIND j=7295 line=
FIND j=7296 line= <h1>gethint_ajax</h1>
FIND j=7297 line= <script id="script_gethint_ajax">
FIND j=7298 line= function showHint(str) {
FIND j=7299 line= if (str.length == 0) {
FIND j=7300 line= document.getElementById("txtHint").innerHTML = "";
FIND j=7301 line= return;
FIND j=7302 line= }
FIND j=7303 line= else {
FIND j=7304 line= var xmlhttp = new XMLHttpRequest();
FIND j=7305 line= xmlhttp.onreadystatechange = function() {
FIND j=7306 line= if (this.readyState == 4 && this.status == 200) {
FIND j=7307 line= document.getElementById("txtHint").innerHTML = this.responseText;
FIND j=7308 line= }
FIND j=7309 line= };
FIND j=7310 line= xmlhttp.open("POST", "idx.php?hint=" + str, true);
FIND j=7311 line= xmlhttp.send();
FIND j=7312 line= }
FIND j=7313 line= }
FIND j=7314 line= </script id="script_gethint_ajax">
FIND j=7315 line=
FIND j=7316 line= </body>
FIND j=7317 line= </html>
FIND j=7318 line=<!--
FIND j=7319 line=elise legrow - who do you love:https://www.youtube.com/watch?v=4BYzRmiBwRE
FIND j=7320 line= -->
ko 20190222_062304 MAIN 0-0 fildb3=ko.db3 sqltbl=ko fillogd=ko_20190222.log
MSG_7500 FINDDT: ifile=index_dd.html findmath=style_dd tailmatch=style_dd ofile=style_dd
MSG_400: ko 20190222_062304 -= findt =- 0-0 ifile=index_dd.html findmatch=style_ddstyle_dd ofile=style_dd
EXIT_500 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ko 20190222_062304 -= findt =- 0-0 ___FOUND ifile=index_dd.html findmatch=style_dd ofile=style_dd
match j=2852 line= <style name="style_dd">
FIND j=2853 line= body { text-align: center; background-color: "slategrey"; color:"white"; }
FIND j=2854 line= button {
FIND j=2855 line=// visibility: hidden;
FIND j=2856 line=// background: rgba(7, 99, 53, .1);
FIND j=2857 line= background: transparent;
FIND j=2858 line= border: 3px solid rgba(7, 99, 53, 1);
FIND j=2859 line= border-radius: 5px;
FIND j=2860 line= color: rgba(7, 99, 53, 1);
FIND j=2861 line= cursor: pointer;
FIND j=2862 line= line-height: 40px;
FIND j=2863 line= font-size: 30px;
FIND j=2864 line= outline: none;
FIND j=2865 line= padding: 0 20px;
FIND j=2866 line= transition: all .3s;
FIND j=2867 line= }
FIND j=2868 line= button:hover {
FIND j=2869 line=// background: rgba(7, 99, 53, 1);
FIND j=2870 line= background: darkgreyslate;
FIND j=2871 line= background: yellow;
FIND j=2872 line= color: rgba(255,255,255,1);
FIND j=2873 line= }
FIND j=2874 line= p {font-size: 20px; font-weight: bold;
FIND j=2875 line= </style>
FIND j=2876 line=
FIND j=2877 line=
FIND j=2878 line= <hr><hr><h1>ddlist_buttons</h1><hr><hr>
FIND j=2879 line=
FIND j=2880 line= <button type="button" onclick="script_ddlist_clear('div_dd')">script_ddlist_clear</button>
FIND j=2881 line= <button type="button" onclick="script_ddlist()">script_ddlist</button>
FIND j=2882 line= <button type="button" onclick="addChild_dd()">addChild_dd</button>
FIND j=2883 line= <button type="button" onclick="addChild()">addChild</button>
FIND j=2884 line= <hr>
FIND j=2885 line=<!-- <script > function imgWindow() {window.open("image") } </script> -->
FIND j=2886 line= <img src="./imgs/btn/kb.png" height="50" size="150" alt="koeye" onclick="script_ddlist_clear('div_dd')">
FIND j=2887 line= <img src="./imgs/btn/koeye.png" height="50" size="150" alt="koeye" onclick="script_ddlist()">
FIND j=2888 line= <img src="./imgs/btn/koeyeb.png" height="50" size="150" alt="koeyeb" onclick="addChild_dd()">
FIND j=2889 line= <img src="./imgs/btn/koeyew.png" height="50" size="150" alt="koeyew" onclick="addChild()">
FIND j=2890 line=
FIND j=2891 line= <div id="div_addchild">
FIND j=2892 line= <p>Child 1</p>
FIND j=2893 line= <p>Child 2</p>
FIND j=2894 line= </div>
FIND j=2895 line=
FIND j=2896 line= <div id="div_ddlist">
FIND j=2897 line= <h1>div_ddlist</h1>
FIND j=2898 line= <p>Child_dd 1</p>
FIND j=2899 line= <p>Child_dd 2</p>
FIND j=2900 line= </div>
FIND j=2901 line=
FIND j=2902 line= <div id="div_addchild_dd" >
FIND j=2903 line= <h1>div_addchild_dd</h1>
FIND j=2904 line= addchild_dd <br>
FIND j=2905 line= </div>
FIND j=2906 line=
FIND j=2907 line=
FIND j=2908 line= <script id="script_ddlist" >
FIND j=2909 line= var ddlist = new Array();
FIND j=2910 line=
FIND j=2911 line=// function script_ddlist_hover() {body { background-color: blue; }}
FIND j=2912 line=
FIND j=2913 line=
FIND j=2914 line= function script_ddlist_show() {
FIND j=2915 line= var z = 0; var ddout=""; var len=ddlist.length;
FIND j=2916 line= var ddid = ""; var ddurl = "";
FIND j=2917 line=// alert( "bugs178 script_ddlist_show IN" );
FIND j=2918 line= for( z=0; z< ddlist.length; z++ ) {
FIND j=2919 line= ddid = ddlist[z].replace('/TileGroup0/0-0-0.jpg','' );
FIND j=2920 line=// ddout += "<h1><b>ddlist_"+z+"</b><h1>";
FIND j=2921 line= ddout += "<a href='./index_dd.html?ddid="+ddid+"' target=_blank>";
FIND j=2922 line= ddout += " <img name='img_" + ddid + "' src='"+ddlist[z]+"' border=0 height=100 >\n";
FIND j=2923 line= ddout += " </a>";
FIND j=2924 line= ddout += "<a href='"+ddid+".html' target=_blank>";
FIND j=2925 line= ddout += " <img name='img_" + ddid + "' height=25 src='"+ddlist[z]+"' border=0 height=100 >\n";
FIND j=2926 line= ddout += " </a>";
FIND j=2927 line=// alert( "bugs430 ddid=" + ddid );
FIND j=2928 line= }
FIND j=2929 line=// document.write( "bugs435 ddout=" + ddout );
FIND j=2930 line=
FIND j=2931 line=// alert( "BUGS432_show ddlist("+len+")="+ddlist[z] + " len="+ddlist.length );
FIND j=2932 line=// document.getElementById('div_ddlist').innerHTML += ddout;
FIND j=2933 line= var parent = document.getElementById('div_ddlist');
FIND j=2934 line= parent.insertAdjacentHTML('beforeend', ddout);
FIND j=2935 line= }
FIND j=2936 line=// function script_ddlist() {
FIND j=2937 line=// script_ddlist_load();
FIND j=2938 line=// alert( "bugs_437: script_ddlist len="+ddlist.length );
FIND j=2939 line=// script_ddlist_show();
FIND j=2940 line=// }
FIND j=2941 line= function script_dd_view( search ) {
FIND j=2942 line= document.write( "script_dd_view search="+search );
FIND j=2943 line=
FIND j=2944 line=
FIND j=2945 line=
FIND j=2946 line=
FIND j=2947 line= }
FIND j=2948 line= </script>
FIND j=2949 line=
FIND j=2950 line=
FIND j=2951 line=
FIND j=2952 line=
FIND j=2953 line=
FIND j=2954 line= <script name="script_ddlist_load" >
FIND j=2955 line= var ddlist = new Array();
FIND j=2956 line= function script_ddlist_load() {
FIND j=2957 line= var j=0;
FIND j=2958 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9731466 Apr 22 15:48 /home2/kozerus/public_html/index1.mp4";
FIND j=2959 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11312337 Mar 23 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-16738 PM1.mp4";
FIND j=2960 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 39401124 Jan 1 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4";
FIND j=2961 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13449559 May 30 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3638_josh_walkin_house_20150807.mp4";
FIND j=2962 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 7040883 May 30 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3637_car_drivein_lights_off_20150807.mp4";
FIND j=2963 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 31544632 May 31 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00023_20150919_1910.mp4";
FIND j=2964 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 21808203 May 31 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00027_20150919_2205_josh_walking.mp4";
FIND j=2965 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 66029185 May 31 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00025_20150919_1947.mp4";
FIND j=2966 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3579125 May 31 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00026_20150919_2102.mp4";
FIND j=2967 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 19702589 May 31 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00028_20150919_2230.mp4";
FIND j=2968 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 420498 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0471_20150928_0737.mp4";
FIND j=2969 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 7031394 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0472_20150928_0737.mp4";
FIND j=2970 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6913214 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0475_20150928_0747.mp4";
FIND j=2971 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13097183 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
FIND j=2972 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 82620945 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
FIND j=2973 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9262725 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
FIND j=2974 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 36132332 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
FIND j=2975 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 31360598 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
FIND j=2976 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 60571867 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
FIND j=2977 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25746787 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
FIND j=2978 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27839588 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
FIND j=2979 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 52040510 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
FIND j=2980 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 21026672 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
FIND j=2981 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 15880534 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
FIND j=2982 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3411516 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
FIND j=2983 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 22370869 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
FIND j=2984 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 15932099 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
FIND j=2985 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9456645 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
FIND j=2986 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5407155 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
FIND j=2987 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25250767 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
FIND j=2988 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14717804 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
FIND j=2989 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5779527 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
FIND j=2990 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 17691018 May 29 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
FIND j=2991 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 45350757 May 30 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00042_20150919_1520.mp4";
FIND j=2992 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 202310978 May 30 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00045_20150919_1601.mp4";
FIND j=2993 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 73009607 May 30 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00041_20150919_1311.mp4";
FIND j=2994 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 31348085 May 30 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00036_20150919_1235.mp4";
FIND j=2995 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 79293857 May 30 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00043_20150919_1530.mp4";
FIND j=2996 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 49277911 May 30 2016 /home2/kozerus/public_html/ko/jtf/jtfdc_legal_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00037_20150919_1235.mp4";
FIND j=2997 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3332038 Jan 22 2015 /home2/kozerus/public_html/ko/svc/js/kojs/kojs_threejs/examples/textures/sintel.mp4";
FIND j=2998 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3332038 Jan 22 2015 /home2/kozerus/public_html/ko/svc/js/threejs/examples/textures/sintel.mp4";
FIND j=2999 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 1269047 Sep 21 2014 /home2/kozerus/public_html/ko/srv/krpano-1.18.3-linux64/krpano-1.18.3/examples/videointerface/video-1920x960.mp4";
FIND j=3000 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 531874 Sep 21 2014 /home2/kozerus/public_html/ko/srv/krpano-1.18.3-linux64/krpano-1.18.3/examples/videointerface/video-1024x512.mp4";
FIND j=3001 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 227064 Jun 13 2014 /home2/kozerus/public_html/ko/srv/krpano-1.18.3-linux64/krpano-1.18.3/examples/plugin-examples/video-player/cats-short.mp4";
FIND j=3002 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 227064 Jun 13 2014 /home2/kozerus/public_html/ko/srv/krpano-1.18.3-linux64/krpano-1.18.3/examples/plugin-examples/video-hotspot/cats-short.mp4";
FIND j=3003 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9731466 Apr 28 2017 /home2/kozerus/public_html/jtdfinc_byrd2013.mp4";
FIND j=3004 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 140960 Mar 2 2015 /home2/kozerus/public_html/jkwii/js/jsdoit/preload/_assets/static/video.mp4";
FIND j=3005 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3332038 Jan 22 2015 /home2/kozerus/public_html/jkwii/js/threejs/examples/textures/sintel.mp4";
FIND j=3006 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25844773 May 11 2016 /home2/kozerus/public_html/jkwii/jkwii.mp4";
FIND j=3007 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9731466 Apr 28 2017 /home2/kozerus/public_html/ko_jtf.mp4";
FIND j=3008 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 18025396 Apr 25 2013 /home2/kozerus/public_html/ko_kt/Skype_on_AppleTV.mp4";
FIND j=3009 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 7011284 Apr 30 2013 /home2/kozerus/public_html/ko_kt/981571807_2336548867001_soft-snake.mp4";
FIND j=3010 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9888388 May 3 2013 /home2/kozerus/public_html/ko_kt/0_zu9o9gah_0_4rrc176h_1.mp4";
FIND j=3011 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 10107750 Apr 23 2013 /home2/kozerus/public_html/ko_kt/981571807_2312771070001_mini-livers.mp4";
FIND j=3012 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11719820 May 1 2013 /home2/kozerus/public_html/ko_kt/Wireless_Wi_fi_IP_outdoor_waterproof_internet_protocol_PTZ_C.mp4";
FIND j=3013 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27044304 Apr 22 15:49 /home2/kozerus/public_html/index2.mp4";
FIND j=3014 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6833811 Oct 9 2014 /home2/kozerus/public_html/kb/v/jtfinc/JOHNNY KIDD & THE PIRATES - growl.mp4";
FIND j=3015 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5673207 Oct 11 2014 /home2/kozerus/public_html/kb/v/jtfinc/Kommienezuspadt - Tom Waits.mp4";
FIND j=3016 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 7067687 Oct 11 2014 /home2/kozerus/public_html/kb/v/jtfinc/KONGOS - Come With Me Now.mp4";
FIND j=3017 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 21586979 May 4 2013 /home2/kozerus/public_html/kb/v/jtfinc/Paul_Simon_-_You_Can_Call_Me_Al.mp4";
FIND j=3018 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 39558704 May 27 2017 /home2/kozerus/public_html/kb/v/jtfinc/Jamestown Revival - Medicine (Acoustic).mp4";
FIND j=3019 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4130718 Oct 9 2014 /home2/kozerus/public_html/kb/v/jtfinc/Family Tree - Kings of Leon.mp4";
FIND j=3020 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 39880807 Jan 1 2016 /home2/kozerus/public_html/kb/v/jtfinc/Fiona Apple - Criminal-1.mp4";
FIND j=3021 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 22997925 Jun 7 2010 /home2/kozerus/public_html/kb/v/jtfinc/George Michael - Careless Whisper.mp4";
FIND j=3022 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 10626618 Jan 2 2016 /home2/kozerus/public_html/kb/v/jtfinc/Ring_Of_Fire_Stan_Ridgway.mp4";
FIND j=3023 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5097370 Aug 4 2016 /home2/kozerus/public_html/kb/v/jtfinc/fureys/The Fureys- I Will Love You Ev'ry Time.mp4";
FIND j=3024 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4391667 Aug 4 2016 /home2/kozerus/public_html/kb/v/jtfinc/fureys/The Fureys- The First Leaves Of Autumn.mp4";
FIND j=3025 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 24774852 Aug 4 2016 /home2/kozerus/public_html/kb/v/jtfinc/fureys/The last Great love Song Performed by Finbar furey.mp4";
FIND j=3026 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 15829288 Aug 4 2016 /home2/kozerus/public_html/kb/v/jtfinc/fureys/The Fureys-Red Rose Cafe.mp4";
FIND j=3027 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16604265 Aug 4 2016 /home2/kozerus/public_html/kb/v/jtfinc/fureys/The Fureys - The Old Man.mp4";
FIND j=3028 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 24716705 Aug 4 2016 /home2/kozerus/public_html/kb/v/jtfinc/fureys/I Will Love You Ev'ry Time - The Fureys & Davey Arthur.mp4";
FIND j=3029 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20056128 Nov 28 2010 /home2/kozerus/public_html/kb/v/jtfinc/jesse_colin_young_whats_going_on-mercy_mercy_me.mp4";
FIND j=3030 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6700160 Jan 1 2016 /home2/kozerus/public_html/kb/v/jtfinc/put_the_lime_in_the_coconut.mp4";
FIND j=3031 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 12881706 Aug 16 2017 /home2/kozerus/public_html/kb/v/jtfinc/I-Team looks at history of sinkhole repair on Land O' Lakes property.mp4";
FIND j=3032 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 71490095 Dec 18 2010 /home2/kozerus/public_html/kb/v/dutch/dutch_jackson_feat_jibbs-city_on_fire_off_then.mp4";
FIND j=3033 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 56274429 Dec 18 2010 /home2/kozerus/public_html/kb/v/dutch/dutch_jackson_39_new_single.mp4";
FIND j=3034 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 49557618 Dec 18 2010 /home2/kozerus/public_html/kb/v/dutch/dutch_jackson-nocout_get_my_weight_up.mp4";
FIND j=3035 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 22849514 Dec 29 2015 /home2/kozerus/public_html/kb/v/kt/Push_Hands_-_Tui_Shou.mp4";
FIND j=3036 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 196023 Feb 28 2010 /home2/kozerus/public_html/kb/v/kt/kt_000229_019.mp4";
FIND j=3037 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5922959 Sep 24 2013 /home2/kozerus/public_html/kb/v/kt/Shaolin_Monk_Master_Super_Speed.mp4";
FIND j=3038 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6372920 Jan 2 2016 /home2/kozerus/public_html/kb/v/kt/THE_DAY_THE_EARTH_STOOD_STILL_-_1951_KLAATU_S_FINAL_SPEECH.mp4";
FIND j=3039 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 42411732 Dec 29 2015 /home2/kozerus/public_html/kb/v/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4";
FIND j=3040 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 30111934 Sep 9 2017 /home2/kozerus/public_html/kb/v/kt/cgi_quantum_jump_hayk_sahakyants.mp4";
FIND j=3041 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 42891308 Dec 29 2015 /home2/kozerus/public_html/kb/v/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4";
FIND j=3042 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 18135948 May 31 2015 /home2/kozerus/public_html/kb/v/kt/baguazhang_turning_the_circle_tree.mp4";
FIND j=3043 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 112028 Feb 28 2010 /home2/kozerus/public_html/kb/v/kt/kt_000229_033.mp4";
FIND j=3044 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6158888 Sep 18 2011 /home2/kozerus/public_html/kb/v/kt/wudan_vibrating_palm.mp4";
FIND j=3045 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 148629157 Dec 28 2015 /home2/kozerus/public_html/kb/v/kt/S01E23_the_testament_of_arkadia.mp4";
FIND j=3046 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 214580 Feb 28 2010 /home2/kozerus/public_html/kb/v/kt/kt_000229_022.mp4";
FIND j=3047 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 22698632 Feb 28 2010 /home2/kozerus/public_html/kb/v/kt/kt_000229_037.mp4";
FIND j=3048 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 168799 Feb 28 2010 /home2/kozerus/public_html/kb/v/kt/kt_000229_014.mp4";
FIND j=3049 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 43618160 Dec 29 2015 /home2/kozerus/public_html/kb/v/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-2.mp4";
FIND j=3050 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 194214560 Apr 27 12:26 /home2/kozerus/public_html/kb/v/kt/dethouars_willem_de_thouars_uncle_bill_in_Verona_NJ_1-11-18.mp4";
FIND j=3051 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 29134240 Aug 31 2017 /home2/kozerus/public_html/kb/v/kt/funny_monkeys_vs_dogs_cats_compilation_2017.mp4";
FIND j=3052 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 37434991 Dec 29 2015 /home2/kozerus/public_html/kb/v/kt/GOATS_DECLASSIFIED__The_True_Story_Behind_The_Men_Who_Stare_.mp4";
FIND j=3053 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 322496384 Oct 20 2013 /home2/kozerus/public_html/kb/v/kt/yogis_Of_Tibet_-_Rare_Documentary.mp4";
FIND j=3054 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9408541 Dec 29 2015 /home2/kozerus/public_html/kb/v/kt/femme_pencak_silat.mp4";
FIND j=3055 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 33515670 Apr 27 12:26 /home2/kozerus/public_html/kb/v/kt/willem_de_thouars_kuntao_silat_1996_gulfport_School_of_ta.mp4";
FIND j=3056 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16375006 Dec 29 2015 /home2/kozerus/public_html/kb/v/kt/Grand_Master_TRAN_TIEN_-_Vietnam_Kung_Fu.mp4";
FIND j=3057 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 672098 Feb 28 2010 /home2/kozerus/public_html/kb/v/kt/kt_000229_013.mp4";
FIND j=3058 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 488527186 Jan 28 2017 /home2/kozerus/public_html/kb/v/kt/master_ken_Seminar_uk_2013.mp4";
FIND j=3059 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 31664794 May 31 2015 /home2/kozerus/public_html/kb/v/kt/000_Pakua_master_of_94_year_s_old.mp4";
FIND j=3060 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3564857 Feb 28 2010 /home2/kozerus/public_html/kb/v/kt/kt_000229_007.mp4";
FIND j=3061 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5069486 Dec 29 2015 /home2/kozerus/public_html/kb/v/kt/Aikido_-_Demo_by_founder_-_Moriteru_Uesiba.mp4";
FIND j=3062 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13441441 Dec 29 2015 /home2/kozerus/public_html/kb/v/kt/6_Magic_Moves_-_To_Win_a_STREET_FIGHT.mp4";
FIND j=3063 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4742961 Feb 20 2015 /home2/kozerus/public_html/kb/v/ink spots/The Ink Spots - We'll Meet Again.mp4";
FIND j=3064 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5827821 Feb 20 2015 /home2/kozerus/public_html/kb/v/ink spots/The Ink spots - I don't want to set the world on fire.mp4";
FIND j=3065 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 8023649 Feb 20 2015 /home2/kozerus/public_html/kb/v/ink spots/The Ink Spots - Address Unknown.mp4";
FIND j=3066 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 385775 Jan 2 2016 /home2/kozerus/public_html/kb/v/Mary Tyler Moore/PAPA-OOM-MOW-MOW!.mp4";
FIND j=3067 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 75395435 Jan 8 2016 /home2/kozerus/public_html/kb/v/Mary Tyler Moore/The Mary Tyler Moore Show S06E07 Chuckles Bites the Dust.mp4";
FIND j=3068 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3076365 Jan 2 2016 /home2/kozerus/public_html/kb/v/Mary Tyler Moore/Big Chuck & Lil John - A Half A Head Of Lettuce.mp4";
FIND j=3069 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 18061574 Jan 8 2016 /home2/kozerus/public_html/kb/v/Mary Tyler Moore/Mary Tyler Moore ugly green dress.mp4";
FIND j=3070 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 73722507 Jan 8 2016 /home2/kozerus/public_html/kb/v/Mary Tyler Moore/The Mary Tyler Moore Show S06E13 The Happy Homemaker Takes Lou Home.mp4";
FIND j=3071 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 84692378 Jan 8 2016 /home2/kozerus/public_html/kb/v/Mary Tyler Moore/The Mary Tyler Moore Show S05E01 Will Mary Richards Go to Jail.mp4";
FIND j=3072 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6269157 Apr 22 15:27 /home2/kozerus/public_html/index6.mp4";
FIND j=3073 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 65434528 Apr 23 07:22 /home2/kozerus/public_html/index3.mp4";
FIND j=3074 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5282800 May 30 2016 /home2/kozerus/public_html/ko_jtf/kb/v/9557_fiona_runs_201506.mp4";
FIND j=3075 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9731466 Apr 22 15:48 /home2/kozerus/public_html/ko_jtf/kb/v/index1.mp4";
FIND j=3076 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14061783 May 30 2016 /home2/kozerus/public_html/ko_jtf/kb/v/jtfinc_9559_byrd_trustee_threat_201505.mp4";
FIND j=3077 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9731466 Apr 28 2017 /home2/kozerus/public_html/ko_jtf/kb/v/jtdfinc_byrd2013.mp4";
FIND j=3078 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16294133 May 30 2016 /home2/kozerus/public_html/ko_jtf/kb/v/jtfinc_9558_byrd_trustee_threat_201505.mp4";
FIND j=3079 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9731466 Apr 11 11:48 /home2/kozerus/public_html/ko_jtf/kb/v/koh5.mp4";
FIND j=3080 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11312337 Jan 1 2016 /home2/kozerus/public_html/ko_jtf/kb/v/doghead_video.mp4";
FIND j=3081 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9731466 Apr 28 2017 /home2/kozerus/public_html/ko_jtf/kb/v/ka1.mp4";
FIND j=3082 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9731466 Apr 28 2017 /home2/kozerus/public_html/ko_jtf/kb/v/ko_jtf.mp4";
FIND j=3083 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27044304 Apr 22 15:49 /home2/kozerus/public_html/ko_jtf/kb/v/index2.mp4";
FIND j=3084 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5282800 May 30 2016 /home2/kozerus/public_html/ko_jtf/kb/v/index6.mp4";
FIND j=3085 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16294133 May 30 2016 /home2/kozerus/public_html/ko_jtf/kb/v/index5.mp4";
FIND j=3086 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14061783 Apr 23 10:11 /home2/kozerus/public_html/ko_jtf/kb/v/9559_byrd_trustee_threat_201505.mp4";
FIND j=3087 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5282800 Apr 23 10:16 /home2/kozerus/public_html/ko_jtf/kb/v/jtf31_fiona_runs_201506.mp4";
FIND j=3088 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16294133 May 30 2016 /home2/kozerus/public_html/ko_jtf/kb/v/9558_byrd_trustee_threat_201505.mp4";
FIND j=3089 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27044304 Apr 22 15:48 /home2/kozerus/public_html/ko_jtf/kb/v/index3.mp4";
FIND j=3090 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 39401124 Jan 1 2016 /home2/kozerus/public_html/ko_jtf/kb/v/Huckleberry_Hound_17_Barbeque_Hound.mp4";
FIND j=3091 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16612288 Apr 7 22:10 /home2/kozerus/public_html/ko_jtf/kb/v/index.mp4";
FIND j=3092 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14061783 May 30 2016 /home2/kozerus/public_html/ko_jtf/kb/v/index4.mp4";
FIND j=3093 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9480445 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #16 114-27-1710%253A28 AM.mp4";
FIND j=3094 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25825959 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #14 104-27-1710%253A28 AM.mp4";
FIND j=3095 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20500207 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #619 224-27-1710%253A28 AM.mp4";
FIND j=3096 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 33882968 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #1256 94-27-1710%253A28 AM.mp4";
FIND j=3097 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 10753035 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #7 254-27-1710%253A28 AM.mp4";
FIND j=3098 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 28592858 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #10 24-27-1710%253A28 AM.mp4";
FIND j=3099 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16738066 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #731 274-27-1710%253A28 AM.mp4";
FIND j=3100 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4422709 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #941 334-27-1710%253A28 AM.mp4";
FIND j=3101 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 73923861 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #6 214-27-1710%253A28 AM.mp4";
FIND j=3102 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14259186 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #497 154-27-1710%253A28 AM.mp4";
FIND j=3103 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 113923214 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #369 134-27-1710%253A28 AM.mp4";
FIND j=3104 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9952926 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #12 64-27-1710%253A28 AM.mp4";
FIND j=3105 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4610575 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #536 174-27-1710%253A28 AM.mp4";
FIND j=3106 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6330377 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #677 244-27-1710%253A28 AM.mp4";
FIND j=3107 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 91358716 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #545 194-27-1710%253A28 AM.mp4";
FIND j=3108 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13822877 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #939 314-27-1710%253A28 AM.mp4";
FIND j=3109 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 10753035 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #560 204-27-1710%253A28 AM.mp4";
FIND j=3110 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6711904 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #486 144-27-1710%253A28 AM.mp4";
FIND j=3111 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 21780272 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #940 324-27-1710%253A28 AM.mp4";
FIND j=3112 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20574460 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #1233 74-27-1710%253A28 AM.mp4";
FIND j=3113 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20199768 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #1011 44-27-1710%253A28 AM.mp4";
FIND j=3114 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27461208 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #103 54-27-1710%253A28 AM.mp4";
FIND j=3115 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 19432819 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #241 124-27-1710%253A28 AM.mp4";
FIND j=3116 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 8675932 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #1234 84-27-1710%253A28 AM.mp4";
FIND j=3117 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 51485833 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #846 284-27-1710%253A28 AM.mp4";
FIND j=3118 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 22210045 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #525 164-27-1710%253A28 AM.mp4";
FIND j=3119 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 2136552 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #934 304-27-1710%253A28 AM.mp4";
FIND j=3120 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11587722 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #933 294-27-1710%253A28 AM.mp4";
FIND j=3121 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14519730 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #629 234-27-1710%253A28 AM.mp4";
FIND j=3122 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 86012765 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #98 344-27-1710%253A28 AM.mp4";
FIND j=3123 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 23834365 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #723 264-27-1710%253A28 AM.mp4";
FIND j=3124 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4895205 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #100 34-27-1710%253A28 AM.mp4";
FIND j=3125 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 47676266 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%253A28 AM/Clip #544 184-27-1710%253A28 AM.mp4";
FIND j=3126 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20199768 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #1011 44-27-1710:28 AM.mp4";
FIND j=3127 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16738066 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #731 274-27-1710:28 AM.mp4";
FIND j=3128 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 86012765 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #98 344-27-1710:28 AM.mp4";
FIND j=3129 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6330377 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #677 244-27-1710:28 AM.mp4";
FIND j=3130 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14259186 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #497 154-27-1710:28 AM.mp4";
FIND j=3131 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 2136552 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #934 304-27-1710:28 AM.mp4";
FIND j=3132 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 8675932 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #1234 84-27-1710:28 AM.mp4";
FIND j=3133 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 19432819 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #241 124-27-1710:28 AM.mp4";
FIND j=3134 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 33882968 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #1256 94-27-1710:28 AM.mp4";
FIND j=3135 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 28592858 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #10 24-27-1710:28 AM.mp4";
FIND j=3136 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4610575 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #536 174-27-1710:28 AM.mp4";
FIND j=3137 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 22210045 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #525 164-27-1710:28 AM.mp4";
FIND j=3138 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9952926 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #12 64-27-1710:28 AM.mp4";
FIND j=3139 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4422709 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #941 334-27-1710:28 AM.mp4";
FIND j=3140 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20574460 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #1233 74-27-1710:28 AM.mp4";
FIND j=3141 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6711904 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #486 144-27-1710:28 AM.mp4";
FIND j=3142 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20500207 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #619 224-27-1710:28 AM.mp4";
FIND j=3143 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 10753035 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #560 204-27-1710:28 AM.mp4";
FIND j=3144 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 113923214 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #369 134-27-1710:28 AM.mp4";
FIND j=3145 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9480445 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #16 114-27-1710:28 AM.mp4";
FIND j=3146 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11587722 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #933 294-27-1710:28 AM.mp4";
FIND j=3147 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 23834365 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #723 264-27-1710:28 AM.mp4";
FIND j=3148 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25825959 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #14 104-27-1710:28 AM.mp4";
FIND j=3149 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 21780272 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #940 324-27-1710:28 AM.mp4";
FIND j=3150 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 91358716 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #545 194-27-1710:28 AM.mp4";
FIND j=3151 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 51485833 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #846 284-27-1710:28 AM.mp4";
FIND j=3152 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 47676266 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #544 184-27-1710:28 AM.mp4";
FIND j=3153 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4895205 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #100 34-27-1710:28 AM.mp4";
FIND j=3154 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 73923861 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #6 214-27-1710:28 AM.mp4";
FIND j=3155 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 10753035 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #7 254-27-1710:28 AM.mp4";
FIND j=3156 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14519730 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #629 234-27-1710:28 AM.mp4";
FIND j=3157 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27461208 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #103 54-27-1710:28 AM.mp4";
FIND j=3158 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13822877 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710:28 AM/Clip #939 314-27-1710:28 AM.mp4";
FIND j=3159 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 22210045 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #525 164-27-1710%3A28 AM.mp4";
FIND j=3160 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 47676266 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #544 184-27-1710%3A28 AM.mp4";
FIND j=3161 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 91358716 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #545 194-27-1710%3A28 AM.mp4";
FIND j=3162 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 10753035 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #7 254-27-1710%3A28 AM.mp4";
FIND j=3163 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20500207 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #619 224-27-1710%3A28 AM.mp4";
FIND j=3164 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 23834365 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #723 264-27-1710%3A28 AM.mp4";
FIND j=3165 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16738066 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #731 274-27-1710%3A28 AM.mp4";
FIND j=3166 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9952926 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #12 64-27-1710%3A28 AM.mp4";
FIND j=3167 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4610575 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #536 174-27-1710%3A28 AM.mp4";
FIND j=3168 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14259186 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #497 154-27-1710%3A28 AM.mp4";
FIND j=3169 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14519730 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #629 234-27-1710%3A28 AM.mp4";
FIND j=3170 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 33882968 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #1256 94-27-1710%3A28 AM.mp4";
FIND j=3171 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9480445 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #16 114-27-1710%3A28 AM.mp4";
FIND j=3172 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 8675932 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #1234 84-27-1710%3A28 AM.mp4";
FIND j=3173 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 86012765 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #98 344-27-1710%3A28 AM.mp4";
FIND j=3174 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 113923214 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #369 134-27-1710%3A28 AM.mp4";
FIND j=3175 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13822877 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #939 314-27-1710%3A28 AM.mp4";
FIND j=3176 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 21780272 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #940 324-27-1710%3A28 AM.mp4";
FIND j=3177 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 10753035 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #560 204-27-1710%3A28 AM.mp4";
FIND j=3178 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11587722 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #933 294-27-1710%3A28 AM.mp4";
FIND j=3179 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20574460 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #1233 74-27-1710%3A28 AM.mp4";
FIND j=3180 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25825959 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #14 104-27-1710%3A28 AM.mp4";
FIND j=3181 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 2136552 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #934 304-27-1710%3A28 AM.mp4";
FIND j=3182 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4895205 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #100 34-27-1710%3A28 AM.mp4";
FIND j=3183 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 28592858 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #10 24-27-1710%3A28 AM.mp4";
FIND j=3184 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 19432819 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #241 124-27-1710%3A28 AM.mp4";
FIND j=3185 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6711904 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #486 144-27-1710%3A28 AM.mp4";
FIND j=3186 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20199768 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #1011 44-27-1710%3A28 AM.mp4";
FIND j=3187 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 51485833 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #846 284-27-1710%3A28 AM.mp4";
FIND j=3188 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4422709 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #941 334-27-1710%3A28 AM.mp4";
FIND j=3189 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6330377 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #677 244-27-1710%3A28 AM.mp4";
FIND j=3190 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 73923861 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #6 214-27-1710%3A28 AM.mp4";
FIND j=3191 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27461208 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-1710%3A28 AM/Clip #103 54-27-1710%3A28 AM.mp4";
FIND j=3192 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13097183 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
FIND j=3193 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 82620945 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
FIND j=3194 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9262725 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
FIND j=3195 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 36132332 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
FIND j=3196 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 31360598 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
FIND j=3197 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 60571867 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
FIND j=3198 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25746787 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
FIND j=3199 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27839588 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
FIND j=3200 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 52040510 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
FIND j=3201 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 21026672 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
FIND j=3202 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 15880534 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
FIND j=3203 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3411516 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
FIND j=3204 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 22370869 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
FIND j=3205 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 15932099 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
FIND j=3206 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9456645 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
FIND j=3207 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5407155 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
FIND j=3208 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25250767 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
FIND j=3209 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14717804 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
FIND j=3210 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5779527 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
FIND j=3211 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 17691018 May 29 2016 /home2/kozerus/public_html/ko_jtf/kb/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
FIND j=3212 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 91358716 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #545 194-27-171028 AM.mp4";
FIND j=3213 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20500207 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #619 224-27-171028 AM.mp4";
FIND j=3214 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 2136552 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #934 304-27-171028 AM.mp4";
FIND j=3215 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6711904 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #486 144-27-171028 AM.mp4";
FIND j=3216 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 51485833 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #846 284-27-171028 AM.mp4";
FIND j=3217 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4610575 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #536 174-27-171028 AM.mp4";
FIND j=3218 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13822877 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #939 314-27-171028 AM.mp4";
FIND j=3219 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14259186 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #497 154-27-171028 AM.mp4";
FIND j=3220 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 86012765 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #98 344-27-171028 AM.mp4";
FIND j=3221 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20199768 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #1011 44-27-171028 AM.mp4";
FIND j=3222 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9480445 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #16 114-27-171028 AM.mp4";
FIND j=3223 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 8675932 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #1234 84-27-171028 AM.mp4";
FIND j=3224 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14519730 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #629 234-27-171028 AM.mp4";
FIND j=3225 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11587722 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #933 294-27-171028 AM.mp4";
FIND j=3226 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16738066 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #731 274-27-171028 AM.mp4";
FIND j=3227 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 10753035 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #7 254-27-171028 AM.mp4";
FIND j=3228 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25825959 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #14 104-27-171028 AM.mp4";
FIND j=3229 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 22210045 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #525 164-27-171028 AM.mp4";
FIND j=3230 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 10753035 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #560 204-27-171028 AM.mp4";
FIND j=3231 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 28592858 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #10 24-27-171028 AM.mp4";
FIND j=3232 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4422709 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #941 334-27-171028 AM.mp4";
FIND j=3233 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 4895205 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #100 34-27-171028 AM.mp4";
FIND j=3234 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 21780272 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #940 324-27-171028 AM.mp4";
FIND j=3235 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 73923861 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #6 214-27-171028 AM.mp4";
FIND j=3236 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 47676266 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #544 184-27-171028 AM.mp4";
FIND j=3237 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27461208 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #103 54-27-171028 AM.mp4";
FIND j=3238 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 20574460 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #1233 74-27-171028 AM.mp4";
FIND j=3239 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 23834365 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #723 264-27-171028 AM.mp4";
FIND j=3240 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9952926 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #12 64-27-171028 AM.mp4";
FIND j=3241 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6330377 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #677 244-27-171028 AM.mp4";
FIND j=3242 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 33882968 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #1256 94-27-171028 AM.mp4";
FIND j=3243 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 113923214 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #369 134-27-171028 AM.mp4";
FIND j=3244 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 19432819 Apr 27 2017 /home2/kozerus/public_html/ko_jtf/kb_ko_jtft/img/ko_jtf_kb_mov_clip/Clip #6 214-27-171028 AM/Clip #241 124-27-171028 AM.mp4";
FIND j=3245 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9262725 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04054_20150716_0644.mp4";
FIND j=3246 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 36132332 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04052_20150716_0644.mp4";
FIND j=3247 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3411516 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04050_20150716_0642.mp4";
FIND j=3248 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13097183 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/04048_20150716_0641.mp4";
FIND j=3249 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 82620945 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
FIND j=3250 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9262725 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04054_20150716_0644.mp4";
FIND j=3251 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 36132332 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04052_20150716_0644.mp4";
FIND j=3252 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3411516 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04050_20150716_0642.mp4";
FIND j=3253 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 60571867 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
FIND j=3254 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27839588 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/04049_20150716_0642.mp4";
FIND j=3255 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 52040510 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/04044_20150716_0634.mp4";
FIND j=3256 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 15880534 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/04051_20150716_0643.mp4";
FIND j=3257 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 15932099 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/04053_20150716_0644.mp4";
FIND j=3258 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25250767 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/mp4_20150716/mp4_email_sent2/04055_20150716_0644.mp4";
FIND j=3259 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11312337 Mar 23 2016 /home2/kozerus/public_html/ko_jtf/wg/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-167:38 PM1.mp4";
FIND j=3260 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11312337 Mar 23 2016 /home2/kozerus/public_html/ko_jtf/wg/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-16738 PM1.mp4";
FIND j=3261 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 39401124 Jan 1 2016 /home2/kozerus/public_html/ko_jtf/wg/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4";
FIND j=3262 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11312337 Mar 23 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-167:38 PM1.mp4";
FIND j=3263 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 11312337 Mar 23 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-16738 PM1.mp4";
FIND j=3264 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 39401124 Jan 1 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4";
FIND j=3265 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13449559 May 30 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3638_josh_walkin_house_20150807.mp4";
FIND j=3266 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 7040883 May 30 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3637_car_drivein_lights_off_20150807.mp4";
FIND j=3267 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 31544632 May 31 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00023_20150919_1910.mp4";
FIND j=3268 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 21808203 May 31 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00027_20150919_2205_josh_walking.mp4";
FIND j=3269 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 66029185 May 31 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00025_20150919_1947.mp4";
FIND j=3270 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3579125 May 31 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00026_20150919_2102.mp4";
FIND j=3271 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 19702589 May 31 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00028_20150919_2230.mp4";
FIND j=3272 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 420498 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0471_20150928_0737.mp4";
FIND j=3273 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 7031394 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0472_20150928_0737.mp4";
FIND j=3274 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 6913214 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0475_20150928_0747.mp4";
FIND j=3275 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 13097183 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
FIND j=3276 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 82620945 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
FIND j=3277 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9262725 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
FIND j=3278 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 36132332 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
FIND j=3279 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 31360598 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
FIND j=3280 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 60571867 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
FIND j=3281 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25746787 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
FIND j=3282 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 27839588 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
FIND j=3283 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 52040510 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
FIND j=3284 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 21026672 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
FIND j=3285 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 15880534 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
FIND j=3286 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 3411516 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
FIND j=3287 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 22370869 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
FIND j=3288 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 15932099 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
FIND j=3289 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9456645 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
FIND j=3290 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5407155 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
FIND j=3291 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 25250767 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
FIND j=3292 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 14717804 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
FIND j=3293 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 5779527 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
FIND j=3294 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 17691018 May 29 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
FIND j=3295 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 45350757 May 30 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00042_20150919_1520.mp4";
FIND j=3296 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 202310978 May 30 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00045_20150919_1601.mp4";
FIND j=3297 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 73009607 May 30 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00041_20150919_1311.mp4";
FIND j=3298 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 31348085 May 30 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00036_20150919_1235.mp4";
FIND j=3299 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 79293857 May 30 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00043_20150919_1530.mp4";
FIND j=3300 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 49277911 May 30 2016 /home2/kozerus/public_html/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00037_20150919_1235.mp4";
FIND j=3301 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 16612288 Apr 7 22:10 /home2/kozerus/public_html/index.mp4";
FIND j=3302 line= ddlist[j++] = "-rw-r--r-- 1 kozerus kozerus 9731466 Apr 16 11:57 /home2/kozerus/public_html/index4.mp4";
FIND j=3303 line= for( j=0; j< ddlist.length; j++ ) {
FIND j=3304 line= document.write( "ddlist["+j+"]="+ddlist[j]; );
FIND j=3305 line= }
FIND j=3306 line= </script>
FIND j=3307 line= </body>
FIND j=3308 line= </html>
FIND j=3309 line=<html>
FIND j=3310 line=<head><title>h5dd_2.html 20180511_1755</title>
FIND j=3311 line=<script name="h5utils_js" >
FIND j=3312 line=// For discussion and comments, see: http://remysharp.com/2009/01/07/html5-enabling-script/
FIND j=3313 line=/*@cc_on'abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video'.replace(/\w+/g,function(n){document.createElement(n)})@*/
FIND j=3314 line=
FIND j=3315 line=var addEvent = (function () {
FIND j=3316 line= if (document.addEventListener) {
FIND j=3317 line= return function (el, type, fn) {
FIND j=3318 line= if (el && el.nodeName || el === window) {
FIND j=3319 line= el.addEventListener(type, fn, false);
FIND j=3320 line= } else if (el && el.length) {
FIND j=3321 line= for (var i = 0; i < el.length; i++) {
FIND j=3322 line= addEvent(el[i], type, fn);
FIND j=3323 line= }
FIND j=3324 line= }
FIND j=3325 line= };
FIND j=3326 line= } else {
FIND j=3327 line= return function (el, type, fn) {
FIND j=3328 line= if (el && el.nodeName || el === window) {
FIND j=3329 line= el.attachEvent('on' + type, function () { return fn.call(el, window.event); });
FIND j=3330 line= } else if (el && el.length) {
FIND j=3331 line= for (var i = 0; i < el.length; i++) {
FIND j=3332 line= addEvent(el[i], type, fn);
FIND j=3333 line= }
FIND j=3334 line= }
FIND j=3335 line= };
FIND j=3336 line= }
FIND j=3337 line=})();
FIND j=3338 line=
FIND j=3339 line=(function () {
FIND j=3340 line=
FIND j=3341 line=var pre = document.createElement('pre');
FIND j=3342 line=pre.id = "view-source"
FIND j=3343 line=
FIND j=3344 line=// private scope to avoid conflicts with demos
FIND j=3345 line=addEvent(window, 'click', function (event) {
FIND j=3346 line= if (event.target.hash == '#view-source') {
FIND j=3347 line= // event.preventDefault();
FIND j=3348 line= if (!document.getElementById('view-source')) {
FIND j=3349 line= // pre.innerHTML = ('<!DOCTYPE html>\n<html>\n' + document.documentElement.innerHTML + '\n</html>').replace(/[<>]/g, function (m) { return {'<':'<','>':'>'}[m]});
FIND j=3350 line= var xhr = new XMLHttpRequest();
FIND j=3351 line=
FIND j=3352 line= // original source - rather than rendered source
FIND j=3353 line= xhr.onreadystatechange = function () {
FIND j=3354 line= if (this.readyState == 4 && this.status == 200) {
FIND j=3355 line= pre.innerHTML = this.responseText.replace(/[<>]/g, function (m) { return {'<':'<','>':'>'}[m]});
FIND j=3356 line= prettyPrint();
FIND j=3357 line= }
FIND j=3358 line= };
FIND j=3359 line=
FIND j=3360 line= document.body.appendChild(pre);
FIND j=3361 line= // really need to be sync? - I like to think so
FIND j=3362 line= xhr.open("GET", location.origin + '/demos' + window.location.pathname.replace(/\/$/, '') + '.html', true);
FIND j=3363 line= xhr.send();
FIND j=3364 line= }
FIND j=3365 line= document.body.className = 'view-source';
FIND j=3366 line=
FIND j=3367 line= var sourceTimer = setInterval(function () {
FIND j=3368 line= if (window.location.hash != '#view-source') {
FIND j=3369 line= clearInterval(sourceTimer);
FIND j=3370 line= document.body.className = '';
FIND j=3371 line= }
FIND j=3372 line= }, 200);
FIND j=3373 line= }
FIND j=3374 line=});
FIND j=3375 line=
FIND j=3376 line=})();
FIND j=3377 line=
FIND j=3378 line=
FIND j=3379 line=
FIND j=3380 line=
FIND j=3381 line= </script>
FIND j=3382 line=
FIND j=3383 line=<style type="text/css">
FIND j=3384 line=li {
FIND j=3385 line= list-style: none;
FIND j=3386 line=}
FIND j=3387 line=
FIND j=3388 line=li a {
FIND j=3389 line= text-decoration: none;
FIND j=3390 line= color: #000;
FIND j=3391 line= margin: 10px;
FIND j=3392 line= width: 150px;
FIND j=3393 line= border: 3px dashed #999;
FIND j=3394 line= background: #eee;
FIND j=3395 line= padding: 10px;
FIND j=3396 line= display: block;
FIND j=3397 line=}
FIND j=3398 line=
FIND j=3399 line=*[draggable=true] {
FIND j=3400 line= -moz-user-select:none;
FIND j=3401 line= -khtml-user-drag: element;
FIND j=3402 line= cursor: move;
FIND j=3403 line=}
FIND j=3404 line=
FIND j=3405 line=*:-khtml-drag {
FIND j=3406 line= background-color: rgba(238,238,238, 0.5);
FIND j=3407 line=}
FIND j=3408 line=
FIND j=3409 line=li a:hover:after {
FIND j=3410 line= content: ' (drag me)';
FIND j=3411 line=}
FIND j=3412 line=
FIND j=3413 line=ul {
FIND j=3414 line= margin-left: 200px;
FIND j=3415 line= min-height: 300px;
FIND j=3416 line=}
FIND j=3417 line=
FIND j=3418 line=li.over {
FIND j=3419 line= border-color: #333;
FIND j=3420 line= background: #ccc;
FIND j=3421 line=}
FIND j=3422 line=
FIND j=3423 line=#bin {
FIND j=3424 line= background: url(images/bin.jpg) top right no-repeat;
FIND j=3425 line= height: 250px;
FIND j=3426 line= width: 166px;
FIND j=3427 line= float: left;
FIND j=3428 line= border: 5px solid #000;
FIND j=3429 line= position: relative;
FIND j=3430 line= margin-top: 0;
FIND j=3431 line=}
FIND j=3432 line=
FIND j=3433 line=#bin.over {
FIND j=3434 line= background: url(images/bin.jpg) top left no-repeat;
FIND j=3435 line=}
FIND j=3436 line=
FIND j=3437 line=#bin p {
FIND j=3438 line= font-weight: bold;
FIND j=3439 line= text-align: center;
FIND j=3440 line= position: absolute;
FIND j=3441 line= bottom: 20px;
FIND j=3442 line= width: 166px;
FIND j=3443 line= font-size: 32px;
FIND j=3444 line= color: #fff;
FIND j=3445 line= text-shadow: #000 2px 2px 2px;
FIND j=3446 line=}
FIND j=3447 line=</style>
FIND j=3448 line=
FIND j=3449 line=
FIND j=3450 line=
FIND j=3451 line=<div name="div_drop_id">
FIND j=3452 line=<article>
FIND j=3453 line= <p>Drag the list items over the dustbin, and drop them to have the bin eat the item</p>
FIND j=3454 line= <div id="bin"></div>
FIND j=3455 line= <ul>
FIND j=3456 line= <li><a id="one" href="#">one</a></li>
FIND j=3457 line= <li><a href="#" id="two">two</a></li>
FIND j=3458 line= <li><a href="#" id="three">three</a></li>
FIND j=3459 line= <li><a href="#" id="four">four</a></li>
FIND j=3460 line= <li><a href="#" id="five">five</a></li>
FIND j=3461 line= </ul>
FIND j=3462 line=</article>
FIND j=3463 line= </div>
FIND j=3464 line= <script name="script_drop_id" >
FIND j=3465 line=
FIND j=3466 line= var eat = ['yum!', 'gulp', 'burp!', 'nom'];
FIND j=3467 line= var yum = document.createElement('p');
FIND j=3468 line= var msie = /*@cc_on!@*/0;
FIND j=3469 line= yum.style.opacity = 1;
FIND j=3470 line=
FIND j=3471 line= var links = document.querySelectorAll('li > a'), el = null;
FIND j=3472 line= for (var i = 0; i < links.length; i++) {
FIND j=3473 line= el = links[i];
FIND j=3474 line=
FIND j=3475 line= el.setAttribute('draggable', 'true');
FIND j=3476 line=
FIND j=3477 line= addEvent(el, 'dragstart', function (e) {
FIND j=3478 line= e.dataTransfer.effectAllowed = 'copy'; // only dropEffect='copy' will be dropable
FIND j=3479 line= e.dataTransfer.setData('Text', this.id); // required otherwise doesn't work
FIND j=3480 line= });
FIND j=3481 line= }
FIND j=3482 line=
FIND j=3483 line= var bin = document.querySelector('#bin');
FIND j=3484 line=
FIND j=3485 line= addEvent(bin, 'dragover', function (e) {
FIND j=3486 line= if (e.preventDefault) e.preventDefault(); // allows us to drop
FIND j=3487 line= this.className = 'over';
FIND j=3488 line= e.dataTransfer.dropEffect = 'copy';
FIND j=3489 line= return false;
FIND j=3490 line= });
FIND j=3491 line=
FIND j=3492 line= // to get IE to work
FIND j=3493 line= addEvent(bin, 'dragenter', function (e) {
FIND j=3494 line= this.className = 'over';
FIND j=3495 line= return false;
FIND j=3496 line= });
FIND j=3497 line=
FIND j=3498 line= addEvent(bin, 'dragleave', function () {
FIND j=3499 line= this.className = '';
FIND j=3500 line= });
FIND j=3501 line=
FIND j=3502 line= addEvent(bin, 'drop', function (e) {
FIND j=3503 line= if (e.stopPropagation) e.stopPropagation(); // stops the browser from redirecting...why???
FIND j=3504 line=
FIND j=3505 line= var el = document.getElementById(e.dataTransfer.getData('Text'));
FIND j=3506 line=
FIND j=3507 line= el.parentNode.removeChild(el);
FIND j=3508 line=
FIND j=3509 line= // stupid nom text + fade effect
FIND j=3510 line= bin.className = '';
FIND j=3511 line= yum.innerHTML = eat[parseInt(Math.random() * eat.length)];
FIND j=3512 line=
FIND j=3513 line= var y = yum.cloneNode(true);
FIND j=3514 line= bin.appendChild(y);
FIND j=3515 line=
FIND j=3516 line= setTimeout(function () {
FIND j=3517 line= var t = setInterval(function () {
FIND j=3518 line= if (y.style.opacity <= 0) {
FIND j=3519 line= if (msie) { // don't bother with the animation
FIND j=3520 line= y.style.display = 'none';
FIND j=3521 line= }
FIND j=3522 line= clearInterval(t);
FIND j=3523 line= } else {
FIND j=3524 line= y.style.opacity -= 0.1;
FIND j=3525 line= }
FIND j=3526 line= }, 50);
FIND j=3527 line= }, 250);
FIND j=3528 line=
FIND j=3529 line= return false;
FIND j=3530 line= });
FIND j=3531 line=
FIND j=3532 line= </script>
FIND j=3533 line=
FIND j=3534 line=<!--
FIND j=3535 line= <script src="https://cdn.rawgit.com/konvajs/konva/2.0.3/konva.min.js">
FIND j=3536 line= </script>
FIND j=3537 line= -->
FIND j=3538 line=
FIND j=3539 line= <script name="script_konava_203_min_js">
FIND j=3540 line=
FIND j=3541 line=/*
FIND j=3542 line= * Konva JavaScript Framework v2.0.3
FIND j=3543 line= * http://konvajs.github.io/
FIND j=3544 line= * Licensed under the MIT
FIND j=3545 line= * Date: Sat Apr 21 2018
FIND j=3546 line= *
FIND j=3547 line= * Original work Copyright (C) 2011 - 2013 by Eric Rowell (KineticJS)
FIND j=3548 line= * Modified work Copyright (C) 2014 - present by Anton Lavrenov (Konva)
FIND j=3549 line= *
FIND j=3550 line= * @license
FIND j=3551 line= */
FIND j=3552 line=!function(){"use strict";var t=Math.PI/180,e={version:"2.0.3",stages:[],idCounter:0,ids:{},names:{},shapes:{},listenClickTap:!1,inDblClickWindow:!1,isBrowser:"undefined"!=typeof window&&("[object Window]"==={}.toString.call(window)||"[object global]"==={}.toString.call(window)),enableTrace:!1,traceArrMax:100,dblClickWindow:400,pixelRatio:void 0,dragDistance:3,angleDeg:!0,showWarnings:!0,Filters:{},isDragging:function(){var t=e.DD;return!!t&&t.isDragging},isDragReady:function(){var t=e.DD;return!!t&&!!t.node},_addId:function(t,e){void 0!==e&&(this.ids[e]=t)},_removeId:function(t){void 0!==t&&delete this.ids[t]},_addName:function(t,e){e&&(this.names[e]||(this.names[e]=[]),this.names[e].push(t))},_removeName:function(t,e){if(t){var n=this.names[t];if(n){for(var i=0;i<n.length;i++){n[i]._id===e&&n.splice(i,1)}0===n.length&&delete this.names[t]}}},getAngle:function(e){return this.angleDeg?e*t:e},_detectIE:function(t){var e=t.indexOf("msie ");if(e>0)return parseInt(t.substring(e+5,t.indexOf(".",e)),10);if(t.indexOf("trident/")>0){var n=t.indexOf("rv:");return parseInt(t.substring(n+3,t.indexOf(".",n)),10)}var i=t.indexOf("edge/");return i>0&&parseInt(t.substring(i+5,t.indexOf(".",i)),10)},_parseUA:function(t){var n=t.toLowerCase(),i=/(chrome)[ /]([\w.]+)/.exec(n)||/(webkit)[ /]([\w.]+)/.exec(n)||/(opera)(?:.*version|)[ /]([\w.]+)/.exec(n)||/(msie) ([\w.]+)/.exec(n)||n.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(n)||[],a=!!t.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i),r=!!t.match(/IEMobile/i);return{browser:i[1]||"",version:i[2]||"0",isIE:e._detectIE(n),mobile:a,ieMobile:r}},UA:void 0},n="undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope?self:{};e.UA=e._parseUA(n.navigator&&n.navigator.userAgent||""),n.Konva&&console.error("Konva instance is already exist in current eviroment. Please use only one instance."),n.Konva=e,e.global=n,e.window=n,e.document=n.document,"object"==typeof exports?module.exports=e:"function"==typeof define&&define.amd&&define(function(){return e})}(),function(){"use strict";Konva.Collection=function(){var t=[].slice.call(arguments),e=t.length,n=0;for(this.length=e;n<e;n++)this[n]=t[n];return this},Konva.Collection.prototype=[],Konva.Collection.prototype.each=function(t){for(var e=0;e<this.length;e++)t(this[e],e)},Konva.Collection.prototype.toArray=function(){var t,e=[],n=this.length;for(t=0;t<n;t++)e.push(this[t]);return e},Konva.Collection.toCollection=function(t){var e,n=new Konva.Collection,i=t.length;for(e=0;e<i;e++)n.push(t[e]);return n},Konva.Collection._mapMethod=function(t){Konva.Collection.prototype[t]=function(){var e,n=this.length,i=[].slice.call(arguments);for(e=0;e<n;e++)this[e][t].apply(this[e],i);return this}},Konva.Collection.mapMethods=function(t){var e=t.prototype;for(var n in e)Konva.Collection._mapMethod(n)},Konva.Transform=function(t){this.m=t&&t.slice()||[1,0,0,1,0,0]},Konva.Transform.prototype={copy:function(){return new Konva.Transform(this.m)},point:function(t){var e=this.m;return{x:e[0]*t.x+e[2]*t.y+e[4],y:e[1]*t.x+e[3]*t.y+e[5]}},translate:function(t,e){return this.m[4]+=this.m[0]*t+this.m[2]*e,this.m[5]+=this.m[1]*t+this.m[3]*e,this},scale:function(t,e){return this.m[0]*=t,this.m[1]*=t,this.m[2]*=e,this.m[3]*=e,this},rotate:function(t){var e=Math.cos(t),n=Math.sin(t),i=this.m[0]*e+this.m[2]*n,a=this.m[1]*e+this.m[3]*n,r=this.m[0]*-n+this.m[2]*e,o=this.m[1]*-n+this.m[3]*e;return this.m[0]=i,this.m[1]=a,this.m[2]=r,this.m[3]=o,this},getTranslation:function(){return{x:this.m[4],y:this.m[5]}},skew:function(t,e){var n=this.m[0]+this.m[2]*e,i=this.m[1]+this.m[3]*e,a=this.m[2]+this.m[0]*t,r=this.m[3]+this.m[1]*t;return this.m[0]=n,this.m[1]=i,this.m[2]=a,this.m[3]=r,this},multiply:function(t){var e=this.m[0]*t.m[0]+this.m[2]*t.m[1],n=this.m[1]*t.m[0]+this.m[3]*t.m[1],i=this.m[0]*t.m[2]+this.m[2]*t.m[3],a=this.m[1]*t.m[2]+this.m[3]*t.m[3],r=this.m[0]*t.m[4]+this.m[2]*t.m[5]+this.m[4],o=this.m[1]*t.m[4]+this.m[3]*t.m[5]+this.m[5];return this.m[0]=e,this.m[1]=n,this.m[2]=i,this.m[3]=a,this.m[4]=r,this.m[5]=o,this},invert:function(){var t=1/(this.m[0]*this.m[3]-this.m[1]*this.m[2]),e=this.m[3]*t,n=-this.m[1]*t,i=-this.m[2]*t,a=this.m[0]*t,r=t*(this.m[2]*this.m[5]-this.m[3]*this.m[4]),o=t*(this.m[1]*this.m[4]-this.m[0]*this.m[5]);return this.m[0]=e,this.m[1]=n,this.m[2]=i,this.m[3]=a,this.m[4]=r,this.m[5]=o,this},getMatrix:function(){return this.m},setAbsolutePosition:function(t,e){var n=this.m[0],i=this.m[1],a=this.m[2],r=this.m[3],o=this.m[4],s=(n*(e-this.m[5])-i*(t-o))/(n*r-i*a),h=(t-o-a*s)/n;return this.translate(h,s)}};var t=Math.PI/180,e=180/Math.PI,n="Konva error: ",i={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,132,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,255,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,203],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[119,128,144],slategrey:[119,128,144],snow:[255,255,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],transparent:[255,255,255,0],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,5]},a=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/;Konva.Util={_isElement:function(t){return!(!t||1!=t.nodeType)},_isFunction:function(t){return!!(t&&t.constructor&&t.call&&t.apply)},_isObject:function(t){return!!t&&t.constructor===Object},_isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},_isNumber:function(t){return"[object Number]"===Object.prototype.toString.call(t)},_isString:function(t){return"[object String]"===Object.prototype.toString.call(t)},isObject:function(t){return t instanceof Object},isValidSelector:function(t){if("string"!=typeof t)return!1;var e=t[0];return"#"===e||"."===e||e===e.toUpperCase()},_sign:function(t){return 0===t?0:t>0?1:-1},createCanvasElement:function(){var t=Konva.isBrowser?Konva.document.createElement("canvas"):new Konva._nodeCanvas;try{t.style=t.style||{}}catch(t){}return t},_isInDocument:function(t){for(;t=t.parentNode;)if(t==Konva.document)return!0;return!1},_simplifyArray:function(t){var e,n,i=[],a=t.length,r=Konva.Util;for(e=0;e<a;e++)n=t[e],r._isNumber(n)?n=Math.round(1e3*n)/1e3:r._isString(n)||(n=n.toString()),i.push(n);return i},_getImage:function(t,e){var n,i;if(t)if(this._isElement(t))e(t);else if(this._isString(t))(n=new Konva.window.Image).onload=function(){e(n)},n.src=t;else if(t.data){(i=Konva.Util.createCanvasElement()).width=t.width,i.height=t.height;i.getContext("2d").putImageData(t,0,0),this._getImage(i.toDataURL(),e)}else e(null);else e(null)},_getRGBAString:function(t){return["rgba(",t.red||0,",",t.green||0,",",t.blue||0,",",t.alpha||1,")"].join("")},_rgbToHex:function(t,e,n){return((1<<24)+(t<<16)+(e<<8)+n).toString(16).slice(1)},_hexToRgb:function(t){t=t.replace("#","");var e=parseInt(t,16);return{r:e>>16&255,g:e>>8&255,b:255&e}},getRandomColor:function(){for(var t=(16777215*Math.random()<<0).toString(16);t.length<6;)t="0"+t;return"#"+t},get:function(t,e){return void 0===t?e:t},getRGB:function(t){var e;return t in i?(e=i[t],{r:e[0],g:e[1],b:e[2]}):"#"===t[0]?this._hexToRgb(t.substring(1)):"rgb("===t.substr(0,4)?(e=a.exec(t.replace(/ /g,"")),{r:parseInt(e[1],10),g:parseInt(e[2],10),b:parseInt(e[3],10)}):{r:0,g:0,b:0}},colorToRGBA:function(t){return t=t||"black",Konva.Util._namedColorToRBA(t)||Konva.Util._hex3ColorToRGBA(t)||Konva.Util._hex6ColorToRGBA(t)||Konva.Util._rgbColorToRGBA(t)||Konva.Util._rgbaColorToRGBA(t)},_namedColorToRBA:function(t){var e=i[t.toLowerCase()];return e?{r:e[0],g:e[1],b:e[2],a:1}:null},_rgbColorToRGBA:function(t){if(0===t.indexOf("rgb(")){var e=(t=t.match(/rgb\(([^)]+)\)/)[1]).split(/ *, */).map(Number);return{r:e[0],g:e[1],b:e[2],a:1}}},_rgbaColorToRGBA:function(t){if(0===t.indexOf("rgba(")){var e=(t=t.match(/rgba\(([^)]+)\)/)[1]).split(/ *, */).map(Number);return{r:e[0],g:e[1],b:e[2],a:e[3]}}},_hex6ColorToRGBA:function(t){if("#"===t[0]&&7===t.length)return{r:parseInt(t.slice(1,3),16),g:parseInt(t.slice(3,5),16),b:parseInt(t.slice(5,7),16),a:1}},_hex3ColorToRGBA:function(t){if("#"===t[0]&&4===t.length)return{r:parseInt(t[1]+t[1],16),g:parseInt(t[2]+t[2],16),b:parseInt(t[3]+t[3],16),a:1}},_merge:function(t,e){var n=this._clone(e);for(var i in t)this._isObject(t[i])?n[i]=this._merge(t[i],n[i]):n[i]=t[i];return n},haveIntersection:function(t,e){return!(e.x>t.x+t.width||e.x+e.width<t.x||e.y>t.y+t.height||e.y+e.height<t.y)},cloneObject:function(t){var e={};for(var n in t)this._isObject(t[n])?e[n]=this.cloneObject(t[n]):this._isArray(t[n])?e[n]=this.cloneArray(t[n]):e[n]=t[n];return e},cloneArray:function(t){return t.slice(0)},_degToRad:function(e){return e*t},_radToDeg:function(t){return t*e},_capitalize:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},throw:function(t){throw new Error(n+t)},error:function(t){console.error(n+t)},warn:function(t){Konva.global.console&&console.warn&&Konva.showWarnings&&console.warn("Konva warning: "+t)},extend:function(t,e){function n(){this.constructor=t}n.prototype=e.prototype;var i=t.prototype;t.prototype=new n;for(var a in i)i.hasOwnProperty(a)&&(t.prototype[a]=i[a]);t.__super__=e.prototype,t.super=e},addMethods:function(t,e){var n;for(n in e)t.prototype[n]=e[n]},_getControlPoints:function(t,e,n,i,a,r,o){var s=Math.sqrt(Math.pow(n-t,2)+Math.pow(i-e,2)),h=Math.sqrt(Math.pow(a-n,2)+Math.pow(r-i,2)),c=o*s/(s+h),l=o*h/(s+h);return[n-c*(a-t),i-c*(r-e),n+l*(a-t),i+l*(r-e)]},_expandPoints:function(t,e){var n,i,a=t.length,r=[];for(n=2;n<a-2;n+=2)i=Konva.Util._getControlPoints(t[n-2],t[n-1],t[n],t[n+1],t[n+2],t[n+3],e),r.push(i[0]),r.push(i[1]),r.push(t[n]),r.push(t[n+1]),r.push(i[2]),r.push(i[3]);return r},_removeLastLetter:function(t){return t.substring(0,t.length-1)},each:function(t,e){for(var n in t)e(n,t[n])},_inRange:function(t,e,n){return e<=t&&t<n},_getProjectionToSegment:function(t,e,n,i,a,r){var o,s,h,c=(t-n)*(t-n)+(e-i)*(e-i);if(0==c)o=t,s=e,h=(a-n)*(a-n)+(r-i)*(r-i);else{var l=((a-t)*(n-t)+(r-e)*(i-e))/c;l<0?(o=t,s=e,h=(t-a)*(t-a)+(e-r)*(e-r)):l>1?(o=n,s=i,h=(n-a)*(n-a)+(i-r)*(i-r)):h=((o=t+l*(n-t))-a)*(o-a)+((s=e+l*(i-e))-r)*(s-r)}return[o,s,h]},_getProjectionToLine:function(t,e,n){var i=Konva.Util.cloneObject(t),a=Number.MAX_VALUE;return e.forEach(function(r,o){if(n||o!==e.length-1){var s=e[(o+1)%e.length],h=Konva.Util._getProjectionToSegment(r.x,r.y,s.x,s.y,t.x,t.y),c=h[0],l=h[1],d=h[2];d<a&&(i.x=c,i.y=l,a=d)}}),i},_prepareArrayForTween:function(t,e,n){var i,a=[],r=[];if(t.length>e.length){var o=e;e=t,t=o}for(i=0;i<t.length;i+=2)a.push({x:t[i],y:t[i+1]});for(i=0;i<e.length;i+=2)r.push({x:e[i],y:e[i+1]});var s=[];return r.forEach(function(t){var e=Konva.Util._getProjectionToLine(t,a,n);s.push(e.x),s.push(e.y)}),s},_prepareToStringify:function(t){var e;t.visitedByCircularReferenceRemoval=!0;for(var n in t)if(t.hasOwnProperty(n)&&t[n]&&"object"==typeof t[n])if(e=Object.getOwnPropertyDescriptor(t,n),t[n].visitedByCircularReferenceRemoval||Konva.Util._isElement(t[n])){if(!e.configurable)return null;delete t[n]}else if(null===Konva.Util._prepareToStringify(t[n])){if(!e.configurable)return null;delete t[n]}return delete t.visitedByCircularReferenceRemoval,t}}}(),function(){"use strict";var t;Konva.Canvas=function(t){this.init(t)},Konva.Canvas.prototype={init:function(e){var n=(e||{}).pixelRatio||Konva.pixelRatio||function(){if(t)return t;var e=Konva.Util.createCanvasElement().getContext("2d");return t=(Konva.window.devicePixelRatio||1)/(e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1)}();this.pixelRatio=n,this._canvas=Konva.Util.createCanvasElement(),this._canvas.style.padding=0,this._canvas.style.margin=0,this._canvas.style.border=0,this._canvas.style.background="transparent",this._canvas.style.position="absolute",this._canvas.style.top=0,this._canvas.style.left=0},getContext:function(){return this.context},getPixelRatio:function(){return this.pixelRatio},setPixelRatio:function(t){var e=this.pixelRatio;this.pixelRatio=t,this.setSize(this.getWidth()/e,this.getHeight()/e)},setWidth:function(t){this.width=this._canvas.width=t*this.pixelRatio,this._canvas.style.width=t+"px";var e=this.pixelRatio;this.getContext()._context.scale(e,e)},setHeight:function(t){this.height=this._canvas.height=t*this.pixelRatio,this._canvas.style.height=t+"px";var e=this.pixelRatio;this.getContext()._context.scale(e,e)},getWidth:function(){return this.width},getHeight:function(){return this.height},setSize:function(t,e){this.setWidth(t),this.setHeight(e)},toDataURL:function(t,e){try{return this._canvas.toDataURL(t,e)}catch(t){try{return this._canvas.toDataURL()}catch(t){return Konva.Util.warn("Unable to get data URL. "+t.message),""}}}},Konva.SceneCanvas=function(t){var e=t||{},n=e.width||0,i=e.height||0;Konva.Canvas.call(this,e),this.context=new Konva.SceneContext(this),this.setSize(n,i)},Konva.Util.extend(Konva.SceneCanvas,Konva.Canvas),Konva.HitCanvas=function(t){var e=t||{},n=e.width||0,i=e.height||0;Konva.Canvas.call(this,e),this.context=new Konva.HitContext(this),this.setSize(n,i),this.hitCanvas=!0},Konva.Util.extend(Konva.HitCanvas,Konva.Canvas)}(),function(){"use strict";var t=["arc","arcTo","beginPath","bezierCurveTo","clearRect","clip","closePath","createLinearGradient","createPattern","createRadialGradient","drawImage","fill","fillText","getImageData","createImageData","lineTo","moveTo","putImageData","quadraticCurveTo","rect","restore","rotate","save","scale","setLineDash","setTransform","stroke","strokeText","transform","translate"];Konva.Context=function(t){this.init(t)},Konva.Context.prototype={init:function(t){this.canvas=t,this._context=t._canvas.getContext("2d"),Konva.enableTrace&&(this.traceArr=[],this._enableTrace())},fillShape:function(t){t.getFillEnabled()&&this._fill(t)},strokeShape:function(t){t.getStrokeEnabled()&&this._stroke(t)},fillStrokeShape:function(t){t.getFillEnabled()&&this._fill(t),t.getStrokeEnabled()&&this._stroke(t)},getTrace:function(t){var e,n,i,a,r=this.traceArr,o=r.length,s="";for(e=0;e<o;e++)(i=(n=r[e]).method)?(a=n.args,s+=i,t?s+="()":Konva.Util._isArray(a[0])?s+="(["+a.join(",")+"])":s+="("+a.join(",")+")"):(s+=n.property,t||(s+="="+n.val)),s+=";";return s},clearTrace:function(){this.traceArr=[]},_trace:function(t){var e=this.traceArr;e.push(t),e.length>=Konva.traceArrMax&&e.shift()},reset:function(){var t=this.getCanvas().getPixelRatio();this.setTransform(1*t,0,0,1*t,0,0)},getCanvas:function(){return this.canvas},clear:function(t){var e=this.getCanvas();t?this.clearRect(t.x||0,t.y||0,t.width||0,t.height||0):this.clearRect(0,0,e.getWidth()/e.pixelRatio,e.getHeight()/e.pixelRatio)},_applyLineCap:function(t){var e=t.getLineCap();e&&this.setAttr("lineCap",e)},_applyOpacity:function(t){var e=t.getAbsoluteOpacity();1!==e&&this.setAttr("globalAlpha",e)},_applyLineJoin:function(t){var e=t.getLineJoin();e&&this.setAttr("lineJoin",e)},setAttr:function(t,e){this._context[t]=e},arc:function(){var t=arguments;this._context.arc(t[0],t[1],t[2],t[3],t[4],t[5])},beginPath:function(){this._context.beginPath()},bezierCurveTo:function(){var t=arguments;this._context.bezierCurveTo(t[0],t[1],t[2],t[3],t[4],t[5])},clearRect:function(){var t=arguments;this._context.clearRect(t[0],t[1],t[2],t[3])},clip:function(){this._context.clip()},closePath:function(){this._context.closePath()},createImageData:function(){var t=arguments;return 2===t.length?this._context.createImageData(t[0],t[1]):1===t.length?this._context.createImageData(t[0]):void 0},createLinearGradient:function(){var t=arguments;return this._context.createLinearGradient(t[0],t[1],t[2],t[3])},createPattern:function(){var t=arguments;return this._context.createPattern(t[0],t[1])},createRadialGradient:function(){var t=arguments;return this._context.createRadialGradient(t[0],t[1],t[2],t[3],t[4],t[5])},drawImage:function(){var t=arguments,e=this._context;3===t.length?e.drawImage(t[0],t[1],t[2]):5===t.length?e.drawImage(t[0],t[1],t[2],t[3],t[4]):9===t.length&&e.drawImage(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8])},isPointInPath:function(t,e){return this._context.isPointInPath(t,e)},fill:function(){this._context.fill()},fillRect:function(t,e,n,i){this._context.fillRect(t,e,n,i)},strokeRect:function(t,e,n,i){this._context.strokeRect(t,e,n,i)},fillText:function(){var t=arguments;this._context.fillText(t[0],t[1],t[2])},measureText:function(t){return this._context.measureText(t)},getImageData:function(){var t=arguments;return this._context.getImageData(t[0],t[1],t[2],t[3])},lineTo:function(){var t=arguments;this._context.lineTo(t[0],t[1])},moveTo:function(){var t=arguments;this._context.moveTo(t[0],t[1])},rect:function(){var t=arguments;this._context.rect(t[0],t[1],t[2],t[3])},putImageData:function(){var t=arguments;this._context.putImageData(t[0],t[1],t[2])},quadraticCurveTo:function(){var t=arguments;this._context.quadraticCurveTo(t[0],t[1],t[2],t[3])},restore:function(){this._context.restore()},rotate:function(){var t=arguments;this._context.rotate(t[0])},save:function(){this._context.save()},scale:function(){var t=arguments;this._context.scale(t[0],t[1])},setLineDash:function(){var t=arguments,e=this._context;this._context.setLineDash?e.setLineDash(t[0]):"mozDash"in e?e.mozDash=t[0]:"webkitLineDash"in e&&(e.webkitLineDash=t[0])},getLineDash:function(){return this._context.getLineDash()},setTransform:function(){var t=arguments;this._context.setTransform(t[0],t[1],t[2],t[3],t[4],t[5])},stroke:function(){this._context.stroke()},strokeText:function(){var t=arguments;this._context.strokeText(t[0],t[1],t[2])},transform:function(){var t=arguments;this._context.transform(t[0],t[1],t[2],t[3],t[4],t[5])},translate:function(){var t=arguments;this._context.translate(t[0],t[1])},_enableTrace:function(){var e,n,i=this,a=t.length,r=Konva.Util._simplifyArray,o=this.setAttr,s=function(t){var e,a=i[t];i[t]=function(){return n=r(Array.prototype.slice.call(arguments,0)),e=a.apply(i,arguments),i._trace({method:t,args:n}),e}};for(e=0;e<a;e++)s(t[e]);i.setAttr=function(){o.apply(i,arguments);var t=arguments[0],e=arguments[1];"shadowOffsetX"!==t&&"shadowOffsetY"!==t&&"shadowBlur"!==t||(e/=this.canvas.getPixelRatio()),i._trace({property:t,val:e})}}},["fillStyle","strokeStyle","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","lineCap","lineDashOffset","lineJoin","lineWidth","miterLimit","font","textAlign","textBaseline","globalAlpha","globalCompositeOperation"].forEach(function(t){Object.defineProperty(Konva.Context.prototype,t,{get:function(){return this._context[t]},set:function(e){this._context[t]=e}})}),Konva.SceneContext=function(t){Konva.Context.call(this,t)},Konva.SceneContext.prototype={_fillColor:function(t){var e=t.fill();this.setAttr("fillStyle",e),t._fillFunc(this)},_fillPattern:function(t){var e=t.getFillPatternX(),n=t.getFillPatternY(),i=t.getFillPatternScale(),a=Konva.getAngle(t.getFillPatternRotation()),r=t.getFillPatternOffset();(e||n)&&this.translate(e||0,n||0),a&&this.rotate(a),i&&this.scale(i.x,i.y),r&&this.translate(-1*r.x,-1*r.y),this.setAttr("fillStyle",this.createPattern(t.getFillPatternImage(),t.getFillPatternRepeat()||"repeat")),this.fill()},_fillLinearGradient:function(t){var e=t.getFillLinearGradientStartPoint(),n=t.getFillLinearGradientEndPoint(),i=t.getFillLinearGradientColorStops(),a=this.createLinearGradient(e.x,e.y,n.x,n.y);if(i){for(var r=0;r<i.length;r+=2)a.addColorStop(i[r],i[r+1]);this.setAttr("fillStyle",a),t._fillFunc(this)}},_fillRadialGradient:function(t){for(var e=t.getFillRadialGradientStartPoint(),n=t.getFillRadialGradientEndPoint(),i=t.getFillRadialGradientStartRadius(),a=t.getFillRadialGradientEndRadius(),r=t.getFillRadialGradientColorStops(),o=this.createRadialGradient(e.x,e.y,i,n.x,n.y,a),s=0;s<r.length;s+=2)o.addColorStop(r[s],r[s+1]);this.setAttr("fillStyle",o),this.fill()},_fill:function(t){var e=t.fill(),n=t.getFillPriority();if(e&&"color"===n)this._fillColor(t);else{var i=t.getFillPatternImage();if(i&&"pattern"===n)this._fillPattern(t);else{var a=t.getFillLinearGradientColorStops();if(a&&"linear-gradient"===n)this._fillLinearGradient(t);else{var r=t.getFillRadialGradientColorStops();r&&"radial-gradient"===n?this._fillRadialGradient(t):e?this._fillColor(t):i?this._fillPattern(t):a?this._fillLinearGradient(t):r&&this._fillRadialGradient(t)}}}},_strokeLinearGradient:function(t){var e=t.getStrokeLinearGradientStartPoint(),n=t.getStrokeLinearGradientEndPoint(),i=t.getStrokeLinearGradientColorStops(),a=this.createLinearGradient(e.x,e.y,n.x,n.y);if(i){for(var r=0;r<i.length;r+=2)a.addColorStop(i[r],i[r+1]);this.setAttr("strokeStyle",a)}},_stroke:function(t){var e=t.dash(),n=t.getStrokeScaleEnabled()||t instanceof Konva.Text;if(t.hasStroke()){n||(this.save(),this.setTransform(1,0,0,1,0,0)),this._applyLineCap(t),e&&t.dashEnabled()&&(this.setLineDash(e),this.setAttr("lineDashOffset",t.dashOffset())),this.setAttr("lineWidth",t.strokeWidth()),t.getShadowForStrokeEnabled()||this.setAttr("shadowColor","rgba(0,0,0,0)");t.getStrokeLinearGradientColorStops()?this._strokeLinearGradient(t):this.setAttr("strokeStyle",t.stroke()),t._strokeFunc(this),n||this.restore()}},_applyShadow:function(t){var e=Konva.Util,n=e.get(t.getShadowRGBA(),"black"),i=e.get(t.getShadowBlur(),5),a=e.get(t.getShadowOffset(),{x:0,y:0}),r=t.getAbsoluteScale(),o=this.canvas.getPixelRatio(),s=r.x*o,h=r.y*o;this.setAttr("shadowColor",n),this.setAttr("shadowBlur",i*Math.min(Math.abs(s),Math.abs(h))),this.setAttr("shadowOffsetX",a.x*s),this.setAttr("shadowOffsetY",a.y*h)},_applyGlobalCompositeOperation:function(t){var e=t.getGlobalCompositeOperation();"source-over"!==e&&this.setAttr("globalCompositeOperation",e)}},Konva.Util.extend(Konva.SceneContext,Konva.Context),Konva.HitContext=function(t){Konva.Context.call(this,t)},Konva.HitContext.prototype={_fill:function(t){this.save(),this.setAttr("fillStyle",t.colorKey),t._fillFuncHit(this),this.restore()},_stroke:function(t){if(t.hasStroke()&&t.strokeHitEnabled()){var e=t.getStrokeScaleEnabled()||t instanceof Konva.Text;e||(this.save(),this.setTransform(1,0,0,1,0,0)),this._applyLineCap(t),this.setAttr("lineWidth",t.strokeWidth()),this.setAttr("strokeStyle",t.colorKey),t._strokeFuncHit(this),e||this.restore()}}},Konva.Util.extend(Konva.HitContext,Konva.Context)}(),function(){"use strict";Konva.Factory={addGetterSetter:function(t,e,n,i,a){this.addGetter(t,e,n),this.addSetter(t,e,i,a),this.addOverloadedGetterSetter(t,e)},addGetter:function(t,e,n){var i="get"+Konva.Util._capitalize(e);t.prototype[i]=function(){var t=this.attrs[e];return void 0===t?n:t}},addSetter:function(t,e,n,i){var a="set"+Konva.Util._capitalize(e);t.prototype[a]=function(t){return n&&(t=n.call(this,t)),this._setAttr(e,t),i&&i.call(this),this}},addComponentsGetterSetter:function(t,e,n,i,a){var r,o,s=n.length,h=Konva.Util._capitalize,c="get"+h(e),l="set"+h(e);t.prototype[c]=function(){var t={};for(r=0;r<s;r++)t[o=n[r]]=this.getAttr(e+h(o));return t},t.prototype[l]=function(t){var n,r=this.attrs[e];i&&(t=i.call(this,t));for(n in t)t.hasOwnProperty(n)&&this._setAttr(e+h(n),t[n]);return this._fireChangeEvent(e,r,t),a&&a.call(this),this},this.addOverloadedGetterSetter(t,e)},addOverloadedGetterSetter:function(t,e){var n=Konva.Util._capitalize(e),i="set"+n,a="get"+n;t.prototype[e]=function(){return arguments.length?(this[i](arguments[0]),this):this[a]()}},addDeprecatedGetterSetter:function(t,e,n,i){Konva.Util.error("Adding deprecated "+e);var a="get"+Konva.Util._capitalize(e),r=e+" property is deprecated and will be removed soon. Look at Konva change log for more information.";t.prototype[a]=function(){Konva.Util.error(r);var t=this.attrs[e];return void 0===t?n:t},this.addSetter(t,e,i,function(){Konva.Util.error(r)}),this.addOverloadedGetterSetter(t,e)},backCompat:function(t,e){Konva.Util.each(e,function(e,n){var i=t.prototype[n];t.prototype[e]=function(){i.apply(this,arguments),Konva.Util.error(e+" method is deprecated and will be removed soon. Use "+n+" instead")}})},afterSetFilter:function(){this._filterUpToDate=!1}},Konva.Validators={RGBComponent:function(t){return t>255?255:t<0?0:Math.round(t)},alphaComponent:function(t){return t>1?1:t<1e-4?1e-4:t}}}(),function(t){"use strict";var e="absoluteOpacity",n="absoluteTransform",i="absoluteScale",a="listening",r="Shape",o="transform",s=["id"],h=["xChange.konva","yChange.konva","scaleXChange.konva","scaleYChange.konva","skewXChange.konva","skewYChange.konva","rotationChange.konva","offsetXChange.konva","offsetYChange.konva","transformsEnabledChange.konva"].join(" "),c=["scaleXChange.konva","scaleYChange.konva"].join(" ");t.Node=function(t){this._init(t)},t.Util.addMethods(t.Node,{_init:function(r){this._id=t.idCounter++,this.eventListeners={},this.attrs={},this._cache={},this._filterUpToDate=!1,this._isUnderCache=!1,this.setAttrs(r),this.on(h,function(){this._clearCache(o),this._clearSelfAndDescendantCache(n)}),this.on(c,function(){this._clearSelfAndDescendantCache(i)}),this.on("visibleChange.konva",function(){this._clearSelfAndDescendantCache("visible")}),this.on("listeningChange.konva",function(){this._clearSelfAndDescendantCache(a)}),this.on("opacityChange.konva",function(){this._clearSelfAndDescendantCache(e)})},_clearCache:function(t){t?delete this._cache[t]:this._cache={}},_getCache:function(t,e){return void 0===this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]},_clearSelfAndDescendantCache:function(t){this._clearCache(t),this.children&&this.getChildren().each(function(e){e._clearSelfAndDescendantCache(t)})},clearCache:function(){return delete this._cache.canvas,this._filterUpToDate=!1,this},cache:function(n){var a=n||{},r=this.getClientRect({skipTransform:!0,relativeTo:this.getParent()}),o=a.width||r.width,s=a.height||r.height,h=a.pixelRatio,c=a.x||r.x,l=a.y||r.y,d=a.offset||0,u=a.drawBorder||!1;{if(o&&s){o+=2*d,s+=2*d,c-=d,l-=d;var f=new t.SceneCanvas({pixelRatio:h,width:o,height:s}),g=new t.SceneCanvas({pixelRatio:h,width:o,height:s}),v=new t.HitCanvas({pixelRatio:1,width:o,height:s}),p=f.getContext(),m=v.getContext();return v.isCache=!0,this.clearCache(),p.save(),m.save(),p.translate(-c,-l),m.translate(-c,-l),this._isUnderCache=!0,this._clearSelfAndDescendantCache(e),this._clearSelfAndDescendantCache(i),this.drawScene(f,this,!0),this.drawHit(v,this,!0),this._isUnderCache=!1,p.restore(),m.restore(),u&&(p.save(),p.beginPath(),p.rect(0,0,o,s),p.closePath(),p.setAttr("strokeStyle","red"),p.setAttr("lineWidth",5),p.stroke(),p.restore()),this._cache.canvas={scene:f,filter:g,hit:v,x:c,y:l},this}setTimeout(function(){t.Util.throw("Width or height of caching configuration equals 0. Caching is ignored.")})}},getClientRect:function(){throw new Error('abstract "getClientRect" method call')},_transformedRect:function(t,e){var n,i,a,r,o=[{x:t.x,y:t.y},{x:t.x+t.width,y:t.y},{x:t.x+t.width,y:t.y+t.height},{x:t.x,y:t.y+t.height}],s=this.getAbsoluteTransform(e);return o.forEach(function(t){var e=s.point(t);void 0===n&&(n=a=e.x,i=r=e.y),n=Math.min(n,e.x),i=Math.min(i,e.y),a=Math.max(a,e.x),r=Math.max(r,e.y)}),{x:n,y:i,width:a-n,height:r-i}},_drawCachedSceneCanvas:function(t){t.save(),t._applyOpacity(this),t._applyGlobalCompositeOperation(this),t.translate(this._cache.canvas.x,this._cache.canvas.y);var e=this._getCachedSceneCanvas(),n=e.pixelRatio;t.drawImage(e._canvas,0,0,e.width/n,e.height/n),t.restore()},_drawCachedHitCanvas:function(t){var e=this._cache.canvas.hit;t.save(),t.translate(this._cache.canvas.x,this._cache.canvas.y),t.drawImage(e._canvas,0,0),t.restore()},_getCachedSceneCanvas:function(){var e,n,i,a,r=this.filters(),o=this._cache.canvas,s=o.scene,h=o.filter,c=h.getContext();if(r){if(!this._filterUpToDate){var l=s.pixelRatio;try{for(e=r.length,c.clear(),c.drawImage(s._canvas,0,0,s.getWidth()/l,s.getHeight()/l),n=c.getImageData(0,0,h.getWidth(),h.getHeight()),i=0;i<e;i++)"function"==typeof(a=r[i])?(a.call(this,n),c.putImageData(n,0,0)):t.Util.error("Filter should be type of function, but got "+typeof a+" insted. Please check correct filters")}catch(e){t.Util.error("Unable to apply filter. "+e.message)}this._filterUpToDate=!0}return h}return s},on:function(t,e){if(3===arguments.length)return this._delegate.apply(this,arguments);var n,i,a,r,o=t.split(" "),s=o.length;for(n=0;n<s;n++)a=(i=o[n].split("."))[0],r=i[1]||"",this.eventListeners[a]||(this.eventListeners[a]=[]),this.eventListeners[a].push({name:r,handler:e});return this},off:function(t,e){var n,i,a,r,o,s,h=(t||"").split(" "),c=h.length;if(!t)for(i in this.eventListeners)this._off(i);for(n=0;n<c;n++)if(a=h[n],r=a.split("."),o=r[0],s=r[1],o)this.eventListeners[o]&&this._off(o,s,e);else for(i in this.eventListeners)this._off(i,s,e);return this},dispatchEvent:function(t){var e={target:this,type:t.type,evt:t};return this.fire(t.type,e),this},addEventListener:function(t,e){return this.on(t,function(t){e.call(this,t.evt)}),this},removeEventListener:function(t){return this.off(t),this},_delegate:function(e,n,i){var a=this;this.on(e,function(e){for(var r=e.target.findAncestors(n,!0,a),o=0;o<r.length;o++)(e=t.Util.cloneObject(e)).currentTarget=r[o],i.call(r[o],e)})},remove:function(){var t=this.getParent();return t&&t.children&&(t.children.splice(this.index,1),t._setChildrenIndices(),delete this.parent),this._clearSelfAndDescendantCache("stage"),this._clearSelfAndDescendantCache(n),this._clearSelfAndDescendantCache("visible"),this._clearSelfAndDescendantCache(a),this._clearSelfAndDescendantCache(e),this},destroy:function(){t._removeId(this.getId());for(var e=(this.getName()||"").split(/\s/g),n=0;n<e.length;n++){var i=e[n];t._removeName(i,this._id)}return this.remove(),this},getAttr:function(e){var n="get"+t.Util._capitalize(e);return t.Util._isFunction(this[n])?this[n]():this.attrs[e]},getAncestors:function(){for(var e=this.getParent(),n=new t.Collection;e;)n.push(e),e=e.getParent();return n},getAttrs:function(){return this.attrs||{}},setAttrs:function(e){var n,i;if(!e)return this;for(n in e)"children"!==n&&(i="set"+t.Util._capitalize(n),t.Util._isFunction(this[i])?this[i](e[n]):this._setAttr(n,e[n]));return this},isListening:function(){return this._getCache(a,this._isListening)},_isListening:function(){var t=this.getListening(),e=this.getParent();return"inherit"===t?!e||e.isListening():t},isVisible:function(){return this._getCache("visible",this._isVisible)},_isVisible:function(){var t=this.getVisible(),e=this.getParent();return"inherit"===t?!e||e.isVisible():t},shouldDrawHit:function(t){var e=this.getLayer();return t&&t.isCache||e&&e.hitGraphEnabled()&&this.isListening()&&this.isVisible()},show:function(){return this.setVisible(!0),this},hide:function(){return this.setVisible(!1),this},getZIndex:function(){return this.index||0},getAbsoluteZIndex:function(){function t(c){for(e=[],n=c.length,i=0;i<n;i++)a=c[i],h++,a.nodeType!==r&&(e=e.concat(a.getChildren().toArray())),a._id===s._id&&(i=n);e.length>0&&e[0].getDepth()<=o&&t(e)}var e,n,i,a,o=this.getDepth(),s=this,h=0;return"Stage"!==s.nodeType&&t(s.getStage().getChildren()),h},getDepth:function(){for(var t=0,e=this.parent;e;)t++,e=e.parent;return t},setPosition:function(t){return this.setX(t.x),this.setY(t.y),this},getPosition:function(){return{x:this.getX(),y:this.getY()}},getAbsolutePosition:function(e){var n=this.getAbsoluteTransform(e).getMatrix(),i=new t.Transform,a=this.offset();return i.m=n.slice(),i.translate(a.x,a.y),i.getTranslation()},setAbsolutePosition:function(t){var e,n=this._clearTransform();return this.attrs.x=n.x,this.attrs.y=n.y,delete n.x,delete n.y,(e=this.getAbsoluteTransform()).invert(),e.translate(t.x,t.y),t={x:this.attrs.x+e.getTranslation().x,y:this.attrs.y+e.getTranslation().y},this.setPosition({x:t.x,y:t.y}),this._setTransform(n),this},_setTransform:function(t){var e;for(e in t)this.attrs[e]=t[e];this._clearCache(o),this._clearSelfAndDescendantCache(n)},_clearTransform:function(){var t={x:this.getX(),y:this.getY(),rotation:this.getRotation(),scaleX:this.getScaleX(),scaleY:this.getScaleY(),offsetX:this.getOffsetX(),offsetY:this.getOffsetY(),skewX:this.getSkewX(),skewY:this.getSkewY()};return this.attrs.x=0,this.attrs.y=0,this.attrs.rotation=0,this.attrs.scaleX=1,this.attrs.scaleY=1,this.attrs.offsetX=0,this.attrs.offsetY=0,this.attrs.skewX=0,this.attrs.skewY=0,this._clearCache(o),this._clearSelfAndDescendantCache(n),t},move:function(t){var e=t.x,n=t.y,i=this.getX(),a=this.getY();return void 0!==e&&(i+=e),void 0!==n&&(a+=n),this.setPosition({x:i,y:a}),this},_eachAncestorReverse:function(t,e){var n,i,a=[],r=this.getParent();if(e&&e._id===this._id)return t(this),!0;for(a.unshift(this);r&&(!e||r._id!==e._id);)a.unshift(r),r=r.parent;for(n=a.length,i=0;i<n;i++)t(a[i])},rotate:function(t){return this.setRotation(this.getRotation()+t),this},moveToTop:function(){if(!this.parent)return t.Util.warn("Node has no parent. moveToTop function is ignored."),!1;var e=this.index;return this.parent.children.splice(e,1),this.parent.children.push(this),this.parent._setChildrenIndices(),!0},moveUp:function(){if(!this.parent)return t.Util.warn("Node has no parent. moveUp function is ignored."),!1;var e=this.index;return e<this.parent.getChildren().length-1&&(this.parent.children.splice(e,1),this.parent.children.splice(e+1,0,this),this.parent._setChildrenIndices(),!0)},moveDown:function(){if(!this.parent)return t.Util.warn("Node has no parent. moveDown function is ignored."),!1;var e=this.index;return e>0&&(this.parent.children.splice(e,1),this.parent.children.splice(e-1,0,this),this.parent._setChildrenIndices(),!0)},moveToBottom:function(){if(!this.parent)return t.Util.warn("Node has no parent. moveToBottom function is ignored."),!1;var e=this.index;return e>0&&(this.parent.children.splice(e,1),this.parent.children.unshift(this),this.parent._setChildrenIndices(),!0)},setZIndex:function(e){if(!this.parent)return t.Util.warn("Node has no parent. zIndex parameter is ignored."),!1;var n=this.index;return this.parent.children.splice(n,1),this.parent.children.splice(e,0,this),this.parent._setChildrenIndices(),this},getAbsoluteOpacity:function(){return this._getCache(e,this._getAbsoluteOpacity)},_getAbsoluteOpacity:function(){var t=this.getOpacity(),e=this.getParent();return e&&!e._isUnderCache&&(t*=this.getParent().getAbsoluteOpacity()),t},moveTo:function(t){return this.getParent()!==t&&((this.__originalRemove||this.remove).call(this),t.add(this)),this},toObject:function(){var e,n,i,a,r={},o=this.getAttrs();r.attrs={};for(e in o)n=o[e],i=this[e],delete o[e],a=i?i.call(this):null,o[e]=n,a!==n&&(r.attrs[e]=n);return r.className=this.getClassName(),t.Util._prepareToStringify(r)},toJSON:function(){return JSON.stringify(this.toObject())},getParent:function(){return this.parent},findAncestors:function(t,e,n){var i=[];e&&this._isMatch(t)&&i.push(this);for(var a=this.parent;a;){if(a===n)return i;a._isMatch(t)&&i.push(a),a=a.parent}return i},findAncestor:function(t,e,n){return this.findAncestors(t,e,n)[0]},_isMatch:function(e){if(!e)return!1;var n,i,a=e.replace(/ /g,"").split(","),r=a.length;for(n=0;n<r;n++)if(i=a[n],t.Util.isValidSelector(i)||(t.Util.warn('Selector "'+i+'" is invalid. Allowed selectors examples are "#foo", ".bar" or "Group".'),t.Util.warn('If you have a custom shape with such className, please change it to start with upper letter like "Triangle".'),t.Util.warn("Konva is awesome, right?")),"#"===i.charAt(0)){if(this.id()===i.slice(1))return!0}else if("."===i.charAt(0)){if(this.hasName(i.slice(1)))return!0}else if(0!==this._get(i).length)return!0;return!1},getLayer:function(){var t=this.getParent();return t?t.getLayer():null},getStage:function(){return this._getCache("stage",this._getStage)},_getStage:function(){var t=this.getParent();return t?t.getStage():void 0},fire:function(t,e,n){return e=e||{},e.target=e.target||this,n?this._fireAndBubble(t,e):this._fire(t,e),this},getAbsoluteTransform:function(t){return t?this._getAbsoluteTransform(t):this._getCache(n,this._getAbsoluteTransform)},_getAbsoluteTransform:function(e){var n,i,a=new t.Transform;return this._eachAncestorReverse(function(t){n=t.transformsEnabled(),i=t.getTransform(),"all"===n?a.multiply(i):"position"===n&&a.translate(t.x(),t.y())},e),a},getAbsoluteScale:function(t){return t?this._getAbsoluteScale(t):this._getCache(i,this._getAbsoluteScale)},_getAbsoluteScale:function(t){for(var e=this;e;)e._isUnderCache&&(t=e),e=e.getParent();var n=1,i=1;return this._eachAncestorReverse(function(t){n*=t.scaleX(),i*=t.scaleY()},t),{x:n,y:i}},getTransform:function(){return this._getCache(o,this._getTransform)},_getTransform:function(){var e=new t.Transform,n=this.getX(),i=this.getY(),a=t.getAngle(this.getRotation()),r=this.getScaleX(),o=this.getScaleY(),s=this.getSkewX(),h=this.getSkewY(),c=this.getOffsetX(),l=this.getOffsetY();return 0===n&&0===i||e.translate(n,i),0!==a&&e.rotate(a),0===s&&0===h||e.skew(s,h),1===r&&1===o||e.scale(r,o),0===c&&0===l||e.translate(-1*c,-1*l),e},clone:function(e){var n,i,a,r,o,h=t.Util.cloneObject(this.attrs);for(var c in s){delete h[s[c]]}for(n in e)h[n]=e[n];var l=new this.constructor(h);for(n in this.eventListeners)for(a=(i=this.eventListeners[n]).length,r=0;r<a;r++)(o=i[r]).name.indexOf("konva")<0&&(l.eventListeners[n]||(l.eventListeners[n]=[]),l.eventListeners[n].push(o));return l},_toKonvaCanvas:function(e){e=e||{};var n=this.getStage(),i=e.x||0,a=e.y||0,r=e.pixelRatio||1,o=new t.SceneCanvas({width:e.width||this.getWidth()||(n?n.getWidth():0),height:e.height||this.getHeight()||(n?n.getHeight():0),pixelRatio:r}),s=o.getContext();return s.save(),(i||a)&&s.translate(-1*i,-1*a),this.drawScene(o),s.restore(),o},toCanvas:function(t){return this._toKonvaCanvas(t)._canvas},toDataURL:function(t){var e=(t=t||{}).mimeType||null,n=t.quality||null;return this._toKonvaCanvas(t).toDataURL(e,n)},toImage:function(e){if(!e||!e.callback)throw"callback required for toImage method config argument";t.Util._getImage(this.toDataURL(e),function(t){e.callback(t)})},setSize:function(t){return this.setWidth(t.width),this.setHeight(t.height),this},getSize:function(){return{width:this.getWidth(),height:this.getHeight()}},getWidth:function(){return this.attrs.width||0},getHeight:function(){return this.attrs.height||0},getClassName:function(){return this.className||this.nodeType},getType:function(){return this.nodeType},getDragDistance:function(){return void 0!==this.attrs.dragDistance?this.attrs.dragDistance:this.parent?this.parent.getDragDistance():t.dragDistance},_get:function(t){return this.className===t||this.nodeType===t?[this]:[]},_off:function(t,e,n){var i,a,r,o=this.eventListeners[t];for(i=0;i<o.length;i++)if(a=o[i].name,r=o[i].handler,!("konva"===a&&"konva"!==e||e&&a!==e||n&&n!==r)){if(o.splice(i,1),0===o.length){delete this.eventListeners[t];break}i--}},_fireChangeEvent:function(t,e,n){this._fire(t+"Change",{oldVal:e,newVal:n})},setId:function(e){var n=this.getId();return t._removeId(n),t._addId(this,e),this._setAttr("id",e),this},setName:function(e){var n,i,a=(this.getName()||"").split(/\s/g),r=(e||"").split(/\s/g);for(i=0;i<a.length;i++)n=a[i],-1===r.indexOf(n)&&n&&t._removeName(n,this._id);for(i=0;i<r.length;i++)n=r[i],-1===a.indexOf(n)&&n&&t._addName(this,n);return this._setAttr("name",e),this},addName:function(t){if(!this.hasName(t)){var e=this.name(),n=e?e+" "+t:t;this.setName(n)}return this},hasName:function(t){return-1!==(this.name()||"").split(/\s/g).indexOf(t)},removeName:function(t){var e=(this.name()||"").split(/\s/g),n=e.indexOf(t);return-1!==n&&(e.splice(n,1),this.setName(e.join(" "))),this},setAttr:function(e,n){var i=this["set"+t.Util._capitalize(e)];return t.Util._isFunction(i)?i.call(this,n):this._setAttr(e,n),this},_setAttr:function(e,n){var i;(i=this.attrs[e])===n&&!t.Util.isObject(n)||(void 0===n||null===n?delete this.attrs[e]:this.attrs[e]=n,this._fireChangeEvent(e,i,n))},_setComponentAttr:function(t,e,n){var i;void 0!==n&&((i=this.attrs[t])||(this.attrs[t]=this.getAttr(t)),this.attrs[t][e]=n,this._fireChangeEvent(t,i,n))},_fireAndBubble:function(t,e,n){var i=!0;if(e&&this.nodeType===r&&(e.target=this),"mouseenter"===t&&n&&(this._id===n._id||this.isAncestorOf&&this.isAncestorOf(n))?i=!1:"mouseleave"===t&&n&&(this._id===n._id||this.isAncestorOf&&this.isAncestorOf(n))&&(i=!1),i){this._fire(t,e);var a=("mouseenter"===t||"mouseleave"===t)&&n&&n.isAncestorOf&&n.isAncestorOf(this)&&!n.isAncestorOf(this.parent);(e&&!e.cancelBubble||!e)&&this.parent&&this.parent.isListening()&&!a&&(n&&n.parent?this._fireAndBubble.call(this.parent,t,e,n.parent):this._fireAndBubble.call(this.parent,t,e))}},_fire:function(t,e){var n,i=this.eventListeners[t];if(e=e||{},e.currentTarget=this,e.type=t,i)for(n=0;n<i.length;n++)i[n].handler.call(this,e)},draw:function(){return this.drawScene(),this.drawHit(),this}}),t.Node.create=function(e,n){return t.Util._isString(e)&&(e=JSON.parse(e)),this._createNode(e,n)},t.Node._createNode=function(e,n){var i,a,r,o=t.Node.prototype.getClassName.call(e),s=e.children;if(n&&(e.attrs.container=n),i=new t[o](e.attrs),s)for(a=s.length,r=0;r<a;r++)i.add(this._createNode(s[r]));return i},t.Factory.addOverloadedGetterSetter(t.Node,"position"),t.Factory.addGetterSetter(t.Node,"x",0),t.Factory.addGetterSetter(t.Node,"y",0),t.Factory.addGetterSetter(t.Node,"globalCompositeOperation","source-over"),t.Factory.addGetterSetter(t.Node,"opacity",1),t.Factory.addGetter(t.Node,"name"),t.Factory.addOverloadedGetterSetter(t.Node,"name"),t.Factory.addGetter(t.Node,"id"),t.Factory.addOverloadedGetterSetter(t.Node,"id"),t.Factory.addGetterSetter(t.Node,"rotation",0),t.Factory.addComponentsGetterSetter(t.Node,"scale",["x","y"]),t.Factory.addGetterSetter(t.Node,"scaleX",1),t.Factory.addGetterSetter(t.Node,"scaleY",1),t.Factory.addComponentsGetterSetter(t.Node,"skew",["x","y"]),t.Factory.addGetterSetter(t.Node,"skewX",0),t.Factory.addGetterSetter(t.Node,"skewY",0),t.Factory.addComponentsGetterSetter(t.Node,"offset",["x","y"]),t.Factory.addGetterSetter(t.Node,"offsetX",0),t.Factory.addGetterSetter(t.Node,"offsetY",0),t.Factory.addSetter(t.Node,"dragDistance"),t.Factory.addOverloadedGetterSetter(t.Node,"dragDistance"),t.Factory.addSetter(t.Node,"width",0),t.Factory.addOverloadedGetterSetter(t.Node,"width"),t.Factory.addSetter(t.Node,"height",0),t.Factory.addOverloadedGetterSetter(t.Node,"height"),t.Factory.addGetterSetter(t.Node,"listening","inherit"),t.Factory.addGetterSetter(t.Node,"preventDefault",!0),t.Factory.addGetterSetter(t.Node,"filters",void 0,function(t){return this._filterUpToDate=!1,t}),t.Factory.addGetterSetter(t.Node,"visible","inherit"),t.Factory.addGetterSetter(t.Node,"transformsEnabled","all"),t.Factory.addOverloadedGetterSetter(t.Node,"size"),t.Factory.backCompat(t.Node,{rotateDeg:"rotate",setRotationDeg:"setRotation",getRotationDeg:"getRotation"}),t.Collection.mapMethods(t.Node)}(Konva),function(){"use strict";Konva.Filters.Grayscale=function(t){var e,n,i=t.data,a=i.length;for(e=0;e<a;e+=4)n=.34*i[e]+.5*i[e+1]+.16*i[e+2],i[e]=n,i[e+1]=n,i[e+2]=n}}(),function(t){"use strict";t.Filters.Brighten=function(t){var e,n=255*this.brightness(),i=t.data,a=i.length;for(e=0;e<a;e+=4)i[e]+=n,i[e+1]+=n,i[e+2]+=n},t.Factory.addGetterSetter(t.Node,"brightness",0,null,t.Factory.afterSetFilter)}(Konva),function(){"use strict";Konva.Filters.Invert=function(t){var e,n=t.data,i=n.length;for(e=0;e<i;e+=4)n[e]=255-n[e],n[e+1]=255-n[e+1],n[e+2]=255-n[e+2]}}(),function(t){"use strict";function e(){this.r=0,this.g=0,this.b=0,this.a=0,this.next=null}var n=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259],i=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];t.Filters.Blur=function(t){var a=Math.round(this.blurRadius());a>0&&function(t,a){var r,o,s,h,c,l,d,u,f,g,v,p,m,_,y,S,K,x,C,b,w,F,T,P,M=t.data,A=t.width,k=t.height,G=a+a+1,R=A-1,D=k-1,L=a+1,O=L*(L+1)/2,I=new e,N=null,U=I,E=null,B=null,H=n[a],z=i[a];for(s=1;s<G;s++)U=U.next=new e,s===L&&(N=U);for(U.next=I,d=l=0,o=0;o<k;o++){for(S=K=x=C=u=f=g=v=0,p=L*(b=M[l]),m=L*(w=M[l+1]),_=L*(F=M[l+2]),y=L*(T=M[l+3]),u+=O*b,f+=O*w,g+=O*F,v+=O*T,U=I,s=0;s<L;s++)U.r=b,U.g=w,U.b=F,U.a=T,U=U.next;for(s=1;s<L;s++)h=l+((R<s?R:s)<<2),u+=(U.r=b=M[h])*(P=L-s),f+=(U.g=w=M[h+1])*P,g+=(U.b=F=M[h+2])*P,v+=(U.a=T=M[h+3])*P,S+=b,K+=w,x+=F,C+=T,U=U.next;for(E=I,B=N,r=0;r<A;r++)M[l+3]=T=v*H>>z,0!==T?(T=255/T,M[l]=(u*H>>z)*T,M[l+1]=(f*H>>z)*T,M[l+2]=(g*H>>z)*T):M[l]=M[l+1]=M[l+2]=0,u-=p,f-=m,g-=_,v-=y,p-=E.r,m-=E.g,_-=E.b,y-=E.a,h=d+((h=r+a+1)<R?h:R)<<2,u+=S+=E.r=M[h],f+=K+=E.g=M[h+1],g+=x+=E.b=M[h+2],v+=C+=E.a=M[h+3],E=E.next,p+=b=B.r,m+=w=B.g,_+=F=B.b,y+=T=B.a,S-=b,K-=w,x-=F,C-=T,B=B.next,l+=4;d+=A}for(r=0;r<A;r++){for(K=x=C=S=f=g=v=u=0,p=L*(b=M[l=r<<2]),m=L*(w=M[l+1]),_=L*(F=M[l+2]),y=L*(T=M[l+3]),u+=O*b,f+=O*w,g+=O*F,v+=O*T,U=I,s=0;s<L;s++)U.r=b,U.g=w,U.b=F,U.a=T,U=U.next;for(c=A,s=1;s<=a;s++)l=c+r<<2,u+=(U.r=b=M[l])*(P=L-s),f+=(U.g=w=M[l+1])*P,g+=(U.b=F=M[l+2])*P,v+=(U.a=T=M[l+3])*P,S+=b,K+=w,x+=F,C+=T,U=U.next,s<D&&(c+=A);for(l=r,E=I,B=N,o=0;o<k;o++)M[3+(h=l<<2)]=T=v*H>>z,T>0?(T=255/T,M[h]=(u*H>>z)*T,M[h+1]=(f*H>>z)*T,M[h+2]=(g*H>>z)*T):M[h]=M[h+1]=M[h+2]=0,u-=p,f-=m,g-=_,v-=y,p-=E.r,m-=E.g,_-=E.b,y-=E.a,h=r+((h=o+L)<D?h:D)*A<<2,u+=S+=E.r=M[h],f+=K+=E.g=M[h+1],g+=x+=E.b=M[h+2],v+=C+=E.a=M[h+3],E=E.next,p+=b=B.r,m+=w=B.g,_+=F=B.b,y+=T=B.a,S-=b,K-=w,x-=F,C-=T,B=B.next,l+=A}}(t,a)},t.Factory.addGetterSetter(t.Node,"blurRadius",0,null,t.Factory.afterSetFilter)}(Konva),function(){"use strict";function t(t,e,n){var i=4*(n*t.width+e),a=[];return a.push(t.data[i++],t.data[i++],t.data[i++],t.data[i++]),a}function e(t,e){return Math.sqrt(Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2)+Math.pow(t[2]-e[2],2))}Konva.Filters.Mask=function(n){var i=function(n,i){var a=t(n,0,0),r=t(n,n.width-1,0),o=t(n,0,n.height-1),s=t(n,n.width-1,n.height-1),h=i||10;if(e(a,r)<h&&e(r,s)<h&&e(s,o)<h&&e(o,a)<h){for(var c=function(t){for(var e=[0,0,0],n=0;n<t.length;n++)e[0]+=t[n][0],e[1]+=t[n][1],e[2]+=t[n][2];return e[0]/=t.length,e[1]/=t.length,e[2]/=t.length,e}([r,a,s,o]),l=[],d=0;d<n.width*n.height;d++){var u=e(c,[n.data[4*d],n.data[4*d+1],n.data[4*d+2]]);l[d]=u<h?0:255}return l}}(n,this.threshold());return i&&function(t,e){for(var n=0;n<t.width*t.height;n++)t.data[4*n+3]=e[n]}(n,i=function(t,e,n){for(var i=[1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9],a=Math.round(Math.sqrt(i.length)),r=Math.floor(a/2),o=[],s=0;s<n;s++)for(var h=0;h<e;h++){for(var c=s*e+h,l=0,d=0;d<a;d++)for(var u=0;u<a;u++){var f=s+d-r,g=h+u-r;if(f>=0&&f<n&&g>=0&&g<e){var v=i[d*a+u];l+=t[f*e+g]*v}}o[c]=l}return o}(i=function(t,e,n){for(var i=[1,1,1,1,1,1,1,1,1],a=Math.round(Math.sqrt(i.length)),r=Math.floor(a/2),o=[],s=0;s<n;s++)for(var h=0;h<e;h++){for(var c=s*e+h,l=0,d=0;d<a;d++)for(var u=0;u<a;u++){var f=s+d-r,g=h+u-r;if(f>=0&&f<n&&g>=0&&g<e){var v=i[d*a+u];l+=t[f*e+g]*v}}o[c]=l>=1020?255:0}return o}(i=function(t,e,n){for(var i=[1,1,1,1,0,1,1,1,1],a=Math.round(Math.sqrt(i.length)),r=Math.floor(a/2),o=[],s=0;s<n;s++)for(var h=0;h<e;h++){for(var c=s*e+h,l=0,d=0;d<a;d++)for(var u=0;u<a;u++){var f=s+d-r,g=h+u-r;if(f>=0&&f<n&&g>=0&&g<e){var v=i[d*a+u];l+=t[f*e+g]*v}}o[c]=2040===l?255:0}return o}(i,n.width,n.height),n.width,n.height),n.width,n.height)),n},Konva.Factory.addGetterSetter(Konva.Node,"threshold",0,null,Konva.Factory.afterSetFilter)}(),function(){"use strict";Konva.Filters.RGB=function(t){var e,n,i=t.data,a=i.length,r=this.red(),o=this.green(),s=this.blue();for(e=0;e<a;e+=4)n=(.34*i[e]+.5*i[e+1]+.16*i[e+2])/255,i[e]=n*r,i[e+1]=n*o,i[e+2]=n*s,i[e+3]=i[e+3]},Konva.Factory.addGetterSetter(Konva.Node,"red",0,function(t){return this._filterUpToDate=!1,t>255?255:t<0?0:Math.round(t)}),Konva.Factory.addGetterSetter(Konva.Node,"green",0,function(t){return this._filterUpToDate=!1,t>255?255:t<0?0:Math.round(t)}),Konva.Factory.addGetterSetter(Konva.Node,"blue",0,Konva.Validators.RGBComponent,Konva.Factory.afterSetFilter)}(),function(){"use strict";Konva.Filters.RGBA=function(t){var e,n,i=t.data,a=i.length,r=this.red(),o=this.green(),s=this.blue(),h=this.alpha();for(e=0;e<a;e+=4)n=1-h,i[e]=r*h+i[e]*n,i[e+1]=o*h+i[e+1]*n,i[e+2]=s*h+i[e+2]*n},Konva.Factory.addGetterSetter(Konva.Node,"red",0,function(t){return this._filterUpToDate=!1,t>255?255:t<0?0:Math.round(t)}),Konva.Factory.addGetterSetter(Konva.Node,"green",0,function(t){return this._filterUpToDate=!1,t>255?255:t<0?0:Math.round(t)}),Konva.Factory.addGetterSetter(Konva.Node,"blue",0,Konva.Validators.RGBComponent,Konva.Factory.afterSetFilter),Konva.Factory.addGetterSetter(Konva.Node,"alpha",1,function(t){return this._filterUpToDate=!1,t>1?1:t<0?0:t})}(),function(){"use strict";Konva.Filters.HSV=function(t){var e,n,i,a,r,o=t.data,s=o.length,h=Math.pow(2,this.value()),c=Math.pow(2,this.saturation()),l=Math.abs(this.hue()+360)%360,d=h*c*Math.cos(l*Math.PI/180),u=h*c*Math.sin(l*Math.PI/180),f=.299*h+.701*d+.167*u,g=.587*h-.587*d+.33*u,v=.114*h-.114*d-.497*u,p=.299*h-.299*d-.328*u,m=.587*h+.413*d+.035*u,_=.114*h-.114*d+.293*u,y=.299*h-.3*d+1.25*u,S=.587*h-.586*d-1.05*u,K=.114*h+.886*d-.2*u;for(e=0;e<s;e+=4)n=o[e+0],i=o[e+1],a=o[e+2],r=o[e+3],o[e+0]=f*n+g*i+v*a,o[e+1]=p*n+m*i+_*a,o[e+2]=y*n+S*i+K*a,o[e+3]=r},Konva.Factory.addGetterSetter(Konva.Node,"hue",0,null,Konva.Factory.afterSetFilter),Konva.Factory.addGetterSetter(Konva.Node,"saturation",0,null,Konva.Factory.afterSetFilter),Konva.Factory.addGetterSetter(Konva.Node,"value",0,null,Konva.Factory.afterSetFilter)}(),function(){"use strict";Konva.Factory.addGetterSetter(Konva.Node,"hue",0,null,Konva.Factory.afterSetFilter),Konva.Factory.addGetterSetter(Konva.Node,"saturation",0,null,Konva.Factory.afterSetFilter),Konva.Factory.addGetterSetter(Konva.Node,"luminance",0,null,Konva.Factory.afterSetFilter),Konva.Filters.HSL=function(t){var e,n,i,a,r,o=t.data,s=o.length,h=Math.pow(2,this.saturation()),c=Math.abs(this.hue()+360)%360,l=127*this.luminance(),d=1*h*Math.cos(c*Math.PI/180),u=1*h*Math.sin(c*Math.PI/180),f=.299+.701*d+.167*u,g=.587-.587*d+.33*u,v=.114-.114*d-.497*u,p=.299-.299*d-.328*u,m=.587+.413*d+.035*u,_=.114-.114*d+.293*u,y=.299-.3*d+1.25*u,S=.587-.586*d-1.05*u,K=.114+.886*d-.2*u;for(e=0;e<s;e+=4)n=o[e+0],i=o[e+1],a=o[e+2],r=o[e+3],o[e+0]=f*n+g*i+v*a+l,o[e+1]=p*n+m*i+_*a+l,o[e+2]=y*n+S*i+K*a+l,o[e+3]=r}}(),function(){"use strict";Konva.Filters.Emboss=function(t){var e=10*this.embossStrength(),n=255*this.embossWhiteLevel(),i=this.embossDirection(),a=this.embossBlend(),r=0,o=0,s=t.data,h=t.width,c=t.height,l=4*h,d=c;switch(i){case"top-left":r=-1,o=-1;break;case"top":r=-1,o=0;break;case"top-right":r=-1,o=1;break;case"right":r=0,o=1;break;case"bottom-right":r=1,o=1;break;case"bottom":r=1,o=0;break;case"bottom-left":r=1,o=-1;break;case"left":r=0,o=-1;break;default:Konva.Util.error("Unknown emboss direction: "+i)}do{var u=(d-1)*l,f=r;d+f<1&&(f=0),d+f>c&&(f=0);var g=(d-1+f)*h*4,v=h;do{var p=u+4*(v-1),m=o;v+m<1&&(m=0),v+m>h&&(m=0);var _=g+4*(v-1+m),y=s[p]-s[_],S=s[p+1]-s[_+1],K=s[p+2]-s[_+2],x=y,C=x>0?x:-x;if((S>0?S:-S)>C&&(x=S),(K>0?K:-K)>C&&(x=K),x*=e,a){var b=s[p]+x,w=s[p+1]+x,F=s[p+2]+x;s[p]=b>255?255:b<0?0:b,s[p+1]=w>255?255:w<0?0:w,s[p+2]=F>255?255:F<0?0:F}else{var T=n-x;T<0?T=0:T>255&&(T=255),s[p]=s[p+1]=s[p+2]=T}}while(--v)}while(--d)},Konva.Factory.addGetterSetter(Konva.Node,"embossStrength",.5,null,Konva.Factory.afterSetFilter),Konva.Factory.addGetterSetter(Konva.Node,"embossWhiteLevel",.5,null,Konva.Factory.afterSetFilter),Konva.Factory.addGetterSetter(Konva.Node,"embossDirection","top-left",null,Konva.Factory.afterSetFilter),Konva.Factory.addGetterSetter(Konva.Node,"embossBlend",!1,null,Konva.Factory.afterSetFilter)}(),function(){"use strict";function t(t,e,n,i,a){var r,o=n-e,s=a-i;return 0===o?i+s/2:0===s?i:(r=(t-e)/o,r=s*r+i)}Konva.Filters.Enhance=function(e){var n,i,a,r,o=e.data,s=o.length,h=o[0],c=h,l=o[1],d=l,u=o[2],f=u,g=this.enhance();if(0!==g){for(r=0;r<s;r+=4)(n=o[r+0])<h?h=n:n>c&&(c=n),(i=o[r+1])<l?l=i:i>d&&(d=i),(a=o[r+2])<u?u=a:a>f&&(f=a);c===h&&(c=255,h=0),d===l&&(d=255,l=0),f===u&&(f=255,u=0);var v,p,m,_,y,S,K,x,C;for(g>0?(p=c+g*(255-c),m=h-g*(h-0),y=d+g*(255-d),S=l-g*(l-0),x=f+g*(255-f),C=u-g*(u-0)):(p=c+g*(c-(v=.5*(c+h))),m=h+g*(h-v),y=d+g*(d-(_=.5*(d+l))),S=l+g*(l-_),x=f+g*(f-(K=.5*(f+u))),C=u+g*(u-K)),r=0;r<s;r+=4)o[r+0]=t(o[r+0],h,c,m,p),o[r+1]=t(o[r+1],l,d,S,y),o[r+2]=t(o[r+2],u,f,C,x)}},Konva.Factory.addGetterSetter(Konva.Node,"enhance",0,null,Konva.Factory.afterSetFilter)}(),function(){"use strict";Konva.Filters.Posterize=function(t){var e,n=Math.round(254*this.levels())+1,i=t.data,a=i.length,r=255/n;for(e=0;e<a;e+=1)i[e]=Math.floor(i[e]/r)*r},Konva.Factory.addGetterSetter(Konva.Node,"levels",.5,null,Konva.Factory.afterSetFilter)}(),function(){"use strict";Konva.Filters.Noise=function(t){var e,n=255*this.noise(),i=t.data,a=i.length,r=n/2;for(e=0;e<a;e+=4)i[e+0]+=r-2*r*Math.random(),i[e+1]+=r-2*r*Math.random(),i[e+2]+=r-2*r*Math.random()},Konva.Factory.addGetterSetter(Konva.Node,"noise",.2,null,Konva.Factory.afterSetFilter)}(),function(){"use strict";Konva.Filters.Pixelate=function(t){var e,n,i,a,r,o,s,h,c,l,d,u,f,g,v=Math.ceil(this.pixelSize()),p=t.width,m=t.height,_=Math.ceil(p/v),y=Math.ceil(m/v);if(t=t.data,v<=0)Konva.Util.error("pixelSize value can not be <= 0");else for(u=0;u<_;u+=1)for(f=0;f<y;f+=1){for(a=0,r=0,o=0,s=0,c=(h=u*v)+v,d=(l=f*v)+v,g=0,e=h;e<c;e+=1)if(!(e>=p))for(n=l;n<d;n+=1)n>=m||(a+=t[(i=4*(p*n+e))+0],r+=t[i+1],o+=t[i+2],s+=t[i+3],g+=1);for(a/=g,r/=g,o/=g,s/=g,e=h;e<c;e+=1)if(!(e>=p))for(n=l;n<d;n+=1)n>=m||(t[(i=4*(p*n+e))+0]=a,t[i+1]=r,t[i+2]=o,t[i+3]=s)}},Konva.Factory.addGetterSetter(Konva.Node,"pixelSize",8,null,Konva.Factory.afterSetFilter)}(),function(){"use strict";Konva.Filters.Threshold=function(t){var e,n=255*this.threshold(),i=t.data,a=i.length;for(e=0;e<a;e+=1)i[e]=i[e]<n?0:255},Konva.Factory.addGetterSetter(Konva.Node,"threshold",.5,null,Konva.Factory.afterSetFilter)}(),function(){"use strict";/**
FIND j=3553 line= * Sepia Filter
FIND j=3554 line= * Based on: Pixastic Lib - Sepia filter - v0.1.0
FIND j=3555 line= * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/
FIND j=3556 line= * @function
FIND j=3557 line= * @name Sepia
FIND j=3558 line= * @memberof Konva.Filters
FIND j=3559 line= * @param {Object} imageData
FIND j=3560 line= * @author Jacob Seidelin <jseidelin@nihilogic.dk>
FIND j=3561 line= * @license MPL v1.1 [http://www.pixastic.com/lib/license.txt]
FIND j=3562 line= * @example
FIND j=3563 line= * node.cache();
FIND j=3564 line= * node.filters([Konva.Filters.Sepia]);
FIND j=3565 line= */
FIND j=3566 line=Konva.Filters.Sepia=function(t){var e,n,i,a,r,o,s,h,c,l=t.data,d=t.width,u=t.height,f=4*d;do{e=(u-1)*f,n=d;do{s=.393*(a=l[i=e+4*(n-1)])+.769*(r=l[i+1])+.189*(o=l[i+2]),h=.349*a+.686*r+.168*o,c=.272*a+.534*r+.131*o,l[i]=s>255?255:s,l[i+1]=h>255?255:h,l[i+2]=c>255?255:c,l[i+3]=l[i+3]}while(--n)}while(--u)}}(),function(){"use strict";Konva.Filters.Solarize=function(t){var e=t.data,n=t.width,i=4*n,a=t.height;do{var r=(a-1)*i,o=n;do{var s=r+4*(o-1),h=e[s],c=e[s+1],l=e[s+2];h>127&&(h=255-h),c>127&&(c=255-c),l>127&&(l=255-l),e[s]=h,e[s+1]=c,e[s+2]=l}while(--o)}while(--a)}}(),function(){"use strict";Konva.Filters.Kaleidoscope=function(t){var e,n,i,a,r,o,s,h,c,l=t.width,d=t.height,u=Math.round(this.kaleidoscopePower()),f=Math.round(this.kaleidoscopeAngle()),g=Math.floor(l*(f%360)/360);if(!(u<1)){var v=Konva.Util.createCanvasElement();v.width=l,v.height=d;var p=v.getContext("2d").getImageData(0,0,l,d);!function(t,e,n){var i,a,r,o,s=t.data,h=e.data,c=t.width,l=t.height,d=n.polarCenterX||c/2,u=n.polarCenterY||l/2,f=0,g=0,v=0,p=0,m=Math.sqrt(d*d+u*u);a=c-d,r=l-u,m=(o=Math.sqrt(a*a+r*r))>m?o:m;var _,y,S,K,x=l,C=c,b=360/C*Math.PI/180;for(y=0;y<C;y+=1)for(S=Math.sin(y*b),K=Math.cos(y*b),_=0;_<x;_+=1)a=Math.floor(d+m*_/x*K),f=s[0+(i=4*((r=Math.floor(u+m*_/x*S))*c+a))],g=s[i+1],v=s[i+2],p=s[i+3],h[0+(i=4*(y+_*c))]=f,h[i+1]=g,h[i+2]=v,h[i+3]=p}(t,p,{polarCenterX:l/2,polarCenterY:d/2});for(var m=l/Math.pow(2,u);m<=8;)m*=2,u-=1;var _=m=Math.ceil(m),y=0,S=_,K=1;for(g+m>l&&(y=_,S=0,K=-1),n=0;n<d;n+=1)for(e=y;e!==S;e+=K)h=4*(l*n+Math.round(e+g)%l),a=p.data[h+0],r=p.data[h+1],o=p.data[h+2],s=p.data[h+3],c=4*(l*n+e),p.data[c+0]=a,p.data[c+1]=r,p.data[c+2]=o,p.data[c+3]=s;for(n=0;n<d;n+=1)for(_=Math.floor(m),i=0;i<u;i+=1){for(e=0;e<_+1;e+=1)h=4*(l*n+e),a=p.data[h+0],r=p.data[h+1],o=p.data[h+2],s=p.data[h+3],c=4*(l*n+2*_-e-1),p.data[c+0]=a,p.data[c+1]=r,p.data[c+2]=o,p.data[c+3]=s;_*=2}!function(t,e,n){var i,a,r,o,s,h,c=t.data,l=e.data,d=t.width,u=t.height,f=n.polarCenterX||d/2,g=n.polarCenterY||u/2,v=0,p=0,m=0,_=0,y=Math.sqrt(f*f+g*g);a=d-f,r=u-g,y=(h=Math.sqrt(a*a+r*r))>y?h:y;var S,K,x,C=u,b=d,w=n.polarRotation||0;for(a=0;a<d;a+=1)for(r=0;r<u;r+=1)o=a-f,s=r-g,S=Math.sqrt(o*o+s*s)*C/y,K=(K=(180*Math.atan2(s,o)/Math.PI+360+w)%360)*b/360,x=Math.floor(K),v=c[0+(i=4*(Math.floor(S)*d+x))],p=c[i+1],m=c[i+2],_=c[i+3],l[0+(i=4*(r*d+a))]=v,l[i+1]=p,l[i+2]=m,l[i+3]=_}(p,t,{polarRotation:0})}},Konva.Factory.addGetterSetter(Konva.Node,"kaleidoscopePower",2,null,Konva.Factory.afterSetFilter),Konva.Factory.addGetterSetter(Konva.Node,"kaleidoscopeAngle",0,null,Konva.Factory.afterSetFilter)}(),function(t){"use strict";t.Filters.Contrast=function(t){var e,n=Math.pow((parseInt(this.contrast())+100)/100,2),i=t.data,a=i.length,r=150,o=150,s=150;for(e=0;e<a;e+=4)r=i[e],o=i[e+1],s=i[e+2],r/=255,r-=.5,r*=n,r+=.5,o/=255,o-=.5,o*=n,o+=.5,o*=255,s/=255,s-=.5,s*=n,s+=.5,s*=255,r=(r*=255)<0?0:r>255?255:r,o=o<0?0:o>255?255:o,s=s<0?0:s>255?255:s,i[e]=r,i[e+1]=o,i[e+2]=s},t.Factory.addGetterSetter(t.Node,"contrast",0,null,t.Factory.afterSetFilter)}(Konva),function(){"use strict";Konva.Container=function(t){this.__init(t)},Konva.Util.addMethods(Konva.Container,{__init:function(t){this.children=new Konva.Collection,Konva.Node.call(this,t)},getChildren:function(t){if(!t)return this.children;var e=new Konva.Collection;return this.children.each(function(n){t(n)&&e.push(n)}),e},hasChildren:function(){return this.getChildren().length>0},removeChildren:function(){for(var t,e=Konva.Collection.toCollection(this.children),n=0;n<e.length;n++)delete(t=e[n]).parent,t.index=0,t.remove();return e=null,this.children=new Konva.Collection,this},destroyChildren:function(){for(var t,e=Konva.Collection.toCollection(this.children),n=0;n<e.length;n++)delete(t=e[n]).parent,t.index=0,t.destroy();return e=null,this.children=new Konva.Collection,this},add:function(t){if(arguments.length>1){for(var e=0;e<arguments.length;e++)this.add(arguments[e]);return this}if(t.getParent())return t.moveTo(this),this;var n=this.children;return this._validateAdd(t),t.index=n.length,t.parent=this,n.push(t),this._fire("add",{child:t}),Konva.DD&&t.isDragging()&&Konva.DD.anim.setLayers(t.getLayer()),this},destroy:function(){return this.hasChildren()&&this.destroyChildren(),Konva.Node.prototype.destroy.call(this),this},find:function(t){return this._generalFind(t,!1)},findOne:function(t){var e=this._generalFind(t,!0);return e.length>0?e[0]:void 0},_generalFind:function(t,e){var n=[];return"string"==typeof t?n=this._findByString(t,e):"function"==typeof t&&(n=this._findByFunction(t,e)),Konva.Collection.toCollection(n)},_findByString:function(t){var e,n,i,a,r,o,s,h=[],c=t.replace(/ /g,"").split(","),l=c.length;for(e=0;e<l;e++)if(i=c[e],Konva.Util.isValidSelector(i)||(Konva.Util.warn('Selector "'+i+'" is invalid. Allowed selectors examples are "#foo", ".bar" or "Group".'),Konva.Util.warn('If you have a custom shape with such className, please change it to start with upper letter like "Triangle".'),Konva.Util.warn("Konva is awesome, right?")),"#"===i.charAt(0))(r=this._getNodeById(i.slice(1)))&&h.push(r);else if("."===i.charAt(0))a=this._getNodesByName(i.slice(1)),h=h.concat(a);else for(s=(o=this.getChildren()).length,n=0;n<s;n++)h=h.concat(o[n]._get(i));return h},_findByFunction:function(t,e){var n=[],i=function(a){if(!(e&&n.length>0)){var r=a.getChildren(),o=r.length;t(a)&&(n=n.concat(a));for(var s=0;s<o;s++)i(r[s])}};return i(this),n},_getNodeById:function(t){var e=Konva.ids[t];return void 0!==e&&this.isAncestorOf(e)?e:null},_getNodesByName:function(t){var e=Konva.names[t]||[];return this._getDescendants(e)},_get:function(t){for(var e=Konva.Node.prototype._get.call(this,t),n=this.getChildren(),i=n.length,a=0;a<i;a++)e=e.concat(n[a]._get(t));return e},toObject:function(){var t=Konva.Node.prototype.toObject.call(this);t.children=[];for(var e=this.getChildren(),n=e.length,i=0;i<n;i++){var a=e[i];t.children.push(a.toObject())}return t},_getDescendants:function(t){for(var e=[],n=t.length,i=0;i<n;i++){var a=t[i];this.isAncestorOf(a)&&e.push(a)}return e},isAncestorOf:function(t){for(var e=t.getParent();e;){if(e._id===this._id)return!0;e=e.getParent()}return!1},clone:function(t){var e=Konva.Node.prototype.clone.call(this,t);return this.getChildren().each(function(t){e.add(t.clone())}),e},getAllIntersections:function(t){var e=[];return this.find("Shape").each(function(n){n.isVisible()&&n.intersects(t)&&e.push(n)}),e},_setChildrenIndices:function(){this.children.each(function(t,e){t.index=e})},drawScene:function(t,e,n){var i=this.getLayer(),a=t||i&&i.getCanvas(),r=a&&a.getContext(),o=this._cache.canvas,s=o&&o.scene;return(this.isVisible()||n)&&(!n&&s?(r.save(),i._applyTransform(this,r,e),this._drawCachedSceneCanvas(r),r.restore()):this._drawChildren(a,"drawScene",e,!1,n)),this},drawHit:function(t,e,n){var i=this.getLayer(),a=t||i&&i.hitCanvas,r=a&&a.getContext(),o=this._cache.canvas,s=o&&o.hit;return(this.shouldDrawHit(a)||n)&&(i&&i.clearHitCache(),!n&&s?(r.save(),i._applyTransform(this,r,e),this._drawCachedHitCanvas(r),r.restore()):this._drawChildren(a,"drawHit",e)),this},_drawChildren:function(t,e,n,i,a){var r,o,s=this.getLayer(),h=t&&t.getContext(),c=this.getClipWidth(),l=this.getClipHeight(),d=this.getClipFunc(),u=c&&l||d;if(u&&s){h.save();var f=this.getAbsoluteTransform(n),g=f.getMatrix();h.transform(g[0],g[1],g[2],g[3],g[4],g[5]),h.beginPath(),d?d.call(this,h,this):(r=this.getClipX(),o=this.getClipY(),h.rect(r,o,c,l)),h.clip(),g=f.copy().invert().getMatrix(),h.transform(g[0],g[1],g[2],g[3],g[4],g[5])}this.children.each(function(r){r[e](t,n,i,a)}),u&&h.restore()},shouldDrawHit:function(t){var e=this.getLayer(),n=Konva.DD&&Konva.isDragging()&&-1!==Konva.DD.anim.getLayers().indexOf(e);return t&&t.isCache||e&&e.hitGraphEnabled()&&this.isVisible()&&!n},getClientRect:function(t){var e,n,i,a,r=(t=t||{}).skipTransform,o=t.relativeTo,s={x:0,y:0,width:0,height:0},h=this;this.children.each(function(t){if(t.getVisible()){var r=t.getClientRect({relativeTo:h});void 0===e?(e=r.x,n=r.y,i=r.x+r.width,a=r.y+r.height):(e=Math.min(e,r.x),n=Math.min(n,r.y),i=Math.max(i,r.x+r.width),a=Math.max(a,r.y+r.height))}});for(var c=this.find("Shape"),l=!1,d=0;d<c.length;d++){if(c[d].getVisible()){l=!0;break}}return l&&(s={x:e,y:n,width:i-e,height:a-n}),r?s:this._transformedRect(s,o)}}),Konva.Util.extend(Konva.Container,Konva.Node),Konva.Container.prototype.get=Konva.Container.prototype.find,Konva.Factory.addComponentsGetterSetter(Konva.Container,"clip",["x","y","width","height"]),Konva.Factory.addGetterSetter(Konva.Container,"clipX"),Konva.Factory.addGetterSetter(Konva.Container,"clipY"),Konva.Factory.addGetterSetter(Konva.Container,"clipWidth"),Konva.Factory.addGetterSetter(Konva.Container,"clipHeight"),Konva.Factory.addGetterSetter(Konva.Container,"clipFunc"),Konva.Collection.mapMethods(Konva.Container)}(),function(t){"use strict";function e(t){t.fill()}function n(t){t.stroke()}function i(t){t.fill()}function a(t){t.stroke()}function r(){this._clearCache(s)}function o(){this._clearCache(h)}var s="hasShadow",h="shadowRGBA";t.Shape=function(t){this.__init(t)},t.Util.addMethods(t.Shape,{__init:function(s){this.nodeType="Shape",this._fillFunc=e,this._strokeFunc=n,this._fillFuncHit=i,this._strokeFuncHit=a;for(var h,c=t.shapes;!(h=t.Util.getRandomColor())||h in c;);this.colorKey=h,c[h]=this,t.Node.call(this,s),this.on("shadowColorChange.konva shadowBlurChange.konva shadowOffsetChange.konva shadowOpacityChange.konva shadowEnabledChange.konva",r),this.on("shadowColorChange.konva shadowOpacityChange.konva shadowEnabledChange.konva",o)},hasChildren:function(){return!1},getChildren:function(){return[]},getContext:function(){return this.getLayer().getContext()},getCanvas:function(){return this.getLayer().getCanvas()},hasShadow:function(){return this._getCache(s,this._hasShadow)},_hasShadow:function(){return this.getShadowEnabled()&&0!==this.getShadowOpacity()&&!!(this.getShadowColor()||this.getShadowBlur()||this.getShadowOffsetX()||this.getShadowOffsetY())},getShadowRGBA:function(){return this._getCache(h,this._getShadowRGBA)},_getShadowRGBA:function(){if(this.hasShadow()){var e=t.Util.colorToRGBA(this.shadowColor());return"rgba("+e.r+","+e.g+","+e.b+","+e.a*(this.getShadowOpacity()||1)+")"}},hasFill:function(){return!!(this.getFill()||this.getFillPatternImage()||this.getFillLinearGradientColorStops()||this.getFillRadialGradientColorStops())},hasStroke:function(){return this.strokeEnabled()&&!(!this.stroke()&&!this.getStrokeLinearGradientColorStops())},intersects:function(t){var e=this.getStage().bufferHitCanvas;return e.getContext().clear(),this.drawHit(e),e.context.getImageData(Math.round(t.x),Math.round(t.y),1,1).data[3]>0},destroy:function(){return t.Node.prototype.destroy.call(this),delete t.shapes[this.colorKey],this},_useBufferCanvas:function(t){return!t&&this.perfectDrawEnabled()&&1!==this.getAbsoluteOpacity()&&this.hasFill()&&this.hasStroke()&&this.getStage()||this.perfectDrawEnabled()&&this.hasShadow()&&1!==this.getAbsoluteOpacity()&&this.hasFill()&&this.hasStroke()&&this.getStage()},getSelfRect:function(){var t=this.getSize();return{x:this._centroid?Math.round(-t.width/2):0,y:this._centroid?Math.round(-t.height/2):0,width:t.width,height:t.height}},getClientRect:function(t){var e=(t=t||{}).skipTransform,n=t.relativeTo,i=this.getSelfRect(),a=this.hasStroke()&&this.strokeWidth()||0,r=i.width+a,o=i.height+a,s=this.hasShadow()?this.shadowOffsetX():0,h=this.hasShadow()?this.shadowOffsetY():0,c=r+Math.abs(s),l=o+Math.abs(h),d=this.hasShadow()&&this.shadowBlur()||0,u=c+2*d,f=l+2*d,g=0;Math.round(a/2)!==a/2&&(g=1);var v={width:u+g,height:f+g,x:-Math.round(a/2+d)+Math.min(s,0)+i.x,y:-Math.round(a/2+d)+Math.min(h,0)+i.y};return e?v:this._transformedRect(v,n)},drawScene:function(t,e,n,i){var a,r,o,s=this.getLayer(),h=t||s.getCanvas(),c=h.getContext(),l=this._cache.canvas,d=this.sceneFunc(),u=this.hasShadow(),f=this.hasStroke();if(!this.isVisible()&&!n)return this;if(l)return c.save(),s._applyTransform(this,c,e),this._drawCachedSceneCanvas(c),c.restore(),this;if(!d)return this;if(c.save(),this._useBufferCanvas(n)&&!i){if(a=this.getStage(),r=a.bufferCanvas,(o=r.getContext()).clear(),o.save(),o._applyLineJoin(this),!n)if(s)s._applyTransform(this,o,e);else{var g=this.getAbsoluteTransform(e).getMatrix();c.transform(g[0],g[1],g[2],g[3],g[4],g[5])}d.call(this,o),o.restore();var v=r.pixelRatio;u&&!h.hitCanvas?(c.save(),c._applyShadow(this),c._applyOpacity(this),c._applyGlobalCompositeOperation(this),c.drawImage(r._canvas,0,0,r.width/v,r.height/v),c.restore()):(c._applyOpacity(this),c._applyGlobalCompositeOperation(this),c.drawImage(r._canvas,0,0,r.width/v,r.height/v))}else{if(c._applyLineJoin(this),!n)if(s)s._applyTransform(this,c,e);else{var p=this.getAbsoluteTransform(e).getMatrix();c.transform(p[0],p[1],p[2],p[3],p[4],p[5])}u&&f&&!h.hitCanvas?(c.save(),n||(c._applyOpacity(this),c._applyGlobalCompositeOperation(this)),c._applyShadow(this),d.call(this,c),c.restore(),this.hasFill()&&this.getShadowForStrokeEnabled()&&d.call(this,c)):u&&!h.hitCanvas?(c.save(),n||(c._applyOpacity(this),c._applyGlobalCompositeOperation(this)),c._applyShadow(this),d.call(this,c),c.restore()):(n||(c._applyOpacity(this),c._applyGlobalCompositeOperation(this)),d.call(this,c))}return c.restore(),this},drawHit:function(t,e,n){var i=this.getLayer(),a=t||i.hitCanvas,r=a.getContext(),o=this.hitFunc()||this.sceneFunc(),s=this._cache.canvas,h=s&&s.hit;if(!this.shouldDrawHit(a)&&!n)return this;if(i&&i.clearHitCache(),h)return r.save(),i._applyTransform(this,r,e),this._drawCachedHitCanvas(r),r.restore(),this;if(!o)return this;if(r.save(),r._applyLineJoin(this),!n)if(i)i._applyTransform(this,r,e);else{var c=this.getAbsoluteTransform(e).getMatrix();r.transform(c[0],c[1],c[2],c[3],c[4],c[5])}return o.call(this,r),r.restore(),this},drawHitFromCache:function(e){var n,i,a,r,o,s=e||0,h=this._cache.canvas,c=this._getCachedSceneCanvas(),l=h.hit,d=l.getContext(),u=l.getWidth(),f=l.getHeight();d.clear(),d.drawImage(c._canvas,0,0,u,f);try{for(a=(i=(n=d.getImageData(0,0,u,f)).data).length,r=t.Util._hexToRgb(this.colorKey),o=0;o<a;o+=4)i[o+3]>s?(i[o]=r.r,i[o+1]=r.g,i[o+2]=r.b,i[o+3]=255):i[o+3]=0;d.putImageData(n,0,0)}catch(e){t.Util.error("Unable to draw hit graph from cached scene canvas. "+e.message)}return this}}),t.Util.extend(t.Shape,t.Node),t.Factory.addGetterSetter(t.Shape,"stroke"),t.Factory.addGetterSetter(t.Shape,"strokeWidth",2),t.Factory.addGetterSetter(t.Shape,"strokeHitEnabled",!0),t.Factory.addGetterSetter(t.Shape,"perfectDrawEnabled",!0),t.Factory.addGetterSetter(t.Shape,"shadowForStrokeEnabled",!0),t.Factory.addGetterSetter(t.Shape,"lineJoin"),t.Factory.addGetterSetter(t.Shape,"lineCap"),t.Factory.addGetterSetter(t.Shape,"sceneFunc"),t.Factory.addGetterSetter(t.Shape,"hitFunc"),t.Factory.addGetterSetter(t.Shape,"dash"),t.Factory.addGetterSetter(t.Shape,"dashOffset",0),t.Factory.addGetterSetter(t.Shape,"shadowColor"),t.Factory.addGetterSetter(t.Shape,"shadowBlur"),t.Factory.addGetterSetter(t.Shape,"shadowOpacity"),t.Factory.addComponentsGetterSetter(t.Shape,"shadowOffset",["x","y"]),t.Factory.addGetterSetter(t.Shape,"shadowOffsetX",0),t.Factory.addGetterSetter(t.Shape,"shadowOffsetY",0),t.Factory.addGetterSetter(t.Shape,"fillPatternImage"),t.Factory.addGetterSetter(t.Shape,"fill"),t.Factory.addGetterSetter(t.Shape,"fillPatternX",0),t.Factory.addGetterSetter(t.Shape,"fillPatternY",0),t.Factory.addGetterSetter(t.Shape,"fillLinearGradientColorStops"),t.Factory.addGetterSetter(t.Shape,"strokeLinearGradientColorStops"),t.Factory.addGetterSetter(t.Shape,"fillRadialGradientStartRadius",0),t.Factory.addGetterSetter(t.Shape,"fillRadialGradientEndRadius",0),t.Factory.addGetterSetter(t.Shape,"fillRadialGradientColorStops"),t.Factory.addGetterSetter(t.Shape,"fillPatternRepeat","repeat"),t.Factory.addGetterSetter(t.Shape,"fillEnabled",!0),t.Factory.addGetterSetter(t.Shape,"strokeEnabled",!0),t.Factory.addGetterSetter(t.Shape,"shadowEnabled",!0),t.Factory.addGetterSetter(t.Shape,"dashEnabled",!0),t.Factory.addGetterSetter(t.Shape,"strokeScaleEnabled",!0),t.Factory.addGetterSetter(t.Shape,"fillPriority","color"),t.Factory.addComponentsGetterSetter(t.Shape,"fillPatternOffset",["x","y"]),t.Factory.addGetterSetter(t.Shape,"fillPatternOffsetX",0),t.Factory.addGetterSetter(t.Shape,"fillPatternOffsetY",0),t.Factory.addComponentsGetterSetter(t.Shape,"fillPatternScale",["x","y"]),t.Factory.addGetterSetter(t.Shape,"fillPatternScaleX",1),t.Factory.addGetterSetter(t.Shape,"fillPatternScaleY",1),t.Factory.addComponentsGetterSetter(t.Shape,"fillLinearGradientStartPoint",["x","y"]),t.Factory.addComponentsGetterSetter(t.Shape,"strokeLinearGradientStartPoint",["x","y"]),t.Factory.addGetterSetter(t.Shape,"fillLinearGradientStartPointX",0),t.Factory.addGetterSetter(t.Shape,"strokeLinearGradientStartPointX",0),t.Factory.addGetterSetter(t.Shape,"fillLinearGradientStartPointY",0),t.Factory.addGetterSetter(t.Shape,"strokeLinearGradientStartPointY",0),t.Factory.addComponentsGetterSetter(t.Shape,"fillLinearGradientEndPoint",["x","y"]),t.Factory.addComponentsGetterSetter(t.Shape,"strokeLinearGradientEndPoint",["x","y"]),t.Factory.addGetterSetter(t.Shape,"fillLinearGradientEndPointX",0),t.Factory.addGetterSetter(t.Shape,"strokeLinearGradientEndPointX",0),t.Factory.addGetterSetter(t.Shape,"fillLinearGradientEndPointY",0),t.Factory.addGetterSetter(t.Shape,"strokeLinearGradientEndPointY",0),t.Factory.addComponentsGetterSetter(t.Shape,"fillRadialGradientStartPoint",["x","y"]),t.Factory.addGetterSetter(t.Shape,"fillRadialGradientStartPointX",0),t.Factory.addGetterSetter(t.Shape,"fillRadialGradientStartPointY",0),t.Factory.addComponentsGetterSetter(t.Shape,"fillRadialGradientEndPoint",["x","y"]),t.Factory.addGetterSetter(t.Shape,"fillRadialGradientEndPointX",0),t.Factory.addGetterSetter(t.Shape,"fillRadialGradientEndPointY",0),t.Factory.addGetterSetter(t.Shape,"fillPatternRotation",0),t.Factory.backCompat(t.Shape,{dashArray:"dash",getDashArray:"getDash",setDashArray:"getDash",drawFunc:"sceneFunc",getDrawFunc:"getSceneFunc",setDrawFunc:"setSceneFunc",drawHitFunc:"hitFunc",getDrawHitFunc:"getHitFunc",setDrawHitFunc:"setHitFunc"}),t.Collection.mapMethods(t.Shape)}(Konva),function(){"use strict";function t(t,e){t.content.addEventListener(e,function(n){t[r+e](n)},!1)}var e="mouseout",n="mouseleave",i="contextmenu",a="touchstart",r="_",o=["mousedown","mousemove","mouseup",e,a,"touchmove","touchend","mouseover","wheel",i],s=o.length;Konva.Stage=function(t){this.___init(t)},Konva.Util.addMethods(Konva.Stage,{___init:function(t){this.nodeType="Stage",Konva.Container.call(this,t),this._id=Konva.idCounter++,this._buildDOM(),this._bindContentEvents(),this._enableNestedTransforms=!1,Konva.stages.push(this)},_validateAdd:function(t){"Layer"!==t.getType()&&Konva.Util.throw("You may only add layers to the stage.")},setContainer:function(t){if("string"==typeof t){if("."===t.charAt(0)){var e=t.slice(1);t=Konva.document.getElementsByClassName(e)[0]}else{var n;n="#"!==t.charAt(0)?t:t.slice(1),t=Konva.document.getElementById(n)}if(!t)throw"Can not find container in document with id "+n}return this._setAttr("container",t),this},shouldDrawHit:function(){return!0},draw:function(){return Konva.Node.prototype.draw.call(this),this},setHeight:function(t){return Konva.Node.prototype.setHeight.call(this,t),this._resizeDOM(),this},setWidth:function(t){return Konva.Node.prototype.setWidth.call(this,t),this._resizeDOM(),this},clear:function(){var t,e=this.children,n=e.length;for(t=0;t<n;t++)e[t].clear();return this},clone:function(t){return t||(t={}),t.container=Konva.document.createElement("div"),Konva.Container.prototype.clone.call(this,t)},destroy:function(){var t=this.content;Konva.Container.prototype.destroy.call(this),t&&Konva.Util._isInDocument(t)&&this.getContainer().removeChild(t);var e=Konva.stages.indexOf(this);return e>-1&&Konva.stages.splice(e,1),this},getPointerPosition:function(){return this.pointerPos},getStage:function(){return this},getContent:function(){return this.content},toDataURL:function(t){var e=(t=t||{}).mimeType||null,n=t.quality||null,i=t.x||0,a=t.y||0,r=new Konva.SceneCanvas({width:t.width||this.getWidth(),height:t.height||this.getHeight(),pixelRatio:t.pixelRatio||1}),o=r.getContext()._context,s=this.children;(i||a)&&o.translate(-1*i,-1*a),s.each(function(t){var e=t.getCanvas().getWidth(),n=t.getCanvas().getHeight(),i=t.getCanvas().getPixelRatio();o.drawImage(t.getCanvas()._canvas,0,0,e/i,n/i)});var h=r.toDataURL(e,n);return t.callback&&t.callback(h),h},toImage:function(t){var e=t.callback;t.callback=function(t){Konva.Util._getImage(t,function(t){e(t)})},this.toDataURL(t)},getIntersection:function(t,e){var n,i,a=this.getChildren();for(n=a.length-1;n>=0;n--)if(i=a[n].getIntersection(t,e))return i;return null},_resizeDOM:function(){if(this.content){var t,e,n=this.getWidth(),i=this.getHeight(),a=this.getChildren(),r=a.length;for(this.content.style.width=n+"px",this.content.style.height=i+"px",this.bufferCanvas.setSize(n,i),this.bufferHitCanvas.setSize(n,i),t=0;t<r;t++)(e=a[t]).setSize(n,i),e.draw()}},add:function(t){if(arguments.length>1){for(var e=0;e<arguments.length;e++)this.add(arguments[e]);return this}return Konva.Container.prototype.add.call(this,t),t._setCanvasSize(this.width(),this.height()),t.draw(),Konva.isBrowser&&this.content.appendChild(t.canvas._canvas),this},getParent:function(){return null},getLayer:function(){return null},getLayers:function(){return this.getChildren()},_bindContentEvents:function(){if(Konva.isBrowser)for(var e=0;e<s;e++)t(this,o[e])},_mouseover:function(t){Konva.UA.mobile||(this._setPointerPosition(t),this._fire("contentMouseover",{evt:t}))},_mouseout:function(t){if(!Konva.UA.mobile){this._setPointerPosition(t);var i=this.targetShape;i&&!Konva.isDragging()&&(i._fireAndBubble(e,{evt:t}),i._fireAndBubble(n,{evt:t}),this.targetShape=null),this.pointerPos=void 0,this._fire("contentMouseout",{evt:t})}},_mousemove:function(t){if(Konva.UA.ieMobile)return this._touchmove(t);if((void 0!==t.movementX||void 0!==t.movementY)&&0===t.movementY&&0===t.movementX)return null;if(Konva.UA.mobile)return null;this._setPointerPosition(t);var i;Konva.isDragging()||((i=this.getIntersection(this.getPointerPosition()))&&i.isListening()?Konva.isDragging()||this.targetShape&&this.targetShape._id===i._id?i._fireAndBubble("mousemove",{evt:t}):(this.targetShape&&(this.targetShape._fireAndBubble(e,{evt:t},i),this.targetShape._fireAndBubble(n,{evt:t},i)),i._fireAndBubble("mouseover",{evt:t},this.targetShape),i._fireAndBubble("mouseenter",{evt:t},this.targetShape),this.targetShape=i):(this.targetShape&&!Konva.isDragging()&&(this.targetShape._fireAndBubble(e,{evt:t}),this.targetShape._fireAndBubble(n,{evt:t}),this.targetShape=null),this._fire("mousemove",{evt:t,target:this,currentTarget:this})),this._fire("contentMousemove",{evt:t})),t.cancelable&&t.preventDefault()},_mousedown:function(t){if(Konva.UA.ieMobile)return this._touchstart(t);if(!Konva.UA.mobile){this._setPointerPosition(t);var e=this.getIntersection(this.getPointerPosition());Konva.listenClickTap=!0,e&&e.isListening()?(this.clickStartShape=e,e._fireAndBubble("mousedown",{evt:t})):this._fire("mousedown",{evt:t,target:this,currentTarget:this}),this._fire("contentMousedown",{evt:t})}t.cancelable&&t.preventDefault()},_mouseup:function(t){if(Konva.UA.ieMobile)return this._touchend(t);if(!Konva.UA.mobile){this._setPointerPosition(t);var e=this.getIntersection(this.getPointerPosition()),n=this.clickStartShape,i=this.clickEndShape,a=!1,r=Konva.DD;Konva.inDblClickWindow?(a=!0,clearTimeout(this.dblTimeout)):r&&r.justDragged?r&&(r.justDragged=!1):Konva.inDblClickWindow=!0,this.dblTimeout=setTimeout(function(){Konva.inDblClickWindow=!1},Konva.dblClickWindow),e&&e.isListening()?(this.clickEndShape=e,e._fireAndBubble("mouseup",{evt:t}),Konva.listenClickTap&&n&&n._id===e._id&&(e._fireAndBubble("click",{evt:t}),a&&i&&i._id===e._id&&e._fireAndBubble("dblclick",{evt:t}))):(this._fire("mouseup",{evt:t,target:this,currentTarget:this}),this._fire("click",{evt:t,target:this,currentTarget:this}),a&&this._fire("dblclick",{evt:t,target:this,currentTarget:this})),this._fire("contentMouseup",{evt:t}),Konva.listenClickTap&&(this._fire("contentClick",{evt:t}),a&&this._fire("contentDblclick",{evt:t})),Konva.listenClickTap=!1}t.cancelable&&t.preventDefault()},_contextmenu:function(t){this._setPointerPosition(t);var e=this.getIntersection(this.getPointerPosition());e&&e.isListening()?e._fireAndBubble(i,{evt:t}):this._fire(i,{evt:t,target:this,currentTarget:this}),this._fire("contentContextmenu",{evt:t})},_touchstart:function(t){this._setPointerPosition(t);var e=this.getIntersection(this.getPointerPosition());Konva.listenClickTap=!0,e&&e.isListening()?(this.tapStartShape=e,e._fireAndBubble(a,{evt:t}),e.isListening()&&e.preventDefault()&&t.cancelable&&t.preventDefault()):this._fire(a,{evt:t,target:this,currentTarget:this}),this._fire("contentTouchstart",{evt:t})},_touchend:function(t){this._setPointerPosition(t);var e=this.getIntersection(this.getPointerPosition()),n=!1;Konva.inDblClickWindow?(n=!0,clearTimeout(this.dblTimeout)):Konva.inDblClickWindow=!0,this.dblTimeout=setTimeout(function(){Konva.inDblClickWindow=!1},Konva.dblClickWindow),e&&e.isListening()?(e._fireAndBubble("touchend",{evt:t}),Konva.listenClickTap&&this.tapStartShape&&e._id===this.tapStartShape._id&&(e._fireAndBubble("tap",{evt:t}),n&&e._fireAndBubble("dbltap",{evt:t})),e.isListening()&&e.preventDefault()&&t.cancelable&&t.preventDefault()):(this._fire("touchend",{evt:t,target:this,currentTarget:this}),this._fire("tap",{evt:t,target:this,currentTarget:this}),n&&this._fire("dbltap",{evt:t,target:this,currentTarget:this})),this._fire("contentTouchend",{evt:t}),Konva.listenClickTap&&(this._fire("contentTap",{evt:t}),n&&this._fire("contentDbltap",{evt:t})),Konva.listenClickTap=!1},_touchmove:function(t){this._setPointerPosition(t);var e,n=Konva.DD;Konva.isDragging()||((e=this.getIntersection(this.getPointerPosition()))&&e.isListening()?(e._fireAndBubble("touchmove",{evt:t}),e.isListening()&&e.preventDefault()&&t.cancelable&&t.preventDefault()):this._fire("touchmove",{evt:t,target:this,currentTarget:this}),this._fire("contentTouchmove",{evt:t})),n&&Konva.isDragging()&&Konva.DD.node.preventDefault()&&t.cancelable&&t.preventDefault()},_wheel:function(t){this._setPointerPosition(t);var e=this.getIntersection(this.getPointerPosition());e&&e.isListening()?e._fireAndBubble("wheel",{evt:t}):this._fire("wheel",{evt:t,target:this,currentTarget:this}),this._fire("contentWheel",{evt:t})},_setPointerPosition:function(t){var e=this._getContentPosition(),n=null,i=null;if(void 0!==(t=t||window.event).touches){if(t.touches.length>0){var a=t.touches[0];n=a.clientX-e.left,i=a.clientY-e.top}}else n=t.clientX-e.left,i=t.clientY-e.top;null!==n&&null!==i&&(this.pointerPos={x:n,y:i})},_getContentPosition:function(){var t=this.content.getBoundingClientRect?this.content.getBoundingClientRect():{top:0,left:0};return{top:t.top,left:t.left}},_buildDOM:function(){if(this.bufferCanvas=new Konva.SceneCanvas,this.bufferHitCanvas=new Konva.HitCanvas({pixelRatio:1}),Konva.isBrowser){var t=this.getContainer();if(!t)throw"Stage has no container. A container is required.";t.innerHTML="",this.content=Konva.document.createElement("div"),this.content.style.position="relative",this.content.className="konvajs-content",this.content.setAttribute("role","presentation"),t.appendChild(this.content),this._resizeDOM()}},_onContent:function(t,e){var n,i,a=t.split(" "),r=a.length;for(n=0;n<r;n++)i=a[n],this.content.addEventListener(i,e,!1)},cache:function(){Konva.Util.warn("Cache function is not allowed for stage. You may use cache only for layers, groups and shapes.")},clearCache:function(){}}),Konva.Util.extend(Konva.Stage,Konva.Container),Konva.Factory.addGetter(Konva.Stage,"container"),Konva.Factory.addOverloadedGetterSetter(Konva.Stage,"container")}(),function(t){"use strict";t.BaseLayer=function(t){this.___init(t)},t.Util.addMethods(t.BaseLayer,{___init:function(e){this.nodeType="Layer",t.Container.call(this,e)},createPNGStream:function(){return this.canvas._canvas.createPNGStream()},getCanvas:function(){return this.canvas},getHitCanvas:function(){return this.hitCanvas},getContext:function(){return this.getCanvas().getContext()},clear:function(t){return this.getContext().clear(t),this},clearHitCache:function(){this._hitImageData=void 0},setZIndex:function(e){t.Node.prototype.setZIndex.call(this,e);var n=this.getStage();return n&&(n.content.removeChild(this.getCanvas()._canvas),e<n.getChildren().length-1?n.content.insertBefore(this.getCanvas()._canvas,n.getChildren()[e+1].getCanvas()._canvas):n.content.appendChild(this.getCanvas()._canvas)),this},moveToTop:function(){t.Node.prototype.moveToTop.call(this);var e=this.getStage();return e&&(e.content.removeChild(this.getCanvas()._canvas),e.content.appendChild(this.getCanvas()._canvas)),this},moveUp:function(){if(!t.Node.prototype.moveUp.call(this))return this;var e=this.getStage();return e?(e.content.removeChild(this.getCanvas()._canvas),this.index<e.getChildren().length-1?e.content.insertBefore(this.getCanvas()._canvas,e.getChildren()[this.index+1].getCanvas()._canvas):e.content.appendChild(this.getCanvas()._canvas),this):this},moveDown:function(){if(t.Node.prototype.moveDown.call(this)){var e=this.getStage();if(e){var n=e.getChildren();e.content.removeChild(this.getCanvas()._canvas),e.content.insertBefore(this.getCanvas()._canvas,n[this.index+1].getCanvas()._canvas)}}return this},moveToBottom:function(){if(t.Node.prototype.moveToBottom.call(this)){var e=this.getStage();if(e){var n=e.getChildren();e.content.removeChild(this.getCanvas()._canvas),e.content.insertBefore(this.getCanvas()._canvas,n[1].getCanvas()._canvas)}}return this},getLayer:function(){return this},remove:function(){var e=this.getCanvas()._canvas;return t.Node.prototype.remove.call(this),e&&e.parentNode&&t.Util._isInDocument(e)&&e.parentNode.removeChild(e),this},getStage:function(){return this.parent},setSize:function(t,e){return this.canvas.setSize(t,e),this},getWidth:function(){if(this.parent)return this.parent.getWidth()},setWidth:function(){t.Util.warn('Can not change width of layer. Use "stage.width(value)" function instead.')},getHeight:function(){if(this.parent)return this.parent.getHeight()},setHeight:function(){t.Util.warn('Can not change height of layer. Use "stage.height(value)" function instead.')},_applyTransform:function(t,e,n){var i=t.getAbsoluteTransform(n).getMatrix();e.transform(i[0],i[1],i[2],i[3],i[4],i[5])}}),t.Util.extend(t.BaseLayer,t.Container),t.Factory.addGetterSetter(t.BaseLayer,"clearBeforeDraw",!0),t.Collection.mapMethods(t.BaseLayer)}(Konva),function(){"use strict";var t=[{x:0,y:0},{x:-1,y:0},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:1,y:0},{x:1,y:1},{x:0,y:1},{x:-1,y:1}],e=t.length;Konva.Layer=function(t){this.____init(t)},Konva.Util.addMethods(Konva.Layer,{____init:function(t){this.nodeType="Layer",this.canvas=new Konva.SceneCanvas,this.hitCanvas=new Konva.HitCanvas({pixelRatio:1}),Konva.BaseLayer.call(this,t)},_setCanvasSize:function(t,e){this.canvas.setSize(t,e),this.hitCanvas.setSize(t,e)},_validateAdd:function(t){var e=t.getType();"Group"!==e&&"Shape"!==e&&Konva.Util.throw("You may only add groups and shapes to a layer.")},getIntersection:function(n,i){var a,r,o,s;if(!this.hitGraphEnabled()||!this.isVisible())return null;for(var h=1,c=!1;;){for(r=0;r<e;r++){if(o=t[r],a=this._getIntersection({x:n.x+o.x*h,y:n.y+o.y*h}),(s=a.shape)&&i)return s.findAncestor(i,!0);if(s)return s;if(c=!!a.antialiased,!a.antialiased)break}if(!c)return null;h+=1}},_getImageData:function(t,e){var n=this.hitCanvas.width||1,i=this.hitCanvas.height||1,a=Math.round(e)*n+Math.round(t);return this._hitImageData||(this._hitImageData=this.hitCanvas.context.getImageData(0,0,n,i)),[this._hitImageData.data[4*a+0],this._hitImageData.data[4*a+1],this._hitImageData.data[4*a+2],this._hitImageData.data[4*a+3]]},_getIntersection:function(t){var e,n,i=this.hitCanvas.pixelRatio,a=this.hitCanvas.context.getImageData(Math.round(t.x*i),Math.round(t.y*i),1,1).data,r=a[3];return 255===r?(e=Konva.Util._rgbToHex(a[0],a[1],a[2]),(n=Konva.shapes["#"+e])?{shape:n}:{antialiased:!0}):r>0?{antialiased:!0}:{}},drawScene:function(t,e){var n=this.getLayer(),i=t||n&&n.getCanvas();return this._fire("beforeDraw",{node:this}),this.getClearBeforeDraw()&&i.getContext().clear(),Konva.Container.prototype.drawScene.call(this,i,e),this._fire("draw",{node:this}),this},drawHit:function(t,e){var n=this.getLayer(),i=t||n&&n.hitCanvas;return n&&n.getClearBeforeDraw()&&n.getHitCanvas().getContext().clear(),Konva.Container.prototype.drawHit.call(this,i,e),this.imageData=null,this},clear:function(t){return Konva.BaseLayer.prototype.clear.call(this,t),this.getHitCanvas().getContext().clear(t),this.imageData=null,this},setVisible:function(t){return Konva.Node.prototype.setVisible.call(this,t),t?(this.getCanvas()._canvas.style.display="block",this.hitCanvas._canvas.style.display="block"):(this.getCanvas()._canvas.style.display="none",this.hitCanvas._canvas.style.display="none"),this},enableHitGraph:function(){return this.setHitGraphEnabled(!0),this},disableHitGraph:function(){return this.setHitGraphEnabled(!1),this},setSize:function(t,e){return Konva.BaseLayer.prototype.setSize.call(this,t,e),this.hitCanvas.setSize(t,e),this}}),Konva.Util.extend(Konva.Layer,Konva.BaseLayer),Konva.Factory.addGetterSetter(Konva.Layer,"hitGraphEnabled",!0),Konva.Collection.mapMethods(Konva.Layer)}(),function(){"use strict";Konva.FastLayer=function(t){this.____init(t)},Konva.Util.addMethods(Konva.FastLayer,{____init:function(t){this.nodeType="Layer",this.canvas=new Konva.SceneCanvas,Konva.BaseLayer.call(this,t)},_validateAdd:function(t){"Shape"!==t.getType()&&Konva.Util.throw("You may only add shapes to a fast layer.")},_setCanvasSize:function(t,e){this.canvas.setSize(t,e)},hitGraphEnabled:function(){return!1},getIntersection:function(){return null},drawScene:function(t){var e=this.getLayer(),n=t||e&&e.getCanvas();return this.getClearBeforeDraw()&&n.getContext().clear(),Konva.Container.prototype.drawScene.call(this,n),this},draw:function(){return this.drawScene(),this},setVisible:function(t){return Konva.Node.prototype.setVisible.call(this,t),this.getCanvas()._canvas.style.display=t?"block":"none",this}}),Konva.Util.extend(Konva.FastLayer,Konva.BaseLayer),Konva.Collection.mapMethods(Konva.FastLayer)}(),function(){"use strict";Konva.Group=function(t){this.___init(t)},Konva.Util.addMethods(Konva.Group,{___init:function(t){this.nodeType="Group",Konva.Container.call(this,t)},_validateAdd:function(t){var e=t.getType();"Group"!==e&&"Shape"!==e&&Konva.Util.throw("You may only add groups and shapes to groups.")}}),Konva.Util.extend(Konva.Group,Konva.Container),Konva.Collection.mapMethods(Konva.Group)}(),function(t){"use strict";function e(){return i.apply(t.global,arguments)}var n=t.global.performance&&t.global.performance.now?function(){return t.global.performance.now()}:function(){return(new Date).getTime()},i=t.global.requestAnimationFrame||t.global.webkitRequestAnimationFrame||t.global.mozRequestAnimationFrame||t.global.oRequestAnimationFrame||t.global.msRequestAnimationFrame||function(t){setTimeout(t,1e3/60)};t.Animation=function(e,i){var a=t.Animation;this.func=e,this.setLayers(i),this.id=a.animIdCounter++,this.frame={time:0,timeDiff:0,lastTime:n()}},t.Animation.prototype={setLayers:function(t){var e=[];return e=t?t.length>0?t:[t]:[],this.layers=e,this},getLayers:function(){return this.layers},addLayer:function(t){var e,n=this.layers,i=n.length;for(e=0;e<i;e++)if(n[e]._id===t._id)return!1;return this.layers.push(t),!0},isRunning:function(){var e,n=t.Animation.animations,i=n.length;for(e=0;e<i;e++)if(n[e].id===this.id)return!0;return!1},start:function(){var e=t.Animation;return this.stop(),this.frame.timeDiff=0,this.frame.lastTime=n(),e._addAnimation(this),this},stop:function(){return t.Animation._removeAnimation(this),this},_updateFrameObject:function(t){this.frame.timeDiff=t-this.frame.lastTime,this.frame.lastTime=t,this.frame.time+=this.frame.timeDiff,this.frame.frameRate=1e3/this.frame.timeDiff}},t.Animation.animations=[],t.Animation.animIdCounter=0,t.Animation.animRunning=!1,t.Animation._addAnimation=function(t){this.animations.push(t),this._handleAnimation()},t.Animation._removeAnimation=function(t){var e,n=t.id,i=this.animations,a=i.length;for(e=0;e<a;e++)if(i[e].id===n){this.animations.splice(e,1);break}},t.Animation._runFrames=function(){var t,e,i,a,r,o,s,h,c={},l=this.animations;for(a=0;a<l.length;a++)if(t=l[a],e=t.layers,i=t.func,t._updateFrameObject(n()),o=e.length,!i||!1!==i.call(t,t.frame))for(r=0;r<o;r++)void 0!==(s=e[r])._id&&(c[s._id]=s);for(h in c)c.hasOwnProperty(h)&&c[h].draw()},t.Animation._animationLoop=function(){var n=t.Animation;n.animations.length?(n._runFrames(),e(n._animationLoop)):n.animRunning=!1},t.Animation._handleAnimation=function(){this.animRunning||(this.animRunning=!0,e(this._animationLoop))},t.BaseLayer.prototype.batchDraw=function(){var e=this,n=t.Animation;return this.batchAnim||(this.batchAnim=new n(function(){e.batchAnim.stop()},this)),this.batchAnim.isRunning()||this.batchAnim.start(),this},t.Stage.prototype.batchDraw=function(){return this.getChildren().each(function(t){t.batchDraw()}),this}}(Konva),function(){"use strict";var t={node:1,duration:1,easing:1,onFinish:1,yoyo:1},e=0,n=["fill","stroke","shadowColor"],i=function(t,e,n,i,a,r,o){this.prop=t,this.propFunc=e,this.begin=i,this._pos=i,this.duration=r,this._change=0,this.prevPos=0,this.yoyo=o,this._time=0,this._position=0,this._startTime=0,this._finish=0,this.func=n,this._change=a-this.begin,this.pause()};i.prototype={fire:function(t){var e=this[t];e&&e()},setTime:function(t){t>this.duration?this.yoyo?(this._time=this.duration,this.reverse()):this.finish():t<0?this.yoyo?(this._time=0,this.play()):this.reset():(this._time=t,this.update())},getTime:function(){return this._time},setPosition:function(t){this.prevPos=this._pos,this.propFunc(t),this._pos=t},getPosition:function(t){return void 0===t&&(t=this._time),this.func(t,this.begin,this._change,this.duration)},play:function(){this.state=2,this._startTime=this.getTimer()-this._time,this.onEnterFrame(),this.fire("onPlay")},reverse:function(){this.state=3,this._time=this.duration-this._time,this._startTime=this.getTimer()-this._time,this.onEnterFrame(),this.fire("onReverse")},seek:function(t){this.pause(),this._time=t,this.update(),this.fire("onSeek")},reset:function(){this.pause(),this._time=0,this.update(),this.fire("onReset")},finish:function(){this.pause(),this._time=this.duration,this.update(),this.fire("onFinish")},update:function(){this.setPosition(this.getPosition(this._time))},onEnterFrame:function(){var t=this.getTimer()-this._startTime;2===this.state?this.setTime(t):3===this.state&&this.setTime(this.duration-t)},pause:function(){this.state=1,this.fire("onPause")},getTimer:function(){return(new Date).getTime()}},Konva.Tween=function(n){var a,r,o=this,s=n.node,h=s._id,c=n.easing||Konva.Easings.Linear,l=!!n.yoyo;a=void 0===n.duration?1:0===n.duration?.001:n.duration,this.node=s,this._id=e++;var d=s.getLayer()||(s instanceof Konva.Stage?s.getLayers():null);d||Konva.Util.error("Tween constructor have `node` that is not in a layer. Please add node into layer first."),this.anim=new Konva.Animation(function(){o.tween.onEnterFrame()},d),this.tween=new i(r,function(t){o._tweenFunc(t)},c,0,1,1e3*a,l),this._addListeners(),Konva.Tween.attrs[h]||(Konva.Tween.attrs[h]={}),Konva.Tween.attrs[h][this._id]||(Konva.Tween.attrs[h][this._id]={}),Konva.Tween.tweens[h]||(Konva.Tween.tweens[h]={});for(r in n)void 0===t[r]&&this._addAttr(r,n[r]);this.reset(),this.onFinish=n.onFinish,this.onReset=n.onReset},Konva.Tween.attrs={},Konva.Tween.tweens={},Konva.Tween.prototype={_addAttr:function(t,e){var i,a,r,o,s,h,c,l=this.node,d=l._id;if((r=Konva.Tween.tweens[d][t])&&delete Konva.Tween.attrs[d][r][t],i=l.getAttr(t),Konva.Util._isArray(e))for(a=[],s=Math.max(e.length,i.length),"points"===t&&e.length!==i.length&&(e.length>i.length?(c=i,i=Konva.Util._prepareArrayForTween(i,e,l.closed())):(h=e,e=Konva.Util._prepareArrayForTween(e,i,l.closed()))),o=0;o<s;o++)a.push(e[o]-i[o]);else if(-1!==n.indexOf(t)){i=Konva.Util.colorToRGBA(i);var u=Konva.Util.colorToRGBA(e);a={r:u.r-i.r,g:u.g-i.g,b:u.b-i.b,a:u.a-i.a}}else a=e-i;Konva.Tween.attrs[d][this._id][t]={start:i,diff:a,end:e,trueEnd:h,trueStart:c},Konva.Tween.tweens[d][t]=this._id},_tweenFunc:function(t){var e,i,a,r,o,s,h,c,l=this.node,d=Konva.Tween.attrs[l._id][this._id];for(e in d){if(i=d[e],a=i.start,r=i.diff,c=i.end,Konva.Util._isArray(a))for(o=[],h=Math.max(a.length,c.length),s=0;s<h;s++)o.push((a[s]||0)+r[s]*t);else o=-1!==n.indexOf(e)?"rgba("+Math.round(a.r+r.r*t)+","+Math.round(a.g+r.g*t)+","+Math.round(a.b+r.b*t)+","+(a.a+r.a*t)+")":a+r*t;l.setAttr(e,o)}},_addListeners:function(){var t=this;this.tween.onPlay=function(){t.anim.start()},this.tween.onReverse=function(){t.anim.start()},this.tween.onPause=function(){t.anim.stop()},this.tween.onFinish=function(){var e=t.node,n=Konva.Tween.attrs[e._id][t._id];n.points&&n.points.trueEnd&&e.points(n.points.trueEnd),t.onFinish&&t.onFinish.call(t)},this.tween.onReset=function(){var e=t.node,n=Konva.Tween.attrs[e._id][t._id];n.points&&n.points.trueStart&&e.points(n.points.trueStart),t.onReset&&t.onReset()}},play:function(){return this.tween.play(),this},reverse:function(){return this.tween.reverse(),this},reset:function(){return this.tween.reset(),this},seek:function(t){return this.tween.seek(1e3*t),this},pause:function(){return this.tween.pause(),this},finish:function(){return this.tween.finish(),this},destroy:function(){var t,e=this.node._id,n=this._id,i=Konva.Tween.tweens[e];this.pause();for(t in i)delete Konva.Tween.tweens[e][t];delete Konva.Tween.attrs[e][n]}},Konva.Node.prototype.to=function(t){var e=t.onFinish;t.node=this,t.onFinish=function(){this.destroy(),e&&e()};new Konva.Tween(t).play()},Konva.Easings={BackEaseIn:function(t,e,n,i){return n*(t/=i)*t*(2.70158*t-1.70158)+e},BackEaseOut:function(t,e,n,i){return n*((t=t/i-1)*t*(2.70158*t+1.70158)+1)+e},BackEaseInOut:function(t,e,n,i){var a=1.70158;return(t/=i/2)<1?n/2*(t*t*((1+(a*=1.525))*t-a))+e:n/2*((t-=2)*t*((1+(a*=1.525))*t+a)+2)+e},ElasticEaseIn:function(t,e,n,i,a,r){var o=0;return 0===t?e:1==(t/=i)?e+n:(r||(r=.3*i),!a||a<Math.abs(n)?(a=n,o=r/4):o=r/(2*Math.PI)*Math.asin(n/a),-a*Math.pow(2,10*(t-=1))*Math.sin((t*i-o)*(2*Math.PI)/r)+e)},ElasticEaseOut:function(t,e,n,i,a,r){var o=0;return 0===t?e:1==(t/=i)?e+n:(r||(r=.3*i),!a||a<Math.abs(n)?(a=n,o=r/4):o=r/(2*Math.PI)*Math.asin(n/a),a*Math.pow(2,-10*t)*Math.sin((t*i-o)*(2*Math.PI)/r)+n+e)},ElasticEaseInOut:function(t,e,n,i,a,r){var o=0;return 0===t?e:2==(t/=i/2)?e+n:(r||(r=i*(.3*1.5)),!a||a<Math.abs(n)?(a=n,o=r/4):o=r/(2*Math.PI)*Math.asin(n/a),t<1?a*Math.pow(2,10*(t-=1))*Math.sin((t*i-o)*(2*Math.PI)/r)*-.5+e:a*Math.pow(2,-10*(t-=1))*Math.sin((t*i-o)*(2*Math.PI)/r)*.5+n+e)},BounceEaseOut:function(t,e,n,i){return(t/=i)<1/2.75?n*(7.5625*t*t)+e:t<2/2.75?n*(7.5625*(t-=1.5/2.75)*t+.75)+e:t<2.5/2.75?n*(7.5625*(t-=2.25/2.75)*t+.9375)+e:n*(7.5625*(t-=2.625/2.75)*t+.984375)+e},BounceEaseIn:function(t,e,n,i){return n-Konva.Easings.BounceEaseOut(i-t,0,n,i)+e},BounceEaseInOut:function(t,e,n,i){return t<i/2?.5*Konva.Easings.BounceEaseIn(2*t,0,n,i)+e:.5*Konva.Easings.BounceEaseOut(2*t-i,0,n,i)+.5*n+e},EaseIn:function(t,e,n,i){return n*(t/=i)*t+e},EaseOut:function(t,e,n,i){return-n*(t/=i)*(t-2)+e},EaseInOut:function(t,e,n,i){return(t/=i/2)<1?n/2*t*t+e:-n/2*(--t*(t-2)-1)+e},StrongEaseIn:function(t,e,n,i){return n*(t/=i)*t*t*t*t+e},StrongEaseOut:function(t,e,n,i){return n*((t=t/i-1)*t*t*t*t+1)+e},StrongEaseInOut:function(t,e,n,i){return(t/=i/2)<1?n/2*t*t*t*t*t+e:n/2*((t-=2)*t*t*t*t+2)+e},Linear:function(t,e,n,i){return n*t/i+e}}}(),function(){"use strict";Konva.DD={anim:new Konva.Animation(function(){var t=this.dirty;return this.dirty=!1,t}),isDragging:!1,justDragged:!1,offset:{x:0,y:0},node:null,_drag:function(t){var e=Konva.DD,n=e.node;if(n){if(!e.isDragging){var i=n.getStage().getPointerPosition();i||(n.getStage()._setPointerPosition(t),i=n.getStage().getPointerPosition());var a=n.dragDistance();if(Math.max(Math.abs(i.x-e.startPointerPos.x),Math.abs(i.y-e.startPointerPos.y))<a)return}n.getStage()._setPointerPosition(t),n._setDragPosition(t),e.isDragging||(e.isDragging=!0,n.fire("dragstart",{type:"dragstart",target:n,evt:t},!0)),n.fire("dragmove",{type:"dragmove",target:n,evt:t},!0)}},_endDragBefore:function(t){var e,n=Konva.DD,i=n.node;i&&(e=i.getLayer(),n.anim.stop(),n.isDragging&&(n.isDragging=!1,n.justDragged=!0,Konva.listenClickTap=!1,t&&(t.dragEndNode=i)),delete n.node,(i.getLayer()||e||i instanceof Konva.Stage)&&(e||i).draw())},_endDragAfter:function(t){var e=(t=t||{}).dragEndNode;t&&e&&e.fire("dragend",{type:"dragend",target:e,evt:t},!0)}},Konva.Node.prototype.startDrag=function(){var t=Konva.DD,e=this.getStage(),n=this.getLayer(),i=e.getPointerPosition(),a=this.getAbsolutePosition();i&&(t.node&&t.node.stopDrag(),t.node=this,t.startPointerPos=i,t.offset.x=i.x-a.x,t.offset.y=i.y-a.y,t.anim.setLayers(n||this.getLayers()),t.anim.start(),this._setDragPosition())},Konva.Node.prototype._setDragPosition=function(t){var e=Konva.DD,n=this.getStage().getPointerPosition(),i=this.getDragBoundFunc();if(n){var a={x:n.x-e.offset.x,y:n.y-e.offset.y};void 0!==i&&(a=i.call(this,a,t)),this.setAbsolutePosition(a),this._lastPos&&this._lastPos.x===a.x&&this._lastPos.y===a.y||(e.anim.dirty=!0),this._lastPos=a}},Konva.Node.prototype.stopDrag=function(){var t=Konva.DD,e={};t._endDragBefore(e),t._endDragAfter(e)},Konva.Node.prototype.setDraggable=function(t){this._setAttr("draggable",t),this._dragChange()};var t=Konva.Node.prototype.remove;if(Konva.Node.prototype.__originalRemove=t,Konva.Node.prototype.remove=function(){var e=Konva.DD;e.node&&e.node._id===this._id&&this.stopDrag(),t.call(this)},Konva.Node.prototype.isDragging=function(){var t=Konva.DD;return!(!t.node||t.node._id!==this._id||!t.isDragging)},Konva.Node.prototype._listenDrag=function(){var t=this;this._dragCleanup(),"Stage"===this.getClassName()?this.on("contentMousedown.konva contentTouchstart.konva",function(e){Konva.DD.node||t.startDrag(e)}):this.on("mousedown.konva touchstart.konva",function(e){1!==e.evt.button&&2!==e.evt.button&&(Konva.DD.node||t.startDrag(e))})},Konva.Node.prototype._dragChange=function(){if(this.attrs.draggable)this._listenDrag();else{this._dragCleanup();var t=this.getStage(),e=Konva.DD;t&&e.node&&e.node._id===this._id&&e.node.stopDrag()}},Konva.Node.prototype._dragCleanup=function(){"Stage"===this.getClassName()?(this.off("contentMousedown.konva"),this.off("contentTouchstart.konva")):(this.off("mousedown.konva"),this.off("touchstart.konva"))},Konva.Factory.addGetterSetter(Konva.Node,"dragBoundFunc"),Konva.Factory.addGetter(Konva.Node,"draggable",!1),Konva.Factory.addOverloadedGetterSetter(Konva.Node,"draggable"),Konva.isBrowser){var e=Konva.document.documentElement;e.addEventListener("mouseup",Konva.DD._endDragBefore,!0),e.addEventListener("touchend",Konva.DD._endDragBefore,!0),e.addEventListener("mousemove",Konva.DD._drag),e.addEventListener("touchmove",Konva.DD._drag),e.addEventListener("mouseup",Konva.DD._endDragAfter,!1),e.addEventListener("touchend",Konva.DD._endDragAfter,!1)}}(),function(){"use strict";Konva.Rect=function(t){this.___init(t)},Konva.Rect.prototype={___init:function(t){Konva.Shape.call(this,t),this.className="Rect",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(t){var e=this.getCornerRadius(),n=this.getWidth(),i=this.getHeight();t.beginPath(),e?(e=Math.min(e,n/2,i/2),t.moveTo(e,0),t.lineTo(n-e,0),t.arc(n-e,e,e,3*Math.PI/2,0,!1),t.lineTo(n,i-e),t.arc(n-e,i-e,e,0,Math.PI/2,!1),t.lineTo(e,i),t.arc(e,i-e,e,Math.PI/2,Math.PI,!1),t.lineTo(0,e),t.arc(e,e,e,Math.PI,3*Math.PI/2,!1)):t.rect(0,0,n,i),t.closePath(),t.fillStrokeShape(this)}},Konva.Util.extend(Konva.Rect,Konva.Shape),Konva.Factory.addGetterSetter(Konva.Rect,"cornerRadius",0),Konva.Collection.mapMethods(Konva.Rect)}(),function(t){"use strict";var e=2*Math.PI-1e-4;t.Circle=function(t){this.___init(t)},t.Circle.prototype={_centroid:!0,___init:function(e){t.Shape.call(this,e),this.className="Circle",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(t){t.beginPath(),t.arc(0,0,this.getRadius(),0,e,!1),t.closePath(),t.fillStrokeShape(this)},getWidth:function(){return 2*this.getRadius()},getHeight:function(){return 2*this.getRadius()},setWidth:function(e){t.Node.prototype.setWidth.call(this,e),this.radius()!==e/2&&this.setRadius(e/2)},setHeight:function(e){t.Node.prototype.setHeight.call(this,e),this.radius()!==e/2&&this.setRadius(e/2)}},t.Util.extend(t.Circle,t.Shape),t.Factory.addGetterSetter(t.Circle,"radius",0),t.Factory.addOverloadedGetterSetter(t.Circle,"radius"),t.Collection.mapMethods(t.Circle)}(Konva),function(){"use strict";var t=2*Math.PI-1e-4;Konva.Ellipse=function(t){this.___init(t)},Konva.Ellipse.prototype={_centroid:!0,___init:function(t){Konva.Shape.call(this,t),this.className="Ellipse",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(e){var n=this.getRadiusX(),i=this.getRadiusY();e.beginPath(),e.save(),n!==i&&e.scale(1,i/n),e.arc(0,0,n,0,t,!1),e.restore(),e.closePath(),e.fillStrokeShape(this)},getWidth:function(){return 2*this.getRadiusX()},getHeight:function(){return 2*this.getRadiusY()},setWidth:function(t){Konva.Node.prototype.setWidth.call(this,t),this.setRadius({x:t/2})},setHeight:function(t){Konva.Node.prototype.setHeight.call(this,t),this.setRadius({y:t/2})}},Konva.Util.extend(Konva.Ellipse,Konva.Shape),Konva.Factory.addComponentsGetterSetter(Konva.Ellipse,"radius",["x","y"]),Konva.Factory.addGetterSetter(Konva.Ellipse,"radiusX",0),Konva.Factory.addGetterSetter(Konva.Ellipse,"radiusY",0),Konva.Collection.mapMethods(Konva.Ellipse)}(),function(){"use strict";var t=2*Math.PI-1e-4;Konva.Ring=function(t){this.___init(t)},Konva.Ring.prototype={_centroid:!0,___init:function(t){Konva.Shape.call(this,t),this.className="Ring",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(e){e.beginPath(),e.arc(0,0,this.getInnerRadius(),0,t,!1),e.moveTo(this.getOuterRadius(),0),e.arc(0,0,this.getOuterRadius(),t,0,!0),e.closePath(),e.fillStrokeShape(this)},getWidth:function(){return 2*this.getOuterRadius()},getHeight:function(){return 2*this.getOuterRadius()},setWidth:function(t){Konva.Node.prototype.setWidth.call(this,t),this.outerRadius()!==t/2&&this.setOuterRadius(t/2)},setHeight:function(t){Konva.Node.prototype.setHeight.call(this,t),this.outerRadius()!==t/2&&this.setOuterRadius(t/2)},setOuterRadius:function(t){this._setAttr("outerRadius",t),this.setWidth(2*t),this.setHeight(2*t)}},Konva.Util.extend(Konva.Ring,Konva.Shape),Konva.Factory.addGetterSetter(Konva.Ring,"innerRadius",0),Konva.Factory.addGetter(Konva.Ring,"outerRadius",0),Konva.Factory.addOverloadedGetterSetter(Konva.Ring,"outerRadius"),Konva.Collection.mapMethods(Konva.Ring)}(),function(){"use strict";Konva.Wedge=function(t){this.___init(t)},Konva.Wedge.prototype={_centroid:!0,___init:function(t){Konva.Shape.call(this,t),this.className="Wedge",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(t){t.beginPath(),t.arc(0,0,this.getRadius(),0,Konva.getAngle(this.getAngle()),this.getClockwise()),t.lineTo(0,0),t.closePath(),t.fillStrokeShape(this)},getWidth:function(){return 2*this.getRadius()},getHeight:function(){return 2*this.getRadius()},setWidth:function(t){Konva.Node.prototype.setWidth.call(this,t),this.radius()!==t/2&&this.setRadius(t/2)},setHeight:function(t){Konva.Node.prototype.setHeight.call(this,t),this.radius()!==t/2&&this.setRadius(t/2)}},Konva.Util.extend(Konva.Wedge,Konva.Shape),Konva.Factory.addGetterSetter(Konva.Wedge,"radius",0),Konva.Factory.addGetterSetter(Konva.Wedge,"angle",0),Konva.Factory.addGetterSetter(Konva.Wedge,"clockwise",!1),Konva.Factory.backCompat(Konva.Wedge,{angleDeg:"angle",getAngleDeg:"getAngle",setAngleDeg:"setAngle"}),Konva.Collection.mapMethods(Konva.Wedge)}(),function(t){"use strict";t.Arc=function(t){this.___init(t)},t.Arc.prototype={_centroid:!0,___init:function(e){t.Shape.call(this,e),this.className="Arc",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(e){var n=t.getAngle(this.angle()),i=this.clockwise();e.beginPath(),e.arc(0,0,this.getOuterRadius(),0,n,i),e.arc(0,0,this.getInnerRadius(),n,0,!i),e.closePath(),e.fillStrokeShape(this)},getWidth:function(){return 2*this.getOuterRadius()},getHeight:function(){return 2*this.getOuterRadius()},setWidth:function(e){t.Node.prototype.setWidth.call(this,e),this.getOuterRadius()!==e/2&&this.setOuterRadius(e/2)},setHeight:function(e){t.Node.prototype.setHeight.call(this,e),this.getOuterRadius()!==e/2&&this.setOuterRadius(e/2)}},t.Util.extend(t.Arc,t.Shape),t.Factory.addGetterSetter(t.Arc,"innerRadius",0),t.Factory.addGetterSetter(t.Arc,"outerRadius",0),t.Factory.addGetterSetter(t.Arc,"angle",0),t.Factory.addGetterSetter(t.Arc,"clockwise",!1),t.Collection.mapMethods(t.Arc)}(Konva),function(){"use strict";Konva.Image=function(t){this.___init(t)},Konva.Image.prototype={___init:function(t){Konva.Shape.call(this,t),this.className="Image",this.sceneFunc(this._sceneFunc),this.hitFunc(this._hitFunc)},_useBufferCanvas:function(){return(this.hasShadow()||1!==this.getAbsoluteOpacity())&&this.hasStroke()&&this.getStage()},_sceneFunc:function(t){var e,n,i,a=this.getWidth(),r=this.getHeight(),o=this.getImage();o&&(e=this.getCropWidth(),n=this.getCropHeight(),i=e&&n?[o,this.getCropX(),this.getCropY(),e,n,0,0,a,r]:[o,0,0,a,r]),(this.hasFill()||this.hasStroke())&&(t.beginPath(),t.rect(0,0,a,r),t.closePath(),t.fillStrokeShape(this)),o&&t.drawImage.apply(t,i)},_hitFunc:function(t){var e=this.getWidth(),n=this.getHeight();t.beginPath(),t.rect(0,0,e,n),t.closePath(),t.fillStrokeShape(this)},getWidth:function(){var t=this.getImage();return this.attrs.width||(t?t.width:0)},getHeight:function(){var t=this.getImage();return this.attrs.height||(t?t.height:0)}},Konva.Util.extend(Konva.Image,Konva.Shape),Konva.Factory.addGetterSetter(Konva.Image,"image"),Konva.Factory.addComponentsGetterSetter(Konva.Image,"crop",["x","y","width","height"]),Konva.Factory.addGetterSetter(Konva.Image,"cropX",0),Konva.Factory.addGetterSetter(Konva.Image,"cropY",0),Konva.Factory.addGetterSetter(Konva.Image,"cropWidth",0),Konva.Factory.addGetterSetter(Konva.Image,"cropHeight",0),Konva.Collection.mapMethods(Konva.Image),Konva.Image.fromURL=function(t,e){var n=new Image;n.onload=function(){var t=new Konva.Image({image:n});e(t)},n.crossOrigin="Anonymous",n.src=t}}(),function(){"use strict";function t(){return i||(i=Konva.Util.createCanvasElement().getContext(a))}function e(t){t.fillText(this.partialText,0,0)}function n(t){t.strokeText(this.partialText,0,0)}var i,a="2d",r=["fontFamily","fontSize","fontStyle","fontVariant","padding","align","lineHeight","text","width","height","wrap","ellipsis","letterSpacing"],o=r.length;Konva.Text=function(t){this.___init(t)},Konva.Text.prototype={___init:function(t){(t=t||{}).fillLinearGradientColorStops||t.fillRadialGradientColorStops||(t.fill=t.fill||"black"),Konva.Shape.call(this,t),this._fillFunc=e,this._strokeFunc=n,this.className="Text";for(var i=0;i<o;i++)this.on(r[i]+"Change.konva",this._setTextData);this._setTextData(),this.sceneFunc(this._sceneFunc),this.hitFunc(this._hitFunc)},_sceneFunc:function(t){var e,n=this.getPadding(),i=this.getTextHeight(),a=this.getLineHeight()*i,r=this.textArr,o=r.length,s=this.getAlign(),h=this.getWidth(),c=this.getLetterSpacing(),l=this.textDecoration(),d=this.fill(),u=this.fontSize();for(t.setAttr("font",this._getContextFont()),t.setAttr("textBaseline","middle"),t.setAttr("textAlign","left"),t.save(),n?(t.translate(n,0),t.translate(0,n+i/2)):t.translate(0,i/2),e=0;e<o;e++){var f=r[e],g=f.text,v=f.width;if(t.save(),"right"===s?t.translate(h-v-2*n,0):"center"===s&&t.translate((h-v-2*n)/2,0),-1!==l.indexOf("underline")&&(t.save(),t.beginPath(),t.moveTo(0,Math.round(a/2)),t.lineTo(Math.round(v),Math.round(a/2)),t.lineWidth=u/15,t.strokeStyle=d,t.stroke(),t.restore()),-1!==l.indexOf("line-through")&&(t.save(),t.beginPath(),t.moveTo(0,0),t.lineTo(Math.round(v),0),t.lineWidth=u/15,t.strokeStyle=d,t.stroke(),t.restore()),0!==c||"justify"===s)for(var p=g.split(" ").length-1,m=0;m<g.length;m++){var _=g[m];" "===_&&e!==o-1&&"justify"===s&&t.translate(Math.floor((h-v)/p),0),this.partialText=_,t.fillStrokeShape(this),t.translate(Math.round(this._getTextSize(_).width)+c,0)}else this.partialText=g,t.fillStrokeShape(this);t.restore(),t.translate(0,a)}t.restore()},_hitFunc:function(t){var e=this.getWidth(),n=this.getHeight();t.beginPath(),t.rect(0,0,e,n),t.closePath(),t.fillStrokeShape(this)},setText:function(t){var e=Konva.Util._isString(t)?t:(t||"").toString();return this._setAttr("text",e),this},getWidth:function(){return"auto"===this.attrs.width||void 0===this.attrs.width?this.getTextWidth()+2*this.getPadding():this.attrs.width},getHeight:function(){return"auto"===this.attrs.height||void 0===this.attrs.height?this.getTextHeight()*this.textArr.length*this.getLineHeight()+2*this.getPadding():this.attrs.height},getTextWidth:function(){return this.textWidth},getTextHeight:function(){return this.textHeight},_getTextSize:function(e){var n,i=t(),a=this.getFontSize();return i.save(),i.font=this._getContextFont(),n=i.measureText(e),i.restore(),{width:n.width,height:parseInt(a,10)}},_getContextFont:function(){return Konva.UA.isIE?this.getFontStyle()+" "+this.getFontSize()+"px "+this.getFontFamily():this.getFontStyle()+" "+this.getFontVariant()+" "+this.getFontSize()+"px "+this.getFontFamily()},_addTextLine:function(t){"justify"===this.align()&&(t=t.trim());var e=this._getTextWidth(t);return this.textArr.push({text:t,width:e})},_getTextWidth:function(e){var n=this.getLetterSpacing(),i=e.length;return t().measureText(e).width+(i?n*(i-1):0)},_setTextData:function(){var e=this.getText().split("\n"),n=+this.getFontSize(),i=0,a=this.getLineHeight()*n,r=this.attrs.width,o=this.attrs.height,s="auto"!==r,h="auto"!==o,c=this.getPadding(),l=r-2*c,d=o-2*c,u=0,f=this.getWrap(),g="none"!==f,v="char"!==f&&g,p=this.getEllipsis()&&!g;this.textArr=[],t().save(),t().font=this._getContextFont();for(var m=0,_=e.length;m<_;++m){var y=e[m],S=p?this._getTextWidth("?"):0,K=this._getTextWidth(y);if(s&&K>l)for(;y.length>0;){for(var x=0,C=y.length,b="",w=0;x<C;){var F=x+C>>>1,T=y.slice(0,F+1),P=this._getTextWidth(T)+S;P<=l?(x=F+1,b=T+(p?"?":""),w=P):C=F}if(!b)break;if(v){var M=Math.max(b.lastIndexOf(" "),b.lastIndexOf("-"))+1;M>0&&(x=M,b=b.slice(0,x),w=this._getTextWidth(b))}if(this._addTextLine(b),i=Math.max(i,w),u+=a,!g||h&&u+a>d)break;if((y=y.slice(x)).length>0&&(K=this._getTextWidth(y))<=l){this._addTextLine(y),u+=a,i=Math.max(i,K);break}}else this._addTextLine(y),u+=a,i=Math.max(i,K);if(h&&u+a>d)break}t().restore(),this.textHeight=n,this.textWidth=i}},Konva.Util.extend(Konva.Text,Konva.Shape),Konva.Factory.addGetterSetter(Konva.Text,"fontFamily","Arial"),Konva.Factory.addGetterSetter(Konva.Text,"fontSize",12),Konva.Factory.addGetterSetter(Konva.Text,"fontStyle","normal"),Konva.Factory.addGetterSetter(Konva.Text,"fontVariant","normal"),Konva.Factory.addGetterSetter(Konva.Text,"padding",0),Konva.Factory.addGetterSetter(Konva.Text,"align","left"),Konva.Factory.addGetterSetter(Konva.Text,"lineHeight",1),Konva.Factory.addGetterSetter(Konva.Text,"wrap","word"),Konva.Factory.addGetterSetter(Konva.Text,"ellipsis",!1),Konva.Factory.addGetterSetter(Konva.Text,"letterSpacing",0),Konva.Factory.addGetter(Konva.Text,"text",""),Konva.Factory.addOverloadedGetterSetter(Konva.Text,"text"),Konva.Factory.addGetterSetter(Konva.Text,"textDecoration",""),Konva.Collection.mapMethods(Konva.Text)}(),function(){"use strict";Konva.Line=function(t){this.___init(t)},Konva.Line.prototype={___init:function(t){Konva.Shape.call(this,t),this.className="Line",this.on("pointsChange.konva tensionChange.konva closedChange.konva bezierChange.konva",function(){this._clearCache("tensionPoints")}),this.sceneFunc(this._sceneFunc)},_sceneFunc:function(t){var e,n,i,a=this.getPoints(),r=a.length,o=this.getTension(),s=this.getClosed(),h=this.getBezier();if(r){if(t.beginPath(),t.moveTo(a[0],a[1]),0!==o&&r>4){for(n=(e=this.getTensionPoints()).length,i=s?0:4,s||t.quadraticCurveTo(e[0],e[1],e[2],e[3]);i<n-2;)t.bezierCurveTo(e[i++],e[i++],e[i++],e[i++],e[i++],e[i++]);s||t.quadraticCurveTo(e[n-2],e[n-1],a[r-2],a[r-1])}else if(h)for(i=2;i<r;)t.bezierCurveTo(a[i++],a[i++],a[i++],a[i++],a[i++],a[i++]);else for(i=2;i<r;i+=2)t.lineTo(a[i],a[i+1]);s?(t.closePath(),t.fillStrokeShape(this)):t.strokeShape(this)}},getTensionPoints:function(){return this._getCache("tensionPoints",this._getTensionPoints)},_getTensionPoints:function(){return this.getClosed()?this._getTensionPointsClosed():Konva.Util._expandPoints(this.getPoints(),this.getTension())},_getTensionPointsClosed:function(){var t=this.getPoints(),e=t.length,n=this.getTension(),i=Konva.Util,a=i._getControlPoints(t[e-2],t[e-1],t[0],t[1],t[2],t[3],n),r=i._getControlPoints(t[e-4],t[e-3],t[e-2],t[e-1],t[0],t[1],n),o=Konva.Util._expandPoints(t,n);return[a[2],a[3]].concat(o).concat([r[0],r[1],t[e-2],t[e-1],r[2],r[3],a[0],a[1],t[0],t[1]])},getWidth:function(){return this.getSelfRect().width},getHeight:function(){return this.getSelfRect().height},getSelfRect:function(){for(var t,e,n,i=(t=0!==this.getTension()?this._getTensionPoints():this.getPoints())[0],a=t[0],r=t[1],o=t[1],s=0;s<t.length/2;s++)e=t[2*s],n=t[2*s+1],i=Math.min(i,e),a=Math.max(a,e),r=Math.min(r,n),o=Math.max(o,n);return{x:Math.round(i),y:Math.round(r),width:Math.round(a-i),height:Math.round(o-r)}}},Konva.Util.extend(Konva.Line,Konva.Shape),Konva.Factory.addGetterSetter(Konva.Line,"closed",!1),Konva.Factory.addGetterSetter(Konva.Line,"bezier",!1),Konva.Factory.addGetterSetter(Konva.Line,"tension",0),Konva.Factory.addGetterSetter(Konva.Line,"points",[]),Konva.Collection.mapMethods(Konva.Line)}(),function(){"use strict";Konva.Sprite=function(t){this.___init(t)},Konva.Sprite.prototype={___init:function(t){Konva.Shape.call(this,t),this.className="Sprite",this._updated=!0;var e=this;this.anim=new Konva.Animation(function(){var t=e._updated;return e._updated=!1,t}),this.on("animationChange.konva",function(){this.frameIndex(0)}),this.on("frameIndexChange.konva",function(){this._updated=!0}),this.on("frameRateChange.konva",function(){this.anim.isRunning()&&(clearInterval(this.interval),this._setInterval())}),this.sceneFunc(this._sceneFunc),this.hitFunc(this._hitFunc)},_sceneFunc:function(t){var e=this.getAnimation(),n=this.frameIndex(),i=4*n,a=this.getAnimations()[e],r=this.frameOffsets(),o=a[i+0],s=a[i+1],h=a[i+2],c=a[i+3],l=this.getImage();if((this.hasFill()||this.hasStroke())&&(t.beginPath(),t.rect(0,0,h,c),t.closePath(),t.fillStrokeShape(this)),l)if(r){var d=r[e],u=2*n;t.drawImage(l,o,s,h,c,d[u+0],d[u+1],h,c)}else t.drawImage(l,o,s,h,c,0,0,h,c)},_hitFunc:function(t){var e=this.getAnimation(),n=this.frameIndex(),i=4*n,a=this.getAnimations()[e],r=this.frameOffsets(),o=a[i+2],s=a[i+3];if(t.beginPath(),r){var h=r[e],c=2*n;t.rect(h[c+0],h[c+1],o,s)}else t.rect(0,0,o,s);t.closePath(),t.fillShape(this)},_useBufferCanvas:function(){return(this.hasShadow()||1!==this.getAbsoluteOpacity())&&this.hasStroke()},_setInterval:function(){var t=this;this.interval=setInterval(function(){t._updateIndex()},1e3/this.getFrameRate())},start:function(){var t=this.getLayer();this.anim.setLayers(t),this._setInterval(),this.anim.start()},stop:function(){this.anim.stop(),clearInterval(this.interval)},isRunning:function(){return this.anim.isRunning()},_updateIndex:function(){var t=this.frameIndex(),e=this.getAnimation();t<this.getAnimations()[e].length/4-1?this.frameIndex(t+1):this.frameIndex(0)}},Konva.Util.extend(Konva.Sprite,Konva.Shape),Konva.Factory.addGetterSetter(Konva.Sprite,"animation"),Konva.Factory.addGetterSetter(Konva.Sprite,"animations"),Konva.Factory.addGetterSetter(Konva.Sprite,"frameOffsets"),Konva.Factory.addGetterSetter(Konva.Sprite,"image"),Konva.Factory.addGetterSetter(Konva.Sprite,"frameIndex",0),Konva.Factory.addGetterSetter(Konva.Sprite,"frameRate",17),Konva.Factory.backCompat(Konva.Sprite,{index:"frameIndex",getIndex:"getFrameIndex",setIndex:"setFrameIndex"}),Konva.Collection.mapMethods(Konva.Sprite)}(),function(){"use strict";Konva.Path=function(t){this.___init(t)},Konva.Path.prototype={___init:function(t){this.dataArray=[];var e=this;Konva.Shape.call(this,t),this.className="Path",this.dataArray=Konva.Path.parsePathData(this.getData()),this.on("dataChange.konva",function(){e.dataArray=Konva.Path.parsePathData(this.getData())}),this.sceneFunc(this._sceneFunc)},_sceneFunc:function(t){var e=this.dataArray;t.beginPath();for(var n=0;n<e.length;n++){var i=e[n].command,a=e[n].points;switch(i){case"L":t.lineTo(a[0],a[1]);break;case"M":t.moveTo(a[0],a[1]);break;case"C":t.bezierCurveTo(a[0],a[1],a[2],a[3],a[4],a[5]);break;case"Q":t.quadraticCurveTo(a[0],a[1],a[2],a[3]);break;case"A":var r=a[0],o=a[1],s=a[2],h=a[3],c=a[4],l=a[5],d=a[6],u=a[7],f=s>h?s:h,g=s>h?1:s/h,v=s>h?h/s:1;t.translate(r,o),t.rotate(d),t.scale(g,v),t.arc(0,0,f,c,c+l,1-u),t.scale(1/g,1/v),t.rotate(-d),t.translate(-r,-o);break;case"z":t.closePath()}}t.fillStrokeShape(this)},getSelfRect:function(){var t=[];this.dataArray.forEach(function(e){t=t.concat(e.points)});for(var e,n,i=t[0],a=t[0],r=t[1],o=t[1],s=0;s<t.length/2;s++)e=t[2*s],n=t[2*s+1],i=Math.min(i,e),a=Math.max(a,e),r=Math.min(r,n),o=Math.max(o,n);return{x:Math.round(i),y:Math.round(r),width:Math.round(a-i),height:Math.round(o-r)}}},Konva.Util.extend(Konva.Path,Konva.Shape),Konva.Path.getLineLength=function(t,e,n,i){return Math.sqrt((n-t)*(n-t)+(i-e)*(i-e))},Konva.Path.getPointOnLine=function(t,e,n,i,a,r,o){void 0===r&&(r=e),void 0===o&&(o=n);var s=(a-n)/(i-e+1e-8),h=Math.sqrt(t*t/(1+s*s));i<e&&(h*=-1);var c,l=s*h;if(i===e)c={x:r,y:o+l};else if((o-n)/(r-e+1e-8)===s)c={x:r+h,y:o+l};else{var d,u,f=this.getLineLength(e,n,i,a);if(f<1e-8)return;var g=(r-e)*(i-e)+(o-n)*(a-n);d=e+(g/=f*f)*(i-e),u=n+g*(a-n);var v=this.getLineLength(r,o,d,u),p=Math.sqrt(t*t-v*v);h=Math.sqrt(p*p/(1+s*s)),i<e&&(h*=-1),c={x:d+h,y:u+(l=s*h)}}return c},Konva.Path.getPointOnCubicBezier=function(t,e,n,i,a,r,o,s,h){function c(t){return t*t*t}function l(t){return 3*t*t*(1-t)}function d(t){return 3*t*(1-t)*(1-t)}function u(t){return(1-t)*(1-t)*(1-t)}return{x:s*c(t)+r*l(t)+i*d(t)+e*u(t),y:h*c(t)+o*l(t)+a*d(t)+n*u(t)}},Konva.Path.getPointOnQuadraticBezier=function(t,e,n,i,a,r,o){function s(t){return t*t}function h(t){return 2*t*(1-t)}function c(t){return(1-t)*(1-t)}return{x:r*s(t)+i*h(t)+e*c(t),y:o*s(t)+a*h(t)+n*c(t)}},Konva.Path.getPointOnEllipticalArc=function(t,e,n,i,a,r){var o=Math.cos(r),s=Math.sin(r),h=n*Math.cos(a),c=i*Math.sin(a);return{x:t+(h*o-c*s),y:e+(h*s+c*o)}},Konva.Path.parsePathData=function(t){if(!t)return[];var e=t,n=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"];e=e.replace(new RegExp(" ","g"),",");for(var i=0;i<n.length;i++)e=e.replace(new RegExp(n[i],"g"),"|"+n[i]);var a,r=e.split("|"),o=[],s=[],h=0,c=0,l=/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/gi;for(i=1;i<r.length;i++){var d=r[i],u=d.charAt(0);for(d=d.slice(1),s.length=0;a=l.exec(d);)s.push(a[0]);for(var f=[],g=0,v=s.length;g<v;g++){var p=parseFloat(s[g]);isNaN(p)||f.push(p)}for(;f.length>0&&!isNaN(f[0]);){var m,_,y,S,K,x,C,b,w,F,T=null,P=[],M=h,A=c;switch(u){case"l":h+=f.shift(),c+=f.shift(),T="L",P.push(h,c);break;case"L":h=f.shift(),c=f.shift(),P.push(h,c);break;case"m":var k=f.shift(),G=f.shift();if(h+=k,c+=G,T="M",o.length>2&&"z"===o[o.length-1].command)for(var R=o.length-2;R>=0;R--)if("M"===o[R].command){h=o[R].points[0]+k,c=o[R].points[1]+G;break}P.push(h,c),u="l";break;case"M":h=f.shift(),c=f.shift(),T="M",P.push(h,c),u="L";break;case"h":h+=f.shift(),T="L",P.push(h,c);break;case"H":h=f.shift(),T="L",P.push(h,c);break;case"v":c+=f.shift(),T="L",P.push(h,c);break;case"V":c=f.shift(),T="L",P.push(h,c);break;case"C":P.push(f.shift(),f.shift(),f.shift(),f.shift()),h=f.shift(),c=f.shift(),P.push(h,c);break;case"c":P.push(h+f.shift(),c+f.shift(),h+f.shift(),c+f.shift()),h+=f.shift(),c+=f.shift(),T="C",P.push(h,c);break;case"S":_=h,y=c,"C"===(m=o[o.length-1]).command&&(_=h+(h-m.points[2]),y=c+(c-m.points[3])),P.push(_,y,f.shift(),f.shift()),h=f.shift(),c=f.shift(),T="C",P.push(h,c);break;case"s":_=h,y=c,"C"===(m=o[o.length-1]).command&&(_=h+(h-m.points[2]),y=c+(c-m.points[3])),P.push(_,y,h+f.shift(),c+f.shift()),h+=f.shift(),c+=f.shift(),T="C",P.push(h,c);break;case"Q":P.push(f.shift(),f.shift()),h=f.shift(),c=f.shift(),P.push(h,c);break;case"q":P.push(h+f.shift(),c+f.shift()),h+=f.shift(),c+=f.shift(),T="Q",P.push(h,c);break;case"T":_=h,y=c,"Q"===(m=o[o.length-1]).command&&(_=h+(h-m.points[0]),y=c+(c-m.points[1])),h=f.shift(),c=f.shift(),T="Q",P.push(_,y,h,c);break;case"t":_=h,y=c,"Q"===(m=o[o.length-1]).command&&(_=h+(h-m.points[0]),y=c+(c-m.points[1])),h+=f.shift(),c+=f.shift(),T="Q",P.push(_,y,h,c);break;case"A":S=f.shift(),K=f.shift(),x=f.shift(),C=f.shift(),b=f.shift(),w=h,F=c,h=f.shift(),c=f.shift(),T="A",P=this.convertEndpointToCenterParameterization(w,F,h,c,C,b,S,K,x);break;case"a":S=f.shift(),K=f.shift(),x=f.shift(),C=f.shift(),b=f.shift(),w=h,F=c,h+=f.shift(),c+=f.shift(),T="A",P=this.convertEndpointToCenterParameterization(w,F,h,c,C,b,S,K,x)}o.push({command:T||u,points:P,start:{x:M,y:A},pathLength:this.calcLength(M,A,T||u,P)})}"z"!==u&&"Z"!==u||o.push({command:"z",points:[],start:void 0,pathLength:0})}return o},Konva.Path.calcLength=function(t,e,n,i){var a,r,o,s,h=Konva.Path;switch(n){case"L":return h.getLineLength(t,e,i[0],i[1]);case"C":for(a=0,r=h.getPointOnCubicBezier(0,t,e,i[0],i[1],i[2],i[3],i[4],i[5]),s=.01;s<=1;s+=.01)o=h.getPointOnCubicBezier(s,t,e,i[0],i[1],i[2],i[3],i[4],i[5]),a+=h.getLineLength(r.x,r.y,o.x,o.y),r=o;return a;case"Q":for(a=0,r=h.getPointOnQuadraticBezier(0,t,e,i[0],i[1],i[2],i[3]),s=.01;s<=1;s+=.01)o=h.getPointOnQuadraticBezier(s,t,e,i[0],i[1],i[2],i[3]),a+=h.getLineLength(r.x,r.y,o.x,o.y),r=o;return a;case"A":a=0;var c=i[4],l=i[5],d=i[4]+l,u=Math.PI/180;if(Math.abs(c-d)<u&&(u=Math.abs(c-d)),r=h.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],c,0),l<0)for(s=c-u;s>d;s-=u)o=h.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],s,0),a+=h.getLineLength(r.x,r.y,o.x,o.y),r=o;else for(s=c+u;s<d;s+=u)o=h.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],s,0),a+=h.getLineLength(r.x,r.y,o.x,o.y),r=o;return o=h.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],d,0),a+=h.getLineLength(r.x,r.y,o.x,o.y)}return 0},Konva.Path.convertEndpointToCenterParameterization=function(t,e,n,i,a,r,o,s,h){var c=h*(Math.PI/180),l=Math.cos(c)*(t-n)/2+Math.sin(c)*(e-i)/2,d=-1*Math.sin(c)*(t-n)/2+Math.cos(c)*(e-i)/2,u=l*l/(o*o)+d*d/(s*s);u>1&&(o*=Math.sqrt(u),s*=Math.sqrt(u));var f=Math.sqrt((o*o*(s*s)-o*o*(d*d)-s*s*(l*l))/(o*o*(d*d)+s*s*(l*l)));a===r&&(f*=-1),isNaN(f)&&(f=0);var g=f*o*d/s,v=f*-s*l/o,p=(t+n)/2+Math.cos(c)*g-Math.sin(c)*v,m=(e+i)/2+Math.sin(c)*g+Math.cos(c)*v,_=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},y=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(_(t)*_(e))},S=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(y(t,e))},K=S([1,0],[(l-g)/o,(d-v)/s]),x=[(l-g)/o,(d-v)/s],C=[(-1*l-g)/o,(-1*d-v)/s],b=S(x,C);return y(x,C)<=-1&&(b=Math.PI),y(x,C)>=1&&(b=0),0===r&&b>0&&(b-=2*Math.PI),1===r&&b<0&&(b+=2*Math.PI),[p,m,o,s,K,b,c,r]},Konva.Factory.addGetterSetter(Konva.Path,"data"),Konva.Collection.mapMethods(Konva.Path)}(),function(){"use strict";function t(t){t.fillText(this.partialText,0,0)}function e(t){t.strokeText(this.partialText,0,0)}Konva.TextPath=function(t){this.___init(t)},Konva.TextPath.prototype={___init:function(n){var i=this;this.dummyCanvas=Konva.Util.createCanvasElement(),this.dataArray=[],this.getKerning=n&&n.getKerning,Konva.Shape.call(this,n),this._fillFunc=t,this._strokeFunc=e,this._fillFuncHit=t,this._strokeFuncHit=e,this.className="TextPath",this.dataArray=Konva.Path.parsePathData(this.attrs.data),this.on("dataChange.konva",function(){i.dataArray=Konva.Path.parsePathData(this.attrs.data),i._setTextData()}),this.on("textChange.konva alignChange.konva letterSpacingChange.konva",i._setTextData),i._setTextData(),this.sceneFunc(this._sceneFunc),this.hitFunc(this._hitFunc)},_sceneFunc:function(t){t.setAttr("font",this._getContextFont()),t.setAttr("textBaseline",this.getTextBaseline()),t.setAttr("textAlign","left"),t.save();var e=this.textDecoration(),n=this.fill(),i=this.fontSize(),a=this.glyphInfo;"underline"===e&&t.beginPath();for(var r=0;r<a.length;r++){t.save();var o=a[r].p0;t.translate(o.x,o.y),t.rotate(a[r].rotation),this.partialText=a[r].text,t.fillStrokeShape(this),"underline"===e&&(0===r&&t.moveTo(0,i/2+1),t.lineTo(i,i/2+1)),t.restore()}"underline"===e&&(t.strokeStyle=n,t.lineWidth=i/20,t.stroke()),t.restore()},_hitFunc:function(t){t.beginPath();var e=this.glyphInfo;if(e.length>=1){var n=e[0].p0;t.moveTo(n.x,n.y)}for(var i=0;i<e.length;i++){var a=e[i].p1;t.lineTo(a.x,a.y)}t.setAttr("lineWidth",this.getFontSize()),t.setAttr("strokeStyle",this.colorKey),t.stroke()},getTextWidth:function(){return this.textWidth},getTextHeight:function(){return this.textHeight},setText:function(t){Konva.Text.prototype.setText.call(this,t)},_getTextSize:function(t){var e=this.dummyCanvas.getContext("2d");e.save(),e.font=this._getContextFont();var n=e.measureText(t);return e.restore(),{width:n.width,height:parseInt(this.attrs.fontSize,10)}},_setTextData:function(){var t=this,e=this._getTextSize(this.attrs.text),n=this.getLetterSpacing(),i=this.align();this.textWidth=e.width,this.textHeight=e.height;var a=Math.max(this.textWidth+((this.attrs.text||"").length-1)*n,0);this.glyphInfo=[];for(var r=0,o=0;o<t.dataArray.length;o++)t.dataArray[o].pathLength>0&&(r+=t.dataArray[o].pathLength);var s=0;"center"===i&&(s=Math.max(0,r/2-a/2)),"right"===i&&(s=Math.max(0,r-a));for(var h,c,l,d=this.getText().split(""),u=this.getText().split(" ").length-1,f=-1,g=0,v=function(){g=0;for(var e=t.dataArray,n=f+1;n<e.length;n++){if(e[n].pathLength>0)return f=n,e[n];"M"===e[n].command&&(h={x:e[n].points[0],y:e[n].points[1]})}return{}},p=function(e){var o=t._getTextSize(e).width+n;" "===e&&"justify"===i&&(o+=(r-a)/u);var s=0,d=0;for(c=void 0;Math.abs(o-s)/o>.01&&d<25;){d++;for(var f=s;void 0===l;)(l=v())&&f+l.pathLength<o&&(f+=l.pathLength,l=void 0);if(l==={}||void 0===h)return;var p=!1;switch(l.command){case"L":Konva.Path.getLineLength(h.x,h.y,l.points[0],l.points[1])>o?c=Konva.Path.getPointOnLine(o,h.x,h.y,l.points[0],l.points[1],h.x,h.y):l=void 0;break;case"A":var m=l.points[4],_=l.points[5],y=l.points[4]+_;0===g?g=m+1e-8:o>s?g+=Math.PI/180*_/Math.abs(_):g-=Math.PI/360*_/Math.abs(_),(_<0&&g<y||_>=0&&g>y)&&(g=y,p=!0),c=Konva.Path.getPointOnEllipticalArc(l.points[0],l.points[1],l.points[2],l.points[3],g,l.points[6]);break;case"C":0===g?g=o>l.pathLength?1e-8:o/l.pathLength:o>s?g+=(o-s)/l.pathLength:g-=(s-o)/l.pathLength,g>1&&(g=1,p=!0),c=Konva.Path.getPointOnCubicBezier(g,l.start.x,l.start.y,l.points[0],l.points[1],l.points[2],l.points[3],l.points[4],l.points[5]);break;case"Q":0===g?g=o/l.pathLength:o>s?g+=(o-s)/l.pathLength:g-=(s-o)/l.pathLength,g>1&&(g=1,p=!0),c=Konva.Path.getPointOnQuadraticBezier(g,l.start.x,l.start.y,l.points[0],l.points[1],l.points[2],l.points[3])}void 0!==c&&(s=Konva.Path.getLineLength(h.x,h.y,c.x,c.y)),p&&(p=!1,l=void 0)}},m=t._getTextSize("C").width+n,_=0;_<s/m&&(p("C"),void 0!==h&&void 0!==c);_++)h=c;for(var y=0;y<d.length&&(p(d[y]),void 0!==h&&void 0!==c);y++){var S=Konva.Path.getLineLength(h.x,h.y,c.x,c.y),K=0;if(this.getKerning)try{K=this.getKerning(d[y-1],d[y])*this.fontSize()}catch(t){K=0}h.x+=K,c.x+=K,this.textWidth+=K;var x=Konva.Path.getPointOnLine(K+S/2,h.x,h.y,c.x,c.y),C=Math.atan2(c.y-h.y,c.x-h.x);this.glyphInfo.push({transposeX:x.x,transposeY:x.y,text:d[y],rotation:C,p0:h,p1:c}),h=c}},getSelfRect:function(){var t=[];this.glyphInfo.forEach(function(e){t.push(e.p0.x),t.push(e.p0.y),t.push(e.p1.x),t.push(e.p1.y)});for(var e,n,i=t[0],a=t[0],r=t[0],o=t[0],s=0;s<t.length/2;s++)e=t[2*s],n=t[2*s+1],i=Math.min(i,e),a=Math.max(a,e),r=Math.min(r,n),o=Math.max(o,n);var h=this.fontSize();return{x:Math.round(i)-h/2,y:Math.round(r)-h/2,width:Math.round(a-i)+h,height:Math.round(o-r)+h}}},Konva.TextPath.prototype._getContextFont=Konva.Text.prototype._getContextFont,Konva.Util.extend(Konva.TextPath,Konva.Shape),Konva.Factory.addGetterSetter(Konva.TextPath,"fontFamily","Arial"),Konva.Factory.addGetterSetter(Konva.TextPath,"fontSize",12),Konva.Factory.addGetterSetter(Konva.TextPath,"fontStyle","normal"),Konva.Factory.addGetterSetter(Konva.TextPath,"align","left"),Konva.Factory.addGetterSetter(Konva.TextPath,"letterSpacing",0),Konva.Factory.addGetterSetter(Konva.TextPath,"textBaseline","middle"),Konva.Factory.addGetterSetter(Konva.TextPath,"fontVariant","normal"),Konva.Factory.addGetter(Konva.TextPath,"text",""),Konva.Factory.addGetterSetter(Konva.TextPath,"textDecoration",null),Konva.Collection.mapMethods(Konva.TextPath)}(),function(){"use strict";Konva.RegularPolygon=function(t){this.___init(t)},Konva.RegularPolygon.prototype={_centroid:!0,___init:function(t){Konva.Shape.call(this,t),this.className="RegularPolygon",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(t){var e,n,i,a=this.attrs.sides,r=this.attrs.radius;for(t.beginPath(),t.moveTo(0,0-r),e=1;e<a;e++)n=r*Math.sin(2*e*Math.PI/a),i=-1*r*Math.cos(2*e*Math.PI/a),t.lineTo(n,i);t.closePath(),t.fillStrokeShape(this)},getWidth:function(){return 2*this.getRadius()},getHeight:function(){return 2*this.getRadius()},setWidth:function(t){Konva.Node.prototype.setWidth.call(this,t),this.radius()!==t/2&&this.setRadius(t/2)},setHeight:function(t){Konva.Node.prototype.setHeight.call(this,t),this.radius()!==t/2&&this.setRadius(t/2)}},Konva.Util.extend(Konva.RegularPolygon,Konva.Shape),Konva.Factory.addGetterSetter(Konva.RegularPolygon,"radius",0),Konva.Factory.addGetterSetter(Konva.RegularPolygon,"sides",0),Konva.Collection.mapMethods(Konva.RegularPolygon)}(),function(){"use strict";Konva.Star=function(t){this.___init(t)},Konva.Star.prototype={_centroid:!0,___init:function(t){Konva.Shape.call(this,t),this.className="Star",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(t){var e=this.innerRadius(),n=this.outerRadius(),i=this.numPoints();t.beginPath(),t.moveTo(0,0-n);for(var a=1;a<2*i;a++){var r=a%2==0?n:e,o=r*Math.sin(a*Math.PI/i),s=-1*r*Math.cos(a*Math.PI/i);t.lineTo(o,s)}t.closePath(),t.fillStrokeShape(this)},getWidth:function(){return 2*this.getOuterRadius()},getHeight:function(){return 2*this.getOuterRadius()},setWidth:function(t){Konva.Node.prototype.setWidth.call(this,t),this.outerRadius()!==t/2&&this.setOuterRadius(t/2)},setHeight:function(t){Konva.Node.prototype.setHeight.call(this,t),this.outerRadius()!==t/2&&this.setOuterRadius(t/2)}},Konva.Util.extend(Konva.Star,Konva.Shape),Konva.Factory.addGetterSetter(Konva.Star,"numPoints",5),Konva.Factory.addGetterSetter(Konva.Star,"innerRadius",0),Konva.Factory.addGetterSetter(Konva.Star,"outerRadius",0),Konva.Collection.mapMethods(Konva.Star)}(),function(){"use strict";var t=["fontFamily","fontSize","fontStyle","padding","lineHeight","text","width"],e=t.length;Konva.Label=function(t){this.____init(t)},Konva.Label.prototype={____init:function(t){var e=this;Konva.Group.call(this,t),this.className="Label",this.on("add.konva",function(t){e._addListeners(t.child),e._sync()})},getText:function(){return this.find("Text")[0]},getTag:function(){return this.find("Tag")[0]},_addListeners:function(n){var i,a=this,r=function(){a._sync()};for(i=0;i<e;i++)n.on(t[i]+"Change.konva",r)},getWidth:function(){return this.getText().getWidth()},getHeight:function(){return this.getText().getHeight()},_sync:function(){var t,e,n,i,a,r,o,s=this.getText(),h=this.getTag();if(s&&h){switch(t=s.getWidth(),e=s.getHeight(),n=h.getPointerDirection(),i=h.getPointerWidth(),o=h.getPointerHeight(),a=0,r=0,n){case"up":a=t/2,r=-1*o;break;case"right":a=t+i,r=e/2;break;case"down":a=t/2,r=e+o;break;case"left":a=-1*i,r=e/2}h.setAttrs({x:-1*a,y:-1*r,width:t,height:e}),s.setAttrs({x:-1*a,y:-1*r})}}},Konva.Util.extend(Konva.Label,Konva.Group),Konva.Collection.mapMethods(Konva.Label),Konva.Tag=function(t){this.___init(t)},Konva.Tag.prototype={___init:function(t){Konva.Shape.call(this,t),this.className="Tag",this.sceneFunc(this._sceneFunc)},_sceneFunc:function(t){var e=this.getWidth(),n=this.getHeight(),i=this.getPointerDirection(),a=this.getPointerWidth(),r=this.getPointerHeight(),o=Math.min(this.getCornerRadius(),e/2,n/2);t.beginPath(),o?t.moveTo(o,0):t.moveTo(0,0),"up"===i&&(t.lineTo((e-a)/2,0),t.lineTo(e/2,-1*r),t.lineTo((e+a)/2,0)),o?(t.lineTo(e-o,0),t.arc(e-o,o,o,3*Math.PI/2,0,!1)):t.lineTo(e,0),"right"===i&&(t.lineTo(e,(n-r)/2),t.lineTo(e+a,n/2),t.lineTo(e,(n+r)/2)),o?(t.lineTo(e,n-o),t.arc(e-o,n-o,o,0,Math.PI/2,!1)):t.lineTo(e,n),"down"===i&&(t.lineTo((e+a)/2,n),t.lineTo(e/2,n+r),t.lineTo((e-a)/2,n)),o?(t.lineTo(o,n),t.arc(o,n-o,o,Math.PI/2,Math.PI,!1)):t.lineTo(0,n),"left"===i&&(t.lineTo(0,(n+r)/2),t.lineTo(-1*a,n/2),t.lineTo(0,(n-r)/2)),o&&(t.lineTo(0,o),t.arc(o,o,o,Math.PI,3*Math.PI/2,!1)),t.closePath(),t.fillStrokeShape(this)},getSelfRect:function(){var t=0,e=0,n=this.getPointerWidth(),i=this.getPointerHeight(),a=this.pointerDirection(),r=this.getWidth(),o=this.getHeight();return"up"===a?(e-=i,o+=i):"down"===a?o+=i:"left"===a?(t-=1.5*n,r+=n):"right"===a&&(r+=1.5*n),{x:t,y:e,width:r,height:o}}},Konva.Util.extend(Konva.Tag,Konva.Shape),Konva.Factory.addGetterSetter(Konva.Tag,"pointerDirection","none"),Konva.Factory.addGetterSetter(Konva.Tag,"pointerWidth",0),Konva.Factory.addGetterSetter(Konva.Tag,"pointerHeight",0),Konva.Factory.addGetterSetter(Konva.Tag,"cornerRadius",0),Konva.Collection.mapMethods(Konva.Tag)}(),function(t){"use strict";t.Arrow=function(t){this.____init(t)},t.Arrow.prototype={____init:function(e){t.Line.call(this,e),this.className="Arrow"},_sceneFunc:function(e){t.Line.prototype._sceneFunc.apply(this,arguments);var n=2*Math.PI,i=this.points(),a=i.length,r=i[a-2]-i[a-4],o=i[a-1]-i[a-3],s=(Math.atan2(o,r)+n)%n,h=this.pointerLength(),c=this.pointerWidth();e.save(),e.beginPath(),e.translate(i[a-2],i[a-1]),e.rotate(s),e.moveTo(0,0),e.lineTo(-h,c/2),e.lineTo(-h,-c/2),e.closePath(),e.restore(),this.pointerAtBeginning()&&(e.save(),e.translate(i[0],i[1]),r=i[2]-i[0],o=i[3]-i[1],e.rotate((Math.atan2(-o,-r)+n)%n),e.moveTo(0,0),e.lineTo(-h,c/2),e.lineTo(-h,-c/2),e.closePath(),e.restore());var l=this.dashEnabled();l&&(this.attrs.dashEnabled=!1,e.setLineDash([])),e.fillStrokeShape(this),l&&(this.attrs.dashEnabled=!0)}},t.Util.extend(t.Arrow,t.Line),t.Factory.addGetterSetter(t.Arrow,"pointerLength",10),t.Factory.addGetterSetter(t.Arrow,"pointerWidth",10),t.Factory.addGetterSetter(t.Arrow,"pointerAtBeginning",!1),t.Collection.mapMethods(t.Arrow)}(Konva),function(t){"use strict";var e=["resizeEnabledChange","rotateHandlerOffsetChange"].join(" "),n="nodeRect",i=["xChange.resizer","yChange.resizer","widthChange.resizer","heightChange.resizer","scaleXChange.resizer","scaleYChange.resizer","skewXChange.resizer","skewYChange.resizer","rotationChange.resizer","offsetXChange.resizer","offsetYChange.resizer","transformsEnabledChange.resizer"].join(" ");t.Transformer=function(t){this.____init(t)};var a=["top-left","top-center","top-right","middle-right","middle-left","bottom-left","bottom-center","bottom-right"],r=!1;t.Transformer.prototype={_centroid:!1,____init:function(n){t.Group.call(this,n),this.className="Transformer",this._createElements(),this._handleMouseMove=this._handleMouseMove.bind(this),this._handleMouseUp=this._handleMouseUp.bind(this),this.update=this.update.bind(this),this.on(e,this.update),r||(t.Util.warn("Konva.Transformer is currently experimental and may have bugs. Please report any issues to GitHub repo."),r=!0),this.getNode()&&this.update()},attachTo:function(t){this.setNode(t)},setNode:function(t){this._node&&this.detach(),this._node=t,this._clearCache(n),t.on(i,function(){this._clearCache(n),this._clearCache("transform"),this._clearSelfAndDescendantCache("absoluteTransform")}.bind(this));!!this.findOne(".top-left")&&this.update()},getNode:function(){return this._node},detach:function(){this.getNode()&&(this.getNode().off(".resizer"),this._node=void 0),this._clearCache(n),this._clearCache("transform"),this._clearSelfAndDescendantCache("absoluteTransform")},_getNodeRect:function(){return this._getCache(n,this.__getNodeRect)},__getNodeRect:function(){var e=this.getNode();if(!e)return{x:-Number.MAX_SAFE_INTEGER,y:-Number.MAX_SAFE_INTEGER,width:0,height:0,rotation:0};var n=e.getClientRect({skipTransform:!0}),i=t.getAngle(e.rotation()),a=n.x*e.scaleX()-e.offsetX(),r=n.y*e.scaleY()-e.offsetY();return{x:e.x()+a*Math.cos(i)+r*Math.sin(-i),y:e.y()+r*Math.cos(i)+a*Math.sin(i),width:n.width*e.scaleX(),height:n.height*e.scaleY(),rotation:e.rotation()}},getX:function(){return this._getNodeRect().x},getY:function(){return this._getNodeRect().y},getRotation:function(){return this._getNodeRect().rotation},getWidth:function(){return this._getNodeRect().width},getHeight:function(){return this._getNodeRect().height},_createElements:function(){this._createBack(),a.forEach(function(t){this._createAnchor(t)}.bind(this)),this._createAnchor("rotater")},_createAnchor:function(e){var n=new t.Rect({stroke:"rgb(0, 161, 255)",fill:"white",strokeWidth:1,name:e,width:10,height:10,offsetX:5,offsetY:5,draggable:!0,dragDistance:0}),i=this;n.on("mousedown touchstart",function(t){i._handleMouseDown(t)}),n.on("mouseenter",function(){var i=this.getLayer(),a=this.getParent(),r=t.getAngle(a.rotation()),o=a.getWidth()/2,s=a.getHeight()/2,h=a.getAbsolutePosition(a.getParent()),c=h.x+(o*Math.cos(r)+s*Math.sin(-r)),l=h.y+(s*Math.cos(r)+o*Math.sin(r)),d=this.getAbsolutePosition(a.getParent()),u=-d.x+c,f=-d.y+l,g=-Math.atan2(-f,u)-Math.PI/2,v=function(e,n){if("rotater"===e)return"crosshair";var i=(t.Util._radToDeg(n)%360+360)%360;return t.Util._inRange(i,337.5,360)||t.Util._inRange(i,0,22.5)?"ns-resize":t.Util._inRange(i,22.5,67.5)?"nesw-resize":t.Util._inRange(i,67.5,112.5)?"ew-resize":t.Util._inRange(i,112.5,157.5)?"nwse-resize":t.Util._inRange(i,157.5,202.5)?"ns-resize":t.Util._inRange(i,202.5,247.5)?"nesw-resize":t.Util._inRange(i,247.5,292.5)?"ew-resize":t.Util._inRange(i,292.5,337.5)?"nwse-resize":(t.Util.error("Transformer has unknown angle for cursor detection: "+i),"pointer")}(e,g);n.getStage().content.style.cursor=v,i.batchDraw()}),n.on("mouseout",function(){var t=this.getLayer();t&&(n.getStage().content.style.cursor="",t.batchDraw())}),this.add(n)},_createBack:function(){var e=new t.Shape({stroke:"rgb(0, 161, 255)",name:"back",width:0,height:0,listening:!1,sceneFunc:function(e){var n=this.getParent(),i=n.getPadding();e.beginPath(),e.rect(-i,-i,this.width()+2*i,this.height()+2*i),e.moveTo(this.width()/2,-i),n.rotateEnabled()&&e.lineTo(this.width()/2,-n.rotateHandlerOffset()*t.Util._sign(this.height())),e.fillStrokeShape(this)}});this.add(e)},_handleMouseDown:function(t){this.movingResizer=t.target.name();var e=this._getNodeRect(),n=e.width,i=e.height,a=Math.sqrt(Math.pow(n,2)+Math.pow(i,2));this.sin=i/a,this.cos=n/a,window.addEventListener("mousemove",this._handleMouseMove),window.addEventListener("touchmove",this._handleMouseMove),window.addEventListener("mouseup",this._handleMouseUp,!0),window.addEventListener("touchend",this._handleMouseUp,!0),this._transforming=!0,this.fire("transformstart"),this.getNode().fire("transformstart")},_handleMouseMove:function(e){var n,i,a,r=this.findOne("."+this.movingResizer),o=r.getStage().getContent().getBoundingClientRect(),s=o.left,h=o.top,c={x:(void 0!==e.clientX?e.clientX:e.touches[0].clientX)-s,y:(void 0!==e.clientX?e.clientY:e.touches[0].clientY)-h};r.setAbsolutePosition(c);var l=this.keepRatio()||e.shiftKey;if("top-left"===this.movingResizer)l&&(n=(a=Math.sqrt(Math.pow(this.findOne(".bottom-right").x()-r.x(),2)+Math.pow(this.findOne(".bottom-right").y()-r.y(),2)))*this.cos,i=a*this.sin,this.findOne(".top-left").x(this.findOne(".bottom-right").x()-n),this.findOne(".top-left").y(this.findOne(".bottom-right").y()-i));else if("top-center"===this.movingResizer)this.findOne(".top-left").y(r.y());else if("top-right"===this.movingResizer){l&&(n=(a=Math.sqrt(Math.pow(this.findOne(".bottom-left").x()-r.x(),2)+Math.pow(this.findOne(".bottom-left").y()-r.y(),2)))*this.cos,i=a*this.sin,this.findOne(".top-right").x(n),this.findOne(".top-right").y(this.findOne(".bottom-left").y()-i));var d=r.position();this.findOne(".top-left").y(d.y),this.findOne(".bottom-right").x(d.x)}else if("middle-left"===this.movingResizer)this.findOne(".top-left").x(r.x());else if("middle-right"===this.movingResizer)this.findOne(".bottom-right").x(r.x());else if("bottom-left"===this.movingResizer)l&&(n=(a=Math.sqrt(Math.pow(this.findOne(".top-right").x()-r.x(),2)+Math.pow(this.findOne(".top-right").y()-r.y(),2)))*this.cos,i=a*this.sin,this.findOne(".bottom-left").x(this.findOne(".top-right").x()-n),this.findOne(".bottom-left").y(i)),d=r.position(),this.findOne(".top-left").x(d.x),this.findOne(".bottom-right").y(d.y);else if("bottom-center"===this.movingResizer)this.findOne(".bottom-right").y(r.y());else if("bottom-right"===this.movingResizer)l&&(n=(a=Math.sqrt(Math.pow(this.findOne(".bottom-right").x(),2)+Math.pow(this.findOne(".bottom-right").y(),2)))*this.cos,i=a*this.sin,this.findOne(".bottom-right").x(n),this.findOne(".bottom-right").y(i));else if("rotater"===this.movingResizer){var u=this.getPadding(),f=this._getNodeRect();n=r.x()-f.width/2,i=-r.y()+f.height/2;var g=Math.atan2(-i,n)+Math.PI/2;f.height<0&&(g-=Math.PI);for(var v=t.getAngle(this.rotation()),p=t.Util._radToDeg(v)+t.Util._radToDeg(g),m=t.getAngle(this.getNode().rotation()),_=t.Util._degToRad(p),y=this.rotationSnaps(),S=0;S<y.length;S++){var K=t.getAngle(y[S]);Math.abs(K-t.Util._degToRad(p))%(2*Math.PI)<.1&&(p=t.Util._radToDeg(K),_=t.Util._degToRad(p))}var x=u,C=u;this._fitNodeInto({rotation:t.angleDeg?p:t.Util._degToRad(p),x:f.x+(f.width/2+u)*(Math.cos(m)-Math.cos(_))+(f.height/2+u)*(Math.sin(-m)-Math.sin(-_))-(x*Math.cos(v)+C*Math.sin(-v)),y:f.y+(f.height/2+u)*(Math.cos(m)-Math.cos(_))+(f.width/2+u)*(Math.sin(m)-Math.sin(_))-(C*Math.cos(v)+x*Math.sin(v)),width:f.width+2*u,height:f.height+2*u})}else console.error(new Error("Wrong position argument of selection resizer: ",this.movingResizer));if("rotater"!==this.movingResizer){var b=this.findOne(".top-left").getAbsolutePosition(this.getParent());n=b.x,i=b.y;var w=this.findOne(".bottom-right").x()-this.findOne(".top-left").x(),F=this.findOne(".bottom-right").y()-this.findOne(".top-left").y();this._fitNodeInto({x:n+this.offsetX(),y:i+this.offsetY(),width:w,height:F})}},_handleMouseUp:function(){this._removeEvents()},_removeEvents:function(){this._transforming&&(this._transforming=!1,window.removeEventListener("mousemove",this._handleMouseMove),window.removeEventListener("touchmove",this._handleMouseMove),window.removeEventListener("mouseup",this._handleMouseUp,!0),window.removeEventListener("touchend",this._handleMouseUp,!0),this.fire("transformend"),this.getNode().fire("transformend"))},_fitNodeInto:function(e){var n=this.getBoundBoxFunc();if(n){var i=this._getNodeRect();e=n.call(this,i,e)}this._settings=!0;var a=this.getNode();void 0!==e.rotation&&this.getNode().rotation(e.rotation);var r=a.getClientRect({skipTransform:!0}),o=this.getPadding(),s=(e.width-2*o)/r.width,h=(e.height-2*o)/r.height,c=t.getAngle(a.getRotation()),l=r.x*s-o,d=r.y*h-o;this.getNode().setAttrs({scaleX:s,scaleY:h,x:e.x-(l*Math.cos(c)+d*Math.sin(-c)),y:e.y-(d*Math.cos(c)+l*Math.sin(c))}),this._settings=!1,this.fire("transform"),this.getNode().fire("transform"),this.update(),this.getLayer().batchDraw()},requestUpdate:function(){this.timeout||(this.timeout=setTimeout(function(){this.timeout=null,this.update()}.bind(this)))},forceUpdate:function(){this._clearCache(n),this.update()},update:function(){var e=this._getNodeRect(),n=e.width,i=e.height,a=this.enabledHandlers(),r=this.resizeEnabled(),o=this.getPadding();this.findOne(".top-left").setAttrs({x:-o,y:-o,visible:r&&a.indexOf("top-left")>=0}),this.findOne(".top-center").setAttrs({x:n/2,y:-o,visible:r&&a.indexOf("top-center")>=0}),this.findOne(".top-right").setAttrs({x:n+o,y:-o,visible:r&&a.indexOf("top-right")>=0}),this.findOne(".middle-left").setAttrs({x:-o,y:i/2,visible:r&&a.indexOf("middle-left")>=0}),this.findOne(".middle-right").setAttrs({x:n+o,y:i/2,visible:r&&a.indexOf("middle-right")>=0}),this.findOne(".bottom-left").setAttrs({x:-o,y:i+o,visible:r&&a.indexOf("bottom-left")>=0}),this.findOne(".bottom-center").setAttrs({x:n/2,y:i+o,visible:r&&a.indexOf("bottom-center")>=0}),this.findOne(".bottom-right").setAttrs({x:n+o,y:i+o,visible:r&&a.indexOf("bottom-right")>=0}),this.findOne(".rotater").setAttrs({x:n/2,y:-this.rotateHandlerOffset()*t.Util._sign(i),visible:this.rotateEnabled()}),this.findOne(".back").setAttrs({width:n,height:i,visible:this.lineEnabled()})},isTransforming:function(){return this._transforming},stopTransform:function(){this._transforming&&this._removeEvents()},destroy:function(){t.Group.prototype.destroy.call(this),this.detach(),this._removeEvents()},toObject:function(){return t.Node.prototype.toObject.call(this)}},t.Util.extend(t.Transformer,t.Group),t.Factory.addGetterSetter(t.Transformer,"enabledHandlers",a,function(e){return e instanceof Array||t.Util.warn("enabledHandlers value should be an array"),e instanceof Array&&e.forEach(function(e){-1===a.indexOf(e)&&t.Util.warn("Unknown resizer name: "+e+". Available names are: "+a.join(", "))}),e||[]}),t.Factory.addGetterSetter(t.Transformer,"resizeEnabled",!0),t.Factory.addGetterSetter(t.Transformer,"rotateEnabled",!0),t.Factory.addGetterSetter(t.Transformer,"rotationSnaps",[]),t.Factory.addGetterSetter(t.Transformer,"rotateHandlerOffset",50),t.Factory.addGetterSetter(t.Transformer,"lineEnabled",!0),t.Factory.addGetterSetter(t.Transformer,"keepRatio",!0),t.Factory.addGetterSetter(t.Transformer,"padding",0),t.Factory.addOverloadedGetterSetter(t.Transformer,"node"),t.Factory.addGetterSetter(t.Transformer,"boundBoxFunc"),t.Collection.mapMethods(t.Transformer)}(Konva);
FIND j=3567 line=
FIND j=3568 line=
FIND j=3569 line= </script>
FIND j=3570 line=
FIND j=3571 line=<!--
FIND j=3572 line= <style>
FIND j=3573 line= body {
FIND j=3574 line= margin: 0;
FIND j=3575 line= padding: 0;
FIND j=3576 line= overflow: hidden;
FIND j=3577 line= background-color: #F0F0F0;
FIND j=3578 line= }
FIND j=3579 line= </style>
FIND j=3580 line= -->
FIND j=3581 line=
FIND j=3582 line=
FIND j=3583 line=<div id="container"></div>
FIND j=3584 line=<script>
FIND j=3585 line= var width = window.innerWidth;
FIND j=3586 line= var height = window.innerHeight;
FIND j=3587 line= width = 800; height = 100;
FIND j=3588 line=
FIND j=3589 line= var stage = new Konva.Stage({
FIND j=3590 line= container: 'container',
FIND j=3591 line= width: width,
FIND j=3592 line= height: height
FIND j=3593 line= });
FIND j=3594 line=
FIND j=3595 line= var layer = new Konva.Layer();
FIND j=3596 line=
FIND j=3597 line= stage.add(layer);
FIND j=3598 line=
FIND j=3599 line= var tempLayer = new Konva.Layer();
FIND j=3600 line= stage.add(tempLayer);
FIND j=3601 line=
FIND j=3602 line= var text = new Konva.Text({
FIND j=3603 line= fill : 'black'
FIND j=3604 line= });
FIND j=3605 line= layer.add(text);
FIND j=3606 line=
FIND j=3607 line= var star; var fillbw = "black";
FIND j=3608 line= for (var i = 0; i < 16; i++) {
FIND j=3609 line= star = new Konva.Star({
FIND j=3610 line= x : stage.width() * Math.random(),
FIND j=3611 line= y : stage.height() * Math.random(),
FIND j=3612 line= fill : fillbw,
FIND j=3613 line= numPoints :10,
FIND j=3614 line= innerRadius : 20,
FIND j=3615 line= outerRadius : 25,
FIND j=3616 line= draggable: true,
FIND j=3617 line= name : 'star ' + i,
FIND j=3618 line= shadowOffsetX : 5,
FIND j=3619 line= shadowOffsetY : 5
FIND j=3620 line= });
FIND j=3621 line= layer.add(star);
FIND j=3622 line= if( fillbw == "black" ) { fillbw="white"; } else { fillbw = "black"; }
FIND j=3623 line= }
FIND j=3624 line= layer.draw();
FIND j=3625 line=
FIND j=3626 line= stage.on("dragstart", function(e){
FIND j=3627 line= e.target.moveTo(tempLayer);
FIND j=3628 line= text.text('Moving ' + e.target.name());
FIND j=3629 line= layer.draw();
FIND j=3630 line= });
FIND j=3631 line=
FIND j=3632 line=
FIND j=3633 line= var previousShape;
FIND j=3634 line= stage.on("dragmove", function(evt){
FIND j=3635 line= var pos = stage.getPointerPosition();
FIND j=3636 line= var shape = layer.getIntersection(pos);
FIND j=3637 line= if (previousShape && shape) {
FIND j=3638 line= if (previousShape !== shape) {
FIND j=3639 line= // leave from old targer
FIND j=3640 line= previousShape.fire('dragleave', {
FIND j=3641 line= type : 'dragleave',
FIND j=3642 line= target : previousShape,
FIND j=3643 line= evt : evt.evt
FIND j=3644 line= }, true);
FIND j=3645 line=
FIND j=3646 line= // enter new targer
FIND j=3647 line= shape.fire('dragenter', {
FIND j=3648 line= type : 'dragenter',
FIND j=3649 line= target : shape,
FIND j=3650 line= evt : evt.evt
FIND j=3651 line= }, true);
FIND j=3652 line= previousShape = shape;
FIND j=3653 line= } else {
FIND j=3654 line= previousShape.fire('dragover', {
FIND j=3655 line= type : 'dragover',
FIND j=3656 line= target : previousShape,
FIND j=3657 line= evt : evt.evt
FIND j=3658 line= }, true);
FIND j=3659 line= }
FIND j=3660 line= } else if (!previousShape && shape) {
FIND j=3661 line= previousShape = shape;
FIND j=3662 line= shape.fire('dragenter', {
FIND j=3663 line= type : 'dragenter',
FIND j=3664 line= target : shape,
FIND j=3665 line= evt : evt.evt
FIND j=3666 line= }, true);
FIND j=3667 line= } else if (previousShape && !shape) {
FIND j=3668 line= previousShape.fire('dragleave', {
FIND j=3669 line= type : 'dragleave',
FIND j=3670 line= target : previousShape,
FIND j=3671 line= evt : evt.evt
FIND j=3672 line= }, true);
FIND j=3673 line= previousShape = undefined;
FIND j=3674 line= }
FIND j=3675 line= });
FIND j=3676 line= stage.on("dragend", function(e){
FIND j=3677 line= var pos = stage.getPointerPosition();
FIND j=3678 line= var shape = layer.getIntersection(pos);
FIND j=3679 line= if (shape) {
FIND j=3680 line= previousShape.fire('drop', {
FIND j=3681 line= type : 'drop',
FIND j=3682 line= target : previousShape,
FIND j=3683 line= evt : e.evt
FIND j=3684 line= }, true);
FIND j=3685 line= }
FIND j=3686 line= previousShape = undefined;
FIND j=3687 line= e.target.moveTo(layer);
FIND j=3688 line= layer.draw();
FIND j=3689 line= tempLayer.draw();
FIND j=3690 line= });
FIND j=3691 line=
FIND j=3692 line= stage.on("dragenter", function(e){
FIND j=3693 line= e.target.fill('green');
FIND j=3694 line= text.text('dragenter ' + e.target.name());
FIND j=3695 line= layer.draw();
FIND j=3696 line= });
FIND j=3697 line=
FIND j=3698 line= stage.on("dragleave", function(e){
FIND j=3699 line= e.target.fill('blue');
FIND j=3700 line= text.text('dragleave ' + e.target.name());
FIND j=3701 line= layer.draw();
FIND j=3702 line= });
FIND j=3703 line=
FIND j=3704 line= stage.on("dragover", function(e){
FIND j=3705 line= text.text('dragover ' + e.target.name());
FIND j=3706 line= layer.draw();
FIND j=3707 line= });
FIND j=3708 line=
FIND j=3709 line= stage.on("drop", function(e){
FIND j=3710 line= e.target.fill('red');
FIND j=3711 line= text.text('drop ' + e.target.name());
FIND j=3712 line= layer.draw();
FIND j=3713 line= });
FIND j=3714 line=</script>
FIND j=3715 line=
FIND j=3716 line=
FIND j=3717 line=<!-- <style type="text/css"> #myContainer { width: 900px; height: 550px } </style> -->
FIND j=3718 line= <style type="text/css"> #myContainer { width: 450px; height: 275px } </style>
FIND j=3719 line=<style>
FIND j=3720 line= @font-face {
FIND j=3721 line= font-family: yokkmokkOT;
FIND j=3722 line= src: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
FIND j=3723 line= }
FIND j=3724 line=
FIND j=3725 line= @font-face {
FIND j=3726 line= font-family: 'yokkmokkOT_file';
FIND j=3727 line= src: url('./fonts/yokkmokkOT.otf'); /* IE 5-8 */
FIND j=3728 line= src: local('?'), /* sneakily trick IE */
FIND j=3729 line= url('./fonts/yokkmokk.ttf') format('truetype'), /* Opera, Safari */
FIND j=3730 line= url('./fonts/yokkmokkOT.woff') format('woff'), /* FF 3.6, Chrome 5, IE9 */
FIND j=3731 line= url('./fonts/yokkmokkOT.svg#font') format('svg'); /* iOS */
FIND j=3732 line= }
FIND j=3733 line=
FIND j=3734 line= body {
FIND j=3735 line=// background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
FIND j=3736 line= background-color: lightblue;
FIND j=3737 line= background-color: black;
FIND j=3738 line= background-color: darkslategrey;
FIND j=3739 line=// color: black;
FIND j=3740 line= color: white;
FIND j=3741 line= font-size:62.5%;
FIND j=3742 line= font-family: yokkmokkOT;
FIND j=3743 line= font-size: 38pt;
FIND j=3744 line= }
FIND j=3745 line=
FIND j=3746 line=// h1 { font-size: 2.4em; } /* =24px */
FIND j=3747 line= h1 { font-size: 14pt; } /* =24px */
FIND j=3748 line= h2 { font-size: 12pt; } /* =24px */
FIND j=3749 line= p { font-size: 10pt; } /* =14px */
FIND j=3750 line= li { font-size: 20pt; } /* =14px? */
FIND j=3751 line= }
FIND j=3752 line=
FIND j=3753 line= </style>
FIND j=3754 line=
FIND j=3755 line=
FIND j=3756 line=
FIND j=3757 line=
FIND j=3758 line=
FIND j=3759 line=
FIND j=3760 line=<style>
FIND j=3761 line=
FIND j=3762 line= div.image {
FIND j=3763 line= width:100px;
FIND j=3764 line= height:100px;
FIND j=3765 line=// background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...);
FIND j=3766 line= background-image:url(
FIND j=3767 line= data:image/jpeg;base64,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);
FIND j=3768 line= }
FIND j=3769 line=
FIND j=3770 line=
FIND j=3771 line=
FIND j=3772 line=.example {
FIND j=3773 line= padding: 10px;
FIND j=3774 line= border: 1px solid #ccc;
FIND j=3775 line=}
FIND j=3776 line=#dropzone {
FIND j=3777 line= border: 2px dashed #bbb;
FIND j=3778 line= -moz-border-radius: 5px;
FIND j=3779 line= -webkit-border-radius: 5px;
FIND j=3780 line= border-radius: 5px;
FIND j=3781 line= padding: 25px;
FIND j=3782 line= text-align: center;
FIND j=3783 line= font: 20pt bold 'Vollkorn';
FIND j=3784 line= color: white;
FIND j=3785 line=}
FIND j=3786 line=.thumb {
FIND j=3787 line= height: 75px;
FIND j=3788 line= border: 1px solid #000;
FIND j=3789 line= margin: 10px 5px 0 0;
FIND j=3790 line=}
FIND j=3791 line=#progress_bar {
FIND j=3792 line= margin: 10px 0;
FIND j=3793 line= padding: 3px;
FIND j=3794 line= border: 1px solid #000;
FIND j=3795 line= font-size: 14px;
FIND j=3796 line= clear: both;
FIND j=3797 line= opacity: 0;
FIND j=3798 line= -o-transition: opacity 1s linear;
FIND j=3799 line= -moz-transition: opacity 1s linear;
FIND j=3800 line= -webkit-transition: opacity 1s linear;
FIND j=3801 line= -ms-transition: opacity 1s linear;
FIND j=3802 line=}
FIND j=3803 line=#progress_bar.loading {
FIND j=3804 line= opacity: 1.0;
FIND j=3805 line=}
FIND j=3806 line=#progress_bar .percent {
FIND j=3807 line=// background-color: #99ccff;
FIND j=3808 line= height: auto;
FIND j=3809 line= width: 0;
FIND j=3810 line=}
FIND j=3811 line=#byte_content {
FIND j=3812 line= margin: 5px 0;
FIND j=3813 line= max-height: 100px;
FIND j=3814 line= overflow-y: auto;
FIND j=3815 line= overflow-x: hidden;
FIND j=3816 line=}
FIND j=3817 line=#byte_range {
FIND j=3818 line= margin-top: 5px;
FIND j=3819 line=}
FIND j=3820 line=</style>
FIND j=3821 line=
FIND j=3822 line=
FIND j=3823 line=</head>
FIND j=3824 line=<style id="style_mail">
FIND j=3825 line= body{ background-color="black"; color="white" }
FIND j=3826 line= </style>
FIND j=3827 line=
FIND j=3828 line=<body bgcolor="black" color="white">
FIND j=3829 line= <hr>
FIND j=3830 line= <a href="./test.html"><img src="ko.png"></a>
FIND j=3831 line= <hr>
FIND j=3832 line=
FIND j=3833 line=
FIND j=3834 line=
FIND j=3835 line=<video controls="controls" style="width:160;height:90;" poster="ko.png">
FIND j=3836 line=
FIND j=3837 line= <source src="index.webm" type="video/webm;codecs="vp8, vorbis"">
FIND j=3838 line= <source src="index.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=3839 line=</video>
FIND j=3840 line=</div>
FIND j=3841 line=
FIND j=3842 line=<h1 font-family="yokkmokkOT">div_avsnap</h1>
FIND j=3843 line=<div id="div_avsnap">
FIND j=3844 line= <script>
FIND j=3845 line= var video_player = document.getElementById("video_player"),
FIND j=3846 line= links = video_player.getElementsByTagName('a');
FIND j=3847 line= for (var i=0; i<links.length; i++) {
FIND j=3848 line= links[i].onclick = handler;
FIND j=3849 line= }
FIND j=3850 line=
FIND j=3851 line= function handler(e) {
FIND j=3852 line= e.preventDefault();
FIND j=3853 line= videotarget = this.getAttribute("href");
FIND j=3854 line= filename = videotarget.substr(0, videotarget.lastIndexOf('.')) || videotarget;
FIND j=3855 line= video = document.querySelector("#video_player video");
FIND j=3856 line= video.removeAttribute("controls");
FIND j=3857 line= video.removeAttribute("poster");
FIND j=3858 line= source = document.querySelectorAll("#video_player video source");
FIND j=3859 line= source[0].src = filename + ".mp4";
FIND j=3860 line= source[1].src = filename + ".webm";
FIND j=3861 line= video.load();
FIND j=3862 line= video.play();
FIND j=3863 line= }
FIND j=3864 line=
FIND j=3865 line= div.image {
FIND j=3866 line= width:100px;
FIND j=3867 line= height:100px;
FIND j=3868 line= background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...);
FIND j=3869 line= }
FIND j=3870 line= </script>
FIND j=3871 line=
FIND j=3872 line=
FIND j=3873 line=<img alt="Embedded Image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...">
FIND j=3874 line=
FIND j=3875 line=
FIND j=3876 line=
FIND j=3877 line=
FIND j=3878 line=<div id="div_grabscreenshot">
FIND j=3879 line= <script id="script_grabscreenshot">
FIND j=3880 line= function grabScreenshot() {
FIND j=3881 line= ctx.drawImage(video, 0, 0, videoWidth, videoHeight);
FIND j=3882 line= var img = new Image();
FIND j=3883 line= img.src = canvas.toDataURL("image/png");
FIND j=3884 line= img.width = 120;
FIND j=3885 line= ssContainer.appendChild(img);
FIND j=3886 line= }
FIND j=3887 line= </script>
FIND j=3888 line= </div>
FIND j=3889 line=
FIND j=3890 line=
FIND j=3891 line=
FIND j=3892 line= <div id="div_ko_loop">
FIND j=3893 line= <h1>ko_loop</h1>
FIND j=3894 line= <script>
FIND j=3895 line= for each ( var i in [3,23,4] ) Print(i);
FIND j=3896 line= var a = [ 1,2,3 ];
FIND j=3897 line= a.x = 'xxx';
FIND j=3898 line=
FIND j=3899 line= for ( var i = 0; i < a.length; i++ )
FIND j=3900 line= Print('a: '+a[i]);
FIND j=3901 line=
FIND j=3902 line= for ( var i in a ) Print('b: '+a[i]);
FIND j=3903 line= </script>
FIND j=3904 line=<hr><hr>
FIND j=3905 line=<section>
FIND j=3906 line=<div id="canvasesdiv" style="position:relative; width:400px; height:300px">
FIND j=3907 line=<canvas id="layer1" style="z-index: 1;
FIND j=3908 line=position:absolute;
FIND j=3909 line=left:0px;
FIND j=3910 line=top:0px;
FIND j=3911 line=" height="300px" width="400">
FIND j=3912 line=This text is displayed if your browser does not support HTML5 Canvas.
FIND j=3913 line=</canvas>
FIND j=3914 line=<canvas id="layer2" style="z-index: 2;
FIND j=3915 line=position:absolute;
FIND j=3916 line=left:0px;
FIND j=3917 line=top:0px;
FIND j=3918 line=" height="300px" width="400">
FIND j=3919 line=This text is displayed if your browser does not support HTML5 Canvas.
FIND j=3920 line=</canvas>
FIND j=3921 line=<canvas id="layer3" style="z-index: 3;
FIND j=3922 line=position:absolute;
FIND j=3923 line=left:0px;
FIND j=3924 line=top:0px;
FIND j=3925 line=" height="300px" width="400">
FIND j=3926 line=This text is displayed if your browser does not support HTML5 Canvas.
FIND j=3927 line=</canvas>
FIND j=3928 line=</div>
FIND j=3929 line=
FIND j=3930 line=<script type="text/javascript">
FIND j=3931 line=var layer1;
FIND j=3932 line=var layer2;
FIND j=3933 line=var layer3;
FIND j=3934 line=var ctx1;
FIND j=3935 line=var ctx2;
FIND j=3936 line=var ctx3;
FIND j=3937 line=var x = 400;
FIND j=3938 line=var y = 300;
FIND j=3939 line=var dx = 2;
FIND j=3940 line=var dy = 4;
FIND j=3941 line=var WIDTH = 400;
FIND j=3942 line=var HEIGHT = 300;
FIND j=3943 line=var city = new Image();
FIND j=3944 line=
FIND j=3945 line=function init() {
FIND j=3946 line=city.src ="globe.png";
FIND j=3947 line=layer1 = document.getElementById("layer1");
FIND j=3948 line=ctx1 = layer1.getContext("2d");
FIND j=3949 line=layer2 = document.getElementById("layer2");
FIND j=3950 line=ctx2 = layer2.getContext("2d");
FIND j=3951 line=layer3 = document.getElementById("layer3");
FIND j=3952 line=ctx3 = layer3.getContext("2d");
FIND j=3953 line=setInterval(drawAll, 20);
FIND j=3954 line=}
FIND j=3955 line=
FIND j=3956 line=function drawAll() {
FIND j=3957 line=draw1();
FIND j=3958 line=draw2();
FIND j=3959 line=draw3();
FIND j=3960 line=}
FIND j=3961 line=
FIND j=3962 line=function draw1() {
FIND j=3963 line=ctx1.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=3964 line=ctx1.fillStyle = "#FAF7F8";
FIND j=3965 line=ctx1.beginPath();
FIND j=3966 line=ctx1.rect(0,0,WIDTH,HEIGHT);
FIND j=3967 line=ctx1.closePath();
FIND j=3968 line=ctx1.fill();
FIND j=3969 line=ctx1.fillStyle = "#444444";
FIND j=3970 line=ctx1.beginPath();
FIND j=3971 line=ctx1.arc(x, y, 10, 0, Math.PI*2, true);
FIND j=3972 line=ctx1.closePath();
FIND j=3973 line=ctx1.fill();
FIND j=3974 line=
FIND j=3975 line=if (x + dx > WIDTH || x + dx < 0)
FIND j=3976 line=dx = -dx;
FIND j=3977 line=if (y + dy > HEIGHT || y + dy < 0)
FIND j=3978 line=dy = -dy;
FIND j=3979 line=
FIND j=3980 line=x += dx;
FIND j=3981 line=y += dy;
FIND j=3982 line=}
FIND j=3983 line=
FIND j=3984 line=function draw2() {
FIND j=3985 line=ctx2.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=3986 line=ctx2.drawImage(city, 0, 0);
FIND j=3987 line=}
FIND j=3988 line=
FIND j=3989 line=function draw3() {
FIND j=3990 line=ctx3.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=3991 line=ctx3.fillStyle = "#444444";
FIND j=3992 line=ctx3.save();
FIND j=3993 line=ctx3.translate(200,200);
FIND j=3994 line=ctx3.rotate(x/20);
FIND j=3995 line=ctx3.fillRect(-15, -15, 30, 30);
FIND j=3996 line=ctx3.restore();
FIND j=3997 line=}
FIND j=3998 line=
FIND j=3999 line=init();
FIND j=4000 line=</script>
FIND j=4001 line=</section>
FIND j=4002 line=<div id="dropzone">
FIND j=4003 line=<h1>dropzone</h1>
FIND j=4004 line=<output id="zonelist">
FIND j=4005 line=<canvas id="canvas_dropzone" width=800 height=300 background-color=red></canvas>
FIND j=4006 line=</output>
FIND j=4007 line=</div>
FIND j=4008 line=
FIND j=4009 line=<script>
FIND j=4010 line= function handleFileSelect(evt) {
FIND j=4011 line= evt.stopPropagation();
FIND j=4012 line= evt.preventDefault();
FIND j=4013 line=
FIND j=4014 line= var files = evt.dataTransfer.files; // FileList object.
FIND j=4015 line= myfiles( files );
FIND j=4016 line=
FIND j=4017 line= // files is a FileList of File objects. List some properties.
FIND j=4018 line= var output = [];
FIND j=4019 line= for (var i = 0, f; f = files[i]; i++) {
FIND j=4020 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
FIND j=4021 line= f.size, ' bytes, last modified: ',
FIND j=4022 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
FIND j=4023 line= '</li>');
FIND j=4024 line= }
FIND j=4025 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
FIND j=4026 line= }
FIND j=4027 line=
FIND j=4028 line=
FIND j=4029 line=
FIND j=4030 line= function myfiles( f ) {
FIND j=4031 line= var output = ""; var j=0;
FIND j=4032 line= var flen = f.length;
FIND j=4033 line= var fname; var fsize; var ftype; var fdate;
FIND j=4034 line= alert( "myfiles flen="+flen );
FIND j=4035 line= for( j = 0; j< f.length; j++ ) {
FIND j=4036 line= var fname = escape(f[j].name );
FIND j=4037 line= var fsize = f[j].size;
FIND j=4038 line= var ftype = f[j].type;
FIND j=4039 line= var fdate = f[j].lastModifiedDate ? f[j].lastModifiedDate.toLocaleDateString() : "n/a";
FIND j=4040 line= output += "myfiles j="+j;
FIND j=4041 line= output += "flen="+flen;
FIND j=4042 line= output += "<a href='?q=fname&id=j" target=_blank >"
FIND j=4043 line= output += fname + "</a>";
FIND j=4044 line= output += "fname="+fname;
FIND j=4045 line= output += "fsize="+fsize;
FIND j=4046 line= output += "ftype="+ftype;
FIND j=4047 line= output += "fdate="+fdate;
FIND j=4048 line= output += "<br>\n";
FIND j=4049 line= }
FIND j=4050 line=
FIND j=4051 line=// alert( "myfiles info="+output );
FIND j=4052 line=// document.write( "myfiles info="+output );
FIND j=4053 line=// var mysaves = new Array();
FIND j=4054 line=// mysaves[0] = document.getElementById('div_myfiles').innerHTML;
FIND j=4055 line=// document.getElementById('div_myfiles').innerHTML = output.join('');
FIND j=4056 line=// document.getElementById('div_myfiles_saves').innerHTML = mysaves[0];
FIND j=4057 line= }
FIND j=4058 line=
FIND j=4059 line=
FIND j=4060 line= function handleDragOver(evt) {
FIND j=4061 line= evt.stopPropagation();
FIND j=4062 line= evt.preventDefault();
FIND j=4063 line= evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
FIND j=4064 line= }
FIND j=4065 line=
FIND j=4066 line= // Setup the dnd listeners.
FIND j=4067 line= var dropZone = document.getElementById('dropzone');
FIND j=4068 line= dropZone.addEventListener('dragover', handleDragOver, false);
FIND j=4069 line= dropZone.addEventListener('drop', handleFileSelect, false);
FIND j=4070 line=</script>
FIND j=4071 line=
FIND j=4072 line=<div name="div_myfiles">
FIND j=4073 line= <h1>div_myfiles</h1>
FIND j=4074 line= </div>
FIND j=4075 line=
FIND j=4076 line=<div name="div_myfiles_saves">
FIND j=4077 line= <h1>div_myfiles_saves</h1>
FIND j=4078 line= </div>
FIND j=4079 line=
FIND j=4080 line=<hr><hr><hr>
FIND j=4081 line=<style>
FIND j=4082 line= .thumb {
FIND j=4083 line= height: 75px;
FIND j=4084 line= border: 1px solid #000;
FIND j=4085 line= margin: 10px 5px 0 0;
FIND j=4086 line= }
FIND j=4087 line=</style>
FIND j=4088 line=
FIND j=4089 line=
FIND j=4090 line=<input id="files" name="files[]" multiple="" type="file">
FIND j=4091 line=<output id="zonelist"></output>
FIND j=4092 line=
FIND j=4093 line=<script>
FIND j=4094 line= function handleFileSelect(evt) {
FIND j=4095 line= var files = evt.target.files; // FileList object
FIND j=4096 line=
FIND j=4097 line= // files is a FileList of File objects. List some properties.
FIND j=4098 line= var output = [];
FIND j=4099 line= for (var i = 0, f; f = files[i]; i++) {
FIND j=4100 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
FIND j=4101 line= f.size, ' bytes, last modified: ',
FIND j=4102 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
FIND j=4103 line= '</li>');
FIND j=4104 line= }
FIND j=4105 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
FIND j=4106 line= }
FIND j=4107 line=
FIND j=4108 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
FIND j=4109 line=</script>
FIND j=4110 line=
FIND j=4111 line=
FIND j=4112 line=
FIND j=4113 line=
FIND j=4114 line=<hr><hr><hr>
FIND j=4115 line=
FIND j=4116 line=
FIND j=4117 line=
FIND j=4118 line=
FIND j=4119 line=
FIND j=4120 line=<input id="files" name="files[]" multiple="" type="file">
FIND j=4121 line=<output id="zonelist"></output>
FIND j=4122 line=
FIND j=4123 line=<script>
FIND j=4124 line= function handleFileSelect(evt) {
FIND j=4125 line= var files = evt.target.files; // FileList object
FIND j=4126 line=
FIND j=4127 line= // Loop through the FileList and render image files as thumbnails.
FIND j=4128 line= for (var i = 0, f; f = files[i]; i++) {
FIND j=4129 line=
FIND j=4130 line=// Only process image files.
FIND j=4131 line= if (!f.type.match('image.*')) { continue; }
FIND j=4132 line=
FIND j=4133 line= var reader = new FileReader();
FIND j=4134 line=
FIND j=4135 line= // Closure to capture the file information.
FIND j=4136 line= reader.onload = (function(theFile) {
FIND j=4137 line= return function(e) {
FIND j=4138 line= // Render thumbnail.
FIND j=4139 line= var span = document.createElement('span');
FIND j=4140 line= span.innerHTML = ['<img class="thumb" src="', e.target.result,
FIND j=4141 line= '" title="', escape(theFile.name), '"/>'].join('');
FIND j=4142 line= document.getElementById('zonelist').insertBefore(span, null);
FIND j=4143 line= };
FIND j=4144 line= })(f);
FIND j=4145 line=
FIND j=4146 line= // Read in the image file as a data URL.
FIND j=4147 line= reader.readAsDataURL(f);
FIND j=4148 line= }
FIND j=4149 line= }
FIND j=4150 line=
FIND j=4151 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
FIND j=4152 line=</script>
FIND j=4153 line=
FIND j=4154 line=<hr><hr><hr>
FIND j=4155 line=
FIND j=4156 line=<style>
FIND j=4157 line= #byte_content {
FIND j=4158 line= margin: 5px 0;
FIND j=4159 line= max-height: 100px;
FIND j=4160 line= overflow-y: auto;
FIND j=4161 line= overflow-x: hidden;
FIND j=4162 line= }
FIND j=4163 line= #byte_range { margin-top: 5px; }
FIND j=4164 line=</style>
FIND j=4165 line=<script id="script_previewfile">
FIND j=4166 line= function previewfile(file) {
FIND j=4167 line= if (tests.filereader === true && acceptedTypes[file.type] === true) {
FIND j=4168 line= var reader = new FileReader();
FIND j=4169 line= reader.onload = function (event) {
FIND j=4170 line= var image = new Image();
FIND j=4171 line= image.src = event.target.result;
FIND j=4172 line= image.width = 250; // a fake resize
FIND j=4173 line= holder.appendChild(image);
FIND j=4174 line= };
FIND j=4175 line=
FIND j=4176 line= reader.readAsDataURL(file);
FIND j=4177 line= }
FIND j=4178 line= else {
FIND j=4179 line= holder.innerHTML +=
FIND j=4180 line= '<p>done: koupload'
FIND j=4181 line= + file.name
FIND j=4182 line= + ' '
FIND j=4183 line= + (file.size ? (file.size/1024|0) + 'K' : '');
FIND j=4184 line= console.log(file);
FIND j=4185 line= }
FIND j=4186 line= }
FIND j=4187 line=
FIND j=4188 line= function readfiles(files) {
FIND j=4189 line= debugger;
FIND j=4190 line= var formData = tests.formdata ? new FormData() : null;
FIND j=4191 line= for (var i = 0; i < files.length; i++) {
FIND j=4192 line= if (tests.formdata) formData.append('file', files[i]);
FIND j=4193 line= previewfile(files[i]);
FIND j=4194 line= }
FIND j=4195 line=
FIND j=4196 line=// now post a new XHR request
FIND j=4197 line= if (tests.formdata) {
FIND j=4198 line= var xhr = new XMLHttpRequest();
FIND j=4199 line= xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
FIND j=4200 line=// xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
FIND j=4201 line= xhr.onload = function() {
FIND j=4202 line= progress.value = progress.innerHTML = 100;
FIND j=4203 line= };
FIND j=4204 line=
FIND j=4205 line= if (tests.progress) {
FIND j=4206 line= xhr.upload.onprogress = function (event) {
FIND j=4207 line= if (event.lengthComputable) {
FIND j=4208 line= var complete = (event.loaded / event.total * 100 | 0);
FIND j=4209 line= progress.value = progress.innerHTML = complete;
FIND j=4210 line= }
FIND j=4211 line= }
FIND j=4212 line= }
FIND j=4213 line=
FIND j=4214 line= xhr.send(formData);
FIND j=4215 line= }
FIND j=4216 line= }
FIND j=4217 line=
FIND j=4218 line= if (tests.dnd) {
FIND j=4219 line= holder.ondragover = function () { this.className = 'hover'; return false; };
FIND j=4220 line= holder.ondragend = function () { this.className = ''; return false; };
FIND j=4221 line= holder.ondrop = function (e) {
FIND j=4222 line= this.className = '';
FIND j=4223 line= e.preventDefault();
FIND j=4224 line= readfiles(e.dataTransfer.files);
FIND j=4225 line= }
FIND j=4226 line= }
FIND j=4227 line= else {
FIND j=4228 line= fileupload.className = 'hidden';
FIND j=4229 line= fileupload.querySelector('input').onchange = function () {
FIND j=4230 line= readfiles(this.files);
FIND j=4231 line= };
FIND j=4232 line= }
FIND j=4233 line= </script>
FIND j=4234 line=
FIND j=4235 line= <script id="script_myfilework>
FIND j=4236 line=
FIND j=4237 line= funtion myfilework( j, file ) {
FIND j=4238 line=
FIND j=4239 line= alert( j+" file="+file );
FIND j=4240 line= }
FIND j=4241 line=
FIND j=4242 line= </script>
FIND j=4243 line=
FIND j=4244 line=
FIND j=4245 line=
FIND j=4246 line=
FIND j=4247 line=
FIND j=4248 line= <script id="script_upload_input">>
FIND j=4249 line= var upload = document.getElementsByTagName('input')[0],
FIND j=4250 line= holder2 = document.getElementById('holder2'),
FIND j=4251 line= state = document.getElementById('status');
FIND j=4252 line=
FIND j=4253 line= if (typeof window.FileReader === 'undefined') {
FIND j=4254 line= state.className = 'fail';
FIND j=4255 line= }
FIND j=4256 line= else {
FIND j=4257 line= state.className = 'success';
FIND j=4258 line= state.innerHTML = 'File API & FileReader available';
FIND j=4259 line= }
FIND j=4260 line=
FIND j=4261 line= upload.onchange = function (e) {
FIND j=4262 line= e.preventDefault();
FIND j=4263 line=
FIND j=4264 line= var file = upload.files[0],
FIND j=4265 line= reader = new FileReader();
FIND j=4266 line= reader.onload = function (event) {
FIND j=4267 line= var img = new Image();
FIND j=4268 line= img.src = event.target.result;
FIND j=4269 line=// note: no onload required since we've got the dataurl...I think! :)
FIND j=4270 line= if (img.width > 560) { // holder width
FIND j=4271 line= img.width = 560;
FIND j=4272 line= }
FIND j=4273 line= holder2.innerHTML = '';
FIND j=4274 line= holder.appendChild(img);
FIND j=4275 line= };
FIND j=4276 line= reader.readAsDataURL(file);
FIND j=4277 line=
FIND j=4278 line= return false;
FIND j=4279 line= };
FIND j=4280 line=
FIND j=4281 line=// var formData = new FormData();
FIND j=4282 line=// formData.append("part_num", "123ABC");
FIND j=4283 line=// formData.append("part_price", 7.95);
FIND j=4284 line=// formData.append("part_image", somefile)
FIND j=4285 line=//
FIND j=4286 line=// var xhr = new XMLHttpRequest();
FIND j=4287 line=// xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");
FIND j=4288 line=// xhr.send(formData);
FIND j=4289 line=
FIND j=4290 line=
FIND j=4291 line= </script>
FIND j=4292 line=
FIND j=4293 line=
FIND j=4294 line=
FIND j=4295 line=<canvas height="200" width="100"></canvas>
FIND j=4296 line=<script>
FIND j=4297 line=var canvas = document.getElementsByTagName('canvas')[0],
FIND j=4298 line= ctx = null,
FIND j=4299 line= grad = null,
FIND j=4300 line= body = document.getElementsByTagName('body')[0],
FIND j=4301 line= color = 255;
FIND j=4302 line= color = lightblue;
FIND j=4303 line=
FIND j=4304 line=if (canvas.getContext('2d')) {
FIND j=4305 line= ctx = canvas.getContext('2d');
FIND j=4306 line= ctx.clearRect(0, 0, 600, 600);
FIND j=4307 line= ctx.save();
FIND j=4308 line=
FIND j=4309 line=// Create radial gradient
FIND j=4310 line=// grad = ctx.createRadialGradient(0,0,0,0,0,600);
FIND j=4311 line=// grad.addColorStop(0, '#000');
FIND j=4312 line=// grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');
FIND j=4313 line=
FIND j=4314 line= // assign gradients to fill
FIND j=4315 line=// ctx.fillStyle = grad;
FIND j=4316 line= ctx.fillstyle = "lightblue";
FIND j=4317 line=
FIND j=4318 line= // draw 600x600 fill
FIND j=4319 line= ctx.fillRect(0,0,600,600);
FIND j=4320 line= ctx.save();
FIND j=4321 line=
FIND j=4322 line= body.onmousemove = function (event) {
FIND j=4323 line= var width = window.innerWidth,
FIND j=4324 line= height = window.innerHeight,
FIND j=4325 line= x = event.clientX,
FIND j=4326 line= y = event.clientY,
FIND j=4327 line= rx = 600 * x / width,
FIND j=4328 line= ry = 600 * y / height;
FIND j=4329 line=
FIND j=4330 line= var xc = ~~(256 * x / width);
FIND j=4331 line= var yc = ~~(256 * y / height);
FIND j=4332 line=
FIND j=4333 line= grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600);
FIND j=4334 line= grad.addColorStop(0, '#000');
FIND j=4335 line= grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
FIND j=4336 line= // ctx.restore();
FIND j=4337 line=// ctx.fillStyle = grad;
FIND j=4338 line= ctx.fillstyle="lightblue";
FIND j=4339 line= ctx.fillRect(0,0,600,600);
FIND j=4340 line= // ctx.save();
FIND j=4341 line= };
FIND j=4342 line=}
FIND j=4343 line= </script>
FIND j=4344 line=
FIND j=4345 line=<h1>BUGS1017 div_csv</h1>
FIND j=4346 line=<div id="div_csv">
FIND j=4347 line=<hr><hr><hr>
FIND j=4348 line= <style type="text/css">
FIND j=4349 line= body {
FIND j=4350 line= font-family: Arial;
FIND j=4351 line= font-size: 10pt;
FIND j=4352 line= }
FIND j=4353 line= table {
FIND j=4354 line= border: 1px solid #ccc;
FIND j=4355 line= }
FIND j=4356 line= table th {
FIND j=4357 line= background-color: #F7F7F7;
FIND j=4358 line= color: #333;
FIND j=4359 line= font-weight: bold;
FIND j=4360 line= }
FIND j=4361 line= table th, table td {
FIND j=4362 line= padding: 5px;
FIND j=4363 line= border-color: #ccc;
FIND j=4364 line= }
FIND j=4365 line= </style>
FIND j=4366 line=
FIND j=4367 line=
FIND j=4368 line=
FIND j=4369 line=
FIND j=4370 line= <script type="text/javascript">
FIND j=4371 line= function Upload() {
FIND j=4372 line= var fileUpload = document.getElementById("fileUpload");
FIND j=4373 line= var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
FIND j=4374 line= if (regex.test(fileUpload.value.toLowerCase())) {
FIND j=4375 line= if (typeof (FileReader) != "undefined") {
FIND j=4376 line= var reader = new FileReader();
FIND j=4377 line= reader.onload = function (e) {
FIND j=4378 line= var table = document.createElement("table");
FIND j=4379 line= var rows = e.target.result.split("\n");
FIND j=4380 line= for (var i = 0; i < rows.length; i++) {
FIND j=4381 line= var row = table.insertRow(-1);
FIND j=4382 line=
FIND j=4383 line=// var cells = rows[i].split("|");
FIND j=4384 line= var cells = rows[i].split(",");
FIND j=4385 line= for (var j = 0; j < cells.length; j++) {
FIND j=4386 line= var cell = row.insertCell(-1);
FIND j=4387 line= cell.innerHTML = cells[j];
FIND j=4388 line= }
FIND j=4389 line= }
FIND j=4390 line= var csv2tbl = document.getElementById("csv2tbl");
FIND j=4391 line= csv2tbl.innerHTML = "";
FIND j=4392 line= csv2tbl.appendChild(table);
FIND j=4393 line= }
FIND j=4394 line= reader.readAsText(fileUpload.files[0]);
FIND j=4395 line= }
FIND j=4396 line= else {
FIND j=4397 line= alert("csv2tbl warn: unauthorized access noted");
FIND j=4398 line= }
FIND j=4399 line= }
FIND j=4400 line= else {
FIND j=4401 line= alert("csv2tbl fail: unsuppoted format");
FIND j=4402 line= }
FIND j=4403 line= }
FIND j=4404 line= </script>
FIND j=4405 line=
FIND j=4406 line=
FIND j=4407 line= <input id="fileUpload" type="file">
FIND j=4408 line= <input id="upload" value="Upload" onclick="Upload()" type="button">
FIND j=4409 line= </div>
FIND j=4410 line=
FIND j=4411 line=
FIND j=4412 line= <hr>
FIND j=4413 line= <div id="csv2tbl">
FIND j=4414 line= </div>
FIND j=4415 line=
FIND j=4416 line=
FIND j=4417 line=
FIND j=4418 line= </div>
FIND j=4419 line= </body>
FIND j=4420 line= </html>
FIND j=4421 line=<!DOCTYPE html>
FIND j=4422 line=<html>
FIND j=4423 line= <head>
FIND j=4424 line=<!--
FIND j=4425 line= <script type="text/javascript" src="./zm/ZoomifyImageViewer.js"></script>
FIND j=4426 line=
-->
FIND j=4427 line=<style>
FIND j=4428 line= @font-face {
FIND j=4429 line= font-family: yokkmokkOT;
FIND j=4430 line= src: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
FIND j=4431 line= }
FIND j=4432 line=
FIND j=4433 line= @font-face {
FIND j=4434 line= font-family: 'yokkmokkOT_file';
FIND j=4435 line= src: url('./fonts/yokkmokkOT.otf'); /* IE 5-8 */
FIND j=4436 line= src: local('?'), /* sneakily trick IE */
FIND j=4437 line= url('./fonts/yokkmokk.ttf') format('truetype'), /* Opera, Safari */
FIND j=4438 line= url('./fonts/yokkmokkOT.woff') format('woff'), /* FF 3.6, Chrome 5, IE9 */
FIND j=4439 line= url('./fonts/yokkmokkOT.svg#font') format('svg'); /* iOS */
FIND j=4440 line= }
FIND j=4441 line=
FIND j=4442 line= body {
FIND j=4443 line=// background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
FIND j=4444 line= background-color: lightblue;
FIND j=4445 line= background-color: darkslategrey;
FIND j=4446 line= background-color: darkgreyslate;
FIND j=4447 line=// color: black;
FIND j=4448 line= color: white;
FIND j=4449 line= font-size:62.5%;
FIND j=4450 line= font-family: "New Times Roman";
FIND j=4451 line= font-family: "serif";
FIND j=4452 line= font-family: "sans-serif";
FIND j=4453 line= font-family: "courier";
FIND j=4454 line= font-family: "monospace";
FIND j=4455 line= font-family: cursive;
FIND j=4456 line= font-family: fantasy;
FIND j=4457 line= font-family: yokkmokkOT;
FIND j=4458 line= font-family: "arial";
FIND j=4459 line= font-size: 38pt;
FIND j=4460 line= }
FIND j=4461 line=
FIND j=4462 line=// h1 { font-size: 2.4em; } /* =24px */
FIND j=4463 line= h1 { font-size: 14pt; } /* =24px */
FIND j=4464 line= h2 { font-size: 12pt; } /* =24px */
FIND j=4465 line= p { font-size: 10pt; } /* =14px */
FIND j=4466 line= li { font-size: 20pt; } /* =14px? */
FIND j=4467 line= }
FIND j=4468 line=
FIND j=4469 line= </style>
FIND j=4470 line=
FIND j=4471 line= <div id="div_url">
FIND j=4472 line= <script id="script_url">
FIND j=4473 line= var url = document.createElement("a");
FIND j=4474 line= url.href=location.href;
FIND j=4475 line= var output = "output";
FIND j=4476 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
FIND j=4477 line=
FIND j=4478 line= if( url.search != "" ) {
FIND j=4479 line= script_zm_view( url.search );
FIND j=4480 line= }
FIND j=4481 line=// alert(location.href)
FIND j=4482 line=// alert(url.protocol)
FIND j=4483 line=// alert(url.hostname)
FIND j=4484 line=// alert(url.pathname)
FIND j=4485 line=// alert(url.search)
FIND j=4486 line=// alert(url.hash)
FIND j=4487 line=
FIND j=4488 line=
FIND j=4489 line=// document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
FIND j=4490 line=// document.write( "pathname=" + url.pathname + " search=" + url.search );
FIND j=4491 line= </script>
FIND j=4492 line= </div>
FIND j=4493 line=
FIND j=4494 line=
FIND j=4495 line=
FIND j=4496 line= <script id="script_zmviewer" src="data:/text/plain;base64,KGZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30uY2FsbCgpO2EuWj17fX0pKCksWi5zaG93SW1hZ2U9ZnVuY3Rpb24oYSxiLGMpe1ouVXRpbHMuejEyOCgpLFouVXRpbHMuejEyNygpLFouVXRpbHMuejEyNigpLFouVXRpbHMuejE2MygpLFoucGFnZUNvbnRhaW5lcklEPWEsWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGIpLFoucGFyYW1ldGVycz1aLlV0aWxzLnoyMzMoYyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJET01Db250ZW50TG9hZGVkIixaLmluaXRpYWxpemUpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csImxvYWQiLFouaW5pdGlhbGl6ZSl9LFouaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2FyZ3VtZW50cy5jYWxsZWUuZG9uZXx8KGFyZ3VtZW50cy5jYWxsZWUuZG9uZT0hMCxaLlV0aWxzLnoxNjQoKSxaLlV0aWxzLnoyNDkoWi5wYXJhbWV0ZXJzKSxaLlZpZXdlcj1uZXcgWi56MTIyLFouVXRpbHMuaXNTdHJWYWwoWi5jb3B5cmlnaHRQYXRoKT9aLlV0aWxzLmVuZm9yY2VDb3B5cmlnaHQoKTpaLlZpZXdlci56MTQ5KCksWi5kZWJ1ZyYmWi5VdGlscy50cmFjZShaLlV0aWxzLnoxODUoIno2NyIpKSl9LFouejEyMj1mdW5jdGlvbigpe1ouVmlld2VyRGlzcGxheT1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIlZpZXdlckRpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJyZWxhdGl2ZSIsImhpZGRlbiIsIjEwMCUiLCIxMDAlIiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJwb2ludGVyIiksWi5wYWdlQ29udGFpbmVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFoucGFnZUNvbnRhaW5lcklEKTt2YXIgYT1aLlV0aWxzLnoxNzYoWi5wYWdlQ29udGFpbmVyKTtaLnZpZXdlclc9cGFyc2VGbG9hdChhLndpZHRoKSxaLnZpZXdlckg9cGFyc2VGbG9hdChhLmhlaWdodCksaXNOYU4oWi52aWV3ZXJXKSYmKFoudmlld2VyVz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKFoudmlld2VySCkmJihaLnZpZXdlckg9Wi5WaWV3ZXJEaXNwbGF5LmNsaWVudEhlaWdodCksWi5wYWdlQ29udGFpbmVyLmlubmVySFRNTD0iIixaLnBhZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQoWi5WaWV3ZXJEaXNwbGF5KSx0aGlzLnoxNDk9ZnVuY3Rpb24oKXtaLlZpZXdwb3J0PW5ldyBaLnoxMjV9LHRoaXMuejE0OD1mdW5jdGlvbigpe1oudG9vbGJhclZpc2libGU+MCYmKFouVG9vbGJhcj1uZXcgWi56MTI0KFouVmlld3BvcnQpKSxaLm5hdmlnYXRvclZpc2libGU+MCYmKFouTmF2aWdhdG9yPW5ldyBaLnoxMjMoWi5WaWV3cG9ydCkpLFouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56Mjc3KCl9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSl7Wi52aWV3ZXJXPWEsWi52aWV3ZXJIPWIsWi5WaWV3ZXJEaXNwbGF5LnN0eWxlLndpZHRoPWErInB4IixaLlZpZXdlckRpc3BsYXkuc3R5bGUuaGVpZ2h0PWIrInB4IixaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSYmWi5WaWV3cG9ydC5zZXRTaXplQW5kUG9zaXRpb24oYSxiLGMsZCk7dmFyIGY9Wi50b29sYmFyUG9zaXRpb249PTE/Yi1aLnRvb2xiYXJIOjA7Wi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmKFouVG9vbGJhci5zZXRTaXplQW5kUG9zaXRpb24oYSxudWxsLG51bGwsZiksWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMCkpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5OYXZpZ2F0b3IuejE4MCgpJiYoWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKG51bGwsbnVsbCxjLGQsWi5uYXZpZ2F0b3JGaXQpLFoubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSksZSYmWi5WaWV3cG9ydC56Mjc0KCEwKX0sdGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7Wi5WaWV3cG9ydC56MjkzQWxsU3RvcCghMCksWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGEpO3ZhciBiPW5ldyBaLnoxMDEsYz1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi8iKyJJbWFnZVByb3BlcnRpZXMueG1sIik7Yi5sb2FkWE1MKGMpfX0sWi56MTI1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2QoKXt6PTEsQT0wLEI9MCxGPVtdLEc9W10sSD1bXSxJPVtdLEo9W10sSz1bXSxMPVtdLE09W10sTj1bXSxPPVtdLFA9W10sUT1bXSxSPTB9ZnVuY3Rpb24gY2UoKXtyZXR1cm4gYn1mdW5jdGlvbiBjZihhKXtiPWF9ZnVuY3Rpb24gY2coKXtoPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwidmlld3BvcnRDb250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChoKSxpPWgsaz1pLnN0eWxlLGw9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydEJhY2tmaWxsRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZChsKSxtPWwsbj1tLnN0eWxlLHA9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydERpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLGguYXBwZW5kQ2hpbGQocCkscT1wLHI9cS5zdHlsZSxaLlV0aWxzLmlzU3RyVmFsKFoud2F0ZXJtYXJrUGF0aCkmJih0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2F0ZXJtYXJrRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh0KSx1PXQsdj11LnN0eWxlKSxaLlV0aWxzLmlzU3RyVmFsKFouaG90c3BvdFBhdGgpJiYodz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsImhvdHNwb3RzRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh3KSx4PXcseT14LnN0eWxlKSxaLnVzZUNhbnZhcz8obz1tLmdldENvbnRleHQoIjJkIikscz1xLmdldENvbnRleHQoIjJkIikpOihtLmlubmVySFRNTD0iIixxLmlubmVySFRNTD0iIiksdSYmKHUuaW5uZXJIVE1MPSIiKSx4JiYoeC5pbm5lckhUTUw9IiIpfWZ1bmN0aW9uIGNoKGEsYixjLGQpe2N8fChjPTApLGR8fChkPTApLFk9YSwkPWIsYmI9WSpYLGJjPSQqWCxiZD1iYi8yLGJlPWJjLzIsYmY9LSgoYmItWSkvMikrYyxiZz0oYmItWSkvMitjLGJoPS0oKGJjLSQpLzIpK2QsYmk9KGJjLSQpLzIrZCxpLndpZHRoPWJiLGkuaGVpZ2h0PWJjLGsud2lkdGg9YmIrInB4IixrLmhlaWdodD1iYysicHgiLGsubGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIscS53aWR0aD1iYixxLmhlaWdodD1iYyx1JiYodS53aWR0aD1iYix1LmhlaWdodD1iYyx2LndpZHRoPWJiKyJweCIsdi5oZWlnaHQ9YmMrInB4IiksWi51c2VDYW52YXMmJihzLnRyYW5zbGF0ZShiZCxiZSkscy5zYXZlKCkpfWZ1bmN0aW9uIGNpKCl7dmFyIGE9Wi5pbWFnZVcsYj1aLmltYWdlSDt3aGlsZShhPmN8fGI+YylhPWEvMixiPWIvMix6Kys7YT1aLmltYWdlVyxiPVouaW1hZ2VIO2Zvcih2YXIgZD16LTE7ZD49MDtkLS0pSFtkXT1hLElbZF09YixKW2RdPU1hdGguY2VpbChIW2RdL2MpLEtbZF09TWF0aC5jZWlsKElbZF0vYyksTFtkXT1KW2RdKktbZF0sYT1hLzIsYj1iLzJ9ZnVuY3Rpb24gY2ooKXtaLmluaXRpYWxYfHwoWi5pbml0aWFsWD1aLmltYWdlVy8yKSxaLmluaXRpYWxZfHwoWi5pbml0aWFsWT1aLmltYWdlSC8yKTt2YXIgYT1jUigpO1ouZml0WiYmWi5maXRaIT1hJiYoWi5pbml0aWFsWj09Wi5maXRaJiYoWi5pbml0aWFsWj1udWxsKSxaLm1pblo9PVouZml0WiYmKFoubWluWj1udWxsKSxaLm1heFo9PVouZml0WiYmKFoubWF4Wj1udWxsKSxaLmZpdFo9bnVsbCksWi5maXRafHwoWi5maXRaPWEpLFouaW5pdGlhbFp8fChaLmluaXRpYWxaPVouZml0WiksWi5taW5afHwoWi5taW5aPVouZml0WiksWi5tYXhafHwoWi5tYXhaPVouZml0WiksWi5pbml0aWFsWjxaLm1pblomJihaLmluaXRpYWxaPVoubWluWiksWi5pbml0aWFsWj5aLm1heFomJihaLmluaXRpYWxaPVoubWF4Wil9ZnVuY3Rpb24gY2soKXtjbChXKSx6PlQmJihjbChWKSx6PlMmJmNsKFUpKSxHLnNvcnQoKSxHPVouVXRpbHMuejI0MihHKSxjcyhHLGNKLDApfWZ1bmN0aW9uIGNsKGEpe3ZhciBiPUpbYV0tMSxjPUtbYV0tMTtmb3IodmFyIGQ9MDtkPD1jO2QrKylmb3IodmFyIGU9MDtlPD1iO2UrKylHLnB1c2goYSsiLSIrZSsiLSIrZCl9ZnVuY3Rpb24gY20oYSxiKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKSxkPWJmLXBhcnNlRmxvYXQoay5sZWZ0KSxlPWJoLXBhcnNlRmxvYXQoay50b3ApO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsWi5pbWFnZVg9Wi5pbWFnZVgrZC9aLmltYWdlWixaLmltYWdlWT1aLmltYWdlWStlL1ouaW1hZ2VaLGNyKG0sQixGLCExLCExKSxjcihxLEEsTywhMSwhMSksY1koKTt2YXIgZj1jdygpO2E+MD9mLnJpZ2h0PWYubGVmdDphPDAmJihmLmxlZnQ9Zi5yaWdodCksYj4wP2YuYm90dG9tPWYudG9wOmI8MCYmKGYudG9wPWYuYm90dG9tKTtmb3IodmFyIGc9Zi50b3A7Zzw9Zi5ib3R0b207ZysrKWZvcih2YXIgaD1mLmxlZnQ7aDw9Zi5yaWdodDtoKyspUS5wdXNoKEErIi0iK2grIi0iK2cpO3ZhciBpPVEubGVuZ3RoO2Zvcih2YXIgaj0wO2o8aTtqKyspe3ZhciBsPVFbal07aWYobCl7dmFyIG49bmV3IGNHKGwpO2NJKG4sYyxjSyl9fWk+MzAmJlEuc3BsaWNlKGktMzAsMzApfWZ1bmN0aW9uIGNuKCl7dmFyIGE9ITE7cGFyc2VGbG9hdChyLndpZHRoKSE9cS53aWR0aCYmKFoudXNlQ2FudmFzJiYoci53aWR0aD1xLndpZHRoKyJweCIsci5oZWlnaHQ9cS5oZWlnaHQrInB4IixyLmxlZnQ9IjBweCIsci50b3A9IjBweCIscy5yZXN0b3JlKCkscy5zYXZlKCkscy5zY2FsZShDLEMpKSxhPSEwKTtpZihwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymgpe3ZhciBiPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixjPXBhcnNlRmxvYXQoay50b3ApLWJoO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsYmw9cGFyc2VGbG9hdChuLmxlZnQpK2IsYm09cGFyc2VGbG9hdChuLnRvcCkrYyxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiO3ZhciBkPWNCKEEsQyk7Wi5pbWFnZVg9Wi5pbWFnZVgtYi9kLFouaW1hZ2VZPVouaW1hZ2VZLWMvZCxhPSEwfWEmJihjcihxLEEsTywhMCwhMSksY1koKSl9ZnVuY3Rpb24gY28oKXtDIT1EJiYoWi5pbWFnZVo9YnopLFouaW1hZ2VaPFoubWluWiYmKFouaW1hZ2VaPVoubWluWik7dmFyIGE9ZCxiPXo7d2hpbGUoYS8yPj1aLmltYWdlWiliLS0sYS89MjtiPWItMTwwPzA6Yi0xO3ZhciBjPWNDKGIsWi5pbWFnZVopO2lmKGIhPUF8fGMhPUMpWi51c2VDYW52YXMmJihzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLnNjYWxlKGMsYykpLEE9YixDPWM7RD1DfWZ1bmN0aW9uIGNwKCl7Qj1BPlM/VTpBPlQ/VjpXLEU9Y0MoQixaLmltYWdlWiksdGllckJhY2tmaWxsVz1IW0JdLHRpZXJCYWNrZmlsbEg9SVtCXSxtLndpZHRoPXRpZXJCYWNrZmlsbFcsbS5oZWlnaHQ9dGllckJhY2tmaWxsSDt2YXIgYT10aWVyQmFja2ZpbGxXKkUsYj10aWVyQmFja2ZpbGxIKkUsYz1aLmltYWdlWCpaLmltYWdlWixkPVouaW1hZ2VZKlouaW1hZ2VaO2JqPWEsYms9YixibD1iZC1jLGJtPWJlLWQsWi51c2VDYW52YXMmJihuLndpZHRoPWJqKyJweCIsbi5oZWlnaHQ9YmsrInB4Iiksbi5sZWZ0PWJsKyJweCIsbi50b3A9Ym0rInB4In1mdW5jdGlvbiBjcSgpe3ZhciBhPWN3KCk7Zm9yKHZhciBiPWEudG9wLGM9YS5ib3R0b207Yjw9YztiKyspZm9yKHZhciBkPWEubGVmdCxlPWEucmlnaHQ7ZDw9ZTtkKyspTi5wdXNoKEErIi0iK2QrIi0iK2IpO1Auc29ydCgpLE4uc29ydCgpLFA9Wi5VdGlscy56MjQyKFApLE49Wi5VdGlscy56MjQyKE4pO3ZhciBmPVouVXRpbHMuaW50ZXJzZWN0KE4sUCk7Tj1aLlV0aWxzLnN1YnRyYWN0KE4sUCksUj10aWxlc0xvYWRpbmdOYW1lc0xlbmd0aD1OLmxlbmd0aCxaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpJiZaLlRvb2xiYXIuc2hvd1Byb2dyZXNzKFIsdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGgpLFA9Wi5VdGlscy5zdWJ0cmFjdChQLGYpLFA9UC5jb25jYXQoZiksdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGghPTAmJihNPVtdKX1mdW5jdGlvbiBjcihhLGIsYyxkLGUpe2V8fGN0KGEpO2lmKGQpe3ZhciBmPU1hdGguZmxvb3IoYy5sZW5ndGgvMik7Zm9yKHZhciBnPWYsaD1jLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1jW2ddO2kmJmkudD09YiYmY00oYSxiLGkpO2lmKGMubGVuZ3RoLWctMSE9Zyl7dmFyIGk9Y1tjLmxlbmd0aC1nLTFdO2kmJmkudD09YiYmY00oYSxiLGkpfX19ZWxzZSBmb3IodmFyIGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspe3ZhciBpPWNbZ107aSYmaS50PT1iJiZjTShhLGIsaSl9fWZ1bmN0aW9uIGNzKGEsYixjKXtpZihhLmxlbmd0aD4wKXt2YXIgZD0obmV3IERhdGUpLmdldFRpbWUoKTtpZihjKXt2YXIgZT1NYXRoLmZsb29yKGEubGVuZ3RoLzIpO2Zvcih2YXIgZj1lLGc9YS5sZW5ndGg7ZjxnO2YrKyl7dmFyIGg9YVtmXTtpZihoKXt2YXIgaT1uZXcgY0coaCk7Y0koaSxkLGIpfWlmKGEubGVuZ3RoLWYtMSE9Zil7dmFyIGg9YVthLmxlbmd0aC1mLTFdO2lmKGgpe3ZhciBpPW5ldyBjRyhoKTtjSShpLGQsYil9fX19ZWxzZSBmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWFbZl07aWYoaCl7dmFyIGk9bmV3IGNHKGgpO2NJKGksZCxiKX19fX1mdW5jdGlvbiBjdChhKXtpZihhKWlmKFoudXNlQ2FudmFzJiZhLnRhZ05hbWU9PSJDQU5WQVMiKXt2YXIgYj1hLmdldENvbnRleHQoIjJkIik7Yi5zYXZlKCksYi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGIuY2xlYXJSZWN0KDAsMCxiLmNhbnZhcy53aWR0aCxiLmNhbnZhcy5oZWlnaHQpLGIucmVzdG9yZSgpfWVsc2UgaWYoYS5oYXNDaGlsZE5vZGVzKCkpd2hpbGUoYS5jaGlsZE5vZGVzLmxlbmd0aD49MSlhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY3UoKXtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXt2YXIgYT1jQihBLEMpO1ouVG9vbGJhci56MjY2KGEpfX1mdW5jdGlvbiBjdigpe1ouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56MTgwKCkmJlouTmF2aWdhdG9yLnoyNjgoKX1mdW5jdGlvbiBjdygpe3JldHVybiBuZXcgY3ooY3goKSxBKX1mdW5jdGlvbiBjeCgpe3ZhciBhPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixiPXBhcnNlRmxvYXQoay50b3ApLWJoO2lmKFoudXNlQ2FudmFzKXt2YXIgYz1wYXJzZUZsb2F0KGsud2lkdGgpL2kud2lkdGg7YS89YyxiLz1jfXZhciBkPWNCKEEsQyk7cmV0dXJuIGEhPTAmJihhLz1kKSxiIT0wJiYoYi89ZCksbmV3IGNBKFouaW1hZ2VYLWEsWi5pbWFnZVktYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsZCl9ZnVuY3Rpb24gY3koKXt2YXIgYT1wYXJzZUZsb2F0KGsubGVmdCktYmYsYj1wYXJzZUZsb2F0KGsudG9wKS1iaDtpZihaLnVzZUNhbnZhcyl7dmFyIGM9cGFyc2VGbG9hdChrLndpZHRoKS9pLndpZHRoO2EvPWMsYi89Y312YXIgZD1jQihBLEMpO3JldHVybiBhIT0wJiYoYS89ZCksYiE9MCYmKGIvPWQpLG5ldyBjQShaLmltYWdlWC1hLFouaW1hZ2VZLWIsLShiYi8yKSxiYi8yLC0oYmMvMiksYmMvMixkKX1mdW5jdGlvbiBjeihhLGIpe3ZhciBkPWNCKGIsMSksZT1NYXRoLmZsb29yKGEubGVmdCpkL2MpLGY9TWF0aC5mbG9vcihhLnJpZ2h0KmQvYyksZz1NYXRoLmZsb29yKGEudG9wKmQvYyksaD1NYXRoLmZsb29yKGEuYm90dG9tKmQvYyk7ZTwwJiYoZT0wKSxmPkpbQV0tMSYmKGY9SltBXS0xKSxnPDAmJihnPTApLGg+S1tBXS0xJiYoaD1LW0FdLTEpLHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9Zix0aGlzLnRvcD1nLHRoaXMuYm90dG9tPWh9ZnVuY3Rpb24gY0EoYSxiLGMsZCxlLGYsZyl7dGhpcy5sZWZ0PWErYy9nLHRoaXMucmlnaHQ9YStkL2csdGhpcy50b3A9YitlL2csdGhpcy5ib3R0b209YitmL2d9ZnVuY3Rpb24gY0IoYSxiKXt2YXIgYz1iKihIW2FdL1ouaW1hZ2VXKTtyZXR1cm4gY31mdW5jdGlvbiBjQyhhLGIpe3ZhciBjPWIvKEhbYV0vWi5pbWFnZVcpO3JldHVybiBjfWZ1bmN0aW9uIGNEKGEsYil7dmFyIGM9YS1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS54LGQ9Yi1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS55O3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChjLGQpfWZ1bmN0aW9uIGNFKGEsYil7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpK2JkLGQ9cGFyc2VGbG9hdChrLnRvcCkrYmUsZT1hLWMsZj1iLWQsZz1lL1ouaW1hZ2VaLGg9Zi9aLmltYWdlWixpPVouaW1hZ2VYK2csaj1aLmltYWdlWStoO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNGKGEsYil7dmFyIGM9Wi5pbWFnZVgtYSxkPVouaW1hZ2VZLWIsZT1jKlouaW1hZ2VaLGY9ZCpaLmltYWdlWixnPXBhcnNlRmxvYXQoay5sZWZ0KStiZCxoPXBhcnNlRmxvYXQoay50b3ApK2JlLGk9Zy1lLGo9aC1mO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNHKGEpe3RoaXMubmFtZT1hLHRoaXMudD1wYXJzZUludChhLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLSIpKSwxMCksdGhpcy5jPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEuaW5kZXhPZigiLSIpKzEsYS5sYXN0SW5kZXhPZigiLSIpKSwxMCksdGhpcy5yPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEubGFzdEluZGV4T2YoIi0iKSsxKSwxMCksdGhpcy54PU1hdGguZmxvb3IodGhpcy5jKmMpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMucipjKSx0aGlzLmltYWdlPW51bGwsdGhpcy5hbHBoYT0wLHRoaXMudXJsPVouVXRpbHMuejE0MChjSCh0aGlzLnQsdGhpcy5jLHRoaXMucix0aGlzLm5hbWUpKSx0aGlzLmVsbXQ9bnVsbCx0aGlzLnN0eWxlPW51bGx9ZnVuY3Rpb24gY0goYSxiLGQsZSl7dmFyIGY9ZCpKW2FdK2I7Zm9yKHZhciBnPTA7ZzxhO2crKylmKz1MW2ddO3ZhciBoPU1hdGguZmxvb3IoZi9jKSxpPVouaW1hZ2VQYXRoKyIvIisiVGlsZUdyb3VwIitoKyIvIitlKyIuanBnIjtyZXR1cm4gaX1mdW5jdGlvbiBjSShhLGIsYyl7YS5sb2FkaW5nPWNiLnoyMTJJbWFnZShhLnVybCxaLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsYyxhLGIpKX1mdW5jdGlvbiBjSihhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtGLnB1c2goYSk7dmFyIGU9Ry5pbmRleE9mKGQpO2UhPS0xJiZHLnNwbGljZShlLDEpLGEuYWxwaGE9MSxhLnQ9PUImJmNNKG0sQixhKX19ZnVuY3Rpb24gY0soYSxiLGMpe2lmKGEmJmImJmMpe2EuaW1hZ2U9Yzt2YXIgZD1hLm5hbWU7Y00ocSxBLGEpfX1mdW5jdGlvbiBjTChhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtPLnB1c2goYSksUC5wdXNoKGQpO3ZhciBlPU4uaW5kZXhPZihkKTtlIT0tMSYmTi5zcGxpY2UoZSwxKSxNLnB1c2goYSksYkZ8fChiRj13aW5kb3cuc2V0SW50ZXJ2YWwoY1AsNTApKTt2YXIgZz1OLmxlbmd0aDtnPT0wJiYoWi51c2VDYW52YXMmJmNyKHEsQSxPLCEwLCExKSxQLmxlbmd0aD5mJiZjUSgpLFI9MCksWi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmWi5Ub29sYmFyLnNob3dQcm9ncmVzcyhSLGcpfX1mdW5jdGlvbiBjTShhLGIsYyl7dmFyIGQ9Yy54LGU9Yy55LGY9Y0IoYiwxKTtpZihaLnVzZUNhbnZhcylhPT1xJiYoZC09Wi5pbWFnZVgqZixlLT1aLmltYWdlWSpmKSxjTihhLGMsZCxlKTtlbHNle3ZhciBnO2E9PXE/KGQtPVouaW1hZ2VYKmYtYmQvQyxlLT1aLmltYWdlWSpmLWJlL0MsZz1DKTpnPUUsY08oYSxjLGQsZSxnKX19ZnVuY3Rpb24gY04oYSxiLGMsZCl7dmFyIGU9YS5nZXRDb250ZXh0KCIyZCIpO1ouYWxwaGFTdXBwb3J0ZWQmJmIuYWxwaGE8MT8oZS5nbG9iYWxBbHBoYT1iLmFscGhhLGUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKSxlLmdsb2JhbEFscGhhPTEpOmUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKX1mdW5jdGlvbiBjTyhhLGIsYyxkLGUpe2IuZWxtdHx8KGIuZWxtdD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImltZyIpLGIuZWxtdC5vbm1vdXNlZG93bj1aLlV0aWxzLnByZXZlbnREZWZhdWx0LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihiLmVsbXQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxiLmVsbXQuc3JjPWIudXJsLGIuc3R5bGU9Yi5lbG10LnN0eWxlLGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixaLlV0aWxzLnJlbmRlclF1YWxpdHkoYixaLnJlbmRlclF1YWxpdHkpLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCYmKGIuc3R5bGVbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eSsiT3JpZ2luIl09IjBweCAwcHgiKSksYi5lbG10LnBhcmVudE5vZGUhPWEmJmEuYXBwZW5kQ2hpbGQoYi5lbG10KTt2YXIgZj1iLnN0eWxlO2YuZGlzcGxheT0ibm9uZSIsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkP2ZbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eV09WyJtYXRyaXgoIiwoYi5pbWFnZS53aWR0aC9iLmVsbXQud2lkdGgqZSkudG9GaXhlZCg4KSwiLDAsMCwiLChiLmltYWdlLmhlaWdodC9iLmVsbXQuaGVpZ2h0KmUpLnRvRml4ZWQoOCksIiwiLChjKmUpLnRvRml4ZWQoOCksWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPyIsIjoicHgsIiwoZCplKS50b0ZpeGVkKDgpLFouY3NzVHJhbnNmb3JtTm9Vbml0cz8iKSI6InB4KSJdLmpvaW4oIiIpOihmLndpZHRoPWIuaW1hZ2Uud2lkdGgqZSsicHgiLGYuaGVpZ2h0PWIuaW1hZ2UuaGVpZ2h0KmUrInB4IixmLmxlZnQ9YyplKyJweCIsZi50b3A9ZCplKyJweCIpLGYuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnNldE9wYWNpdHkoYixiLmFscGhhKX1mdW5jdGlvbiBjUChhKXt2YXIgYj1NLmxlbmd0aCxjPTA7Zm9yKHZhciBkPTA7ZDxiO2QrKyl7dmFyIGU9TVtkXTtlLnQ9PUEmJihlLmFscGhhPDE/KGUuYWxwaGErPWJFLGUuYWxwaGE+MSYmKGUuYWxwaGE9MSksY00ocSxBLGUpKTooYysrLGM+PWImJih3aW5kb3cuY2xlYXJJbnRlcnZhbChiRiksYkY9bnVsbCkpKX19ZnVuY3Rpb24gY1EoKXt2YXIgYT1QLmxlbmd0aC1mO2Zvcih2YXIgYj0wO2I8YTtiKyspaj1QLmluZGV4T2YoT1tiXS5uYW1lKSxqIT0tMSYmUC5zcGxpY2UoaiwxKSxPLnNwbGljZShiLDEpfWZ1bmN0aW9uIGNSKCl7cmV0dXJuIFouaW1hZ2VXL1ouaW1hZ2VIPlkvJD9ZL1ouaW1hZ2VXOiQvWi5pbWFnZUh9ZnVuY3Rpb24gY1MoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9bmV3IGNBKGEsYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGQ9Yy5sZWZ0LGU9Yy5yaWdodCxmPWMudG9wLGc9Yy5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9kPDA/YT1ZLzIvWi5pbWFnZVo6ZT5aLmltYWdlVyYmKGE9Wi5pbWFnZVctWS8yL1ouaW1hZ2VaKTphPVouaW1hZ2VXLzIsWi5pbWFnZUgqWi5pbWFnZVo+JD9mPDA/Yj0kLzIvWi5pbWFnZVo6Zz5aLmltYWdlSCYmKGI9Wi5pbWFnZUgtJC8yL1ouaW1hZ2VaKTpiPVouaW1hZ2VILzJ9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1QoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Y0IoQSxDKSxkPVouaW1hZ2VYLGU9Wi5pbWFnZVksZj1uZXcgY0EoZCxlLC0oWS8yKSxZLzIsLSgkLzIpLCQvMixjKSxnPWYubGVmdCxoPWYucmlnaHQsaT1mLnRvcCxqPWYuYm90dG9tO1ouaW1hZ2VXKmM+WT9nPDA/YSs9ZypjOmg+Wi5pbWFnZVcmJihhLT0oWi5pbWFnZVctaCkqYyk6YSs9KGQtWi5pbWFnZVcvMikqYyxaLmltYWdlSCpjPiQ/aTwwP2IrPWkqYzpqPlouaW1hZ2VIJiYoYi09KFouaW1hZ2VILWopKmMpOmIrPShlLVouaW1hZ2VILzIpKmN9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1UoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Wi5pbWFnZVgtKGEtYmYpL1ouaW1hZ2VaLGQ9Wi5pbWFnZVktKGItYmgpL1ouaW1hZ2VaLGU9bmV3IGNBKGMsZCwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGY9ZS5sZWZ0LGc9ZS5yaWdodCxoPWUudG9wLGk9ZS5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9mPDA/YSs9ZipaLmltYWdlWjpnPlouaW1hZ2VXJiYoYS09KFouaW1hZ2VXLWcpKlouaW1hZ2VaKTphKz0oYy1aLmltYWdlVy8yKSpaLmltYWdlWixaLmltYWdlSCpaLmltYWdlWj4kP2g8MD9iKz1oKlouaW1hZ2VaOmk+Wi5pbWFnZUgmJihiLT0oWi5pbWFnZUgtaSkqWi5pbWFnZVopOmIrPShkLVouaW1hZ2VILzIpKlouaW1hZ2VafXJldHVybiBuZXcgWi5VdGlscy5Qb2ludChhLGIpfWZ1bmN0aW9uIGNWKGEpe3JldHVybiBhPloubWF4Wj9hPVoubWF4WjphPFoubWluWiYmKGE9Wi5taW5aKSxhfWZ1bmN0aW9uIGNXKCl7Ylo9bmV3IEltYWdlLGIkPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzMiKSksYloudXJsPVoud2F0ZXJtYXJrUGF0aCxiWi5vbmxvYWQ9Y1gsYloub25lcnJvcj1jWixiWi5zcmM9Wi53YXRlcm1hcmtQYXRofWZ1bmN0aW9uIGNYKCl7aWYodSl7dmFyIGE9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno3NCIpKSxiPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzYiKSksYz1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejc1IikpLGQ9Y0IoQSxDKSxlPShaLmltYWdlVypkLXUud2lkdGgpLzIsZj0oWi5pbWFnZUgqZC11LmhlaWdodCkvMixnPShaLmltYWdlVy8yLVouaW1hZ2VYKSpkLGg9KFouaW1hZ2VILzItWi5pbWFnZVkpKmQsaT1kPGE/YTpkLGo9TWF0aC5yb3VuZChaLmltYWdlVy9iKSxrPU1hdGgucm91bmQoWi5pbWFnZUgvYyksbD1jeSgpO3dpU2NhbGVkVz1iWi53aWR0aCppLHdpU2NhbGVkSD1iWi5oZWlnaHQqaTt2YXIgbT0wLG49MDtmb3IodmFyIG89MTtvPD1qO28rKylmb3IodmFyIHA9MTtwPD1rO3ArKyl7dmFyIHE9TWF0aC5yb3VuZChaLmltYWdlVy8oaisxKSpvKSxyPU1hdGgucm91bmQoWi5pbWFnZUgvKGsrMSkqcCk7aWYocT5sLmxlZnQmJnE8bC5yaWdodCYmcj5sLnRvcCYmcjxsLmJvdHRvbSl7dmFyIHM9TWF0aC5yb3VuZChxKmQtd2lTY2FsZWRXLzItZStnKSx0PU1hdGgucm91bmQocipkLXdpU2NhbGVkSC8yLWYraCk7aWYoWi5pbWFnZVc+NGUzKXt2YXIgdj1tKzEwMCx3PW4rMTAwO2lmKHM8diYmdDx3KWNvbnRpbnVlO209cyxuPXR9dmFyIHg9YlouY2xvbmVOb2RlKCEwKTtaLlV0aWxzLnNldE9wYWNpdHkoeCxiJCkseC53aWR0aD13aVNjYWxlZFcseC5oZWlnaHQ9d2lTY2FsZWRIO3ZhciB5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2lDIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLHdpU2NhbGVkVysicHgiLHdpU2NhbGVkSCsicHgiLHMrInB4Iix0KyJweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7eS5hcHBlbmRDaGlsZCh4KSx1LmFwcGVuZENoaWxkKHkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHgsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9fX19ZnVuY3Rpb24gY1koKXt1JiYoY3QodSksY1goKSl9ZnVuY3Rpb24gY1ooKXtaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6OTciKSt0aGlzLnVybCl9ZnVuY3Rpb24gYyQoYixjLGQpe2EuejI5M0FsbFN0b3AoKSxaLmltYWdlWj1jVihkKTt2YXIgZT1jUyhiLGMpO1ouaW1hZ2VYPWUueCxaLmltYWdlWT1lLnksYS56Mjc0KCEwKX1mdW5jdGlvbiBjXygpe2lmKGJCKXtkYihidixidyxieCwhMSk7aWYoYnYhPT0wfHxidyE9PTB8fGJ4IT09MCliQj13aW5kb3cuc2V0VGltZW91dChjXyxiQSl9fWZ1bmN0aW9uIGRhKCl7Yk88Ykk/KGRiKGJKLGJLLGJMLCEwKSxiTysrLGJOPXdpbmRvdy5zZXRUaW1lb3V0KGRhLGJIKSk6KEM9Yk8qYkwrY0MoQSxaLmltYWdlWiksYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfWZ1bmN0aW9uIGRiKGEsYixkLGUpe3ZhciBmLGcsaCxpPSExLGo9ITEsbD0hMTtpZihkIT0wKXt2YXIgbT1DKigxK2QpO2UmJihtPUMrZCk7dmFyIG49Y0IoQSxtKTtoPWNWKG4pO2lmKGghPVouaW1hZ2VaKXt2YXIgbz1kZShoKTtvJiYoIWUsaj0hMCxsPSEwKX19aWYoYSE9MHx8YiE9MCl7dmFyIHA9cGFyc2VGbG9hdChrLmxlZnQpK2Escz1wYXJzZUZsb2F0KGsudG9wKStiLHQ9Y1UocCxzKTtmPXQueCxnPXQueSxrLmxlZnQ9ZisicHgiLGsudG9wPWcrInB4IixpPSEwLGw9ITB9dmFyIHU9YnklMj09MDt1JiYoY1koKSxqJiZjdSgpLGwmJmN2KCkpO2lmKGkpdmFyIHY9Wi51c2VDYW52YXM/cGFyc2VGbG9hdChyLndpZHRoKS9xLndpZHRoOjEsdz1NYXRoLnJvdW5kKGMvYnUqQyp2KSx4PWJ5JXc9PTAmJmJ5IT0wfWZ1bmN0aW9uIGRjKCl7YkImJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJCKSxiQj1udWxsKSxidj0wLGJ3PTAsYng9MCxieT0wfWZ1bmN0aW9uIGRkKCl7Yk4mJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJOKSxiTj1udWxsKX1mdW5jdGlvbiBkZShhKXt2YXIgYj0hMSxjPWNDKEEsYSk7aWYoYyE9Qyl7Qz1jLEU9Y0MoQixhKTt2YXIgZD1jL0QsZT1iYipkLGY9YmMqZCxnPShiYi1lKS8yLGg9KGJjLWYpLzI7aWYoYzxEKXt2YXIgaT1jVChnLGgpO2subGVmdD1iZitpLngtZysicHgiLGsudG9wPWJoK2kueS1oKyJweCJ9aWYoWi51c2VDYW52YXMpci53aWR0aD1lKyJweCIsci5oZWlnaHQ9ZisicHgiLHIubGVmdD1nKyJweCIsci50b3A9aCsicHgiLGU9YmoqZCxmPWJrKmQsZz1ibCtaLmltYWdlWCooMS1kKSpaLmltYWdlWixoPWJtK1ouaW1hZ2VZKigxLWQpKlouaW1hZ2VaLG4ud2lkdGg9ZSsicHgiLG4uaGVpZ2h0PWYrInB4IixuLmxlZnQ9ZysicHgiLG4udG9wPWgrInB4IjtlbHNle2NyKHEsQSxPLCEwLCExKSx0aWVyQmFja2ZpbGxXPUhbQl0sdGllckJhY2tmaWxsSD1JW0JdLG0ud2lkdGg9dGllckJhY2tmaWxsVyxtLmhlaWdodD10aWVyQmFja2ZpbGxIO3ZhciBqPXRpZXJCYWNrZmlsbFcqRSxsPXRpZXJCYWNrZmlsbEgqRSxvPVouaW1hZ2VYKmEscD1aLmltYWdlWSphO2JsPWJkLW8sYm09YmUtcCxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiLGNyKG0sQixGLCExLCExKX1iPSEwfXJldHVybiBifWZ1bmN0aW9uIGRmKGEpe2E/KGJYfHxkZygpLGJYLmVsbXQuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIik6YlgmJihiWC5lbG10LnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1mdW5jdGlvbiBkZygpe3ZhciBhPVouVXRpbHMuejE4NSgiejIxIiksYj0zNCxjPTM0LGQ9MjAsZT1wYXJzZUZsb2F0KFoudmlld2VyVyktKGIrZCksZj1wYXJzZUZsb2F0KFoudmlld2VySCktKGMrZCksZz1aLlV0aWxzLnoxODUoInoyMCIpO2JYPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uRlBDYW5jZWwiLGEsbnVsbCxudWxsLG51bGwsbnVsbCxiKyJweCIsYysicHgiLGUrInB4IixmKyJweCIsIm1vdXNlZG93biIsZGgsInoxMDIiLCJzb2xpZCIsIjFweCIsZywiMHB4IiwiMHB4IiksWi5WaWV3ZXJEaXNwbGF5LmFwcGVuZENoaWxkKGJYLmVsbXQpfWZ1bmN0aW9uIGRoKCl7YS50b2dnbGVGdWxsUGFnZVZpZXcoITEpfWZ1bmN0aW9uIGRpKCl7Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXlkb3duIixkeiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXl1cCIsZEEpLFoubW9iaWxlRGV2aWNlPyhaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hzdGFydCIsZHApLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJ0b3VjaG1vdmUiLGRxKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hlbmQiLGRyKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hjYW5jZWwiLGRzKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZXN0YXJ0IixkdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksImdlc3R1cmVjaGFuZ2UiLGR1KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZWVuZCIsZHYpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0ub25vcmllbnRhdGlvbmNoYW5nZT1keSk6KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3ZlciIsZGopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3V0IixkbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKFouVmlld2VyRGlzcGxheSwibW91c2Vtb3ZlIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwibW91c2Vkb3duIixkayksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNlbW92ZSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihtLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHEsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSx1JiZaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLHgmJlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9ZnVuY3Rpb24gZGooYSl7dmFyIGI9Wi5VdGlscy56MjI1KFouVXRpbHMudGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKSxjPVouVXRpbHMuejIyNShaLlV0aWxzLnJlbGF0ZWRUYXJnZXQoYSkpO2lmKCFifHwhYylaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCEwKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSxibz1udWxsfWZ1bmN0aW9uIGRrKGEpe2lmKFouVXRpbHMuaXNSaWdodE1vdXNlQnV0dG9uKGEpKXJldHVybjtibj0hMDt2YXIgYj1aLlV0aWxzLnoxODEoYSk7cmV0dXJuIGJQPW5ldyBaLlV0aWxzLlBvaW50KGIueCxiLnkpLGkubW91c2VYUHJpb3I9Yi54LGkubW91c2VZUHJpb3I9Yi55LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixkbCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNldXAiLGRtKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGRtKSwhMX1mdW5jdGlvbiBkbChiKXtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGI9Wi5VdGlscy5ldmVudChiKSxjPVouVXRpbHMuejE4MShiKSxkPWMueC1pLm1vdXNlWFByaW9yLGU9Yy55LWkubW91c2VZUHJpb3I7aWYoIWlzTmFOKGQpJiYhaXNOYU4oZSkpe3ZhciBmPXBhcnNlRmxvYXQoay5sZWZ0KStkLGc9cGFyc2VGbG9hdChrLnRvcCkrZSxoPWNVKGYsZyk7ay5sZWZ0PWgueCsicHgiLGsudG9wPWgueSsicHgiLGkubW91c2VYUHJpb3I9Yy54LGkubW91c2VZUHJpb3I9Yy55O2lmKFouTmF2aWdhdG9yKXt2YXIgaj1hLnoxNDEoaCk7Wi5OYXZpZ2F0b3IuejI2M1JlY3RhbmdsZVBvc2l0aW9uKGopfX1yZXR1cm4hMX1mdW5jdGlvbiBkbShiKXtibj0hMSxkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLGRsKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSwibW91c2V1cCIsZG0pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsZG0pO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1aLlV0aWxzLnoxODEoYiksZDtibz9kPWJvOmQ9bmV3IFouVXRpbHMuUG9pbnQoYy54LGMueSk7dmFyIGU9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZC54LDIpK01hdGgucG93KGJQLnktZC55LDIpKTtpZihlPDQpe3ZhciBmPWEuejE3MyhiLGQsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoZi54LGYueSxmLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhmLngsZi55LFouaW1hZ2VaKX1lbHNlIFoubW91c2VQYW4mJmEuejI3NCgpO2JvJiYoWi5Ub29sYmFyRGlzcGxheSYmWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMSksWi5OYXZpZ2F0b3JEaXNwbGF5JiZaLm5hdmlnYXRvclZpc2libGU+MSYmWi5OYXZpZ2F0b3Iuc2V0VmlzaWJpbGl0eSghMSkpfWZ1bmN0aW9uIGRuKGEpe3ZhciBiPVouVXRpbHMuejIyNShaLlV0aWxzLnRhcmdldChhKSksYz1aLlV0aWxzLnoyMjUoWi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKTtpZighYnx8IWMpaWYoIWJuKVouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITEpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2Vsc2V7dmFyIGQ9Wi5VdGlscy56MTgxKGEpO2JvPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX1mdW5jdGlvbiBkcChhKXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYiYmIWJwKXticj0hMTt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7YlA9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksaS5tb3VzZVhQcmlvcj1kLngsaS5tb3VzZVlQcmlvcj1kLnl9fWZ1bmN0aW9uIGRxKGIpe2IucHJldmVudERlZmF1bHQoKTtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGM9Wi5VdGlscy56MTc4KGIpO2lmKGMmJiFicCYmIWJyKXt2YXIgZD1jLnRhcmdldCxlPW5ldyBaLlV0aWxzLlBvaW50KGMucGFnZVgsYy5wYWdlWSksZj1lLngtaS5tb3VzZVhQcmlvcixnPWUueS1pLm1vdXNlWVByaW9yO2lmKCFpc05hTihmKSYmIWlzTmFOKGcpKXt2YXIgaD1wYXJzZUZsb2F0KGsubGVmdCkrZixqPXBhcnNlRmxvYXQoay50b3ApK2csbD1jVShoLGopO2subGVmdD1sLngrInB4IixrLnRvcD1sLnkrInB4IixpLm1vdXNlWFByaW9yPWUueCxpLm1vdXNlWVByaW9yPWUueTtpZihaLk5hdmlnYXRvcil7dmFyIG09YS56MTQxKGwpO1ouTmF2aWdhdG9yLnoyNjNSZWN0YW5nbGVQb3NpdGlvbihtKX19fXJldHVybiExfWZ1bmN0aW9uIGRyKGIpe2lmKCFicCYmIWJyKXt2YXIgYz0hMSxkPVouVXRpbHMuejE3OChiKTtpZihkKXt2YXIgZT1kLnRhcmdldCxmPW5ldyBaLlV0aWxzLlBvaW50KGQucGFnZVgsZC5wYWdlWSksZz1uZXcgWi5VdGlscy5Qb2ludChmLngsZi55KSxoPU1hdGguc3FydChNYXRoLnBvdyhiUC54LWcueCwyKStNYXRoLnBvdyhiUC55LWcueSwyKSk7aWYoaDw0KXt2YXIgaT1hLnoxNzMoYixnLEEsQyk7Wi5jbGlja1pvb20/YS56MjkzVG9WaWV3KGkueCxpLnksaS56KTpaLmNsaWNrUGFuJiZhLnoyOTNUb1ZpZXcoaS54LGkueSxaLmltYWdlWil9ZWxzZSBjPSEwfWVsc2UgYz0hMDtjJiZaLm1vdXNlUGFuJiZhLnoyNzQoKX19ZnVuY3Rpb24gZHMoYil7aWYoIWJwJiYhYnIpe3ZhciBjPSExLGQ9Wi5VdGlscy56MTc4KGIpO2lmKGQpe3ZhciBlPWQudGFyZ2V0LGY9bmV3IFouVXRpbHMuUG9pbnQoZC5wYWdlWCxkLnBhZ2VZKSxnPW5ldyBaLlV0aWxzLlBvaW50KGYueCxmLnkpLGg9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZy54LDIpK01hdGgucG93KGJQLnktZy55LDIpKTtpZihoPDQpe3ZhciBpPWEuejE3MyhiLGcsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoaS54LGkueSxpLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhpLngsaS55LFouaW1hZ2VaKX1lbHNlIGM9ITB9ZWxzZSBjPSEwO2MmJloubW91c2VQYW4mJmEuejI3NCgpfX1mdW5jdGlvbiBkdChhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpO2R1KGEpLGJwfHwoYnA9d2luZG93LnNldEludGVydmFsKGR3LGJzKSl9ZnVuY3Rpb24gZHUoYSl7dmFyIGE9Wi5VdGlscy5ldmVudChhKTthLnByZXZlbnREZWZhdWx0KCksYnE9TWF0aC5yb3VuZChhLnNjYWxlKjEwMCkvMTAwfWZ1bmN0aW9uIGR2KGIpe2JwJiYod2luZG93LmNsZWFySW50ZXJ2YWwoYnApLGJyPSEwLGJwPW51bGwpLFoubW91c2VQYW4mJmEuejI3NCgpfWZ1bmN0aW9uIGR3KGEpe2lmKCFaLm1vdXNlUGFuKXJldHVybjt2YXIgYj1keChBLEQsYnEpLGM9Y1YoYik7YiE9Wi5pbWFnZVomJmRlKGMpfWZ1bmN0aW9uIGR4KGEsYixjKXt2YXIgZD1iKmMsZT1jQihhLGQpO3JldHVybiBlfWZ1bmN0aW9uIGR5KGIpe1ouZnVsbFBhZ2UmJihaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCExKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKSxhLnRvZ2dsZUZ1bGxQYWdlVmlldyghMSksYS50b2dnbGVGdWxsUGFnZVZpZXcoITApLFouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITApLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApKX1mdW5jdGlvbiBkeihiKXtpZighWi5rZXlzKXJldHVybjt2YXIgYj1aLlV0aWxzLmV2ZW50KGIpO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgOTA6YS56b29tKCJvdXQiKTticmVhaztjYXNlIDE3OmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSA2NTphLnpvb20oImluIik7YnJlYWs7Y2FzZSAxNjphLnpvb20oImluIik7YnJlYWs7Y2FzZSAzNzphLnBhbigibGVmdCIpO2JyZWFrO2Nhc2UgMzg6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSA0MDphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UgMzk6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSAyNzpaLmZ1bGxQYWdlP2EudG9nZ2xlRnVsbFBhZ2VWaWV3KCExKTphLnJlc2V0KCl9fWZ1bmN0aW9uIGRBKGIpe2lmKCFaLmtleXMpcmV0dXJuO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1iLmtleUNvZGU7Yz09OTB8fGM9PTE3fHxjPT02NXx8Yz09MTY/YS56b29tKCJzdG9wIik6Yz09Mzd8fGM9PTM5P2EucGFuKCJob3Jpem9udGFsU3RvcCIpOihjPT0zOHx8Yz09NDApJiZhLnBhbigidmVydGljYWxTdG9wIil9dmFyIGE9dGhpcyxiPSExLGM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjEiKSwxMCksZD1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejU5IikpLGU9ZC8yLGY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjIiKSwxMCksZz1aLnRvb2xiYXJWaXNpYmxlPT0xP1oudG9vbGJhckg6MCxoLGksayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHk7Y2coKTt2YXIgej0xLEE9MCxCPTAsQyxELEUsRj1bXSxHPVtdLEg9W10sST1bXSxKPVtdLEs9W10sTD1bXSxNPVtdLE49W10sTz1bXSxQPVtdLFE9W10sUj0wLFM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NyIpLDEwKSxUPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejYiKSwxMCksVT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1IiksMTApLFY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NCIpLDEwKSxXPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejMiKSwxMCksWD1wYXJzZUludChaLlV0aWxzLnoxODUoIno0NSIpLDEwKSxZLCQsXyxiYSxiYixiYyxiZCxiZSxiZixiZyxiaCxiaSxiaixiayxibCxibTtZPVoudmlld2VyVywkPVoudmlld2VySCxfPWJhPTAsJC09ZyxaLnRvb2xiYXJQb3NpdGlvbj09MCYmKGJhKz1nKTt2YXIgYm49ITEsYm89bnVsbCxicD1udWxsLGJxPW51bGwsYnI9ITEsYnM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6MjQiKSwxMCksYnQ9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno4MSIpKSpaLnpvb21TcGVlZDtaLm1vYmlsZURldmljZSYmKGJ0Lz0yKTt2YXIgYnU9TWF0aC5yb3VuZChwYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejQ3IikpKloucGFuU3BlZWQpLGJ2PTAsYnc9MCxieD0wLGJ5PTAsYno9MCxiQT1wYXJzZUludChaLlV0aWxzLnoxODUoIno3NyIpLDEwKSxiQixiQyxiRCxiRT1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejE5IikpKlouZmFkZUluU3BlZWQsYkYsYkc9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzgiKSwxMCksYkg9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzkiKSwxMCksYkk9YkcvYkgsYkosYkssYkwsYk0sYk4sYk8sYlAsYlEsYlIsYlMsYlQsYlUsYlYsYlcsYlgsYlk7aWYoWi5VdGlscy5pc1N0clZhbChaLndhdGVybWFya1BhdGgpKXZhciBiWixiJCxiXz1bXSxjYT1bXTtjaChZLCQsXyxiYSk7dmFyIGNiPW5ldyBaLnoxMDEsY2M9Wi5VdGlscy56MTQwKFouaW1hZ2VQYXRoKyIvIisiSW1hZ2VQcm9wZXJ0aWVzLnhtbCIpO2NiLmxvYWRYTUwoY2MpLHRoaXMuejIwNj1mdW5jdGlvbihhLGIpe1ouaW1hZ2VXPWEsWi5pbWFnZUg9YixjaSgpLGNqKCksRT1jQyhCLFouaW5pdGlhbFopLEM9Y0MoQSxaLmluaXRpYWxaKSxEPUMsWi51c2VDYW52YXMmJnMuc2NhbGUoQyxDKSx1JiZjVygpLGNrKCksYyQoWi5pbml0aWFsWCxaLmluaXRpYWxZLFouaW5pdGlhbFopLGRpKCksY2YoITApLFouVmlld2VyLnoxNDgoKX0sdGhpcy5yZXoyMDY9ZnVuY3Rpb24oYSxiKXtjZighMSksY2QoKSxaLmltYWdlVz1hLFouaW1hZ2VIPWIsY2koKSxjaigpLEU9Y0MoQixaLmluaXRpYWxaKSxDPWNDKEEsWi5pbml0aWFsWiksRD1DLFoudXNlQ2FudmFzJiYocy5yZXN0b3JlKCkscy5zY2FsZShDLEMpKSxjaygpLGNoKFksJCxfLGJhKSxtJiZjdChtKSxxJiZjdChxKSx1JiZjdCh1KSxjJChaLmluaXRpYWxYLFouaW5pdGlhbFksWi5pbml0aWFsWiksY2YoITApLFoubmF2aWdhdG9yVmlzaWJsZT4wJiZaLk5hdmlnYXRvci5zZXRJbWFnZVBhdGgoWi5pbWFnZVBhdGgpfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoKX0sdGhpcy56MjAxPWZ1bmN0aW9uKCl7cmV0dXJuIGJifSx0aGlzLnoxNzk9ZnVuY3Rpb24oKXtyZXR1cm4gYmN9LHRoaXMuejE4Nj1mdW5jdGlvbigpe3JldHVybiB6fSx0aGlzLnoxOTU9ZnVuY3Rpb24oKXtyZXR1cm4gY30sdGhpcy56MTg3PWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuejE4OT1mdW5jdGlvbigpe3JldHVybiBDfSx0aGlzLnoxODlBc1pvb209ZnVuY3Rpb24oKXt2YXIgYT1jQihBLEMpO3JldHVybiBhfSx0aGlzLnoxOTQ9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy56MTkzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuejE5Nz1mdW5jdGlvbigpe3JldHVybiBmfSx0aGlzLnoxOTI9ZnVuY3Rpb24oKXtyZXR1cm4gSC5qb2luKCIsIil9LHRoaXMuejE4OD1mdW5jdGlvbigpe3JldHVybiBJLmpvaW4oIiwgIil9LHRoaXMuejE5MT1mdW5jdGlvbigpe3JldHVybiBMLmpvaW4oIiwgIil9LHRoaXMuejE5Nj1mdW5jdGlvbigpe3ZhciBhPU4uam9pbigiLCAiKT09IiI/IkN1cnJlbnQgdmlldyBsb2FkaW5nIGNvbXBsZXRlIjpOLmpvaW4oIiwgIik7cmV0dXJuIGF9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQpe2NoKGEsYixjLGQpfSx0aGlzLnoyNzQ9ZnVuY3Rpb24oYSl7aWYoQyE9RHx8Wi5pbWFnZVohPWJ6fHxwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymh8fGEpe2NuKCksYno9Y0IoQSxDKTt2YXIgYz0hMTtpZihDIT1EfHxaLmltYWdlWiE9Ynp8fCFifHxhKVouaW1hZ2VaPGJ6JiYhYSYmKGM9ITApLGNvKCksY3AoKSxjcihtLEIsRiwhMSwhMSk7Y3EoKSxjcihxLEEsTywhMCxjKSxjcyhOLGNMLDApLGN1KCksY3YoKX19LHRoaXMuc2V0Vmlldz1mdW5jdGlvbihhLGIsYyl7aWYoYT09dW5kZWZpbmVkfHxhPT1udWxsKWE9Wi5pbWFnZVcvMjtpZihiPT11bmRlZmluZWR8fGI9PW51bGwpYj1aLmltYWdlSC8yO2M9PXVuZGVmaW5lZHx8Yz09bnVsbD9jPVouZml0WjpjPjEmJihjPWMvMTAwKSxjJChhLGIsYyl9LHRoaXMuem9vbT1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJvdXQiOmJ4Pj0wJiYoYngtPWJ0KTticmVhaztjYXNlImluIjpieDw9MCYmKGJ4Kz1idCk7YnJlYWs7Y2FzZSJzdG9wIjpieD0wfVouem9vbWluZz1ieD09MD8ic3RvcCI6Yng+MD8iaW4iOiJvdXQiLGJ4IT0wP2JCfHwoKGJ4PDAmJlouaW1hZ2VaPloubWluWnx8Yng+MCYmWi5pbWFnZVo8Wi5tYXhaKSYmYS56MjczKCExKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnBhbj1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJsZWZ0Ijpidjw9MCYmKGJ2Kz1idSk7YnJlYWs7Y2FzZSJ1cCI6Ync8PTAmJihidys9YnUpO2JyZWFrO2Nhc2UiZG93biI6Ync+PTAmJihidy09YnUpO2JyZWFrO2Nhc2UicmlnaHQiOmJ2Pj0wJiYoYnYtPWJ1KTticmVhaztjYXNlImhvcml6b250YWxTdG9wIjpidj0wO2JyZWFrO2Nhc2UidmVydGljYWxTdG9wIjpidz0wO2JyZWFrO2Nhc2Uic3RvcCI6YnY9MCxidz0wfVoucGFubmluZ1g9YnY9PTA/InN0b3AiOmJ2PjA/ImxlZnQiOiJyaWdodCIsWi5wYW5uaW5nWT1idz09MD8ic3RvcCI6Ync+MD8idXAiOiJkb3duIixiQz1aLmltYWdlWCpjQihBLDEpLGJEPVouaW1hZ2VZKmNCKEEsMSksYnYhPTB8fGJ3IT0wP2JCfHwoYS56MjczKCEwKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnoyOTNUb1ZpZXc9ZnVuY3Rpb24oYixjLGQpe2EuejI5M0FsbFN0b3AoKTt2YXIgZT1jRihiLGMpLGY9YmQtZS54LGc9YmUtZS55LGg9Y0MoQSxkKSxpPWNDKEIsZCksaj1wYXJzZUZsb2F0KGsubGVmdCkrZixsPXBhcnNlRmxvYXQoay50b3ApK2csbT1oLUMsbj1pLUU7Yko9ai9iSSxiSz1sL2JJLGJMPW0vYkksYk09bi9iSSxhLnoyNzMoITEpLGJPPTAsYk49d2luZG93LnNldFRpbWVvdXQoZGEsYkgpfSx0aGlzLnoyOTNBbGxTdG9wPWZ1bmN0aW9uKGIpe2RjKCksZGQoKSxifHxhLnoyNzQoKX0sdGhpcy56MjQ1PWZ1bmN0aW9uKGEpe3ZhciBiPWRlKGEpO2ImJihjWSgpLGN2KCkpfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7YS56MjkzVG9WaWV3KFouaW5pdGlhbFgsWi5pbml0aWFsWSxaLmluaXRpYWxaKX0sdGhpcy50b2dnbGVGdWxsUGFnZVZpZXdFeHRlcm5hbD1mdW5jdGlvbigpe2JZPSEwLGEudG9nZ2xlRnVsbFBhZ2VWaWV3KCl9LHRoaXMudG9nZ2xlRnVsbFBhZ2VWaWV3PWZ1bmN0aW9uKGIpe2EuejI5M0FsbFN0b3AoKSxaLmZ1bGxQYWdlPWI/YjohWi5mdWxsUGFnZTt2YXIgYz1kb2N1bWVudC5ib2R5LGQ9Yy5zdHlsZSxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxmPVouVmlld2VyRGlzcGxheS5zdHlsZSxnPW51bGwsaD1udWxsO2lmKFouZnVsbFBhZ2Upe2JRPWQud2lkdGgsYlI9ZC5oZWlnaHQsYlM9ZC5vdmVyZmxvdyxiVD1lLm92ZXJmbG93LGJVPWYuYmFja2dyb3VuZENvbG9yLGJWPWYucG9zaXRpb24sYlc9Zi56SW5kZXg7dmFyIGk7Wi5tb2JpbGVEZXZpY2U/KGk9Wi5VdGlscy56MjAxaW5kb3dTaXplKCksZC53aWR0aD1pLngsZC5oZWlnaHQ9aS55KTooZC53aWR0aD0iMTAwJSIsZC5oZWlnaHQ9IjEwMCUiKSxkLm92ZXJmbG93PSJoaWRkZW4iLGUub3ZlcmZsb3c9ImhpZGRlbiIsZi5iYWNrZ3JvdW5kQ29sb3I9Wi5VdGlscy56MTg1KCJ6MjIiKSxmLnBvc2l0aW9uPSJmaXhlZCIsZi56SW5kZXg9Ijk5OTk5OTk5IixpPVouVXRpbHMuejIwMWluZG93U2l6ZSgpLGc9aS54LGg9aS55fWVsc2V7ZC53aWR0aD1iUSxkLmhlaWdodD1iUixkLm92ZXJmbG93PWJTLGUub3ZlcmZsb3c9YlQsZi5iYWNrZ3JvdW5kQ29sb3I9YlUsZi5wb3NpdGlvbj0icmVsYXRpdmUiLGYuekluZGV4PWJXO3ZhciBqPVouVXRpbHMuejE3NihaLnBhZ2VDb250YWluZXIpO2c9cGFyc2VGbG9hdChqLndpZHRoKSxoPXBhcnNlRmxvYXQoai5oZWlnaHQpLGlzTmFOKGcpJiYoZz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKGgpJiYoaD1aLlZpZXdlckRpc3BsYXkuY2xpZW50SGVpZ2h0KSxiWT0hMX1aLnZpZXdlclc9ZyxaLnZpZXdlckg9aCxjaChnLGgpLGRmKGJZKTtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXtaLnRvb2xiYXJDdXJyZW50Vz1aLnRvb2xiYXJXPT0tMT9nOloudG9vbGJhclc7dmFyIGw9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILVoudG9vbGJhckg6MDtaLlRvb2xiYXIuc2V0U2l6ZUFuZFBvc2l0aW9uKFoudG9vbGJhckN1cnJlbnRXLG51bGwsbnVsbCxsKX1aLk5hdmlnYXRvckRpc3BsYXkmJlouTmF2aWdhdG9yLnoxODAoKSYmWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKFoubmF2aWdhdG9yVyxaLm5hdmlnYXRvckgsWi5uYXZpZ2F0b3JMLTEsWi5uYXZpZ2F0b3JULTEpLGNqKCksWi5pbWFnZVo9Y1YoWi5pbWFnZVopO2lmKFouY29uc3RyYWluUGFuKXt2YXIgbT1wYXJzZUZsb2F0KGsubGVmdCksbj1wYXJzZUZsb2F0KGsudG9wKSxvPWNVKG0sbik7ay5sZWZ0PW8ueCsicHgiLGsudG9wPW8ueSsicHgifWEuejI3NCghMCl9LHRoaXMuejI3MT1mdW5jdGlvbigpe3ZhciBhPVouVmlld2VyRGlzcGxheS5maXJzdENoaWxkLmNoaWxkTm9kZXNbMF0uc3R5bGU7YS5kaXNwbGF5PWEuZGlzcGxheT09Im5vbmUiPyJpbmxpbmUtYmxvY2siOiJub25lIn0sdGhpcy56MjcyPWZ1bmN0aW9uKCl7dmFyIGE9Wi5WaWV3ZXJEaXNwbGF5LmZpcnN0Q2hpbGQuY2hpbGROb2Rlc1sxXS5zdHlsZTthLmRpc3BsYXk9YS5kaXNwbGF5PT0ibm9uZSI/ImlubGluZS1ibG9jayI6Im5vbmUifSx0aGlzLnoyNzM9ZnVuY3Rpb24oYSl7aWYodil7dmFyIGI9YT9hOnYuZGlzcGxheSE9ImlubGluZS1ibG9jayI7di5kaXNwbGF5PWI/ImlubGluZS1ibG9jayI6Im5vbmUifX0sdGhpcy50b2dnbGVDb25zdHJhaW5QYW49ZnVuY3Rpb24oKXtaLmNvbnN0cmFpblBhbj0hWi5jb25zdHJhaW5QYW47aWYoWi5jb25zdHJhaW5QYW4pe3ZhciBiPXBhcnNlRmxvYXQoci5sZWZ0KSxjPXBhcnNlRmxvYXQoci50b3ApLGQ9Y1UoYixjKTtrLmxlZnQ9ZC54KyJweCIsay50b3A9ZC55KyJweCIsYS56Mjc0KCl9fSx0aGlzLnoxNzM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoInoxMFRJRVJTS0lQVEhSRVNIT0xEIikpLGY9Y0QoYi54LGIueSksZz1jRShmLngsZi55KSxoPWNCKGMsZCk7cmV0dXJuIGEuYWx0S2V5PyhkPjErZT9oPWNCKGMsMSk6Yz4wJiYoaD1jQihjLTEsMSkpLGgtWi5maXRaPGUmJihoPVouZml0WikpOmQ8MS1lP2g9Y0IoYywxKTpjPHotMSYmKGg9Y0IoYysxLDEpKSxuZXcgWi5VdGlscy5Qb2ludDNEKGcueCxnLnksaCl9LHRoaXMuejI2Nz1mdW5jdGlvbihhLGIpe3ZhciBjPS0oYS1aLmltYWdlWCksZD0tKGItWi5pbWFnZVkpLGU9YypaLmltYWdlWixmPWQqWi5pbWFnZVosZz1lK2JmLGg9ZitiaCxpPWNVKGcsaCk7ay5sZWZ0PWkueCsicHgiLGsudG9wPWkueSsicHgifSx0aGlzLnoxNDE9ZnVuY3Rpb24oYSl7aWYoIWEpdmFyIGE9bmV3IFouVXRpbHMuUG9pbnQocGFyc2VGbG9hdChrLmxlZnQpLHBhcnNlRmxvYXQoay50b3ApKTt2YXIgYj1hLngtYmYsYz1hLnktYmgsZD1iL1ouaW1hZ2VaLGU9Yy9aLmltYWdlWixmPVouaW1hZ2VYLWQsZz1aLmltYWdlWS1lO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChmLGcpfX0sWi56MTI0PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHUoKXt3aW5kb3cuY2xlYXJJbnRlcnZhbChxKSxxPW51bGw7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzVGV4dEJveCIpLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7YSYmKGEubm9kZVZhbHVlPSIiKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGN9ZnVuY3Rpb24gdyhhKXtjPWF9ZnVuY3Rpb24geChhLGIsYyxkKXthfHwoYT1aLnRvb2xiYXJWaXNpYmxlPjA/Wi50b29sYmFyQ3VycmVudFc6MCksYnx8KGI9Wi50b29sYmFyVmlzaWJsZT4wP2Y6MCksY3x8KGM9MCksZHx8KGQ9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MCk7dmFyIGU9Wi5Ub29sYmFyRGlzcGxheS5zdHlsZTtlLndpZHRoPWErInB4IixlLmhlaWdodD1iKyJweCIsZS5sZWZ0PWMrInB4IixlLnRvcD1kKyJweCIseShhLGIpfWZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1hLGQ9YixlPXRvb2xiYXJTa2luU2l6ZXNbMl0sZj10b29sYmFyU2tpblNpemVzWzNdLGc9dG9vbGJhclNraW5TaXplc1s0XSxoPXRvb2xiYXJTa2luU2l6ZXNbNV0saT10b29sYmFyU2tpblNpemVzWzZdLGo9dG9vbGJhclNraW5TaXplc1s3XSxrPXRvb2xiYXJTa2luU2l6ZXNbOF0sbD10b29sYmFyU2tpblNpemVzWzldLG09dG9vbGJhclNraW5TaXplc1sxMF0sbj10b29sYmFyU2tpblNpemVzWzExXSxvPXRvb2xiYXJTa2luU2l6ZXNbMTJdLHA9dG9vbGJhclNraW5TaXplc1sxM10scT10b29sYmFyU2tpblNpemVzWzE0XSx1PXRvb2xiYXJTa2luU2l6ZXNbMTVdLHY9MCx3PShkLWYpLzIrMSx4PShkLWgpLzIseT0oZC1qKS8yLHo9eSoxLjMsQT15KzQsQj15KzIsQz1aLmxvZ29WaXNpYmxlPT0xPzA6ay8yLEQ9Wi5sb2dvVmlzaWJsZT09MT8wOmsvMixFPWstKGktZyksRj1aLmZ1bGxQYWdlVmlzaWJsZT84OjcsRz0yMCxIPUYqaysyKkU7Wi5zbGlkZXJWaXNpYmxlJiYoSCs9cCkscj1zPXQ9ITE7dmFyIEk9Wi5sb2dvVmlzaWJsZT09MT9lKzI6MCxKPVoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTE/azowLEs9SStKLEw9SytHK0grRytxO0w+YyYmKHI9ITAsTC1wPmMmJihzPSEwLEwtcC1xPmMmJih0PSEwLEs9MCkscT0wKSxILT1wKTt2YXIgTT1LKyhjLXEtSy1IKS8yLE49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhY2tncm91bmQiKTtOLnN0eWxlLndpZHRoPWMrInB4IixOLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9Yys0MDArInB4IixOLnN0eWxlLmhlaWdodD1kKyJweCIsTi5maXJzdENoaWxkLnN0eWxlLmhlaWdodD1kKyJweCI7dmFyIE89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkNvbnRhaW5lciIpO08uc3R5bGUud2lkdGg9SCtHKjIrInB4IixPLnN0eWxlLmhlaWdodD1kKyJweCIsTy5zdHlsZS5sZWZ0PU0tRysicHgiO3ZhciBQPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25CYWNrZ3JvdW5kIik7Wi5VdGlscy56MjAzKFAscGFyc2VGbG9hdChPLnN0eWxlLndpZHRoKSxwYXJzZUZsb2F0KE8uc3R5bGUuaGVpZ2h0KSksUC5zdHlsZS5sZWZ0PSIwcHgiO3ZhciBRPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyTG9nbyIpO2lmKFEpe3ZhciBSPVEuc3R5bGU7aWYoUilpZighdCl7Ui5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejIwMyhRLGUsZiksUi5sZWZ0PXYrInB4IixSLnRvcD13KyJweCIsdis9ZSsyO3ZhciBTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2dvRGl2aWRlciIpO2lmKFMpe1ouVXRpbHMuejIwMyhTLGcsaCk7dmFyIFQ9Uy5zdHlsZTtULmxlZnQ9disicHgiLFQudG9wPXgrInB4In19ZWxzZSBSLmRpc3BsYXk9Im5vbmUifWlmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTEpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25NaW5pbWl6ZSIpLFY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkV4cGFuZCIpO2lmKFUmJlYpe3ZhciBXPVUuc3R5bGUsWD1WLnN0eWxlO1cmJlgmJih0PyhXLmRpc3BsYXk9Im5vbmUiLFguZGlzcGxheT0ibm9uZSIpOihXLmRpc3BsYXk9ImlubGluZS1ibG9jayIsWC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejEzOChVLGksaiksWi5VdGlscy56MTM4KFYsaSxqKSxXLmxlZnQ9ditDKyJweCIsVy50b3A9eisicHgiLFgubGVmdD12K0QrInB4IixYLnRvcD16KyJweCIpKX19dj1HO3ZhciBZPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25ab29tT3V0Iik7Wi5VdGlscy56MTM4KFksaSxqKTt2YXIgJD1ZLnN0eWxlOyQubGVmdD12KyJweCIsJC50b3A9eSsicHgiLHYrPWs7dmFyIF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWNrU2xpZGVyIiksYmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblNsaWRlciIpO2lmKF8mJmJhKXt2YXIgYmI9Xy5zdHlsZSxiYz1iYS5zdHlsZTtiYiYmYmMmJihyPyhiYi5kaXNwbGF5PSJub25lIixiYy5kaXNwbGF5PSJub25lIik6KGJiLmRpc3BsYXk9ImlubGluZS1ibG9jayIsYmMuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnoyMDMoXyxuLG8pLGJiLmxlZnQ9di0yKyJweCIsYmIudG9wPUErInB4IixaLlV0aWxzLnoxMzgoYmEsbCxtKSxiYy5sZWZ0PXBhcnNlRmxvYXQoYmIubGVmdCkrInB4IixiYy50b3A9QisicHgiLHYrPXApKX12YXIgYmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblpvb21JbiIpO1ouVXRpbHMuejEzOChiZCxpLGopO3ZhciBiZT1iZC5zdHlsZTtiZS5sZWZ0PXYrInB4IixiZS50b3A9eSsicHgiLHYrPWsrMTt2YXIgYmY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhbkRpdmlkZXIiKTtaLlV0aWxzLnoyMDMoYmYsZyxoKTt2YXIgYmc9YmYuc3R5bGU7YmcubGVmdD12KyJweCIsYmcudG9wPXgrInB4Iix2Kz1FO3ZhciBiaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uUGFuTGVmdCIpO1ouVXRpbHMuejEzOChiaCxpLGopO3ZhciBiaT1iaC5zdHlsZTtiaS5sZWZ0PXYrInB4IixiaS50b3A9eSsicHgiLHYrPWs7dmFyIGJqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5VcCIpO1ouVXRpbHMuejEzOChiaixpLGopO3ZhciBiaz1iai5zdHlsZTtiay5sZWZ0PXYrInB4Iixiay50b3A9eSsicHgiLHYrPWs7dmFyIGJsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5Eb3duIik7Wi5VdGlscy56MTM4KGJsLGksaik7dmFyIGJtPWJsLnN0eWxlO2JtLmxlZnQ9disicHgiLGJtLnRvcD15KyJweCIsdis9azt2YXIgYm49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblBhblJpZ2h0Iik7Wi5VdGlscy56MTM4KGJuLGksaik7dmFyIGJvPWJuLnN0eWxlO2JvLmxlZnQ9disicHgiLGJvLnRvcD15KyJweCIsdis9azt2YXIgYnA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblJlc2V0Iik7Wi5VdGlscy56MTM4KGJwLGksaik7dmFyIGJxPWJwLnN0eWxlO2JxLmxlZnQ9disicHgiLGJxLnRvcD15KyJweCIsdis9aysxO3ZhciBicj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnVsbFBhZ2VEaXZpZGVyIik7aWYoYnIpe1ouVXRpbHMuejIwMyhicixnLGgpO3ZhciBicz1ici5zdHlsZTticy5sZWZ0PXYrInB4Iixicy50b3A9eCsicHgiLHYrPUU7dmFyIGJ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25GdWxsUGFnZSIpO1ouVXRpbHMuejEzOChidCxpLGopO3ZhciBidT1idC5zdHlsZTtidS5sZWZ0PXYrInB4IixidS50b3A9eSsicHgifXZhciBidj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94Iik7aWYoYnYpe3ZhciBidz1idi5zdHlsZTtidyYmKHM/YncuZGlzcGxheT0ibm9uZSI6KGJ3LmRpc3BsYXk9ImlubGluZS1ibG9jayIsYncud2lkdGg9cSsicHgiLGJ3LmhlaWdodD11KyJweCIsYncubGVmdD1jLXBhcnNlRmxvYXQoTy5zdHlsZS5sZWZ0KS1wYXJzZUZsb2F0KGJ3LndpZHRoKSsicHgiLGJ3LnRvcD0oZC1wYXJzZUZsb2F0KGJ3LmhlaWdodCkpLzIrInB4IikpfX1mdW5jdGlvbiB6KGEpe1oudG9vbGJhclZpc2libGU8NCYmIVoubW9iaWxlRGV2aWNlP0EoYSk6QighYSl9ZnVuY3Rpb24gQShhKXtnJiYoYT9nLmRpc3BsYXk9ImlubGluZS1ibG9jayI6Zy5kaXNwbGF5PSJub25lIil9ZnVuY3Rpb24gQihhKXtpZihnKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQ29udGFpbmVyIiksYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFja2dyb3VuZCIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbk1pbmltaXplIiksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhwYW5kIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9nb0RpdmlkZXIiKSxoPTA7dHx8KGg9cGFyc2VGbG9hdChlLnN0eWxlLmxlZnQpK3BhcnNlRmxvYXQoZS5zdHlsZS53aWR0aCkrNCk7dmFyIGk9Wi50b29sYmFyQ3VycmVudFc7YT8oYi5zdHlsZS5kaXNwbGF5PSJub25lIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSxnLndpZHRoPWgrInB4IixjLnN0eWxlLndpZHRoPWgrInB4Iik6KGIuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIiksZC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGcud2lkdGg9aSsicHgiLGMuc3R5bGUud2lkdGg9aSsicHgiKX19ZnVuY3Rpb24gQyhhKXtpZihaLnNsaWRlclZpc2libGUpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmspe3ZhciBiPVoubWF4Wi1aLm1pblosYz0oYS1aLm1pblopL2I7dHJhY2tMPXBhcnNlRmxvYXQoaS5sZWZ0KSx0cmFja1I9cGFyc2VGbG9hdChpLmxlZnQpK3BhcnNlRmxvYXQoaS53aWR0aCktcGFyc2VGbG9hdChrLndpZHRoKTt2YXIgZD10cmFja1ItdHJhY2tMLGU9YypkK3RyYWNrTDtrLmxlZnQ9ZSsicHgifX19ZnVuY3Rpb24gRChiKXtofHwoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJhY2tTbGlkZXIiKSksaXx8KGk9aC5zdHlsZSk7aWYoaCYmaSl7dmFyIGMsZD1aLlV0aWxzLnoxNzQoaCk7Wi5tb2JpbGVEZXZpY2U/Yz1aLlV0aWxzLnoxODEoYikueC1kLng6Yz1iLmNsaWVudFgtZC54O3ZhciBlPUgoYywwLHBhcnNlRmxvYXQoaS53aWR0aCkpO2U8Wi5taW5aKy4xJiYoZT1aLm1pblopLGU+Wi5tYXhaLS4xJiYoZT1aLm1heFopLGEuejI0NShlKSxhLnoyNzQoKX19ZnVuY3Rpb24gRShhKXtuPSEwLGp8fChqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25TbGlkZXIiKSk7aWYoail7dmFyIGI9Wi5VdGlscy56MTgxKGEpO2oubW91c2VYUHJpb3I9Yi54LGoubW91c2VZUHJpb3I9Yi55fX1mdW5jdGlvbiBGKGIpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmomJmspe3RyYWNrTD1wYXJzZUZsb2F0KGkubGVmdCksdHJhY2tSPXBhcnNlRmxvYXQoaS5sZWZ0KStwYXJzZUZsb2F0KGkud2lkdGgpLXBhcnNlRmxvYXQoay53aWR0aCk7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpKyhwLngtai5tb3VzZVhQcmlvcik7Yzx0cmFja0w/Yz10cmFja0w6Yz50cmFja1I/Yz10cmFja1I6ai5tb3VzZVhQcmlvcj1wLngsay5sZWZ0PWMrInB4Ijt2YXIgZD1IKGMsdHJhY2tMLHRyYWNrUik7YS56MjQ1KGQpfX1mdW5jdGlvbiBHKCl7bj0hMSxhLnoyNzQoKX1mdW5jdGlvbiBIKGEsYixjKXt2YXIgZD1jLWIsZT0oYS1iKS9kLGY9Wi5tYXhaLVoubWluWixnPVoubWluWitmKmU7cmV0dXJuIGd9ZnVuY3Rpb24gSShhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpLGI9Wi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpO2lmKCFuJiZiKXt2YXIgYz1iLnBhcmVudE5vZGU7SyhjKX19ZnVuY3Rpb24gSihhKXtaLm1vYmlsZURldmljZSYmYS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhPVouVXRpbHMuZXZlbnQoYSksYj1aLlV0aWxzLnRhcmdldChhKSxjPVouVXRpbHMucmVsYXRlZFRhcmdldChhKTtpZihiKXt2YXIgZD1iLnBhcmVudE5vZGU7ZCYmKHRhcmdldFBhcmVudElEPWQuaWQpfWlmKGMpe3ZhciBlPWMucGFyZW50Tm9kZTtlJiYocmVsYXRlZFRhcmdldFBhcmVudElEPWUuaWQpfWlmKCFufHxhLnR5cGU9PSJtb3VzZXVwInx8YS50eXBlPT0idG91Y2hlbmQifHxhLnR5cGU9PSJ0b3VjaGNhbmNlbCIpTigpLGImJiFaLlV0aWxzLmlzUmlnaHRNb3VzZUJ1dHRvbihhKSYmKHRhcmdldFBhcmVudElEJiZ0YXJnZXRQYXJlbnRJRCE9InRyYWNrU2xpZGVyIiYmYS50eXBlIT0ibW91c2Vtb3ZlIiYmKE8oYSksUChhKSksUShhKSl9ZnVuY3Rpb24gSyhiKXthJiZhLnoyOTNBbGxTdG9wKCksYi5pZCYmYi5pZC5pbmRleE9mKCJidXR0b24iKSE9LTE/KEwoYiksTShiKSk6Yi5pZCYmYi5pZC5pbmRleE9mKCJiYWNrZ3JvdW5kIikhPS0xJiZOKCl9ZnVuY3Rpb24gTChhKXtaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGEsIm1vdXNlb3V0IixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoYSwibW91c2VvdmVyIixKKX1mdW5jdGlvbiBNKGEpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ1VwSUQpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5faW1nT3ZlcklEKSxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ0Rvd25JRCk7YiYmKGIuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLGMmJihjLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGQmJihkLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpfWZ1bmN0aW9uIE4oKXt2YXIgYT1aLlRvb2xiYXJEaXNwbGF5LmNoaWxkTm9kZXMsYj1udWxsO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7Yj1hW2NdO2lmKGIuaWQmJmIuaWQuaW5kZXhPZigiYnV0dG9uIikhPS0xKWlmKGIuaWQhPSJidXR0b25Db250YWluZXIiKUwoYiksTShiKTtlbHNle3ZhciBlPWIuY2hpbGROb2RlcyxmPW51bGw7Zm9yKHZhciBnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXSxmLmlkJiZmLmlkLmluZGV4T2YoImJ1dHRvbiIpIT0tMSYmKEwoZiksTShmKSl9fX1mdW5jdGlvbiBPKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPWIucGFyZW50Tm9kZTtjJiYoWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaHN0YXJ0IixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywidG91Y2hlbmQiLEopLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaGNhbmNlbCIsSikpOihaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2VvdmVyIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGMsIm1vdXNlb3V0IixKKSkpfX1mdW5jdGlvbiBQKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPVouVXRpbHMudGFyZ2V0KGEpLnBhcmVudE5vZGU7aWYoYylpZighYy5faW1nVXBJRClLKGMpO2Vsc2V7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nVXBJRCksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjLl9pbWdPdmVySUQpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nRG93bklEKTtpZihkJiZlJiZmKXt2YXIgZz1kLnN0eWxlLGg9ZS5zdHlsZSxpPWYuc3R5bGU7Zy52aXNpYmlsaXR5PSJoaWRkZW4iLGgudmlzaWJpbGl0eT0iaGlkZGVuIixpLnZpc2liaWxpdHk9ImhpZGRlbiI7c3dpdGNoKGEudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOmgudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZXVwIjpoLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UibW91c2VvdXQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaHN0YXJ0IjppLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UidG91Y2hlbmQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIn19fX19ZnVuY3Rpb24gUShjKXt2YXIgZD1aLlV0aWxzLnRhcmdldChjKS5wYXJlbnROb2RlO2lmKGQpe3ZhciBlPWQuaWQ7c3dpdGNoKGMudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZWRvd24iLEopO2JyZWFrO2Nhc2UibW91c2Vkb3duIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwibW91c2V1cCIsSik7aWYoYSlzd2l0Y2goZSl7Y2FzZSJidXR0b25NaW5pbWl6ZSI6Yi56MjE1KCEwKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKTticmVhaztjYXNlImJ1dHRvbkV4cGFuZCI6Yi56MjE1KCExKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKTticmVhaztjYXNlImJ1dHRvblpvb21PdXQiOmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSJidXR0b25TbGlkZXIiOkUoYyksUihjKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsUiksb3x8KG89d2luZG93LnNldEludGVydmFsKEYsbSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSik7YnJlYWs7Y2FzZSJ0cmFja1NsaWRlciI6RChjKTticmVhaztjYXNlImJ1dHRvblpvb21JbiI6YS56b29tKCJpbiIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuTGVmdCI6YS5wYW4oImxlZnQiKTticmVhaztjYXNlImJ1dHRvblBhblVwIjphLnBhbigidXAiKTticmVhaztjYXNlImJ1dHRvblBhbkRvd24iOmEucGFuKCJkb3duIik7YnJlYWs7Y2FzZSJidXR0b25QYW5SaWdodCI6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSJidXR0b25SZXNldCI6YS5yZXNldCgpfWJyZWFrO2Nhc2UibW91c2V1cCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsIm1vdXNlZG93biIsSiksYSYmKGU9PSJidXR0b25TbGlkZXIifHxuPyhvJiYod2luZG93LmNsZWFySW50ZXJ2YWwobyksbz1udWxsKSxHKCksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLFIpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSiksTigpKTplPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpO2JyZWFrO2Nhc2UibW91c2VvdXQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZW92ZXIiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTooZT09ImJ1dHRvblBhblVwInx8ZT09ImJ1dHRvblBhbkRvd24iKSYmYS5wYW4oInZlcnRpY2FsU3RvcCIpKTticmVhaztjYXNlInRvdWNoc3RhcnQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJ0b3VjaGVuZCIsSiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoY2FuY2VsIixKKTtpZihhKXN3aXRjaChlKXtjYXNlImJ1dHRvbk1pbmltaXplIjpiLnoyMTUoITApLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2JyZWFrO2Nhc2UiYnV0dG9uRXhwYW5kIjpiLnoyMTUoITEpLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApO2JyZWFrO2Nhc2UiYnV0dG9uWm9vbU91dCI6YS56b29tKCJvdXQiKTticmVhaztjYXNlImJ1dHRvblNsaWRlciI6RShjKSxTKGMpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSxvfHwobz13aW5kb3cuc2V0SW50ZXJ2YWwoRixtKSksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoZW5kIixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hjYW5jZWwiLEopO2JyZWFrO2Nhc2UidHJhY2tTbGlkZXIiOkQoYyk7YnJlYWs7Y2FzZSJidXR0b25ab29tSW4iOmEuem9vbSgiaW4iKTticmVhaztjYXNlImJ1dHRvblBhbkxlZnQiOmEucGFuKCJsZWZ0Iik7YnJlYWs7Y2FzZSJidXR0b25QYW5VcCI6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSJidXR0b25QYW5Eb3duIjphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuUmlnaHQiOmEucGFuKCJyaWdodCIpO2JyZWFrO2Nhc2UiYnV0dG9uUmVzZXQiOmEucmVzZXQoKX1icmVhaztjYXNlInRvdWNoZW5kIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hzdGFydCIsSiksYSYmKGU9PSJidXR0b25ab29tT3V0Inx8ZT09ImJ1dHRvblpvb21JbiI/KGEuem9vbSgic3RvcCIpLFouZGVidWcmJmU9PSJidXR0b25ab29tT3V0IiYmYy5hbHRLZXkmJlouVXRpbHMuejI1MygpKTplPT0iYnV0dG9uU2xpZGVyIj8obyYmKHdpbmRvdy5jbGVhckludGVydmFsKG8pLG89bnVsbCksRygpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSk6ZT09ImJ1dHRvblBhbkxlZnQifHxlPT0iYnV0dG9uUGFuUmlnaHQiP2EucGFuKCJob3Jpem9udGFsU3RvcCIpOmU9PSJidXR0b25QYW5VcCJ8fGU9PSJidXR0b25QYW5Eb3duIj9hLnBhbigidmVydGljYWxTdG9wIik6ZT09ImJ1dHRvbkZ1bGxQYWdlIiYmYS50b2dnbGVGdWxsUGFnZVZpZXcoKSk7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoc3RhcnQiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iPyhhLnpvb20oInN0b3AiKSxaLmRlYnVnJiZlPT0iYnV0dG9uWm9vbU91dCImJmMuYWx0S2V5JiZaLlV0aWxzLnoyNTMoKSk6ZT09ImJ1dHRvblNsaWRlciI/KG8mJih3aW5kb3cuY2xlYXJJbnRlcnZhbChvKSxvPW51bGwpLEcoKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsUykpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpfX19ZnVuY3Rpb24gUihhKXtwPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpfWZ1bmN0aW9uIFMoYSl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0O3A9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKX19dmFyIGI9dGhpcyxjPSExLGQ9bmV3IFouejEwMTtaLnNraW5QYXRoPVouVXRpbHMuejI0MyhaLnNraW5QYXRoKTt2YXIgZT1aLnNraW5QYXRoKyIvIjtkLmxvYWRYTUwoWi5za2luUGF0aCsiLyIrWi5VdGlscy56MTg1KCJ6NTUiKSk7dmFyIGYsZyxoLGksaixrLGw9W10sbT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1NyIpLDEwKSxuPSExLG89bnVsbCxwPW51bGwscT1udWxsLHIscyx0O3RoaXMuejIwNT1mdW5jdGlvbihhLGIpe1ouVG9vbGJhckRpc3BsYXk9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUb29sYmFyRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIiwiMXB4IiwiMXB4IiwiMHB4IiwiMXB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJkZWZhdWx0IiksZz1aLlRvb2xiYXJEaXNwbGF5LnN0eWxlO3ZhciBjPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChjLmVsbXQpLHRvb2xiYXJTa2luU2l6ZXM9YTtpZihaLmxvZ29WaXNpYmxlKXt2YXIgZDtpZighWi5VdGlscy5pc1N0clZhbChaLmxvZ29DdXN0b21QYXRoKSlkPW5ldyBaLlV0aWxzLkdyYXBoaWMoInRvb2xiYXJMb2dvIixlLGJbMV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO2Vsc2V7dmFyIGg9Wi5VdGlscy56MTQwKFoubG9nb0N1c3RvbVBhdGgpO2Q9bmV3IFouVXRpbHMuR3JhcGhpYygidG9vbGJhckxvZ28iLGgsbnVsbCwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iil9Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChkLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGU9PTB8fFoudG9vbGJhclZpc2libGU9PTEpe3ZhciBpPW5ldyBaLlV0aWxzLkdyYXBoaWMoImxvZ29EaXZpZGVyIixlLGJbMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQoaS5lbG10KX19dmFyIGo9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJidXR0b25Db250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIsImRlZmF1bHQiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKGopLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihqLCJ0b3VjaHN0YXJ0IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlb3ZlciIsSSkpO3ZhciBrPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJ1dHRvbkJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChrLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTF8fFoubW9iaWxlRGV2aWNlKXt2YXIgbD1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbk1pbmltaXplIixudWxsLGUsYlszXSxiWzRdLGJbNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwNyIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQobC5lbG10KTt2YXIgbT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4cGFuZCIsbnVsbCxlLGJbNl0sYls3XSxiWzhdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDUiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKG0uZWxtdCl9dmFyIG49bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25ab29tT3V0IixudWxsLGUsYls5XSxiWzEwXSxiWzExXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4IiwibW91c2VvdmVyIixKLCJ6MTIwIik7ai5hcHBlbmRDaGlsZChuLmVsbXQpO2lmKFouc2xpZGVyVmlzaWJsZSl7dmFyIG89bmV3IFouVXRpbHMuR3JhcGhpYygidHJhY2tTbGlkZXIiLGUsYlsxMl0sIjFweCIsIjFweCIsIjBweCIsIjBweCIpO2ouYXBwZW5kQ2hpbGQoby5lbG10KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoby5lbG10LCJtb3VzZWRvd24iLEopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLmVsbXQsInRvdWNoc3RhcnQiLEopO3ZhciBwPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uU2xpZGVyIixudWxsLGUsYlsxNF0sYlsxNV0sYlsxNl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExNCIpO2ouYXBwZW5kQ2hpbGQocC5lbG10KX12YXIgcT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblpvb21JbiIsbnVsbCxlLGJbMTddLGJbMThdLGJbMTldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTkiKTtqLmFwcGVuZENoaWxkKHEuZWxtdCk7dmFyIHI9bmV3IFouVXRpbHMuR3JhcGhpYygicGFuRGl2aWRlciIsZSxiWzIwXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iik7ai5hcHBlbmRDaGlsZChyLmVsbXQpO3ZhciBzPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uUGFuTGVmdCIsbnVsbCxlLGJbMjFdLGJbMjJdLGJbMjNdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDkiKTtqLmFwcGVuZENoaWxkKHMuZWxtdCk7dmFyIHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5VcCIsbnVsbCxlLGJbMjRdLGJbMjVdLGJbMjZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTEiKTtqLmFwcGVuZENoaWxkKHQuZWxtdCk7dmFyIHU9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5Eb3duIixudWxsLGUsYlsyN10sYlsyOF0sYlsyOV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwOCIpO2ouYXBwZW5kQ2hpbGQodS5lbG10KTt2YXIgdj1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblBhblJpZ2h0IixudWxsLGUsYlszMF0sYlszMV0sYlszMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMCIpO2ouYXBwZW5kQ2hpbGQodi5lbG10KTt2YXIgeT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblJlc2V0IixudWxsLGUsYlszM10sYlszNF0sYlszNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMiIpO2ouYXBwZW5kQ2hpbGQoeS5lbG10KTtpZihaLmZ1bGxQYWdlVmlzaWJsZSl7dmFyIEE9bmV3IFouVXRpbHMuR3JhcGhpYygiZnVsbFBhZ2VEaXZpZGVyIixlLGJbMzZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiKTtqLmFwcGVuZENoaWxkKEEuZWxtdCk7dmFyIEI9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25GdWxsUGFnZSIsbnVsbCxlLGJbMzddLGJbMzhdLGJbMzldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTgiKTtqLmFwcGVuZENoaWxkKEIuZWxtdCl9aWYoWi5wcm9ncmVzc1Zpc2libGUpe3ZhciBEPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwicHJvZ3Jlc3NUZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLEU9dG9vbGJhclNraW5TaXplc1sxNl0rInB4IjtqLmFwcGVuZENoaWxkKEQpO3ZhciBGPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFouVXRpbHMuejE4NSgiejUyIikpO0QuYXBwZW5kQ2hpbGQoWi5VdGlscy5jcmVhdGVDZW50ZXJlZEVsZW1lbnQoRikpLFouVXRpbHMuejI1MShGLCJibGFjayIsInZlcmRhbmEiLEUsIm5vbmUiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCIxZW0iLCJsZWZ0Iiwibm9uZSIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihELCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5kaXNhYmxlVGV4dEludGVyYWN0aW9uKEYpfVouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRvb2xiYXJEaXNwbGF5KSxaLnRvb2xiYXJXPXRvb2xiYXJTa2luU2l6ZXNbMF0sWi50b29sYmFyQ3VycmVudFc9Wi50b29sYmFyVz09LTE/Wi52aWV3ZXJXOloudG9vbGJhclcsWi50b29sYmFySD1mPXRvb2xiYXJTa2luU2l6ZXNbMV07dmFyIEc9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MDt4KFoudG9vbGJhckN1cnJlbnRXLFoudG9vbGJhckgsMCxHKTtpZihaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSl7dmFyIEg9Wi5WaWV3cG9ydC56MTg5QXNab29tKCk7QyhIKX16KFoudG9vbGJhclZpc2libGU9PTF8fFoudG9vbGJhclZpc2libGU9PTJ8fFoudG9vbGJhclZpc2libGU9PTQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlRvb2xiYXJEaXNwbGF5LCJtb3VzZW92ZXIiLFouVXRpbHMuc3RvcFByb3BhZ2F0aW9uKSx3KCEwKX0sdGhpcy56MTgwPWZ1bmN0aW9uKCl7cmV0dXJuIHYoKX0sdGhpcy5zZXRTaXplQW5kUG9zaXRpb249ZnVuY3Rpb24oYSxiLGMsZCl7eChhLGIsYyxkKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe3ooYSl9LHRoaXMuc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihhKXtBKGEpfSx0aGlzLnoyMTU9ZnVuY3Rpb24oYSl7QihhKX0sdGhpcy5zaG93UHJvZ3Jlc3M9ZnVuY3Rpb24oYSxiKXtpZihaLnByb2dyZXNzVmlzaWJsZSl7cSYmd2luZG93LmNsZWFySW50ZXJ2YWwocSk7dmFyIGMsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94IikuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDtkJiYoYT09MHx8Yj09MD8oZC5ub2RlVmFsdWU9ImxsbGxsbGxsbGwiLHE9d2luZG93LnNldEludGVydmFsKHUscGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NTEiKSksMTApKTooYz1NYXRoLnJvdW5kKDEwMC1iL2EqMTAwKSxkLm5vZGVWYWx1ZT0ibCIubXVsdGlwbHkoTWF0aC5yb3VuZChjLzEwKSkpKX19LHRoaXMuejI2Nj1mdW5jdGlvbihhKXtDKGEpfX0sWi56MTIzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHgoYSl7Wi5OYXZpZ2F0b3JEaXNwbGF5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiTmF2aWdhdG9yRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixlKyJweCIsZisicHgiLGcrInB4IixoKyJweCIsInNvbGlkIiwiMXB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLG89Wi5OYXZpZ2F0b3JEaXNwbGF5LHA9by5zdHlsZTt2YXIgYj1aLlV0aWxzLnoxODUoInozNiIpLGM9Wi5VdGlscy56MTg1KCJ6MzZOT0FMUEhBIiksZD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckJhY2tncm91bmQiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsicHgiLGYrInB4IiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsYiwiMHB4IiwiMHB4Iik7Wi5VdGlscy5zZXRPcGFjaXR5KGQsbCxjKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoZCkscT1kLHI9cS5zdHlsZTt2YXIgaj1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckltYWdlQ29udGFpbmVyIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGUrInB4IixmKyJweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChuKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoaikscz1qLHQ9cy5zdHlsZSx1PW47dmFyIGs9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJuYXZpZ2F0b3JSZWN0YW5nbGUiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsxKyJweCIsZisxKyJweCIsZysicHgiLGgrInB4Iiwic29saWQiLCIxcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ay5zdHlsZS5ib3JkZXJDb2xvcj1aLlV0aWxzLnoxODUoIno0MSIpLFouTmF2aWdhdG9yRGlzcGxheS5hcHBlbmRDaGlsZChrKSx2PWssdz12LnN0eWxlLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLk5hdmlnYXRvckRpc3BsYXkpLEMoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCksWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaHN0YXJ0IixQKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2htb3ZlIixRKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2hlbmQiLFIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaGNhbmNlbCIsUykpOihaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2VvdmVyIixaLlV0aWxzLnN0b3BQcm9wYWdhdGlvbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKG8sIm1vdXNlZG93biIsTSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLEIoITApLEcoKX1mdW5jdGlvbiB5KGEpe0MoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCl9ZnVuY3Rpb24geigpe2lmKEEoKSl7ZCYmKHdpbmRvdy5jbGVhckludGVydmFsKGQpLGQ9bnVsbCk7aWYoIW98fCFwfHwhcXx8IXJ8fCFzfHwhdHx8IXV8fCF2fHwhdylvPVouTmF2aWdhdG9yRGlzcGxheSxwPW8uc3R5bGUscT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1swXSxyPXEuc3R5bGUscz1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXSx0PXMuc3R5bGUsdT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXS5maXJzdENoaWxkLHY9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMl0sdz12LnN0eWxlfX1mdW5jdGlvbiBBKCl7cmV0dXJuIGN9ZnVuY3Rpb24gQihhKXtjPWF9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2F8fChhPVoubmF2aWdhdG9yVyksYnx8KGI9Wi5uYXZpZ2F0b3JIKSxjfHwoYz0wKSxkfHwoZD0wKSxvfHwobz1aLk5hdmlnYXRvckRpc3BsYXkpLHB8fChwPW8uc3R5bGUpLHU9by5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQ7aWYobyYmcCYmdSl7aWYoZSl7dmFyIGY9MSxnPTE7ZT09MD9nPVoudmlld2VyVy9aLnZpZXdlckg6Zz11LndpZHRoL3UuaGVpZ2h0LGY+MT8oYj1hLGIvPWcpOihhPWIsYSo9Zyl9cC53aWR0aD1hKyJweCIscC5oZWlnaHQ9YisicHgiLHAubGVmdD1jLTErInB4IixwLnRvcD1kLTErInB4IixEKGEsYil9fWZ1bmN0aW9uIEQoYSxiKXtyfHwocj1aLk5hdmlnYXRvckRpc3BsYXkuZmlyc3RDaGlsZC5zdHlsZSksdHx8KHQ9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMV0uc3R5bGUpLHV8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpLHImJnQmJnUmJihyLndpZHRoPWErInB4IixyLmhlaWdodD1iKyJweCIsRShhLGIsdS53aWR0aCx1LmhlaWdodCksdC53aWR0aD11LndpZHRoKyJweCIsdC5oZWlnaHQ9dS5oZWlnaHQrInB4Iix0LmxlZnQ9KGEtcGFyc2VGbG9hdCh0LndpZHRoKSkvMisicHgiLHQudG9wPShiLXBhcnNlRmxvYXQodC5oZWlnaHQpKS8yKyJweCIsRygpKX1mdW5jdGlvbiBFKGEsYixjLGQpe3V8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpO2lmKHUpe3ZhciBlPWMvZCxmPWEvYyxnPWIvZCxoPTAsaT0wO2Y8PWc/KGM9YSxkPWEvZSxpPShiLWQqKGEvYykpLzIpOmc8ZiYmKGQ9YixjPWIqZSxoPShhLWMqKGIvZCkpLzIpLHUud2lkdGg9Yyx1LmhlaWdodD1kfX1mdW5jdGlvbiBGKCl7cHx8KHA9Wi5OYXZpZ2F0b3JEaXNwbGF5LnN0eWxlKSxwJiYocC56SW5kZXg9cC56SW5kZXgrMTAwKX1mdW5jdGlvbiBHKCl7aWYoWi5WaWV3cG9ydCYmWi5WaWV3cG9ydC56MTgwKCkpe0koKTt2YXIgYT1aLlZpZXdwb3J0LnoxNDEoKTtKKGEpfX1mdW5jdGlvbiBIKGEpe3B8fChwPVouTmF2aWdhdG9yRGlzcGxheS5zdHlsZSkscCYmKGE/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuZGlzcGxheT0ibm9uZSIpfWZ1bmN0aW9uIEkoKXtpZih1JiZ3KXt2YXIgYT11LndpZHRoL1ouaW1hZ2VXLGI9dS5oZWlnaHQvWi5pbWFnZUgsYz1aLlZpZXdwb3J0LnoxODlBc1pvb20oKSxkPVoudmlld2VyVyphL2MsZT1aLnZpZXdlckgqYi9jO3cud2lkdGg9ZCsicHgiLHcuaGVpZ2h0PWUrInB4In19ZnVuY3Rpb24gSihhKXtpZih1JiZ3JiZ0KXt2YXIgYj11LndpZHRoL1ouaW1hZ2VXLGM9dS5oZWlnaHQvWi5pbWFnZUgsZD1hLngqYixlPWEueSpjLGY9ZC1wYXJzZUZsb2F0KHcud2lkdGgpLzIsZz1lLXBhcnNlRmxvYXQody5oZWlnaHQpLzI7dy5sZWZ0PWYrcGFyc2VGbG9hdCh0LmxlZnQpKyJweCIsdy50b3A9ZytwYXJzZUZsb2F0KHQudG9wKSsicHgifX1mdW5jdGlvbiBLKCl7aWYodyYmdCYmdSl7dmFyIGE9cGFyc2VGbG9hdCh3LmxlZnQpLXBhcnNlRmxvYXQodC5sZWZ0KSxiPXBhcnNlRmxvYXQody50b3ApLXBhcnNlRmxvYXQodC50b3ApLGM9YSsocGFyc2VGbG9hdCh3LndpZHRoKS0xKS8yLGQ9YisocGFyc2VGbG9hdCh3LmhlaWdodCktMSkvMixlPVouaW1hZ2VXL3Uud2lkdGgsZj1aLmltYWdlSC91LmhlaWdodCxnPWMqZSxoPWQqZjtaLlZpZXdwb3J0LnoyNjcoZyxoKX19ZnVuY3Rpb24gTCgpe1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4OCIpKX1mdW5jdGlvbiBNKGEpe2lmKG8mJnYmJncpe3ZhciBhPVouVXRpbHMuZXZlbnQoYSk7di5tb3VzZVhQcmlvcj1hLmNsaWVudFgsdi5tb3VzZVlQcmlvcj1hLmNsaWVudFksemFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChhLmNsaWVudFgsYS5jbGllbnRZKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vtb3ZlIixOKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2V1cCIsTyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixPKX19ZnVuY3Rpb24gTihhKXtpZih2JiZ3KXt2YXIgYj1wYXJzZUZsb2F0KHcubGVmdCksYz1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWIrKGEuY2xpZW50WC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWMrKGEuY2xpZW50WS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9YS5jbGllbnRYLHYubW91c2VZUHJpb3I9YS5jbGllbnRZLEsoKSwhMX19ZnVuY3Rpb24gTyhhKXtpZihvJiZ2JiZ3KXtkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNlbW92ZSIsTiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNldXAiLE8pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsTyk7dmFyIGE9Wi5VdGlscy5ldmVudChhKSxiPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpLGM9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1iLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWIueSwyKSk7aWYoYzw0KXt2YXIgZD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9YS5jbGllbnRYLWQueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1hLmNsaWVudFktZC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFAoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKG8mJnYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7emFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChkLngsZC55KSx2Lm1vdXNlWFByaW9yPWQueCx2Lm1vdXNlWVByaW9yPWQueSx6YXB0dkRyYWdQdFN0YXJ0PW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX19ZnVuY3Rpb24gUShhKXthLnByZXZlbnREZWZhdWx0KCk7aWYoIVoubW91c2VQYW4pcmV0dXJuO2lmKHYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSksZT1wYXJzZUZsb2F0KHcubGVmdCksZj1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWUrKGQueC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWYrKGQueS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9ZC54LHYubW91c2VZUHJpb3I9ZC55LEsoKSwhMX19cmV0dXJuITF9ZnVuY3Rpb24gUihhKXtpZihvJiZ2JiZ3KXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYil7dmFyIGM9Yi50YXJnZXQsZD1uZXcgWi5VdGlscy5Qb2ludChiLnBhZ2VYLGIucGFnZVkpLGU9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksZj1NYXRoLnNxcnQoTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC54LWUueCwyKStNYXRoLnBvdyh6YXB0dkRyYWdQdFN0YXJ0LnktZS55LDIpKSxnPVoubW9iaWxlRGV2aWNlPzY6MztpZihmPGcpe3ZhciBoPVouVXRpbHMuejE3NChaLk5hdmlnYXRvckRpc3BsYXkpO3cubGVmdD1kLngtaC54LXBhcnNlRmxvYXQody53aWR0aCkvMisicHgiLHcudG9wPWQueS1oLnktcGFyc2VGbG9hdCh3LmhlaWdodCkvMisicHgifX1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFMoYSl7aWYobyYmdiYmdyl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0LGQ9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKSxlPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpLGY9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1lLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWUueSwyKSksZz1aLm1vYmlsZURldmljZT82OjM7aWYoZjxnKXt2YXIgaD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9ZC54LWgueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1kLnktaC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In19SygpLFouVmlld3BvcnQuejI3NCgpfX12YXIgYj10aGlzLGM9ITEsZCxlPVoubmF2aWdhdG9yVyxmPVoubmF2aWdhdG9ySCxnPVoubmF2aWdhdG9yTC0xLGg9Wi5uYXZpZ2F0b3JULTEsaT1aLm5hdmlnYXRvckZpdCxqLGs9bnVsbCxsPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6MzUiKSksbT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLG49bmV3IEltYWdlO24ub25sb2FkPXgsbi5vbmVycm9yPUwsbi5zcmM9bTt2YXIgbyxwLHEscixzLHQsdSx2LHc7dGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7bT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLHMucmVtb3ZlQ2hpbGQobiksbj1udWxsLG49bmV3IEltYWdlLHMuYXBwZW5kQ2hpbGQobiksbi5vbmxvYWQ9eSxuLm9uZXJyb3I9TCxuLnNyYz1tfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gQSgpfSx0aGlzLnNldFNpemVBbmRQb3NpdGlvbj1mdW5jdGlvbihhLGIsYyxkLGUpe2V8fChlPWkpLEMoYSxiLGMsZCxlKX0sdGhpcy5zZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKGEpe0goYSl9LHRoaXMuejI2OD1mdW5jdGlvbigpe0coKX0sdGhpcy56MjYzUmVjdGFuZ2xlRGltZW5zaW9ucz1mdW5jdGlvbigpe0koKX0sdGhpcy56MjYzUmVjdGFuZ2xlUG9zaXRpb249ZnVuY3Rpb24oYSl7SihhKX0sdGhpcy56Mjc3PWZ1bmN0aW9uKCl7QSgpP3ooKTpkPXdpbmRvdy5zZXRJbnRlcnZhbCh6LDMwMCl9fSxaLnoxMDE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPW51bGwsZD10eXBlb2YgYj09ImZ1bmN0aW9uIjtpZihkKXZhciBlPWIsYj1mdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KFouVXRpbHMuY3JlYXRlQ2FsbGJhY2sobnVsbCxlLGMpLDEpfTtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl7dmFyIGY9WyJNc3htbDIuWE1MSFRUUCIsIk1zeG1sMy5YTUxIVFRQIiwiTWljcm9zb2Z0LlhNTEhUVFAiXTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl0cnl7Yz1uZXcgQWN0aXZlWE9iamVjdChmW2ddKTticmVha31jYXRjaChoKXtjb250aW51ZX19ZWxzZSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJihjPW5ldyBYTUxIdHRwUmVxdWVzdCk7Y3x8Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejk5IikpLGQmJihjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09NCYmKGMub25yZWFkeXN0YXRlY2hhbmdlPW5ldyBGdW5jdGlvbixiKCkpfSk7dHJ5e2Mub3BlbigiR0VUIixhLGQpLGMuc2VuZChudWxsKX1jYXRjaChoKXthLmluZGV4T2YoIkltYWdlUHJvcGVydGllcy54bWwiKSE9LTE/Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg3LUlNQUdFWE1MIikpOmEuaW5kZXhPZigic2tpbkZpbGVzLnhtbCIpIT0tMT9aLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODctVE9PTEJBUlhNTCIpKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODciKSksYy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxjPW51bGx9cmV0dXJuIGQ/bnVsbDpjfWZ1bmN0aW9uIGQoYSl7aWYoYSl7aWYoIWEpWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg5IikpO2Vsc2UgaWYoYS5zdGF0dXMhPT0yMDAmJmEuc3RhdHVzIT09MCl7dmFyIGI9YS5zdGF0dXMsYz1iPT00MDQ/Ik5vdCBGb3VuZCI6YS5zdGF0dXNUZXh0O1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MCIpK2IrIiAtICIrYyl9dmFyIGQ9bnVsbDthLnJlc3BvbnNlWE1MJiZhLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudD9kPWEucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQmJihkPVouVXRpbHMuejE1OChhLnJlc3BvbnNlVGV4dCkpLGUoZCl9ZWxzZSBaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODQiKSl9ZnVuY3Rpb24gZShhKXtpZihhJiZhLmRvY3VtZW50RWxlbWVudCl7dmFyIGI9YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZTtiPT0iQ09QWVJJR0hUIj9mKCJjb3B5cmlnaHQiLGEpOmI9PSJJTUFHRV9QUk9QRVJUSUVTIj9mKCJpbWFnZSIsYSk6Yj09IlNLSU5EQVRBIj9mKCJza2luIixhKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6MTAwIikpfWVsc2UgWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejEwMCIpKX1mdW5jdGlvbiBmKGEsYil7aWYoYT09ImNvcHlyaWdodCIpe3ZhciBjPWIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiU1RBVEVNRU5UVEVYVCIpLGQ9Yi5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJERUNMSU5FRFRFWFQiKTtaLlV0aWxzLmlzU3RyVmFsKGMpP1ouVXRpbHMuejI1MighMCxjLGQpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJpbWFnZSIpe3ZhciBlPXBhcnNlSW50KGIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiV0lEVEgiKSwxMCksZj1wYXJzZUludChiLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIkhFSUdIVCIpLDEwKTshaXNOYU4oZSkmJmU+MCYmIWlzTmFOKGYpJiZmPjA/Wi5WaWV3cG9ydCYmKFouVmlld3BvcnQuejE4MCgpP1ouVmlld3BvcnQucmV6MjA2KGUsZik6Wi5WaWV3cG9ydC56MjA2KGUsZikpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJza2luIil7Wi5za2luTW9kZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOTU9ERSIpLm5vZGVWYWx1ZTt2YXIgZyxoO1ouc2tpbk1vZGU9PTF8fFouc2tpbk1vZGU9PTAmJiFaLm1vYmlsZURldmljZT8oZz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJGT0xERVJTVEFOREFSRCIpLm5vZGVWYWx1ZSxoPSJTSVpFU1NUQU5EQVJEIik6KGc9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU0VUVVAiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRk9MREVSTEFSR0UiKS5ub2RlVmFsdWUsaD0iU0laRVNMQVJHRSIpO3ZhciBpPVtdO2kucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlRPT0xCQVJXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiVE9PTEJBUkgiKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJMT0dPVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkxPR09IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRElWSURFUlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJESVZJREVSSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiQlVUVE9OU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNMSURFUkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTTElERVJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tIIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTRk9OVFNJWkUiKS5ub2RlVmFsdWUpKTt2YXIgaj1bXSxrPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZJTEVTIilbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNLSU4wIikubm9kZVZhbHVlLGw9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRklMRVMiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0tJTjM5Iikubm9kZVZhbHVlO2lmKFouVXRpbHMuaXNTdHJWYWwoaykmJlouVXRpbHMuaXNTdHJWYWwobCkpe3ZhciBtPSExO2Zvcih2YXIgbj0wO248NDA7bisrKXt2YXIgbz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGSUxFUyIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOIituKS5ub2RlVmFsdWU7Wi5VdGlscy5pc1N0clZhbChvKT9qW25dPWcrIi8iK286KGpbbl09Im51bGwiLG09ITApfW0mJlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIkVSUk9SX1NLSU5TWE1MTUlTU0lOR05BTUVTIikpLFouVG9vbGJhciYmWi5Ub29sYmFyLnoyMDUoaSxqKX1lbHNlIFouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MSIpKX19ZnVuY3Rpb24gZyhhLGMsZCl7Yi0tO2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXRyeXthKGQpfWNhdGNoKGUpe1ouVXRpbHMuejI1NShlLm5hbWUrWi5VdGlscy56MTg1KCJ6ODMiKStjKyIgIitlLm1lc3NhZ2UpfX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gZShlKXtjLm9ubG9hZD1udWxsLGMub25hYm9ydD1udWxsLGMub25lcnJvcj1udWxsLGQmJndpbmRvdy5jbGVhclRpbWVvdXQoZCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtiKGEsZT9jOm51bGwpfSwxKX12YXIgYz1udWxsLGQ9bnVsbDt0aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7Yz1uZXcgSW1hZ2U7dmFyIGI9ZnVuY3Rpb24oKXtlKCEwKX0sZj1mdW5jdGlvbigpe2UoITEpfSxnPWZ1bmN0aW9uKCl7ZSghMSl9O2Mub25sb2FkPWIsYy5vbmFib3J0PWYsYy5vbmVycm9yPWYsZD13aW5kb3cuc2V0VGltZW91dChnLHBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NjAiKSkpLGMuc3JjPWF9fXZhciBiPTA7dGhpcy5sb2FkWE1MPWZ1bmN0aW9uKGEpe2MoYSxkKX0sdGhpcy56MjEySW1hZ2U9ZnVuY3Rpb24oYSxjKXtpZihiPj1wYXJzZUludChaLlV0aWxzLnoxODUoInoyNSIpLDEwKSlyZXR1cm4hMTt2YXIgZD1aLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsZyxjKSxlPW5ldyBoKGEsZCk7cmV0dXJuIGIrKyxlLnN0YXJ0KCksITB9fSxaLlV0aWxzPXt6MTYzOmZ1bmN0aW9uKCl7Wi5wYWdlQ29udGFpbmVySUQ9bnVsbCxaLmltYWdlUGF0aD1udWxsLFouc2tpblBhdGg9bnVsbCxaLnNraW5Nb2RlPW51bGwsWi5wYXJhbWV0ZXJzPW51bGwsWi5icm93c2Vycz1udWxsLFouYnJvd3Nlcj1udWxsLFouYnJvd3NlclZlcnNpb249bnVsbCxaLmNhbnZhc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3JtUHJvcGVydHk9bnVsbCxaLmNzc1RyYW5zZm9ybU5vVW5pdHM9bnVsbCxaLmFscGhhU3VwcG9ydGVkPW51bGwsWi5yZW5kZXJRdWFsaXR5PW51bGwsWi5tb2JpbGVEZXZpY2U9bnVsbCxaLmluaXRpYWxYPW51bGwsWi5pbml0aWFsWT1udWxsLFouaW5pdGlhbFo9bnVsbCxaLm1pblo9bnVsbCxaLm1heFo9bnVsbCxaLnpvb21TcGVlZD1udWxsLFoucGFuU3BlZWQ9bnVsbCxaLmZhZGVJblNwZWVkPW51bGwsWi50b29sYmFyVmlzaWJsZT1udWxsLFoudG9vbGJhclc9bnVsbCxaLnRvb2xiYXJIPW51bGwsWi50b29sYmFyUG9zaXRpb249bnVsbCxaLm5hdmlnYXRvclZpc2libGU9bnVsbCxaLm5hdmlnYXRvclc9bnVsbCxaLm5hdmlnYXRvckg9bnVsbCxaLm5hdmlnYXRvckw9bnVsbCxaLm5hdmlnYXRvclQ9bnVsbCxaLm5hdmlnYXRvckZpdD1udWxsLFouY2xpY2tab29tPW51bGwsWi5jbGlja1Bhbj1udWxsLFoubW91c2VQYW49bnVsbCxaLmtleXM9bnVsbCxaLmNvbnN0cmFpblBhbj1udWxsLFoudG9vbHRpcHNWaXNpYmxlPW51bGwsWi5jb3B5cmlnaHRQYXRoPW51bGwsWi53YXRlcm1hcmtQYXRoPW51bGwsWi5zbGlkZXJWaXNpYmxlPW51bGwsWi5mdWxsUGFnZVZpc2libGU9bnVsbCxaLnByb2dyZXNzVmlzaWJsZT1udWxsLFoubG9nb1Zpc2libGU9bnVsbCxaLmxvZ29DdXN0b21QYXRoPW51bGwsWi5jYW52YXM9bnVsbCxaLmRlYnVnPW51bGwsWi5WaWV3ZXI9bnVsbCxaLlZpZXdlckRpc3BsYXk9bnVsbCxaLlZpZXdwb3J0PW51bGwsWi5Ub29sYmFyPW51bGwsWi5Ub29sYmFyRGlzcGxheT1udWxsLFouVG9vbHRpcERpc3BsYXk9bnVsbCxaLk5hdmlnYXRvcj1udWxsLFouTmF2aWdhdG9yRGlzcGxheT1udWxsLFouQ29weXJpZ2h0RGlzcGxheT1udWxsLFouaW1hZ2VXPW51bGwsWi5pbWFnZUg9bnVsbCxaLmltYWdlWD0wLFouaW1hZ2VZPTAsWi5pbWFnZVo9MCxaLmZpdFo9bnVsbCxaLnpvb21pbmc9InN0b3AiLFoucGFubmluZ1g9InN0b3AiLFoucGFubmluZ1k9InN0b3AiLFouZnVsbFBhZ2U9ITEsWi51c2VDYW52YXM9ITAsWi5UcmFjZURpc3BsYXk9bnVsbCxaLnRyYWNlcz1udWxsfSxlbmZvcmNlQ29weXJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy56MjM4KCJpbWFnZUNvcHlyaWdodCIpO2E/Wi5WaWV3ZXIuejE0OSgpOnRoaXMuejIxMCgpfSx6MjEwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFouejEwMTthLmxvYWRYTUwoWi5jb3B5cmlnaHRQYXRoKX0sejI1MjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy56MTg1KCJ6MTYiKSxlPXRoaXMuejE4NSgiejE0Iik7aWYoYSl7Wi5Db3B5cmlnaHREaXNwbGF5PXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiQ29weXJpZ2h0RGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixaLnZpZXdlclctMisicHgiLFoudmlld2VySC0yKyJweCIsIjBweCIsIjBweCIsInNvbGlkIiwiMXB4IixkLCIwcHgiLCIwcHgiKSxaLlZpZXdlckRpc3BsYXkuYXBwZW5kQ2hpbGQoWi5Db3B5cmlnaHREaXNwbGF5KTt2YXIgZj00NDAsZz0yMDAsaD1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS53aWR0aCkvMi1mLzIsaT1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS5oZWlnaHQpLzItZy8yLGo9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJ0ZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGYrInB4IixnKyJweCIsaCsicHgiLGkrInB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiKTtqLmlkPSJ0ZXh0Qm94IixaLkNvcHlyaWdodERpc3BsYXkuYXBwZW5kQ2hpbGQoaik7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7ai5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChrKSksdGhpcy56MjUxKGssImJsYWNrIiwidmVyZGFuYSIsIjE2cHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwianVzdGlmeSIsIm5vbmUiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKTtqLmFwcGVuZENoaWxkKGwpO3ZhciBtPTgwLG49MjAsbz0zMCxwPTIwLHE9aCtmLzItKG0qMitvKS8yLHI9aStnK3Ascz10aGlzLnoxODUoInoxMyIpLHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25BZ3JlZSIscyxudWxsLG51bGwsbnVsbCxudWxsLG0rInB4IixuKyJweCIscSsicHgiLHIrInB4IiwibW91c2Vkb3duIix0aGlzLnoxNjAsInoxMDMiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMHB4Iik7Wi5Db3B5cmlnaHREaXNwbGF5LmFwcGVuZENoaWxkKHQuZWxtdCkscSs9bStvLHM9dGhpcy56MTg1KCJ6MTUiKTt2YXIgdT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4aXQiLHMsbnVsbCxudWxsLG51bGwsbnVsbCxtKyJweCIsbisicHgiLHErInB4IixyKyJweCIsIm1vdXNlZG93biIsdGhpcy56MTYxLCJ6MTA0Iiwic29saWQiLCIxcHgiLGUsIjBweCIsIjBweCIpO1ouQ29weXJpZ2h0RGlzcGxheS5hcHBlbmRDaGlsZCh1LmVsbXQpfWVsc2V7dmFyIGo9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRCb3giKSx2PWouY2hpbGROb2Rlc1sxXS50ZXh0Q29udGVudDtqLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9djt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQWdyZWUiKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwibW91c2Vkb3duIix0aGlzLnoxNjApLFouQ29weXJpZ2h0RGlzcGxheS5yZW1vdmVDaGlsZCh0KTt2YXIgdT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhpdCIpO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLHRoaXMuejE2MSksWi5Db3B5cmlnaHREaXNwbGF5LnJlbW92ZUNoaWxkKHUpfX0sQnV0dG9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpe3ZhciB0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsYSwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGcsaCxpLGosbixvLHAscSxyLHMpO2lmKCFaLlV0aWxzLmlzU3RyVmFsKGIpKXt2YXIgdT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGMrIi8iK2QpLHY9Wi5VdGlscy5jcmVhdGVHcmFwaGljRWxlbWVudChjKyIvIitlKSx3PVouVXRpbHMuY3JlYXRlR3JhcGhpY0VsZW1lbnQoYysiLyIrZik7dS5pZD10LmlkKyItaW1nVXAiLHYuaWQ9dC5pZCsiLWltZ092ZXIiLHcuaWQ9dC5pZCsiLWltZ0Rvd24iLHQuX2ltZ1VwSUQ9dS5pZCx0Ll9pbWdPdmVySUQ9di5pZCx0Ll9pbWdEb3duSUQ9dy5pZDt2YXIgeD11LnN0eWxlLHk9di5zdHlsZSx6PXcuc3R5bGU7eC5wb3NpdGlvbj15LnBvc2l0aW9uPXoucG9zaXRpb249ImFic29sdXRlIix4LndpZHRoPXkud2lkdGg9eS53aWR0aD1nLHguaGVpZ2h0PXkuaGVpZ2h0PXkuaGVpZ2h0PWgseC50b3A9eS50b3A9ei50b3A9IjBweCIseC5sZWZ0PXkubGVmdD16LmxlZnQ9IjBweCIsWi5icm93c2VyPT1aLmJyb3dzZXJzLkZJUkVGT1gmJlouYnJvd3NlclZlcnNpb248MyYmKHgudG9wPXkudG9wPXoudG9wPSIiKSx5LnZpc2liaWxpdHk9ImhpZGRlbiIsei52aXNpYmlsaXR5PSJoaWRkZW4iLHQuYXBwZW5kQ2hpbGQodSksdC5hcHBlbmRDaGlsZCh2KSx0LmFwcGVuZENoaWxkKHcpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih1LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHYsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfWVsc2V7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7dC5hcHBlbmRDaGlsZChaLlV0aWxzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChBKSksWi5VdGlscy56MjUxKEEsImJsYWNrIiwidmVyZGFuYSIsIjEzcHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwiY2VudGVyIiwibm9uZSIpLFouVXRpbHMuZGlzYWJsZVRleHRJbnRlcmFjdGlvbihBKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodCwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfVoudG9vbHRpcHNWaXNpYmxlJiZaLlV0aWxzLmlzU3RyVmFsKG0pJiYodC50aXRsZT1aLlV0aWxzLnoxODUobSkpLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJ0b3VjaHN0YXJ0IixsKTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlb3ZlciIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZW91dCIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LGssbCkpLHRoaXMuZWxtdD10fSx6MTM4OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnN0eWxlO2Qud2lkdGg9YisicHgiLGQuaGVpZ2h0PWMrInB4Ijt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdVcElEKSxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ092ZXJJRCksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdEb3duSUQpO2lmKGUmJmYmJmcpe3ZhciBoPWUuc3R5bGUsaT1mLnN0eWxlLGo9Zy5zdHlsZTtoLndpZHRoPWIrInB4IixoLmhlaWdodD1jKyJweCIsaS53aWR0aD1iKyJweCIsaS5oZWlnaHQ9YysicHgiLGoud2lkdGg9YisicHgiLGouaGVpZ2h0PWMrInB4In19LEdyYXBoaWM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9Yz9iKyIvIitjOmIsaT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGgpLGo9aS5zdHlsZTtqLndpZHRoPWQsai5oZWlnaHQ9ZTt2YXIgYz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoInNwYW4iLGEsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixkLGUsZixnLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpO2MuYXBwZW5kQ2hpbGQoaSksdGhpcy5lbG10PWMsWi5tb2JpbGVEZXZpY2U/Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksInRvdWNoc3RhcnQiLFouVXRpbHMucHJldmVudERlZmF1bHQpOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJtb3VzZWRvd24iLFouVXRpbHMucHJldmVudERlZmF1bHQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9LHoyMDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuc3R5bGU7ZC53aWR0aD1iKyJweCIsZC5oZWlnaHQ9YysicHgiO3ZhciBlPWEuZmlyc3RDaGlsZCxmPWUuc3R5bGU7Zi53aWR0aD1iKyJweCIsZi5oZWlnaHQ9YysicHgifSx6MTYwOmZ1bmN0aW9uKGEpe1ouVmlld2VyRGlzcGxheS5yZW1vdmVDaGlsZChaLkNvcHlyaWdodERpc3BsYXkpLGRvY3VtZW50LmNvb2tpZT0iaW1hZ2VDb3B5cmlnaHQ9Y29uZmlybWVkIixaLlZpZXdlci56MTQ5KCl9LHoxNjE6ZnVuY3Rpb24oYSl7Wi5VdGlscy56MjUyKCExKTtyZXR1cm59LHoxMjg6ZnVuY3Rpb24oKXtTdHJpbmcucHJvdG90eXBlLm11bHRpcGx5fHwoU3RyaW5nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5qb2luLGI9e307cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiLmxlbmd0aD1jKzEsYS5jYWxsKGIsdGhpcyl9fSgpKSxBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGEsYil7Yj9iPDAmJihiPU1hdGgubWF4KDAsdGhpcy5sZW5ndGgrYikpOmI9MDtmb3IodmFyIGM9YixkPXRoaXMubGVuZ3RoO2M8ZDtjKyspaWYodGhpc1tjXT09PWEpcmV0dXJuIGM7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUucHVzaHx8KEFycmF5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXNbdGhpcy5sZW5ndGhdPWF9KSxBcnJheS5wcm90b3R5cGUuc3BsaWNlfHwoQXJyYXkucHJvdG90eXBlLnN1YmFycj1mdW5jdGlvbihhLGIpe2lmKGE+PXRoaXMubGVuZ3RofHxiJiZiPD0wKXJldHVybltdO2E8MCYmKE1hdGguYWJzKGEpPnRoaXMubGVuZ3RoP2E9MDphPXRoaXMubGVuZ3RoK2EpO2lmKCFifHxiK2E+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aC1hO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YStiO2QrKyljLnB1c2godGhpc1tkXSk7cmV0dXJuIGN9LEFycmF5LnByb3RvdHlwZS5zdWJhcnJheT1mdW5jdGlvbihhLGIpe2E8MCYmKGE9MCk7aWYoIWJ8fGI+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aDtpZihhPT1iKXJldHVybltdO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YjtkKyspYy5wdXNoKHRoaXNbZF0pO3JldHVybiBjfSxBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGEsYil7YjwwJiYoYj0wKTt2YXIgYz1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpZm9yKHZhciBkPTIsZT1hcmd1bWVudHMubGVuZ3RoO2Q8ZTtkKyspYy5wdXNoKGFyZ3VtZW50c1tkXSk7dmFyIGY9dGhpcy5zdWJhcnJheSgwLGEpLGc9dGhpcy5zdWJhcnIoYSxiKSxoPXRoaXMuc3ViYXJyYXkoYStiKSxpPWYuY29uY2F0KGMsaCk7dGhpcy5sZW5ndGg9MDtmb3IodmFyIGQ9MCxlPWkubGVuZ3RoO2Q8ZTtkKyspdGhpcy5wdXNoKGlbZF0pO3JldHVybiBnfSl9LHoxMjc6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyPyh0aGlzLmRpc2FibGVUZXh0SW50ZXJhY3Rpb249ZnVuY3Rpb24oYSl7YSYmKHRuUz1hLnBhcmVudE5vZGUuc3R5bGUsdG5TJiYoYS5wYXJlbnROb2RlLnVuc2VsZWN0YWJsZT0ib24iLHRuUy51c2VyU2VsZWN0PSJub25lIix0blMuTW96VXNlclNlbGVjdD0ibm9uZSIsdG5TLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLHRuUy53ZWJraXRUb3VjaENhbGxvdXQ9Im5vbmUiLHRuUy53ZWJraXRUYXBIaWdobGlnaHRDb2xvcj0idHJhbnNwYXJlbnQiKSl9LHRoaXMucmVuZGVyUXVhbGl0eT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWI9PSJoaWdoIj8ib3B0aW1pemVRdWFsaXR5Ijoib3B0aW1pemVTcGVlZCI7YS5zdHlsZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIixjLG51bGwpfX0sdGhpcy5zZXRPcGFjaXR5PWZ1bmN0aW9uKGEsYixjKXtaLmFscGhhU3VwcG9ydGVkP2Euc3R5bGUub3BhY2l0eT1iOmMmJihhLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jKX0pOmRvY3VtZW50LmF0dGFjaEV2ZW50JiYodGhpcy5kaXNhYmxlVGV4dEludGVyYWN0aW9uPWZ1bmN0aW9uKGEpe2EmJihhLnBhcmVudE5vZGUudW5zZWxlY3RhYmxlPSJvbiIsYS5wYXJlbnROb2RlLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSx0aGlzLnJlbmRlclF1YWxpdHk9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iPT0iaGlnaCI/ImJpY3ViaWMiOiJuZWFyZXN0LW5laWdoYm9yIjthLnN0eWxlLm1zSW50ZXJwb2xhdGlvbk1vZGU9Y319LHRoaXMuc2V0T3BhY2l0eT1mdW5jdGlvbihhLGIsYyl7Wi5hbHBoYVN1cHBvcnRlZD8oYS5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PScgKyB2YWx1ZSArICcpIixhLnN0eWxlLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0iK2IrIikiKTpjJiYoYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Yyl9KX0sejEyNjpmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI/KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7Yj09Im1vdXNld2hlZWwiJiZlbG10LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIixjLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0sdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtiPT0ibW91c2V3aGVlbCImJmVsbXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGMsITEpLGEmJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx0aGlzLmV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhfSx0aGlzLnRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LHRoaXMucmVsYXRlZFRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxhdGVkVGFyZ2V0fSx0aGlzLmlzUmlnaHRNb3VzZUJ1dHRvbj1mdW5jdGlvbihhKXt2YXIgYj0hMTtpZihhLndoaWNoPT0yfHxhLndoaWNoPT0zKWI9ITA7cmV0dXJuIGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQmJih0aGlzLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYykhPS0xKXJldHVybjt2YXIgZD1mdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5ldmVudDtGdW5jdGlvbi5wcm90b3R5cGUuY2FsbD9jLmNhbGwoYSxiKTooYS5fY3VycmVudExpc3RlbmVyPWMsYS5fY3VycmVudExpc3RlbmVyKGIpLGEuX2N1cnJlbnRMaXN0ZW5lcj1udWxsKX07YS5hdHRhY2hFdmVudCgib24iK2IsZCk7dmFyIGU9e3RhcmdldDphLGV2ZW50TmFtZTpiLGhhbmRsZXI6YyxoYW5kbGVyMjpkfSxmPWEuZG9jdW1lbnR8fGEsZz1mLnBhcmVudFdpbmRvdyxoPSJsIit0aGlzLl9saXN0ZW5lckNvdW50ZXIrKztnLl9hbGxMaXN0ZW5lcnN8fChnLl9hbGxMaXN0ZW5lcnM9e30pLGcuX2FsbExpc3RlbmVyc1toXT1lLGEuX2xpc3RlbmVyc3x8KGEuX2xpc3RlbmVycz1bXSksYS5fbGlzdGVuZXJzW2EuX2xpc3RlbmVycy5sZW5ndGhdPWgsZy5fdW5sb2FkTGlzdGVuZXJBZGRlZHx8KGcuX3VubG9hZExpc3RlbmVyQWRkZWQ9ITAsZy5hdHRhY2hFdmVudCgib251bmxvYWQiLHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycykpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEpe3ZhciBkPXRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYyk7aWYoZD09LTEpcmV0dXJuO3ZhciBlPWEuZG9jdW1lbnR8fGEsZj1lLnBhcmVudFdpbmRvdyxnPWEuX2xpc3RlbmVyc1tkXSxoPWYuX2FsbExpc3RlbmVyc1tnXTthLmRldGFjaEV2ZW50KCJvbiIrYixoLmhhbmRsZXIyKSxhLl9saXN0ZW5lcnMuc3BsaWNlKGQsMSksZGVsZXRlIGYuX2FsbExpc3RlbmVyc1tnXX19LHRoaXMuZXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5ldmVudH0sdGhpcy50YXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3JjRWxlbWVudH0sdGhpcy5yZWxhdGVkVGFyZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIGEudHlwZT09Im1vdXNlb3ZlciI/Yj1hLmZyb21FbGVtZW50OmEudHlwZT09Im1vdXNlb3V0IiYmKGI9YS50b0VsZW1lbnQpLGJ9LHRoaXMuaXNSaWdodE1vdXNlQnV0dG9uPWZ1bmN0aW9uKGEpe3ZhciBiPSExO3JldHVybiBhLmJ1dHRvbj09MiYmKGI9ITApLGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YSYmKGEucmV0dXJuVmFsdWU9ITEpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLmNhbmNlbEJ1YmJsZT0hMH0sdGhpcy5fZmluZExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLl9saXN0ZW5lcnM7aWYoIWQpcmV0dXJuLTE7dmFyIGU9YS5kb2N1bWVudHx8YSxmPWUucGFyZW50V2luZG93O2Zvcih2YXIgZz1kLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1kW2ddLGk9Zi5fYWxsTGlzdGVuZXJzW2hdO2lmKGkuZXZlbnROYW1lPT1iJiZpLmhhbmRsZXI9PWMpcmV0dXJuIGd9cmV0dXJuLTF9LHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Zm9yKGlkIGluIGEuX2FsbExpc3RlbmVycyl7dmFyIGI9YS5fYWxsTGlzdGVuZXJzW2lkXTtiLnRhcmdldC5kZXRhY2hFdmVudCgib24iK2IuZXZlbnROYW1lLGIuaGFuZGxlcjIpLGRlbGV0ZSBhLl9hbGxMaXN0ZW5lcnNbaWRdfX0sdGhpcy5fbGlzdGVuZXJDb3VudGVyPTApfSx6MTY0OmZ1bmN0aW9uKCl7Wi5icm93c2Vycz17VU5LTk9XTjowLElFOjEsRklSRUZPWDoyLFNBRkFSSTozLENIUk9NRTo0LE9QRVJBOjV9O3ZhciBhPVouYnJvd3NlcnMuVU5LTk9XTixiPTAsYz1uYXZpZ2F0b3IuYXBwTmFtZSxkPW5hdmlnYXRvci5hcHBWZXJzaW9uLGU9ITEsZj0hMSxnPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtpZihjIT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8IXdpbmRvdy5hdHRhY2hFdmVudHx8IXdpbmRvdy5BY3RpdmVYT2JqZWN0KWlmKGMhPSJOZXRzY2FwZSJ8fCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciljPT0iT3BlcmEiJiYhIXdpbmRvdy5vcGVyYSYmISF3aW5kb3cuYXR0YWNoRXZlbnQmJihhPVouYnJvd3NlcnMuT1BFUkEsYj1wYXJzZUZsb2F0KGQpKTtlbHNle3ZhciBpPWcuaW5kZXhPZigiZmlyZWZveCIpLGo9Zy5pbmRleE9mKCJzYWZhcmkiKSxrPWcuaW5kZXhPZigiY2hyb21lIik7aWYoaT49MClhPVouYnJvd3NlcnMuRklSRUZPWCxiPXBhcnNlRmxvYXQoZy5zdWJzdHJpbmcoaSs4KSk7ZWxzZSBpZihqPj0wKXt2YXIgbD1nLnN1YnN0cmluZygwLGopLmxhc3RJbmRleE9mKCIvIik7YT1rPj0wP1ouYnJvd3NlcnMuQ0hST01FOlouYnJvd3NlcnMuU0FGQVJJLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhsKzEsaikpfXZhciBtPW5ldyBJbWFnZTttLnN0eWxlLmdldFByb3BlcnR5VmFsdWUmJihmPW0uc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiaW1hZ2UtcmVuZGVyaW5nIikpfWVsc2V7dmFyIGg9Zy5pbmRleE9mKCJtc2llIik7YT1aLmJyb3dzZXJzLklFLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhoKzUsZy5pbmRleE9mKCI7IixoKSkpLGU9dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSE9InVuZGVmaW5lZCJ9dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxvPW4uc3R5bGV8fHt9LHA9ITEscT1bInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSJdLHIsczt3aGlsZShyPXEuc2hpZnQoKSlpZih0eXBlb2Ygb1tyXSE9InVuZGVmaW5lZCIpe3A9ITAscz0vd2Via2l0L2kudGVzdChyKTticmVha312YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0JiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLHU9IShhPT1aLmJyb3dzZXJzLlNBRkFSSSYmYjw0fHxhPT1aLmJyb3dzZXJzLkNIUk9NRSYmYjwyKSx2PXQmJnUsdz0hKGE9PVouYnJvd3NlcnMuSUV8fGE9PVouYnJvd3NlcnMuQ0hST01FJiZiPDIpLHg9ZXx8Zj8iaGlnaCI6bnVsbCx5PWcuaW5kZXhPZigiYW5kcm9pZCIpPi0xfHxnLmluZGV4T2YoImlwaG9uZSIpPi0xfHxnLmluZGV4T2YoImlwYWQiKT4tMXx8Zy5pbmRleE9mKCJpcG9kIik+LTE7Wi5icm93c2VyPWEsWi5icm93c2VyVmVyc2lvbj1iLFouY2FudmFzU3VwcG9ydGVkPXYsWi51c2VDYW52YXM9Wi5jYW52YXNTdXBwb3J0ZWQsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkPXAsWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eT1yLFouY3NzVHJhbnNmb3JtTm9Vbml0cz1zLFouYWxwaGFTdXBwb3J0ZWQ9dyxaLnJlbmRlclF1YWxpdHk9eCxaLm1vYmlsZURldmljZT15fSxpc1N0clZhbDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYSE9IiJ9LHoxNzQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTAsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKTt3aGlsZShlKXtiKz1hLm9mZnNldExlZnQsYys9YS5vZmZzZXRUb3A7aWYoZCl7dmFyIGY9dGhpcy56MTg0KCk7Yis9Zi54LGMrPWYueX1hPWUsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKX1yZXR1cm4gbmV3IHRoaXMuUG9pbnQoYixjKX0sejE4MzpmdW5jdGlvbihhLGIpe3JldHVybiBiJiZhIT1kb2N1bWVudC5ib2R5P2RvY3VtZW50LmJvZHk6YS5vZmZzZXRQYXJlbnR9LHoxNzU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLlBvaW50KGEuY2xpZW50V2lkdGgsYS5jbGllbnRIZWlnaHQpfSx6MTc2OmZ1bmN0aW9uKGEpe2lmKGEuY3VycmVudFN0eWxlKXJldHVybiBhLmN1cnJlbnRTdHlsZTtpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIik7dGhpcy56MjU1KHRoaXMuejE4NSgiejkzIikpfSx6MTc3OmZ1bmN0aW9uKGEpe3JldHVybiB6MTc0KFouVXRpbHMudGFyZ2V0KGEpKX0sejE3ODpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9YS50b3VjaGVzLGQ9YS5jaGFuZ2VkVG91Y2hlcztyZXR1cm4gYyE9PXVuZGVmaW5lZD9iPWNbMF06ZCE9PXVuZGVmaW5lZCYmKGI9ZFswXSksYn0sejE4MTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtyZXR1cm4gYS50eXBlPT0iRE9NTW91c2VTY3JvbGwiJiZicm93c2VyPT1Ccm93c2VyLkZJUkVGT1gmJmJyb3dzZXJWZXJzaW9uPDM/KGI9YS5zY3JlZW5YLGM9YS5zY3JlZW5ZKTp0eXBlb2YgYS5wYWdlWD09Im51bWJlciI/KGI9YS5wYWdlWCxjPWEucGFnZVkpOnR5cGVvZiBhLmNsaWVudFg9PSJudW1iZXIiPyhiPWEuY2xpZW50WCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsYz1hLmNsaWVudFkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk6dGhpcy56MjU1KHRoaXMuejE4NSgiejk0IikpLG5ldyB0aGlzLlBvaW50KGIsYyl9LHoxODI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gdHlwZW9mIGEud2hlZWxEZWx0YT09Im51bWJlciI/Yj1hLndoZWVsRGVsdGE6dHlwZW9mIGEuZGV0YWlsPT0ibnVtYmVyIj9iPWEuZGV0YWlsKi0xOnRoaXMuejI1NSh0aGlzLnoxODUoIno5NSIpKSxiP2IvTWF0aC5hYnMoYik6MH0sejE4NDpmdW5jdGlvbigpe3ZhciBhPTAsYj0wLGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxkPWRvY3VtZW50LmJvZHl8fHt9O2lmKHR5cGVvZiB3aW5kb3cucGFnZVhPZmZzZXQ9PSJudW1iZXIiKWE9d2luZG93LnBhZ2VYT2Zmc2V0LGI9d2luZG93LnBhZ2VZT2Zmc2V0O2Vsc2UgaWYoZC5zY3JvbGxMZWZ0fHxkLnNjcm9sbFRvcClhPWQuc2Nyb2xsTGVmdCxiPWQuc2Nyb2xsVG9wO2Vsc2UgaWYoYy5zY3JvbGxMZWZ0fHxjLnNjcm9sbFRvcClhPWMuc2Nyb2xsTGVmdCxiPWMuc2Nyb2xsVG9wO3JldHVybiBuZXcgdGhpcy5Qb2ludChhLGIpfSx6MjAxaW5kb3dTaXplOmZ1bmN0aW9uKCl7dmFyIGE9MCxiPTAsYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHt9LGQ9ZG9jdW1lbnQuYm9keXx8e307cmV0dXJuIHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aD09Im51bWJlciI/KGE9d2luZG93LmlubmVyV2lkdGgsYj13aW5kb3cuaW5uZXJIZWlnaHQpOmMuY2xpZW50V2lkdGh8fGMuY2xpZW50SGVpZ2h0PyhhPWMuY2xpZW50V2lkdGgsYj1jLmNsaWVudEhlaWdodCk6ZC5jbGllbnRXaWR0aHx8ZC5jbGllbnRIZWlnaHQ/KGE9ZC5jbGllbnRXaWR0aCxiPWQuY2xpZW50SGVpZ2h0KTp0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTYiKSksbmV3IHRoaXMuUG9pbnQoYSxiKX0sejIyNTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPWE7d2hpbGUoYj09ITEpaWYoYyljLmlkP2MuaWQ9PSJWaWV3ZXJEaXNwbGF5Ij9iPSEwOmM9Yy5wYXJlbnROb2RlOmM9Yy5wYXJlbnROb2RlO2Vsc2UgYnJlYWs7cmV0dXJuIGJ9LHoyMzg6ZnVuY3Rpb24oYSl7dmFyIGI9YSsiPSIsYz1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt3aGlsZShlLmNoYXJBdCgwKT09IiAiKWU9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aCk7aWYoZS5pbmRleE9mKGIpPT0wKXJldHVybiBlLnN1YnN0cmluZyhiLmxlbmd0aCxlLmxlbmd0aCl9cmV0dXJuIG51bGx9LHoyNDM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zbGljZSgtMSxhLmxlbmd0aCk9PSIvIj9hLnNsaWNlKDAsYS5sZW5ndGgtMSk6YTtyZXR1cm4gYj1hLnNsaWNlKDAsMSk9PSIvIj9hLnNsaWNlKDEsYS5sZW5ndGgpOmEsYn0sejE0MDpmdW5jdGlvbihhKXtpZihaLmJyb3dzZXI9PVouYnJvd3NlcnMuSUUpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCksYz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCksZD1jK2I7YSs9Ij9zdWZmaXhUb0Jsb2NrUGF0aENhY2hpbmc9IitkfXJldHVybiBhfSx6MTcwOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYSphKmEqYStiOmMvMiooKGEtPTIpKmEqYSphKmErMikrYn0sejIzMzpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYSYmKGI9YS5zcGxpdCgiJiIpKSxifSx6MjQ5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuejE4NSgiejUwIiksYz10aGlzLnoxODUoIno0OSIpLGQ9dGhpcy56MTg1KCJ6NDgiKTtaLnNraW5QYXRoPXRoaXMuejE4NSgiejU2IiksWi5za2luTW9kZT10aGlzLnoxODUoIno1NCIpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjYiKSkpfHwoWi5pbml0aWFsWD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejI2IikpKSxpc05hTihwYXJzZUZsb2F0KHRoaXMuejE4NSgiejI3IikpKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdCh0aGlzLnoxODUoInoyNyIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoInoyOCIpKSl8fChaLmluaXRpYWxaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjgiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpfHwoWi5taW5aPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpfHwoWi5tYXhaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6ODAiKSkpfHwoWi56b29tU3BlZWQ9cGFyc2VGbG9hdCh0aGlzLnoxODUoIno4MCIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoIno0NiIpKSl8fChaLnBhblNwZWVkPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NDYiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MTgiKSkpfHwoWi5mYWRlSW5TcGVlZD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejE4IikpKSxaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KHRoaXMuejE4NSgiejY0IiksMTApLFoudG9vbGJhclBvc2l0aW9uPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NjMiKSksWi50b29sdGlwc1Zpc2libGU9dGhpcy56MTg1KCJ6NjUiKSE9IjAiLFoubmF2aWdhdG9yVmlzaWJsZT1wYXJzZUludCh0aGlzLnoxODUoIno0MyIpLDEwKSxaLm5hdmlnYXRvclc9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDQiKSwxMCksWi5uYXZpZ2F0b3JIPXBhcnNlSW50KHRoaXMuejE4NSgiejM5IiksMTApLFoubmF2aWdhdG9yTD1wYXJzZUludCh0aGlzLnoxODUoIno0MCIpLDEwKSxaLm5hdmlnYXRvclQ9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDIiKSwxMCksWi5uYXZpZ2F0b3JGaXQ9dGhpcy56MTg1KCJ6MzgiKSxaLmNsaWNrWm9vbT10aGlzLnoxODUoInoxMCIpIT0iMCIsWi5jbGlja1Bhbj10aGlzLnoxODUoIno5IikhPSIwIixaLm1vdXNlUGFuPXRoaXMuejE4NSgiejM0IikhPSIwIixaLmtleXM9dGhpcy56MTg1KCJ6MjkiKSE9IjAiLFouY29uc3RyYWluUGFuPXRoaXMuejE4NSgiejEyIikhPSIwIixaLnNsaWRlclZpc2libGU9dGhpcy56MTg1KCJ6NTgiKSE9IjAiLFouZnVsbFBhZ2VWaXNpYmxlPXRoaXMuejE4NSgiejIzIikhPSIwIixaLnByb2dyZXNzVmlzaWJsZT10aGlzLnoxODUoIno1MyIpIT0iMCIsWi5sb2dvVmlzaWJsZT10aGlzLnoxODUoInozMSIpIT0iMCIsWi5sb2dvQ3VzdG9tUGF0aD10aGlzLnoxODUoInozMCIpLFouY2FudmFzPXRoaXMuejE4NSgiejgiKSE9IjAiLFouZGVidWc9dGhpcy56MTg1KCJ6MTciKSE9IjAiO2lmKHRoaXMuaXNTdHJWYWwoYSkpZm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZz1hW2VdLGg9Zy5pbmRleE9mKCI9Iik7aWYoaD4wKXt2YXIgaT1nLnN1YnN0cmluZygwLGgpLGo9Zy5zdWJzdHJpbmcoaCsxKTtpZih0aGlzLmlzU3RyVmFsKGopKXN3aXRjaChpKXtjYXNlInpJbml0aWFsWCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLmluaXRpYWxYPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2UiekluaXRpYWxZIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6SW5pdGlhbFpvb20iOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5pbml0aWFsWj1wYXJzZUZsb2F0KGopLFouaW5pdGlhbFomJihaLmluaXRpYWxaLz0xMDApKTticmVhaztjYXNlInpNaW5ab29tIjohaXNOYU4ocGFyc2VGbG9hdChqKSkmJnBhcnNlRmxvYXQoaik+LjAxJiYoWi5taW5aPXBhcnNlRmxvYXQoaiksWi5taW5aJiYoWi5taW5aLz0xMDApKTticmVhaztjYXNlInpNYXhab29tIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubWF4Wj1wYXJzZUZsb2F0KGopLFoubWF4WiYmKFoubWF4Wi89MTAwKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9yVmlzaWJsZSI6Wi5uYXZpZ2F0b3JWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UielRvb2xiYXJWaXNpYmxlIjpaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UiekxvZ29WaXNpYmxlIjpqPT0iMCImJihaLmxvZ29WaXNpYmxlPSExKTticmVhaztjYXNlInpTbGlkZXJWaXNpYmxlIjpqPT0iMCImJihaLnNsaWRlclZpc2libGU9ITEpO2JyZWFrO2Nhc2UiekZ1bGxQYWdlVmlzaWJsZSI6aj09IjAiJiYoWi5mdWxsUGFnZVZpc2libGU9ITEpO2JyZWFrO2Nhc2UielByb2dyZXNzVmlzaWJsZSI6aj09IjAiJiYoWi5wcm9ncmVzc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielRvb2x0aXBzVmlzaWJsZSI6aj09IjAiJiYoWi50b29sdGlwc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielNraW5QYXRoIjpaLnNraW5QYXRoPWo7YnJlYWs7ZGVmYXVsdDppZihiPT1jKWFsZXJ0KGQrIiAiK2kpO2Vsc2Ugc3dpdGNoKGkpe2Nhc2Uielpvb21TcGVlZCI6Wi56b29tU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6UGFuU3BlZWQiOloucGFuU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6RmFkZUluU3BlZWQiOlouZmFkZUluU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6VG9vbGJhclBvc2l0aW9uIjpaLnRvb2xiYXJQb3NpdGlvbj1wYXJzZUludChqLDEwKTticmVhaztjYXNlInpOYXZpZ2F0b3JXaWR0aCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvclc9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9ySGVpZ2h0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9ySD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JMZWZ0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9yTD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JUb3AiOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5uYXZpZ2F0b3JUPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2Uiek5hdmlnYXRvckZpdCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvckZpdD1wYXJzZUludChqLDEwKSk7YnJlYWs7Y2FzZSJ6Q2xpY2tab29tIjpqPT0iMCImJihaLmNsaWNrWm9vbT0hMSk7YnJlYWs7Y2FzZSJ6Q2xpY2tQYW4iOmo9PSIwIiYmKFouY2xpY2tQYW49ITEpO2JyZWFrO2Nhc2Uiek1vdXNlUGFuIjpqPT0iMCImJihaLm1vdXNlUGFuPSExKTticmVhaztjYXNlInpLZXlzIjpqPT0iMCImJihaLmtleXM9ITEpO2JyZWFrO2Nhc2UiekNvbnN0cmFpblBhbiI6aj09IjAiJiYoWi5jb25zdHJhaW5QYW49ITEpO2JyZWFrO2Nhc2UiekNvcHlyaWdodFBhdGgiOlouY29weXJpZ2h0UGF0aD1qO2JyZWFrO2Nhc2UieldhdGVybWFya1BhdGgiOloud2F0ZXJtYXJrUGF0aD1qO2JyZWFrO2Nhc2UiekxvZ29DdXN0b21QYXRoIjpaLmxvZ29DdXN0b21QYXRoPWo7YnJlYWs7Y2FzZSJ6Q2FudmFzIjpqPT0iMCImJihaLmNhbnZhcz0hMSk7aWYoIVouY2FudmFzU3VwcG9ydGVkfHwhWi5jYW52YXMpWi51c2VDYW52YXM9ITE7YnJlYWs7Y2FzZSJ6RGVidWciOmo9PSIxIiYmKFouZGVidWc9ITApfX19fX0sejI0MjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MTtiPGEubGVuZ3RoOylhW2ItMV09PWFbYl0/YS5zcGxpY2UoYiwxKTpiKys7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdLGY9ITE7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aCYmZT49KGVsbXQyPWJbZ10pO2crKylpZihlbG10Mj09ZSl7Zj0hMDticmVha31mJiZjLnB1c2goYVtkXSl9cmV0dXJuIGN9LHN1YnRyYWN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT0hMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoJiZkPj0oZWxtdDI9YltmXSk7ZisrKWlmKGVsbXQyPT1kKXtlPSEwO2JyZWFrfWUmJmEuc3BsaWNlKGMtLSwxKX1yZXR1cm4gYX0sY3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MixlPWFyZ3VtZW50cy5sZW5ndGg7ZDxlO2QrKyljLnB1c2goYXJndW1lbnRzW2RdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmNvbmNhdChbXSk7Zm9yKHZhciBlPTAsZj1hcmd1bWVudHMubGVuZ3RoO2U8ZjtlKyspZC5wdXNoKGFyZ3VtZW50c1tlXSk7cmV0dXJuIGIuYXBwbHkoYSxkKX19LHoyNTU6ZnVuY3Rpb24oYSl7YWxlcnQoYSl9LGNyZWF0ZUNvbnRhaW5lckVsZW1lbnQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8pe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSk7dGhpcy5pc1N0clZhbChiKSYmKHAuaWQ9Yik7dmFyIHE9cC5zdHlsZTtyZXR1cm4gcS5kaXNwbGF5PXRoaXMuaXNTdHJWYWwoYyk/YzoiaW5saW5lLWJsb2NrIixxLnBvc2l0aW9uPXRoaXMuaXNTdHJWYWwoZCk/ZDoic3RhdGljIixxLm92ZXJmbG93PXRoaXMuaXNTdHJWYWwoZSk/ZToiaGlkZGVuIixhPT0iY2FudmFzIj8odGhpcy5pc1N0clZhbChmKSYmcC5zZXRBdHRyaWJ1dGUoIndpZHRoIixmKSx0aGlzLmlzU3RyVmFsKGcpJiZwLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixnKSk6KHRoaXMuaXNTdHJWYWwoZikmJihxLndpZHRoPWYpLHRoaXMuaXNTdHJWYWwoZyYmZykmJihxLmhlaWdodD1nKSksdGhpcy5pc1N0clZhbChoKSYmKHEubGVmdD1oKSx0aGlzLmlzU3RyVmFsKGkpJiYocS50b3A9aSkscS5ib3JkZXJTdHlsZT10aGlzLmlzU3RyVmFsKGopP2o6Im5vbmUiLHEuYm9yZGVyV2lkdGg9dGhpcy5pc1N0clZhbChrKT9rOiIwcHgiLHEuYmFja2dyb3VuZD10aGlzLmlzU3RyVmFsKGwpP2w6InRyYW5zcGFyZW50IG5vbmUiLHEubWFyZ2luPXRoaXMuaXNTdHJWYWwobSk/bToiMHB4IixxLnBhZGRpbmc9dGhpcy5pc1N0clZhbChuKT9uOiIwcHgiLHRoaXMuaXNTdHJWYWwobykmJihxLmN1cnNvcj1vKSxwfSxjcmVhdGVDZW50ZXJlZEVsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiKSxjPVtdO2MucHVzaCgnPGRpdiBzdHlsZT0iZGlzcGxheTp0YWJsZTsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7JyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCcjcG9zaXRpb246cmVsYXRpdmU7IG92ZXJmbG93OmhpZGRlbjsgdGV4dC1hbGlnbjpsZWZ0OyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246YWJzb2x1dGU7ICN0b3A6NTAlOyB3aWR0aDoxMDAlOyAnKSxjLnB1c2goImJvcmRlcjpub25lOyBtYXJnaW46MHB4OyBwYWRkaW5nOjBweDsiKSxjLnB1c2goJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246cmVsYXRpdmU7ICN0b3A6LTUwJTsgd2lkdGg6MTAwJTsgJyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCd0ZXh0LWFsaWduOmNlbnRlcjsiPjwvZGl2PjwvZGl2PjwvZGl2PicpLGIuaW5uZXJIVE1MPWMuam9pbigiIiksYj1iLmZpcnN0Q2hpbGQ7dmFyIGQ9YixlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO3doaWxlKGUubGVuZ3RoPjApZD1lWzBdLGU9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoYSksYn0sY3JlYXRlR3JhcGhpY0VsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJpbWciKSxjPW51bGw7cmV0dXJuIFouYnJvd3Nlcj09Wi5icm93c2Vycy5JRSYmWi5icm93c2VyVmVyc2lvbjw3PyhjPXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsbnVsbCwiaW5saW5lLWJsb2NrIiksYi5vbmxvYWQ9ZnVuY3Rpb24oKXtjLnN0eWxlLndpZHRoPWMuc3R5bGUud2lkdGh8fGIud2lkdGgrInB4IixjLnN0eWxlLmhlaWdodD1jLnN0eWxlLmhlaWdodHx8Yi5oZWlnaHQrInB4IixiLm9ubG9hZD1udWxsLGI9bnVsbH0sYy5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIithKyInLCBzaXppbmdNZXRob2Q9J3NjYWxlJykiKTooYz1iLGMuc3JjPWEpLGN9LHoyNTE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtPWEucGFyZW50Tm9kZS5zdHlsZTttLmNvbG9yPWIsbS5mb250RmFtaWx5PWMsbS5mb250U2l6ZT1kLG0uZm9udFNpemVBZGp1c3Q9ZSxtLmZvbnRTdHlsZT1mLG0uZm9udFN0cmV0Y2g9ZyxtLmZvbnRWYXJpYW50PWgsbS5mb250V2VpZ2h0PWksbS5saW5lSGVpZ2h0PWosbS50ZXh0QWxpZ249ayxtLnRleHREZWNvcmF0aW9uPWx9LHoxNTg6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl0cnl7Yj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGIuYXN5bmM9ITEsYi5sb2FkWE1MKGEpfWNhdGNoKGMpe3RoaXMuejI1NShjLm5hbWUrdGhpcy56MTg1KCJ6ODIiKStjLm1lc3NhZ2UpfWVsc2UgaWYod2luZG93LkRPTVBhcnNlcil0cnl7dmFyIGQ9bmV3IERPTVBhcnNlcjtiPWQucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goYyl7dGhpcy56MjU1KGMubmFtZSt0aGlzLnoxODUoIno4MiIpK2MubWVzc2FnZSl9ZWxzZSB0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTgiKSk7cmV0dXJuIGJ9LFBvaW50OmZ1bmN0aW9uKGEsYil7dGhpcy54PXR5cGVvZiBhPT0ibnVtYmVyIj9hOjAsdGhpcy55PXR5cGVvZiBiPT0ibnVtYmVyIj9iOjB9LFBvaW50M0Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMueD10eXBlb2YgYT09Im51bWJlciI/YTowLHRoaXMueT10eXBlb2YgYj09Im51bWJlciI/YjowLHRoaXMuej10eXBlb2YgYz09Im51bWJlciI/YzowfSx6MTg1OmZ1bmN0aW9uKGEpe3ZhciBiPSIiO3N3aXRjaChhKXtjYXNlIno1MCI6Yj0iRW5hYmxlIERldmVsb3BlciBwYXJhbWV0ZXJzIjticmVhaztjYXNlIno0OSI6Yj0iQ2hhbmdpbmcgVGhpcyBWaW9sYXRlcyBMaWNlbnNlIEFncmVlbWVudCI7YnJlYWs7Y2FzZSJ6NDgiOmI9IlN1cHBvcnQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIGVuYWJsZWQgb25seSBpbiB0aGUgWm9vbWlmeSBJbWFnZSBWaWV3ZXIgaW5jbHVkZWQgaW4gdGhlIFpvb21pZnkgSFRNTDUgRGV2ZWxvcGVyIGVkaXRpb246ICI7YnJlYWs7Y2FzZSJ6MjUiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NjAiOmI9IjMwMDAwIjticmVhaztjYXNlIno2MSI6Yj0iMjU2IjticmVhaztjYXNlIno1OSI6Yj0iMS4xNSI7YnJlYWs7Y2FzZSJ6NjIiOmI9IjMwMCI7YnJlYWs7Y2FzZSJ6NyI6Yj0iNiI7YnJlYWs7Y2FzZSJ6NiI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NSI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NCI6Yj0iMiI7YnJlYWs7Y2FzZSJ6MyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6NDUiOmI9IjIiO2JyZWFrO2Nhc2UiejQ2IjpiPSI1IjticmVhaztjYXNlIno0NyI6Yj0iMTAiO2JyZWFrO2Nhc2UiejgwIjpiPSI1IjticmVhaztjYXNlIno4MSI6Yj0iMC4wMiI7YnJlYWs7Y2FzZSJ6NzciOmI9IjMwIjticmVhaztjYXNlIno3OCI6Yj0iMjAwIjticmVhaztjYXNlIno3OSI6Yj0iMTAiO2JyZWFrO2Nhc2UiejEwVElFUlNLSVBUSFJFU0hPTEQiOmI9IjAxLiI7YnJlYWs7Y2FzZSJ6MjQiOmI9IjEwIjticmVhaztjYXNlInoxOCI6Yj0iNSI7YnJlYWs7Y2FzZSJ6MTkiOmI9IjAuMDY3IjticmVhaztjYXNlIno2NCI6Yj0iNCI7YnJlYWs7Y2FzZSJ6NjMiOmI9IjEiO2JyZWFrO2Nhc2UiejY1IjpiPSIxIjticmVhaztjYXNlIno0MyI6Yj0iMiI7YnJlYWs7Y2FzZSJ6NDQiOmI9IjE1MCI7YnJlYWs7Y2FzZSJ6MzkiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NDAiOmI9IjAiO2JyZWFrO2Nhc2UiejQyIjpiPSIwIjticmVhaztjYXNlInozOCI6Yj1udWxsO2JyZWFrO2Nhc2UiejM2IjpiPSIjZmZmZmZmIjticmVhaztjYXNlInozNk5PQUxQSEEiOmI9IiNmYmZhZmEiO2JyZWFrO2Nhc2UiejM1IjpiPSIwLjc1IjticmVhaztjYXNlIno0MSI6Yj0iYmx1ZSI7YnJlYWs7Y2FzZSJ6NTUiOmI9InNraW5GaWxlcy54bWwiO2JyZWFrO2Nhc2UiejU2IjpiPSJBc3NldHMvU2tpbnMvRGVmYXVsdCI7YnJlYWs7Y2FzZSJ6NTQiOmI9IjAiO2JyZWFrO2Nhc2UiejEyIjpiPSIxIjticmVhaztjYXNlIno1OCI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NTciOmI9IjEwIjticmVhaztjYXNlInoyMyI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MjIiOmI9IndoaXRlIjticmVhaztjYXNlInoyMSI6Yj0iWCI7YnJlYWs7Y2FzZSJ6MjAiOmI9Ilx0I0Y4RjhGOCI7YnJlYWs7Y2FzZSJ6NTMiOmI9IjEiO2JyZWFrO2Nhc2UiejUxIjpiPSI1MDAiO2JyZWFrO2Nhc2UiejUyIjpiPSIgIjticmVhaztjYXNlInozMSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MzAiOmI9bnVsbDticmVhaztjYXNlIno4IjpiPSIxIjticmVhaztjYXNlInoxNyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6MTYiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6MTQiOmI9IndoaXRlIjticmVhaztjYXNlInoxMyI6Yj0iQWdyZWUiO2JyZWFrO2Nhc2UiejE1IjpiPSJFeGl0IjticmVhaztjYXNlIno3MyI6Yj0iMC42IjticmVhaztjYXNlIno3NCI6Yj0iMC4zMyI7YnJlYWs7Y2FzZSJ6NzYiOmI9IjUxMiI7YnJlYWs7Y2FzZSJ6NzUiOmI9IjM4NCI7YnJlYWs7Y2FzZSJ6MjYiOmI9bnVsbDticmVhaztjYXNlInoyNyI6Yj1udWxsO2JyZWFrO2Nhc2UiejI4IjpiPW51bGw7YnJlYWs7Y2FzZSJ6MzMiOmI9bnVsbDticmVhaztjYXNlInozMiI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MTAiOmI9IjEiO2JyZWFrO2Nhc2UiejkiOmI9IjEiO2JyZWFrO2Nhc2UiejM0IjpiPSIxIjticmVhaztjYXNlInoyOSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NjciOmI9IlRoaXMgcGFuZWwgaXMgZW5hYmxlZCB1c2luZyB0aGUgSFRNTCBwYXJhbWV0ZXIgJ3pEZWJ1Zz0xJy4gSXQgY2FuIGJlIGNhbGxlZCBhcyBmb2xsb3dzOlxuXG4gICBaLlV0aWxzLnRyYWNlKCd2YWx1ZSB0byBkaXNwbGF5Jyk7ICBcblxuVGhlIGJ1dHRvbnMgYmVsb3cgZGlzcGxheSBvciBtb2RpZnkgaW1wb3J0YW50IHN0YXRlIHZhbHVlcy4gIFdlYiBkZXNpZ25lcnMgbmV3IHRvIEphdmFTY3JpcHQgd2lsbCBhbHNvIGJlbmVmaXQgZnJvbSB0aGUgY29uc29sZSwgdHJhY2UsIHByb2ZpbGluZywgYW5kIG90aGVyIGRlYnVnZ2luZyBmZWF0dXJlcyBvZiBsZWFkaW5nIGJyb3dzZXJzLiI7YnJlYWs7Y2FzZSJ6NjgiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6NjYiOmI9IndoaXRlIjticmVhaztjYXNlIno2OSI6Yj0iU2hvdyBHbG9iYWxzIjticmVhaztjYXNlIno3MiI6Yj0iVG9nZ2xlIERpc3BsYXkiO2JyZWFrO2Nhc2UiejcwIjpiPSJUb2dnbGUgQmFja2ZpbGwiO2JyZWFrO2Nhc2UiejcxIjpiPSJUb2dnbGUgQ29uc3RyYWluIFBhbiI7YnJlYWs7Y2FzZSJ6OTkiOmI9IkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdC4iO2JyZWFrO2Nhc2Uiejg3LUlNQUdFWE1MIjpiPSJFcnJvciBsb2FkaW5nIGltYWdlOiBwbGVhc2UgbWFrZSBzdXJlIGltYWdlIHBhdGggaW4gd2ViIHBhZ2UgbWF0Y2hlcyBpbWFnZSBmb2xkZXIgbG9jYXRpb24gb24gd2Vic2VydmVyLiI7YnJlYWs7Y2FzZSJ6ODctVE9PTEJBUlhNTCI6Yj0iRXJyb3IgbG9hZGluZyB0b29sYmFyOiBwbGVhc2UgdmVyaWZ5IHNraW4gZmlsZXMgYXJlIG9uIHdlYnNlcnZlciBpbiBzYW1lIGZvbGRlciBhcyB6MTIyLmpzIGZpbGUgYW5kIGFyZSBpbiBkZWZhdWx0IGZvbGRlciBzdHJ1Y3R1cmUgJ0Fzc2V0cy9Ta2lucy9EZWZhdWx0Jywgb3IgYWRkIHpTa2luUGF0aCBwYXJhbWV0ZXIgdG8gd2VicGFnZS4iO2JyZWFrO2Nhc2Uiejg3IjpiPSJFcnJvciBtYWtpbmcgbmV0d29yayByZXF1ZXN0OiBwb3NzaWJsZSBpbnZhbGlkIHBhdGggb3IgbmV0d29yayBlcnJvci4iO2JyZWFrO2Nhc2Uiejg0IjpiPSJJbWFnZSBmYWlsZWQgdG8gbG9hZDogcG9zc2libGUgaW52YWxpZCBwYXRoLCBtaXNzaW5nIGltYWdlLCBvciBuZXR3b3JrIGVycm9yLiI7YnJlYWs7Y2FzZSJ6ODkiOmI9IkVycm9yIHJlbGF0ZWQgdG8gbmV0d29yayBzZWN1cml0eTogIjticmVhaztjYXNlIno5MCI6Yj0iRXJyb3IgcmVsYXRlZCB0byBuZXR3b3JrIHN0YXR1czogIjticmVhaztjYXNlIno4MiI6Yj0iIGNvbnZlcnRpbmcgWE1MIHRleHQgdG8gWE1MIGRvYyAoRE9NUGFyc2VyKTogIjticmVhaztjYXNlIno5OCI6Yj0iQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhNTCBET00uIjticmVhaztjYXNlInoxMDAiOmI9IlhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODYiOmI9IkltYWdlIFhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODMiOmI9IiB3aGlsZSBleGVjdXRpbmcgY2FsbGJhY2s6ICI7YnJlYWs7Y2FzZSJ6ODUiOmI9IkltYWdlIHRpbWVkIG91dDogIjticmVhaztjYXNlIno4OCI6Yj0iTmF2aWdhdG9yIGltYWdlIGZhaWxlZCB0byBsb2FkOiBwb3NzaWJsZSBpbnZhbGlkIHBhdGgsIG1pc3NpbmcgaW1hZ2UsIG9yIG5ldHdvcmsgZXJyb3IuIjticmVhaztjYXNlIno5MSI6Yj0iU2tpbiBYTUwgaW52YWxpZC4iO2JyZWFrO2Nhc2UiejkyIjpiPSJUaGUgc2tpbiBYTUwgZmlsZSBoYXMgb25lIG9yIG1vcmUgZmF1bHR5IG5hbWUgbGluZXMuIjticmVhaztjYXNlIno5NyI6Yj0iV2F0ZXJtYXJrIGltYWdlIGZhaWxlZCB0byBsb2FkOiAiO2JyZWFrO2Nhc2UiejkzIjpiPSJVbmtub3duIGVsZW1lbnQgc3R5bGUgLSBubyBrbm93biBtZXRob2QgdG8gaWRlbnRpZnkuIjticmVhaztjYXNlIno5NCI6Yj0iVW5rbm93biBtb3VzZSBwb3NpdGlvbiAtIG5vIGtub3duIG1ldGhvZCB0byBjYWxjdWxhdGUuIjticmVhaztjYXNlIno5NSI6Yj0iVW5rbm93biBtb3VzZSBzY3JvbGwgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6OTYiOmI9IlVua25vd24gd2luZG93IHNpemUgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6MTA2IjpiPSJMYXVuY2ggWm9vbWlmeSBXZWJzaXRlIjticmVhaztjYXNlInoxMDciOmI9Ik1pbmltaXplIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEwNSI6Yj0iRXhwYW5kIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEyMCI6Yj0iWm9vbSBPdXQiO2JyZWFrO2Nhc2UiejExNCI6Yj0iWm9vbSBJbiBBbmQgT3V0IjticmVhaztjYXNlInoxMTkiOmI9Ilpvb20gSW4iO2JyZWFrO2Nhc2UiejEwOSI6Yj0iUGFuIExlZnQiO2JyZWFrO2Nhc2UiejExMSI6Yj0iUGFuIFVwIjticmVhaztjYXNlInoxMDgiOmI9IlBhbiBEb3duIjticmVhaztjYXNlInoxMTAiOmI9IlBhbiBSaWdodCI7YnJlYWs7Y2FzZSJ6MTEyIjpiPSJSZXNldCBJbml0aWFsIFZpZXciO2JyZWFrO2Nhc2UiejExOCI6Yj0iVG9nZ2xlIEZ1bGwgUGFnZSBWaWV3IjticmVhaztjYXNlInoxMDIiOmI9IkNhbmNlbCBGdWxsIFBhZ2UgVmlldyI7YnJlYWs7Y2FzZSJ6MTAzIjpiPSJBZ3JlZSB0byBjb3B5cmlnaHQgYW5kIHZpZXcgaW1hZ2VzIjticmVhaztjYXNlInoxMDQiOmI9IkV4aXQgYW5kIGRvIG5vdCB2aWV3IGltYWdlcyI7YnJlYWs7Y2FzZSJ6MTEzIjpiPSJUb2dnbGUgRnVsbCBQYWdlIFZpZXciO2JyZWFrO2Nhc2UiejExNyI6Yj0iVG9nZ2xlIFZpZXdwb3J0IERpc3BsYXkiO2JyZWFrO2Nhc2UiejExNSI6Yj0iVG9nZ2xlIFZpZXdwb3J0IEJhY2tmaWxsIjticmVhaztjYXNlInoxMTYiOmI9IlRvZ2dsZSBDb25zdHJhaW4gUGFuIjticmVhaztkZWZhdWx0OmI9IlVuZXhwZWN0ZWQgcmVzb3VyY2UgcmVxdWVzdCJ9cmV0dXJuIGJ9LHoyNTM6ZnVuY3Rpb24oKXt2YXIgYT0iIjthKz0iXG4iLGErPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTUlGWSBJTUFHRSBWSUVXRVIgLSBDVVJSRU5UIFZBTFVFU1xuIixhKz0iXG4iLGErPSJJTUFHRSAmIFNLSU46ICAgICIsYSs9IlouaW1hZ2VQYXRoPSIrWi5pbWFnZVBhdGgrIiwgICAiLGErPSJaLnNraW5QYXRoPSIrWi5za2luUGF0aCsiLCAgICIsYSs9Ilouc2tpbk1vZGU9IitaLnNraW5Nb2RlKyIsICAgIixhKz0iWi5pbWFnZVc9IitaLmltYWdlVysiLCAgICIsYSs9IlouaW1hZ2VIPSIrWi5pbWFnZUgrIiwgICAiLGErPSJ0aWVyQ291bnQ9IitaLlZpZXdwb3J0LnoxODYoKSsiLCAgICIsYSs9IlRJTEVfU0laRT0iK1ouVmlld3BvcnQuejE5NSgpKyJcbiIsYSs9IlxuIixhKz0iUEFHRSAmIEJST1dTRVI6ICAgICIsYSs9IloucGFnZUNvbnRhaW5lcj0iK1oucGFnZUNvbnRhaW5lcisiLCAgICIsYSs9IlouYnJvd3Nlcj0iK1ouYnJvd3NlcisiLCAgICIsYSs9IlouYnJvd3NlclZlcnNpb249IitaLmJyb3dzZXJWZXJzaW9uKyIsICAgIixhKz0iWi5jYW52YXNTdXBwb3J0ZWQ9IitaLmNhbnZhc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD0iK1ouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3JtUHJvcGVydHk9IitaLmNzc1RyYW5zZm9ybVByb3BlcnR5KyIsICAgIixhKz0iWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPSIrWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzKyIsICAgIixhKz0iWi5hbHBoYVN1cHBvcnRlZD0iK1ouYWxwaGFTdXBwb3J0ZWQrIiwgICAiLGErPSJaLnJlbmRlclF1YWxpdHk9IitaLnJlbmRlclF1YWxpdHkrIiwgICAiLGErPSJaLm1vYmlsZURldmljZT0iK1oubW9iaWxlRGV2aWNlKyJcbiIsYSs9IlxuIixhKz0iVklFV0VSIE9QVElPTlMgJiBERUZBVUxUUzogICAgIixhKz0iWi5pbml0aWFsWD0iK1ouaW5pdGlhbFgrIiwgICAiLGErPSJaLmluaXRpYWxZPSIrWi5pbml0aWFsWSsiLCAgICIsYSs9IlouaW5pdGlhbFo9IitaLmluaXRpYWxaKyIsICAgIixhKz0iWi5taW5aPSIrWi5taW5aKyIsICAgIixhKz0iWi5tYXhaPSIrWi5tYXhaKyIsICAgIixhKz0iWi5maXRaPSIrWi5maXRaKyIsICAgIixhKz0iWi56b29tU3BlZWQ9IitaLnpvb21TcGVlZCsiLCAgICIsYSs9IloucGFuU3BlZWQ9IitaLnBhblNwZWVkKyIsICAgIixhKz0iWi5mYWRlSW5TcGVlZD0iK1ouZmFkZUluU3BlZWQrIiwgICAiLGErPSJaLnRvb2xiYXJWaXNpYmxlPSIrWi50b29sYmFyVmlzaWJsZSsiLCAgICIsYSs9IloudG9vbGJhclc9IitaLnRvb2xiYXJXKyIsICAgIixhKz0iWi50b29sYmFyQ3VycmVudFc9IitaLnRvb2xiYXJDdXJyZW50VysiLCAgICIsYSs9IloudG9vbGJhckg9IitaLnRvb2xiYXJIKyIsICAgIixhKz0iWi50b29sYmFyUG9zaXRpb249IitaLnRvb2xiYXJQb3NpdGlvbisiLCAgICIsYSs9IloudG9vbHRpcHNWaXNpYmxlPSIrWi50b29sdGlwc1Zpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclZpc2libGU9IitaLm5hdmlnYXRvclZpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclc9IitaLm5hdmlnYXRvclcrIiwgICAiLGErPSJaLm5hdmlnYXRvckg9IitaLm5hdmlnYXRvckgrIiwgICAiLGErPSJaLm5hdmlnYXRvckw9IitaLm5hdmlnYXRvckwrIiwgICAiLGErPSJaLm5hdmlnYXRvclQ9IitaLm5hdmlnYXRvclQrIiwgICAiLGErPSJaLm5hdmlnYXRvckZpdD0iK1oubmF2aWdhdG9yRml0KyIsICAgIixhKz0iWi5jbGlja1pvb209IitaLmNsaWNrWm9vbSsiLCAgICIsYSs9IlouY2xpY2tQYW49IitaLmNsaWNrUGFuKyIsICAgIixhKz0iWi5tb3VzZVBhbj0iK1oubW91c2VQYW4rIiwgICAiLGErPSJaLmtleXM9IitaLmtleXMrIiwgICAiLGErPSJaLmNvbnN0cmFpblBhbj0iK1ouY29uc3RyYWluUGFuKyIsICAgIixhKz0iV2F0ZXJtYXJrIGFscGhhID0gIitaLlV0aWxzLnoxODUoIno3MyIpKyIsICAgIixhKz0iWi53YXRlcm1hcmtQYXRoPSIrWi53YXRlcm1hcmtQYXRoKyIsICAgIixhKz0iWi5jb3B5cmlnaHRQYXRoPSIrWi5jb3B5cmlnaHRQYXRoKyIsICAgIixhKz0iWi5zbGlkZXJWaXNpYmxlPSIrWi5zbGlkZXJWaXNpYmxlKyIsICAgIixhKz0iWi5mdWxsUGFnZVZpc2libGU9IitaLmZ1bGxQYWdlVmlzaWJsZSsiLCAgICIsYSs9IloucHJvZ3Jlc3NWaXNpYmxlPSIrWi5wcm9ncmVzc1Zpc2libGUrIiwgICAiLGErPSJaLmxvZ29WaXNpYmxlPSIrWi5sb2dvVmlzaWJsZSsiLCAgICIsYSs9IloubG9nb0N1c3RvbVBhdGg9IitaLmxvZ29DdXN0b21QYXRoKyIsICAgIixhKz0iWi5jYW52YXM9IitaLmNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIFZBTFVFUzogICAgIixhKz0iXG4iLGErPSJkaXNwbGF5Vz0iK1ouVmlld3BvcnQuejIwMSgpKyIsICAgIixhKz0iZGlzcGxheUg9IitaLlZpZXdwb3J0LnoxNzkoKSsiLCAgICIsYSs9InRpZXJDdXJyZW50PSIrWi5WaWV3cG9ydC56MTg3KCkrIiwgICAiLGErPSJ0aWVyU2NhbGU9IitaLlZpZXdwb3J0LnoxODkoKSsiLCAgICIsYSs9IlRJRVJTX01BWF9TQ0FMRV9VUD0iK1ouVmlld3BvcnQuejE5NCgpKyIsICAgIixhKz0iVElFUlNfTUFYX1NDQUxFX0RPV049IitaLlZpZXdwb3J0LnoxOTMoKSsiLCAgICIsYSs9IlRJTEVTX01BWF9DQUNIRT0iK1ouVmlld3BvcnQuejE5NygpKyIsICAgIixhKz0iWi51c2VDYW52YXM9IitaLnVzZUNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIExJU1RTOiAgICAiLGErPSJ0aWVyV3M9IitaLlZpZXdwb3J0LnoxOTIoKSsiLCAgICIsYSs9InRpZXJIcz0iK1ouVmlld3BvcnQuejE4OCgpKyIsICAgIixhKz0idGllclRpbGVDb3VudHM9IitaLlZpZXdwb3J0LnoxOTEoKSsiLCAgICIsYSs9InRpbGVzTG9hZGluZ05hbWVzPSIrWi5WaWV3cG9ydC56MTk2KCkrIlxuIixhKz0iXG4iLGFsZXJ0KGEpfSx6MjU2OmZ1bmN0aW9uKCl7Wi5UcmFjZURpc3BsYXk/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT09ImlubGluZS1ibG9jayI/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0ibm9uZSI6Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0iaW5saW5lLWJsb2NrIjpaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpfSxjb25maWd1cmVUcmFjZURpc3BsYXk6ZnVuY3Rpb24oKXt2YXIgYT1aLnZpZXdlclcvMyxiPVoudmlld2VySC8zKzQ1LGM9MTAsZD1wYXJzZUZsb2F0KFoudmlld2VySCkvMyxlPXRoaXMuejE4NSgiejY4Iik7Wi5UcmFjZURpc3BsYXk9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUcmFjZURpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsYSsicHgiLGIrInB4IixjKyJweCIsZCsicHgiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMTBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRyYWNlRGlzcGxheSksWi50cmFjZXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTt2YXIgZj1aLnRyYWNlcy5zdHlsZTtmLndpZHRoPWEtMTUrInB4IixmLmhlaWdodD1iLTYwKyJweCIsZi5mb250RmFtaWx5PSJ2ZXJkYW5hIixmLmZvbnRTaXplPSIxMHB4IixmLmJvcmRlcj0ic29saWQiLGYuYm9yZGVyV2lkdGg9IjFweCIsZi5wYWRkaW5nPSI1cHgiLGYucmVzaXplPSJub25lIixaLnRyYWNlcy52YWx1ZT0iVHJhY2UgVmFsdWVzXG4iLFouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKFoudHJhY2VzKTt2YXIgZz01OCxoPTQyLGk9MjAsaj1iLWgvMi0xMCxrPTEwLGw9dGhpcy56MTg1KCJ6NjYiKSxtPXRoaXMuejE4NSgiejY5Iiksbj1uZXcgdGhpcy5CdXR0b24oImJ1dHRvblNob3dHbG9iYWxzIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLHRoaXMuejI1MywiejExMyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChuLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MiIpLG89bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVEaXNwbGF5IixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQuejI3MiwiejExNyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChvLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MCIpLHA9bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVCYWNrZmlsbCIsbSxudWxsLG51bGwsbnVsbCxudWxsLGcrInB4IixoKyJweCIsaSsicHgiLGorInB4IiwibW91c2Vkb3duIixaLlZpZXdwb3J0LnoyNzEsInoxMTUiLCJzb2xpZCIsIjFweCIsbCwiMHB4IiwiMHB4Iik7Wi5UcmFjZURpc3BsYXkuYXBwZW5kQ2hpbGQocC5lbG10KSxpKz1nK2ssZys9MTI7dmFyIG09dGhpcy56MTg1KCJ6NzEiKSxxPW5ldyB0aGlzLkJ1dHRvbigiYnV0dG9uVG9nZ2xlQ29uc3RyYWluUGFuIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQudG9nZ2xlQ29uc3RyYWluUGFuLCJ6MTE2Iiwic29saWQiLCIxcHgiLGwsIjBweCIsIjBweCIpO1ouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKHEuZWxtdCl9LHRyYWNlOmZ1bmN0aW9uKGEpe1ouVHJhY2VEaXNwbGF5fHxaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpLFoudHJhY2VzJiYoWi50cmFjZXMudmFsdWUrPSJcbiIrYSsiXG4iKX19"></script>
FIND j=4497 line=
FIND j=4498 line= <style type="text/css"> #myContainer { width: 900px; height: 550px } </style>
FIND j=4499 line= <script id="script_zm_mycontainer" type="text/javascript">
FIND j=4500 line= var zmid = "";
FIND j=4501 line= var zmid_default = "./zm/komap";
FIND j=4502 line= var zmid_default = "./zm/hrc2011";
FIND j=4503 line= var zmid_default = "./zm/zm_nasa/Curiosity-Murray-Buttes";
FIND j=4504 line= var zmid=url.search.replace('?zmid=','' );
FIND j=4505 line= if( zmid == "" ) { zmid = zmid_default; }
FIND j=4506 line= Z.showImage("myContainer", zmid );
FIND j=4507 line=
FIND j=4508 line=// var zmid= "./zm/zm_nasa/Curiosity-Murray-Buttes";
FIND j=4509 line=// Z.showImage("myContainer", "./zm/Curiosity-Murray-Buttes" );
FIND j=4510 line=
FIND j=4511 line=// document.write( "BUGS_90: url.search="+url.search );
FIND j=4512 line=// document.write( "BUGS_92: zmid="+zmid );
FIND j=4513 line=
FIND j=4514 line=// err Z.showImage("myContainer", '"'+zmid +'"' );
FIND j=4515 line=// alert( zmid );
FIND j=4516 line=// zmid = zmid_default;
FIND j=4517 line=// zmid = getParameterByName('zmid');
FIND j=4518 line=// if( zmid == "" ) { zmid = zmid_default; }
FIND j=4519 line=// alert( "getParameterByName(zmid)="+zmid );
FIND j=4520 line=// Z.showImage("myContainer", zmid );
FIND j=4521 line=// Z.showImage("myContainer", + zmid );
FIND j=4522 line=// Z.showImage("myContainer", "./zm/hrc2011");
FIND j=4523 line=// Z.showImage("myContainer", "./zm/komap");
FIND j=4524 line=// Z.showImage("myContainer2", "./zm/nasa");
FIND j=4525 line=// Z.showImage("myContainer", "./zm/Curiosity-Murray-Buttes");
FIND j=4526 line=// Z.showImage("myContainer", "./zm/hrc2011");
FIND j=4527 line= </script>
FIND j=4528 line=
FIND j=4529 line=
FIND j=4530 line= <script id="script_url" >
FIND j=4531 line=// function getParameterByName(name, url) {
FIND j=4532 line=// if (!url) url = window.location.href;
FIND j=4533 line=// name = name.replace(/[\[\]]/g, "\\$&");
FIND j=4534 line=// var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
FIND j=4535 line=// results = regex.exec(url);
FIND j=4536 line=// if (!results) return null;
FIND j=4537 line=// if (!results[2]) return '';
FIND j=4538 line=// return decodeURIComponent(results[2].replace(/\+/g, " "));
FIND j=4539 line=// }
FIND j=4540 line=//
FIND j=4541 line=// query string: ?foo=lorem&bar=&baz
FIND j=4542 line=// http://ko0.us/index_zm.html?zm=./zm/komap
FIND j=4543 line=// var foo = getParameterByName('foo'); // "lorem"
FIND j=4544 line=// var bar = getParameterByName('bar'); // "" (present with empty value)
FIND j=4545 line=// var baz = getParameterByName('baz'); // "" (present with no value)
FIND j=4546 line=// var qux = getParameterByName('qux'); // null (absent)
FIND j=4547 line=// var zmid = "./zm/komap";
FIND j=4548 line=// var zmid = getParameterByName('zmid');
FIND j=4549 line=// zmid = params.get('zmid');
FIND j=4550 line=// let params = new URL('https://ko0.us/index_zm?zmid=./zm/komap&bar=2').searchParams;
FIND j=4551 line=// zmid = params.get('zmid'); // "1"
FIND j=4552 line=// var foo= params.get('bar'); // "2"
FIND j=4553 line=// var bar= params.get('bar'); // "2"
FIND j=4554 line=// alert( "params.get(zmid)="+zmid+" foo="+foo+" bar="+bar );
FIND j=4555 line=// var first = getUrlVars()["zmid"];
FIND j=4556 line=// var second = getUrlVars()["foo"];
FIND j=4557 line=// var third = getUrlVars()["bar"];
FIND j=4558 line=// alert(first);
FIND j=4559 line=// alert(second);
FIND j=4560 line=// alert(third);
FIND j=4561 line=
FIND j=4562 line= </script>
FIND j=4563 line=
FIND j=4564 line=
FIND j=4565 line=
FIND j=4566 line= </head>
FIND j=4567 line=<body>
FIND j=4568 line= <a href=index_zm.html target=_blank>
FIND j=4569 line= <img name="index_zm_png" height=50 src="./imgs/btn/koeye.png">
FIND j=4570 line= </a>
FIND j=4571 line= <div id="div_zm">
FIND j=4572 line= <script name="script_zmid_title">
FIND j=4573 line= document.write( "<h1>"+url.search.replace('?zmid=','') + "</h1>" );
FIND j=4574 line= </script>
FIND j=4575 line= <div align="center"><br>
FIND j=4576 line= <table width="100" border="0" align="center" cellpadding="1" cellspacing="0" bgcolor="#000000" >
FIND j=4577 line= <tr>
FIND j=4578 line= <td>
FIND j=4579 line= <table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
FIND j=4580 line= <tr>
FIND j=4581 line= <td>
FIND j=4582 line= <div id="myContainer"></div>
FIND j=4583 line=<!-- <div id="./zm/komap"></div>
-->
FIND j=4584 line= </td>
FIND j=4585 line= </tr>
FIND j=4586 line= </table>
FIND j=4587 line= </td>
FIND j=4588 line= </tr>
FIND j=4589 line= </table>
FIND j=4590 line= </div>
FIND j=4591 line= </div>
FIND j=4592 line=
FIND j=4593 line= <script id="b64_zm_js" >
FIND j=4594 line= var b64_zm_js = new Array();
FIND j=4595 line= b64_zm_js[0] = "data:/text/plain;base64,KGZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30uY2FsbCgpO2EuWj17fX0pKCksWi5zaG93SW1hZ2U9ZnVuY3Rpb24oYSxiLGMpe1ouVXRpbHMuejEyOCgpLFouVXRpbHMuejEyNygpLFouVXRpbHMuejEyNigpLFouVXRpbHMuejE2MygpLFoucGFnZUNvbnRhaW5lcklEPWEsWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGIpLFoucGFyYW1ldGVycz1aLlV0aWxzLnoyMzMoYyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJET01Db250ZW50TG9hZGVkIixaLmluaXRpYWxpemUpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csImxvYWQiLFouaW5pdGlhbGl6ZSl9LFouaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2FyZ3VtZW50cy5jYWxsZWUuZG9uZXx8KGFyZ3VtZW50cy5jYWxsZWUuZG9uZT0hMCxaLlV0aWxzLnoxNjQoKSxaLlV0aWxzLnoyNDkoWi5wYXJhbWV0ZXJzKSxaLlZpZXdlcj1uZXcgWi56MTIyLFouVXRpbHMuaXNTdHJWYWwoWi5jb3B5cmlnaHRQYXRoKT9aLlV0aWxzLmVuZm9yY2VDb3B5cmlnaHQoKTpaLlZpZXdlci56MTQ5KCksWi5kZWJ1ZyYmWi5VdGlscy50cmFjZShaLlV0aWxzLnoxODUoIno2NyIpKSl9LFouejEyMj1mdW5jdGlvbigpe1ouVmlld2VyRGlzcGxheT1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIlZpZXdlckRpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJyZWxhdGl2ZSIsImhpZGRlbiIsIjEwMCUiLCIxMDAlIiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJwb2ludGVyIiksWi5wYWdlQ29udGFpbmVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFoucGFnZUNvbnRhaW5lcklEKTt2YXIgYT1aLlV0aWxzLnoxNzYoWi5wYWdlQ29udGFpbmVyKTtaLnZpZXdlclc9cGFyc2VGbG9hdChhLndpZHRoKSxaLnZpZXdlckg9cGFyc2VGbG9hdChhLmhlaWdodCksaXNOYU4oWi52aWV3ZXJXKSYmKFoudmlld2VyVz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKFoudmlld2VySCkmJihaLnZpZXdlckg9Wi5WaWV3ZXJEaXNwbGF5LmNsaWVudEhlaWdodCksWi5wYWdlQ29udGFpbmVyLmlubmVySFRNTD0iIixaLnBhZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQoWi5WaWV3ZXJEaXNwbGF5KSx0aGlzLnoxNDk9ZnVuY3Rpb24oKXtaLlZpZXdwb3J0PW5ldyBaLnoxMjV9LHRoaXMuejE0OD1mdW5jdGlvbigpe1oudG9vbGJhclZpc2libGU+MCYmKFouVG9vbGJhcj1uZXcgWi56MTI0KFouVmlld3BvcnQpKSxaLm5hdmlnYXRvclZpc2libGU+MCYmKFouTmF2aWdhdG9yPW5ldyBaLnoxMjMoWi5WaWV3cG9ydCkpLFouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56Mjc3KCl9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSl7Wi52aWV3ZXJXPWEsWi52aWV3ZXJIPWIsWi5WaWV3ZXJEaXNwbGF5LnN0eWxlLndpZHRoPWErInB4IixaLlZpZXdlckRpc3BsYXkuc3R5bGUuaGVpZ2h0PWIrInB4IixaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSYmWi5WaWV3cG9ydC5zZXRTaXplQW5kUG9zaXRpb24oYSxiLGMsZCk7dmFyIGY9Wi50b29sYmFyUG9zaXRpb249PTE/Yi1aLnRvb2xiYXJIOjA7Wi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmKFouVG9vbGJhci5zZXRTaXplQW5kUG9zaXRpb24oYSxudWxsLG51bGwsZiksWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMCkpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5OYXZpZ2F0b3IuejE4MCgpJiYoWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKG51bGwsbnVsbCxjLGQsWi5uYXZpZ2F0b3JGaXQpLFoubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSksZSYmWi5WaWV3cG9ydC56Mjc0KCEwKX0sdGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7Wi5WaWV3cG9ydC56MjkzQWxsU3RvcCghMCksWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGEpO3ZhciBiPW5ldyBaLnoxMDEsYz1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi8iKyJJbWFnZVByb3BlcnRpZXMueG1sIik7Yi5sb2FkWE1MKGMpfX0sWi56MTI1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2QoKXt6PTEsQT0wLEI9MCxGPVtdLEc9W10sSD1bXSxJPVtdLEo9W10sSz1bXSxMPVtdLE09W10sTj1bXSxPPVtdLFA9W10sUT1bXSxSPTB9ZnVuY3Rpb24gY2UoKXtyZXR1cm4gYn1mdW5jdGlvbiBjZihhKXtiPWF9ZnVuY3Rpb24gY2coKXtoPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwidmlld3BvcnRDb250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChoKSxpPWgsaz1pLnN0eWxlLGw9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydEJhY2tmaWxsRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZChsKSxtPWwsbj1tLnN0eWxlLHA9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydERpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLGguYXBwZW5kQ2hpbGQocCkscT1wLHI9cS5zdHlsZSxaLlV0aWxzLmlzU3RyVmFsKFoud2F0ZXJtYXJrUGF0aCkmJih0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2F0ZXJtYXJrRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh0KSx1PXQsdj11LnN0eWxlKSxaLlV0aWxzLmlzU3RyVmFsKFouaG90c3BvdFBhdGgpJiYodz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsImhvdHNwb3RzRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh3KSx4PXcseT14LnN0eWxlKSxaLnVzZUNhbnZhcz8obz1tLmdldENvbnRleHQoIjJkIikscz1xLmdldENvbnRleHQoIjJkIikpOihtLmlubmVySFRNTD0iIixxLmlubmVySFRNTD0iIiksdSYmKHUuaW5uZXJIVE1MPSIiKSx4JiYoeC5pbm5lckhUTUw9IiIpfWZ1bmN0aW9uIGNoKGEsYixjLGQpe2N8fChjPTApLGR8fChkPTApLFk9YSwkPWIsYmI9WSpYLGJjPSQqWCxiZD1iYi8yLGJlPWJjLzIsYmY9LSgoYmItWSkvMikrYyxiZz0oYmItWSkvMitjLGJoPS0oKGJjLSQpLzIpK2QsYmk9KGJjLSQpLzIrZCxpLndpZHRoPWJiLGkuaGVpZ2h0PWJjLGsud2lkdGg9YmIrInB4IixrLmhlaWdodD1iYysicHgiLGsubGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIscS53aWR0aD1iYixxLmhlaWdodD1iYyx1JiYodS53aWR0aD1iYix1LmhlaWdodD1iYyx2LndpZHRoPWJiKyJweCIsdi5oZWlnaHQ9YmMrInB4IiksWi51c2VDYW52YXMmJihzLnRyYW5zbGF0ZShiZCxiZSkscy5zYXZlKCkpfWZ1bmN0aW9uIGNpKCl7dmFyIGE9Wi5pbWFnZVcsYj1aLmltYWdlSDt3aGlsZShhPmN8fGI+YylhPWEvMixiPWIvMix6Kys7YT1aLmltYWdlVyxiPVouaW1hZ2VIO2Zvcih2YXIgZD16LTE7ZD49MDtkLS0pSFtkXT1hLElbZF09YixKW2RdPU1hdGguY2VpbChIW2RdL2MpLEtbZF09TWF0aC5jZWlsKElbZF0vYyksTFtkXT1KW2RdKktbZF0sYT1hLzIsYj1iLzJ9ZnVuY3Rpb24gY2ooKXtaLmluaXRpYWxYfHwoWi5pbml0aWFsWD1aLmltYWdlVy8yKSxaLmluaXRpYWxZfHwoWi5pbml0aWFsWT1aLmltYWdlSC8yKTt2YXIgYT1jUigpO1ouZml0WiYmWi5maXRaIT1hJiYoWi5pbml0aWFsWj09Wi5maXRaJiYoWi5pbml0aWFsWj1udWxsKSxaLm1pblo9PVouZml0WiYmKFoubWluWj1udWxsKSxaLm1heFo9PVouZml0WiYmKFoubWF4Wj1udWxsKSxaLmZpdFo9bnVsbCksWi5maXRafHwoWi5maXRaPWEpLFouaW5pdGlhbFp8fChaLmluaXRpYWxaPVouZml0WiksWi5taW5afHwoWi5taW5aPVouZml0WiksWi5tYXhafHwoWi5tYXhaPVouZml0WiksWi5pbml0aWFsWjxaLm1pblomJihaLmluaXRpYWxaPVoubWluWiksWi5pbml0aWFsWj5aLm1heFomJihaLmluaXRpYWxaPVoubWF4Wil9ZnVuY3Rpb24gY2soKXtjbChXKSx6PlQmJihjbChWKSx6PlMmJmNsKFUpKSxHLnNvcnQoKSxHPVouVXRpbHMuejI0MihHKSxjcyhHLGNKLDApfWZ1bmN0aW9uIGNsKGEpe3ZhciBiPUpbYV0tMSxjPUtbYV0tMTtmb3IodmFyIGQ9MDtkPD1jO2QrKylmb3IodmFyIGU9MDtlPD1iO2UrKylHLnB1c2goYSsiLSIrZSsiLSIrZCl9ZnVuY3Rpb24gY20oYSxiKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKSxkPWJmLXBhcnNlRmxvYXQoay5sZWZ0KSxlPWJoLXBhcnNlRmxvYXQoay50b3ApO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsWi5pbWFnZVg9Wi5pbWFnZVgrZC9aLmltYWdlWixaLmltYWdlWT1aLmltYWdlWStlL1ouaW1hZ2VaLGNyKG0sQixGLCExLCExKSxjcihxLEEsTywhMSwhMSksY1koKTt2YXIgZj1jdygpO2E+MD9mLnJpZ2h0PWYubGVmdDphPDAmJihmLmxlZnQ9Zi5yaWdodCksYj4wP2YuYm90dG9tPWYudG9wOmI8MCYmKGYudG9wPWYuYm90dG9tKTtmb3IodmFyIGc9Zi50b3A7Zzw9Zi5ib3R0b207ZysrKWZvcih2YXIgaD1mLmxlZnQ7aDw9Zi5yaWdodDtoKyspUS5wdXNoKEErIi0iK2grIi0iK2cpO3ZhciBpPVEubGVuZ3RoO2Zvcih2YXIgaj0wO2o8aTtqKyspe3ZhciBsPVFbal07aWYobCl7dmFyIG49bmV3IGNHKGwpO2NJKG4sYyxjSyl9fWk+MzAmJlEuc3BsaWNlKGktMzAsMzApfWZ1bmN0aW9uIGNuKCl7dmFyIGE9ITE7cGFyc2VGbG9hdChyLndpZHRoKSE9cS53aWR0aCYmKFoudXNlQ2FudmFzJiYoci53aWR0aD1xLndpZHRoKyJweCIsci5oZWlnaHQ9cS5oZWlnaHQrInB4IixyLmxlZnQ9IjBweCIsci50b3A9IjBweCIscy5yZXN0b3JlKCkscy5zYXZlKCkscy5zY2FsZShDLEMpKSxhPSEwKTtpZihwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymgpe3ZhciBiPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixjPXBhcnNlRmxvYXQoay50b3ApLWJoO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsYmw9cGFyc2VGbG9hdChuLmxlZnQpK2IsYm09cGFyc2VGbG9hdChuLnRvcCkrYyxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiO3ZhciBkPWNCKEEsQyk7Wi5pbWFnZVg9Wi5pbWFnZVgtYi9kLFouaW1hZ2VZPVouaW1hZ2VZLWMvZCxhPSEwfWEmJihjcihxLEEsTywhMCwhMSksY1koKSl9ZnVuY3Rpb24gY28oKXtDIT1EJiYoWi5pbWFnZVo9YnopLFouaW1hZ2VaPFoubWluWiYmKFouaW1hZ2VaPVoubWluWik7dmFyIGE9ZCxiPXo7d2hpbGUoYS8yPj1aLmltYWdlWiliLS0sYS89MjtiPWItMTwwPzA6Yi0xO3ZhciBjPWNDKGIsWi5pbWFnZVopO2lmKGIhPUF8fGMhPUMpWi51c2VDYW52YXMmJihzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLnNjYWxlKGMsYykpLEE9YixDPWM7RD1DfWZ1bmN0aW9uIGNwKCl7Qj1BPlM/VTpBPlQ/VjpXLEU9Y0MoQixaLmltYWdlWiksdGllckJhY2tmaWxsVz1IW0JdLHRpZXJCYWNrZmlsbEg9SVtCXSxtLndpZHRoPXRpZXJCYWNrZmlsbFcsbS5oZWlnaHQ9dGllckJhY2tmaWxsSDt2YXIgYT10aWVyQmFja2ZpbGxXKkUsYj10aWVyQmFja2ZpbGxIKkUsYz1aLmltYWdlWCpaLmltYWdlWixkPVouaW1hZ2VZKlouaW1hZ2VaO2JqPWEsYms9YixibD1iZC1jLGJtPWJlLWQsWi51c2VDYW52YXMmJihuLndpZHRoPWJqKyJweCIsbi5oZWlnaHQ9YmsrInB4Iiksbi5sZWZ0PWJsKyJweCIsbi50b3A9Ym0rInB4In1mdW5jdGlvbiBjcSgpe3ZhciBhPWN3KCk7Zm9yKHZhciBiPWEudG9wLGM9YS5ib3R0b207Yjw9YztiKyspZm9yKHZhciBkPWEubGVmdCxlPWEucmlnaHQ7ZDw9ZTtkKyspTi5wdXNoKEErIi0iK2QrIi0iK2IpO1Auc29ydCgpLE4uc29ydCgpLFA9Wi5VdGlscy56MjQyKFApLE49Wi5VdGlscy56MjQyKE4pO3ZhciBmPVouVXRpbHMuaW50ZXJzZWN0KE4sUCk7Tj1aLlV0aWxzLnN1YnRyYWN0KE4sUCksUj10aWxlc0xvYWRpbmdOYW1lc0xlbmd0aD1OLmxlbmd0aCxaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpJiZaLlRvb2xiYXIuc2hvd1Byb2dyZXNzKFIsdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGgpLFA9Wi5VdGlscy5zdWJ0cmFjdChQLGYpLFA9UC5jb25jYXQoZiksdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGghPTAmJihNPVtdKX1mdW5jdGlvbiBjcihhLGIsYyxkLGUpe2V8fGN0KGEpO2lmKGQpe3ZhciBmPU1hdGguZmxvb3IoYy5sZW5ndGgvMik7Zm9yKHZhciBnPWYsaD1jLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1jW2ddO2kmJmkudD09YiYmY00oYSxiLGkpO2lmKGMubGVuZ3RoLWctMSE9Zyl7dmFyIGk9Y1tjLmxlbmd0aC1nLTFdO2kmJmkudD09YiYmY00oYSxiLGkpfX19ZWxzZSBmb3IodmFyIGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspe3ZhciBpPWNbZ107aSYmaS50PT1iJiZjTShhLGIsaSl9fWZ1bmN0aW9uIGNzKGEsYixjKXtpZihhLmxlbmd0aD4wKXt2YXIgZD0obmV3IERhdGUpLmdldFRpbWUoKTtpZihjKXt2YXIgZT1NYXRoLmZsb29yKGEubGVuZ3RoLzIpO2Zvcih2YXIgZj1lLGc9YS5sZW5ndGg7ZjxnO2YrKyl7dmFyIGg9YVtmXTtpZihoKXt2YXIgaT1uZXcgY0coaCk7Y0koaSxkLGIpfWlmKGEubGVuZ3RoLWYtMSE9Zil7dmFyIGg9YVthLmxlbmd0aC1mLTFdO2lmKGgpe3ZhciBpPW5ldyBjRyhoKTtjSShpLGQsYil9fX19ZWxzZSBmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWFbZl07aWYoaCl7dmFyIGk9bmV3IGNHKGgpO2NJKGksZCxiKX19fX1mdW5jdGlvbiBjdChhKXtpZihhKWlmKFoudXNlQ2FudmFzJiZhLnRhZ05hbWU9PSJDQU5WQVMiKXt2YXIgYj1hLmdldENvbnRleHQoIjJkIik7Yi5zYXZlKCksYi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGIuY2xlYXJSZWN0KDAsMCxiLmNhbnZhcy53aWR0aCxiLmNhbnZhcy5oZWlnaHQpLGIucmVzdG9yZSgpfWVsc2UgaWYoYS5oYXNDaGlsZE5vZGVzKCkpd2hpbGUoYS5jaGlsZE5vZGVzLmxlbmd0aD49MSlhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY3UoKXtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXt2YXIgYT1jQihBLEMpO1ouVG9vbGJhci56MjY2KGEpfX1mdW5jdGlvbiBjdigpe1ouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56MTgwKCkmJlouTmF2aWdhdG9yLnoyNjgoKX1mdW5jdGlvbiBjdygpe3JldHVybiBuZXcgY3ooY3goKSxBKX1mdW5jdGlvbiBjeCgpe3ZhciBhPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixiPXBhcnNlRmxvYXQoay50b3ApLWJoO2lmKFoudXNlQ2FudmFzKXt2YXIgYz1wYXJzZUZsb2F0KGsud2lkdGgpL2kud2lkdGg7YS89YyxiLz1jfXZhciBkPWNCKEEsQyk7cmV0dXJuIGEhPTAmJihhLz1kKSxiIT0wJiYoYi89ZCksbmV3IGNBKFouaW1hZ2VYLWEsWi5pbWFnZVktYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsZCl9ZnVuY3Rpb24gY3koKXt2YXIgYT1wYXJzZUZsb2F0KGsubGVmdCktYmYsYj1wYXJzZUZsb2F0KGsudG9wKS1iaDtpZihaLnVzZUNhbnZhcyl7dmFyIGM9cGFyc2VGbG9hdChrLndpZHRoKS9pLndpZHRoO2EvPWMsYi89Y312YXIgZD1jQihBLEMpO3JldHVybiBhIT0wJiYoYS89ZCksYiE9MCYmKGIvPWQpLG5ldyBjQShaLmltYWdlWC1hLFouaW1hZ2VZLWIsLShiYi8yKSxiYi8yLC0oYmMvMiksYmMvMixkKX1mdW5jdGlvbiBjeihhLGIpe3ZhciBkPWNCKGIsMSksZT1NYXRoLmZsb29yKGEubGVmdCpkL2MpLGY9TWF0aC5mbG9vcihhLnJpZ2h0KmQvYyksZz1NYXRoLmZsb29yKGEudG9wKmQvYyksaD1NYXRoLmZsb29yKGEuYm90dG9tKmQvYyk7ZTwwJiYoZT0wKSxmPkpbQV0tMSYmKGY9SltBXS0xKSxnPDAmJihnPTApLGg+S1tBXS0xJiYoaD1LW0FdLTEpLHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9Zix0aGlzLnRvcD1nLHRoaXMuYm90dG9tPWh9ZnVuY3Rpb24gY0EoYSxiLGMsZCxlLGYsZyl7dGhpcy5sZWZ0PWErYy9nLHRoaXMucmlnaHQ9YStkL2csdGhpcy50b3A9YitlL2csdGhpcy5ib3R0b209YitmL2d9ZnVuY3Rpb24gY0IoYSxiKXt2YXIgYz1iKihIW2FdL1ouaW1hZ2VXKTtyZXR1cm4gY31mdW5jdGlvbiBjQyhhLGIpe3ZhciBjPWIvKEhbYV0vWi5pbWFnZVcpO3JldHVybiBjfWZ1bmN0aW9uIGNEKGEsYil7dmFyIGM9YS1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS54LGQ9Yi1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS55O3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChjLGQpfWZ1bmN0aW9uIGNFKGEsYil7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpK2JkLGQ9cGFyc2VGbG9hdChrLnRvcCkrYmUsZT1hLWMsZj1iLWQsZz1lL1ouaW1hZ2VaLGg9Zi9aLmltYWdlWixpPVouaW1hZ2VYK2csaj1aLmltYWdlWStoO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNGKGEsYil7dmFyIGM9Wi5pbWFnZVgtYSxkPVouaW1hZ2VZLWIsZT1jKlouaW1hZ2VaLGY9ZCpaLmltYWdlWixnPXBhcnNlRmxvYXQoay5sZWZ0KStiZCxoPXBhcnNlRmxvYXQoay50b3ApK2JlLGk9Zy1lLGo9aC1mO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNHKGEpe3RoaXMubmFtZT1hLHRoaXMudD1wYXJzZUludChhLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLSIpKSwxMCksdGhpcy5jPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEuaW5kZXhPZigiLSIpKzEsYS5sYXN0SW5kZXhPZigiLSIpKSwxMCksdGhpcy5yPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEubGFzdEluZGV4T2YoIi0iKSsxKSwxMCksdGhpcy54PU1hdGguZmxvb3IodGhpcy5jKmMpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMucipjKSx0aGlzLmltYWdlPW51bGwsdGhpcy5hbHBoYT0wLHRoaXMudXJsPVouVXRpbHMuejE0MChjSCh0aGlzLnQsdGhpcy5jLHRoaXMucix0aGlzLm5hbWUpKSx0aGlzLmVsbXQ9bnVsbCx0aGlzLnN0eWxlPW51bGx9ZnVuY3Rpb24gY0goYSxiLGQsZSl7dmFyIGY9ZCpKW2FdK2I7Zm9yKHZhciBnPTA7ZzxhO2crKylmKz1MW2ddO3ZhciBoPU1hdGguZmxvb3IoZi9jKSxpPVouaW1hZ2VQYXRoKyIvIisiVGlsZUdyb3VwIitoKyIvIitlKyIuanBnIjtyZXR1cm4gaX1mdW5jdGlvbiBjSShhLGIsYyl7YS5sb2FkaW5nPWNiLnoyMTJJbWFnZShhLnVybCxaLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsYyxhLGIpKX1mdW5jdGlvbiBjSihhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtGLnB1c2goYSk7dmFyIGU9Ry5pbmRleE9mKGQpO2UhPS0xJiZHLnNwbGljZShlLDEpLGEuYWxwaGE9MSxhLnQ9PUImJmNNKG0sQixhKX19ZnVuY3Rpb24gY0soYSxiLGMpe2lmKGEmJmImJmMpe2EuaW1hZ2U9Yzt2YXIgZD1hLm5hbWU7Y00ocSxBLGEpfX1mdW5jdGlvbiBjTChhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtPLnB1c2goYSksUC5wdXNoKGQpO3ZhciBlPU4uaW5kZXhPZihkKTtlIT0tMSYmTi5zcGxpY2UoZSwxKSxNLnB1c2goYSksYkZ8fChiRj13aW5kb3cuc2V0SW50ZXJ2YWwoY1AsNTApKTt2YXIgZz1OLmxlbmd0aDtnPT0wJiYoWi51c2VDYW52YXMmJmNyKHEsQSxPLCEwLCExKSxQLmxlbmd0aD5mJiZjUSgpLFI9MCksWi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmWi5Ub29sYmFyLnNob3dQcm9ncmVzcyhSLGcpfX1mdW5jdGlvbiBjTShhLGIsYyl7dmFyIGQ9Yy54LGU9Yy55LGY9Y0IoYiwxKTtpZihaLnVzZUNhbnZhcylhPT1xJiYoZC09Wi5pbWFnZVgqZixlLT1aLmltYWdlWSpmKSxjTihhLGMsZCxlKTtlbHNle3ZhciBnO2E9PXE/KGQtPVouaW1hZ2VYKmYtYmQvQyxlLT1aLmltYWdlWSpmLWJlL0MsZz1DKTpnPUUsY08oYSxjLGQsZSxnKX19ZnVuY3Rpb24gY04oYSxiLGMsZCl7dmFyIGU9YS5nZXRDb250ZXh0KCIyZCIpO1ouYWxwaGFTdXBwb3J0ZWQmJmIuYWxwaGE8MT8oZS5nbG9iYWxBbHBoYT1iLmFscGhhLGUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKSxlLmdsb2JhbEFscGhhPTEpOmUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKX1mdW5jdGlvbiBjTyhhLGIsYyxkLGUpe2IuZWxtdHx8KGIuZWxtdD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImltZyIpLGIuZWxtdC5vbm1vdXNlZG93bj1aLlV0aWxzLnByZXZlbnREZWZhdWx0LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihiLmVsbXQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxiLmVsbXQuc3JjPWIudXJsLGIuc3R5bGU9Yi5lbG10LnN0eWxlLGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixaLlV0aWxzLnJlbmRlclF1YWxpdHkoYixaLnJlbmRlclF1YWxpdHkpLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCYmKGIuc3R5bGVbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eSsiT3JpZ2luIl09IjBweCAwcHgiKSksYi5lbG10LnBhcmVudE5vZGUhPWEmJmEuYXBwZW5kQ2hpbGQoYi5lbG10KTt2YXIgZj1iLnN0eWxlO2YuZGlzcGxheT0ibm9uZSIsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkP2ZbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eV09WyJtYXRyaXgoIiwoYi5pbWFnZS53aWR0aC9iLmVsbXQud2lkdGgqZSkudG9GaXhlZCg4KSwiLDAsMCwiLChiLmltYWdlLmhlaWdodC9iLmVsbXQuaGVpZ2h0KmUpLnRvRml4ZWQoOCksIiwiLChjKmUpLnRvRml4ZWQoOCksWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPyIsIjoicHgsIiwoZCplKS50b0ZpeGVkKDgpLFouY3NzVHJhbnNmb3JtTm9Vbml0cz8iKSI6InB4KSJdLmpvaW4oIiIpOihmLndpZHRoPWIuaW1hZ2Uud2lkdGgqZSsicHgiLGYuaGVpZ2h0PWIuaW1hZ2UuaGVpZ2h0KmUrInB4IixmLmxlZnQ9YyplKyJweCIsZi50b3A9ZCplKyJweCIpLGYuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnNldE9wYWNpdHkoYixiLmFscGhhKX1mdW5jdGlvbiBjUChhKXt2YXIgYj1NLmxlbmd0aCxjPTA7Zm9yKHZhciBkPTA7ZDxiO2QrKyl7dmFyIGU9TVtkXTtlLnQ9PUEmJihlLmFscGhhPDE/KGUuYWxwaGErPWJFLGUuYWxwaGE+MSYmKGUuYWxwaGE9MSksY00ocSxBLGUpKTooYysrLGM+PWImJih3aW5kb3cuY2xlYXJJbnRlcnZhbChiRiksYkY9bnVsbCkpKX19ZnVuY3Rpb24gY1EoKXt2YXIgYT1QLmxlbmd0aC1mO2Zvcih2YXIgYj0wO2I8YTtiKyspaj1QLmluZGV4T2YoT1tiXS5uYW1lKSxqIT0tMSYmUC5zcGxpY2UoaiwxKSxPLnNwbGljZShiLDEpfWZ1bmN0aW9uIGNSKCl7cmV0dXJuIFouaW1hZ2VXL1ouaW1hZ2VIPlkvJD9ZL1ouaW1hZ2VXOiQvWi5pbWFnZUh9ZnVuY3Rpb24gY1MoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9bmV3IGNBKGEsYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGQ9Yy5sZWZ0LGU9Yy5yaWdodCxmPWMudG9wLGc9Yy5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9kPDA/YT1ZLzIvWi5pbWFnZVo6ZT5aLmltYWdlVyYmKGE9Wi5pbWFnZVctWS8yL1ouaW1hZ2VaKTphPVouaW1hZ2VXLzIsWi5pbWFnZUgqWi5pbWFnZVo+JD9mPDA/Yj0kLzIvWi5pbWFnZVo6Zz5aLmltYWdlSCYmKGI9Wi5pbWFnZUgtJC8yL1ouaW1hZ2VaKTpiPVouaW1hZ2VILzJ9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1QoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Y0IoQSxDKSxkPVouaW1hZ2VYLGU9Wi5pbWFnZVksZj1uZXcgY0EoZCxlLC0oWS8yKSxZLzIsLSgkLzIpLCQvMixjKSxnPWYubGVmdCxoPWYucmlnaHQsaT1mLnRvcCxqPWYuYm90dG9tO1ouaW1hZ2VXKmM+WT9nPDA/YSs9ZypjOmg+Wi5pbWFnZVcmJihhLT0oWi5pbWFnZVctaCkqYyk6YSs9KGQtWi5pbWFnZVcvMikqYyxaLmltYWdlSCpjPiQ/aTwwP2IrPWkqYzpqPlouaW1hZ2VIJiYoYi09KFouaW1hZ2VILWopKmMpOmIrPShlLVouaW1hZ2VILzIpKmN9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1UoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Wi5pbWFnZVgtKGEtYmYpL1ouaW1hZ2VaLGQ9Wi5pbWFnZVktKGItYmgpL1ouaW1hZ2VaLGU9bmV3IGNBKGMsZCwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGY9ZS5sZWZ0LGc9ZS5yaWdodCxoPWUudG9wLGk9ZS5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9mPDA/YSs9ZipaLmltYWdlWjpnPlouaW1hZ2VXJiYoYS09KFouaW1hZ2VXLWcpKlouaW1hZ2VaKTphKz0oYy1aLmltYWdlVy8yKSpaLmltYWdlWixaLmltYWdlSCpaLmltYWdlWj4kP2g8MD9iKz1oKlouaW1hZ2VaOmk+Wi5pbWFnZUgmJihiLT0oWi5pbWFnZUgtaSkqWi5pbWFnZVopOmIrPShkLVouaW1hZ2VILzIpKlouaW1hZ2VafXJldHVybiBuZXcgWi5VdGlscy5Qb2ludChhLGIpfWZ1bmN0aW9uIGNWKGEpe3JldHVybiBhPloubWF4Wj9hPVoubWF4WjphPFoubWluWiYmKGE9Wi5taW5aKSxhfWZ1bmN0aW9uIGNXKCl7Ylo9bmV3IEltYWdlLGIkPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzMiKSksYloudXJsPVoud2F0ZXJtYXJrUGF0aCxiWi5vbmxvYWQ9Y1gsYloub25lcnJvcj1jWixiWi5zcmM9Wi53YXRlcm1hcmtQYXRofWZ1bmN0aW9uIGNYKCl7aWYodSl7dmFyIGE9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno3NCIpKSxiPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzYiKSksYz1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejc1IikpLGQ9Y0IoQSxDKSxlPShaLmltYWdlVypkLXUud2lkdGgpLzIsZj0oWi5pbWFnZUgqZC11LmhlaWdodCkvMixnPShaLmltYWdlVy8yLVouaW1hZ2VYKSpkLGg9KFouaW1hZ2VILzItWi5pbWFnZVkpKmQsaT1kPGE/YTpkLGo9TWF0aC5yb3VuZChaLmltYWdlVy9iKSxrPU1hdGgucm91bmQoWi5pbWFnZUgvYyksbD1jeSgpO3dpU2NhbGVkVz1iWi53aWR0aCppLHdpU2NhbGVkSD1iWi5oZWlnaHQqaTt2YXIgbT0wLG49MDtmb3IodmFyIG89MTtvPD1qO28rKylmb3IodmFyIHA9MTtwPD1rO3ArKyl7dmFyIHE9TWF0aC5yb3VuZChaLmltYWdlVy8oaisxKSpvKSxyPU1hdGgucm91bmQoWi5pbWFnZUgvKGsrMSkqcCk7aWYocT5sLmxlZnQmJnE8bC5yaWdodCYmcj5sLnRvcCYmcjxsLmJvdHRvbSl7dmFyIHM9TWF0aC5yb3VuZChxKmQtd2lTY2FsZWRXLzItZStnKSx0PU1hdGgucm91bmQocipkLXdpU2NhbGVkSC8yLWYraCk7aWYoWi5pbWFnZVc+NGUzKXt2YXIgdj1tKzEwMCx3PW4rMTAwO2lmKHM8diYmdDx3KWNvbnRpbnVlO209cyxuPXR9dmFyIHg9YlouY2xvbmVOb2RlKCEwKTtaLlV0aWxzLnNldE9wYWNpdHkoeCxiJCkseC53aWR0aD13aVNjYWxlZFcseC5oZWlnaHQ9d2lTY2FsZWRIO3ZhciB5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2lDIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLHdpU2NhbGVkVysicHgiLHdpU2NhbGVkSCsicHgiLHMrInB4Iix0KyJweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7eS5hcHBlbmRDaGlsZCh4KSx1LmFwcGVuZENoaWxkKHkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHgsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9fX19ZnVuY3Rpb24gY1koKXt1JiYoY3QodSksY1goKSl9ZnVuY3Rpb24gY1ooKXtaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6OTciKSt0aGlzLnVybCl9ZnVuY3Rpb24gYyQoYixjLGQpe2EuejI5M0FsbFN0b3AoKSxaLmltYWdlWj1jVihkKTt2YXIgZT1jUyhiLGMpO1ouaW1hZ2VYPWUueCxaLmltYWdlWT1lLnksYS56Mjc0KCEwKX1mdW5jdGlvbiBjXygpe2lmKGJCKXtkYihidixidyxieCwhMSk7aWYoYnYhPT0wfHxidyE9PTB8fGJ4IT09MCliQj13aW5kb3cuc2V0VGltZW91dChjXyxiQSl9fWZ1bmN0aW9uIGRhKCl7Yk88Ykk/KGRiKGJKLGJLLGJMLCEwKSxiTysrLGJOPXdpbmRvdy5zZXRUaW1lb3V0KGRhLGJIKSk6KEM9Yk8qYkwrY0MoQSxaLmltYWdlWiksYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfWZ1bmN0aW9uIGRiKGEsYixkLGUpe3ZhciBmLGcsaCxpPSExLGo9ITEsbD0hMTtpZihkIT0wKXt2YXIgbT1DKigxK2QpO2UmJihtPUMrZCk7dmFyIG49Y0IoQSxtKTtoPWNWKG4pO2lmKGghPVouaW1hZ2VaKXt2YXIgbz1kZShoKTtvJiYoIWUsaj0hMCxsPSEwKX19aWYoYSE9MHx8YiE9MCl7dmFyIHA9cGFyc2VGbG9hdChrLmxlZnQpK2Escz1wYXJzZUZsb2F0KGsudG9wKStiLHQ9Y1UocCxzKTtmPXQueCxnPXQueSxrLmxlZnQ9ZisicHgiLGsudG9wPWcrInB4IixpPSEwLGw9ITB9dmFyIHU9YnklMj09MDt1JiYoY1koKSxqJiZjdSgpLGwmJmN2KCkpO2lmKGkpdmFyIHY9Wi51c2VDYW52YXM/cGFyc2VGbG9hdChyLndpZHRoKS9xLndpZHRoOjEsdz1NYXRoLnJvdW5kKGMvYnUqQyp2KSx4PWJ5JXc9PTAmJmJ5IT0wfWZ1bmN0aW9uIGRjKCl7YkImJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJCKSxiQj1udWxsKSxidj0wLGJ3PTAsYng9MCxieT0wfWZ1bmN0aW9uIGRkKCl7Yk4mJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJOKSxiTj1udWxsKX1mdW5jdGlvbiBkZShhKXt2YXIgYj0hMSxjPWNDKEEsYSk7aWYoYyE9Qyl7Qz1jLEU9Y0MoQixhKTt2YXIgZD1jL0QsZT1iYipkLGY9YmMqZCxnPShiYi1lKS8yLGg9KGJjLWYpLzI7aWYoYzxEKXt2YXIgaT1jVChnLGgpO2subGVmdD1iZitpLngtZysicHgiLGsudG9wPWJoK2kueS1oKyJweCJ9aWYoWi51c2VDYW52YXMpci53aWR0aD1lKyJweCIsci5oZWlnaHQ9ZisicHgiLHIubGVmdD1nKyJweCIsci50b3A9aCsicHgiLGU9YmoqZCxmPWJrKmQsZz1ibCtaLmltYWdlWCooMS1kKSpaLmltYWdlWixoPWJtK1ouaW1hZ2VZKigxLWQpKlouaW1hZ2VaLG4ud2lkdGg9ZSsicHgiLG4uaGVpZ2h0PWYrInB4IixuLmxlZnQ9ZysicHgiLG4udG9wPWgrInB4IjtlbHNle2NyKHEsQSxPLCEwLCExKSx0aWVyQmFja2ZpbGxXPUhbQl0sdGllckJhY2tmaWxsSD1JW0JdLG0ud2lkdGg9dGllckJhY2tmaWxsVyxtLmhlaWdodD10aWVyQmFja2ZpbGxIO3ZhciBqPXRpZXJCYWNrZmlsbFcqRSxsPXRpZXJCYWNrZmlsbEgqRSxvPVouaW1hZ2VYKmEscD1aLmltYWdlWSphO2JsPWJkLW8sYm09YmUtcCxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiLGNyKG0sQixGLCExLCExKX1iPSEwfXJldHVybiBifWZ1bmN0aW9uIGRmKGEpe2E/KGJYfHxkZygpLGJYLmVsbXQuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIik6YlgmJihiWC5lbG10LnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1mdW5jdGlvbiBkZygpe3ZhciBhPVouVXRpbHMuejE4NSgiejIxIiksYj0zNCxjPTM0LGQ9MjAsZT1wYXJzZUZsb2F0KFoudmlld2VyVyktKGIrZCksZj1wYXJzZUZsb2F0KFoudmlld2VySCktKGMrZCksZz1aLlV0aWxzLnoxODUoInoyMCIpO2JYPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uRlBDYW5jZWwiLGEsbnVsbCxudWxsLG51bGwsbnVsbCxiKyJweCIsYysicHgiLGUrInB4IixmKyJweCIsIm1vdXNlZG93biIsZGgsInoxMDIiLCJzb2xpZCIsIjFweCIsZywiMHB4IiwiMHB4IiksWi5WaWV3ZXJEaXNwbGF5LmFwcGVuZENoaWxkKGJYLmVsbXQpfWZ1bmN0aW9uIGRoKCl7YS50b2dnbGVGdWxsUGFnZVZpZXcoITEpfWZ1bmN0aW9uIGRpKCl7Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXlkb3duIixkeiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXl1cCIsZEEpLFoubW9iaWxlRGV2aWNlPyhaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hzdGFydCIsZHApLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJ0b3VjaG1vdmUiLGRxKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hlbmQiLGRyKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hjYW5jZWwiLGRzKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZXN0YXJ0IixkdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksImdlc3R1cmVjaGFuZ2UiLGR1KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZWVuZCIsZHYpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0ub25vcmllbnRhdGlvbmNoYW5nZT1keSk6KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3ZlciIsZGopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3V0IixkbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKFouVmlld2VyRGlzcGxheSwibW91c2Vtb3ZlIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwibW91c2Vkb3duIixkayksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNlbW92ZSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihtLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHEsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSx1JiZaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLHgmJlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9ZnVuY3Rpb24gZGooYSl7dmFyIGI9Wi5VdGlscy56MjI1KFouVXRpbHMudGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKSxjPVouVXRpbHMuejIyNShaLlV0aWxzLnJlbGF0ZWRUYXJnZXQoYSkpO2lmKCFifHwhYylaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCEwKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSxibz1udWxsfWZ1bmN0aW9uIGRrKGEpe2lmKFouVXRpbHMuaXNSaWdodE1vdXNlQnV0dG9uKGEpKXJldHVybjtibj0hMDt2YXIgYj1aLlV0aWxzLnoxODEoYSk7cmV0dXJuIGJQPW5ldyBaLlV0aWxzLlBvaW50KGIueCxiLnkpLGkubW91c2VYUHJpb3I9Yi54LGkubW91c2VZUHJpb3I9Yi55LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixkbCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNldXAiLGRtKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGRtKSwhMX1mdW5jdGlvbiBkbChiKXtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGI9Wi5VdGlscy5ldmVudChiKSxjPVouVXRpbHMuejE4MShiKSxkPWMueC1pLm1vdXNlWFByaW9yLGU9Yy55LWkubW91c2VZUHJpb3I7aWYoIWlzTmFOKGQpJiYhaXNOYU4oZSkpe3ZhciBmPXBhcnNlRmxvYXQoay5sZWZ0KStkLGc9cGFyc2VGbG9hdChrLnRvcCkrZSxoPWNVKGYsZyk7ay5sZWZ0PWgueCsicHgiLGsudG9wPWgueSsicHgiLGkubW91c2VYUHJpb3I9Yy54LGkubW91c2VZUHJpb3I9Yy55O2lmKFouTmF2aWdhdG9yKXt2YXIgaj1hLnoxNDEoaCk7Wi5OYXZpZ2F0b3IuejI2M1JlY3RhbmdsZVBvc2l0aW9uKGopfX1yZXR1cm4hMX1mdW5jdGlvbiBkbShiKXtibj0hMSxkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLGRsKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSwibW91c2V1cCIsZG0pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsZG0pO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1aLlV0aWxzLnoxODEoYiksZDtibz9kPWJvOmQ9bmV3IFouVXRpbHMuUG9pbnQoYy54LGMueSk7dmFyIGU9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZC54LDIpK01hdGgucG93KGJQLnktZC55LDIpKTtpZihlPDQpe3ZhciBmPWEuejE3MyhiLGQsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoZi54LGYueSxmLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhmLngsZi55LFouaW1hZ2VaKX1lbHNlIFoubW91c2VQYW4mJmEuejI3NCgpO2JvJiYoWi5Ub29sYmFyRGlzcGxheSYmWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMSksWi5OYXZpZ2F0b3JEaXNwbGF5JiZaLm5hdmlnYXRvclZpc2libGU+MSYmWi5OYXZpZ2F0b3Iuc2V0VmlzaWJpbGl0eSghMSkpfWZ1bmN0aW9uIGRuKGEpe3ZhciBiPVouVXRpbHMuejIyNShaLlV0aWxzLnRhcmdldChhKSksYz1aLlV0aWxzLnoyMjUoWi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKTtpZighYnx8IWMpaWYoIWJuKVouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITEpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2Vsc2V7dmFyIGQ9Wi5VdGlscy56MTgxKGEpO2JvPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX1mdW5jdGlvbiBkcChhKXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYiYmIWJwKXticj0hMTt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7YlA9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksaS5tb3VzZVhQcmlvcj1kLngsaS5tb3VzZVlQcmlvcj1kLnl9fWZ1bmN0aW9uIGRxKGIpe2IucHJldmVudERlZmF1bHQoKTtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGM9Wi5VdGlscy56MTc4KGIpO2lmKGMmJiFicCYmIWJyKXt2YXIgZD1jLnRhcmdldCxlPW5ldyBaLlV0aWxzLlBvaW50KGMucGFnZVgsYy5wYWdlWSksZj1lLngtaS5tb3VzZVhQcmlvcixnPWUueS1pLm1vdXNlWVByaW9yO2lmKCFpc05hTihmKSYmIWlzTmFOKGcpKXt2YXIgaD1wYXJzZUZsb2F0KGsubGVmdCkrZixqPXBhcnNlRmxvYXQoay50b3ApK2csbD1jVShoLGopO2subGVmdD1sLngrInB4IixrLnRvcD1sLnkrInB4IixpLm1vdXNlWFByaW9yPWUueCxpLm1vdXNlWVByaW9yPWUueTtpZihaLk5hdmlnYXRvcil7dmFyIG09YS56MTQxKGwpO1ouTmF2aWdhdG9yLnoyNjNSZWN0YW5nbGVQb3NpdGlvbihtKX19fXJldHVybiExfWZ1bmN0aW9uIGRyKGIpe2lmKCFicCYmIWJyKXt2YXIgYz0hMSxkPVouVXRpbHMuejE3OChiKTtpZihkKXt2YXIgZT1kLnRhcmdldCxmPW5ldyBaLlV0aWxzLlBvaW50KGQucGFnZVgsZC5wYWdlWSksZz1uZXcgWi5VdGlscy5Qb2ludChmLngsZi55KSxoPU1hdGguc3FydChNYXRoLnBvdyhiUC54LWcueCwyKStNYXRoLnBvdyhiUC55LWcueSwyKSk7aWYoaDw0KXt2YXIgaT1hLnoxNzMoYixnLEEsQyk7Wi5jbGlja1pvb20/YS56MjkzVG9WaWV3KGkueCxpLnksaS56KTpaLmNsaWNrUGFuJiZhLnoyOTNUb1ZpZXcoaS54LGkueSxaLmltYWdlWil9ZWxzZSBjPSEwfWVsc2UgYz0hMDtjJiZaLm1vdXNlUGFuJiZhLnoyNzQoKX19ZnVuY3Rpb24gZHMoYil7aWYoIWJwJiYhYnIpe3ZhciBjPSExLGQ9Wi5VdGlscy56MTc4KGIpO2lmKGQpe3ZhciBlPWQudGFyZ2V0LGY9bmV3IFouVXRpbHMuUG9pbnQoZC5wYWdlWCxkLnBhZ2VZKSxnPW5ldyBaLlV0aWxzLlBvaW50KGYueCxmLnkpLGg9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZy54LDIpK01hdGgucG93KGJQLnktZy55LDIpKTtpZihoPDQpe3ZhciBpPWEuejE3MyhiLGcsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoaS54LGkueSxpLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhpLngsaS55LFouaW1hZ2VaKX1lbHNlIGM9ITB9ZWxzZSBjPSEwO2MmJloubW91c2VQYW4mJmEuejI3NCgpfX1mdW5jdGlvbiBkdChhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpO2R1KGEpLGJwfHwoYnA9d2luZG93LnNldEludGVydmFsKGR3LGJzKSl9ZnVuY3Rpb24gZHUoYSl7dmFyIGE9Wi5VdGlscy5ldmVudChhKTthLnByZXZlbnREZWZhdWx0KCksYnE9TWF0aC5yb3VuZChhLnNjYWxlKjEwMCkvMTAwfWZ1bmN0aW9uIGR2KGIpe2JwJiYod2luZG93LmNsZWFySW50ZXJ2YWwoYnApLGJyPSEwLGJwPW51bGwpLFoubW91c2VQYW4mJmEuejI3NCgpfWZ1bmN0aW9uIGR3KGEpe2lmKCFaLm1vdXNlUGFuKXJldHVybjt2YXIgYj1keChBLEQsYnEpLGM9Y1YoYik7YiE9Wi5pbWFnZVomJmRlKGMpfWZ1bmN0aW9uIGR4KGEsYixjKXt2YXIgZD1iKmMsZT1jQihhLGQpO3JldHVybiBlfWZ1bmN0aW9uIGR5KGIpe1ouZnVsbFBhZ2UmJihaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCExKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKSxhLnRvZ2dsZUZ1bGxQYWdlVmlldyghMSksYS50b2dnbGVGdWxsUGFnZVZpZXcoITApLFouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITApLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApKX1mdW5jdGlvbiBkeihiKXtpZighWi5rZXlzKXJldHVybjt2YXIgYj1aLlV0aWxzLmV2ZW50KGIpO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgOTA6YS56b29tKCJvdXQiKTticmVhaztjYXNlIDE3OmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSA2NTphLnpvb20oImluIik7YnJlYWs7Y2FzZSAxNjphLnpvb20oImluIik7YnJlYWs7Y2FzZSAzNzphLnBhbigibGVmdCIpO2JyZWFrO2Nhc2UgMzg6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSA0MDphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UgMzk6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSAyNzpaLmZ1bGxQYWdlP2EudG9nZ2xlRnVsbFBhZ2VWaWV3KCExKTphLnJlc2V0KCl9fWZ1bmN0aW9uIGRBKGIpe2lmKCFaLmtleXMpcmV0dXJuO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1iLmtleUNvZGU7Yz09OTB8fGM9PTE3fHxjPT02NXx8Yz09MTY/YS56b29tKCJzdG9wIik6Yz09Mzd8fGM9PTM5P2EucGFuKCJob3Jpem9udGFsU3RvcCIpOihjPT0zOHx8Yz09NDApJiZhLnBhbigidmVydGljYWxTdG9wIil9dmFyIGE9dGhpcyxiPSExLGM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjEiKSwxMCksZD1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejU5IikpLGU9ZC8yLGY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjIiKSwxMCksZz1aLnRvb2xiYXJWaXNpYmxlPT0xP1oudG9vbGJhckg6MCxoLGksayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHk7Y2coKTt2YXIgej0xLEE9MCxCPTAsQyxELEUsRj1bXSxHPVtdLEg9W10sST1bXSxKPVtdLEs9W10sTD1bXSxNPVtdLE49W10sTz1bXSxQPVtdLFE9W10sUj0wLFM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NyIpLDEwKSxUPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejYiKSwxMCksVT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1IiksMTApLFY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NCIpLDEwKSxXPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejMiKSwxMCksWD1wYXJzZUludChaLlV0aWxzLnoxODUoIno0NSIpLDEwKSxZLCQsXyxiYSxiYixiYyxiZCxiZSxiZixiZyxiaCxiaSxiaixiayxibCxibTtZPVoudmlld2VyVywkPVoudmlld2VySCxfPWJhPTAsJC09ZyxaLnRvb2xiYXJQb3NpdGlvbj09MCYmKGJhKz1nKTt2YXIgYm49ITEsYm89bnVsbCxicD1udWxsLGJxPW51bGwsYnI9ITEsYnM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6MjQiKSwxMCksYnQ9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno4MSIpKSpaLnpvb21TcGVlZDtaLm1vYmlsZURldmljZSYmKGJ0Lz0yKTt2YXIgYnU9TWF0aC5yb3VuZChwYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejQ3IikpKloucGFuU3BlZWQpLGJ2PTAsYnc9MCxieD0wLGJ5PTAsYno9MCxiQT1wYXJzZUludChaLlV0aWxzLnoxODUoIno3NyIpLDEwKSxiQixiQyxiRCxiRT1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejE5IikpKlouZmFkZUluU3BlZWQsYkYsYkc9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzgiKSwxMCksYkg9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzkiKSwxMCksYkk9YkcvYkgsYkosYkssYkwsYk0sYk4sYk8sYlAsYlEsYlIsYlMsYlQsYlUsYlYsYlcsYlgsYlk7aWYoWi5VdGlscy5pc1N0clZhbChaLndhdGVybWFya1BhdGgpKXZhciBiWixiJCxiXz1bXSxjYT1bXTtjaChZLCQsXyxiYSk7dmFyIGNiPW5ldyBaLnoxMDEsY2M9Wi5VdGlscy56MTQwKFouaW1hZ2VQYXRoKyIvIisiSW1hZ2VQcm9wZXJ0aWVzLnhtbCIpO2NiLmxvYWRYTUwoY2MpLHRoaXMuejIwNj1mdW5jdGlvbihhLGIpe1ouaW1hZ2VXPWEsWi5pbWFnZUg9YixjaSgpLGNqKCksRT1jQyhCLFouaW5pdGlhbFopLEM9Y0MoQSxaLmluaXRpYWxaKSxEPUMsWi51c2VDYW52YXMmJnMuc2NhbGUoQyxDKSx1JiZjVygpLGNrKCksYyQoWi5pbml0aWFsWCxaLmluaXRpYWxZLFouaW5pdGlhbFopLGRpKCksY2YoITApLFouVmlld2VyLnoxNDgoKX0sdGhpcy5yZXoyMDY9ZnVuY3Rpb24oYSxiKXtjZighMSksY2QoKSxaLmltYWdlVz1hLFouaW1hZ2VIPWIsY2koKSxjaigpLEU9Y0MoQixaLmluaXRpYWxaKSxDPWNDKEEsWi5pbml0aWFsWiksRD1DLFoudXNlQ2FudmFzJiYocy5yZXN0b3JlKCkscy5zY2FsZShDLEMpKSxjaygpLGNoKFksJCxfLGJhKSxtJiZjdChtKSxxJiZjdChxKSx1JiZjdCh1KSxjJChaLmluaXRpYWxYLFouaW5pdGlhbFksWi5pbml0aWFsWiksY2YoITApLFoubmF2aWdhdG9yVmlzaWJsZT4wJiZaLk5hdmlnYXRvci5zZXRJbWFnZVBhdGgoWi5pbWFnZVBhdGgpfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoKX0sdGhpcy56MjAxPWZ1bmN0aW9uKCl7cmV0dXJuIGJifSx0aGlzLnoxNzk9ZnVuY3Rpb24oKXtyZXR1cm4gYmN9LHRoaXMuejE4Nj1mdW5jdGlvbigpe3JldHVybiB6fSx0aGlzLnoxOTU9ZnVuY3Rpb24oKXtyZXR1cm4gY30sdGhpcy56MTg3PWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuejE4OT1mdW5jdGlvbigpe3JldHVybiBDfSx0aGlzLnoxODlBc1pvb209ZnVuY3Rpb24oKXt2YXIgYT1jQihBLEMpO3JldHVybiBhfSx0aGlzLnoxOTQ9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy56MTkzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuejE5Nz1mdW5jdGlvbigpe3JldHVybiBmfSx0aGlzLnoxOTI9ZnVuY3Rpb24oKXtyZXR1cm4gSC5qb2luKCIsIil9LHRoaXMuejE4OD1mdW5jdGlvbigpe3JldHVybiBJLmpvaW4oIiwgIil9LHRoaXMuejE5MT1mdW5jdGlvbigpe3JldHVybiBMLmpvaW4oIiwgIil9LHRoaXMuejE5Nj1mdW5jdGlvbigpe3ZhciBhPU4uam9pbigiLCAiKT09IiI/IkN1cnJlbnQgdmlldyBsb2FkaW5nIGNvbXBsZXRlIjpOLmpvaW4oIiwgIik7cmV0dXJuIGF9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQpe2NoKGEsYixjLGQpfSx0aGlzLnoyNzQ9ZnVuY3Rpb24oYSl7aWYoQyE9RHx8Wi5pbWFnZVohPWJ6fHxwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymh8fGEpe2NuKCksYno9Y0IoQSxDKTt2YXIgYz0hMTtpZihDIT1EfHxaLmltYWdlWiE9Ynp8fCFifHxhKVouaW1hZ2VaPGJ6JiYhYSYmKGM9ITApLGNvKCksY3AoKSxjcihtLEIsRiwhMSwhMSk7Y3EoKSxjcihxLEEsTywhMCxjKSxjcyhOLGNMLDApLGN1KCksY3YoKX19LHRoaXMuc2V0Vmlldz1mdW5jdGlvbihhLGIsYyl7aWYoYT09dW5kZWZpbmVkfHxhPT1udWxsKWE9Wi5pbWFnZVcvMjtpZihiPT11bmRlZmluZWR8fGI9PW51bGwpYj1aLmltYWdlSC8yO2M9PXVuZGVmaW5lZHx8Yz09bnVsbD9jPVouZml0WjpjPjEmJihjPWMvMTAwKSxjJChhLGIsYyl9LHRoaXMuem9vbT1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJvdXQiOmJ4Pj0wJiYoYngtPWJ0KTticmVhaztjYXNlImluIjpieDw9MCYmKGJ4Kz1idCk7YnJlYWs7Y2FzZSJzdG9wIjpieD0wfVouem9vbWluZz1ieD09MD8ic3RvcCI6Yng+MD8iaW4iOiJvdXQiLGJ4IT0wP2JCfHwoKGJ4PDAmJlouaW1hZ2VaPloubWluWnx8Yng+MCYmWi5pbWFnZVo8Wi5tYXhaKSYmYS56MjczKCExKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnBhbj1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJsZWZ0Ijpidjw9MCYmKGJ2Kz1idSk7YnJlYWs7Y2FzZSJ1cCI6Ync8PTAmJihidys9YnUpO2JyZWFrO2Nhc2UiZG93biI6Ync+PTAmJihidy09YnUpO2JyZWFrO2Nhc2UicmlnaHQiOmJ2Pj0wJiYoYnYtPWJ1KTticmVhaztjYXNlImhvcml6b250YWxTdG9wIjpidj0wO2JyZWFrO2Nhc2UidmVydGljYWxTdG9wIjpidz0wO2JyZWFrO2Nhc2Uic3RvcCI6YnY9MCxidz0wfVoucGFubmluZ1g9YnY9PTA/InN0b3AiOmJ2PjA/ImxlZnQiOiJyaWdodCIsWi5wYW5uaW5nWT1idz09MD8ic3RvcCI6Ync+MD8idXAiOiJkb3duIixiQz1aLmltYWdlWCpjQihBLDEpLGJEPVouaW1hZ2VZKmNCKEEsMSksYnYhPTB8fGJ3IT0wP2JCfHwoYS56MjczKCEwKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnoyOTNUb1ZpZXc9ZnVuY3Rpb24oYixjLGQpe2EuejI5M0FsbFN0b3AoKTt2YXIgZT1jRihiLGMpLGY9YmQtZS54LGc9YmUtZS55LGg9Y0MoQSxkKSxpPWNDKEIsZCksaj1wYXJzZUZsb2F0KGsubGVmdCkrZixsPXBhcnNlRmxvYXQoay50b3ApK2csbT1oLUMsbj1pLUU7Yko9ai9iSSxiSz1sL2JJLGJMPW0vYkksYk09bi9iSSxhLnoyNzMoITEpLGJPPTAsYk49d2luZG93LnNldFRpbWVvdXQoZGEsYkgpfSx0aGlzLnoyOTNBbGxTdG9wPWZ1bmN0aW9uKGIpe2RjKCksZGQoKSxifHxhLnoyNzQoKX0sdGhpcy56MjQ1PWZ1bmN0aW9uKGEpe3ZhciBiPWRlKGEpO2ImJihjWSgpLGN2KCkpfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7YS56MjkzVG9WaWV3KFouaW5pdGlhbFgsWi5pbml0aWFsWSxaLmluaXRpYWxaKX0sdGhpcy50b2dnbGVGdWxsUGFnZVZpZXdFeHRlcm5hbD1mdW5jdGlvbigpe2JZPSEwLGEudG9nZ2xlRnVsbFBhZ2VWaWV3KCl9LHRoaXMudG9nZ2xlRnVsbFBhZ2VWaWV3PWZ1bmN0aW9uKGIpe2EuejI5M0FsbFN0b3AoKSxaLmZ1bGxQYWdlPWI/YjohWi5mdWxsUGFnZTt2YXIgYz1kb2N1bWVudC5ib2R5LGQ9Yy5zdHlsZSxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxmPVouVmlld2VyRGlzcGxheS5zdHlsZSxnPW51bGwsaD1udWxsO2lmKFouZnVsbFBhZ2Upe2JRPWQud2lkdGgsYlI9ZC5oZWlnaHQsYlM9ZC5vdmVyZmxvdyxiVD1lLm92ZXJmbG93LGJVPWYuYmFja2dyb3VuZENvbG9yLGJWPWYucG9zaXRpb24sYlc9Zi56SW5kZXg7dmFyIGk7Wi5tb2JpbGVEZXZpY2U/KGk9Wi5VdGlscy56MjAxaW5kb3dTaXplKCksZC53aWR0aD1pLngsZC5oZWlnaHQ9aS55KTooZC53aWR0aD0iMTAwJSIsZC5oZWlnaHQ9IjEwMCUiKSxkLm92ZXJmbG93PSJoaWRkZW4iLGUub3ZlcmZsb3c9ImhpZGRlbiIsZi5iYWNrZ3JvdW5kQ29sb3I9Wi5VdGlscy56MTg1KCJ6MjIiKSxmLnBvc2l0aW9uPSJmaXhlZCIsZi56SW5kZXg9Ijk5OTk5OTk5IixpPVouVXRpbHMuejIwMWluZG93U2l6ZSgpLGc9aS54LGg9aS55fWVsc2V7ZC53aWR0aD1iUSxkLmhlaWdodD1iUixkLm92ZXJmbG93PWJTLGUub3ZlcmZsb3c9YlQsZi5iYWNrZ3JvdW5kQ29sb3I9YlUsZi5wb3NpdGlvbj0icmVsYXRpdmUiLGYuekluZGV4PWJXO3ZhciBqPVouVXRpbHMuejE3NihaLnBhZ2VDb250YWluZXIpO2c9cGFyc2VGbG9hdChqLndpZHRoKSxoPXBhcnNlRmxvYXQoai5oZWlnaHQpLGlzTmFOKGcpJiYoZz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKGgpJiYoaD1aLlZpZXdlckRpc3BsYXkuY2xpZW50SGVpZ2h0KSxiWT0hMX1aLnZpZXdlclc9ZyxaLnZpZXdlckg9aCxjaChnLGgpLGRmKGJZKTtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXtaLnRvb2xiYXJDdXJyZW50Vz1aLnRvb2xiYXJXPT0tMT9nOloudG9vbGJhclc7dmFyIGw9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILVoudG9vbGJhckg6MDtaLlRvb2xiYXIuc2V0U2l6ZUFuZFBvc2l0aW9uKFoudG9vbGJhckN1cnJlbnRXLG51bGwsbnVsbCxsKX1aLk5hdmlnYXRvckRpc3BsYXkmJlouTmF2aWdhdG9yLnoxODAoKSYmWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKFoubmF2aWdhdG9yVyxaLm5hdmlnYXRvckgsWi5uYXZpZ2F0b3JMLTEsWi5uYXZpZ2F0b3JULTEpLGNqKCksWi5pbWFnZVo9Y1YoWi5pbWFnZVopO2lmKFouY29uc3RyYWluUGFuKXt2YXIgbT1wYXJzZUZsb2F0KGsubGVmdCksbj1wYXJzZUZsb2F0KGsudG9wKSxvPWNVKG0sbik7ay5sZWZ0PW8ueCsicHgiLGsudG9wPW8ueSsicHgifWEuejI3NCghMCl9LHRoaXMuejI3MT1mdW5jdGlvbigpe3ZhciBhPVouVmlld2VyRGlzcGxheS5maXJzdENoaWxkLmNoaWxkTm9kZXNbMF0uc3R5bGU7YS5kaXNwbGF5PWEuZGlzcGxheT09Im5vbmUiPyJpbmxpbmUtYmxvY2siOiJub25lIn0sdGhpcy56MjcyPWZ1bmN0aW9uKCl7dmFyIGE9Wi5WaWV3ZXJEaXNwbGF5LmZpcnN0Q2hpbGQuY2hpbGROb2Rlc1sxXS5zdHlsZTthLmRpc3BsYXk9YS5kaXNwbGF5PT0ibm9uZSI/ImlubGluZS1ibG9jayI6Im5vbmUifSx0aGlzLnoyNzM9ZnVuY3Rpb24oYSl7aWYodil7dmFyIGI9YT9hOnYuZGlzcGxheSE9ImlubGluZS1ibG9jayI7di5kaXNwbGF5PWI/ImlubGluZS1ibG9jayI6Im5vbmUifX0sdGhpcy50b2dnbGVDb25zdHJhaW5QYW49ZnVuY3Rpb24oKXtaLmNvbnN0cmFpblBhbj0hWi5jb25zdHJhaW5QYW47aWYoWi5jb25zdHJhaW5QYW4pe3ZhciBiPXBhcnNlRmxvYXQoci5sZWZ0KSxjPXBhcnNlRmxvYXQoci50b3ApLGQ9Y1UoYixjKTtrLmxlZnQ9ZC54KyJweCIsay50b3A9ZC55KyJweCIsYS56Mjc0KCl9fSx0aGlzLnoxNzM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoInoxMFRJRVJTS0lQVEhSRVNIT0xEIikpLGY9Y0QoYi54LGIueSksZz1jRShmLngsZi55KSxoPWNCKGMsZCk7cmV0dXJuIGEuYWx0S2V5PyhkPjErZT9oPWNCKGMsMSk6Yz4wJiYoaD1jQihjLTEsMSkpLGgtWi5maXRaPGUmJihoPVouZml0WikpOmQ8MS1lP2g9Y0IoYywxKTpjPHotMSYmKGg9Y0IoYysxLDEpKSxuZXcgWi5VdGlscy5Qb2ludDNEKGcueCxnLnksaCl9LHRoaXMuejI2Nz1mdW5jdGlvbihhLGIpe3ZhciBjPS0oYS1aLmltYWdlWCksZD0tKGItWi5pbWFnZVkpLGU9YypaLmltYWdlWixmPWQqWi5pbWFnZVosZz1lK2JmLGg9ZitiaCxpPWNVKGcsaCk7ay5sZWZ0PWkueCsicHgiLGsudG9wPWkueSsicHgifSx0aGlzLnoxNDE9ZnVuY3Rpb24oYSl7aWYoIWEpdmFyIGE9bmV3IFouVXRpbHMuUG9pbnQocGFyc2VGbG9hdChrLmxlZnQpLHBhcnNlRmxvYXQoay50b3ApKTt2YXIgYj1hLngtYmYsYz1hLnktYmgsZD1iL1ouaW1hZ2VaLGU9Yy9aLmltYWdlWixmPVouaW1hZ2VYLWQsZz1aLmltYWdlWS1lO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChmLGcpfX0sWi56MTI0PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHUoKXt3aW5kb3cuY2xlYXJJbnRlcnZhbChxKSxxPW51bGw7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzVGV4dEJveCIpLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7YSYmKGEubm9kZVZhbHVlPSIiKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGN9ZnVuY3Rpb24gdyhhKXtjPWF9ZnVuY3Rpb24geChhLGIsYyxkKXthfHwoYT1aLnRvb2xiYXJWaXNpYmxlPjA/Wi50b29sYmFyQ3VycmVudFc6MCksYnx8KGI9Wi50b29sYmFyVmlzaWJsZT4wP2Y6MCksY3x8KGM9MCksZHx8KGQ9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MCk7dmFyIGU9Wi5Ub29sYmFyRGlzcGxheS5zdHlsZTtlLndpZHRoPWErInB4IixlLmhlaWdodD1iKyJweCIsZS5sZWZ0PWMrInB4IixlLnRvcD1kKyJweCIseShhLGIpfWZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1hLGQ9YixlPXRvb2xiYXJTa2luU2l6ZXNbMl0sZj10b29sYmFyU2tpblNpemVzWzNdLGc9dG9vbGJhclNraW5TaXplc1s0XSxoPXRvb2xiYXJTa2luU2l6ZXNbNV0saT10b29sYmFyU2tpblNpemVzWzZdLGo9dG9vbGJhclNraW5TaXplc1s3XSxrPXRvb2xiYXJTa2luU2l6ZXNbOF0sbD10b29sYmFyU2tpblNpemVzWzldLG09dG9vbGJhclNraW5TaXplc1sxMF0sbj10b29sYmFyU2tpblNpemVzWzExXSxvPXRvb2xiYXJTa2luU2l6ZXNbMTJdLHA9dG9vbGJhclNraW5TaXplc1sxM10scT10b29sYmFyU2tpblNpemVzWzE0XSx1PXRvb2xiYXJTa2luU2l6ZXNbMTVdLHY9MCx3PShkLWYpLzIrMSx4PShkLWgpLzIseT0oZC1qKS8yLHo9eSoxLjMsQT15KzQsQj15KzIsQz1aLmxvZ29WaXNpYmxlPT0xPzA6ay8yLEQ9Wi5sb2dvVmlzaWJsZT09MT8wOmsvMixFPWstKGktZyksRj1aLmZ1bGxQYWdlVmlzaWJsZT84OjcsRz0yMCxIPUYqaysyKkU7Wi5zbGlkZXJWaXNpYmxlJiYoSCs9cCkscj1zPXQ9ITE7dmFyIEk9Wi5sb2dvVmlzaWJsZT09MT9lKzI6MCxKPVoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTE/azowLEs9SStKLEw9SytHK0grRytxO0w+YyYmKHI9ITAsTC1wPmMmJihzPSEwLEwtcC1xPmMmJih0PSEwLEs9MCkscT0wKSxILT1wKTt2YXIgTT1LKyhjLXEtSy1IKS8yLE49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhY2tncm91bmQiKTtOLnN0eWxlLndpZHRoPWMrInB4IixOLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9Yys0MDArInB4IixOLnN0eWxlLmhlaWdodD1kKyJweCIsTi5maXJzdENoaWxkLnN0eWxlLmhlaWdodD1kKyJweCI7dmFyIE89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkNvbnRhaW5lciIpO08uc3R5bGUud2lkdGg9SCtHKjIrInB4IixPLnN0eWxlLmhlaWdodD1kKyJweCIsTy5zdHlsZS5sZWZ0PU0tRysicHgiO3ZhciBQPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25CYWNrZ3JvdW5kIik7Wi5VdGlscy56MjAzKFAscGFyc2VGbG9hdChPLnN0eWxlLndpZHRoKSxwYXJzZUZsb2F0KE8uc3R5bGUuaGVpZ2h0KSksUC5zdHlsZS5sZWZ0PSIwcHgiO3ZhciBRPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyTG9nbyIpO2lmKFEpe3ZhciBSPVEuc3R5bGU7aWYoUilpZighdCl7Ui5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejIwMyhRLGUsZiksUi5sZWZ0PXYrInB4IixSLnRvcD13KyJweCIsdis9ZSsyO3ZhciBTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2dvRGl2aWRlciIpO2lmKFMpe1ouVXRpbHMuejIwMyhTLGcsaCk7dmFyIFQ9Uy5zdHlsZTtULmxlZnQ9disicHgiLFQudG9wPXgrInB4In19ZWxzZSBSLmRpc3BsYXk9Im5vbmUifWlmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTEpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25NaW5pbWl6ZSIpLFY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkV4cGFuZCIpO2lmKFUmJlYpe3ZhciBXPVUuc3R5bGUsWD1WLnN0eWxlO1cmJlgmJih0PyhXLmRpc3BsYXk9Im5vbmUiLFguZGlzcGxheT0ibm9uZSIpOihXLmRpc3BsYXk9ImlubGluZS1ibG9jayIsWC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejEzOChVLGksaiksWi5VdGlscy56MTM4KFYsaSxqKSxXLmxlZnQ9ditDKyJweCIsVy50b3A9eisicHgiLFgubGVmdD12K0QrInB4IixYLnRvcD16KyJweCIpKX19dj1HO3ZhciBZPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25ab29tT3V0Iik7Wi5VdGlscy56MTM4KFksaSxqKTt2YXIgJD1ZLnN0eWxlOyQubGVmdD12KyJweCIsJC50b3A9eSsicHgiLHYrPWs7dmFyIF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWNrU2xpZGVyIiksYmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblNsaWRlciIpO2lmKF8mJmJhKXt2YXIgYmI9Xy5zdHlsZSxiYz1iYS5zdHlsZTtiYiYmYmMmJihyPyhiYi5kaXNwbGF5PSJub25lIixiYy5kaXNwbGF5PSJub25lIik6KGJiLmRpc3BsYXk9ImlubGluZS1ibG9jayIsYmMuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnoyMDMoXyxuLG8pLGJiLmxlZnQ9di0yKyJweCIsYmIudG9wPUErInB4IixaLlV0aWxzLnoxMzgoYmEsbCxtKSxiYy5sZWZ0PXBhcnNlRmxvYXQoYmIubGVmdCkrInB4IixiYy50b3A9QisicHgiLHYrPXApKX12YXIgYmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblpvb21JbiIpO1ouVXRpbHMuejEzOChiZCxpLGopO3ZhciBiZT1iZC5zdHlsZTtiZS5sZWZ0PXYrInB4IixiZS50b3A9eSsicHgiLHYrPWsrMTt2YXIgYmY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhbkRpdmlkZXIiKTtaLlV0aWxzLnoyMDMoYmYsZyxoKTt2YXIgYmc9YmYuc3R5bGU7YmcubGVmdD12KyJweCIsYmcudG9wPXgrInB4Iix2Kz1FO3ZhciBiaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uUGFuTGVmdCIpO1ouVXRpbHMuejEzOChiaCxpLGopO3ZhciBiaT1iaC5zdHlsZTtiaS5sZWZ0PXYrInB4IixiaS50b3A9eSsicHgiLHYrPWs7dmFyIGJqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5VcCIpO1ouVXRpbHMuejEzOChiaixpLGopO3ZhciBiaz1iai5zdHlsZTtiay5sZWZ0PXYrInB4Iixiay50b3A9eSsicHgiLHYrPWs7dmFyIGJsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5Eb3duIik7Wi5VdGlscy56MTM4KGJsLGksaik7dmFyIGJtPWJsLnN0eWxlO2JtLmxlZnQ9disicHgiLGJtLnRvcD15KyJweCIsdis9azt2YXIgYm49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblBhblJpZ2h0Iik7Wi5VdGlscy56MTM4KGJuLGksaik7dmFyIGJvPWJuLnN0eWxlO2JvLmxlZnQ9disicHgiLGJvLnRvcD15KyJweCIsdis9azt2YXIgYnA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblJlc2V0Iik7Wi5VdGlscy56MTM4KGJwLGksaik7dmFyIGJxPWJwLnN0eWxlO2JxLmxlZnQ9disicHgiLGJxLnRvcD15KyJweCIsdis9aysxO3ZhciBicj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnVsbFBhZ2VEaXZpZGVyIik7aWYoYnIpe1ouVXRpbHMuejIwMyhicixnLGgpO3ZhciBicz1ici5zdHlsZTticy5sZWZ0PXYrInB4Iixicy50b3A9eCsicHgiLHYrPUU7dmFyIGJ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25GdWxsUGFnZSIpO1ouVXRpbHMuejEzOChidCxpLGopO3ZhciBidT1idC5zdHlsZTtidS5sZWZ0PXYrInB4IixidS50b3A9eSsicHgifXZhciBidj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94Iik7aWYoYnYpe3ZhciBidz1idi5zdHlsZTtidyYmKHM/YncuZGlzcGxheT0ibm9uZSI6KGJ3LmRpc3BsYXk9ImlubGluZS1ibG9jayIsYncud2lkdGg9cSsicHgiLGJ3LmhlaWdodD11KyJweCIsYncubGVmdD1jLXBhcnNlRmxvYXQoTy5zdHlsZS5sZWZ0KS1wYXJzZUZsb2F0KGJ3LndpZHRoKSsicHgiLGJ3LnRvcD0oZC1wYXJzZUZsb2F0KGJ3LmhlaWdodCkpLzIrInB4IikpfX1mdW5jdGlvbiB6KGEpe1oudG9vbGJhclZpc2libGU8NCYmIVoubW9iaWxlRGV2aWNlP0EoYSk6QighYSl9ZnVuY3Rpb24gQShhKXtnJiYoYT9nLmRpc3BsYXk9ImlubGluZS1ibG9jayI6Zy5kaXNwbGF5PSJub25lIil9ZnVuY3Rpb24gQihhKXtpZihnKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQ29udGFpbmVyIiksYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFja2dyb3VuZCIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbk1pbmltaXplIiksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhwYW5kIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9nb0RpdmlkZXIiKSxoPTA7dHx8KGg9cGFyc2VGbG9hdChlLnN0eWxlLmxlZnQpK3BhcnNlRmxvYXQoZS5zdHlsZS53aWR0aCkrNCk7dmFyIGk9Wi50b29sYmFyQ3VycmVudFc7YT8oYi5zdHlsZS5kaXNwbGF5PSJub25lIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSxnLndpZHRoPWgrInB4IixjLnN0eWxlLndpZHRoPWgrInB4Iik6KGIuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIiksZC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGcud2lkdGg9aSsicHgiLGMuc3R5bGUud2lkdGg9aSsicHgiKX19ZnVuY3Rpb24gQyhhKXtpZihaLnNsaWRlclZpc2libGUpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmspe3ZhciBiPVoubWF4Wi1aLm1pblosYz0oYS1aLm1pblopL2I7dHJhY2tMPXBhcnNlRmxvYXQoaS5sZWZ0KSx0cmFja1I9cGFyc2VGbG9hdChpLmxlZnQpK3BhcnNlRmxvYXQoaS53aWR0aCktcGFyc2VGbG9hdChrLndpZHRoKTt2YXIgZD10cmFja1ItdHJhY2tMLGU9YypkK3RyYWNrTDtrLmxlZnQ9ZSsicHgifX19ZnVuY3Rpb24gRChiKXtofHwoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJhY2tTbGlkZXIiKSksaXx8KGk9aC5zdHlsZSk7aWYoaCYmaSl7dmFyIGMsZD1aLlV0aWxzLnoxNzQoaCk7Wi5tb2JpbGVEZXZpY2U/Yz1aLlV0aWxzLnoxODEoYikueC1kLng6Yz1iLmNsaWVudFgtZC54O3ZhciBlPUgoYywwLHBhcnNlRmxvYXQoaS53aWR0aCkpO2U8Wi5taW5aKy4xJiYoZT1aLm1pblopLGU+Wi5tYXhaLS4xJiYoZT1aLm1heFopLGEuejI0NShlKSxhLnoyNzQoKX19ZnVuY3Rpb24gRShhKXtuPSEwLGp8fChqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25TbGlkZXIiKSk7aWYoail7dmFyIGI9Wi5VdGlscy56MTgxKGEpO2oubW91c2VYUHJpb3I9Yi54LGoubW91c2VZUHJpb3I9Yi55fX1mdW5jdGlvbiBGKGIpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmomJmspe3RyYWNrTD1wYXJzZUZsb2F0KGkubGVmdCksdHJhY2tSPXBhcnNlRmxvYXQoaS5sZWZ0KStwYXJzZUZsb2F0KGkud2lkdGgpLXBhcnNlRmxvYXQoay53aWR0aCk7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpKyhwLngtai5tb3VzZVhQcmlvcik7Yzx0cmFja0w/Yz10cmFja0w6Yz50cmFja1I/Yz10cmFja1I6ai5tb3VzZVhQcmlvcj1wLngsay5sZWZ0PWMrInB4Ijt2YXIgZD1IKGMsdHJhY2tMLHRyYWNrUik7YS56MjQ1KGQpfX1mdW5jdGlvbiBHKCl7bj0hMSxhLnoyNzQoKX1mdW5jdGlvbiBIKGEsYixjKXt2YXIgZD1jLWIsZT0oYS1iKS9kLGY9Wi5tYXhaLVoubWluWixnPVoubWluWitmKmU7cmV0dXJuIGd9ZnVuY3Rpb24gSShhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpLGI9Wi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpO2lmKCFuJiZiKXt2YXIgYz1iLnBhcmVudE5vZGU7SyhjKX19ZnVuY3Rpb24gSihhKXtaLm1vYmlsZURldmljZSYmYS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhPVouVXRpbHMuZXZlbnQoYSksYj1aLlV0aWxzLnRhcmdldChhKSxjPVouVXRpbHMucmVsYXRlZFRhcmdldChhKTtpZihiKXt2YXIgZD1iLnBhcmVudE5vZGU7ZCYmKHRhcmdldFBhcmVudElEPWQuaWQpfWlmKGMpe3ZhciBlPWMucGFyZW50Tm9kZTtlJiYocmVsYXRlZFRhcmdldFBhcmVudElEPWUuaWQpfWlmKCFufHxhLnR5cGU9PSJtb3VzZXVwInx8YS50eXBlPT0idG91Y2hlbmQifHxhLnR5cGU9PSJ0b3VjaGNhbmNlbCIpTigpLGImJiFaLlV0aWxzLmlzUmlnaHRNb3VzZUJ1dHRvbihhKSYmKHRhcmdldFBhcmVudElEJiZ0YXJnZXRQYXJlbnRJRCE9InRyYWNrU2xpZGVyIiYmYS50eXBlIT0ibW91c2Vtb3ZlIiYmKE8oYSksUChhKSksUShhKSl9ZnVuY3Rpb24gSyhiKXthJiZhLnoyOTNBbGxTdG9wKCksYi5pZCYmYi5pZC5pbmRleE9mKCJidXR0b24iKSE9LTE/KEwoYiksTShiKSk6Yi5pZCYmYi5pZC5pbmRleE9mKCJiYWNrZ3JvdW5kIikhPS0xJiZOKCl9ZnVuY3Rpb24gTChhKXtaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGEsIm1vdXNlb3V0IixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoYSwibW91c2VvdmVyIixKKX1mdW5jdGlvbiBNKGEpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ1VwSUQpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5faW1nT3ZlcklEKSxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ0Rvd25JRCk7YiYmKGIuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLGMmJihjLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGQmJihkLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpfWZ1bmN0aW9uIE4oKXt2YXIgYT1aLlRvb2xiYXJEaXNwbGF5LmNoaWxkTm9kZXMsYj1udWxsO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7Yj1hW2NdO2lmKGIuaWQmJmIuaWQuaW5kZXhPZigiYnV0dG9uIikhPS0xKWlmKGIuaWQhPSJidXR0b25Db250YWluZXIiKUwoYiksTShiKTtlbHNle3ZhciBlPWIuY2hpbGROb2RlcyxmPW51bGw7Zm9yKHZhciBnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXSxmLmlkJiZmLmlkLmluZGV4T2YoImJ1dHRvbiIpIT0tMSYmKEwoZiksTShmKSl9fX1mdW5jdGlvbiBPKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPWIucGFyZW50Tm9kZTtjJiYoWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaHN0YXJ0IixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywidG91Y2hlbmQiLEopLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaGNhbmNlbCIsSikpOihaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2VvdmVyIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGMsIm1vdXNlb3V0IixKKSkpfX1mdW5jdGlvbiBQKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPVouVXRpbHMudGFyZ2V0KGEpLnBhcmVudE5vZGU7aWYoYylpZighYy5faW1nVXBJRClLKGMpO2Vsc2V7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nVXBJRCksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjLl9pbWdPdmVySUQpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nRG93bklEKTtpZihkJiZlJiZmKXt2YXIgZz1kLnN0eWxlLGg9ZS5zdHlsZSxpPWYuc3R5bGU7Zy52aXNpYmlsaXR5PSJoaWRkZW4iLGgudmlzaWJpbGl0eT0iaGlkZGVuIixpLnZpc2liaWxpdHk9ImhpZGRlbiI7c3dpdGNoKGEudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOmgudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZXVwIjpoLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UibW91c2VvdXQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaHN0YXJ0IjppLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UidG91Y2hlbmQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIn19fX19ZnVuY3Rpb24gUShjKXt2YXIgZD1aLlV0aWxzLnRhcmdldChjKS5wYXJlbnROb2RlO2lmKGQpe3ZhciBlPWQuaWQ7c3dpdGNoKGMudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZWRvd24iLEopO2JyZWFrO2Nhc2UibW91c2Vkb3duIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwibW91c2V1cCIsSik7aWYoYSlzd2l0Y2goZSl7Y2FzZSJidXR0b25NaW5pbWl6ZSI6Yi56MjE1KCEwKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKTticmVhaztjYXNlImJ1dHRvbkV4cGFuZCI6Yi56MjE1KCExKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKTticmVhaztjYXNlImJ1dHRvblpvb21PdXQiOmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSJidXR0b25TbGlkZXIiOkUoYyksUihjKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsUiksb3x8KG89d2luZG93LnNldEludGVydmFsKEYsbSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSik7YnJlYWs7Y2FzZSJ0cmFja1NsaWRlciI6RChjKTticmVhaztjYXNlImJ1dHRvblpvb21JbiI6YS56b29tKCJpbiIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuTGVmdCI6YS5wYW4oImxlZnQiKTticmVhaztjYXNlImJ1dHRvblBhblVwIjphLnBhbigidXAiKTticmVhaztjYXNlImJ1dHRvblBhbkRvd24iOmEucGFuKCJkb3duIik7YnJlYWs7Y2FzZSJidXR0b25QYW5SaWdodCI6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSJidXR0b25SZXNldCI6YS5yZXNldCgpfWJyZWFrO2Nhc2UibW91c2V1cCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsIm1vdXNlZG93biIsSiksYSYmKGU9PSJidXR0b25TbGlkZXIifHxuPyhvJiYod2luZG93LmNsZWFySW50ZXJ2YWwobyksbz1udWxsKSxHKCksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLFIpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSiksTigpKTplPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpO2JyZWFrO2Nhc2UibW91c2VvdXQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZW92ZXIiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTooZT09ImJ1dHRvblBhblVwInx8ZT09ImJ1dHRvblBhbkRvd24iKSYmYS5wYW4oInZlcnRpY2FsU3RvcCIpKTticmVhaztjYXNlInRvdWNoc3RhcnQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJ0b3VjaGVuZCIsSiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoY2FuY2VsIixKKTtpZihhKXN3aXRjaChlKXtjYXNlImJ1dHRvbk1pbmltaXplIjpiLnoyMTUoITApLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2JyZWFrO2Nhc2UiYnV0dG9uRXhwYW5kIjpiLnoyMTUoITEpLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApO2JyZWFrO2Nhc2UiYnV0dG9uWm9vbU91dCI6YS56b29tKCJvdXQiKTticmVhaztjYXNlImJ1dHRvblNsaWRlciI6RShjKSxTKGMpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSxvfHwobz13aW5kb3cuc2V0SW50ZXJ2YWwoRixtKSksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoZW5kIixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hjYW5jZWwiLEopO2JyZWFrO2Nhc2UidHJhY2tTbGlkZXIiOkQoYyk7YnJlYWs7Y2FzZSJidXR0b25ab29tSW4iOmEuem9vbSgiaW4iKTticmVhaztjYXNlImJ1dHRvblBhbkxlZnQiOmEucGFuKCJsZWZ0Iik7YnJlYWs7Y2FzZSJidXR0b25QYW5VcCI6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSJidXR0b25QYW5Eb3duIjphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuUmlnaHQiOmEucGFuKCJyaWdodCIpO2JyZWFrO2Nhc2UiYnV0dG9uUmVzZXQiOmEucmVzZXQoKX1icmVhaztjYXNlInRvdWNoZW5kIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hzdGFydCIsSiksYSYmKGU9PSJidXR0b25ab29tT3V0Inx8ZT09ImJ1dHRvblpvb21JbiI/KGEuem9vbSgic3RvcCIpLFouZGVidWcmJmU9PSJidXR0b25ab29tT3V0IiYmYy5hbHRLZXkmJlouVXRpbHMuejI1MygpKTplPT0iYnV0dG9uU2xpZGVyIj8obyYmKHdpbmRvdy5jbGVhckludGVydmFsKG8pLG89bnVsbCksRygpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSk6ZT09ImJ1dHRvblBhbkxlZnQifHxlPT0iYnV0dG9uUGFuUmlnaHQiP2EucGFuKCJob3Jpem9udGFsU3RvcCIpOmU9PSJidXR0b25QYW5VcCJ8fGU9PSJidXR0b25QYW5Eb3duIj9hLnBhbigidmVydGljYWxTdG9wIik6ZT09ImJ1dHRvbkZ1bGxQYWdlIiYmYS50b2dnbGVGdWxsUGFnZVZpZXcoKSk7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoc3RhcnQiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iPyhhLnpvb20oInN0b3AiKSxaLmRlYnVnJiZlPT0iYnV0dG9uWm9vbU91dCImJmMuYWx0S2V5JiZaLlV0aWxzLnoyNTMoKSk6ZT09ImJ1dHRvblNsaWRlciI/KG8mJih3aW5kb3cuY2xlYXJJbnRlcnZhbChvKSxvPW51bGwpLEcoKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsUykpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpfX19ZnVuY3Rpb24gUihhKXtwPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpfWZ1bmN0aW9uIFMoYSl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0O3A9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKX19dmFyIGI9dGhpcyxjPSExLGQ9bmV3IFouejEwMTtaLnNraW5QYXRoPVouVXRpbHMuejI0MyhaLnNraW5QYXRoKTt2YXIgZT1aLnNraW5QYXRoKyIvIjtkLmxvYWRYTUwoWi5za2luUGF0aCsiLyIrWi5VdGlscy56MTg1KCJ6NTUiKSk7dmFyIGYsZyxoLGksaixrLGw9W10sbT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1NyIpLDEwKSxuPSExLG89bnVsbCxwPW51bGwscT1udWxsLHIscyx0O3RoaXMuejIwNT1mdW5jdGlvbihhLGIpe1ouVG9vbGJhckRpc3BsYXk9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUb29sYmFyRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIiwiMXB4IiwiMXB4IiwiMHB4IiwiMXB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJkZWZhdWx0IiksZz1aLlRvb2xiYXJEaXNwbGF5LnN0eWxlO3ZhciBjPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChjLmVsbXQpLHRvb2xiYXJTa2luU2l6ZXM9YTtpZihaLmxvZ29WaXNpYmxlKXt2YXIgZDtpZighWi5VdGlscy5pc1N0clZhbChaLmxvZ29DdXN0b21QYXRoKSlkPW5ldyBaLlV0aWxzLkdyYXBoaWMoInRvb2xiYXJMb2dvIixlLGJbMV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO2Vsc2V7dmFyIGg9Wi5VdGlscy56MTQwKFoubG9nb0N1c3RvbVBhdGgpO2Q9bmV3IFouVXRpbHMuR3JhcGhpYygidG9vbGJhckxvZ28iLGgsbnVsbCwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iil9Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChkLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGU9PTB8fFoudG9vbGJhclZpc2libGU9PTEpe3ZhciBpPW5ldyBaLlV0aWxzLkdyYXBoaWMoImxvZ29EaXZpZGVyIixlLGJbMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQoaS5lbG10KX19dmFyIGo9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJidXR0b25Db250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIsImRlZmF1bHQiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKGopLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihqLCJ0b3VjaHN0YXJ0IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlb3ZlciIsSSkpO3ZhciBrPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJ1dHRvbkJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChrLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTF8fFoubW9iaWxlRGV2aWNlKXt2YXIgbD1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbk1pbmltaXplIixudWxsLGUsYlszXSxiWzRdLGJbNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwNyIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQobC5lbG10KTt2YXIgbT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4cGFuZCIsbnVsbCxlLGJbNl0sYls3XSxiWzhdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDUiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKG0uZWxtdCl9dmFyIG49bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25ab29tT3V0IixudWxsLGUsYls5XSxiWzEwXSxiWzExXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4IiwibW91c2VvdmVyIixKLCJ6MTIwIik7ai5hcHBlbmRDaGlsZChuLmVsbXQpO2lmKFouc2xpZGVyVmlzaWJsZSl7dmFyIG89bmV3IFouVXRpbHMuR3JhcGhpYygidHJhY2tTbGlkZXIiLGUsYlsxMl0sIjFweCIsIjFweCIsIjBweCIsIjBweCIpO2ouYXBwZW5kQ2hpbGQoby5lbG10KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoby5lbG10LCJtb3VzZWRvd24iLEopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLmVsbXQsInRvdWNoc3RhcnQiLEopO3ZhciBwPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uU2xpZGVyIixudWxsLGUsYlsxNF0sYlsxNV0sYlsxNl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExNCIpO2ouYXBwZW5kQ2hpbGQocC5lbG10KX12YXIgcT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblpvb21JbiIsbnVsbCxlLGJbMTddLGJbMThdLGJbMTldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTkiKTtqLmFwcGVuZENoaWxkKHEuZWxtdCk7dmFyIHI9bmV3IFouVXRpbHMuR3JhcGhpYygicGFuRGl2aWRlciIsZSxiWzIwXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iik7ai5hcHBlbmRDaGlsZChyLmVsbXQpO3ZhciBzPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uUGFuTGVmdCIsbnVsbCxlLGJbMjFdLGJbMjJdLGJbMjNdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDkiKTtqLmFwcGVuZENoaWxkKHMuZWxtdCk7dmFyIHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5VcCIsbnVsbCxlLGJbMjRdLGJbMjVdLGJbMjZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTEiKTtqLmFwcGVuZENoaWxkKHQuZWxtdCk7dmFyIHU9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5Eb3duIixudWxsLGUsYlsyN10sYlsyOF0sYlsyOV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwOCIpO2ouYXBwZW5kQ2hpbGQodS5lbG10KTt2YXIgdj1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblBhblJpZ2h0IixudWxsLGUsYlszMF0sYlszMV0sYlszMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMCIpO2ouYXBwZW5kQ2hpbGQodi5lbG10KTt2YXIgeT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblJlc2V0IixudWxsLGUsYlszM10sYlszNF0sYlszNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMiIpO2ouYXBwZW5kQ2hpbGQoeS5lbG10KTtpZihaLmZ1bGxQYWdlVmlzaWJsZSl7dmFyIEE9bmV3IFouVXRpbHMuR3JhcGhpYygiZnVsbFBhZ2VEaXZpZGVyIixlLGJbMzZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiKTtqLmFwcGVuZENoaWxkKEEuZWxtdCk7dmFyIEI9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25GdWxsUGFnZSIsbnVsbCxlLGJbMzddLGJbMzhdLGJbMzldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTgiKTtqLmFwcGVuZENoaWxkKEIuZWxtdCl9aWYoWi5wcm9ncmVzc1Zpc2libGUpe3ZhciBEPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwicHJvZ3Jlc3NUZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLEU9dG9vbGJhclNraW5TaXplc1sxNl0rInB4IjtqLmFwcGVuZENoaWxkKEQpO3ZhciBGPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFouVXRpbHMuejE4NSgiejUyIikpO0QuYXBwZW5kQ2hpbGQoWi5VdGlscy5jcmVhdGVDZW50ZXJlZEVsZW1lbnQoRikpLFouVXRpbHMuejI1MShGLCJibGFjayIsInZlcmRhbmEiLEUsIm5vbmUiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCIxZW0iLCJsZWZ0Iiwibm9uZSIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihELCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5kaXNhYmxlVGV4dEludGVyYWN0aW9uKEYpfVouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRvb2xiYXJEaXNwbGF5KSxaLnRvb2xiYXJXPXRvb2xiYXJTa2luU2l6ZXNbMF0sWi50b29sYmFyQ3VycmVudFc9Wi50b29sYmFyVz09LTE/Wi52aWV3ZXJXOloudG9vbGJhclcsWi50b29sYmFySD1mPXRvb2xiYXJTa2luU2l6ZXNbMV07dmFyIEc9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MDt4KFoudG9vbGJhckN1cnJlbnRXLFoudG9vbGJhckgsMCxHKTtpZihaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSl7dmFyIEg9Wi5WaWV3cG9ydC56MTg5QXNab29tKCk7QyhIKX16KFoudG9vbGJhclZpc2libGU9PTF8fFoudG9vbGJhclZpc2libGU9PTJ8fFoudG9vbGJhclZpc2libGU9PTQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlRvb2xiYXJEaXNwbGF5LCJtb3VzZW92ZXIiLFouVXRpbHMuc3RvcFByb3BhZ2F0aW9uKSx3KCEwKX0sdGhpcy56MTgwPWZ1bmN0aW9uKCl7cmV0dXJuIHYoKX0sdGhpcy5zZXRTaXplQW5kUG9zaXRpb249ZnVuY3Rpb24oYSxiLGMsZCl7eChhLGIsYyxkKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe3ooYSl9LHRoaXMuc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihhKXtBKGEpfSx0aGlzLnoyMTU9ZnVuY3Rpb24oYSl7QihhKX0sdGhpcy5zaG93UHJvZ3Jlc3M9ZnVuY3Rpb24oYSxiKXtpZihaLnByb2dyZXNzVmlzaWJsZSl7cSYmd2luZG93LmNsZWFySW50ZXJ2YWwocSk7dmFyIGMsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94IikuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDtkJiYoYT09MHx8Yj09MD8oZC5ub2RlVmFsdWU9ImxsbGxsbGxsbGwiLHE9d2luZG93LnNldEludGVydmFsKHUscGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NTEiKSksMTApKTooYz1NYXRoLnJvdW5kKDEwMC1iL2EqMTAwKSxkLm5vZGVWYWx1ZT0ibCIubXVsdGlwbHkoTWF0aC5yb3VuZChjLzEwKSkpKX19LHRoaXMuejI2Nj1mdW5jdGlvbihhKXtDKGEpfX0sWi56MTIzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHgoYSl7Wi5OYXZpZ2F0b3JEaXNwbGF5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiTmF2aWdhdG9yRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixlKyJweCIsZisicHgiLGcrInB4IixoKyJweCIsInNvbGlkIiwiMXB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLG89Wi5OYXZpZ2F0b3JEaXNwbGF5LHA9by5zdHlsZTt2YXIgYj1aLlV0aWxzLnoxODUoInozNiIpLGM9Wi5VdGlscy56MTg1KCJ6MzZOT0FMUEhBIiksZD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckJhY2tncm91bmQiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsicHgiLGYrInB4IiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsYiwiMHB4IiwiMHB4Iik7Wi5VdGlscy5zZXRPcGFjaXR5KGQsbCxjKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoZCkscT1kLHI9cS5zdHlsZTt2YXIgaj1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckltYWdlQ29udGFpbmVyIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGUrInB4IixmKyJweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChuKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoaikscz1qLHQ9cy5zdHlsZSx1PW47dmFyIGs9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJuYXZpZ2F0b3JSZWN0YW5nbGUiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsxKyJweCIsZisxKyJweCIsZysicHgiLGgrInB4Iiwic29saWQiLCIxcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ay5zdHlsZS5ib3JkZXJDb2xvcj1aLlV0aWxzLnoxODUoIno0MSIpLFouTmF2aWdhdG9yRGlzcGxheS5hcHBlbmRDaGlsZChrKSx2PWssdz12LnN0eWxlLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLk5hdmlnYXRvckRpc3BsYXkpLEMoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCksWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaHN0YXJ0IixQKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2htb3ZlIixRKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2hlbmQiLFIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaGNhbmNlbCIsUykpOihaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2VvdmVyIixaLlV0aWxzLnN0b3BQcm9wYWdhdGlvbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKG8sIm1vdXNlZG93biIsTSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLEIoITApLEcoKX1mdW5jdGlvbiB5KGEpe0MoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCl9ZnVuY3Rpb24geigpe2lmKEEoKSl7ZCYmKHdpbmRvdy5jbGVhckludGVydmFsKGQpLGQ9bnVsbCk7aWYoIW98fCFwfHwhcXx8IXJ8fCFzfHwhdHx8IXV8fCF2fHwhdylvPVouTmF2aWdhdG9yRGlzcGxheSxwPW8uc3R5bGUscT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1swXSxyPXEuc3R5bGUscz1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXSx0PXMuc3R5bGUsdT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXS5maXJzdENoaWxkLHY9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMl0sdz12LnN0eWxlfX1mdW5jdGlvbiBBKCl7cmV0dXJuIGN9ZnVuY3Rpb24gQihhKXtjPWF9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2F8fChhPVoubmF2aWdhdG9yVyksYnx8KGI9Wi5uYXZpZ2F0b3JIKSxjfHwoYz0wKSxkfHwoZD0wKSxvfHwobz1aLk5hdmlnYXRvckRpc3BsYXkpLHB8fChwPW8uc3R5bGUpLHU9by5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQ7aWYobyYmcCYmdSl7aWYoZSl7dmFyIGY9MSxnPTE7ZT09MD9nPVoudmlld2VyVy9aLnZpZXdlckg6Zz11LndpZHRoL3UuaGVpZ2h0LGY+MT8oYj1hLGIvPWcpOihhPWIsYSo9Zyl9cC53aWR0aD1hKyJweCIscC5oZWlnaHQ9YisicHgiLHAubGVmdD1jLTErInB4IixwLnRvcD1kLTErInB4IixEKGEsYil9fWZ1bmN0aW9uIEQoYSxiKXtyfHwocj1aLk5hdmlnYXRvckRpc3BsYXkuZmlyc3RDaGlsZC5zdHlsZSksdHx8KHQ9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMV0uc3R5bGUpLHV8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpLHImJnQmJnUmJihyLndpZHRoPWErInB4IixyLmhlaWdodD1iKyJweCIsRShhLGIsdS53aWR0aCx1LmhlaWdodCksdC53aWR0aD11LndpZHRoKyJweCIsdC5oZWlnaHQ9dS5oZWlnaHQrInB4Iix0LmxlZnQ9KGEtcGFyc2VGbG9hdCh0LndpZHRoKSkvMisicHgiLHQudG9wPShiLXBhcnNlRmxvYXQodC5oZWlnaHQpKS8yKyJweCIsRygpKX1mdW5jdGlvbiBFKGEsYixjLGQpe3V8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpO2lmKHUpe3ZhciBlPWMvZCxmPWEvYyxnPWIvZCxoPTAsaT0wO2Y8PWc/KGM9YSxkPWEvZSxpPShiLWQqKGEvYykpLzIpOmc8ZiYmKGQ9YixjPWIqZSxoPShhLWMqKGIvZCkpLzIpLHUud2lkdGg9Yyx1LmhlaWdodD1kfX1mdW5jdGlvbiBGKCl7cHx8KHA9Wi5OYXZpZ2F0b3JEaXNwbGF5LnN0eWxlKSxwJiYocC56SW5kZXg9cC56SW5kZXgrMTAwKX1mdW5jdGlvbiBHKCl7aWYoWi5WaWV3cG9ydCYmWi5WaWV3cG9ydC56MTgwKCkpe0koKTt2YXIgYT1aLlZpZXdwb3J0LnoxNDEoKTtKKGEpfX1mdW5jdGlvbiBIKGEpe3B8fChwPVouTmF2aWdhdG9yRGlzcGxheS5zdHlsZSkscCYmKGE/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuZGlzcGxheT0ibm9uZSIpfWZ1bmN0aW9uIEkoKXtpZih1JiZ3KXt2YXIgYT11LndpZHRoL1ouaW1hZ2VXLGI9dS5oZWlnaHQvWi5pbWFnZUgsYz1aLlZpZXdwb3J0LnoxODlBc1pvb20oKSxkPVoudmlld2VyVyphL2MsZT1aLnZpZXdlckgqYi9jO3cud2lkdGg9ZCsicHgiLHcuaGVpZ2h0PWUrInB4In19ZnVuY3Rpb24gSihhKXtpZih1JiZ3JiZ0KXt2YXIgYj11LndpZHRoL1ouaW1hZ2VXLGM9dS5oZWlnaHQvWi5pbWFnZUgsZD1hLngqYixlPWEueSpjLGY9ZC1wYXJzZUZsb2F0KHcud2lkdGgpLzIsZz1lLXBhcnNlRmxvYXQody5oZWlnaHQpLzI7dy5sZWZ0PWYrcGFyc2VGbG9hdCh0LmxlZnQpKyJweCIsdy50b3A9ZytwYXJzZUZsb2F0KHQudG9wKSsicHgifX1mdW5jdGlvbiBLKCl7aWYodyYmdCYmdSl7dmFyIGE9cGFyc2VGbG9hdCh3LmxlZnQpLXBhcnNlRmxvYXQodC5sZWZ0KSxiPXBhcnNlRmxvYXQody50b3ApLXBhcnNlRmxvYXQodC50b3ApLGM9YSsocGFyc2VGbG9hdCh3LndpZHRoKS0xKS8yLGQ9YisocGFyc2VGbG9hdCh3LmhlaWdodCktMSkvMixlPVouaW1hZ2VXL3Uud2lkdGgsZj1aLmltYWdlSC91LmhlaWdodCxnPWMqZSxoPWQqZjtaLlZpZXdwb3J0LnoyNjcoZyxoKX19ZnVuY3Rpb24gTCgpe1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4OCIpKX1mdW5jdGlvbiBNKGEpe2lmKG8mJnYmJncpe3ZhciBhPVouVXRpbHMuZXZlbnQoYSk7di5tb3VzZVhQcmlvcj1hLmNsaWVudFgsdi5tb3VzZVlQcmlvcj1hLmNsaWVudFksemFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChhLmNsaWVudFgsYS5jbGllbnRZKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vtb3ZlIixOKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2V1cCIsTyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixPKX19ZnVuY3Rpb24gTihhKXtpZih2JiZ3KXt2YXIgYj1wYXJzZUZsb2F0KHcubGVmdCksYz1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWIrKGEuY2xpZW50WC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWMrKGEuY2xpZW50WS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9YS5jbGllbnRYLHYubW91c2VZUHJpb3I9YS5jbGllbnRZLEsoKSwhMX19ZnVuY3Rpb24gTyhhKXtpZihvJiZ2JiZ3KXtkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNlbW92ZSIsTiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNldXAiLE8pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsTyk7dmFyIGE9Wi5VdGlscy5ldmVudChhKSxiPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpLGM9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1iLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWIueSwyKSk7aWYoYzw0KXt2YXIgZD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9YS5jbGllbnRYLWQueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1hLmNsaWVudFktZC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFAoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKG8mJnYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7emFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChkLngsZC55KSx2Lm1vdXNlWFByaW9yPWQueCx2Lm1vdXNlWVByaW9yPWQueSx6YXB0dkRyYWdQdFN0YXJ0PW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX19ZnVuY3Rpb24gUShhKXthLnByZXZlbnREZWZhdWx0KCk7aWYoIVoubW91c2VQYW4pcmV0dXJuO2lmKHYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSksZT1wYXJzZUZsb2F0KHcubGVmdCksZj1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWUrKGQueC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWYrKGQueS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9ZC54LHYubW91c2VZUHJpb3I9ZC55LEsoKSwhMX19cmV0dXJuITF9ZnVuY3Rpb24gUihhKXtpZihvJiZ2JiZ3KXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYil7dmFyIGM9Yi50YXJnZXQsZD1uZXcgWi5VdGlscy5Qb2ludChiLnBhZ2VYLGIucGFnZVkpLGU9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksZj1NYXRoLnNxcnQoTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC54LWUueCwyKStNYXRoLnBvdyh6YXB0dkRyYWdQdFN0YXJ0LnktZS55LDIpKSxnPVoubW9iaWxlRGV2aWNlPzY6MztpZihmPGcpe3ZhciBoPVouVXRpbHMuejE3NChaLk5hdmlnYXRvckRpc3BsYXkpO3cubGVmdD1kLngtaC54LXBhcnNlRmxvYXQody53aWR0aCkvMisicHgiLHcudG9wPWQueS1oLnktcGFyc2VGbG9hdCh3LmhlaWdodCkvMisicHgifX1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFMoYSl7aWYobyYmdiYmdyl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0LGQ9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKSxlPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpLGY9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1lLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWUueSwyKSksZz1aLm1vYmlsZURldmljZT82OjM7aWYoZjxnKXt2YXIgaD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9ZC54LWgueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1kLnktaC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In19SygpLFouVmlld3BvcnQuejI3NCgpfX12YXIgYj10aGlzLGM9ITEsZCxlPVoubmF2aWdhdG9yVyxmPVoubmF2aWdhdG9ySCxnPVoubmF2aWdhdG9yTC0xLGg9Wi5uYXZpZ2F0b3JULTEsaT1aLm5hdmlnYXRvckZpdCxqLGs9bnVsbCxsPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6MzUiKSksbT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLG49bmV3IEltYWdlO24ub25sb2FkPXgsbi5vbmVycm9yPUwsbi5zcmM9bTt2YXIgbyxwLHEscixzLHQsdSx2LHc7dGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7bT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLHMucmVtb3ZlQ2hpbGQobiksbj1udWxsLG49bmV3IEltYWdlLHMuYXBwZW5kQ2hpbGQobiksbi5vbmxvYWQ9eSxuLm9uZXJyb3I9TCxuLnNyYz1tfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gQSgpfSx0aGlzLnNldFNpemVBbmRQb3NpdGlvbj1mdW5jdGlvbihhLGIsYyxkLGUpe2V8fChlPWkpLEMoYSxiLGMsZCxlKX0sdGhpcy5zZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKGEpe0goYSl9LHRoaXMuejI2OD1mdW5jdGlvbigpe0coKX0sdGhpcy56MjYzUmVjdGFuZ2xlRGltZW5zaW9ucz1mdW5jdGlvbigpe0koKX0sdGhpcy56MjYzUmVjdGFuZ2xlUG9zaXRpb249ZnVuY3Rpb24oYSl7SihhKX0sdGhpcy56Mjc3PWZ1bmN0aW9uKCl7QSgpP3ooKTpkPXdpbmRvdy5zZXRJbnRlcnZhbCh6LDMwMCl9fSxaLnoxMDE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPW51bGwsZD10eXBlb2YgYj09ImZ1bmN0aW9uIjtpZihkKXZhciBlPWIsYj1mdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KFouVXRpbHMuY3JlYXRlQ2FsbGJhY2sobnVsbCxlLGMpLDEpfTtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl7dmFyIGY9WyJNc3htbDIuWE1MSFRUUCIsIk1zeG1sMy5YTUxIVFRQIiwiTWljcm9zb2Z0LlhNTEhUVFAiXTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl0cnl7Yz1uZXcgQWN0aXZlWE9iamVjdChmW2ddKTticmVha31jYXRjaChoKXtjb250aW51ZX19ZWxzZSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJihjPW5ldyBYTUxIdHRwUmVxdWVzdCk7Y3x8Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejk5IikpLGQmJihjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09NCYmKGMub25yZWFkeXN0YXRlY2hhbmdlPW5ldyBGdW5jdGlvbixiKCkpfSk7dHJ5e2Mub3BlbigiR0VUIixhLGQpLGMuc2VuZChudWxsKX1jYXRjaChoKXthLmluZGV4T2YoIkltYWdlUHJvcGVydGllcy54bWwiKSE9LTE/Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg3LUlNQUdFWE1MIikpOmEuaW5kZXhPZigic2tpbkZpbGVzLnhtbCIpIT0tMT9aLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODctVE9PTEJBUlhNTCIpKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODciKSksYy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxjPW51bGx9cmV0dXJuIGQ/bnVsbDpjfWZ1bmN0aW9uIGQoYSl7aWYoYSl7aWYoIWEpWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg5IikpO2Vsc2UgaWYoYS5zdGF0dXMhPT0yMDAmJmEuc3RhdHVzIT09MCl7dmFyIGI9YS5zdGF0dXMsYz1iPT00MDQ/Ik5vdCBGb3VuZCI6YS5zdGF0dXNUZXh0O1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MCIpK2IrIiAtICIrYyl9dmFyIGQ9bnVsbDthLnJlc3BvbnNlWE1MJiZhLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudD9kPWEucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQmJihkPVouVXRpbHMuejE1OChhLnJlc3BvbnNlVGV4dCkpLGUoZCl9ZWxzZSBaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODQiKSl9ZnVuY3Rpb24gZShhKXtpZihhJiZhLmRvY3VtZW50RWxlbWVudCl7dmFyIGI9YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZTtiPT0iQ09QWVJJR0hUIj9mKCJjb3B5cmlnaHQiLGEpOmI9PSJJTUFHRV9QUk9QRVJUSUVTIj9mKCJpbWFnZSIsYSk6Yj09IlNLSU5EQVRBIj9mKCJza2luIixhKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6MTAwIikpfWVsc2UgWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejEwMCIpKX1mdW5jdGlvbiBmKGEsYil7aWYoYT09ImNvcHlyaWdodCIpe3ZhciBjPWIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiU1RBVEVNRU5UVEVYVCIpLGQ9Yi5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJERUNMSU5FRFRFWFQiKTtaLlV0aWxzLmlzU3RyVmFsKGMpP1ouVXRpbHMuejI1MighMCxjLGQpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJpbWFnZSIpe3ZhciBlPXBhcnNlSW50KGIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiV0lEVEgiKSwxMCksZj1wYXJzZUludChiLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIkhFSUdIVCIpLDEwKTshaXNOYU4oZSkmJmU+MCYmIWlzTmFOKGYpJiZmPjA/Wi5WaWV3cG9ydCYmKFouVmlld3BvcnQuejE4MCgpP1ouVmlld3BvcnQucmV6MjA2KGUsZik6Wi5WaWV3cG9ydC56MjA2KGUsZikpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJza2luIil7Wi5za2luTW9kZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOTU9ERSIpLm5vZGVWYWx1ZTt2YXIgZyxoO1ouc2tpbk1vZGU9PTF8fFouc2tpbk1vZGU9PTAmJiFaLm1vYmlsZURldmljZT8oZz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJGT0xERVJTVEFOREFSRCIpLm5vZGVWYWx1ZSxoPSJTSVpFU1NUQU5EQVJEIik6KGc9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU0VUVVAiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRk9MREVSTEFSR0UiKS5ub2RlVmFsdWUsaD0iU0laRVNMQVJHRSIpO3ZhciBpPVtdO2kucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlRPT0xCQVJXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiVE9PTEJBUkgiKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJMT0dPVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkxPR09IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRElWSURFUlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJESVZJREVSSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiQlVUVE9OU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNMSURFUkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTTElERVJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tIIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTRk9OVFNJWkUiKS5ub2RlVmFsdWUpKTt2YXIgaj1bXSxrPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZJTEVTIilbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNLSU4wIikubm9kZVZhbHVlLGw9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRklMRVMiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0tJTjM5Iikubm9kZVZhbHVlO2lmKFouVXRpbHMuaXNTdHJWYWwoaykmJlouVXRpbHMuaXNTdHJWYWwobCkpe3ZhciBtPSExO2Zvcih2YXIgbj0wO248NDA7bisrKXt2YXIgbz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGSUxFUyIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOIituKS5ub2RlVmFsdWU7Wi5VdGlscy5pc1N0clZhbChvKT9qW25dPWcrIi8iK286KGpbbl09Im51bGwiLG09ITApfW0mJlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIkVSUk9SX1NLSU5TWE1MTUlTU0lOR05BTUVTIikpLFouVG9vbGJhciYmWi5Ub29sYmFyLnoyMDUoaSxqKX1lbHNlIFouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MSIpKX19ZnVuY3Rpb24gZyhhLGMsZCl7Yi0tO2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXRyeXthKGQpfWNhdGNoKGUpe1ouVXRpbHMuejI1NShlLm5hbWUrWi5VdGlscy56MTg1KCJ6ODMiKStjKyIgIitlLm1lc3NhZ2UpfX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gZShlKXtjLm9ubG9hZD1udWxsLGMub25hYm9ydD1udWxsLGMub25lcnJvcj1udWxsLGQmJndpbmRvdy5jbGVhclRpbWVvdXQoZCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtiKGEsZT9jOm51bGwpfSwxKX12YXIgYz1udWxsLGQ9bnVsbDt0aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7Yz1uZXcgSW1hZ2U7dmFyIGI9ZnVuY3Rpb24oKXtlKCEwKX0sZj1mdW5jdGlvbigpe2UoITEpfSxnPWZ1bmN0aW9uKCl7ZSghMSl9O2Mub25sb2FkPWIsYy5vbmFib3J0PWYsYy5vbmVycm9yPWYsZD13aW5kb3cuc2V0VGltZW91dChnLHBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NjAiKSkpLGMuc3JjPWF9fXZhciBiPTA7dGhpcy5sb2FkWE1MPWZ1bmN0aW9uKGEpe2MoYSxkKX0sdGhpcy56MjEySW1hZ2U9ZnVuY3Rpb24oYSxjKXtpZihiPj1wYXJzZUludChaLlV0aWxzLnoxODUoInoyNSIpLDEwKSlyZXR1cm4hMTt2YXIgZD1aLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsZyxjKSxlPW5ldyBoKGEsZCk7cmV0dXJuIGIrKyxlLnN0YXJ0KCksITB9fSxaLlV0aWxzPXt6MTYzOmZ1bmN0aW9uKCl7Wi5wYWdlQ29udGFpbmVySUQ9bnVsbCxaLmltYWdlUGF0aD1udWxsLFouc2tpblBhdGg9bnVsbCxaLnNraW5Nb2RlPW51bGwsWi5wYXJhbWV0ZXJzPW51bGwsWi5icm93c2Vycz1udWxsLFouYnJvd3Nlcj1udWxsLFouYnJvd3NlclZlcnNpb249bnVsbCxaLmNhbnZhc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3JtUHJvcGVydHk9bnVsbCxaLmNzc1RyYW5zZm9ybU5vVW5pdHM9bnVsbCxaLmFscGhhU3VwcG9ydGVkPW51bGwsWi5yZW5kZXJRdWFsaXR5PW51bGwsWi5tb2JpbGVEZXZpY2U9bnVsbCxaLmluaXRpYWxYPW51bGwsWi5pbml0aWFsWT1udWxsLFouaW5pdGlhbFo9bnVsbCxaLm1pblo9bnVsbCxaLm1heFo9bnVsbCxaLnpvb21TcGVlZD1udWxsLFoucGFuU3BlZWQ9bnVsbCxaLmZhZGVJblNwZWVkPW51bGwsWi50b29sYmFyVmlzaWJsZT1udWxsLFoudG9vbGJhclc9bnVsbCxaLnRvb2xiYXJIPW51bGwsWi50b29sYmFyUG9zaXRpb249bnVsbCxaLm5hdmlnYXRvclZpc2libGU9bnVsbCxaLm5hdmlnYXRvclc9bnVsbCxaLm5hdmlnYXRvckg9bnVsbCxaLm5hdmlnYXRvckw9bnVsbCxaLm5hdmlnYXRvclQ9bnVsbCxaLm5hdmlnYXRvckZpdD1udWxsLFouY2xpY2tab29tPW51bGwsWi5jbGlja1Bhbj1udWxsLFoubW91c2VQYW49bnVsbCxaLmtleXM9bnVsbCxaLmNvbnN0cmFpblBhbj1udWxsLFoudG9vbHRpcHNWaXNpYmxlPW51bGwsWi5jb3B5cmlnaHRQYXRoPW51bGwsWi53YXRlcm1hcmtQYXRoPW51bGwsWi5zbGlkZXJWaXNpYmxlPW51bGwsWi5mdWxsUGFnZVZpc2libGU9bnVsbCxaLnByb2dyZXNzVmlzaWJsZT1udWxsLFoubG9nb1Zpc2libGU9bnVsbCxaLmxvZ29DdXN0b21QYXRoPW51bGwsWi5jYW52YXM9bnVsbCxaLmRlYnVnPW51bGwsWi5WaWV3ZXI9bnVsbCxaLlZpZXdlckRpc3BsYXk9bnVsbCxaLlZpZXdwb3J0PW51bGwsWi5Ub29sYmFyPW51bGwsWi5Ub29sYmFyRGlzcGxheT1udWxsLFouVG9vbHRpcERpc3BsYXk9bnVsbCxaLk5hdmlnYXRvcj1udWxsLFouTmF2aWdhdG9yRGlzcGxheT1udWxsLFouQ29weXJpZ2h0RGlzcGxheT1udWxsLFouaW1hZ2VXPW51bGwsWi5pbWFnZUg9bnVsbCxaLmltYWdlWD0wLFouaW1hZ2VZPTAsWi5pbWFnZVo9MCxaLmZpdFo9bnVsbCxaLnpvb21pbmc9InN0b3AiLFoucGFubmluZ1g9InN0b3AiLFoucGFubmluZ1k9InN0b3AiLFouZnVsbFBhZ2U9ITEsWi51c2VDYW52YXM9ITAsWi5UcmFjZURpc3BsYXk9bnVsbCxaLnRyYWNlcz1udWxsfSxlbmZvcmNlQ29weXJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy56MjM4KCJpbWFnZUNvcHlyaWdodCIpO2E/Wi5WaWV3ZXIuejE0OSgpOnRoaXMuejIxMCgpfSx6MjEwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFouejEwMTthLmxvYWRYTUwoWi5jb3B5cmlnaHRQYXRoKX0sejI1MjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy56MTg1KCJ6MTYiKSxlPXRoaXMuejE4NSgiejE0Iik7aWYoYSl7Wi5Db3B5cmlnaHREaXNwbGF5PXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiQ29weXJpZ2h0RGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixaLnZpZXdlclctMisicHgiLFoudmlld2VySC0yKyJweCIsIjBweCIsIjBweCIsInNvbGlkIiwiMXB4IixkLCIwcHgiLCIwcHgiKSxaLlZpZXdlckRpc3BsYXkuYXBwZW5kQ2hpbGQoWi5Db3B5cmlnaHREaXNwbGF5KTt2YXIgZj00NDAsZz0yMDAsaD1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS53aWR0aCkvMi1mLzIsaT1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS5oZWlnaHQpLzItZy8yLGo9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJ0ZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGYrInB4IixnKyJweCIsaCsicHgiLGkrInB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiKTtqLmlkPSJ0ZXh0Qm94IixaLkNvcHlyaWdodERpc3BsYXkuYXBwZW5kQ2hpbGQoaik7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7ai5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChrKSksdGhpcy56MjUxKGssImJsYWNrIiwidmVyZGFuYSIsIjE2cHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwianVzdGlmeSIsIm5vbmUiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKTtqLmFwcGVuZENoaWxkKGwpO3ZhciBtPTgwLG49MjAsbz0zMCxwPTIwLHE9aCtmLzItKG0qMitvKS8yLHI9aStnK3Ascz10aGlzLnoxODUoInoxMyIpLHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25BZ3JlZSIscyxudWxsLG51bGwsbnVsbCxudWxsLG0rInB4IixuKyJweCIscSsicHgiLHIrInB4IiwibW91c2Vkb3duIix0aGlzLnoxNjAsInoxMDMiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMHB4Iik7Wi5Db3B5cmlnaHREaXNwbGF5LmFwcGVuZENoaWxkKHQuZWxtdCkscSs9bStvLHM9dGhpcy56MTg1KCJ6MTUiKTt2YXIgdT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4aXQiLHMsbnVsbCxudWxsLG51bGwsbnVsbCxtKyJweCIsbisicHgiLHErInB4IixyKyJweCIsIm1vdXNlZG93biIsdGhpcy56MTYxLCJ6MTA0Iiwic29saWQiLCIxcHgiLGUsIjBweCIsIjBweCIpO1ouQ29weXJpZ2h0RGlzcGxheS5hcHBlbmRDaGlsZCh1LmVsbXQpfWVsc2V7dmFyIGo9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRCb3giKSx2PWouY2hpbGROb2Rlc1sxXS50ZXh0Q29udGVudDtqLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9djt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQWdyZWUiKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwibW91c2Vkb3duIix0aGlzLnoxNjApLFouQ29weXJpZ2h0RGlzcGxheS5yZW1vdmVDaGlsZCh0KTt2YXIgdT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhpdCIpO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLHRoaXMuejE2MSksWi5Db3B5cmlnaHREaXNwbGF5LnJlbW92ZUNoaWxkKHUpfX0sQnV0dG9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpe3ZhciB0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsYSwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGcsaCxpLGosbixvLHAscSxyLHMpO2lmKCFaLlV0aWxzLmlzU3RyVmFsKGIpKXt2YXIgdT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGMrIi8iK2QpLHY9Wi5VdGlscy5jcmVhdGVHcmFwaGljRWxlbWVudChjKyIvIitlKSx3PVouVXRpbHMuY3JlYXRlR3JhcGhpY0VsZW1lbnQoYysiLyIrZik7dS5pZD10LmlkKyItaW1nVXAiLHYuaWQ9dC5pZCsiLWltZ092ZXIiLHcuaWQ9dC5pZCsiLWltZ0Rvd24iLHQuX2ltZ1VwSUQ9dS5pZCx0Ll9pbWdPdmVySUQ9di5pZCx0Ll9pbWdEb3duSUQ9dy5pZDt2YXIgeD11LnN0eWxlLHk9di5zdHlsZSx6PXcuc3R5bGU7eC5wb3NpdGlvbj15LnBvc2l0aW9uPXoucG9zaXRpb249ImFic29sdXRlIix4LndpZHRoPXkud2lkdGg9eS53aWR0aD1nLHguaGVpZ2h0PXkuaGVpZ2h0PXkuaGVpZ2h0PWgseC50b3A9eS50b3A9ei50b3A9IjBweCIseC5sZWZ0PXkubGVmdD16LmxlZnQ9IjBweCIsWi5icm93c2VyPT1aLmJyb3dzZXJzLkZJUkVGT1gmJlouYnJvd3NlclZlcnNpb248MyYmKHgudG9wPXkudG9wPXoudG9wPSIiKSx5LnZpc2liaWxpdHk9ImhpZGRlbiIsei52aXNpYmlsaXR5PSJoaWRkZW4iLHQuYXBwZW5kQ2hpbGQodSksdC5hcHBlbmRDaGlsZCh2KSx0LmFwcGVuZENoaWxkKHcpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih1LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHYsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfWVsc2V7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7dC5hcHBlbmRDaGlsZChaLlV0aWxzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChBKSksWi5VdGlscy56MjUxKEEsImJsYWNrIiwidmVyZGFuYSIsIjEzcHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwiY2VudGVyIiwibm9uZSIpLFouVXRpbHMuZGlzYWJsZVRleHRJbnRlcmFjdGlvbihBKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodCwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfVoudG9vbHRpcHNWaXNpYmxlJiZaLlV0aWxzLmlzU3RyVmFsKG0pJiYodC50aXRsZT1aLlV0aWxzLnoxODUobSkpLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJ0b3VjaHN0YXJ0IixsKTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlb3ZlciIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZW91dCIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LGssbCkpLHRoaXMuZWxtdD10fSx6MTM4OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnN0eWxlO2Qud2lkdGg9YisicHgiLGQuaGVpZ2h0PWMrInB4Ijt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdVcElEKSxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ092ZXJJRCksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdEb3duSUQpO2lmKGUmJmYmJmcpe3ZhciBoPWUuc3R5bGUsaT1mLnN0eWxlLGo9Zy5zdHlsZTtoLndpZHRoPWIrInB4IixoLmhlaWdodD1jKyJweCIsaS53aWR0aD1iKyJweCIsaS5oZWlnaHQ9YysicHgiLGoud2lkdGg9YisicHgiLGouaGVpZ2h0PWMrInB4In19LEdyYXBoaWM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9Yz9iKyIvIitjOmIsaT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGgpLGo9aS5zdHlsZTtqLndpZHRoPWQsai5oZWlnaHQ9ZTt2YXIgYz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoInNwYW4iLGEsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixkLGUsZixnLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpO2MuYXBwZW5kQ2hpbGQoaSksdGhpcy5lbG10PWMsWi5tb2JpbGVEZXZpY2U/Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksInRvdWNoc3RhcnQiLFouVXRpbHMucHJldmVudERlZmF1bHQpOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJtb3VzZWRvd24iLFouVXRpbHMucHJldmVudERlZmF1bHQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9LHoyMDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuc3R5bGU7ZC53aWR0aD1iKyJweCIsZC5oZWlnaHQ9YysicHgiO3ZhciBlPWEuZmlyc3RDaGlsZCxmPWUuc3R5bGU7Zi53aWR0aD1iKyJweCIsZi5oZWlnaHQ9YysicHgifSx6MTYwOmZ1bmN0aW9uKGEpe1ouVmlld2VyRGlzcGxheS5yZW1vdmVDaGlsZChaLkNvcHlyaWdodERpc3BsYXkpLGRvY3VtZW50LmNvb2tpZT0iaW1hZ2VDb3B5cmlnaHQ9Y29uZmlybWVkIixaLlZpZXdlci56MTQ5KCl9LHoxNjE6ZnVuY3Rpb24oYSl7Wi5VdGlscy56MjUyKCExKTtyZXR1cm59LHoxMjg6ZnVuY3Rpb24oKXtTdHJpbmcucHJvdG90eXBlLm11bHRpcGx5fHwoU3RyaW5nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5qb2luLGI9e307cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiLmxlbmd0aD1jKzEsYS5jYWxsKGIsdGhpcyl9fSgpKSxBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGEsYil7Yj9iPDAmJihiPU1hdGgubWF4KDAsdGhpcy5sZW5ndGgrYikpOmI9MDtmb3IodmFyIGM9YixkPXRoaXMubGVuZ3RoO2M8ZDtjKyspaWYodGhpc1tjXT09PWEpcmV0dXJuIGM7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUucHVzaHx8KEFycmF5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXNbdGhpcy5sZW5ndGhdPWF9KSxBcnJheS5wcm90b3R5cGUuc3BsaWNlfHwoQXJyYXkucHJvdG90eXBlLnN1YmFycj1mdW5jdGlvbihhLGIpe2lmKGE+PXRoaXMubGVuZ3RofHxiJiZiPD0wKXJldHVybltdO2E8MCYmKE1hdGguYWJzKGEpPnRoaXMubGVuZ3RoP2E9MDphPXRoaXMubGVuZ3RoK2EpO2lmKCFifHxiK2E+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aC1hO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YStiO2QrKyljLnB1c2godGhpc1tkXSk7cmV0dXJuIGN9LEFycmF5LnByb3RvdHlwZS5zdWJhcnJheT1mdW5jdGlvbihhLGIpe2E8MCYmKGE9MCk7aWYoIWJ8fGI+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aDtpZihhPT1iKXJldHVybltdO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YjtkKyspYy5wdXNoKHRoaXNbZF0pO3JldHVybiBjfSxBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGEsYil7YjwwJiYoYj0wKTt2YXIgYz1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpZm9yKHZhciBkPTIsZT1hcmd1bWVudHMubGVuZ3RoO2Q8ZTtkKyspYy5wdXNoKGFyZ3VtZW50c1tkXSk7dmFyIGY9dGhpcy5zdWJhcnJheSgwLGEpLGc9dGhpcy5zdWJhcnIoYSxiKSxoPXRoaXMuc3ViYXJyYXkoYStiKSxpPWYuY29uY2F0KGMsaCk7dGhpcy5sZW5ndGg9MDtmb3IodmFyIGQ9MCxlPWkubGVuZ3RoO2Q8ZTtkKyspdGhpcy5wdXNoKGlbZF0pO3JldHVybiBnfSl9LHoxMjc6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyPyh0aGlzLmRpc2FibGVUZXh0SW50ZXJhY3Rpb249ZnVuY3Rpb24oYSl7YSYmKHRuUz1hLnBhcmVudE5vZGUuc3R5bGUsdG5TJiYoYS5wYXJlbnROb2RlLnVuc2VsZWN0YWJsZT0ib24iLHRuUy51c2VyU2VsZWN0PSJub25lIix0blMuTW96VXNlclNlbGVjdD0ibm9uZSIsdG5TLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLHRuUy53ZWJraXRUb3VjaENhbGxvdXQ9Im5vbmUiLHRuUy53ZWJraXRUYXBIaWdobGlnaHRDb2xvcj0idHJhbnNwYXJlbnQiKSl9LHRoaXMucmVuZGVyUXVhbGl0eT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWI9PSJoaWdoIj8ib3B0aW1pemVRdWFsaXR5Ijoib3B0aW1pemVTcGVlZCI7YS5zdHlsZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIixjLG51bGwpfX0sdGhpcy5zZXRPcGFjaXR5PWZ1bmN0aW9uKGEsYixjKXtaLmFscGhhU3VwcG9ydGVkP2Euc3R5bGUub3BhY2l0eT1iOmMmJihhLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jKX0pOmRvY3VtZW50LmF0dGFjaEV2ZW50JiYodGhpcy5kaXNhYmxlVGV4dEludGVyYWN0aW9uPWZ1bmN0aW9uKGEpe2EmJihhLnBhcmVudE5vZGUudW5zZWxlY3RhYmxlPSJvbiIsYS5wYXJlbnROb2RlLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSx0aGlzLnJlbmRlclF1YWxpdHk9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iPT0iaGlnaCI/ImJpY3ViaWMiOiJuZWFyZXN0LW5laWdoYm9yIjthLnN0eWxlLm1zSW50ZXJwb2xhdGlvbk1vZGU9Y319LHRoaXMuc2V0T3BhY2l0eT1mdW5jdGlvbihhLGIsYyl7Wi5hbHBoYVN1cHBvcnRlZD8oYS5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PScgKyB2YWx1ZSArICcpIixhLnN0eWxlLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0iK2IrIikiKTpjJiYoYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Yyl9KX0sejEyNjpmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI/KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7Yj09Im1vdXNld2hlZWwiJiZlbG10LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIixjLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0sdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtiPT0ibW91c2V3aGVlbCImJmVsbXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGMsITEpLGEmJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx0aGlzLmV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhfSx0aGlzLnRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LHRoaXMucmVsYXRlZFRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxhdGVkVGFyZ2V0fSx0aGlzLmlzUmlnaHRNb3VzZUJ1dHRvbj1mdW5jdGlvbihhKXt2YXIgYj0hMTtpZihhLndoaWNoPT0yfHxhLndoaWNoPT0zKWI9ITA7cmV0dXJuIGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQmJih0aGlzLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYykhPS0xKXJldHVybjt2YXIgZD1mdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5ldmVudDtGdW5jdGlvbi5wcm90b3R5cGUuY2FsbD9jLmNhbGwoYSxiKTooYS5fY3VycmVudExpc3RlbmVyPWMsYS5fY3VycmVudExpc3RlbmVyKGIpLGEuX2N1cnJlbnRMaXN0ZW5lcj1udWxsKX07YS5hdHRhY2hFdmVudCgib24iK2IsZCk7dmFyIGU9e3RhcmdldDphLGV2ZW50TmFtZTpiLGhhbmRsZXI6YyxoYW5kbGVyMjpkfSxmPWEuZG9jdW1lbnR8fGEsZz1mLnBhcmVudFdpbmRvdyxoPSJsIit0aGlzLl9saXN0ZW5lckNvdW50ZXIrKztnLl9hbGxMaXN0ZW5lcnN8fChnLl9hbGxMaXN0ZW5lcnM9e30pLGcuX2FsbExpc3RlbmVyc1toXT1lLGEuX2xpc3RlbmVyc3x8KGEuX2xpc3RlbmVycz1bXSksYS5fbGlzdGVuZXJzW2EuX2xpc3RlbmVycy5sZW5ndGhdPWgsZy5fdW5sb2FkTGlzdGVuZXJBZGRlZHx8KGcuX3VubG9hZExpc3RlbmVyQWRkZWQ9ITAsZy5hdHRhY2hFdmVudCgib251bmxvYWQiLHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycykpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEpe3ZhciBkPXRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYyk7aWYoZD09LTEpcmV0dXJuO3ZhciBlPWEuZG9jdW1lbnR8fGEsZj1lLnBhcmVudFdpbmRvdyxnPWEuX2xpc3RlbmVyc1tkXSxoPWYuX2FsbExpc3RlbmVyc1tnXTthLmRldGFjaEV2ZW50KCJvbiIrYixoLmhhbmRsZXIyKSxhLl9saXN0ZW5lcnMuc3BsaWNlKGQsMSksZGVsZXRlIGYuX2FsbExpc3RlbmVyc1tnXX19LHRoaXMuZXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5ldmVudH0sdGhpcy50YXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3JjRWxlbWVudH0sdGhpcy5yZWxhdGVkVGFyZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIGEudHlwZT09Im1vdXNlb3ZlciI/Yj1hLmZyb21FbGVtZW50OmEudHlwZT09Im1vdXNlb3V0IiYmKGI9YS50b0VsZW1lbnQpLGJ9LHRoaXMuaXNSaWdodE1vdXNlQnV0dG9uPWZ1bmN0aW9uKGEpe3ZhciBiPSExO3JldHVybiBhLmJ1dHRvbj09MiYmKGI9ITApLGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YSYmKGEucmV0dXJuVmFsdWU9ITEpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLmNhbmNlbEJ1YmJsZT0hMH0sdGhpcy5fZmluZExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLl9saXN0ZW5lcnM7aWYoIWQpcmV0dXJuLTE7dmFyIGU9YS5kb2N1bWVudHx8YSxmPWUucGFyZW50V2luZG93O2Zvcih2YXIgZz1kLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1kW2ddLGk9Zi5fYWxsTGlzdGVuZXJzW2hdO2lmKGkuZXZlbnROYW1lPT1iJiZpLmhhbmRsZXI9PWMpcmV0dXJuIGd9cmV0dXJuLTF9LHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Zm9yKGlkIGluIGEuX2FsbExpc3RlbmVycyl7dmFyIGI9YS5fYWxsTGlzdGVuZXJzW2lkXTtiLnRhcmdldC5kZXRhY2hFdmVudCgib24iK2IuZXZlbnROYW1lLGIuaGFuZGxlcjIpLGRlbGV0ZSBhLl9hbGxMaXN0ZW5lcnNbaWRdfX0sdGhpcy5fbGlzdGVuZXJDb3VudGVyPTApfSx6MTY0OmZ1bmN0aW9uKCl7Wi5icm93c2Vycz17VU5LTk9XTjowLElFOjEsRklSRUZPWDoyLFNBRkFSSTozLENIUk9NRTo0LE9QRVJBOjV9O3ZhciBhPVouYnJvd3NlcnMuVU5LTk9XTixiPTAsYz1uYXZpZ2F0b3IuYXBwTmFtZSxkPW5hdmlnYXRvci5hcHBWZXJzaW9uLGU9ITEsZj0hMSxnPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtpZihjIT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8IXdpbmRvdy5hdHRhY2hFdmVudHx8IXdpbmRvdy5BY3RpdmVYT2JqZWN0KWlmKGMhPSJOZXRzY2FwZSJ8fCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciljPT0iT3BlcmEiJiYhIXdpbmRvdy5vcGVyYSYmISF3aW5kb3cuYXR0YWNoRXZlbnQmJihhPVouYnJvd3NlcnMuT1BFUkEsYj1wYXJzZUZsb2F0KGQpKTtlbHNle3ZhciBpPWcuaW5kZXhPZigiZmlyZWZveCIpLGo9Zy5pbmRleE9mKCJzYWZhcmkiKSxrPWcuaW5kZXhPZigiY2hyb21lIik7aWYoaT49MClhPVouYnJvd3NlcnMuRklSRUZPWCxiPXBhcnNlRmxvYXQoZy5zdWJzdHJpbmcoaSs4KSk7ZWxzZSBpZihqPj0wKXt2YXIgbD1nLnN1YnN0cmluZygwLGopLmxhc3RJbmRleE9mKCIvIik7YT1rPj0wP1ouYnJvd3NlcnMuQ0hST01FOlouYnJvd3NlcnMuU0FGQVJJLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhsKzEsaikpfXZhciBtPW5ldyBJbWFnZTttLnN0eWxlLmdldFByb3BlcnR5VmFsdWUmJihmPW0uc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiaW1hZ2UtcmVuZGVyaW5nIikpfWVsc2V7dmFyIGg9Zy5pbmRleE9mKCJtc2llIik7YT1aLmJyb3dzZXJzLklFLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhoKzUsZy5pbmRleE9mKCI7IixoKSkpLGU9dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSE9InVuZGVmaW5lZCJ9dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxvPW4uc3R5bGV8fHt9LHA9ITEscT1bInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSJdLHIsczt3aGlsZShyPXEuc2hpZnQoKSlpZih0eXBlb2Ygb1tyXSE9InVuZGVmaW5lZCIpe3A9ITAscz0vd2Via2l0L2kudGVzdChyKTticmVha312YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0JiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLHU9IShhPT1aLmJyb3dzZXJzLlNBRkFSSSYmYjw0fHxhPT1aLmJyb3dzZXJzLkNIUk9NRSYmYjwyKSx2PXQmJnUsdz0hKGE9PVouYnJvd3NlcnMuSUV8fGE9PVouYnJvd3NlcnMuQ0hST01FJiZiPDIpLHg9ZXx8Zj8iaGlnaCI6bnVsbCx5PWcuaW5kZXhPZigiYW5kcm9pZCIpPi0xfHxnLmluZGV4T2YoImlwaG9uZSIpPi0xfHxnLmluZGV4T2YoImlwYWQiKT4tMXx8Zy5pbmRleE9mKCJpcG9kIik+LTE7Wi5icm93c2VyPWEsWi5icm93c2VyVmVyc2lvbj1iLFouY2FudmFzU3VwcG9ydGVkPXYsWi51c2VDYW52YXM9Wi5jYW52YXNTdXBwb3J0ZWQsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkPXAsWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eT1yLFouY3NzVHJhbnNmb3JtTm9Vbml0cz1zLFouYWxwaGFTdXBwb3J0ZWQ9dyxaLnJlbmRlclF1YWxpdHk9eCxaLm1vYmlsZURldmljZT15fSxpc1N0clZhbDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYSE9IiJ9LHoxNzQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTAsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKTt3aGlsZShlKXtiKz1hLm9mZnNldExlZnQsYys9YS5vZmZzZXRUb3A7aWYoZCl7dmFyIGY9dGhpcy56MTg0KCk7Yis9Zi54LGMrPWYueX1hPWUsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKX1yZXR1cm4gbmV3IHRoaXMuUG9pbnQoYixjKX0sejE4MzpmdW5jdGlvbihhLGIpe3JldHVybiBiJiZhIT1kb2N1bWVudC5ib2R5P2RvY3VtZW50LmJvZHk6YS5vZmZzZXRQYXJlbnR9LHoxNzU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLlBvaW50KGEuY2xpZW50V2lkdGgsYS5jbGllbnRIZWlnaHQpfSx6MTc2OmZ1bmN0aW9uKGEpe2lmKGEuY3VycmVudFN0eWxlKXJldHVybiBhLmN1cnJlbnRTdHlsZTtpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIik7dGhpcy56MjU1KHRoaXMuejE4NSgiejkzIikpfSx6MTc3OmZ1bmN0aW9uKGEpe3JldHVybiB6MTc0KFouVXRpbHMudGFyZ2V0KGEpKX0sejE3ODpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9YS50b3VjaGVzLGQ9YS5jaGFuZ2VkVG91Y2hlcztyZXR1cm4gYyE9PXVuZGVmaW5lZD9iPWNbMF06ZCE9PXVuZGVmaW5lZCYmKGI9ZFswXSksYn0sejE4MTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtyZXR1cm4gYS50eXBlPT0iRE9NTW91c2VTY3JvbGwiJiZicm93c2VyPT1Ccm93c2VyLkZJUkVGT1gmJmJyb3dzZXJWZXJzaW9uPDM/KGI9YS5zY3JlZW5YLGM9YS5zY3JlZW5ZKTp0eXBlb2YgYS5wYWdlWD09Im51bWJlciI/KGI9YS5wYWdlWCxjPWEucGFnZVkpOnR5cGVvZiBhLmNsaWVudFg9PSJudW1iZXIiPyhiPWEuY2xpZW50WCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsYz1hLmNsaWVudFkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk6dGhpcy56MjU1KHRoaXMuejE4NSgiejk0IikpLG5ldyB0aGlzLlBvaW50KGIsYyl9LHoxODI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gdHlwZW9mIGEud2hlZWxEZWx0YT09Im51bWJlciI/Yj1hLndoZWVsRGVsdGE6dHlwZW9mIGEuZGV0YWlsPT0ibnVtYmVyIj9iPWEuZGV0YWlsKi0xOnRoaXMuejI1NSh0aGlzLnoxODUoIno5NSIpKSxiP2IvTWF0aC5hYnMoYik6MH0sejE4NDpmdW5jdGlvbigpe3ZhciBhPTAsYj0wLGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxkPWRvY3VtZW50LmJvZHl8fHt9O2lmKHR5cGVvZiB3aW5kb3cucGFnZVhPZmZzZXQ9PSJudW1iZXIiKWE9d2luZG93LnBhZ2VYT2Zmc2V0LGI9d2luZG93LnBhZ2VZT2Zmc2V0O2Vsc2UgaWYoZC5zY3JvbGxMZWZ0fHxkLnNjcm9sbFRvcClhPWQuc2Nyb2xsTGVmdCxiPWQuc2Nyb2xsVG9wO2Vsc2UgaWYoYy5zY3JvbGxMZWZ0fHxjLnNjcm9sbFRvcClhPWMuc2Nyb2xsTGVmdCxiPWMuc2Nyb2xsVG9wO3JldHVybiBuZXcgdGhpcy5Qb2ludChhLGIpfSx6MjAxaW5kb3dTaXplOmZ1bmN0aW9uKCl7dmFyIGE9MCxiPTAsYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHt9LGQ9ZG9jdW1lbnQuYm9keXx8e307cmV0dXJuIHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aD09Im51bWJlciI/KGE9d2luZG93LmlubmVyV2lkdGgsYj13aW5kb3cuaW5uZXJIZWlnaHQpOmMuY2xpZW50V2lkdGh8fGMuY2xpZW50SGVpZ2h0PyhhPWMuY2xpZW50V2lkdGgsYj1jLmNsaWVudEhlaWdodCk6ZC5jbGllbnRXaWR0aHx8ZC5jbGllbnRIZWlnaHQ/KGE9ZC5jbGllbnRXaWR0aCxiPWQuY2xpZW50SGVpZ2h0KTp0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTYiKSksbmV3IHRoaXMuUG9pbnQoYSxiKX0sejIyNTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPWE7d2hpbGUoYj09ITEpaWYoYyljLmlkP2MuaWQ9PSJWaWV3ZXJEaXNwbGF5Ij9iPSEwOmM9Yy5wYXJlbnROb2RlOmM9Yy5wYXJlbnROb2RlO2Vsc2UgYnJlYWs7cmV0dXJuIGJ9LHoyMzg6ZnVuY3Rpb24oYSl7dmFyIGI9YSsiPSIsYz1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt3aGlsZShlLmNoYXJBdCgwKT09IiAiKWU9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aCk7aWYoZS5pbmRleE9mKGIpPT0wKXJldHVybiBlLnN1YnN0cmluZyhiLmxlbmd0aCxlLmxlbmd0aCl9cmV0dXJuIG51bGx9LHoyNDM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zbGljZSgtMSxhLmxlbmd0aCk9PSIvIj9hLnNsaWNlKDAsYS5sZW5ndGgtMSk6YTtyZXR1cm4gYj1hLnNsaWNlKDAsMSk9PSIvIj9hLnNsaWNlKDEsYS5sZW5ndGgpOmEsYn0sejE0MDpmdW5jdGlvbihhKXtpZihaLmJyb3dzZXI9PVouYnJvd3NlcnMuSUUpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCksYz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCksZD1jK2I7YSs9Ij9zdWZmaXhUb0Jsb2NrUGF0aENhY2hpbmc9IitkfXJldHVybiBhfSx6MTcwOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYSphKmEqYStiOmMvMiooKGEtPTIpKmEqYSphKmErMikrYn0sejIzMzpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYSYmKGI9YS5zcGxpdCgiJiIpKSxifSx6MjQ5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuejE4NSgiejUwIiksYz10aGlzLnoxODUoIno0OSIpLGQ9dGhpcy56MTg1KCJ6NDgiKTtaLnNraW5QYXRoPXRoaXMuejE4NSgiejU2IiksWi5za2luTW9kZT10aGlzLnoxODUoIno1NCIpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjYiKSkpfHwoWi5pbml0aWFsWD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejI2IikpKSxpc05hTihwYXJzZUZsb2F0KHRoaXMuejE4NSgiejI3IikpKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdCh0aGlzLnoxODUoInoyNyIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoInoyOCIpKSl8fChaLmluaXRpYWxaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjgiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpfHwoWi5taW5aPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpfHwoWi5tYXhaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6ODAiKSkpfHwoWi56b29tU3BlZWQ9cGFyc2VGbG9hdCh0aGlzLnoxODUoIno4MCIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoIno0NiIpKSl8fChaLnBhblNwZWVkPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NDYiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MTgiKSkpfHwoWi5mYWRlSW5TcGVlZD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejE4IikpKSxaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KHRoaXMuejE4NSgiejY0IiksMTApLFoudG9vbGJhclBvc2l0aW9uPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NjMiKSksWi50b29sdGlwc1Zpc2libGU9dGhpcy56MTg1KCJ6NjUiKSE9IjAiLFoubmF2aWdhdG9yVmlzaWJsZT1wYXJzZUludCh0aGlzLnoxODUoIno0MyIpLDEwKSxaLm5hdmlnYXRvclc9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDQiKSwxMCksWi5uYXZpZ2F0b3JIPXBhcnNlSW50KHRoaXMuejE4NSgiejM5IiksMTApLFoubmF2aWdhdG9yTD1wYXJzZUludCh0aGlzLnoxODUoIno0MCIpLDEwKSxaLm5hdmlnYXRvclQ9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDIiKSwxMCksWi5uYXZpZ2F0b3JGaXQ9dGhpcy56MTg1KCJ6MzgiKSxaLmNsaWNrWm9vbT10aGlzLnoxODUoInoxMCIpIT0iMCIsWi5jbGlja1Bhbj10aGlzLnoxODUoIno5IikhPSIwIixaLm1vdXNlUGFuPXRoaXMuejE4NSgiejM0IikhPSIwIixaLmtleXM9dGhpcy56MTg1KCJ6MjkiKSE9IjAiLFouY29uc3RyYWluUGFuPXRoaXMuejE4NSgiejEyIikhPSIwIixaLnNsaWRlclZpc2libGU9dGhpcy56MTg1KCJ6NTgiKSE9IjAiLFouZnVsbFBhZ2VWaXNpYmxlPXRoaXMuejE4NSgiejIzIikhPSIwIixaLnByb2dyZXNzVmlzaWJsZT10aGlzLnoxODUoIno1MyIpIT0iMCIsWi5sb2dvVmlzaWJsZT10aGlzLnoxODUoInozMSIpIT0iMCIsWi5sb2dvQ3VzdG9tUGF0aD10aGlzLnoxODUoInozMCIpLFouY2FudmFzPXRoaXMuejE4NSgiejgiKSE9IjAiLFouZGVidWc9dGhpcy56MTg1KCJ6MTciKSE9IjAiO2lmKHRoaXMuaXNTdHJWYWwoYSkpZm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZz1hW2VdLGg9Zy5pbmRleE9mKCI9Iik7aWYoaD4wKXt2YXIgaT1nLnN1YnN0cmluZygwLGgpLGo9Zy5zdWJzdHJpbmcoaCsxKTtpZih0aGlzLmlzU3RyVmFsKGopKXN3aXRjaChpKXtjYXNlInpJbml0aWFsWCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLmluaXRpYWxYPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2UiekluaXRpYWxZIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6SW5pdGlhbFpvb20iOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5pbml0aWFsWj1wYXJzZUZsb2F0KGopLFouaW5pdGlhbFomJihaLmluaXRpYWxaLz0xMDApKTticmVhaztjYXNlInpNaW5ab29tIjohaXNOYU4ocGFyc2VGbG9hdChqKSkmJnBhcnNlRmxvYXQoaik+LjAxJiYoWi5taW5aPXBhcnNlRmxvYXQoaiksWi5taW5aJiYoWi5taW5aLz0xMDApKTticmVhaztjYXNlInpNYXhab29tIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubWF4Wj1wYXJzZUZsb2F0KGopLFoubWF4WiYmKFoubWF4Wi89MTAwKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9yVmlzaWJsZSI6Wi5uYXZpZ2F0b3JWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UielRvb2xiYXJWaXNpYmxlIjpaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UiekxvZ29WaXNpYmxlIjpqPT0iMCImJihaLmxvZ29WaXNpYmxlPSExKTticmVhaztjYXNlInpTbGlkZXJWaXNpYmxlIjpqPT0iMCImJihaLnNsaWRlclZpc2libGU9ITEpO2JyZWFrO2Nhc2UiekZ1bGxQYWdlVmlzaWJsZSI6aj09IjAiJiYoWi5mdWxsUGFnZVZpc2libGU9ITEpO2JyZWFrO2Nhc2UielByb2dyZXNzVmlzaWJsZSI6aj09IjAiJiYoWi5wcm9ncmVzc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielRvb2x0aXBzVmlzaWJsZSI6aj09IjAiJiYoWi50b29sdGlwc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielNraW5QYXRoIjpaLnNraW5QYXRoPWo7YnJlYWs7ZGVmYXVsdDppZihiPT1jKWFsZXJ0KGQrIiAiK2kpO2Vsc2Ugc3dpdGNoKGkpe2Nhc2Uielpvb21TcGVlZCI6Wi56b29tU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6UGFuU3BlZWQiOloucGFuU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6RmFkZUluU3BlZWQiOlouZmFkZUluU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6VG9vbGJhclBvc2l0aW9uIjpaLnRvb2xiYXJQb3NpdGlvbj1wYXJzZUludChqLDEwKTticmVhaztjYXNlInpOYXZpZ2F0b3JXaWR0aCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvclc9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9ySGVpZ2h0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9ySD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JMZWZ0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9yTD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JUb3AiOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5uYXZpZ2F0b3JUPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2Uiek5hdmlnYXRvckZpdCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvckZpdD1wYXJzZUludChqLDEwKSk7YnJlYWs7Y2FzZSJ6Q2xpY2tab29tIjpqPT0iMCImJihaLmNsaWNrWm9vbT0hMSk7YnJlYWs7Y2FzZSJ6Q2xpY2tQYW4iOmo9PSIwIiYmKFouY2xpY2tQYW49ITEpO2JyZWFrO2Nhc2Uiek1vdXNlUGFuIjpqPT0iMCImJihaLm1vdXNlUGFuPSExKTticmVhaztjYXNlInpLZXlzIjpqPT0iMCImJihaLmtleXM9ITEpO2JyZWFrO2Nhc2UiekNvbnN0cmFpblBhbiI6aj09IjAiJiYoWi5jb25zdHJhaW5QYW49ITEpO2JyZWFrO2Nhc2UiekNvcHlyaWdodFBhdGgiOlouY29weXJpZ2h0UGF0aD1qO2JyZWFrO2Nhc2UieldhdGVybWFya1BhdGgiOloud2F0ZXJtYXJrUGF0aD1qO2JyZWFrO2Nhc2UiekxvZ29DdXN0b21QYXRoIjpaLmxvZ29DdXN0b21QYXRoPWo7YnJlYWs7Y2FzZSJ6Q2FudmFzIjpqPT0iMCImJihaLmNhbnZhcz0hMSk7aWYoIVouY2FudmFzU3VwcG9ydGVkfHwhWi5jYW52YXMpWi51c2VDYW52YXM9ITE7YnJlYWs7Y2FzZSJ6RGVidWciOmo9PSIxIiYmKFouZGVidWc9ITApfX19fX0sejI0MjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MTtiPGEubGVuZ3RoOylhW2ItMV09PWFbYl0/YS5zcGxpY2UoYiwxKTpiKys7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdLGY9ITE7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aCYmZT49KGVsbXQyPWJbZ10pO2crKylpZihlbG10Mj09ZSl7Zj0hMDticmVha31mJiZjLnB1c2goYVtkXSl9cmV0dXJuIGN9LHN1YnRyYWN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT0hMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoJiZkPj0oZWxtdDI9YltmXSk7ZisrKWlmKGVsbXQyPT1kKXtlPSEwO2JyZWFrfWUmJmEuc3BsaWNlKGMtLSwxKX1yZXR1cm4gYX0sY3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MixlPWFyZ3VtZW50cy5sZW5ndGg7ZDxlO2QrKyljLnB1c2goYXJndW1lbnRzW2RdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmNvbmNhdChbXSk7Zm9yKHZhciBlPTAsZj1hcmd1bWVudHMubGVuZ3RoO2U8ZjtlKyspZC5wdXNoKGFyZ3VtZW50c1tlXSk7cmV0dXJuIGIuYXBwbHkoYSxkKX19LHoyNTU6ZnVuY3Rpb24oYSl7YWxlcnQoYSl9LGNyZWF0ZUNvbnRhaW5lckVsZW1lbnQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8pe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSk7dGhpcy5pc1N0clZhbChiKSYmKHAuaWQ9Yik7dmFyIHE9cC5zdHlsZTtyZXR1cm4gcS5kaXNwbGF5PXRoaXMuaXNTdHJWYWwoYyk/YzoiaW5saW5lLWJsb2NrIixxLnBvc2l0aW9uPXRoaXMuaXNTdHJWYWwoZCk/ZDoic3RhdGljIixxLm92ZXJmbG93PXRoaXMuaXNTdHJWYWwoZSk/ZToiaGlkZGVuIixhPT0iY2FudmFzIj8odGhpcy5pc1N0clZhbChmKSYmcC5zZXRBdHRyaWJ1dGUoIndpZHRoIixmKSx0aGlzLmlzU3RyVmFsKGcpJiZwLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixnKSk6KHRoaXMuaXNTdHJWYWwoZikmJihxLndpZHRoPWYpLHRoaXMuaXNTdHJWYWwoZyYmZykmJihxLmhlaWdodD1nKSksdGhpcy5pc1N0clZhbChoKSYmKHEubGVmdD1oKSx0aGlzLmlzU3RyVmFsKGkpJiYocS50b3A9aSkscS5ib3JkZXJTdHlsZT10aGlzLmlzU3RyVmFsKGopP2o6Im5vbmUiLHEuYm9yZGVyV2lkdGg9dGhpcy5pc1N0clZhbChrKT9rOiIwcHgiLHEuYmFja2dyb3VuZD10aGlzLmlzU3RyVmFsKGwpP2w6InRyYW5zcGFyZW50IG5vbmUiLHEubWFyZ2luPXRoaXMuaXNTdHJWYWwobSk/bToiMHB4IixxLnBhZGRpbmc9dGhpcy5pc1N0clZhbChuKT9uOiIwcHgiLHRoaXMuaXNTdHJWYWwobykmJihxLmN1cnNvcj1vKSxwfSxjcmVhdGVDZW50ZXJlZEVsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiKSxjPVtdO2MucHVzaCgnPGRpdiBzdHlsZT0iZGlzcGxheTp0YWJsZTsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7JyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCcjcG9zaXRpb246cmVsYXRpdmU7IG92ZXJmbG93OmhpZGRlbjsgdGV4dC1hbGlnbjpsZWZ0OyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246YWJzb2x1dGU7ICN0b3A6NTAlOyB3aWR0aDoxMDAlOyAnKSxjLnB1c2goImJvcmRlcjpub25lOyBtYXJnaW46MHB4OyBwYWRkaW5nOjBweDsiKSxjLnB1c2goJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246cmVsYXRpdmU7ICN0b3A6LTUwJTsgd2lkdGg6MTAwJTsgJyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCd0ZXh0LWFsaWduOmNlbnRlcjsiPjwvZGl2PjwvZGl2PjwvZGl2PicpLGIuaW5uZXJIVE1MPWMuam9pbigiIiksYj1iLmZpcnN0Q2hpbGQ7dmFyIGQ9YixlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO3doaWxlKGUubGVuZ3RoPjApZD1lWzBdLGU9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoYSksYn0sY3JlYXRlR3JhcGhpY0VsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJpbWciKSxjPW51bGw7cmV0dXJuIFouYnJvd3Nlcj09Wi5icm93c2Vycy5JRSYmWi5icm93c2VyVmVyc2lvbjw3PyhjPXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsbnVsbCwiaW5saW5lLWJsb2NrIiksYi5vbmxvYWQ9ZnVuY3Rpb24oKXtjLnN0eWxlLndpZHRoPWMuc3R5bGUud2lkdGh8fGIud2lkdGgrInB4IixjLnN0eWxlLmhlaWdodD1jLnN0eWxlLmhlaWdodHx8Yi5oZWlnaHQrInB4IixiLm9ubG9hZD1udWxsLGI9bnVsbH0sYy5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIithKyInLCBzaXppbmdNZXRob2Q9J3NjYWxlJykiKTooYz1iLGMuc3JjPWEpLGN9LHoyNTE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtPWEucGFyZW50Tm9kZS5zdHlsZTttLmNvbG9yPWIsbS5mb250RmFtaWx5PWMsbS5mb250U2l6ZT1kLG0uZm9udFNpemVBZGp1c3Q9ZSxtLmZvbnRTdHlsZT1mLG0uZm9udFN0cmV0Y2g9ZyxtLmZvbnRWYXJpYW50PWgsbS5mb250V2VpZ2h0PWksbS5saW5lSGVpZ2h0PWosbS50ZXh0QWxpZ249ayxtLnRleHREZWNvcmF0aW9uPWx9LHoxNTg6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl0cnl7Yj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGIuYXN5bmM9ITEsYi5sb2FkWE1MKGEpfWNhdGNoKGMpe3RoaXMuejI1NShjLm5hbWUrdGhpcy56MTg1KCJ6ODIiKStjLm1lc3NhZ2UpfWVsc2UgaWYod2luZG93LkRPTVBhcnNlcil0cnl7dmFyIGQ9bmV3IERPTVBhcnNlcjtiPWQucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goYyl7dGhpcy56MjU1KGMubmFtZSt0aGlzLnoxODUoIno4MiIpK2MubWVzc2FnZSl9ZWxzZSB0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTgiKSk7cmV0dXJuIGJ9LFBvaW50OmZ1bmN0aW9uKGEsYil7dGhpcy54PXR5cGVvZiBhPT0ibnVtYmVyIj9hOjAsdGhpcy55PXR5cGVvZiBiPT0ibnVtYmVyIj9iOjB9LFBvaW50M0Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMueD10eXBlb2YgYT09Im51bWJlciI/YTowLHRoaXMueT10eXBlb2YgYj09Im51bWJlciI/YjowLHRoaXMuej10eXBlb2YgYz09Im51bWJlciI/YzowfSx6MTg1OmZ1bmN0aW9uKGEpe3ZhciBiPSIiO3N3aXRjaChhKXtjYXNlIno1MCI6Yj0iRW5hYmxlIERldmVsb3BlciBwYXJhbWV0ZXJzIjticmVhaztjYXNlIno0OSI6Yj0iQ2hhbmdpbmcgVGhpcyBWaW9sYXRlcyBMaWNlbnNlIEFncmVlbWVudCI7YnJlYWs7Y2FzZSJ6NDgiOmI9IlN1cHBvcnQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIGVuYWJsZWQgb25seSBpbiB0aGUgWm9vbWlmeSBJbWFnZSBWaWV3ZXIgaW5jbHVkZWQgaW4gdGhlIFpvb21pZnkgSFRNTDUgRGV2ZWxvcGVyIGVkaXRpb246ICI7YnJlYWs7Y2FzZSJ6MjUiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NjAiOmI9IjMwMDAwIjticmVhaztjYXNlIno2MSI6Yj0iMjU2IjticmVhaztjYXNlIno1OSI6Yj0iMS4xNSI7YnJlYWs7Y2FzZSJ6NjIiOmI9IjMwMCI7YnJlYWs7Y2FzZSJ6NyI6Yj0iNiI7YnJlYWs7Y2FzZSJ6NiI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NSI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NCI6Yj0iMiI7YnJlYWs7Y2FzZSJ6MyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6NDUiOmI9IjIiO2JyZWFrO2Nhc2UiejQ2IjpiPSI1IjticmVhaztjYXNlIno0NyI6Yj0iMTAiO2JyZWFrO2Nhc2UiejgwIjpiPSI1IjticmVhaztjYXNlIno4MSI6Yj0iMC4wMiI7YnJlYWs7Y2FzZSJ6NzciOmI9IjMwIjticmVhaztjYXNlIno3OCI6Yj0iMjAwIjticmVhaztjYXNlIno3OSI6Yj0iMTAiO2JyZWFrO2Nhc2UiejEwVElFUlNLSVBUSFJFU0hPTEQiOmI9IjAxLiI7YnJlYWs7Y2FzZSJ6MjQiOmI9IjEwIjticmVhaztjYXNlInoxOCI6Yj0iNSI7YnJlYWs7Y2FzZSJ6MTkiOmI9IjAuMDY3IjticmVhaztjYXNlIno2NCI6Yj0iNCI7YnJlYWs7Y2FzZSJ6NjMiOmI9IjEiO2JyZWFrO2Nhc2UiejY1IjpiPSIxIjticmVhaztjYXNlIno0MyI6Yj0iMiI7YnJlYWs7Y2FzZSJ6NDQiOmI9IjE1MCI7YnJlYWs7Y2FzZSJ6MzkiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NDAiOmI9IjAiO2JyZWFrO2Nhc2UiejQyIjpiPSIwIjticmVhaztjYXNlInozOCI6Yj1udWxsO2JyZWFrO2Nhc2UiejM2IjpiPSIjZmZmZmZmIjticmVhaztjYXNlInozNk5PQUxQSEEiOmI9IiNmYmZhZmEiO2JyZWFrO2Nhc2UiejM1IjpiPSIwLjc1IjticmVhaztjYXNlIno0MSI6Yj0iYmx1ZSI7YnJlYWs7Y2FzZSJ6NTUiOmI9InNraW5GaWxlcy54bWwiO2JyZWFrO2Nhc2UiejU2IjpiPSJBc3NldHMvU2tpbnMvRGVmYXVsdCI7YnJlYWs7Y2FzZSJ6NTQiOmI9IjAiO2JyZWFrO2Nhc2UiejEyIjpiPSIxIjticmVhaztjYXNlIno1OCI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NTciOmI9IjEwIjticmVhaztjYXNlInoyMyI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MjIiOmI9IndoaXRlIjticmVhaztjYXNlInoyMSI6Yj0iWCI7YnJlYWs7Y2FzZSJ6MjAiOmI9Ilx0I0Y4RjhGOCI7YnJlYWs7Y2FzZSJ6NTMiOmI9IjEiO2JyZWFrO2Nhc2UiejUxIjpiPSI1MDAiO2JyZWFrO2Nhc2UiejUyIjpiPSIgIjticmVhaztjYXNlInozMSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MzAiOmI9bnVsbDticmVhaztjYXNlIno4IjpiPSIxIjticmVhaztjYXNlInoxNyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6MTYiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6MTQiOmI9IndoaXRlIjticmVhaztjYXNlInoxMyI6Yj0iQWdyZWUiO2JyZWFrO2Nhc2UiejE1IjpiPSJFeGl0IjticmVhaztjYXNlIno3MyI6Yj0iMC42IjticmVhaztjYXNlIno3NCI6Yj0iMC4zMyI7YnJlYWs7Y2FzZSJ6NzYiOmI9IjUxMiI7YnJlYWs7Y2FzZSJ6NzUiOmI9IjM4NCI7YnJlYWs7Y2FzZSJ6MjYiOmI9bnVsbDticmVhaztjYXNlInoyNyI6Yj1udWxsO2JyZWFrO2Nhc2UiejI4IjpiPW51bGw7YnJlYWs7Y2FzZSJ6MzMiOmI9bnVsbDticmVhaztjYXNlInozMiI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MTAiOmI9IjEiO2JyZWFrO2Nhc2UiejkiOmI9IjEiO2JyZWFrO2Nhc2UiejM0IjpiPSIxIjticmVhaztjYXNlInoyOSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NjciOmI9IlRoaXMgcGFuZWwgaXMgZW5hYmxlZCB1c2luZyB0aGUgSFRNTCBwYXJhbWV0ZXIgJ3pEZWJ1Zz0xJy4gSXQgY2FuIGJlIGNhbGxlZCBhcyBmb2xsb3dzOlxuXG4gICBaLlV0aWxzLnRyYWNlKCd2YWx1ZSB0byBkaXNwbGF5Jyk7ICBcblxuVGhlIGJ1dHRvbnMgYmVsb3cgZGlzcGxheSBvciBtb2RpZnkgaW1wb3J0YW50IHN0YXRlIHZhbHVlcy4gIFdlYiBkZXNpZ25lcnMgbmV3IHRvIEphdmFTY3JpcHQgd2lsbCBhbHNvIGJlbmVmaXQgZnJvbSB0aGUgY29uc29sZSwgdHJhY2UsIHByb2ZpbGluZywgYW5kIG90aGVyIGRlYnVnZ2luZyBmZWF0dXJlcyBvZiBsZWFkaW5nIGJyb3dzZXJzLiI7YnJlYWs7Y2FzZSJ6NjgiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6NjYiOmI9IndoaXRlIjticmVhaztjYXNlIno2OSI6Yj0iU2hvdyBHbG9iYWxzIjticmVhaztjYXNlIno3MiI6Yj0iVG9nZ2xlIERpc3BsYXkiO2JyZWFrO2Nhc2UiejcwIjpiPSJUb2dnbGUgQmFja2ZpbGwiO2JyZWFrO2Nhc2UiejcxIjpiPSJUb2dnbGUgQ29uc3RyYWluIFBhbiI7YnJlYWs7Y2FzZSJ6OTkiOmI9IkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdC4iO2JyZWFrO2Nhc2Uiejg3LUlNQUdFWE1MIjpiPSJFcnJvciBsb2FkaW5nIGltYWdlOiBwbGVhc2UgbWFrZSBzdXJlIGltYWdlIHBhdGggaW4gd2ViIHBhZ2UgbWF0Y2hlcyBpbWFnZSBmb2xkZXIgbG9jYXRpb24gb24gd2Vic2VydmVyLiI7YnJlYWs7Y2FzZSJ6ODctVE9PTEJBUlhNTCI6Yj0iRXJyb3IgbG9hZGluZyB0b29sYmFyOiBwbGVhc2UgdmVyaWZ5IHNraW4gZmlsZXMgYXJlIG9uIHdlYnNlcnZlciBpbiBzYW1lIGZvbGRlciBhcyB6MTIyLmpzIGZpbGUgYW5kIGFyZSBpbiBkZWZhdWx0IGZvbGRlciBzdHJ1Y3R1cmUgJ0Fzc2V0cy9Ta2lucy9EZWZhdWx0Jywgb3IgYWRkIHpTa2luUGF0aCBwYXJhbWV0ZXIgdG8gd2VicGFnZS4iO2JyZWFrO2Nhc2Uiejg3IjpiPSJFcnJvciBtYWtpbmcgbmV0d29yayByZXF1ZXN0OiBwb3NzaWJsZSBpbnZhbGlkIHBhdGggb3IgbmV0d29yayBlcnJvci4iO2JyZWFrO2Nhc2Uiejg0IjpiPSJJbWFnZSBmYWlsZWQgdG8gbG9hZDogcG9zc2libGUgaW52YWxpZCBwYXRoLCBtaXNzaW5nIGltYWdlLCBvciBuZXR3b3JrIGVycm9yLiI7YnJlYWs7Y2FzZSJ6ODkiOmI9IkVycm9yIHJlbGF0ZWQgdG8gbmV0d29yayBzZWN1cml0eTogIjticmVhaztjYXNlIno5MCI6Yj0iRXJyb3IgcmVsYXRlZCB0byBuZXR3b3JrIHN0YXR1czogIjticmVhaztjYXNlIno4MiI6Yj0iIGNvbnZlcnRpbmcgWE1MIHRleHQgdG8gWE1MIGRvYyAoRE9NUGFyc2VyKTogIjticmVhaztjYXNlIno5OCI6Yj0iQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhNTCBET00uIjticmVhaztjYXNlInoxMDAiOmI9IlhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODYiOmI9IkltYWdlIFhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODMiOmI9IiB3aGlsZSBleGVjdXRpbmcgY2FsbGJhY2s6ICI7YnJlYWs7Y2FzZSJ6ODUiOmI9IkltYWdlIHRpbWVkIG91dDogIjticmVhaztjYXNlIno4OCI6Yj0iTmF2aWdhdG9yIGltYWdlIGZhaWxlZCB0byBsb2FkOiBwb3NzaWJsZSBpbnZhbGlkIHBhdGgsIG1pc3NpbmcgaW1hZ2UsIG9yIG5ldHdvcmsgZXJyb3IuIjticmVhaztjYXNlIno5MSI6Yj0iU2tpbiBYTUwgaW52YWxpZC4iO2JyZWFrO2Nhc2UiejkyIjpiPSJUaGUgc2tpbiBYTUwgZmlsZSBoYXMgb25lIG9yIG1vcmUgZmF1bHR5IG5hbWUgbGluZXMuIjticmVhaztjYXNlIno5NyI6Yj0iV2F0ZXJtYXJrIGltYWdlIGZhaWxlZCB0byBsb2FkOiAiO2JyZWFrO2Nhc2UiejkzIjpiPSJVbmtub3duIGVsZW1lbnQgc3R5bGUgLSBubyBrbm93biBtZXRob2QgdG8gaWRlbnRpZnkuIjticmVhaztjYXNlIno5NCI6Yj0iVW5rbm93biBtb3VzZSBwb3NpdGlvbiAtIG5vIGtub3duIG1ldGhvZCB0byBjYWxjdWxhdGUuIjticmVhaztjYXNlIno5NSI6Yj0iVW5rbm93biBtb3VzZSBzY3JvbGwgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6OTYiOmI9IlVua25vd24gd2luZG93IHNpemUgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6MTA2IjpiPSJMYXVuY2ggWm9vbWlmeSBXZWJzaXRlIjticmVhaztjYXNlInoxMDciOmI9Ik1pbmltaXplIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEwNSI6Yj0iRXhwYW5kIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEyMCI6Yj0iWm9vbSBPdXQiO2JyZWFrO2Nhc2UiejExNCI6Yj0iWm9vbSBJbiBBbmQgT3V0IjticmVhaztjYXNlInoxMTkiOmI9Ilpvb20gSW4iO2JyZWFrO2Nhc2UiejEwOSI6Yj0iUGFuIExlZnQiO2JyZWFrO2Nhc2UiejExMSI6Yj0iUGFuIFVwIjticmVhaztjYXNlInoxMDgiOmI9IlBhbiBEb3duIjticmVhaztjYXNlInoxMTAiOmI9IlBhbiBSaWdodCI7YnJlYWs7Y2FzZSJ6MTEyIjpiPSJSZXNldCBJbml0aWFsIFZpZXciO2JyZWFrO2Nhc2UiejExOCI6Yj0iVG9nZ2xlIEZ1bGwgUGFnZSBWaWV3IjticmVhaztjYXNlInoxMDIiOmI9IkNhbmNlbCBGdWxsIFBhZ2UgVmlldyI7YnJlYWs7Y2FzZSJ6MTAzIjpiPSJBZ3JlZSB0byBjb3B5cmlnaHQgYW5kIHZpZXcgaW1hZ2VzIjticmVhaztjYXNlInoxMDQiOmI9IkV4aXQgYW5kIGRvIG5vdCB2aWV3IGltYWdlcyI7YnJlYWs7Y2FzZSJ6MTEzIjpiPSJUb2dnbGUgRnVsbCBQYWdlIFZpZXciO2JyZWFrO2Nhc2UiejExNyI6Yj0iVG9nZ2xlIFZpZXdwb3J0IERpc3BsYXkiO2JyZWFrO2Nhc2UiejExNSI6Yj0iVG9nZ2xlIFZpZXdwb3J0IEJhY2tmaWxsIjticmVhaztjYXNlInoxMTYiOmI9IlRvZ2dsZSBDb25zdHJhaW4gUGFuIjticmVhaztkZWZhdWx0OmI9IlVuZXhwZWN0ZWQgcmVzb3VyY2UgcmVxdWVzdCJ9cmV0dXJuIGJ9LHoyNTM6ZnVuY3Rpb24oKXt2YXIgYT0iIjthKz0iXG4iLGErPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTUlGWSBJTUFHRSBWSUVXRVIgLSBDVVJSRU5UIFZBTFVFU1xuIixhKz0iXG4iLGErPSJJTUFHRSAmIFNLSU46ICAgICIsYSs9IlouaW1hZ2VQYXRoPSIrWi5pbWFnZVBhdGgrIiwgICAiLGErPSJaLnNraW5QYXRoPSIrWi5za2luUGF0aCsiLCAgICIsYSs9Ilouc2tpbk1vZGU9IitaLnNraW5Nb2RlKyIsICAgIixhKz0iWi5pbWFnZVc9IitaLmltYWdlVysiLCAgICIsYSs9IlouaW1hZ2VIPSIrWi5pbWFnZUgrIiwgICAiLGErPSJ0aWVyQ291bnQ9IitaLlZpZXdwb3J0LnoxODYoKSsiLCAgICIsYSs9IlRJTEVfU0laRT0iK1ouVmlld3BvcnQuejE5NSgpKyJcbiIsYSs9IlxuIixhKz0iUEFHRSAmIEJST1dTRVI6ICAgICIsYSs9IloucGFnZUNvbnRhaW5lcj0iK1oucGFnZUNvbnRhaW5lcisiLCAgICIsYSs9IlouYnJvd3Nlcj0iK1ouYnJvd3NlcisiLCAgICIsYSs9IlouYnJvd3NlclZlcnNpb249IitaLmJyb3dzZXJWZXJzaW9uKyIsICAgIixhKz0iWi5jYW52YXNTdXBwb3J0ZWQ9IitaLmNhbnZhc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD0iK1ouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3JtUHJvcGVydHk9IitaLmNzc1RyYW5zZm9ybVByb3BlcnR5KyIsICAgIixhKz0iWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPSIrWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzKyIsICAgIixhKz0iWi5hbHBoYVN1cHBvcnRlZD0iK1ouYWxwaGFTdXBwb3J0ZWQrIiwgICAiLGErPSJaLnJlbmRlclF1YWxpdHk9IitaLnJlbmRlclF1YWxpdHkrIiwgICAiLGErPSJaLm1vYmlsZURldmljZT0iK1oubW9iaWxlRGV2aWNlKyJcbiIsYSs9IlxuIixhKz0iVklFV0VSIE9QVElPTlMgJiBERUZBVUxUUzogICAgIixhKz0iWi5pbml0aWFsWD0iK1ouaW5pdGlhbFgrIiwgICAiLGErPSJaLmluaXRpYWxZPSIrWi5pbml0aWFsWSsiLCAgICIsYSs9IlouaW5pdGlhbFo9IitaLmluaXRpYWxaKyIsICAgIixhKz0iWi5taW5aPSIrWi5taW5aKyIsICAgIixhKz0iWi5tYXhaPSIrWi5tYXhaKyIsICAgIixhKz0iWi5maXRaPSIrWi5maXRaKyIsICAgIixhKz0iWi56b29tU3BlZWQ9IitaLnpvb21TcGVlZCsiLCAgICIsYSs9IloucGFuU3BlZWQ9IitaLnBhblNwZWVkKyIsICAgIixhKz0iWi5mYWRlSW5TcGVlZD0iK1ouZmFkZUluU3BlZWQrIiwgICAiLGErPSJaLnRvb2xiYXJWaXNpYmxlPSIrWi50b29sYmFyVmlzaWJsZSsiLCAgICIsYSs9IloudG9vbGJhclc9IitaLnRvb2xiYXJXKyIsICAgIixhKz0iWi50b29sYmFyQ3VycmVudFc9IitaLnRvb2xiYXJDdXJyZW50VysiLCAgICIsYSs9IloudG9vbGJhckg9IitaLnRvb2xiYXJIKyIsICAgIixhKz0iWi50b29sYmFyUG9zaXRpb249IitaLnRvb2xiYXJQb3NpdGlvbisiLCAgICIsYSs9IloudG9vbHRpcHNWaXNpYmxlPSIrWi50b29sdGlwc1Zpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclZpc2libGU9IitaLm5hdmlnYXRvclZpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclc9IitaLm5hdmlnYXRvclcrIiwgICAiLGErPSJaLm5hdmlnYXRvckg9IitaLm5hdmlnYXRvckgrIiwgICAiLGErPSJaLm5hdmlnYXRvckw9IitaLm5hdmlnYXRvckwrIiwgICAiLGErPSJaLm5hdmlnYXRvclQ9IitaLm5hdmlnYXRvclQrIiwgICAiLGErPSJaLm5hdmlnYXRvckZpdD0iK1oubmF2aWdhdG9yRml0KyIsICAgIixhKz0iWi5jbGlja1pvb209IitaLmNsaWNrWm9vbSsiLCAgICIsYSs9IlouY2xpY2tQYW49IitaLmNsaWNrUGFuKyIsICAgIixhKz0iWi5tb3VzZVBhbj0iK1oubW91c2VQYW4rIiwgICAiLGErPSJaLmtleXM9IitaLmtleXMrIiwgICAiLGErPSJaLmNvbnN0cmFpblBhbj0iK1ouY29uc3RyYWluUGFuKyIsICAgIixhKz0iV2F0ZXJtYXJrIGFscGhhID0gIitaLlV0aWxzLnoxODUoIno3MyIpKyIsICAgIixhKz0iWi53YXRlcm1hcmtQYXRoPSIrWi53YXRlcm1hcmtQYXRoKyIsICAgIixhKz0iWi5jb3B5cmlnaHRQYXRoPSIrWi5jb3B5cmlnaHRQYXRoKyIsICAgIixhKz0iWi5zbGlkZXJWaXNpYmxlPSIrWi5zbGlkZXJWaXNpYmxlKyIsICAgIixhKz0iWi5mdWxsUGFnZVZpc2libGU9IitaLmZ1bGxQYWdlVmlzaWJsZSsiLCAgICIsYSs9IloucHJvZ3Jlc3NWaXNpYmxlPSIrWi5wcm9ncmVzc1Zpc2libGUrIiwgICAiLGErPSJaLmxvZ29WaXNpYmxlPSIrWi5sb2dvVmlzaWJsZSsiLCAgICIsYSs9IloubG9nb0N1c3RvbVBhdGg9IitaLmxvZ29DdXN0b21QYXRoKyIsICAgIixhKz0iWi5jYW52YXM9IitaLmNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIFZBTFVFUzogICAgIixhKz0iXG4iLGErPSJkaXNwbGF5Vz0iK1ouVmlld3BvcnQuejIwMSgpKyIsICAgIixhKz0iZGlzcGxheUg9IitaLlZpZXdwb3J0LnoxNzkoKSsiLCAgICIsYSs9InRpZXJDdXJyZW50PSIrWi5WaWV3cG9ydC56MTg3KCkrIiwgICAiLGErPSJ0aWVyU2NhbGU9IitaLlZpZXdwb3J0LnoxODkoKSsiLCAgICIsYSs9IlRJRVJTX01BWF9TQ0FMRV9VUD0iK1ouVmlld3BvcnQuejE5NCgpKyIsICAgIixhKz0iVElFUlNfTUFYX1NDQUxFX0RPV049IitaLlZpZXdwb3J0LnoxOTMoKSsiLCAgICIsYSs9IlRJTEVTX01BWF9DQUNIRT0iK1ouVmlld3BvcnQuejE5NygpKyIsICAgIixhKz0iWi51c2VDYW52YXM9IitaLnVzZUNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIExJU1RTOiAgICAiLGErPSJ0aWVyV3M9IitaLlZpZXdwb3J0LnoxOTIoKSsiLCAgICIsYSs9InRpZXJIcz0iK1ouVmlld3BvcnQuejE4OCgpKyIsICAgIixhKz0idGllclRpbGVDb3VudHM9IitaLlZpZXdwb3J0LnoxOTEoKSsiLCAgICIsYSs9InRpbGVzTG9hZGluZ05hbWVzPSIrWi5WaWV3cG9ydC56MTk2KCkrIlxuIixhKz0iXG4iLGFsZXJ0KGEpfSx6MjU2OmZ1bmN0aW9uKCl7Wi5UcmFjZURpc3BsYXk/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT09ImlubGluZS1ibG9jayI/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0ibm9uZSI6Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0iaW5saW5lLWJsb2NrIjpaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpfSxjb25maWd1cmVUcmFjZURpc3BsYXk6ZnVuY3Rpb24oKXt2YXIgYT1aLnZpZXdlclcvMyxiPVoudmlld2VySC8zKzQ1LGM9MTAsZD1wYXJzZUZsb2F0KFoudmlld2VySCkvMyxlPXRoaXMuejE4NSgiejY4Iik7Wi5UcmFjZURpc3BsYXk9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUcmFjZURpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsYSsicHgiLGIrInB4IixjKyJweCIsZCsicHgiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMTBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRyYWNlRGlzcGxheSksWi50cmFjZXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTt2YXIgZj1aLnRyYWNlcy5zdHlsZTtmLndpZHRoPWEtMTUrInB4IixmLmhlaWdodD1iLTYwKyJweCIsZi5mb250RmFtaWx5PSJ2ZXJkYW5hIixmLmZvbnRTaXplPSIxMHB4IixmLmJvcmRlcj0ic29saWQiLGYuYm9yZGVyV2lkdGg9IjFweCIsZi5wYWRkaW5nPSI1cHgiLGYucmVzaXplPSJub25lIixaLnRyYWNlcy52YWx1ZT0iVHJhY2UgVmFsdWVzXG4iLFouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKFoudHJhY2VzKTt2YXIgZz01OCxoPTQyLGk9MjAsaj1iLWgvMi0xMCxrPTEwLGw9dGhpcy56MTg1KCJ6NjYiKSxtPXRoaXMuejE4NSgiejY5Iiksbj1uZXcgdGhpcy5CdXR0b24oImJ1dHRvblNob3dHbG9iYWxzIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLHRoaXMuejI1MywiejExMyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChuLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MiIpLG89bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVEaXNwbGF5IixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQuejI3MiwiejExNyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChvLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MCIpLHA9bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVCYWNrZmlsbCIsbSxudWxsLG51bGwsbnVsbCxudWxsLGcrInB4IixoKyJweCIsaSsicHgiLGorInB4IiwibW91c2Vkb3duIixaLlZpZXdwb3J0LnoyNzEsInoxMTUiLCJzb2xpZCIsIjFweCIsbCwiMHB4IiwiMHB4Iik7Wi5UcmFjZURpc3BsYXkuYXBwZW5kQ2hpbGQocC5lbG10KSxpKz1nK2ssZys9MTI7dmFyIG09dGhpcy56MTg1KCJ6NzEiKSxxPW5ldyB0aGlzLkJ1dHRvbigiYnV0dG9uVG9nZ2xlQ29uc3RyYWluUGFuIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQudG9nZ2xlQ29uc3RyYWluUGFuLCJ6MTE2Iiwic29saWQiLCIxcHgiLGwsIjBweCIsIjBweCIpO1ouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKHEuZWxtdCl9LHRyYWNlOmZ1bmN0aW9uKGEpe1ouVHJhY2VEaXNwbGF5fHxaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpLFoudHJhY2VzJiYoWi50cmFjZXMudmFsdWUrPSJcbiIrYSsiXG4iKX19";
FIND j=4596 line= ";
FIND j=4597 line= </script>
FIND j=4598 line=
FIND j=4599 line=
FIND j=4600 line=
FIND j=4601 line=
FIND j=4602 line= <script id="script_addChild" >
FIND j=4603 line= var childNumber_zm = 3;
FIND j=4604 line= var zmx = new Array();
FIND j=4605 line= var z = 0;
FIND j=4606 line= zmx[z++] = "./zm/nasa/";
FIND j=4607 line= zmx[z++] = "./zm/appolo/";
FIND j=4608 line= zmx[z++] = "./zm/appolo17_4800/";
FIND j=4609 line= zmx[z++] = "./zm/zm5_planets/";
FIND j=4610 line= zmx[z++] = "./zm/zm_nasa/";
FIND j=4611 line= zmx[z++] = "./ko_jtf/jft_parcels/";
FIND j=4612 line=// alert( "addChild zmx len="+zmx.length );
FIND j=4613 line= var childNumber = 3;
FIND j=4614 line= function addChild() {
FIND j=4615 line= alert( "addChild() zmx len="+zmx.length );
FIND j=4616 line= var parent = document.getElementById('div_addchild');
FIND j=4617 line= var newChild = '<p>Child ' + childNumber + '</p>';
FIND j=4618 line= newChild += "<h1>addChild one</h1>";
FIND j=4619 line= newChild += "<h1>addChild two</h1>";
FIND j=4620 line= parent.insertAdjacentHTML('beforeend', newChild);
FIND j=4621 line= childNumber++;
FIND j=4622 line= }
FIND j=4623 line= </script>
FIND j=4624 line=
FIND j=4625 line= <script id="script_addChild_zm" >
FIND j=4626 line= var childNumber_zm = 3;
FIND j=4627 line= var zmx = new Array();
FIND j=4628 line= var z = 0;
FIND j=4629 line= alert( "addChild_zm zmx len="+zmx.length );
FIND j=4630 line=// zmx[z++] = "./zm/nasa/";
FIND j=4631 line=// zmx[z++] = "./zm/appolo/";
FIND j=4632 line=// zmx[z++] = "./zm/appolo17_4800/";
FIND j=4633 line=// zmx[z++] = "./zm/zm5_planets/";
FIND j=4634 line=// zmx[z++] = "./zm/zm_nasa/";
FIND j=4635 line=// zmx[z++] = "./ko_jtf/jft_parcels/";
FIND j=4636 line=
FIND j=4637 line=
FIND j=4638 line= function addChild_zm() {
FIND j=4639 line=// alert( "BUGS_176: addChild_zm" );
FIND j=4640 line=
FIND j=4641 line= var parent = document.getElementById('div_zmlist');
FIND j=4642 line= var newChild_zm = '<p>zm ' + childNumber_zm + '</p>';
FIND j=4643 line= newChild_zm += "<h1>addChild_zm one</h1>";
FIND j=4644 line=
FIND j=4645 line= for( z = 0: z < zmx.length; z++ ) {
FIND j=4646 line= newChild_zm += "<a href='" + zmx[z] + "/index.html' target=_blank>"
FIND j=4647 line= newChild_zm += "<img src='"+ zmx[z] + "/index.png' alt='./zm/index.png' border=0></a>";
FIND j=4648 line= }
FIND j=4649 line= parent.insertAdjacentHTML('beforeend', newChild_zm);
FIND j=4650 line= childNumber++;
FIND j=4651 line= }
FIND j=4652 line= </script>
FIND j=4653 line=
FIND j=4654 line= <script id="script_zmlist" >
FIND j=4655 line= var childNumber_zm = 3;
FIND j=4656 line= function script_zmlist() {
FIND j=4657 line= script_zmlist_load();
FIND j=4658 line=// alert( "bugs177 script_zmlist_load OK" );
FIND j=4659 line= script_zmlist_show();
FIND j=4660 line=// var parent = document.getElementById('div_zmlist');
FIND j=4661 line=// var newChild_zm = '<p>zm ' + childNumber_zm + '</p>';
FIND j=4662 line=// newChild_zm += "<hr color=white><h1>zmlist one</h1><hr color=white>";
FIND j=4663 line=// parent.insertAdjacentHTML('beforeend', newChild_zm);
FIND j=4664 line=// childNumber++;
FIND j=4665 line= }
FIND j=4666 line= </script>
FIND j=4667 line=
FIND j=4668 line=
FIND j=4669 line= <style name="style_zm">
FIND j=4670 line= body { text-align: center; background-color: "slategrey"; color:"white"; }
FIND j=4671 line= button {
FIND j=4672 line=// visibility: hidden;
FIND j=4673 line=// background: rgba(7, 99, 53, .1);
FIND j=4674 line= background: transparent;
FIND j=4675 line= border: 3px solid rgba(7, 99, 53, 1);
FIND j=4676 line= border-radius: 5px;
FIND j=4677 line= color: rgba(7, 99, 53, 1);
FIND j=4678 line= cursor: pointer;
FIND j=4679 line= line-height: 40px;
FIND j=4680 line= font-size: 30px;
FIND j=4681 line= outline: none;
FIND j=4682 line= padding: 0 20px;
FIND j=4683 line= transition: all .3s;
FIND j=4684 line= }
FIND j=4685 line= button:hover {
FIND j=4686 line=// background: rgba(7, 99, 53, 1);
FIND j=4687 line= background: darkgreyslate;
FIND j=4688 line= background: yellow;
FIND j=4689 line= color: rgba(255,255,255,1);
FIND j=4690 line= }
FIND j=4691 line= p {font-size: 20px; font-weight: bold;
FIND j=4692 line= </style>
FIND j=4693 line=
FIND j=4694 line=<body>
FIND j=4695 line=
FIND j=4696 line=
FIND j=4697 line= <button type="button" onclick="script_zmlist()">script_zmlist</button>
FIND j=4698 line= <button type="button" onclick="addChild_zm()">addChild_zm</button>
FIND j=4699 line= <button type="button" onclick="addChild()">addChild</button>
FIND j=4700 line= <hr>
FIND j=4701 line=
FIND j=4702 line= <script > function imgWindow() {window.open("image") } </script>
FIND j=4703 line= <img src="./imgs/btn/koeye.png" height="50" size="150" alt="koeye" onclick="script_zmlist()">
FIND j=4704 line= <img src="./imgs/btn/koeyeb.png" height="50" size="150" alt="koeyeb" onclick="addChild_zm()">
FIND j=4705 line= <img src="./imgs/btn/koeyew.png" height="50" size="150" alt="koeyew" onclick="addChild()">
FIND j=4706 line=
FIND j=4707 line= <div id="div_addchild">
FIND j=4708 line= <p>Child 1</p>
FIND j=4709 line= <p>Child 2</p>
FIND j=4710 line= </div>
FIND j=4711 line=
FIND j=4712 line= <div id="div_zmlist">
FIND j=4713 line= <h1>div_zmlist</h1>
FIND j=4714 line= <p>Child_zm 1</p>
FIND j=4715 line= <p>Child_zm 2</p>
FIND j=4716 line= </div>
FIND j=4717 line=
FIND j=4718 line= <div id="div_addchild_zm" >
FIND j=4719 line= <h1>div_addchild_zm</h1>
FIND j=4720 line= addchild_zm <br>
FIND j=4721 line= </div>
FIND j=4722 line=
FIND j=4723 line=
FIND j=4724 line= <script id="script_zmlist" >
FIND j=4725 line= var zmlist = new Array();
FIND j=4726 line=
FIND j=4727 line=// function script_zmlist_hover() {body { background-color: blue; }}
FIND j=4728 line=
FIND j=4729 line= function script_zmlist_load() {
FIND j=4730 line= var z=0;
FIND j=4731 line= zmlist[z++] = "./zm/zm_nasa/mars_zigzag_panels2400/TileGroup0/0-0-0.jpg";
FIND j=4732 line= zmlist[z++] = "./zm/zm_nasa/nasa/1-scientistsfl/TileGroup0/0-0-0.jpg";
FIND j=4733 line= zmlist[z++] = "./zm/zm_nasa/nasa/Echus-Chasma-On-Mars/TileGroup0/0-0-0.jpg";
FIND j=4734 line=// alert( "zmlist"+z+" zmlist("+z+")="+zmlist[z] );
FIND j=4735 line= zmlist[z++] = "./zm/zm_nasa/nasa/mars_zigzag_panels/TileGroup0/0-0-0.jpg";
FIND j=4736 line= zmlist[z++] = "./zm/zm_nasa/zm/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg";
FIND j=4737 line= zmlist[z++] = "./zm/zm_nasa/venus_400/TileGroup0/0-0-0.jpg";
FIND j=4738 line= zmlist[z++] = "./zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg";
FIND j=4739 line= zmlist[z++] = "./zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg";
FIND j=4740 line= zmlist[z++] = "./zm/hrc2009stl/TileGroup0/0-0-0.jpg";
FIND j=4741 line= zmlist[z++] = "./zm/hrc2011/TileGroup0/0-0-0.jpg";
FIND j=4742 line= zmlist[z++] = "./zm/komap/TileGroup0/0-0-0.jpg";
FIND j=4743 line= zmlist[z++] = "./zm/zm_nasa/apollo/070214_val_marineris_02/TileGroup0/0-0-0.jpg";
FIND j=4744 line= zmlist[z++] = "./zm/zm_nasa/apollo/071010-msl-site1-02/TileGroup0/0-0-0.jpg";
FIND j=4745 line= zmlist[z++] = "./zm/zm_nasa/apollo/071127-venus-surface-02/TileGroup0/0-0-0.jpg";
FIND j=4746 line= zmlist[z++] = "./zm/zm_nasa/apollo/080409-phobos-02/TileGroup0/0-0-0.jpg";
FIND j=4747 line= zmlist[z++] = "./zm/zm_nasa/apollo/081016-crater-mound-02/TileGroup0/0-0-0.jpg";
FIND j=4748 line= zmlist[z++] = "./zm/zm_nasa/apollo/081103-mars-ripples-02/TileGroup0/0-0-0.jpg";
FIND j=4749 line= zmlist[z++] = "./zm/zm_nasa/apollo/081204-rock-layers-02/TileGroup0/0-0-0.jpg";
FIND j=4750 line= zmlist[z++] = "./zm/zm_nasa/apollo/090331-mars-starburst-02/TileGroup0/0-0-0.jpg";
FIND j=4751 line= zmlist[z++] = "./zm/zm_nasa/apollo/090813-mars-crater-02.jpg/TileGroup0/0-0-0.jpg";
FIND j=4752 line= zmlist[z++] = "./zm/zm_nasa/apollo/100113-mars-illusion-02/TileGroup0/0-0-0.jpg";
FIND j=4753 line= zmlist[z++] = "./zm/zm_nasa/apollo/20070507_185501_1010108/TileGroup0/0-0-0.jpg";
FIND j=4754 line= zmlist[z++] = "./zm/zm_nasa/apollo/365430main_nacl000000fd_middle_540x540/TileGroup0/0-0-0.jpg";
FIND j=4755 line= zmlist[z++] = "./zm/zm_nasa/apollo/367307main_cracked_hahn_lg/TileGroup0/0-0-0.jpg";
FIND j=4756 line= zmlist[z++] = "./zm/zm_nasa/apollo/369230main_apollolandinglocator_full/TileGroup0/0-0-0.jpg";
FIND j=4757 line= zmlist[z++] = "./zm/zm_nasa/apollo/388038main_milichius_full/TileGroup0/0-0-0.jpg";
FIND j=4758 line= zmlist[z++] = "./zm/zm_nasa/apollo/393992main_ejecta_20091014_full/TileGroup0/0-0-0.jpg";
FIND j=4759 line= zmlist[z++] = "./zm/zm_nasa/apollo/400202main_lroc_apollo11_20091109_full/TileGroup0/0-0-0.jpg";
FIND j=4760 line= zmlist[z++] = "./zm/zm_nasa/apollo/403330main_cabeus_lg/TileGroup0/0-0-0.jpg";
FIND j=4761 line= zmlist[z++] = "./zm/zm_nasa/apollo/414923main_wrinkle-ridge-full/TileGroup0/0-0-0.jpg";
FIND j=4762 line= zmlist[z++] = "./zm/zm_nasa/apollo/416286main_new-images-1-full/TileGroup0/0-0-0.jpg";
FIND j=4763 line= zmlist[z++] = "./zm/zm_nasa/apollo/417415main_tychocloseup-20100115-full/TileGroup0/0-0-0.jpg";
FIND j=4764 line= zmlist[z++] = "./zm/zm_nasa/apollo/417417main_tychofull-20100115-full/TileGroup0/0-0-0.jpg";
FIND j=4765 line= zmlist[z++] = "./zm/zm_nasa/apollo/417869main_arist_bands321-full/TileGroup0/0-0-0.jpg";
FIND j=4766 line= zmlist[z++] = "./zm/zm_nasa/apollo/417873main_M111918050R_thumb-full/TileGroup0/0-0-0.jpg";
FIND j=4767 line= zmlist[z++] = "./zm/zm_nasa/apollo/419421main_AS16-M-0891-full/TileGroup0/0-0-0.jpg";
FIND j=4768 line= zmlist[z++] = "./zm/zm_nasa/apollo/419425main_M106088433R-full/TileGroup0/0-0-0.jpg";
FIND j=4769 line= zmlist[z++] = "./zm/zm_nasa/apollo/421320main_hadley_rille/TileGroup0/0-0-0.jpg";
FIND j=4770 line= zmlist[z++] = "./zm/zm_nasa/apollo/421615main_plato_2_lg/TileGroup0/0-0-0.jpg";
FIND j=4771 line= zmlist[z++] = "./zm/zm_nasa/apollo/421619main_plato_crater_lg/TileGroup0/0-0-0.jpg";
FIND j=4772 line= zmlist[z++] = "./zm/zm_nasa/apollo/422349main_byrgius-a-20100203-full/TileGroup0/0-0-0.jpg";
FIND j=4773 line= zmlist[z++] = "./zm/zm_nasa/apollo/422590-mars-taber-ansigt-/TileGroup0/0-0-0.jpg";
FIND j=4774 line= zmlist[z++] = "./zm/zm_nasa/apollo/424828main_LunarOrbiterIII_3085_med/TileGroup0/0-0-0.jpg";
FIND j=4775 line= zmlist[z++] = "./zm/zm_nasa/apollo/433446main_20100311_crisium_lg/TileGroup0/0-0-0.jpg";
FIND j=4776 line= zmlist[z++] = "./zm/zm_nasa/apollo/445016main_anax3600_500/TileGroup0/0-0-0.jpg";
FIND j=4777 line= zmlist[z++] = "./zm/zm_nasa/apollo/445021main_anax_wac_500/TileGroup0/0-0-0.jpg";
FIND j=4778 line= zmlist[z++] = "./zm/zm_nasa/apollo/449172main_WAC_crop_context/TileGroup0/0-0-0.jpg";
FIND j=4779 line= zmlist[z++] = "./zm/zm_nasa/apollo/449174main_M104376385_thumb/TileGroup0/0-0-0.jpg";
FIND j=4780 line= zmlist[z++] = "./zm/zm_nasa/apollo/450800main_tsiol_2_lg/TileGroup0/0-0-0.jpg";
FIND j=4781 line= zmlist[z++] = "./zm/zm_nasa/apollo/450994main_full_moon_lg/TileGroup0/0-0-0.jpg";
FIND j=4782 line= zmlist[z++] = "./zm/zm_nasa/apollo/453514main_meteor_crater2_lg/TileGroup0/0-0-0.jpg";
FIND j=4783 line= zmlist[z++] = "./zm/zm_nasa/apollo/453516main_meteor_crater_az_lg/TileGroup0/0-0-0.jpg";
FIND j=4784 line= zmlist[z++] = "./zm/zm_nasa/apollo/455939main_holeinone_far_lg/TileGroup0/0-0-0.jpg";
FIND j=4785 line= zmlist[z++] = "./zm/zm_nasa/apollo/463365main_M128202846LE/TileGroup0/0-0-0.jpg";
FIND j=4786 line= zmlist[z++] = "./zm/zm_nasa/apollo/503670main_120210a/TileGroup0/0-0-0.jpg";
FIND j=4787 line= zmlist[z++] = "./zm/zm_nasa/apollo/521685main_022111a/TileGroup0/0-0-0.jpg";
FIND j=4788 line= zmlist[z++] = "./zm/zm_nasa/apollo/521691main_022111b/TileGroup0/0-0-0.jpg";
FIND j=4789 line= zmlist[z++] = "./zm/zm_nasa/apollo/524173main_022511a/TileGroup0/0-0-0.jpg";
FIND j=4790 line= zmlist[z++] = "./zm/zm_nasa/apollo/524220main_030211b/TileGroup0/0-0-0.jpg";
FIND j=4791 line= zmlist[z++] = "./zm/zm_nasa/apollo/528087main_031110a/TileGroup0/0-0-0.jpg";
FIND j=4792 line= zmlist[z++] = "./zm/zm_nasa/apollo/529214main_031611a/TileGroup0/0-0-0.jpg";
FIND j=4793 line= zmlist[z++] = "./zm/zm_nasa/apollo/529221main_031611c/TileGroup0/0-0-0.jpg";
FIND j=4794 line= zmlist[z++] = "./zm/zm_nasa/apollo/531407main_031811b/TileGroup0/0-0-0.jpg";
FIND j=4795 line= zmlist[z++] = "./zm/zm_nasa/apollo/533097main_033111b/TileGroup0/0-0-0.jpg";
FIND j=4796 line= zmlist[z++] = "./zm/zm_nasa/apollo/534165main_040511a/TileGroup0/0-0-0.jpg";
FIND j=4797 line= zmlist[z++] = "./zm/zm_nasa/apollo/536801main_041311aa/TileGroup0/0-0-0.jpg";
FIND j=4798 line= zmlist[z++] = "./zm/zm_nasa/apollo/539777main_042111b/TileGroup0/0-0-0.jpg";
FIND j=4799 line= zmlist[z++] = "./zm/zm_nasa/apollo/541041main_042711a/TileGroup0/0-0-0.jpg";
FIND j=4800 line= zmlist[z++] = "./zm/zm_nasa/apollo/555516main_053111a/TileGroup0/0-0-0.jpg";
FIND j=4801 line= zmlist[z++] = "./zm/zm_nasa/apollo/558017main_060211a/TileGroup0/0-0-0.jpg";
FIND j=4802 line= zmlist[z++] = "./zm/zm_nasa/apollo/561423main_060811b/TileGroup0/0-0-0.jpg";
FIND j=4803 line= zmlist[z++] = "./zm/zm_nasa/apollo/576849main_062811b/TileGroup0/0-0-0.jpg";
FIND j=4804 line= zmlist[z++] = "./zm/zm_nasa/apollo/576883main_062911b/TileGroup0/0-0-0.jpg";
FIND j=4805 line= zmlist[z++] = "./zm/zm_nasa/apollo/58-pluto-3-large/TileGroup0/0-0-0.jpg";
FIND j=4806 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap11_landinJSC2007e045375/TileGroup0/0-0-0.jpg";
FIND j=4807 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap12_landsitea_JSC2011e118358/TileGroup0/0-0-0.jpg";
FIND j=4808 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap15_9aa_JSC2007e045378/TileGroup0/0-0-0.jpg";
FIND j=4809 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap15_lmnortha_JSC2007e045379/TileGroup0/0-0-0.jpg";
FIND j=4810 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap15_s2a_JSC2011e118359/TileGroup0/0-0-0.jpg";
FIND j=4811 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_lmviewa_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=4812 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_lmwesat_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=4813 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s10a_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=4814 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s11a_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=4815 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s13_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=4816 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s13a_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=4817 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s1a_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=4818 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s1ba_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=4819 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_slandsitea_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=4820 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_alsepa_JSC2004e52772/TileGroup0/0-0-0.jpg";
FIND j=4821 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_eva1a_JSC2007e045384/TileGroup0/0-0-0.jpg";
FIND j=4822 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_evaalsepa_JSC2007e045385/TileGroup0/0-0-0.jpg";
FIND j=4823 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s1easta_JSC2004e52773/TileGroup0/0-0-0.jpg";
FIND j=4824 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s1westa_JSC2004e52776/TileGroup0/0-0-0.jpg";
FIND j=4825 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s2a_JSC2004e52777/TileGroup0/0-0-0.jpg";
FIND j=4826 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s2eva2a_JSC2004e52774/TileGroup0/0-0-0.jpg";
FIND j=4827 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s3a_JSC2004e52778/TileGroup0/0-0-0.jpg";
FIND j=4828 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s3a_JSC2007e045386/TileGroup0/0-0-0.jpg";
FIND j=4829 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s4a_JSC2007e045388/TileGroup0/0-0-0.jpg";
FIND j=4830 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s5_JSC2004e20304/TileGroup0/0-0-0.jpg";
FIND j=4831 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s5a_JSC2004e20304/TileGroup0/0-0-0.jpg";
FIND j=4832 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s6a_JSC2007e045387/TileGroup0/0-0-0.jpg";
FIND j=4833 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s6southa_JSC2004e52779/TileGroup0/0-0-0.jpg";
FIND j=4834 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s7a_JSC2004e52775/TileGroup0/0-0-0.jpg";
FIND j=4835 line= zmlist[z++] = "./zm/zm_nasa/apollo/apll-5_JSC2008e040725/TileGroup0/0-0-0.jpg";
FIND j=4836 line= zmlist[z++] = "./zm/zm_nasa/apollo/AS14-68-9450HR/TileGroup0/0-0-0.jpg";
FIND j=4837 line= zmlist[z++] = "./zm/zm_nasa/apollo/lunar-recon-orbiter-apollo-12-surveyor-3-sites-1/TileGroup0/0-0-0.jpg";
FIND j=4838 line= zmlist[z++] = "./zm/zm_nasa/appollo17_4800/TileGroup0/0-0-0.jpg";
FIND j=4839 line= zmlist[z++] = "./zm/zm_nasa/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg";
FIND j=4840 line= zmlist[z++] = "./zm/zm_nasa/zm5_planets/2MASS-Redshift-Survey/TileGroup0/0-0-0.jpg";
FIND j=4841 line= zmlist[z++] = "./us/realtor/ky/zoom/map_doevalley/TileGroup0/0-0-0.jpg";
FIND j=4842 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf01/TileGroup0/0-0-0.jpg";
FIND j=4843 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf02/TileGroup0/0-0-0.jpg";
FIND j=4844 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf03/TileGroup0/0-0-0.jpg";
FIND j=4845 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf04/TileGroup0/0-0-0.jpg";
FIND j=4846 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf05/TileGroup0/0-0-0.jpg";
FIND j=4847 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf06/TileGroup0/0-0-0.jpg";
FIND j=4848 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf07/TileGroup0/0-0-0.jpg";
FIND j=4849 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf08/TileGroup0/0-0-0.jpg";
FIND j=4850 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf09/TileGroup0/0-0-0.jpg";
FIND j=4851 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf10/TileGroup0/0-0-0.jpg";
FIND j=4852 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf11/TileGroup0/0-0-0.jpg";
FIND j=4853 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf12/TileGroup0/0-0-0.jpg";
FIND j=4854 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf14/TileGroup0/0-0-0.jpg";
FIND j=4855 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf15/TileGroup0/0-0-0.jpg";
FIND j=4856 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf16/TileGroup0/0-0-0.jpg";
FIND j=4857 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf17510/TileGroup0/0-0-0.jpg";
FIND j=4858 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf17570/TileGroup0/0-0-0.jpg";
FIND j=4859 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf21/TileGroup0/0-0-0.jpg";
FIND j=4860 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf22/TileGroup0/0-0-0.jpg";
FIND j=4861 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf23/TileGroup0/0-0-0.jpg";
FIND j=4862 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf24/TileGroup0/0-0-0.jpg";
FIND j=4863 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf26/TileGroup0/0-0-0.jpg";
FIND j=4864 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf27/TileGroup0/0-0-0.jpg";
FIND j=4865 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf28/TileGroup0/0-0-0.jpg";
FIND j=4866 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.jpg";
FIND j=4867 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf29 copy/TileGroup0/0-0-0.jpg";
FIND j=4868 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf30/TileGroup0/0-0-0.jpg";
FIND j=4869 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf31/TileGroup0/0-0-0.jpg";
FIND j=4870 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf32/TileGroup0/0-0-0.jpg";
FIND j=4871 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf34/TileGroup0/0-0-0.jpg";
FIND j=4872 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf35/TileGroup0/0-0-0.jpg";
FIND j=4873 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf36/TileGroup0/0-0-0.jpg";
FIND j=4874 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf38/TileGroup0/0-0-0.jpg";
FIND j=4875 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf40/TileGroup0/0-0-0.jpg";
FIND j=4876 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf41/TileGroup0/0-0-0.jpg";
FIND j=4877 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf42/TileGroup0/0-0-0.jpg";
FIND j=4878 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf43/TileGroup0/0-0-0.jpg";
FIND j=4879 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf44/TileGroup0/0-0-0.jpg";
FIND j=4880 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf_n/TileGroup0/0-0-0.jpg";
FIND j=4881 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf_ne/TileGroup0/0-0-0.jpg";
FIND j=4882 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc/TileGroup0/0-0-0.jpg";
FIND j=4883 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_012/TileGroup0/0-0-0.jpg";
FIND j=4884 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_e/TileGroup0/0-0-0.jpg";
FIND j=4885 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_greater/TileGroup0/0-0-0.jpg";
FIND j=4886 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_inc/TileGroup0/0-0-0.jpg";
FIND j=4887 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_n/TileGroup0/0-0-0.jpg";
FIND j=4888 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_s/TileGroup0/0-0-0.jpg";
FIND j=4889 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.jpg";
FIND j=4890 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_w/TileGroup0/0-0-0.jpg";
FIND j=4891 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfinc/TileGroup0/0-0-0.jpg";
FIND j=4892 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfinc_proper/TileGroup0/0-0-0.jpg";
FIND j=4893 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jttf37/TileGroup0/0-0-0.jpg";
FIND j=4894 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jyf44/TileGroup0/0-0-0.jpg";
FIND j=4895 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/souixp/TileGroup0/0-0-0.jpg";
FIND j=4896 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/souixp_boat/TileGroup0/0-0-0.jpg";
FIND j=4897 line=// z--;
FIND j=4898 line=// alert( "BUGS_load zmlist("+z+")="+zmlist[z] + " len="+zmlist.length );
FIND j=4899 line=// document.write( "zmlist_lost zmlist_length="+zmlist.length+" z="+z );
FIND j=4900 line= return(zmlist);
FIND j=4901 line= }
FIND j=4902 line=
FIND j=4903 line= function script_zmlist_show() {
FIND j=4904 line= var z = 0; var zmout=""; var len=zmlist.length;
FIND j=4905 line= var zmid = ""; var zmurl = "";
FIND j=4906 line=// alert( "bugs178 script_zmlist_show IN" );
FIND j=4907 line= for( z=0; z< zmlist.length; z++ ) {
FIND j=4908 line= zmid = zmlist[z].replace('/TileGroup0/0-0-0.jpg','' );
FIND j=4909 line=// zmout += "<h1><b>zmlist_"+z+"</b><h1>";
FIND j=4910 line= zmout += "<a href='./index_zm.html?zmid="+zmid+"' target=_blank>";
FIND j=4911 line= zmout += " <img name='img_" + zmid + "' src='"+zmlist[z]+"' border=0 height=100 >\n";
FIND j=4912 line= zmout += " </a>";
FIND j=4913 line= zmout += "<a href='"+zmid+".html' target=_blank>";
FIND j=4914 line= zmout += " <img name='img_" + zmid + "' height=25 src='"+zmlist[z]+"' border=0 height=100 >\n";
FIND j=4915 line= zmout += " </a>";
FIND j=4916 line=// alert( "bugs430 zmid=" + zmid );
FIND j=4917 line= }
FIND j=4918 line=// document.write( "bugs435 zmout=" + zmout );
FIND j=4919 line=
FIND j=4920 line=// alert( "BUGS432_show zmlist("+len+")="+zmlist[z] + " len="+zmlist.length );
FIND j=4921 line=// document.getElementById('div_zmlist').innerHTML += zmout;
FIND j=4922 line= var parent = document.getElementById('div_zmlist');
FIND j=4923 line= parent.insertAdjacentHTML('beforeend', zmout);
FIND j=4924 line= }
FIND j=4925 line=// function script_zmlist() {
FIND j=4926 line=// script_zmlist_load();
FIND j=4927 line=// alert( "bugs_437: script_zmlist len="+zmlist.length );
FIND j=4928 line=// script_zmlist_show();
FIND j=4929 line=// }
FIND j=4930 line= function script_zm_view( search ) {
FIND j=4931 line= document.write( "script_zm_view search="+search );
FIND j=4932 line=
FIND j=4933 line=
FIND j=4934 line=
FIND j=4935 line=
FIND j=4936 line= }
FIND j=4937 line= </script>
FIND j=4938 line=
FIND j=4939 line= </body>
FIND j=4940 line= </html>
FIND j=4941 line=/csv
FIND j=4942 line=nn<html><head>
FIND j=4943 line=<meta http-equiv="content-type" content="text/html; charset=windows-1252">
FIND j=4944 line=<title>index_files.html 20180514_1525</title>
FIND j=4945 line=
FIND j=4946 line= <style type="text/css"> #myContainer { width: 900px; height: 550px } </style>
FIND j=4947 line=
FIND j=4948 line=
FIND j=4949 line=<style>
FIND j=4950 line= @font-face {
FIND j=4951 line= font-family: yokkmokkOT;
FIND j=4952 line= src: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
FIND j=4953 line= }
FIND j=4954 line=
FIND j=4955 line= @font-face {
FIND j=4956 line= font-family: 'yokkmokkOT_file';
FIND j=4957 line= src: url('./fonts/yokkmokkOT.otf'); /* IE 5-8 */
FIND j=4958 line= src: local('?'), /* sneakily trick IE */
FIND j=4959 line= url('./fonts/yokkmokk.ttf') format('truetype'), /* Opera, Safari */
FIND j=4960 line= url('./fonts/yokkmokkOT.woff') format('woff'/cells
FIND j=4961 line=), /* FF 3.6, Chrome 5, IE9 */
FIND j=4962 line= url('./fonts/yokkmokkOT.svg#font') format('svg'); /* iOS */
FIND j=4963 line= }
FIND j=4964 line=
FIND j=4965 line= body {
FIND j=4966 line=// background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
FIND j=4967 line= background-color: lightblue;
FIND j=4968 line= background-color: black;
FIND j=4969 line= background-color: darkslategrey;
FIND j=4970 line=// color: black;
FIND j=4971 line= color: white;
FIND j=4972 line= font-size:62.5%;
FIND j=4973 line= font-family: yokkmokkOT;
FIND j=4974 line= font-size: 38pt;
FIND j=4975 line= }
FIND j=4976 line=
FIND j=4977 line=// h1 { font-size: 2.4em; } /* =24px */
FIND j=4978 line= h1 { font-size: 14pt; } /* =24px */
FIND j=4979 line= h2 { font-size: 12pt; } /* =24px */
FIND j=4980 line= p { font-size: 10pt; } /* =14px */
FIND j=4981 line= li { font-size: 20pt; } /* =14px? */
FIND j=4982 line= }
FIND j=4983 line=
FIND j=4984 line= </style>
FIND j=4985 line=
FIND j=4986 line=
FIND j=4987 line=
FIND j=4988 line=
FIND j=4989 line=
FIND j=4990 line=
FIND j=4991 line=<style>
FIND j=4992 line=
FIND j=4993 line= div.image {
FIND j=4994 line= width:100px;
FIND j=4995 line= height:100px;
FIND j=4996 line=// background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...);
FIND j=4997 line= background-image:url(
FIND j=4998 line= data:image/jpeg;base64,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);
FIND j=4999 line= }
FIND j=5000 line=
FIND j=5001 line=
FIND j=5002 line=
FIND j=5003 line=.example {
FIND j=5004 line= padding: 10px;
FIND j=5005 line= border: 1px solid #ccc;
FIND j=5006 line=}
FIND j=5007 line=#dropzone {
FIND j=5008 line= border: 2px dashed #bbb;
FIND j=5009 line= -moz-border-radius: 5px;
FIND j=5010 line= -webkit-border-radius: 5px;
FIND j=5011 line= border-radius: 5px;
FIND j=5012 line= padding: 25px;
FIND j=5013 line= text-align: center;
FIND j=5014 line= font: 20pt bold 'Vollkorn';
FIND j=5015 line= color: white;
FIND j=5016 line=}
FIND j=5017 line=.thumb {
FIND j=5018 line= height: 75px;
FIND j=5019 line= border: 1px solid #000;
FIND j=5020 line= margin: 10px 5px 0 0;
FIND j=5021 line=}
FIND j=5022 line=#progress_bar {
FIND j=5023 line= margin: 10px 0;
FIND j=5024 line= padding: 3px;
FIND j=5025 line= border: 1px solid #000;
FIND j=5026 line= font-size: 14px;
FIND j=5027 line= clear: both;
FIND j=5028 line= opacity: 0;
FIND j=5029 line= -o-transition: opacity 1s linear;
FIND j=5030 line= -moz-transition: opacity 1s linear;
FIND j=5031 line= -webkit-transition: opacity 1s linear;
FIND j=5032 line= -ms-transition: opacity 1s linear;
FIND j=5033 line=}
FIND j=5034 line=#progress_bar.loading {
FIND j=5035 line= opacity: 1.0;
FIND j=5036 line=}
FIND j=5037 line=#progress_bar .percent {
FIND j=5038 line=// background-color: #99ccff;
FIND j=5039 line= height: auto;
FIND j=5040 line= width: 0;
FIND j=5041 line=}
FIND j=5042 line=#byte_content {
FIND j=5043 line= margin: 5px 0;
FIND j=5044 line= max-height: 100px;
FIND j=5045 line= overflow-y: auto;
FIND j=5046 line= overflow-x: hidden;
FIND j=5047 line=}
FIND j=5048 line=#byte_range {
FIND j=5049 line= margin-top: 5px;
FIND j=5050 line=}
FIND j=5051 line=</style>
FIND j=5052 line=
FIND j=5053 line=
FIND j=5054 line=</head>
FIND j=5055 line=<style id="style_mail">
FIND j=5056 line= body{ background-color="black"; color="white" }
FIND j=5057 line= </style>
FIND j=5058 line=
FIND j=5059 line=<body bgcolor="black" color="white">
FIND j=5060 line= <hr>
FIND j=5061 line= <a href="./test.html"><img src="ko.png"></a>
FIND j=5062 line= <hr>
FIND j=5063 line=
FIND j=5064 line=
FIND j=5065 line=
FIND j=5066 line=<video controls="controls" style="width:160;height:90;" poster="ko.png">
FIND j=5067 line=
FIND j=5068 line= <source src="index.webm" type="video/webm;codecs="vp8, vorbis"">
FIND j=5069 line= <source src="index.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
FIND j=5070 line=</video>
FIND j=5071 line=</div>
FIND j=5072 line=
FIND j=5073 line=<h1 font-family="yokkmokkOT">div_avsnap</h1>
FIND j=5074 line=<div id="div_avsnap">
FIND j=5075 line= <script>
FIND j=5076 line= var video_player = document.getElementById("video_player"),
FIND j=5077 line= links = video_player.getElementsByTagName('a');
FIND j=5078 line= for (var i=0; i<links.length; i++) {
FIND j=5079 line= links[i].onclick = handler;
FIND j=5080 line= }
FIND j=5081 line=
FIND j=5082 line= function handler(e) {
FIND j=5083 line= e.preventDefault();
FIND j=5084 line= videotarget = this.getAttribute("href");
FIND j=5085 line= filename = videotarget.substr(0, videotarget.lastIndexOf('.')) || videotarget;
FIND j=5086 line= video = document.querySelector("#video_player video");
FIND j=5087 line= video.removeAttribute("controls");
FIND j=5088 line= video.removeAttribute("poster");
FIND j=5089 line= source = document.querySelectorAll("#video_player video source");
FIND j=5090 line= source[0].src = filename + ".mp4";
FIND j=5091 line= source[1].src = filename + ".webm";
FIND j=5092 line= video.load();
FIND j=5093 line= video.play();
FIND j=5094 line= }
FIND j=5095 line=
FIND j=5096 line= div.image {
FIND j=5097 line= width:100px;
FIND j=5098 line= height:100px;
FIND j=5099 line= background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...);
FIND j=5100 line= }
FIND j=5101 line= </script>
FIND j=5102 line=
FIND j=5103 line=
FIND j=5104 line=<img alt="Embedded Image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...">
FIND j=5105 line=
FIND j=5106 line=
FIND j=5107 line=
FIND j=5108 line=
FIND j=5109 line=<div id="div_grabscreenshot">
FIND j=5110 line= <script id="script_grabscreenshot">
FIND j=5111 line= function grabScreenshot() {
FIND j=5112 line= ctx.drawImage(video, 0, 0, videoWidth, videoHeight);
FIND j=5113 line= var img = new Image();
FIND j=5114 line= img.src = canvas.toDataURL("image/png");
FIND j=5115 line= img.width = 120;
FIND j=5116 line= ssContainer.appendChild(img);
FIND j=5117 line= }
FIND j=5118 line= </script>
FIND j=5119 line= </div>
FIND j=5120 line=
FIND j=5121 line=
FIND j=5122 line=
FIND j=5123 line= <div id="div_ko_loop">
FIND j=5124 line= <h1>ko_loop</h1>
FIND j=5125 line= <script>
FIND j=5126 line= for each ( var i in [3,23,4] ) Print(i);
FIND j=5127 line= var a = [ 1,2,3 ];
FIND j=5128 line= a.x = 'xxx';
FIND j=5129 line=
FIND j=5130 line= for ( var i = 0; i < a.length; i++ )
FIND j=5131 line= Print('a: '+a[i]);
FIND j=5132 line=
FIND j=5133 line= for ( var i in a ) Print('b: '+a[i]);
FIND j=5134 line= </script>
FIND j=5135 line=<hr><hr>
FIND j=5136 line=<section>
FIND j=5137 line=<div id="canvasesdiv" style="position:relative; width:400px; height:300px">
FIND j=5138 line=<canvas id="layer1" style="z-index: 1;
FIND j=5139 line=position:absolute;
FIND j=5140 line=left:0px;
FIND j=5141 line=top:0px;
FIND j=5142 line=" height="300px" width="400">
FIND j=5143 line=This text is displayed if your browser does not support HTML5 Canvas.
FIND j=5144 line=</canvas>
FIND j=5145 line=<canvas id="layer2" style="z-index: 2;
FIND j=5146 line=position:absolute;
FIND j=5147 line=left:0px;
FIND j=5148 line=top:0px;
FIND j=5149 line=" height="300px" width="400">
FIND j=5150 line=This text is displayed if your browser does not support HTML5 Canvas.
FIND j=5151 line=</canvas>
FIND j=5152 line=<canvas id="layer3" style="z-index: 3;
FIND j=5153 line=position:absolute;
FIND j=5154 line=left:0px;
FIND j=5155 line=top:0px;
FIND j=5156 line=" height="300px" width="400">
FIND j=5157 line=This text is displayed if your browser does not support HTML5 Canvas.
FIND j=5158 line=</canvas>
FIND j=5159 line=</div>
FIND j=5160 line=
FIND j=5161 line=<script type="text/javascript">
FIND j=5162 line=var layer1;
FIND j=5163 line=var layer2;
FIND j=5164 line=var layer3;
FIND j=5165 line=var ctx1;
FIND j=5166 line=var ctx2;
FIND j=5167 line=var ctx3;
FIND j=5168 line=var x = 400;
FIND j=5169 line=var y = 300;
FIND j=5170 line=var dx = 2;
FIND j=5171 line=var dy = 4;
FIND j=5172 line=var WIDTH = 400;
FIND j=5173 line=var HEIGHT = 300;
FIND j=5174 line=var city = new Image();
FIND j=5175 line=
FIND j=5176 line=function init() {
FIND j=5177 line=city.src ="globe.png";
FIND j=5178 line=layer1 = document.getElementById("layer1");
FIND j=5179 line=ctx1 = layer1.getContext("2d");
FIND j=5180 line=layer2 = document.getElementById("layer2");
FIND j=5181 line=ctx2 = layer2.getContext("2d");
FIND j=5182 line=layer3 = document.getElementById("layer3");
FIND j=5183 line=ctx3 = layer3.getContext("2d");
FIND j=5184 line=setInterval(drawAll, 20);
FIND j=5185 line=}
FIND j=5186 line=
FIND j=5187 line=function drawAll() {
FIND j=5188 line=draw1();
FIND j=5189 line=draw2();
FIND j=5190 line=draw3();
FIND j=5191 line=}
FIND j=5192 line=
FIND j=5193 line=function draw1() {
FIND j=5194 line=ctx1.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=5195 line=ctx1.fillStyle = "#FAF7F8";
FIND j=5196 line=ctx1.beginPath();
FIND j=5197 line=ctx1.rect(0,0,WIDTH,HEIGHT);
FIND j=5198 line=ctx1.closePath();
FIND j=5199 line=ctx1.fill();
FIND j=5200 line=ctx1.fillStyle = "#444444";
FIND j=5201 line=ctx1.beginPath();
FIND j=5202 line=ctx1.arc(x, y, 10, 0, Math.PI*2, true);
FIND j=5203 line=ctx1.closePath();
FIND j=5204 line=ctx1.fill();
FIND j=5205 line=
FIND j=5206 line=if (x + dx > WIDTH || x + dx < 0)
FIND j=5207 line=dx = -dx;
FIND j=5208 line=if (y + dy > HEIGHT || y + dy < 0)
FIND j=5209 line=dy = -dy;
FIND j=5210 line=
FIND j=5211 line=x += dx;
FIND j=5212 line=y += dy;
FIND j=5213 line=}
FIND j=5214 line=
FIND j=5215 line=function draw2() {
FIND j=5216 line=ctx2.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=5217 line=ctx2.drawImage(city, 0, 0);
FIND j=5218 line=}
FIND j=5219 line=
FIND j=5220 line=function draw3() {
FIND j=5221 line=ctx3.clearRect(0, 0, WIDTH, HEIGHT);
FIND j=5222 line=ctx3.fillStyle = "#444444";
FIND j=5223 line=ctx3.save();
FIND j=5224 line=ctx3.translate(200,200);
FIND j=5225 line=ctx3.rotate(x/20);
FIND j=5226 line=ctx3.fillRect(-15, -15, 30, 30);
FIND j=5227 line=ctx3.restore();
FIND j=5228 line=}
FIND j=5229 line=
FIND j=5230 line=init();
FIND j=5231 line=</script>
FIND j=5232 line=</section>
FIND j=5233 line=<div id="dropzone">dropzone</div>
FIND j=5234 line=<output id="zonelist"></output>
FIND j=5235 line=
FIND j=5236 line=<script>
FIND j=5237 line= function handleFileSelect(evt) {
FIND j=5238 line= evt.stopPropagation();
FIND j=5239 line= evt.preventDefault();
FIND j=5240 line=
FIND j=5241 line= var files = evt.dataTransfer.files; // FileList object.
FIND j=5242 line=
FIND j=5243 line= // files is a FileList of File objects. List some properties.
FIND j=5244 line= var output = [];
FIND j=5245 line= for (var i = 0, f; f = files[i]; i++) {
FIND j=5246 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
FIND j=5247 line= f.size, ' bytes, last modified: ',
FIND j=5248 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
FIND j=5249 line= '</li>');
FIND j=5250 line= }
FIND j=5251 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
FIND j=5252 line= }
FIND j=5253 line=
FIND j=5254 line= function handleDragOver(evt) {
FIND j=5255 line= evt.stopPropagation();
FIND j=5256 line= evt.preventDefault();
FIND j=5257 line= evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
FIND j=5258 line= }
FIND j=5259 line=
FIND j=5260 line= // Setup the dnd listeners.
FIND j=5261 line= var dropZone = document.getElementById('dropzone');
FIND j=5262 line= dropZone.addEventListener('dragover', handleDragOver, false);
FIND j=5263 line= dropZone.addEventListener('drop', handleFileSelect, false);
FIND j=5264 line=</script>
FIND j=5265 line=
FIND j=5266 line=<hr><hr><hr>
FIND j=5267 line=<style>
FIND j=5268 line= .thumb {
FIND j=5269 line= height: 75px;
FIND j=5270 line= border: 1px solid #000;
FIND j=5271 line= margin: 10px 5px 0 0;
FIND j=5272 line= }
FIND j=5273 line=</style>
FIND j=5274 line=
FIND j=5275 line=
FIND j=5276 line=<input id="files" name="files[]" multiple="" type="file">
FIND j=5277 line=<output id="zonelist"></output>
FIND j=5278 line=
FIND j=5279 line=<script>
FIND j=5280 line= function handleFileSelect(evt) {
FIND j=5281 line= var files = evt.target.files; // FileList object
FIND j=5282 line=
FIND j=5283 line= // files is a FileList of File objects. List some properties.
FIND j=5284 line= var output = [];
FIND j=5285 line= for (var i = 0, f; f = files[i]; i++) {
FIND j=5286 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
FIND j=5287 line= f.size, ' bytes, last modified: ',
FIND j=5288 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
FIND j=5289 line= '</li>');
FIND j=5290 line= }
FIND j=5291 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
FIND j=5292 line= }
FIND j=5293 line=
FIND j=5294 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
FIND j=5295 line=</script>
FIND j=5296 line=
FIND j=5297 line=
FIND j=5298 line=
FIND j=5299 line=
FIND j=5300 line=<hr><hr><hr>
FIND j=5301 line=
FIND j=5302 line=
FIND j=5303 line=
FIND j=5304 line=
FIND j=5305 line=
FIND j=5306 line=<input id="files" name="files[]" multiple="" type="file">
FIND j=5307 line=<output id="zonelist"></output>
FIND j=5308 line=
FIND j=5309 line=<script>
FIND j=5310 line= function handleFileSelect(evt) {
FIND j=5311 line= var files = evt.target.files; // FileList object
FIND j=5312 line=
FIND j=5313 line= // Loop through the FileList and render image files as thumbnails.
FIND j=5314 line= for (var i = 0, f; f = files[i]; i++) {
FIND j=5315 line=
FIND j=5316 line=// Only process image files.
FIND j=5317 line= if (!f.type.match('image.*')) { continue; }
FIND j=5318 line=
FIND j=5319 line= var reader = new FileReader();
FIND j=5320 line=
FIND j=5321 line= // Closure to capture the file information.
FIND j=5322 line= reader.onload = (function(theFile) {
FIND j=5323 line= return function(e) {
FIND j=5324 line= // Render thumbnail.
FIND j=5325 line= var span = document.createElement('span');
FIND j=5326 line= span.innerHTML = ['<img class="thumb" src="', e.target.result,
FIND j=5327 line= '" title="', escape(theFile.name), '"/>'].join('');
FIND j=5328 line= document.getElementById('zonelist').insertBefore(span, null);
FIND j=5329 line= };
FIND j=5330 line= })(f);
FIND j=5331 line=
FIND j=5332 line= // Read in the image file as a data URL.
FIND j=5333 line= reader.readAsDataURL(f);
FIND j=5334 line= }
FIND j=5335 line= }
FIND j=5336 line=
FIND j=5337 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
FIND j=5338 line=</script>
FIND j=5339 line=
FIND j=5340 line=<hr><hr><hr>
FIND j=5341 line=
FIND j=5342 line=<style>
FIND j=5343 line= #byte_content {
FIND j=5344 line= margin: 5px 0;
FIND j=5345 line= max-height: 100px;
FIND j=5346 line= overflow-y: auto;
FIND j=5347 line= overflow-x: hidden;
FIND j=5348 line= }
FIND j=5349 line= #byte_range { margin-top: 5px; }
FIND j=5350 line=</style>
FIND j=5351 line=<script id="script_previewfile">
FIND j=5352 line= function previewfile(file) {
FIND j=5353 line= if (tests.filereader === true && acceptedTypes[file.type] === true) {
FIND j=5354 line= var reader = new FileReader();
FIND j=5355 line= reader.onload = function (event) {
FIND j=5356 line= var image = new Image();
FIND j=5357 line= image.src = event.target.result;
FIND j=5358 line= image.width = 250; // a fake resize
FIND j=5359 line= holder.appendChild(image);
FIND j=5360 line= };
FIND j=5361 line=
FIND j=5362 line= reader.readAsDataURL(file);
FIND j=5363 line= }
FIND j=5364 line= else {
FIND j=5365 line= holder.innerHTML +=
FIND j=5366 line= '<p>done: koupload'
FIND j=5367 line= + file.name
FIND j=5368 line= + ' '
FIND j=5369 line= + (file.size ? (file.size/1024|0) + 'K' : '');
FIND j=5370 line= console.log(file);
FIND j=5371 line= }
FIND j=5372 line= }
FIND j=5373 line=
FIND j=5374 line= function readfiles(files) {
FIND j=5375 line= debugger;
FIND j=5376 line= var formData = tests.formdata ? new FormData() : null;
FIND j=5377 line= for (var i = 0; i < files.length; i++) {
FIND j=5378 line= if (tests.formdata) formData.append('file', files[i]);
FIND j=5379 line= previewfile(files[i]);
FIND j=5380 line= }
FIND j=5381 line=
FIND j=5382 line=// now post a new XHR request
FIND j=5383 line= if (tests.formdata) {
FIND j=5384 line= var xhr = new XMLHttpRequest();
FIND j=5385 line= xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
FIND j=5386 line=// xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
FIND j=5387 line= xhr.onload = function() {
FIND j=5388 line= progress.value = progress.innerHTML = 100;
FIND j=5389 line= };
FIND j=5390 line=
FIND j=5391 line= if (tests.progress) {
FIND j=5392 line= xhr.upload.onprogress = function (event) {
FIND j=5393 line= if (event.lengthComputable) {
FIND j=5394 line= var complete = (event.loaded / event.total * 100 | 0);
FIND j=5395 line= progress.value = progress.innerHTML = complete;
FIND j=5396 line= }
FIND j=5397 line= }
FIND j=5398 line= }
FIND j=5399 line=
FIND j=5400 line= xhr.send(formData);
FIND j=5401 line= }
FIND j=5402 line= }
FIND j=5403 line=
FIND j=5404 line= if (tests.dnd) {
FIND j=5405 line= holder.ondragover = function () { this.className = 'hover'; return false; };
FIND j=5406 line= holder.ondragend = function () { this.className = ''; return false; };
FIND j=5407 line= holder.ondrop = function (e) {
FIND j=5408 line= this.className = '';
FIND j=5409 line= e.preventDefault();
FIND j=5410 line= readfiles(e.dataTransfer.files);
FIND j=5411 line= }
FIND j=5412 line= }
FIND j=5413 line= else {
FIND j=5414 line= fileupload.className = 'hidden';
FIND j=5415 line= fileupload.querySelector('input').onchange = function () {
FIND j=5416 line= readfiles(this.files);
FIND j=5417 line= };
FIND j=5418 line= }
FIND j=5419 line= </script>
FIND j=5420 line=
FIND j=5421 line= <script id="script_myfilework>
FIND j=5422 line=
FIND j=5423 line= funtion myfilework( j, file ) {
FIND j=5424 line=
FIND j=5425 line= alert( j+" file="+file );
FIND j=5426 line= }
FIND j=5427 line=
FIND j=5428 line= </script>
FIND j=5429 line=
FIND j=5430 line=
FIND j=5431 line=
FIND j=5432 line=
FIND j=5433 line=
FIND j=5434 line= <script id="script_upload_input">>
FIND j=5435 line= var upload = document.getElementsByTagName('input')[0],
FIND j=5436 line= holder2 = document.getElementById('holder2'),
FIND j=5437 line= state = document.getElementById('status');
FIND j=5438 line=
FIND j=5439 line= if (typeof window.FileReader === 'undefined') {
FIND j=5440 line= state.className = 'fail';
FIND j=5441 line= }
FIND j=5442 line= else {
FIND j=5443 line= state.className = 'success';
FIND j=5444 line= state.innerHTML = 'File API & FileReader available';
FIND j=5445 line= }
FIND j=5446 line=
FIND j=5447 line= upload.onchange = function (e) {
FIND j=5448 line= e.preventDefault();
FIND j=5449 line=
FIND j=5450 line= var file = upload.files[0],
FIND j=5451 line= reader = new FileReader();
FIND j=5452 line= reader.onload = function (event) {
FIND j=5453 line= var img = new Image();
FIND j=5454 line= img.src = event.target.result;
FIND j=5455 line=// note: no onload required since we've got the dataurl...I think! :)
FIND j=5456 line= if (img.width > 560) { // holder width
FIND j=5457 line= img.width = 560;
FIND j=5458 line= }
FIND j=5459 line= holder2.innerHTML = '';
FIND j=5460 line= holder.appendChild(img);
FIND j=5461 line= };
FIND j=5462 line= reader.readAsDataURL(file);
FIND j=5463 line=
FIND j=5464 line= return false;
FIND j=5465 line= };
FIND j=5466 line=
FIND j=5467 line=// var formData = new FormData();
FIND j=5468 line=// formData.append("part_num", "123ABC");
FIND j=5469 line=// formData.append("part_price", 7.95);
FIND j=5470 line=// formData.append("part_image", somefile)
FIND j=5471 line=//
FIND j=5472 line=// var xhr = new XMLHttpRequest();
FIND j=5473 line=// xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");
FIND j=5474 line=// xhr.send(formData);
FIND j=5475 line=
FIND j=5476 line=
FIND j=5477 line= </script>
FIND j=5478 line=
FIND j=5479 line=
FIND j=5480 line=
FIND j=5481 line=<canvas height="200" width="100"></canvas>
FIND j=5482 line=<script>
FIND j=5483 line=var canvas = document.getElementsByTagName('canvas')[0],
FIND j=5484 line= ctx = null,
FIND j=5485 line= grad = null,
FIND j=5486 line= body = document.getElementsByTagName('body')[0],
FIND j=5487 line= color = 255;
FIND j=5488 line= color = lightblue;
FIND j=5489 line=
FIND j=5490 line=if (canvas.getContext('2d')) {
FIND j=5491 line= ctx = canvas.getContext('2d');
FIND j=5492 line= ctx.clearRect(0, 0, 600, 600);
FIND j=5493 line= ctx.save();
FIND j=5494 line=
FIND j=5495 line=// Create radial gradient
FIND j=5496 line=// grad = ctx.createRadialGradient(0,0,0,0,0,600);
FIND j=5497 line=// grad.addColorStop(0, '#000');
FIND j=5498 line=// grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');
FIND j=5499 line=
FIND j=5500 line= // assign gradients to fill
FIND j=5501 line=// ctx.fillStyle = grad;
FIND j=5502 line= ctx.fillstyle = "lightblue";
FIND j=5503 line=
FIND j=5504 line= // draw 600x600 fill
FIND j=5505 line= ctx.fillRect(0,0,600,600);
FIND j=5506 line= ctx.save();
FIND j=5507 line=
FIND j=5508 line= body.onmousemove = function (event) {
FIND j=5509 line= var width = window.innerWidth,
FIND j=5510 line= height = window.innerHeight,
FIND j=5511 line= x = event.clientX,
FIND j=5512 line= y = event.clientY,
FIND j=5513 line= rx = 600 * x / width,
FIND j=5514 line= ry = 600 * y / height;
FIND j=5515 line=
FIND j=5516 line= var xc = ~~(256 * x / width);
FIND j=5517 line= var yc = ~~(256 * y / height);
FIND j=5518 line=
FIND j=5519 line= grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600);
FIND j=5520 line= grad.addColorStop(0, '#000');
FIND j=5521 line= grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
FIND j=5522 line= // ctx.restore();
FIND j=5523 line=// ctx.fillStyle = grad;
FIND j=5524 line= ctx.fillstyle="lightblue";
FIND j=5525 line= ctx.fillRect(0,0,600,600);
FIND j=5526 line= // ctx.save();
FIND j=5527 line= };
FIND j=5528 line=}
FIND j=5529 line= </script>
FIND j=5530 line=
FIND j=5531 line=<h1>BUGS1017 div_csv</h1>
FIND j=5532 line=<div id="div_csv">
FIND j=5533 line=<hr><hr><hr>
FIND j=5534 line= <style type="text/css">
FIND j=5535 line= body {
FIND j=5536 line= font-family: Arial;
FIND j=5537 line= font-size: 10pt;
FIND j=5538 line= }
FIND j=5539 line= table {
FIND j=5540 line= border: 1px solid #ccc;
FIND j=5541 line= }
FIND j=5542 line= table th {
FIND j=5543 line= background-color: #F7F7F7;
FIND j=5544 line= color: #333;
FIND j=5545 line= font-weight: bold;
FIND j=5546 line= }
FIND j=5547 line= table th, table td {
FIND j=5548 line= padding: 5px;
FIND j=5549 line= border-color: #ccc;
FIND j=5550 line= }
FIND j=5551 line= </style>
FIND j=5552 line=
FIND j=5553 line=
FIND j=5554 line=
FIND j=5555 line=
FIND j=5556 line= <script type="text/javascript">
FIND j=5557 line= function Upload() {
FIND j=5558 line= var fileUpload = document.getElementById("fileUpload");
FIND j=5559 line= var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.ssv|.py|.htm|.html|.php)$/;
FIND j=5560 line= if (regex.test(fileUpload.value.toLowerCase())) {
FIND j=5561 line= if (typeof (FileReader) != "undefined") {
FIND j=5562 line= var reader = new FileReader();
FIND j=5563 line= reader.onload = function (e) {
FIND j=5564 line=// alert( "BUGS_623 before myfiles e="+e );
FIND j=5565 line= myfiles(e);
FIND j=5566 line= var table = document.createElement("table");
FIND j=5567 line= var rows = e.target.result.split("\n");
FIND j=5568 line= for (var i = 0; i < rows.length; i++) {
FIND j=5569 line= var row = table.insertRow(-1);
FIND j=5570 line=
FIND j=5571 line=
FIND j=5572 line=// var cells = rows[i].split("|");
FIND j=5573 line= var cells = rows[i].split(",");
FIND j=5574 line= var cells = rows[i].split("\ ");
FIND j=5575 line= for (var j = 0; j < cells.length; j++) {
FIND j=5576 line= var cell = row.insertCell(-1);
FIND j=5577 line= cell.innerHTML = cells[j];
FIND j=5578 line= }
FIND j=5579 line= }
FIND j=5580 line= var csv2tbl = document.getElementById("csv2tbl");
FIND j=5581 line= csv2tbl.innerHTML = "";
FIND j=5582 line= csv2tbl.appendChild(table);
FIND j=5583 line= }
FIND j=5584 line= reader.readAsText(fileUpload.files[0]);
FIND j=5585 line= }
FIND j=5586 line= else {
FIND j=5587 line= alert("csv2tbl warn: unauthorized access noted");
FIND j=5588 line= }
FIND j=5589 line= }
FIND j=5590 line= else {
FIND j=5591 line= alert("csv2tbl fail: unsuppoted format");
FIND j=5592 line= }
FIND j=5593 line= }
FIND j=5594 line=
FIND j=5595 line= var out_av = new Array(); out_av[0]="<h1>out_av</h1>\n";
FIND j=5596 line= var out_bb = new Array(); out_bb[0]="<h1>out_bb</h1>\n";
FIND j=5597 line= var out_dd = new Array(); out_dd[0]="<h1>out_dd</h1>\n";
FIND j=5598 line= var out_sl = new Array(); out_sl[0]="<h1>out_sl</h1>\n";
FIND j=5599 line= var out_tl = new Array(); out_tl[0]="<h1>out_tl</h1>\n";
FIND j=5600 line= var out_zm = new Array(); out_zm[0]="<h1>out_zm</h1>\n";
FIND j=5601 line=
FIND j=5602 line= function myfiles(e) {
FIND j=5603 line=// var table = document.createElement("table");
FIND j=5604 line= var rows = e.target.result.split("\n");
FIND j=5605 line= var output = "<h1>myfiles output</h1>";
FIND j=5606 line= alert("BUGS_700 myfiles len="+rows.length );
FIND j=5607 line=
FIND j=5608 line= var fsize=""; var fmth=""; var fdd=""; var fyyyy=""; var fname=""
FIND j=5609 line= for (var i = 0; i < rows.length - 1; i++) {
FIND j=5610 line=// document.write( "i="+i+"rows="+rows[i]+"<hr color=red>" );
FIND j=5611 line=// var row = table.insertRow(-1);
FIND j=5612 line=// var cells = rows[i].split("|");
FIND j=5613 line=// var cells = rows[i].split("\,");
FIND j=5614 line= var cells = rows[i].split('\ ');
FIND j=5615 line= var cells_len = cells.length;
FIND j=5616 line=
FIND j=5617 line= fsize=cells[7];
FIND j=5618 line= fmth=cells[8];
FIND j=5619 line= fdd=cells[9];
FIND j=5620 line= fyyyy=cells[11];
FIND j=5621 line= fname=cells[12];
FIND j=5622 line= if( cells_len == 14 ) {
FIND j=5623 line= fdd=cells[10]; fyyyy=cells[12]; fname =cells[13];
FIND j=5624 line= }
FIND j=5625 line=
FIND j=5626 line=// output +="<hr color=blue>i="+i+" len="+cells_len;
FIND j=5627 line=// output += " size="+fsize+" fyyyy="+fyyyy+" fmth="+fmth+" fdd="+fdd+" <h1>"+fname+"</h1><br>\n";
FIND j=5628 line= alert( "BUGS_ROWS="+i+" fname="+fname );
FIND j=5629 line=
FIND j=5630 line=
FIND j=5631 line= out_av[0] += fname2av(i, fname );
FIND j=5632 line=// out_bb[0] += fname2bb(i, fname );
FIND j=5633 line= out_dd[0] += fname2dd(i, fname );
FIND j=5634 line= out_sl[0] += fname2sl(i, fname );
FIND j=5635 line=//
FIND j=5636 line=// var ftitle = "title-"+i;
FIND j=5637 line=// var ftext = "text-"+i;
FIND j=5638 line=// var fmedia = "media-"+i;
FIND j=5639 line=// var fcredit = "credit-"+i;
FIND j=5640 line=// var fcaption = "caption-"+i;
FIND j=5641 line=// out_tl[0] += fname2tl( i, fname, fyyyy, fmth, fdd, fsize,
FIND j=5642 line=// ftitle, ftext, fmedia, fcredit, fcaption );
FIND j=5643 line=//// out_zm[0] += fname2zm(i, fname );
FIND j=5644 line=//
FIND j=5645 line=
FIND j=5646 line=// for (var j = 0; j < cells.length; j++) {
FIND j=5647 line=//
FIND j=5648 line=// document.write( "j="+j+" cells="+cells[j]+"<br>\n" );
FIND j=5649 line=// var cell = row.insertCell(-1);
FIND j=5650 line=// cell.innerHTML = cells[j];
FIND j=5651 line=// }
FIND j=5652 line= }
FIND j=5653 line=
FIND j=5654 line= var new_av = document.getElementById("div_av");
FIND j=5655 line=// alert( "BUGS_716: new_av="+new_av );
FIND j=5656 line= out_av[1] = new_av.innerHTML;
FIND j=5657 line= out_av[2] = new_av.innerHTML.value;
FIND j=5658 line=// alert( "BUGS_717: out_av0="+out_av[0] );
FIND j=5659 line=// alert( "BUGS_718: out_av1="+out_av[1] );
FIND j=5660 line=// alert( "BUGS_718: out_av2="+out_av[2] );
FIND j=5661 line= new_av.innerHTML = "<h1>timejack kludge</h1>";
FIND j=5662 line= new_av.innerHTML = out_av[0];
FIND j=5663 line= new_av.appendChild( out_av[0] );
FIND j=5664 line= alert( "BUGS_720: new_av="+new_av );
FIND j=5665 line=
FIND j=5666 line=// alert( "BUGS_710: out_bb="+out_bb[0] );
FIND j=5667 line=// alert( "BUGS_710: out_dd="+out_dd[0] );
FIND j=5668 line=// alert( "BUGS_710: out_sl="+out_sl[0] );
FIND j=5669 line=// alert( "BUGS_710: out_tl="+out_tl[0] );
FIND j=5670 line=// alert( "BUGS_710: out_zm="+out_zm[0] );
FIND j=5671 line=
FIND j=5672 line=// document.write( output );
FIND j=5673 line=// var csv2tbl = document.getElementById("csv2tbl");
FIND j=5674 line=// csv2tbl.innerHTML = "";
FIND j=5675 line=// csv2tbl.appendChild(table);
FIND j=5676 line=
FIND j=5677 line=
FIND j=5678 line=
FIND j=5679 line=
FIND j=5680 line= var new_dd = document.getElementById("div_dd");
FIND j=5681 line=// alert( "BUGS_740: new_dd="+new_dd );
FIND j=5682 line= out_dd[1] = new_dd.innerHTML;
FIND j=5683 line= out_dd[2] = new_dd.innerHTML.value;
FIND j=5684 line=// alert( "BUGS_744: out_dd0="+out_dd[0] );
FIND j=5685 line=// alert( "BUGS_745: out_dd1="+out_dd[1] );
FIND j=5686 line=// alert( "BUGS_746: out_dd2="+out_dd[2] );
FIND j=5687 line= new_av.innerHTML = "<h1>timejack_dd kludge</h1>";
FIND j=5688 line= new_av.innerHTML = out_dd[0];
FIND j=5689 line= new_av.appendChild( out_dd[0] );
FIND j=5690 line= alert( "BUGS_750: new_dd="+new_dd );
FIND j=5691 line= }
FIND j=5692 line=
FIND j=5693 line=
FIND j=5694 line=
FIND j=5695 line= function fname2av( i, fname ) {
FIND j=5696 line= var fid=fname;
FIND j=5697 line= var output = "<div name='div_av-"+i+"' >"+fid+" "+fname+"</div>";
FIND j=5698 line= output += ' <div id="div_vid2">\n';
FIND j=5699 line= output += '<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index2_mp4.png">\n';
FIND j=5700 line= output += '<source src="index2.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">\n';
FIND j=5701 line= output += '<source src="index2.webm" type="video/webm;codecs="vp8, vorbis"">\n';
FIND j=5702 line= output += ' </video>\n';
FIND j=5703 line= output += ' </div>\n';
FIND j=5704 line=
FIND j=5705 line=
FIND j=5706 line=// alert( "BUGS_698: fname2av "+i+" fname="+fname+ "output="+output );
FIND j=5707 line= return( output );
FIND j=5708 line= }
FIND j=5709 line= function fname2bb( i, fname ) {
FIND j=5710 line= var fid=fname;
FIND j=5711 line= var output = "<div name='div_bb-"+i+"' >"+fid+" "+fname+"</div>";
FIND j=5712 line= alert( "BUGS_705: fname2bb "+i+" fname="+fname );
FIND j=5713 line= return( output );
FIND j=5714 line= }
FIND j=5715 line=
FIND j=5716 line= function fname2dd1( i, fname ) {
FIND j=5717 line= var fid=fname;
FIND j=5718 line= var output = "<div name='div_dd-"+i+"' >"+fid+" "+fname+"</div>";
FIND j=5719 line= alert( "BUGS_710: fname2dd "+i+" fname="+fname );
FIND j=5720 line= return( output );
FIND j=5721 line= }
FIND j=5722 line=
FIND j=5723 line= function fname2dd( i, fname ) {
FIND j=5724 line= alert( "BUGS_770: i="+i+" fnane="+fname );
FIND j=5725 line= var fid=fname;
FIND j=5726 line= var output = '<div class="drg" name='div_dd-vid'+i+'' >'+fid+' '+fname+'</div>\n';
FIND j=5727 line= output += '<h1>div_dd-vid-'+i+'</h1>';
FIND j=5728 line= output += '<source src="'+fname+'" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">\n';
FIND j=5729 line= output += '<source src="index1.webm" type="video/webm;codecs="vp8, vorbis"">\n';
FIND j=5730 line= output ++= '</video>\n';
FIND j=5731 line= output += '</div>\n";
FIND j=5732 line= alert( "BUGS_768: fname2dd "+i+" fname="+fname+" output="+output );
FIND j=5733 line= return( output );
FIND j=5734 line= }
FIND j=5735 line=
FIND j=5736 line=
FIND j=5737 line=
FIND j=5738 line= function fname2sl( i, fname ) {
FIND j=5739 line= var output = "";
FIND j=5740 line= var fid=fname;
FIND j=5741 line=// var fid=fname.replace("\.jpg", "" ).replace("\/"g, "-");
FIND j=5742 line=// output = '<div name='div_sl-'+i+'' >'+fid+' '+fname+'</div>';
FIND j=5743 line=// output += '<a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_lucernarium.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_lucernarium_thumb.jpg" title="Supremus Lucernarium" alt="Supremus Lucernarium" class="thumb" /></a>\n';
FIND j=5744 line=// output += '<a href="'+fname+ '" class="thumb_link"><span class="selected"></span>\n';
FIND j=5745 line=// output += '<img src="'+fname+'" alt="Supremus Lucernarium" class="thumb"/></a>\n';
FIND j=5746 line=// output += ' </div>\n';
FIND j=5747 line=//// alert( "BUGS_717: fname2sl "+i+" fname="+fname );
FIND j=5748 line= return( output );
FIND j=5749 line= }
FIND j=5750 line= function fname2sl_ftr() {
FIND j=5751 line= var output = "";
FIND j=5752 line= return( output );
FIND j=5753 line= }
FIND j=5754 line=
FIND j=5755 line=
FIND j=5756 line= function fname2tl( i, fname, fyyyy, fmth, fdd, fsize, ftitle, ftext, fmedia, fcredit, fcaption ) {
FIND j=5757 line=// output += ' {\n';
FIND j=5758 line=// output += ' "startDate":'+ fyyyy + ','+fmth+','+fdd+'", \n';
FIND j=5759 line=// output += ' "headline":"'+ftitle+'",\n';
FIND j=5760 line=// output += ' "text":"'+ftext+'",\n';
FIND j=5761 line=// output += ' "asset":\n';
FIND j=5762 line=// output += ' {\n';
FIND j=5763 line=// output += ' "media":"'+ fmedia + '",\n';
FIND j=5764 line=// output += ' "credit":"'+fcredit+'",\n';
FIND j=5765 line=// output += ' "caption":"'+fcaption+'"\n';
FIND j=5766 line=// output += ' }\n';
FIND j=5767 line=// output += ' },\n';
FIND j=5768 line=//
FIND j=5769 line= return(output);
FIND j=5770 line= }
FIND j=5771 line=
FIND j=5772 line= function fname2zm( i, fname ) {
FIND j=5773 line= var fid=fname;
FIND j=5774 line= var output = "<div name='div_zm-"+i+"' >"+fid+" "+fname+"</div>";
FIND j=5775 line= alert( "BUGS_729: fname2zm "+i+" fname="+fname );
FIND j=5776 line= return( output );
FIND j=5777 line= }
FIND j=5778 line= </script>
FIND j=5779 line=
FIND j=5780 line=
FIND j=5781 line= <input id="fileUpload" type="file">
FIND j=5782 line= <input id="upload" value="Upload" onclick="Upload()" type="button">
FIND j=5783 line= </div>
FIND j=5784 line=
FIND j=5785 line=
FIND j=5786 line= <hr>
FIND j=5787 line= <div id="div_av"><h2>div_av</h2></div>
FIND j=5788 line= <div id="div_bb"><h2>div_bb</h2></div>
FIND j=5789 line= <div id="div_dd"><h2>div_dd</h2></div>
FIND j=5790 line= <div id="div_sl"><h2>div_sl</h2></div>
FIND j=5791 line= <div id="div_tl"><h2>div_tl</h2></div>
FIND j=5792 line= <div id="div_zm"><h2>div_zm</h2></div>
FIND j=5793 line= </div>
FIND j=5794 line=
FIND j=5795 line=
FIND j=5796 line=
FIND j=5797 line= </div>
FIND j=5798 line= </body>
FIND j=5799 line= </html>
FIND j=5800 line=<!DOCTYPE html>
FIND j=5801 line=<html>
FIND j=5802 line= <head>
FIND j=5803 line=<!--
FIND j=5804 line= <script type="text/javascript" src="./zm/ZoomifyImageViewer.js"></script>
FIND j=5805 line=
-->
FIND j=5806 line=<style>
FIND j=5807 line= @font-face {
FIND j=5808 line= font-family: yokkmokkOT;
FIND j=5809 line= src: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
FIND j=5810 line= }
FIND j=5811 line=
FIND j=5812 line= @font-face {
FIND j=5813 line= font-family: 'yokkmokkOT_file';
FIND j=5814 line= src: url('./fonts/yokkmokkOT.otf'); /* IE 5-8 */
FIND j=5815 line= src: local('?'), /* sneakily trick IE */
FIND j=5816 line= url('./fonts/yokkmokk.ttf') format('truetype'), /* Opera, Safari */
FIND j=5817 line= url('./fonts/yokkmokkOT.woff') format('woff'), /* FF 3.6, Chrome 5, IE9 */
FIND j=5818 line= url('./fonts/yokkmokkOT.svg#font') format('svg'); /* iOS */
FIND j=5819 line= }
FIND j=5820 line=
FIND j=5821 line= body {
FIND j=5822 line=// background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
FIND j=5823 line= background-color: lightblue;
FIND j=5824 line= background-color: darkslategrey;
FIND j=5825 line= background-color: darkgreyslate;
FIND j=5826 line=// color: black;
FIND j=5827 line= color: white;
FIND j=5828 line= font-size:62.5%;
FIND j=5829 line= font-family: "New Times Roman";
FIND j=5830 line= font-family: "serif";
FIND j=5831 line= font-family: "sans-serif";
FIND j=5832 line= font-family: "courier";
FIND j=5833 line= font-family: "monospace";
FIND j=5834 line= font-family: cursive;
FIND j=5835 line= font-family: fantasy;
FIND j=5836 line= font-family: yokkmokkOT;
FIND j=5837 line= font-family: "arial";
FIND j=5838 line= font-size: 38pt;
FIND j=5839 line= }
FIND j=5840 line=
FIND j=5841 line=// h1 { font-size: 2.4em; } /* =24px */
FIND j=5842 line= h1 { font-size: 14pt; } /* =24px */
FIND j=5843 line= h2 { font-size: 12pt; } /* =24px */
FIND j=5844 line= p { font-size: 10pt; } /* =14px */
FIND j=5845 line= li { font-size: 20pt; } /* =14px? */
FIND j=5846 line= }
FIND j=5847 line=
FIND j=5848 line= </style>
FIND j=5849 line=
FIND j=5850 line= <div id="div_url">
FIND j=5851 line= <script id="script_url">
FIND j=5852 line= var url = document.createElement("a");
FIND j=5853 line= url.href=location.href;
FIND j=5854 line= var output = "output";
FIND j=5855 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
FIND j=5856 line=
FIND j=5857 line= if( url.search != "" ) {
FIND j=5858 line= script_zm_view( url.search );
FIND j=5859 line= }
FIND j=5860 line=// alert(location.href)
FIND j=5861 line=// alert(url.protocol)
FIND j=5862 line=// alert(url.hostname)
FIND j=5863 line=// alert(url.pathname)
FIND j=5864 line=// alert(url.search)
FIND j=5865 line=// alert(url.hash)
FIND j=5866 line=
FIND j=5867 line=
FIND j=5868 line=// document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
FIND j=5869 line=// document.write( "pathname=" + url.pathname + " search=" + url.search );
FIND j=5870 line= </script>
FIND j=5871 line= </div>
FIND j=5872 line=
FIND j=5873 line=
FIND j=5874 line=
FIND j=5875 line= <script id="script_zmviewer" src="data:/text/plain;base64,KGZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30uY2FsbCgpO2EuWj17fX0pKCksWi5zaG93SW1hZ2U9ZnVuY3Rpb24oYSxiLGMpe1ouVXRpbHMuejEyOCgpLFouVXRpbHMuejEyNygpLFouVXRpbHMuejEyNigpLFouVXRpbHMuejE2MygpLFoucGFnZUNvbnRhaW5lcklEPWEsWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGIpLFoucGFyYW1ldGVycz1aLlV0aWxzLnoyMzMoYyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJET01Db250ZW50TG9hZGVkIixaLmluaXRpYWxpemUpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csImxvYWQiLFouaW5pdGlhbGl6ZSl9LFouaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2FyZ3VtZW50cy5jYWxsZWUuZG9uZXx8KGFyZ3VtZW50cy5jYWxsZWUuZG9uZT0hMCxaLlV0aWxzLnoxNjQoKSxaLlV0aWxzLnoyNDkoWi5wYXJhbWV0ZXJzKSxaLlZpZXdlcj1uZXcgWi56MTIyLFouVXRpbHMuaXNTdHJWYWwoWi5jb3B5cmlnaHRQYXRoKT9aLlV0aWxzLmVuZm9yY2VDb3B5cmlnaHQoKTpaLlZpZXdlci56MTQ5KCksWi5kZWJ1ZyYmWi5VdGlscy50cmFjZShaLlV0aWxzLnoxODUoIno2NyIpKSl9LFouejEyMj1mdW5jdGlvbigpe1ouVmlld2VyRGlzcGxheT1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIlZpZXdlckRpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJyZWxhdGl2ZSIsImhpZGRlbiIsIjEwMCUiLCIxMDAlIiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJwb2ludGVyIiksWi5wYWdlQ29udGFpbmVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFoucGFnZUNvbnRhaW5lcklEKTt2YXIgYT1aLlV0aWxzLnoxNzYoWi5wYWdlQ29udGFpbmVyKTtaLnZpZXdlclc9cGFyc2VGbG9hdChhLndpZHRoKSxaLnZpZXdlckg9cGFyc2VGbG9hdChhLmhlaWdodCksaXNOYU4oWi52aWV3ZXJXKSYmKFoudmlld2VyVz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKFoudmlld2VySCkmJihaLnZpZXdlckg9Wi5WaWV3ZXJEaXNwbGF5LmNsaWVudEhlaWdodCksWi5wYWdlQ29udGFpbmVyLmlubmVySFRNTD0iIixaLnBhZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQoWi5WaWV3ZXJEaXNwbGF5KSx0aGlzLnoxNDk9ZnVuY3Rpb24oKXtaLlZpZXdwb3J0PW5ldyBaLnoxMjV9LHRoaXMuejE0OD1mdW5jdGlvbigpe1oudG9vbGJhclZpc2libGU+MCYmKFouVG9vbGJhcj1uZXcgWi56MTI0KFouVmlld3BvcnQpKSxaLm5hdmlnYXRvclZpc2libGU+MCYmKFouTmF2aWdhdG9yPW5ldyBaLnoxMjMoWi5WaWV3cG9ydCkpLFouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56Mjc3KCl9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSl7Wi52aWV3ZXJXPWEsWi52aWV3ZXJIPWIsWi5WaWV3ZXJEaXNwbGF5LnN0eWxlLndpZHRoPWErInB4IixaLlZpZXdlckRpc3BsYXkuc3R5bGUuaGVpZ2h0PWIrInB4IixaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSYmWi5WaWV3cG9ydC5zZXRTaXplQW5kUG9zaXRpb24oYSxiLGMsZCk7dmFyIGY9Wi50b29sYmFyUG9zaXRpb249PTE/Yi1aLnRvb2xiYXJIOjA7Wi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmKFouVG9vbGJhci5zZXRTaXplQW5kUG9zaXRpb24oYSxudWxsLG51bGwsZiksWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMCkpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5OYXZpZ2F0b3IuejE4MCgpJiYoWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKG51bGwsbnVsbCxjLGQsWi5uYXZpZ2F0b3JGaXQpLFoubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSksZSYmWi5WaWV3cG9ydC56Mjc0KCEwKX0sdGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7Wi5WaWV3cG9ydC56MjkzQWxsU3RvcCghMCksWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGEpO3ZhciBiPW5ldyBaLnoxMDEsYz1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi8iKyJJbWFnZVByb3BlcnRpZXMueG1sIik7Yi5sb2FkWE1MKGMpfX0sWi56MTI1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2QoKXt6PTEsQT0wLEI9MCxGPVtdLEc9W10sSD1bXSxJPVtdLEo9W10sSz1bXSxMPVtdLE09W10sTj1bXSxPPVtdLFA9W10sUT1bXSxSPTB9ZnVuY3Rpb24gY2UoKXtyZXR1cm4gYn1mdW5jdGlvbiBjZihhKXtiPWF9ZnVuY3Rpb24gY2coKXtoPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwidmlld3BvcnRDb250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChoKSxpPWgsaz1pLnN0eWxlLGw9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydEJhY2tmaWxsRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZChsKSxtPWwsbj1tLnN0eWxlLHA9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydERpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLGguYXBwZW5kQ2hpbGQocCkscT1wLHI9cS5zdHlsZSxaLlV0aWxzLmlzU3RyVmFsKFoud2F0ZXJtYXJrUGF0aCkmJih0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2F0ZXJtYXJrRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh0KSx1PXQsdj11LnN0eWxlKSxaLlV0aWxzLmlzU3RyVmFsKFouaG90c3BvdFBhdGgpJiYodz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsImhvdHNwb3RzRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh3KSx4PXcseT14LnN0eWxlKSxaLnVzZUNhbnZhcz8obz1tLmdldENvbnRleHQoIjJkIikscz1xLmdldENvbnRleHQoIjJkIikpOihtLmlubmVySFRNTD0iIixxLmlubmVySFRNTD0iIiksdSYmKHUuaW5uZXJIVE1MPSIiKSx4JiYoeC5pbm5lckhUTUw9IiIpfWZ1bmN0aW9uIGNoKGEsYixjLGQpe2N8fChjPTApLGR8fChkPTApLFk9YSwkPWIsYmI9WSpYLGJjPSQqWCxiZD1iYi8yLGJlPWJjLzIsYmY9LSgoYmItWSkvMikrYyxiZz0oYmItWSkvMitjLGJoPS0oKGJjLSQpLzIpK2QsYmk9KGJjLSQpLzIrZCxpLndpZHRoPWJiLGkuaGVpZ2h0PWJjLGsud2lkdGg9YmIrInB4IixrLmhlaWdodD1iYysicHgiLGsubGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIscS53aWR0aD1iYixxLmhlaWdodD1iYyx1JiYodS53aWR0aD1iYix1LmhlaWdodD1iYyx2LndpZHRoPWJiKyJweCIsdi5oZWlnaHQ9YmMrInB4IiksWi51c2VDYW52YXMmJihzLnRyYW5zbGF0ZShiZCxiZSkscy5zYXZlKCkpfWZ1bmN0aW9uIGNpKCl7dmFyIGE9Wi5pbWFnZVcsYj1aLmltYWdlSDt3aGlsZShhPmN8fGI+YylhPWEvMixiPWIvMix6Kys7YT1aLmltYWdlVyxiPVouaW1hZ2VIO2Zvcih2YXIgZD16LTE7ZD49MDtkLS0pSFtkXT1hLElbZF09YixKW2RdPU1hdGguY2VpbChIW2RdL2MpLEtbZF09TWF0aC5jZWlsKElbZF0vYyksTFtkXT1KW2RdKktbZF0sYT1hLzIsYj1iLzJ9ZnVuY3Rpb24gY2ooKXtaLmluaXRpYWxYfHwoWi5pbml0aWFsWD1aLmltYWdlVy8yKSxaLmluaXRpYWxZfHwoWi5pbml0aWFsWT1aLmltYWdlSC8yKTt2YXIgYT1jUigpO1ouZml0WiYmWi5maXRaIT1hJiYoWi5pbml0aWFsWj09Wi5maXRaJiYoWi5pbml0aWFsWj1udWxsKSxaLm1pblo9PVouZml0WiYmKFoubWluWj1udWxsKSxaLm1heFo9PVouZml0WiYmKFoubWF4Wj1udWxsKSxaLmZpdFo9bnVsbCksWi5maXRafHwoWi5maXRaPWEpLFouaW5pdGlhbFp8fChaLmluaXRpYWxaPVouZml0WiksWi5taW5afHwoWi5taW5aPVouZml0WiksWi5tYXhafHwoWi5tYXhaPVouZml0WiksWi5pbml0aWFsWjxaLm1pblomJihaLmluaXRpYWxaPVoubWluWiksWi5pbml0aWFsWj5aLm1heFomJihaLmluaXRpYWxaPVoubWF4Wil9ZnVuY3Rpb24gY2soKXtjbChXKSx6PlQmJihjbChWKSx6PlMmJmNsKFUpKSxHLnNvcnQoKSxHPVouVXRpbHMuejI0MihHKSxjcyhHLGNKLDApfWZ1bmN0aW9uIGNsKGEpe3ZhciBiPUpbYV0tMSxjPUtbYV0tMTtmb3IodmFyIGQ9MDtkPD1jO2QrKylmb3IodmFyIGU9MDtlPD1iO2UrKylHLnB1c2goYSsiLSIrZSsiLSIrZCl9ZnVuY3Rpb24gY20oYSxiKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKSxkPWJmLXBhcnNlRmxvYXQoay5sZWZ0KSxlPWJoLXBhcnNlRmxvYXQoay50b3ApO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsWi5pbWFnZVg9Wi5pbWFnZVgrZC9aLmltYWdlWixaLmltYWdlWT1aLmltYWdlWStlL1ouaW1hZ2VaLGNyKG0sQixGLCExLCExKSxjcihxLEEsTywhMSwhMSksY1koKTt2YXIgZj1jdygpO2E+MD9mLnJpZ2h0PWYubGVmdDphPDAmJihmLmxlZnQ9Zi5yaWdodCksYj4wP2YuYm90dG9tPWYudG9wOmI8MCYmKGYudG9wPWYuYm90dG9tKTtmb3IodmFyIGc9Zi50b3A7Zzw9Zi5ib3R0b207ZysrKWZvcih2YXIgaD1mLmxlZnQ7aDw9Zi5yaWdodDtoKyspUS5wdXNoKEErIi0iK2grIi0iK2cpO3ZhciBpPVEubGVuZ3RoO2Zvcih2YXIgaj0wO2o8aTtqKyspe3ZhciBsPVFbal07aWYobCl7dmFyIG49bmV3IGNHKGwpO2NJKG4sYyxjSyl9fWk+MzAmJlEuc3BsaWNlKGktMzAsMzApfWZ1bmN0aW9uIGNuKCl7dmFyIGE9ITE7cGFyc2VGbG9hdChyLndpZHRoKSE9cS53aWR0aCYmKFoudXNlQ2FudmFzJiYoci53aWR0aD1xLndpZHRoKyJweCIsci5oZWlnaHQ9cS5oZWlnaHQrInB4IixyLmxlZnQ9IjBweCIsci50b3A9IjBweCIscy5yZXN0b3JlKCkscy5zYXZlKCkscy5zY2FsZShDLEMpKSxhPSEwKTtpZihwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymgpe3ZhciBiPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixjPXBhcnNlRmxvYXQoay50b3ApLWJoO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsYmw9cGFyc2VGbG9hdChuLmxlZnQpK2IsYm09cGFyc2VGbG9hdChuLnRvcCkrYyxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiO3ZhciBkPWNCKEEsQyk7Wi5pbWFnZVg9Wi5pbWFnZVgtYi9kLFouaW1hZ2VZPVouaW1hZ2VZLWMvZCxhPSEwfWEmJihjcihxLEEsTywhMCwhMSksY1koKSl9ZnVuY3Rpb24gY28oKXtDIT1EJiYoWi5pbWFnZVo9YnopLFouaW1hZ2VaPFoubWluWiYmKFouaW1hZ2VaPVoubWluWik7dmFyIGE9ZCxiPXo7d2hpbGUoYS8yPj1aLmltYWdlWiliLS0sYS89MjtiPWItMTwwPzA6Yi0xO3ZhciBjPWNDKGIsWi5pbWFnZVopO2lmKGIhPUF8fGMhPUMpWi51c2VDYW52YXMmJihzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLnNjYWxlKGMsYykpLEE9YixDPWM7RD1DfWZ1bmN0aW9uIGNwKCl7Qj1BPlM/VTpBPlQ/VjpXLEU9Y0MoQixaLmltYWdlWiksdGllckJhY2tmaWxsVz1IW0JdLHRpZXJCYWNrZmlsbEg9SVtCXSxtLndpZHRoPXRpZXJCYWNrZmlsbFcsbS5oZWlnaHQ9dGllckJhY2tmaWxsSDt2YXIgYT10aWVyQmFja2ZpbGxXKkUsYj10aWVyQmFja2ZpbGxIKkUsYz1aLmltYWdlWCpaLmltYWdlWixkPVouaW1hZ2VZKlouaW1hZ2VaO2JqPWEsYms9YixibD1iZC1jLGJtPWJlLWQsWi51c2VDYW52YXMmJihuLndpZHRoPWJqKyJweCIsbi5oZWlnaHQ9YmsrInB4Iiksbi5sZWZ0PWJsKyJweCIsbi50b3A9Ym0rInB4In1mdW5jdGlvbiBjcSgpe3ZhciBhPWN3KCk7Zm9yKHZhciBiPWEudG9wLGM9YS5ib3R0b207Yjw9YztiKyspZm9yKHZhciBkPWEubGVmdCxlPWEucmlnaHQ7ZDw9ZTtkKyspTi5wdXNoKEErIi0iK2QrIi0iK2IpO1Auc29ydCgpLE4uc29ydCgpLFA9Wi5VdGlscy56MjQyKFApLE49Wi5VdGlscy56MjQyKE4pO3ZhciBmPVouVXRpbHMuaW50ZXJzZWN0KE4sUCk7Tj1aLlV0aWxzLnN1YnRyYWN0KE4sUCksUj10aWxlc0xvYWRpbmdOYW1lc0xlbmd0aD1OLmxlbmd0aCxaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpJiZaLlRvb2xiYXIuc2hvd1Byb2dyZXNzKFIsdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGgpLFA9Wi5VdGlscy5zdWJ0cmFjdChQLGYpLFA9UC5jb25jYXQoZiksdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGghPTAmJihNPVtdKX1mdW5jdGlvbiBjcihhLGIsYyxkLGUpe2V8fGN0KGEpO2lmKGQpe3ZhciBmPU1hdGguZmxvb3IoYy5sZW5ndGgvMik7Zm9yKHZhciBnPWYsaD1jLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1jW2ddO2kmJmkudD09YiYmY00oYSxiLGkpO2lmKGMubGVuZ3RoLWctMSE9Zyl7dmFyIGk9Y1tjLmxlbmd0aC1nLTFdO2kmJmkudD09YiYmY00oYSxiLGkpfX19ZWxzZSBmb3IodmFyIGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspe3ZhciBpPWNbZ107aSYmaS50PT1iJiZjTShhLGIsaSl9fWZ1bmN0aW9uIGNzKGEsYixjKXtpZihhLmxlbmd0aD4wKXt2YXIgZD0obmV3IERhdGUpLmdldFRpbWUoKTtpZihjKXt2YXIgZT1NYXRoLmZsb29yKGEubGVuZ3RoLzIpO2Zvcih2YXIgZj1lLGc9YS5sZW5ndGg7ZjxnO2YrKyl7dmFyIGg9YVtmXTtpZihoKXt2YXIgaT1uZXcgY0coaCk7Y0koaSxkLGIpfWlmKGEubGVuZ3RoLWYtMSE9Zil7dmFyIGg9YVthLmxlbmd0aC1mLTFdO2lmKGgpe3ZhciBpPW5ldyBjRyhoKTtjSShpLGQsYil9fX19ZWxzZSBmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWFbZl07aWYoaCl7dmFyIGk9bmV3IGNHKGgpO2NJKGksZCxiKX19fX1mdW5jdGlvbiBjdChhKXtpZihhKWlmKFoudXNlQ2FudmFzJiZhLnRhZ05hbWU9PSJDQU5WQVMiKXt2YXIgYj1hLmdldENvbnRleHQoIjJkIik7Yi5zYXZlKCksYi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGIuY2xlYXJSZWN0KDAsMCxiLmNhbnZhcy53aWR0aCxiLmNhbnZhcy5oZWlnaHQpLGIucmVzdG9yZSgpfWVsc2UgaWYoYS5oYXNDaGlsZE5vZGVzKCkpd2hpbGUoYS5jaGlsZE5vZGVzLmxlbmd0aD49MSlhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY3UoKXtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXt2YXIgYT1jQihBLEMpO1ouVG9vbGJhci56MjY2KGEpfX1mdW5jdGlvbiBjdigpe1ouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56MTgwKCkmJlouTmF2aWdhdG9yLnoyNjgoKX1mdW5jdGlvbiBjdygpe3JldHVybiBuZXcgY3ooY3goKSxBKX1mdW5jdGlvbiBjeCgpe3ZhciBhPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixiPXBhcnNlRmxvYXQoay50b3ApLWJoO2lmKFoudXNlQ2FudmFzKXt2YXIgYz1wYXJzZUZsb2F0KGsud2lkdGgpL2kud2lkdGg7YS89YyxiLz1jfXZhciBkPWNCKEEsQyk7cmV0dXJuIGEhPTAmJihhLz1kKSxiIT0wJiYoYi89ZCksbmV3IGNBKFouaW1hZ2VYLWEsWi5pbWFnZVktYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsZCl9ZnVuY3Rpb24gY3koKXt2YXIgYT1wYXJzZUZsb2F0KGsubGVmdCktYmYsYj1wYXJzZUZsb2F0KGsudG9wKS1iaDtpZihaLnVzZUNhbnZhcyl7dmFyIGM9cGFyc2VGbG9hdChrLndpZHRoKS9pLndpZHRoO2EvPWMsYi89Y312YXIgZD1jQihBLEMpO3JldHVybiBhIT0wJiYoYS89ZCksYiE9MCYmKGIvPWQpLG5ldyBjQShaLmltYWdlWC1hLFouaW1hZ2VZLWIsLShiYi8yKSxiYi8yLC0oYmMvMiksYmMvMixkKX1mdW5jdGlvbiBjeihhLGIpe3ZhciBkPWNCKGIsMSksZT1NYXRoLmZsb29yKGEubGVmdCpkL2MpLGY9TWF0aC5mbG9vcihhLnJpZ2h0KmQvYyksZz1NYXRoLmZsb29yKGEudG9wKmQvYyksaD1NYXRoLmZsb29yKGEuYm90dG9tKmQvYyk7ZTwwJiYoZT0wKSxmPkpbQV0tMSYmKGY9SltBXS0xKSxnPDAmJihnPTApLGg+S1tBXS0xJiYoaD1LW0FdLTEpLHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9Zix0aGlzLnRvcD1nLHRoaXMuYm90dG9tPWh9ZnVuY3Rpb24gY0EoYSxiLGMsZCxlLGYsZyl7dGhpcy5sZWZ0PWErYy9nLHRoaXMucmlnaHQ9YStkL2csdGhpcy50b3A9YitlL2csdGhpcy5ib3R0b209YitmL2d9ZnVuY3Rpb24gY0IoYSxiKXt2YXIgYz1iKihIW2FdL1ouaW1hZ2VXKTtyZXR1cm4gY31mdW5jdGlvbiBjQyhhLGIpe3ZhciBjPWIvKEhbYV0vWi5pbWFnZVcpO3JldHVybiBjfWZ1bmN0aW9uIGNEKGEsYil7dmFyIGM9YS1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS54LGQ9Yi1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS55O3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChjLGQpfWZ1bmN0aW9uIGNFKGEsYil7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpK2JkLGQ9cGFyc2VGbG9hdChrLnRvcCkrYmUsZT1hLWMsZj1iLWQsZz1lL1ouaW1hZ2VaLGg9Zi9aLmltYWdlWixpPVouaW1hZ2VYK2csaj1aLmltYWdlWStoO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNGKGEsYil7dmFyIGM9Wi5pbWFnZVgtYSxkPVouaW1hZ2VZLWIsZT1jKlouaW1hZ2VaLGY9ZCpaLmltYWdlWixnPXBhcnNlRmxvYXQoay5sZWZ0KStiZCxoPXBhcnNlRmxvYXQoay50b3ApK2JlLGk9Zy1lLGo9aC1mO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNHKGEpe3RoaXMubmFtZT1hLHRoaXMudD1wYXJzZUludChhLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLSIpKSwxMCksdGhpcy5jPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEuaW5kZXhPZigiLSIpKzEsYS5sYXN0SW5kZXhPZigiLSIpKSwxMCksdGhpcy5yPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEubGFzdEluZGV4T2YoIi0iKSsxKSwxMCksdGhpcy54PU1hdGguZmxvb3IodGhpcy5jKmMpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMucipjKSx0aGlzLmltYWdlPW51bGwsdGhpcy5hbHBoYT0wLHRoaXMudXJsPVouVXRpbHMuejE0MChjSCh0aGlzLnQsdGhpcy5jLHRoaXMucix0aGlzLm5hbWUpKSx0aGlzLmVsbXQ9bnVsbCx0aGlzLnN0eWxlPW51bGx9ZnVuY3Rpb24gY0goYSxiLGQsZSl7dmFyIGY9ZCpKW2FdK2I7Zm9yKHZhciBnPTA7ZzxhO2crKylmKz1MW2ddO3ZhciBoPU1hdGguZmxvb3IoZi9jKSxpPVouaW1hZ2VQYXRoKyIvIisiVGlsZUdyb3VwIitoKyIvIitlKyIuanBnIjtyZXR1cm4gaX1mdW5jdGlvbiBjSShhLGIsYyl7YS5sb2FkaW5nPWNiLnoyMTJJbWFnZShhLnVybCxaLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsYyxhLGIpKX1mdW5jdGlvbiBjSihhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtGLnB1c2goYSk7dmFyIGU9Ry5pbmRleE9mKGQpO2UhPS0xJiZHLnNwbGljZShlLDEpLGEuYWxwaGE9MSxhLnQ9PUImJmNNKG0sQixhKX19ZnVuY3Rpb24gY0soYSxiLGMpe2lmKGEmJmImJmMpe2EuaW1hZ2U9Yzt2YXIgZD1hLm5hbWU7Y00ocSxBLGEpfX1mdW5jdGlvbiBjTChhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtPLnB1c2goYSksUC5wdXNoKGQpO3ZhciBlPU4uaW5kZXhPZihkKTtlIT0tMSYmTi5zcGxpY2UoZSwxKSxNLnB1c2goYSksYkZ8fChiRj13aW5kb3cuc2V0SW50ZXJ2YWwoY1AsNTApKTt2YXIgZz1OLmxlbmd0aDtnPT0wJiYoWi51c2VDYW52YXMmJmNyKHEsQSxPLCEwLCExKSxQLmxlbmd0aD5mJiZjUSgpLFI9MCksWi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmWi5Ub29sYmFyLnNob3dQcm9ncmVzcyhSLGcpfX1mdW5jdGlvbiBjTShhLGIsYyl7dmFyIGQ9Yy54LGU9Yy55LGY9Y0IoYiwxKTtpZihaLnVzZUNhbnZhcylhPT1xJiYoZC09Wi5pbWFnZVgqZixlLT1aLmltYWdlWSpmKSxjTihhLGMsZCxlKTtlbHNle3ZhciBnO2E9PXE/KGQtPVouaW1hZ2VYKmYtYmQvQyxlLT1aLmltYWdlWSpmLWJlL0MsZz1DKTpnPUUsY08oYSxjLGQsZSxnKX19ZnVuY3Rpb24gY04oYSxiLGMsZCl7dmFyIGU9YS5nZXRDb250ZXh0KCIyZCIpO1ouYWxwaGFTdXBwb3J0ZWQmJmIuYWxwaGE8MT8oZS5nbG9iYWxBbHBoYT1iLmFscGhhLGUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKSxlLmdsb2JhbEFscGhhPTEpOmUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKX1mdW5jdGlvbiBjTyhhLGIsYyxkLGUpe2IuZWxtdHx8KGIuZWxtdD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImltZyIpLGIuZWxtdC5vbm1vdXNlZG93bj1aLlV0aWxzLnByZXZlbnREZWZhdWx0LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihiLmVsbXQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxiLmVsbXQuc3JjPWIudXJsLGIuc3R5bGU9Yi5lbG10LnN0eWxlLGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixaLlV0aWxzLnJlbmRlclF1YWxpdHkoYixaLnJlbmRlclF1YWxpdHkpLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCYmKGIuc3R5bGVbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eSsiT3JpZ2luIl09IjBweCAwcHgiKSksYi5lbG10LnBhcmVudE5vZGUhPWEmJmEuYXBwZW5kQ2hpbGQoYi5lbG10KTt2YXIgZj1iLnN0eWxlO2YuZGlzcGxheT0ibm9uZSIsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkP2ZbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eV09WyJtYXRyaXgoIiwoYi5pbWFnZS53aWR0aC9iLmVsbXQud2lkdGgqZSkudG9GaXhlZCg4KSwiLDAsMCwiLChiLmltYWdlLmhlaWdodC9iLmVsbXQuaGVpZ2h0KmUpLnRvRml4ZWQoOCksIiwiLChjKmUpLnRvRml4ZWQoOCksWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPyIsIjoicHgsIiwoZCplKS50b0ZpeGVkKDgpLFouY3NzVHJhbnNmb3JtTm9Vbml0cz8iKSI6InB4KSJdLmpvaW4oIiIpOihmLndpZHRoPWIuaW1hZ2Uud2lkdGgqZSsicHgiLGYuaGVpZ2h0PWIuaW1hZ2UuaGVpZ2h0KmUrInB4IixmLmxlZnQ9YyplKyJweCIsZi50b3A9ZCplKyJweCIpLGYuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnNldE9wYWNpdHkoYixiLmFscGhhKX1mdW5jdGlvbiBjUChhKXt2YXIgYj1NLmxlbmd0aCxjPTA7Zm9yKHZhciBkPTA7ZDxiO2QrKyl7dmFyIGU9TVtkXTtlLnQ9PUEmJihlLmFscGhhPDE/KGUuYWxwaGErPWJFLGUuYWxwaGE+MSYmKGUuYWxwaGE9MSksY00ocSxBLGUpKTooYysrLGM+PWImJih3aW5kb3cuY2xlYXJJbnRlcnZhbChiRiksYkY9bnVsbCkpKX19ZnVuY3Rpb24gY1EoKXt2YXIgYT1QLmxlbmd0aC1mO2Zvcih2YXIgYj0wO2I8YTtiKyspaj1QLmluZGV4T2YoT1tiXS5uYW1lKSxqIT0tMSYmUC5zcGxpY2UoaiwxKSxPLnNwbGljZShiLDEpfWZ1bmN0aW9uIGNSKCl7cmV0dXJuIFouaW1hZ2VXL1ouaW1hZ2VIPlkvJD9ZL1ouaW1hZ2VXOiQvWi5pbWFnZUh9ZnVuY3Rpb24gY1MoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9bmV3IGNBKGEsYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGQ9Yy5sZWZ0LGU9Yy5yaWdodCxmPWMudG9wLGc9Yy5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9kPDA/YT1ZLzIvWi5pbWFnZVo6ZT5aLmltYWdlVyYmKGE9Wi5pbWFnZVctWS8yL1ouaW1hZ2VaKTphPVouaW1hZ2VXLzIsWi5pbWFnZUgqWi5pbWFnZVo+JD9mPDA/Yj0kLzIvWi5pbWFnZVo6Zz5aLmltYWdlSCYmKGI9Wi5pbWFnZUgtJC8yL1ouaW1hZ2VaKTpiPVouaW1hZ2VILzJ9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1QoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Y0IoQSxDKSxkPVouaW1hZ2VYLGU9Wi5pbWFnZVksZj1uZXcgY0EoZCxlLC0oWS8yKSxZLzIsLSgkLzIpLCQvMixjKSxnPWYubGVmdCxoPWYucmlnaHQsaT1mLnRvcCxqPWYuYm90dG9tO1ouaW1hZ2VXKmM+WT9nPDA/YSs9ZypjOmg+Wi5pbWFnZVcmJihhLT0oWi5pbWFnZVctaCkqYyk6YSs9KGQtWi5pbWFnZVcvMikqYyxaLmltYWdlSCpjPiQ/aTwwP2IrPWkqYzpqPlouaW1hZ2VIJiYoYi09KFouaW1hZ2VILWopKmMpOmIrPShlLVouaW1hZ2VILzIpKmN9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1UoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Wi5pbWFnZVgtKGEtYmYpL1ouaW1hZ2VaLGQ9Wi5pbWFnZVktKGItYmgpL1ouaW1hZ2VaLGU9bmV3IGNBKGMsZCwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGY9ZS5sZWZ0LGc9ZS5yaWdodCxoPWUudG9wLGk9ZS5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9mPDA/YSs9ZipaLmltYWdlWjpnPlouaW1hZ2VXJiYoYS09KFouaW1hZ2VXLWcpKlouaW1hZ2VaKTphKz0oYy1aLmltYWdlVy8yKSpaLmltYWdlWixaLmltYWdlSCpaLmltYWdlWj4kP2g8MD9iKz1oKlouaW1hZ2VaOmk+Wi5pbWFnZUgmJihiLT0oWi5pbWFnZUgtaSkqWi5pbWFnZVopOmIrPShkLVouaW1hZ2VILzIpKlouaW1hZ2VafXJldHVybiBuZXcgWi5VdGlscy5Qb2ludChhLGIpfWZ1bmN0aW9uIGNWKGEpe3JldHVybiBhPloubWF4Wj9hPVoubWF4WjphPFoubWluWiYmKGE9Wi5taW5aKSxhfWZ1bmN0aW9uIGNXKCl7Ylo9bmV3IEltYWdlLGIkPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzMiKSksYloudXJsPVoud2F0ZXJtYXJrUGF0aCxiWi5vbmxvYWQ9Y1gsYloub25lcnJvcj1jWixiWi5zcmM9Wi53YXRlcm1hcmtQYXRofWZ1bmN0aW9uIGNYKCl7aWYodSl7dmFyIGE9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno3NCIpKSxiPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzYiKSksYz1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejc1IikpLGQ9Y0IoQSxDKSxlPShaLmltYWdlVypkLXUud2lkdGgpLzIsZj0oWi5pbWFnZUgqZC11LmhlaWdodCkvMixnPShaLmltYWdlVy8yLVouaW1hZ2VYKSpkLGg9KFouaW1hZ2VILzItWi5pbWFnZVkpKmQsaT1kPGE/YTpkLGo9TWF0aC5yb3VuZChaLmltYWdlVy9iKSxrPU1hdGgucm91bmQoWi5pbWFnZUgvYyksbD1jeSgpO3dpU2NhbGVkVz1iWi53aWR0aCppLHdpU2NhbGVkSD1iWi5oZWlnaHQqaTt2YXIgbT0wLG49MDtmb3IodmFyIG89MTtvPD1qO28rKylmb3IodmFyIHA9MTtwPD1rO3ArKyl7dmFyIHE9TWF0aC5yb3VuZChaLmltYWdlVy8oaisxKSpvKSxyPU1hdGgucm91bmQoWi5pbWFnZUgvKGsrMSkqcCk7aWYocT5sLmxlZnQmJnE8bC5yaWdodCYmcj5sLnRvcCYmcjxsLmJvdHRvbSl7dmFyIHM9TWF0aC5yb3VuZChxKmQtd2lTY2FsZWRXLzItZStnKSx0PU1hdGgucm91bmQocipkLXdpU2NhbGVkSC8yLWYraCk7aWYoWi5pbWFnZVc+NGUzKXt2YXIgdj1tKzEwMCx3PW4rMTAwO2lmKHM8diYmdDx3KWNvbnRpbnVlO209cyxuPXR9dmFyIHg9YlouY2xvbmVOb2RlKCEwKTtaLlV0aWxzLnNldE9wYWNpdHkoeCxiJCkseC53aWR0aD13aVNjYWxlZFcseC5oZWlnaHQ9d2lTY2FsZWRIO3ZhciB5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2lDIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLHdpU2NhbGVkVysicHgiLHdpU2NhbGVkSCsicHgiLHMrInB4Iix0KyJweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7eS5hcHBlbmRDaGlsZCh4KSx1LmFwcGVuZENoaWxkKHkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHgsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9fX19ZnVuY3Rpb24gY1koKXt1JiYoY3QodSksY1goKSl9ZnVuY3Rpb24gY1ooKXtaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6OTciKSt0aGlzLnVybCl9ZnVuY3Rpb24gYyQoYixjLGQpe2EuejI5M0FsbFN0b3AoKSxaLmltYWdlWj1jVihkKTt2YXIgZT1jUyhiLGMpO1ouaW1hZ2VYPWUueCxaLmltYWdlWT1lLnksYS56Mjc0KCEwKX1mdW5jdGlvbiBjXygpe2lmKGJCKXtkYihidixidyxieCwhMSk7aWYoYnYhPT0wfHxidyE9PTB8fGJ4IT09MCliQj13aW5kb3cuc2V0VGltZW91dChjXyxiQSl9fWZ1bmN0aW9uIGRhKCl7Yk88Ykk/KGRiKGJKLGJLLGJMLCEwKSxiTysrLGJOPXdpbmRvdy5zZXRUaW1lb3V0KGRhLGJIKSk6KEM9Yk8qYkwrY0MoQSxaLmltYWdlWiksYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfWZ1bmN0aW9uIGRiKGEsYixkLGUpe3ZhciBmLGcsaCxpPSExLGo9ITEsbD0hMTtpZihkIT0wKXt2YXIgbT1DKigxK2QpO2UmJihtPUMrZCk7dmFyIG49Y0IoQSxtKTtoPWNWKG4pO2lmKGghPVouaW1hZ2VaKXt2YXIgbz1kZShoKTtvJiYoIWUsaj0hMCxsPSEwKX19aWYoYSE9MHx8YiE9MCl7dmFyIHA9cGFyc2VGbG9hdChrLmxlZnQpK2Escz1wYXJzZUZsb2F0KGsudG9wKStiLHQ9Y1UocCxzKTtmPXQueCxnPXQueSxrLmxlZnQ9ZisicHgiLGsudG9wPWcrInB4IixpPSEwLGw9ITB9dmFyIHU9YnklMj09MDt1JiYoY1koKSxqJiZjdSgpLGwmJmN2KCkpO2lmKGkpdmFyIHY9Wi51c2VDYW52YXM/cGFyc2VGbG9hdChyLndpZHRoKS9xLndpZHRoOjEsdz1NYXRoLnJvdW5kKGMvYnUqQyp2KSx4PWJ5JXc9PTAmJmJ5IT0wfWZ1bmN0aW9uIGRjKCl7YkImJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJCKSxiQj1udWxsKSxidj0wLGJ3PTAsYng9MCxieT0wfWZ1bmN0aW9uIGRkKCl7Yk4mJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJOKSxiTj1udWxsKX1mdW5jdGlvbiBkZShhKXt2YXIgYj0hMSxjPWNDKEEsYSk7aWYoYyE9Qyl7Qz1jLEU9Y0MoQixhKTt2YXIgZD1jL0QsZT1iYipkLGY9YmMqZCxnPShiYi1lKS8yLGg9KGJjLWYpLzI7aWYoYzxEKXt2YXIgaT1jVChnLGgpO2subGVmdD1iZitpLngtZysicHgiLGsudG9wPWJoK2kueS1oKyJweCJ9aWYoWi51c2VDYW52YXMpci53aWR0aD1lKyJweCIsci5oZWlnaHQ9ZisicHgiLHIubGVmdD1nKyJweCIsci50b3A9aCsicHgiLGU9YmoqZCxmPWJrKmQsZz1ibCtaLmltYWdlWCooMS1kKSpaLmltYWdlWixoPWJtK1ouaW1hZ2VZKigxLWQpKlouaW1hZ2VaLG4ud2lkdGg9ZSsicHgiLG4uaGVpZ2h0PWYrInB4IixuLmxlZnQ9ZysicHgiLG4udG9wPWgrInB4IjtlbHNle2NyKHEsQSxPLCEwLCExKSx0aWVyQmFja2ZpbGxXPUhbQl0sdGllckJhY2tmaWxsSD1JW0JdLG0ud2lkdGg9dGllckJhY2tmaWxsVyxtLmhlaWdodD10aWVyQmFja2ZpbGxIO3ZhciBqPXRpZXJCYWNrZmlsbFcqRSxsPXRpZXJCYWNrZmlsbEgqRSxvPVouaW1hZ2VYKmEscD1aLmltYWdlWSphO2JsPWJkLW8sYm09YmUtcCxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiLGNyKG0sQixGLCExLCExKX1iPSEwfXJldHVybiBifWZ1bmN0aW9uIGRmKGEpe2E/KGJYfHxkZygpLGJYLmVsbXQuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIik6YlgmJihiWC5lbG10LnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1mdW5jdGlvbiBkZygpe3ZhciBhPVouVXRpbHMuejE4NSgiejIxIiksYj0zNCxjPTM0LGQ9MjAsZT1wYXJzZUZsb2F0KFoudmlld2VyVyktKGIrZCksZj1wYXJzZUZsb2F0KFoudmlld2VySCktKGMrZCksZz1aLlV0aWxzLnoxODUoInoyMCIpO2JYPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uRlBDYW5jZWwiLGEsbnVsbCxudWxsLG51bGwsbnVsbCxiKyJweCIsYysicHgiLGUrInB4IixmKyJweCIsIm1vdXNlZG93biIsZGgsInoxMDIiLCJzb2xpZCIsIjFweCIsZywiMHB4IiwiMHB4IiksWi5WaWV3ZXJEaXNwbGF5LmFwcGVuZENoaWxkKGJYLmVsbXQpfWZ1bmN0aW9uIGRoKCl7YS50b2dnbGVGdWxsUGFnZVZpZXcoITEpfWZ1bmN0aW9uIGRpKCl7Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXlkb3duIixkeiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXl1cCIsZEEpLFoubW9iaWxlRGV2aWNlPyhaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hzdGFydCIsZHApLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJ0b3VjaG1vdmUiLGRxKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hlbmQiLGRyKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hjYW5jZWwiLGRzKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZXN0YXJ0IixkdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksImdlc3R1cmVjaGFuZ2UiLGR1KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZWVuZCIsZHYpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0ub25vcmllbnRhdGlvbmNoYW5nZT1keSk6KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3ZlciIsZGopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3V0IixkbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKFouVmlld2VyRGlzcGxheSwibW91c2Vtb3ZlIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwibW91c2Vkb3duIixkayksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNlbW92ZSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihtLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHEsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSx1JiZaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLHgmJlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9ZnVuY3Rpb24gZGooYSl7dmFyIGI9Wi5VdGlscy56MjI1KFouVXRpbHMudGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKSxjPVouVXRpbHMuejIyNShaLlV0aWxzLnJlbGF0ZWRUYXJnZXQoYSkpO2lmKCFifHwhYylaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCEwKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSxibz1udWxsfWZ1bmN0aW9uIGRrKGEpe2lmKFouVXRpbHMuaXNSaWdodE1vdXNlQnV0dG9uKGEpKXJldHVybjtibj0hMDt2YXIgYj1aLlV0aWxzLnoxODEoYSk7cmV0dXJuIGJQPW5ldyBaLlV0aWxzLlBvaW50KGIueCxiLnkpLGkubW91c2VYUHJpb3I9Yi54LGkubW91c2VZUHJpb3I9Yi55LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixkbCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNldXAiLGRtKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGRtKSwhMX1mdW5jdGlvbiBkbChiKXtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGI9Wi5VdGlscy5ldmVudChiKSxjPVouVXRpbHMuejE4MShiKSxkPWMueC1pLm1vdXNlWFByaW9yLGU9Yy55LWkubW91c2VZUHJpb3I7aWYoIWlzTmFOKGQpJiYhaXNOYU4oZSkpe3ZhciBmPXBhcnNlRmxvYXQoay5sZWZ0KStkLGc9cGFyc2VGbG9hdChrLnRvcCkrZSxoPWNVKGYsZyk7ay5sZWZ0PWgueCsicHgiLGsudG9wPWgueSsicHgiLGkubW91c2VYUHJpb3I9Yy54LGkubW91c2VZUHJpb3I9Yy55O2lmKFouTmF2aWdhdG9yKXt2YXIgaj1hLnoxNDEoaCk7Wi5OYXZpZ2F0b3IuejI2M1JlY3RhbmdsZVBvc2l0aW9uKGopfX1yZXR1cm4hMX1mdW5jdGlvbiBkbShiKXtibj0hMSxkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLGRsKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSwibW91c2V1cCIsZG0pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsZG0pO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1aLlV0aWxzLnoxODEoYiksZDtibz9kPWJvOmQ9bmV3IFouVXRpbHMuUG9pbnQoYy54LGMueSk7dmFyIGU9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZC54LDIpK01hdGgucG93KGJQLnktZC55LDIpKTtpZihlPDQpe3ZhciBmPWEuejE3MyhiLGQsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoZi54LGYueSxmLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhmLngsZi55LFouaW1hZ2VaKX1lbHNlIFoubW91c2VQYW4mJmEuejI3NCgpO2JvJiYoWi5Ub29sYmFyRGlzcGxheSYmWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMSksWi5OYXZpZ2F0b3JEaXNwbGF5JiZaLm5hdmlnYXRvclZpc2libGU+MSYmWi5OYXZpZ2F0b3Iuc2V0VmlzaWJpbGl0eSghMSkpfWZ1bmN0aW9uIGRuKGEpe3ZhciBiPVouVXRpbHMuejIyNShaLlV0aWxzLnRhcmdldChhKSksYz1aLlV0aWxzLnoyMjUoWi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKTtpZighYnx8IWMpaWYoIWJuKVouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITEpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2Vsc2V7dmFyIGQ9Wi5VdGlscy56MTgxKGEpO2JvPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX1mdW5jdGlvbiBkcChhKXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYiYmIWJwKXticj0hMTt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7YlA9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksaS5tb3VzZVhQcmlvcj1kLngsaS5tb3VzZVlQcmlvcj1kLnl9fWZ1bmN0aW9uIGRxKGIpe2IucHJldmVudERlZmF1bHQoKTtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGM9Wi5VdGlscy56MTc4KGIpO2lmKGMmJiFicCYmIWJyKXt2YXIgZD1jLnRhcmdldCxlPW5ldyBaLlV0aWxzLlBvaW50KGMucGFnZVgsYy5wYWdlWSksZj1lLngtaS5tb3VzZVhQcmlvcixnPWUueS1pLm1vdXNlWVByaW9yO2lmKCFpc05hTihmKSYmIWlzTmFOKGcpKXt2YXIgaD1wYXJzZUZsb2F0KGsubGVmdCkrZixqPXBhcnNlRmxvYXQoay50b3ApK2csbD1jVShoLGopO2subGVmdD1sLngrInB4IixrLnRvcD1sLnkrInB4IixpLm1vdXNlWFByaW9yPWUueCxpLm1vdXNlWVByaW9yPWUueTtpZihaLk5hdmlnYXRvcil7dmFyIG09YS56MTQxKGwpO1ouTmF2aWdhdG9yLnoyNjNSZWN0YW5nbGVQb3NpdGlvbihtKX19fXJldHVybiExfWZ1bmN0aW9uIGRyKGIpe2lmKCFicCYmIWJyKXt2YXIgYz0hMSxkPVouVXRpbHMuejE3OChiKTtpZihkKXt2YXIgZT1kLnRhcmdldCxmPW5ldyBaLlV0aWxzLlBvaW50KGQucGFnZVgsZC5wYWdlWSksZz1uZXcgWi5VdGlscy5Qb2ludChmLngsZi55KSxoPU1hdGguc3FydChNYXRoLnBvdyhiUC54LWcueCwyKStNYXRoLnBvdyhiUC55LWcueSwyKSk7aWYoaDw0KXt2YXIgaT1hLnoxNzMoYixnLEEsQyk7Wi5jbGlja1pvb20/YS56MjkzVG9WaWV3KGkueCxpLnksaS56KTpaLmNsaWNrUGFuJiZhLnoyOTNUb1ZpZXcoaS54LGkueSxaLmltYWdlWil9ZWxzZSBjPSEwfWVsc2UgYz0hMDtjJiZaLm1vdXNlUGFuJiZhLnoyNzQoKX19ZnVuY3Rpb24gZHMoYil7aWYoIWJwJiYhYnIpe3ZhciBjPSExLGQ9Wi5VdGlscy56MTc4KGIpO2lmKGQpe3ZhciBlPWQudGFyZ2V0LGY9bmV3IFouVXRpbHMuUG9pbnQoZC5wYWdlWCxkLnBhZ2VZKSxnPW5ldyBaLlV0aWxzLlBvaW50KGYueCxmLnkpLGg9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZy54LDIpK01hdGgucG93KGJQLnktZy55LDIpKTtpZihoPDQpe3ZhciBpPWEuejE3MyhiLGcsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoaS54LGkueSxpLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhpLngsaS55LFouaW1hZ2VaKX1lbHNlIGM9ITB9ZWxzZSBjPSEwO2MmJloubW91c2VQYW4mJmEuejI3NCgpfX1mdW5jdGlvbiBkdChhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpO2R1KGEpLGJwfHwoYnA9d2luZG93LnNldEludGVydmFsKGR3LGJzKSl9ZnVuY3Rpb24gZHUoYSl7dmFyIGE9Wi5VdGlscy5ldmVudChhKTthLnByZXZlbnREZWZhdWx0KCksYnE9TWF0aC5yb3VuZChhLnNjYWxlKjEwMCkvMTAwfWZ1bmN0aW9uIGR2KGIpe2JwJiYod2luZG93LmNsZWFySW50ZXJ2YWwoYnApLGJyPSEwLGJwPW51bGwpLFoubW91c2VQYW4mJmEuejI3NCgpfWZ1bmN0aW9uIGR3KGEpe2lmKCFaLm1vdXNlUGFuKXJldHVybjt2YXIgYj1keChBLEQsYnEpLGM9Y1YoYik7YiE9Wi5pbWFnZVomJmRlKGMpfWZ1bmN0aW9uIGR4KGEsYixjKXt2YXIgZD1iKmMsZT1jQihhLGQpO3JldHVybiBlfWZ1bmN0aW9uIGR5KGIpe1ouZnVsbFBhZ2UmJihaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCExKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKSxhLnRvZ2dsZUZ1bGxQYWdlVmlldyghMSksYS50b2dnbGVGdWxsUGFnZVZpZXcoITApLFouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITApLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApKX1mdW5jdGlvbiBkeihiKXtpZighWi5rZXlzKXJldHVybjt2YXIgYj1aLlV0aWxzLmV2ZW50KGIpO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgOTA6YS56b29tKCJvdXQiKTticmVhaztjYXNlIDE3OmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSA2NTphLnpvb20oImluIik7YnJlYWs7Y2FzZSAxNjphLnpvb20oImluIik7YnJlYWs7Y2FzZSAzNzphLnBhbigibGVmdCIpO2JyZWFrO2Nhc2UgMzg6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSA0MDphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UgMzk6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSAyNzpaLmZ1bGxQYWdlP2EudG9nZ2xlRnVsbFBhZ2VWaWV3KCExKTphLnJlc2V0KCl9fWZ1bmN0aW9uIGRBKGIpe2lmKCFaLmtleXMpcmV0dXJuO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1iLmtleUNvZGU7Yz09OTB8fGM9PTE3fHxjPT02NXx8Yz09MTY/YS56b29tKCJzdG9wIik6Yz09Mzd8fGM9PTM5P2EucGFuKCJob3Jpem9udGFsU3RvcCIpOihjPT0zOHx8Yz09NDApJiZhLnBhbigidmVydGljYWxTdG9wIil9dmFyIGE9dGhpcyxiPSExLGM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjEiKSwxMCksZD1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejU5IikpLGU9ZC8yLGY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjIiKSwxMCksZz1aLnRvb2xiYXJWaXNpYmxlPT0xP1oudG9vbGJhckg6MCxoLGksayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHk7Y2coKTt2YXIgej0xLEE9MCxCPTAsQyxELEUsRj1bXSxHPVtdLEg9W10sST1bXSxKPVtdLEs9W10sTD1bXSxNPVtdLE49W10sTz1bXSxQPVtdLFE9W10sUj0wLFM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NyIpLDEwKSxUPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejYiKSwxMCksVT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1IiksMTApLFY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NCIpLDEwKSxXPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejMiKSwxMCksWD1wYXJzZUludChaLlV0aWxzLnoxODUoIno0NSIpLDEwKSxZLCQsXyxiYSxiYixiYyxiZCxiZSxiZixiZyxiaCxiaSxiaixiayxibCxibTtZPVoudmlld2VyVywkPVoudmlld2VySCxfPWJhPTAsJC09ZyxaLnRvb2xiYXJQb3NpdGlvbj09MCYmKGJhKz1nKTt2YXIgYm49ITEsYm89bnVsbCxicD1udWxsLGJxPW51bGwsYnI9ITEsYnM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6MjQiKSwxMCksYnQ9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno4MSIpKSpaLnpvb21TcGVlZDtaLm1vYmlsZURldmljZSYmKGJ0Lz0yKTt2YXIgYnU9TWF0aC5yb3VuZChwYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejQ3IikpKloucGFuU3BlZWQpLGJ2PTAsYnc9MCxieD0wLGJ5PTAsYno9MCxiQT1wYXJzZUludChaLlV0aWxzLnoxODUoIno3NyIpLDEwKSxiQixiQyxiRCxiRT1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejE5IikpKlouZmFkZUluU3BlZWQsYkYsYkc9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzgiKSwxMCksYkg9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzkiKSwxMCksYkk9YkcvYkgsYkosYkssYkwsYk0sYk4sYk8sYlAsYlEsYlIsYlMsYlQsYlUsYlYsYlcsYlgsYlk7aWYoWi5VdGlscy5pc1N0clZhbChaLndhdGVybWFya1BhdGgpKXZhciBiWixiJCxiXz1bXSxjYT1bXTtjaChZLCQsXyxiYSk7dmFyIGNiPW5ldyBaLnoxMDEsY2M9Wi5VdGlscy56MTQwKFouaW1hZ2VQYXRoKyIvIisiSW1hZ2VQcm9wZXJ0aWVzLnhtbCIpO2NiLmxvYWRYTUwoY2MpLHRoaXMuejIwNj1mdW5jdGlvbihhLGIpe1ouaW1hZ2VXPWEsWi5pbWFnZUg9YixjaSgpLGNqKCksRT1jQyhCLFouaW5pdGlhbFopLEM9Y0MoQSxaLmluaXRpYWxaKSxEPUMsWi51c2VDYW52YXMmJnMuc2NhbGUoQyxDKSx1JiZjVygpLGNrKCksYyQoWi5pbml0aWFsWCxaLmluaXRpYWxZLFouaW5pdGlhbFopLGRpKCksY2YoITApLFouVmlld2VyLnoxNDgoKX0sdGhpcy5yZXoyMDY9ZnVuY3Rpb24oYSxiKXtjZighMSksY2QoKSxaLmltYWdlVz1hLFouaW1hZ2VIPWIsY2koKSxjaigpLEU9Y0MoQixaLmluaXRpYWxaKSxDPWNDKEEsWi5pbml0aWFsWiksRD1DLFoudXNlQ2FudmFzJiYocy5yZXN0b3JlKCkscy5zY2FsZShDLEMpKSxjaygpLGNoKFksJCxfLGJhKSxtJiZjdChtKSxxJiZjdChxKSx1JiZjdCh1KSxjJChaLmluaXRpYWxYLFouaW5pdGlhbFksWi5pbml0aWFsWiksY2YoITApLFoubmF2aWdhdG9yVmlzaWJsZT4wJiZaLk5hdmlnYXRvci5zZXRJbWFnZVBhdGgoWi5pbWFnZVBhdGgpfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoKX0sdGhpcy56MjAxPWZ1bmN0aW9uKCl7cmV0dXJuIGJifSx0aGlzLnoxNzk9ZnVuY3Rpb24oKXtyZXR1cm4gYmN9LHRoaXMuejE4Nj1mdW5jdGlvbigpe3JldHVybiB6fSx0aGlzLnoxOTU9ZnVuY3Rpb24oKXtyZXR1cm4gY30sdGhpcy56MTg3PWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuejE4OT1mdW5jdGlvbigpe3JldHVybiBDfSx0aGlzLnoxODlBc1pvb209ZnVuY3Rpb24oKXt2YXIgYT1jQihBLEMpO3JldHVybiBhfSx0aGlzLnoxOTQ9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy56MTkzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuejE5Nz1mdW5jdGlvbigpe3JldHVybiBmfSx0aGlzLnoxOTI9ZnVuY3Rpb24oKXtyZXR1cm4gSC5qb2luKCIsIil9LHRoaXMuejE4OD1mdW5jdGlvbigpe3JldHVybiBJLmpvaW4oIiwgIil9LHRoaXMuejE5MT1mdW5jdGlvbigpe3JldHVybiBMLmpvaW4oIiwgIil9LHRoaXMuejE5Nj1mdW5jdGlvbigpe3ZhciBhPU4uam9pbigiLCAiKT09IiI/IkN1cnJlbnQgdmlldyBsb2FkaW5nIGNvbXBsZXRlIjpOLmpvaW4oIiwgIik7cmV0dXJuIGF9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQpe2NoKGEsYixjLGQpfSx0aGlzLnoyNzQ9ZnVuY3Rpb24oYSl7aWYoQyE9RHx8Wi5pbWFnZVohPWJ6fHxwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymh8fGEpe2NuKCksYno9Y0IoQSxDKTt2YXIgYz0hMTtpZihDIT1EfHxaLmltYWdlWiE9Ynp8fCFifHxhKVouaW1hZ2VaPGJ6JiYhYSYmKGM9ITApLGNvKCksY3AoKSxjcihtLEIsRiwhMSwhMSk7Y3EoKSxjcihxLEEsTywhMCxjKSxjcyhOLGNMLDApLGN1KCksY3YoKX19LHRoaXMuc2V0Vmlldz1mdW5jdGlvbihhLGIsYyl7aWYoYT09dW5kZWZpbmVkfHxhPT1udWxsKWE9Wi5pbWFnZVcvMjtpZihiPT11bmRlZmluZWR8fGI9PW51bGwpYj1aLmltYWdlSC8yO2M9PXVuZGVmaW5lZHx8Yz09bnVsbD9jPVouZml0WjpjPjEmJihjPWMvMTAwKSxjJChhLGIsYyl9LHRoaXMuem9vbT1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJvdXQiOmJ4Pj0wJiYoYngtPWJ0KTticmVhaztjYXNlImluIjpieDw9MCYmKGJ4Kz1idCk7YnJlYWs7Y2FzZSJzdG9wIjpieD0wfVouem9vbWluZz1ieD09MD8ic3RvcCI6Yng+MD8iaW4iOiJvdXQiLGJ4IT0wP2JCfHwoKGJ4PDAmJlouaW1hZ2VaPloubWluWnx8Yng+MCYmWi5pbWFnZVo8Wi5tYXhaKSYmYS56MjczKCExKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnBhbj1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJsZWZ0Ijpidjw9MCYmKGJ2Kz1idSk7YnJlYWs7Y2FzZSJ1cCI6Ync8PTAmJihidys9YnUpO2JyZWFrO2Nhc2UiZG93biI6Ync+PTAmJihidy09YnUpO2JyZWFrO2Nhc2UicmlnaHQiOmJ2Pj0wJiYoYnYtPWJ1KTticmVhaztjYXNlImhvcml6b250YWxTdG9wIjpidj0wO2JyZWFrO2Nhc2UidmVydGljYWxTdG9wIjpidz0wO2JyZWFrO2Nhc2Uic3RvcCI6YnY9MCxidz0wfVoucGFubmluZ1g9YnY9PTA/InN0b3AiOmJ2PjA/ImxlZnQiOiJyaWdodCIsWi5wYW5uaW5nWT1idz09MD8ic3RvcCI6Ync+MD8idXAiOiJkb3duIixiQz1aLmltYWdlWCpjQihBLDEpLGJEPVouaW1hZ2VZKmNCKEEsMSksYnYhPTB8fGJ3IT0wP2JCfHwoYS56MjczKCEwKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnoyOTNUb1ZpZXc9ZnVuY3Rpb24oYixjLGQpe2EuejI5M0FsbFN0b3AoKTt2YXIgZT1jRihiLGMpLGY9YmQtZS54LGc9YmUtZS55LGg9Y0MoQSxkKSxpPWNDKEIsZCksaj1wYXJzZUZsb2F0KGsubGVmdCkrZixsPXBhcnNlRmxvYXQoay50b3ApK2csbT1oLUMsbj1pLUU7Yko9ai9iSSxiSz1sL2JJLGJMPW0vYkksYk09bi9iSSxhLnoyNzMoITEpLGJPPTAsYk49d2luZG93LnNldFRpbWVvdXQoZGEsYkgpfSx0aGlzLnoyOTNBbGxTdG9wPWZ1bmN0aW9uKGIpe2RjKCksZGQoKSxifHxhLnoyNzQoKX0sdGhpcy56MjQ1PWZ1bmN0aW9uKGEpe3ZhciBiPWRlKGEpO2ImJihjWSgpLGN2KCkpfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7YS56MjkzVG9WaWV3KFouaW5pdGlhbFgsWi5pbml0aWFsWSxaLmluaXRpYWxaKX0sdGhpcy50b2dnbGVGdWxsUGFnZVZpZXdFeHRlcm5hbD1mdW5jdGlvbigpe2JZPSEwLGEudG9nZ2xlRnVsbFBhZ2VWaWV3KCl9LHRoaXMudG9nZ2xlRnVsbFBhZ2VWaWV3PWZ1bmN0aW9uKGIpe2EuejI5M0FsbFN0b3AoKSxaLmZ1bGxQYWdlPWI/YjohWi5mdWxsUGFnZTt2YXIgYz1kb2N1bWVudC5ib2R5LGQ9Yy5zdHlsZSxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxmPVouVmlld2VyRGlzcGxheS5zdHlsZSxnPW51bGwsaD1udWxsO2lmKFouZnVsbFBhZ2Upe2JRPWQud2lkdGgsYlI9ZC5oZWlnaHQsYlM9ZC5vdmVyZmxvdyxiVD1lLm92ZXJmbG93LGJVPWYuYmFja2dyb3VuZENvbG9yLGJWPWYucG9zaXRpb24sYlc9Zi56SW5kZXg7dmFyIGk7Wi5tb2JpbGVEZXZpY2U/KGk9Wi5VdGlscy56MjAxaW5kb3dTaXplKCksZC53aWR0aD1pLngsZC5oZWlnaHQ9aS55KTooZC53aWR0aD0iMTAwJSIsZC5oZWlnaHQ9IjEwMCUiKSxkLm92ZXJmbG93PSJoaWRkZW4iLGUub3ZlcmZsb3c9ImhpZGRlbiIsZi5iYWNrZ3JvdW5kQ29sb3I9Wi5VdGlscy56MTg1KCJ6MjIiKSxmLnBvc2l0aW9uPSJmaXhlZCIsZi56SW5kZXg9Ijk5OTk5OTk5IixpPVouVXRpbHMuejIwMWluZG93U2l6ZSgpLGc9aS54LGg9aS55fWVsc2V7ZC53aWR0aD1iUSxkLmhlaWdodD1iUixkLm92ZXJmbG93PWJTLGUub3ZlcmZsb3c9YlQsZi5iYWNrZ3JvdW5kQ29sb3I9YlUsZi5wb3NpdGlvbj0icmVsYXRpdmUiLGYuekluZGV4PWJXO3ZhciBqPVouVXRpbHMuejE3NihaLnBhZ2VDb250YWluZXIpO2c9cGFyc2VGbG9hdChqLndpZHRoKSxoPXBhcnNlRmxvYXQoai5oZWlnaHQpLGlzTmFOKGcpJiYoZz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKGgpJiYoaD1aLlZpZXdlckRpc3BsYXkuY2xpZW50SGVpZ2h0KSxiWT0hMX1aLnZpZXdlclc9ZyxaLnZpZXdlckg9aCxjaChnLGgpLGRmKGJZKTtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXtaLnRvb2xiYXJDdXJyZW50Vz1aLnRvb2xiYXJXPT0tMT9nOloudG9vbGJhclc7dmFyIGw9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILVoudG9vbGJhckg6MDtaLlRvb2xiYXIuc2V0U2l6ZUFuZFBvc2l0aW9uKFoudG9vbGJhckN1cnJlbnRXLG51bGwsbnVsbCxsKX1aLk5hdmlnYXRvckRpc3BsYXkmJlouTmF2aWdhdG9yLnoxODAoKSYmWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKFoubmF2aWdhdG9yVyxaLm5hdmlnYXRvckgsWi5uYXZpZ2F0b3JMLTEsWi5uYXZpZ2F0b3JULTEpLGNqKCksWi5pbWFnZVo9Y1YoWi5pbWFnZVopO2lmKFouY29uc3RyYWluUGFuKXt2YXIgbT1wYXJzZUZsb2F0KGsubGVmdCksbj1wYXJzZUZsb2F0KGsudG9wKSxvPWNVKG0sbik7ay5sZWZ0PW8ueCsicHgiLGsudG9wPW8ueSsicHgifWEuejI3NCghMCl9LHRoaXMuejI3MT1mdW5jdGlvbigpe3ZhciBhPVouVmlld2VyRGlzcGxheS5maXJzdENoaWxkLmNoaWxkTm9kZXNbMF0uc3R5bGU7YS5kaXNwbGF5PWEuZGlzcGxheT09Im5vbmUiPyJpbmxpbmUtYmxvY2siOiJub25lIn0sdGhpcy56MjcyPWZ1bmN0aW9uKCl7dmFyIGE9Wi5WaWV3ZXJEaXNwbGF5LmZpcnN0Q2hpbGQuY2hpbGROb2Rlc1sxXS5zdHlsZTthLmRpc3BsYXk9YS5kaXNwbGF5PT0ibm9uZSI/ImlubGluZS1ibG9jayI6Im5vbmUifSx0aGlzLnoyNzM9ZnVuY3Rpb24oYSl7aWYodil7dmFyIGI9YT9hOnYuZGlzcGxheSE9ImlubGluZS1ibG9jayI7di5kaXNwbGF5PWI/ImlubGluZS1ibG9jayI6Im5vbmUifX0sdGhpcy50b2dnbGVDb25zdHJhaW5QYW49ZnVuY3Rpb24oKXtaLmNvbnN0cmFpblBhbj0hWi5jb25zdHJhaW5QYW47aWYoWi5jb25zdHJhaW5QYW4pe3ZhciBiPXBhcnNlRmxvYXQoci5sZWZ0KSxjPXBhcnNlRmxvYXQoci50b3ApLGQ9Y1UoYixjKTtrLmxlZnQ9ZC54KyJweCIsay50b3A9ZC55KyJweCIsYS56Mjc0KCl9fSx0aGlzLnoxNzM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoInoxMFRJRVJTS0lQVEhSRVNIT0xEIikpLGY9Y0QoYi54LGIueSksZz1jRShmLngsZi55KSxoPWNCKGMsZCk7cmV0dXJuIGEuYWx0S2V5PyhkPjErZT9oPWNCKGMsMSk6Yz4wJiYoaD1jQihjLTEsMSkpLGgtWi5maXRaPGUmJihoPVouZml0WikpOmQ8MS1lP2g9Y0IoYywxKTpjPHotMSYmKGg9Y0IoYysxLDEpKSxuZXcgWi5VdGlscy5Qb2ludDNEKGcueCxnLnksaCl9LHRoaXMuejI2Nz1mdW5jdGlvbihhLGIpe3ZhciBjPS0oYS1aLmltYWdlWCksZD0tKGItWi5pbWFnZVkpLGU9YypaLmltYWdlWixmPWQqWi5pbWFnZVosZz1lK2JmLGg9ZitiaCxpPWNVKGcsaCk7ay5sZWZ0PWkueCsicHgiLGsudG9wPWkueSsicHgifSx0aGlzLnoxNDE9ZnVuY3Rpb24oYSl7aWYoIWEpdmFyIGE9bmV3IFouVXRpbHMuUG9pbnQocGFyc2VGbG9hdChrLmxlZnQpLHBhcnNlRmxvYXQoay50b3ApKTt2YXIgYj1hLngtYmYsYz1hLnktYmgsZD1iL1ouaW1hZ2VaLGU9Yy9aLmltYWdlWixmPVouaW1hZ2VYLWQsZz1aLmltYWdlWS1lO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChmLGcpfX0sWi56MTI0PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHUoKXt3aW5kb3cuY2xlYXJJbnRlcnZhbChxKSxxPW51bGw7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzVGV4dEJveCIpLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7YSYmKGEubm9kZVZhbHVlPSIiKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGN9ZnVuY3Rpb24gdyhhKXtjPWF9ZnVuY3Rpb24geChhLGIsYyxkKXthfHwoYT1aLnRvb2xiYXJWaXNpYmxlPjA/Wi50b29sYmFyQ3VycmVudFc6MCksYnx8KGI9Wi50b29sYmFyVmlzaWJsZT4wP2Y6MCksY3x8KGM9MCksZHx8KGQ9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MCk7dmFyIGU9Wi5Ub29sYmFyRGlzcGxheS5zdHlsZTtlLndpZHRoPWErInB4IixlLmhlaWdodD1iKyJweCIsZS5sZWZ0PWMrInB4IixlLnRvcD1kKyJweCIseShhLGIpfWZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1hLGQ9YixlPXRvb2xiYXJTa2luU2l6ZXNbMl0sZj10b29sYmFyU2tpblNpemVzWzNdLGc9dG9vbGJhclNraW5TaXplc1s0XSxoPXRvb2xiYXJTa2luU2l6ZXNbNV0saT10b29sYmFyU2tpblNpemVzWzZdLGo9dG9vbGJhclNraW5TaXplc1s3XSxrPXRvb2xiYXJTa2luU2l6ZXNbOF0sbD10b29sYmFyU2tpblNpemVzWzldLG09dG9vbGJhclNraW5TaXplc1sxMF0sbj10b29sYmFyU2tpblNpemVzWzExXSxvPXRvb2xiYXJTa2luU2l6ZXNbMTJdLHA9dG9vbGJhclNraW5TaXplc1sxM10scT10b29sYmFyU2tpblNpemVzWzE0XSx1PXRvb2xiYXJTa2luU2l6ZXNbMTVdLHY9MCx3PShkLWYpLzIrMSx4PShkLWgpLzIseT0oZC1qKS8yLHo9eSoxLjMsQT15KzQsQj15KzIsQz1aLmxvZ29WaXNpYmxlPT0xPzA6ay8yLEQ9Wi5sb2dvVmlzaWJsZT09MT8wOmsvMixFPWstKGktZyksRj1aLmZ1bGxQYWdlVmlzaWJsZT84OjcsRz0yMCxIPUYqaysyKkU7Wi5zbGlkZXJWaXNpYmxlJiYoSCs9cCkscj1zPXQ9ITE7dmFyIEk9Wi5sb2dvVmlzaWJsZT09MT9lKzI6MCxKPVoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTE/azowLEs9SStKLEw9SytHK0grRytxO0w+YyYmKHI9ITAsTC1wPmMmJihzPSEwLEwtcC1xPmMmJih0PSEwLEs9MCkscT0wKSxILT1wKTt2YXIgTT1LKyhjLXEtSy1IKS8yLE49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhY2tncm91bmQiKTtOLnN0eWxlLndpZHRoPWMrInB4IixOLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9Yys0MDArInB4IixOLnN0eWxlLmhlaWdodD1kKyJweCIsTi5maXJzdENoaWxkLnN0eWxlLmhlaWdodD1kKyJweCI7dmFyIE89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkNvbnRhaW5lciIpO08uc3R5bGUud2lkdGg9SCtHKjIrInB4IixPLnN0eWxlLmhlaWdodD1kKyJweCIsTy5zdHlsZS5sZWZ0PU0tRysicHgiO3ZhciBQPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25CYWNrZ3JvdW5kIik7Wi5VdGlscy56MjAzKFAscGFyc2VGbG9hdChPLnN0eWxlLndpZHRoKSxwYXJzZUZsb2F0KE8uc3R5bGUuaGVpZ2h0KSksUC5zdHlsZS5sZWZ0PSIwcHgiO3ZhciBRPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyTG9nbyIpO2lmKFEpe3ZhciBSPVEuc3R5bGU7aWYoUilpZighdCl7Ui5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejIwMyhRLGUsZiksUi5sZWZ0PXYrInB4IixSLnRvcD13KyJweCIsdis9ZSsyO3ZhciBTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2dvRGl2aWRlciIpO2lmKFMpe1ouVXRpbHMuejIwMyhTLGcsaCk7dmFyIFQ9Uy5zdHlsZTtULmxlZnQ9disicHgiLFQudG9wPXgrInB4In19ZWxzZSBSLmRpc3BsYXk9Im5vbmUifWlmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTEpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25NaW5pbWl6ZSIpLFY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkV4cGFuZCIpO2lmKFUmJlYpe3ZhciBXPVUuc3R5bGUsWD1WLnN0eWxlO1cmJlgmJih0PyhXLmRpc3BsYXk9Im5vbmUiLFguZGlzcGxheT0ibm9uZSIpOihXLmRpc3BsYXk9ImlubGluZS1ibG9jayIsWC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejEzOChVLGksaiksWi5VdGlscy56MTM4KFYsaSxqKSxXLmxlZnQ9ditDKyJweCIsVy50b3A9eisicHgiLFgubGVmdD12K0QrInB4IixYLnRvcD16KyJweCIpKX19dj1HO3ZhciBZPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25ab29tT3V0Iik7Wi5VdGlscy56MTM4KFksaSxqKTt2YXIgJD1ZLnN0eWxlOyQubGVmdD12KyJweCIsJC50b3A9eSsicHgiLHYrPWs7dmFyIF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWNrU2xpZGVyIiksYmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblNsaWRlciIpO2lmKF8mJmJhKXt2YXIgYmI9Xy5zdHlsZSxiYz1iYS5zdHlsZTtiYiYmYmMmJihyPyhiYi5kaXNwbGF5PSJub25lIixiYy5kaXNwbGF5PSJub25lIik6KGJiLmRpc3BsYXk9ImlubGluZS1ibG9jayIsYmMuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnoyMDMoXyxuLG8pLGJiLmxlZnQ9di0yKyJweCIsYmIudG9wPUErInB4IixaLlV0aWxzLnoxMzgoYmEsbCxtKSxiYy5sZWZ0PXBhcnNlRmxvYXQoYmIubGVmdCkrInB4IixiYy50b3A9QisicHgiLHYrPXApKX12YXIgYmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblpvb21JbiIpO1ouVXRpbHMuejEzOChiZCxpLGopO3ZhciBiZT1iZC5zdHlsZTtiZS5sZWZ0PXYrInB4IixiZS50b3A9eSsicHgiLHYrPWsrMTt2YXIgYmY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhbkRpdmlkZXIiKTtaLlV0aWxzLnoyMDMoYmYsZyxoKTt2YXIgYmc9YmYuc3R5bGU7YmcubGVmdD12KyJweCIsYmcudG9wPXgrInB4Iix2Kz1FO3ZhciBiaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uUGFuTGVmdCIpO1ouVXRpbHMuejEzOChiaCxpLGopO3ZhciBiaT1iaC5zdHlsZTtiaS5sZWZ0PXYrInB4IixiaS50b3A9eSsicHgiLHYrPWs7dmFyIGJqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5VcCIpO1ouVXRpbHMuejEzOChiaixpLGopO3ZhciBiaz1iai5zdHlsZTtiay5sZWZ0PXYrInB4Iixiay50b3A9eSsicHgiLHYrPWs7dmFyIGJsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5Eb3duIik7Wi5VdGlscy56MTM4KGJsLGksaik7dmFyIGJtPWJsLnN0eWxlO2JtLmxlZnQ9disicHgiLGJtLnRvcD15KyJweCIsdis9azt2YXIgYm49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblBhblJpZ2h0Iik7Wi5VdGlscy56MTM4KGJuLGksaik7dmFyIGJvPWJuLnN0eWxlO2JvLmxlZnQ9disicHgiLGJvLnRvcD15KyJweCIsdis9azt2YXIgYnA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblJlc2V0Iik7Wi5VdGlscy56MTM4KGJwLGksaik7dmFyIGJxPWJwLnN0eWxlO2JxLmxlZnQ9disicHgiLGJxLnRvcD15KyJweCIsdis9aysxO3ZhciBicj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnVsbFBhZ2VEaXZpZGVyIik7aWYoYnIpe1ouVXRpbHMuejIwMyhicixnLGgpO3ZhciBicz1ici5zdHlsZTticy5sZWZ0PXYrInB4Iixicy50b3A9eCsicHgiLHYrPUU7dmFyIGJ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25GdWxsUGFnZSIpO1ouVXRpbHMuejEzOChidCxpLGopO3ZhciBidT1idC5zdHlsZTtidS5sZWZ0PXYrInB4IixidS50b3A9eSsicHgifXZhciBidj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94Iik7aWYoYnYpe3ZhciBidz1idi5zdHlsZTtidyYmKHM/YncuZGlzcGxheT0ibm9uZSI6KGJ3LmRpc3BsYXk9ImlubGluZS1ibG9jayIsYncud2lkdGg9cSsicHgiLGJ3LmhlaWdodD11KyJweCIsYncubGVmdD1jLXBhcnNlRmxvYXQoTy5zdHlsZS5sZWZ0KS1wYXJzZUZsb2F0KGJ3LndpZHRoKSsicHgiLGJ3LnRvcD0oZC1wYXJzZUZsb2F0KGJ3LmhlaWdodCkpLzIrInB4IikpfX1mdW5jdGlvbiB6KGEpe1oudG9vbGJhclZpc2libGU8NCYmIVoubW9iaWxlRGV2aWNlP0EoYSk6QighYSl9ZnVuY3Rpb24gQShhKXtnJiYoYT9nLmRpc3BsYXk9ImlubGluZS1ibG9jayI6Zy5kaXNwbGF5PSJub25lIil9ZnVuY3Rpb24gQihhKXtpZihnKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQ29udGFpbmVyIiksYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFja2dyb3VuZCIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbk1pbmltaXplIiksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhwYW5kIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9nb0RpdmlkZXIiKSxoPTA7dHx8KGg9cGFyc2VGbG9hdChlLnN0eWxlLmxlZnQpK3BhcnNlRmxvYXQoZS5zdHlsZS53aWR0aCkrNCk7dmFyIGk9Wi50b29sYmFyQ3VycmVudFc7YT8oYi5zdHlsZS5kaXNwbGF5PSJub25lIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSxnLndpZHRoPWgrInB4IixjLnN0eWxlLndpZHRoPWgrInB4Iik6KGIuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIiksZC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGcud2lkdGg9aSsicHgiLGMuc3R5bGUud2lkdGg9aSsicHgiKX19ZnVuY3Rpb24gQyhhKXtpZihaLnNsaWRlclZpc2libGUpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmspe3ZhciBiPVoubWF4Wi1aLm1pblosYz0oYS1aLm1pblopL2I7dHJhY2tMPXBhcnNlRmxvYXQoaS5sZWZ0KSx0cmFja1I9cGFyc2VGbG9hdChpLmxlZnQpK3BhcnNlRmxvYXQoaS53aWR0aCktcGFyc2VGbG9hdChrLndpZHRoKTt2YXIgZD10cmFja1ItdHJhY2tMLGU9YypkK3RyYWNrTDtrLmxlZnQ9ZSsicHgifX19ZnVuY3Rpb24gRChiKXtofHwoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJhY2tTbGlkZXIiKSksaXx8KGk9aC5zdHlsZSk7aWYoaCYmaSl7dmFyIGMsZD1aLlV0aWxzLnoxNzQoaCk7Wi5tb2JpbGVEZXZpY2U/Yz1aLlV0aWxzLnoxODEoYikueC1kLng6Yz1iLmNsaWVudFgtZC54O3ZhciBlPUgoYywwLHBhcnNlRmxvYXQoaS53aWR0aCkpO2U8Wi5taW5aKy4xJiYoZT1aLm1pblopLGU+Wi5tYXhaLS4xJiYoZT1aLm1heFopLGEuejI0NShlKSxhLnoyNzQoKX19ZnVuY3Rpb24gRShhKXtuPSEwLGp8fChqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25TbGlkZXIiKSk7aWYoail7dmFyIGI9Wi5VdGlscy56MTgxKGEpO2oubW91c2VYUHJpb3I9Yi54LGoubW91c2VZUHJpb3I9Yi55fX1mdW5jdGlvbiBGKGIpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmomJmspe3RyYWNrTD1wYXJzZUZsb2F0KGkubGVmdCksdHJhY2tSPXBhcnNlRmxvYXQoaS5sZWZ0KStwYXJzZUZsb2F0KGkud2lkdGgpLXBhcnNlRmxvYXQoay53aWR0aCk7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpKyhwLngtai5tb3VzZVhQcmlvcik7Yzx0cmFja0w/Yz10cmFja0w6Yz50cmFja1I/Yz10cmFja1I6ai5tb3VzZVhQcmlvcj1wLngsay5sZWZ0PWMrInB4Ijt2YXIgZD1IKGMsdHJhY2tMLHRyYWNrUik7YS56MjQ1KGQpfX1mdW5jdGlvbiBHKCl7bj0hMSxhLnoyNzQoKX1mdW5jdGlvbiBIKGEsYixjKXt2YXIgZD1jLWIsZT0oYS1iKS9kLGY9Wi5tYXhaLVoubWluWixnPVoubWluWitmKmU7cmV0dXJuIGd9ZnVuY3Rpb24gSShhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpLGI9Wi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpO2lmKCFuJiZiKXt2YXIgYz1iLnBhcmVudE5vZGU7SyhjKX19ZnVuY3Rpb24gSihhKXtaLm1vYmlsZURldmljZSYmYS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhPVouVXRpbHMuZXZlbnQoYSksYj1aLlV0aWxzLnRhcmdldChhKSxjPVouVXRpbHMucmVsYXRlZFRhcmdldChhKTtpZihiKXt2YXIgZD1iLnBhcmVudE5vZGU7ZCYmKHRhcmdldFBhcmVudElEPWQuaWQpfWlmKGMpe3ZhciBlPWMucGFyZW50Tm9kZTtlJiYocmVsYXRlZFRhcmdldFBhcmVudElEPWUuaWQpfWlmKCFufHxhLnR5cGU9PSJtb3VzZXVwInx8YS50eXBlPT0idG91Y2hlbmQifHxhLnR5cGU9PSJ0b3VjaGNhbmNlbCIpTigpLGImJiFaLlV0aWxzLmlzUmlnaHRNb3VzZUJ1dHRvbihhKSYmKHRhcmdldFBhcmVudElEJiZ0YXJnZXRQYXJlbnRJRCE9InRyYWNrU2xpZGVyIiYmYS50eXBlIT0ibW91c2Vtb3ZlIiYmKE8oYSksUChhKSksUShhKSl9ZnVuY3Rpb24gSyhiKXthJiZhLnoyOTNBbGxTdG9wKCksYi5pZCYmYi5pZC5pbmRleE9mKCJidXR0b24iKSE9LTE/KEwoYiksTShiKSk6Yi5pZCYmYi5pZC5pbmRleE9mKCJiYWNrZ3JvdW5kIikhPS0xJiZOKCl9ZnVuY3Rpb24gTChhKXtaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGEsIm1vdXNlb3V0IixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoYSwibW91c2VvdmVyIixKKX1mdW5jdGlvbiBNKGEpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ1VwSUQpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5faW1nT3ZlcklEKSxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ0Rvd25JRCk7YiYmKGIuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLGMmJihjLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGQmJihkLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpfWZ1bmN0aW9uIE4oKXt2YXIgYT1aLlRvb2xiYXJEaXNwbGF5LmNoaWxkTm9kZXMsYj1udWxsO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7Yj1hW2NdO2lmKGIuaWQmJmIuaWQuaW5kZXhPZigiYnV0dG9uIikhPS0xKWlmKGIuaWQhPSJidXR0b25Db250YWluZXIiKUwoYiksTShiKTtlbHNle3ZhciBlPWIuY2hpbGROb2RlcyxmPW51bGw7Zm9yKHZhciBnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXSxmLmlkJiZmLmlkLmluZGV4T2YoImJ1dHRvbiIpIT0tMSYmKEwoZiksTShmKSl9fX1mdW5jdGlvbiBPKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPWIucGFyZW50Tm9kZTtjJiYoWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaHN0YXJ0IixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywidG91Y2hlbmQiLEopLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaGNhbmNlbCIsSikpOihaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2VvdmVyIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGMsIm1vdXNlb3V0IixKKSkpfX1mdW5jdGlvbiBQKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPVouVXRpbHMudGFyZ2V0KGEpLnBhcmVudE5vZGU7aWYoYylpZighYy5faW1nVXBJRClLKGMpO2Vsc2V7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nVXBJRCksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjLl9pbWdPdmVySUQpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nRG93bklEKTtpZihkJiZlJiZmKXt2YXIgZz1kLnN0eWxlLGg9ZS5zdHlsZSxpPWYuc3R5bGU7Zy52aXNpYmlsaXR5PSJoaWRkZW4iLGgudmlzaWJpbGl0eT0iaGlkZGVuIixpLnZpc2liaWxpdHk9ImhpZGRlbiI7c3dpdGNoKGEudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOmgudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZXVwIjpoLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UibW91c2VvdXQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaHN0YXJ0IjppLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UidG91Y2hlbmQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIn19fX19ZnVuY3Rpb24gUShjKXt2YXIgZD1aLlV0aWxzLnRhcmdldChjKS5wYXJlbnROb2RlO2lmKGQpe3ZhciBlPWQuaWQ7c3dpdGNoKGMudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZWRvd24iLEopO2JyZWFrO2Nhc2UibW91c2Vkb3duIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwibW91c2V1cCIsSik7aWYoYSlzd2l0Y2goZSl7Y2FzZSJidXR0b25NaW5pbWl6ZSI6Yi56MjE1KCEwKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKTticmVhaztjYXNlImJ1dHRvbkV4cGFuZCI6Yi56MjE1KCExKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKTticmVhaztjYXNlImJ1dHRvblpvb21PdXQiOmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSJidXR0b25TbGlkZXIiOkUoYyksUihjKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsUiksb3x8KG89d2luZG93LnNldEludGVydmFsKEYsbSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSik7YnJlYWs7Y2FzZSJ0cmFja1NsaWRlciI6RChjKTticmVhaztjYXNlImJ1dHRvblpvb21JbiI6YS56b29tKCJpbiIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuTGVmdCI6YS5wYW4oImxlZnQiKTticmVhaztjYXNlImJ1dHRvblBhblVwIjphLnBhbigidXAiKTticmVhaztjYXNlImJ1dHRvblBhbkRvd24iOmEucGFuKCJkb3duIik7YnJlYWs7Y2FzZSJidXR0b25QYW5SaWdodCI6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSJidXR0b25SZXNldCI6YS5yZXNldCgpfWJyZWFrO2Nhc2UibW91c2V1cCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsIm1vdXNlZG93biIsSiksYSYmKGU9PSJidXR0b25TbGlkZXIifHxuPyhvJiYod2luZG93LmNsZWFySW50ZXJ2YWwobyksbz1udWxsKSxHKCksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLFIpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSiksTigpKTplPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpO2JyZWFrO2Nhc2UibW91c2VvdXQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZW92ZXIiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTooZT09ImJ1dHRvblBhblVwInx8ZT09ImJ1dHRvblBhbkRvd24iKSYmYS5wYW4oInZlcnRpY2FsU3RvcCIpKTticmVhaztjYXNlInRvdWNoc3RhcnQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJ0b3VjaGVuZCIsSiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoY2FuY2VsIixKKTtpZihhKXN3aXRjaChlKXtjYXNlImJ1dHRvbk1pbmltaXplIjpiLnoyMTUoITApLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2JyZWFrO2Nhc2UiYnV0dG9uRXhwYW5kIjpiLnoyMTUoITEpLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApO2JyZWFrO2Nhc2UiYnV0dG9uWm9vbU91dCI6YS56b29tKCJvdXQiKTticmVhaztjYXNlImJ1dHRvblNsaWRlciI6RShjKSxTKGMpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSxvfHwobz13aW5kb3cuc2V0SW50ZXJ2YWwoRixtKSksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoZW5kIixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hjYW5jZWwiLEopO2JyZWFrO2Nhc2UidHJhY2tTbGlkZXIiOkQoYyk7YnJlYWs7Y2FzZSJidXR0b25ab29tSW4iOmEuem9vbSgiaW4iKTticmVhaztjYXNlImJ1dHRvblBhbkxlZnQiOmEucGFuKCJsZWZ0Iik7YnJlYWs7Y2FzZSJidXR0b25QYW5VcCI6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSJidXR0b25QYW5Eb3duIjphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuUmlnaHQiOmEucGFuKCJyaWdodCIpO2JyZWFrO2Nhc2UiYnV0dG9uUmVzZXQiOmEucmVzZXQoKX1icmVhaztjYXNlInRvdWNoZW5kIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hzdGFydCIsSiksYSYmKGU9PSJidXR0b25ab29tT3V0Inx8ZT09ImJ1dHRvblpvb21JbiI/KGEuem9vbSgic3RvcCIpLFouZGVidWcmJmU9PSJidXR0b25ab29tT3V0IiYmYy5hbHRLZXkmJlouVXRpbHMuejI1MygpKTplPT0iYnV0dG9uU2xpZGVyIj8obyYmKHdpbmRvdy5jbGVhckludGVydmFsKG8pLG89bnVsbCksRygpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSk6ZT09ImJ1dHRvblBhbkxlZnQifHxlPT0iYnV0dG9uUGFuUmlnaHQiP2EucGFuKCJob3Jpem9udGFsU3RvcCIpOmU9PSJidXR0b25QYW5VcCJ8fGU9PSJidXR0b25QYW5Eb3duIj9hLnBhbigidmVydGljYWxTdG9wIik6ZT09ImJ1dHRvbkZ1bGxQYWdlIiYmYS50b2dnbGVGdWxsUGFnZVZpZXcoKSk7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoc3RhcnQiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iPyhhLnpvb20oInN0b3AiKSxaLmRlYnVnJiZlPT0iYnV0dG9uWm9vbU91dCImJmMuYWx0S2V5JiZaLlV0aWxzLnoyNTMoKSk6ZT09ImJ1dHRvblNsaWRlciI/KG8mJih3aW5kb3cuY2xlYXJJbnRlcnZhbChvKSxvPW51bGwpLEcoKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsUykpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpfX19ZnVuY3Rpb24gUihhKXtwPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpfWZ1bmN0aW9uIFMoYSl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0O3A9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKX19dmFyIGI9dGhpcyxjPSExLGQ9bmV3IFouejEwMTtaLnNraW5QYXRoPVouVXRpbHMuejI0MyhaLnNraW5QYXRoKTt2YXIgZT1aLnNraW5QYXRoKyIvIjtkLmxvYWRYTUwoWi5za2luUGF0aCsiLyIrWi5VdGlscy56MTg1KCJ6NTUiKSk7dmFyIGYsZyxoLGksaixrLGw9W10sbT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1NyIpLDEwKSxuPSExLG89bnVsbCxwPW51bGwscT1udWxsLHIscyx0O3RoaXMuejIwNT1mdW5jdGlvbihhLGIpe1ouVG9vbGJhckRpc3BsYXk9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUb29sYmFyRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIiwiMXB4IiwiMXB4IiwiMHB4IiwiMXB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJkZWZhdWx0IiksZz1aLlRvb2xiYXJEaXNwbGF5LnN0eWxlO3ZhciBjPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChjLmVsbXQpLHRvb2xiYXJTa2luU2l6ZXM9YTtpZihaLmxvZ29WaXNpYmxlKXt2YXIgZDtpZighWi5VdGlscy5pc1N0clZhbChaLmxvZ29DdXN0b21QYXRoKSlkPW5ldyBaLlV0aWxzLkdyYXBoaWMoInRvb2xiYXJMb2dvIixlLGJbMV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO2Vsc2V7dmFyIGg9Wi5VdGlscy56MTQwKFoubG9nb0N1c3RvbVBhdGgpO2Q9bmV3IFouVXRpbHMuR3JhcGhpYygidG9vbGJhckxvZ28iLGgsbnVsbCwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iil9Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChkLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGU9PTB8fFoudG9vbGJhclZpc2libGU9PTEpe3ZhciBpPW5ldyBaLlV0aWxzLkdyYXBoaWMoImxvZ29EaXZpZGVyIixlLGJbMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQoaS5lbG10KX19dmFyIGo9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJidXR0b25Db250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIsImRlZmF1bHQiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKGopLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihqLCJ0b3VjaHN0YXJ0IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlb3ZlciIsSSkpO3ZhciBrPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJ1dHRvbkJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChrLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTF8fFoubW9iaWxlRGV2aWNlKXt2YXIgbD1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbk1pbmltaXplIixudWxsLGUsYlszXSxiWzRdLGJbNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwNyIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQobC5lbG10KTt2YXIgbT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4cGFuZCIsbnVsbCxlLGJbNl0sYls3XSxiWzhdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDUiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKG0uZWxtdCl9dmFyIG49bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25ab29tT3V0IixudWxsLGUsYls5XSxiWzEwXSxiWzExXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4IiwibW91c2VvdmVyIixKLCJ6MTIwIik7ai5hcHBlbmRDaGlsZChuLmVsbXQpO2lmKFouc2xpZGVyVmlzaWJsZSl7dmFyIG89bmV3IFouVXRpbHMuR3JhcGhpYygidHJhY2tTbGlkZXIiLGUsYlsxMl0sIjFweCIsIjFweCIsIjBweCIsIjBweCIpO2ouYXBwZW5kQ2hpbGQoby5lbG10KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoby5lbG10LCJtb3VzZWRvd24iLEopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLmVsbXQsInRvdWNoc3RhcnQiLEopO3ZhciBwPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uU2xpZGVyIixudWxsLGUsYlsxNF0sYlsxNV0sYlsxNl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExNCIpO2ouYXBwZW5kQ2hpbGQocC5lbG10KX12YXIgcT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblpvb21JbiIsbnVsbCxlLGJbMTddLGJbMThdLGJbMTldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTkiKTtqLmFwcGVuZENoaWxkKHEuZWxtdCk7dmFyIHI9bmV3IFouVXRpbHMuR3JhcGhpYygicGFuRGl2aWRlciIsZSxiWzIwXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iik7ai5hcHBlbmRDaGlsZChyLmVsbXQpO3ZhciBzPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uUGFuTGVmdCIsbnVsbCxlLGJbMjFdLGJbMjJdLGJbMjNdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDkiKTtqLmFwcGVuZENoaWxkKHMuZWxtdCk7dmFyIHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5VcCIsbnVsbCxlLGJbMjRdLGJbMjVdLGJbMjZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTEiKTtqLmFwcGVuZENoaWxkKHQuZWxtdCk7dmFyIHU9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5Eb3duIixudWxsLGUsYlsyN10sYlsyOF0sYlsyOV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwOCIpO2ouYXBwZW5kQ2hpbGQodS5lbG10KTt2YXIgdj1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblBhblJpZ2h0IixudWxsLGUsYlszMF0sYlszMV0sYlszMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMCIpO2ouYXBwZW5kQ2hpbGQodi5lbG10KTt2YXIgeT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblJlc2V0IixudWxsLGUsYlszM10sYlszNF0sYlszNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMiIpO2ouYXBwZW5kQ2hpbGQoeS5lbG10KTtpZihaLmZ1bGxQYWdlVmlzaWJsZSl7dmFyIEE9bmV3IFouVXRpbHMuR3JhcGhpYygiZnVsbFBhZ2VEaXZpZGVyIixlLGJbMzZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiKTtqLmFwcGVuZENoaWxkKEEuZWxtdCk7dmFyIEI9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25GdWxsUGFnZSIsbnVsbCxlLGJbMzddLGJbMzhdLGJbMzldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTgiKTtqLmFwcGVuZENoaWxkKEIuZWxtdCl9aWYoWi5wcm9ncmVzc1Zpc2libGUpe3ZhciBEPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwicHJvZ3Jlc3NUZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLEU9dG9vbGJhclNraW5TaXplc1sxNl0rInB4IjtqLmFwcGVuZENoaWxkKEQpO3ZhciBGPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFouVXRpbHMuejE4NSgiejUyIikpO0QuYXBwZW5kQ2hpbGQoWi5VdGlscy5jcmVhdGVDZW50ZXJlZEVsZW1lbnQoRikpLFouVXRpbHMuejI1MShGLCJibGFjayIsInZlcmRhbmEiLEUsIm5vbmUiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCIxZW0iLCJsZWZ0Iiwibm9uZSIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihELCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5kaXNhYmxlVGV4dEludGVyYWN0aW9uKEYpfVouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRvb2xiYXJEaXNwbGF5KSxaLnRvb2xiYXJXPXRvb2xiYXJTa2luU2l6ZXNbMF0sWi50b29sYmFyQ3VycmVudFc9Wi50b29sYmFyVz09LTE/Wi52aWV3ZXJXOloudG9vbGJhclcsWi50b29sYmFySD1mPXRvb2xiYXJTa2luU2l6ZXNbMV07dmFyIEc9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MDt4KFoudG9vbGJhckN1cnJlbnRXLFoudG9vbGJhckgsMCxHKTtpZihaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSl7dmFyIEg9Wi5WaWV3cG9ydC56MTg5QXNab29tKCk7QyhIKX16KFoudG9vbGJhclZpc2libGU9PTF8fFoudG9vbGJhclZpc2libGU9PTJ8fFoudG9vbGJhclZpc2libGU9PTQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlRvb2xiYXJEaXNwbGF5LCJtb3VzZW92ZXIiLFouVXRpbHMuc3RvcFByb3BhZ2F0aW9uKSx3KCEwKX0sdGhpcy56MTgwPWZ1bmN0aW9uKCl7cmV0dXJuIHYoKX0sdGhpcy5zZXRTaXplQW5kUG9zaXRpb249ZnVuY3Rpb24oYSxiLGMsZCl7eChhLGIsYyxkKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe3ooYSl9LHRoaXMuc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihhKXtBKGEpfSx0aGlzLnoyMTU9ZnVuY3Rpb24oYSl7QihhKX0sdGhpcy5zaG93UHJvZ3Jlc3M9ZnVuY3Rpb24oYSxiKXtpZihaLnByb2dyZXNzVmlzaWJsZSl7cSYmd2luZG93LmNsZWFySW50ZXJ2YWwocSk7dmFyIGMsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94IikuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDtkJiYoYT09MHx8Yj09MD8oZC5ub2RlVmFsdWU9ImxsbGxsbGxsbGwiLHE9d2luZG93LnNldEludGVydmFsKHUscGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NTEiKSksMTApKTooYz1NYXRoLnJvdW5kKDEwMC1iL2EqMTAwKSxkLm5vZGVWYWx1ZT0ibCIubXVsdGlwbHkoTWF0aC5yb3VuZChjLzEwKSkpKX19LHRoaXMuejI2Nj1mdW5jdGlvbihhKXtDKGEpfX0sWi56MTIzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHgoYSl7Wi5OYXZpZ2F0b3JEaXNwbGF5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiTmF2aWdhdG9yRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixlKyJweCIsZisicHgiLGcrInB4IixoKyJweCIsInNvbGlkIiwiMXB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLG89Wi5OYXZpZ2F0b3JEaXNwbGF5LHA9by5zdHlsZTt2YXIgYj1aLlV0aWxzLnoxODUoInozNiIpLGM9Wi5VdGlscy56MTg1KCJ6MzZOT0FMUEhBIiksZD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckJhY2tncm91bmQiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsicHgiLGYrInB4IiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsYiwiMHB4IiwiMHB4Iik7Wi5VdGlscy5zZXRPcGFjaXR5KGQsbCxjKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoZCkscT1kLHI9cS5zdHlsZTt2YXIgaj1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckltYWdlQ29udGFpbmVyIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGUrInB4IixmKyJweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChuKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoaikscz1qLHQ9cy5zdHlsZSx1PW47dmFyIGs9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJuYXZpZ2F0b3JSZWN0YW5nbGUiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsxKyJweCIsZisxKyJweCIsZysicHgiLGgrInB4Iiwic29saWQiLCIxcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ay5zdHlsZS5ib3JkZXJDb2xvcj1aLlV0aWxzLnoxODUoIno0MSIpLFouTmF2aWdhdG9yRGlzcGxheS5hcHBlbmRDaGlsZChrKSx2PWssdz12LnN0eWxlLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLk5hdmlnYXRvckRpc3BsYXkpLEMoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCksWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaHN0YXJ0IixQKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2htb3ZlIixRKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2hlbmQiLFIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaGNhbmNlbCIsUykpOihaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2VvdmVyIixaLlV0aWxzLnN0b3BQcm9wYWdhdGlvbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKG8sIm1vdXNlZG93biIsTSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLEIoITApLEcoKX1mdW5jdGlvbiB5KGEpe0MoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCl9ZnVuY3Rpb24geigpe2lmKEEoKSl7ZCYmKHdpbmRvdy5jbGVhckludGVydmFsKGQpLGQ9bnVsbCk7aWYoIW98fCFwfHwhcXx8IXJ8fCFzfHwhdHx8IXV8fCF2fHwhdylvPVouTmF2aWdhdG9yRGlzcGxheSxwPW8uc3R5bGUscT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1swXSxyPXEuc3R5bGUscz1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXSx0PXMuc3R5bGUsdT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXS5maXJzdENoaWxkLHY9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMl0sdz12LnN0eWxlfX1mdW5jdGlvbiBBKCl7cmV0dXJuIGN9ZnVuY3Rpb24gQihhKXtjPWF9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2F8fChhPVoubmF2aWdhdG9yVyksYnx8KGI9Wi5uYXZpZ2F0b3JIKSxjfHwoYz0wKSxkfHwoZD0wKSxvfHwobz1aLk5hdmlnYXRvckRpc3BsYXkpLHB8fChwPW8uc3R5bGUpLHU9by5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQ7aWYobyYmcCYmdSl7aWYoZSl7dmFyIGY9MSxnPTE7ZT09MD9nPVoudmlld2VyVy9aLnZpZXdlckg6Zz11LndpZHRoL3UuaGVpZ2h0LGY+MT8oYj1hLGIvPWcpOihhPWIsYSo9Zyl9cC53aWR0aD1hKyJweCIscC5oZWlnaHQ9YisicHgiLHAubGVmdD1jLTErInB4IixwLnRvcD1kLTErInB4IixEKGEsYil9fWZ1bmN0aW9uIEQoYSxiKXtyfHwocj1aLk5hdmlnYXRvckRpc3BsYXkuZmlyc3RDaGlsZC5zdHlsZSksdHx8KHQ9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMV0uc3R5bGUpLHV8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpLHImJnQmJnUmJihyLndpZHRoPWErInB4IixyLmhlaWdodD1iKyJweCIsRShhLGIsdS53aWR0aCx1LmhlaWdodCksdC53aWR0aD11LndpZHRoKyJweCIsdC5oZWlnaHQ9dS5oZWlnaHQrInB4Iix0LmxlZnQ9KGEtcGFyc2VGbG9hdCh0LndpZHRoKSkvMisicHgiLHQudG9wPShiLXBhcnNlRmxvYXQodC5oZWlnaHQpKS8yKyJweCIsRygpKX1mdW5jdGlvbiBFKGEsYixjLGQpe3V8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpO2lmKHUpe3ZhciBlPWMvZCxmPWEvYyxnPWIvZCxoPTAsaT0wO2Y8PWc/KGM9YSxkPWEvZSxpPShiLWQqKGEvYykpLzIpOmc8ZiYmKGQ9YixjPWIqZSxoPShhLWMqKGIvZCkpLzIpLHUud2lkdGg9Yyx1LmhlaWdodD1kfX1mdW5jdGlvbiBGKCl7cHx8KHA9Wi5OYXZpZ2F0b3JEaXNwbGF5LnN0eWxlKSxwJiYocC56SW5kZXg9cC56SW5kZXgrMTAwKX1mdW5jdGlvbiBHKCl7aWYoWi5WaWV3cG9ydCYmWi5WaWV3cG9ydC56MTgwKCkpe0koKTt2YXIgYT1aLlZpZXdwb3J0LnoxNDEoKTtKKGEpfX1mdW5jdGlvbiBIKGEpe3B8fChwPVouTmF2aWdhdG9yRGlzcGxheS5zdHlsZSkscCYmKGE/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuZGlzcGxheT0ibm9uZSIpfWZ1bmN0aW9uIEkoKXtpZih1JiZ3KXt2YXIgYT11LndpZHRoL1ouaW1hZ2VXLGI9dS5oZWlnaHQvWi5pbWFnZUgsYz1aLlZpZXdwb3J0LnoxODlBc1pvb20oKSxkPVoudmlld2VyVyphL2MsZT1aLnZpZXdlckgqYi9jO3cud2lkdGg9ZCsicHgiLHcuaGVpZ2h0PWUrInB4In19ZnVuY3Rpb24gSihhKXtpZih1JiZ3JiZ0KXt2YXIgYj11LndpZHRoL1ouaW1hZ2VXLGM9dS5oZWlnaHQvWi5pbWFnZUgsZD1hLngqYixlPWEueSpjLGY9ZC1wYXJzZUZsb2F0KHcud2lkdGgpLzIsZz1lLXBhcnNlRmxvYXQody5oZWlnaHQpLzI7dy5sZWZ0PWYrcGFyc2VGbG9hdCh0LmxlZnQpKyJweCIsdy50b3A9ZytwYXJzZUZsb2F0KHQudG9wKSsicHgifX1mdW5jdGlvbiBLKCl7aWYodyYmdCYmdSl7dmFyIGE9cGFyc2VGbG9hdCh3LmxlZnQpLXBhcnNlRmxvYXQodC5sZWZ0KSxiPXBhcnNlRmxvYXQody50b3ApLXBhcnNlRmxvYXQodC50b3ApLGM9YSsocGFyc2VGbG9hdCh3LndpZHRoKS0xKS8yLGQ9YisocGFyc2VGbG9hdCh3LmhlaWdodCktMSkvMixlPVouaW1hZ2VXL3Uud2lkdGgsZj1aLmltYWdlSC91LmhlaWdodCxnPWMqZSxoPWQqZjtaLlZpZXdwb3J0LnoyNjcoZyxoKX19ZnVuY3Rpb24gTCgpe1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4OCIpKX1mdW5jdGlvbiBNKGEpe2lmKG8mJnYmJncpe3ZhciBhPVouVXRpbHMuZXZlbnQoYSk7di5tb3VzZVhQcmlvcj1hLmNsaWVudFgsdi5tb3VzZVlQcmlvcj1hLmNsaWVudFksemFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChhLmNsaWVudFgsYS5jbGllbnRZKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vtb3ZlIixOKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2V1cCIsTyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixPKX19ZnVuY3Rpb24gTihhKXtpZih2JiZ3KXt2YXIgYj1wYXJzZUZsb2F0KHcubGVmdCksYz1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWIrKGEuY2xpZW50WC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWMrKGEuY2xpZW50WS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9YS5jbGllbnRYLHYubW91c2VZUHJpb3I9YS5jbGllbnRZLEsoKSwhMX19ZnVuY3Rpb24gTyhhKXtpZihvJiZ2JiZ3KXtkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNlbW92ZSIsTiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNldXAiLE8pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsTyk7dmFyIGE9Wi5VdGlscy5ldmVudChhKSxiPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpLGM9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1iLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWIueSwyKSk7aWYoYzw0KXt2YXIgZD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9YS5jbGllbnRYLWQueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1hLmNsaWVudFktZC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFAoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKG8mJnYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7emFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChkLngsZC55KSx2Lm1vdXNlWFByaW9yPWQueCx2Lm1vdXNlWVByaW9yPWQueSx6YXB0dkRyYWdQdFN0YXJ0PW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX19ZnVuY3Rpb24gUShhKXthLnByZXZlbnREZWZhdWx0KCk7aWYoIVoubW91c2VQYW4pcmV0dXJuO2lmKHYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSksZT1wYXJzZUZsb2F0KHcubGVmdCksZj1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWUrKGQueC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWYrKGQueS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9ZC54LHYubW91c2VZUHJpb3I9ZC55LEsoKSwhMX19cmV0dXJuITF9ZnVuY3Rpb24gUihhKXtpZihvJiZ2JiZ3KXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYil7dmFyIGM9Yi50YXJnZXQsZD1uZXcgWi5VdGlscy5Qb2ludChiLnBhZ2VYLGIucGFnZVkpLGU9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksZj1NYXRoLnNxcnQoTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC54LWUueCwyKStNYXRoLnBvdyh6YXB0dkRyYWdQdFN0YXJ0LnktZS55LDIpKSxnPVoubW9iaWxlRGV2aWNlPzY6MztpZihmPGcpe3ZhciBoPVouVXRpbHMuejE3NChaLk5hdmlnYXRvckRpc3BsYXkpO3cubGVmdD1kLngtaC54LXBhcnNlRmxvYXQody53aWR0aCkvMisicHgiLHcudG9wPWQueS1oLnktcGFyc2VGbG9hdCh3LmhlaWdodCkvMisicHgifX1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFMoYSl7aWYobyYmdiYmdyl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0LGQ9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKSxlPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpLGY9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1lLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWUueSwyKSksZz1aLm1vYmlsZURldmljZT82OjM7aWYoZjxnKXt2YXIgaD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9ZC54LWgueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1kLnktaC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In19SygpLFouVmlld3BvcnQuejI3NCgpfX12YXIgYj10aGlzLGM9ITEsZCxlPVoubmF2aWdhdG9yVyxmPVoubmF2aWdhdG9ySCxnPVoubmF2aWdhdG9yTC0xLGg9Wi5uYXZpZ2F0b3JULTEsaT1aLm5hdmlnYXRvckZpdCxqLGs9bnVsbCxsPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6MzUiKSksbT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLG49bmV3IEltYWdlO24ub25sb2FkPXgsbi5vbmVycm9yPUwsbi5zcmM9bTt2YXIgbyxwLHEscixzLHQsdSx2LHc7dGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7bT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLHMucmVtb3ZlQ2hpbGQobiksbj1udWxsLG49bmV3IEltYWdlLHMuYXBwZW5kQ2hpbGQobiksbi5vbmxvYWQ9eSxuLm9uZXJyb3I9TCxuLnNyYz1tfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gQSgpfSx0aGlzLnNldFNpemVBbmRQb3NpdGlvbj1mdW5jdGlvbihhLGIsYyxkLGUpe2V8fChlPWkpLEMoYSxiLGMsZCxlKX0sdGhpcy5zZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKGEpe0goYSl9LHRoaXMuejI2OD1mdW5jdGlvbigpe0coKX0sdGhpcy56MjYzUmVjdGFuZ2xlRGltZW5zaW9ucz1mdW5jdGlvbigpe0koKX0sdGhpcy56MjYzUmVjdGFuZ2xlUG9zaXRpb249ZnVuY3Rpb24oYSl7SihhKX0sdGhpcy56Mjc3PWZ1bmN0aW9uKCl7QSgpP3ooKTpkPXdpbmRvdy5zZXRJbnRlcnZhbCh6LDMwMCl9fSxaLnoxMDE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPW51bGwsZD10eXBlb2YgYj09ImZ1bmN0aW9uIjtpZihkKXZhciBlPWIsYj1mdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KFouVXRpbHMuY3JlYXRlQ2FsbGJhY2sobnVsbCxlLGMpLDEpfTtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl7dmFyIGY9WyJNc3htbDIuWE1MSFRUUCIsIk1zeG1sMy5YTUxIVFRQIiwiTWljcm9zb2Z0LlhNTEhUVFAiXTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl0cnl7Yz1uZXcgQWN0aXZlWE9iamVjdChmW2ddKTticmVha31jYXRjaChoKXtjb250aW51ZX19ZWxzZSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJihjPW5ldyBYTUxIdHRwUmVxdWVzdCk7Y3x8Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejk5IikpLGQmJihjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09NCYmKGMub25yZWFkeXN0YXRlY2hhbmdlPW5ldyBGdW5jdGlvbixiKCkpfSk7dHJ5e2Mub3BlbigiR0VUIixhLGQpLGMuc2VuZChudWxsKX1jYXRjaChoKXthLmluZGV4T2YoIkltYWdlUHJvcGVydGllcy54bWwiKSE9LTE/Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg3LUlNQUdFWE1MIikpOmEuaW5kZXhPZigic2tpbkZpbGVzLnhtbCIpIT0tMT9aLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODctVE9PTEJBUlhNTCIpKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODciKSksYy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxjPW51bGx9cmV0dXJuIGQ/bnVsbDpjfWZ1bmN0aW9uIGQoYSl7aWYoYSl7aWYoIWEpWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg5IikpO2Vsc2UgaWYoYS5zdGF0dXMhPT0yMDAmJmEuc3RhdHVzIT09MCl7dmFyIGI9YS5zdGF0dXMsYz1iPT00MDQ/Ik5vdCBGb3VuZCI6YS5zdGF0dXNUZXh0O1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MCIpK2IrIiAtICIrYyl9dmFyIGQ9bnVsbDthLnJlc3BvbnNlWE1MJiZhLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudD9kPWEucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQmJihkPVouVXRpbHMuejE1OChhLnJlc3BvbnNlVGV4dCkpLGUoZCl9ZWxzZSBaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODQiKSl9ZnVuY3Rpb24gZShhKXtpZihhJiZhLmRvY3VtZW50RWxlbWVudCl7dmFyIGI9YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZTtiPT0iQ09QWVJJR0hUIj9mKCJjb3B5cmlnaHQiLGEpOmI9PSJJTUFHRV9QUk9QRVJUSUVTIj9mKCJpbWFnZSIsYSk6Yj09IlNLSU5EQVRBIj9mKCJza2luIixhKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6MTAwIikpfWVsc2UgWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejEwMCIpKX1mdW5jdGlvbiBmKGEsYil7aWYoYT09ImNvcHlyaWdodCIpe3ZhciBjPWIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiU1RBVEVNRU5UVEVYVCIpLGQ9Yi5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJERUNMSU5FRFRFWFQiKTtaLlV0aWxzLmlzU3RyVmFsKGMpP1ouVXRpbHMuejI1MighMCxjLGQpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJpbWFnZSIpe3ZhciBlPXBhcnNlSW50KGIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiV0lEVEgiKSwxMCksZj1wYXJzZUludChiLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIkhFSUdIVCIpLDEwKTshaXNOYU4oZSkmJmU+MCYmIWlzTmFOKGYpJiZmPjA/Wi5WaWV3cG9ydCYmKFouVmlld3BvcnQuejE4MCgpP1ouVmlld3BvcnQucmV6MjA2KGUsZik6Wi5WaWV3cG9ydC56MjA2KGUsZikpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJza2luIil7Wi5za2luTW9kZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOTU9ERSIpLm5vZGVWYWx1ZTt2YXIgZyxoO1ouc2tpbk1vZGU9PTF8fFouc2tpbk1vZGU9PTAmJiFaLm1vYmlsZURldmljZT8oZz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJGT0xERVJTVEFOREFSRCIpLm5vZGVWYWx1ZSxoPSJTSVpFU1NUQU5EQVJEIik6KGc9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU0VUVVAiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRk9MREVSTEFSR0UiKS5ub2RlVmFsdWUsaD0iU0laRVNMQVJHRSIpO3ZhciBpPVtdO2kucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlRPT0xCQVJXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiVE9PTEJBUkgiKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJMT0dPVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkxPR09IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRElWSURFUlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJESVZJREVSSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiQlVUVE9OU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNMSURFUkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTTElERVJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tIIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTRk9OVFNJWkUiKS5ub2RlVmFsdWUpKTt2YXIgaj1bXSxrPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZJTEVTIilbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNLSU4wIikubm9kZVZhbHVlLGw9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRklMRVMiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0tJTjM5Iikubm9kZVZhbHVlO2lmKFouVXRpbHMuaXNTdHJWYWwoaykmJlouVXRpbHMuaXNTdHJWYWwobCkpe3ZhciBtPSExO2Zvcih2YXIgbj0wO248NDA7bisrKXt2YXIgbz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGSUxFUyIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOIituKS5ub2RlVmFsdWU7Wi5VdGlscy5pc1N0clZhbChvKT9qW25dPWcrIi8iK286KGpbbl09Im51bGwiLG09ITApfW0mJlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIkVSUk9SX1NLSU5TWE1MTUlTU0lOR05BTUVTIikpLFouVG9vbGJhciYmWi5Ub29sYmFyLnoyMDUoaSxqKX1lbHNlIFouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MSIpKX19ZnVuY3Rpb24gZyhhLGMsZCl7Yi0tO2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXRyeXthKGQpfWNhdGNoKGUpe1ouVXRpbHMuejI1NShlLm5hbWUrWi5VdGlscy56MTg1KCJ6ODMiKStjKyIgIitlLm1lc3NhZ2UpfX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gZShlKXtjLm9ubG9hZD1udWxsLGMub25hYm9ydD1udWxsLGMub25lcnJvcj1udWxsLGQmJndpbmRvdy5jbGVhclRpbWVvdXQoZCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtiKGEsZT9jOm51bGwpfSwxKX12YXIgYz1udWxsLGQ9bnVsbDt0aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7Yz1uZXcgSW1hZ2U7dmFyIGI9ZnVuY3Rpb24oKXtlKCEwKX0sZj1mdW5jdGlvbigpe2UoITEpfSxnPWZ1bmN0aW9uKCl7ZSghMSl9O2Mub25sb2FkPWIsYy5vbmFib3J0PWYsYy5vbmVycm9yPWYsZD13aW5kb3cuc2V0VGltZW91dChnLHBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NjAiKSkpLGMuc3JjPWF9fXZhciBiPTA7dGhpcy5sb2FkWE1MPWZ1bmN0aW9uKGEpe2MoYSxkKX0sdGhpcy56MjEySW1hZ2U9ZnVuY3Rpb24oYSxjKXtpZihiPj1wYXJzZUludChaLlV0aWxzLnoxODUoInoyNSIpLDEwKSlyZXR1cm4hMTt2YXIgZD1aLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsZyxjKSxlPW5ldyBoKGEsZCk7cmV0dXJuIGIrKyxlLnN0YXJ0KCksITB9fSxaLlV0aWxzPXt6MTYzOmZ1bmN0aW9uKCl7Wi5wYWdlQ29udGFpbmVySUQ9bnVsbCxaLmltYWdlUGF0aD1udWxsLFouc2tpblBhdGg9bnVsbCxaLnNraW5Nb2RlPW51bGwsWi5wYXJhbWV0ZXJzPW51bGwsWi5icm93c2Vycz1udWxsLFouYnJvd3Nlcj1udWxsLFouYnJvd3NlclZlcnNpb249bnVsbCxaLmNhbnZhc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3JtUHJvcGVydHk9bnVsbCxaLmNzc1RyYW5zZm9ybU5vVW5pdHM9bnVsbCxaLmFscGhhU3VwcG9ydGVkPW51bGwsWi5yZW5kZXJRdWFsaXR5PW51bGwsWi5tb2JpbGVEZXZpY2U9bnVsbCxaLmluaXRpYWxYPW51bGwsWi5pbml0aWFsWT1udWxsLFouaW5pdGlhbFo9bnVsbCxaLm1pblo9bnVsbCxaLm1heFo9bnVsbCxaLnpvb21TcGVlZD1udWxsLFoucGFuU3BlZWQ9bnVsbCxaLmZhZGVJblNwZWVkPW51bGwsWi50b29sYmFyVmlzaWJsZT1udWxsLFoudG9vbGJhclc9bnVsbCxaLnRvb2xiYXJIPW51bGwsWi50b29sYmFyUG9zaXRpb249bnVsbCxaLm5hdmlnYXRvclZpc2libGU9bnVsbCxaLm5hdmlnYXRvclc9bnVsbCxaLm5hdmlnYXRvckg9bnVsbCxaLm5hdmlnYXRvckw9bnVsbCxaLm5hdmlnYXRvclQ9bnVsbCxaLm5hdmlnYXRvckZpdD1udWxsLFouY2xpY2tab29tPW51bGwsWi5jbGlja1Bhbj1udWxsLFoubW91c2VQYW49bnVsbCxaLmtleXM9bnVsbCxaLmNvbnN0cmFpblBhbj1udWxsLFoudG9vbHRpcHNWaXNpYmxlPW51bGwsWi5jb3B5cmlnaHRQYXRoPW51bGwsWi53YXRlcm1hcmtQYXRoPW51bGwsWi5zbGlkZXJWaXNpYmxlPW51bGwsWi5mdWxsUGFnZVZpc2libGU9bnVsbCxaLnByb2dyZXNzVmlzaWJsZT1udWxsLFoubG9nb1Zpc2libGU9bnVsbCxaLmxvZ29DdXN0b21QYXRoPW51bGwsWi5jYW52YXM9bnVsbCxaLmRlYnVnPW51bGwsWi5WaWV3ZXI9bnVsbCxaLlZpZXdlckRpc3BsYXk9bnVsbCxaLlZpZXdwb3J0PW51bGwsWi5Ub29sYmFyPW51bGwsWi5Ub29sYmFyRGlzcGxheT1udWxsLFouVG9vbHRpcERpc3BsYXk9bnVsbCxaLk5hdmlnYXRvcj1udWxsLFouTmF2aWdhdG9yRGlzcGxheT1udWxsLFouQ29weXJpZ2h0RGlzcGxheT1udWxsLFouaW1hZ2VXPW51bGwsWi5pbWFnZUg9bnVsbCxaLmltYWdlWD0wLFouaW1hZ2VZPTAsWi5pbWFnZVo9MCxaLmZpdFo9bnVsbCxaLnpvb21pbmc9InN0b3AiLFoucGFubmluZ1g9InN0b3AiLFoucGFubmluZ1k9InN0b3AiLFouZnVsbFBhZ2U9ITEsWi51c2VDYW52YXM9ITAsWi5UcmFjZURpc3BsYXk9bnVsbCxaLnRyYWNlcz1udWxsfSxlbmZvcmNlQ29weXJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy56MjM4KCJpbWFnZUNvcHlyaWdodCIpO2E/Wi5WaWV3ZXIuejE0OSgpOnRoaXMuejIxMCgpfSx6MjEwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFouejEwMTthLmxvYWRYTUwoWi5jb3B5cmlnaHRQYXRoKX0sejI1MjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy56MTg1KCJ6MTYiKSxlPXRoaXMuejE4NSgiejE0Iik7aWYoYSl7Wi5Db3B5cmlnaHREaXNwbGF5PXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiQ29weXJpZ2h0RGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixaLnZpZXdlclctMisicHgiLFoudmlld2VySC0yKyJweCIsIjBweCIsIjBweCIsInNvbGlkIiwiMXB4IixkLCIwcHgiLCIwcHgiKSxaLlZpZXdlckRpc3BsYXkuYXBwZW5kQ2hpbGQoWi5Db3B5cmlnaHREaXNwbGF5KTt2YXIgZj00NDAsZz0yMDAsaD1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS53aWR0aCkvMi1mLzIsaT1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS5oZWlnaHQpLzItZy8yLGo9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJ0ZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGYrInB4IixnKyJweCIsaCsicHgiLGkrInB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiKTtqLmlkPSJ0ZXh0Qm94IixaLkNvcHlyaWdodERpc3BsYXkuYXBwZW5kQ2hpbGQoaik7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7ai5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChrKSksdGhpcy56MjUxKGssImJsYWNrIiwidmVyZGFuYSIsIjE2cHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwianVzdGlmeSIsIm5vbmUiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKTtqLmFwcGVuZENoaWxkKGwpO3ZhciBtPTgwLG49MjAsbz0zMCxwPTIwLHE9aCtmLzItKG0qMitvKS8yLHI9aStnK3Ascz10aGlzLnoxODUoInoxMyIpLHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25BZ3JlZSIscyxudWxsLG51bGwsbnVsbCxudWxsLG0rInB4IixuKyJweCIscSsicHgiLHIrInB4IiwibW91c2Vkb3duIix0aGlzLnoxNjAsInoxMDMiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMHB4Iik7Wi5Db3B5cmlnaHREaXNwbGF5LmFwcGVuZENoaWxkKHQuZWxtdCkscSs9bStvLHM9dGhpcy56MTg1KCJ6MTUiKTt2YXIgdT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4aXQiLHMsbnVsbCxudWxsLG51bGwsbnVsbCxtKyJweCIsbisicHgiLHErInB4IixyKyJweCIsIm1vdXNlZG93biIsdGhpcy56MTYxLCJ6MTA0Iiwic29saWQiLCIxcHgiLGUsIjBweCIsIjBweCIpO1ouQ29weXJpZ2h0RGlzcGxheS5hcHBlbmRDaGlsZCh1LmVsbXQpfWVsc2V7dmFyIGo9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRCb3giKSx2PWouY2hpbGROb2Rlc1sxXS50ZXh0Q29udGVudDtqLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9djt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQWdyZWUiKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwibW91c2Vkb3duIix0aGlzLnoxNjApLFouQ29weXJpZ2h0RGlzcGxheS5yZW1vdmVDaGlsZCh0KTt2YXIgdT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhpdCIpO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLHRoaXMuejE2MSksWi5Db3B5cmlnaHREaXNwbGF5LnJlbW92ZUNoaWxkKHUpfX0sQnV0dG9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpe3ZhciB0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsYSwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGcsaCxpLGosbixvLHAscSxyLHMpO2lmKCFaLlV0aWxzLmlzU3RyVmFsKGIpKXt2YXIgdT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGMrIi8iK2QpLHY9Wi5VdGlscy5jcmVhdGVHcmFwaGljRWxlbWVudChjKyIvIitlKSx3PVouVXRpbHMuY3JlYXRlR3JhcGhpY0VsZW1lbnQoYysiLyIrZik7dS5pZD10LmlkKyItaW1nVXAiLHYuaWQ9dC5pZCsiLWltZ092ZXIiLHcuaWQ9dC5pZCsiLWltZ0Rvd24iLHQuX2ltZ1VwSUQ9dS5pZCx0Ll9pbWdPdmVySUQ9di5pZCx0Ll9pbWdEb3duSUQ9dy5pZDt2YXIgeD11LnN0eWxlLHk9di5zdHlsZSx6PXcuc3R5bGU7eC5wb3NpdGlvbj15LnBvc2l0aW9uPXoucG9zaXRpb249ImFic29sdXRlIix4LndpZHRoPXkud2lkdGg9eS53aWR0aD1nLHguaGVpZ2h0PXkuaGVpZ2h0PXkuaGVpZ2h0PWgseC50b3A9eS50b3A9ei50b3A9IjBweCIseC5sZWZ0PXkubGVmdD16LmxlZnQ9IjBweCIsWi5icm93c2VyPT1aLmJyb3dzZXJzLkZJUkVGT1gmJlouYnJvd3NlclZlcnNpb248MyYmKHgudG9wPXkudG9wPXoudG9wPSIiKSx5LnZpc2liaWxpdHk9ImhpZGRlbiIsei52aXNpYmlsaXR5PSJoaWRkZW4iLHQuYXBwZW5kQ2hpbGQodSksdC5hcHBlbmRDaGlsZCh2KSx0LmFwcGVuZENoaWxkKHcpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih1LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHYsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfWVsc2V7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7dC5hcHBlbmRDaGlsZChaLlV0aWxzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChBKSksWi5VdGlscy56MjUxKEEsImJsYWNrIiwidmVyZGFuYSIsIjEzcHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwiY2VudGVyIiwibm9uZSIpLFouVXRpbHMuZGlzYWJsZVRleHRJbnRlcmFjdGlvbihBKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodCwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfVoudG9vbHRpcHNWaXNpYmxlJiZaLlV0aWxzLmlzU3RyVmFsKG0pJiYodC50aXRsZT1aLlV0aWxzLnoxODUobSkpLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJ0b3VjaHN0YXJ0IixsKTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlb3ZlciIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZW91dCIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LGssbCkpLHRoaXMuZWxtdD10fSx6MTM4OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnN0eWxlO2Qud2lkdGg9YisicHgiLGQuaGVpZ2h0PWMrInB4Ijt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdVcElEKSxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ092ZXJJRCksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdEb3duSUQpO2lmKGUmJmYmJmcpe3ZhciBoPWUuc3R5bGUsaT1mLnN0eWxlLGo9Zy5zdHlsZTtoLndpZHRoPWIrInB4IixoLmhlaWdodD1jKyJweCIsaS53aWR0aD1iKyJweCIsaS5oZWlnaHQ9YysicHgiLGoud2lkdGg9YisicHgiLGouaGVpZ2h0PWMrInB4In19LEdyYXBoaWM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9Yz9iKyIvIitjOmIsaT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGgpLGo9aS5zdHlsZTtqLndpZHRoPWQsai5oZWlnaHQ9ZTt2YXIgYz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoInNwYW4iLGEsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixkLGUsZixnLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpO2MuYXBwZW5kQ2hpbGQoaSksdGhpcy5lbG10PWMsWi5tb2JpbGVEZXZpY2U/Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksInRvdWNoc3RhcnQiLFouVXRpbHMucHJldmVudERlZmF1bHQpOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJtb3VzZWRvd24iLFouVXRpbHMucHJldmVudERlZmF1bHQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9LHoyMDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuc3R5bGU7ZC53aWR0aD1iKyJweCIsZC5oZWlnaHQ9YysicHgiO3ZhciBlPWEuZmlyc3RDaGlsZCxmPWUuc3R5bGU7Zi53aWR0aD1iKyJweCIsZi5oZWlnaHQ9YysicHgifSx6MTYwOmZ1bmN0aW9uKGEpe1ouVmlld2VyRGlzcGxheS5yZW1vdmVDaGlsZChaLkNvcHlyaWdodERpc3BsYXkpLGRvY3VtZW50LmNvb2tpZT0iaW1hZ2VDb3B5cmlnaHQ9Y29uZmlybWVkIixaLlZpZXdlci56MTQ5KCl9LHoxNjE6ZnVuY3Rpb24oYSl7Wi5VdGlscy56MjUyKCExKTtyZXR1cm59LHoxMjg6ZnVuY3Rpb24oKXtTdHJpbmcucHJvdG90eXBlLm11bHRpcGx5fHwoU3RyaW5nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5qb2luLGI9e307cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiLmxlbmd0aD1jKzEsYS5jYWxsKGIsdGhpcyl9fSgpKSxBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGEsYil7Yj9iPDAmJihiPU1hdGgubWF4KDAsdGhpcy5sZW5ndGgrYikpOmI9MDtmb3IodmFyIGM9YixkPXRoaXMubGVuZ3RoO2M8ZDtjKyspaWYodGhpc1tjXT09PWEpcmV0dXJuIGM7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUucHVzaHx8KEFycmF5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXNbdGhpcy5sZW5ndGhdPWF9KSxBcnJheS5wcm90b3R5cGUuc3BsaWNlfHwoQXJyYXkucHJvdG90eXBlLnN1YmFycj1mdW5jdGlvbihhLGIpe2lmKGE+PXRoaXMubGVuZ3RofHxiJiZiPD0wKXJldHVybltdO2E8MCYmKE1hdGguYWJzKGEpPnRoaXMubGVuZ3RoP2E9MDphPXRoaXMubGVuZ3RoK2EpO2lmKCFifHxiK2E+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aC1hO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YStiO2QrKyljLnB1c2godGhpc1tkXSk7cmV0dXJuIGN9LEFycmF5LnByb3RvdHlwZS5zdWJhcnJheT1mdW5jdGlvbihhLGIpe2E8MCYmKGE9MCk7aWYoIWJ8fGI+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aDtpZihhPT1iKXJldHVybltdO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YjtkKyspYy5wdXNoKHRoaXNbZF0pO3JldHVybiBjfSxBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGEsYil7YjwwJiYoYj0wKTt2YXIgYz1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpZm9yKHZhciBkPTIsZT1hcmd1bWVudHMubGVuZ3RoO2Q8ZTtkKyspYy5wdXNoKGFyZ3VtZW50c1tkXSk7dmFyIGY9dGhpcy5zdWJhcnJheSgwLGEpLGc9dGhpcy5zdWJhcnIoYSxiKSxoPXRoaXMuc3ViYXJyYXkoYStiKSxpPWYuY29uY2F0KGMsaCk7dGhpcy5sZW5ndGg9MDtmb3IodmFyIGQ9MCxlPWkubGVuZ3RoO2Q8ZTtkKyspdGhpcy5wdXNoKGlbZF0pO3JldHVybiBnfSl9LHoxMjc6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyPyh0aGlzLmRpc2FibGVUZXh0SW50ZXJhY3Rpb249ZnVuY3Rpb24oYSl7YSYmKHRuUz1hLnBhcmVudE5vZGUuc3R5bGUsdG5TJiYoYS5wYXJlbnROb2RlLnVuc2VsZWN0YWJsZT0ib24iLHRuUy51c2VyU2VsZWN0PSJub25lIix0blMuTW96VXNlclNlbGVjdD0ibm9uZSIsdG5TLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLHRuUy53ZWJraXRUb3VjaENhbGxvdXQ9Im5vbmUiLHRuUy53ZWJraXRUYXBIaWdobGlnaHRDb2xvcj0idHJhbnNwYXJlbnQiKSl9LHRoaXMucmVuZGVyUXVhbGl0eT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWI9PSJoaWdoIj8ib3B0aW1pemVRdWFsaXR5Ijoib3B0aW1pemVTcGVlZCI7YS5zdHlsZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIixjLG51bGwpfX0sdGhpcy5zZXRPcGFjaXR5PWZ1bmN0aW9uKGEsYixjKXtaLmFscGhhU3VwcG9ydGVkP2Euc3R5bGUub3BhY2l0eT1iOmMmJihhLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jKX0pOmRvY3VtZW50LmF0dGFjaEV2ZW50JiYodGhpcy5kaXNhYmxlVGV4dEludGVyYWN0aW9uPWZ1bmN0aW9uKGEpe2EmJihhLnBhcmVudE5vZGUudW5zZWxlY3RhYmxlPSJvbiIsYS5wYXJlbnROb2RlLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSx0aGlzLnJlbmRlclF1YWxpdHk9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iPT0iaGlnaCI/ImJpY3ViaWMiOiJuZWFyZXN0LW5laWdoYm9yIjthLnN0eWxlLm1zSW50ZXJwb2xhdGlvbk1vZGU9Y319LHRoaXMuc2V0T3BhY2l0eT1mdW5jdGlvbihhLGIsYyl7Wi5hbHBoYVN1cHBvcnRlZD8oYS5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PScgKyB2YWx1ZSArICcpIixhLnN0eWxlLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0iK2IrIikiKTpjJiYoYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Yyl9KX0sejEyNjpmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI/KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7Yj09Im1vdXNld2hlZWwiJiZlbG10LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIixjLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0sdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtiPT0ibW91c2V3aGVlbCImJmVsbXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGMsITEpLGEmJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx0aGlzLmV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhfSx0aGlzLnRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LHRoaXMucmVsYXRlZFRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxhdGVkVGFyZ2V0fSx0aGlzLmlzUmlnaHRNb3VzZUJ1dHRvbj1mdW5jdGlvbihhKXt2YXIgYj0hMTtpZihhLndoaWNoPT0yfHxhLndoaWNoPT0zKWI9ITA7cmV0dXJuIGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQmJih0aGlzLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYykhPS0xKXJldHVybjt2YXIgZD1mdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5ldmVudDtGdW5jdGlvbi5wcm90b3R5cGUuY2FsbD9jLmNhbGwoYSxiKTooYS5fY3VycmVudExpc3RlbmVyPWMsYS5fY3VycmVudExpc3RlbmVyKGIpLGEuX2N1cnJlbnRMaXN0ZW5lcj1udWxsKX07YS5hdHRhY2hFdmVudCgib24iK2IsZCk7dmFyIGU9e3RhcmdldDphLGV2ZW50TmFtZTpiLGhhbmRsZXI6YyxoYW5kbGVyMjpkfSxmPWEuZG9jdW1lbnR8fGEsZz1mLnBhcmVudFdpbmRvdyxoPSJsIit0aGlzLl9saXN0ZW5lckNvdW50ZXIrKztnLl9hbGxMaXN0ZW5lcnN8fChnLl9hbGxMaXN0ZW5lcnM9e30pLGcuX2FsbExpc3RlbmVyc1toXT1lLGEuX2xpc3RlbmVyc3x8KGEuX2xpc3RlbmVycz1bXSksYS5fbGlzdGVuZXJzW2EuX2xpc3RlbmVycy5sZW5ndGhdPWgsZy5fdW5sb2FkTGlzdGVuZXJBZGRlZHx8KGcuX3VubG9hZExpc3RlbmVyQWRkZWQ9ITAsZy5hdHRhY2hFdmVudCgib251bmxvYWQiLHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycykpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEpe3ZhciBkPXRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYyk7aWYoZD09LTEpcmV0dXJuO3ZhciBlPWEuZG9jdW1lbnR8fGEsZj1lLnBhcmVudFdpbmRvdyxnPWEuX2xpc3RlbmVyc1tkXSxoPWYuX2FsbExpc3RlbmVyc1tnXTthLmRldGFjaEV2ZW50KCJvbiIrYixoLmhhbmRsZXIyKSxhLl9saXN0ZW5lcnMuc3BsaWNlKGQsMSksZGVsZXRlIGYuX2FsbExpc3RlbmVyc1tnXX19LHRoaXMuZXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5ldmVudH0sdGhpcy50YXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3JjRWxlbWVudH0sdGhpcy5yZWxhdGVkVGFyZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIGEudHlwZT09Im1vdXNlb3ZlciI/Yj1hLmZyb21FbGVtZW50OmEudHlwZT09Im1vdXNlb3V0IiYmKGI9YS50b0VsZW1lbnQpLGJ9LHRoaXMuaXNSaWdodE1vdXNlQnV0dG9uPWZ1bmN0aW9uKGEpe3ZhciBiPSExO3JldHVybiBhLmJ1dHRvbj09MiYmKGI9ITApLGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YSYmKGEucmV0dXJuVmFsdWU9ITEpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLmNhbmNlbEJ1YmJsZT0hMH0sdGhpcy5fZmluZExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLl9saXN0ZW5lcnM7aWYoIWQpcmV0dXJuLTE7dmFyIGU9YS5kb2N1bWVudHx8YSxmPWUucGFyZW50V2luZG93O2Zvcih2YXIgZz1kLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1kW2ddLGk9Zi5fYWxsTGlzdGVuZXJzW2hdO2lmKGkuZXZlbnROYW1lPT1iJiZpLmhhbmRsZXI9PWMpcmV0dXJuIGd9cmV0dXJuLTF9LHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Zm9yKGlkIGluIGEuX2FsbExpc3RlbmVycyl7dmFyIGI9YS5fYWxsTGlzdGVuZXJzW2lkXTtiLnRhcmdldC5kZXRhY2hFdmVudCgib24iK2IuZXZlbnROYW1lLGIuaGFuZGxlcjIpLGRlbGV0ZSBhLl9hbGxMaXN0ZW5lcnNbaWRdfX0sdGhpcy5fbGlzdGVuZXJDb3VudGVyPTApfSx6MTY0OmZ1bmN0aW9uKCl7Wi5icm93c2Vycz17VU5LTk9XTjowLElFOjEsRklSRUZPWDoyLFNBRkFSSTozLENIUk9NRTo0LE9QRVJBOjV9O3ZhciBhPVouYnJvd3NlcnMuVU5LTk9XTixiPTAsYz1uYXZpZ2F0b3IuYXBwTmFtZSxkPW5hdmlnYXRvci5hcHBWZXJzaW9uLGU9ITEsZj0hMSxnPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtpZihjIT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8IXdpbmRvdy5hdHRhY2hFdmVudHx8IXdpbmRvdy5BY3RpdmVYT2JqZWN0KWlmKGMhPSJOZXRzY2FwZSJ8fCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciljPT0iT3BlcmEiJiYhIXdpbmRvdy5vcGVyYSYmISF3aW5kb3cuYXR0YWNoRXZlbnQmJihhPVouYnJvd3NlcnMuT1BFUkEsYj1wYXJzZUZsb2F0KGQpKTtlbHNle3ZhciBpPWcuaW5kZXhPZigiZmlyZWZveCIpLGo9Zy5pbmRleE9mKCJzYWZhcmkiKSxrPWcuaW5kZXhPZigiY2hyb21lIik7aWYoaT49MClhPVouYnJvd3NlcnMuRklSRUZPWCxiPXBhcnNlRmxvYXQoZy5zdWJzdHJpbmcoaSs4KSk7ZWxzZSBpZihqPj0wKXt2YXIgbD1nLnN1YnN0cmluZygwLGopLmxhc3RJbmRleE9mKCIvIik7YT1rPj0wP1ouYnJvd3NlcnMuQ0hST01FOlouYnJvd3NlcnMuU0FGQVJJLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhsKzEsaikpfXZhciBtPW5ldyBJbWFnZTttLnN0eWxlLmdldFByb3BlcnR5VmFsdWUmJihmPW0uc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiaW1hZ2UtcmVuZGVyaW5nIikpfWVsc2V7dmFyIGg9Zy5pbmRleE9mKCJtc2llIik7YT1aLmJyb3dzZXJzLklFLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhoKzUsZy5pbmRleE9mKCI7IixoKSkpLGU9dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSE9InVuZGVmaW5lZCJ9dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxvPW4uc3R5bGV8fHt9LHA9ITEscT1bInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSJdLHIsczt3aGlsZShyPXEuc2hpZnQoKSlpZih0eXBlb2Ygb1tyXSE9InVuZGVmaW5lZCIpe3A9ITAscz0vd2Via2l0L2kudGVzdChyKTticmVha312YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0JiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLHU9IShhPT1aLmJyb3dzZXJzLlNBRkFSSSYmYjw0fHxhPT1aLmJyb3dzZXJzLkNIUk9NRSYmYjwyKSx2PXQmJnUsdz0hKGE9PVouYnJvd3NlcnMuSUV8fGE9PVouYnJvd3NlcnMuQ0hST01FJiZiPDIpLHg9ZXx8Zj8iaGlnaCI6bnVsbCx5PWcuaW5kZXhPZigiYW5kcm9pZCIpPi0xfHxnLmluZGV4T2YoImlwaG9uZSIpPi0xfHxnLmluZGV4T2YoImlwYWQiKT4tMXx8Zy5pbmRleE9mKCJpcG9kIik+LTE7Wi5icm93c2VyPWEsWi5icm93c2VyVmVyc2lvbj1iLFouY2FudmFzU3VwcG9ydGVkPXYsWi51c2VDYW52YXM9Wi5jYW52YXNTdXBwb3J0ZWQsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkPXAsWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eT1yLFouY3NzVHJhbnNmb3JtTm9Vbml0cz1zLFouYWxwaGFTdXBwb3J0ZWQ9dyxaLnJlbmRlclF1YWxpdHk9eCxaLm1vYmlsZURldmljZT15fSxpc1N0clZhbDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYSE9IiJ9LHoxNzQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTAsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKTt3aGlsZShlKXtiKz1hLm9mZnNldExlZnQsYys9YS5vZmZzZXRUb3A7aWYoZCl7dmFyIGY9dGhpcy56MTg0KCk7Yis9Zi54LGMrPWYueX1hPWUsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKX1yZXR1cm4gbmV3IHRoaXMuUG9pbnQoYixjKX0sejE4MzpmdW5jdGlvbihhLGIpe3JldHVybiBiJiZhIT1kb2N1bWVudC5ib2R5P2RvY3VtZW50LmJvZHk6YS5vZmZzZXRQYXJlbnR9LHoxNzU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLlBvaW50KGEuY2xpZW50V2lkdGgsYS5jbGllbnRIZWlnaHQpfSx6MTc2OmZ1bmN0aW9uKGEpe2lmKGEuY3VycmVudFN0eWxlKXJldHVybiBhLmN1cnJlbnRTdHlsZTtpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIik7dGhpcy56MjU1KHRoaXMuejE4NSgiejkzIikpfSx6MTc3OmZ1bmN0aW9uKGEpe3JldHVybiB6MTc0KFouVXRpbHMudGFyZ2V0KGEpKX0sejE3ODpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9YS50b3VjaGVzLGQ9YS5jaGFuZ2VkVG91Y2hlcztyZXR1cm4gYyE9PXVuZGVmaW5lZD9iPWNbMF06ZCE9PXVuZGVmaW5lZCYmKGI9ZFswXSksYn0sejE4MTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtyZXR1cm4gYS50eXBlPT0iRE9NTW91c2VTY3JvbGwiJiZicm93c2VyPT1Ccm93c2VyLkZJUkVGT1gmJmJyb3dzZXJWZXJzaW9uPDM/KGI9YS5zY3JlZW5YLGM9YS5zY3JlZW5ZKTp0eXBlb2YgYS5wYWdlWD09Im51bWJlciI/KGI9YS5wYWdlWCxjPWEucGFnZVkpOnR5cGVvZiBhLmNsaWVudFg9PSJudW1iZXIiPyhiPWEuY2xpZW50WCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsYz1hLmNsaWVudFkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk6dGhpcy56MjU1KHRoaXMuejE4NSgiejk0IikpLG5ldyB0aGlzLlBvaW50KGIsYyl9LHoxODI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gdHlwZW9mIGEud2hlZWxEZWx0YT09Im51bWJlciI/Yj1hLndoZWVsRGVsdGE6dHlwZW9mIGEuZGV0YWlsPT0ibnVtYmVyIj9iPWEuZGV0YWlsKi0xOnRoaXMuejI1NSh0aGlzLnoxODUoIno5NSIpKSxiP2IvTWF0aC5hYnMoYik6MH0sejE4NDpmdW5jdGlvbigpe3ZhciBhPTAsYj0wLGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxkPWRvY3VtZW50LmJvZHl8fHt9O2lmKHR5cGVvZiB3aW5kb3cucGFnZVhPZmZzZXQ9PSJudW1iZXIiKWE9d2luZG93LnBhZ2VYT2Zmc2V0LGI9d2luZG93LnBhZ2VZT2Zmc2V0O2Vsc2UgaWYoZC5zY3JvbGxMZWZ0fHxkLnNjcm9sbFRvcClhPWQuc2Nyb2xsTGVmdCxiPWQuc2Nyb2xsVG9wO2Vsc2UgaWYoYy5zY3JvbGxMZWZ0fHxjLnNjcm9sbFRvcClhPWMuc2Nyb2xsTGVmdCxiPWMuc2Nyb2xsVG9wO3JldHVybiBuZXcgdGhpcy5Qb2ludChhLGIpfSx6MjAxaW5kb3dTaXplOmZ1bmN0aW9uKCl7dmFyIGE9MCxiPTAsYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHt9LGQ9ZG9jdW1lbnQuYm9keXx8e307cmV0dXJuIHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aD09Im51bWJlciI/KGE9d2luZG93LmlubmVyV2lkdGgsYj13aW5kb3cuaW5uZXJIZWlnaHQpOmMuY2xpZW50V2lkdGh8fGMuY2xpZW50SGVpZ2h0PyhhPWMuY2xpZW50V2lkdGgsYj1jLmNsaWVudEhlaWdodCk6ZC5jbGllbnRXaWR0aHx8ZC5jbGllbnRIZWlnaHQ/KGE9ZC5jbGllbnRXaWR0aCxiPWQuY2xpZW50SGVpZ2h0KTp0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTYiKSksbmV3IHRoaXMuUG9pbnQoYSxiKX0sejIyNTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPWE7d2hpbGUoYj09ITEpaWYoYyljLmlkP2MuaWQ9PSJWaWV3ZXJEaXNwbGF5Ij9iPSEwOmM9Yy5wYXJlbnROb2RlOmM9Yy5wYXJlbnROb2RlO2Vsc2UgYnJlYWs7cmV0dXJuIGJ9LHoyMzg6ZnVuY3Rpb24oYSl7dmFyIGI9YSsiPSIsYz1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt3aGlsZShlLmNoYXJBdCgwKT09IiAiKWU9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aCk7aWYoZS5pbmRleE9mKGIpPT0wKXJldHVybiBlLnN1YnN0cmluZyhiLmxlbmd0aCxlLmxlbmd0aCl9cmV0dXJuIG51bGx9LHoyNDM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zbGljZSgtMSxhLmxlbmd0aCk9PSIvIj9hLnNsaWNlKDAsYS5sZW5ndGgtMSk6YTtyZXR1cm4gYj1hLnNsaWNlKDAsMSk9PSIvIj9hLnNsaWNlKDEsYS5sZW5ndGgpOmEsYn0sejE0MDpmdW5jdGlvbihhKXtpZihaLmJyb3dzZXI9PVouYnJvd3NlcnMuSUUpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCksYz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCksZD1jK2I7YSs9Ij9zdWZmaXhUb0Jsb2NrUGF0aENhY2hpbmc9IitkfXJldHVybiBhfSx6MTcwOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYSphKmEqYStiOmMvMiooKGEtPTIpKmEqYSphKmErMikrYn0sejIzMzpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYSYmKGI9YS5zcGxpdCgiJiIpKSxifSx6MjQ5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuejE4NSgiejUwIiksYz10aGlzLnoxODUoIno0OSIpLGQ9dGhpcy56MTg1KCJ6NDgiKTtaLnNraW5QYXRoPXRoaXMuejE4NSgiejU2IiksWi5za2luTW9kZT10aGlzLnoxODUoIno1NCIpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjYiKSkpfHwoWi5pbml0aWFsWD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejI2IikpKSxpc05hTihwYXJzZUZsb2F0KHRoaXMuejE4NSgiejI3IikpKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdCh0aGlzLnoxODUoInoyNyIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoInoyOCIpKSl8fChaLmluaXRpYWxaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjgiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpfHwoWi5taW5aPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpfHwoWi5tYXhaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6ODAiKSkpfHwoWi56b29tU3BlZWQ9cGFyc2VGbG9hdCh0aGlzLnoxODUoIno4MCIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoIno0NiIpKSl8fChaLnBhblNwZWVkPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NDYiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MTgiKSkpfHwoWi5mYWRlSW5TcGVlZD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejE4IikpKSxaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KHRoaXMuejE4NSgiejY0IiksMTApLFoudG9vbGJhclBvc2l0aW9uPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NjMiKSksWi50b29sdGlwc1Zpc2libGU9dGhpcy56MTg1KCJ6NjUiKSE9IjAiLFoubmF2aWdhdG9yVmlzaWJsZT1wYXJzZUludCh0aGlzLnoxODUoIno0MyIpLDEwKSxaLm5hdmlnYXRvclc9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDQiKSwxMCksWi5uYXZpZ2F0b3JIPXBhcnNlSW50KHRoaXMuejE4NSgiejM5IiksMTApLFoubmF2aWdhdG9yTD1wYXJzZUludCh0aGlzLnoxODUoIno0MCIpLDEwKSxaLm5hdmlnYXRvclQ9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDIiKSwxMCksWi5uYXZpZ2F0b3JGaXQ9dGhpcy56MTg1KCJ6MzgiKSxaLmNsaWNrWm9vbT10aGlzLnoxODUoInoxMCIpIT0iMCIsWi5jbGlja1Bhbj10aGlzLnoxODUoIno5IikhPSIwIixaLm1vdXNlUGFuPXRoaXMuejE4NSgiejM0IikhPSIwIixaLmtleXM9dGhpcy56MTg1KCJ6MjkiKSE9IjAiLFouY29uc3RyYWluUGFuPXRoaXMuejE4NSgiejEyIikhPSIwIixaLnNsaWRlclZpc2libGU9dGhpcy56MTg1KCJ6NTgiKSE9IjAiLFouZnVsbFBhZ2VWaXNpYmxlPXRoaXMuejE4NSgiejIzIikhPSIwIixaLnByb2dyZXNzVmlzaWJsZT10aGlzLnoxODUoIno1MyIpIT0iMCIsWi5sb2dvVmlzaWJsZT10aGlzLnoxODUoInozMSIpIT0iMCIsWi5sb2dvQ3VzdG9tUGF0aD10aGlzLnoxODUoInozMCIpLFouY2FudmFzPXRoaXMuejE4NSgiejgiKSE9IjAiLFouZGVidWc9dGhpcy56MTg1KCJ6MTciKSE9IjAiO2lmKHRoaXMuaXNTdHJWYWwoYSkpZm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZz1hW2VdLGg9Zy5pbmRleE9mKCI9Iik7aWYoaD4wKXt2YXIgaT1nLnN1YnN0cmluZygwLGgpLGo9Zy5zdWJzdHJpbmcoaCsxKTtpZih0aGlzLmlzU3RyVmFsKGopKXN3aXRjaChpKXtjYXNlInpJbml0aWFsWCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLmluaXRpYWxYPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2UiekluaXRpYWxZIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6SW5pdGlhbFpvb20iOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5pbml0aWFsWj1wYXJzZUZsb2F0KGopLFouaW5pdGlhbFomJihaLmluaXRpYWxaLz0xMDApKTticmVhaztjYXNlInpNaW5ab29tIjohaXNOYU4ocGFyc2VGbG9hdChqKSkmJnBhcnNlRmxvYXQoaik+LjAxJiYoWi5taW5aPXBhcnNlRmxvYXQoaiksWi5taW5aJiYoWi5taW5aLz0xMDApKTticmVhaztjYXNlInpNYXhab29tIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubWF4Wj1wYXJzZUZsb2F0KGopLFoubWF4WiYmKFoubWF4Wi89MTAwKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9yVmlzaWJsZSI6Wi5uYXZpZ2F0b3JWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UielRvb2xiYXJWaXNpYmxlIjpaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UiekxvZ29WaXNpYmxlIjpqPT0iMCImJihaLmxvZ29WaXNpYmxlPSExKTticmVhaztjYXNlInpTbGlkZXJWaXNpYmxlIjpqPT0iMCImJihaLnNsaWRlclZpc2libGU9ITEpO2JyZWFrO2Nhc2UiekZ1bGxQYWdlVmlzaWJsZSI6aj09IjAiJiYoWi5mdWxsUGFnZVZpc2libGU9ITEpO2JyZWFrO2Nhc2UielByb2dyZXNzVmlzaWJsZSI6aj09IjAiJiYoWi5wcm9ncmVzc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielRvb2x0aXBzVmlzaWJsZSI6aj09IjAiJiYoWi50b29sdGlwc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielNraW5QYXRoIjpaLnNraW5QYXRoPWo7YnJlYWs7ZGVmYXVsdDppZihiPT1jKWFsZXJ0KGQrIiAiK2kpO2Vsc2Ugc3dpdGNoKGkpe2Nhc2Uielpvb21TcGVlZCI6Wi56b29tU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6UGFuU3BlZWQiOloucGFuU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6RmFkZUluU3BlZWQiOlouZmFkZUluU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6VG9vbGJhclBvc2l0aW9uIjpaLnRvb2xiYXJQb3NpdGlvbj1wYXJzZUludChqLDEwKTticmVhaztjYXNlInpOYXZpZ2F0b3JXaWR0aCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvclc9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9ySGVpZ2h0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9ySD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JMZWZ0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9yTD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JUb3AiOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5uYXZpZ2F0b3JUPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2Uiek5hdmlnYXRvckZpdCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvckZpdD1wYXJzZUludChqLDEwKSk7YnJlYWs7Y2FzZSJ6Q2xpY2tab29tIjpqPT0iMCImJihaLmNsaWNrWm9vbT0hMSk7YnJlYWs7Y2FzZSJ6Q2xpY2tQYW4iOmo9PSIwIiYmKFouY2xpY2tQYW49ITEpO2JyZWFrO2Nhc2Uiek1vdXNlUGFuIjpqPT0iMCImJihaLm1vdXNlUGFuPSExKTticmVhaztjYXNlInpLZXlzIjpqPT0iMCImJihaLmtleXM9ITEpO2JyZWFrO2Nhc2UiekNvbnN0cmFpblBhbiI6aj09IjAiJiYoWi5jb25zdHJhaW5QYW49ITEpO2JyZWFrO2Nhc2UiekNvcHlyaWdodFBhdGgiOlouY29weXJpZ2h0UGF0aD1qO2JyZWFrO2Nhc2UieldhdGVybWFya1BhdGgiOloud2F0ZXJtYXJrUGF0aD1qO2JyZWFrO2Nhc2UiekxvZ29DdXN0b21QYXRoIjpaLmxvZ29DdXN0b21QYXRoPWo7YnJlYWs7Y2FzZSJ6Q2FudmFzIjpqPT0iMCImJihaLmNhbnZhcz0hMSk7aWYoIVouY2FudmFzU3VwcG9ydGVkfHwhWi5jYW52YXMpWi51c2VDYW52YXM9ITE7YnJlYWs7Y2FzZSJ6RGVidWciOmo9PSIxIiYmKFouZGVidWc9ITApfX19fX0sejI0MjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MTtiPGEubGVuZ3RoOylhW2ItMV09PWFbYl0/YS5zcGxpY2UoYiwxKTpiKys7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdLGY9ITE7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aCYmZT49KGVsbXQyPWJbZ10pO2crKylpZihlbG10Mj09ZSl7Zj0hMDticmVha31mJiZjLnB1c2goYVtkXSl9cmV0dXJuIGN9LHN1YnRyYWN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT0hMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoJiZkPj0oZWxtdDI9YltmXSk7ZisrKWlmKGVsbXQyPT1kKXtlPSEwO2JyZWFrfWUmJmEuc3BsaWNlKGMtLSwxKX1yZXR1cm4gYX0sY3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MixlPWFyZ3VtZW50cy5sZW5ndGg7ZDxlO2QrKyljLnB1c2goYXJndW1lbnRzW2RdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmNvbmNhdChbXSk7Zm9yKHZhciBlPTAsZj1hcmd1bWVudHMubGVuZ3RoO2U8ZjtlKyspZC5wdXNoKGFyZ3VtZW50c1tlXSk7cmV0dXJuIGIuYXBwbHkoYSxkKX19LHoyNTU6ZnVuY3Rpb24oYSl7YWxlcnQoYSl9LGNyZWF0ZUNvbnRhaW5lckVsZW1lbnQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8pe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSk7dGhpcy5pc1N0clZhbChiKSYmKHAuaWQ9Yik7dmFyIHE9cC5zdHlsZTtyZXR1cm4gcS5kaXNwbGF5PXRoaXMuaXNTdHJWYWwoYyk/YzoiaW5saW5lLWJsb2NrIixxLnBvc2l0aW9uPXRoaXMuaXNTdHJWYWwoZCk/ZDoic3RhdGljIixxLm92ZXJmbG93PXRoaXMuaXNTdHJWYWwoZSk/ZToiaGlkZGVuIixhPT0iY2FudmFzIj8odGhpcy5pc1N0clZhbChmKSYmcC5zZXRBdHRyaWJ1dGUoIndpZHRoIixmKSx0aGlzLmlzU3RyVmFsKGcpJiZwLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixnKSk6KHRoaXMuaXNTdHJWYWwoZikmJihxLndpZHRoPWYpLHRoaXMuaXNTdHJWYWwoZyYmZykmJihxLmhlaWdodD1nKSksdGhpcy5pc1N0clZhbChoKSYmKHEubGVmdD1oKSx0aGlzLmlzU3RyVmFsKGkpJiYocS50b3A9aSkscS5ib3JkZXJTdHlsZT10aGlzLmlzU3RyVmFsKGopP2o6Im5vbmUiLHEuYm9yZGVyV2lkdGg9dGhpcy5pc1N0clZhbChrKT9rOiIwcHgiLHEuYmFja2dyb3VuZD10aGlzLmlzU3RyVmFsKGwpP2w6InRyYW5zcGFyZW50IG5vbmUiLHEubWFyZ2luPXRoaXMuaXNTdHJWYWwobSk/bToiMHB4IixxLnBhZGRpbmc9dGhpcy5pc1N0clZhbChuKT9uOiIwcHgiLHRoaXMuaXNTdHJWYWwobykmJihxLmN1cnNvcj1vKSxwfSxjcmVhdGVDZW50ZXJlZEVsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiKSxjPVtdO2MucHVzaCgnPGRpdiBzdHlsZT0iZGlzcGxheTp0YWJsZTsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7JyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCcjcG9zaXRpb246cmVsYXRpdmU7IG92ZXJmbG93OmhpZGRlbjsgdGV4dC1hbGlnbjpsZWZ0OyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246YWJzb2x1dGU7ICN0b3A6NTAlOyB3aWR0aDoxMDAlOyAnKSxjLnB1c2goImJvcmRlcjpub25lOyBtYXJnaW46MHB4OyBwYWRkaW5nOjBweDsiKSxjLnB1c2goJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246cmVsYXRpdmU7ICN0b3A6LTUwJTsgd2lkdGg6MTAwJTsgJyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCd0ZXh0LWFsaWduOmNlbnRlcjsiPjwvZGl2PjwvZGl2PjwvZGl2PicpLGIuaW5uZXJIVE1MPWMuam9pbigiIiksYj1iLmZpcnN0Q2hpbGQ7dmFyIGQ9YixlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO3doaWxlKGUubGVuZ3RoPjApZD1lWzBdLGU9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoYSksYn0sY3JlYXRlR3JhcGhpY0VsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJpbWciKSxjPW51bGw7cmV0dXJuIFouYnJvd3Nlcj09Wi5icm93c2Vycy5JRSYmWi5icm93c2VyVmVyc2lvbjw3PyhjPXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsbnVsbCwiaW5saW5lLWJsb2NrIiksYi5vbmxvYWQ9ZnVuY3Rpb24oKXtjLnN0eWxlLndpZHRoPWMuc3R5bGUud2lkdGh8fGIud2lkdGgrInB4IixjLnN0eWxlLmhlaWdodD1jLnN0eWxlLmhlaWdodHx8Yi5oZWlnaHQrInB4IixiLm9ubG9hZD1udWxsLGI9bnVsbH0sYy5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIithKyInLCBzaXppbmdNZXRob2Q9J3NjYWxlJykiKTooYz1iLGMuc3JjPWEpLGN9LHoyNTE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtPWEucGFyZW50Tm9kZS5zdHlsZTttLmNvbG9yPWIsbS5mb250RmFtaWx5PWMsbS5mb250U2l6ZT1kLG0uZm9udFNpemVBZGp1c3Q9ZSxtLmZvbnRTdHlsZT1mLG0uZm9udFN0cmV0Y2g9ZyxtLmZvbnRWYXJpYW50PWgsbS5mb250V2VpZ2h0PWksbS5saW5lSGVpZ2h0PWosbS50ZXh0QWxpZ249ayxtLnRleHREZWNvcmF0aW9uPWx9LHoxNTg6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl0cnl7Yj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGIuYXN5bmM9ITEsYi5sb2FkWE1MKGEpfWNhdGNoKGMpe3RoaXMuejI1NShjLm5hbWUrdGhpcy56MTg1KCJ6ODIiKStjLm1lc3NhZ2UpfWVsc2UgaWYod2luZG93LkRPTVBhcnNlcil0cnl7dmFyIGQ9bmV3IERPTVBhcnNlcjtiPWQucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goYyl7dGhpcy56MjU1KGMubmFtZSt0aGlzLnoxODUoIno4MiIpK2MubWVzc2FnZSl9ZWxzZSB0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTgiKSk7cmV0dXJuIGJ9LFBvaW50OmZ1bmN0aW9uKGEsYil7dGhpcy54PXR5cGVvZiBhPT0ibnVtYmVyIj9hOjAsdGhpcy55PXR5cGVvZiBiPT0ibnVtYmVyIj9iOjB9LFBvaW50M0Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMueD10eXBlb2YgYT09Im51bWJlciI/YTowLHRoaXMueT10eXBlb2YgYj09Im51bWJlciI/YjowLHRoaXMuej10eXBlb2YgYz09Im51bWJlciI/YzowfSx6MTg1OmZ1bmN0aW9uKGEpe3ZhciBiPSIiO3N3aXRjaChhKXtjYXNlIno1MCI6Yj0iRW5hYmxlIERldmVsb3BlciBwYXJhbWV0ZXJzIjticmVhaztjYXNlIno0OSI6Yj0iQ2hhbmdpbmcgVGhpcyBWaW9sYXRlcyBMaWNlbnNlIEFncmVlbWVudCI7YnJlYWs7Y2FzZSJ6NDgiOmI9IlN1cHBvcnQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIGVuYWJsZWQgb25seSBpbiB0aGUgWm9vbWlmeSBJbWFnZSBWaWV3ZXIgaW5jbHVkZWQgaW4gdGhlIFpvb21pZnkgSFRNTDUgRGV2ZWxvcGVyIGVkaXRpb246ICI7YnJlYWs7Y2FzZSJ6MjUiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NjAiOmI9IjMwMDAwIjticmVhaztjYXNlIno2MSI6Yj0iMjU2IjticmVhaztjYXNlIno1OSI6Yj0iMS4xNSI7YnJlYWs7Y2FzZSJ6NjIiOmI9IjMwMCI7YnJlYWs7Y2FzZSJ6NyI6Yj0iNiI7YnJlYWs7Y2FzZSJ6NiI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NSI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NCI6Yj0iMiI7YnJlYWs7Y2FzZSJ6MyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6NDUiOmI9IjIiO2JyZWFrO2Nhc2UiejQ2IjpiPSI1IjticmVhaztjYXNlIno0NyI6Yj0iMTAiO2JyZWFrO2Nhc2UiejgwIjpiPSI1IjticmVhaztjYXNlIno4MSI6Yj0iMC4wMiI7YnJlYWs7Y2FzZSJ6NzciOmI9IjMwIjticmVhaztjYXNlIno3OCI6Yj0iMjAwIjticmVhaztjYXNlIno3OSI6Yj0iMTAiO2JyZWFrO2Nhc2UiejEwVElFUlNLSVBUSFJFU0hPTEQiOmI9IjAxLiI7YnJlYWs7Y2FzZSJ6MjQiOmI9IjEwIjticmVhaztjYXNlInoxOCI6Yj0iNSI7YnJlYWs7Y2FzZSJ6MTkiOmI9IjAuMDY3IjticmVhaztjYXNlIno2NCI6Yj0iNCI7YnJlYWs7Y2FzZSJ6NjMiOmI9IjEiO2JyZWFrO2Nhc2UiejY1IjpiPSIxIjticmVhaztjYXNlIno0MyI6Yj0iMiI7YnJlYWs7Y2FzZSJ6NDQiOmI9IjE1MCI7YnJlYWs7Y2FzZSJ6MzkiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NDAiOmI9IjAiO2JyZWFrO2Nhc2UiejQyIjpiPSIwIjticmVhaztjYXNlInozOCI6Yj1udWxsO2JyZWFrO2Nhc2UiejM2IjpiPSIjZmZmZmZmIjticmVhaztjYXNlInozNk5PQUxQSEEiOmI9IiNmYmZhZmEiO2JyZWFrO2Nhc2UiejM1IjpiPSIwLjc1IjticmVhaztjYXNlIno0MSI6Yj0iYmx1ZSI7YnJlYWs7Y2FzZSJ6NTUiOmI9InNraW5GaWxlcy54bWwiO2JyZWFrO2Nhc2UiejU2IjpiPSJBc3NldHMvU2tpbnMvRGVmYXVsdCI7YnJlYWs7Y2FzZSJ6NTQiOmI9IjAiO2JyZWFrO2Nhc2UiejEyIjpiPSIxIjticmVhaztjYXNlIno1OCI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NTciOmI9IjEwIjticmVhaztjYXNlInoyMyI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MjIiOmI9IndoaXRlIjticmVhaztjYXNlInoyMSI6Yj0iWCI7YnJlYWs7Y2FzZSJ6MjAiOmI9Ilx0I0Y4RjhGOCI7YnJlYWs7Y2FzZSJ6NTMiOmI9IjEiO2JyZWFrO2Nhc2UiejUxIjpiPSI1MDAiO2JyZWFrO2Nhc2UiejUyIjpiPSIgIjticmVhaztjYXNlInozMSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MzAiOmI9bnVsbDticmVhaztjYXNlIno4IjpiPSIxIjticmVhaztjYXNlInoxNyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6MTYiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6MTQiOmI9IndoaXRlIjticmVhaztjYXNlInoxMyI6Yj0iQWdyZWUiO2JyZWFrO2Nhc2UiejE1IjpiPSJFeGl0IjticmVhaztjYXNlIno3MyI6Yj0iMC42IjticmVhaztjYXNlIno3NCI6Yj0iMC4zMyI7YnJlYWs7Y2FzZSJ6NzYiOmI9IjUxMiI7YnJlYWs7Y2FzZSJ6NzUiOmI9IjM4NCI7YnJlYWs7Y2FzZSJ6MjYiOmI9bnVsbDticmVhaztjYXNlInoyNyI6Yj1udWxsO2JyZWFrO2Nhc2UiejI4IjpiPW51bGw7YnJlYWs7Y2FzZSJ6MzMiOmI9bnVsbDticmVhaztjYXNlInozMiI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MTAiOmI9IjEiO2JyZWFrO2Nhc2UiejkiOmI9IjEiO2JyZWFrO2Nhc2UiejM0IjpiPSIxIjticmVhaztjYXNlInoyOSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NjciOmI9IlRoaXMgcGFuZWwgaXMgZW5hYmxlZCB1c2luZyB0aGUgSFRNTCBwYXJhbWV0ZXIgJ3pEZWJ1Zz0xJy4gSXQgY2FuIGJlIGNhbGxlZCBhcyBmb2xsb3dzOlxuXG4gICBaLlV0aWxzLnRyYWNlKCd2YWx1ZSB0byBkaXNwbGF5Jyk7ICBcblxuVGhlIGJ1dHRvbnMgYmVsb3cgZGlzcGxheSBvciBtb2RpZnkgaW1wb3J0YW50IHN0YXRlIHZhbHVlcy4gIFdlYiBkZXNpZ25lcnMgbmV3IHRvIEphdmFTY3JpcHQgd2lsbCBhbHNvIGJlbmVmaXQgZnJvbSB0aGUgY29uc29sZSwgdHJhY2UsIHByb2ZpbGluZywgYW5kIG90aGVyIGRlYnVnZ2luZyBmZWF0dXJlcyBvZiBsZWFkaW5nIGJyb3dzZXJzLiI7YnJlYWs7Y2FzZSJ6NjgiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6NjYiOmI9IndoaXRlIjticmVhaztjYXNlIno2OSI6Yj0iU2hvdyBHbG9iYWxzIjticmVhaztjYXNlIno3MiI6Yj0iVG9nZ2xlIERpc3BsYXkiO2JyZWFrO2Nhc2UiejcwIjpiPSJUb2dnbGUgQmFja2ZpbGwiO2JyZWFrO2Nhc2UiejcxIjpiPSJUb2dnbGUgQ29uc3RyYWluIFBhbiI7YnJlYWs7Y2FzZSJ6OTkiOmI9IkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdC4iO2JyZWFrO2Nhc2Uiejg3LUlNQUdFWE1MIjpiPSJFcnJvciBsb2FkaW5nIGltYWdlOiBwbGVhc2UgbWFrZSBzdXJlIGltYWdlIHBhdGggaW4gd2ViIHBhZ2UgbWF0Y2hlcyBpbWFnZSBmb2xkZXIgbG9jYXRpb24gb24gd2Vic2VydmVyLiI7YnJlYWs7Y2FzZSJ6ODctVE9PTEJBUlhNTCI6Yj0iRXJyb3IgbG9hZGluZyB0b29sYmFyOiBwbGVhc2UgdmVyaWZ5IHNraW4gZmlsZXMgYXJlIG9uIHdlYnNlcnZlciBpbiBzYW1lIGZvbGRlciBhcyB6MTIyLmpzIGZpbGUgYW5kIGFyZSBpbiBkZWZhdWx0IGZvbGRlciBzdHJ1Y3R1cmUgJ0Fzc2V0cy9Ta2lucy9EZWZhdWx0Jywgb3IgYWRkIHpTa2luUGF0aCBwYXJhbWV0ZXIgdG8gd2VicGFnZS4iO2JyZWFrO2Nhc2Uiejg3IjpiPSJFcnJvciBtYWtpbmcgbmV0d29yayByZXF1ZXN0OiBwb3NzaWJsZSBpbnZhbGlkIHBhdGggb3IgbmV0d29yayBlcnJvci4iO2JyZWFrO2Nhc2Uiejg0IjpiPSJJbWFnZSBmYWlsZWQgdG8gbG9hZDogcG9zc2libGUgaW52YWxpZCBwYXRoLCBtaXNzaW5nIGltYWdlLCBvciBuZXR3b3JrIGVycm9yLiI7YnJlYWs7Y2FzZSJ6ODkiOmI9IkVycm9yIHJlbGF0ZWQgdG8gbmV0d29yayBzZWN1cml0eTogIjticmVhaztjYXNlIno5MCI6Yj0iRXJyb3IgcmVsYXRlZCB0byBuZXR3b3JrIHN0YXR1czogIjticmVhaztjYXNlIno4MiI6Yj0iIGNvbnZlcnRpbmcgWE1MIHRleHQgdG8gWE1MIGRvYyAoRE9NUGFyc2VyKTogIjticmVhaztjYXNlIno5OCI6Yj0iQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhNTCBET00uIjticmVhaztjYXNlInoxMDAiOmI9IlhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODYiOmI9IkltYWdlIFhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODMiOmI9IiB3aGlsZSBleGVjdXRpbmcgY2FsbGJhY2s6ICI7YnJlYWs7Y2FzZSJ6ODUiOmI9IkltYWdlIHRpbWVkIG91dDogIjticmVhaztjYXNlIno4OCI6Yj0iTmF2aWdhdG9yIGltYWdlIGZhaWxlZCB0byBsb2FkOiBwb3NzaWJsZSBpbnZhbGlkIHBhdGgsIG1pc3NpbmcgaW1hZ2UsIG9yIG5ldHdvcmsgZXJyb3IuIjticmVhaztjYXNlIno5MSI6Yj0iU2tpbiBYTUwgaW52YWxpZC4iO2JyZWFrO2Nhc2UiejkyIjpiPSJUaGUgc2tpbiBYTUwgZmlsZSBoYXMgb25lIG9yIG1vcmUgZmF1bHR5IG5hbWUgbGluZXMuIjticmVhaztjYXNlIno5NyI6Yj0iV2F0ZXJtYXJrIGltYWdlIGZhaWxlZCB0byBsb2FkOiAiO2JyZWFrO2Nhc2UiejkzIjpiPSJVbmtub3duIGVsZW1lbnQgc3R5bGUgLSBubyBrbm93biBtZXRob2QgdG8gaWRlbnRpZnkuIjticmVhaztjYXNlIno5NCI6Yj0iVW5rbm93biBtb3VzZSBwb3NpdGlvbiAtIG5vIGtub3duIG1ldGhvZCB0byBjYWxjdWxhdGUuIjticmVhaztjYXNlIno5NSI6Yj0iVW5rbm93biBtb3VzZSBzY3JvbGwgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6OTYiOmI9IlVua25vd24gd2luZG93IHNpemUgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6MTA2IjpiPSJMYXVuY2ggWm9vbWlmeSBXZWJzaXRlIjticmVhaztjYXNlInoxMDciOmI9Ik1pbmltaXplIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEwNSI6Yj0iRXhwYW5kIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEyMCI6Yj0iWm9vbSBPdXQiO2JyZWFrO2Nhc2UiejExNCI6Yj0iWm9vbSBJbiBBbmQgT3V0IjticmVhaztjYXNlInoxMTkiOmI9Ilpvb20gSW4iO2JyZWFrO2Nhc2UiejEwOSI6Yj0iUGFuIExlZnQiO2JyZWFrO2Nhc2UiejExMSI6Yj0iUGFuIFVwIjticmVhaztjYXNlInoxMDgiOmI9IlBhbiBEb3duIjticmVhaztjYXNlInoxMTAiOmI9IlBhbiBSaWdodCI7YnJlYWs7Y2FzZSJ6MTEyIjpiPSJSZXNldCBJbml0aWFsIFZpZXciO2JyZWFrO2Nhc2UiejExOCI6Yj0iVG9nZ2xlIEZ1bGwgUGFnZSBWaWV3IjticmVhaztjYXNlInoxMDIiOmI9IkNhbmNlbCBGdWxsIFBhZ2UgVmlldyI7YnJlYWs7Y2FzZSJ6MTAzIjpiPSJBZ3JlZSB0byBjb3B5cmlnaHQgYW5kIHZpZXcgaW1hZ2VzIjticmVhaztjYXNlInoxMDQiOmI9IkV4aXQgYW5kIGRvIG5vdCB2aWV3IGltYWdlcyI7YnJlYWs7Y2FzZSJ6MTEzIjpiPSJUb2dnbGUgRnVsbCBQYWdlIFZpZXciO2JyZWFrO2Nhc2UiejExNyI6Yj0iVG9nZ2xlIFZpZXdwb3J0IERpc3BsYXkiO2JyZWFrO2Nhc2UiejExNSI6Yj0iVG9nZ2xlIFZpZXdwb3J0IEJhY2tmaWxsIjticmVhaztjYXNlInoxMTYiOmI9IlRvZ2dsZSBDb25zdHJhaW4gUGFuIjticmVhaztkZWZhdWx0OmI9IlVuZXhwZWN0ZWQgcmVzb3VyY2UgcmVxdWVzdCJ9cmV0dXJuIGJ9LHoyNTM6ZnVuY3Rpb24oKXt2YXIgYT0iIjthKz0iXG4iLGErPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTUlGWSBJTUFHRSBWSUVXRVIgLSBDVVJSRU5UIFZBTFVFU1xuIixhKz0iXG4iLGErPSJJTUFHRSAmIFNLSU46ICAgICIsYSs9IlouaW1hZ2VQYXRoPSIrWi5pbWFnZVBhdGgrIiwgICAiLGErPSJaLnNraW5QYXRoPSIrWi5za2luUGF0aCsiLCAgICIsYSs9Ilouc2tpbk1vZGU9IitaLnNraW5Nb2RlKyIsICAgIixhKz0iWi5pbWFnZVc9IitaLmltYWdlVysiLCAgICIsYSs9IlouaW1hZ2VIPSIrWi5pbWFnZUgrIiwgICAiLGErPSJ0aWVyQ291bnQ9IitaLlZpZXdwb3J0LnoxODYoKSsiLCAgICIsYSs9IlRJTEVfU0laRT0iK1ouVmlld3BvcnQuejE5NSgpKyJcbiIsYSs9IlxuIixhKz0iUEFHRSAmIEJST1dTRVI6ICAgICIsYSs9IloucGFnZUNvbnRhaW5lcj0iK1oucGFnZUNvbnRhaW5lcisiLCAgICIsYSs9IlouYnJvd3Nlcj0iK1ouYnJvd3NlcisiLCAgICIsYSs9IlouYnJvd3NlclZlcnNpb249IitaLmJyb3dzZXJWZXJzaW9uKyIsICAgIixhKz0iWi5jYW52YXNTdXBwb3J0ZWQ9IitaLmNhbnZhc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD0iK1ouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3JtUHJvcGVydHk9IitaLmNzc1RyYW5zZm9ybVByb3BlcnR5KyIsICAgIixhKz0iWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPSIrWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzKyIsICAgIixhKz0iWi5hbHBoYVN1cHBvcnRlZD0iK1ouYWxwaGFTdXBwb3J0ZWQrIiwgICAiLGErPSJaLnJlbmRlclF1YWxpdHk9IitaLnJlbmRlclF1YWxpdHkrIiwgICAiLGErPSJaLm1vYmlsZURldmljZT0iK1oubW9iaWxlRGV2aWNlKyJcbiIsYSs9IlxuIixhKz0iVklFV0VSIE9QVElPTlMgJiBERUZBVUxUUzogICAgIixhKz0iWi5pbml0aWFsWD0iK1ouaW5pdGlhbFgrIiwgICAiLGErPSJaLmluaXRpYWxZPSIrWi5pbml0aWFsWSsiLCAgICIsYSs9IlouaW5pdGlhbFo9IitaLmluaXRpYWxaKyIsICAgIixhKz0iWi5taW5aPSIrWi5taW5aKyIsICAgIixhKz0iWi5tYXhaPSIrWi5tYXhaKyIsICAgIixhKz0iWi5maXRaPSIrWi5maXRaKyIsICAgIixhKz0iWi56b29tU3BlZWQ9IitaLnpvb21TcGVlZCsiLCAgICIsYSs9IloucGFuU3BlZWQ9IitaLnBhblNwZWVkKyIsICAgIixhKz0iWi5mYWRlSW5TcGVlZD0iK1ouZmFkZUluU3BlZWQrIiwgICAiLGErPSJaLnRvb2xiYXJWaXNpYmxlPSIrWi50b29sYmFyVmlzaWJsZSsiLCAgICIsYSs9IloudG9vbGJhclc9IitaLnRvb2xiYXJXKyIsICAgIixhKz0iWi50b29sYmFyQ3VycmVudFc9IitaLnRvb2xiYXJDdXJyZW50VysiLCAgICIsYSs9IloudG9vbGJhckg9IitaLnRvb2xiYXJIKyIsICAgIixhKz0iWi50b29sYmFyUG9zaXRpb249IitaLnRvb2xiYXJQb3NpdGlvbisiLCAgICIsYSs9IloudG9vbHRpcHNWaXNpYmxlPSIrWi50b29sdGlwc1Zpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclZpc2libGU9IitaLm5hdmlnYXRvclZpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclc9IitaLm5hdmlnYXRvclcrIiwgICAiLGErPSJaLm5hdmlnYXRvckg9IitaLm5hdmlnYXRvckgrIiwgICAiLGErPSJaLm5hdmlnYXRvckw9IitaLm5hdmlnYXRvckwrIiwgICAiLGErPSJaLm5hdmlnYXRvclQ9IitaLm5hdmlnYXRvclQrIiwgICAiLGErPSJaLm5hdmlnYXRvckZpdD0iK1oubmF2aWdhdG9yRml0KyIsICAgIixhKz0iWi5jbGlja1pvb209IitaLmNsaWNrWm9vbSsiLCAgICIsYSs9IlouY2xpY2tQYW49IitaLmNsaWNrUGFuKyIsICAgIixhKz0iWi5tb3VzZVBhbj0iK1oubW91c2VQYW4rIiwgICAiLGErPSJaLmtleXM9IitaLmtleXMrIiwgICAiLGErPSJaLmNvbnN0cmFpblBhbj0iK1ouY29uc3RyYWluUGFuKyIsICAgIixhKz0iV2F0ZXJtYXJrIGFscGhhID0gIitaLlV0aWxzLnoxODUoIno3MyIpKyIsICAgIixhKz0iWi53YXRlcm1hcmtQYXRoPSIrWi53YXRlcm1hcmtQYXRoKyIsICAgIixhKz0iWi5jb3B5cmlnaHRQYXRoPSIrWi5jb3B5cmlnaHRQYXRoKyIsICAgIixhKz0iWi5zbGlkZXJWaXNpYmxlPSIrWi5zbGlkZXJWaXNpYmxlKyIsICAgIixhKz0iWi5mdWxsUGFnZVZpc2libGU9IitaLmZ1bGxQYWdlVmlzaWJsZSsiLCAgICIsYSs9IloucHJvZ3Jlc3NWaXNpYmxlPSIrWi5wcm9ncmVzc1Zpc2libGUrIiwgICAiLGErPSJaLmxvZ29WaXNpYmxlPSIrWi5sb2dvVmlzaWJsZSsiLCAgICIsYSs9IloubG9nb0N1c3RvbVBhdGg9IitaLmxvZ29DdXN0b21QYXRoKyIsICAgIixhKz0iWi5jYW52YXM9IitaLmNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIFZBTFVFUzogICAgIixhKz0iXG4iLGErPSJkaXNwbGF5Vz0iK1ouVmlld3BvcnQuejIwMSgpKyIsICAgIixhKz0iZGlzcGxheUg9IitaLlZpZXdwb3J0LnoxNzkoKSsiLCAgICIsYSs9InRpZXJDdXJyZW50PSIrWi5WaWV3cG9ydC56MTg3KCkrIiwgICAiLGErPSJ0aWVyU2NhbGU9IitaLlZpZXdwb3J0LnoxODkoKSsiLCAgICIsYSs9IlRJRVJTX01BWF9TQ0FMRV9VUD0iK1ouVmlld3BvcnQuejE5NCgpKyIsICAgIixhKz0iVElFUlNfTUFYX1NDQUxFX0RPV049IitaLlZpZXdwb3J0LnoxOTMoKSsiLCAgICIsYSs9IlRJTEVTX01BWF9DQUNIRT0iK1ouVmlld3BvcnQuejE5NygpKyIsICAgIixhKz0iWi51c2VDYW52YXM9IitaLnVzZUNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIExJU1RTOiAgICAiLGErPSJ0aWVyV3M9IitaLlZpZXdwb3J0LnoxOTIoKSsiLCAgICIsYSs9InRpZXJIcz0iK1ouVmlld3BvcnQuejE4OCgpKyIsICAgIixhKz0idGllclRpbGVDb3VudHM9IitaLlZpZXdwb3J0LnoxOTEoKSsiLCAgICIsYSs9InRpbGVzTG9hZGluZ05hbWVzPSIrWi5WaWV3cG9ydC56MTk2KCkrIlxuIixhKz0iXG4iLGFsZXJ0KGEpfSx6MjU2OmZ1bmN0aW9uKCl7Wi5UcmFjZURpc3BsYXk/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT09ImlubGluZS1ibG9jayI/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0ibm9uZSI6Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0iaW5saW5lLWJsb2NrIjpaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpfSxjb25maWd1cmVUcmFjZURpc3BsYXk6ZnVuY3Rpb24oKXt2YXIgYT1aLnZpZXdlclcvMyxiPVoudmlld2VySC8zKzQ1LGM9MTAsZD1wYXJzZUZsb2F0KFoudmlld2VySCkvMyxlPXRoaXMuejE4NSgiejY4Iik7Wi5UcmFjZURpc3BsYXk9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUcmFjZURpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsYSsicHgiLGIrInB4IixjKyJweCIsZCsicHgiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMTBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRyYWNlRGlzcGxheSksWi50cmFjZXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTt2YXIgZj1aLnRyYWNlcy5zdHlsZTtmLndpZHRoPWEtMTUrInB4IixmLmhlaWdodD1iLTYwKyJweCIsZi5mb250RmFtaWx5PSJ2ZXJkYW5hIixmLmZvbnRTaXplPSIxMHB4IixmLmJvcmRlcj0ic29saWQiLGYuYm9yZGVyV2lkdGg9IjFweCIsZi5wYWRkaW5nPSI1cHgiLGYucmVzaXplPSJub25lIixaLnRyYWNlcy52YWx1ZT0iVHJhY2UgVmFsdWVzXG4iLFouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKFoudHJhY2VzKTt2YXIgZz01OCxoPTQyLGk9MjAsaj1iLWgvMi0xMCxrPTEwLGw9dGhpcy56MTg1KCJ6NjYiKSxtPXRoaXMuejE4NSgiejY5Iiksbj1uZXcgdGhpcy5CdXR0b24oImJ1dHRvblNob3dHbG9iYWxzIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLHRoaXMuejI1MywiejExMyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChuLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MiIpLG89bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVEaXNwbGF5IixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQuejI3MiwiejExNyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChvLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MCIpLHA9bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVCYWNrZmlsbCIsbSxudWxsLG51bGwsbnVsbCxudWxsLGcrInB4IixoKyJweCIsaSsicHgiLGorInB4IiwibW91c2Vkb3duIixaLlZpZXdwb3J0LnoyNzEsInoxMTUiLCJzb2xpZCIsIjFweCIsbCwiMHB4IiwiMHB4Iik7Wi5UcmFjZURpc3BsYXkuYXBwZW5kQ2hpbGQocC5lbG10KSxpKz1nK2ssZys9MTI7dmFyIG09dGhpcy56MTg1KCJ6NzEiKSxxPW5ldyB0aGlzLkJ1dHRvbigiYnV0dG9uVG9nZ2xlQ29uc3RyYWluUGFuIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQudG9nZ2xlQ29uc3RyYWluUGFuLCJ6MTE2Iiwic29saWQiLCIxcHgiLGwsIjBweCIsIjBweCIpO1ouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKHEuZWxtdCl9LHRyYWNlOmZ1bmN0aW9uKGEpe1ouVHJhY2VEaXNwbGF5fHxaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpLFoudHJhY2VzJiYoWi50cmFjZXMudmFsdWUrPSJcbiIrYSsiXG4iKX19"></script>
FIND j=5876 line=
FIND j=5877 line= <style type="text/css"> #myContainer { width: 900px; height: 550px } </style>
FIND j=5878 line= <script id="script_zm_mycontainer" type="text/javascript">
FIND j=5879 line= var zmid = "";
FIND j=5880 line= var zmid_default = "./zm/komap";
FIND j=5881 line= var zmid_default = "./zm/hrc2011";
FIND j=5882 line= var zmid_default = "./zm/zm_nasa/Curiosity-Murray-Buttes";
FIND j=5883 line= var zmid=url.search.replace('?zmid=','' );
FIND j=5884 line= if( zmid == "" ) { zmid = zmid_default; }
FIND j=5885 line= Z.showImage("myContainer", zmid );
FIND j=5886 line=
FIND j=5887 line=// var zmid= "./zm/zm_nasa/Curiosity-Murray-Buttes";
FIND j=5888 line=// Z.showImage("myContainer", "./zm/Curiosity-Murray-Buttes" );
FIND j=5889 line=
FIND j=5890 line=// document.write( "BUGS_90: url.search="+url.search );
FIND j=5891 line=// document.write( "BUGS_92: zmid="+zmid );
FIND j=5892 line=
FIND j=5893 line=// err Z.showImage("myContainer", '"'+zmid +'"' );
FIND j=5894 line=// alert( zmid );
FIND j=5895 line=// zmid = zmid_default;
FIND j=5896 line=// zmid = getParameterByName('zmid');
FIND j=5897 line=// if( zmid == "" ) { zmid = zmid_default; }
FIND j=5898 line=// alert( "getParameterByName(zmid)="+zmid );
FIND j=5899 line=// Z.showImage("myContainer", zmid );
FIND j=5900 line=// Z.showImage("myContainer", + zmid );
FIND j=5901 line=// Z.showImage("myContainer", "./zm/hrc2011");
FIND j=5902 line=// Z.showImage("myContainer", "./zm/komap");
FIND j=5903 line=// Z.showImage("myContainer2", "./zm/nasa");
FIND j=5904 line=// Z.showImage("myContainer", "./zm/Curiosity-Murray-Buttes");
FIND j=5905 line=// Z.showImage("myContainer", "./zm/hrc2011");
FIND j=5906 line= </script>
FIND j=5907 line=
FIND j=5908 line=
FIND j=5909 line= <script id="script_url" >
FIND j=5910 line=// function getParameterByName(name, url) {
FIND j=5911 line=// if (!url) url = window.location.href;
FIND j=5912 line=// name = name.replace(/[\[\]]/g, "\\$&");
FIND j=5913 line=// var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
FIND j=5914 line=// results = regex.exec(url);
FIND j=5915 line=// if (!results) return null;
FIND j=5916 line=// if (!results[2]) return '';
FIND j=5917 line=// return decodeURIComponent(results[2].replace(/\+/g, " "));
FIND j=5918 line=// }
FIND j=5919 line=//
FIND j=5920 line=// query string: ?foo=lorem&bar=&baz
FIND j=5921 line=// http://ko0.us/index_zm.html?zm=./zm/komap
FIND j=5922 line=// var foo = getParameterByName('foo'); // "lorem"
FIND j=5923 line=// var bar = getParameterByName('bar'); // "" (present with empty value)
FIND j=5924 line=// var baz = getParameterByName('baz'); // "" (present with no value)
FIND j=5925 line=// var qux = getParameterByName('qux'); // null (absent)
FIND j=5926 line=// var zmid = "./zm/komap";
FIND j=5927 line=// var zmid = getParameterByName('zmid');
FIND j=5928 line=// zmid = params.get('zmid');
FIND j=5929 line=// let params = new URL('https://ko0.us/index_zm?zmid=./zm/komap&bar=2').searchParams;
FIND j=5930 line=// zmid = params.get('zmid'); // "1"
FIND j=5931 line=// var foo= params.get('bar'); // "2"
FIND j=5932 line=// var bar= params.get('bar'); // "2"
FIND j=5933 line=// alert( "params.get(zmid)="+zmid+" foo="+foo+" bar="+bar );
FIND j=5934 line=// var first = getUrlVars()["zmid"];
FIND j=5935 line=// var second = getUrlVars()["foo"];
FIND j=5936 line=// var third = getUrlVars()["bar"];
FIND j=5937 line=// alert(first);
FIND j=5938 line=// alert(second);
FIND j=5939 line=// alert(third);
FIND j=5940 line=
FIND j=5941 line= </script>
FIND j=5942 line=
FIND j=5943 line=
FIND j=5944 line=
FIND j=5945 line= </head>
FIND j=5946 line=<body>
FIND j=5947 line= <a href=index_zm.html target=_blank>
FIND j=5948 line= <img name="index_zm_png" height=50 src="./imgs/btn/koeye.png">
FIND j=5949 line= </a>
FIND j=5950 line= <div id="div_zm">
FIND j=5951 line= <script name="script_zmid_title">
FIND j=5952 line= document.write( "<h1>"+url.search.replace('?zmid=','') + "</h1>" );
FIND j=5953 line= </script>
FIND j=5954 line= <div align="center"><br>
FIND j=5955 line= <table width="100" border="0" align="center" cellpadding="1" cellspacing="0" bgcolor="#000000" >
FIND j=5956 line= <tr>
FIND j=5957 line= <td>
FIND j=5958 line= <table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
FIND j=5959 line= <tr>
FIND j=5960 line= <td>
FIND j=5961 line= <div id="myContainer"></div>
FIND j=5962 line=<!-- <div id="./zm/komap"></div>
-->
FIND j=5963 line= </td>
FIND j=5964 line= </tr>
FIND j=5965 line= </table>
FIND j=5966 line= </td>
FIND j=5967 line= </tr>
FIND j=5968 line= </table>
FIND j=5969 line= </div>
FIND j=5970 line= </div>
FIND j=5971 line=
FIND j=5972 line= <script id="b64_zm_js" >
FIND j=5973 line= var b64_zm_js = new Array();
FIND j=5974 line= b64_zm_js[0] = "data:/text/plain;base64,KGZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30uY2FsbCgpO2EuWj17fX0pKCksWi5zaG93SW1hZ2U9ZnVuY3Rpb24oYSxiLGMpe1ouVXRpbHMuejEyOCgpLFouVXRpbHMuejEyNygpLFouVXRpbHMuejEyNigpLFouVXRpbHMuejE2MygpLFoucGFnZUNvbnRhaW5lcklEPWEsWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGIpLFoucGFyYW1ldGVycz1aLlV0aWxzLnoyMzMoYyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJET01Db250ZW50TG9hZGVkIixaLmluaXRpYWxpemUpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csImxvYWQiLFouaW5pdGlhbGl6ZSl9LFouaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2FyZ3VtZW50cy5jYWxsZWUuZG9uZXx8KGFyZ3VtZW50cy5jYWxsZWUuZG9uZT0hMCxaLlV0aWxzLnoxNjQoKSxaLlV0aWxzLnoyNDkoWi5wYXJhbWV0ZXJzKSxaLlZpZXdlcj1uZXcgWi56MTIyLFouVXRpbHMuaXNTdHJWYWwoWi5jb3B5cmlnaHRQYXRoKT9aLlV0aWxzLmVuZm9yY2VDb3B5cmlnaHQoKTpaLlZpZXdlci56MTQ5KCksWi5kZWJ1ZyYmWi5VdGlscy50cmFjZShaLlV0aWxzLnoxODUoIno2NyIpKSl9LFouejEyMj1mdW5jdGlvbigpe1ouVmlld2VyRGlzcGxheT1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIlZpZXdlckRpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJyZWxhdGl2ZSIsImhpZGRlbiIsIjEwMCUiLCIxMDAlIiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJwb2ludGVyIiksWi5wYWdlQ29udGFpbmVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFoucGFnZUNvbnRhaW5lcklEKTt2YXIgYT1aLlV0aWxzLnoxNzYoWi5wYWdlQ29udGFpbmVyKTtaLnZpZXdlclc9cGFyc2VGbG9hdChhLndpZHRoKSxaLnZpZXdlckg9cGFyc2VGbG9hdChhLmhlaWdodCksaXNOYU4oWi52aWV3ZXJXKSYmKFoudmlld2VyVz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKFoudmlld2VySCkmJihaLnZpZXdlckg9Wi5WaWV3ZXJEaXNwbGF5LmNsaWVudEhlaWdodCksWi5wYWdlQ29udGFpbmVyLmlubmVySFRNTD0iIixaLnBhZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQoWi5WaWV3ZXJEaXNwbGF5KSx0aGlzLnoxNDk9ZnVuY3Rpb24oKXtaLlZpZXdwb3J0PW5ldyBaLnoxMjV9LHRoaXMuejE0OD1mdW5jdGlvbigpe1oudG9vbGJhclZpc2libGU+MCYmKFouVG9vbGJhcj1uZXcgWi56MTI0KFouVmlld3BvcnQpKSxaLm5hdmlnYXRvclZpc2libGU+MCYmKFouTmF2aWdhdG9yPW5ldyBaLnoxMjMoWi5WaWV3cG9ydCkpLFouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56Mjc3KCl9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSl7Wi52aWV3ZXJXPWEsWi52aWV3ZXJIPWIsWi5WaWV3ZXJEaXNwbGF5LnN0eWxlLndpZHRoPWErInB4IixaLlZpZXdlckRpc3BsYXkuc3R5bGUuaGVpZ2h0PWIrInB4IixaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSYmWi5WaWV3cG9ydC5zZXRTaXplQW5kUG9zaXRpb24oYSxiLGMsZCk7dmFyIGY9Wi50b29sYmFyUG9zaXRpb249PTE/Yi1aLnRvb2xiYXJIOjA7Wi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmKFouVG9vbGJhci5zZXRTaXplQW5kUG9zaXRpb24oYSxudWxsLG51bGwsZiksWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMCkpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5OYXZpZ2F0b3IuejE4MCgpJiYoWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKG51bGwsbnVsbCxjLGQsWi5uYXZpZ2F0b3JGaXQpLFoubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSksZSYmWi5WaWV3cG9ydC56Mjc0KCEwKX0sdGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7Wi5WaWV3cG9ydC56MjkzQWxsU3RvcCghMCksWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGEpO3ZhciBiPW5ldyBaLnoxMDEsYz1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi8iKyJJbWFnZVByb3BlcnRpZXMueG1sIik7Yi5sb2FkWE1MKGMpfX0sWi56MTI1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2QoKXt6PTEsQT0wLEI9MCxGPVtdLEc9W10sSD1bXSxJPVtdLEo9W10sSz1bXSxMPVtdLE09W10sTj1bXSxPPVtdLFA9W10sUT1bXSxSPTB9ZnVuY3Rpb24gY2UoKXtyZXR1cm4gYn1mdW5jdGlvbiBjZihhKXtiPWF9ZnVuY3Rpb24gY2coKXtoPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwidmlld3BvcnRDb250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChoKSxpPWgsaz1pLnN0eWxlLGw9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydEJhY2tmaWxsRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZChsKSxtPWwsbj1tLnN0eWxlLHA9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydERpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLGguYXBwZW5kQ2hpbGQocCkscT1wLHI9cS5zdHlsZSxaLlV0aWxzLmlzU3RyVmFsKFoud2F0ZXJtYXJrUGF0aCkmJih0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2F0ZXJtYXJrRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh0KSx1PXQsdj11LnN0eWxlKSxaLlV0aWxzLmlzU3RyVmFsKFouaG90c3BvdFBhdGgpJiYodz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsImhvdHNwb3RzRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh3KSx4PXcseT14LnN0eWxlKSxaLnVzZUNhbnZhcz8obz1tLmdldENvbnRleHQoIjJkIikscz1xLmdldENvbnRleHQoIjJkIikpOihtLmlubmVySFRNTD0iIixxLmlubmVySFRNTD0iIiksdSYmKHUuaW5uZXJIVE1MPSIiKSx4JiYoeC5pbm5lckhUTUw9IiIpfWZ1bmN0aW9uIGNoKGEsYixjLGQpe2N8fChjPTApLGR8fChkPTApLFk9YSwkPWIsYmI9WSpYLGJjPSQqWCxiZD1iYi8yLGJlPWJjLzIsYmY9LSgoYmItWSkvMikrYyxiZz0oYmItWSkvMitjLGJoPS0oKGJjLSQpLzIpK2QsYmk9KGJjLSQpLzIrZCxpLndpZHRoPWJiLGkuaGVpZ2h0PWJjLGsud2lkdGg9YmIrInB4IixrLmhlaWdodD1iYysicHgiLGsubGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIscS53aWR0aD1iYixxLmhlaWdodD1iYyx1JiYodS53aWR0aD1iYix1LmhlaWdodD1iYyx2LndpZHRoPWJiKyJweCIsdi5oZWlnaHQ9YmMrInB4IiksWi51c2VDYW52YXMmJihzLnRyYW5zbGF0ZShiZCxiZSkscy5zYXZlKCkpfWZ1bmN0aW9uIGNpKCl7dmFyIGE9Wi5pbWFnZVcsYj1aLmltYWdlSDt3aGlsZShhPmN8fGI+YylhPWEvMixiPWIvMix6Kys7YT1aLmltYWdlVyxiPVouaW1hZ2VIO2Zvcih2YXIgZD16LTE7ZD49MDtkLS0pSFtkXT1hLElbZF09YixKW2RdPU1hdGguY2VpbChIW2RdL2MpLEtbZF09TWF0aC5jZWlsKElbZF0vYyksTFtkXT1KW2RdKktbZF0sYT1hLzIsYj1iLzJ9ZnVuY3Rpb24gY2ooKXtaLmluaXRpYWxYfHwoWi5pbml0aWFsWD1aLmltYWdlVy8yKSxaLmluaXRpYWxZfHwoWi5pbml0aWFsWT1aLmltYWdlSC8yKTt2YXIgYT1jUigpO1ouZml0WiYmWi5maXRaIT1hJiYoWi5pbml0aWFsWj09Wi5maXRaJiYoWi5pbml0aWFsWj1udWxsKSxaLm1pblo9PVouZml0WiYmKFoubWluWj1udWxsKSxaLm1heFo9PVouZml0WiYmKFoubWF4Wj1udWxsKSxaLmZpdFo9bnVsbCksWi5maXRafHwoWi5maXRaPWEpLFouaW5pdGlhbFp8fChaLmluaXRpYWxaPVouZml0WiksWi5taW5afHwoWi5taW5aPVouZml0WiksWi5tYXhafHwoWi5tYXhaPVouZml0WiksWi5pbml0aWFsWjxaLm1pblomJihaLmluaXRpYWxaPVoubWluWiksWi5pbml0aWFsWj5aLm1heFomJihaLmluaXRpYWxaPVoubWF4Wil9ZnVuY3Rpb24gY2soKXtjbChXKSx6PlQmJihjbChWKSx6PlMmJmNsKFUpKSxHLnNvcnQoKSxHPVouVXRpbHMuejI0MihHKSxjcyhHLGNKLDApfWZ1bmN0aW9uIGNsKGEpe3ZhciBiPUpbYV0tMSxjPUtbYV0tMTtmb3IodmFyIGQ9MDtkPD1jO2QrKylmb3IodmFyIGU9MDtlPD1iO2UrKylHLnB1c2goYSsiLSIrZSsiLSIrZCl9ZnVuY3Rpb24gY20oYSxiKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKSxkPWJmLXBhcnNlRmxvYXQoay5sZWZ0KSxlPWJoLXBhcnNlRmxvYXQoay50b3ApO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsWi5pbWFnZVg9Wi5pbWFnZVgrZC9aLmltYWdlWixaLmltYWdlWT1aLmltYWdlWStlL1ouaW1hZ2VaLGNyKG0sQixGLCExLCExKSxjcihxLEEsTywhMSwhMSksY1koKTt2YXIgZj1jdygpO2E+MD9mLnJpZ2h0PWYubGVmdDphPDAmJihmLmxlZnQ9Zi5yaWdodCksYj4wP2YuYm90dG9tPWYudG9wOmI8MCYmKGYudG9wPWYuYm90dG9tKTtmb3IodmFyIGc9Zi50b3A7Zzw9Zi5ib3R0b207ZysrKWZvcih2YXIgaD1mLmxlZnQ7aDw9Zi5yaWdodDtoKyspUS5wdXNoKEErIi0iK2grIi0iK2cpO3ZhciBpPVEubGVuZ3RoO2Zvcih2YXIgaj0wO2o8aTtqKyspe3ZhciBsPVFbal07aWYobCl7dmFyIG49bmV3IGNHKGwpO2NJKG4sYyxjSyl9fWk+MzAmJlEuc3BsaWNlKGktMzAsMzApfWZ1bmN0aW9uIGNuKCl7dmFyIGE9ITE7cGFyc2VGbG9hdChyLndpZHRoKSE9cS53aWR0aCYmKFoudXNlQ2FudmFzJiYoci53aWR0aD1xLndpZHRoKyJweCIsci5oZWlnaHQ9cS5oZWlnaHQrInB4IixyLmxlZnQ9IjBweCIsci50b3A9IjBweCIscy5yZXN0b3JlKCkscy5zYXZlKCkscy5zY2FsZShDLEMpKSxhPSEwKTtpZihwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymgpe3ZhciBiPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixjPXBhcnNlRmxvYXQoay50b3ApLWJoO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsYmw9cGFyc2VGbG9hdChuLmxlZnQpK2IsYm09cGFyc2VGbG9hdChuLnRvcCkrYyxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiO3ZhciBkPWNCKEEsQyk7Wi5pbWFnZVg9Wi5pbWFnZVgtYi9kLFouaW1hZ2VZPVouaW1hZ2VZLWMvZCxhPSEwfWEmJihjcihxLEEsTywhMCwhMSksY1koKSl9ZnVuY3Rpb24gY28oKXtDIT1EJiYoWi5pbWFnZVo9YnopLFouaW1hZ2VaPFoubWluWiYmKFouaW1hZ2VaPVoubWluWik7dmFyIGE9ZCxiPXo7d2hpbGUoYS8yPj1aLmltYWdlWiliLS0sYS89MjtiPWItMTwwPzA6Yi0xO3ZhciBjPWNDKGIsWi5pbWFnZVopO2lmKGIhPUF8fGMhPUMpWi51c2VDYW52YXMmJihzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLnNjYWxlKGMsYykpLEE9YixDPWM7RD1DfWZ1bmN0aW9uIGNwKCl7Qj1BPlM/VTpBPlQ/VjpXLEU9Y0MoQixaLmltYWdlWiksdGllckJhY2tmaWxsVz1IW0JdLHRpZXJCYWNrZmlsbEg9SVtCXSxtLndpZHRoPXRpZXJCYWNrZmlsbFcsbS5oZWlnaHQ9dGllckJhY2tmaWxsSDt2YXIgYT10aWVyQmFja2ZpbGxXKkUsYj10aWVyQmFja2ZpbGxIKkUsYz1aLmltYWdlWCpaLmltYWdlWixkPVouaW1hZ2VZKlouaW1hZ2VaO2JqPWEsYms9YixibD1iZC1jLGJtPWJlLWQsWi51c2VDYW52YXMmJihuLndpZHRoPWJqKyJweCIsbi5oZWlnaHQ9YmsrInB4Iiksbi5sZWZ0PWJsKyJweCIsbi50b3A9Ym0rInB4In1mdW5jdGlvbiBjcSgpe3ZhciBhPWN3KCk7Zm9yKHZhciBiPWEudG9wLGM9YS5ib3R0b207Yjw9YztiKyspZm9yKHZhciBkPWEubGVmdCxlPWEucmlnaHQ7ZDw9ZTtkKyspTi5wdXNoKEErIi0iK2QrIi0iK2IpO1Auc29ydCgpLE4uc29ydCgpLFA9Wi5VdGlscy56MjQyKFApLE49Wi5VdGlscy56MjQyKE4pO3ZhciBmPVouVXRpbHMuaW50ZXJzZWN0KE4sUCk7Tj1aLlV0aWxzLnN1YnRyYWN0KE4sUCksUj10aWxlc0xvYWRpbmdOYW1lc0xlbmd0aD1OLmxlbmd0aCxaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpJiZaLlRvb2xiYXIuc2hvd1Byb2dyZXNzKFIsdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGgpLFA9Wi5VdGlscy5zdWJ0cmFjdChQLGYpLFA9UC5jb25jYXQoZiksdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGghPTAmJihNPVtdKX1mdW5jdGlvbiBjcihhLGIsYyxkLGUpe2V8fGN0KGEpO2lmKGQpe3ZhciBmPU1hdGguZmxvb3IoYy5sZW5ndGgvMik7Zm9yKHZhciBnPWYsaD1jLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1jW2ddO2kmJmkudD09YiYmY00oYSxiLGkpO2lmKGMubGVuZ3RoLWctMSE9Zyl7dmFyIGk9Y1tjLmxlbmd0aC1nLTFdO2kmJmkudD09YiYmY00oYSxiLGkpfX19ZWxzZSBmb3IodmFyIGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspe3ZhciBpPWNbZ107aSYmaS50PT1iJiZjTShhLGIsaSl9fWZ1bmN0aW9uIGNzKGEsYixjKXtpZihhLmxlbmd0aD4wKXt2YXIgZD0obmV3IERhdGUpLmdldFRpbWUoKTtpZihjKXt2YXIgZT1NYXRoLmZsb29yKGEubGVuZ3RoLzIpO2Zvcih2YXIgZj1lLGc9YS5sZW5ndGg7ZjxnO2YrKyl7dmFyIGg9YVtmXTtpZihoKXt2YXIgaT1uZXcgY0coaCk7Y0koaSxkLGIpfWlmKGEubGVuZ3RoLWYtMSE9Zil7dmFyIGg9YVthLmxlbmd0aC1mLTFdO2lmKGgpe3ZhciBpPW5ldyBjRyhoKTtjSShpLGQsYil9fX19ZWxzZSBmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWFbZl07aWYoaCl7dmFyIGk9bmV3IGNHKGgpO2NJKGksZCxiKX19fX1mdW5jdGlvbiBjdChhKXtpZihhKWlmKFoudXNlQ2FudmFzJiZhLnRhZ05hbWU9PSJDQU5WQVMiKXt2YXIgYj1hLmdldENvbnRleHQoIjJkIik7Yi5zYXZlKCksYi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGIuY2xlYXJSZWN0KDAsMCxiLmNhbnZhcy53aWR0aCxiLmNhbnZhcy5oZWlnaHQpLGIucmVzdG9yZSgpfWVsc2UgaWYoYS5oYXNDaGlsZE5vZGVzKCkpd2hpbGUoYS5jaGlsZE5vZGVzLmxlbmd0aD49MSlhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY3UoKXtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXt2YXIgYT1jQihBLEMpO1ouVG9vbGJhci56MjY2KGEpfX1mdW5jdGlvbiBjdigpe1ouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56MTgwKCkmJlouTmF2aWdhdG9yLnoyNjgoKX1mdW5jdGlvbiBjdygpe3JldHVybiBuZXcgY3ooY3goKSxBKX1mdW5jdGlvbiBjeCgpe3ZhciBhPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixiPXBhcnNlRmxvYXQoay50b3ApLWJoO2lmKFoudXNlQ2FudmFzKXt2YXIgYz1wYXJzZUZsb2F0KGsud2lkdGgpL2kud2lkdGg7YS89YyxiLz1jfXZhciBkPWNCKEEsQyk7cmV0dXJuIGEhPTAmJihhLz1kKSxiIT0wJiYoYi89ZCksbmV3IGNBKFouaW1hZ2VYLWEsWi5pbWFnZVktYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsZCl9ZnVuY3Rpb24gY3koKXt2YXIgYT1wYXJzZUZsb2F0KGsubGVmdCktYmYsYj1wYXJzZUZsb2F0KGsudG9wKS1iaDtpZihaLnVzZUNhbnZhcyl7dmFyIGM9cGFyc2VGbG9hdChrLndpZHRoKS9pLndpZHRoO2EvPWMsYi89Y312YXIgZD1jQihBLEMpO3JldHVybiBhIT0wJiYoYS89ZCksYiE9MCYmKGIvPWQpLG5ldyBjQShaLmltYWdlWC1hLFouaW1hZ2VZLWIsLShiYi8yKSxiYi8yLC0oYmMvMiksYmMvMixkKX1mdW5jdGlvbiBjeihhLGIpe3ZhciBkPWNCKGIsMSksZT1NYXRoLmZsb29yKGEubGVmdCpkL2MpLGY9TWF0aC5mbG9vcihhLnJpZ2h0KmQvYyksZz1NYXRoLmZsb29yKGEudG9wKmQvYyksaD1NYXRoLmZsb29yKGEuYm90dG9tKmQvYyk7ZTwwJiYoZT0wKSxmPkpbQV0tMSYmKGY9SltBXS0xKSxnPDAmJihnPTApLGg+S1tBXS0xJiYoaD1LW0FdLTEpLHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9Zix0aGlzLnRvcD1nLHRoaXMuYm90dG9tPWh9ZnVuY3Rpb24gY0EoYSxiLGMsZCxlLGYsZyl7dGhpcy5sZWZ0PWErYy9nLHRoaXMucmlnaHQ9YStkL2csdGhpcy50b3A9YitlL2csdGhpcy5ib3R0b209YitmL2d9ZnVuY3Rpb24gY0IoYSxiKXt2YXIgYz1iKihIW2FdL1ouaW1hZ2VXKTtyZXR1cm4gY31mdW5jdGlvbiBjQyhhLGIpe3ZhciBjPWIvKEhbYV0vWi5pbWFnZVcpO3JldHVybiBjfWZ1bmN0aW9uIGNEKGEsYil7dmFyIGM9YS1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS54LGQ9Yi1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS55O3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChjLGQpfWZ1bmN0aW9uIGNFKGEsYil7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpK2JkLGQ9cGFyc2VGbG9hdChrLnRvcCkrYmUsZT1hLWMsZj1iLWQsZz1lL1ouaW1hZ2VaLGg9Zi9aLmltYWdlWixpPVouaW1hZ2VYK2csaj1aLmltYWdlWStoO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNGKGEsYil7dmFyIGM9Wi5pbWFnZVgtYSxkPVouaW1hZ2VZLWIsZT1jKlouaW1hZ2VaLGY9ZCpaLmltYWdlWixnPXBhcnNlRmxvYXQoay5sZWZ0KStiZCxoPXBhcnNlRmxvYXQoay50b3ApK2JlLGk9Zy1lLGo9aC1mO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNHKGEpe3RoaXMubmFtZT1hLHRoaXMudD1wYXJzZUludChhLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLSIpKSwxMCksdGhpcy5jPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEuaW5kZXhPZigiLSIpKzEsYS5sYXN0SW5kZXhPZigiLSIpKSwxMCksdGhpcy5yPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEubGFzdEluZGV4T2YoIi0iKSsxKSwxMCksdGhpcy54PU1hdGguZmxvb3IodGhpcy5jKmMpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMucipjKSx0aGlzLmltYWdlPW51bGwsdGhpcy5hbHBoYT0wLHRoaXMudXJsPVouVXRpbHMuejE0MChjSCh0aGlzLnQsdGhpcy5jLHRoaXMucix0aGlzLm5hbWUpKSx0aGlzLmVsbXQ9bnVsbCx0aGlzLnN0eWxlPW51bGx9ZnVuY3Rpb24gY0goYSxiLGQsZSl7dmFyIGY9ZCpKW2FdK2I7Zm9yKHZhciBnPTA7ZzxhO2crKylmKz1MW2ddO3ZhciBoPU1hdGguZmxvb3IoZi9jKSxpPVouaW1hZ2VQYXRoKyIvIisiVGlsZUdyb3VwIitoKyIvIitlKyIuanBnIjtyZXR1cm4gaX1mdW5jdGlvbiBjSShhLGIsYyl7YS5sb2FkaW5nPWNiLnoyMTJJbWFnZShhLnVybCxaLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsYyxhLGIpKX1mdW5jdGlvbiBjSihhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtGLnB1c2goYSk7dmFyIGU9Ry5pbmRleE9mKGQpO2UhPS0xJiZHLnNwbGljZShlLDEpLGEuYWxwaGE9MSxhLnQ9PUImJmNNKG0sQixhKX19ZnVuY3Rpb24gY0soYSxiLGMpe2lmKGEmJmImJmMpe2EuaW1hZ2U9Yzt2YXIgZD1hLm5hbWU7Y00ocSxBLGEpfX1mdW5jdGlvbiBjTChhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtPLnB1c2goYSksUC5wdXNoKGQpO3ZhciBlPU4uaW5kZXhPZihkKTtlIT0tMSYmTi5zcGxpY2UoZSwxKSxNLnB1c2goYSksYkZ8fChiRj13aW5kb3cuc2V0SW50ZXJ2YWwoY1AsNTApKTt2YXIgZz1OLmxlbmd0aDtnPT0wJiYoWi51c2VDYW52YXMmJmNyKHEsQSxPLCEwLCExKSxQLmxlbmd0aD5mJiZjUSgpLFI9MCksWi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmWi5Ub29sYmFyLnNob3dQcm9ncmVzcyhSLGcpfX1mdW5jdGlvbiBjTShhLGIsYyl7dmFyIGQ9Yy54LGU9Yy55LGY9Y0IoYiwxKTtpZihaLnVzZUNhbnZhcylhPT1xJiYoZC09Wi5pbWFnZVgqZixlLT1aLmltYWdlWSpmKSxjTihhLGMsZCxlKTtlbHNle3ZhciBnO2E9PXE/KGQtPVouaW1hZ2VYKmYtYmQvQyxlLT1aLmltYWdlWSpmLWJlL0MsZz1DKTpnPUUsY08oYSxjLGQsZSxnKX19ZnVuY3Rpb24gY04oYSxiLGMsZCl7dmFyIGU9YS5nZXRDb250ZXh0KCIyZCIpO1ouYWxwaGFTdXBwb3J0ZWQmJmIuYWxwaGE8MT8oZS5nbG9iYWxBbHBoYT1iLmFscGhhLGUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKSxlLmdsb2JhbEFscGhhPTEpOmUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKX1mdW5jdGlvbiBjTyhhLGIsYyxkLGUpe2IuZWxtdHx8KGIuZWxtdD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImltZyIpLGIuZWxtdC5vbm1vdXNlZG93bj1aLlV0aWxzLnByZXZlbnREZWZhdWx0LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihiLmVsbXQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxiLmVsbXQuc3JjPWIudXJsLGIuc3R5bGU9Yi5lbG10LnN0eWxlLGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixaLlV0aWxzLnJlbmRlclF1YWxpdHkoYixaLnJlbmRlclF1YWxpdHkpLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCYmKGIuc3R5bGVbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eSsiT3JpZ2luIl09IjBweCAwcHgiKSksYi5lbG10LnBhcmVudE5vZGUhPWEmJmEuYXBwZW5kQ2hpbGQoYi5lbG10KTt2YXIgZj1iLnN0eWxlO2YuZGlzcGxheT0ibm9uZSIsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkP2ZbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eV09WyJtYXRyaXgoIiwoYi5pbWFnZS53aWR0aC9iLmVsbXQud2lkdGgqZSkudG9GaXhlZCg4KSwiLDAsMCwiLChiLmltYWdlLmhlaWdodC9iLmVsbXQuaGVpZ2h0KmUpLnRvRml4ZWQoOCksIiwiLChjKmUpLnRvRml4ZWQoOCksWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPyIsIjoicHgsIiwoZCplKS50b0ZpeGVkKDgpLFouY3NzVHJhbnNmb3JtTm9Vbml0cz8iKSI6InB4KSJdLmpvaW4oIiIpOihmLndpZHRoPWIuaW1hZ2Uud2lkdGgqZSsicHgiLGYuaGVpZ2h0PWIuaW1hZ2UuaGVpZ2h0KmUrInB4IixmLmxlZnQ9YyplKyJweCIsZi50b3A9ZCplKyJweCIpLGYuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnNldE9wYWNpdHkoYixiLmFscGhhKX1mdW5jdGlvbiBjUChhKXt2YXIgYj1NLmxlbmd0aCxjPTA7Zm9yKHZhciBkPTA7ZDxiO2QrKyl7dmFyIGU9TVtkXTtlLnQ9PUEmJihlLmFscGhhPDE/KGUuYWxwaGErPWJFLGUuYWxwaGE+MSYmKGUuYWxwaGE9MSksY00ocSxBLGUpKTooYysrLGM+PWImJih3aW5kb3cuY2xlYXJJbnRlcnZhbChiRiksYkY9bnVsbCkpKX19ZnVuY3Rpb24gY1EoKXt2YXIgYT1QLmxlbmd0aC1mO2Zvcih2YXIgYj0wO2I8YTtiKyspaj1QLmluZGV4T2YoT1tiXS5uYW1lKSxqIT0tMSYmUC5zcGxpY2UoaiwxKSxPLnNwbGljZShiLDEpfWZ1bmN0aW9uIGNSKCl7cmV0dXJuIFouaW1hZ2VXL1ouaW1hZ2VIPlkvJD9ZL1ouaW1hZ2VXOiQvWi5pbWFnZUh9ZnVuY3Rpb24gY1MoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9bmV3IGNBKGEsYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGQ9Yy5sZWZ0LGU9Yy5yaWdodCxmPWMudG9wLGc9Yy5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9kPDA/YT1ZLzIvWi5pbWFnZVo6ZT5aLmltYWdlVyYmKGE9Wi5pbWFnZVctWS8yL1ouaW1hZ2VaKTphPVouaW1hZ2VXLzIsWi5pbWFnZUgqWi5pbWFnZVo+JD9mPDA/Yj0kLzIvWi5pbWFnZVo6Zz5aLmltYWdlSCYmKGI9Wi5pbWFnZUgtJC8yL1ouaW1hZ2VaKTpiPVouaW1hZ2VILzJ9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1QoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Y0IoQSxDKSxkPVouaW1hZ2VYLGU9Wi5pbWFnZVksZj1uZXcgY0EoZCxlLC0oWS8yKSxZLzIsLSgkLzIpLCQvMixjKSxnPWYubGVmdCxoPWYucmlnaHQsaT1mLnRvcCxqPWYuYm90dG9tO1ouaW1hZ2VXKmM+WT9nPDA/YSs9ZypjOmg+Wi5pbWFnZVcmJihhLT0oWi5pbWFnZVctaCkqYyk6YSs9KGQtWi5pbWFnZVcvMikqYyxaLmltYWdlSCpjPiQ/aTwwP2IrPWkqYzpqPlouaW1hZ2VIJiYoYi09KFouaW1hZ2VILWopKmMpOmIrPShlLVouaW1hZ2VILzIpKmN9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1UoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Wi5pbWFnZVgtKGEtYmYpL1ouaW1hZ2VaLGQ9Wi5pbWFnZVktKGItYmgpL1ouaW1hZ2VaLGU9bmV3IGNBKGMsZCwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGY9ZS5sZWZ0LGc9ZS5yaWdodCxoPWUudG9wLGk9ZS5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9mPDA/YSs9ZipaLmltYWdlWjpnPlouaW1hZ2VXJiYoYS09KFouaW1hZ2VXLWcpKlouaW1hZ2VaKTphKz0oYy1aLmltYWdlVy8yKSpaLmltYWdlWixaLmltYWdlSCpaLmltYWdlWj4kP2g8MD9iKz1oKlouaW1hZ2VaOmk+Wi5pbWFnZUgmJihiLT0oWi5pbWFnZUgtaSkqWi5pbWFnZVopOmIrPShkLVouaW1hZ2VILzIpKlouaW1hZ2VafXJldHVybiBuZXcgWi5VdGlscy5Qb2ludChhLGIpfWZ1bmN0aW9uIGNWKGEpe3JldHVybiBhPloubWF4Wj9hPVoubWF4WjphPFoubWluWiYmKGE9Wi5taW5aKSxhfWZ1bmN0aW9uIGNXKCl7Ylo9bmV3IEltYWdlLGIkPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzMiKSksYloudXJsPVoud2F0ZXJtYXJrUGF0aCxiWi5vbmxvYWQ9Y1gsYloub25lcnJvcj1jWixiWi5zcmM9Wi53YXRlcm1hcmtQYXRofWZ1bmN0aW9uIGNYKCl7aWYodSl7dmFyIGE9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno3NCIpKSxiPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzYiKSksYz1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejc1IikpLGQ9Y0IoQSxDKSxlPShaLmltYWdlVypkLXUud2lkdGgpLzIsZj0oWi5pbWFnZUgqZC11LmhlaWdodCkvMixnPShaLmltYWdlVy8yLVouaW1hZ2VYKSpkLGg9KFouaW1hZ2VILzItWi5pbWFnZVkpKmQsaT1kPGE/YTpkLGo9TWF0aC5yb3VuZChaLmltYWdlVy9iKSxrPU1hdGgucm91bmQoWi5pbWFnZUgvYyksbD1jeSgpO3dpU2NhbGVkVz1iWi53aWR0aCppLHdpU2NhbGVkSD1iWi5oZWlnaHQqaTt2YXIgbT0wLG49MDtmb3IodmFyIG89MTtvPD1qO28rKylmb3IodmFyIHA9MTtwPD1rO3ArKyl7dmFyIHE9TWF0aC5yb3VuZChaLmltYWdlVy8oaisxKSpvKSxyPU1hdGgucm91bmQoWi5pbWFnZUgvKGsrMSkqcCk7aWYocT5sLmxlZnQmJnE8bC5yaWdodCYmcj5sLnRvcCYmcjxsLmJvdHRvbSl7dmFyIHM9TWF0aC5yb3VuZChxKmQtd2lTY2FsZWRXLzItZStnKSx0PU1hdGgucm91bmQocipkLXdpU2NhbGVkSC8yLWYraCk7aWYoWi5pbWFnZVc+NGUzKXt2YXIgdj1tKzEwMCx3PW4rMTAwO2lmKHM8diYmdDx3KWNvbnRpbnVlO209cyxuPXR9dmFyIHg9YlouY2xvbmVOb2RlKCEwKTtaLlV0aWxzLnNldE9wYWNpdHkoeCxiJCkseC53aWR0aD13aVNjYWxlZFcseC5oZWlnaHQ9d2lTY2FsZWRIO3ZhciB5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2lDIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLHdpU2NhbGVkVysicHgiLHdpU2NhbGVkSCsicHgiLHMrInB4Iix0KyJweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7eS5hcHBlbmRDaGlsZCh4KSx1LmFwcGVuZENoaWxkKHkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHgsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9fX19ZnVuY3Rpb24gY1koKXt1JiYoY3QodSksY1goKSl9ZnVuY3Rpb24gY1ooKXtaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6OTciKSt0aGlzLnVybCl9ZnVuY3Rpb24gYyQoYixjLGQpe2EuejI5M0FsbFN0b3AoKSxaLmltYWdlWj1jVihkKTt2YXIgZT1jUyhiLGMpO1ouaW1hZ2VYPWUueCxaLmltYWdlWT1lLnksYS56Mjc0KCEwKX1mdW5jdGlvbiBjXygpe2lmKGJCKXtkYihidixidyxieCwhMSk7aWYoYnYhPT0wfHxidyE9PTB8fGJ4IT09MCliQj13aW5kb3cuc2V0VGltZW91dChjXyxiQSl9fWZ1bmN0aW9uIGRhKCl7Yk88Ykk/KGRiKGJKLGJLLGJMLCEwKSxiTysrLGJOPXdpbmRvdy5zZXRUaW1lb3V0KGRhLGJIKSk6KEM9Yk8qYkwrY0MoQSxaLmltYWdlWiksYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfWZ1bmN0aW9uIGRiKGEsYixkLGUpe3ZhciBmLGcsaCxpPSExLGo9ITEsbD0hMTtpZihkIT0wKXt2YXIgbT1DKigxK2QpO2UmJihtPUMrZCk7dmFyIG49Y0IoQSxtKTtoPWNWKG4pO2lmKGghPVouaW1hZ2VaKXt2YXIgbz1kZShoKTtvJiYoIWUsaj0hMCxsPSEwKX19aWYoYSE9MHx8YiE9MCl7dmFyIHA9cGFyc2VGbG9hdChrLmxlZnQpK2Escz1wYXJzZUZsb2F0KGsudG9wKStiLHQ9Y1UocCxzKTtmPXQueCxnPXQueSxrLmxlZnQ9ZisicHgiLGsudG9wPWcrInB4IixpPSEwLGw9ITB9dmFyIHU9YnklMj09MDt1JiYoY1koKSxqJiZjdSgpLGwmJmN2KCkpO2lmKGkpdmFyIHY9Wi51c2VDYW52YXM/cGFyc2VGbG9hdChyLndpZHRoKS9xLndpZHRoOjEsdz1NYXRoLnJvdW5kKGMvYnUqQyp2KSx4PWJ5JXc9PTAmJmJ5IT0wfWZ1bmN0aW9uIGRjKCl7YkImJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJCKSxiQj1udWxsKSxidj0wLGJ3PTAsYng9MCxieT0wfWZ1bmN0aW9uIGRkKCl7Yk4mJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJOKSxiTj1udWxsKX1mdW5jdGlvbiBkZShhKXt2YXIgYj0hMSxjPWNDKEEsYSk7aWYoYyE9Qyl7Qz1jLEU9Y0MoQixhKTt2YXIgZD1jL0QsZT1iYipkLGY9YmMqZCxnPShiYi1lKS8yLGg9KGJjLWYpLzI7aWYoYzxEKXt2YXIgaT1jVChnLGgpO2subGVmdD1iZitpLngtZysicHgiLGsudG9wPWJoK2kueS1oKyJweCJ9aWYoWi51c2VDYW52YXMpci53aWR0aD1lKyJweCIsci5oZWlnaHQ9ZisicHgiLHIubGVmdD1nKyJweCIsci50b3A9aCsicHgiLGU9YmoqZCxmPWJrKmQsZz1ibCtaLmltYWdlWCooMS1kKSpaLmltYWdlWixoPWJtK1ouaW1hZ2VZKigxLWQpKlouaW1hZ2VaLG4ud2lkdGg9ZSsicHgiLG4uaGVpZ2h0PWYrInB4IixuLmxlZnQ9ZysicHgiLG4udG9wPWgrInB4IjtlbHNle2NyKHEsQSxPLCEwLCExKSx0aWVyQmFja2ZpbGxXPUhbQl0sdGllckJhY2tmaWxsSD1JW0JdLG0ud2lkdGg9dGllckJhY2tmaWxsVyxtLmhlaWdodD10aWVyQmFja2ZpbGxIO3ZhciBqPXRpZXJCYWNrZmlsbFcqRSxsPXRpZXJCYWNrZmlsbEgqRSxvPVouaW1hZ2VYKmEscD1aLmltYWdlWSphO2JsPWJkLW8sYm09YmUtcCxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiLGNyKG0sQixGLCExLCExKX1iPSEwfXJldHVybiBifWZ1bmN0aW9uIGRmKGEpe2E/KGJYfHxkZygpLGJYLmVsbXQuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIik6YlgmJihiWC5lbG10LnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1mdW5jdGlvbiBkZygpe3ZhciBhPVouVXRpbHMuejE4NSgiejIxIiksYj0zNCxjPTM0LGQ9MjAsZT1wYXJzZUZsb2F0KFoudmlld2VyVyktKGIrZCksZj1wYXJzZUZsb2F0KFoudmlld2VySCktKGMrZCksZz1aLlV0aWxzLnoxODUoInoyMCIpO2JYPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uRlBDYW5jZWwiLGEsbnVsbCxudWxsLG51bGwsbnVsbCxiKyJweCIsYysicHgiLGUrInB4IixmKyJweCIsIm1vdXNlZG93biIsZGgsInoxMDIiLCJzb2xpZCIsIjFweCIsZywiMHB4IiwiMHB4IiksWi5WaWV3ZXJEaXNwbGF5LmFwcGVuZENoaWxkKGJYLmVsbXQpfWZ1bmN0aW9uIGRoKCl7YS50b2dnbGVGdWxsUGFnZVZpZXcoITEpfWZ1bmN0aW9uIGRpKCl7Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXlkb3duIixkeiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXl1cCIsZEEpLFoubW9iaWxlRGV2aWNlPyhaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hzdGFydCIsZHApLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJ0b3VjaG1vdmUiLGRxKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hlbmQiLGRyKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hjYW5jZWwiLGRzKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZXN0YXJ0IixkdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksImdlc3R1cmVjaGFuZ2UiLGR1KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZWVuZCIsZHYpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0ub25vcmllbnRhdGlvbmNoYW5nZT1keSk6KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3ZlciIsZGopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3V0IixkbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKFouVmlld2VyRGlzcGxheSwibW91c2Vtb3ZlIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwibW91c2Vkb3duIixkayksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNlbW92ZSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihtLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHEsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSx1JiZaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLHgmJlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9ZnVuY3Rpb24gZGooYSl7dmFyIGI9Wi5VdGlscy56MjI1KFouVXRpbHMudGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKSxjPVouVXRpbHMuejIyNShaLlV0aWxzLnJlbGF0ZWRUYXJnZXQoYSkpO2lmKCFifHwhYylaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCEwKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSxibz1udWxsfWZ1bmN0aW9uIGRrKGEpe2lmKFouVXRpbHMuaXNSaWdodE1vdXNlQnV0dG9uKGEpKXJldHVybjtibj0hMDt2YXIgYj1aLlV0aWxzLnoxODEoYSk7cmV0dXJuIGJQPW5ldyBaLlV0aWxzLlBvaW50KGIueCxiLnkpLGkubW91c2VYUHJpb3I9Yi54LGkubW91c2VZUHJpb3I9Yi55LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixkbCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNldXAiLGRtKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGRtKSwhMX1mdW5jdGlvbiBkbChiKXtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGI9Wi5VdGlscy5ldmVudChiKSxjPVouVXRpbHMuejE4MShiKSxkPWMueC1pLm1vdXNlWFByaW9yLGU9Yy55LWkubW91c2VZUHJpb3I7aWYoIWlzTmFOKGQpJiYhaXNOYU4oZSkpe3ZhciBmPXBhcnNlRmxvYXQoay5sZWZ0KStkLGc9cGFyc2VGbG9hdChrLnRvcCkrZSxoPWNVKGYsZyk7ay5sZWZ0PWgueCsicHgiLGsudG9wPWgueSsicHgiLGkubW91c2VYUHJpb3I9Yy54LGkubW91c2VZUHJpb3I9Yy55O2lmKFouTmF2aWdhdG9yKXt2YXIgaj1hLnoxNDEoaCk7Wi5OYXZpZ2F0b3IuejI2M1JlY3RhbmdsZVBvc2l0aW9uKGopfX1yZXR1cm4hMX1mdW5jdGlvbiBkbShiKXtibj0hMSxkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLGRsKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSwibW91c2V1cCIsZG0pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsZG0pO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1aLlV0aWxzLnoxODEoYiksZDtibz9kPWJvOmQ9bmV3IFouVXRpbHMuUG9pbnQoYy54LGMueSk7dmFyIGU9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZC54LDIpK01hdGgucG93KGJQLnktZC55LDIpKTtpZihlPDQpe3ZhciBmPWEuejE3MyhiLGQsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoZi54LGYueSxmLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhmLngsZi55LFouaW1hZ2VaKX1lbHNlIFoubW91c2VQYW4mJmEuejI3NCgpO2JvJiYoWi5Ub29sYmFyRGlzcGxheSYmWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMSksWi5OYXZpZ2F0b3JEaXNwbGF5JiZaLm5hdmlnYXRvclZpc2libGU+MSYmWi5OYXZpZ2F0b3Iuc2V0VmlzaWJpbGl0eSghMSkpfWZ1bmN0aW9uIGRuKGEpe3ZhciBiPVouVXRpbHMuejIyNShaLlV0aWxzLnRhcmdldChhKSksYz1aLlV0aWxzLnoyMjUoWi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKTtpZighYnx8IWMpaWYoIWJuKVouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITEpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2Vsc2V7dmFyIGQ9Wi5VdGlscy56MTgxKGEpO2JvPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX1mdW5jdGlvbiBkcChhKXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYiYmIWJwKXticj0hMTt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7YlA9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksaS5tb3VzZVhQcmlvcj1kLngsaS5tb3VzZVlQcmlvcj1kLnl9fWZ1bmN0aW9uIGRxKGIpe2IucHJldmVudERlZmF1bHQoKTtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGM9Wi5VdGlscy56MTc4KGIpO2lmKGMmJiFicCYmIWJyKXt2YXIgZD1jLnRhcmdldCxlPW5ldyBaLlV0aWxzLlBvaW50KGMucGFnZVgsYy5wYWdlWSksZj1lLngtaS5tb3VzZVhQcmlvcixnPWUueS1pLm1vdXNlWVByaW9yO2lmKCFpc05hTihmKSYmIWlzTmFOKGcpKXt2YXIgaD1wYXJzZUZsb2F0KGsubGVmdCkrZixqPXBhcnNlRmxvYXQoay50b3ApK2csbD1jVShoLGopO2subGVmdD1sLngrInB4IixrLnRvcD1sLnkrInB4IixpLm1vdXNlWFByaW9yPWUueCxpLm1vdXNlWVByaW9yPWUueTtpZihaLk5hdmlnYXRvcil7dmFyIG09YS56MTQxKGwpO1ouTmF2aWdhdG9yLnoyNjNSZWN0YW5nbGVQb3NpdGlvbihtKX19fXJldHVybiExfWZ1bmN0aW9uIGRyKGIpe2lmKCFicCYmIWJyKXt2YXIgYz0hMSxkPVouVXRpbHMuejE3OChiKTtpZihkKXt2YXIgZT1kLnRhcmdldCxmPW5ldyBaLlV0aWxzLlBvaW50KGQucGFnZVgsZC5wYWdlWSksZz1uZXcgWi5VdGlscy5Qb2ludChmLngsZi55KSxoPU1hdGguc3FydChNYXRoLnBvdyhiUC54LWcueCwyKStNYXRoLnBvdyhiUC55LWcueSwyKSk7aWYoaDw0KXt2YXIgaT1hLnoxNzMoYixnLEEsQyk7Wi5jbGlja1pvb20/YS56MjkzVG9WaWV3KGkueCxpLnksaS56KTpaLmNsaWNrUGFuJiZhLnoyOTNUb1ZpZXcoaS54LGkueSxaLmltYWdlWil9ZWxzZSBjPSEwfWVsc2UgYz0hMDtjJiZaLm1vdXNlUGFuJiZhLnoyNzQoKX19ZnVuY3Rpb24gZHMoYil7aWYoIWJwJiYhYnIpe3ZhciBjPSExLGQ9Wi5VdGlscy56MTc4KGIpO2lmKGQpe3ZhciBlPWQudGFyZ2V0LGY9bmV3IFouVXRpbHMuUG9pbnQoZC5wYWdlWCxkLnBhZ2VZKSxnPW5ldyBaLlV0aWxzLlBvaW50KGYueCxmLnkpLGg9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZy54LDIpK01hdGgucG93KGJQLnktZy55LDIpKTtpZihoPDQpe3ZhciBpPWEuejE3MyhiLGcsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoaS54LGkueSxpLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhpLngsaS55LFouaW1hZ2VaKX1lbHNlIGM9ITB9ZWxzZSBjPSEwO2MmJloubW91c2VQYW4mJmEuejI3NCgpfX1mdW5jdGlvbiBkdChhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpO2R1KGEpLGJwfHwoYnA9d2luZG93LnNldEludGVydmFsKGR3LGJzKSl9ZnVuY3Rpb24gZHUoYSl7dmFyIGE9Wi5VdGlscy5ldmVudChhKTthLnByZXZlbnREZWZhdWx0KCksYnE9TWF0aC5yb3VuZChhLnNjYWxlKjEwMCkvMTAwfWZ1bmN0aW9uIGR2KGIpe2JwJiYod2luZG93LmNsZWFySW50ZXJ2YWwoYnApLGJyPSEwLGJwPW51bGwpLFoubW91c2VQYW4mJmEuejI3NCgpfWZ1bmN0aW9uIGR3KGEpe2lmKCFaLm1vdXNlUGFuKXJldHVybjt2YXIgYj1keChBLEQsYnEpLGM9Y1YoYik7YiE9Wi5pbWFnZVomJmRlKGMpfWZ1bmN0aW9uIGR4KGEsYixjKXt2YXIgZD1iKmMsZT1jQihhLGQpO3JldHVybiBlfWZ1bmN0aW9uIGR5KGIpe1ouZnVsbFBhZ2UmJihaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCExKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKSxhLnRvZ2dsZUZ1bGxQYWdlVmlldyghMSksYS50b2dnbGVGdWxsUGFnZVZpZXcoITApLFouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITApLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApKX1mdW5jdGlvbiBkeihiKXtpZighWi5rZXlzKXJldHVybjt2YXIgYj1aLlV0aWxzLmV2ZW50KGIpO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgOTA6YS56b29tKCJvdXQiKTticmVhaztjYXNlIDE3OmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSA2NTphLnpvb20oImluIik7YnJlYWs7Y2FzZSAxNjphLnpvb20oImluIik7YnJlYWs7Y2FzZSAzNzphLnBhbigibGVmdCIpO2JyZWFrO2Nhc2UgMzg6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSA0MDphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UgMzk6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSAyNzpaLmZ1bGxQYWdlP2EudG9nZ2xlRnVsbFBhZ2VWaWV3KCExKTphLnJlc2V0KCl9fWZ1bmN0aW9uIGRBKGIpe2lmKCFaLmtleXMpcmV0dXJuO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1iLmtleUNvZGU7Yz09OTB8fGM9PTE3fHxjPT02NXx8Yz09MTY/YS56b29tKCJzdG9wIik6Yz09Mzd8fGM9PTM5P2EucGFuKCJob3Jpem9udGFsU3RvcCIpOihjPT0zOHx8Yz09NDApJiZhLnBhbigidmVydGljYWxTdG9wIil9dmFyIGE9dGhpcyxiPSExLGM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjEiKSwxMCksZD1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejU5IikpLGU9ZC8yLGY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjIiKSwxMCksZz1aLnRvb2xiYXJWaXNpYmxlPT0xP1oudG9vbGJhckg6MCxoLGksayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHk7Y2coKTt2YXIgej0xLEE9MCxCPTAsQyxELEUsRj1bXSxHPVtdLEg9W10sST1bXSxKPVtdLEs9W10sTD1bXSxNPVtdLE49W10sTz1bXSxQPVtdLFE9W10sUj0wLFM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NyIpLDEwKSxUPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejYiKSwxMCksVT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1IiksMTApLFY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NCIpLDEwKSxXPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejMiKSwxMCksWD1wYXJzZUludChaLlV0aWxzLnoxODUoIno0NSIpLDEwKSxZLCQsXyxiYSxiYixiYyxiZCxiZSxiZixiZyxiaCxiaSxiaixiayxibCxibTtZPVoudmlld2VyVywkPVoudmlld2VySCxfPWJhPTAsJC09ZyxaLnRvb2xiYXJQb3NpdGlvbj09MCYmKGJhKz1nKTt2YXIgYm49ITEsYm89bnVsbCxicD1udWxsLGJxPW51bGwsYnI9ITEsYnM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6MjQiKSwxMCksYnQ9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno4MSIpKSpaLnpvb21TcGVlZDtaLm1vYmlsZURldmljZSYmKGJ0Lz0yKTt2YXIgYnU9TWF0aC5yb3VuZChwYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejQ3IikpKloucGFuU3BlZWQpLGJ2PTAsYnc9MCxieD0wLGJ5PTAsYno9MCxiQT1wYXJzZUludChaLlV0aWxzLnoxODUoIno3NyIpLDEwKSxiQixiQyxiRCxiRT1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejE5IikpKlouZmFkZUluU3BlZWQsYkYsYkc9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzgiKSwxMCksYkg9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzkiKSwxMCksYkk9YkcvYkgsYkosYkssYkwsYk0sYk4sYk8sYlAsYlEsYlIsYlMsYlQsYlUsYlYsYlcsYlgsYlk7aWYoWi5VdGlscy5pc1N0clZhbChaLndhdGVybWFya1BhdGgpKXZhciBiWixiJCxiXz1bXSxjYT1bXTtjaChZLCQsXyxiYSk7dmFyIGNiPW5ldyBaLnoxMDEsY2M9Wi5VdGlscy56MTQwKFouaW1hZ2VQYXRoKyIvIisiSW1hZ2VQcm9wZXJ0aWVzLnhtbCIpO2NiLmxvYWRYTUwoY2MpLHRoaXMuejIwNj1mdW5jdGlvbihhLGIpe1ouaW1hZ2VXPWEsWi5pbWFnZUg9YixjaSgpLGNqKCksRT1jQyhCLFouaW5pdGlhbFopLEM9Y0MoQSxaLmluaXRpYWxaKSxEPUMsWi51c2VDYW52YXMmJnMuc2NhbGUoQyxDKSx1JiZjVygpLGNrKCksYyQoWi5pbml0aWFsWCxaLmluaXRpYWxZLFouaW5pdGlhbFopLGRpKCksY2YoITApLFouVmlld2VyLnoxNDgoKX0sdGhpcy5yZXoyMDY9ZnVuY3Rpb24oYSxiKXtjZighMSksY2QoKSxaLmltYWdlVz1hLFouaW1hZ2VIPWIsY2koKSxjaigpLEU9Y0MoQixaLmluaXRpYWxaKSxDPWNDKEEsWi5pbml0aWFsWiksRD1DLFoudXNlQ2FudmFzJiYocy5yZXN0b3JlKCkscy5zY2FsZShDLEMpKSxjaygpLGNoKFksJCxfLGJhKSxtJiZjdChtKSxxJiZjdChxKSx1JiZjdCh1KSxjJChaLmluaXRpYWxYLFouaW5pdGlhbFksWi5pbml0aWFsWiksY2YoITApLFoubmF2aWdhdG9yVmlzaWJsZT4wJiZaLk5hdmlnYXRvci5zZXRJbWFnZVBhdGgoWi5pbWFnZVBhdGgpfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoKX0sdGhpcy56MjAxPWZ1bmN0aW9uKCl7cmV0dXJuIGJifSx0aGlzLnoxNzk9ZnVuY3Rpb24oKXtyZXR1cm4gYmN9LHRoaXMuejE4Nj1mdW5jdGlvbigpe3JldHVybiB6fSx0aGlzLnoxOTU9ZnVuY3Rpb24oKXtyZXR1cm4gY30sdGhpcy56MTg3PWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuejE4OT1mdW5jdGlvbigpe3JldHVybiBDfSx0aGlzLnoxODlBc1pvb209ZnVuY3Rpb24oKXt2YXIgYT1jQihBLEMpO3JldHVybiBhfSx0aGlzLnoxOTQ9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy56MTkzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuejE5Nz1mdW5jdGlvbigpe3JldHVybiBmfSx0aGlzLnoxOTI9ZnVuY3Rpb24oKXtyZXR1cm4gSC5qb2luKCIsIil9LHRoaXMuejE4OD1mdW5jdGlvbigpe3JldHVybiBJLmpvaW4oIiwgIil9LHRoaXMuejE5MT1mdW5jdGlvbigpe3JldHVybiBMLmpvaW4oIiwgIil9LHRoaXMuejE5Nj1mdW5jdGlvbigpe3ZhciBhPU4uam9pbigiLCAiKT09IiI/IkN1cnJlbnQgdmlldyBsb2FkaW5nIGNvbXBsZXRlIjpOLmpvaW4oIiwgIik7cmV0dXJuIGF9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQpe2NoKGEsYixjLGQpfSx0aGlzLnoyNzQ9ZnVuY3Rpb24oYSl7aWYoQyE9RHx8Wi5pbWFnZVohPWJ6fHxwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymh8fGEpe2NuKCksYno9Y0IoQSxDKTt2YXIgYz0hMTtpZihDIT1EfHxaLmltYWdlWiE9Ynp8fCFifHxhKVouaW1hZ2VaPGJ6JiYhYSYmKGM9ITApLGNvKCksY3AoKSxjcihtLEIsRiwhMSwhMSk7Y3EoKSxjcihxLEEsTywhMCxjKSxjcyhOLGNMLDApLGN1KCksY3YoKX19LHRoaXMuc2V0Vmlldz1mdW5jdGlvbihhLGIsYyl7aWYoYT09dW5kZWZpbmVkfHxhPT1udWxsKWE9Wi5pbWFnZVcvMjtpZihiPT11bmRlZmluZWR8fGI9PW51bGwpYj1aLmltYWdlSC8yO2M9PXVuZGVmaW5lZHx8Yz09bnVsbD9jPVouZml0WjpjPjEmJihjPWMvMTAwKSxjJChhLGIsYyl9LHRoaXMuem9vbT1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJvdXQiOmJ4Pj0wJiYoYngtPWJ0KTticmVhaztjYXNlImluIjpieDw9MCYmKGJ4Kz1idCk7YnJlYWs7Y2FzZSJzdG9wIjpieD0wfVouem9vbWluZz1ieD09MD8ic3RvcCI6Yng+MD8iaW4iOiJvdXQiLGJ4IT0wP2JCfHwoKGJ4PDAmJlouaW1hZ2VaPloubWluWnx8Yng+MCYmWi5pbWFnZVo8Wi5tYXhaKSYmYS56MjczKCExKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnBhbj1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJsZWZ0Ijpidjw9MCYmKGJ2Kz1idSk7YnJlYWs7Y2FzZSJ1cCI6Ync8PTAmJihidys9YnUpO2JyZWFrO2Nhc2UiZG93biI6Ync+PTAmJihidy09YnUpO2JyZWFrO2Nhc2UicmlnaHQiOmJ2Pj0wJiYoYnYtPWJ1KTticmVhaztjYXNlImhvcml6b250YWxTdG9wIjpidj0wO2JyZWFrO2Nhc2UidmVydGljYWxTdG9wIjpidz0wO2JyZWFrO2Nhc2Uic3RvcCI6YnY9MCxidz0wfVoucGFubmluZ1g9YnY9PTA/InN0b3AiOmJ2PjA/ImxlZnQiOiJyaWdodCIsWi5wYW5uaW5nWT1idz09MD8ic3RvcCI6Ync+MD8idXAiOiJkb3duIixiQz1aLmltYWdlWCpjQihBLDEpLGJEPVouaW1hZ2VZKmNCKEEsMSksYnYhPTB8fGJ3IT0wP2JCfHwoYS56MjczKCEwKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnoyOTNUb1ZpZXc9ZnVuY3Rpb24oYixjLGQpe2EuejI5M0FsbFN0b3AoKTt2YXIgZT1jRihiLGMpLGY9YmQtZS54LGc9YmUtZS55LGg9Y0MoQSxkKSxpPWNDKEIsZCksaj1wYXJzZUZsb2F0KGsubGVmdCkrZixsPXBhcnNlRmxvYXQoay50b3ApK2csbT1oLUMsbj1pLUU7Yko9ai9iSSxiSz1sL2JJLGJMPW0vYkksYk09bi9iSSxhLnoyNzMoITEpLGJPPTAsYk49d2luZG93LnNldFRpbWVvdXQoZGEsYkgpfSx0aGlzLnoyOTNBbGxTdG9wPWZ1bmN0aW9uKGIpe2RjKCksZGQoKSxifHxhLnoyNzQoKX0sdGhpcy56MjQ1PWZ1bmN0aW9uKGEpe3ZhciBiPWRlKGEpO2ImJihjWSgpLGN2KCkpfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7YS56MjkzVG9WaWV3KFouaW5pdGlhbFgsWi5pbml0aWFsWSxaLmluaXRpYWxaKX0sdGhpcy50b2dnbGVGdWxsUGFnZVZpZXdFeHRlcm5hbD1mdW5jdGlvbigpe2JZPSEwLGEudG9nZ2xlRnVsbFBhZ2VWaWV3KCl9LHRoaXMudG9nZ2xlRnVsbFBhZ2VWaWV3PWZ1bmN0aW9uKGIpe2EuejI5M0FsbFN0b3AoKSxaLmZ1bGxQYWdlPWI/YjohWi5mdWxsUGFnZTt2YXIgYz1kb2N1bWVudC5ib2R5LGQ9Yy5zdHlsZSxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxmPVouVmlld2VyRGlzcGxheS5zdHlsZSxnPW51bGwsaD1udWxsO2lmKFouZnVsbFBhZ2Upe2JRPWQud2lkdGgsYlI9ZC5oZWlnaHQsYlM9ZC5vdmVyZmxvdyxiVD1lLm92ZXJmbG93LGJVPWYuYmFja2dyb3VuZENvbG9yLGJWPWYucG9zaXRpb24sYlc9Zi56SW5kZXg7dmFyIGk7Wi5tb2JpbGVEZXZpY2U/KGk9Wi5VdGlscy56MjAxaW5kb3dTaXplKCksZC53aWR0aD1pLngsZC5oZWlnaHQ9aS55KTooZC53aWR0aD0iMTAwJSIsZC5oZWlnaHQ9IjEwMCUiKSxkLm92ZXJmbG93PSJoaWRkZW4iLGUub3ZlcmZsb3c9ImhpZGRlbiIsZi5iYWNrZ3JvdW5kQ29sb3I9Wi5VdGlscy56MTg1KCJ6MjIiKSxmLnBvc2l0aW9uPSJmaXhlZCIsZi56SW5kZXg9Ijk5OTk5OTk5IixpPVouVXRpbHMuejIwMWluZG93U2l6ZSgpLGc9aS54LGg9aS55fWVsc2V7ZC53aWR0aD1iUSxkLmhlaWdodD1iUixkLm92ZXJmbG93PWJTLGUub3ZlcmZsb3c9YlQsZi5iYWNrZ3JvdW5kQ29sb3I9YlUsZi5wb3NpdGlvbj0icmVsYXRpdmUiLGYuekluZGV4PWJXO3ZhciBqPVouVXRpbHMuejE3NihaLnBhZ2VDb250YWluZXIpO2c9cGFyc2VGbG9hdChqLndpZHRoKSxoPXBhcnNlRmxvYXQoai5oZWlnaHQpLGlzTmFOKGcpJiYoZz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKGgpJiYoaD1aLlZpZXdlckRpc3BsYXkuY2xpZW50SGVpZ2h0KSxiWT0hMX1aLnZpZXdlclc9ZyxaLnZpZXdlckg9aCxjaChnLGgpLGRmKGJZKTtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXtaLnRvb2xiYXJDdXJyZW50Vz1aLnRvb2xiYXJXPT0tMT9nOloudG9vbGJhclc7dmFyIGw9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILVoudG9vbGJhckg6MDtaLlRvb2xiYXIuc2V0U2l6ZUFuZFBvc2l0aW9uKFoudG9vbGJhckN1cnJlbnRXLG51bGwsbnVsbCxsKX1aLk5hdmlnYXRvckRpc3BsYXkmJlouTmF2aWdhdG9yLnoxODAoKSYmWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKFoubmF2aWdhdG9yVyxaLm5hdmlnYXRvckgsWi5uYXZpZ2F0b3JMLTEsWi5uYXZpZ2F0b3JULTEpLGNqKCksWi5pbWFnZVo9Y1YoWi5pbWFnZVopO2lmKFouY29uc3RyYWluUGFuKXt2YXIgbT1wYXJzZUZsb2F0KGsubGVmdCksbj1wYXJzZUZsb2F0KGsudG9wKSxvPWNVKG0sbik7ay5sZWZ0PW8ueCsicHgiLGsudG9wPW8ueSsicHgifWEuejI3NCghMCl9LHRoaXMuejI3MT1mdW5jdGlvbigpe3ZhciBhPVouVmlld2VyRGlzcGxheS5maXJzdENoaWxkLmNoaWxkTm9kZXNbMF0uc3R5bGU7YS5kaXNwbGF5PWEuZGlzcGxheT09Im5vbmUiPyJpbmxpbmUtYmxvY2siOiJub25lIn0sdGhpcy56MjcyPWZ1bmN0aW9uKCl7dmFyIGE9Wi5WaWV3ZXJEaXNwbGF5LmZpcnN0Q2hpbGQuY2hpbGROb2Rlc1sxXS5zdHlsZTthLmRpc3BsYXk9YS5kaXNwbGF5PT0ibm9uZSI/ImlubGluZS1ibG9jayI6Im5vbmUifSx0aGlzLnoyNzM9ZnVuY3Rpb24oYSl7aWYodil7dmFyIGI9YT9hOnYuZGlzcGxheSE9ImlubGluZS1ibG9jayI7di5kaXNwbGF5PWI/ImlubGluZS1ibG9jayI6Im5vbmUifX0sdGhpcy50b2dnbGVDb25zdHJhaW5QYW49ZnVuY3Rpb24oKXtaLmNvbnN0cmFpblBhbj0hWi5jb25zdHJhaW5QYW47aWYoWi5jb25zdHJhaW5QYW4pe3ZhciBiPXBhcnNlRmxvYXQoci5sZWZ0KSxjPXBhcnNlRmxvYXQoci50b3ApLGQ9Y1UoYixjKTtrLmxlZnQ9ZC54KyJweCIsay50b3A9ZC55KyJweCIsYS56Mjc0KCl9fSx0aGlzLnoxNzM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoInoxMFRJRVJTS0lQVEhSRVNIT0xEIikpLGY9Y0QoYi54LGIueSksZz1jRShmLngsZi55KSxoPWNCKGMsZCk7cmV0dXJuIGEuYWx0S2V5PyhkPjErZT9oPWNCKGMsMSk6Yz4wJiYoaD1jQihjLTEsMSkpLGgtWi5maXRaPGUmJihoPVouZml0WikpOmQ8MS1lP2g9Y0IoYywxKTpjPHotMSYmKGg9Y0IoYysxLDEpKSxuZXcgWi5VdGlscy5Qb2ludDNEKGcueCxnLnksaCl9LHRoaXMuejI2Nz1mdW5jdGlvbihhLGIpe3ZhciBjPS0oYS1aLmltYWdlWCksZD0tKGItWi5pbWFnZVkpLGU9YypaLmltYWdlWixmPWQqWi5pbWFnZVosZz1lK2JmLGg9ZitiaCxpPWNVKGcsaCk7ay5sZWZ0PWkueCsicHgiLGsudG9wPWkueSsicHgifSx0aGlzLnoxNDE9ZnVuY3Rpb24oYSl7aWYoIWEpdmFyIGE9bmV3IFouVXRpbHMuUG9pbnQocGFyc2VGbG9hdChrLmxlZnQpLHBhcnNlRmxvYXQoay50b3ApKTt2YXIgYj1hLngtYmYsYz1hLnktYmgsZD1iL1ouaW1hZ2VaLGU9Yy9aLmltYWdlWixmPVouaW1hZ2VYLWQsZz1aLmltYWdlWS1lO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChmLGcpfX0sWi56MTI0PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHUoKXt3aW5kb3cuY2xlYXJJbnRlcnZhbChxKSxxPW51bGw7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzVGV4dEJveCIpLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7YSYmKGEubm9kZVZhbHVlPSIiKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGN9ZnVuY3Rpb24gdyhhKXtjPWF9ZnVuY3Rpb24geChhLGIsYyxkKXthfHwoYT1aLnRvb2xiYXJWaXNpYmxlPjA/Wi50b29sYmFyQ3VycmVudFc6MCksYnx8KGI9Wi50b29sYmFyVmlzaWJsZT4wP2Y6MCksY3x8KGM9MCksZHx8KGQ9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MCk7dmFyIGU9Wi5Ub29sYmFyRGlzcGxheS5zdHlsZTtlLndpZHRoPWErInB4IixlLmhlaWdodD1iKyJweCIsZS5sZWZ0PWMrInB4IixlLnRvcD1kKyJweCIseShhLGIpfWZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1hLGQ9YixlPXRvb2xiYXJTa2luU2l6ZXNbMl0sZj10b29sYmFyU2tpblNpemVzWzNdLGc9dG9vbGJhclNraW5TaXplc1s0XSxoPXRvb2xiYXJTa2luU2l6ZXNbNV0saT10b29sYmFyU2tpblNpemVzWzZdLGo9dG9vbGJhclNraW5TaXplc1s3XSxrPXRvb2xiYXJTa2luU2l6ZXNbOF0sbD10b29sYmFyU2tpblNpemVzWzldLG09dG9vbGJhclNraW5TaXplc1sxMF0sbj10b29sYmFyU2tpblNpemVzWzExXSxvPXRvb2xiYXJTa2luU2l6ZXNbMTJdLHA9dG9vbGJhclNraW5TaXplc1sxM10scT10b29sYmFyU2tpblNpemVzWzE0XSx1PXRvb2xiYXJTa2luU2l6ZXNbMTVdLHY9MCx3PShkLWYpLzIrMSx4PShkLWgpLzIseT0oZC1qKS8yLHo9eSoxLjMsQT15KzQsQj15KzIsQz1aLmxvZ29WaXNpYmxlPT0xPzA6ay8yLEQ9Wi5sb2dvVmlzaWJsZT09MT8wOmsvMixFPWstKGktZyksRj1aLmZ1bGxQYWdlVmlzaWJsZT84OjcsRz0yMCxIPUYqaysyKkU7Wi5zbGlkZXJWaXNpYmxlJiYoSCs9cCkscj1zPXQ9ITE7dmFyIEk9Wi5sb2dvVmlzaWJsZT09MT9lKzI6MCxKPVoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTE/azowLEs9SStKLEw9SytHK0grRytxO0w+YyYmKHI9ITAsTC1wPmMmJihzPSEwLEwtcC1xPmMmJih0PSEwLEs9MCkscT0wKSxILT1wKTt2YXIgTT1LKyhjLXEtSy1IKS8yLE49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhY2tncm91bmQiKTtOLnN0eWxlLndpZHRoPWMrInB4IixOLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9Yys0MDArInB4IixOLnN0eWxlLmhlaWdodD1kKyJweCIsTi5maXJzdENoaWxkLnN0eWxlLmhlaWdodD1kKyJweCI7dmFyIE89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkNvbnRhaW5lciIpO08uc3R5bGUud2lkdGg9SCtHKjIrInB4IixPLnN0eWxlLmhlaWdodD1kKyJweCIsTy5zdHlsZS5sZWZ0PU0tRysicHgiO3ZhciBQPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25CYWNrZ3JvdW5kIik7Wi5VdGlscy56MjAzKFAscGFyc2VGbG9hdChPLnN0eWxlLndpZHRoKSxwYXJzZUZsb2F0KE8uc3R5bGUuaGVpZ2h0KSksUC5zdHlsZS5sZWZ0PSIwcHgiO3ZhciBRPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyTG9nbyIpO2lmKFEpe3ZhciBSPVEuc3R5bGU7aWYoUilpZighdCl7Ui5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejIwMyhRLGUsZiksUi5sZWZ0PXYrInB4IixSLnRvcD13KyJweCIsdis9ZSsyO3ZhciBTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2dvRGl2aWRlciIpO2lmKFMpe1ouVXRpbHMuejIwMyhTLGcsaCk7dmFyIFQ9Uy5zdHlsZTtULmxlZnQ9disicHgiLFQudG9wPXgrInB4In19ZWxzZSBSLmRpc3BsYXk9Im5vbmUifWlmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTEpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25NaW5pbWl6ZSIpLFY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkV4cGFuZCIpO2lmKFUmJlYpe3ZhciBXPVUuc3R5bGUsWD1WLnN0eWxlO1cmJlgmJih0PyhXLmRpc3BsYXk9Im5vbmUiLFguZGlzcGxheT0ibm9uZSIpOihXLmRpc3BsYXk9ImlubGluZS1ibG9jayIsWC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejEzOChVLGksaiksWi5VdGlscy56MTM4KFYsaSxqKSxXLmxlZnQ9ditDKyJweCIsVy50b3A9eisicHgiLFgubGVmdD12K0QrInB4IixYLnRvcD16KyJweCIpKX19dj1HO3ZhciBZPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25ab29tT3V0Iik7Wi5VdGlscy56MTM4KFksaSxqKTt2YXIgJD1ZLnN0eWxlOyQubGVmdD12KyJweCIsJC50b3A9eSsicHgiLHYrPWs7dmFyIF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWNrU2xpZGVyIiksYmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblNsaWRlciIpO2lmKF8mJmJhKXt2YXIgYmI9Xy5zdHlsZSxiYz1iYS5zdHlsZTtiYiYmYmMmJihyPyhiYi5kaXNwbGF5PSJub25lIixiYy5kaXNwbGF5PSJub25lIik6KGJiLmRpc3BsYXk9ImlubGluZS1ibG9jayIsYmMuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnoyMDMoXyxuLG8pLGJiLmxlZnQ9di0yKyJweCIsYmIudG9wPUErInB4IixaLlV0aWxzLnoxMzgoYmEsbCxtKSxiYy5sZWZ0PXBhcnNlRmxvYXQoYmIubGVmdCkrInB4IixiYy50b3A9QisicHgiLHYrPXApKX12YXIgYmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblpvb21JbiIpO1ouVXRpbHMuejEzOChiZCxpLGopO3ZhciBiZT1iZC5zdHlsZTtiZS5sZWZ0PXYrInB4IixiZS50b3A9eSsicHgiLHYrPWsrMTt2YXIgYmY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhbkRpdmlkZXIiKTtaLlV0aWxzLnoyMDMoYmYsZyxoKTt2YXIgYmc9YmYuc3R5bGU7YmcubGVmdD12KyJweCIsYmcudG9wPXgrInB4Iix2Kz1FO3ZhciBiaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uUGFuTGVmdCIpO1ouVXRpbHMuejEzOChiaCxpLGopO3ZhciBiaT1iaC5zdHlsZTtiaS5sZWZ0PXYrInB4IixiaS50b3A9eSsicHgiLHYrPWs7dmFyIGJqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5VcCIpO1ouVXRpbHMuejEzOChiaixpLGopO3ZhciBiaz1iai5zdHlsZTtiay5sZWZ0PXYrInB4Iixiay50b3A9eSsicHgiLHYrPWs7dmFyIGJsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5Eb3duIik7Wi5VdGlscy56MTM4KGJsLGksaik7dmFyIGJtPWJsLnN0eWxlO2JtLmxlZnQ9disicHgiLGJtLnRvcD15KyJweCIsdis9azt2YXIgYm49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblBhblJpZ2h0Iik7Wi5VdGlscy56MTM4KGJuLGksaik7dmFyIGJvPWJuLnN0eWxlO2JvLmxlZnQ9disicHgiLGJvLnRvcD15KyJweCIsdis9azt2YXIgYnA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblJlc2V0Iik7Wi5VdGlscy56MTM4KGJwLGksaik7dmFyIGJxPWJwLnN0eWxlO2JxLmxlZnQ9disicHgiLGJxLnRvcD15KyJweCIsdis9aysxO3ZhciBicj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnVsbFBhZ2VEaXZpZGVyIik7aWYoYnIpe1ouVXRpbHMuejIwMyhicixnLGgpO3ZhciBicz1ici5zdHlsZTticy5sZWZ0PXYrInB4Iixicy50b3A9eCsicHgiLHYrPUU7dmFyIGJ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25GdWxsUGFnZSIpO1ouVXRpbHMuejEzOChidCxpLGopO3ZhciBidT1idC5zdHlsZTtidS5sZWZ0PXYrInB4IixidS50b3A9eSsicHgifXZhciBidj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94Iik7aWYoYnYpe3ZhciBidz1idi5zdHlsZTtidyYmKHM/YncuZGlzcGxheT0ibm9uZSI6KGJ3LmRpc3BsYXk9ImlubGluZS1ibG9jayIsYncud2lkdGg9cSsicHgiLGJ3LmhlaWdodD11KyJweCIsYncubGVmdD1jLXBhcnNlRmxvYXQoTy5zdHlsZS5sZWZ0KS1wYXJzZUZsb2F0KGJ3LndpZHRoKSsicHgiLGJ3LnRvcD0oZC1wYXJzZUZsb2F0KGJ3LmhlaWdodCkpLzIrInB4IikpfX1mdW5jdGlvbiB6KGEpe1oudG9vbGJhclZpc2libGU8NCYmIVoubW9iaWxlRGV2aWNlP0EoYSk6QighYSl9ZnVuY3Rpb24gQShhKXtnJiYoYT9nLmRpc3BsYXk9ImlubGluZS1ibG9jayI6Zy5kaXNwbGF5PSJub25lIil9ZnVuY3Rpb24gQihhKXtpZihnKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQ29udGFpbmVyIiksYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFja2dyb3VuZCIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbk1pbmltaXplIiksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhwYW5kIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9nb0RpdmlkZXIiKSxoPTA7dHx8KGg9cGFyc2VGbG9hdChlLnN0eWxlLmxlZnQpK3BhcnNlRmxvYXQoZS5zdHlsZS53aWR0aCkrNCk7dmFyIGk9Wi50b29sYmFyQ3VycmVudFc7YT8oYi5zdHlsZS5kaXNwbGF5PSJub25lIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSxnLndpZHRoPWgrInB4IixjLnN0eWxlLndpZHRoPWgrInB4Iik6KGIuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIiksZC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGcud2lkdGg9aSsicHgiLGMuc3R5bGUud2lkdGg9aSsicHgiKX19ZnVuY3Rpb24gQyhhKXtpZihaLnNsaWRlclZpc2libGUpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmspe3ZhciBiPVoubWF4Wi1aLm1pblosYz0oYS1aLm1pblopL2I7dHJhY2tMPXBhcnNlRmxvYXQoaS5sZWZ0KSx0cmFja1I9cGFyc2VGbG9hdChpLmxlZnQpK3BhcnNlRmxvYXQoaS53aWR0aCktcGFyc2VGbG9hdChrLndpZHRoKTt2YXIgZD10cmFja1ItdHJhY2tMLGU9YypkK3RyYWNrTDtrLmxlZnQ9ZSsicHgifX19ZnVuY3Rpb24gRChiKXtofHwoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJhY2tTbGlkZXIiKSksaXx8KGk9aC5zdHlsZSk7aWYoaCYmaSl7dmFyIGMsZD1aLlV0aWxzLnoxNzQoaCk7Wi5tb2JpbGVEZXZpY2U/Yz1aLlV0aWxzLnoxODEoYikueC1kLng6Yz1iLmNsaWVudFgtZC54O3ZhciBlPUgoYywwLHBhcnNlRmxvYXQoaS53aWR0aCkpO2U8Wi5taW5aKy4xJiYoZT1aLm1pblopLGU+Wi5tYXhaLS4xJiYoZT1aLm1heFopLGEuejI0NShlKSxhLnoyNzQoKX19ZnVuY3Rpb24gRShhKXtuPSEwLGp8fChqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25TbGlkZXIiKSk7aWYoail7dmFyIGI9Wi5VdGlscy56MTgxKGEpO2oubW91c2VYUHJpb3I9Yi54LGoubW91c2VZUHJpb3I9Yi55fX1mdW5jdGlvbiBGKGIpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmomJmspe3RyYWNrTD1wYXJzZUZsb2F0KGkubGVmdCksdHJhY2tSPXBhcnNlRmxvYXQoaS5sZWZ0KStwYXJzZUZsb2F0KGkud2lkdGgpLXBhcnNlRmxvYXQoay53aWR0aCk7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpKyhwLngtai5tb3VzZVhQcmlvcik7Yzx0cmFja0w/Yz10cmFja0w6Yz50cmFja1I/Yz10cmFja1I6ai5tb3VzZVhQcmlvcj1wLngsay5sZWZ0PWMrInB4Ijt2YXIgZD1IKGMsdHJhY2tMLHRyYWNrUik7YS56MjQ1KGQpfX1mdW5jdGlvbiBHKCl7bj0hMSxhLnoyNzQoKX1mdW5jdGlvbiBIKGEsYixjKXt2YXIgZD1jLWIsZT0oYS1iKS9kLGY9Wi5tYXhaLVoubWluWixnPVoubWluWitmKmU7cmV0dXJuIGd9ZnVuY3Rpb24gSShhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpLGI9Wi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpO2lmKCFuJiZiKXt2YXIgYz1iLnBhcmVudE5vZGU7SyhjKX19ZnVuY3Rpb24gSihhKXtaLm1vYmlsZURldmljZSYmYS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhPVouVXRpbHMuZXZlbnQoYSksYj1aLlV0aWxzLnRhcmdldChhKSxjPVouVXRpbHMucmVsYXRlZFRhcmdldChhKTtpZihiKXt2YXIgZD1iLnBhcmVudE5vZGU7ZCYmKHRhcmdldFBhcmVudElEPWQuaWQpfWlmKGMpe3ZhciBlPWMucGFyZW50Tm9kZTtlJiYocmVsYXRlZFRhcmdldFBhcmVudElEPWUuaWQpfWlmKCFufHxhLnR5cGU9PSJtb3VzZXVwInx8YS50eXBlPT0idG91Y2hlbmQifHxhLnR5cGU9PSJ0b3VjaGNhbmNlbCIpTigpLGImJiFaLlV0aWxzLmlzUmlnaHRNb3VzZUJ1dHRvbihhKSYmKHRhcmdldFBhcmVudElEJiZ0YXJnZXRQYXJlbnRJRCE9InRyYWNrU2xpZGVyIiYmYS50eXBlIT0ibW91c2Vtb3ZlIiYmKE8oYSksUChhKSksUShhKSl9ZnVuY3Rpb24gSyhiKXthJiZhLnoyOTNBbGxTdG9wKCksYi5pZCYmYi5pZC5pbmRleE9mKCJidXR0b24iKSE9LTE/KEwoYiksTShiKSk6Yi5pZCYmYi5pZC5pbmRleE9mKCJiYWNrZ3JvdW5kIikhPS0xJiZOKCl9ZnVuY3Rpb24gTChhKXtaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGEsIm1vdXNlb3V0IixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoYSwibW91c2VvdmVyIixKKX1mdW5jdGlvbiBNKGEpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ1VwSUQpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5faW1nT3ZlcklEKSxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ0Rvd25JRCk7YiYmKGIuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLGMmJihjLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGQmJihkLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpfWZ1bmN0aW9uIE4oKXt2YXIgYT1aLlRvb2xiYXJEaXNwbGF5LmNoaWxkTm9kZXMsYj1udWxsO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7Yj1hW2NdO2lmKGIuaWQmJmIuaWQuaW5kZXhPZigiYnV0dG9uIikhPS0xKWlmKGIuaWQhPSJidXR0b25Db250YWluZXIiKUwoYiksTShiKTtlbHNle3ZhciBlPWIuY2hpbGROb2RlcyxmPW51bGw7Zm9yKHZhciBnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXSxmLmlkJiZmLmlkLmluZGV4T2YoImJ1dHRvbiIpIT0tMSYmKEwoZiksTShmKSl9fX1mdW5jdGlvbiBPKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPWIucGFyZW50Tm9kZTtjJiYoWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaHN0YXJ0IixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywidG91Y2hlbmQiLEopLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaGNhbmNlbCIsSikpOihaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2VvdmVyIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGMsIm1vdXNlb3V0IixKKSkpfX1mdW5jdGlvbiBQKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPVouVXRpbHMudGFyZ2V0KGEpLnBhcmVudE5vZGU7aWYoYylpZighYy5faW1nVXBJRClLKGMpO2Vsc2V7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nVXBJRCksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjLl9pbWdPdmVySUQpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nRG93bklEKTtpZihkJiZlJiZmKXt2YXIgZz1kLnN0eWxlLGg9ZS5zdHlsZSxpPWYuc3R5bGU7Zy52aXNpYmlsaXR5PSJoaWRkZW4iLGgudmlzaWJpbGl0eT0iaGlkZGVuIixpLnZpc2liaWxpdHk9ImhpZGRlbiI7c3dpdGNoKGEudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOmgudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZXVwIjpoLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UibW91c2VvdXQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaHN0YXJ0IjppLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UidG91Y2hlbmQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIn19fX19ZnVuY3Rpb24gUShjKXt2YXIgZD1aLlV0aWxzLnRhcmdldChjKS5wYXJlbnROb2RlO2lmKGQpe3ZhciBlPWQuaWQ7c3dpdGNoKGMudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZWRvd24iLEopO2JyZWFrO2Nhc2UibW91c2Vkb3duIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwibW91c2V1cCIsSik7aWYoYSlzd2l0Y2goZSl7Y2FzZSJidXR0b25NaW5pbWl6ZSI6Yi56MjE1KCEwKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKTticmVhaztjYXNlImJ1dHRvbkV4cGFuZCI6Yi56MjE1KCExKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKTticmVhaztjYXNlImJ1dHRvblpvb21PdXQiOmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSJidXR0b25TbGlkZXIiOkUoYyksUihjKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsUiksb3x8KG89d2luZG93LnNldEludGVydmFsKEYsbSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSik7YnJlYWs7Y2FzZSJ0cmFja1NsaWRlciI6RChjKTticmVhaztjYXNlImJ1dHRvblpvb21JbiI6YS56b29tKCJpbiIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuTGVmdCI6YS5wYW4oImxlZnQiKTticmVhaztjYXNlImJ1dHRvblBhblVwIjphLnBhbigidXAiKTticmVhaztjYXNlImJ1dHRvblBhbkRvd24iOmEucGFuKCJkb3duIik7YnJlYWs7Y2FzZSJidXR0b25QYW5SaWdodCI6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSJidXR0b25SZXNldCI6YS5yZXNldCgpfWJyZWFrO2Nhc2UibW91c2V1cCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsIm1vdXNlZG93biIsSiksYSYmKGU9PSJidXR0b25TbGlkZXIifHxuPyhvJiYod2luZG93LmNsZWFySW50ZXJ2YWwobyksbz1udWxsKSxHKCksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLFIpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSiksTigpKTplPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpO2JyZWFrO2Nhc2UibW91c2VvdXQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZW92ZXIiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTooZT09ImJ1dHRvblBhblVwInx8ZT09ImJ1dHRvblBhbkRvd24iKSYmYS5wYW4oInZlcnRpY2FsU3RvcCIpKTticmVhaztjYXNlInRvdWNoc3RhcnQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJ0b3VjaGVuZCIsSiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoY2FuY2VsIixKKTtpZihhKXN3aXRjaChlKXtjYXNlImJ1dHRvbk1pbmltaXplIjpiLnoyMTUoITApLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2JyZWFrO2Nhc2UiYnV0dG9uRXhwYW5kIjpiLnoyMTUoITEpLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApO2JyZWFrO2Nhc2UiYnV0dG9uWm9vbU91dCI6YS56b29tKCJvdXQiKTticmVhaztjYXNlImJ1dHRvblNsaWRlciI6RShjKSxTKGMpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSxvfHwobz13aW5kb3cuc2V0SW50ZXJ2YWwoRixtKSksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoZW5kIixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hjYW5jZWwiLEopO2JyZWFrO2Nhc2UidHJhY2tTbGlkZXIiOkQoYyk7YnJlYWs7Y2FzZSJidXR0b25ab29tSW4iOmEuem9vbSgiaW4iKTticmVhaztjYXNlImJ1dHRvblBhbkxlZnQiOmEucGFuKCJsZWZ0Iik7YnJlYWs7Y2FzZSJidXR0b25QYW5VcCI6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSJidXR0b25QYW5Eb3duIjphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuUmlnaHQiOmEucGFuKCJyaWdodCIpO2JyZWFrO2Nhc2UiYnV0dG9uUmVzZXQiOmEucmVzZXQoKX1icmVhaztjYXNlInRvdWNoZW5kIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hzdGFydCIsSiksYSYmKGU9PSJidXR0b25ab29tT3V0Inx8ZT09ImJ1dHRvblpvb21JbiI/KGEuem9vbSgic3RvcCIpLFouZGVidWcmJmU9PSJidXR0b25ab29tT3V0IiYmYy5hbHRLZXkmJlouVXRpbHMuejI1MygpKTplPT0iYnV0dG9uU2xpZGVyIj8obyYmKHdpbmRvdy5jbGVhckludGVydmFsKG8pLG89bnVsbCksRygpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSk6ZT09ImJ1dHRvblBhbkxlZnQifHxlPT0iYnV0dG9uUGFuUmlnaHQiP2EucGFuKCJob3Jpem9udGFsU3RvcCIpOmU9PSJidXR0b25QYW5VcCJ8fGU9PSJidXR0b25QYW5Eb3duIj9hLnBhbigidmVydGljYWxTdG9wIik6ZT09ImJ1dHRvbkZ1bGxQYWdlIiYmYS50b2dnbGVGdWxsUGFnZVZpZXcoKSk7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoc3RhcnQiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iPyhhLnpvb20oInN0b3AiKSxaLmRlYnVnJiZlPT0iYnV0dG9uWm9vbU91dCImJmMuYWx0S2V5JiZaLlV0aWxzLnoyNTMoKSk6ZT09ImJ1dHRvblNsaWRlciI/KG8mJih3aW5kb3cuY2xlYXJJbnRlcnZhbChvKSxvPW51bGwpLEcoKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsUykpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpfX19ZnVuY3Rpb24gUihhKXtwPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpfWZ1bmN0aW9uIFMoYSl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0O3A9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKX19dmFyIGI9dGhpcyxjPSExLGQ9bmV3IFouejEwMTtaLnNraW5QYXRoPVouVXRpbHMuejI0MyhaLnNraW5QYXRoKTt2YXIgZT1aLnNraW5QYXRoKyIvIjtkLmxvYWRYTUwoWi5za2luUGF0aCsiLyIrWi5VdGlscy56MTg1KCJ6NTUiKSk7dmFyIGYsZyxoLGksaixrLGw9W10sbT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1NyIpLDEwKSxuPSExLG89bnVsbCxwPW51bGwscT1udWxsLHIscyx0O3RoaXMuejIwNT1mdW5jdGlvbihhLGIpe1ouVG9vbGJhckRpc3BsYXk9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUb29sYmFyRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIiwiMXB4IiwiMXB4IiwiMHB4IiwiMXB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJkZWZhdWx0IiksZz1aLlRvb2xiYXJEaXNwbGF5LnN0eWxlO3ZhciBjPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChjLmVsbXQpLHRvb2xiYXJTa2luU2l6ZXM9YTtpZihaLmxvZ29WaXNpYmxlKXt2YXIgZDtpZighWi5VdGlscy5pc1N0clZhbChaLmxvZ29DdXN0b21QYXRoKSlkPW5ldyBaLlV0aWxzLkdyYXBoaWMoInRvb2xiYXJMb2dvIixlLGJbMV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO2Vsc2V7dmFyIGg9Wi5VdGlscy56MTQwKFoubG9nb0N1c3RvbVBhdGgpO2Q9bmV3IFouVXRpbHMuR3JhcGhpYygidG9vbGJhckxvZ28iLGgsbnVsbCwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iil9Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChkLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGU9PTB8fFoudG9vbGJhclZpc2libGU9PTEpe3ZhciBpPW5ldyBaLlV0aWxzLkdyYXBoaWMoImxvZ29EaXZpZGVyIixlLGJbMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQoaS5lbG10KX19dmFyIGo9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJidXR0b25Db250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIsImRlZmF1bHQiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKGopLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihqLCJ0b3VjaHN0YXJ0IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlb3ZlciIsSSkpO3ZhciBrPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJ1dHRvbkJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChrLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTF8fFoubW9iaWxlRGV2aWNlKXt2YXIgbD1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbk1pbmltaXplIixudWxsLGUsYlszXSxiWzRdLGJbNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwNyIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQobC5lbG10KTt2YXIgbT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4cGFuZCIsbnVsbCxlLGJbNl0sYls3XSxiWzhdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDUiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKG0uZWxtdCl9dmFyIG49bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25ab29tT3V0IixudWxsLGUsYls5XSxiWzEwXSxiWzExXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4IiwibW91c2VvdmVyIixKLCJ6MTIwIik7ai5hcHBlbmRDaGlsZChuLmVsbXQpO2lmKFouc2xpZGVyVmlzaWJsZSl7dmFyIG89bmV3IFouVXRpbHMuR3JhcGhpYygidHJhY2tTbGlkZXIiLGUsYlsxMl0sIjFweCIsIjFweCIsIjBweCIsIjBweCIpO2ouYXBwZW5kQ2hpbGQoby5lbG10KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoby5lbG10LCJtb3VzZWRvd24iLEopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLmVsbXQsInRvdWNoc3RhcnQiLEopO3ZhciBwPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uU2xpZGVyIixudWxsLGUsYlsxNF0sYlsxNV0sYlsxNl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExNCIpO2ouYXBwZW5kQ2hpbGQocC5lbG10KX12YXIgcT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblpvb21JbiIsbnVsbCxlLGJbMTddLGJbMThdLGJbMTldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTkiKTtqLmFwcGVuZENoaWxkKHEuZWxtdCk7dmFyIHI9bmV3IFouVXRpbHMuR3JhcGhpYygicGFuRGl2aWRlciIsZSxiWzIwXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iik7ai5hcHBlbmRDaGlsZChyLmVsbXQpO3ZhciBzPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uUGFuTGVmdCIsbnVsbCxlLGJbMjFdLGJbMjJdLGJbMjNdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDkiKTtqLmFwcGVuZENoaWxkKHMuZWxtdCk7dmFyIHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5VcCIsbnVsbCxlLGJbMjRdLGJbMjVdLGJbMjZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTEiKTtqLmFwcGVuZENoaWxkKHQuZWxtdCk7dmFyIHU9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5Eb3duIixudWxsLGUsYlsyN10sYlsyOF0sYlsyOV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwOCIpO2ouYXBwZW5kQ2hpbGQodS5lbG10KTt2YXIgdj1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblBhblJpZ2h0IixudWxsLGUsYlszMF0sYlszMV0sYlszMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMCIpO2ouYXBwZW5kQ2hpbGQodi5lbG10KTt2YXIgeT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblJlc2V0IixudWxsLGUsYlszM10sYlszNF0sYlszNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMiIpO2ouYXBwZW5kQ2hpbGQoeS5lbG10KTtpZihaLmZ1bGxQYWdlVmlzaWJsZSl7dmFyIEE9bmV3IFouVXRpbHMuR3JhcGhpYygiZnVsbFBhZ2VEaXZpZGVyIixlLGJbMzZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiKTtqLmFwcGVuZENoaWxkKEEuZWxtdCk7dmFyIEI9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25GdWxsUGFnZSIsbnVsbCxlLGJbMzddLGJbMzhdLGJbMzldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTgiKTtqLmFwcGVuZENoaWxkKEIuZWxtdCl9aWYoWi5wcm9ncmVzc1Zpc2libGUpe3ZhciBEPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwicHJvZ3Jlc3NUZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLEU9dG9vbGJhclNraW5TaXplc1sxNl0rInB4IjtqLmFwcGVuZENoaWxkKEQpO3ZhciBGPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFouVXRpbHMuejE4NSgiejUyIikpO0QuYXBwZW5kQ2hpbGQoWi5VdGlscy5jcmVhdGVDZW50ZXJlZEVsZW1lbnQoRikpLFouVXRpbHMuejI1MShGLCJibGFjayIsInZlcmRhbmEiLEUsIm5vbmUiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCIxZW0iLCJsZWZ0Iiwibm9uZSIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihELCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5kaXNhYmxlVGV4dEludGVyYWN0aW9uKEYpfVouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRvb2xiYXJEaXNwbGF5KSxaLnRvb2xiYXJXPXRvb2xiYXJTa2luU2l6ZXNbMF0sWi50b29sYmFyQ3VycmVudFc9Wi50b29sYmFyVz09LTE/Wi52aWV3ZXJXOloudG9vbGJhclcsWi50b29sYmFySD1mPXRvb2xiYXJTa2luU2l6ZXNbMV07dmFyIEc9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MDt4KFoudG9vbGJhckN1cnJlbnRXLFoudG9vbGJhckgsMCxHKTtpZihaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSl7dmFyIEg9Wi5WaWV3cG9ydC56MTg5QXNab29tKCk7QyhIKX16KFoudG9vbGJhclZpc2libGU9PTF8fFoudG9vbGJhclZpc2libGU9PTJ8fFoudG9vbGJhclZpc2libGU9PTQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlRvb2xiYXJEaXNwbGF5LCJtb3VzZW92ZXIiLFouVXRpbHMuc3RvcFByb3BhZ2F0aW9uKSx3KCEwKX0sdGhpcy56MTgwPWZ1bmN0aW9uKCl7cmV0dXJuIHYoKX0sdGhpcy5zZXRTaXplQW5kUG9zaXRpb249ZnVuY3Rpb24oYSxiLGMsZCl7eChhLGIsYyxkKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe3ooYSl9LHRoaXMuc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihhKXtBKGEpfSx0aGlzLnoyMTU9ZnVuY3Rpb24oYSl7QihhKX0sdGhpcy5zaG93UHJvZ3Jlc3M9ZnVuY3Rpb24oYSxiKXtpZihaLnByb2dyZXNzVmlzaWJsZSl7cSYmd2luZG93LmNsZWFySW50ZXJ2YWwocSk7dmFyIGMsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94IikuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDtkJiYoYT09MHx8Yj09MD8oZC5ub2RlVmFsdWU9ImxsbGxsbGxsbGwiLHE9d2luZG93LnNldEludGVydmFsKHUscGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NTEiKSksMTApKTooYz1NYXRoLnJvdW5kKDEwMC1iL2EqMTAwKSxkLm5vZGVWYWx1ZT0ibCIubXVsdGlwbHkoTWF0aC5yb3VuZChjLzEwKSkpKX19LHRoaXMuejI2Nj1mdW5jdGlvbihhKXtDKGEpfX0sWi56MTIzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHgoYSl7Wi5OYXZpZ2F0b3JEaXNwbGF5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiTmF2aWdhdG9yRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixlKyJweCIsZisicHgiLGcrInB4IixoKyJweCIsInNvbGlkIiwiMXB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLG89Wi5OYXZpZ2F0b3JEaXNwbGF5LHA9by5zdHlsZTt2YXIgYj1aLlV0aWxzLnoxODUoInozNiIpLGM9Wi5VdGlscy56MTg1KCJ6MzZOT0FMUEhBIiksZD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckJhY2tncm91bmQiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsicHgiLGYrInB4IiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsYiwiMHB4IiwiMHB4Iik7Wi5VdGlscy5zZXRPcGFjaXR5KGQsbCxjKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoZCkscT1kLHI9cS5zdHlsZTt2YXIgaj1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckltYWdlQ29udGFpbmVyIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGUrInB4IixmKyJweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChuKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoaikscz1qLHQ9cy5zdHlsZSx1PW47dmFyIGs9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJuYXZpZ2F0b3JSZWN0YW5nbGUiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsxKyJweCIsZisxKyJweCIsZysicHgiLGgrInB4Iiwic29saWQiLCIxcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ay5zdHlsZS5ib3JkZXJDb2xvcj1aLlV0aWxzLnoxODUoIno0MSIpLFouTmF2aWdhdG9yRGlzcGxheS5hcHBlbmRDaGlsZChrKSx2PWssdz12LnN0eWxlLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLk5hdmlnYXRvckRpc3BsYXkpLEMoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCksWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaHN0YXJ0IixQKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2htb3ZlIixRKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2hlbmQiLFIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaGNhbmNlbCIsUykpOihaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2VvdmVyIixaLlV0aWxzLnN0b3BQcm9wYWdhdGlvbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKG8sIm1vdXNlZG93biIsTSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLEIoITApLEcoKX1mdW5jdGlvbiB5KGEpe0MoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCl9ZnVuY3Rpb24geigpe2lmKEEoKSl7ZCYmKHdpbmRvdy5jbGVhckludGVydmFsKGQpLGQ9bnVsbCk7aWYoIW98fCFwfHwhcXx8IXJ8fCFzfHwhdHx8IXV8fCF2fHwhdylvPVouTmF2aWdhdG9yRGlzcGxheSxwPW8uc3R5bGUscT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1swXSxyPXEuc3R5bGUscz1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXSx0PXMuc3R5bGUsdT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXS5maXJzdENoaWxkLHY9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMl0sdz12LnN0eWxlfX1mdW5jdGlvbiBBKCl7cmV0dXJuIGN9ZnVuY3Rpb24gQihhKXtjPWF9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2F8fChhPVoubmF2aWdhdG9yVyksYnx8KGI9Wi5uYXZpZ2F0b3JIKSxjfHwoYz0wKSxkfHwoZD0wKSxvfHwobz1aLk5hdmlnYXRvckRpc3BsYXkpLHB8fChwPW8uc3R5bGUpLHU9by5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQ7aWYobyYmcCYmdSl7aWYoZSl7dmFyIGY9MSxnPTE7ZT09MD9nPVoudmlld2VyVy9aLnZpZXdlckg6Zz11LndpZHRoL3UuaGVpZ2h0LGY+MT8oYj1hLGIvPWcpOihhPWIsYSo9Zyl9cC53aWR0aD1hKyJweCIscC5oZWlnaHQ9YisicHgiLHAubGVmdD1jLTErInB4IixwLnRvcD1kLTErInB4IixEKGEsYil9fWZ1bmN0aW9uIEQoYSxiKXtyfHwocj1aLk5hdmlnYXRvckRpc3BsYXkuZmlyc3RDaGlsZC5zdHlsZSksdHx8KHQ9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMV0uc3R5bGUpLHV8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpLHImJnQmJnUmJihyLndpZHRoPWErInB4IixyLmhlaWdodD1iKyJweCIsRShhLGIsdS53aWR0aCx1LmhlaWdodCksdC53aWR0aD11LndpZHRoKyJweCIsdC5oZWlnaHQ9dS5oZWlnaHQrInB4Iix0LmxlZnQ9KGEtcGFyc2VGbG9hdCh0LndpZHRoKSkvMisicHgiLHQudG9wPShiLXBhcnNlRmxvYXQodC5oZWlnaHQpKS8yKyJweCIsRygpKX1mdW5jdGlvbiBFKGEsYixjLGQpe3V8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpO2lmKHUpe3ZhciBlPWMvZCxmPWEvYyxnPWIvZCxoPTAsaT0wO2Y8PWc/KGM9YSxkPWEvZSxpPShiLWQqKGEvYykpLzIpOmc8ZiYmKGQ9YixjPWIqZSxoPShhLWMqKGIvZCkpLzIpLHUud2lkdGg9Yyx1LmhlaWdodD1kfX1mdW5jdGlvbiBGKCl7cHx8KHA9Wi5OYXZpZ2F0b3JEaXNwbGF5LnN0eWxlKSxwJiYocC56SW5kZXg9cC56SW5kZXgrMTAwKX1mdW5jdGlvbiBHKCl7aWYoWi5WaWV3cG9ydCYmWi5WaWV3cG9ydC56MTgwKCkpe0koKTt2YXIgYT1aLlZpZXdwb3J0LnoxNDEoKTtKKGEpfX1mdW5jdGlvbiBIKGEpe3B8fChwPVouTmF2aWdhdG9yRGlzcGxheS5zdHlsZSkscCYmKGE/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuZGlzcGxheT0ibm9uZSIpfWZ1bmN0aW9uIEkoKXtpZih1JiZ3KXt2YXIgYT11LndpZHRoL1ouaW1hZ2VXLGI9dS5oZWlnaHQvWi5pbWFnZUgsYz1aLlZpZXdwb3J0LnoxODlBc1pvb20oKSxkPVoudmlld2VyVyphL2MsZT1aLnZpZXdlckgqYi9jO3cud2lkdGg9ZCsicHgiLHcuaGVpZ2h0PWUrInB4In19ZnVuY3Rpb24gSihhKXtpZih1JiZ3JiZ0KXt2YXIgYj11LndpZHRoL1ouaW1hZ2VXLGM9dS5oZWlnaHQvWi5pbWFnZUgsZD1hLngqYixlPWEueSpjLGY9ZC1wYXJzZUZsb2F0KHcud2lkdGgpLzIsZz1lLXBhcnNlRmxvYXQody5oZWlnaHQpLzI7dy5sZWZ0PWYrcGFyc2VGbG9hdCh0LmxlZnQpKyJweCIsdy50b3A9ZytwYXJzZUZsb2F0KHQudG9wKSsicHgifX1mdW5jdGlvbiBLKCl7aWYodyYmdCYmdSl7dmFyIGE9cGFyc2VGbG9hdCh3LmxlZnQpLXBhcnNlRmxvYXQodC5sZWZ0KSxiPXBhcnNlRmxvYXQody50b3ApLXBhcnNlRmxvYXQodC50b3ApLGM9YSsocGFyc2VGbG9hdCh3LndpZHRoKS0xKS8yLGQ9YisocGFyc2VGbG9hdCh3LmhlaWdodCktMSkvMixlPVouaW1hZ2VXL3Uud2lkdGgsZj1aLmltYWdlSC91LmhlaWdodCxnPWMqZSxoPWQqZjtaLlZpZXdwb3J0LnoyNjcoZyxoKX19ZnVuY3Rpb24gTCgpe1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4OCIpKX1mdW5jdGlvbiBNKGEpe2lmKG8mJnYmJncpe3ZhciBhPVouVXRpbHMuZXZlbnQoYSk7di5tb3VzZVhQcmlvcj1hLmNsaWVudFgsdi5tb3VzZVlQcmlvcj1hLmNsaWVudFksemFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChhLmNsaWVudFgsYS5jbGllbnRZKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vtb3ZlIixOKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2V1cCIsTyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixPKX19ZnVuY3Rpb24gTihhKXtpZih2JiZ3KXt2YXIgYj1wYXJzZUZsb2F0KHcubGVmdCksYz1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWIrKGEuY2xpZW50WC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWMrKGEuY2xpZW50WS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9YS5jbGllbnRYLHYubW91c2VZUHJpb3I9YS5jbGllbnRZLEsoKSwhMX19ZnVuY3Rpb24gTyhhKXtpZihvJiZ2JiZ3KXtkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNlbW92ZSIsTiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNldXAiLE8pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsTyk7dmFyIGE9Wi5VdGlscy5ldmVudChhKSxiPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpLGM9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1iLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWIueSwyKSk7aWYoYzw0KXt2YXIgZD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9YS5jbGllbnRYLWQueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1hLmNsaWVudFktZC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFAoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKG8mJnYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7emFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChkLngsZC55KSx2Lm1vdXNlWFByaW9yPWQueCx2Lm1vdXNlWVByaW9yPWQueSx6YXB0dkRyYWdQdFN0YXJ0PW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX19ZnVuY3Rpb24gUShhKXthLnByZXZlbnREZWZhdWx0KCk7aWYoIVoubW91c2VQYW4pcmV0dXJuO2lmKHYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSksZT1wYXJzZUZsb2F0KHcubGVmdCksZj1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWUrKGQueC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWYrKGQueS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9ZC54LHYubW91c2VZUHJpb3I9ZC55LEsoKSwhMX19cmV0dXJuITF9ZnVuY3Rpb24gUihhKXtpZihvJiZ2JiZ3KXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYil7dmFyIGM9Yi50YXJnZXQsZD1uZXcgWi5VdGlscy5Qb2ludChiLnBhZ2VYLGIucGFnZVkpLGU9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksZj1NYXRoLnNxcnQoTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC54LWUueCwyKStNYXRoLnBvdyh6YXB0dkRyYWdQdFN0YXJ0LnktZS55LDIpKSxnPVoubW9iaWxlRGV2aWNlPzY6MztpZihmPGcpe3ZhciBoPVouVXRpbHMuejE3NChaLk5hdmlnYXRvckRpc3BsYXkpO3cubGVmdD1kLngtaC54LXBhcnNlRmxvYXQody53aWR0aCkvMisicHgiLHcudG9wPWQueS1oLnktcGFyc2VGbG9hdCh3LmhlaWdodCkvMisicHgifX1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFMoYSl7aWYobyYmdiYmdyl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0LGQ9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKSxlPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpLGY9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1lLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWUueSwyKSksZz1aLm1vYmlsZURldmljZT82OjM7aWYoZjxnKXt2YXIgaD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9ZC54LWgueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1kLnktaC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In19SygpLFouVmlld3BvcnQuejI3NCgpfX12YXIgYj10aGlzLGM9ITEsZCxlPVoubmF2aWdhdG9yVyxmPVoubmF2aWdhdG9ySCxnPVoubmF2aWdhdG9yTC0xLGg9Wi5uYXZpZ2F0b3JULTEsaT1aLm5hdmlnYXRvckZpdCxqLGs9bnVsbCxsPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6MzUiKSksbT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLG49bmV3IEltYWdlO24ub25sb2FkPXgsbi5vbmVycm9yPUwsbi5zcmM9bTt2YXIgbyxwLHEscixzLHQsdSx2LHc7dGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7bT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLHMucmVtb3ZlQ2hpbGQobiksbj1udWxsLG49bmV3IEltYWdlLHMuYXBwZW5kQ2hpbGQobiksbi5vbmxvYWQ9eSxuLm9uZXJyb3I9TCxuLnNyYz1tfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gQSgpfSx0aGlzLnNldFNpemVBbmRQb3NpdGlvbj1mdW5jdGlvbihhLGIsYyxkLGUpe2V8fChlPWkpLEMoYSxiLGMsZCxlKX0sdGhpcy5zZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKGEpe0goYSl9LHRoaXMuejI2OD1mdW5jdGlvbigpe0coKX0sdGhpcy56MjYzUmVjdGFuZ2xlRGltZW5zaW9ucz1mdW5jdGlvbigpe0koKX0sdGhpcy56MjYzUmVjdGFuZ2xlUG9zaXRpb249ZnVuY3Rpb24oYSl7SihhKX0sdGhpcy56Mjc3PWZ1bmN0aW9uKCl7QSgpP3ooKTpkPXdpbmRvdy5zZXRJbnRlcnZhbCh6LDMwMCl9fSxaLnoxMDE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPW51bGwsZD10eXBlb2YgYj09ImZ1bmN0aW9uIjtpZihkKXZhciBlPWIsYj1mdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KFouVXRpbHMuY3JlYXRlQ2FsbGJhY2sobnVsbCxlLGMpLDEpfTtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl7dmFyIGY9WyJNc3htbDIuWE1MSFRUUCIsIk1zeG1sMy5YTUxIVFRQIiwiTWljcm9zb2Z0LlhNTEhUVFAiXTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl0cnl7Yz1uZXcgQWN0aXZlWE9iamVjdChmW2ddKTticmVha31jYXRjaChoKXtjb250aW51ZX19ZWxzZSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJihjPW5ldyBYTUxIdHRwUmVxdWVzdCk7Y3x8Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejk5IikpLGQmJihjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09NCYmKGMub25yZWFkeXN0YXRlY2hhbmdlPW5ldyBGdW5jdGlvbixiKCkpfSk7dHJ5e2Mub3BlbigiR0VUIixhLGQpLGMuc2VuZChudWxsKX1jYXRjaChoKXthLmluZGV4T2YoIkltYWdlUHJvcGVydGllcy54bWwiKSE9LTE/Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg3LUlNQUdFWE1MIikpOmEuaW5kZXhPZigic2tpbkZpbGVzLnhtbCIpIT0tMT9aLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODctVE9PTEJBUlhNTCIpKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODciKSksYy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxjPW51bGx9cmV0dXJuIGQ/bnVsbDpjfWZ1bmN0aW9uIGQoYSl7aWYoYSl7aWYoIWEpWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg5IikpO2Vsc2UgaWYoYS5zdGF0dXMhPT0yMDAmJmEuc3RhdHVzIT09MCl7dmFyIGI9YS5zdGF0dXMsYz1iPT00MDQ/Ik5vdCBGb3VuZCI6YS5zdGF0dXNUZXh0O1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MCIpK2IrIiAtICIrYyl9dmFyIGQ9bnVsbDthLnJlc3BvbnNlWE1MJiZhLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudD9kPWEucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQmJihkPVouVXRpbHMuejE1OChhLnJlc3BvbnNlVGV4dCkpLGUoZCl9ZWxzZSBaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODQiKSl9ZnVuY3Rpb24gZShhKXtpZihhJiZhLmRvY3VtZW50RWxlbWVudCl7dmFyIGI9YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZTtiPT0iQ09QWVJJR0hUIj9mKCJjb3B5cmlnaHQiLGEpOmI9PSJJTUFHRV9QUk9QRVJUSUVTIj9mKCJpbWFnZSIsYSk6Yj09IlNLSU5EQVRBIj9mKCJza2luIixhKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6MTAwIikpfWVsc2UgWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejEwMCIpKX1mdW5jdGlvbiBmKGEsYil7aWYoYT09ImNvcHlyaWdodCIpe3ZhciBjPWIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiU1RBVEVNRU5UVEVYVCIpLGQ9Yi5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJERUNMSU5FRFRFWFQiKTtaLlV0aWxzLmlzU3RyVmFsKGMpP1ouVXRpbHMuejI1MighMCxjLGQpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJpbWFnZSIpe3ZhciBlPXBhcnNlSW50KGIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiV0lEVEgiKSwxMCksZj1wYXJzZUludChiLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIkhFSUdIVCIpLDEwKTshaXNOYU4oZSkmJmU+MCYmIWlzTmFOKGYpJiZmPjA/Wi5WaWV3cG9ydCYmKFouVmlld3BvcnQuejE4MCgpP1ouVmlld3BvcnQucmV6MjA2KGUsZik6Wi5WaWV3cG9ydC56MjA2KGUsZikpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJza2luIil7Wi5za2luTW9kZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOTU9ERSIpLm5vZGVWYWx1ZTt2YXIgZyxoO1ouc2tpbk1vZGU9PTF8fFouc2tpbk1vZGU9PTAmJiFaLm1vYmlsZURldmljZT8oZz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJGT0xERVJTVEFOREFSRCIpLm5vZGVWYWx1ZSxoPSJTSVpFU1NUQU5EQVJEIik6KGc9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU0VUVVAiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRk9MREVSTEFSR0UiKS5ub2RlVmFsdWUsaD0iU0laRVNMQVJHRSIpO3ZhciBpPVtdO2kucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlRPT0xCQVJXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiVE9PTEJBUkgiKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJMT0dPVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkxPR09IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRElWSURFUlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJESVZJREVSSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiQlVUVE9OU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNMSURFUkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTTElERVJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tIIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTRk9OVFNJWkUiKS5ub2RlVmFsdWUpKTt2YXIgaj1bXSxrPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZJTEVTIilbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNLSU4wIikubm9kZVZhbHVlLGw9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRklMRVMiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0tJTjM5Iikubm9kZVZhbHVlO2lmKFouVXRpbHMuaXNTdHJWYWwoaykmJlouVXRpbHMuaXNTdHJWYWwobCkpe3ZhciBtPSExO2Zvcih2YXIgbj0wO248NDA7bisrKXt2YXIgbz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGSUxFUyIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOIituKS5ub2RlVmFsdWU7Wi5VdGlscy5pc1N0clZhbChvKT9qW25dPWcrIi8iK286KGpbbl09Im51bGwiLG09ITApfW0mJlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIkVSUk9SX1NLSU5TWE1MTUlTU0lOR05BTUVTIikpLFouVG9vbGJhciYmWi5Ub29sYmFyLnoyMDUoaSxqKX1lbHNlIFouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MSIpKX19ZnVuY3Rpb24gZyhhLGMsZCl7Yi0tO2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXRyeXthKGQpfWNhdGNoKGUpe1ouVXRpbHMuejI1NShlLm5hbWUrWi5VdGlscy56MTg1KCJ6ODMiKStjKyIgIitlLm1lc3NhZ2UpfX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gZShlKXtjLm9ubG9hZD1udWxsLGMub25hYm9ydD1udWxsLGMub25lcnJvcj1udWxsLGQmJndpbmRvdy5jbGVhclRpbWVvdXQoZCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtiKGEsZT9jOm51bGwpfSwxKX12YXIgYz1udWxsLGQ9bnVsbDt0aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7Yz1uZXcgSW1hZ2U7dmFyIGI9ZnVuY3Rpb24oKXtlKCEwKX0sZj1mdW5jdGlvbigpe2UoITEpfSxnPWZ1bmN0aW9uKCl7ZSghMSl9O2Mub25sb2FkPWIsYy5vbmFib3J0PWYsYy5vbmVycm9yPWYsZD13aW5kb3cuc2V0VGltZW91dChnLHBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NjAiKSkpLGMuc3JjPWF9fXZhciBiPTA7dGhpcy5sb2FkWE1MPWZ1bmN0aW9uKGEpe2MoYSxkKX0sdGhpcy56MjEySW1hZ2U9ZnVuY3Rpb24oYSxjKXtpZihiPj1wYXJzZUludChaLlV0aWxzLnoxODUoInoyNSIpLDEwKSlyZXR1cm4hMTt2YXIgZD1aLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsZyxjKSxlPW5ldyBoKGEsZCk7cmV0dXJuIGIrKyxlLnN0YXJ0KCksITB9fSxaLlV0aWxzPXt6MTYzOmZ1bmN0aW9uKCl7Wi5wYWdlQ29udGFpbmVySUQ9bnVsbCxaLmltYWdlUGF0aD1udWxsLFouc2tpblBhdGg9bnVsbCxaLnNraW5Nb2RlPW51bGwsWi5wYXJhbWV0ZXJzPW51bGwsWi5icm93c2Vycz1udWxsLFouYnJvd3Nlcj1udWxsLFouYnJvd3NlclZlcnNpb249bnVsbCxaLmNhbnZhc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3JtUHJvcGVydHk9bnVsbCxaLmNzc1RyYW5zZm9ybU5vVW5pdHM9bnVsbCxaLmFscGhhU3VwcG9ydGVkPW51bGwsWi5yZW5kZXJRdWFsaXR5PW51bGwsWi5tb2JpbGVEZXZpY2U9bnVsbCxaLmluaXRpYWxYPW51bGwsWi5pbml0aWFsWT1udWxsLFouaW5pdGlhbFo9bnVsbCxaLm1pblo9bnVsbCxaLm1heFo9bnVsbCxaLnpvb21TcGVlZD1udWxsLFoucGFuU3BlZWQ9bnVsbCxaLmZhZGVJblNwZWVkPW51bGwsWi50b29sYmFyVmlzaWJsZT1udWxsLFoudG9vbGJhclc9bnVsbCxaLnRvb2xiYXJIPW51bGwsWi50b29sYmFyUG9zaXRpb249bnVsbCxaLm5hdmlnYXRvclZpc2libGU9bnVsbCxaLm5hdmlnYXRvclc9bnVsbCxaLm5hdmlnYXRvckg9bnVsbCxaLm5hdmlnYXRvckw9bnVsbCxaLm5hdmlnYXRvclQ9bnVsbCxaLm5hdmlnYXRvckZpdD1udWxsLFouY2xpY2tab29tPW51bGwsWi5jbGlja1Bhbj1udWxsLFoubW91c2VQYW49bnVsbCxaLmtleXM9bnVsbCxaLmNvbnN0cmFpblBhbj1udWxsLFoudG9vbHRpcHNWaXNpYmxlPW51bGwsWi5jb3B5cmlnaHRQYXRoPW51bGwsWi53YXRlcm1hcmtQYXRoPW51bGwsWi5zbGlkZXJWaXNpYmxlPW51bGwsWi5mdWxsUGFnZVZpc2libGU9bnVsbCxaLnByb2dyZXNzVmlzaWJsZT1udWxsLFoubG9nb1Zpc2libGU9bnVsbCxaLmxvZ29DdXN0b21QYXRoPW51bGwsWi5jYW52YXM9bnVsbCxaLmRlYnVnPW51bGwsWi5WaWV3ZXI9bnVsbCxaLlZpZXdlckRpc3BsYXk9bnVsbCxaLlZpZXdwb3J0PW51bGwsWi5Ub29sYmFyPW51bGwsWi5Ub29sYmFyRGlzcGxheT1udWxsLFouVG9vbHRpcERpc3BsYXk9bnVsbCxaLk5hdmlnYXRvcj1udWxsLFouTmF2aWdhdG9yRGlzcGxheT1udWxsLFouQ29weXJpZ2h0RGlzcGxheT1udWxsLFouaW1hZ2VXPW51bGwsWi5pbWFnZUg9bnVsbCxaLmltYWdlWD0wLFouaW1hZ2VZPTAsWi5pbWFnZVo9MCxaLmZpdFo9bnVsbCxaLnpvb21pbmc9InN0b3AiLFoucGFubmluZ1g9InN0b3AiLFoucGFubmluZ1k9InN0b3AiLFouZnVsbFBhZ2U9ITEsWi51c2VDYW52YXM9ITAsWi5UcmFjZURpc3BsYXk9bnVsbCxaLnRyYWNlcz1udWxsfSxlbmZvcmNlQ29weXJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy56MjM4KCJpbWFnZUNvcHlyaWdodCIpO2E/Wi5WaWV3ZXIuejE0OSgpOnRoaXMuejIxMCgpfSx6MjEwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFouejEwMTthLmxvYWRYTUwoWi5jb3B5cmlnaHRQYXRoKX0sejI1MjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy56MTg1KCJ6MTYiKSxlPXRoaXMuejE4NSgiejE0Iik7aWYoYSl7Wi5Db3B5cmlnaHREaXNwbGF5PXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiQ29weXJpZ2h0RGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixaLnZpZXdlclctMisicHgiLFoudmlld2VySC0yKyJweCIsIjBweCIsIjBweCIsInNvbGlkIiwiMXB4IixkLCIwcHgiLCIwcHgiKSxaLlZpZXdlckRpc3BsYXkuYXBwZW5kQ2hpbGQoWi5Db3B5cmlnaHREaXNwbGF5KTt2YXIgZj00NDAsZz0yMDAsaD1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS53aWR0aCkvMi1mLzIsaT1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS5oZWlnaHQpLzItZy8yLGo9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJ0ZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGYrInB4IixnKyJweCIsaCsicHgiLGkrInB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiKTtqLmlkPSJ0ZXh0Qm94IixaLkNvcHlyaWdodERpc3BsYXkuYXBwZW5kQ2hpbGQoaik7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7ai5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChrKSksdGhpcy56MjUxKGssImJsYWNrIiwidmVyZGFuYSIsIjE2cHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwianVzdGlmeSIsIm5vbmUiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKTtqLmFwcGVuZENoaWxkKGwpO3ZhciBtPTgwLG49MjAsbz0zMCxwPTIwLHE9aCtmLzItKG0qMitvKS8yLHI9aStnK3Ascz10aGlzLnoxODUoInoxMyIpLHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25BZ3JlZSIscyxudWxsLG51bGwsbnVsbCxudWxsLG0rInB4IixuKyJweCIscSsicHgiLHIrInB4IiwibW91c2Vkb3duIix0aGlzLnoxNjAsInoxMDMiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMHB4Iik7Wi5Db3B5cmlnaHREaXNwbGF5LmFwcGVuZENoaWxkKHQuZWxtdCkscSs9bStvLHM9dGhpcy56MTg1KCJ6MTUiKTt2YXIgdT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4aXQiLHMsbnVsbCxudWxsLG51bGwsbnVsbCxtKyJweCIsbisicHgiLHErInB4IixyKyJweCIsIm1vdXNlZG93biIsdGhpcy56MTYxLCJ6MTA0Iiwic29saWQiLCIxcHgiLGUsIjBweCIsIjBweCIpO1ouQ29weXJpZ2h0RGlzcGxheS5hcHBlbmRDaGlsZCh1LmVsbXQpfWVsc2V7dmFyIGo9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRCb3giKSx2PWouY2hpbGROb2Rlc1sxXS50ZXh0Q29udGVudDtqLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9djt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQWdyZWUiKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwibW91c2Vkb3duIix0aGlzLnoxNjApLFouQ29weXJpZ2h0RGlzcGxheS5yZW1vdmVDaGlsZCh0KTt2YXIgdT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhpdCIpO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLHRoaXMuejE2MSksWi5Db3B5cmlnaHREaXNwbGF5LnJlbW92ZUNoaWxkKHUpfX0sQnV0dG9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpe3ZhciB0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsYSwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGcsaCxpLGosbixvLHAscSxyLHMpO2lmKCFaLlV0aWxzLmlzU3RyVmFsKGIpKXt2YXIgdT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGMrIi8iK2QpLHY9Wi5VdGlscy5jcmVhdGVHcmFwaGljRWxlbWVudChjKyIvIitlKSx3PVouVXRpbHMuY3JlYXRlR3JhcGhpY0VsZW1lbnQoYysiLyIrZik7dS5pZD10LmlkKyItaW1nVXAiLHYuaWQ9dC5pZCsiLWltZ092ZXIiLHcuaWQ9dC5pZCsiLWltZ0Rvd24iLHQuX2ltZ1VwSUQ9dS5pZCx0Ll9pbWdPdmVySUQ9di5pZCx0Ll9pbWdEb3duSUQ9dy5pZDt2YXIgeD11LnN0eWxlLHk9di5zdHlsZSx6PXcuc3R5bGU7eC5wb3NpdGlvbj15LnBvc2l0aW9uPXoucG9zaXRpb249ImFic29sdXRlIix4LndpZHRoPXkud2lkdGg9eS53aWR0aD1nLHguaGVpZ2h0PXkuaGVpZ2h0PXkuaGVpZ2h0PWgseC50b3A9eS50b3A9ei50b3A9IjBweCIseC5sZWZ0PXkubGVmdD16LmxlZnQ9IjBweCIsWi5icm93c2VyPT1aLmJyb3dzZXJzLkZJUkVGT1gmJlouYnJvd3NlclZlcnNpb248MyYmKHgudG9wPXkudG9wPXoudG9wPSIiKSx5LnZpc2liaWxpdHk9ImhpZGRlbiIsei52aXNpYmlsaXR5PSJoaWRkZW4iLHQuYXBwZW5kQ2hpbGQodSksdC5hcHBlbmRDaGlsZCh2KSx0LmFwcGVuZENoaWxkKHcpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih1LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHYsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfWVsc2V7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7dC5hcHBlbmRDaGlsZChaLlV0aWxzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChBKSksWi5VdGlscy56MjUxKEEsImJsYWNrIiwidmVyZGFuYSIsIjEzcHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwiY2VudGVyIiwibm9uZSIpLFouVXRpbHMuZGlzYWJsZVRleHRJbnRlcmFjdGlvbihBKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodCwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfVoudG9vbHRpcHNWaXNpYmxlJiZaLlV0aWxzLmlzU3RyVmFsKG0pJiYodC50aXRsZT1aLlV0aWxzLnoxODUobSkpLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJ0b3VjaHN0YXJ0IixsKTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlb3ZlciIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZW91dCIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LGssbCkpLHRoaXMuZWxtdD10fSx6MTM4OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnN0eWxlO2Qud2lkdGg9YisicHgiLGQuaGVpZ2h0PWMrInB4Ijt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdVcElEKSxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ092ZXJJRCksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdEb3duSUQpO2lmKGUmJmYmJmcpe3ZhciBoPWUuc3R5bGUsaT1mLnN0eWxlLGo9Zy5zdHlsZTtoLndpZHRoPWIrInB4IixoLmhlaWdodD1jKyJweCIsaS53aWR0aD1iKyJweCIsaS5oZWlnaHQ9YysicHgiLGoud2lkdGg9YisicHgiLGouaGVpZ2h0PWMrInB4In19LEdyYXBoaWM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9Yz9iKyIvIitjOmIsaT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGgpLGo9aS5zdHlsZTtqLndpZHRoPWQsai5oZWlnaHQ9ZTt2YXIgYz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoInNwYW4iLGEsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixkLGUsZixnLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpO2MuYXBwZW5kQ2hpbGQoaSksdGhpcy5lbG10PWMsWi5tb2JpbGVEZXZpY2U/Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksInRvdWNoc3RhcnQiLFouVXRpbHMucHJldmVudERlZmF1bHQpOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJtb3VzZWRvd24iLFouVXRpbHMucHJldmVudERlZmF1bHQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9LHoyMDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuc3R5bGU7ZC53aWR0aD1iKyJweCIsZC5oZWlnaHQ9YysicHgiO3ZhciBlPWEuZmlyc3RDaGlsZCxmPWUuc3R5bGU7Zi53aWR0aD1iKyJweCIsZi5oZWlnaHQ9YysicHgifSx6MTYwOmZ1bmN0aW9uKGEpe1ouVmlld2VyRGlzcGxheS5yZW1vdmVDaGlsZChaLkNvcHlyaWdodERpc3BsYXkpLGRvY3VtZW50LmNvb2tpZT0iaW1hZ2VDb3B5cmlnaHQ9Y29uZmlybWVkIixaLlZpZXdlci56MTQ5KCl9LHoxNjE6ZnVuY3Rpb24oYSl7Wi5VdGlscy56MjUyKCExKTtyZXR1cm59LHoxMjg6ZnVuY3Rpb24oKXtTdHJpbmcucHJvdG90eXBlLm11bHRpcGx5fHwoU3RyaW5nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5qb2luLGI9e307cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiLmxlbmd0aD1jKzEsYS5jYWxsKGIsdGhpcyl9fSgpKSxBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGEsYil7Yj9iPDAmJihiPU1hdGgubWF4KDAsdGhpcy5sZW5ndGgrYikpOmI9MDtmb3IodmFyIGM9YixkPXRoaXMubGVuZ3RoO2M8ZDtjKyspaWYodGhpc1tjXT09PWEpcmV0dXJuIGM7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUucHVzaHx8KEFycmF5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXNbdGhpcy5sZW5ndGhdPWF9KSxBcnJheS5wcm90b3R5cGUuc3BsaWNlfHwoQXJyYXkucHJvdG90eXBlLnN1YmFycj1mdW5jdGlvbihhLGIpe2lmKGE+PXRoaXMubGVuZ3RofHxiJiZiPD0wKXJldHVybltdO2E8MCYmKE1hdGguYWJzKGEpPnRoaXMubGVuZ3RoP2E9MDphPXRoaXMubGVuZ3RoK2EpO2lmKCFifHxiK2E+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aC1hO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YStiO2QrKyljLnB1c2godGhpc1tkXSk7cmV0dXJuIGN9LEFycmF5LnByb3RvdHlwZS5zdWJhcnJheT1mdW5jdGlvbihhLGIpe2E8MCYmKGE9MCk7aWYoIWJ8fGI+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aDtpZihhPT1iKXJldHVybltdO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YjtkKyspYy5wdXNoKHRoaXNbZF0pO3JldHVybiBjfSxBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGEsYil7YjwwJiYoYj0wKTt2YXIgYz1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpZm9yKHZhciBkPTIsZT1hcmd1bWVudHMubGVuZ3RoO2Q8ZTtkKyspYy5wdXNoKGFyZ3VtZW50c1tkXSk7dmFyIGY9dGhpcy5zdWJhcnJheSgwLGEpLGc9dGhpcy5zdWJhcnIoYSxiKSxoPXRoaXMuc3ViYXJyYXkoYStiKSxpPWYuY29uY2F0KGMsaCk7dGhpcy5sZW5ndGg9MDtmb3IodmFyIGQ9MCxlPWkubGVuZ3RoO2Q8ZTtkKyspdGhpcy5wdXNoKGlbZF0pO3JldHVybiBnfSl9LHoxMjc6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyPyh0aGlzLmRpc2FibGVUZXh0SW50ZXJhY3Rpb249ZnVuY3Rpb24oYSl7YSYmKHRuUz1hLnBhcmVudE5vZGUuc3R5bGUsdG5TJiYoYS5wYXJlbnROb2RlLnVuc2VsZWN0YWJsZT0ib24iLHRuUy51c2VyU2VsZWN0PSJub25lIix0blMuTW96VXNlclNlbGVjdD0ibm9uZSIsdG5TLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLHRuUy53ZWJraXRUb3VjaENhbGxvdXQ9Im5vbmUiLHRuUy53ZWJraXRUYXBIaWdobGlnaHRDb2xvcj0idHJhbnNwYXJlbnQiKSl9LHRoaXMucmVuZGVyUXVhbGl0eT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWI9PSJoaWdoIj8ib3B0aW1pemVRdWFsaXR5Ijoib3B0aW1pemVTcGVlZCI7YS5zdHlsZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIixjLG51bGwpfX0sdGhpcy5zZXRPcGFjaXR5PWZ1bmN0aW9uKGEsYixjKXtaLmFscGhhU3VwcG9ydGVkP2Euc3R5bGUub3BhY2l0eT1iOmMmJihhLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jKX0pOmRvY3VtZW50LmF0dGFjaEV2ZW50JiYodGhpcy5kaXNhYmxlVGV4dEludGVyYWN0aW9uPWZ1bmN0aW9uKGEpe2EmJihhLnBhcmVudE5vZGUudW5zZWxlY3RhYmxlPSJvbiIsYS5wYXJlbnROb2RlLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSx0aGlzLnJlbmRlclF1YWxpdHk9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iPT0iaGlnaCI/ImJpY3ViaWMiOiJuZWFyZXN0LW5laWdoYm9yIjthLnN0eWxlLm1zSW50ZXJwb2xhdGlvbk1vZGU9Y319LHRoaXMuc2V0T3BhY2l0eT1mdW5jdGlvbihhLGIsYyl7Wi5hbHBoYVN1cHBvcnRlZD8oYS5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PScgKyB2YWx1ZSArICcpIixhLnN0eWxlLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0iK2IrIikiKTpjJiYoYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Yyl9KX0sejEyNjpmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI/KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7Yj09Im1vdXNld2hlZWwiJiZlbG10LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIixjLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0sdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtiPT0ibW91c2V3aGVlbCImJmVsbXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGMsITEpLGEmJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx0aGlzLmV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhfSx0aGlzLnRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LHRoaXMucmVsYXRlZFRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxhdGVkVGFyZ2V0fSx0aGlzLmlzUmlnaHRNb3VzZUJ1dHRvbj1mdW5jdGlvbihhKXt2YXIgYj0hMTtpZihhLndoaWNoPT0yfHxhLndoaWNoPT0zKWI9ITA7cmV0dXJuIGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQmJih0aGlzLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYykhPS0xKXJldHVybjt2YXIgZD1mdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5ldmVudDtGdW5jdGlvbi5wcm90b3R5cGUuY2FsbD9jLmNhbGwoYSxiKTooYS5fY3VycmVudExpc3RlbmVyPWMsYS5fY3VycmVudExpc3RlbmVyKGIpLGEuX2N1cnJlbnRMaXN0ZW5lcj1udWxsKX07YS5hdHRhY2hFdmVudCgib24iK2IsZCk7dmFyIGU9e3RhcmdldDphLGV2ZW50TmFtZTpiLGhhbmRsZXI6YyxoYW5kbGVyMjpkfSxmPWEuZG9jdW1lbnR8fGEsZz1mLnBhcmVudFdpbmRvdyxoPSJsIit0aGlzLl9saXN0ZW5lckNvdW50ZXIrKztnLl9hbGxMaXN0ZW5lcnN8fChnLl9hbGxMaXN0ZW5lcnM9e30pLGcuX2FsbExpc3RlbmVyc1toXT1lLGEuX2xpc3RlbmVyc3x8KGEuX2xpc3RlbmVycz1bXSksYS5fbGlzdGVuZXJzW2EuX2xpc3RlbmVycy5sZW5ndGhdPWgsZy5fdW5sb2FkTGlzdGVuZXJBZGRlZHx8KGcuX3VubG9hZExpc3RlbmVyQWRkZWQ9ITAsZy5hdHRhY2hFdmVudCgib251bmxvYWQiLHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycykpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEpe3ZhciBkPXRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYyk7aWYoZD09LTEpcmV0dXJuO3ZhciBlPWEuZG9jdW1lbnR8fGEsZj1lLnBhcmVudFdpbmRvdyxnPWEuX2xpc3RlbmVyc1tkXSxoPWYuX2FsbExpc3RlbmVyc1tnXTthLmRldGFjaEV2ZW50KCJvbiIrYixoLmhhbmRsZXIyKSxhLl9saXN0ZW5lcnMuc3BsaWNlKGQsMSksZGVsZXRlIGYuX2FsbExpc3RlbmVyc1tnXX19LHRoaXMuZXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5ldmVudH0sdGhpcy50YXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3JjRWxlbWVudH0sdGhpcy5yZWxhdGVkVGFyZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIGEudHlwZT09Im1vdXNlb3ZlciI/Yj1hLmZyb21FbGVtZW50OmEudHlwZT09Im1vdXNlb3V0IiYmKGI9YS50b0VsZW1lbnQpLGJ9LHRoaXMuaXNSaWdodE1vdXNlQnV0dG9uPWZ1bmN0aW9uKGEpe3ZhciBiPSExO3JldHVybiBhLmJ1dHRvbj09MiYmKGI9ITApLGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YSYmKGEucmV0dXJuVmFsdWU9ITEpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLmNhbmNlbEJ1YmJsZT0hMH0sdGhpcy5fZmluZExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLl9saXN0ZW5lcnM7aWYoIWQpcmV0dXJuLTE7dmFyIGU9YS5kb2N1bWVudHx8YSxmPWUucGFyZW50V2luZG93O2Zvcih2YXIgZz1kLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1kW2ddLGk9Zi5fYWxsTGlzdGVuZXJzW2hdO2lmKGkuZXZlbnROYW1lPT1iJiZpLmhhbmRsZXI9PWMpcmV0dXJuIGd9cmV0dXJuLTF9LHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Zm9yKGlkIGluIGEuX2FsbExpc3RlbmVycyl7dmFyIGI9YS5fYWxsTGlzdGVuZXJzW2lkXTtiLnRhcmdldC5kZXRhY2hFdmVudCgib24iK2IuZXZlbnROYW1lLGIuaGFuZGxlcjIpLGRlbGV0ZSBhLl9hbGxMaXN0ZW5lcnNbaWRdfX0sdGhpcy5fbGlzdGVuZXJDb3VudGVyPTApfSx6MTY0OmZ1bmN0aW9uKCl7Wi5icm93c2Vycz17VU5LTk9XTjowLElFOjEsRklSRUZPWDoyLFNBRkFSSTozLENIUk9NRTo0LE9QRVJBOjV9O3ZhciBhPVouYnJvd3NlcnMuVU5LTk9XTixiPTAsYz1uYXZpZ2F0b3IuYXBwTmFtZSxkPW5hdmlnYXRvci5hcHBWZXJzaW9uLGU9ITEsZj0hMSxnPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtpZihjIT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8IXdpbmRvdy5hdHRhY2hFdmVudHx8IXdpbmRvdy5BY3RpdmVYT2JqZWN0KWlmKGMhPSJOZXRzY2FwZSJ8fCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciljPT0iT3BlcmEiJiYhIXdpbmRvdy5vcGVyYSYmISF3aW5kb3cuYXR0YWNoRXZlbnQmJihhPVouYnJvd3NlcnMuT1BFUkEsYj1wYXJzZUZsb2F0KGQpKTtlbHNle3ZhciBpPWcuaW5kZXhPZigiZmlyZWZveCIpLGo9Zy5pbmRleE9mKCJzYWZhcmkiKSxrPWcuaW5kZXhPZigiY2hyb21lIik7aWYoaT49MClhPVouYnJvd3NlcnMuRklSRUZPWCxiPXBhcnNlRmxvYXQoZy5zdWJzdHJpbmcoaSs4KSk7ZWxzZSBpZihqPj0wKXt2YXIgbD1nLnN1YnN0cmluZygwLGopLmxhc3RJbmRleE9mKCIvIik7YT1rPj0wP1ouYnJvd3NlcnMuQ0hST01FOlouYnJvd3NlcnMuU0FGQVJJLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhsKzEsaikpfXZhciBtPW5ldyBJbWFnZTttLnN0eWxlLmdldFByb3BlcnR5VmFsdWUmJihmPW0uc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiaW1hZ2UtcmVuZGVyaW5nIikpfWVsc2V7dmFyIGg9Zy5pbmRleE9mKCJtc2llIik7YT1aLmJyb3dzZXJzLklFLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhoKzUsZy5pbmRleE9mKCI7IixoKSkpLGU9dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSE9InVuZGVmaW5lZCJ9dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxvPW4uc3R5bGV8fHt9LHA9ITEscT1bInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSJdLHIsczt3aGlsZShyPXEuc2hpZnQoKSlpZih0eXBlb2Ygb1tyXSE9InVuZGVmaW5lZCIpe3A9ITAscz0vd2Via2l0L2kudGVzdChyKTticmVha312YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0JiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLHU9IShhPT1aLmJyb3dzZXJzLlNBRkFSSSYmYjw0fHxhPT1aLmJyb3dzZXJzLkNIUk9NRSYmYjwyKSx2PXQmJnUsdz0hKGE9PVouYnJvd3NlcnMuSUV8fGE9PVouYnJvd3NlcnMuQ0hST01FJiZiPDIpLHg9ZXx8Zj8iaGlnaCI6bnVsbCx5PWcuaW5kZXhPZigiYW5kcm9pZCIpPi0xfHxnLmluZGV4T2YoImlwaG9uZSIpPi0xfHxnLmluZGV4T2YoImlwYWQiKT4tMXx8Zy5pbmRleE9mKCJpcG9kIik+LTE7Wi5icm93c2VyPWEsWi5icm93c2VyVmVyc2lvbj1iLFouY2FudmFzU3VwcG9ydGVkPXYsWi51c2VDYW52YXM9Wi5jYW52YXNTdXBwb3J0ZWQsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkPXAsWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eT1yLFouY3NzVHJhbnNmb3JtTm9Vbml0cz1zLFouYWxwaGFTdXBwb3J0ZWQ9dyxaLnJlbmRlclF1YWxpdHk9eCxaLm1vYmlsZURldmljZT15fSxpc1N0clZhbDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYSE9IiJ9LHoxNzQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTAsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKTt3aGlsZShlKXtiKz1hLm9mZnNldExlZnQsYys9YS5vZmZzZXRUb3A7aWYoZCl7dmFyIGY9dGhpcy56MTg0KCk7Yis9Zi54LGMrPWYueX1hPWUsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKX1yZXR1cm4gbmV3IHRoaXMuUG9pbnQoYixjKX0sejE4MzpmdW5jdGlvbihhLGIpe3JldHVybiBiJiZhIT1kb2N1bWVudC5ib2R5P2RvY3VtZW50LmJvZHk6YS5vZmZzZXRQYXJlbnR9LHoxNzU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLlBvaW50KGEuY2xpZW50V2lkdGgsYS5jbGllbnRIZWlnaHQpfSx6MTc2OmZ1bmN0aW9uKGEpe2lmKGEuY3VycmVudFN0eWxlKXJldHVybiBhLmN1cnJlbnRTdHlsZTtpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIik7dGhpcy56MjU1KHRoaXMuejE4NSgiejkzIikpfSx6MTc3OmZ1bmN0aW9uKGEpe3JldHVybiB6MTc0KFouVXRpbHMudGFyZ2V0KGEpKX0sejE3ODpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9YS50b3VjaGVzLGQ9YS5jaGFuZ2VkVG91Y2hlcztyZXR1cm4gYyE9PXVuZGVmaW5lZD9iPWNbMF06ZCE9PXVuZGVmaW5lZCYmKGI9ZFswXSksYn0sejE4MTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtyZXR1cm4gYS50eXBlPT0iRE9NTW91c2VTY3JvbGwiJiZicm93c2VyPT1Ccm93c2VyLkZJUkVGT1gmJmJyb3dzZXJWZXJzaW9uPDM/KGI9YS5zY3JlZW5YLGM9YS5zY3JlZW5ZKTp0eXBlb2YgYS5wYWdlWD09Im51bWJlciI/KGI9YS5wYWdlWCxjPWEucGFnZVkpOnR5cGVvZiBhLmNsaWVudFg9PSJudW1iZXIiPyhiPWEuY2xpZW50WCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsYz1hLmNsaWVudFkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk6dGhpcy56MjU1KHRoaXMuejE4NSgiejk0IikpLG5ldyB0aGlzLlBvaW50KGIsYyl9LHoxODI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gdHlwZW9mIGEud2hlZWxEZWx0YT09Im51bWJlciI/Yj1hLndoZWVsRGVsdGE6dHlwZW9mIGEuZGV0YWlsPT0ibnVtYmVyIj9iPWEuZGV0YWlsKi0xOnRoaXMuejI1NSh0aGlzLnoxODUoIno5NSIpKSxiP2IvTWF0aC5hYnMoYik6MH0sejE4NDpmdW5jdGlvbigpe3ZhciBhPTAsYj0wLGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxkPWRvY3VtZW50LmJvZHl8fHt9O2lmKHR5cGVvZiB3aW5kb3cucGFnZVhPZmZzZXQ9PSJudW1iZXIiKWE9d2luZG93LnBhZ2VYT2Zmc2V0LGI9d2luZG93LnBhZ2VZT2Zmc2V0O2Vsc2UgaWYoZC5zY3JvbGxMZWZ0fHxkLnNjcm9sbFRvcClhPWQuc2Nyb2xsTGVmdCxiPWQuc2Nyb2xsVG9wO2Vsc2UgaWYoYy5zY3JvbGxMZWZ0fHxjLnNjcm9sbFRvcClhPWMuc2Nyb2xsTGVmdCxiPWMuc2Nyb2xsVG9wO3JldHVybiBuZXcgdGhpcy5Qb2ludChhLGIpfSx6MjAxaW5kb3dTaXplOmZ1bmN0aW9uKCl7dmFyIGE9MCxiPTAsYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHt9LGQ9ZG9jdW1lbnQuYm9keXx8e307cmV0dXJuIHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aD09Im51bWJlciI/KGE9d2luZG93LmlubmVyV2lkdGgsYj13aW5kb3cuaW5uZXJIZWlnaHQpOmMuY2xpZW50V2lkdGh8fGMuY2xpZW50SGVpZ2h0PyhhPWMuY2xpZW50V2lkdGgsYj1jLmNsaWVudEhlaWdodCk6ZC5jbGllbnRXaWR0aHx8ZC5jbGllbnRIZWlnaHQ/KGE9ZC5jbGllbnRXaWR0aCxiPWQuY2xpZW50SGVpZ2h0KTp0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTYiKSksbmV3IHRoaXMuUG9pbnQoYSxiKX0sejIyNTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPWE7d2hpbGUoYj09ITEpaWYoYyljLmlkP2MuaWQ9PSJWaWV3ZXJEaXNwbGF5Ij9iPSEwOmM9Yy5wYXJlbnROb2RlOmM9Yy5wYXJlbnROb2RlO2Vsc2UgYnJlYWs7cmV0dXJuIGJ9LHoyMzg6ZnVuY3Rpb24oYSl7dmFyIGI9YSsiPSIsYz1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt3aGlsZShlLmNoYXJBdCgwKT09IiAiKWU9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aCk7aWYoZS5pbmRleE9mKGIpPT0wKXJldHVybiBlLnN1YnN0cmluZyhiLmxlbmd0aCxlLmxlbmd0aCl9cmV0dXJuIG51bGx9LHoyNDM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zbGljZSgtMSxhLmxlbmd0aCk9PSIvIj9hLnNsaWNlKDAsYS5sZW5ndGgtMSk6YTtyZXR1cm4gYj1hLnNsaWNlKDAsMSk9PSIvIj9hLnNsaWNlKDEsYS5sZW5ndGgpOmEsYn0sejE0MDpmdW5jdGlvbihhKXtpZihaLmJyb3dzZXI9PVouYnJvd3NlcnMuSUUpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCksYz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCksZD1jK2I7YSs9Ij9zdWZmaXhUb0Jsb2NrUGF0aENhY2hpbmc9IitkfXJldHVybiBhfSx6MTcwOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYSphKmEqYStiOmMvMiooKGEtPTIpKmEqYSphKmErMikrYn0sejIzMzpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYSYmKGI9YS5zcGxpdCgiJiIpKSxifSx6MjQ5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuejE4NSgiejUwIiksYz10aGlzLnoxODUoIno0OSIpLGQ9dGhpcy56MTg1KCJ6NDgiKTtaLnNraW5QYXRoPXRoaXMuejE4NSgiejU2IiksWi5za2luTW9kZT10aGlzLnoxODUoIno1NCIpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjYiKSkpfHwoWi5pbml0aWFsWD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejI2IikpKSxpc05hTihwYXJzZUZsb2F0KHRoaXMuejE4NSgiejI3IikpKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdCh0aGlzLnoxODUoInoyNyIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoInoyOCIpKSl8fChaLmluaXRpYWxaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjgiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpfHwoWi5taW5aPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpfHwoWi5tYXhaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6ODAiKSkpfHwoWi56b29tU3BlZWQ9cGFyc2VGbG9hdCh0aGlzLnoxODUoIno4MCIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoIno0NiIpKSl8fChaLnBhblNwZWVkPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NDYiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MTgiKSkpfHwoWi5mYWRlSW5TcGVlZD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejE4IikpKSxaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KHRoaXMuejE4NSgiejY0IiksMTApLFoudG9vbGJhclBvc2l0aW9uPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NjMiKSksWi50b29sdGlwc1Zpc2libGU9dGhpcy56MTg1KCJ6NjUiKSE9IjAiLFoubmF2aWdhdG9yVmlzaWJsZT1wYXJzZUludCh0aGlzLnoxODUoIno0MyIpLDEwKSxaLm5hdmlnYXRvclc9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDQiKSwxMCksWi5uYXZpZ2F0b3JIPXBhcnNlSW50KHRoaXMuejE4NSgiejM5IiksMTApLFoubmF2aWdhdG9yTD1wYXJzZUludCh0aGlzLnoxODUoIno0MCIpLDEwKSxaLm5hdmlnYXRvclQ9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDIiKSwxMCksWi5uYXZpZ2F0b3JGaXQ9dGhpcy56MTg1KCJ6MzgiKSxaLmNsaWNrWm9vbT10aGlzLnoxODUoInoxMCIpIT0iMCIsWi5jbGlja1Bhbj10aGlzLnoxODUoIno5IikhPSIwIixaLm1vdXNlUGFuPXRoaXMuejE4NSgiejM0IikhPSIwIixaLmtleXM9dGhpcy56MTg1KCJ6MjkiKSE9IjAiLFouY29uc3RyYWluUGFuPXRoaXMuejE4NSgiejEyIikhPSIwIixaLnNsaWRlclZpc2libGU9dGhpcy56MTg1KCJ6NTgiKSE9IjAiLFouZnVsbFBhZ2VWaXNpYmxlPXRoaXMuejE4NSgiejIzIikhPSIwIixaLnByb2dyZXNzVmlzaWJsZT10aGlzLnoxODUoIno1MyIpIT0iMCIsWi5sb2dvVmlzaWJsZT10aGlzLnoxODUoInozMSIpIT0iMCIsWi5sb2dvQ3VzdG9tUGF0aD10aGlzLnoxODUoInozMCIpLFouY2FudmFzPXRoaXMuejE4NSgiejgiKSE9IjAiLFouZGVidWc9dGhpcy56MTg1KCJ6MTciKSE9IjAiO2lmKHRoaXMuaXNTdHJWYWwoYSkpZm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZz1hW2VdLGg9Zy5pbmRleE9mKCI9Iik7aWYoaD4wKXt2YXIgaT1nLnN1YnN0cmluZygwLGgpLGo9Zy5zdWJzdHJpbmcoaCsxKTtpZih0aGlzLmlzU3RyVmFsKGopKXN3aXRjaChpKXtjYXNlInpJbml0aWFsWCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLmluaXRpYWxYPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2UiekluaXRpYWxZIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6SW5pdGlhbFpvb20iOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5pbml0aWFsWj1wYXJzZUZsb2F0KGopLFouaW5pdGlhbFomJihaLmluaXRpYWxaLz0xMDApKTticmVhaztjYXNlInpNaW5ab29tIjohaXNOYU4ocGFyc2VGbG9hdChqKSkmJnBhcnNlRmxvYXQoaik+LjAxJiYoWi5taW5aPXBhcnNlRmxvYXQoaiksWi5taW5aJiYoWi5taW5aLz0xMDApKTticmVhaztjYXNlInpNYXhab29tIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubWF4Wj1wYXJzZUZsb2F0KGopLFoubWF4WiYmKFoubWF4Wi89MTAwKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9yVmlzaWJsZSI6Wi5uYXZpZ2F0b3JWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UielRvb2xiYXJWaXNpYmxlIjpaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UiekxvZ29WaXNpYmxlIjpqPT0iMCImJihaLmxvZ29WaXNpYmxlPSExKTticmVhaztjYXNlInpTbGlkZXJWaXNpYmxlIjpqPT0iMCImJihaLnNsaWRlclZpc2libGU9ITEpO2JyZWFrO2Nhc2UiekZ1bGxQYWdlVmlzaWJsZSI6aj09IjAiJiYoWi5mdWxsUGFnZVZpc2libGU9ITEpO2JyZWFrO2Nhc2UielByb2dyZXNzVmlzaWJsZSI6aj09IjAiJiYoWi5wcm9ncmVzc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielRvb2x0aXBzVmlzaWJsZSI6aj09IjAiJiYoWi50b29sdGlwc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielNraW5QYXRoIjpaLnNraW5QYXRoPWo7YnJlYWs7ZGVmYXVsdDppZihiPT1jKWFsZXJ0KGQrIiAiK2kpO2Vsc2Ugc3dpdGNoKGkpe2Nhc2Uielpvb21TcGVlZCI6Wi56b29tU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6UGFuU3BlZWQiOloucGFuU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6RmFkZUluU3BlZWQiOlouZmFkZUluU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6VG9vbGJhclBvc2l0aW9uIjpaLnRvb2xiYXJQb3NpdGlvbj1wYXJzZUludChqLDEwKTticmVhaztjYXNlInpOYXZpZ2F0b3JXaWR0aCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvclc9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9ySGVpZ2h0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9ySD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JMZWZ0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9yTD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JUb3AiOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5uYXZpZ2F0b3JUPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2Uiek5hdmlnYXRvckZpdCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvckZpdD1wYXJzZUludChqLDEwKSk7YnJlYWs7Y2FzZSJ6Q2xpY2tab29tIjpqPT0iMCImJihaLmNsaWNrWm9vbT0hMSk7YnJlYWs7Y2FzZSJ6Q2xpY2tQYW4iOmo9PSIwIiYmKFouY2xpY2tQYW49ITEpO2JyZWFrO2Nhc2Uiek1vdXNlUGFuIjpqPT0iMCImJihaLm1vdXNlUGFuPSExKTticmVhaztjYXNlInpLZXlzIjpqPT0iMCImJihaLmtleXM9ITEpO2JyZWFrO2Nhc2UiekNvbnN0cmFpblBhbiI6aj09IjAiJiYoWi5jb25zdHJhaW5QYW49ITEpO2JyZWFrO2Nhc2UiekNvcHlyaWdodFBhdGgiOlouY29weXJpZ2h0UGF0aD1qO2JyZWFrO2Nhc2UieldhdGVybWFya1BhdGgiOloud2F0ZXJtYXJrUGF0aD1qO2JyZWFrO2Nhc2UiekxvZ29DdXN0b21QYXRoIjpaLmxvZ29DdXN0b21QYXRoPWo7YnJlYWs7Y2FzZSJ6Q2FudmFzIjpqPT0iMCImJihaLmNhbnZhcz0hMSk7aWYoIVouY2FudmFzU3VwcG9ydGVkfHwhWi5jYW52YXMpWi51c2VDYW52YXM9ITE7YnJlYWs7Y2FzZSJ6RGVidWciOmo9PSIxIiYmKFouZGVidWc9ITApfX19fX0sejI0MjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MTtiPGEubGVuZ3RoOylhW2ItMV09PWFbYl0/YS5zcGxpY2UoYiwxKTpiKys7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdLGY9ITE7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aCYmZT49KGVsbXQyPWJbZ10pO2crKylpZihlbG10Mj09ZSl7Zj0hMDticmVha31mJiZjLnB1c2goYVtkXSl9cmV0dXJuIGN9LHN1YnRyYWN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT0hMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoJiZkPj0oZWxtdDI9YltmXSk7ZisrKWlmKGVsbXQyPT1kKXtlPSEwO2JyZWFrfWUmJmEuc3BsaWNlKGMtLSwxKX1yZXR1cm4gYX0sY3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MixlPWFyZ3VtZW50cy5sZW5ndGg7ZDxlO2QrKyljLnB1c2goYXJndW1lbnRzW2RdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmNvbmNhdChbXSk7Zm9yKHZhciBlPTAsZj1hcmd1bWVudHMubGVuZ3RoO2U8ZjtlKyspZC5wdXNoKGFyZ3VtZW50c1tlXSk7cmV0dXJuIGIuYXBwbHkoYSxkKX19LHoyNTU6ZnVuY3Rpb24oYSl7YWxlcnQoYSl9LGNyZWF0ZUNvbnRhaW5lckVsZW1lbnQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8pe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSk7dGhpcy5pc1N0clZhbChiKSYmKHAuaWQ9Yik7dmFyIHE9cC5zdHlsZTtyZXR1cm4gcS5kaXNwbGF5PXRoaXMuaXNTdHJWYWwoYyk/YzoiaW5saW5lLWJsb2NrIixxLnBvc2l0aW9uPXRoaXMuaXNTdHJWYWwoZCk/ZDoic3RhdGljIixxLm92ZXJmbG93PXRoaXMuaXNTdHJWYWwoZSk/ZToiaGlkZGVuIixhPT0iY2FudmFzIj8odGhpcy5pc1N0clZhbChmKSYmcC5zZXRBdHRyaWJ1dGUoIndpZHRoIixmKSx0aGlzLmlzU3RyVmFsKGcpJiZwLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixnKSk6KHRoaXMuaXNTdHJWYWwoZikmJihxLndpZHRoPWYpLHRoaXMuaXNTdHJWYWwoZyYmZykmJihxLmhlaWdodD1nKSksdGhpcy5pc1N0clZhbChoKSYmKHEubGVmdD1oKSx0aGlzLmlzU3RyVmFsKGkpJiYocS50b3A9aSkscS5ib3JkZXJTdHlsZT10aGlzLmlzU3RyVmFsKGopP2o6Im5vbmUiLHEuYm9yZGVyV2lkdGg9dGhpcy5pc1N0clZhbChrKT9rOiIwcHgiLHEuYmFja2dyb3VuZD10aGlzLmlzU3RyVmFsKGwpP2w6InRyYW5zcGFyZW50IG5vbmUiLHEubWFyZ2luPXRoaXMuaXNTdHJWYWwobSk/bToiMHB4IixxLnBhZGRpbmc9dGhpcy5pc1N0clZhbChuKT9uOiIwcHgiLHRoaXMuaXNTdHJWYWwobykmJihxLmN1cnNvcj1vKSxwfSxjcmVhdGVDZW50ZXJlZEVsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiKSxjPVtdO2MucHVzaCgnPGRpdiBzdHlsZT0iZGlzcGxheTp0YWJsZTsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7JyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCcjcG9zaXRpb246cmVsYXRpdmU7IG92ZXJmbG93OmhpZGRlbjsgdGV4dC1hbGlnbjpsZWZ0OyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246YWJzb2x1dGU7ICN0b3A6NTAlOyB3aWR0aDoxMDAlOyAnKSxjLnB1c2goImJvcmRlcjpub25lOyBtYXJnaW46MHB4OyBwYWRkaW5nOjBweDsiKSxjLnB1c2goJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246cmVsYXRpdmU7ICN0b3A6LTUwJTsgd2lkdGg6MTAwJTsgJyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCd0ZXh0LWFsaWduOmNlbnRlcjsiPjwvZGl2PjwvZGl2PjwvZGl2PicpLGIuaW5uZXJIVE1MPWMuam9pbigiIiksYj1iLmZpcnN0Q2hpbGQ7dmFyIGQ9YixlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO3doaWxlKGUubGVuZ3RoPjApZD1lWzBdLGU9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoYSksYn0sY3JlYXRlR3JhcGhpY0VsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJpbWciKSxjPW51bGw7cmV0dXJuIFouYnJvd3Nlcj09Wi5icm93c2Vycy5JRSYmWi5icm93c2VyVmVyc2lvbjw3PyhjPXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsbnVsbCwiaW5saW5lLWJsb2NrIiksYi5vbmxvYWQ9ZnVuY3Rpb24oKXtjLnN0eWxlLndpZHRoPWMuc3R5bGUud2lkdGh8fGIud2lkdGgrInB4IixjLnN0eWxlLmhlaWdodD1jLnN0eWxlLmhlaWdodHx8Yi5oZWlnaHQrInB4IixiLm9ubG9hZD1udWxsLGI9bnVsbH0sYy5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIithKyInLCBzaXppbmdNZXRob2Q9J3NjYWxlJykiKTooYz1iLGMuc3JjPWEpLGN9LHoyNTE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtPWEucGFyZW50Tm9kZS5zdHlsZTttLmNvbG9yPWIsbS5mb250RmFtaWx5PWMsbS5mb250U2l6ZT1kLG0uZm9udFNpemVBZGp1c3Q9ZSxtLmZvbnRTdHlsZT1mLG0uZm9udFN0cmV0Y2g9ZyxtLmZvbnRWYXJpYW50PWgsbS5mb250V2VpZ2h0PWksbS5saW5lSGVpZ2h0PWosbS50ZXh0QWxpZ249ayxtLnRleHREZWNvcmF0aW9uPWx9LHoxNTg6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl0cnl7Yj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGIuYXN5bmM9ITEsYi5sb2FkWE1MKGEpfWNhdGNoKGMpe3RoaXMuejI1NShjLm5hbWUrdGhpcy56MTg1KCJ6ODIiKStjLm1lc3NhZ2UpfWVsc2UgaWYod2luZG93LkRPTVBhcnNlcil0cnl7dmFyIGQ9bmV3IERPTVBhcnNlcjtiPWQucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goYyl7dGhpcy56MjU1KGMubmFtZSt0aGlzLnoxODUoIno4MiIpK2MubWVzc2FnZSl9ZWxzZSB0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTgiKSk7cmV0dXJuIGJ9LFBvaW50OmZ1bmN0aW9uKGEsYil7dGhpcy54PXR5cGVvZiBhPT0ibnVtYmVyIj9hOjAsdGhpcy55PXR5cGVvZiBiPT0ibnVtYmVyIj9iOjB9LFBvaW50M0Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMueD10eXBlb2YgYT09Im51bWJlciI/YTowLHRoaXMueT10eXBlb2YgYj09Im51bWJlciI/YjowLHRoaXMuej10eXBlb2YgYz09Im51bWJlciI/YzowfSx6MTg1OmZ1bmN0aW9uKGEpe3ZhciBiPSIiO3N3aXRjaChhKXtjYXNlIno1MCI6Yj0iRW5hYmxlIERldmVsb3BlciBwYXJhbWV0ZXJzIjticmVhaztjYXNlIno0OSI6Yj0iQ2hhbmdpbmcgVGhpcyBWaW9sYXRlcyBMaWNlbnNlIEFncmVlbWVudCI7YnJlYWs7Y2FzZSJ6NDgiOmI9IlN1cHBvcnQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIGVuYWJsZWQgb25seSBpbiB0aGUgWm9vbWlmeSBJbWFnZSBWaWV3ZXIgaW5jbHVkZWQgaW4gdGhlIFpvb21pZnkgSFRNTDUgRGV2ZWxvcGVyIGVkaXRpb246ICI7YnJlYWs7Y2FzZSJ6MjUiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NjAiOmI9IjMwMDAwIjticmVhaztjYXNlIno2MSI6Yj0iMjU2IjticmVhaztjYXNlIno1OSI6Yj0iMS4xNSI7YnJlYWs7Y2FzZSJ6NjIiOmI9IjMwMCI7YnJlYWs7Y2FzZSJ6NyI6Yj0iNiI7YnJlYWs7Y2FzZSJ6NiI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NSI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NCI6Yj0iMiI7YnJlYWs7Y2FzZSJ6MyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6NDUiOmI9IjIiO2JyZWFrO2Nhc2UiejQ2IjpiPSI1IjticmVhaztjYXNlIno0NyI6Yj0iMTAiO2JyZWFrO2Nhc2UiejgwIjpiPSI1IjticmVhaztjYXNlIno4MSI6Yj0iMC4wMiI7YnJlYWs7Y2FzZSJ6NzciOmI9IjMwIjticmVhaztjYXNlIno3OCI6Yj0iMjAwIjticmVhaztjYXNlIno3OSI6Yj0iMTAiO2JyZWFrO2Nhc2UiejEwVElFUlNLSVBUSFJFU0hPTEQiOmI9IjAxLiI7YnJlYWs7Y2FzZSJ6MjQiOmI9IjEwIjticmVhaztjYXNlInoxOCI6Yj0iNSI7YnJlYWs7Y2FzZSJ6MTkiOmI9IjAuMDY3IjticmVhaztjYXNlIno2NCI6Yj0iNCI7YnJlYWs7Y2FzZSJ6NjMiOmI9IjEiO2JyZWFrO2Nhc2UiejY1IjpiPSIxIjticmVhaztjYXNlIno0MyI6Yj0iMiI7YnJlYWs7Y2FzZSJ6NDQiOmI9IjE1MCI7YnJlYWs7Y2FzZSJ6MzkiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NDAiOmI9IjAiO2JyZWFrO2Nhc2UiejQyIjpiPSIwIjticmVhaztjYXNlInozOCI6Yj1udWxsO2JyZWFrO2Nhc2UiejM2IjpiPSIjZmZmZmZmIjticmVhaztjYXNlInozNk5PQUxQSEEiOmI9IiNmYmZhZmEiO2JyZWFrO2Nhc2UiejM1IjpiPSIwLjc1IjticmVhaztjYXNlIno0MSI6Yj0iYmx1ZSI7YnJlYWs7Y2FzZSJ6NTUiOmI9InNraW5GaWxlcy54bWwiO2JyZWFrO2Nhc2UiejU2IjpiPSJBc3NldHMvU2tpbnMvRGVmYXVsdCI7YnJlYWs7Y2FzZSJ6NTQiOmI9IjAiO2JyZWFrO2Nhc2UiejEyIjpiPSIxIjticmVhaztjYXNlIno1OCI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NTciOmI9IjEwIjticmVhaztjYXNlInoyMyI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MjIiOmI9IndoaXRlIjticmVhaztjYXNlInoyMSI6Yj0iWCI7YnJlYWs7Y2FzZSJ6MjAiOmI9Ilx0I0Y4RjhGOCI7YnJlYWs7Y2FzZSJ6NTMiOmI9IjEiO2JyZWFrO2Nhc2UiejUxIjpiPSI1MDAiO2JyZWFrO2Nhc2UiejUyIjpiPSIgIjticmVhaztjYXNlInozMSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MzAiOmI9bnVsbDticmVhaztjYXNlIno4IjpiPSIxIjticmVhaztjYXNlInoxNyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6MTYiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6MTQiOmI9IndoaXRlIjticmVhaztjYXNlInoxMyI6Yj0iQWdyZWUiO2JyZWFrO2Nhc2UiejE1IjpiPSJFeGl0IjticmVhaztjYXNlIno3MyI6Yj0iMC42IjticmVhaztjYXNlIno3NCI6Yj0iMC4zMyI7YnJlYWs7Y2FzZSJ6NzYiOmI9IjUxMiI7YnJlYWs7Y2FzZSJ6NzUiOmI9IjM4NCI7YnJlYWs7Y2FzZSJ6MjYiOmI9bnVsbDticmVhaztjYXNlInoyNyI6Yj1udWxsO2JyZWFrO2Nhc2UiejI4IjpiPW51bGw7YnJlYWs7Y2FzZSJ6MzMiOmI9bnVsbDticmVhaztjYXNlInozMiI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MTAiOmI9IjEiO2JyZWFrO2Nhc2UiejkiOmI9IjEiO2JyZWFrO2Nhc2UiejM0IjpiPSIxIjticmVhaztjYXNlInoyOSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NjciOmI9IlRoaXMgcGFuZWwgaXMgZW5hYmxlZCB1c2luZyB0aGUgSFRNTCBwYXJhbWV0ZXIgJ3pEZWJ1Zz0xJy4gSXQgY2FuIGJlIGNhbGxlZCBhcyBmb2xsb3dzOlxuXG4gICBaLlV0aWxzLnRyYWNlKCd2YWx1ZSB0byBkaXNwbGF5Jyk7ICBcblxuVGhlIGJ1dHRvbnMgYmVsb3cgZGlzcGxheSBvciBtb2RpZnkgaW1wb3J0YW50IHN0YXRlIHZhbHVlcy4gIFdlYiBkZXNpZ25lcnMgbmV3IHRvIEphdmFTY3JpcHQgd2lsbCBhbHNvIGJlbmVmaXQgZnJvbSB0aGUgY29uc29sZSwgdHJhY2UsIHByb2ZpbGluZywgYW5kIG90aGVyIGRlYnVnZ2luZyBmZWF0dXJlcyBvZiBsZWFkaW5nIGJyb3dzZXJzLiI7YnJlYWs7Y2FzZSJ6NjgiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6NjYiOmI9IndoaXRlIjticmVhaztjYXNlIno2OSI6Yj0iU2hvdyBHbG9iYWxzIjticmVhaztjYXNlIno3MiI6Yj0iVG9nZ2xlIERpc3BsYXkiO2JyZWFrO2Nhc2UiejcwIjpiPSJUb2dnbGUgQmFja2ZpbGwiO2JyZWFrO2Nhc2UiejcxIjpiPSJUb2dnbGUgQ29uc3RyYWluIFBhbiI7YnJlYWs7Y2FzZSJ6OTkiOmI9IkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdC4iO2JyZWFrO2Nhc2Uiejg3LUlNQUdFWE1MIjpiPSJFcnJvciBsb2FkaW5nIGltYWdlOiBwbGVhc2UgbWFrZSBzdXJlIGltYWdlIHBhdGggaW4gd2ViIHBhZ2UgbWF0Y2hlcyBpbWFnZSBmb2xkZXIgbG9jYXRpb24gb24gd2Vic2VydmVyLiI7YnJlYWs7Y2FzZSJ6ODctVE9PTEJBUlhNTCI6Yj0iRXJyb3IgbG9hZGluZyB0b29sYmFyOiBwbGVhc2UgdmVyaWZ5IHNraW4gZmlsZXMgYXJlIG9uIHdlYnNlcnZlciBpbiBzYW1lIGZvbGRlciBhcyB6MTIyLmpzIGZpbGUgYW5kIGFyZSBpbiBkZWZhdWx0IGZvbGRlciBzdHJ1Y3R1cmUgJ0Fzc2V0cy9Ta2lucy9EZWZhdWx0Jywgb3IgYWRkIHpTa2luUGF0aCBwYXJhbWV0ZXIgdG8gd2VicGFnZS4iO2JyZWFrO2Nhc2Uiejg3IjpiPSJFcnJvciBtYWtpbmcgbmV0d29yayByZXF1ZXN0OiBwb3NzaWJsZSBpbnZhbGlkIHBhdGggb3IgbmV0d29yayBlcnJvci4iO2JyZWFrO2Nhc2Uiejg0IjpiPSJJbWFnZSBmYWlsZWQgdG8gbG9hZDogcG9zc2libGUgaW52YWxpZCBwYXRoLCBtaXNzaW5nIGltYWdlLCBvciBuZXR3b3JrIGVycm9yLiI7YnJlYWs7Y2FzZSJ6ODkiOmI9IkVycm9yIHJlbGF0ZWQgdG8gbmV0d29yayBzZWN1cml0eTogIjticmVhaztjYXNlIno5MCI6Yj0iRXJyb3IgcmVsYXRlZCB0byBuZXR3b3JrIHN0YXR1czogIjticmVhaztjYXNlIno4MiI6Yj0iIGNvbnZlcnRpbmcgWE1MIHRleHQgdG8gWE1MIGRvYyAoRE9NUGFyc2VyKTogIjticmVhaztjYXNlIno5OCI6Yj0iQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhNTCBET00uIjticmVhaztjYXNlInoxMDAiOmI9IlhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODYiOmI9IkltYWdlIFhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODMiOmI9IiB3aGlsZSBleGVjdXRpbmcgY2FsbGJhY2s6ICI7YnJlYWs7Y2FzZSJ6ODUiOmI9IkltYWdlIHRpbWVkIG91dDogIjticmVhaztjYXNlIno4OCI6Yj0iTmF2aWdhdG9yIGltYWdlIGZhaWxlZCB0byBsb2FkOiBwb3NzaWJsZSBpbnZhbGlkIHBhdGgsIG1pc3NpbmcgaW1hZ2UsIG9yIG5ldHdvcmsgZXJyb3IuIjticmVhaztjYXNlIno5MSI6Yj0iU2tpbiBYTUwgaW52YWxpZC4iO2JyZWFrO2Nhc2UiejkyIjpiPSJUaGUgc2tpbiBYTUwgZmlsZSBoYXMgb25lIG9yIG1vcmUgZmF1bHR5IG5hbWUgbGluZXMuIjticmVhaztjYXNlIno5NyI6Yj0iV2F0ZXJtYXJrIGltYWdlIGZhaWxlZCB0byBsb2FkOiAiO2JyZWFrO2Nhc2UiejkzIjpiPSJVbmtub3duIGVsZW1lbnQgc3R5bGUgLSBubyBrbm93biBtZXRob2QgdG8gaWRlbnRpZnkuIjticmVhaztjYXNlIno5NCI6Yj0iVW5rbm93biBtb3VzZSBwb3NpdGlvbiAtIG5vIGtub3duIG1ldGhvZCB0byBjYWxjdWxhdGUuIjticmVhaztjYXNlIno5NSI6Yj0iVW5rbm93biBtb3VzZSBzY3JvbGwgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6OTYiOmI9IlVua25vd24gd2luZG93IHNpemUgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6MTA2IjpiPSJMYXVuY2ggWm9vbWlmeSBXZWJzaXRlIjticmVhaztjYXNlInoxMDciOmI9Ik1pbmltaXplIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEwNSI6Yj0iRXhwYW5kIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEyMCI6Yj0iWm9vbSBPdXQiO2JyZWFrO2Nhc2UiejExNCI6Yj0iWm9vbSBJbiBBbmQgT3V0IjticmVhaztjYXNlInoxMTkiOmI9Ilpvb20gSW4iO2JyZWFrO2Nhc2UiejEwOSI6Yj0iUGFuIExlZnQiO2JyZWFrO2Nhc2UiejExMSI6Yj0iUGFuIFVwIjticmVhaztjYXNlInoxMDgiOmI9IlBhbiBEb3duIjticmVhaztjYXNlInoxMTAiOmI9IlBhbiBSaWdodCI7YnJlYWs7Y2FzZSJ6MTEyIjpiPSJSZXNldCBJbml0aWFsIFZpZXciO2JyZWFrO2Nhc2UiejExOCI6Yj0iVG9nZ2xlIEZ1bGwgUGFnZSBWaWV3IjticmVhaztjYXNlInoxMDIiOmI9IkNhbmNlbCBGdWxsIFBhZ2UgVmlldyI7YnJlYWs7Y2FzZSJ6MTAzIjpiPSJBZ3JlZSB0byBjb3B5cmlnaHQgYW5kIHZpZXcgaW1hZ2VzIjticmVhaztjYXNlInoxMDQiOmI9IkV4aXQgYW5kIGRvIG5vdCB2aWV3IGltYWdlcyI7YnJlYWs7Y2FzZSJ6MTEzIjpiPSJUb2dnbGUgRnVsbCBQYWdlIFZpZXciO2JyZWFrO2Nhc2UiejExNyI6Yj0iVG9nZ2xlIFZpZXdwb3J0IERpc3BsYXkiO2JyZWFrO2Nhc2UiejExNSI6Yj0iVG9nZ2xlIFZpZXdwb3J0IEJhY2tmaWxsIjticmVhaztjYXNlInoxMTYiOmI9IlRvZ2dsZSBDb25zdHJhaW4gUGFuIjticmVhaztkZWZhdWx0OmI9IlVuZXhwZWN0ZWQgcmVzb3VyY2UgcmVxdWVzdCJ9cmV0dXJuIGJ9LHoyNTM6ZnVuY3Rpb24oKXt2YXIgYT0iIjthKz0iXG4iLGErPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTUlGWSBJTUFHRSBWSUVXRVIgLSBDVVJSRU5UIFZBTFVFU1xuIixhKz0iXG4iLGErPSJJTUFHRSAmIFNLSU46ICAgICIsYSs9IlouaW1hZ2VQYXRoPSIrWi5pbWFnZVBhdGgrIiwgICAiLGErPSJaLnNraW5QYXRoPSIrWi5za2luUGF0aCsiLCAgICIsYSs9Ilouc2tpbk1vZGU9IitaLnNraW5Nb2RlKyIsICAgIixhKz0iWi5pbWFnZVc9IitaLmltYWdlVysiLCAgICIsYSs9IlouaW1hZ2VIPSIrWi5pbWFnZUgrIiwgICAiLGErPSJ0aWVyQ291bnQ9IitaLlZpZXdwb3J0LnoxODYoKSsiLCAgICIsYSs9IlRJTEVfU0laRT0iK1ouVmlld3BvcnQuejE5NSgpKyJcbiIsYSs9IlxuIixhKz0iUEFHRSAmIEJST1dTRVI6ICAgICIsYSs9IloucGFnZUNvbnRhaW5lcj0iK1oucGFnZUNvbnRhaW5lcisiLCAgICIsYSs9IlouYnJvd3Nlcj0iK1ouYnJvd3NlcisiLCAgICIsYSs9IlouYnJvd3NlclZlcnNpb249IitaLmJyb3dzZXJWZXJzaW9uKyIsICAgIixhKz0iWi5jYW52YXNTdXBwb3J0ZWQ9IitaLmNhbnZhc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD0iK1ouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3JtUHJvcGVydHk9IitaLmNzc1RyYW5zZm9ybVByb3BlcnR5KyIsICAgIixhKz0iWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPSIrWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzKyIsICAgIixhKz0iWi5hbHBoYVN1cHBvcnRlZD0iK1ouYWxwaGFTdXBwb3J0ZWQrIiwgICAiLGErPSJaLnJlbmRlclF1YWxpdHk9IitaLnJlbmRlclF1YWxpdHkrIiwgICAiLGErPSJaLm1vYmlsZURldmljZT0iK1oubW9iaWxlRGV2aWNlKyJcbiIsYSs9IlxuIixhKz0iVklFV0VSIE9QVElPTlMgJiBERUZBVUxUUzogICAgIixhKz0iWi5pbml0aWFsWD0iK1ouaW5pdGlhbFgrIiwgICAiLGErPSJaLmluaXRpYWxZPSIrWi5pbml0aWFsWSsiLCAgICIsYSs9IlouaW5pdGlhbFo9IitaLmluaXRpYWxaKyIsICAgIixhKz0iWi5taW5aPSIrWi5taW5aKyIsICAgIixhKz0iWi5tYXhaPSIrWi5tYXhaKyIsICAgIixhKz0iWi5maXRaPSIrWi5maXRaKyIsICAgIixhKz0iWi56b29tU3BlZWQ9IitaLnpvb21TcGVlZCsiLCAgICIsYSs9IloucGFuU3BlZWQ9IitaLnBhblNwZWVkKyIsICAgIixhKz0iWi5mYWRlSW5TcGVlZD0iK1ouZmFkZUluU3BlZWQrIiwgICAiLGErPSJaLnRvb2xiYXJWaXNpYmxlPSIrWi50b29sYmFyVmlzaWJsZSsiLCAgICIsYSs9IloudG9vbGJhclc9IitaLnRvb2xiYXJXKyIsICAgIixhKz0iWi50b29sYmFyQ3VycmVudFc9IitaLnRvb2xiYXJDdXJyZW50VysiLCAgICIsYSs9IloudG9vbGJhckg9IitaLnRvb2xiYXJIKyIsICAgIixhKz0iWi50b29sYmFyUG9zaXRpb249IitaLnRvb2xiYXJQb3NpdGlvbisiLCAgICIsYSs9IloudG9vbHRpcHNWaXNpYmxlPSIrWi50b29sdGlwc1Zpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclZpc2libGU9IitaLm5hdmlnYXRvclZpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclc9IitaLm5hdmlnYXRvclcrIiwgICAiLGErPSJaLm5hdmlnYXRvckg9IitaLm5hdmlnYXRvckgrIiwgICAiLGErPSJaLm5hdmlnYXRvckw9IitaLm5hdmlnYXRvckwrIiwgICAiLGErPSJaLm5hdmlnYXRvclQ9IitaLm5hdmlnYXRvclQrIiwgICAiLGErPSJaLm5hdmlnYXRvckZpdD0iK1oubmF2aWdhdG9yRml0KyIsICAgIixhKz0iWi5jbGlja1pvb209IitaLmNsaWNrWm9vbSsiLCAgICIsYSs9IlouY2xpY2tQYW49IitaLmNsaWNrUGFuKyIsICAgIixhKz0iWi5tb3VzZVBhbj0iK1oubW91c2VQYW4rIiwgICAiLGErPSJaLmtleXM9IitaLmtleXMrIiwgICAiLGErPSJaLmNvbnN0cmFpblBhbj0iK1ouY29uc3RyYWluUGFuKyIsICAgIixhKz0iV2F0ZXJtYXJrIGFscGhhID0gIitaLlV0aWxzLnoxODUoIno3MyIpKyIsICAgIixhKz0iWi53YXRlcm1hcmtQYXRoPSIrWi53YXRlcm1hcmtQYXRoKyIsICAgIixhKz0iWi5jb3B5cmlnaHRQYXRoPSIrWi5jb3B5cmlnaHRQYXRoKyIsICAgIixhKz0iWi5zbGlkZXJWaXNpYmxlPSIrWi5zbGlkZXJWaXNpYmxlKyIsICAgIixhKz0iWi5mdWxsUGFnZVZpc2libGU9IitaLmZ1bGxQYWdlVmlzaWJsZSsiLCAgICIsYSs9IloucHJvZ3Jlc3NWaXNpYmxlPSIrWi5wcm9ncmVzc1Zpc2libGUrIiwgICAiLGErPSJaLmxvZ29WaXNpYmxlPSIrWi5sb2dvVmlzaWJsZSsiLCAgICIsYSs9IloubG9nb0N1c3RvbVBhdGg9IitaLmxvZ29DdXN0b21QYXRoKyIsICAgIixhKz0iWi5jYW52YXM9IitaLmNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIFZBTFVFUzogICAgIixhKz0iXG4iLGErPSJkaXNwbGF5Vz0iK1ouVmlld3BvcnQuejIwMSgpKyIsICAgIixhKz0iZGlzcGxheUg9IitaLlZpZXdwb3J0LnoxNzkoKSsiLCAgICIsYSs9InRpZXJDdXJyZW50PSIrWi5WaWV3cG9ydC56MTg3KCkrIiwgICAiLGErPSJ0aWVyU2NhbGU9IitaLlZpZXdwb3J0LnoxODkoKSsiLCAgICIsYSs9IlRJRVJTX01BWF9TQ0FMRV9VUD0iK1ouVmlld3BvcnQuejE5NCgpKyIsICAgIixhKz0iVElFUlNfTUFYX1NDQUxFX0RPV049IitaLlZpZXdwb3J0LnoxOTMoKSsiLCAgICIsYSs9IlRJTEVTX01BWF9DQUNIRT0iK1ouVmlld3BvcnQuejE5NygpKyIsICAgIixhKz0iWi51c2VDYW52YXM9IitaLnVzZUNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIExJU1RTOiAgICAiLGErPSJ0aWVyV3M9IitaLlZpZXdwb3J0LnoxOTIoKSsiLCAgICIsYSs9InRpZXJIcz0iK1ouVmlld3BvcnQuejE4OCgpKyIsICAgIixhKz0idGllclRpbGVDb3VudHM9IitaLlZpZXdwb3J0LnoxOTEoKSsiLCAgICIsYSs9InRpbGVzTG9hZGluZ05hbWVzPSIrWi5WaWV3cG9ydC56MTk2KCkrIlxuIixhKz0iXG4iLGFsZXJ0KGEpfSx6MjU2OmZ1bmN0aW9uKCl7Wi5UcmFjZURpc3BsYXk/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT09ImlubGluZS1ibG9jayI/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0ibm9uZSI6Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0iaW5saW5lLWJsb2NrIjpaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpfSxjb25maWd1cmVUcmFjZURpc3BsYXk6ZnVuY3Rpb24oKXt2YXIgYT1aLnZpZXdlclcvMyxiPVoudmlld2VySC8zKzQ1LGM9MTAsZD1wYXJzZUZsb2F0KFoudmlld2VySCkvMyxlPXRoaXMuejE4NSgiejY4Iik7Wi5UcmFjZURpc3BsYXk9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUcmFjZURpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsYSsicHgiLGIrInB4IixjKyJweCIsZCsicHgiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMTBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRyYWNlRGlzcGxheSksWi50cmFjZXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTt2YXIgZj1aLnRyYWNlcy5zdHlsZTtmLndpZHRoPWEtMTUrInB4IixmLmhlaWdodD1iLTYwKyJweCIsZi5mb250RmFtaWx5PSJ2ZXJkYW5hIixmLmZvbnRTaXplPSIxMHB4IixmLmJvcmRlcj0ic29saWQiLGYuYm9yZGVyV2lkdGg9IjFweCIsZi5wYWRkaW5nPSI1cHgiLGYucmVzaXplPSJub25lIixaLnRyYWNlcy52YWx1ZT0iVHJhY2UgVmFsdWVzXG4iLFouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKFoudHJhY2VzKTt2YXIgZz01OCxoPTQyLGk9MjAsaj1iLWgvMi0xMCxrPTEwLGw9dGhpcy56MTg1KCJ6NjYiKSxtPXRoaXMuejE4NSgiejY5Iiksbj1uZXcgdGhpcy5CdXR0b24oImJ1dHRvblNob3dHbG9iYWxzIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLHRoaXMuejI1MywiejExMyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChuLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MiIpLG89bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVEaXNwbGF5IixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQuejI3MiwiejExNyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChvLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MCIpLHA9bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVCYWNrZmlsbCIsbSxudWxsLG51bGwsbnVsbCxudWxsLGcrInB4IixoKyJweCIsaSsicHgiLGorInB4IiwibW91c2Vkb3duIixaLlZpZXdwb3J0LnoyNzEsInoxMTUiLCJzb2xpZCIsIjFweCIsbCwiMHB4IiwiMHB4Iik7Wi5UcmFjZURpc3BsYXkuYXBwZW5kQ2hpbGQocC5lbG10KSxpKz1nK2ssZys9MTI7dmFyIG09dGhpcy56MTg1KCJ6NzEiKSxxPW5ldyB0aGlzLkJ1dHRvbigiYnV0dG9uVG9nZ2xlQ29uc3RyYWluUGFuIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQudG9nZ2xlQ29uc3RyYWluUGFuLCJ6MTE2Iiwic29saWQiLCIxcHgiLGwsIjBweCIsIjBweCIpO1ouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKHEuZWxtdCl9LHRyYWNlOmZ1bmN0aW9uKGEpe1ouVHJhY2VEaXNwbGF5fHxaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpLFoudHJhY2VzJiYoWi50cmFjZXMudmFsdWUrPSJcbiIrYSsiXG4iKX19";
FIND j=5975 line= ";
FIND j=5976 line= </script>
FIND j=5977 line=
FIND j=5978 line=
FIND j=5979 line=
FIND j=5980 line=
FIND j=5981 line= <script id="script_addChild" >
FIND j=5982 line= var childNumber_zm = 3;
FIND j=5983 line= var zmx = new Array();
FIND j=5984 line= var z = 0;
FIND j=5985 line= zmx[z++] = "./zm/nasa/";
FIND j=5986 line= zmx[z++] = "./zm/appolo/";
FIND j=5987 line= zmx[z++] = "./zm/appolo17_4800/";
FIND j=5988 line= zmx[z++] = "./zm/zm5_planets/";
FIND j=5989 line= zmx[z++] = "./zm/zm_nasa/";
FIND j=5990 line= zmx[z++] = "./ko_jtf/jft_parcels/";
FIND j=5991 line=// alert( "addChild zmx len="+zmx.length );
FIND j=5992 line= var childNumber = 3;
FIND j=5993 line= function addChild() {
FIND j=5994 line= alert( "addChild() zmx len="+zmx.length );
FIND j=5995 line= var parent = document.getElementById('div_addchild');
FIND j=5996 line= var newChild = '<p>Child ' + childNumber + '</p>';
FIND j=5997 line= newChild += "<h1>addChild one</h1>";
FIND j=5998 line= newChild += "<h1>addChild two</h1>";
FIND j=5999 line= parent.insertAdjacentHTML('beforeend', newChild);
FIND j=6000 line= childNumber++;
FIND j=6001 line= }
FIND j=6002 line= </script>
FIND j=6003 line=
FIND j=6004 line= <script id="script_addChild_zm" >
FIND j=6005 line= var childNumber_zm = 3;
FIND j=6006 line= var zmx = new Array();
FIND j=6007 line= var z = 0;
FIND j=6008 line= alert( "addChild_zm zmx len="+zmx.length );
FIND j=6009 line=// zmx[z++] = "./zm/nasa/";
FIND j=6010 line=// zmx[z++] = "./zm/appolo/";
FIND j=6011 line=// zmx[z++] = "./zm/appolo17_4800/";
FIND j=6012 line=// zmx[z++] = "./zm/zm5_planets/";
FIND j=6013 line=// zmx[z++] = "./zm/zm_nasa/";
FIND j=6014 line=// zmx[z++] = "./ko_jtf/jft_parcels/";
FIND j=6015 line=
FIND j=6016 line=
FIND j=6017 line= function addChild_zm() {
FIND j=6018 line=// alert( "BUGS_176: addChild_zm" );
FIND j=6019 line=
FIND j=6020 line= var parent = document.getElementById('div_zmlist');
FIND j=6021 line= var newChild_zm = '<p>zm ' + childNumber_zm + '</p>';
FIND j=6022 line= newChild_zm += "<h1>addChild_zm one</h1>";
FIND j=6023 line=
FIND j=6024 line= for( z = 0: z < zmx.length; z++ ) {
FIND j=6025 line= newChild_zm += "<a href='" + zmx[z] + "/index.html' target=_blank>"
FIND j=6026 line= newChild_zm += "<img src='"+ zmx[z] + "/index.png' alt='./zm/index.png' border=0></a>";
FIND j=6027 line= }
FIND j=6028 line= parent.insertAdjacentHTML('beforeend', newChild_zm);
FIND j=6029 line= childNumber++;
FIND j=6030 line= }
FIND j=6031 line= </script>
FIND j=6032 line=
FIND j=6033 line= <script id="script_zmlist" >
FIND j=6034 line= var childNumber_zm = 3;
FIND j=6035 line= function script_zmlist() {
FIND j=6036 line= script_zmlist_load();
FIND j=6037 line=// alert( "bugs177 script_zmlist_load OK" );
FIND j=6038 line= script_zmlist_show();
FIND j=6039 line=// var parent = document.getElementById('div_zmlist');
FIND j=6040 line=// var newChild_zm = '<p>zm ' + childNumber_zm + '</p>';
FIND j=6041 line=// newChild_zm += "<hr color=white><h1>zmlist one</h1><hr color=white>";
FIND j=6042 line=// parent.insertAdjacentHTML('beforeend', newChild_zm);
FIND j=6043 line=// childNumber++;
FIND j=6044 line= }
FIND j=6045 line= </script>
FIND j=6046 line=
FIND j=6047 line=
FIND j=6048 line= <style name="style_zm">
FIND j=6049 line= body { text-align: center; background-color: "slategrey"; color:"white"; }
FIND j=6050 line= button {
FIND j=6051 line=// visibility: hidden;
FIND j=6052 line=// background: rgba(7, 99, 53, .1);
FIND j=6053 line= background: transparent;
FIND j=6054 line= border: 3px solid rgba(7, 99, 53, 1);
FIND j=6055 line= border-radius: 5px;
FIND j=6056 line= color: rgba(7, 99, 53, 1);
FIND j=6057 line= cursor: pointer;
FIND j=6058 line= line-height: 40px;
FIND j=6059 line= font-size: 30px;
FIND j=6060 line= outline: none;
FIND j=6061 line= padding: 0 20px;
FIND j=6062 line= transition: all .3s;
FIND j=6063 line= }
FIND j=6064 line= button:hover {
FIND j=6065 line=// background: rgba(7, 99, 53, 1);
FIND j=6066 line= background: darkgreyslate;
FIND j=6067 line= background: yellow;
FIND j=6068 line= color: rgba(255,255,255,1);
FIND j=6069 line= }
FIND j=6070 line= p {font-size: 20px; font-weight: bold;
FIND j=6071 line= </style>
FIND j=6072 line=
FIND j=6073 line=<body>
FIND j=6074 line=
FIND j=6075 line=
FIND j=6076 line= <button type="button" onclick="script_zmlist()">script_zmlist</button>
FIND j=6077 line= <button type="button" onclick="addChild_zm()">addChild_zm</button>
FIND j=6078 line= <button type="button" onclick="addChild()">addChild</button>
FIND j=6079 line= <hr>
FIND j=6080 line=
FIND j=6081 line= <script > function imgWindow() {window.open("image") } </script>
FIND j=6082 line= <img src="./imgs/btn/koeye.png" height="50" size="150" alt="koeye" onclick="script_zmlist()">
FIND j=6083 line= <img src="./imgs/btn/koeyeb.png" height="50" size="150" alt="koeyeb" onclick="addChild_zm()">
FIND j=6084 line= <img src="./imgs/btn/koeyew.png" height="50" size="150" alt="koeyew" onclick="addChild()">
FIND j=6085 line=
FIND j=6086 line= <div id="div_addchild">
FIND j=6087 line= <p>Child 1</p>
FIND j=6088 line= <p>Child 2</p>
FIND j=6089 line= </div>
FIND j=6090 line=
FIND j=6091 line= <div id="div_zmlist">
FIND j=6092 line= <h1>div_zmlist</h1>
FIND j=6093 line= <p>Child_zm 1</p>
FIND j=6094 line= <p>Child_zm 2</p>
FIND j=6095 line= </div>
FIND j=6096 line=
FIND j=6097 line= <div id="div_addchild_zm" >
FIND j=6098 line= <h1>div_addchild_zm</h1>
FIND j=6099 line= addchild_zm <br>
FIND j=6100 line= </div>
FIND j=6101 line=
FIND j=6102 line=
FIND j=6103 line= <script id="script_zmlist" >
FIND j=6104 line= var zmlist = new Array();
FIND j=6105 line=
FIND j=6106 line=// function script_zmlist_hover() {body { background-color: blue; }}
FIND j=6107 line=
FIND j=6108 line= function script_zmlist_load() {
FIND j=6109 line= var z=0;
FIND j=6110 line= zmlist[z++] = "./zm/zm_nasa/mars_zigzag_panels2400/TileGroup0/0-0-0.jpg";
FIND j=6111 line= zmlist[z++] = "./zm/zm_nasa/nasa/1-scientistsfl/TileGroup0/0-0-0.jpg";
FIND j=6112 line= zmlist[z++] = "./zm/zm_nasa/nasa/Echus-Chasma-On-Mars/TileGroup0/0-0-0.jpg";
FIND j=6113 line=// alert( "zmlist"+z+" zmlist("+z+")="+zmlist[z] );
FIND j=6114 line= zmlist[z++] = "./zm/zm_nasa/nasa/mars_zigzag_panels/TileGroup0/0-0-0.jpg";
FIND j=6115 line= zmlist[z++] = "./zm/zm_nasa/zm/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg";
FIND j=6116 line= zmlist[z++] = "./zm/zm_nasa/venus_400/TileGroup0/0-0-0.jpg";
FIND j=6117 line= zmlist[z++] = "./zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg";
FIND j=6118 line= zmlist[z++] = "./zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg";
FIND j=6119 line= zmlist[z++] = "./zm/hrc2009stl/TileGroup0/0-0-0.jpg";
FIND j=6120 line= zmlist[z++] = "./zm/hrc2011/TileGroup0/0-0-0.jpg";
FIND j=6121 line= zmlist[z++] = "./zm/komap/TileGroup0/0-0-0.jpg";
FIND j=6122 line= zmlist[z++] = "./zm/zm_nasa/apollo/070214_val_marineris_02/TileGroup0/0-0-0.jpg";
FIND j=6123 line= zmlist[z++] = "./zm/zm_nasa/apollo/071010-msl-site1-02/TileGroup0/0-0-0.jpg";
FIND j=6124 line= zmlist[z++] = "./zm/zm_nasa/apollo/071127-venus-surface-02/TileGroup0/0-0-0.jpg";
FIND j=6125 line= zmlist[z++] = "./zm/zm_nasa/apollo/080409-phobos-02/TileGroup0/0-0-0.jpg";
FIND j=6126 line= zmlist[z++] = "./zm/zm_nasa/apollo/081016-crater-mound-02/TileGroup0/0-0-0.jpg";
FIND j=6127 line= zmlist[z++] = "./zm/zm_nasa/apollo/081103-mars-ripples-02/TileGroup0/0-0-0.jpg";
FIND j=6128 line= zmlist[z++] = "./zm/zm_nasa/apollo/081204-rock-layers-02/TileGroup0/0-0-0.jpg";
FIND j=6129 line= zmlist[z++] = "./zm/zm_nasa/apollo/090331-mars-starburst-02/TileGroup0/0-0-0.jpg";
FIND j=6130 line= zmlist[z++] = "./zm/zm_nasa/apollo/090813-mars-crater-02.jpg/TileGroup0/0-0-0.jpg";
FIND j=6131 line= zmlist[z++] = "./zm/zm_nasa/apollo/100113-mars-illusion-02/TileGroup0/0-0-0.jpg";
FIND j=6132 line= zmlist[z++] = "./zm/zm_nasa/apollo/20070507_185501_1010108/TileGroup0/0-0-0.jpg";
FIND j=6133 line= zmlist[z++] = "./zm/zm_nasa/apollo/365430main_nacl000000fd_middle_540x540/TileGroup0/0-0-0.jpg";
FIND j=6134 line= zmlist[z++] = "./zm/zm_nasa/apollo/367307main_cracked_hahn_lg/TileGroup0/0-0-0.jpg";
FIND j=6135 line= zmlist[z++] = "./zm/zm_nasa/apollo/369230main_apollolandinglocator_full/TileGroup0/0-0-0.jpg";
FIND j=6136 line= zmlist[z++] = "./zm/zm_nasa/apollo/388038main_milichius_full/TileGroup0/0-0-0.jpg";
FIND j=6137 line= zmlist[z++] = "./zm/zm_nasa/apollo/393992main_ejecta_20091014_full/TileGroup0/0-0-0.jpg";
FIND j=6138 line= zmlist[z++] = "./zm/zm_nasa/apollo/400202main_lroc_apollo11_20091109_full/TileGroup0/0-0-0.jpg";
FIND j=6139 line= zmlist[z++] = "./zm/zm_nasa/apollo/403330main_cabeus_lg/TileGroup0/0-0-0.jpg";
FIND j=6140 line= zmlist[z++] = "./zm/zm_nasa/apollo/414923main_wrinkle-ridge-full/TileGroup0/0-0-0.jpg";
FIND j=6141 line= zmlist[z++] = "./zm/zm_nasa/apollo/416286main_new-images-1-full/TileGroup0/0-0-0.jpg";
FIND j=6142 line= zmlist[z++] = "./zm/zm_nasa/apollo/417415main_tychocloseup-20100115-full/TileGroup0/0-0-0.jpg";
FIND j=6143 line= zmlist[z++] = "./zm/zm_nasa/apollo/417417main_tychofull-20100115-full/TileGroup0/0-0-0.jpg";
FIND j=6144 line= zmlist[z++] = "./zm/zm_nasa/apollo/417869main_arist_bands321-full/TileGroup0/0-0-0.jpg";
FIND j=6145 line= zmlist[z++] = "./zm/zm_nasa/apollo/417873main_M111918050R_thumb-full/TileGroup0/0-0-0.jpg";
FIND j=6146 line= zmlist[z++] = "./zm/zm_nasa/apollo/419421main_AS16-M-0891-full/TileGroup0/0-0-0.jpg";
FIND j=6147 line= zmlist[z++] = "./zm/zm_nasa/apollo/419425main_M106088433R-full/TileGroup0/0-0-0.jpg";
FIND j=6148 line= zmlist[z++] = "./zm/zm_nasa/apollo/421320main_hadley_rille/TileGroup0/0-0-0.jpg";
FIND j=6149 line= zmlist[z++] = "./zm/zm_nasa/apollo/421615main_plato_2_lg/TileGroup0/0-0-0.jpg";
FIND j=6150 line= zmlist[z++] = "./zm/zm_nasa/apollo/421619main_plato_crater_lg/TileGroup0/0-0-0.jpg";
FIND j=6151 line= zmlist[z++] = "./zm/zm_nasa/apollo/422349main_byrgius-a-20100203-full/TileGroup0/0-0-0.jpg";
FIND j=6152 line= zmlist[z++] = "./zm/zm_nasa/apollo/422590-mars-taber-ansigt-/TileGroup0/0-0-0.jpg";
FIND j=6153 line= zmlist[z++] = "./zm/zm_nasa/apollo/424828main_LunarOrbiterIII_3085_med/TileGroup0/0-0-0.jpg";
FIND j=6154 line= zmlist[z++] = "./zm/zm_nasa/apollo/433446main_20100311_crisium_lg/TileGroup0/0-0-0.jpg";
FIND j=6155 line= zmlist[z++] = "./zm/zm_nasa/apollo/445016main_anax3600_500/TileGroup0/0-0-0.jpg";
FIND j=6156 line= zmlist[z++] = "./zm/zm_nasa/apollo/445021main_anax_wac_500/TileGroup0/0-0-0.jpg";
FIND j=6157 line= zmlist[z++] = "./zm/zm_nasa/apollo/449172main_WAC_crop_context/TileGroup0/0-0-0.jpg";
FIND j=6158 line= zmlist[z++] = "./zm/zm_nasa/apollo/449174main_M104376385_thumb/TileGroup0/0-0-0.jpg";
FIND j=6159 line= zmlist[z++] = "./zm/zm_nasa/apollo/450800main_tsiol_2_lg/TileGroup0/0-0-0.jpg";
FIND j=6160 line= zmlist[z++] = "./zm/zm_nasa/apollo/450994main_full_moon_lg/TileGroup0/0-0-0.jpg";
FIND j=6161 line= zmlist[z++] = "./zm/zm_nasa/apollo/453514main_meteor_crater2_lg/TileGroup0/0-0-0.jpg";
FIND j=6162 line= zmlist[z++] = "./zm/zm_nasa/apollo/453516main_meteor_crater_az_lg/TileGroup0/0-0-0.jpg";
FIND j=6163 line= zmlist[z++] = "./zm/zm_nasa/apollo/455939main_holeinone_far_lg/TileGroup0/0-0-0.jpg";
FIND j=6164 line= zmlist[z++] = "./zm/zm_nasa/apollo/463365main_M128202846LE/TileGroup0/0-0-0.jpg";
FIND j=6165 line= zmlist[z++] = "./zm/zm_nasa/apollo/503670main_120210a/TileGroup0/0-0-0.jpg";
FIND j=6166 line= zmlist[z++] = "./zm/zm_nasa/apollo/521685main_022111a/TileGroup0/0-0-0.jpg";
FIND j=6167 line= zmlist[z++] = "./zm/zm_nasa/apollo/521691main_022111b/TileGroup0/0-0-0.jpg";
FIND j=6168 line= zmlist[z++] = "./zm/zm_nasa/apollo/524173main_022511a/TileGroup0/0-0-0.jpg";
FIND j=6169 line= zmlist[z++] = "./zm/zm_nasa/apollo/524220main_030211b/TileGroup0/0-0-0.jpg";
FIND j=6170 line= zmlist[z++] = "./zm/zm_nasa/apollo/528087main_031110a/TileGroup0/0-0-0.jpg";
FIND j=6171 line= zmlist[z++] = "./zm/zm_nasa/apollo/529214main_031611a/TileGroup0/0-0-0.jpg";
FIND j=6172 line= zmlist[z++] = "./zm/zm_nasa/apollo/529221main_031611c/TileGroup0/0-0-0.jpg";
FIND j=6173 line= zmlist[z++] = "./zm/zm_nasa/apollo/531407main_031811b/TileGroup0/0-0-0.jpg";
FIND j=6174 line= zmlist[z++] = "./zm/zm_nasa/apollo/533097main_033111b/TileGroup0/0-0-0.jpg";
FIND j=6175 line= zmlist[z++] = "./zm/zm_nasa/apollo/534165main_040511a/TileGroup0/0-0-0.jpg";
FIND j=6176 line= zmlist[z++] = "./zm/zm_nasa/apollo/536801main_041311aa/TileGroup0/0-0-0.jpg";
FIND j=6177 line= zmlist[z++] = "./zm/zm_nasa/apollo/539777main_042111b/TileGroup0/0-0-0.jpg";
FIND j=6178 line= zmlist[z++] = "./zm/zm_nasa/apollo/541041main_042711a/TileGroup0/0-0-0.jpg";
FIND j=6179 line= zmlist[z++] = "./zm/zm_nasa/apollo/555516main_053111a/TileGroup0/0-0-0.jpg";
FIND j=6180 line= zmlist[z++] = "./zm/zm_nasa/apollo/558017main_060211a/TileGroup0/0-0-0.jpg";
FIND j=6181 line= zmlist[z++] = "./zm/zm_nasa/apollo/561423main_060811b/TileGroup0/0-0-0.jpg";
FIND j=6182 line= zmlist[z++] = "./zm/zm_nasa/apollo/576849main_062811b/TileGroup0/0-0-0.jpg";
FIND j=6183 line= zmlist[z++] = "./zm/zm_nasa/apollo/576883main_062911b/TileGroup0/0-0-0.jpg";
FIND j=6184 line= zmlist[z++] = "./zm/zm_nasa/apollo/58-pluto-3-large/TileGroup0/0-0-0.jpg";
FIND j=6185 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap11_landinJSC2007e045375/TileGroup0/0-0-0.jpg";
FIND j=6186 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap12_landsitea_JSC2011e118358/TileGroup0/0-0-0.jpg";
FIND j=6187 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap15_9aa_JSC2007e045378/TileGroup0/0-0-0.jpg";
FIND j=6188 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap15_lmnortha_JSC2007e045379/TileGroup0/0-0-0.jpg";
FIND j=6189 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap15_s2a_JSC2011e118359/TileGroup0/0-0-0.jpg";
FIND j=6190 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_lmviewa_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=6191 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_lmwesat_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=6192 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s10a_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=6193 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s11a_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=6194 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s13_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=6195 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s13a_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=6196 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s1a_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=6197 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s1ba_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=6198 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap16_slandsitea_JSC2007e045380/TileGroup0/0-0-0.jpg";
FIND j=6199 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_alsepa_JSC2004e52772/TileGroup0/0-0-0.jpg";
FIND j=6200 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_eva1a_JSC2007e045384/TileGroup0/0-0-0.jpg";
FIND j=6201 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_evaalsepa_JSC2007e045385/TileGroup0/0-0-0.jpg";
FIND j=6202 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s1easta_JSC2004e52773/TileGroup0/0-0-0.jpg";
FIND j=6203 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s1westa_JSC2004e52776/TileGroup0/0-0-0.jpg";
FIND j=6204 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s2a_JSC2004e52777/TileGroup0/0-0-0.jpg";
FIND j=6205 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s2eva2a_JSC2004e52774/TileGroup0/0-0-0.jpg";
FIND j=6206 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s3a_JSC2004e52778/TileGroup0/0-0-0.jpg";
FIND j=6207 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s3a_JSC2007e045386/TileGroup0/0-0-0.jpg";
FIND j=6208 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s4a_JSC2007e045388/TileGroup0/0-0-0.jpg";
FIND j=6209 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s5_JSC2004e20304/TileGroup0/0-0-0.jpg";
FIND j=6210 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s5a_JSC2004e20304/TileGroup0/0-0-0.jpg";
FIND j=6211 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s6a_JSC2007e045387/TileGroup0/0-0-0.jpg";
FIND j=6212 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s6southa_JSC2004e52779/TileGroup0/0-0-0.jpg";
FIND j=6213 line= zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s7a_JSC2004e52775/TileGroup0/0-0-0.jpg";
FIND j=6214 line= zmlist[z++] = "./zm/zm_nasa/apollo/apll-5_JSC2008e040725/TileGroup0/0-0-0.jpg";
FIND j=6215 line= zmlist[z++] = "./zm/zm_nasa/apollo/AS14-68-9450HR/TileGroup0/0-0-0.jpg";
FIND j=6216 line= zmlist[z++] = "./zm/zm_nasa/apollo/lunar-recon-orbiter-apollo-12-surveyor-3-sites-1/TileGroup0/0-0-0.jpg";
FIND j=6217 line= zmlist[z++] = "./zm/zm_nasa/appollo17_4800/TileGroup0/0-0-0.jpg";
FIND j=6218 line= zmlist[z++] = "./zm/zm_nasa/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg";
FIND j=6219 line= zmlist[z++] = "./zm/zm_nasa/zm5_planets/2MASS-Redshift-Survey/TileGroup0/0-0-0.jpg";
FIND j=6220 line= zmlist[z++] = "./us/realtor/ky/zoom/map_doevalley/TileGroup0/0-0-0.jpg";
FIND j=6221 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf01/TileGroup0/0-0-0.jpg";
FIND j=6222 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf02/TileGroup0/0-0-0.jpg";
FIND j=6223 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf03/TileGroup0/0-0-0.jpg";
FIND j=6224 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf04/TileGroup0/0-0-0.jpg";
FIND j=6225 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf05/TileGroup0/0-0-0.jpg";
FIND j=6226 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf06/TileGroup0/0-0-0.jpg";
FIND j=6227 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf07/TileGroup0/0-0-0.jpg";
FIND j=6228 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf08/TileGroup0/0-0-0.jpg";
FIND j=6229 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf09/TileGroup0/0-0-0.jpg";
FIND j=6230 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf10/TileGroup0/0-0-0.jpg";
FIND j=6231 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf11/TileGroup0/0-0-0.jpg";
FIND j=6232 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf12/TileGroup0/0-0-0.jpg";
FIND j=6233 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf14/TileGroup0/0-0-0.jpg";
FIND j=6234 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf15/TileGroup0/0-0-0.jpg";
FIND j=6235 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf16/TileGroup0/0-0-0.jpg";
FIND j=6236 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf17510/TileGroup0/0-0-0.jpg";
FIND j=6237 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf17570/TileGroup0/0-0-0.jpg";
FIND j=6238 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf21/TileGroup0/0-0-0.jpg";
FIND j=6239 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf22/TileGroup0/0-0-0.jpg";
FIND j=6240 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf23/TileGroup0/0-0-0.jpg";
FIND j=6241 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf24/TileGroup0/0-0-0.jpg";
FIND j=6242 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf26/TileGroup0/0-0-0.jpg";
FIND j=6243 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf27/TileGroup0/0-0-0.jpg";
FIND j=6244 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf28/TileGroup0/0-0-0.jpg";
FIND j=6245 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.jpg";
FIND j=6246 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf29 copy/TileGroup0/0-0-0.jpg";
FIND j=6247 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf30/TileGroup0/0-0-0.jpg";
FIND j=6248 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf31/TileGroup0/0-0-0.jpg";
FIND j=6249 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf32/TileGroup0/0-0-0.jpg";
FIND j=6250 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf34/TileGroup0/0-0-0.jpg";
FIND j=6251 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf35/TileGroup0/0-0-0.jpg";
FIND j=6252 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf36/TileGroup0/0-0-0.jpg";
FIND j=6253 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf38/TileGroup0/0-0-0.jpg";
FIND j=6254 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf40/TileGroup0/0-0-0.jpg";
FIND j=6255 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf41/TileGroup0/0-0-0.jpg";
FIND j=6256 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf42/TileGroup0/0-0-0.jpg";
FIND j=6257 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf43/TileGroup0/0-0-0.jpg";
FIND j=6258 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf44/TileGroup0/0-0-0.jpg";
FIND j=6259 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf_n/TileGroup0/0-0-0.jpg";
FIND j=6260 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf_ne/TileGroup0/0-0-0.jpg";
FIND j=6261 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc/TileGroup0/0-0-0.jpg";
FIND j=6262 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_012/TileGroup0/0-0-0.jpg";
FIND j=6263 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_e/TileGroup0/0-0-0.jpg";
FIND j=6264 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_greater/TileGroup0/0-0-0.jpg";
FIND j=6265 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_inc/TileGroup0/0-0-0.jpg";
FIND j=6266 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_n/TileGroup0/0-0-0.jpg";
FIND j=6267 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_s/TileGroup0/0-0-0.jpg";
FIND j=6268 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.jpg";
FIND j=6269 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_w/TileGroup0/0-0-0.jpg";
FIND j=6270 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfinc/TileGroup0/0-0-0.jpg";
FIND j=6271 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfinc_proper/TileGroup0/0-0-0.jpg";
FIND j=6272 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jttf37/TileGroup0/0-0-0.jpg";
FIND j=6273 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jyf44/TileGroup0/0-0-0.jpg";
FIND j=6274 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/souixp/TileGroup0/0-0-0.jpg";
FIND j=6275 line= zmlist[z++] = "./ko_jtf/zm/jtf_parcels/souixp_boat/TileGroup0/0-0-0.jpg";
FIND j=6276 line=// z--;
FIND j=6277 line=// alert( "BUGS_load zmlist("+z+")="+zmlist[z] + " len="+zmlist.length );
FIND j=6278 line=// document.write( "zmlist_lost zmlist_length="+zmlist.length+" z="+z );
FIND j=6279 line= return(zmlist);
FIND j=6280 line= }
FIND j=6281 line=
FIND j=6282 line= function script_zmlist_show() {
FIND j=6283 line= var z = 0; var zmout=""; var len=zmlist.length;
FIND j=6284 line= var zmid = ""; var zmurl = "";
FIND j=6285 line=// alert( "bugs178 script_zmlist_show IN" );
FIND j=6286 line= for( z=0; z< zmlist.length; z++ ) {
FIND j=6287 line= zmid = zmlist[z].replace('/TileGroup0/0-0-0.jpg','' );
FIND j=6288 line=// zmout += "<h1><b>zmlist_"+z+"</b><h1>";
FIND j=6289 line= zmout += "<a href='./index_zm.html?zmid="+zmid+"' target=_blank>";
FIND j=6290 line= zmout += " <img name='img_" + zmid + "' src='"+zmlist[z]+"' border=0 height=100 >\n";
FIND j=6291 line= zmout += " </a>";
FIND j=6292 line= zmout += "<a href='"+zmid+".html' target=_blank>";
FIND j=6293 line= zmout += " <img name='img_" + zmid + "' height=25 src='"+zmlist[z]+"' border=0 height=100 >\n";
FIND j=6294 line= zmout += " </a>";
FIND j=6295 line=// alert( "bugs430 zmid=" + zmid );
FIND j=6296 line= }
FIND j=6297 line=// document.write( "bugs435 zmout=" + zmout );
FIND j=6298 line=
FIND j=6299 line=// alert( "BUGS432_show zmlist("+len+")="+zmlist[z] + " len="+zmlist.length );
FIND j=6300 line=// document.getElementById('div_zmlist').innerHTML += zmout;
FIND j=6301 line= var parent = document.getElementById('div_zmlist');
FIND j=6302 line= parent.insertAdjacentHTML('beforeend', zmout);
FIND j=6303 line= }
FIND j=6304 line=// function script_zmlist() {
FIND j=6305 line=// script_zmlist_load();
FIND j=6306 line=// alert( "bugs_437: script_zmlist len="+zmlist.length );
FIND j=6307 line=// script_zmlist_show();
FIND j=6308 line=// }
FIND j=6309 line= function script_zm_view( search ) {
FIND j=6310 line= document.write( "script_zm_view search="+search );
FIND j=6311 line=
FIND j=6312 line=
FIND j=6313 line=
FIND j=6314 line=
FIND j=6315 line= }
FIND j=6316 line= </script>
FIND j=6317 line=
FIND j=6318 line= </body>
FIND j=6319 line= </html>
ko 20190222_062304 MAIN 0-0 fildb3=ko.db3 sqltbl=ko fillogd=ko_20190222.log
MSG_7500 FINDDT: ifile=index.html findmath=style_div_csv tailmatch=style_div_csv ofile=style_div_csv
MSG_400: ko 20190222_062304 -= findt =- 0-0 ifile=index.html findmatch=style_div_csvstyle_div_csv ofile=style_div_csv
EXIT_500 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ko 20190222_062304 -= findt =- 0-0 ___FOUND ifile=index.html findmatch=style_div_csv ofile=style_div_csv
match j=1560 line= <style id="style_div_csv type="text/css">
FIND j=1561 line= body {
FIND j=1562 line=// font-family: Arial;
FIND j=1563 line= font-family: yokkmokkOT;
FIND j=1564 line= font-family: arial;
FIND j=1565 line= font-size: 8pt;
FIND j=1566 line= }
FIND j=1567 line= table {
FIND j=1568 line= border: 1px solid #ccc;
FIND j=1569 line= }
FIND j=1570 line= table th {
FIND j=1571 line=// background-color: #F7F7F7;
FIND j=1572 line= background-color: darkSlategrey;
FIND j=1573 line=// color: #333;
FIND j=1574 line= color: ivory;
FIND j=1575 line= font-weight: bold;
FIND j=1576 line= }
FIND j=1577 line= table th, table td {
FIND j=1578 line= padding: 5px;
FIND j=1579 line= border-color: #ccc;
FIND j=1580 line= }
TAIL j=1581 line= </style id="style_div_csv type="text/css">
tail j=1582 line=
tail j=1583 line= <style id="style_thumb_3800">
tail j=1584 line= .thumb {
tail j=1585 line= height: 75px;
tail j=1586 line= border: 1px solid #000;
tail j=1587 line= margin: 10px 5px 0 0;
tail j=1588 line= }
tail j=1589 line= </style>
tail j=1590 line=
tail j=1591 line= <style id="style_byte_content" >
tail j=1592 line= #byte_content {
tail j=1593 line= margin: 5px 0;
tail j=1594 line= max-height: 100px;
tail j=1595 line= overflow-y: auto;
tail j=1596 line= overflow-x: hidden;
tail j=1597 line= }
tail j=1598 line= #byte_range { margin-top: 5px; }
tail j=1599 line= </style>
tail j=1600 line=
tail j=1601 line= <script id="load_vues" >
tail j=1602 line= function load_vues(args) {
tail j=1603 line=// alert( "BUG_1000 load_vues"+args );
tail j=1604 line= vues = "";
tail j=1605 line= vues += "old|\n";
tail j=1606 line= vues += "ko|\n";
tail j=1607 line= vues += "new|\n";
tail j=1608 line= vues += "work|\n";
tail j=1609 line= vues += "focus|\n";
tail j=1610 line= vues += "where|";
tail j=1611 line= vues += "courtreport|\n";
tail j=1612 line= vues += "jtfdc|\n";
tail j=1613 line= vues += "jtrdcr|\n";
tail j=1614 line= vues += "jtfinc|\n";
tail j=1615 line= vues += "byrdpuckers|\n";
tail j=1616 line=
tail j=1617 line= vues += "kassil|\n";
tail j=1618 line= vues += "konet|\n";
tail j=1619 line= vues += "iperms|\n";
tail j=1620 line=
tail j=1621 line= vues += "memes|\n";
tail j=1622 line= vues += "food|\n";
tail j=1623 line= vues += "kids|\n";
tail j=1624 line= vues += "dogs|\n";
tail j=1625 line=
tail j=1626 line= vues += "jkwii|\n";
tail j=1627 line= vues += "kou|\n";
tail j=1628 line= vues += "konabus|\n";
tail j=1629 line= vues += "go|\n";
tail j=1630 line= vues += "kt|\n";
tail j=1631 line= vues += "ka|\n";
tail j=1632 line= vues += "ko|\n";
tail j=1633 line=
tail j=1634 line= vues += "ko0|\n";
tail j=1635 line= vues += "ko1|\n";
tail j=1636 line= vues += "ko2|\n";
tail j=1637 line= vues += "ka1|\n";
tail j=1638 line= vues += "ka2|\n";
tail j=1639 line=
tail j=1640 line= vues += "ka11|\n";
tail j=1641 line= vues += "ka12|\n";
tail j=1642 line= vues += "ka21|\n";
tail j=1643 line= vues += "ka22|\n";
tail j=1644 line=
tail j=1645 line= vues += "av|\n";
tail j=1646 line= vues += "bb|\n";
tail j=1647 line= vues += "dd|\n";
tail j=1648 line= vues += "pn|\n";
tail j=1649 line= vues += "sl|\n";
tail j=1650 line= vues += "tm|\n";
tail j=1651 line= vues += "tl|\n";
tail j=1652 line= vues += "vu|\n";
tail j=1653 line= vues += "yt|\n";
tail j=1654 line= vues += "zm|\n";
tail j=1655 line=
tail j=1656 line= vues += "old|\n";
tail j=1657 line=
tail j=1658 line=// alert( "BUG_1100 end load_vues vues="+vues );
tail j=1659 line= return( vues );
tail j=1660 line= }
tail j=1661 line= </script>
tail j=1662 line=
tail j=1663 line= <script id="script_show_vues">
tail j=1664 line= function show_vues(args) {
tail j=1665 line= alert( "BUGS_1060 BEG show_vues args="+args );
tail j=1666 line=
tail j=1667 line= vues = load_vues('').split("|");
tail j=1668 line= vuelen = vues.length;
tail j=1669 line= alert( "BUGS_1070 show_vues AAA htmout="+vuelen );
tail j=1670 line=
tail j=1671 line= htmout="";
tail j=1672 line= htmout_script_vues="";
tail j=1673 line= htmout_button_vues="";
tail j=1674 line= htmout_div_vues="";
tail j=1675 line= htmout="";
tail j=1676 line= htmout="";
tail j=1677 line=
tail j=1678 line= z=0;
tail j=1679 line=
tail j=1680 line= for( z=0; z<vuelen; z++ ) {
tail j=1681 line= vue = vues[z];
tail j=1682 line= url = '/?vuid="'+vue+'"';
tail j=1683 line= tn = "/imgs/gif/ringd.gif"; img = "/imgs/gif/ringb.gif";
tail j=1684 line= tn = "/imgs/gif/ringsd.gif"; img = "/imgs/gif/ringsb.png";
tail j=1685 line=
tail j=1686 line= background="yellow";
tail j=1687 line= color="black";
tail j=1688 line= font="yokkmokkOT";
tail j=1689 line= fontsize="12pt";
tail j=1690 line= width="35%";
tail j=1691 line=
tail j=1692 line= alert( "BUGS_1090 show_vues z="+z+" vue="+vue );
tail j=1693 line=
tail j=1694 line= htmout += "<hr color=yellow";
tail j=1695 line= htmout += "<hr color=red";
tail j=1696 line= htmout += '<img src="/imgs/gif/rings.gif" >\n';
tail j=1697 line= htmout += '<a href="'+url+'" alt="'+vue+'" class="popover" id="drg" target=_blank>';
tail j=1698 line= htmout += ' <img class="drg" src="'+tn+'" border=0>';
tail j=1699 line= htmout += ' <span><img class="drg" src="'+img+'" border=0></span>';
tail j=1700 line= htmout += ' </a>';
tail j=1701 line= htmout += "<hr color=yellow";
tail j=1702 line= htmout += "<hr color=red";
tail j=1703 line=
tail j=1704 line=// htmout_script_vues += '<script id="'+z+'" >';
tail j=1705 line= htmout_script_vues += '<script id="vue_kov_'+vue+'" >';
tail j=1706 line= htmout_script_vues += ' var kov = new Vue({ el: "#kov'+kovid+'",';
tail j=1707 line= htmout_script_vues += 'data: {collapsed: false},';
tail j=1708 line=
tail j=1709 line= htmout_script_vues += 'methods: {\n';
tail j=1710 line= htmout_script_vues += ' showhide_kov: function() {\n';
tail j=1711 line= htmout_script_vues += ' if (!this.collapsed) this.collapsed = true;\n';
tail j=1712 line= htmout_script_vues += ' else this.collapsed = false;\n';
tail j=1713 line= htmout_script_vues += ' },\n';
tail j=1714 line= htmout_script_vues += 'document.body.style.background = "'+background+'"';
tail j=1715 line=
tail j=1716 line= htmout_script_vues += 'document.body.style.color = "'+color+'"';
tail j=1717 line= htmout_script_vues += 'document.body.style.fontfamily = "'+font+'"';
tail j=1718 line= htmout_script_vues += 'document.body.style.fontsize = "'+fontsize+'"';
tail j=1719 line= htmout_script_vues += ' },\n';
tail j=1720 line= htmout_script_vues += ' </script" >';
tail j=1721 line=
tail j=1722 line= htmout_style_vues = '<style id="style_kov_'+vue+'\n';
tail j=1723 line= htmout_style_vues += ' .detail_'+vue+' { \n';
tail j=1724 line= htmout_style_vues += ' background: '+background+';\n';
tail j=1725 line= htmout_style_vues += ' width: '+width+';\n';
tail j=1726 line= htmout_style_vues += ' padding: 20px;\n';
tail j=1727 line= htmout_style_vues += ' border: 1px solid black;\n';
tail j=1728 line= htmout_style_vues += ' font-family: '+font+';\n';
tail j=1729 line= htmout_style_vues += ' color: '+color+';\n';
tail j=1730 line= htmout_style_vues += ' }\n';
tail j=1731 line= htmout_style_vues += ' </style>\n';
tail j=1732 line=
tail j=1733 line=// alert( "BUGS_1092 show_vues VUEHTM vuelen="+vuelen+" htmout_style_vues=\n"+htmout_style_vues );
tail j=1734 line= alert( "BUGS_1733 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues=\n"+htmout_script_vues );
tail j=1735 line= }
tail j=1736 line=
tail j=1737 line=
tail j=1738 line=// alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout="+htmout );
tail j=1739 line=// alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues="+htmout_script_vues );
tail j=1740 line=
tail j=1741 line= div_style_vues = document.getElementById('div_style_vues');
tail j=1742 line= div_style_vues.insertAdjacentHTML('afterbegin', htmout_style_vues );
tail j=1743 line=
tail j=1744 line= div_script_vues = document.getElementById('div_script_vues');
tail j=1745 line= div_script_vues.insertAdjacentHTML('afterbegin', htmout_script_vues );
tail j=1746 line=
tail j=1747 line=
tail j=1748 line= div_show_vues = document.getElementById('div_show_vues');
tail j=1749 line= div_show_vues.insertAdjacentHTML('afterbegin', htmout);
tail j=1750 line=
tail j=1751 line=
tail j=1752 line=// div_show_vues.insertAdjacentHTML('beforebegin', htmout);
tail j=1753 line=
tail j=1754 line=// div_show_vues = getelementbyID('div_show_vues");
tail j=1755 line=// div_show_vues.innerHTML = htmout;
tail j=1756 line=
tail j=1757 line=// alert("BUGS_2892 vuelen=" + vues.length + "\nStatus: " + status);
tail j=1758 line=// document.write( htmout );
tail j=1759 line=
tail j=1760 line=// alert( "BUGS_1100 END show_vues htmout="+htmout );
tail j=1761 line= return(htmout);
tail j=1762 line= }
tail j=1763 line= </script id="script_show_vues">
tail j=1764 line=
tail j=1765 line=
tail j=1766 line= <div id="div_style_vues"></div>
tail j=1767 line=
tail j=1768 line= <div id="div_script_vues"></div>
tail j=1769 line=
tail j=1770 line= <script id="script_kovs_hideshow">
tail j=1771 line=
tail j=1772 line= function kovs_hideshow( todo, kovs ) {
tail j=1773 line= kovlist = "";
tail j=1774 line= kovlist += "ko|go|kt|old|new|";
tail j=1775 line= kovlist += "kassil|konet|iperms|konabus|courtreport|";
tail j=1776 line= kovlist += "jkwii|byrdpucker|kou|jtfdc|jtfinc|";
tail j=1777 line= kovlist += "where|work|memes|focus|food|";
tail j=1778 line= kovlist += "dogs|kids|preserve|protect";
tail j=1779 line= kovs = kovlist.split('|');
tail j=1780 line= kovs_len = kovs.length;
tail j=1781 line=// alert( "BUS_1340 kovs_hideshow todo="+todo+" kovlist="+kovlist+" kovs_len="+kovs_len );
tail j=1782 line= htmout = "";
tail j=1783 line= z=0;
tail j=1784 line= for( z=0; z<kovs_len; z++ ) {
tail j=1785 line= kov=kovs[z];
tail j=1786 line= kovid="kov_"+kov;
tail j=1787 line= if( todo == "hide" ) {
tail j=1788 line= document.getElementById(kovid).style.visibility = "hidden";
tail j=1789 line= }
tail j=1790 line= if( todo == "show" ) {
tail j=1791 line= document.getElementById(kovid).style.visibility = "visible";
tail j=1792 line= }
tail j=1793 line= htmout += "z="+z+" todo="+todo+ " kovid="+kovid+"<br>\n";
tail j=1794 line=// alert( "BUS_1350 kovs_hideshow todo="+todo+" z="+z+" kovid="+kovid );
tail j=1795 line= }
tail j=1796 line= alert( "BUGS_1371 htmout="+htmout );
tail j=1797 line=// alert( "BUS_1370 kovs_hideshow todo="+todo+" kovs="+kovs );
tail j=1798 line= }
tail j=1799 line= </script>
tail j=1800 line=
tail j=1801 line= <script id="script_vues_hideshow">
tail j=1802 line= function vues_hideshow(hideshow,kovs) {
tail j=1803 line= alert( "BUGS_1220 vues_hideshow kovs="+kovs );
tail j=1804 line= kovs = "";
tail j=1805 line= kovs += "ko new focus work where memes ";
tail j=1806 line= kovs += "jtfdc jtfdcr jtfinc byrdpucker courtreport ";
tail j=1807 line= kovs += "jkwii kou kids dogs ";
tail j=1808 line= kovs += "kassil konet iperms konabus ko go kt old";
tail j=1809 line= alert( "BUGS_1221 vues_hideshow kovs="+kovs );
tail j=1810 line= z=0;
tail j=1811 line= for( kov in kovs.split(" ") ) {
tail j=1812 line= z=z+1;
tail j=1813 line= alert( "BUGS vues_hideshow z="+z+" kov="+kov );
tail j=1814 line= }
tail j=1815 line= }
tail j=1816 line= function vues_hideshow1(hideshow,divid) {
tail j=1817 line= alert( "BUGS_1230 vues_hideshow args="+args );
tail j=1818 line= htmout_vues_all="";
tail j=1819 line= if( hideshow == 'hide' ) {
tail j=1820 line= if( divid == "" ) or ( divid == "all" ) {
tail j=1821 line= alert( "MGS_1261 vues_showhide HIDE" );
tail j=1822 line= document.getElementById("btn_vues_hide").style.visibility = "hidden";
tail j=1823 line= document.getElementById("btn_vues_show").style.visibility = "visible";
tail j=1824 line=
tail j=1825 line= document.getElementById("kov_ko").style.visibility = "hidden";
tail j=1826 line= document.getElementById("kov_new").style.visibility = "hidden";
tail j=1827 line= document.getElementById("kov_focus").style.visibility = "hidden";
tail j=1828 line= document.getElementById("kov_food").style.visibility = "hidden";
tail j=1829 line= document.getElementById("kov_courtreport").style.visibility = "hidden";
tail j=1830 line= document.getElementById("kov_where").style.visibility = "hidden";
tail j=1831 line= document.getElementById("kov_work").style.visibility = "hidden";
tail j=1832 line= document.getElementById("kov_memes").style.visibility = "hidden";
tail j=1833 line= document.getElementById("kov_kids").style.visibility = "hidden";
tail j=1834 line= document.getElementById("kov_dogs").style.visibility = "hidden";
tail j=1835 line= document.getElementById("kov_preserve").style.visibility = "hidden";
tail j=1836 line= document.getElementById("kov_protect").style.visibility = "hidden";
tail j=1837 line= document.getElementById("kov_jtfdc").style.visibility = "hidden";
tail j=1838 line= document.getElementById("kov_jtfinc").style.visibility = "hidden";
tail j=1839 line= document.getElementById("kov_byrdpucker").style.visibility = "hidden";
tail j=1840 line= document.getElementById("kov_jkwii").style.visibility = "hidden";
tail j=1841 line= document.getElementById("kov_kou").style.visibility = "hidden";
tail j=1842 line= document.getElementById("kov_kassil").style.visibility = "hidden";
tail j=1843 line= document.getElementById("kov_konet").style.visibility = "hidden";
tail j=1844 line= document.getElementById("kov_iperms").style.visibility = "hidden";
tail j=1845 line= document.getElementById("kov_konabus").style.visibility = "hidden";
tail j=1846 line= document.getElementById("kov_kt").style.visibility = "hidden";
tail j=1847 line= document.getElementById("kov_go").style.visibility = "hidden";
tail j=1848 line= document.getElementById("kov_old").style.visibility = "hidden";
tail j=1849 line= }
tail j=1850 line= else {
tail j=1851 line= document.getElementById(divid).style.visibility = "hiddtn";
tail j=1852 line= }
tail j=1853 line=
tail j=1854 line=// var div_vues_all = document.getElementById('div_vues_all');
tail j=1855 line=// htmout_vues= div_vues_all.innerHTML;
tail j=1856 line=// div_vues_all.innerHTML = '<div id="div_vues_all" hidden><h1>div_vues_all_hidden</h1>\n';
tail j=1857 line=// htmout_vues = document.getElementById('div_vues_all').innerHTML;
tail j=1858 line= alert( "BUGS_1291 vues_hideshow HIDE=");
tail j=1859 line=// div_vues.innerHTML = '<h1>div_vues</h1><div id="div_vues" hidden>\n";
tail j=1860 line= }
tail j=1861 line= if( args == 'show' ) {
tail j=1862 line= if( divid == "" ) or ( divid == "all" ) {
tail j=1863 line= alert( "MGS_1262 vues_showhide HIDE" );
tail j=1864 line= document.getElementById("btn_vues_hide").style.visibility = "visible";
tail j=1865 line= document.getElementById("btn_vues_show").style.visibility = "hidden";
tail j=1866 line=
tail j=1867 line=
tail j=1868 line=
tail j=1869 line= document.getElementById("kov_ko").style.visibility = "visible";
tail j=1870 line= document.getElementById("kov_new").style.visibility = "visible";
tail j=1871 line= document.getElementById("kov_focus").style.visibility = "visible";
tail j=1872 line= document.getElementById("kov_food").style.visibility = "visible";
tail j=1873 line= document.getElementById("kov_courtreport").style.visibility = "visible";
tail j=1874 line= document.getElementById("kov_where").style.visibility = "visible";
tail j=1875 line= document.getElementById("kov_work").style.visibility = "visible";
tail j=1876 line= document.getElementById("kov_memes").style.visibility = "visible";
tail j=1877 line= document.getElementById("kov_kids").style.visibility = "visible";
tail j=1878 line= document.getElementById("kov_dogs").style.visibility = "visible";
tail j=1879 line= document.getElementById("kov_preserve").style.visibility = "visible";
tail j=1880 line= document.getElementById("kov_protect").style.visibility = "visible";
tail j=1881 line= document.getElementById("kov_jtfdc").style.visibility = "visible";
tail j=1882 line= document.getElementById("kov_jtfinc").style.visibility = "visible";
tail j=1883 line= document.getElementById("kov_byrdpucker").style.visibility = "visible";
tail j=1884 line= document.getElementById("kov_jkwii").style.visibility = "visible";
tail j=1885 line= document.getElementById("kov_kou").style.visibility = "visible";
tail j=1886 line= document.getElementById("kov_kassil").style.visibility = "visible";
tail j=1887 line= document.getElementById("kov_konet").style.visibility = "visible";
tail j=1888 line= document.getElementById("kov_iperms").style.visibility = "visible";
tail j=1889 line= document.getElementById("kov_konabus").style.visibility = "visible";
tail j=1890 line= document.getElementById("kov_kt").style.visibility = "visible";
tail j=1891 line= document.getElementById("kov_go").style.visibility = "visible";
tail j=1892 line= document.getElementById("kov_old").style.visibility = "visible";
tail j=1893 line= }
tail j=1894 line= else {
tail j=1895 line= document.getElementById(divid).style.visibility = "visible";
tail j=1896 line= }
tail j=1897 line= alert( "BUGS_1292 vues_hideshow SHOW htmout_vues=");
tail j=1898 line= }
tail j=1899 line= }
tail j=1900 line= </script id="script_vues_hideshow">
tail j=1901 line=
tail j=1902 line= <script id="script_kb" >function script_kb(args) {
tail j=1903 line= alert( "script_kb args="+args );
tail j=1904 line= }
tail j=1905 line= <script id="script_kw" >function script_kw(args) {
tail j=1906 line= alert( "script_kw args="+args );
tail j=1907 line= }
tail j=1908 line= <script id="script_koeyeb_w" >function script_koeyeb_w(args) {
tail j=1909 line= alert( "script_koeyeb_w args="+args );
tail j=1910 line= }
tail j=1911 line= <script id="script_koeyew_b" >function script_koeyew_b(args) {
tail j=1912 line= alert( "script_koeyew_b args="+args );
tail j=1913 line= }
tail j=1914 line= <script id="script_koeye_b" >function script_koeye_b(args) {
tail j=1915 line= alert( "script_koeye_b args="+args );
tail j=1916 line= }
tail j=1917 line= <script id="script_koeye_w" >function script_koeye_w(args) {
tail j=1918 line= alert( "script_koeye_w args="+args );
tail j=1919 line= }
tail j=1920 line= <script id="script_bubble" >function script_bubble(args) {
tail j=1921 line= alert( "script_bubble args="+args );
tail j=1922 line= }
tail j=1923 line=
tail j=1924 line= <script id="script_shutdown" >
tail j=1925 line= function script_shutdown( msg ) {
tail j=1926 line= alert( "BUGS_6100 script_shutdown msg="+msg );
tail j=1927 line= }
tail j=1928 line= </script id="script_shutdown" >
tail j=1929 line=
tail j=1930 line=
tail j=1931 line=
tail j=1932 line= </head>
tail j=1933 line=
tail j=1934 line=
tail j=1935 line=
tail j=1936 line=<!-- <body onload="init_pano('canvas'); kogrids();"> -->
tail j=1937 line=
tail j=1938 line=
tail j=1939 line=<body onload="startup();">
tail j=1940 line=
tail j=1941 line=<br><br><br><br>
tail j=1942 line=<br><br><br><br>
tail j=1943 line=
tail j=1944 line= <div id="div_kogrids_w"></div>
tail j=1945 line=
tail j=1946 line=
tail j=1947 line=<br><br><br><br><br>
tail j=1948 line=<hr color=yellow>
tail j=1949 line= <button type="btn_kovs_hideshow" id="kovs_hideshow" onclick="kovs_hideshow()">kovs_hideshow</button>
tail j=1950 line= <a href=# onclick="kovs_hideshow("hide","all"); return false;" class="popover">
tail j=1951 line= <img height=200 src=/imgs/gif/ringb.gif onclick="kovs_hideshow('hide','all')">
tail j=1952 line= <span><img height=200 src=/imgs/gif/ringp.gif onclick="kovs_hideshow('hide','all')"></span>
tail j=1953 line= <a>
tail j=1954 line=
tail j=1955 line=<!-- <img src=/imgs/gif/rings.gif onclick="kovs_hideshow('show','all')"> -->
tail j=1956 line=
tail j=1957 line= <a href=# onclick="kovs_hideshow("show","all"); return false;" class="popover">
tail j=1958 line= <img height=200 src=/imgs/gif/ringd.gif onclick="kovs_hideshow('show','all')">
tail j=1959 line= <span><img height=200 src=/imgs/gif/ringq.gif onclick="kovs_hideshow('show','all')"></span>
tail j=1960 line= <a>
tail j=1961 line=
tail j=1962 line= <script id="script_bugs" >
tail j=1963 line= function bugs(h,d) {
tail j=1964 line= alert( "BUGS " );
tail j=1965 line= }
tail j=1966 line= </script>
tail j=1967 line=
tail j=1968 line= <button type="btn_kovs_hide" id="btn_kovs_hide" onclick="kovs_hideshow('hide','all')>
tail j=1969 line= -= kovs_hide_all =-
tail j=1970 line= </button>
tail j=1971 line= <button type="btn_kovs_show" id="btn_kovs_show" onclick="kovs_hideshow('show','all')>
tail j=1972 line= -= kovs_show_all =-
tail j=1973 line= </button>
tail j=1974 line=
tail j=1975 line=<hr color=yellow>
tail j=1976 line=<br><br><br><br><br>
tail j=1977 line=<br><br><br><br><br>
tail j=1978 line=<br><br><br><br><br>
tail j=1979 line=<br><br><br><br><br>
tail j=1980 line=
tail j=1981 line= <button type="show_vues" id="show_vues" onclick="show_vues('')">show_vues</button>
tail j=1982 line=<!--
tail j=1983 line= <a href=# class=popover id="drag" >
tail j=1984 line= <img height=400 width=600 src="/imgs/gif/ringsb.gif" onclick="show_vues('')" >
tail j=1985 line= <span><img height=400 width=600 src="/imgs/gif/ringsq.gif" onclick="show_vues('')" ></span>
tail j=1986 line= </a>
tail j=1987 line= -->
tail j=1988 line=
tail j=1989 line=<button type="show_vues" id="show_vues" onclick="show_vues('')">show_vuew</button>
tail j=1990 line= <div id="div_show_vues" ><h1>div_show_vues_w</h1></div>
tail j=1991 line=
tail j=1992 line=
tail j=1993 line=<button type="kov_links_main" id="kov_links_main" onclick="kov_links()">kov_links_main</button>
tail j=1994 line=<!-- <button type="clear_div_kov" id="clear_div_kov" onclick="clear_div_kov()">clear_div_kov</button> -->
tail j=1995 line=<!-- <button type="load_kov_links" id="load_kov_links" onclick="load_kov_links()">load_kov_links</button> -->
tail j=1996 line=<!-- <button type="show_kov_links" id="show_kov_links" onclick="show_kov_links()">show_kov_links</button> -->
tail j=1997 line=
tail j=1998 line=
tail j=1999 line= <div id="div_kov_links"></div>
tail j=2000 line=
tail j=2001 line= <div id="v_hoverdate">
tail j=2002 line= <span v-bind:title="message"><font style="font-family: times, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
tail j=2003 line= <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
tail j=2004 line= </div>
tail j=2005 line= <script id="script_hoverdate" >
tail j=2006 line= kotxt = "";
tail j=2007 line= kotxt += "-== kako =- preview embed vu emchat -= 20190218_0800 =-";
tail j=2008 line=// kotxt += new Date().toLocaleString();
tail j=2009 line=// message: 'hoverdate ' + kotxt;
tail j=2010 line= var app2 = new Vue({el: '#v_hoverdate',
tail j=2011 line= data: {
tail j=2012 line= message: 'hover_dttm ' + new Date().toLocaleString() + kotxt
tail j=2013 line= }
tail j=2014 line= })
tail j=2015 line= </script id="script_hoverdate" >
tail j=2016 line=
tail j=2017 line=
tail j=2018 line= <dic id="div_vues" ><h1>div_vues</h1></div>
tail j=2019 line=<!-- <button type="button" onclick="script_ajax()">loadlist</button> -->
tail j=2020 line=
tail j=2021 line=
tail j=2022 line= <hr color=yellow>
tail j=2023 line= <div id="dynDataField"></div>
tail j=2024 line= <hr color=yellow>
tail j=2025 line=
tail j=2026 line= <h1 id="ajaxdb3">ajaxdb3.</h1>
tail j=2027 line= <button type="button" onclick="script_ajaxdb3()">ajaxdb3</button>
tail j=2028 line=
tail j=2029 line= <script id="script_ajaxdb3">
tail j=2030 line= db3=indexx.db3;
tail j=2031 line= sql="select * from list limit 5";
tail j=2032 line= function script_ajaxdb3(db3,sql) {
tail j=2033 line= $("button").click(function(){
tail j=2034 line= $.post("indexx.php", {
tail j=2035 line= db3: db3,
tail j=2036 line= sql: "select * from list limit 10"
tail j=2037 line= },
tail j=2038 line= function(data, status){
tail j=2039 line= lines = data.split("\n");
tail j=2040 line= linelen=lines.length;
tail j=2041 line= htmout="";
tail j=2042 line= alert( "BUGS1240 linelen="+linelen );
tail j=2043 line= for( z=0; z<lines.length; z++ ) {
tail j=2044 line= line=lines[z];
tail j=2045 line= if( line.length < 3 ) continue;
tail j=2046 line= z=z+1;
tail j=2047 line= flds = line.split(" ");
tail j=2048 line= img = flds[8];
tail j=2049 line= dd = flds[7];
tail j=2050 line= mth = flds[5];
tail j=2051 line= yyyy = flds[6];
tail j=2052 line= size = flds[4];
tail j=2053 line=// htmout += line+"\n";
tail j=2054 line= htmout += "img="+img+" dd="+dd+" "+yyyy+" "+mth+"\n";
tail j=2055 line=// alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
tail j=2056 line= }
tail j=2057 line= alert( "BUGS_1400 ajaxdb3 z="+z+" htmout="+htmout );
tail j=2058 line= for( z=0; z<lines.length; z++ ) {
tail j=2059 line= line=lines[z];
tail j=2060 line= alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
tail j=2061 line= flds = lines.split(" ");
tail j=2062 line= fldlen = flds.length;
tail j=2063 line= alert( "BUGS_1260 ajaxdb3 z="+z+" fldlen="+fldlen );
tail j=2064 line= psv=parseline(line);
tail j=2065 line= alert( "BUGS_1251 ajaxdb3 psv="+psv );
tail j=2066 line=// (url,img,id,tn,grp,desc) = parseline(line);
tail j=2067 line=// url = line.split(" ")[0];
tail j=2068 line=// img = line.split(" ")[1];
tail j=2069 line=// alert( "BUGS_1251 ajaxdb3 url="+url+" img="+img );
tail j=2070 line=// id = line.split("|")[2];
tail j=2071 line=// tn = line.split("|")[3];
tail j=2072 line=// grp = line.split("|")[4];
tail j=2073 line=// desc = line.split("|")[5];
tail j=2074 line=
tail j=2075 line= htmout += '<div id="drag">\n';
tail j=2076 line= htmout += '<div class="drg" >\n';
tail j=2077 line= htmout += '<a href="+url+" class="thumbnail" target=_blank>\n';
tail j=2078 line= htmout += ' <img class="drg" src="+img+" border=0>\n';
tail j=2079 line= htmout += ' <span><img class="drg" src="+img+" border=0></span>\n';
tail j=2080 line= htmout += ' </a>\n';
tail j=2081 line= htmout += ' </div>\n';
tail j=2082 line= htmout += ' </div>\n';
tail j=2083 line=// alert( "BUGS_1248 ajaxdb3 htmout="+htmout );
tail j=2084 line= }
tail j=2085 line=
tail j=2086 line=// getelementbyID('div_ajaxdb3");
tail j=2087 line=// alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
tail j=2088 line=
tail j=2089 line= div_ajaxdb3 = document.getElementById('div_ajaxdb3');
tail j=2090 line= div_ajaxdb3.insertAdjacentHTML('afterbegin', htmout);
tail j=2091 line=// document.write( htmout );
tail j=2092 line= });
tail j=2093 line= });
tail j=2094 line= }
tail j=2095 line= </script id="script_ajaxdb3">
tail j=2096 line=
tail j=2097 line=
tail j=2098 line= <script id="script_parseline">
tail j=2099 line= function parseline(line) {
tail j=2100 line= alert( "BUGS_1280 line="+line );
tail j=2101 line= flds=line.split(" ");
tail j=2102 line=
tail j=2103 line= url="index.html";
tail j=2104 line= img="/imgs/gif/ringsb.gif";
tail j=2105 line= id="jkwii";
tail j=2106 line= tn="/imgs/btn/ringsd.gif";
tail j=2107 line= grp="group";
tail j=2108 line= desc="timejak jkwii";
tail j=2109 line= psv=url+"|"+img+"|"+id+"|"+tn+"|"+grp+"|"+desc
tail j=2110 line=
tail j=2111 line=// return(url,img,id,tn,grp,desc);
tail j=2112 line= return(psv);
tail j=2113 line= }
tail j=2114 line= </script id="script_parseline">
tail j=2115 line=
tail j=2116 line= <hr color=yellow>
tail j=2117 line= <div id="div_ajaxdb3"></div>
tail j=2118 line= <hr color=yellow>
tail j=2119 line=
tail j=2120 line=
tail j=2121 line=<!-- <div id="ajax_loadlist">xxx ajax_loadlist xxx</div> -->
tail j=2122 line= <hr color=yellow>
tail j=2123 line=
tail j=2124 line=
tail j=2125 line=
tail j=2126 line= <div id="div_vues" >
tail j=2127 line=
tail j=2128 line= <div id="app_jkwii">
tail j=2129 line= <div>
tail j=2130 line=
tail j=2131 line= <h1 v-on:click="showhide" >= = : : jkwii is me : : = =</h1>
tail j=2132 line= <h2 v-on:click="showhide" >:: -=ko0us=- preview 20190218_0800 us_med_rectin</h2>
tail j=2133 line= <h2>private tours available on request</h2>
tail j=2134 line=
tail j=2135 line=<a id="drag" class="popover" href="/ani.html" target=_blank>
tail j=2136 line= <img class="drg" height=450 width=800 src="/imgs/gif/firebubblesb.gif" alt="firebubbles" border=0>
tail j=2137 line= <span><img height=450 width=800 class="drg" src="/imgs/gif/firebubblesq.gif" border=0></span>
tail j=2138 line= </a>
tail j=2139 line=
tail j=2140 line= <iframe frameborder='0' height='200' width=800 marginheight='0' marginwidth='0' scrolling='no'
tail j=2141 line= src='/ani.html'
tail j=2142 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=2143 line= </iframe>
tail j=2144 line=
tail j=2145 line= <hr color=blue>
tail j=2146 line= <hr color=white>
tail j=2147 line= <hr color=red>
tail j=2148 line=
tail j=2149 line=<!--
tail j=2150 line= <iframe id="myframe" src="/svc/emchat/index.html" width="600" height="500"
tail j=2151 line= frameborder="0" scrolling="yes"></iframe>
tail j=2152 line= -->
tail j=2153 line=
tail j=2154 line=<!--
tail j=2155 line= <img height=50 src="/imgs/btn/kob.png">
tail j=2156 line= <img height=50 src="/imgs/btn/koeyeb.png">
tail j=2157 line= <img height=50 src="/imgs/btn/koeye.png">
tail j=2158 line= <img height=50 src="/imgs/btn/koeyew.png">
tail j=2159 line= <img height=50 src="/imgs/btn/kow.png">
tail j=2160 line= -->
tail j=2161 line=
tail j=2162 line= <a href=/svc/emchat/index.html class="thumbnail" target=_blank>
tail j=2163 line= <img class="drg" height=200 src=/imgs/links/tn/tn_chat.png border=0>
tail j=2164 line= <span><img class="drg" height=400 src=/imgs/links/tn/tn_chat.png border=0></span>
tail j=2165 line= </a>
tail j=2166 line=
tail j=2167 line= <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
tail j=2168 line= <img class="drg" height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=2169 line= <span><img class="drg" height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=2170 line= </a>
tail j=2171 line=
tail j=2172 line= <a class="thumbnail" href=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin target=_blank>
tail j=2173 line= <img class="drg" height=200 src=/tl/imgs/tn/tn_jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0>
tail j=2174 line= <span><img class="drg" height=800 src=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0></span>
tail j=2175 line= </a>
tail j=2176 line=
tail j=2177 line= <a href=# v-on:click="showhide" class=thumbnail >
tail j=2178 line= <img class="drg" v-on:click="showhide" height=200 src=/tl/imgs/construction_sawhorse.gif border=0>
tail j=2179 line= <span><img class="drg" v-on:click="showhide" height=400 src=/tl/imgs/construction_sawhorse.gif border=0></span>
tail j=2180 line= </a>
tail j=2181 line=
tail j=2182 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.jpg alt=jtf31_streetswing_sawhorse_n_speedbump=_blank>
tail j=2183 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0>
tail j=2184 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0></span>
tail j=2185 line= </a>
tail j=2186 line=
tail j=2187 line= <a class="thumbnail" v-on:click="showhide" href=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0>
tail j=2188 line= <img class="drg" v-on:click="showhide" height=200 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
tail j=2189 line= <span><img class="drg" v-on:click="showhide" height=400 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0></span>
tail j=2190 line= </a>
tail j=2191 line=
tail j=2192 line=
tail j=2193 line=
tail j=2194 line= <br><br>
tail j=2195 line= <hr color=red>
tail j=2196 line= <hr color=white>
tail j=2197 line= <hr color=blue>
tail j=2198 line= <h2 v-on:click="showhide" >== jtfdc OPEN BORDER problem ==</h2>
tail j=2199 line= !! NO wall !! NO sawhorse !! NO tape !! NO chalk !!
tail j=2200 line= <br>
tail j=2201 line= !! NO EAGLES - OUR NO EAGLES !!
tail j=2202 line=
tail j=2203 line= <h1>
tail j=2204 line= <a href=/imgs/links_201901/great_wall_of_china_1870.jpg class="thumbnail_not" target=_blank>
tail j=2205 line= <img src=/imgs/links_201901/tn/tn_great_wall_of_china_1870.png border=0>
tail j=2206 line= </a>
tail j=2207 line= <a href=https://www.youtube.com/watch?v=OfCS1yXg8gk class="thumbnail_not" target=_blank>
tail j=2208 line= <img src=/imgs/links_201901/tn/tn_youb_across_the_border.png border=0>
tail j=2209 line= </a>
tail j=2210 line=
tail j=2211 line= <a href=/imgs/links/Image332.png class="thumbnail_not" target=_blank>
tail j=2212 line= <img src=/imgs/links/tn/tn_Image332.png border=0>
tail j=2213 line=<!-- <span><img src=/imgs/links/Image332.png border=0></span> -- >
tail j=2214 line= </a>
tail j=2215 line=
tail j=2216 line=
tail j=2217 line=
tail j=2218 line=<!--
tail j=2219 line= <a href=https://https://www.youtube.com/watch?v=Gj3UdRmhgvM&start_radio=1&list=RDGj3UdRmhgvM class="thumbnail_not" target=_blank>
tail j=2220 line= <img src=/imgs/links_201901/tn/tn_youb_dark_end_ofthe_street.png border=0>
tail j=2221 line= </a>
tail j=2222 line= -->
tail j=2223 line=<!-- -->
tail j=2224 line= <br>
tail j=2225 line=
tail j=2226 line=
tail j=2227 line= <a href=https://en.wikipedia.org/wiki/Moat class="thumbnail_not" target=_blank>
tail j=2228 line= <img src=/imgs/links_201901/tn/tn_Vellorefort.png border=0>
tail j=2229 line= </a>
tail j=2230 line=
tail j=2231 line= - ?? moat ?? -
tail j=2232 line= <a href=https://upload.wikimedia.org/wikipedia/commons/0/00/Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.JPG class="thumbnail_not" target=_blank>
tail j=2233 line= <img src=/imgs/links_201901/tn/tn_Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.png border=0></span>
tail j=2234 line= </a>
tail j=2235 line= </h1>
tail j=2236 line= <br>
tail j=2237 line= <a href=https://en.wikipedia.org/wiki/American_Gothic class="thumbnail_not" target=_blank>
tail j=2238 line= <img src=/imgs/links_201901/tn/tn_Grant_Wood_-_American_Gothic_-_Google_Art_Project.png border=0>
tail j=2239 line= </a>
tail j=2240 line=
tail j=2241 line= <hr color=blue>
tail j=2242 line= <hr color=white>
tail j=2243 line= <hr color=red>
tail j=2244 line=
tail j=2245 line=
tail j=2246 line=
tail j=2247 line=
tail j=2248 line=
tail j=2249 line=
tail j=2250 line=
tail j=2251 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5320_jtfdc_eagle_n.JPG alt=jtfdc_eagle_n target=_blank>
tail j=2252 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0>
tail j=2253 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0></span>
tail j=2254 line= </a>
tail j=2255 line=
tail j=2256 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.jpg alt=jtfdc_original_notresspassing_willprosecuted target=_blank>
tail j=2257 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0>
tail j=2258 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0></span>
tail j=2259 line= </a>
tail j=2260 line=
tail j=2261 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5704_jtfdc_eagle_s.JPG alt=jtfdc_eagle_s target=_blank>
tail j=2262 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0>
tail j=2263 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0></span>
tail j=2264 line= </a>
tail j=2265 line=
tail j=2266 line= <a href=# class=thumbnail>
tail j=2267 line= <img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
tail j=2268 line= <span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
tail j=2269 line= </a>
tail j=2270 line=
tail j=2271 line= <a class="thumbnail" href="mailto:adminihe@ko0.us?subject=adminihe_what?">
tail j=2272 line= <img height=50 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0>
tail j=2273 line= <span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0></span>
tail j=2274 line= </a>
tail j=2275 line=
tail j=2276 line= <a href=# class=thumbnail>
tail j=2277 line= <img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" >
tail j=2278 line= <span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
tail j=2279 line= </a>
tail j=2280 line= <a class="thumbnail" href="mailto:adminishe@ko0.us?subject=adminishe_what?">
tail j=2281 line= <img class="drg" height=50 src="/imgs/links/email.gif" alt="adminiwii_what" border=0>
tail j=2282 line= <span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminiwii_what" border=0></span>
tail j=2283 line= </a>
tail j=2284 line=
tail j=2285 line=<br><br><br>
tail j=2286 line= <div id="drag">
tail j=2287 line= <div class="drg">
tail j=2288 line= <h3>us_med_rechtin</h3>
tail j=2289 line= <a class="thumbnail" href=/us/med/rechtin target=_blank>
tail j=2290 line= <img height=200 src=/imgs/us/tn/tn_med_rechtin.png border=0>
tail j=2291 line= <span><img height=400 src=/imgs/us/med_rechtin.png border=0></span>
tail j=2292 line= </a>
tail j=2293 line= </div>
tail j=2294 line= </div>
tail j=2295 line=<br><br><br>
tail j=2296 line=<br><br><br>
tail j=2297 line= <div id="drag" >
tail j=2298 line= <div class="drg" >
tail j=2299 line= <h3>jtfdc_defford_courtreport</h3>
tail j=2300 line= <a class="thumbnail" href=/imgs/links/jtfdc_defford_courtreport.jpg target=_blank>
tail j=2301 line= <img height=200 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0>
tail j=2302 line= <span><img height=400 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0></span>
tail j=2303 line= </a>
tail j=2304 line= </div>
tail j=2305 line= </div>
tail j=2306 line=
tail j=2307 line=
tail j=2308 line=
tail j=2309 line=
tail j=2310 line=
tail j=2311 line=
tail j=2312 line=
tail j=2313 line=
tail j=2314 line=
tail j=2315 line=<hr color=yellow>
tail j=2316 line=
tail j=2317 line= <a href="index_tl.html" class="thumbnail" target=_blank>
tail j=2318 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2319 line= <span><img src="/imgs/links/index_tl.png" alt="tl" width="300px" height="200px" border="0"></span>
tail j=2320 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="tl" width="200px" height="150px" border="0"></span> -->
tail j=2321 line= </a>
tail j=2322 line=
tail j=2323 line= <a class="thumbnail" href="index_sl.html" target=_blank>
tail j=2324 line= <img src="/imgs/btn/koeyeb.png" alt="sl" width="200px" height="100px" border="0">
tail j=2325 line= <span><img src="/imgs/links/index_sl.png" alt="sl" width="400px" height="300px" border="0"></span>
tail j=2326 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="sl" width="200px" height="150px" border="0"></span> -->
tail j=2327 line= </a>
tail j=2328 line=
tail j=2329 line= <a class="thumbnail" href="sl/index_slv.html" target=_blank>
tail j=2330 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2331 line= <span><img src="/imgs/links/index_slv.jpg" alt="slv" width="400px" height=300px" border="0"></span>
tail j=2332 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="slv" width="200px" height=150px" border="0"></span> -->
tail j=2333 line= </a>
tail j=2334 line=
tail j=2335 line= <a class="thumbnail" href="index_pn.html" target=_blank>
tail j=2336 line= <img src="/imgs/btn/koeyeb.png" alt="pn" width="200px" height="100px" border="0">
tail j=2337 line= <span><img src="/imgs/links/index_pn.jpg" alt="pn" width="400px" height="300px" border="0"></span>
tail j=2338 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="pn" width="200px" height="150px" border="0"></span> -->
tail j=2339 line= </a>
tail j=2340 line=
tail j=2341 line= <a class="thumbnail" href="index_zm.html" target=_blank>
tail j=2342 line= <img src="/imgs/btn/koeyew.png" alt="zm" width="200px" height="100px" border="0">
tail j=2343 line= <span><img src="/imgs/links/index_zm.png" alt="zm" width="400px" height="300px" border="0"></span>
tail j=2344 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="zm" width="200px" height="150px" border="0"></span> -->
tail j=2345 line= </a>
tail j=2346 line=
tail j=2347 line= <a class="thumbnail" href="index_dd.html" target=_blank>
tail j=2348 line= <img src="/imgs/btn/koeyeb.png" alt="dd" width="200px" height="100px" border="0">
tail j=2349 line= <span><img src="/imgs/links/index_dd.jpg" alt="dd" width="400px" height="300px" border="0"></span>
tail j=2350 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="dd" width="200px" height="150px" border="0"></span> -->
tail j=2351 line= </a>
tail j=2352 line=
tail j=2353 line= <a class="thumbnail" href="index_av.html" target=_blank>
tail j=2354 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2355 line= <span><img src="/imgs/links/index_av.jpg" alt="av" width="400px" height="300px" border="0"></span>
tail j=2356 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="av" width="200px" height="150px" border="0"></span> -->
tail j=2357 line= </a>
tail j=2358 line=
tail j=2359 line=
tail j=2360 line= <a class="thumbnail" href="index_vu.html" target=_blank>
tail j=2361 line= <img src="/imgs/btn/koeyeb.png" alt="vu" width="200px" height="100px" border="0">
tail j=2362 line= <span><img src="/imgs/links/index_vu.jpg" alt="vu" width="400px" height="300px" border="0"></span>
tail j=2363 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="vu" width="200px" height="150px" border="0"></span> -->
tail j=2364 line= </a>
tail j=2365 line=
tail j=2366 line=
tail j=2367 line=
tail j=2368 line=
tail j=2369 line=
tail j=2370 line=
tail j=2371 line=
tail j=2372 line= <hr color=red>
tail j=2373 line= <hr color=white>
tail j=2374 line=
tail j=2375 line=
tail j=2376 line=
tail j=2377 line=
tail j=2378 line=
tail j=2379 line=
tail j=2380 line=
tail j=2381 line=<!--
tail j=2382 line=
tail j=2383 line= <img v-on:click="showhidr" src="/tl/imgs/jtfdc_private_court_since_1979_viewin.png">
tail j=2384 line= <img v-on:click="showhide" src="/heart/heart.gif" alt="koeye.png" border=0>
tail j=2385 line= <span><img v-on:click="showhide" src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
tail j=2386 line= <img v-on:click="showhide" src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
tail j=2387 line= <button v-on:click="showhide">showhide</button>
tail j=2388 line= <button v-on:click="showhide">yokkmokk</button>
tail j=2389 line= -->
tail j=2390 line=
tail j=2391 line=
tail j=2392 line= <hr>
tail j=2393 line= </div>
tail j=2394 line=
tail j=2395 line= <div v-show="collapsed" class="detail">
tail j=2396 line= jaokim kopernicus wundersteine ii
tail j=2397 line=
tail j=2398 line= <hr>
tail j=2399 line= <a class="thumbnail" href=https://meet.jit.si/ko target=_blank>
tail j=2400 line= <img src=/imgs/links/tn/tn_meet_jkwii.png border=0>
tail j=2401 line= <span><img src=/imgs/links/meet_jkwii.png border=0></span>
tail j=2402 line= </a>
tail j=2403 line= <a class="thumbnail" href=./?q=jkwii4trustee target=_blank>
tail j=2404 line= <img src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
tail j=2405 line= <span><img src=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0></span>
tail j=2406 line= </a>
tail j=2407 line=
tail j=2408 line= <a class="thumbnail" href="/?q=unclesam">
tail j=2409 line= <img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
tail j=2410 line= <span> <img height=400 width=220 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
tail j=2411 line= </a>
tail j=2412 line=
tail j=2413 line=
tail j=2414 line= <a class="thumbnail" href=/ko_jtf/zm/jtf_parcels/jtfdc_012.html target=_blank>
tail j=2415 line= <img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
tail j=2416 line= <span> <img height=400 width=220 src="/tn_snap_20170123_110294.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
tail j=2417 line= </a>
tail j=2418 line=<!-- -->
tail j=2419 line= <a class="thumbnail" href="/?q=columgia">
tail j=2420 line= <img src="/imgs/btn/koeyew.png" alt="koeyew.png" width="200px" height="80" border="0" >
tail j=2421 line= <span> <img height=400 width=220 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
tail j=2422 line= </a>
tail j=2423 line= <a class="popover" href=./?q=handhither target=_blank>
tail j=2424 line= <img src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
tail j=2425 line= <span><img src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
tail j=2426 line= </a>
tail j=2427 line=
tail j=2428 line=<!--
tail j=2429 line= <h1>link_kludge</h1>
tail j=2430 line= <div id="link_kludge" >
tail j=2431 line= <a class="thumbnail" href="/?q=tn1">
tail j=2432 line= <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0">
tail j=2433 line= <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
tail j=2434 line=
tail j=2435 line= <a class="thumbnail" href="/?q=tn2">
tail j=2436 line= <img src="/imgs/btn/koeyew.png" alt="ok" width="50px" height="25px" border="0">
tail j=2437 line= <span><img src="/imgs/globes/globedragon.png" alt="globedragon"></span></a>
tail j=2438 line=
tail j=2439 line= <a class="thumbnail" href="/?q=tn2">
tail j=2440 line= <img src="/imgs/btn/koeyeb.png" alt="ok" width="50px" height="25px" border="0">
tail j=2441 line= <span><img src="/imgs/globes/globewrap.png" alt="globewrap"></span></a>
tail j=2442 line=
tail j=2443 line= <h1>overview</h1>
tail j=2444 line= <a class="thumbnail" href="/?q=overview"> <img src="/tl/imgs/tn/tn_construction_lights.gif" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/construction_lights.gif" alt="construction_lights"></span></a>
tail j=2445 line= <a class="thumbnail" href="/?q=ein_hundes_leben"> <img src="/tl/imgs/tn/tn_index_book-ein_hundes_leben.png" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/index_book-ein_hundes_leben.gif" alt="construction_lights"></span></a>
tail j=2446 line= <a class="thumbnail" href="/?q=deffords_charm"> <img src="/tl/imgs/tn/tn_tl_jtf28_jd.jpg" alt="deffords_charm" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_jtf28_jd.png" alt="deffords_charm"></span></a>
tail j=2447 line= <a class="thumbnail" href="/?q=jtf29_jak3busstop"> <img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop"></span></a>
tail j=2448 line= <a class="thumbnail" href="/?q=jtf29_pre_jtf31"> <img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31"></span></a>
tail j=2449 line= <a class="thumbnail" href="/?q=jtf29_private_court_since_1979_viewin"> <img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin"></span></a>
tail j=2450 line= <a class="thumbnail" href="/?q=jtfinc"> <img src="/tl/imgs/jtfinc.png" alt="jtfinc" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtfinc.png" alt="jtfinc"></span></a>
tail j=2451 line= <a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
tail j=2452 line= <a class="thumbnail" href="/?q=tl_kassil_walter_mil"> <img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter_mil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter"></span></a>
tail j=2453 line= <a class="thumbnail" href="/?q=tl_kassil_walter"> <img src="/tl/imgs/tl_kassil_mil.png" alt="tl_kassil_walter" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter.png" alt="tl_kassil_walter"></span></a>
tail j=2454 line= <a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
tail j=2455 line= <a class="thumbnail" href="/?q=tl_konet_text"> <img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text"></span></a>
tail j=2456 line= <a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
tail j=2457 line= <a class="thumbnail" href="/?q=iperms_hub"> <img src="/tl/imgs/img575.png" alt="iperms_hub" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms_hub.png" alt="iperms_hub"></span></a>
tail j=2458 line= <a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
tail j=2459 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot"></span></a>
tail j=2460 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones"></span></a>
tail j=2461 line= <a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye"></span></a>
tail j=2462 line= <a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc"></span></a>
tail j=2463 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief"></span></a>
tail j=2464 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2465 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2466 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2467 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2468 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2469 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0"> <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
tail j=2470 line= </div>
tail j=2471 line= -->
tail j=2472 line=
tail j=2473 line= </div>
tail j=2474 line= </div>
tail j=2475 line=
tail j=2476 line= <script id="script_new_vue">
tail j=2477 line= var app = new Vue({ el: "#app_jkwii",
tail j=2478 line= data: {
tail j=2479 line= collapsed: false
tail j=2480 line= },
tail j=2481 line= methods: {
tail j=2482 line= showhide: function() {
tail j=2483 line= if (!this.collapsed)
tail j=2484 line= this.collapsed = true;
tail j=2485 line= else
tail j=2486 line= this.collapsed = false;
tail j=2487 line= }
tail j=2488 line= }
tail j=2489 line= });
tail j=2490 line= </script id="script_new_vue">
tail j=2491 line=
tail j=2492 line=<!-- jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj -->
tail j=2493 line=
tail j=2494 line= <script id="script_resize" >
tail j=2495 line= document.body.style.fontfamily = "arial";
tail j=2496 line= function resizeText(multiplier) {
tail j=2497 line= if (document.body.style.fontSize == "") {
tail j=2498 line= document.body.style.fontSize = "1.0em";
tail j=2499 line= }
tail j=2500 line= document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
tail j=2501 line= }
tail j=2502 line= function refontText(multiplier) {
tail j=2503 line= if (document.body.style.fontSize == "") {
tail j=2504 line= document.body.style.fontSize = "2.0em";
tail j=2505 line= }
tail j=2506 line= document.body.style.font = "yokkmokkOT";
tail j=2507 line= }
tail j=2508 line= </script id="script_resize">
tail j=2509 line=<!--
tail j=2510 line= <img id="plustext" alt="Increase text size" height=50 src="/imgs/btn/kob.png" onclick="resizeText(1)" />
tail j=2511 line= < >
tail j=2512 line= <img id="minustext" alt="Decrease text size" height=50 src="/imgs/btn/kow.png" onclick="resizeText(-1)" />
tail j=2513 line= <img id="plusfont" alt="fontup" height=50 src="/imgs/btn/kob.png" onclick="refontText(1)" />
tail j=2514 line= < >
tail j=2515 line= <img id="minusfont" alt="fontdown" height=50 src="/imgs/btn/kow.png" onclick="refontText(-1)" />
tail j=2516 line= -->
tail j=2517 line= <hr>
tail j=2518 line= <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:48pt; font-style:italic" >
tail j=2519 line= abcdefghijklmnopqrstuvwxyz <br>
tail j=2520 line= ABCDEFGHIJKLMNOPQRSTUVWXYZ <br>
tail j=2521 line= 01234567890
tail j=2522 line= </font></span>
tail j=2523 line= <hr>
tail j=2524 line=
tail j=2525 line=<!-- <button type="kogrids" id="kogrids" onclick="kogrids('')">-= kogrids =-</button> -->
tail j=2526 line= <div id="div_kogrids"></div>
tail j=2527 line=
tail j=2528 line=
tail j=2529 line=<!--
tail j=2530 line= <div id="kov">
tail j=2531 line= <div>
tail j=2532 line= kov is it: kov
tail j=2533 line= </div>
tail j=2534 line= <button v-on:click="showhide_kov">showhide_kov</button>
tail j=2535 line= <img v-on:click="showhide_kov1" src="/imgs/btn/kob.png" >
tail j=2536 line= <img v-on:click="showhide_kov" src="/imgs/btn/koeye.png" >
tail j=2537 line= <img v-on:click="showhide_kov2" src="/imgs/btn/kow.png" >
tail j=2538 line=
tail j=2539 line= <div v-show="collapsed" class="detail">
tail j=2540 line= kov detail
tail j=2541 line= <hr>
tail j=2542 line= <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
tail j=2543 line= <img src=/imgs/links/tn/tn_meet.png border=0>
tail j=2544 line= <span><img src=/imgs/links/meet.png border=0></span>
tail j=2545 line= </a>
tail j=2546 line= <hr>
tail j=2547 line= </div>
tail j=2548 line= </div>
tail j=2549 line= <script id="script_new_vue_kov">
tail j=2550 line= var kov = new Vue({ el: "#kov",
tail j=2551 line= data: {collapsed: false},
tail j=2552 line= methods: {
tail j=2553 line= showhide_kov: function() {
tail j=2554 line= if (!this.collapsed) this.collapsed = true;
tail j=2555 line= else this.collapsed = false;
tail j=2556 line=// document.body.style.background = "darkslategrey";
tail j=2557 line=// document.body.style.color = "black";
tail j=2558 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2559 line=// document.body.style.fontsize = "24pt";
tail j=2560 line= },
tail j=2561 line= showhide_kov1: function() {
tail j=2562 line= if (!this.collapsed) this.collapsed = true;
tail j=2563 line= else this.collapsed = false;
tail j=2564 line= },
tail j=2565 line= showhide_kov2: function() {
tail j=2566 line= if (!this.collapsed) this.collapsed = true;
tail j=2567 line= else this.collapsed = false;
tail j=2568 line= }
tail j=2569 line= }
tail j=2570 line= });
tail j=2571 line= </script id="script_new_vue_kov">
tail j=2572 line=
tail j=2573 line= <hr>
tail j=2574 line=abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 01234567890
tail j=2575 line= <hr>
tail j=2576 line= -->
tail j=2577 line=
tail j=2578 line=
tail j=2579 line= <div id="kov_ko">
tail j=2580 line= <div>
tail j=2581 line= ko: kov_ko
tail j=2582 line= </div>
tail j=2583 line= <button v-on:click="showhide_kov_ko">showhide_kov_ko</button>
tail j=2584 line= <img v-on:click="showhide_kov_ko1" src="/imgs/btn/kob.png" >
tail j=2585 line= <img v-on:click="showhide_kov_ko" src="/imgs/btn/koeye.png" >
tail j=2586 line= <img v-on:click="showhide_kov_ko2" src="/imgs/btn/kow.png" >
tail j=2587 line=
tail j=2588 line= <div v-show="collapsed" class="detail_ko">
tail j=2589 line= ko
tail j=2590 line= <hr>
tail j=2591 line= <a href=kov_ko.html class="thumbnail" target=_blank>
tail j=2592 line= <img src=/imgs/kov/tn/tn_kov_ko.png border=0>
tail j=2593 line= <span><img src=/imgs/kov/tn/tn_kov_ko.png border=0></span>
tail j=2594 line= </a>
tail j=2595 line= <hr>
tail j=2596 line=
tail j=2597 line=
tail j=2598 line=
tail j=2599 line= <div id="drag" >
tail j=2600 line= <a class="popover" href="/?q=bigtn_drag1">
tail j=2601 line= <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
tail j=2602 line= <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
tail j=2603 line= </a>
tail j=2604 line= </div>
tail j=2605 line=
tail j=2606 line=
tail j=2607 line=
tail j=2608 line=<!--
tail j=2609 line= <div id="drop">
tail j=2610 line= <span id="sw"><h1>droptop</h2></span>
tail j=2611 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=2612 line= <img height=200 width=300
tail j=2613 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=2614 line= </a>
tail j=2615 line= </div>
tail j=2616 line= -->
tail j=2617 line=
tail j=2618 line=
tail j=2619 line=
tail j=2620 line= </div>
tail j=2621 line= </div>
tail j=2622 line=
tail j=2623 line=
tail j=2624 line=
tail j=2625 line= <div id="div_showhide" hidden>
tail j=2626 line= <button type="button" id="show">Show Content</button>
tail j=2627 line= <button type="button" id="hide">Hide Content</button>
tail j=2628 line= <button type="show_dd" id="show_dd">Show_dd</button>
tail j=2629 line= <button type="hide_dd" id="hide_dd">Hide_dd</button>
tail j=2630 line= <button type="show_bb" id="show_bb">Show_bb</button>
tail j=2631 line= <button type="hide_bb" id="hide_bb">Hide_bb</button>
tail j=2632 line= <button type="show_tl" id="show_tl">Show_tl</button>
tail j=2633 line= <button type="hide_tl" id="hide_tl">Hide_tl</button>
tail j=2634 line= <button type="show_colors" id="show_colors">Show_colors</button>
tail j=2635 line= <button type="hide_colors" id="hide_colors">Hide_colors</button>
tail j=2636 line= <button type="show_fonts" id="show_fonts">Show_fonts</button>
tail j=2637 line= <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
tail j=2638 line= <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
tail j=2639 line= <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
tail j=2640 line= </div>
tail j=2641 line=
tail j=2642 line= <div id="item" hidden>
tail j=2643 line= <hr><h1>div_showhide</h1><hr>
tail j=2644 line= </div>
tail j=2645 line=
tail j=2646 line= <script id="script_showhide">
tail j=2647 line= $( "#show" ).click(function() {$('#item').show(); });
tail j=2648 line= $( "#hide" ).click(function() {$('#item').hide();});
tail j=2649 line= $( "#show_dd" ).click(function() {$('#div_dd').show(); });
tail j=2650 line= $( "#hide_dd" ).click(function() {$('#div_dd').hide();});
tail j=2651 line= $( "#show_bb" ).click(function() {$('#div_bb').show(); });
tail j=2652 line= $( "#hide_bb" ).click(function() {$('#div_bb').hide();});
tail j=2653 line= $( "#show_tl" ).click(function() {$('#div_tl').show(); });
tail j=2654 line= $( "#hide_tl" ).click(function() {$('#div_tl').hide();});
tail j=2655 line= $( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
tail j=2656 line= $( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
tail j=2657 line= $( "#show_colors" ).click(function() {$('#div_colors').show(); });
tail j=2658 line= $( "#hide_colors" ).click(function() {$('#div_colors').hide();});
tail j=2659 line= $( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
tail j=2660 line= $( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
tail j=2661 line= $( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
tail j=2662 line= $( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
tail j=2663 line= </script id="script_showhide">
tail j=2664 line=
tail j=2665 line=
tail j=2666 line= </div>
tail j=2667 line= </div>
tail j=2668 line= </div>
tail j=2669 line=
tail j=2670 line= <script id="script_kov_ko" >
tail j=2671 line= var kov_ko = new Vue({ el: "#kov_ko",
tail j=2672 line= data: {collapsed: false},
tail j=2673 line= methods: {
tail j=2674 line= showhide_kov_ko: function() {
tail j=2675 line= if (!this.collapsed) this.collapsed = true;
tail j=2676 line= else this.collapsed = false;
tail j=2677 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=2678 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2679 line=
tail j=2680 line= },
tail j=2681 line= showhide_kov_ko1: function() {
tail j=2682 line= if (!this.collapsed) this.collapsed = true;
tail j=2683 line= else this.collapsed = false;
tail j=2684 line= },
tail j=2685 line= showhide_kov_ko2: function() {
tail j=2686 line= if (!this.collapsed) this.collapsed = true;
tail j=2687 line= else this.collapsed = false;
tail j=2688 line= }
tail j=2689 line= }
tail j=2690 line= });
tail j=2691 line= </script id="script_kov_ko" >
tail j=2692 line=
tail j=2693 line=
tail j=2694 line=
tail j=2695 line=
tail j=2696 line=
tail j=2697 line=
tail j=2698 line= <div id="kov_new">
tail j=2699 line= <div>
tail j=2700 line= new: kov_new
tail j=2701 line= </div>
tail j=2702 line= <button v-on:click="showhide_kov_new">showhide_kov_new</button>
tail j=2703 line= <img v-on:click="showhide_kov_new" src="/imgs/btn/koeye.png" >
tail j=2704 line= <img v-on:click="showhide_kov_new1" src="/imgs/btn/kob.png" >
tail j=2705 line= <img v-on:click="showhide_kov_new2" src="/imgs/btn/kow.png" >
tail j=2706 line=
tail j=2707 line= <div v-show="collapsed" class="detail_new">
tail j=2708 line= new
tail j=2709 line= <hr>
tail j=2710 line= <a href=https://meet.jit.si/new class="thumbnail" target=_blank>
tail j=2711 line= <img src=/imgs/links/tn/tn_meet_new.png border=0>
tail j=2712 line= <span><img src=/imgs/links/tn/tn_meet_new.png border=0></span>
tail j=2713 line= </a>
tail j=2714 line=
tail j=2715 line=
tail j=2716 line= <hr color=yellow>
tail j=2717 line= <h1>atwist_page</h1>
tail j=2718 line= <div id="container" class="">
tail j=2719 line= <div class="box"></div>
tail j=2720 line= <div class="box-back"></div>
tail j=2721 line= </div>
tail j=2722 line=
tail j=2723 line=
tail j=2724 line= <button id="animate" class="kogo">kogo</button>
tail j=2725 line= <script id="script_atwist_page">
tail j=2726 line= var goButton = document.getElementById("animate");
tail j=2727 line= var container = document.getElementById("container");
tail j=2728 line= goButton.addEventListener('click', function() {
tail j=2729 line= container.classList.toggle('active');
tail j=2730 line= });
tail j=2731 line= </script id="script_atwist_page">
tail j=2732 line=
tail j=2733 line= <hr color=yellow>
tail j=2734 line=
tail j=2735 line=
tail j=2736 line=
tail j=2737 line=
tail j=2738 line=
tail j=2739 line=<a id="drag" class="thumbnail" href="/index_zm.html?zmid=zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility" target=_blank>
tail j=2740 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility/TileGroup0/0-0-0.jpg" border=0>
tail j=2741 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_donovanlaw_containment_facility.png" border=0></span>
tail j=2742 line= </a>
tail j=2743 line=
tail j=2744 line=<a id="drag" class="thumbnail" href="/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus" target=_blank>
tail j=2745 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus/TileGroup0/0-0-0.jpg" border=0>
tail j=2746 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_byrdpuckers_dogpony_campus.png" border=0></span>
tail j=2747 line= </a>
tail j=2748 line=
tail j=2749 line=<a id="drag" class="popover" href=/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_kou_campus target=_blank>
tail j=2750 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_kou_campus/TileGroup0/0-0-0.jpg" border=0>
tail j=2751 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_kou_campus.png" border=0></span>
tail j=2752 line= </a>
tail j=2753 line=
tail j=2754 line=<img src="/imgs/links/eyes_023.gif">
tail j=2755 line=
tail j=2756 line=
tail j=2757 line=
tail j=2758 line=
tail j=2759 line=
tail j=2760 line= </div>
tail j=2761 line= </div>
tail j=2762 line=
tail j=2763 line= <script id="script_kov_new">
tail j=2764 line= var kov_new = new Vue({ el: "#kov_new",
tail j=2765 line= data: {collapsed: false},
tail j=2766 line= methods: {
tail j=2767 line= showhide_kov_new: function() {
tail j=2768 line= if (!this.collapsed) this.collapsed = true;
tail j=2769 line= else this.collapsed = false;
tail j=2770 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=2771 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2772 line=
tail j=2773 line=// document.body.style.background = "darkslategrey";
tail j=2774 line=// document.body.style.color = "black";
tail j=2775 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2776 line=// document.body.style.fontsize = "24pt";
tail j=2777 line= },
tail j=2778 line= showhide_kov_new1: function() {
tail j=2779 line= if (!this.collapsed) this.collapsed = true;
tail j=2780 line= else this.collapsed = false;
tail j=2781 line= },
tail j=2782 line= showhide_kov_new2: function() {
tail j=2783 line= if (!this.collapsed) this.collapsed = true;
tail j=2784 line= else this.collapsed = false;
tail j=2785 line= }
tail j=2786 line= }
tail j=2787 line= });
tail j=2788 line= </script id="script_kov_new">
tail j=2789 line=
tail j=2790 line=
tail j=2791 line= <div id="div_kov_focus">
tail j=2792 line= <div>
tail j=2793 line= focus: kov_focus
tail j=2794 line= </div>
tail j=2795 line= <button v-on:click="showhide_kov_focus">showhide_kov_focus</button>
tail j=2796 line= <img v-on:click="showhide_kov_focus" src="/imgs/btn/koeye.png" >
tail j=2797 line= <img v-on:click="showhide_kov_focus1" src="/imgs/btn/kob.png" >
tail j=2798 line= <img v-on:click="showhide_kov_focus2" src="/imgs/btn/kow.png" >
tail j=2799 line=
tail j=2800 line= <div v-show="collapsed" class="detail_focus">
tail j=2801 line= focus2
tail j=2802 line= <hr>
tail j=2803 line= <a href=https://meet.jit.si/focus class="thumbnail" target=_blank>
tail j=2804 line= <img height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=2805 line= <span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=2806 line= </a>
tail j=2807 line= <hr>
tail j=2808 line=
tail j=2809 line= <a href=/imgs/links/warning_light.gif id="drag" target=_blank>
tail j=2810 line= <img class="drg" height=200 src=/imgs/links/warning_light.gif border=0>
tail j=2811 line= </a>
tail j=2812 line=
tail j=2813 line= <div id="drag">
tail j=2814 line= <div class="drg">
tail j=2815 line= <h3>preview_deck_rocksoup</h3>
tail j=2816 line= <div id="div_deck_rocksoup">
tail j=2817 line= <a class="popover" href=http://ka12/index_dk.html#rocksoup alt=index_dk_rocksoup target=_blank>
tail j=2818 line= <img width=200 height=200 src=imgs/links/rocksoup_rock.png alt=rocksoup_rock border=0>
tail j=2819 line= <span><img width=200 height=200 src=/imgs/links/rocksoup_pot.png alt=rocksoup_pot border=0></span>
tail j=2820 line= </a>
tail j=2821 line= </div>
tail j=2822 line= </div>
tail j=2823 line= </div>
tail j=2824 line=
tail j=2825 line=
tail j=2826 line=
tail j=2827 line= <a id="drag" class="thumbnail" href="svc/emchat/index.html" target=_blank>
tail j=2828 line= <img class="drg" src="/imgs/links/links_emchat.png" border=0>
tail j=2829 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_emchat.png" border=0></span>
tail j=2830 line= </a>
tail j=2831 line=
tail j=2832 line= <a id="drag" class="thumbnail" href="svc/ol/ht/index.html" target=_blank>
tail j=2833 line= <img class="drg" src="/imgs/links/links_ol.png" border=0>
tail j=2834 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_ol.png" border=0></span>
tail j=2835 line= </a>
tail j=2836 line=
tail j=2837 line=<!--
tail j=2838 line= <button type="button" onclick="script_ajax()">ajax</button>
tail j=2839 line= <img src="/imgs/btn/koeye_handhi.gif" onclick="script_ajax()">
tail j=2840 line= <div id="div_ajaxdb"><h2>div_ajaxdb</h2></div>
tail j=2841 line= -->
tail j=2842 line=
tail j=2843 line= </div>
tail j=2844 line= </div id="div_kov_focus">
tail j=2845 line=
tail j=2846 line= <script id="script_kov_focus" >
tail j=2847 line= var kov_focus = new Vue({ el: "#kov_focus",
tail j=2848 line= data: {collapsed: false},
tail j=2849 line= methods: {
tail j=2850 line= showhide_kov_focus: function() {
tail j=2851 line= if (!this.collapsed) this.collapsed = true;
tail j=2852 line= else this.collapsed = false;
tail j=2853 line= document.getElementById("kov_focus").style.font = "italic bold 20px arial,serif";
tail j=2854 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2855 line=
tail j=2856 line=// document.body.style.background = "darkslategrey";
tail j=2857 line=// document.body.style.color = "black";
tail j=2858 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2859 line=// document.body.style.fontsize = "24pt";
tail j=2860 line= },
tail j=2861 line= showhide_kov_focus1: function() {
tail j=2862 line= if (!this.collapsed) this.collapsed = true;
tail j=2863 line= else this.collapsed = false;
tail j=2864 line= },
tail j=2865 line= showhide_kov_focus2: function() {
tail j=2866 line= if (!this.collapsed) this.collapsed = true;
tail j=2867 line= else this.collapsed = false;
tail j=2868 line= }
tail j=2869 line= }
tail j=2870 line= });
tail j=2871 line= </script id="script_kov_focus" >
tail j=2872 line=
tail j=2873 line=
tail j=2874 line=
tail j=2875 line=
tail j=2876 line=
tail j=2877 line= <div id="kov_food">
tail j=2878 line= <div>
tail j=2879 line= kov_food:
tail j=2880 line= </div>
tail j=2881 line= <button v-on:click="showhide_kov_food">showhide_kov_food</button>
tail j=2882 line= <img v-on:click="showhide_kov_food" src="/imgs/btn/koeye.png" >
tail j=2883 line= <img v-on:click="showhide_kov_food1" src="/imgs/btn/kob.png" >
tail j=2884 line= <img v-on:click="showhide_kov_food2" src="/imgs/btn/kow.png" >
tail j=2885 line=
tail j=2886 line= <div v-show="collapsed" class="detail_food">
tail j=2887 line= kov_food
tail j=2888 line= <div id="drag"> kov_food:<br />
tail j=2889 line= <a href=kov_food.html class="thumbnail" target=_blank>
tail j=2890 line= <img class="drg" src="/imgs/kov/tn/tn_kov_food.png" alt="kov_food" width="50" class="drg"/>
tail j=2891 line= <span><img class="drg" src="/imgs/kov/kov_food.png" alt="kov_food" width="50" class="drg"/></span>
tail j=2892 line= </a>
tail j=2893 line= </div>
tail j=2894 line=
tail j=2895 line=
tail j=2896 line= </div>
tail j=2897 line= </div>
tail j=2898 line=
tail j=2899 line= <script>var kov_food = new Vue({ el: "#kov_food",
tail j=2900 line= data: {collapsed: false},
tail j=2901 line= methods: {
tail j=2902 line= showhide_kov_food: function() {
tail j=2903 line= if (!this.collapsed) this.collapsed = true;
tail j=2904 line= else this.collapsed = false;
tail j=2905 line= document.getElementById("kov_food").style.font = "italic bold 20px arial,serif";
tail j=2906 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2907 line=
tail j=2908 line=// document.body.style.background = "darkslategrey";
tail j=2909 line=// document.body.style.color = "black";
tail j=2910 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2911 line=// document.body.style.fontsize = "24pt";
tail j=2912 line= },
tail j=2913 line= showhide_kov_food1: function() {
tail j=2914 line= if (!this.collapsed) this.collapsed = true;
tail j=2915 line= else this.collapsed = false;
tail j=2916 line= },
tail j=2917 line= showhide_kov_food2: function() {
tail j=2918 line= if (!this.collapsed) this.collapsed = true;
tail j=2919 line= else this.collapsed = false;
tail j=2920 line= }
tail j=2921 line= }
tail j=2922 line= });
tail j=2923 line= </script>
tail j=2924 line=
tail j=2925 line=
tail j=2926 line=
tail j=2927 line=
tail j=2928 line= <div id="kov_courtreport">
tail j=2929 line= <div>
tail j=2930 line= kov_courtreport:
tail j=2931 line= </div>
tail j=2932 line= <button v-on:click="showhide_kov_courtreport">showhide_kov_courtreport</button>
tail j=2933 line= <img v-on:click="showhide_kov_courtreport" src="/imgs/btn/koeye.png" >
tail j=2934 line= <img v-on:click="showhide_kov_courtreport1" src="/imgs/btn/kob.png" >
tail j=2935 line= <img v-on:click="showhide_kov_courtreport2" src="/imgs/btn/kow.png" >
tail j=2936 line=
tail j=2937 line= <div v-show="collapsed" class="detail_courtreport">
tail j=2938 line= kov_courtreport
tail j=2939 line= <div id="drag"> kov_courtreport:<br />
tail j=2940 line= <a href=kov_food.html class="thumbnail" target=_blank>
tail j=2941 line= <img class="drg" src="/imgs/kov/tn/tn_kov_courtreport.png" alt="kov_food" width="50" class="drg"/>
tail j=2942 line= <span><img class="drg" src="/imgs/kov/kov_courtreport.png" alt="kov_food" width="50" class="drg"/></span>
tail j=2943 line= </a>
tail j=2944 line= </div>
tail j=2945 line=
tail j=2946 line= </div>
tail j=2947 line= </div>
tail j=2948 line=
tail j=2949 line= <script>var kov_courtreport = new Vue({ el: "#kov_courtreport",
tail j=2950 line= data: {collapsed: false},
tail j=2951 line= methods: {
tail j=2952 line= showhide_kov_courtreport: function() {
tail j=2953 line= if (!this.collapsed) this.collapsed = true;
tail j=2954 line= else this.collapsed = false;
tail j=2955 line= document.getElementById("kov_courtreport").style.font = "italic bold 20px arial,serif";
tail j=2956 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2957 line=
tail j=2958 line=// document.body.style.background = "darkslategrey";
tail j=2959 line=// document.body.style.color = "black";
tail j=2960 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2961 line=// document.body.style.fontsize = "24pt";
tail j=2962 line= },
tail j=2963 line= showhide_kov_courtreport1: function() {
tail j=2964 line= if (!this.collapsed) this.collapsed = true;
tail j=2965 line= else this.collapsed = false;
tail j=2966 line= },
tail j=2967 line= showhide_kov_courtreport2: function() {
tail j=2968 line= if (!this.collapsed) this.collapsed = true;
tail j=2969 line= else this.collapsed = false;
tail j=2970 line= }
tail j=2971 line= }
tail j=2972 line= });
tail j=2973 line= </script>
tail j=2974 line=
tail j=2975 line=
tail j=2976 line=
tail j=2977 line=
tail j=2978 line= <div id="kov_where">
tail j=2979 line= <div>
tail j=2980 line= kov_where:
tail j=2981 line= </div>
tail j=2982 line= <button v-on:click="showhide_kov_where">showhide_kov_where</button>
tail j=2983 line= <img v-on:click="showhide_kov_where" src="/imgs/btn/koeye.png" >
tail j=2984 line= <img v-on:click="showhide_kov_where1" src="/imgs/btn/kob.png" >
tail j=2985 line= <img v-on:click="showhide_kov_where2" src="/imgs/btn/kow.png" >
tail j=2986 line=
tail j=2987 line= <div v-show="collapsed" class="detail_where">
tail j=2988 line=
tail j=2989 line= where
tail j=2990 line= <hr color=yellow>
tail j=2991 line=
tail j=2992 line= <a id="drag" class="thumbnail" href="/svc/ol/ht/index.html" target=_blank>
tail j=2993 line= <img class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0>
tail j=2994 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0></span>
tail j=2995 line= </a>
tail j=2996 line=
tail j=2997 line=
tail j=2998 line= <div id="div_gigapan" id="drag" >
tail j=2999 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
tail j=3000 line= <img class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
tail j=3001 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
tail j=3002 line= </a>
tail j=3003 line=
tail j=3004 line=
tail j=3005 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com" target=_blank>
tail j=3006 line= <img height=200 class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0>
tail j=3007 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0></span>
tail j=3008 line= </a>
tail j=3009 line= </div>
tail j=3010 line=
tail j=3011 line=
tail j=3012 line=
tail j=3013 line= <div id="drag"> where:<br />
tail j=3014 line=
tail j=3015 line=<!--
tail j=3016 line= <a href=https://meet.jit.si/where class="thumbnail" target=_blank>
tail j=3017 line= <img height=100 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=3018 line= <span><img height=200 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/></span>
tail j=3019 line= </a>
tail j=3020 line= -->
tail j=3021 line=
tail j=3022 line=<!--
tail j=3023 line= <div class="drg"><h1>konet llc </h1>
tail j=3024 line= <pre>timejask jkwii</pre>
tail j=3025 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=3026 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=3027 line= <pre>timesak where</pre>
tail j=3028 line= </div>
tail j=3029 line= -->
tail j=3030 line=
tail j=3031 line= <div class="drg"><h1>jitsimeet/where </h1>
tail j=3032 line= <a href="https://jit.si.meee/where" id="drag" targer=_blank class="thumbnail">
tail j=3033 line= <img height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=3034 line= <span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=3035 line= </a>
tail j=3036 line= </div>
tail j=3037 line=
tail j=3038 line= <div id="drag"> where:<br />
tail j=3039 line= <a class="drg" href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
tail j=3040 line= <img height=200 src=/imgs/links/warning_light.gif border=0>
tail j=3041 line= <span><img src=/links/warning_light.gif border=0></span>
tail j=3042 line= </a>
tail j=3043 line= </div>
tail j=3044 line= </div>
tail j=3045 line= </div>
tail j=3046 line= <hr>
tail j=3047 line=
tail j=3048 line=
tail j=3049 line=
tail j=3050 line=
tail j=3051 line=
tail j=3052 line= </div>
tail j=3053 line= </div>
tail j=3054 line=
tail j=3055 line= <script>var kov_where = new Vue({ el: "#kov_where",
tail j=3056 line= data: {collapsed: false},
tail j=3057 line= methods: {
tail j=3058 line= showhide_kov_where: function() {
tail j=3059 line= if (!this.collapsed) this.collapsed = true;
tail j=3060 line= else this.collapsed = false;
tail j=3061 line= document.getElementById("kov_where").style.font = "italic bold 20px arial,serif";
tail j=3062 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3063 line=
tail j=3064 line=// document.body.style.background = "darkslategrey";
tail j=3065 line=// document.body.style.color = "black";
tail j=3066 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3067 line=// document.body.style.fontsize = "24pt";
tail j=3068 line= },
tail j=3069 line= showhide_kov_where1: function() {
tail j=3070 line= if (!this.collapsed) this.collapsed = true;
tail j=3071 line= else this.collapsed = false;
tail j=3072 line= },
tail j=3073 line= showhide_kov_where2: function() {
tail j=3074 line= if (!this.collapsed) this.collapsed = true;
tail j=3075 line= else this.collapsed = false;
tail j=3076 line= }
tail j=3077 line= }
tail j=3078 line= });
tail j=3079 line= </script>
tail j=3080 line=
tail j=3081 line=
tail j=3082 line=
tail j=3083 line=
tail j=3084 line=
tail j=3085 line=
tail j=3086 line=
tail j=3087 line=
tail j=3088 line=
tail j=3089 line=
tail j=3090 line=
tail j=3091 line=
tail j=3092 line=
tail j=3093 line=
tail j=3094 line=
tail j=3095 line=
tail j=3096 line=
tail j=3097 line= <div id="kov_work">
tail j=3098 line= <div>
tail j=3099 line= kov_work:
tail j=3100 line= </div>
tail j=3101 line= <button v-on:click="showhide_kov_work">showhide_kov_work</button>
tail j=3102 line= <img v-on:click="showhide_kov_work" src="/imgs/btn/koeye.png" >
tail j=3103 line= <img v-on:click="showhide_kov_work1" src="/imgs/btn/kob.png" >
tail j=3104 line= <img v-on:click="showhide_kov_work2" src="/imgs/btn/kow.png" >
tail j=3105 line=
tail j=3106 line= <div v-show="collapsed" class="detail_work">
tail j=3107 line= kov_work
tail j=3108 line= <div id="drag"> kov_work:<br />
tail j=3109 line= <a href=kov_work.html class="thumbnail" target=_blank>
tail j=3110 line= <img class="drg" src="/imgs/kov/tn/tn_kov_work.png" alt="kov_food" width="50" class="drg"/>
tail j=3111 line= <span><img class="drg" src="/imgs/kov/kov_work.png" alt="kov_food" width="50" class="drg"/></span>
tail j=3112 line= </a>
tail j=3113 line= </div>
tail j=3114 line=
tail j=3115 line=
tail j=3116 line= </div>
tail j=3117 line= </div>
tail j=3118 line=
tail j=3119 line= <script>var kov = new Vue({ el: "#kov_work",
tail j=3120 line= data: {collapsed: false},
tail j=3121 line= methods: {
tail j=3122 line= showhide_kov_work: function() {
tail j=3123 line= if (!this.collapsed) this.collapsed = true;
tail j=3124 line= else this.collapsed = false;
tail j=3125 line=// document.body.style.background = "darkslategrey";
tail j=3126 line=// document.body.style.color = "black";
tail j=3127 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3128 line=// document.body.style.fontsize = "24pt";
tail j=3129 line= },
tail j=3130 line= showhide_kov_work1: function() {
tail j=3131 line= if (!this.collapsed) this.collapsed = true;
tail j=3132 line= else this.collapsed = false;
tail j=3133 line= },
tail j=3134 line= showhide_kov_work2: function() {
tail j=3135 line= if (!this.collapsed) this.collapsed = true;
tail j=3136 line= else this.collapsed = false;
tail j=3137 line= }
tail j=3138 line= }
tail j=3139 line= });
tail j=3140 line= </script>
tail j=3141 line=
tail j=3142 line=
tail j=3143 line=
tail j=3144 line= <div id="kov_memes">
tail j=3145 line= <div>
tail j=3146 line= memes: kov_memes
tail j=3147 line= </div>
tail j=3148 line= <button v-on:click="showhide_kov_memes">showhide_kov_memes</button>
tail j=3149 line= <img v-on:click="showhide_kov_memes" src="/imgs/btn/koeye.png" >
tail j=3150 line= <img v-on:click="showhide_kov_memes1" src="/imgs/btn/kob.png" >
tail j=3151 line= <img v-on:click="showhide_kov_memes2" src="/imgs/btn/kow.png" >
tail j=3152 line=
tail j=3153 line= <div v-show="collapsed" class="detail_memes">
tail j=3154 line= kov_memes
tail j=3155 line= <div id="drag"> kov_memes:<br />
tail j=3156 line= <a href=kov_memes.html class="thumbnail" target=_blank>
tail j=3157 line= <img class="drg" src="/imgs/kov/tn/tn_kov_memes.png" alt="kov_food" width="50" class="drg"/>
tail j=3158 line= <span><img class="drg" src="/imgs/kov/kov_memes.png" alt="kov_food" width="50" class="drg"/></span>
tail j=3159 line= </a>
tail j=3160 line= </div>
tail j=3161 line=
tail j=3162 line= </div>
tail j=3163 line= </div>
tail j=3164 line=
tail j=3165 line= <script>var kov_memes = new Vue({ el: "#kov_memes",
tail j=3166 line= data: {collapsed: false},
tail j=3167 line= methods: {
tail j=3168 line= showhide_kov_memes: function() {
tail j=3169 line= if (!this.collapsed) this.collapsed = true;
tail j=3170 line= else this.collapsed = false;
tail j=3171 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3172 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3173 line=
tail j=3174 line=// document.body.style.background = "darkslategrey";
tail j=3175 line=// document.body.style.color = "black";
tail j=3176 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3177 line=// document.body.style.fontsize = "24pt";
tail j=3178 line= },
tail j=3179 line= showhide_kov_memes1: function() {
tail j=3180 line= if (!this.collapsed) this.collapsed = true;
tail j=3181 line= else this.collapsed = false;
tail j=3182 line= },
tail j=3183 line= showhide_kov_memes2: function() {
tail j=3184 line= if (!this.collapsed) this.collapsed = true;
tail j=3185 line= else this.collapsed = false;
tail j=3186 line= }
tail j=3187 line= }
tail j=3188 line= });
tail j=3189 line= </script>
tail j=3190 line=
tail j=3191 line=
tail j=3192 line= <div id="kov_kids">
tail j=3193 line= <div>
tail j=3194 line= kids: kov_kids
tail j=3195 line= </div>
tail j=3196 line= <button v-on:click="showhide_kov_kids">showhide_kov_kids</button>
tail j=3197 line= <img v-on:click="showhide_kov_kids" src="/imgs/btn/koeye.png" >
tail j=3198 line= <img v-on:click="showhide_kov_kids1" src="/imgs/btn/kob.png" >
tail j=3199 line= <img v-on:click="showhide_kov_kids2" src="/imgs/btn/kow.png" >
tail j=3200 line=
tail j=3201 line= <div v-show="collapsed" class="detail_kids">
tail j=3202 line= kov_kids
tail j=3203 line= <div id="drag"> kov_kids:<br />
tail j=3204 line= <a href=kov_kids.html class="thumbnail" target=_blank>
tail j=3205 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kids.png" alt="kov_food" width="200" class="drg"/>
tail j=3206 line= <span><img class="drg" src="/imgs/kov/kov_kids.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3207 line= </a>
tail j=3208 line=
tail j=3209 line=
tail j=3210 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
tail j=3211 line= <img class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
tail j=3212 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
tail j=3213 line= </a>
tail j=3214 line=
tail j=3215 line=
tail j=3216 line= <a href=/ko/svc/js/stemkoskijs/Three.js/Voxel-Painter.html class="thumbnail" target=_blank>
tail j=3217 line= <img height =200 src="/imgs/links/tn/tn_voxelpainter.png">
tail j=3218 line= <span><img height=400 src="/imgs/links/tn/tn_voxelpainter.png"></span>
tail j=3219 line= </a>
tail j=3220 line=
tail j=3221 line= <a href=/ko/svc/js/stemkoskijs/Three.js/ class="thumbnail" target=_blank>
tail j=3222 line= <img height =200 src="/imgs/links/tn/tn_stemkoskijs.png">
tail j=3223 line= <span><img height=400 src="/imgs/links/tn/tn_stemkoskijs.png"></span>
tail j=3224 line= </a>
tail j=3225 line=
tail j=3226 line= <a href=ko/svc/js/stemkoskijs/Three.js/ target=_blank>
tail j=3227 line=
tail j=3228 line= </a>
tail j=3229 line=
tail j=3230 line=
tail j=3231 line= </div>
tail j=3232 line= </div>
tail j=3233 line=
tail j=3234 line=<!--
tail j=3235 line=harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
tail j=3236 line=morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
tail j=3237 line=morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
tail j=3238 line=harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
tail j=3239 line=georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
tail j=3240 line= -->
tail j=3241 line=
tail j=3242 line=
tail j=3243 line=
tail j=3244 line= </div>
tail j=3245 line=
tail j=3246 line= </a>
tail j=3247 line=
tail j=3248 line=
tail j=3249 line= </div>
tail j=3250 line= </div>
tail j=3251 line=
tail j=3252 line=<!--
tail j=3253 line=harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
tail j=3254 line=morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
tail j=3255 line=morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
tail j=3256 line=harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
tail j=3257 line=georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
tail j=3258 line= -->
tail j=3259 line=
tail j=3260 line=
tail j=3261 line=
tail j=3262 line= </div>
tail j=3263 line= </div>
tail j=3264 line=
tail j=3265 line= <script>var kov_kids = new Vue({ el: "#kov_kids",
tail j=3266 line= data: {collapsed: false},
tail j=3267 line= methods: {
tail j=3268 line= showhide_kov_kids: function() {
tail j=3269 line= if (!this.collapsed) this.collapsed = true;
tail j=3270 line= else this.collapsed = false;
tail j=3271 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3272 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3273 line=
tail j=3274 line=// document.body.style.background = "darkslategrey";
tail j=3275 line=// document.body.style.color = "black";
tail j=3276 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3277 line=// document.body.style.fontsize = "24pt";
tail j=3278 line= },
tail j=3279 line= showhide_kov_kids1: function() {
tail j=3280 line= if (!this.collapsed) this.collapsed = true;
tail j=3281 line= else this.collapsed = false;
tail j=3282 line= },
tail j=3283 line= showhide_kov_kids2: function() {
tail j=3284 line= if (!this.collapsed) this.collapsed = true;
tail j=3285 line= else this.collapsed = false;
tail j=3286 line= }
tail j=3287 line= }
tail j=3288 line= });
tail j=3289 line= </script>
tail j=3290 line=
tail j=3291 line=
tail j=3292 line=
tail j=3293 line=
tail j=3294 line=
tail j=3295 line=
tail j=3296 line= <div id="kov_dogs">
tail j=3297 line= <div>
tail j=3298 line= dogs: kov_dogs
tail j=3299 line= </div>
tail j=3300 line= <button v-on:click="showhide_kov_dogs">showhide_kov_dogs</button>
tail j=3301 line= <img v-on:click="showhide_kov_dogs" src="/imgs/btn/koeye.png" >
tail j=3302 line= <img v-on:click="showhide_kov_dogs1" src="/imgs/btn/kob.png" >
tail j=3303 line= <img v-on:click="showhide_kov_dogs2" src="/imgs/btn/kow.png" >
tail j=3304 line=
tail j=3305 line= <div v-show="collapsed" class="detail_dogs">
tail j=3306 line= kov_dogs
tail j=3307 line= <div id="drag"> kov_dogs:<br />
tail j=3308 line= <a href=kov_dogs.html class="thumbnail" target=_blank>
tail j=3309 line= <img class="drg" src="/imgs/kov/tn/tn_kov_dogs.png" alt="kov_food" width="200" class="drg"/>
tail j=3310 line= <span><img class="drg" src="/imgs/kov/kov_dogs.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3311 line= </a>
tail j=3312 line= </div>
tail j=3313 line=
tail j=3314 line= <a href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
tail j=3315 line= <img height=200 src=/imgs/links/warning_light.gif border=0>
tail j=3316 line= <span><img src=/links/warning_light.gif border=0></span>
tail j=3317 line= </a>
tail j=3318 line=
tail j=3319 line=<!-- kov_dogs_end -->
tail j=3320 line= </div>
tail j=3321 line= </div>
tail j=3322 line=
tail j=3323 line= <script>var kov_dogs = new Vue({ el: "#kov_dogs",
tail j=3324 line= data: {collapsed: false},
tail j=3325 line= methods: {
tail j=3326 line= showhide_kov_dogs: function() {
tail j=3327 line= if (!this.collapsed) this.collapsed = true;
tail j=3328 line= else this.collapsed = false;
tail j=3329 line= document.getElementById("kov_dogs").style.font = "italic bold 20px arial,serif";
tail j=3330 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3331 line=
tail j=3332 line=// document.body.style.background = "darkslategrey";
tail j=3333 line=// document.body.style.color = "black";
tail j=3334 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3335 line=// document.body.style.fontsize = "24pt";
tail j=3336 line= },
tail j=3337 line= showhide_kov_dogs1: function() {
tail j=3338 line= if (!this.collapsed) this.collapsed = true;
tail j=3339 line= else this.collapsed = false;
tail j=3340 line= },
tail j=3341 line= showhide_kov_dogs2: function() {
tail j=3342 line= if (!this.collapsed) this.collapsed = true;
tail j=3343 line= else this.collapsed = false;
tail j=3344 line= }
tail j=3345 line= }
tail j=3346 line= });
tail j=3347 line= </script>
tail j=3348 line=
tail j=3349 line=
tail j=3350 line= <div id="kov_preserve">
tail j=3351 line= <div>
tail j=3352 line= preserve: kov_preserve
tail j=3353 line= </div>
tail j=3354 line= <button v-on:click="showhide_kov_preserve">showhide_kov_preserve</button>
tail j=3355 line= <img v-on:click="showhide_kov_preserve" src="/imgs/btn/koeye.png" >
tail j=3356 line= <img v-on:click="showhide_kov_preserve1" src="/imgs/btn/kob.png" >
tail j=3357 line= <img v-on:click="showhide_kov_preserve2" src="/imgs/btn/kow.png" >
tail j=3358 line=
tail j=3359 line= <div v-show="collapsed" class="detail_preserve">
tail j=3360 line= <div id="drag"> kov_preserve:<br />
tail j=3361 line= <a href=kov_preserve.html class="thumbnail" target=_blank>
tail j=3362 line= <img class="drg" src="/imgs/kov/tn/tn_kov_preserve.png" alt="kov_food" width="200" class="drg"/>
tail j=3363 line= <span><img class="drg" src="/imgs/kov/kov_preserve.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3364 line= </a>
tail j=3365 line= </div>
tail j=3366 line=
tail j=3367 line=
tail j=3368 line= </div>
tail j=3369 line= </div>
tail j=3370 line=
tail j=3371 line= <script>var kov_preserve = new Vue({ el: "#kov_preserve",
tail j=3372 line= data: {collapsed: false},
tail j=3373 line= methods: {
tail j=3374 line= showhide_kov_preserve: function() {
tail j=3375 line= if (!this.collapsed) this.collapsed = true;
tail j=3376 line= else this.collapsed = false;
tail j=3377 line= document.getElementById("kov_preserve").style.font = "italic bold 20px arial,serif";
tail j=3378 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3379 line=
tail j=3380 line=// document.body.style.background = "darkslategrey";
tail j=3381 line=// document.body.style.color = "black";
tail j=3382 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3383 line=// document.body.style.fontsize = "24pt";
tail j=3384 line= },
tail j=3385 line= showhide_kov_preserve1: function() {
tail j=3386 line= if (!this.collapsed) this.collapsed = true;
tail j=3387 line= else this.collapsed = false;
tail j=3388 line= },
tail j=3389 line= showhide_kov_preserve2: function() {
tail j=3390 line= if (!this.collapsed) this.collapsed = true;
tail j=3391 line= else this.collapsed = false;
tail j=3392 line= }
tail j=3393 line= }
tail j=3394 line= });
tail j=3395 line= </script>
tail j=3396 line=
tail j=3397 line=
tail j=3398 line=
tail j=3399 line= <div id="kov_protect">
tail j=3400 line= <div>
tail j=3401 line= protect: kov_protect
tail j=3402 line= </div>
tail j=3403 line= <button v-on:click="showhide_kov_protect">showhide_kov_protect</button>
tail j=3404 line= <img v-on:click="showhide_kov_protect" src="/imgs/btn/koeye.png" >
tail j=3405 line= <img v-on:click="showhide_kov_protect1" src="/imgs/btn/kob.png" >
tail j=3406 line= <img v-on:click="showhide_kov_protect2" src="/imgs/btn/kow.png" >
tail j=3407 line=
tail j=3408 line= <div v-show="collapsed" class="detail_protect">
tail j=3409 line= <div id="drag"> kov_protect:<br />
tail j=3410 line= <a href=kov_protect.html class="thumbnail" target=_blank>
tail j=3411 line= <img class="drg" src="/imgs/kov/tn/tn_kov_protect.png" alt="kov_food" width="200" class="drg"/>
tail j=3412 line= <span><img class="drg" src="/imgs/kov/kov_protect.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3413 line= </a>
tail j=3414 line= </div>
tail j=3415 line=
tail j=3416 line=
tail j=3417 line= </div>
tail j=3418 line= </div>
tail j=3419 line=
tail j=3420 line=
tail j=3421 line= <script>var kov_protect = new Vue({ el: "#kov_protect",
tail j=3422 line= data: {collapsed: false},
tail j=3423 line= methods: {
tail j=3424 line= showhide_kov_protect: function() {
tail j=3425 line= if (!this.collapsed) this.collapsed = true;
tail j=3426 line= else this.collapsed = false;
tail j=3427 line= document.getElementById("kov_protect").style.font = "italic bold 20px arial,serif";
tail j=3428 line= },
tail j=3429 line= showhide_kov_protect1: function() {
tail j=3430 line= if (!this.collapsed) this.collapsed = true;
tail j=3431 line= else this.collapsed = false;
tail j=3432 line= },
tail j=3433 line= showhide_kov_protect2: function() {
tail j=3434 line= if (!this.collapsed) this.collapsed = true;
tail j=3435 line= else this.collapsed = false;
tail j=3436 line= }
tail j=3437 line= }
tail j=3438 line= });
tail j=3439 line= </script>
tail j=3440 line=
tail j=3441 line=
tail j=3442 line=
tail j=3443 line= <div id="kov_jtfdc">
tail j=3444 line= <div>
tail j=3445 line= jtfdc: kov_jtfdc
tail j=3446 line= </div>
tail j=3447 line= <button v-on:click="showhide_kov_jtfdc">showhide_kov_jtfdc</button>
tail j=3448 line= <img v-on:click="showhide_kov_jtfdc" src="/imgs/btn/koeye.png" >
tail j=3449 line= <img v-on:click="showhide_kov_jtfdc1" src="/imgs/btn/kob.png" >
tail j=3450 line= <img v-on:click="showhide_kov_jtfdc2" src="/imgs/btn/kow.png" >
tail j=3451 line=
tail j=3452 line= <div v-show="collapsed" class="detail_jtfdc">
tail j=3453 line= <div id="drag"> kov_jtfdc:<br />
tail j=3454 line= <a href=kov_jtfdc.html class="thumbnail" target=_blank>
tail j=3455 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jtfdc.png" alt="kov_food" width="200" class="drg"/>
tail j=3456 line= <span><img class="drg" src="/imgs/kov/kov_jtfdc.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3457 line= </a>
tail j=3458 line= </div>
tail j=3459 line=
tail j=3460 line=
tail j=3461 line= </div>
tail j=3462 line= </div>
tail j=3463 line=
tail j=3464 line=
tail j=3465 line= <script>var kov_jtfdc = new Vue({ el: "#kov_jtfdc",
tail j=3466 line= data: {collapsed: false},
tail j=3467 line= methods: {
tail j=3468 line= showhide_kov_jtfdc: function() {
tail j=3469 line= if (!this.collapsed) this.collapsed = true;
tail j=3470 line= else this.collapsed = false;
tail j=3471 line= },
tail j=3472 line= showhide_kov_jtfdc1: function() {
tail j=3473 line= if (!this.collapsed) this.collapsed = true;
tail j=3474 line= else this.collapsed = false;
tail j=3475 line= },
tail j=3476 line= showhide_kov_jtfdc2: function() {
tail j=3477 line= if (!this.collapsed) this.collapsed = true;
tail j=3478 line= else this.collapsed = false;
tail j=3479 line= }
tail j=3480 line= }
tail j=3481 line= });
tail j=3482 line= </script>
tail j=3483 line=
tail j=3484 line= <div id="kov_jtfinc">
tail j=3485 line= <div>
tail j=3486 line= jtfinc: kov_jtfinc
tail j=3487 line= </div>
tail j=3488 line= <button v-on:click="showhide_kov_jtfinc">showhide_kov_jtfinc</button>
tail j=3489 line= <img v-on:click="showhide_kov_jtfinc" src="/imgs/btn/koeye.png" >
tail j=3490 line= <img v-on:click="showhide_kov_jtfinc1" src="/imgs/btn/kob.png" >
tail j=3491 line= <img v-on:click="showhide_kov_jtfinc2" src="/imgs/btn/kow.png" >
tail j=3492 line=
tail j=3493 line= <div v-show="collapsed" class="detail_jtfinc">
tail j=3494 line= <div id="drag"> kov_jtfinc:<br />
tail j=3495 line= <a href=kov_jtfinc.html class="thumbnail" target=_blank>
tail j=3496 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jtfinc.png" alt="kov_food" width="200" class="drg"/>
tail j=3497 line= <span><img class="drg" src="/imgs/kov/kov_jtfinc.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3498 line= </a>
tail j=3499 line= </div>
tail j=3500 line=
tail j=3501 line=
tail j=3502 line= </div>
tail j=3503 line= </div>
tail j=3504 line=
tail j=3505 line=
tail j=3506 line= <script>var kov_jtfinc = new Vue({ el: "#kov_jtfinc",
tail j=3507 line= data: {collapsed: false},
tail j=3508 line= methods: {
tail j=3509 line= showhide_kov_jtfinc: function() {
tail j=3510 line= if (!this.collapsed) this.collapsed = true;
tail j=3511 line= else this.collapsed = false;
tail j=3512 line= },
tail j=3513 line= showhide_kov_jtfinc1: function() {
tail j=3514 line= if (!this.collapsed) this.collapsed = true;
tail j=3515 line= else this.collapsed = false;
tail j=3516 line= },
tail j=3517 line= showhide_kov_jtfinc2: function() {
tail j=3518 line= if (!this.collapsed) this.collapsed = true;
tail j=3519 line= else this.collapsed = false;
tail j=3520 line= }
tail j=3521 line= }
tail j=3522 line= });
tail j=3523 line= </script>
tail j=3524 line=
tail j=3525 line=
tail j=3526 line=
tail j=3527 line=
tail j=3528 line= <div id="kov_byrdpucker">
tail j=3529 line= <div>
tail j=3530 line= byrdpucker is dogs-n-ponies:
tail j=3531 line= </div>
tail j=3532 line= <button v-on:click="showhide_kov_byrdpucker">showhide_kov_byrdpucker</button>
tail j=3533 line= <img v-on:click="showhide_kov_byrdpucker" src="/imgs/btn/koeye.png" >
tail j=3534 line= <img v-on:click="showhide_kov_byrdpucker1" src="/imgs/btn/kob.png" >
tail j=3535 line= <img v-on:click="showhide_kov_byrdpucker2" src="/imgs/btn/kow.png" >
tail j=3536 line=
tail j=3537 line= <div v-show="collapsed" class="detail_byrdpucker">
tail j=3538 line= byrdpucker dog and pony club cyclers and donuts too
tail j=3539 line= <hr>
tail j=3540 line= <div id="drag"> kov_byrpucker:<br />
tail j=3541 line= <a href=kov_byrpucker.html class="thumbnail" target=_blank>
tail j=3542 line= <img class="drg" src="/imgs/kov/tn/tn_kov_byrpucker.png" alt="kov_food" width="200" class="drg"/>
tail j=3543 line= <span><img class="drg" src="/imgs/kov/kov_byrpucker.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3544 line= </a>
tail j=3545 line= </div>
tail j=3546 line=
tail j=3547 line=
tail j=3548 line= </div>
tail j=3549 line= </div>
tail j=3550 line=
tail j=3551 line= <script>var kov_byrdpucker = new Vue({ el: "#kov_byrdpucker",
tail j=3552 line= data: {collapsed: false},
tail j=3553 line= methods: {
tail j=3554 line= showhide_kov_byrdpucker: function() {
tail j=3555 line= if (!this.collapsed) this.collapsed = true;
tail j=3556 line= else this.collapsed = false;
tail j=3557 line=// document.body.style.background = "darkslategrey";
tail j=3558 line=// document.body.style.color = "black";
tail j=3559 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3560 line=// document.body.style.fontsize = "24pt";
tail j=3561 line= },
tail j=3562 line= showhide_kov_byrdpucker1: function() {
tail j=3563 line= if (!this.collapsed) this.collapsed = true;
tail j=3564 line= else this.collapsed = false;
tail j=3565 line= },
tail j=3566 line= showhide_kov_byrdpucker2: function() {
tail j=3567 line= if (!this.collapsed) this.collapsed = true;
tail j=3568 line= else this.collapsed = false;
tail j=3569 line= }
tail j=3570 line= }
tail j=3571 line= });
tail j=3572 line= </script>
tail j=3573 line=
tail j=3574 line=
tail j=3575 line=
tail j=3576 line= <div id="kov_jkwii">
tail j=3577 line= <div>
tail j=3578 line= jkwii is me: kov_jkwii
tail j=3579 line= </div>
tail j=3580 line= <button v-on:click="showhide_kov_jkwii">showhide_kov_jkwii</button>
tail j=3581 line= <img v-on:click="showhide_kov_jkwii" src="/imgs/btn/koeye.png" >
tail j=3582 line= <img v-on:click="showhide_kov_jkwii1" src="/imgs/btn/kob.png" >
tail j=3583 line= <img v-on:click="showhide_kov_jkwii2" src="/imgs/btn/kow.png" >
tail j=3584 line=
tail j=3585 line= <div v-show="collapsed" class="detail_jkwii">
tail j=3586 line= jookiim kopernicus wundersteine ii
tail j=3587 line= <hr>
tail j=3588 line= <div id="drag"> kov_jkwii:<br />
tail j=3589 line= <a href=kov_jkwii.html class="thumbnail" target=_blank>
tail j=3590 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jkwii.png" alt="kov_food" width="200" class="drg"/>
tail j=3591 line= <span><img class="drg" src="/imgs/kov/kov_jkwii.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3592 line= </a>
tail j=3593 line= </div>
tail j=3594 line=
tail j=3595 line= <a href="mailto:jkwii@ko0.us?subject=jkwii?"><img src="/imgs/links/email.gif" alt="jkwii_what" border=0></a>
tail j=3596 line=
tail j=3597 line= <a href="mailto:skwii@ko0.us?subject=skwii?"><img src="/imgs/links/email.gif" alt="skwii_what" border=0></a>
tail j=3598 line= <hr>
tail j=3599 line=
tail j=3600 line= <a href=/imgs/links/eurodoor_Image429.png class="thumbnail" target=_blank>
tail j=3601 line= <img height=200 src=/imgs/links/tn/tn_eurodoor_Image429.png alt="eurodoor" border=0>
tail j=3602 line= <span><img src=/imgs/links/eurodoor_Image429.png alt="eurodoor" border=0></span>
tail j=3603 line= </a>
tail j=3604 line=
tail j=3605 line=
tail j=3606 line= </div>
tail j=3607 line= </div>
tail j=3608 line=
tail j=3609 line= <script>var kov_jkwii = new Vue({ el: "#kov_jkwii",
tail j=3610 line= data: {collapsed: false},
tail j=3611 line= methods: {
tail j=3612 line= showhide_kov_jkwii: function() {
tail j=3613 line= if (!this.collapsed) this.collapsed = true;
tail j=3614 line= else this.collapsed = false;
tail j=3615 line=// document.body.style.background = "darkslategrey";
tail j=3616 line=// document.body.style.color = "black";
tail j=3617 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3618 line=// document.body.style.fontsize = "24pt";
tail j=3619 line= },
tail j=3620 line= showhide_kov_jkwii1: function() {
tail j=3621 line= if (!this.collapsed) this.collapsed = true;
tail j=3622 line= else this.collapsed = false;
tail j=3623 line= },
tail j=3624 line= showhide_kov_jkwii2: function() {
tail j=3625 line= if (!this.collapsed) this.collapsed = true;
tail j=3626 line= else this.collapsed = false;
tail j=3627 line= }
tail j=3628 line= }
tail j=3629 line= });
tail j=3630 line= </script>
tail j=3631 line=
tail j=3632 line=
tail j=3633 line=
tail j=3634 line= <div id="kov_kou">
tail j=3635 line= <div>
tail j=3636 line= ko university digital ars technica:
tail j=3637 line= </div>
tail j=3638 line= <button v-on:click="showhide_kov_kou">showhide_kov_kou</button>
tail j=3639 line= <img v-on:click="showhide_kov_kou" src="/imgs/btn/koeye.png" >
tail j=3640 line= <img v-on:click="showhide_kov_kou1" src="/imgs/btn/kob.png" >
tail j=3641 line= <img v-on:click="showhide_kov_kou2" src="/imgs/btn/kow.png" >
tail j=3642 line=
tail j=3643 line= <div v-show="collapsed" class="detail_kou">
tail j=3644 line= kou digital ars technica
tail j=3645 line= <hr>
tail j=3646 line= <div id="drag"> kov_kou:<br />
tail j=3647 line= <a href=kov_kou.html class="thumbnail" target=_blank>
tail j=3648 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kou.png" alt="kov_food" width="200" class="drg"/>
tail j=3649 line= <span><img class="drg" src="/imgs/kov/kov_kou.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3650 line= </a>
tail j=3651 line= </div>
tail j=3652 line=
tail j=3653 line= </div>
tail j=3654 line= </div>
tail j=3655 line=
tail j=3656 line=
tail j=3657 line=
tail j=3658 line= <script>var kov_kou = new Vue({ el: "#kov_kou",
tail j=3659 line= data: {collapsed: false},
tail j=3660 line= methods: {
tail j=3661 line= showhide_kov_kou: function() {
tail j=3662 line= if (!this.collapsed) this.collapsed = true;
tail j=3663 line= else this.collapsed = false;
tail j=3664 line=// document.body.style.background = "darkslategrey";
tail j=3665 line=// document.body.style.color = "black";
tail j=3666 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3667 line=// document.body.style.fontsize = "24pt";
tail j=3668 line= },
tail j=3669 line= showhide_kov_kou1: function() {
tail j=3670 line= if (!this.collapsed) this.collapsed = true;
tail j=3671 line= else this.collapsed = false;
tail j=3672 line= },
tail j=3673 line= showhide_kov_kou2: function() {
tail j=3674 line= if (!this.collapsed) this.collapsed = true;
tail j=3675 line= else this.collapsed = false;
tail j=3676 line= }
tail j=3677 line= }
tail j=3678 line= });
tail j=3679 line= </script>
tail j=3680 line=
tail j=3681 line=
tail j=3682 line=
tail j=3683 line=
tail j=3684 line= <div id="kov_kassil">
tail j=3685 line= <div>
tail j=3686 line= kassil and others are us: kov_kassil
tail j=3687 line= </div>
tail j=3688 line= <button v-on:click="showhide_kov_kassil">showhide_kov_kassil</button>
tail j=3689 line= <img v-on:click="showhide_kov_kassil" src="/imgs/btn/koeye.png" >
tail j=3690 line= <img v-on:click="showhide_kov_kassil1" src="/imgs/btn/kob.png" >
tail j=3691 line= <img v-on:click="showhide_kov_kassil2" src="/imgs/btn/kow.png" >
tail j=3692 line=
tail j=3693 line= <div v-show="collapsed" class="detail_kassil">
tail j=3694 line= kassil & others
tail j=3695 line= <div id="drag"> kov_kassil:<br />
tail j=3696 line= <a href=kov_kassil.html class="thumbnail" target=_blank>
tail j=3697 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kassil.png" alt="kov_food" width="200" class="drg"/>
tail j=3698 line= <span><img class="drg" src="/imgs/kov/kov_kassil.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3699 line= </a>
tail j=3700 line= </div>
tail j=3701 line= <hr>
tail j=3702 line=
tail j=3703 line=
tail j=3704 line= </div>
tail j=3705 line= </div>
tail j=3706 line=
tail j=3707 line= <script>var kov_kassil = new Vue({ el: "#kov_kassil",
tail j=3708 line= data: {collapsed: false},
tail j=3709 line= methods: {
tail j=3710 line= showhide_kov_kassil: function() {
tail j=3711 line= if (!this.collapsed) this.collapsed = true;
tail j=3712 line= else this.collapsed = false;
tail j=3713 line=// document.body.style.background = "darkslategrey";
tail j=3714 line=// document.body.style.color = "black";
tail j=3715 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3716 line=// document.body.style.fontsize = "24pt";
tail j=3717 line= },
tail j=3718 line= showhide_kov_kassil1: function() {
tail j=3719 line= if (!this.collapsed) this.collapsed = true;
tail j=3720 line= else this.collapsed = false;
tail j=3721 line= },
tail j=3722 line= showhide_kov_kassil2: function() {
tail j=3723 line= if (!this.collapsed) this.collapsed = true;
tail j=3724 line= else this.collapsed = false;
tail j=3725 line= }
tail j=3726 line= }
tail j=3727 line= });
tail j=3728 line= </script>
tail j=3729 line=
tail j=3730 line=
tail j=3731 line=
tail j=3732 line=
tail j=3733 line= <div id="kov_konet">
tail j=3734 line= <div>
tail j=3735 line= konet is biz: kov_konet
tail j=3736 line= </div>
tail j=3737 line= <button v-on:click="showhide_kov_konet">showhide_kov_konet</button>
tail j=3738 line= <img v-on:click="showhide_kov_konet" src="/imgs/btn/koeye.png" >
tail j=3739 line= <img v-on:click="showhide_kov_konet1" src="/imgs/btn/kob.png" >
tail j=3740 line= <img v-on:click="showhide_kov_konet2" src="/imgs/btn/kow.png" >
tail j=3741 line=
tail j=3742 line= <div v-show="collapsed" class="detail_konet">
tail j=3743 line= konet is biz
tail j=3744 line= <hr>
tail j=3745 line= <div id="drag"> kov_konet:<br />
tail j=3746 line= <a href=kov_konet.html class="thumbnail" target=_blank>
tail j=3747 line= <img class="drg" src="/imgs/kov/tn/tn_kov_konet.png" alt="kov_food" width="200" class="drg"/>
tail j=3748 line= <span><img class="drg" src="/imgs/kov/kov_konet.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3749 line= </a>
tail j=3750 line= </div>
tail j=3751 line=
tail j=3752 line=
tail j=3753 line= </div>
tail j=3754 line= </div>
tail j=3755 line=
tail j=3756 line= <script>var kov_konet = new Vue({ el: "#kov_konet",
tail j=3757 line= data: {collapsed: false},
tail j=3758 line= methods: {
tail j=3759 line= showhide_kov_konet: function() {
tail j=3760 line= if (!this.collapsed) this.collapsed = true;
tail j=3761 line= else this.collapsed = false;
tail j=3762 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3763 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3764 line=
tail j=3765 line=// document.body.style.background = "darkslategrey";
tail j=3766 line=// document.body.style.color = "black";
tail j=3767 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3768 line=// document.body.style.fontsize = "24pt";
tail j=3769 line= },
tail j=3770 line= showhide_kov_konet1: function() {
tail j=3771 line= if (!this.collapsed) this.collapsed = true;
tail j=3772 line= else this.collapsed = false;
tail j=3773 line= },
tail j=3774 line= showhide_kov_konet2: function() {
tail j=3775 line= if (!this.collapsed) this.collapsed = true;
tail j=3776 line= else this.collapsed = false;
tail j=3777 line= }
tail j=3778 line= }
tail j=3779 line= });
tail j=3780 line= </script>
tail j=3781 line=
tail j=3782 line=
tail j=3783 line=
tail j=3784 line=
tail j=3785 line= <div id="kov_iperms">
tail j=3786 line= <div>
tail j=3787 line= iperms
tail j=3788 line=<!-- <h1 v-on:click="showhide_kov_iperms" >= = : : iperms : : = =</h1> -->
tail j=3789 line= </div>
tail j=3790 line= <button v-on:click="showhide_kov_iperms">showhide_kov_iperms</button>
tail j=3791 line= <img v-on:click="showhide_kov_iperms" src="/imgs/btn/koeye.png" >
tail j=3792 line= <img v-on:click="showhide_kov_iperms1" src="/imgs/btn/kob.png" >
tail j=3793 line= <img v-on:click="showhide_kov_iperms2" src="/imgs/btn/kow.png" >
tail j=3794 line=
tail j=3795 line= <div v-show="collapsed" class="detail_iperms">
tail j=3796 line= iperms
tail j=3797 line= <hr>
tail j=3798 line= <div id="drag"> kov_iperms:<br />
tail j=3799 line= <a href=kov_iperms.html class="thumbnail" target=_blank>
tail j=3800 line= <img class="drg" src="/imgs/kov/tn/tn_kov_iperms.png" alt="kov_food" width="200" class="drg"/>
tail j=3801 line= <span><img class="drg" src="/imgs/kov/kov_iperms.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3802 line= </a>
tail j=3803 line= </div>
tail j=3804 line=
tail j=3805 line=
tail j=3806 line= </div>
tail j=3807 line= </div>
tail j=3808 line=
tail j=3809 line= <script>var kov_iperms = new Vue({ el: "#kov_iperms",
tail j=3810 line= data: {collapsed: false},
tail j=3811 line= methods: {
tail j=3812 line= showhide_kov_iperms: function() {
tail j=3813 line= if (!this.collapsed) this.collapsed = true;
tail j=3814 line= else this.collapsed = false;
tail j=3815 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3816 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3817 line=
tail j=3818 line=// document.body.style.background = "darkslategrey";
tail j=3819 line=// document.body.style.color = "black";
tail j=3820 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3821 line=// document.body.style.fontsize = "24pt";
tail j=3822 line= },
tail j=3823 line= showhide_kov_iperms1: function() {
tail j=3824 line= if (!this.collapsed) this.collapsed = true;
tail j=3825 line= else this.collapsed = false;
tail j=3826 line= },
tail j=3827 line= showhide_kov_iperms2: function() {
tail j=3828 line= if (!this.collapsed) this.collapsed = true;
tail j=3829 line= else this.collapsed = false;
tail j=3830 line= }
tail j=3831 line= }
tail j=3832 line= });
tail j=3833 line= </script>
tail j=3834 line=
tail j=3835 line=
tail j=3836 line=
tail j=3837 line=
tail j=3838 line= <div id="kov_konabus">
tail j=3839 line= <div>
tail j=3840 line= konabus: kov_konabus
tail j=3841 line= </div>
tail j=3842 line= <button v-on:click="showhide_kov_konabus">showhide_kov_konabus</button>
tail j=3843 line= <img v-on:click="showhide_kov_konabus" src="/imgs/btn/koeye.png" >
tail j=3844 line= <img v-on:click="showhide_kov_konabus1" src="/imgs/btn/kob.png" >
tail j=3845 line= <img v-on:click="showhide_kov_konabus2" src="/imgs/btn/kow.png" >
tail j=3846 line=
tail j=3847 line= <div v-show="collapsed" class="detail_konabus">
tail j=3848 line= konabus
tail j=3849 line= <hr>
tail j=3850 line= <div id="drag"> kov_konabus:<br />
tail j=3851 line= <a href=kov_konabus.html class="thumbnail" target=_blank>
tail j=3852 line= <img class="drg" src="/imgs/kov/tn/tn_kov_konabus.png" alt="kov_food" width="200" class="drg"/>
tail j=3853 line= <span><img class="drg" src="/imgs/kov/kov_konabus.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3854 line= </a>
tail j=3855 line= </div>
tail j=3856 line=
tail j=3857 line= </div>
tail j=3858 line= </div>
tail j=3859 line=
tail j=3860 line= <script>var kov_konabus = new Vue({ el: "#kov_konabus",
tail j=3861 line= data: {collapsed: false},
tail j=3862 line= methods: {
tail j=3863 line= showhide_kov_konabus: function() {
tail j=3864 line= if (!this.collapsed) this.collapsed = true;
tail j=3865 line= else this.collapsed = false;
tail j=3866 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3867 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3868 line=
tail j=3869 line=// document.body.style.background = "darkslategrey";
tail j=3870 line=// document.body.style.color = "black";
tail j=3871 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3872 line=// document.body.style.fontsize = "24pt";
tail j=3873 line= },
tail j=3874 line= showhide_kov_konabus1: function() {
tail j=3875 line= if (!this.collapsed) this.collapsed = true;
tail j=3876 line= else this.collapsed = false;
tail j=3877 line= },
tail j=3878 line= showhide_kov_konabus2: function() {
tail j=3879 line= if (!this.collapsed) this.collapsed = true;
tail j=3880 line= else this.collapsed = false;
tail j=3881 line= }
tail j=3882 line= }
tail j=3883 line= });
tail j=3884 line= </script>
tail j=3885 line=
tail j=3886 line=
tail j=3887 line=
tail j=3888 line=
tail j=3889 line= <div id="kov_kt">
tail j=3890 line= <div>
tail j=3891 line= kt: kov_kt
tail j=3892 line= </div>
tail j=3893 line= <button v-on:click="showhide_kov_kt">showhide_kov_kt</button>
tail j=3894 line= <img v-on:click="showhide_kov_kt" src="/imgs/btn/koeye.png" >
tail j=3895 line= <img v-on:click="showhide_kov_kt1" src="/imgs/btn/kob.png" >
tail j=3896 line= <img v-on:click="showhide_kov_kt2" src="/imgs/btn/kow.png" >
tail j=3897 line=
tail j=3898 line= <div v-show="collapsed" class="detail_kt">
tail j=3899 line= kt
tail j=3900 line= <hr>
tail j=3901 line= <div id="drag"> kov_kt:<br />
tail j=3902 line= <a href=kov_kt.html class="thumbnail" target=_blank>
tail j=3903 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kt.png" alt="kov_food" width="200" class="drg"/>
tail j=3904 line= <span><img class="drg" src="/imgs/kov/kov_kt.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3905 line= </a>
tail j=3906 line= </div>
tail j=3907 line=
tail j=3908 line=
tail j=3909 line= </div>
tail j=3910 line= </div>
tail j=3911 line=
tail j=3912 line= <script>var kov_kt = new Vue({ el: "#kov_kt",
tail j=3913 line= data: {collapsed: false},
tail j=3914 line= methods: {
tail j=3915 line= showhide_kov_kt: function() {
tail j=3916 line= if (!this.collapsed) this.collapsed = true;
tail j=3917 line= else this.collapsed = false;
tail j=3918 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3919 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3920 line=
tail j=3921 line=// document.body.style.background = "darkslategrey";
tail j=3922 line=// document.body.style.color = "black";
tail j=3923 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3924 line=// document.body.style.fontsize = "24pt";
tail j=3925 line= },
tail j=3926 line= showhide_kov_kt1: function() {
tail j=3927 line= if (!this.collapsed) this.collapsed = true;
tail j=3928 line= else this.collapsed = false;
tail j=3929 line= },
tail j=3930 line= showhide_kov_kt2: function() {
tail j=3931 line= if (!this.collapsed) this.collapsed = true;
tail j=3932 line= else this.collapsed = false;
tail j=3933 line= }
tail j=3934 line= }
tail j=3935 line= });
tail j=3936 line= </script>
tail j=3937 line=
tail j=3938 line=
tail j=3939 line=
tail j=3940 line= <div id="kov_go">
tail j=3941 line= <div>
tail j=3942 line= go: kov_go
tail j=3943 line= </div>
tail j=3944 line= <button v-on:click="showhide_kov_go">showhide_kov_go</button>
tail j=3945 line= <img v-on:click="showhide_kov_go" src="/imgs/btn/koeye.png" >
tail j=3946 line= <img v-on:click="showhide_kov_go1" src="/imgs/btn/kob.png" >
tail j=3947 line= <img v-on:click="showhide_kov_go2" src="/imgs/btn/kow.png" >
tail j=3948 line=
tail j=3949 line= <div v-show="collapsed" class="detail_go">
tail j=3950 line= go
tail j=3951 line= <hr>
tail j=3952 line= <div id="drag"> kov_go:<br />
tail j=3953 line= <a href=kov_go.html class="thumbnail" target=_blank>
tail j=3954 line= <img class="drg" src="/imgs/kov/tn/tn_kov_go.png" alt="kov_food" width="200" class="drg"/>
tail j=3955 line= <span><img class="drg" src="/imgs/kov/kov_go.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3956 line= </a>
tail j=3957 line= </div>
tail j=3958 line=
tail j=3959 line=
tail j=3960 line= </div>
tail j=3961 line= </div>
tail j=3962 line=
tail j=3963 line= <script>var kov_go = new Vue({ el: "#kov_go",
tail j=3964 line= data: {collapsed: false},
tail j=3965 line= methods: {
tail j=3966 line= showhide_kov_go: function() {
tail j=3967 line= if (!this.collapsed) this.collapsed = true;
tail j=3968 line= else this.collapsed = false;
tail j=3969 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3970 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3971 line=
tail j=3972 line=// document.body.style.background = "darkslategrey";
tail j=3973 line=// document.body.style.color = "black";
tail j=3974 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3975 line=// document.body.style.fontsize = "24pt";
tail j=3976 line= },
tail j=3977 line= showhide_kov_go1: function() {
tail j=3978 line= if (!this.collapsed) this.collapsed = true;
tail j=3979 line= else this.collapsed = false;
tail j=3980 line= },
tail j=3981 line= showhide_kov_go2: function() {
tail j=3982 line= if (!this.collapsed) this.collapsed = true;
tail j=3983 line= else this.collapsed = false;
tail j=3984 line= }
tail j=3985 line= }
tail j=3986 line= });
tail j=3987 line= </script>
tail j=3988 line=
tail j=3989 line=
tail j=3990 line=
tail j=3991 line= <div id="div_kov_old">
tail j=3992 line= <div>
tail j=3993 line= old: kov_old
tail j=3994 line= </div>
tail j=3995 line= <button v-on:click="showhide_kov_old">showhide_kov_old</button>
tail j=3996 line= <img v-on:click="showhide_kov_old" src="/imgs/btn/koeye.png" >
tail j=3997 line= <img v-on:click="showhide_kov_old1" src="/imgs/btn/kob.png" >
tail j=3998 line= <img v-on:click="showhide_kov_old2" src="/imgs/btn/kow.png" >
tail j=3999 line=
tail j=4000 line= <div v-show="collapsed" class="detail_old">
tail j=4001 line=
tail j=4002 line= old
tail j=4003 line= <hr>
tail j=4004 line= <div id="drag"> kov_old:<br />
tail j=4005 line= <a href=kov_old.html class="thumbnail" target=_blank>
tail j=4006 line= <img class="drg" src="/imgs/kov/tn/tn_kov_old.png" alt="kov_food" width="200" class="drg"/>
tail j=4007 line= <span><img class="drg" src="/imgs/kov/kov_old.png" alt="kov_food" width="400" class="drg"/></span>
tail j=4008 line= </a>
tail j=4009 line= </div>
tail j=4010 line=
tail j=4011 line=
tail j=4012 line= </div>
tail j=4013 line= </div id="div_kov_old">
tail j=4014 line=
tail j=4015 line= <script id="script_kov_old">
tail j=4016 line= var kov_old = new Vue({ el: "#kov_old",
tail j=4017 line= data: {collapsed: false},
tail j=4018 line= methods: {
tail j=4019 line= showhide_kov_old: function() {
tail j=4020 line= if (!this.collapsed) this.collapsed = true;
tail j=4021 line= else this.collapsed = false;
tail j=4022 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=4023 line=// font-style font-variant font-weight font-size line-height font-family
tail j=4024 line=
tail j=4025 line=// document.body.style.background = "darkslategrey";
tail j=4026 line=// document.body.style.color = "black";
tail j=4027 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=4028 line=// document.body.style.fontsize = "24pt";
tail j=4029 line= },
tail j=4030 line= showhide_kov_old1: function() {
tail j=4031 line= if (!this.collapsed) this.collapsed = true;
tail j=4032 line= else this.collapsed = false;
tail j=4033 line= },
tail j=4034 line= showhide_kov_old2: function() {
tail j=4035 line= if (!this.collapsed) this.collapsed = true;
tail j=4036 line= else this.collapsed = false;
tail j=4037 line= }
tail j=4038 line= }
tail j=4039 line= });
tail j=4040 line= </script id="script_kov_old">
tail j=4041 line=
tail j=4042 line= </div id="div_vues_end" >
tail j=4043 line=
tail j=4044 line=<!-- kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk -->
tail j=4045 line=
tail j=4046 line=
tail j=4047 line=
tail j=4048 line=
tail j=4049 line=
tail j=4050 line=
tail j=4051 line=
tail j=4052 line=
tail j=4053 line=
tail j=4054 line=
tail j=4055 line=
tail j=4056 line= <ul id="kov_list">
tail j=4057 line= <li v-for="(item, index) in items">
tail j=4058 line= {{ parentMessage }} - {{ index }} - {{ item.message }}
tail j=4059 line= </li>
tail j=4060 line= </ul>
tail j=4061 line= <script id="script_kov_list" >
tail j=4062 line= var kov_list = new Vue({el: '#kov_list',
tail j=4063 line= data: {
tail j=4064 line= parentMessage: 'Parent',
tail j=4065 line= items: [
tail j=4066 line= { message: 'new' },
tail j=4067 line= { message: 'focus' },
tail j=4068 line= { message: 'work' },
tail j=4069 line= { message: 'memes' },
tail j=4070 line= { message: 'jtfdc' },
tail j=4071 line= { message: 'jtfinc' },
tail j=4072 line= { message: 'byrdpucker',
tail j=4073 line= { message: 'jkwii' },
tail j=4074 line= { message: 'kou' },
tail j=4075 line= { message: 'kassil' },
tail j=4076 line= { message: 'konet' },
tail j=4077 line= { message: 'iperms' },
tail j=4078 line= { message: 'konabus' },
tail j=4079 line= { message: 'kt' },
tail j=4080 line= { message: 'go' },
tail j=4081 line= { message: 'old' }
tail j=4082 line= ]
tail j=4083 line= }
tail j=4084 line= })
tail j=4085 line= </script id="script_kov_list" >
tail j=4086 line=
tail j=4087 line=
tail j=4088 line= <div id="div_url">
tail j=4089 line= <script id="script_url">
tail j=4090 line= var url = document.createElement("a");
tail j=4091 line= url.href=location.href;
tail j=4092 line= var output = "output";
tail j=4093 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
tail j=4094 line=
tail j=4095 line=// if( url.search != "" ) {
tail j=4096 line=// script_zm_view( url.search );
tail j=4097 line=// }
tail j=4098 line=
tail j=4099 line=// alert(location.href)
tail j=4100 line=// alert(url.protocol)
tail j=4101 line=// alert(url.hostname)
tail j=4102 line=// alert(url.pathname)
tail j=4103 line=// alert(url.search)
tail j=4104 line=// alert(url.hash)
tail j=4105 line=
tail j=4106 line=
tail j=4107 line=// document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
tail j=4108 line=// document.write( "pathname=" + url.pathname + " search=" + url.search );
tail j=4109 line= </script>
tail j=4110 line= </script id="script_url">
tail j=4111 line= </div id="div_url">
tail j=4112 line=
tail j=4113 line=
tail j=4114 line=
tail j=4115 line= <script id="script_document_ready" type="text/javascript">
tail j=4116 line= $(document).ready(function() {
tail j=4117 line=// sets the draggable
tail j=4118 line= $('#drag .drg').draggable({
tail j=4119 line= cursor: 'move', // sets the cursor apperance
tail j=4120 line= revert: 'valid'
tail j=4121 line= });
tail j=4122 line=
tail j=4123 line=// sets droppable
tail j=4124 line=// after the draggable is droped, hides it with a hide() effect
tail j=4125 line= $('#drop').droppable({
tail j=4126 line= drop: function(event, ui) {
tail j=4127 line= ui.draggable.hide(1000);
tail j=4128 line= }
tail j=4129 line= });
tail j=4130 line=
tail j=4131 line=// after the draggable is droped, hides it with a hide() effect
tail j=4132 line= $('#drop1').droppable({
tail j=4133 line= drop: function(event, ui) {
tail j=4134 line= ui.draggable.hide(1000);
tail j=4135 line= }
tail j=4136 line= });
tail j=4137 line=
tail j=4138 line=// after the draggable is droped, hides it with a hide() effect
tail j=4139 line= $('#drop2').droppable({
tail j=4140 line= drop: function(event, ui) {
tail j=4141 line= ui.draggable.hide(1000);
tail j=4142 line= }
tail j=4143 line= });
tail j=4144 line=
tail j=4145 line=// when the "#sw" element (inside the "#drop") is clicked
tail j=4146 line=// show the items with class "drg", contained in "#drag"
tail j=4147 line=// $('#drag .drg').slideDown(1000);
tail j=4148 line= $('#drop #sw').click(function(){
tail j=4149 line= var url = "/ko_center/ko_center.php?q=jqui/dragdrop1/"
tail j=4150 line= $(location).attr('href',url);
tail j=4151 line= });
tail j=4152 line= });
tail j=4153 line= </script id="script_document_ready" >
tail j=4154 line=
tail j=4155 line=
tail j=4156 line=
tail j=4157 line= <script id="script_load_liks" >
tail j=4158 line= var svc_links = new Array();
tail j=4159 line= var ko_links = new Array();
tail j=4160 line= var us_links = new Array();
tail j=4161 line= var u_links = new Array();
tail j=4162 line= var now_links = new Array();
tail j=4163 line= var srv_links = new Array();
tail j=4164 line= var kov_links = new Array();
tail j=4165 line= function load_svc_links() {
tail j=4166 line= var j=0;
tail j=4167 line= svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
tail j=4168 line= svc_links[j++]="/index_bb.html|/imgs/links/index_bb.png|index_bb|/imgs/btn/kob.png";
tail j=4169 line= svc_links[j++]="/index_bp.html|/imgs/links/index_bp.png|index_bb|/imgs/btn/kob.png";
tail j=4170 line= svc_links[j++]="/index_dd.html|/imgs/links/index_dd.png|index_dd|/imgs/btn/kob.png";
tail j=4171 line= svc_links[j++]="/index_dl.html|/imgs/links/index_dl.png|index_dl|/imgs/btn/kob.png";
tail j=4172 line= svc_links[j++]="/index_dp.html|/imgs/links/index_dp.png|index_dp|/imgs/btn/kob.png";
tail j=4173 line= svc_links[j++]="/index_fl.html|/imgs/links/index_fl.png|index_fl|/imgs/btn/kob.png";
tail j=4174 line= svc_links[j++]="/index_jg.html|/imgs/links/index_jg.png|index_jg|/imgs/btn/kob.png";
tail j=4175 line= svc_links[j++]="/index_pn.html|/imgs/links/index_pn.png|index_pn|/imgs/btn/kob.png";
tail j=4176 line= svc_links[j++]="/index_sc.html|/imgs/links/index_sc.png|index_sc|/imgs/btn/kob.png";
tail j=4177 line= svc_links[j++]="/index_sl.html|/imgs/links/index_sl.png|index_sl|/imgs/btn/kob.png";
tail j=4178 line= svc_links[j++]="/index_tl.html|/imgs/links/index_tl.png|index_tl|/imgs/btn/kob.png";
tail j=4179 line= svc_links[j++]="/index_tm.html|/imgs/links/index_tm.png|index_tm|/imgs/btn/kob.png";
tail j=4180 line= svc_links[j++]="/index_us.html|/imgs/links/index_us.png|index_us|/imgs/btn/kob.png";
tail j=4181 line= svc_links[j++]="/index_wc.html|/imgs/links/index_wc.png|index_wc|/imgs/btn/kob.png";
tail j=4182 line= svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
tail j=4183 line= svc_links[j++]="/index_zm.html|/imgs/links/index_zm.png|index_zm|/imgs/btn/kob.png";
tail j=4184 line= return( svc_links );
tail j=4185 line= }
tail j=4186 line=
tail j=4187 line= function load_srv_links() {
tail j=4188 line= srv_links[0]="ko0.us/index.html|/imgs/btn/koeyeb.png|ko0us|/imgs/btn/kob.png";
tail j=4189 line= srv_links[1]="ko1.us/index.html|/imgs/btn/koeye.png|ko1us|/imgs/btn/kop1234.png";
tail j=4190 line= srv_links[2]="ko2.us/index.html|/imgs/btn/koeyew.png|ko2us|/imgs/btn/kow.png";
tail j=4191 line= srv_links[3]="konet.org/index.html|/imgs/btn/ko.png|konet-org|/imgs/btn/kib.png";
tail j=4192 line= srv_links[4]="iperms.com/index.html|/imgs/links/iperms.png|iperms-com|/imgs/btn/kop34.png";
tail j=4193 line= srv_links[5]="kassil.com/index.html|/imgs/links/kassil.png|kassil-com|/imgs/btn/kop12.png";
tail j=4194 line= return( srv_links );
tail j=4195 line= }
tail j=4196 line=
tail j=4197 line= function load_ko_links() {
tail j=4198 line= var j=0;
tail j=4199 line= ko_links[j++]="/jkwii/blackboard.html|/imgs/links/blackboard.png|blackboard|/imgs/btn/koeye.png";
tail j=4200 line= ko_links[j++]="/jkwii/js/threejs/examples/index.html|/imgs/links/index_js3d.png|index_js3d|/imgs/btn/koeye.png";
tail j=4201 line= ko_links[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
tail j=4202 line= ko_links[j++]="/jkwii/js/gojs/index.html|/imgs/links/index_jsgo.png|index_jsgo|/imgs/btn/koeye.png";
tail j=4203 line= ko_links[j++]="/index_jsdk.html|/imgs/links/index_jsdk.png|index_jsdk|/imgs/btn/koeye.png";
tail j=4204 line= ko_links[j++]="/jkwii/koh5_globe/koh5_globe.html|/imgs/links/koh5_globe.png|koh5_globe|/imgs/btn/koeye.png";
tail j=4205 line= ko_links[j++]="/jkwii/aud/keybd/index.html|/imgs/links/index_jskb.png|index_jskb|/imgs/btn/koeye.png";
tail j=4206 line= ko_links[j++]="/svc/kokbdm/index.html|/imgs/links/index_jskb-dm.png|index_jskb-dm|/imgs/btn/koeye.png";
tail j=4207 line= ko_links[j++]="/svc/kokbdms/index.html|/imgs/links/index_jskb-dms.png|index_jskb-dms|/imgs/btn/koeye.png";
tail j=4208 line= ko_links[j++]="/piano.html|/imgs/links/index_piano.png|index_piano|/imgs/btn/koeye.png";
tail j=4209 line= ko_links[j++]="/jkwii/aud/piano_uri/koh5_piano_uri.html|/imgs/links/index_jskb-uri.png|index_jskb_uri|/imgs/btn/koeye.png";
tail j=4210 line= ko_links[j++]="/ko/svc/js/stemkoskijs/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
tail j=4211 line= ko_links[j++]="/ko/svc/aud/mrcoles/koh5_mrcoles.html|/imgs/links/mrcoles.png|mrcoles|/imgs/btn/koeye.png";
tail j=4212 line= ko_links[j++]="http://effectgames.com/demos/canvascycle/|/imgs/links/index_effectgames.png|index_effectgames|/imgs/btn/koeye.png";
tail j=4213 line= ko_links[j++]="https://www.leshylabs.com/apps/sfMaker/|/imgs/links/index_sfmaker.png|index_sfmaker|/imgs/btn/koeye.png";
tail j=4214 line= ko_links[j++]="https://dragongoserver.net/|/imgs/links/index_dgs.png|index_dgs|/imgs/btn/koeye.png";
tail j=4215 line= ko_links[j++]="/ko_center/ko_center.php|/imgs/links/ko_center.png|ko_center|/imgs/btn/kob.png";
tail j=4216 line= ko_links[j++]="/ko_saic/ko_saic.php|/imgs/links/ko_saic.png|ko_saic|/imgs/btn/kob.png";
tail j=4217 line= ko_links[j++]="/index_kt.html|/imgs/links/index_kt.png|index_kt|/imgs/btn/kob.png";
tail j=4218 line= ko_links[j++]="/index_jtf.html|/imgs/links/index_jtf.png|index_jtf|/imgs/btn/kob.png";
tail j=4219 line= ko_links[j++]="/index2big.html|/imgs/links/index2big.png|index2big|/imgs/btn/kob.png";
tail j=4220 line= ko_links[j++]="/index2big.htm|/imgs/links/index2big_noel.png|index2big_noel|/imgs/btn/kob.png";
tail j=4221 line= ko_links[j++]="/jkwii/whiteboard.html|/imgs/links/whiteboard.png|whiteboard|/imgs/btn/koeye.png";
tail j=4222 line= return( ko_links );
tail j=4223 line= }
tail j=4224 line=
tail j=4225 line=
tail j=4226 line=
tail j=4227 line= function load_us_links() {
tail j=4228 line= var j=0;
tail j=4229 line=// https://www.yelp.com/biz_photos/rechtin-family-and-cosmetic-dental-care-st-louis-2?adjust_creative=dWJMtmYxpd5N5yoyzSuhtA&utm_campaign=yelp_api&utm_medium=api_v2_business&utm_source=dWJMtmYxpd5N5yoyzSuhtA|
tail j=4230 line= us_links[j++]="/us/med/kov_rechtin.html|/imgs/us/med_rechtin.png|med_rechtin|/imgs/btn/koeye.png|med";
tail j=4231 line= us_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4232 line= us_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4233 line=
tail j=4234 line= us_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
tail j=4235 line= us_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
tail j=4236 line= us_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
tail j=4237 line= us_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
tail j=4238 line= us_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
tail j=4239 line= us_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
tail j=4240 line= us_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
tail j=4241 line= us_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
tail j=4242 line= us_links[j++]="http://www.fdazol.com/|/imgs/us/law_azol.png|law_azol_f|/imgs/btn/koeye.png|law";
tail j=4243 line=
tail j=4244 line= us_links[j++]="https://jmhalumni.com|/imgs/us/jmhalumni.png|ed_jmhalumni|/imgs/btn/koeye.png|edu";
tail j=4245 line= us_links[j++]="https://johnmarshallhighschool.com|/imgs/us/johnmarshallhighschool.png|ed_johnmarshallhighschool|/imgs/btn/koeye.png|edu";
tail j=4246 line= us_links[j++]="https://www.greatschools.org/kentucky/brandenburg/1993-Brandenburg-High-School/|/imgs/us/brandenburg_highschool.png|ed_brandenburg-highschool|/imgs/btn/koeye.png|edu";
tail j=4247 line= us_links[j++]="https://www.hazelwoodschools.org/Page/3143|/imgs/us/hazelwood_schools.png|ed_hazelwood_schools|/imgs/btn/koeye.png|edu";
tail j=4248 line= us_links[j++]="https://bw.edu|/imgs/us/bw.png|ed_bw|/imgs/btn/koeye.png|edu";
tail j=4249 line=
tail j=4250 line= us_links[j++]="http://oldtowndonuts.com|/imgs/us/oldtowndonuts.png|food_oldtowndonuts|/imgs/btn/koeye.png|food";
tail j=4251 line= us_links[j++]="http://farkaspastries.com|/imgs/us/farkaspastries.png|food_farkaspastries|/imgs/btn/koeye.png|food";
tail j=4252 line= us_links[j++]="https://www.facebook.com/HansaImportHouse|/imgs/us/hansaimporthouse.png|food_hansaimporthouse|/imgs/btn/koeye.png|food";
tail j=4253 line= us_links[j++]="http://havanagrillco.com|/imgs/us/havanagrillco.png|food_havanagrillco|/imgs/btn/koeye.png|food";
tail j=4254 line= us_links[j++]="http://spiros-restaurant.com|/imgs/us/spiros_restaurant.png|food_spiros_restaurant|/imgs/btn/koeye.png|food";
tail j=4255 line= us_links[j++]="https://www.opentable.com/jake-and-tellys-greek-taverna?page=1|/imgs/us/food_jake_tellys.png|food_jake_tellys|/imgs/btn/koeye.png|food";
tail j=4256 line= us_links[j++]="http://edelweissrest.com|/imgs/us/edelweissrest.png|food_edelweissrest|/imgs/btn/koeye.png|food";
tail j=4257 line= us_links[j++]="http://bierwerks.com|/imgs/us/food_bierwerks.png|food_bierwerks|/imgs/btn/koeye.png|food";
tail j=4258 line= us_links[j++]="http://www.savellispizzapastasubs.com/|/imgs/us/food_savellispizza.png|food_savellispizza|/imgs/bmtn/koeye.png|food";
tail j=4259 line= us_links[j++]="https://www.facebook.com/woohoogreekfood2/|/imgs/us/woohoogreekfood2.png|food_woohoogreekfood2|/imgs/btn/koeye.png|food";
tail j=4260 line=
tail j=4261 line= us_links[j++]="https://bdo.com/about/us-locations/bdo-st-louis|/imgs/us/bdo-stl.png|acct_bdo-stl|/imgs/btn/koeye.png|acct";
tail j=4262 line= us_links[j++]="https://bdo.com/about/us-locations/bdo-cleveland-office|/imgs/us/bdo-cle.png|acct_bdo-cle|/imgs/btn/koeye.png|acct";
tail j=4263 line= us_links[j++]="http://www.gatewayloan.com/|/imgs/us/gateway_mortgage.png|gateway_mortgage|/imgs/btn/koeye.png|acct";
tail j=4264 line= us_links[j++]="https://chesonsulting.com|/imgs/us/checonsulting.png|biz_checonsulting|/imgs/btn/koeye.png|biz";
tail j=4265 line= us_links[j++]="http://saic.com|/imgs/us/saic.png|saic|/imgs/btn/koeye.png|biz";
tail j=4266 line= us_links[j++]="http://leidos.com|/imgs/us/leidos.png|leidos|/imgs/btn/koeye.png|biz";
tail j=4267 line=
tail j=4268 line=
tail j=4269 line= us_links[j++]="http://ko2.us/index_focus.com|/imgs/us/focus_solutions.png|focus_solutions|/imgs/btn/koeye.png|biz";
tail j=4270 line= us_links[j++]="http://www.finduslocal.com/hardware-stores/kentucky/brandenburg/allens-s-t-hardware-inc|/imgs/us/biz_allens_hardware.png|biz_allens_hardware|/imgs/btn/koeye.png|biz";
tail j=4271 line= us_links[j++]="http://growwarehouse.com|/imgs/us/grow_warehouse.png|grow_warehouse|/imgs/btn/koeye.png|biz";
tail j=4272 line= us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
tail j=4273 line= us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
tail j=4274 line= us_links[j++]="http://www.savellidanceandmartialarts.com/?load=html|/imgs/us/savelli_dance_martialarts.png|savelli_dance_martialarts|/imgs/btn/koeye.png|phy";
tail j=4275 line= us_links[j++]="http://myfusiondance.com/?load=html|/imgs/us/fusion_dance.png|fusion_dance|/imgs/btn/koeye.png|phy";
tail j=4276 line= us_links[j++]="http://www.superseriesbaseball.com/|/imgs/us/super_series_baseball.png|super_series_baseball|/imgs/btn/koeye.png|phy";
tail j=4277 line=
tail j=4278 line= us_links[j++]="https://ftknox.afceachapters.org/|/imgs/us/afcea_knox.png|afcea_knox|/imgs/btn/koeye.png|org";
tail j=4279 line= us_links[j++]="https://scott.afceachapters.org/|/imgs/us/afcea_scott.png|afcea_scott|/imgs/btn/koeye.png|org";
tail j=4280 line= us_links[j++]="https://www.ble-t.org/|/imgs/us/ble.png|ble|/imgs/btn/koeye.png|org";
tail j=4281 line= us_links[j++]="http://www.doevalley.org/|/imgs/us/doe_valley.png|doe_valley|/imgs/btn/koeye.png|org";
tail j=4282 line=
tail j=4283 line= us_links[j++]="http://www.chapelofthecross.org/|/imgs/us/chapel_of_the_cross.png|chapel_of_the_cross|/imgs/btn/koeye.png|rel";
tail j=4284 line= us_links[j++]="https://www.lds.org/temples/details/st.-louis-missouri-temple|/imgs/us/lds_stl.png|lds_stl|/imgs/btn/koeye.png|rel";
tail j=4285 line= us_links[j++]="https://www.bethanyenglish.org/|/imgs/us/bethany_english_lutheran.png|bethany_english_lutheran|/imgs/btn/koeye.png|rel";
tail j=4286 line= us_links[j++]="https://www.meadecountymessenger.com/|/imgs/us/meade_county_messenger.png|meade_county_messenger|/imgs/btn/koeye.png|media";
tail j=4287 line= us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
tail j=4288 line= us_links[j++]="https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2088|/imgs/us/mars_jpl_nasa.png|mars_jpl_nasa|/imgs/btn/koeye.png|sci";
tail j=4289 line= us_links[j++]="https://mars.nasa.gov/mer/gallery/all/opportunity.html|/imgs/us/mars_nasa_gov.png|mars_nasa_gov|/imgs/btn/koeye.png|sci";
tail j=4290 line= us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
tail j=4291 line= return( us_links );
tail j=4292 line= }
tail j=4293 line=
tail j=4294 line=
tail j=4295 line=
tail j=4296 line= function load_u_links() {
tail j=4297 line= var j=0;
tail j=4298 line= u_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4299 line= u_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4300 line=
tail j=4301 line= u_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
tail j=4302 line= u_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
tail j=4303 line= u_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
tail j=4304 line= u_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
tail j=4305 line= u_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
tail j=4306 line= u_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
tail j=4307 line= u_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
tail j=4308 line= u_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
tail j=4309 line= return( u_links );
tail j=4310 line= }
tail j=4311 line=
tail j=4312 line=
tail j=4313 line=
tail j=4314 line= function load_now_links() {
tail j=4315 line= var j=0;
tail j=4316 line= now_links[j++]="http://index_party.html|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4317 line= now_links[j++]="http://index_jtfdc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4318 line= now_links[j++]="http://index_jtfinc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4319 line= now_links[j++]="http://index_stlc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4320 line= now_links[j++]="http://index_jtfdcr.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4321 line= now_links[j++]="http://index_byrdpucker.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4322 line= return( now_links );
tail j=4323 line= }
tail j=4324 line=
tail j=4325 line=
tail j=4326 line= function show_svc_links(mode) {
tail j=4327 line= svc_links = load_svc_links();
tail j=4328 line= htmout_svc_links = "";
tail j=4329 line= htmout_svc_linkz = "";
tail j=4330 line= for (i = 0; i < svc_links.length; i++) {
tail j=4331 line= my_btnimg = "/imgs/btn/kib.png";
tail j=4332 line= my_href = svc_links[i].split("|")[0];
tail j=4333 line= my_popimg = svc_links[i].split("|")[1];
tail j=4334 line= my_alt = svc_links[i].split("|")[2];
tail j=4335 line=
tail j=4336 line=// htmout_svc_linkz += '<div class="drag" name="'+my_alt+'" >\n';
tail j=4337 line= htmout_svc_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4338 line= htmout_svc_linkz += '<img id="drg" src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4339 line=// htmout_svc_linkz += '</div >';
tail j=4340 line=
tail j=4341 line=// htmout_svc_links += '<div class="drag" name="'+my_alt+'" >\n';
tail j=4342 line= htmout_svc_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4343 line= htmout_svc_links += '<img class="drag" id="drg" src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4344 line= htmout_svc_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4345 line=// htmout_svc_links += '</div >';
tail j=4346 line= }
tail j=4347 line= if( mode === 'pop' ) {
tail j=4348 line= htmout_svc_links += "<br><br>\n";
tail j=4349 line= var div_svc_links = document.getElementById('div_svc_links');
tail j=4350 line= div_svc_links.insertAdjacentHTML('beforeend', htmout_svc_links);
tail j=4351 line= return( htmout_svc_links );
tail j=4352 line= }
tail j=4353 line=
tail j=4354 line= htmout_svc_linkz += "<br><br>\n";
tail j=4355 line= var div_svc_linkz = document.getElementById('div_svc_linkz');
tail j=4356 line= div_svc_linkz.insertAdjacentHTML('beforeend', htmout_svc_linkz);
tail j=4357 line= return( htmout_svc_linkz );
tail j=4358 line= }
tail j=4359 line=
tail j=4360 line= function show_ko_links(mode) {
tail j=4361 line= ko_links = load_ko_links();
tail j=4362 line= htmout_ko_links = "";
tail j=4363 line= htmout_ko_linkz = "";
tail j=4364 line= for (i = 0; i < ko_links.length; i++) {
tail j=4365 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4366 line= my_href = ko_links[i].split("|")[0];
tail j=4367 line= my_popimg = ko_links[i].split("|")[1];
tail j=4368 line= my_alt = ko_links[i].split("|")[2];
tail j=4369 line=
tail j=4370 line= htmout_ko_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4371 line= htmout_ko_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4372 line=
tail j=4373 line= htmout_ko_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4374 line= htmout_ko_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4375 line= htmout_ko_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4376 line= }
tail j=4377 line=
tail j=4378 line= if( mode === 'pop' ) {
tail j=4379 line= htmout_ko_links += "<br><br>";
tail j=4380 line= var div_ko_links = document.getElementById('div_ko_links');
tail j=4381 line= div_ko_links.insertAdjacentHTML('beforeend', htmout_ko_links);
tail j=4382 line= return( htmout_ko_links );
tail j=4383 line= }
tail j=4384 line=
tail j=4385 line= htmout_ko_linkz += "<br><br>";
tail j=4386 line= var div_ko_linkz = document.getElementById('div_ko_linkz');
tail j=4387 line= div_ko_linkz.insertAdjacentHTML('beforeend', htmout_ko_linkz);
tail j=4388 line= return( htmout_ko_linkz );
tail j=4389 line= }
tail j=4390 line=
tail j=4391 line=
tail j=4392 line= function show_us_links(mode) {
tail j=4393 line= us_links = load_us_links();
tail j=4394 line= htmout_us_links = "";
tail j=4395 line= htmout_us_linkz = "";
tail j=4396 line= for (i = 0; i < us_links.length; i++) {
tail j=4397 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4398 line= my_href = us_links[i].split("|")[0];
tail j=4399 line= my_popimg = us_links[i].split("|")[1];
tail j=4400 line= my_alt = us_links[i].split("|")[2];
tail j=4401 line=
tail j=4402 line= htmout_us_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4403 line= htmout_us_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4404 line=
tail j=4405 line= htmout_us_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4406 line= htmout_us_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4407 line= htmout_us_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4408 line= }
tail j=4409 line=
tail j=4410 line= if( mode === 'pop' ) {
tail j=4411 line= htmout_us_links += "<br><br>";
tail j=4412 line= var div_us_links = document.getElementById('div_us_links');
tail j=4413 line= div_us_links.insertAdjacentHTML('beforeend', htmout_us_links);
tail j=4414 line= return( htmout_us_links );
tail j=4415 line= }
tail j=4416 line=
tail j=4417 line= htmout_us_linkz += "<br><br>";
tail j=4418 line= var div_us_linkz = document.getElementById('div_us_linkz');
tail j=4419 line= div_us_linkz.insertAdjacentHTML('beforeend', htmout_us_linkz);
tail j=4420 line= return( htmout_us_linkz );
tail j=4421 line= }
tail j=4422 line=
tail j=4423 line=
tail j=4424 line=
tail j=4425 line=
tail j=4426 line=
tail j=4427 line=
tail j=4428 line=
tail j=4429 line= function show_u_links(mode) {
tail j=4430 line= u_links = load_u_links();
tail j=4431 line= htmout_u_links = "";
tail j=4432 line= htmout_u_linkz = "";
tail j=4433 line= for (i = 0; i < u_links.length; i++) {
tail j=4434 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4435 line= my_href = u_links[i].split("|")[0];
tail j=4436 line= my_popimg = u_links[i].split("|")[1];
tail j=4437 line= my_alt = u_links[i].split("|")[2];
tail j=4438 line=
tail j=4439 line= htmout_u_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4440 line= htmout_u_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4441 line=
tail j=4442 line= htmout_u_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4443 line= htmout_u_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4444 line= htmout_u_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4445 line= }
tail j=4446 line=
tail j=4447 line= if( mode === 'pop' ) {
tail j=4448 line= htmout_u_links += "<br><br>";
tail j=4449 line= var div_u_links = document.getElementById('div_u_links');
tail j=4450 line= div_u_links.insertAdjacentHTML('beforeend', htmout_u_links);
tail j=4451 line= return( htmout_u_links );
tail j=4452 line= }
tail j=4453 line=
tail j=4454 line= htmout_u_linkz += "<br><br>";
tail j=4455 line= var div_u_linkz = document.getElementById('div_u_linkz');
tail j=4456 line= div_u_linkz.insertAdjacentHTML('beforeend', htmout_u_linkz);
tail j=4457 line= return( htmout_u_linkz );
tail j=4458 line= }
tail j=4459 line=
tail j=4460 line=
tail j=4461 line=
tail j=4462 line= function show_now_links(mode) {
tail j=4463 line= now_links = load_now_links();
tail j=4464 line= htmout_now_links = "";
tail j=4465 line= htmout_now_linkz = "";
tail j=4466 line= for (i = 0; i < now_links.length; i++) {
tail j=4467 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4468 line= my_href = now_links[i].split("|")[0];
tail j=4469 line= my_popimg = now_links[i].split("|")[1];
tail j=4470 line= my_alt = now_links[i].split("|")[2];
tail j=4471 line=
tail j=4472 line= htmout_now_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4473 line= htmout_now_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4474 line=
tail j=4475 line= htmout_now_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4476 line= htmout_now_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4477 line= htmout_now_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4478 line= }
tail j=4479 line=
tail j=4480 line= if( mode === 'pop' ) {
tail j=4481 line= htmout_now_links += "<br><br>";
tail j=4482 line= var div_now_links = document.getElementById('div_now_links');
tail j=4483 line= div_now_links.insertAdjacentHTML('beforeend', htmout_now_links);
tail j=4484 line= return( htmout_now_links );
tail j=4485 line= }
tail j=4486 line=
tail j=4487 line= htmout_now_linkz += "<br><br>";
tail j=4488 line= var div_now_linkz = document.getElementById('div_now_linkz');
tail j=4489 line= div_now_linkz.insertAdjacentHTML('beforeend', htmout_now_linkz);
tail j=4490 line= return( htmout_now_linkz );
tail j=4491 line= }
tail j=4492 line=
tail j=4493 line= function show_srv_links(mode) {
tail j=4494 line= srv_links = load_srv_links();
tail j=4495 line= htmout_srv_links = "";
tail j=4496 line= htmout_srv_linkz = "";
tail j=4497 line= for (i = 0; i < srv_links.length; i++) {
tail j=4498 line= my_btnimg = "/imgs/btn/kiw.png";
tail j=4499 line= my_href = srv_links[i].split("|")[0];
tail j=4500 line= my_popimg = srv_links[i].split("|")[1];
tail j=4501 line= my_alt = srv_links[i].split("|")[2];
tail j=4502 line=
tail j=4503 line= htmout_srv_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4504 line= htmout_srv_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4505 line=
tail j=4506 line= htmout_srv_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4507 line= htmout_srv_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4508 line= htmout_srv_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4509 line= }
tail j=4510 line= if( mode === 'pop' ) {
tail j=4511 line= htmout_srv_links += "<br><br>\n"
tail j=4512 line= var div_srv_links = document.getElementById('div_srv_links');
tail j=4513 line= div_srv_links.insertAdjacentHTML('beforeend', htmout_srv_links);
tail j=4514 line= return( htmout_srv_links );
tail j=4515 line= }
tail j=4516 line=
tail j=4517 line= htmout_srv_linkz += "<br><br>\n"
tail j=4518 line= var div_srv_linkz = document.getElementById('div_srv_linkz');
tail j=4519 line= div_srv_linkz.insertAdjacentHTML('beforeend', htmout_srv_linkz);
tail j=4520 line= return( htmout_srv_linkz );
tail j=4521 line= }
tail j=4522 line=
tail j=4523 line=// document.write( htmout_svc_links );
tail j=4524 line=// document.write( htmout_ko_links );
tail j=4525 line=// document.write( htmout_srv_links );
tail j=4526 line=
tail j=4527 line=// var div_ko_links = document.getElementById("div_ko_links");
tail j=4528 line=// var div_ko_links_orig = div_ko_links.innerHTML;
tail j=4529 line=// alert( "BUGS_500 div_ko_links_orig="+div_ko_links_orig );
tail j=4530 line=
tail j=4531 line=// div_ko_links.innerHTML = "";
tail j=4532 line=// div_ko_links.appendChild( htmout_ko_links);
tail j=4533 line=
tail j=4534 line=
tail j=4535 line=// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
tail j=4536 line=//
tail j=4537 line=// getElementById("foo").insertAdjacentHTML
tail j=4538 line=// <!-- beforebegin / before -->
tail j=4539 line=// <p>
tail j=4540 line=// <!-- afterbegin / prepend -->
tail j=4541 line=// foo
tail j=4542 line=// <!-- beforeend / append -->
tail j=4543 line=// </p>
tail j=4544 line=// <!-- afterend / after-->
tail j=4545 line=//
tail j=4546 line=// document.getElementById('foo').insertAdjacentHTML("beforebegin", "<hr>")
tail j=4547 line=// $('#foo').before("<hr>")
tail j=4548 line=// document.getElementById('foo').insertAdjacentHTML("afterend", "<hr>")
tail j=4549 line=// $('#foo').append("<hr>")
tail j=4550 line=// document.getElementById('foo').insertAdjacentHTML("beforeend", "<hr>")
tail j=4551 line=// $('#foo').append("<hr>")
tail j=4552 line=// document.getElementById('foo').insertAdjacentHTML("afterbegin", "<hr>")
tail j=4553 line=// $('#foo').prepend("<hr>")
tail j=4554 line=//
tail j=4555 line=// var btn = document.getElementById('btn'); // The button itself with an ID of 'btn'
tail j=4556 line=// var newButton = '<button>New button</button>'; // New button to be inserted
tail j=4557 line=// btn.insertAdjacentHTML('afterend', newButton);
tail j=4558 line=//
tail j=4559 line=// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
tail j=4560 line= function show_all_links(mode) {
tail j=4561 line= show_svc_links(mode);
tail j=4562 line= show_ko_links(mode);
tail j=4563 line= show_us_links(mode);
tail j=4564 line= show_u_links(mode);
tail j=4565 line= show_now_links(mode);
tail j=4566 line= show_srv_links(mode);
tail j=4567 line= }
tail j=4568 line=
tail j=4569 line= </script id="script_load_liks" >
tail j=4570 line=
tail j=4571 line= <div id="div_links" >
tail j=4572 line= <hr color=red>
tail j=4573 line= <div id="div_svc_links" > </div>
tail j=4574 line= <hr color=red>
tail j=4575 line=
tail j=4576 line= <hr color=white>
tail j=4577 line= <div id="div_ko_links" > </div>
tail j=4578 line= <hr color=white>
tail j=4579 line=
tail j=4580 line= <hr color=white>
tail j=4581 line= <div id="div_us_links" > </div>
tail j=4582 line= <hr color=white>
tail j=4583 line=
tail j=4584 line= <hr color=white>
tail j=4585 line= <div id="div_u_links" > </div>
tail j=4586 line= <hr color=white>
tail j=4587 line=
tail j=4588 line= <hr color=white>
tail j=4589 line= <div id="div_now_links" > </div>
tail j=4590 line= <hr color=white>
tail j=4591 line=
tail j=4592 line= <hr color=blue>
tail j=4593 line= <div id="div_srv_links" > </div>
tail j=4594 line= <hr color=blue>
tail j=4595 line= </div id="div_links" >
tail j=4596 line=
tail j=4597 line= <div id="div_linkz" >
tail j=4598 line= <hr color=red>
tail j=4599 line= <div id="div_svc_linkz" > </div>
tail j=4600 line= <hr color=red>
tail j=4601 line=
tail j=4602 line= <hr color=black>
tail j=4603 line= <div id="div_ko_linkz" > </div>
tail j=4604 line= <hr color=black>
tail j=4605 line=
tail j=4606 line= <hr color=black>
tail j=4607 line= <div id="div_us_linkz" > </div>
tail j=4608 line= <hr color=black>
tail j=4609 line=
tail j=4610 line= <hr color=black>
tail j=4611 line= <div id="div_u_linkz" > </div>
tail j=4612 line= <hr color=black>
tail j=4613 line=
tail j=4614 line= <hr color=black>
tail j=4615 line= <div id="div_now_linkz" > </div>
tail j=4616 line= <hr color=black>
tail j=4617 line=
tail j=4618 line= <hr color=blue>
tail j=4619 line= <div id="div_srv_linkz" > </div>
tail j=4620 line= <hr color=blue>
tail j=4621 line= </div id="div_linkz" >
tail j=4622 line=
tail j=4623 line= <div id="div_cfaa" class=ko>
tail j=4624 line=<!-- -->
tail j=4625 line=
tail j=4626 line= <script id="script_cfaa">
tail j=4627 line= var text_cfaa =
tail j=4628 line=`
tail j=4629 line=pqpqpqpqpqpqpqpqpqpq Warning pqpqpqpqpqpqpqpqpqpq<br>
tail j=4630 line=<br>
tail j=4631 line=This site may be protected under the
tail j=4632 line=<br>
tail j=4633 line=<br>
tail j=4634 line=<b>CFAA</b>
tail j=4635 line=<br>
tail j=4636 line=Computer Fraud and Abuse Act
tail j=4637 line=<br>
tail j=4638 line=<br>
tail j=4639 line=your attemped access has been logged
tail j=4640 line=<br>
tail j=4641 line=repeated attemps by unauthorized guests will be reported
tail j=4642 line=<br>
tail j=4643 line=<br>
tail j=4644 line=By continuing You are acknowledging
tail j=4645 line=<br>
tail j=4646 line=you are fully authorized and
tail j=4647 line=<br>
tail j=4648 line=understand the responsibilites to access the content on the site
tail j=4649 line=<br>
tail j=4650 line=<br>
tail j=4651 line=This page must not be removed
tail j=4652 line=<br>
tail j=4653 line=bdbdbdbdbdbdbdbdbdbd Warning bdbdbdbdbdbdbdbdbdbd
tail j=4654 line=<br>
tail j=4655 line=<br>
tail j=4656 line=unauthoriced users should
tail j=4657 line=<br>
tail j=4658 line=consider browsing elsewhere:
tail j=4659 line=
tail j=4660 line=
tail j=4661 line=<hr color=black>
tail j=4662 line=<hr color=ivory>
tail j=4663 line=<hr color=red>
tail j=4664 line=<hr color=blue>
tail j=4665 line=<hr color=ebony>
tail j=4666 line=<hr color=white>
tail j=4667 line=
tail j=4668 line=<a href=duckduckgo.com > <img src="ok.png" alt="duckduckgo" height=10 border=0></a>
tail j=4669 line=     
tail j=4670 line=<a href=bing.com > <img src="ok.png" alt="bing" height=10 border=0></a>
tail j=4671 line=     
tail j=4672 line=<a href=google.com > <img src="ok.png" alt="google" height=10 border=0></a>
tail j=4673 line=     
tail j=4674 line=<a href=yahoo.com > <img src="ok.png" alt="yahoo" height=10 border=0></a>
tail j=4675 line=     
tail j=4676 line= <a href=https://mars.jpl.nasa.gov/msl/multimedia/raw target=_blank>
tail j=4677 line= <img src="ok.png" border=0 height=10>
tail j=4678 line= </a>
tail j=4679 line=     
tail j=4680 line= <a href=http://youtube.com target=_blank>
tail j=4681 line= <img src="ok.png" border=0 height=10>
tail j=4682 line= </a>
tail j=4683 line= </div id="div_cfaa" class=ko>
tail j=4684 line=
tail j=4685 line=<hr color=white>
tail j=4686 line=<hr color=ebony>
tail j=4687 line=<hr color=blue>
tail j=4688 line=<hr color=red>
tail j=4689 line=<hr color=ivory>
tail j=4690 line=<hr color=black>
tail j=4691 line=
tail j=4692 line= <div id="div_warn2" class=ko>
tail j=4693 line= <p id=p_warn2 class=ko>
tail j=4694 line= <hr color=black>
tail j=4695 line= <hr color=white>
tail j=4696 line= <hr color=red>
tail j=4697 line= If you are seeing this page
tail j=4698 line= <br>
tail j=4699 line= you are probably unauthorized
tail j=4700 line= <br>
tail j=4701 line= you should <b>NOT</b> continue
tail j=4702 line= <br>
tail j=4703 line= accessing site content here may be
tail j=4704 line= <br>
tail j=4705 line= protected under <b>CFAA</b>
tail j=4706 line= <hr color=red>
tail j=4707 line= <hr color=white>
tail j=4708 line= <hr color=black>
tail j=4709 line= </p>
tail j=4710 line=
tail j=4711 line= authorized sites are available from bluehost
tail j=4712 line=
tail j=4713 line= <a href="https://www.bluehost.com/?utm_source=%28direct%29&utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype" target=_blank>
tail j=4714 line= <img src=/imgs/bh/bh_anim.gif height=30 border=0 alt=bluehost.com affiliate></a>
tail j=4715 line= <div id=kobh_offer class=ko>
tail j=4716 line= bluehost offers
tail j=4717 line= 50 gb space
tail j=4718 line= 999 gb bandwidth
tail j=4719 line=
tail j=4720 line= 6 domains on 1 account
tail j=4721 line= and more for only $6.95/month
tail j=4722 line= </div>
tail j=4723 line= </div id="div_warn2" class=ko>
tail j=4724 line=
tail j=4725 line=
tail j=4726 line= <script id="script_url">
tail j=4727 line= var url = document.createElement("a");
tail j=4728 line= url.href=location.href
tail j=4729 line= var output = "output"
tail j=4730 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
tail j=4731 line=// alert(location.href)
tail j=4732 line=// alert(url.protocol)
tail j=4733 line=// alert(url.hostname)
tail j=4734 line=// alert(url.pathname)
tail j=4735 line=// alert(url.search)
tail j=4736 line=// alert(url.hash)
tail j=4737 line=
tail j=4738 line= if( url.search == "" ) {document.write( text_cfaa );}
tail j=4739 line= if( url.search == "?q=cfaa" ) {document.write( text_cfaa ); }
tail j=4740 line= </script id="script_url">
tail j=4741 line= </div>
tail j=4742 line=
tail j=4743 line=
tail j=4744 line=
tail j=4745 line=<!--
tail j=4746 line= <iframe id="myframe" src="/svc/kokbdm/index.html" width="1000" height="500"
tail j=4747 line= frameborder="0" scrolling="yes"></iframe>
tail j=4748 line= -->
tail j=4749 line=
tail j=4750 line= <hr color=red><hr color=black><hr color=white>
tail j=4751 line= <button type="button" onclick="show_all_links('pop')">show_all_links</button>
tail j=4752 line=<!-- <button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
tail j=4753 line= <hr color=red><hr color=white><hr color=blue>
tail j=4754 line= <button type="button" onclick="show_svc_links('pop')">show_svc_links</button>
tail j=4755 line= <button type="button" onclick="show_ko_links('pop')">show_ko_links</button>
tail j=4756 line= <button type="button" onclick="show_us_links('pop')">show_us_links</button>
tail j=4757 line= <button type="button" onclick="show_u_links('pop')">show_u_links</button>
tail j=4758 line= <button type="button" onclick="show_now_links('pop')">show_now_links</button>
tail j=4759 line= <button type="button" onclick="show_srv_links('pop')">show_srv_links</button>
tail j=4760 line= <hr color=blue><hr color=white><hr color=black>
tail j=4761 line=
tail j=4762 line=<!--
tail j=4763 line= <img src="/imgs/btn/kib.png" height="50" size="150" alt="koeye" onclick="show_svc_links()">
tail j=4764 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_ko_links()">
tail j=4765 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_us_links()">
tail j=4766 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_u_links()">
tail j=4767 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_now_links()">
tail j=4768 line= <img src="/imgs/btn/kiw.png" height="50" size="150" alt="koeyew" onclick="show_srv_links()">
tail j=4769 line= -->
tail j=4770 line=
tail j=4771 line= <div id="div_kobuttons">
tail j=4772 line= <a href=# class="popover" onclick="show_svc_links();">
tail j=4773 line= <img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" >
tail j=4774 line= <span><img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" ></span>
tail j=4775 line= </a>
tail j=4776 line=
tail j=4777 line= <a href=# class="popover" onclick="show_ko_links();">
tail j=4778 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4779 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4780 line= </a>
tail j=4781 line=
tail j=4782 line= <a href=# class="popover" onclick="show_us_links();">
tail j=4783 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4784 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4785 line= </a>
tail j=4786 line=
tail j=4787 line= <a href=# class="popover" onclick="show_u_links();">
tail j=4788 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4789 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4790 line= </a>
tail j=4791 line=
tail j=4792 line= <a href=# class="popover" onclick="show_now_links();">
tail j=4793 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4794 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4795 line= </a>
tail j=4796 line=
tail j=4797 line= <a href=# class="popover" onclick="show_srv_links();">
tail j=4798 line= <img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" >
tail j=4799 line= <span><img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" ></span>
tail j=4800 line= </a>
tail j=4801 line= </div id="div_kobuttons">
tail j=4802 line=
tail j=4803 line= <hr color=blue><hr color=white><hr color=red>
tail j=4804 line=
tail j=4805 line=<!--
tail j=4806 line= <div id="div_drop">
tail j=4807 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=4808 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=4809 line= <img height=200 width=300
tail j=4810 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=4811 line= </a>
tail j=4812 line= <div id="div_drop">
tail j=4813 line= -->
tail j=4814 line= <hr color=red>
tail j=4815 line= <hr color=white>
tail j=4816 line= <hr color=blue>
tail j=4817 line=
tail j=4818 line= <div id="div_drag" >
tail j=4819 line= <a class="popover" href="/?q=bigtn_drag1">
tail j=4820 line= <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
tail j=4821 line= <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
tail j=4822 line= </a>
tail j=4823 line= </div id="div_drag" >
tail j=4824 line=
tail j=4825 line=
tail j=4826 line=
tail j=4827 line= <div id="div_drop_zm">
tail j=4828 line= <span id="sw"><h3>droptop</h3></span>
tail j=4829 line= <a class="thumbnail" href=/index_vu.html?zmid=/zm/komap target=_blank>
tail j=4830 line= <img height=200 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 >
tail j=4831 line= <span><img height=400 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 ></span>
tail j=4832 line= </a>
tail j=4833 line= </div id="div_drop_zm">
tail j=4834 line=
tail j=4835 line=
tail j=4836 line= <div id="div_drag_main"> drag:<br />
tail j=4837 line= <img class="drg" src="/images/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=4838 line=
tail j=4839 line= <div class="drg"><h1>konet llc </h1>
tail j=4840 line= <pre>timesak skwii</pre>
tail j=4841 line= <img class="drg" src="/imgs/links/keyeb.png" alt="keyeb.png" width="50" >
tail j=4842 line= <img class="drg" src="/imgs/links/keyw.png" alt="keyew.png" width="50" >
tail j=4843 line= <pre>timesak skwii</pre>
tail j=4844 line= </div>
tail j=4845 line=
tail j=4846 line= <div class="drg"><h3>jtf29 </h3>
tail j=4847 line= <a href=/ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=4848 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=4849 line= </a>
tail j=4850 line= </div>
tail j=4851 line=
tail j=4852 line=
tail j=4853 line= <div class="drg"><h3>dogheads</h3>
tail j=4854 line= <div id="div_jtf_vid5">
tail j=4855 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=4856 line= <source src="/ko_jtf/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4857 line= </video>
tail j=4858 line= </div>
tail j=4859 line= </div>
tail j=4860 line=
tail j=4861 line= <div class="drg"><h3>jtfdc night court lights action 3720</h3>
tail j=4862 line= <div id="div_vid">
tail j=4863 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=4864 line= <source src="index.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4865 line= <source src="index.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4866 line= </video>
tail j=4867 line= </div>
tail j=4868 line= </div>
tail j=4869 line=
tail j=4870 line= <div class="drg"><h3>vid1: </h3>
tail j=4871 line= <div id="div_vid1">
tail j=4872 line= <video controls="controls" defaultmuted="" muted="true" style="width:320;height:180;" poster="index1_mp4.png">
tail j=4873 line= <source src="index1.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4874 line= <source src="index1.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4875 line= </video>
tail j=4876 line= </div>
tail j=4877 line= </div>
tail j=4878 line=
tail j=4879 line= <div class="drg"><h3>vid2_avril</h3>
tail j=4880 line= <div id="div_vid2_avril">
tail j=4881 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index2_mp4.png">
tail j=4882 line= <source src="index2.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4883 line= <source src="index2.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4884 line= </video>
tail j=4885 line= </div>
tail j=4886 line= </div>
tail j=4887 line=
tail j=4888 line= <div class="drg"><h3>vid3_jtfinc_dogpatrol_tresspass</h3>
tail j=4889 line= <div id="div_vid3">
tail j=4890 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index3_mp4.png">
tail j=4891 line= <source src="index3.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4892 line= <source src="index3.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4893 line= </video>
tail j=4894 line= </div>
tail j=4895 line= </div>
tail j=4896 line=
tail j=4897 line=
tail j=4898 line= <div class="drg">konet llc
tail j=4899 line= <img src="/imgs/btn/kob.png" alt="ko.png" width="50" class="drg" />
tail j=4900 line=
tail j=4901 line= </div>
tail j=4902 line= </div id="div_drag_main">
tail j=4903 line=
tail j=4904 line=
tail j=4905 line= <hr color=yellow>
tail j=4906 line= <hr color=white>
tail j=4907 line= <hr color=yellow>
tail j=4908 line=
tail j=4909 line= <div id="div_neave_im" >
tail j=4910 line= <iframe frameborder='0' height='250' marginheight='0' marginwidth='0' scrolling='no'
tail j=4911 line= src='/index_neave_im.html'
tail j=4912 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=4913 line= </iframe>
tail j=4914 line= <a class="popover" href="/index_neave_im.html" target=_blank>
tail j=4915 line= <img height=50 width=1600 src="/imgs/links/index_neave_im.png" alt="index_neave_im" border=0>
tail j=4916 line= <span><img height=50 width=1600 src="/imgs/links/index_neave_im_pop.png" border=0></span>
tail j=4917 line= </a>
tail j=4918 line= </div id="div_neave_im" >
tail j=4919 line=
tail j=4920 line= <div id="div_iframe" height-"150" >
tail j=4921 line= </div id="div_ifram" >
tail j=4922 line=
tail j=4923 line= <div id="div_neave_wobble" >
tail j=4924 line=
tail j=4925 line= <a class="popover" href="/index_neave_wobble.html" target=_blank>
tail j=4926 line= <img height=50 width=1600 src="/imgs/links/index_neave_wobble.png" alt="index_neave_wobble" border=0>
tail j=4927 line= <span><img height=50 width=1600 src="/imgs/links/index_neave_wobble_pop.png" border=0></span>
tail j=4928 line= </a>
tail j=4929 line= <iframe frameborder='0' height='150' marginheight='0' marginwidth='0' scrolling='no'
tail j=4930 line= src='/index_neave_wobble.html'
tail j=4931 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=4932 line= </iframe>
tail j=4933 line= </div id="div_neave_wobble" >
tail j=4934 line=
tail j=4935 line=
tail j=4936 line=
tail j=4937 line=
tail j=4938 line= <div id="div_files" >
tail j=4939 line= <output id="zonelist"></output>
tail j=4940 line= <div id="dropzone">
tail j=4941 line= dropzone
tail j=4942 line= <div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
tail j=4943 line= <canvas id="canvas_dropzone" style="z-index: 1;
tail j=4944 line= position:absolute;
tail j=4945 line= left:0px;
tail j=4946 line= top:0px;
tail j=4947 line= " height="100px" width="200" background-color="darkSlategrey" color="ivory">
tail j=4948 line= WARN_1387 unauthorized access has been logged
tail j=4949 line= </canvas>
tail j=4950 line= </div id="div_files" >
tail j=4951 line=
tail j=4952 line= <script id="scrip_fileselect" name="script_fileselect">
tail j=4953 line= function handleFileSelect(evt) {
tail j=4954 line= evt.stopPropagation();
tail j=4955 line= evt.preventDefault();
tail j=4956 line=
tail j=4957 line= var files = evt.dataTransfer.files; // FileList object.
tail j=4958 line=
tail j=4959 line=// files is a FileList of File objects. List some properties.
tail j=4960 line= var output = [];
tail j=4961 line= for (var i = 0, f; f = files[i]; i++) {
tail j=4962 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
tail j=4963 line= f.size, ' bytes, last modified: ',
tail j=4964 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
tail j=4965 line= '</li>');
tail j=4966 line= }
tail j=4967 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
tail j=4968 line= }
tail j=4969 line=
tail j=4970 line= function handleDragOver(evt) {
tail j=4971 line= evt.stopPropagation();
tail j=4972 line= evt.preventDefault();
tail j=4973 line= evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
tail j=4974 line= }
tail j=4975 line=
tail j=4976 line= // Setup the dnd listeners.
tail j=4977 line= var dropZone = document.getElementById('dropzone');
tail j=4978 line= dropZone.addEventListener('dragover', handleDragOver, false);
tail j=4979 line= dropZone.addEventListener('drop', handleFileSelect, false);
tail j=4980 line= </script id="scrip_fileselect" name="script_fileselect">
tail j=4981 line=
tail j=4982 line=<hr><hr><hr>
tail j=4983 line= <div id="div_zonelist">
tail j=4984 line= <label class="fileContainer">
tail j=4985 line= files
tail j=4986 line= <input id="files" name="files[]" multiple="" type="file">
tail j=4987 line= </label>
tail j=4988 line= <output id="zonelist"></output>
tail j=4989 line= <div id="div_zonelist">
tail j=4990 line=
tail j=4991 line= <script id="script_hfileselect" >
tail j=4992 line= function handleFileSelect(evt) {
tail j=4993 line= var files = evt.target.files; // FileList object
tail j=4994 line=
tail j=4995 line= // files is a FileList of File objects. List some properties.
tail j=4996 line= var output = [];
tail j=4997 line= for (var i = 0, f; f = files[i]; i++) {
tail j=4998 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
tail j=4999 line= f.size, ' bytes, last modified: ',
tail j=5000 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
tail j=5001 line= '</li>');
tail j=5002 line= }
tail j=5003 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
tail j=5004 line= }
tail j=5005 line=
tail j=5006 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
tail j=5007 line= </script id="script_hfileselect" >
tail j=5008 line=
tail j=5009 line= <div id="div_files2" hidden >
tail j=5010 line= <label class="fileContainer">
tail j=5011 line= files2
tail j=5012 line= <input id="files" name="files[]" multiple="" type="file">
tail j=5013 line= </label>
tail j=5014 line= <output id="zonelist"></output>
tail j=5015 line= </div id="div_files2" hidden >
tail j=5016 line=
tail j=5017 line= <script id="script_hfileselect2" >
tail j=5018 line= function handleFileSelect(evt) {
tail j=5019 line= var files = evt.target.files; // FileList object
tail j=5020 line=
tail j=5021 line= // Loop through the FileList and render image files as thumbnails.
tail j=5022 line= for (var i = 0, f; f = files[i]; i++) {
tail j=5023 line=
tail j=5024 line=// Only process image files.
tail j=5025 line= if (!f.type.match('image.*')) { continue; }
tail j=5026 line=
tail j=5027 line= var reader = new FileReader();
tail j=5028 line=
tail j=5029 line= // Closure to capture the file information.
tail j=5030 line= reader.onload = (function(theFile) {
tail j=5031 line= return function(e) {
tail j=5032 line= // Render thumbnail.
tail j=5033 line= var span = document.createElement('span');
tail j=5034 line= span.innerHTML = ['<img class="thumb" src="', e.target.result,
tail j=5035 line= '" title="', escape(theFile.name), '"/>'].join('');
tail j=5036 line= document.getElementById('zonelist').insertBefore(span, null);
tail j=5037 line= };
tail j=5038 line= })(f);
tail j=5039 line=
tail j=5040 line= // Read in the image file as a data URL.
tail j=5041 line= reader.readAsDataURL(f);
tail j=5042 line= }
tail j=5043 line= }
tail j=5044 line=
tail j=5045 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
tail j=5046 line= </script id="script_hfileselect2" >
tail j=5047 line=
tail j=5048 line= <script id="script_previewfile">
tail j=5049 line= function previewfile(file) {
tail j=5050 line= if (tests.filereader === true && acceptedTypes[file.type] === true) {
tail j=5051 line= var reader = new FileReader();
tail j=5052 line= reader.onload = function (event) {
tail j=5053 line= var image = new Image();
tail j=5054 line= image.src = event.target.result;
tail j=5055 line= image.width = 250; // a fake resize
tail j=5056 line= holder.appendChild(image);
tail j=5057 line= };
tail j=5058 line=
tail j=5059 line= reader.readAsDataURL(file);
tail j=5060 line= }
tail j=5061 line= else {
tail j=5062 line= holder.innerHTML +=
tail j=5063 line= '<p>done: koupload'
tail j=5064 line= + file.name
tail j=5065 line= + ' '
tail j=5066 line= + (file.size ? (file.size/1024|0) + 'K' : '');
tail j=5067 line= console.log(file);
tail j=5068 line= }
tail j=5069 line= }
tail j=5070 line=
tail j=5071 line= function readfiles(files) {
tail j=5072 line= debugger;
tail j=5073 line= var formData = tests.formdata ? new FormData() : null;
tail j=5074 line= for (var i = 0; i < files.length; i++) {
tail j=5075 line= if (tests.formdata) formData.append('file', files[i]);
tail j=5076 line= previewfile(files[i]);
tail j=5077 line= }
tail j=5078 line=
tail j=5079 line=// now post a new XHR request
tail j=5080 line= if (tests.formdata) {
tail j=5081 line= var xhr = new XMLHttpRequest();
tail j=5082 line= xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
tail j=5083 line=// xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
tail j=5084 line= xhr.onload = function() {
tail j=5085 line= progress.value = progress.innerHTML = 100;
tail j=5086 line= };
tail j=5087 line=
tail j=5088 line= if (tests.progress) {
tail j=5089 line= xhr.upload.onprogress = function (event) {
tail j=5090 line= if (event.lengthComputable) {
tail j=5091 line= var complete = (event.loaded / event.total * 100 | 0);
tail j=5092 line= progress.value = progress.innerHTML = complete;
tail j=5093 line= }
tail j=5094 line= }
tail j=5095 line= }
tail j=5096 line=
tail j=5097 line= xhr.send(formData);
tail j=5098 line= }
tail j=5099 line= }
tail j=5100 line=
tail j=5101 line= if (tests.dnd) {
tail j=5102 line= holder.ondragover = function () { this.className = 'hover'; return false; };
tail j=5103 line= holder.ondragend = function () { this.className = ''; return false; };
tail j=5104 line= holder.ondrop = function (e) {
tail j=5105 line= this.className = '';
tail j=5106 line= e.preventDefault();
tail j=5107 line= readfiles(e.dataTransfer.files);
tail j=5108 line= }
tail j=5109 line= }
tail j=5110 line= else {
tail j=5111 line= fileupload.className = 'hidden';
tail j=5112 line= fileupload.querySelector('input').onchange = function () {
tail j=5113 line= readfiles(this.files);
tail j=5114 line= };
tail j=5115 line= }
tail j=5116 line= </script id="script_previewfile">
tail j=5117 line=
tail j=5118 line= <script id="script_myfilework>
tail j=5119 line= funtion myfilework( j, file ) {
tail j=5120 line=
tail j=5121 line= alert( j+" file="+file );
tail j=5122 line= }
tail j=5123 line=
tail j=5124 line= </script id="script_myfilework>
tail j=5125 line=
tail j=5126 line=
tail j=5127 line=
tail j=5128 line=
tail j=5129 line=
tail j=5130 line= <script id="script_upload_input">>
tail j=5131 line= var upload = document.getElementsByTagName('input')[0],
tail j=5132 line= holder2 = document.getElementById('holder2'),
tail j=5133 line= state = document.getElementById('status');
tail j=5134 line=
tail j=5135 line= if (typeof window.FileReader === 'undefined') {
tail j=5136 line= state.className = 'fail';
tail j=5137 line= }
tail j=5138 line= else {
tail j=5139 line= state.className = 'success';
tail j=5140 line= state.innerHTML = 'File API & FileReader available';
tail j=5141 line= }
tail j=5142 line=
tail j=5143 line= upload.onchange = function (e) {
tail j=5144 line= e.preventDefault();
tail j=5145 line=
tail j=5146 line= var file = upload.files[0],
tail j=5147 line= reader = new FileReader();
tail j=5148 line= reader.onload = function (event) {
tail j=5149 line= var img = new Image();
tail j=5150 line= img.src = event.target.result;
tail j=5151 line=// note: no onload required since we've got the dataurl...I think! :)
tail j=5152 line= if (img.width > 560) { // holder width
tail j=5153 line= img.width = 560;
tail j=5154 line= }
tail j=5155 line= holder2.innerHTML = '';
tail j=5156 line= holder.appendChild(img);
tail j=5157 line= };
tail j=5158 line= reader.readAsDataURL(file);
tail j=5159 line=
tail j=5160 line= return false;
tail j=5161 line= };
tail j=5162 line=
tail j=5163 line=// var formData = new FormData();
tail j=5164 line=// formData.append("part_num", "123ABC");
tail j=5165 line=// formData.append("part_price", 7.95);
tail j=5166 line=// formData.append("part_image", somefile)
tail j=5167 line=//
tail j=5168 line=// var xhr = new XMLHttpRequest();
tail j=5169 line=// xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");
tail j=5170 line=// xhr.send(formData);
tail j=5171 line= </script id="script_upload_input">>
tail j=5172 line=
tail j=5173 line= <canvas id="canvas_1" color="darkSlategrey" height="100" width="400">
tail j=5174 line= </canvas id="canvas_1" >
tail j=5175 line=
tail j=5176 line=
tail j=5177 line= <script id="script_canvas_1" >
tail j=5178 line= var canvas = document.getElementsByTagName('canvas_1')[0],
tail j=5179 line= ctx = null,
tail j=5180 line= grad = null,
tail j=5181 line= body = document.getElementsByTagName('body')[0],
tail j=5182 line= color = 255;
tail j=5183 line= color = lightblue;
tail j=5184 line=
tail j=5185 line=if (canvas.getContext('2d')) {
tail j=5186 line= ctx = canvas.getContext('2d');
tail j=5187 line= ctx.clearRect(0, 0, 600, 600);
tail j=5188 line= ctx.save();
tail j=5189 line=
tail j=5190 line=// Create radial gradient
tail j=5191 line=// grad = ctx.createRadialGradient(0,0,0,0,0,600);
tail j=5192 line=// grad.addColorStop(0, '#000');
tail j=5193 line=// grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');
tail j=5194 line=
tail j=5195 line= // assign gradients to fill
tail j=5196 line=// ctx.fillStyle = grad;
tail j=5197 line= ctx.fillstyle = "lightblue";
tail j=5198 line=
tail j=5199 line= // draw 600x600 fill
tail j=5200 line= ctx.fillRect(0,0,600,600);
tail j=5201 line= ctx.save();
tail j=5202 line=
tail j=5203 line= body.onmousemove = function (event) {
tail j=5204 line= var width = window.innerWidth,
tail j=5205 line= height = window.innerHeight,
tail j=5206 line= x = event.clientX,
tail j=5207 line= y = event.clientY,
tail j=5208 line= rx = 600 * x / width,
tail j=5209 line= ry = 600 * y / height;
tail j=5210 line=
tail j=5211 line= var xc = ~~(256 * x / width);
tail j=5212 line= var yc = ~~(256 * y / height);
tail j=5213 line=
tail j=5214 line= grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600);
tail j=5215 line= grad.addColorStop(0, '#000');
tail j=5216 line= grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
tail j=5217 line= // ctx.restore();
tail j=5218 line=// ctx.fillStyle = grad;
tail j=5219 line= ctx.fillstyle="lightblue";
tail j=5220 line= ctx.fillRect(0,0,600,600);
tail j=5221 line= // ctx.save();
tail j=5222 line= };
tail j=5223 line=}
tail j=5224 line= </script id="script_canvas_1" >
tail j=5225 line=
tail j=5226 line= <div id="div_csv"><h3></h3>
tail j=5227 line= </div id="div_csv">
tail j=5228 line=
tail j=5229 line= <script id="script_upload" type="text/javascript">
tail j=5230 line=// function upload_csv() {
tail j=5231 line= function Upload() {
tail j=5232 line=// var files = evt.dataTransfer.files; // FileList object.
tail j=5233 line=// var fileUpload = document.getElementById("upload_files");
tail j=5234 line= var fileUpload = document.getElementById("fileUpload");
tail j=5235 line= var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
tail j=5236 line=// if (regex.test(fileUpload.value.toLowerCase())) {
tail j=5237 line= if (regex.test(fileUpload.value.toLowerCase())) {
tail j=5238 line= if (typeof (FileReader) != "undefined") {
tail j=5239 line= var reader = new FileReader();
tail j=5240 line= reader.onload = function (e) {
tail j=5241 line= var table = document.createElement("table");
tail j=5242 line= var rows = e.target.result.split("\n");
tail j=5243 line= for (var i = 0; i < rows.length; i++) {
tail j=5244 line= var row = table.insertRow(-1);
tail j=5245 line=
tail j=5246 line=// var cells = rows[i].split("|");
tail j=5247 line= var cells = rows[i].split(",");
tail j=5248 line= for (var j = 0; j < cells.length; j++) {
tail j=5249 line= var cell = row.insertCell(-1);
tail j=5250 line= cell.innerHTML = cells[j];
tail j=5251 line= }
tail j=5252 line= }
tail j=5253 line= var csv2tbl = document.getElementById("csv2tbl");
tail j=5254 line= csv2tbl.innerHTML = "";
tail j=5255 line= csv2tbl.appendChild(table);
tail j=5256 line= }
tail j=5257 line= reader.readAsText(fileUpload.files[0]);
tail j=5258 line= file_csv=fileUpload.files[0];
tail j=5259 line= file_csvlen = fileUpload.files.length;
tail j=5260 line= alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
tail j=5261 line= load_file_csv(file_csv);
tail j=5262 line= }
tail j=5263 line= else {
tail j=5264 line= alert("csv2tbl warn: unauthorized access noted");
tail j=5265 line= }
tail j=5266 line= }
tail j=5267 line= else {
tail j=5268 line= alert("csv2tbl fail: unsuppoted format");
tail j=5269 line= }
tail j=5270 line= }
tail j=5271 line= </script id="script_upload" type="text/javascript">
tail j=5272 line=
tail j=5273 line= <script id="script_load_file_csv">
tail j=5274 line= function load_file_csv(file_csv) {
tail j=5275 line= alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
tail j=5276 line= file_psv=file_csv;
tail j=5277 line= return(file_psv);
tail j=5278 line= }
tail j=5279 line= </script id="script_load_file_csv">
tail j=5280 line=
tail j=5281 line= <div id="div_filecontainer" >
tail j=5282 line= <label class="fileContainer">
tail j=5283 line= files.csv.psv.txt
tail j=5284 line= <input id="fileUpload" type="file"></input>
tail j=5285 line= </label>
tail j=5286 line=
tail j=5287 line=      
tail j=5288 line= <label class="fileContainer">
tail j=5289 line= parse.csv.psv.txt
tail j=5290 line= <input id="upload" value="Upload" onclick="Upload()" type="button"></input>
tail j=5291 line= </label>
tail j=5292 line= </div id="div_filecontainer" >
tail j=5293 line=
tail j=5294 line=
tail j=5295 line=
tail j=5296 line= <div id="div_csv2tbl"><h3>csv2tbl</h3>
tail j=5297 line= </div id="div_csv2tbl" >
tail j=5298 line=
tail j=5299 line=<!--
tail j=5300 line= <button type="button" id="fileUpload" type="file" >select</button>
tail j=5301 line= <button type="button" id="upload" value="Upload" onclick="Upload()">upload</button>
tail j=5302 line= -->
tail j=5303 line=
tail j=5304 line=<!--
tail j=5305 line=
tail j=5306 line= <div id="div_showhide" hidden>
tail j=5307 line= <script id="script_showhide" >
tail j=5308 line= function show_files() {
tail j=5309 line= var div_files = document.getElementbyID("div_files");
tail j=5310 line= div_files.show();
tail j=5311 line= }
tail j=5312 line= function hide_files() {
tail j=5313 line= var div_files = document.getElementbyID("div_files");
tail j=5314 line= div_files.hide();
tail j=5315 line= }
tail j=5316 line= </script id="script_showhide" hidden>
tail j=5317 line=
tail j=5318 line= <button type="button" id="show">show</button>
tail j=5319 line= <button type="button" id="hide">hide</button>
tail j=5320 line= <button type="show_files" id="show_files" onclick="show_files()">Show_files</button>
tail j=5321 line= <button type="hide_files" id="hide_files" onclick="hide_files()">Hide_files</button>
tail j=5322 line= <button type="show_neave_wobble" id="show_neave_wobble">Show_neave_wobble</button>
tail j=5323 line= <button type="hide_neave_wobble" id="hide_neave_wobble">Hide_neave_wobble</button>
tail j=5324 line= -->
tail j=5325 line=<!--
tail j=5326 line= <button type="show_dd" id="show_dd">Show_dd</button>
tail j=5327 line= <button type="hide_dd" id="hide_dd">Hide_dd</button>
tail j=5328 line= <button type="show_bb" id="show_bb">Show_bb</button>
tail j=5329 line= <button type="hide_bb" id="hide_bb">Hide_bb</button>
tail j=5330 line= <button type="show_tl" id="show_tl">Show_tl</button>
tail j=5331 line= <button type="hide_tl" id="hide_tl">Hide_tl</button>
tail j=5332 line= <button type="show_colors" id="show_colors">Show_colors</button>
tail j=5333 line= <button type="hide_colors" id="hide_colors">Hide_colors</button>
tail j=5334 line= <button type="show_fonts" id="show_fonts">Show_fonts</button>
tail j=5335 line= <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
tail j=5336 line= <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
tail j=5337 line= <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
tail j=5338 line= -->
tail j=5339 line= </div id="dvi_showhide" >
tail j=5340 line=
tail j=5341 line=
tail j=5342 line= <div id="item" >div_item
tail j=5343 line= </div id="item">
tail j=5344 line=
tail j=5345 line=<!--
tail j=5346 line= <script id="script_showhide">
tail j=5347 line= $( "#show" ).click(function() {$('#item').show(); });
tail j=5348 line= $( "#hide" ).click(function() {$('#item').hide();});
tail j=5349 line= $( "#show_files" ).click(function() {$('#div_files').show(); });
tail j=5350 line= $( "#hide_files" ).click(function() {$('#div_files').hide();});
tail j=5351 line= $( "#show_neave_wobble" ).click(function() {$('#div_neave_wobble').show(); });
tail j=5352 line= $( "#hide_neave_wobble" ).click(function() {$('#div_neave_wobble').hide();});
tail j=5353 line=// $( "#show_dd" ).click(function() {$('#div_dd').show(); });
tail j=5354 line=// $( "#hide_dd" ).click(function() {$('#div_dd').hide();});
tail j=5355 line=// $( "#show_bb" ).click(function() {$('#div_bb').show(); });
tail j=5356 line=// $( "#hide_bb" ).click(function() {$('#div_bb').hide();});
tail j=5357 line=// $( "#show_tl" ).click(function() {$('#div_tl').show(); });
tail j=5358 line=// $( "#hide_tl" ).click(function() {$('#div_tl').hide();});
tail j=5359 line=// $( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
tail j=5360 line=// $( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
tail j=5361 line=// $( "#show_colors" ).click(function() {$('#div_colors').show(); });
tail j=5362 line=// $( "#hide_colors" ).click(function() {$('#div_colors').hide();});
tail j=5363 line=// $( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
tail j=5364 line=// $( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
tail j=5365 line=// $( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
tail j=5366 line=// $( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
tail j=5367 line= </script id="script_showhide" >
tail j=5368 line= -->
tail j=5369 line=
tail j=5370 line=
tail j=5371 line=<!--[if IE] -->
tail j=5372 line=<!--
tail j=5373 line= <script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
tail j=5374 line= -->
tail j=5375 line=<!-- <![endif]-->
tail j=5376 line=<!--
tail j=5377 line= <div class="la-anim-10" hidden></div>
tail j=5378 line= -->
tail j=5379 line=
tail j=5380 line=<!-- .corner-preloader -->
tail j=5381 line=<!--
tail j=5382 line= <div id="wrapper" hidden>
tail j=5383 line= <div id="upload-widget">
tail j=5384 line= <h1>
tail j=5385 line= <i class="fa fa-cloud-upload"></i> File Uploader
tail j=5386 line= </h1>
tail j=5387 line=
tail j=5388 line= <form id="file-upload-form">
tail j=5389 line= <div class="file-input-wrap">
tail j=5390 line= fups
tail j=5391 line= <input type="file" name="file" id="file" multiple>
tail j=5392 line= </div><!-- .file-input-wrap -->
tail j=5393 line= </form><!-- #file-upload-form -->
tail j=5394 line= </div><!-- #upload-widget -->
tail j=5395 line=
tail j=5396 line= <div id="upload-result">
tail j=5397 line= </div><!-- #upload-result -->
tail j=5398 line= </div><!-- #wrapper -->
tail j=5399 line=
tail j=5400 line= <div id="preloader">
tail j=5401 line= <img height=50 src="/imgs/btn/kob.png" alt="preloader_up" />
tail j=5402 line= </a>
tail j=5403 line= </div>
tail j=5404 line=
tail j=5405 line= <!-- SCRIPTS -->
tail j=5406 line=<!-- <script type="text/javascript" src="js/libraries/jquery-2.1.1.min.js"></script> -->
tail j=5407 line=<!-- <script type="text/javascript" src="/js/vue.js" > -->
tail j=5408 line= <script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIFZ1ZS5qcyB2Mi41LjE3CiAqIChjKSAyMDE0LTIwMTggRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDoKCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6CgkoZ2xvYmFsLlZ1ZSA9IGZhY3RvcnkoKSk7Cn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOwoKLyogICovCgp2YXIgZW1wdHlPYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTsKCi8vIHRoZXNlIGhlbHBlcnMgcHJvZHVjZXMgYmV0dGVyIHZtIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXIKLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZwpmdW5jdGlvbiBpc1VuZGVmICh2KSB7CiAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsCn0KCmZ1bmN0aW9uIGlzRGVmICh2KSB7CiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsCn0KCmZ1bmN0aW9uIGlzVHJ1ZSAodikgewogIHJldHVybiB2ID09PSB0cnVlCn0KCmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHsKICByZXR1cm4gdiA9PT0gZmFsc2UKfQoKLyoqCiAqIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZQogKi8KZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbHVlKSB7CiAgcmV0dXJuICgKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwKICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fAogICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicKICApCn0KCi8qKgogKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGwKICogT2JqZWN0cyBmcm9tIHByaW1pdGl2ZSB2YWx1ZXMgd2hlbiB3ZSBrbm93IHRoZSB2YWx1ZQogKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuCiAqLwpmdW5jdGlvbiBpc09iamVjdCAob2JqKSB7CiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jwp9CgovKioKICogR2V0IHRoZSByYXcgdHlwZSBzdHJpbmcgb2YgYSB2YWx1ZSBlLmcuIFtvYmplY3QgT2JqZWN0XQogKi8KdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpmdW5jdGlvbiB0b1Jhd1R5cGUgKHZhbHVlKSB7CiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSkKfQoKLyoqCiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWUKICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy4KICovCmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJwp9CgpmdW5jdGlvbiBpc1JlZ0V4cCAodikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXScKfQoKLyoqCiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LgogKi8KZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkgewogIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodmFsKSk7CiAgcmV0dXJuIG4gPj0gMCAmJiBNYXRoLmZsb29yKG4pID09PSBuICYmIGlzRmluaXRlKHZhbCkKfQoKLyoqCiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLgogKi8KZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkgewogIHJldHVybiB2YWwgPT0gbnVsbAogICAgPyAnJwogICAgOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JwogICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMikKICAgICAgOiBTdHJpbmcodmFsKQp9CgovKioKICogQ29udmVydCBhIGlucHV0IHZhbHVlIHRvIGEgbnVtYmVyIGZvciBwZXJzaXN0ZW5jZS4KICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuCiAqLwpmdW5jdGlvbiB0b051bWJlciAodmFsKSB7CiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7CiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbgp9CgovKioKICogTWFrZSBhIG1hcCBhbmQgcmV0dXJuIGEgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGEga2V5CiAqIGlzIGluIHRoYXQgbWFwLgogKi8KZnVuY3Rpb24gbWFrZU1hcCAoCiAgc3RyLAogIGV4cGVjdHNMb3dlckNhc2UKKSB7CiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7CiAgfQogIHJldHVybiBleHBlY3RzTG93ZXJDYXNlCiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH0KICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH0KfQoKLyoqCiAqIENoZWNrIGlmIGEgdGFnIGlzIGEgYnVpbHQtaW4gdGFnLgogKi8KdmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7CgovKioKICogQ2hlY2sgaWYgYSBhdHRyaWJ1dGUgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUuCiAqLwp2YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzJyk7CgovKioKICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheQogKi8KZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHsKICBpZiAoYXJyLmxlbmd0aCkgewogICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSkKICAgIH0KICB9Cn0KCi8qKgogKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS4KICovCnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHsKICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkKfQoKLyoqCiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi4KICovCmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHsKICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHJldHVybiAoZnVuY3Rpb24gY2FjaGVkRm4gKHN0cikgewogICAgdmFyIGhpdCA9IGNhY2hlW3N0cl07CiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSkKICB9KQp9CgovKioKICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy4KICovCnZhciBjYW1lbGl6ZVJFID0gLy0oXHcpL2c7CnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIGZ1bmN0aW9uIChfLCBjKSB7IHJldHVybiBjID8gYy50b1VwcGVyQ2FzZSgpIDogJyc7IH0pCn0pOwoKLyoqCiAqIENhcGl0YWxpemUgYSBzdHJpbmcuCiAqLwp2YXIgY2FwaXRhbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKQp9KTsKCi8qKgogKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLgogKi8KdmFyIGh5cGhlbmF0ZVJFID0gL1xCKFtBLVpdKS9nOwp2YXIgaHlwaGVuYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsICctJDEnKS50b0xvd2VyQ2FzZSgpCn0pOwoKLyoqCiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdC4uLiBlLmcuCiAqIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5IHdlIGRvbid0IG5lZWQgdGhpcyBhbnltb3JlIHNpbmNlIG5hdGl2ZSBiaW5kIGlzCiAqIG5vdyBtb3JlIHBlcmZvcm1hbnQgaW4gbW9zdCBicm93c2VycywgYnV0IHJlbW92aW5nIGl0IHdvdWxkIGJlIGJyZWFraW5nIGZvcgogKiBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluIFBoYW50b21KUyAxLngsIHNvIHRoaXMgbXVzdCBiZSBrZXB0IGZvcgogKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICovCgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBwb2x5ZmlsbEJpbmQgKGZuLCBjdHgpIHsKICBmdW5jdGlvbiBib3VuZEZuIChhKSB7CiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICByZXR1cm4gbAogICAgICA/IGwgPiAxCiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cykKICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKQogICAgICA6IGZuLmNhbGwoY3R4KQogIH0KCiAgYm91bmRGbi5fbGVuZ3RoID0gZm4ubGVuZ3RoOwogIHJldHVybiBib3VuZEZuCn0KCmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHsKICByZXR1cm4gZm4uYmluZChjdHgpCn0KCnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQKICA/IG5hdGl2ZUJpbmQKICA6IHBvbHlmaWxsQmluZDsKCi8qKgogKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS4KICovCmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7CiAgc3RhcnQgPSBzdGFydCB8fCAwOwogIHZhciBpID0gbGlzdC5sZW5ndGggLSBzdGFydDsKICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpOwogIHdoaWxlIChpLS0pIHsKICAgIHJldFtpXSA9IGxpc3RbaSArIHN0YXJ0XTsKICB9CiAgcmV0dXJuIHJldAp9CgovKioKICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LgogKi8KZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHsKICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHsKICAgIHRvW2tleV0gPSBfZnJvbVtrZXldOwogIH0KICByZXR1cm4gdG8KfQoKLyoqCiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuCiAqLwpmdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7CiAgdmFyIHJlcyA9IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoYXJyW2ldKSB7CiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyoqCiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLgogKiBTdHViYmluZyBhcmdzIHRvIG1ha2UgRmxvdyBoYXBweSB3aXRob3V0IGxlYXZpbmcgdXNlbGVzcyB0cmFuc3BpbGVkIGNvZGUKICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pCiAqLwpmdW5jdGlvbiBub29wIChhLCBiLCBjKSB7fQoKLyoqCiAqIEFsd2F5cyByZXR1cm4gZmFsc2UuCiAqLwp2YXIgbm8gPSBmdW5jdGlvbiAoYSwgYiwgYykgeyByZXR1cm4gZmFsc2U7IH07CgovKioKICogUmV0dXJuIHNhbWUgdmFsdWUKICovCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9OwoKLyoqCiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy4KICovCmZ1bmN0aW9uIGdlblN0YXRpY0tleXMgKG1vZHVsZXMpIHsKICByZXR1cm4gbW9kdWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGtleXMsIG0pIHsKICAgIHJldHVybiBrZXlzLmNvbmNhdChtLnN0YXRpY0tleXMgfHwgW10pCiAgfSwgW10pLmpvaW4oJywnKQp9CgovKioKICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsCiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT8KICovCmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHsKICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9CiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpOwogIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTsKICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0QikgewogICAgdHJ5IHsKICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTsKICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTsKICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7CiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKQogICAgICAgIH0pCiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5QikgewogICAgICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKGEpOwogICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpOwogICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChhW2tleV0sIGJba2V5XSkKICAgICAgICB9KQogICAgICB9IGVsc2UgewogICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHsKICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2UKICB9Cn0KCmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgaWYgKGxvb3NlRXF1YWwoYXJyW2ldLCB2YWwpKSB7IHJldHVybiBpIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qKgogKiBFbnN1cmUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlLgogKi8KZnVuY3Rpb24gb25jZSAoZm4pIHsKICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgIGlmICghY2FsbGVkKSB7CiAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfQp9Cgp2YXIgU1NSX0FUVFIgPSAnZGF0YS1zZXJ2ZXItcmVuZGVyZWQnOwoKdmFyIEFTU0VUX1RZUEVTID0gWwogICdjb21wb25lbnQnLAogICdkaXJlY3RpdmUnLAogICdmaWx0ZXInCl07Cgp2YXIgTElGRUNZQ0xFX0hPT0tTID0gWwogICdiZWZvcmVDcmVhdGUnLAogICdjcmVhdGVkJywKICAnYmVmb3JlTW91bnQnLAogICdtb3VudGVkJywKICAnYmVmb3JlVXBkYXRlJywKICAndXBkYXRlZCcsCiAgJ2JlZm9yZURlc3Ryb3knLAogICdkZXN0cm95ZWQnLAogICdhY3RpdmF0ZWQnLAogICdkZWFjdGl2YXRlZCcsCiAgJ2Vycm9yQ2FwdHVyZWQnCl07CgovKiAgKi8KCnZhciBjb25maWcgPSAoewogIC8qKgogICAqIE9wdGlvbiBtZXJnZSBzdHJhdGVnaWVzICh1c2VkIGluIGNvcmUvdXRpbC9vcHRpb25zKQogICAqLwogIC8vICRmbG93LWRpc2FibGUtbGluZQogIG9wdGlvbk1lcmdlU3RyYXRlZ2llczogT2JqZWN0LmNyZWF0ZShudWxsKSwKCiAgLyoqCiAgICogV2hldGhlciB0byBzdXBwcmVzcyB3YXJuaW5ncy4KICAgKi8KICBzaWxlbnQ6IGZhbHNlLAoKICAvKioKICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290PwogICAqLwogIHByb2R1Y3Rpb25UaXA6ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJywKCiAgLyoqCiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHMKICAgKi8KICBkZXZ0b29sczogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nLAoKICAvKioKICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmCiAgICovCiAgcGVyZm9ybWFuY2U6IGZhbHNlLAoKICAvKioKICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9ycwogICAqLwogIGVycm9ySGFuZGxlcjogbnVsbCwKCiAgLyoqCiAgICogV2FybiBoYW5kbGVyIGZvciB3YXRjaGVyIHdhcm5zCiAgICovCiAgd2FybkhhbmRsZXI6IG51bGwsCgogIC8qKgogICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50cwogICAqLwogIGlnbm9yZWRFbGVtZW50czogW10sCgogIC8qKgogICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uCiAgICovCiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCgogIC8qKgogICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYQogICAqIGNvbXBvbmVudC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi4KICAgKi8KICBpc1Jlc2VydmVkVGFnOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnQKICAgKiBwcm9wLiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLgogICAqLwogIGlzUmVzZXJ2ZWRBdHRyOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LgogICAqIFBsYXRmb3JtLWRlcGVuZGVudC4KICAgKi8KICBpc1Vua25vd25FbGVtZW50OiBubywKCiAgLyoqCiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudAogICAqLwogIGdldFRhZ05hbWVzcGFjZTogbm9vcCwKCiAgLyoqCiAgICogUGFyc2UgdGhlIHJlYWwgdGFnIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybS4KICAgKi8KICBwYXJzZVBsYXRmb3JtVGFnTmFtZTogaWRlbnRpdHksCgogIC8qKgogICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIGJvdW5kIHVzaW5nIHByb3BlcnR5LCBlLmcuIHZhbHVlCiAgICogUGxhdGZvcm0tZGVwZW5kZW50LgogICAqLwogIG11c3RVc2VQcm9wOiBubywKCiAgLyoqCiAgICogRXhwb3NlZCBmb3IgbGVnYWN5IHJlYXNvbnMKICAgKi8KICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LUwp9KQoKLyogICovCgovKioKICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfCiAqLwpmdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHsKICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTsKICByZXR1cm4gYyA9PT0gMHgyNCB8fCBjID09PSAweDVGCn0KCi8qKgogKiBEZWZpbmUgYSBwcm9wZXJ0eS4KICovCmZ1bmN0aW9uIGRlZiAob2JqLCBrZXksIHZhbCwgZW51bWVyYWJsZSkgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgdmFsdWU6IHZhbCwKICAgIGVudW1lcmFibGU6ICEhZW51bWVyYWJsZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7Cn0KCi8qKgogKiBQYXJzZSBzaW1wbGUgcGF0aC4KICovCnZhciBiYWlsUkUgPSAvW15cdy4kXS87CmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkgewogIGlmIChiYWlsUkUudGVzdChwYXRoKSkgewogICAgcmV0dXJuCiAgfQogIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy4nKTsKICByZXR1cm4gZnVuY3Rpb24gKG9iaikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIW9iaikgeyByZXR1cm4gfQogICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dOwogICAgfQogICAgcmV0dXJuIG9iagogIH0KfQoKLyogICovCgovLyBjYW4gd2UgdXNlIF9fcHJvdG9fXz8KdmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307CgovLyBCcm93c2VyIGVudmlyb25tZW50IHNuaWZmaW5nCnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJzsKdmFyIGluV2VleCA9IHR5cGVvZiBXWEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhIVdYRW52aXJvbm1lbnQucGxhdGZvcm07CnZhciB3ZWV4UGxhdGZvcm0gPSBpbldlZXggJiYgV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOwp2YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKdmFyIGlzSUUgPSBVQSAmJiAvbXNpZXx0cmlkZW50Ly50ZXN0KFVBKTsKdmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7CnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDsKdmFyIGlzQW5kcm9pZCA9IChVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwKSB8fCAod2VleFBsYXRmb3JtID09PSAnYW5kcm9pZCcpOwp2YXIgaXNJT1MgPSAoVUEgJiYgL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KFVBKSkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2lvcycpOwp2YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXC9cZCsvLnRlc3QoVUEpICYmICFpc0VkZ2U7CgovLyBGaXJlZm94IGhhcyBhICJ3YXRjaCIgZnVuY3Rpb24gb24gT2JqZWN0LnByb3RvdHlwZS4uLgp2YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoOwoKdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlOwppZiAoaW5Ccm93c2VyKSB7CiAgdHJ5IHsKICAgIHZhciBvcHRzID0ge307CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOwogICAgICB9CiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODUKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTsKICB9IGNhdGNoIChlKSB7fQp9CgovLyB0aGlzIG5lZWRzIHRvIGJlIGxhenktZXZhbGVkIGJlY2F1c2UgdnVlIG1heSBiZSByZXF1aXJlZCBiZWZvcmUKLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlYKdmFyIF9pc1NlcnZlcjsKdmFyIGlzU2VydmVyUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkgewogIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWluQnJvd3NlciAmJiAhaW5XZWV4ICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZAogICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzCiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJzsKICAgIH0gZWxzZSB7CiAgICAgIF9pc1NlcnZlciA9IGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gX2lzU2VydmVyCn07CgovLyBkZXRlY3QgZGV2dG9vbHMKdmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fOwoKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHsKICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSkKfQoKdmFyIGhhc1N5bWJvbCA9CiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJgogIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpOwoKdmFyIF9TZXQ7Ci8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLyAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHsKICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS4KICBfU2V0ID0gU2V0Owp9IGVsc2UgewogIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy4KICBfU2V0ID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFNldCAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWUKICAgIH07CiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoa2V5KSB7CiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlOwogICAgfTsKICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH07CgogICAgcmV0dXJuIFNldDsKICB9KCkpOwp9CgovKiAgKi8KCnZhciB3YXJuID0gbm9vcDsKdmFyIHRpcCA9IG5vb3A7CnZhciBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gKG5vb3ApOyAvLyB3b3JrIGFyb3VuZCBmbG93IGNoZWNrCnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApOwoKewogIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnOwogIHZhciBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXHcpL2c7CiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyCiAgICAucmVwbGFjZShjbGFzc2lmeVJFLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KQogICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9OwoKICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHsKICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJzsKCiAgICBpZiAoY29uZmlnLndhcm5IYW5kbGVyKSB7CiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTsKICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoKCJbVnVlIHdhcm5dOiAiICsgbXNnICsgdHJhY2UpKTsKICAgIH0KICB9OwoKICB0aXAgPSBmdW5jdGlvbiAobXNnLCB2bSkgewogICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkgewogICAgICBjb25zb2xlLndhcm4oIltWdWUgdGlwXTogIiArIG1zZyArICgKICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJycKICAgICAgKSk7CiAgICB9CiAgfTsKCiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHsKICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHsKICAgICAgcmV0dXJuICc8Um9vdD4nCiAgICB9CiAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiB2bSA9PT0gJ2Z1bmN0aW9uJyAmJiB2bS5jaWQgIT0gbnVsbAogICAgICA/IHZtLm9wdGlvbnMKICAgICAgOiB2bS5faXNWdWUKICAgICAgICA/IHZtLiRvcHRpb25zIHx8IHZtLmNvbnN0cnVjdG9yLm9wdGlvbnMKICAgICAgICA6IHZtIHx8IHt9OwogICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnOwogICAgdmFyIGZpbGUgPSBvcHRpb25zLl9fZmlsZTsKICAgIGlmICghbmFtZSAmJiBmaWxlKSB7CiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXF0rKVwudnVlJC8pOwogICAgICBuYW1lID0gbWF0Y2ggJiYgbWF0Y2hbMV07CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgKG5hbWUgPyAoIjwiICsgKGNsYXNzaWZ5KG5hbWUpKSArICI+IikgOiAiPEFub255bW91cz4iKSArCiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/ICgiIGF0ICIgKyBmaWxlKSA6ICcnKQogICAgKQogIH07CgogIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7CiAgICB2YXIgcmVzID0gJyc7CiAgICB3aGlsZSAobikgewogICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfQogICAgICBpZiAobiA+IDEpIHsgc3RyICs9IHN0cjsgfQogICAgICBuID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlcwogIH07CgogIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSBmdW5jdGlvbiAodm0pIHsKICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkgewogICAgICB2YXIgdHJlZSA9IFtdOwogICAgICB2YXIgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgd2hpbGUgKHZtKSB7CiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07CiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7CiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDsKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkgewogICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJlZS5wdXNoKHZtKTsKICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuICdcblxuZm91bmQgaW5cblxuJyArIHRyZWUKICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKCIiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSkKICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArICIuLi4gKCIgKyAodm1bMV0pICsgIiByZWN1cnNpdmUgY2FsbHMpIikKICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KQogICAgICAgIC5qb2luKCdcbicpCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gKCJcblxuKGZvdW5kIGluICIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgIikiKQogICAgfQogIH07Cn0KCi8qICAqLwoKCnZhciB1aWQgPSAwOwoKLyoqCiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZQogKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LgogKi8KdmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7CiAgdGhpcy5pZCA9IHVpZCsrOwogIHRoaXMuc3VicyA9IFtdOwp9OwoKRGVwLnByb3RvdHlwZS5hZGRTdWIgPSBmdW5jdGlvbiBhZGRTdWIgKHN1YikgewogIHRoaXMuc3Vicy5wdXNoKHN1Yik7Cn07CgpEZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7CiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTsKfTsKCkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHsKICBpZiAoRGVwLnRhcmdldCkgewogICAgRGVwLnRhcmdldC5hZGREZXAodGhpcyk7CiAgfQp9OwoKRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkgewogIC8vIHN0YWJpbGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0CiAgdmFyIHN1YnMgPSB0aGlzLnN1YnMuc2xpY2UoKTsKICBmb3IgKHZhciBpID0gMCwgbCA9IHN1YnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICBzdWJzW2ldLnVwZGF0ZSgpOwogIH0KfTsKCi8vIHRoZSBjdXJyZW50IHRhcmdldCB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZC4KLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZQovLyB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZCBhdCBhbnkgdGltZS4KRGVwLnRhcmdldCA9IG51bGw7CnZhciB0YXJnZXRTdGFjayA9IFtdOwoKZnVuY3Rpb24gcHVzaFRhcmdldCAoX3RhcmdldCkgewogIGlmIChEZXAudGFyZ2V0KSB7IHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldCk7IH0KICBEZXAudGFyZ2V0ID0gX3RhcmdldDsKfQoKZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHsKICBEZXAudGFyZ2V0ID0gdGFyZ2V0U3RhY2sucG9wKCk7Cn0KCi8qICAqLwoKdmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUgKAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIHRleHQsCiAgZWxtLAogIGNvbnRleHQsCiAgY29tcG9uZW50T3B0aW9ucywKICBhc3luY0ZhY3RvcnkKKSB7CiAgdGhpcy50YWcgPSB0YWc7CiAgdGhpcy5kYXRhID0gZGF0YTsKICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgdGhpcy50ZXh0ID0gdGV4dDsKICB0aGlzLmVsbSA9IGVsbTsKICB0aGlzLm5zID0gdW5kZWZpbmVkOwogIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7CiAgdGhpcy5mbk9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgdGhpcy5mblNjb3BlSWQgPSB1bmRlZmluZWQ7CiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5OwogIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7CiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDsKICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDsKICB0aGlzLnJhdyA9IGZhbHNlOwogIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTsKICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7CiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTsKICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7CiAgdGhpcy5pc09uY2UgPSBmYWxzZTsKICB0aGlzLmFzeW5jRmFjdG9yeSA9IGFzeW5jRmFjdG9yeTsKICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDsKICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlOwp9OwoKdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTsKCi8vIERFUFJFQ0FURUQ6IGFsaWFzIGZvciBjb21wb25lbnRJbnN0YW5jZSBmb3IgYmFja3dhcmRzIGNvbXBhdC4KLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KcHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZQp9OwoKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZOb2RlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7Cgp2YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgaWYgKCB0ZXh0ID09PSB2b2lkIDAgKSB0ZXh0ID0gJyc7CgogIHZhciBub2RlID0gbmV3IFZOb2RlKCk7CiAgbm9kZS50ZXh0ID0gdGV4dDsKICBub2RlLmlzQ29tbWVudCA9IHRydWU7CiAgcmV0dXJuIG5vZGUKfTsKCmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7CiAgcmV0dXJuIG5ldyBWTm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBTdHJpbmcodmFsKSkKfQoKLy8gb3B0aW1pemVkIHNoYWxsb3cgY2xvbmUKLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zcwovLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHkKLy8gb24gdGhlaXIgZWxtIHJlZmVyZW5jZS4KZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHsKICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKAogICAgdm5vZGUudGFnLAogICAgdm5vZGUuZGF0YSwKICAgIHZub2RlLmNoaWxkcmVuLAogICAgdm5vZGUudGV4dCwKICAgIHZub2RlLmVsbSwKICAgIHZub2RlLmNvbnRleHQsCiAgICB2bm9kZS5jb21wb25lbnRPcHRpb25zLAogICAgdm5vZGUuYXN5bmNGYWN0b3J5CiAgKTsKICBjbG9uZWQubnMgPSB2bm9kZS5uczsKICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYzsKICBjbG9uZWQua2V5ID0gdm5vZGUua2V5OwogIGNsb25lZC5pc0NvbW1lbnQgPSB2bm9kZS5pc0NvbW1lbnQ7CiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDsKICBjbG9uZWQuZm5PcHRpb25zID0gdm5vZGUuZm5PcHRpb25zOwogIGNsb25lZC5mblNjb3BlSWQgPSB2bm9kZS5mblNjb3BlSWQ7CiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTsKICByZXR1cm4gY2xvbmVkCn0KCi8qCiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aAogKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGUKICovCgp2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTsKdmFyIGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90byk7Cgp2YXIgbWV0aG9kc1RvUGF0Y2ggPSBbCiAgJ3B1c2gnLAogICdwb3AnLAogICdzaGlmdCcsCiAgJ3Vuc2hpZnQnLAogICdzcGxpY2UnLAogICdzb3J0JywKICAncmV2ZXJzZScKXTsKCi8qKgogKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHMKICovCm1ldGhvZHNUb1BhdGNoLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZAogIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTsKICBkZWYoYXJyYXlNZXRob2RzLCBtZXRob2QsIGZ1bmN0aW9uIG11dGF0b3IgKCkgewogICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07CgogICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgdmFyIG9iID0gdGhpcy5fX29iX187CiAgICB2YXIgaW5zZXJ0ZWQ7CiAgICBzd2l0Y2ggKG1ldGhvZCkgewogICAgICBjYXNlICdwdXNoJzoKICAgICAgY2FzZSAndW5zaGlmdCc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzOwogICAgICAgIGJyZWFrCiAgICAgIGNhc2UgJ3NwbGljZSc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpOwogICAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfQogICAgLy8gbm90aWZ5IGNoYW5nZQogICAgb2IuZGVwLm5vdGlmeSgpOwogICAgcmV0dXJuIHJlc3VsdAogIH0pOwp9KTsKCi8qICAqLwoKdmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7CgovKioKICogSW4gc29tZSBjYXNlcyB3ZSBtYXkgd2FudCB0byBkaXNhYmxlIG9ic2VydmF0aW9uIGluc2lkZSBhIGNvbXBvbmVudCdzCiAqIHVwZGF0ZSBjb21wdXRhdGlvbi4KICovCnZhciBzaG91bGRPYnNlcnZlID0gdHJ1ZTsKCmZ1bmN0aW9uIHRvZ2dsZU9ic2VydmluZyAodmFsdWUpIHsKICBzaG91bGRPYnNlcnZlID0gdmFsdWU7Cn0KCi8qKgogKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWQKICogb2JqZWN0LiBPbmNlIGF0dGFjaGVkLCB0aGUgb2JzZXJ2ZXIgY29udmVydHMgdGhlIHRhcmdldAogKiBvYmplY3QncyBwcm9wZXJ0eSBrZXlzIGludG8gZ2V0dGVyL3NldHRlcnMgdGhhdAogKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy4KICovCnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkgewogIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB0aGlzLmRlcCA9IG5ldyBEZXAoKTsKICB0aGlzLnZtQ291bnQgPSAwOwogIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpOwogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90bwogICAgICA/IHByb3RvQXVnbWVudAogICAgICA6IGNvcHlBdWdtZW50OwogICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpOwogICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpOwogIH0gZWxzZSB7CiAgICB0aGlzLndhbGsodmFsdWUpOwogIH0KfTsKCi8qKgogKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG8KICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCiAqIHZhbHVlIHR5cGUgaXMgT2JqZWN0LgogKi8KT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBkZWZpbmVSZWFjdGl2ZShvYmosIGtleXNbaV0pOwogIH0KfTsKCi8qKgogKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy4KICovCk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9ic2VydmUoaXRlbXNbaV0pOwogIH0KfTsKCi8vIGhlbHBlcnMKCi8qKgogKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nCiAqIHRoZSBwcm90b3R5cGUgY2hhaW4gdXNpbmcgX19wcm90b19fCiAqLwpmdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7CiAgLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi8KICB0YXJnZXQuX19wcm90b19fID0gc3JjOwogIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi8KfQoKLyoqCiAqIEF1Z21lbnQgYW4gdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZwogKiBoaWRkZW4gcHJvcGVydGllcy4KICovCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmZ1bmN0aW9uIGNvcHlBdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykgewogIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgZGVmKHRhcmdldCwga2V5LCBzcmNba2V5XSk7CiAgfQp9CgovKioKICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsCiAqIHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBpZiBzdWNjZXNzZnVsbHkgb2JzZXJ2ZWQsCiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLgogKi8KZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIGFzUm9vdERhdGEpIHsKICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIG9iOwogIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikgewogICAgb2IgPSB2YWx1ZS5fX29iX187CiAgfSBlbHNlIGlmICgKICAgIHNob3VsZE9ic2VydmUgJiYKICAgICFpc1NlcnZlclJlbmRlcmluZygpICYmCiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpICYmCiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJgogICAgIXZhbHVlLl9pc1Z1ZQogICkgewogICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpOwogIH0KICBpZiAoYXNSb290RGF0YSAmJiBvYikgewogICAgb2Iudm1Db3VudCsrOwogIH0KICByZXR1cm4gb2IKfQoKLyoqCiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC4KICovCmZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlICgKICBvYmosCiAga2V5LAogIHZhbCwKICBjdXN0b21TZXR0ZXIsCiAgc2hhbGxvdwopIHsKICB2YXIgZGVwID0gbmV3IERlcCgpOwoKICB2YXIgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTsKICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkgewogICAgcmV0dXJuCiAgfQoKICAvLyBjYXRlciBmb3IgcHJlLWRlZmluZWQgZ2V0dGVyL3NldHRlcnMKICB2YXIgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0OwogIGlmICghZ2V0dGVyICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgIHZhbCA9IG9ialtrZXldOwogIH0KICB2YXIgc2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuc2V0OwoKICB2YXIgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUodmFsKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHsKICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsKICAgICAgaWYgKERlcC50YXJnZXQpIHsKICAgICAgICBkZXAuZGVwZW5kKCk7CiAgICAgICAgaWYgKGNoaWxkT2IpIHsKICAgICAgICAgIGNoaWxkT2IuZGVwLmRlcGVuZCgpOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlCiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7CiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7CiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7CiAgICAgICAgY3VzdG9tU2V0dGVyKCk7CiAgICAgIH0KICAgICAgaWYgKHNldHRlcikgewogICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWwgPSBuZXdWYWw7CiAgICAgIH0KICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTsKICAgICAgZGVwLm5vdGlmeSgpOwogICAgfQogIH0pOwp9CgovKioKICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kCiAqIHRyaWdnZXJzIGNoYW5nZSBub3RpZmljYXRpb24gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QKICogYWxyZWFkeSBleGlzdC4KICovCmZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbCkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3Qgc2V0IHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5sZW5ndGggPSBNYXRoLm1heCh0YXJnZXQubGVuZ3RoLCBrZXkpOwogICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7CiAgICB0YXJnZXRba2V5XSA9IHZhbDsKICAgIHJldHVybiB2YWwKICB9CiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fOwogIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICdBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICsKICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLicKICAgICk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmICghb2IpIHsKICAgIHRhcmdldFtrZXldID0gdmFsOwogICAgcmV0dXJuIHZhbAogIH0KICBkZWZpbmVSZWFjdGl2ZShvYi52YWx1ZSwga2V5LCB2YWwpOwogIG9iLmRlcC5ub3RpZnkoKTsKICByZXR1cm4gdmFsCn0KCi8qKgogKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5LgogKi8KZnVuY3Rpb24gZGVsICh0YXJnZXQsIGtleSkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3QgZGVsZXRlIHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxKTsKICAgIHJldHVybgogIH0KICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187CiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArCiAgICAgICctIGp1c3Qgc2V0IGl0IHRvIG51bGwuJwogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIHsKICAgIHJldHVybgogIH0KICBkZWxldGUgdGFyZ2V0W2tleV07CiAgaWYgKCFvYikgewogICAgcmV0dXJuCiAgfQogIG9iLmRlcC5ub3RpZnkoKTsKfQoKLyoqCiAqIENvbGxlY3QgZGVwZW5kZW5jaWVzIG9uIGFycmF5IGVsZW1lbnRzIHdoZW4gdGhlIGFycmF5IGlzIHRvdWNoZWQsIHNpbmNlCiAqIHdlIGNhbm5vdCBpbnRlcmNlcHQgYXJyYXkgZWxlbWVudCBhY2Nlc3MgbGlrZSBwcm9wZXJ0eSBnZXR0ZXJzLgogKi8KZnVuY3Rpb24gZGVwZW5kQXJyYXkgKHZhbHVlKSB7CiAgZm9yICh2YXIgZSA9ICh2b2lkIDApLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZSA9IHZhbHVlW2ldOwogICAgZSAmJiBlLl9fb2JfXyAmJiBlLl9fb2JfXy5kZXAuZGVwZW5kKCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICBkZXBlbmRBcnJheShlKTsKICAgIH0KICB9Cn0KCi8qICAqLwoKLyoqCiAqIE9wdGlvbiBvdmVyd3JpdGluZyBzdHJhdGVnaWVzIGFyZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb24KICogdmFsdWUgaW50byB0aGUgZmluYWwgdmFsdWUuCiAqLwp2YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llczsKCi8qKgogKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zCiAqLwp7CiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7CiAgICBpZiAoIXZtKSB7CiAgICAgIHdhcm4oCiAgICAgICAgIm9wdGlvbiBcIiIgKyBrZXkgKyAiXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgIiArCiAgICAgICAgJ2NyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJwogICAgICApOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRTdHJhdChwYXJlbnQsIGNoaWxkKQogIH07Cn0KCi8qKgogKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci4KICovCmZ1bmN0aW9uIG1lcmdlRGF0YSAodG8sIGZyb20pIHsKICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH0KICB2YXIga2V5LCB0b1ZhbCwgZnJvbVZhbDsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyb20pOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAga2V5ID0ga2V5c1tpXTsKICAgIHRvVmFsID0gdG9ba2V5XTsKICAgIGZyb21WYWwgPSBmcm9tW2tleV07CiAgICBpZiAoIWhhc093bih0bywga2V5KSkgewogICAgICBzZXQodG8sIGtleSwgZnJvbVZhbCk7CiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodG9WYWwpICYmIGlzUGxhaW5PYmplY3QoZnJvbVZhbCkpIHsKICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTsKICAgIH0KICB9CiAgcmV0dXJuIHRvCn0KCi8qKgogKiBEYXRhCiAqLwpmdW5jdGlvbiBtZXJnZURhdGFPckZuICgKICBwYXJlbnRWYWwsCiAgY2hpbGRWYWwsCiAgdm0KKSB7CiAgaWYgKCF2bSkgewogICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnMKICAgIGlmICghY2hpbGRWYWwpIHsKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgaWYgKCFwYXJlbnRWYWwpIHsKICAgICAgcmV0dXJuIGNoaWxkVmFsCiAgICB9CiAgICAvLyB3aGVuIHBhcmVudFZhbCAmIGNoaWxkVmFsIGFyZSBib3RoIHByZXNlbnQsCiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0bwogICAgLy8gY2hlY2sgaWYgcGFyZW50VmFsIGlzIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlCiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy4KICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkgewogICAgICByZXR1cm4gbWVyZ2VEYXRhKAogICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCwKICAgICAgICB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nID8gcGFyZW50VmFsLmNhbGwodGhpcywgdGhpcykgOiBwYXJlbnRWYWwKICAgICAgKQogICAgfQogIH0gZWxzZSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkSW5zdGFuY2VEYXRhRm4gKCkgewogICAgICAvLyBpbnN0YW5jZSBtZXJnZQogICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBjaGlsZFZhbC5jYWxsKHZtLCB2bSkKICAgICAgICA6IGNoaWxkVmFsOwogICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSwgdm0pCiAgICAgICAgOiBwYXJlbnRWYWw7CiAgICAgIGlmIChpbnN0YW5jZURhdGEpIHsKICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRhCiAgICAgIH0KICAgIH0KICB9Cn0KCnN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bQopIHsKICBpZiAoIXZtKSB7CiAgICBpZiAoY2hpbGRWYWwgJiYgdHlwZW9mIGNoaWxkVmFsICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdUaGUgImRhdGEiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICsKICAgICAgICAndGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCAnICsKICAgICAgICAnZGVmaW5pdGlvbnMuJywKICAgICAgICB2bQogICAgICApOwoKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCkKICB9CgogIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKQp9OwoKLyoqCiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy4KICovCmZ1bmN0aW9uIG1lcmdlSG9vayAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsCikgewogIHJldHVybiBjaGlsZFZhbAogICAgPyBwYXJlbnRWYWwKICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKQogICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpCiAgICAgICAgPyBjaGlsZFZhbAogICAgICAgIDogW2NoaWxkVmFsXQogICAgOiBwYXJlbnRWYWwKfQoKTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHsKICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7Cn0pOwoKLyoqCiAqIEFzc2V0cwogKgogKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvCiAqIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gY29uc3RydWN0b3Igb3B0aW9ucywgaW5zdGFuY2UKICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuCiAqLwpmdW5jdGlvbiBtZXJnZUFzc2V0cyAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICB2YXIgcmVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCk7CiAgaWYgKGNoaWxkVmFsKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgICByZXR1cm4gZXh0ZW5kKHJlcywgY2hpbGRWYWwpCiAgfSBlbHNlIHsKICAgIHJldHVybiByZXMKICB9Cn0KCkFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0czsKfSk7CgovKioKICogV2F0Y2hlcnMuCiAqCiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmUKICogYW5vdGhlciwgc28gd2UgbWVyZ2UgdGhlbSBhcyBhcnJheXMuCiAqLwpzdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLgogIGlmIChwYXJlbnRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IHBhcmVudFZhbCA9IHVuZGVmaW5lZDsgfQogIGlmIChjaGlsZFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgY2hpbGRWYWwgPSB1bmRlZmluZWQ7IH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKSB9CiAgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IHt9OwogIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7CiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHsKICAgIHZhciBwYXJlbnQgPSByZXRba2V5JDFdOwogICAgdmFyIGNoaWxkID0gY2hpbGRWYWxba2V5JDFdOwogICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7CiAgICAgIHBhcmVudCA9IFtwYXJlbnRdOwogICAgfQogICAgcmV0W2tleSQxXSA9IHBhcmVudAogICAgICA/IHBhcmVudC5jb25jYXQoY2hpbGQpCiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07CiAgfQogIHJldHVybiByZXQKfTsKCi8qKgogKiBPdGhlciBvYmplY3QgaGFzaGVzLgogKi8Kc3RyYXRzLnByb3BzID0Kc3RyYXRzLm1ldGhvZHMgPQpzdHJhdHMuaW5qZWN0ID0Kc3RyYXRzLmNvbXB1dGVkID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bSwKICBrZXkKKSB7CiAgaWYgKGNoaWxkVmFsICYmICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTsKICBpZiAoY2hpbGRWYWwpIHsgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOyB9CiAgcmV0dXJuIHJldAp9OwpzdHJhdHMucHJvdmlkZSA9IG1lcmdlRGF0YU9yRm47CgovKioKICogRGVmYXVsdCBzdHJhdGVneS4KICovCnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkgewogIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkCiAgICA/IHBhcmVudFZhbAogICAgOiBjaGlsZFZhbAp9OwoKLyoqCiAqIFZhbGlkYXRlIGNvbXBvbmVudCBuYW1lcwogKi8KZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7CiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykgewogICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7CiAgfQp9CgpmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUgKG5hbWUpIHsKICBpZiAoIS9eW2EtekEtWl1bXHctXSokLy50ZXN0KG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogIicgKyBuYW1lICsgJyIuIENvbXBvbmVudCBuYW1lcyAnICsKICAgICAgJ2NhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHRoZSBoeXBoZW4sICcgKwogICAgICAnYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci4nCiAgICApOwogIH0KICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCAnICsKICAgICAgJ2lkOiAnICsgbmFtZQogICAgKTsKICB9Cn0KCi8qKgogKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGUKICogT2JqZWN0LWJhc2VkIGZvcm1hdC4KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkgewogIHZhciBwcm9wcyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKCFwcm9wcykgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICB2YXIgaSwgdmFsLCBuYW1lOwogIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgewogICAgaSA9IHByb3BzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdmFsID0gcHJvcHNbaV07CiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgICAgIG5hbWUgPSBjYW1lbGl6ZSh2YWwpOwogICAgICAgIHJlc1tuYW1lXSA9IHsgdHlwZTogbnVsbCB9OwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oJ3Byb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4nKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgICB2YWwgPSBwcm9wc1trZXldOwogICAgICBuYW1lID0gY2FtZWxpemUoa2V5KTsKICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpCiAgICAgICAgPyB2YWwKICAgICAgICA6IHsgdHlwZTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJwcm9wc1wiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsICIgKwogICAgICAiYnV0IGdvdCAiICsgKHRvUmF3VHlwZShwcm9wcykpICsgIi4iLAogICAgICB2bQogICAgKTsKICB9CiAgb3B0aW9ucy5wcm9wcyA9IHJlczsKfQoKLyoqCiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXQKICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdCAob3B0aW9ucywgdm0pIHsKICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7CiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH0KICB2YXIgbm9ybWFsaXplZCA9IG9wdGlvbnMuaW5qZWN0ID0ge307CiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHsKICAgICAgbm9ybWFsaXplZFtpbmplY3RbaV1dID0geyBmcm9tOiBpbmplY3RbaV0gfTsKICAgIH0KICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkgewogICAgZm9yICh2YXIga2V5IGluIGluamVjdCkgewogICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07CiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKQogICAgICAgID8gZXh0ZW5kKHsgZnJvbToga2V5IH0sIHZhbCkKICAgICAgICA6IHsgZnJvbTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJpbmplY3RcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUoaW5qZWN0KSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogIH0KfQoKLyoqCiAqIE5vcm1hbGl6ZSByYXcgZnVuY3Rpb24gZGlyZWN0aXZlcyBpbnRvIG9iamVjdCBmb3JtYXQuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7CiAgdmFyIGRpcnMgPSBvcHRpb25zLmRpcmVjdGl2ZXM7CiAgaWYgKGRpcnMpIHsKICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7CiAgICAgIHZhciBkZWYgPSBkaXJzW2tleV07CiAgICAgIGlmICh0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkgewogIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsgbmFtZSArICJcIjogZXhwZWN0ZWQgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUodmFsdWUpKSArICIuIiwKICAgICAgdm0KICAgICk7CiAgfQp9CgovKioKICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLgogKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLgogKi8KZnVuY3Rpb24gbWVyZ2VPcHRpb25zICgKICBwYXJlbnQsCiAgY2hpbGQsCiAgdm0KKSB7CiAgewogICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTsKICB9CgogIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHsKICAgIGNoaWxkID0gY2hpbGQub3B0aW9uczsKICB9CgogIG5vcm1hbGl6ZVByb3BzKGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7CiAgdmFyIGV4dGVuZHNGcm9tID0gY2hpbGQuZXh0ZW5kczsKICBpZiAoZXh0ZW5kc0Zyb20pIHsKICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGV4dGVuZHNGcm9tLCB2bSk7CiAgfQogIGlmIChjaGlsZC5taXhpbnMpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTsKICAgIH0KICB9CiAgdmFyIG9wdGlvbnMgPSB7fTsKICB2YXIga2V5OwogIGZvciAoa2V5IGluIHBhcmVudCkgewogICAgbWVyZ2VGaWVsZChrZXkpOwogIH0KICBmb3IgKGtleSBpbiBjaGlsZCkgewogICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7CiAgICAgIG1lcmdlRmllbGQoa2V5KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7CiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7CiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7CiAgfQogIHJldHVybiBvcHRpb25zCn0KCi8qKgogKiBSZXNvbHZlIGFuIGFzc2V0LgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3MKICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLgogKi8KZnVuY3Rpb24gcmVzb2x2ZUFzc2V0ICgKICBvcHRpb25zLAogIHR5cGUsCiAgaWQsCiAgd2Fybk1pc3NpbmcKKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHsKICAgIHJldHVybgogIH0KICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTsKICAvLyBjaGVjayBsb2NhbCByZWdpc3RyYXRpb24gdmFyaWF0aW9ucyBmaXJzdAogIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfQogIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTsKICBpZiAoaGFzT3duKGFzc2V0cywgY2FtZWxpemVkSWQpKSB7IHJldHVybiBhc3NldHNbY2FtZWxpemVkSWRdIH0KICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7CiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH0KICAvLyBmYWxsYmFjayB0byBwcm90b3R5cGUgY2hhaW4KICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykgewogICAgd2FybigKICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCwKICAgICAgb3B0aW9ucwogICAgKTsKICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIHZhbGlkYXRlUHJvcCAoCiAga2V5LAogIHByb3BPcHRpb25zLAogIHByb3BzRGF0YSwKICB2bQopIHsKICB2YXIgcHJvcCA9IHByb3BPcHRpb25zW2tleV07CiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpOwogIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldOwogIC8vIGJvb2xlYW4gY2FzdGluZwogIHZhciBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTsKICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHsKICAgIGlmIChhYnNlbnQgJiYgIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7CiAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHsKICAgICAgLy8gb25seSBjYXN0IGVtcHR5IHN0cmluZyAvIHNhbWUgbmFtZSB0byBib29sZWFuIGlmCiAgICAgIC8vIGJvb2xlYW4gaGFzIGhpZ2hlciBwcmlvcml0eQogICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpOwogICAgICBpZiAoc3RyaW5nSW5kZXggPCAwIHx8IGJvb2xlYW5JbmRleCA8IHN0cmluZ0luZGV4KSB7CiAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQogIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUKICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpOwogICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LAogICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuCiAgICB2YXIgcHJldlNob3VsZE9ic2VydmUgPSBzaG91bGRPYnNlcnZlOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogICAgb2JzZXJ2ZSh2YWx1ZSk7CiAgICB0b2dnbGVPYnNlcnZpbmcocHJldlNob3VsZE9ic2VydmUpOwogIH0KICB7CiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpOwogIH0KICByZXR1cm4gdmFsdWUKfQoKLyoqCiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuCiAqLwpmdW5jdGlvbiBnZXRQcm9wRGVmYXVsdFZhbHVlICh2bSwgcHJvcCwga2V5KSB7CiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZAogIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHsKICAgIHJldHVybiB1bmRlZmluZWQKICB9CiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDsKICAvLyB3YXJuIGFnYWluc3Qgbm9uLWZhY3RvcnkgZGVmYXVsdHMgZm9yIE9iamVjdCAmIEFycmF5CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wICInICsga2V5ICsgJyI6ICcgKwogICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArCiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJywKICAgICAgdm0KICAgICk7CiAgfQogIC8vIHRoZSByYXcgcHJvcCB2YWx1ZSB3YXMgYWxzbyB1bmRlZmluZWQgZnJvbSBwcmV2aW91cyByZW5kZXIsCiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyCiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJgogICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhW2tleV0gPT09IHVuZGVmaW5lZCAmJgogICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZAogICkgewogICAgcmV0dXJuIHZtLl9wcm9wc1trZXldCiAgfQogIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzCiAgLy8gYSB2YWx1ZSBpcyBGdW5jdGlvbiBpZiBpdHMgcHJvdG90eXBlIGlzIGZ1bmN0aW9uIGV2ZW4gYWNyb3NzIGRpZmZlcmVudCBleGVjdXRpb24gY29udGV4dAogIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJwogICAgPyBkZWYuY2FsbCh2bSkKICAgIDogZGVmCn0KCi8qKgogKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuCiAqLwpmdW5jdGlvbiBhc3NlcnRQcm9wICgKICBwcm9wLAogIG5hbWUsCiAgdmFsdWUsCiAgdm0sCiAgYWJzZW50CikgewogIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkgewogICAgd2FybigKICAgICAgJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogIicgKyBuYW1lICsgJyInLAogICAgICB2bQogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkgewogICAgcmV0dXJuCiAgfQogIHZhciB0eXBlID0gcHJvcC50eXBlOwogIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7CiAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTsKICBpZiAodHlwZSkgewogICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7CiAgICAgIHR5cGUgPSBbdHlwZV07CiAgICB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7CiAgICAgIHZhciBhc3NlcnRlZFR5cGUgPSBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlW2ldKTsKICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpOwogICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDsKICAgIH0KICB9CiAgaWYgKCF2YWxpZCkgewogICAgd2FybigKICAgICAgIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIiICsgbmFtZSArICJcIi4iICsKICAgICAgIiBFeHBlY3RlZCAiICsgKGV4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oJywgJykpICsKICAgICAgIiwgZ290ICIgKyAodG9SYXdUeXBlKHZhbHVlKSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjsKICBpZiAodmFsaWRhdG9yKSB7CiAgICBpZiAoIXZhbGlkYXRvcih2YWx1ZSkpIHsKICAgICAgd2FybigKICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJyArIG5hbWUgKyAnIi4nLAogICAgICAgIHZtCiAgICAgICk7CiAgICB9CiAgfQp9Cgp2YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87CgpmdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkgewogIHZhciB2YWxpZDsKICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTsKICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTsKICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzCiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlOwogICAgfQogIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0JykgewogICAgdmFsaWQgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTsKICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5JykgewogICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTsKICB9IGVsc2UgewogICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7CiAgfQogIHJldHVybiB7CiAgICB2YWxpZDogdmFsaWQsCiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZQogIH0KfQoKLyoqCiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcywKICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nCiAqIGFjcm9zcyBkaWZmZXJlbnQgdm1zIC8gaWZyYW1lcy4KICovCmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7CiAgdmFyIG1hdGNoID0gZm4gJiYgZm4udG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7CiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJwp9CgpmdW5jdGlvbiBpc1NhbWVUeXBlIChhLCBiKSB7CiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYikKfQoKZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7CiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMQogIH0KICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgaWYgKGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlc1tpXSwgdHlwZSkpIHsKICAgICAgcmV0dXJuIGkKICAgIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qICAqLwoKZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAodm0pIHsKICAgIHZhciBjdXIgPSB2bTsKICAgIHdoaWxlICgoY3VyID0gY3VyLiRwYXJlbnQpKSB7CiAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkOwogICAgICBpZiAoaG9va3MpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7CiAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7IHJldHVybiB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKQogICAgfSBjYXRjaCAoZSkgewogICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpOwogICAgfQogIH0KICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICB7CiAgICB3YXJuKCgiRXJyb3IgaW4gIiArIGluZm8gKyAiOiBcIiIgKyAoZXJyLnRvU3RyaW5nKCkpICsgIlwiIiksIHZtKTsKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAoKGluQnJvd3NlciB8fCBpbldlZXgpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgewogICAgY29uc29sZS5lcnJvcihlcnIpOwogIH0gZWxzZSB7CiAgICB0aHJvdyBlcnIKICB9Cn0KCi8qICAqLwovKiBnbG9iYWxzIE1lc3NhZ2VDaGFubmVsICovCgp2YXIgY2FsbGJhY2tzID0gW107CnZhciBwZW5kaW5nID0gZmFsc2U7CgpmdW5jdGlvbiBmbHVzaENhbGxiYWNrcyAoKSB7CiAgcGVuZGluZyA9IGZhbHNlOwogIHZhciBjb3BpZXMgPSBjYWxsYmFja3Muc2xpY2UoMCk7CiAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHsKICAgIGNvcGllc1tpXSgpOwogIH0KfQoKLy8gSGVyZSB3ZSBoYXZlIGFzeW5jIGRlZmVycmluZyB3cmFwcGVycyB1c2luZyBib3RoIG1pY3JvdGFza3MgYW5kIChtYWNybykgdGFza3MuCi8vIEluIDwgMi40IHdlIHVzZWQgbWljcm90YXNrcyBldmVyeXdoZXJlLCBidXQgdGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZXJlCi8vIG1pY3JvdGFza3MgaGF2ZSB0b28gaGlnaCBhIHByaW9yaXR5IGFuZCBmaXJlIGluIGJldHdlZW4gc3VwcG9zZWRseQovLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTApIG9yIGV2ZW4gYmV0d2VlbiBidWJibGluZyBvZiB0aGUgc2FtZQovLyBldmVudCAoIzY1NjYpLiBIb3dldmVyLCB1c2luZyAobWFjcm8pIHRhc2tzIGV2ZXJ5d2hlcmUgYWxzbyBoYXMgc3VidGxlIHByb2JsZW1zCi8vIHdoZW4gc3RhdGUgaXMgY2hhbmdlZCByaWdodCBiZWZvcmUgcmVwYWludCAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS4KLy8gSGVyZSB3ZSB1c2UgbWljcm90YXNrIGJ5IGRlZmF1bHQsIGJ1dCBleHBvc2UgYSB3YXkgdG8gZm9yY2UgKG1hY3JvKSB0YXNrIHdoZW4KLy8gbmVlZGVkIChlLmcuIGluIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIGJ5IHYtb24pLgp2YXIgbWljcm9UaW1lckZ1bmM7CnZhciBtYWNyb1RpbWVyRnVuYzsKdmFyIHVzZU1hY3JvVGFzayA9IGZhbHNlOwoKLy8gRGV0ZXJtaW5lIChtYWNybykgdGFzayBkZWZlciBpbXBsZW1lbnRhdGlvbi4KLy8gVGVjaG5pY2FsbHkgc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBidXQgaXQncyBvbmx5IGF2YWlsYWJsZQovLyBpbiBJRS4gVGhlIG9ubHkgcG9seWZpbGwgdGhhdCBjb25zaXN0ZW50bHkgcXVldWVzIHRoZSBjYWxsYmFjayBhZnRlciBhbGwgRE9NCi8vIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIHNhbWUgbG9vcCBpcyBieSB1c2luZyBNZXNzYWdlQ2hhbm5lbC4KLyogaXN0YW5idWwgaWdub3JlIGlmICovCmlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShzZXRJbW1lZGlhdGUpKSB7CiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpOwogIH07Cn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJyAmJiAoCiAgaXNOYXRpdmUoTWVzc2FnZUNoYW5uZWwpIHx8CiAgLy8gUGhhbnRvbUpTCiAgTWVzc2FnZUNoYW5uZWwudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgTWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvcl0nCikpIHsKICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjsKICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoQ2FsbGJhY2tzOwogIG1hY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcG9ydC5wb3N0TWVzc2FnZSgxKTsKICB9Owp9IGVsc2UgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRUaW1lb3V0KGZsdXNoQ2FsbGJhY2tzLCAwKTsKICB9Owp9CgovLyBEZXRlcm1pbmUgbWljcm90YXNrIGRlZmVyIGltcGxlbWVudGF0aW9uLgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovCmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHsKICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpOwogIG1pY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcC50aGVuKGZsdXNoQ2FsbGJhY2tzKTsKICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dAogICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlCiAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYnV0IHRoZSBxdWV1ZSBpc24ndCBiZWluZyBmbHVzaGVkLCB1bnRpbCB0aGUgYnJvd3NlcgogICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuCiAgICAvLyAiZm9yY2UiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuCiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfQogIH07Cn0gZWxzZSB7CiAgLy8gZmFsbGJhY2sgdG8gbWFjcm8KICBtaWNyb1RpbWVyRnVuYyA9IG1hY3JvVGltZXJGdW5jOwp9CgovKioKICogV3JhcCBhIGZ1bmN0aW9uIHNvIHRoYXQgaWYgYW55IGNvZGUgaW5zaWRlIHRyaWdnZXJzIHN0YXRlIGNoYW5nZSwKICogdGhlIGNoYW5nZXMgYXJlIHF1ZXVlZCB1c2luZyBhIChtYWNybykgdGFzayBpbnN0ZWFkIG9mIGEgbWljcm90YXNrLgogKi8KZnVuY3Rpb24gd2l0aE1hY3JvVGFzayAoZm4pIHsKICByZXR1cm4gZm4uX3dpdGhUYXNrIHx8IChmbi5fd2l0aFRhc2sgPSBmdW5jdGlvbiAoKSB7CiAgICB1c2VNYWNyb1Rhc2sgPSB0cnVlOwogICAgdmFyIHJlcyA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB1c2VNYWNyb1Rhc2sgPSBmYWxzZTsKICAgIHJldHVybiByZXMKICB9KQp9CgpmdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkgewogIHZhciBfcmVzb2x2ZTsKICBjYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7CiAgICBpZiAoY2IpIHsKICAgICAgdHJ5IHsKICAgICAgICBjYi5jYWxsKGN0eCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7CiAgICAgIF9yZXNvbHZlKGN0eCk7CiAgICB9CiAgfSk7CiAgaWYgKCFwZW5kaW5nKSB7CiAgICBwZW5kaW5nID0gdHJ1ZTsKICAgIGlmICh1c2VNYWNyb1Rhc2spIHsKICAgICAgbWFjcm9UaW1lckZ1bmMoKTsKICAgIH0gZWxzZSB7CiAgICAgIG1pY3JvVGltZXJGdW5jKCk7CiAgICB9CiAgfQogIC8vICRmbG93LWRpc2FibGUtbGluZQogIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgX3Jlc29sdmUgPSByZXNvbHZlOwogICAgfSkKICB9Cn0KCi8qICAqLwoKdmFyIG1hcms7CnZhciBtZWFzdXJlOwoKewogIHZhciBwZXJmID0gaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoCiAgICBwZXJmICYmCiAgICBwZXJmLm1hcmsgJiYKICAgIHBlcmYubWVhc3VyZSAmJgogICAgcGVyZi5jbGVhck1hcmtzICYmCiAgICBwZXJmLmNsZWFyTWVhc3VyZXMKICApIHsKICAgIG1hcmsgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiBwZXJmLm1hcmsodGFnKTsgfTsKICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykgewogICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpOwogICAgICBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSk7CiAgICB9OwogIH0KfQoKLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovCgp2YXIgaW5pdFByb3h5OwoKewogIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoCiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICsKICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICsKICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArCiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeQogICk7CgogIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgewogICAgd2FybigKICAgICAgIlByb3BlcnR5IG9yIG1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCAiICsKICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArCiAgICAgICdlaXRoZXIgaW4gdGhlIGRhdGEgb3B0aW9uLCBvciBmb3IgY2xhc3MtYmFzZWQgY29tcG9uZW50cywgYnkgJyArCiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICsKICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsCiAgICAgIHRhcmdldAogICAgKTsKICB9OwoKICB2YXIgaGFzUHJveHkgPQogICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7CgogIGlmIChoYXNQcm94eSkgewogICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpOwogICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2RlcywgewogICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7CiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHsKICAgICAgICAgIHdhcm4oKCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC4iICsga2V5KSk7CiAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZhciBoYXNIYW5kbGVyID0gewogICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7CiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0OwogICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fCBrZXkuY2hhckF0KDApID09PSAnXyc7CiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkCiAgICB9CiAgfTsKCiAgdmFyIGdldEhhbmRsZXIgPSB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHsKICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldFtrZXldCiAgICB9CiAgfTsKCiAgaW5pdFByb3h5ID0gZnVuY3Rpb24gaW5pdFByb3h5ICh2bSkgewogICAgaWYgKGhhc1Byb3h5KSB7CiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZQogICAgICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogICAgICB2YXIgaGFuZGxlcnMgPSBvcHRpb25zLnJlbmRlciAmJiBvcHRpb25zLnJlbmRlci5fd2l0aFN0cmlwcGVkCiAgICAgICAgPyBnZXRIYW5kbGVyCiAgICAgICAgOiBoYXNIYW5kbGVyOwogICAgICB2bS5fcmVuZGVyUHJveHkgPSBuZXcgUHJveHkodm0sIGhhbmRsZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtOwogICAgfQogIH07Cn0KCi8qICAqLwoKdmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTsKCi8qKgogKiBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZAogKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdAogKiBpcyBjb2xsZWN0ZWQgYXMgYSAiZGVlcCIgZGVwZW5kZW5jeS4KICovCmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHsKICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7CiAgc2Vlbk9iamVjdHMuY2xlYXIoKTsKfQoKZnVuY3Rpb24gX3RyYXZlcnNlICh2YWwsIHNlZW4pIHsKICB2YXIgaSwga2V5czsKICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpOwogIGlmICgoIWlzQSAmJiAhaXNPYmplY3QodmFsKSkgfHwgT2JqZWN0LmlzRnJvemVuKHZhbCkgfHwgdmFsIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybgogIH0KICBpZiAodmFsLl9fb2JfXykgewogICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7CiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7CiAgICAgIHJldHVybgogICAgfQogICAgc2Vlbi5hZGQoZGVwSWQpOwogIH0KICBpZiAoaXNBKSB7CiAgICBpID0gdmFsLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtpXSwgc2Vlbik7IH0KICB9IGVsc2UgewogICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7CiAgICBpID0ga2V5cy5sZW5ndGg7CiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9CiAgfQp9CgovKiAgKi8KCnZhciBub3JtYWxpemVFdmVudCA9IGNhY2hlZChmdW5jdGlvbiAobmFtZSkgewogIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJzsKICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lOwogIHZhciBvbmNlJCQxID0gbmFtZS5jaGFyQXQoMCkgPT09ICd+JzsgLy8gUHJlZml4ZWQgbGFzdCwgY2hlY2tlZCBmaXJzdAogIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnOwogIG5hbWUgPSBjYXB0dXJlID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgcmV0dXJuIHsKICAgIG5hbWU6IG5hbWUsCiAgICBvbmNlOiBvbmNlJCQxLAogICAgY2FwdHVyZTogY2FwdHVyZSwKICAgIHBhc3NpdmU6IHBhc3NpdmUKICB9Cn0pOwoKZnVuY3Rpb24gY3JlYXRlRm5JbnZva2VyIChmbnMpIHsKICBmdW5jdGlvbiBpbnZva2VyICgpIHsKICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50czsKCiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7CiAgICAgIHZhciBjbG9uZWQgPSBmbnMuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVycwogICAgICByZXR1cm4gZm5zLmFwcGx5KG51bGwsIGFyZ3VtZW50cykKICAgIH0KICB9CiAgaW52b2tlci5mbnMgPSBmbnM7CiAgcmV0dXJuIGludm9rZXIKfQoKZnVuY3Rpb24gdXBkYXRlTGlzdGVuZXJzICgKICBvbiwKICBvbGRPbiwKICBhZGQsCiAgcmVtb3ZlJCQxLAogIHZtCikgewogIHZhciBuYW1lLCBkZWYsIGN1ciwgb2xkLCBldmVudDsKICBmb3IgKG5hbWUgaW4gb24pIHsKICAgIGRlZiA9IGN1ciA9IG9uW25hbWVdOwogICAgb2xkID0gb2xkT25bbmFtZV07CiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNVbmRlZihjdXIpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50IFwiIiArIChldmVudC5uYW1lKSArICJcIjogZ290ICIgKyBTdHJpbmcoY3VyKSwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHsKICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHsKICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZUZuSW52b2tlcihjdXIpOwogICAgICB9CiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50Lm9uY2UsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7CiAgICAgIG9sZC5mbnMgPSBjdXI7CiAgICAgIG9uW25hbWVdID0gb2xkOwogICAgfQogIH0KICBmb3IgKG5hbWUgaW4gb2xkT24pIHsKICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkgewogICAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpOwogICAgfQogIH0KfQoKLyogICovCgpmdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7CiAgaWYgKGRlZiBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pOwogIH0KICB2YXIgaW52b2tlcjsKICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTsKCiAgZnVuY3Rpb24gd3JhcHBlZEhvb2sgKCkgewogICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgLy8gaW1wb3J0YW50OiByZW1vdmUgbWVyZ2VkIGhvb2sgdG8gZW5zdXJlIGl0J3MgY2FsbGVkIG9ubHkgb25jZQogICAgLy8gYW5kIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spOwogIH0KCiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHsKICAgIC8vIG5vIGV4aXN0aW5nIGhvb2sKICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW3dyYXBwZWRIb29rXSk7CiAgfSBlbHNlIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKGlzRGVmKG9sZEhvb2suZm5zKSAmJiBpc1RydWUob2xkSG9vay5tZXJnZWQpKSB7CiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlcgogICAgICBpbnZva2VyID0gb2xkSG9vazsKICAgICAgaW52b2tlci5mbnMucHVzaCh3cmFwcGVkSG9vayk7CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBwbGFpbiBob29rCiAgICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW29sZEhvb2ssIHdyYXBwZWRIb29rXSk7CiAgICB9CiAgfQoKICBpbnZva2VyLm1lcmdlZCA9IHRydWU7CiAgZGVmW2hvb2tLZXldID0gaW52b2tlcjsKfQoKLyogICovCgpmdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhICgKICBkYXRhLAogIEN0b3IsCiAgdGFnCikgewogIC8vIHdlIGFyZSBvbmx5IGV4dHJhY3RpbmcgcmF3IHZhbHVlcyBoZXJlLgogIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZAogIC8vIGNvbXBvbmVudCBpdHNlbGYuCiAgdmFyIHByb3BPcHRpb25zID0gQ3Rvci5vcHRpb25zLnByb3BzOwogIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkgewogICAgcmV0dXJuCiAgfQogIHZhciByZXMgPSB7fTsKICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzOwogIHZhciBwcm9wcyA9IGRhdGEucHJvcHM7CiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykgewogICAgICB2YXIgYWx0S2V5ID0gaHlwaGVuYXRlKGtleSk7CiAgICAgIHsKICAgICAgICB2YXIga2V5SW5Mb3dlckNhc2UgPSBrZXkudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoCiAgICAgICAgICBrZXkgIT09IGtleUluTG93ZXJDYXNlICYmCiAgICAgICAgICBhdHRycyAmJiBoYXNPd24oYXR0cnMsIGtleUluTG93ZXJDYXNlKQogICAgICAgICkgewogICAgICAgICAgdGlwKAogICAgICAgICAgICAiUHJvcCBcIiIgKyBrZXlJbkxvd2VyQ2FzZSArICJcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50ICIgKwogICAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh0YWcgfHwgQ3RvcikpICsgIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXMiICsKICAgICAgICAgICAgIiBcIiIgKyBrZXkgKyAiXCIuICIgKwogICAgICAgICAgICAiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCAiICsKICAgICAgICAgICAgInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gIiArCiAgICAgICAgICAgICJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFwiIiArIGFsdEtleSArICJcIiBpbnN0ZWFkIG9mIFwiIiArIGtleSArICJcIi4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGVja1Byb3AocmVzLCBwcm9wcywga2V5LCBhbHRLZXksIHRydWUpIHx8CiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrUHJvcCAoCiAgcmVzLAogIGhhc2gsCiAga2V5LAogIGFsdEtleSwKICBwcmVzZXJ2ZQopIHsKICBpZiAoaXNEZWYoaGFzaCkpIHsKICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkgewogICAgICByZXNba2V5XSA9IGhhc2hba2V5XTsKICAgICAgaWYgKCFwcmVzZXJ2ZSkgewogICAgICAgIGRlbGV0ZSBoYXNoW2tleV07CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWUKICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHsKICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07CiAgICAgIGlmICghcHJlc2VydmUpIHsKICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQogIHJldHVybiBmYWxzZQp9CgovKiAgKi8KCi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieQovLyBzdGF0aWNhbGx5IGFuYWx5emluZyB0aGUgdGVtcGxhdGUgYXQgY29tcGlsZSB0aW1lLgovLwovLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZQovLyBnZW5lcmF0ZWQgcmVuZGVyIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIEFycmF5PFZOb2RlPi4gVGhlcmUgYXJlCi8vIHR3byBjYXNlcyB3aGVyZSBleHRyYSBub3JtYWxpemF0aW9uIGlzIG5lZWRlZDoKCi8vIDEuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbXBvbmVudHMgLSBiZWNhdXNlIGEgZnVuY3Rpb25hbCBjb21wb25lbnQKLy8gbWF5IHJldHVybiBhbiBBcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJvb3QuIEluIHRoaXMgY2FzZSwganVzdCBhIHNpbXBsZQovLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGUKLy8gdGhpbmcgd2l0aCBBcnJheS5wcm90b3R5cGUuY29uY2F0LiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9ubHkgMS1sZXZlbCBkZWVwCi8vIGJlY2F1c2UgZnVuY3Rpb25hbCBjb21wb25lbnRzIGFscmVhZHkgbm9ybWFsaXplIHRoZWlyIG93biBjaGlsZHJlbi4KZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW5baV0pKSB7CiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbikKICAgIH0KICB9CiAgcmV0dXJuIGNoaWxkcmVuCn0KCi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsCi8vIGUuZy4gPHRlbXBsYXRlPiwgPHNsb3Q+LCB2LWZvciwgb3Igd2hlbiB0aGUgY2hpbGRyZW4gaXMgcHJvdmlkZWQgYnkgdXNlcgovLyB3aXRoIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zIC8gSlNYLiBJbiBzdWNoIGNhc2VzIGEgZnVsbCBub3JtYWxpemF0aW9uCi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLgpmdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbiAoY2hpbGRyZW4pIHsKICByZXR1cm4gaXNQcmltaXRpdmUoY2hpbGRyZW4pCiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXQogICAgOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKQogICAgICA/IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oY2hpbGRyZW4pCiAgICAgIDogdW5kZWZpbmVkCn0KCmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHsKICByZXR1cm4gaXNEZWYobm9kZSkgJiYgaXNEZWYobm9kZS50ZXh0KSAmJiBpc0ZhbHNlKG5vZGUuaXNDb21tZW50KQp9CgpmdW5jdGlvbiBub3JtYWxpemVBcnJheUNoaWxkcmVuIChjaGlsZHJlbiwgbmVzdGVkSW5kZXgpIHsKICB2YXIgcmVzID0gW107CiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDsKICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgIGMgPSBjaGlsZHJlbltpXTsKICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfQogICAgbGFzdEluZGV4ID0gcmVzLmxlbmd0aCAtIDE7CiAgICBsYXN0ID0gcmVzW2xhc3RJbmRleF07CiAgICAvLyAgbmVzdGVkCiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgewogICAgICBpZiAoYy5sZW5ndGggPiAwKSB7CiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyAiXyIgKyBpKSk7CiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcwogICAgICAgIGlmIChpc1RleHROb2RlKGNbMF0pICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIChjWzBdKS50ZXh0KTsKICAgICAgICAgIGMuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBjKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZShjKSkgewogICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkgewogICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMKICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgU1NSIGh5ZHJhdGlvbiBiZWNhdXNlIHRleHQgbm9kZXMgYXJlCiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7CiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHsKICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0byB2bm9kZQogICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBkZWZhdWx0IGtleSBmb3IgbmVzdGVkIGFycmF5IGNoaWxkcmVuIChsaWtlbHkgZ2VuZXJhdGVkIGJ5IHYtZm9yKQogICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmCiAgICAgICAgICBpc0RlZihjLnRhZykgJiYKICAgICAgICAgIGlzVW5kZWYoYy5rZXkpICYmCiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHsKICAgICAgICAgIGMua2V5ID0gIl9fdmxpc3QiICsgbmVzdGVkSW5kZXggKyAiXyIgKyBpICsgIl9fIjsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2goYyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIGVuc3VyZUN0b3IgKGNvbXAsIGJhc2UpIHsKICBpZiAoCiAgICBjb21wLl9fZXNNb2R1bGUgfHwKICAgIChoYXNTeW1ib2wgJiYgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJykKICApIHsKICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7CiAgfQogIHJldHVybiBpc09iamVjdChjb21wKQogICAgPyBiYXNlLmV4dGVuZChjb21wKQogICAgOiBjb21wCn0KCmZ1bmN0aW9uIGNyZWF0ZUFzeW5jUGxhY2Vob2xkZXIgKAogIGZhY3RvcnksCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7CiAgbm9kZS5hc3luY01ldGEgPSB7IGRhdGE6IGRhdGEsIGNvbnRleHQ6IGNvbnRleHQsIGNoaWxkcmVuOiBjaGlsZHJlbiwgdGFnOiB0YWcgfTsKICByZXR1cm4gbm9kZQp9CgpmdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKAogIGZhY3RvcnksCiAgYmFzZUN0b3IsCiAgY29udGV4dAopIHsKICBpZiAoaXNUcnVlKGZhY3RvcnkuZXJyb3IpICYmIGlzRGVmKGZhY3RvcnkuZXJyb3JDb21wKSkgewogICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHsKICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkCiAgfQoKICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHsKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5jb250ZXh0cykpIHsKICAgIC8vIGFscmVhZHkgcGVuZGluZwogICAgZmFjdG9yeS5jb250ZXh0cy5wdXNoKGNvbnRleHQpOwogIH0gZWxzZSB7CiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdOwogICAgdmFyIHN5bmMgPSB0cnVlOwoKICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb250ZXh0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBjb250ZXh0c1tpXS4kZm9yY2VVcGRhdGUoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykgewogICAgICAvLyBjYWNoZSByZXNvbHZlZAogICAgICBmYWN0b3J5LnJlc29sdmVkID0gZW5zdXJlQ3RvcihyZXMsIGJhc2VDdG9yKTsKICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZQogICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUikKICAgICAgaWYgKCFzeW5jKSB7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgYXN5bmMgY29tcG9uZW50OiAiICsgKFN0cmluZyhmYWN0b3J5KSkgKwogICAgICAgIChyZWFzb24gPyAoIlxuUmVhc29uOiAiICsgcmVhc29uKSA6ICcnKQogICAgICApOwogICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7CiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTsKCiAgICBpZiAoaXNPYmplY3QocmVzKSkgewogICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZQogICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7CiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc0RlZihyZXMuY29tcG9uZW50KSAmJiB0eXBlb2YgcmVzLmNvbXBvbmVudC50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7CgogICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7CiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7CiAgICAgICAgICBmYWN0b3J5LmxvYWRpbmdDb21wID0gZW5zdXJlQ3RvcihyZXMubG9hZGluZywgYmFzZUN0b3IpOwogICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkgewogICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCByZXMuZGVsYXkgfHwgMjAwKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc0RlZihyZXMudGltZW91dCkpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgICAgICAgIHJlamVjdCgKICAgICAgICAgICAgICAgICJ0aW1lb3V0ICgiICsgKHJlcy50aW1lb3V0KSArICJtcykiCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgcmVzLnRpbWVvdXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHN5bmMgPSBmYWxzZTsKICAgIC8vIHJldHVybiBpbiBjYXNlIHJlc29sdmVkIHN5bmNocm9ub3VzbHkKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmcKICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wCiAgICAgIDogZmFjdG9yeS5yZXNvbHZlZAogIH0KfQoKLyogICovCgpmdW5jdGlvbiBpc0FzeW5jUGxhY2Vob2xkZXIgKG5vZGUpIHsKICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3RvcnkKfQoKLyogICovCgpmdW5jdGlvbiBnZXRGaXJzdENvbXBvbmVudENoaWxkIChjaGlsZHJlbikgewogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkgewogICAgICAgIHJldHVybiBjCiAgICAgIH0KICAgIH0KICB9Cn0KCi8qICAqLwoKLyogICovCgpmdW5jdGlvbiBpbml0RXZlbnRzICh2bSkgewogIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTsKICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHMKICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczsKICBpZiAobGlzdGVuZXJzKSB7CiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycyk7CiAgfQp9Cgp2YXIgdGFyZ2V0OwoKZnVuY3Rpb24gYWRkIChldmVudCwgZm4sIG9uY2UpIHsKICBpZiAob25jZSkgewogICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7CiAgfSBlbHNlIHsKICAgIHRhcmdldC4kb24oZXZlbnQsIGZuKTsKICB9Cn0KCmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHsKICB0YXJnZXQuJG9mZihldmVudCwgZm4pOwp9CgpmdW5jdGlvbiB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnMgKAogIHZtLAogIGxpc3RlbmVycywKICBvbGRMaXN0ZW5lcnMKKSB7CiAgdGFyZ2V0ID0gdm07CiAgdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzIHx8IHt9LCBhZGQsIHJlbW92ZSQxLCB2bSk7CiAgdGFyZ2V0ID0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7CiAgdmFyIGhvb2tSRSA9IC9eaG9vazovOwogIFZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHRoaXMkMS4kb24oZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKHZtLl9ldmVudHNbZXZlbnRdIHx8ICh2bS5fZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChmbik7CiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uCiAgICAgIC8vIGluc3RlYWQgb2YgYSBoYXNoIGxvb2t1cAogICAgICBpZiAoaG9va1JFLnRlc3QoZXZlbnQpKSB7CiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07CgogIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgZnVuY3Rpb24gb24gKCkgewogICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7CiAgICAgIGZuLmFwcGx5KHZtLCBhcmd1bWVudHMpOwogICAgfQogICAgb24uZm4gPSBmbjsKICAgIHZtLiRvbihldmVudCwgb24pOwogICAgcmV0dXJuIHZtCiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kb2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIC8vIGFsbAogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIGFycmF5IG9mIGV2ZW50cwogICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgdGhpcyQxLiRvZmYoZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIHNwZWNpZmljIGV2ZW50CiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07CiAgICBpZiAoIWNicykgewogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmICghZm4pIHsKICAgICAgdm0uX2V2ZW50c1tldmVudF0gPSBudWxsOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmIChmbikgewogICAgICAvLyBzcGVjaWZpYyBoYW5kbGVyCiAgICAgIHZhciBjYjsKICAgICAgdmFyIGkkMSA9IGNicy5sZW5ndGg7CiAgICAgIHdoaWxlIChpJDEtLSkgewogICAgICAgIGNiID0gY2JzW2kkMV07CiAgICAgICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHsKICAgICAgICAgIGNicy5zcGxpY2UoaSQxLCAxKTsKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdm0KICB9OwoKICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgewogICAgICB2YXIgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7CiAgICAgICAgdGlwKAogICAgICAgICAgIkV2ZW50IFwiIiArIGxvd2VyQ2FzZUV2ZW50ICsgIlwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICIgKwogICAgICAgICAgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArICIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFwiIiArIGV2ZW50ICsgIlwiLiAiICsKICAgICAgICAgICJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSAiICsKICAgICAgICAgICJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gIiArCiAgICAgICAgICAiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIiICsgKGh5cGhlbmF0ZShldmVudCkpICsgIlwiIGluc3RlYWQgb2YgXCIiICsgZXZlbnQgKyAiXCIuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTsKICAgIGlmIChjYnMpIHsKICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7CiAgICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgY2JzW2ldLmFwcGx5KHZtLCBhcmdzKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKCJldmVudCBoYW5kbGVyIGZvciBcIiIgKyBldmVudCArICJcIiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07Cn0KCi8qICAqLwoKCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC4KICovCmZ1bmN0aW9uIHJlc29sdmVTbG90cyAoCiAgY2hpbGRyZW4sCiAgY29udGV4dAopIHsKICB2YXIgc2xvdHMgPSB7fTsKICBpZiAoIWNoaWxkcmVuKSB7CiAgICByZXR1cm4gc2xvdHMKICB9CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgdmFyIGRhdGEgPSBjaGlsZC5kYXRhOwogICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZQogICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHsKICAgICAgZGVsZXRlIGRhdGEuYXR0cnMuc2xvdDsKICAgIH0KICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZQogICAgLy8gc2FtZSBjb250ZXh0LgogICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiYKICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbAogICAgKSB7CiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90OwogICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpOwogICAgICBpZiAoY2hpbGQudGFnID09PSAndGVtcGxhdGUnKSB7CiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbG90LnB1c2goY2hpbGQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAoc2xvdHMuZGVmYXVsdCB8fCAoc2xvdHMuZGVmYXVsdCA9IFtdKSkucHVzaChjaGlsZCk7CiAgICB9CiAgfQogIC8vIGlnbm9yZSBzbG90cyB0aGF0IGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZQogIGZvciAodmFyIG5hbWUkMSBpbiBzbG90cykgewogICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkgewogICAgICBkZWxldGUgc2xvdHNbbmFtZSQxXTsKICAgIH0KICB9CiAgcmV0dXJuIHNsb3RzCn0KCmZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAobm9kZSkgewogIHJldHVybiAobm9kZS5pc0NvbW1lbnQgJiYgIW5vZGUuYXN5bmNGYWN0b3J5KSB8fCBub2RlLnRleHQgPT09ICcgJwp9CgpmdW5jdGlvbiByZXNvbHZlU2NvcGVkU2xvdHMgKAogIGZucywgLy8gc2VlIGZsb3cvdm5vZGUKICByZXMKKSB7CiAgcmVzID0gcmVzIHx8IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnNbaV0pKSB7CiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7CiAgICB9IGVsc2UgewogICAgICByZXNbZm5zW2ldLmtleV0gPSBmbnNbaV0uZm47CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsOwp2YXIgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7CgpmdW5jdGlvbiBpbml0TGlmZWN5Y2xlICh2bSkgewogIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7CgogIC8vIGxvY2F0ZSBmaXJzdCBub24tYWJzdHJhY3QgcGFyZW50CiAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7CiAgICB9CiAgICBwYXJlbnQuJGNoaWxkcmVuLnB1c2godm0pOwogIH0KCiAgdm0uJHBhcmVudCA9IHBhcmVudDsKICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtOwoKICB2bS4kY2hpbGRyZW4gPSBbXTsKICB2bS4kcmVmcyA9IHt9OwoKICB2bS5fd2F0Y2hlciA9IG51bGw7CiAgdm0uX2luYWN0aXZlID0gbnVsbDsKICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTsKICB2bS5faXNNb3VudGVkID0gZmFsc2U7CiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2U7CiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTsKfQoKZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkgewogIFZ1ZS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICh2bm9kZSwgaHlkcmF0aW5nKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKHZtLl9pc01vdW50ZWQpIHsKICAgICAgY2FsbEhvb2sodm0sICdiZWZvcmVVcGRhdGUnKTsKICAgIH0KICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7CiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlOwogICAgdmFyIHByZXZBY3RpdmVJbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlOwogICAgYWN0aXZlSW5zdGFuY2UgPSB2bTsKICAgIHZtLl92bm9kZSA9IHZub2RlOwogICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzCiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC4KICAgIGlmICghcHJldlZub2RlKSB7CiAgICAgIC8vIGluaXRpYWwgcmVuZGVyCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXygKICAgICAgICB2bS4kZWwsIHZub2RlLCBoeWRyYXRpbmcsIGZhbHNlIC8qIHJlbW92ZU9ubHkgKi8sCiAgICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSwKICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtCiAgICAgICk7CiAgICAgIC8vIG5vIG5lZWQgZm9yIHRoZSByZWYgbm9kZXMgYWZ0ZXIgaW5pdGlhbCBwYXRjaAogICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKQogICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtID0gdm0uJG9wdGlvbnMuX3JlZkVsbSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICAvLyB1cGRhdGVzCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhwcmV2Vm5vZGUsIHZub2RlKTsKICAgIH0KICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlOwogICAgLy8gdXBkYXRlIF9fdnVlX18gcmVmZXJlbmNlCiAgICBpZiAocHJldkVsKSB7CiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDsKICAgIH0KICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTsKICAgIH0KICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGwKICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7CiAgICAgIHZtLiRwYXJlbnQuJGVsID0gdm0uJGVsOwogICAgfQogICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZQogICAgLy8gdXBkYXRlZCBpbiBhIHBhcmVudCdzIHVwZGF0ZWQgaG9vay4KICB9OwoKICBWdWUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX2lzQmVpbmdEZXN0cm95ZWQpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZURlc3Ryb3knKTsKICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTsKICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50CiAgICB2YXIgcGFyZW50ID0gdm0uJHBhcmVudDsKICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHsKICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTsKICAgIH0KICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzCiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudGVhcmRvd24oKTsKICAgIH0KICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7CiAgICB9CiAgICAvLyByZW1vdmUgcmVmZXJlbmNlIGZyb20gZGF0YSBvYgogICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuCiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7CiAgICAgIHZtLl9kYXRhLl9fb2JfXy52bUNvdW50LS07CiAgICB9CiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi4KICAgIHZtLl9pc0Rlc3Ryb3llZCA9IHRydWU7CiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWUKICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpOwogICAgLy8gZmlyZSBkZXN0cm95ZWQgaG9vawogICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTsKICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuCiAgICB2bS4kb2ZmKCk7CiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2UKICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSBudWxsOwogICAgfQogICAgLy8gcmVsZWFzZSBjaXJjdWxhciByZWZlcmVuY2UgKCM2NzU5KQogICAgaWYgKHZtLiR2bm9kZSkgewogICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBtb3VudENvbXBvbmVudCAoCiAgdm0sCiAgZWwsCiAgaHlkcmF0aW5nCikgewogIHZtLiRlbCA9IGVsOwogIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7CiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlOwogICAgewogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHwKICAgICAgICB2bS4kb3B0aW9ucy5lbCB8fCBlbCkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArCiAgICAgICAgICAnY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIHByZS1jb21waWxlIHRoZSB0ZW1wbGF0ZXMgaW50byAnICsKICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgfQogIH0KICBjYWxsSG9vayh2bSwgJ2JlZm9yZU1vdW50Jyk7CgogIHZhciB1cGRhdGVDb21wb25lbnQ7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lOwogICAgICB2YXIgaWQgPSB2bS5fdWlkOwogICAgICB2YXIgc3RhcnRUYWcgPSAidnVlLXBlcmYtc3RhcnQ6IiArIGlkOwogICAgICB2YXIgZW5kVGFnID0gInZ1ZS1wZXJmLWVuZDoiICsgaWQ7CgogICAgICBtYXJrKHN0YXJ0VGFnKTsKICAgICAgdmFyIHZub2RlID0gdm0uX3JlbmRlcigpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHJlbmRlciIpLCBzdGFydFRhZywgZW5kVGFnKTsKCiAgICAgIG1hcmsoc3RhcnRUYWcpOwogICAgICB2bS5fdXBkYXRlKHZub2RlLCBoeWRyYXRpbmcpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHBhdGNoIiksIHN0YXJ0VGFnLCBlbmRUYWcpOwogICAgfTsKICB9IGVsc2UgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2bS5fdXBkYXRlKHZtLl9yZW5kZXIoKSwgaHlkcmF0aW5nKTsKICAgIH07CiAgfQoKICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvcgogIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkCiAgLy8gY29tcG9uZW50J3MgbW91bnRlZCBob29rKSwgd2hpY2ggcmVsaWVzIG9uIHZtLl93YXRjaGVyIGJlaW5nIGFscmVhZHkgZGVmaW5lZAogIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIG51bGwsIHRydWUgLyogaXNSZW5kZXJXYXRjaGVyICovKTsKICBoeWRyYXRpbmcgPSBmYWxzZTsKCiAgLy8gbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSwgY2FsbCBtb3VudGVkIG9uIHNlbGYKICAvLyBtb3VudGVkIGlzIGNhbGxlZCBmb3IgcmVuZGVyLWNyZWF0ZWQgY2hpbGQgY29tcG9uZW50cyBpbiBpdHMgaW5zZXJ0ZWQgaG9vawogIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkgewogICAgdm0uX2lzTW91bnRlZCA9IHRydWU7CiAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTsKICB9CiAgcmV0dXJuIHZtCn0KCmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50ICgKICB2bSwKICBwcm9wc0RhdGEsCiAgbGlzdGVuZXJzLAogIHBhcmVudFZub2RlLAogIHJlbmRlckNoaWxkcmVuCikgewogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7CiAgfQoKICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW4KICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG92ZXJ3cml0aW5nICRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbgogIHZhciBoYXNDaGlsZHJlbiA9ICEhKAogICAgcmVuZGVyQ2hpbGRyZW4gfHwgICAgICAgICAgICAgICAvLyBoYXMgbmV3IHN0YXRpYyBzbG90cwogICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90cwogICAgcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyB8fCAvLyBoYXMgbmV3IHNjb3BlZCBzbG90cwogICAgdm0uJHNjb3BlZFNsb3RzICE9PSBlbXB0eU9iamVjdCAvLyBoYXMgb2xkIHNjb3BlZCBzbG90cwogICk7CgogIHZtLiRvcHRpb25zLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlOwogIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyCgogIGlmICh2bS5fdm5vZGUpIHsgLy8gdXBkYXRlIGNoaWxkIHRyZWUncyBwYXJlbnQKICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTsKICB9CiAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW47CgogIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5lcnMgaGFzaAogIC8vIHRoZXNlIGFyZSBhbHNvIHJlYWN0aXZlIHNvIHRoZXkgbWF5IHRyaWdnZXIgY2hpbGQgdXBkYXRlIGlmIHRoZSBjaGlsZAogIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyCiAgdm0uJGF0dHJzID0gcGFyZW50Vm5vZGUuZGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdDsKICB2bS4kbGlzdGVuZXJzID0gbGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0OwoKICAvLyB1cGRhdGUgcHJvcHMKICBpZiAocHJvcHNEYXRhICYmIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgdmFyIHByb3BzID0gdm0uX3Byb3BzOwogICAgdmFyIHByb3BLZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07CiAgICAgIHZhciBwcm9wT3B0aW9ucyA9IHZtLiRvcHRpb25zLnByb3BzOyAvLyB3dGYgZmxvdz8KICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTsKICAgIH0KICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGEKICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YSA9IHByb3BzRGF0YTsKICB9CgogIC8vIHVwZGF0ZSBsaXN0ZW5lcnMKICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7CiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTsKCiAgLy8gcmVzb2x2ZSBzbG90cyArIGZvcmNlIHVwZGF0ZSBpZiBoYXMgY2hpbGRyZW4KICBpZiAoaGFzQ2hpbGRyZW4pIHsKICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7CiAgICB2bS4kZm9yY2VVcGRhdGUoKTsKICB9CgogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlOwogIH0KfQoKZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHsKICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHsKICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfQogIH0KICByZXR1cm4gZmFsc2UKfQoKZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlOwogICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7CiAgICAgIHJldHVybgogICAgfQogIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7CiAgICByZXR1cm4KICB9CiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHsKICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pOwogICAgfQogICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7CiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgfQogIGlmICghdm0uX2luYWN0aXZlKSB7CiAgICB2bS5faW5hY3RpdmUgPSB0cnVlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7CiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHsKICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzCiAgcHVzaFRhcmdldCgpOwogIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdOwogIGlmIChoYW5kbGVycykgewogICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgdHJ5IHsKICAgICAgICBoYW5kbGVyc1tpXS5jYWxsKHZtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoaG9vayArICIgaG9vayIpKTsKICAgICAgfQogICAgfQogIH0KICBpZiAodm0uX2hhc0hvb2tFdmVudCkgewogICAgdm0uJGVtaXQoJ2hvb2s6JyArIGhvb2spOwogIH0KICBwb3BUYXJnZXQoKTsKfQoKLyogICovCgoKdmFyIE1BWF9VUERBVEVfQ09VTlQgPSAxMDA7Cgp2YXIgcXVldWUgPSBbXTsKdmFyIGFjdGl2YXRlZENoaWxkcmVuID0gW107CnZhciBoYXMgPSB7fTsKdmFyIGNpcmN1bGFyID0ge307CnZhciB3YWl0aW5nID0gZmFsc2U7CnZhciBmbHVzaGluZyA9IGZhbHNlOwp2YXIgaW5kZXggPSAwOwoKLyoqCiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS4KICovCmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkgewogIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDsKICBoYXMgPSB7fTsKICB7CiAgICBjaXJjdWxhciA9IHt9OwogIH0KICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTsKfQoKLyoqCiAqIEZsdXNoIGJvdGggcXVldWVzIGFuZCBydW4gdGhlIHdhdGNoZXJzLgogKi8KZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7CiAgZmx1c2hpbmcgPSB0cnVlOwogIHZhciB3YXRjaGVyLCBpZDsKCiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guCiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6CiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5cwogIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZCkKICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlCiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKQogIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sCiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLgogIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTsKCiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkCiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzCiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7CiAgICB3YXRjaGVyID0gcXVldWVbaW5kZXhdOwogICAgaWQgPSB3YXRjaGVyLmlkOwogICAgaGFzW2lkXSA9IG51bGw7CiAgICB3YXRjaGVyLnJ1bigpOwogICAgLy8gaW4gZGV2IGJ1aWxkLCBjaGVjayBhbmQgc3RvcCBjaXJjdWxhciB1cGRhdGVzLgogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHsKICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7CiAgICAgIGlmIChjaXJjdWxhcltpZF0gPiBNQVhfVVBEQVRFX0NPVU5UKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArICgKICAgICAgICAgICAgd2F0Y2hlci51c2VyCiAgICAgICAgICAgICAgPyAoImluIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uIFwiIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgIlwiIikKICAgICAgICAgICAgICA6ICJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uIgogICAgICAgICAgKSwKICAgICAgICAgIHdhdGNoZXIudm0KICAgICAgICApOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICB9CgogIC8vIGtlZXAgY29waWVzIG9mIHBvc3QgcXVldWVzIGJlZm9yZSByZXNldHRpbmcgc3RhdGUKICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpOwogIHZhciB1cGRhdGVkUXVldWUgPSBxdWV1ZS5zbGljZSgpOwoKICByZXNldFNjaGVkdWxlclN0YXRlKCk7CgogIC8vIGNhbGwgY29tcG9uZW50IHVwZGF0ZWQgYW5kIGFjdGl2YXRlZCBob29rcwogIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7CiAgY2FsbFVwZGF0ZWRIb29rcyh1cGRhdGVkUXVldWUpOwoKICAvLyBkZXZ0b29sIGhvb2sKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoZGV2dG9vbHMgJiYgY29uZmlnLmRldnRvb2xzKSB7CiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpOwogIH0KfQoKZnVuY3Rpb24gY2FsbFVwZGF0ZWRIb29rcyAocXVldWUpIHsKICB2YXIgaSA9IHF1ZXVlLmxlbmd0aDsKICB3aGlsZSAoaS0tKSB7CiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2ldOwogICAgdmFyIHZtID0gd2F0Y2hlci52bTsKICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkKSB7CiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpOwogICAgfQogIH0KfQoKLyoqCiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC4KICogVGhlIHF1ZXVlIHdpbGwgYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSBlbnRpcmUgdHJlZSBoYXMgYmVlbiBwYXRjaGVkLgogKi8KZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7CiAgLy8gc2V0dGluZyBfaW5hY3RpdmUgdG8gZmFsc2UgaGVyZSBzbyB0aGF0IGEgcmVuZGVyIGZ1bmN0aW9uIGNhbgogIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpCiAgdm0uX2luYWN0aXZlID0gZmFsc2U7CiAgYWN0aXZhdGVkQ2hpbGRyZW4ucHVzaCh2bSk7Cn0KCmZ1bmN0aW9uIGNhbGxBY3RpdmF0ZWRIb29rcyAocXVldWUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlOwogICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChxdWV1ZVtpXSwgdHJ1ZSAvKiB0cnVlICovKTsKICB9Cn0KCi8qKgogKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLgogKiBKb2JzIHdpdGggZHVwbGljYXRlIElEcyB3aWxsIGJlIHNraXBwZWQgdW5sZXNzIGl0J3MKICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuCiAqLwpmdW5jdGlvbiBxdWV1ZVdhdGNoZXIgKHdhdGNoZXIpIHsKICB2YXIgaWQgPSB3YXRjaGVyLmlkOwogIGlmIChoYXNbaWRdID09IG51bGwpIHsKICAgIGhhc1tpZF0gPSB0cnVlOwogICAgaWYgKCFmbHVzaGluZykgewogICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZAogICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LgogICAgICB2YXIgaSA9IHF1ZXVlLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7CiAgICAgICAgaS0tOwogICAgICB9CiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7CiAgICB9CiAgICAvLyBxdWV1ZSB0aGUgZmx1c2gKICAgIGlmICghd2FpdGluZykgewogICAgICB3YWl0aW5nID0gdHJ1ZTsKICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciB1aWQkMSA9IDA7CgovKioKICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsCiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuCiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLgogKi8KdmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGNiLAogIG9wdGlvbnMsCiAgaXNSZW5kZXJXYXRjaGVyCikgewogIHRoaXMudm0gPSB2bTsKICBpZiAoaXNSZW5kZXJXYXRjaGVyKSB7CiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7CiAgfQogIHZtLl93YXRjaGVycy5wdXNoKHRoaXMpOwogIC8vIG9wdGlvbnMKICBpZiAob3B0aW9ucykgewogICAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7CiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjsKICAgIHRoaXMubGF6eSA9ICEhb3B0aW9ucy5sYXp5OwogICAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7CiAgfSBlbHNlIHsKICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlOwogIH0KICB0aGlzLmNiID0gY2I7CiAgdGhpcy5pZCA9ICsrdWlkJDE7IC8vIHVpZCBmb3IgYmF0Y2hpbmcKICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnMKICB0aGlzLmRlcHMgPSBbXTsKICB0aGlzLm5ld0RlcHMgPSBbXTsKICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7CiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpOwogIHRoaXMuZXhwcmVzc2lvbiA9IGV4cE9yRm4udG9TdHJpbmcoKTsKICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXIKICBpZiAodHlwZW9mIGV4cE9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjsKICB9IGVsc2UgewogICAgdGhpcy5nZXR0ZXIgPSBwYXJzZVBhdGgoZXhwT3JGbik7CiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7CiAgICAgIHRoaXMuZ2V0dGVyID0gZnVuY3Rpb24gKCkge307CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXCIiICsgZXhwT3JGbiArICJcIiAiICsKICAgICAgICAnV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuICcgKwogICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsCiAgICAgICAgdm0KICAgICAgKTsKICAgIH0KICB9CiAgdGhpcy52YWx1ZSA9IHRoaXMubGF6eQogICAgPyB1bmRlZmluZWQKICAgIDogdGhpcy5nZXQoKTsKfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkgewogIHB1c2hUYXJnZXQodGhpcyk7CiAgdmFyIHZhbHVlOwogIHZhciB2bSA9IHRoaXMudm07CiAgdHJ5IHsKICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIGlmICh0aGlzLnVzZXIpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICgiZ2V0dGVyIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZQogICAgfQogIH0gZmluYWxseSB7CiAgICAvLyAidG91Y2giIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzCiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmcKICAgIGlmICh0aGlzLmRlZXApIHsKICAgICAgdHJhdmVyc2UodmFsdWUpOwogICAgfQogICAgcG9wVGFyZ2V0KCk7CiAgICB0aGlzLmNsZWFudXBEZXBzKCk7CiAgfQogIHJldHVybiB2YWx1ZQp9OwoKLyoqCiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5hZGREZXAgPSBmdW5jdGlvbiBhZGREZXAgKGRlcCkgewogIHZhciBpZCA9IGRlcC5pZDsKICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHsKICAgIHRoaXMubmV3RGVwSWRzLmFkZChpZCk7CiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApOwogICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7CiAgICAgIGRlcC5hZGRTdWIodGhpcyk7CiAgICB9CiAgfQp9OwoKLyoqCiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGRlcCA9IHRoaXMkMS5kZXBzW2ldOwogICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7CiAgICAgIGRlcC5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICB9CiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzOwogIHRoaXMuZGVwSWRzID0gdGhpcy5uZXdEZXBJZHM7CiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7CiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTsKICB0bXAgPSB0aGlzLmRlcHM7CiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzOwogIHRoaXMubmV3RGVwcyA9IHRtcDsKICB0aGlzLm5ld0RlcHMubGVuZ3RoID0gMDsKfTsKCi8qKgogKiBTdWJzY3JpYmVyIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy4KICovCldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAodGhpcy5sYXp5KSB7CiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICB9IGVsc2UgaWYgKHRoaXMuc3luYykgewogICAgdGhpcy5ydW4oKTsKICB9IGVsc2UgewogICAgcXVldWVXYXRjaGVyKHRoaXMpOwogIH0KfTsKCi8qKgogKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci4KICovCldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7CiAgaWYgKHRoaXMuYWN0aXZlKSB7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpOwogICAgaWYgKAogICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fAogICAgICAvLyBEZWVwIHdhdGNoZXJzIGFuZCB3YXRjaGVycyBvbiBPYmplY3QvQXJyYXlzIHNob3VsZCBmaXJlIGV2ZW4KICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heQogICAgICAvLyBoYXZlIG11dGF0ZWQuCiAgICAgIGlzT2JqZWN0KHZhbHVlKSB8fAogICAgICB0aGlzLmRlZXAKICAgICkgewogICAgICAvLyBzZXQgbmV3IHZhbHVlCiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgaWYgKHRoaXMudXNlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoImNhbGxiYWNrIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgfQogICAgfQogIH0KfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuCiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy4KICovCldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkgewogIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpOwogIHRoaXMuZGlydHkgPSBmYWxzZTsKfTsKCi8qKgogKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci4KICovCldhdGNoZXIucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIHRoaXMkMS5kZXBzW2ldLmRlcGVuZCgpOwogIH0KfTsKCi8qKgogKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC4KICovCldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogIGlmICh0aGlzLmFjdGl2ZSkgewogICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdAogICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdAogICAgLy8gaWYgdGhlIHZtIGlzIGJlaW5nIGRlc3Ryb3llZC4KICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkgewogICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpOwogICAgfQogICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogICAgd2hpbGUgKGktLSkgewogICAgICB0aGlzJDEuZGVwc1tpXS5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgfQp9OwoKLyogICovCgp2YXIgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uID0gewogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGdldDogbm9vcCwKICBzZXQ6IG5vb3AKfTsKCmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHsKICAgIHJldHVybiB0aGlzW3NvdXJjZUtleV1ba2V5XQogIH07CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHsKICAgIHRoaXNbc291cmNlS2V5XVtrZXldID0gdmFsOwogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pOwp9CgpmdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7CiAgdm0uX3dhdGNoZXJzID0gW107CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9uczsKICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9CiAgaWYgKG9wdHMubWV0aG9kcykgeyBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKTsgfQogIGlmIChvcHRzLmRhdGEpIHsKICAgIGluaXREYXRhKHZtKTsKICB9IGVsc2UgewogICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pOwogIH0KICBpZiAob3B0cy5jb21wdXRlZCkgeyBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpOyB9CiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHsKICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7CiAgfQp9CgpmdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHsKICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9OwogIHZhciBwcm9wcyA9IHZtLl9wcm9wcyA9IHt9OwogIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5CiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uCiAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBbXTsKICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7CiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkCiAgaWYgKCFpc1Jvb3QpIHsKICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7CiAgfQogIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICBrZXlzLnB1c2goa2V5KTsKICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7CiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwogICAgewogICAgICB2YXIgaHlwaGVuYXRlZEtleSA9IGh5cGhlbmF0ZShrZXkpOwogICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShoeXBoZW5hdGVkS2V5KSB8fAogICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiXCIiICsgaHlwaGVuYXRlZEtleSArICJcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuIiksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgZGVmaW5lUmVhY3RpdmUocHJvcHMsIGtleSwgdmFsdWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodm0uJHBhcmVudCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlICIgKwogICAgICAgICAgICAib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgIiArCiAgICAgICAgICAgICJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcIiIgKyBrZXkgKyAiXCIiLAogICAgICAgICAgICB2bQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZQogICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXQKICAgIC8vIGluc3RhbnRpYXRpb24gaGVyZS4KICAgIGlmICghKGtleSBpbiB2bSkpIHsKICAgICAgcHJveHkodm0sICJfcHJvcHMiLCBrZXkpOwogICAgfQogIH07CgogIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApOwogIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKfQoKZnVuY3Rpb24gaW5pdERhdGEgKHZtKSB7CiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhOwogIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nCiAgICA/IGdldERhdGEoZGF0YSwgdm0pCiAgICA6IGRhdGEgfHwge307CiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7CiAgICBkYXRhID0ge307CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ2RhdGEgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0OlxuJyArCiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLAogICAgICB2bQogICAgKTsKICB9CiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgdmFyIG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzOwogIHZhciBpID0ga2V5cy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICB7CiAgICAgIGlmIChtZXRob2RzICYmIGhhc093bihtZXRob2RzLCBrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiTWV0aG9kIFwiIiArIGtleSArICJcIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBkYXRhIHByb3BlcnR5LiIpLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBpZiAocHJvcHMgJiYgaGFzT3duKHByb3BzLCBrZXkpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJUaGUgZGF0YSBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuICIgKwogICAgICAgICJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuIiwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgIHByb3h5KHZtLCAiX2RhdGEiLCBrZXkpOwogICAgfQogIH0KICAvLyBvYnNlcnZlIGRhdGEKICBvYnNlcnZlKGRhdGEsIHRydWUgLyogYXNSb290RGF0YSAqLyk7Cn0KCmZ1bmN0aW9uIGdldERhdGEgKGRhdGEsIHZtKSB7CiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVycwogIHB1c2hUYXJnZXQoKTsKICB0cnkgewogICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pCiAgfSBjYXRjaCAoZSkgewogICAgaGFuZGxlRXJyb3IoZSwgdm0sICJkYXRhKCkiKTsKICAgIHJldHVybiB7fQogIH0gZmluYWxseSB7CiAgICBwb3BUYXJnZXQoKTsKICB9Cn0KCnZhciBjb21wdXRlZFdhdGNoZXJPcHRpb25zID0geyBsYXp5OiB0cnVlIH07CgpmdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkgewogIC8vICRmbG93LWRpc2FibGUtbGluZQogIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUgogIHZhciBpc1NTUiA9IGlzU2VydmVyUmVuZGVyaW5nKCk7CgogIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkgewogICAgdmFyIHVzZXJEZWYgPSBjb21wdXRlZFtrZXldOwogICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0OwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBnZXR0ZXIgPT0gbnVsbCkgewogICAgICB3YXJuKAogICAgICAgICgiR2V0dGVyIGlzIG1pc3NpbmcgZm9yIGNvbXB1dGVkIHByb3BlcnR5IFwiIiArIGtleSArICJcIi4iKSwKICAgICAgICB2bQogICAgICApOwogICAgfQoKICAgIGlmICghaXNTU1IpIHsKICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKAogICAgICAgIHZtLAogICAgICAgIGdldHRlciB8fCBub29wLAogICAgICAgIG5vb3AsCiAgICAgICAgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucwogICAgICApOwogICAgfQoKICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGUKICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkCiAgICAvLyBhdCBpbnN0YW50aWF0aW9uIGhlcmUuCiAgICBpZiAoIShrZXkgaW4gdm0pKSB7CiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkgewogICAgICAgIHdhcm4oKCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLiIpLCB2bSk7CiAgICAgIH0gZWxzZSBpZiAodm0uJG9wdGlvbnMucHJvcHMgJiYga2V5IGluIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICAgICAgd2FybigoIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC4iKSwgdm0pOwogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBkZWZpbmVDb21wdXRlZCAoCiAgdGFyZ2V0LAogIGtleSwKICB1c2VyRGVmCikgewogIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpOwogIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlCiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KQogICAgICA6IHVzZXJEZWY7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDsKICB9IGVsc2UgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHVzZXJEZWYuZ2V0CiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2UKICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSkKICAgICAgICA6IHVzZXJEZWYuZ2V0CiAgICAgIDogbm9vcDsKICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldAogICAgICA/IHVzZXJEZWYuc2V0CiAgICAgIDogbm9vcDsKICB9CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICB3YXJuKAogICAgICAgICgiQ29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIHdhcyBhc3NpZ25lZCB0byBidXQgaXQgaGFzIG5vIHNldHRlci4iKSwKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbik7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXB1dGVkR2V0dGVyIChrZXkpIHsKICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkgewogICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTsKICAgIGlmICh3YXRjaGVyKSB7CiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7CiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpOwogICAgICB9CiAgICAgIGlmIChEZXAudGFyZ2V0KSB7CiAgICAgICAgd2F0Y2hlci5kZXBlbmQoKTsKICAgICAgfQogICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZQogICAgfQogIH0KfQoKZnVuY3Rpb24gaW5pdE1ldGhvZHMgKHZtLCBtZXRob2RzKSB7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHsKICAgIHsKICAgICAgaWYgKG1ldGhvZHNba2V5XSA9PSBudWxsKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiAiICsKICAgICAgICAgICJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAoIk1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgcHJvcC4iKSwKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuICIgKwogICAgICAgICAgIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pOwogIH0KfQoKZnVuY3Rpb24gaW5pdFdhdGNoICh2bSwgd2F0Y2gpIHsKICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHsKICAgIHZhciBoYW5kbGVyID0gd2F0Y2hba2V5XTsKICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykgewogICAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcltpXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcik7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGhhbmRsZXIsCiAgb3B0aW9ucwopIHsKICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkgewogICAgb3B0aW9ucyA9IGhhbmRsZXI7CiAgICBoYW5kbGVyID0gaGFuZGxlci5oYW5kbGVyOwogIH0KICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7CiAgICBoYW5kbGVyID0gdm1baGFuZGxlcl07CiAgfQogIHJldHVybiB2bS4kd2F0Y2goZXhwT3JGbiwgaGFuZGxlciwgb3B0aW9ucykKfQoKZnVuY3Rpb24gc3RhdGVNaXhpbiAoVnVlKSB7CiAgLy8gZmxvdyBzb21laG93IGhhcyBwcm9ibGVtcyB3aXRoIGRpcmVjdGx5IGRlY2xhcmVkIGRlZmluaXRpb24gb2JqZWN0CiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwCiAgLy8gdGhlIG9iamVjdCBoZXJlLgogIHZhciBkYXRhRGVmID0ge307CiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07CiAgdmFyIHByb3BzRGVmID0ge307CiAgcHJvcHNEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHJvcHMgfTsKICB7CiAgICBkYXRhRGVmLnNldCA9IGZ1bmN0aW9uIChuZXdEYXRhKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICsKICAgICAgICAnVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4nLAogICAgICAgIHRoaXMKICAgICAgKTsKICAgIH07CiAgICBwcm9wc0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHdhcm4oIiRwcm9wcyBpcyByZWFkb25seS4iLCB0aGlzKTsKICAgIH07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGRhdGEnLCBkYXRhRGVmKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTsKCiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0OwogIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDsKCiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoCiAgICBleHBPckZuLAogICAgY2IsCiAgICBvcHRpb25zCiAgKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKGlzUGxhaW5PYmplY3QoY2IpKSB7CiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucykKICAgIH0KICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy51c2VyID0gdHJ1ZTsKICAgIHZhciB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKTsKICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZSkgewogICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiB1bndhdGNoRm4gKCkgewogICAgICB3YXRjaGVyLnRlYXJkb3duKCk7CiAgICB9CiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0UHJvdmlkZSAodm0pIHsKICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7CiAgaWYgKHByb3ZpZGUpIHsKICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nCiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKQogICAgICA6IHByb3ZpZGU7CiAgfQp9CgpmdW5jdGlvbiBpbml0SW5qZWN0aW9ucyAodm0pIHsKICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTsKICBpZiAocmVzdWx0KSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgICAgewogICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSAiICsKICAgICAgICAgICAgIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXCIiICsga2V5ICsgIlwiIiwKICAgICAgICAgICAgdm0KICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkgewogIGlmIChpbmplY3QpIHsKICAgIC8vIGluamVjdCBpcyA6YW55IGJlY2F1c2UgZmxvdyBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgY2FjaGVkCiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBrZXlzID0gaGFzU3ltYm9sCiAgICAgID8gUmVmbGVjdC5vd25LZXlzKGluamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwogICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluamVjdCwga2V5KS5lbnVtZXJhYmxlCiAgICAgIH0pCiAgICAgIDogT2JqZWN0LmtleXMoaW5qZWN0KTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTsKICAgICAgdmFyIHNvdXJjZSA9IHZtOwogICAgICB3aGlsZSAoc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDsKICAgICAgfQogICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHsKICAgICAgICAgIHZhciBwcm92aWRlRGVmYXVsdCA9IGluamVjdFtrZXldLmRlZmF1bHQ7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pCiAgICAgICAgICAgIDogcHJvdmlkZURlZmF1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm4oKCJJbmplY3Rpb24gXCIiICsga2V5ICsgIlwiIG5vdCBmb3VuZCIpLCB2bSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLgogKi8KZnVuY3Rpb24gcmVuZGVyTGlzdCAoCiAgdmFsLAogIHJlbmRlcgopIHsKICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpOwogICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHsKICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpOwogICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBrZXkgPSBrZXlzW2ldOwogICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7CiAgICB9CiAgfQogIGlmIChpc0RlZihyZXQpKSB7CiAgICAocmV0KS5faXNWTGlzdCA9IHRydWU7CiAgfQogIHJldHVybiByZXQKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyA8c2xvdD4KICovCmZ1bmN0aW9uIHJlbmRlclNsb3QgKAogIG5hbWUsCiAgZmFsbGJhY2ssCiAgcHJvcHMsCiAgYmluZE9iamVjdAopIHsKICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07CiAgdmFyIG5vZGVzOwogIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3QKICAgIHByb3BzID0gcHJvcHMgfHwge307CiAgICBpZiAoYmluZE9iamVjdCkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc09iamVjdChiaW5kT2JqZWN0KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7CiAgICB9CiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7CiAgfSBlbHNlIHsKICAgIHZhciBzbG90Tm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXTsKICAgIC8vIHdhcm4gZHVwbGljYXRlIHNsb3QgdXNhZ2UKICAgIGlmIChzbG90Tm9kZXMpIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzbG90Tm9kZXMuX3JlbmRlcmVkKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcIiIgKyBuYW1lICsgIlwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlICIgKwogICAgICAgICAgIi0gdGhpcyB3aWxsIGxpa2VseSBjYXVzZSByZW5kZXIgZXJyb3JzLiIsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBzbG90Tm9kZXMuX3JlbmRlcmVkID0gdHJ1ZTsKICAgIH0KICAgIG5vZGVzID0gc2xvdE5vZGVzIHx8IGZhbGxiYWNrOwogIH0KCiAgdmFyIHRhcmdldCA9IHByb3BzICYmIHByb3BzLnNsb3Q7CiAgaWYgKHRhcmdldCkgewogICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpCiAgfSBlbHNlIHsKICAgIHJldHVybiBub2RlcwogIH0KfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzCiAqLwpmdW5jdGlvbiByZXNvbHZlRmlsdGVyIChpZCkgewogIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHkKfQoKLyogICovCgpmdW5jdGlvbiBpc0tleU5vdE1hdGNoIChleHBlY3QsIGFjdHVhbCkgewogIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHsKICAgIHJldHVybiBleHBlY3QuaW5kZXhPZihhY3R1YWwpID09PSAtMQogIH0gZWxzZSB7CiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWwKICB9Cn0KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgY2hlY2tpbmcga2V5Q29kZXMgZnJvbSBjb25maWcuCiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fawogKiBwYXNzaW5nIGluIGV2ZW50S2V5TmFtZSBhcyBsYXN0IGFyZ3VtZW50IHNlcGFyYXRlbHkgZm9yIGJhY2t3YXJkcyBjb21wYXQKICovCmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKAogIGV2ZW50S2V5Q29kZSwKICBrZXksCiAgYnVpbHRJbktleUNvZGUsCiAgZXZlbnRLZXlOYW1lLAogIGJ1aWx0SW5LZXlOYW1lCikgewogIHZhciBtYXBwZWRLZXlDb2RlID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbktleUNvZGU7CiAgaWYgKGJ1aWx0SW5LZXlOYW1lICYmIGV2ZW50S2V5TmFtZSAmJiAhY29uZmlnLmtleUNvZGVzW2tleV0pIHsKICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpCiAgfSBlbHNlIGlmIChtYXBwZWRLZXlDb2RlKSB7CiAgICByZXR1cm4gaXNLZXlOb3RNYXRjaChtYXBwZWRLZXlDb2RlLCBldmVudEtleUNvZGUpCiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHsKICAgIHJldHVybiBoeXBoZW5hdGUoZXZlbnRLZXlOYW1lKSAhPT0ga2V5CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgbWVyZ2luZyB2LWJpbmQ9Im9iamVjdCIgaW50byBhIFZOb2RlJ3MgZGF0YS4KICovCmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoCiAgZGF0YSwKICB0YWcsCiAgdmFsdWUsCiAgYXNQcm9wLAogIGlzU3luYwopIHsKICBpZiAodmFsdWUpIHsKICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICd2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCBvciBBcnJheSB2YWx1ZScsCiAgICAgICAgdGhpcwogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgdmFsdWUgPSB0b09iamVjdCh2YWx1ZSk7CiAgICAgIH0KICAgICAgdmFyIGhhc2g7CiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8CiAgICAgICAgICBrZXkgPT09ICdzdHlsZScgfHwKICAgICAgICAgIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUoa2V5KQogICAgICAgICkgewogICAgICAgICAgaGFzaCA9IGRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7CiAgICAgICAgICBoYXNoID0gYXNQcm9wIHx8IGNvbmZpZy5tdXN0VXNlUHJvcCh0YWcsIHR5cGUsIGtleSkKICAgICAgICAgICAgPyBkYXRhLmRvbVByb3BzIHx8IChkYXRhLmRvbVByb3BzID0ge30pCiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2V5IGluIGhhc2gpKSB7CiAgICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZVtrZXldOwoKICAgICAgICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgICAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICAgICAgICAgICAgb25bKCJ1cGRhdGU6IiArIGtleSldID0gZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuCiAqLwpmdW5jdGlvbiByZW5kZXJTdGF0aWMgKAogIGluZGV4LAogIGlzSW5Gb3IKKSB7CiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTsKICB2YXIgdHJlZSA9IGNhY2hlZFtpbmRleF07CiAgLy8gaWYgaGFzIGFscmVhZHktcmVuZGVyZWQgc3RhdGljIHRyZWUgYW5kIG5vdCBpbnNpZGUgdi1mb3IsCiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuCiAgaWYgKHRyZWUgJiYgIWlzSW5Gb3IpIHsKICAgIHJldHVybiB0cmVlCiAgfQogIC8vIG90aGVyd2lzZSwgcmVuZGVyIGEgZnJlc2ggdHJlZS4KICB0cmVlID0gY2FjaGVkW2luZGV4XSA9IHRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2luZGV4XS5jYWxsKAogICAgdGhpcy5fcmVuZGVyUHJveHksCiAgICBudWxsLAogICAgdGhpcyAvLyBmb3IgcmVuZGVyIGZucyBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9uYWwgY29tcG9uZW50IHRlbXBsYXRlcwogICk7CiAgbWFya1N0YXRpYyh0cmVlLCAoIl9fc3RhdGljX18iICsgaW5kZXgpLCBmYWxzZSk7CiAgcmV0dXJuIHRyZWUKfQoKLyoqCiAqIFJ1bnRpbWUgaGVscGVyIGZvciB2LW9uY2UuCiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LgogKi8KZnVuY3Rpb24gbWFya09uY2UgKAogIHRyZWUsCiAgaW5kZXgsCiAga2V5CikgewogIG1hcmtTdGF0aWModHJlZSwgKCJfX29uY2VfXyIgKyBpbmRleCArIChrZXkgPyAoIl8iICsga2V5KSA6ICIiKSksIHRydWUpOwogIHJldHVybiB0cmVlCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMgKAogIHRyZWUsCiAga2V5LAogIGlzT25jZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykgewogICAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWVbaV0sIChrZXkgKyAiXyIgKyBpKSwgaXNPbmNlKTsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBtYXJrU3RhdGljTm9kZSh0cmVlLCBrZXksIGlzT25jZSk7CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljTm9kZSAobm9kZSwga2V5LCBpc09uY2UpIHsKICBub2RlLmlzU3RhdGljID0gdHJ1ZTsKICBub2RlLmtleSA9IGtleTsKICBub2RlLmlzT25jZSA9IGlzT25jZTsKfQoKLyogICovCgpmdW5jdGlvbiBiaW5kT2JqZWN0TGlzdGVuZXJzIChkYXRhLCB2YWx1ZSkgewogIGlmICh2YWx1ZSkgewogICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJywKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICB2YXIgb24gPSBkYXRhLm9uID0gZGF0YS5vbiA/IGV4dGVuZCh7fSwgZGF0YS5vbikgOiB7fTsKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7CiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTsKICAgICAgICB2YXIgb3VycyA9IHZhbHVlW2tleV07CiAgICAgICAgb25ba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBvdXJzKSA6IG91cnM7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgpmdW5jdGlvbiBpbnN0YWxsUmVuZGVySGVscGVycyAodGFyZ2V0KSB7CiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7CiAgdGFyZ2V0Ll9uID0gdG9OdW1iZXI7CiAgdGFyZ2V0Ll9zID0gdG9TdHJpbmc7CiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDsKICB0YXJnZXQuX3QgPSByZW5kZXJTbG90OwogIHRhcmdldC5fcSA9IGxvb3NlRXF1YWw7CiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mOwogIHRhcmdldC5fbSA9IHJlbmRlclN0YXRpYzsKICB0YXJnZXQuX2YgPSByZXNvbHZlRmlsdGVyOwogIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7CiAgdGFyZ2V0Ll9iID0gYmluZE9iamVjdFByb3BzOwogIHRhcmdldC5fdiA9IGNyZWF0ZVRleHRWTm9kZTsKICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlOwogIHRhcmdldC5fdSA9IHJlc29sdmVTY29wZWRTbG90czsKICB0YXJnZXQuX2cgPSBiaW5kT2JqZWN0TGlzdGVuZXJzOwp9CgovKiAgKi8KCmZ1bmN0aW9uIEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0ICgKICBkYXRhLAogIHByb3BzLAogIGNoaWxkcmVuLAogIHBhcmVudCwKICBDdG9yCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIC8vIGVuc3VyZSB0aGUgY3JlYXRlRWxlbWVudCBmdW5jdGlvbiBpbiBmdW5jdGlvbmFsIGNvbXBvbmVudHMKICAvLyBnZXRzIGEgdW5pcXVlIGNvbnRleHQgLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBuYW1lZCBzbG90IGNoZWNrCiAgdmFyIGNvbnRleHRWbTsKICBpZiAoaGFzT3duKHBhcmVudCwgJ191aWQnKSkgewogICAgY29udGV4dFZtID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQpOwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBjb250ZXh0Vm0uX29yaWdpbmFsID0gcGFyZW50OwogIH0gZWxzZSB7CiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC4KICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYWJsZSB0byBnZXQgYSBob2xkIHRvIHRoZQogICAgLy8gcmVhbCBjb250ZXh0IGluc3RhbmNlLgogICAgY29udGV4dFZtID0gcGFyZW50OwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBwYXJlbnQgPSBwYXJlbnQuX29yaWdpbmFsOwogIH0KICB2YXIgaXNDb21waWxlZCA9IGlzVHJ1ZShvcHRpb25zLl9jb21waWxlZCk7CiAgdmFyIG5lZWROb3JtYWxpemF0aW9uID0gIWlzQ29tcGlsZWQ7CgogIHRoaXMuZGF0YSA9IGRhdGE7CiAgdGhpcy5wcm9wcyA9IHByb3BzOwogIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICB0aGlzLmxpc3RlbmVycyA9IGRhdGEub24gfHwgZW1wdHlPYmplY3Q7CiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTsKICB0aGlzLnNsb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpOyB9OwoKICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlCiAgaWYgKGlzQ29tcGlsZWQpIHsKICAgIC8vIGV4cG9zaW5nICRvcHRpb25zIGZvciByZW5kZXJTdGF0aWMoKQogICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAvLyBwcmUtcmVzb2x2ZSBzbG90cyBmb3IgcmVuZGVyU2xvdCgpCiAgICB0aGlzLiRzbG90cyA9IHRoaXMuc2xvdHMoKTsKICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gZGF0YS5zY29wZWRTbG90cyB8fCBlbXB0eU9iamVjdDsKICB9CgogIGlmIChvcHRpb25zLl9zY29wZUlkKSB7CiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsKICAgICAgdmFyIHZub2RlID0gY3JlYXRlRWxlbWVudChjb250ZXh0Vm0sIGEsIGIsIGMsIGQsIG5lZWROb3JtYWxpemF0aW9uKTsKICAgICAgaWYgKHZub2RlICYmICFBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7CiAgICAgICAgdm5vZGUuZm5Db250ZXh0ID0gcGFyZW50OwogICAgICB9CiAgICAgIHJldHVybiB2bm9kZQogICAgfTsKICB9IGVsc2UgewogICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9OwogIH0KfQoKaW5zdGFsbFJlbmRlckhlbHBlcnMoRnVuY3Rpb25hbFJlbmRlckNvbnRleHQucHJvdG90eXBlKTsKCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKAogIEN0b3IsCiAgcHJvcHNEYXRhLAogIGRhdGEsCiAgY29udGV4dFZtLAogIGNoaWxkcmVuCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIHZhciBwcm9wcyA9IHt9OwogIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKGlzRGVmKHByb3BPcHRpb25zKSkgewogICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7CiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YS5wcm9wcykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5wcm9wcyk7IH0KICB9CgogIHZhciByZW5kZXJDb250ZXh0ID0gbmV3IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0KAogICAgZGF0YSwKICAgIHByb3BzLAogICAgY2hpbGRyZW4sCiAgICBjb250ZXh0Vm0sCiAgICBDdG9yCiAgKTsKCiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTsKCiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucykKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICB2YXIgdm5vZGVzID0gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUpIHx8IFtdOwogICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc1tpXSA9IGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQodm5vZGVzW2ldLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucyk7CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0ICh2bm9kZSwgZGF0YSwgY29udGV4dFZtLCBvcHRpb25zKSB7CiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWQKICAvLyAoZS5nLiBpdCB3YXMgZnJvbSBhIGNhY2hlZCBub3JtYWwgc2xvdCkgdGhlIGZuQ29udGV4dCBjYXVzZXMgbmFtZWQgc2xvdHMKICAvLyB0aGF0IHNob3VsZCBub3QgYmUgbWF0Y2hlZCB0byBtYXRjaC4KICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTsKICBjbG9uZS5mbkNvbnRleHQgPSBjb250ZXh0Vm07CiAgY2xvbmUuZm5PcHRpb25zID0gb3B0aW9uczsKICBpZiAoZGF0YS5zbG90KSB7CiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDsKICB9CiAgcmV0dXJuIGNsb25lCn0KCmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRvLCBmcm9tKSB7CiAgZm9yICh2YXIga2V5IGluIGZyb20pIHsKICAgIHRvW2NhbWVsaXplKGtleSldID0gZnJvbVtrZXldOwogIH0KfQoKLyogICovCgoKCgovLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGhvb2sgdG8gd2VleCBuYXRpdmUgcmVuZGVyIGVuZ2luZS4KLy8gVGhlIGhvb2sgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgbmF0aXZlLCBub3QgamF2YXNjcmlwdC4KCgovLyBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHRvIHdlZXggbmF0aXZlIHJlbmRlciBlbmdpbmUuCgovKiAgKi8KCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYW5rczEwMTAwL3dlZXgtbmF0aXZlLWRpcmVjdGl2ZS90cmVlL21hc3Rlci9jb21wb25lbnQKCi8vIGxpc3RlbmluZyBvbiBuYXRpdmUgY2FsbGJhY2sKCi8qICAqLwoKLyogICovCgovLyBpbmxpbmUgaG9va3MgdG8gYmUgaW52b2tlZCBvbiBjb21wb25lbnQgVk5vZGVzIGR1cmluZyBwYXRjaAp2YXIgY29tcG9uZW50Vk5vZGVIb29rcyA9IHsKICBpbml0OiBmdW5jdGlvbiBpbml0ICgKICAgIHZub2RlLAogICAgaHlkcmF0aW5nLAogICAgcGFyZW50RWxtLAogICAgcmVmRWxtCiAgKSB7CiAgICBpZiAoCiAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmCiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiYKICAgICAgdm5vZGUuZGF0YS5rZWVwQWxpdmUKICAgICkgewogICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2gKICAgICAgdmFyIG1vdW50ZWROb2RlID0gdm5vZGU7IC8vIHdvcmsgYXJvdW5kIGZsb3cKICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKAogICAgICAgIHZub2RlLAogICAgICAgIGFjdGl2ZUluc3RhbmNlLAogICAgICAgIHBhcmVudEVsbSwKICAgICAgICByZWZFbG0KICAgICAgKTsKICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTsKICAgIH0KICB9LAoKICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkgewogICAgdmFyIG9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTsKICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KAogICAgICBjaGlsZCwKICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHMKICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzCiAgICAgIHZub2RlLCAvLyBuZXcgcGFyZW50IHZub2RlCiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuCiAgICApOwogIH0sCgogIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkgewogICAgdmFyIGNvbnRleHQgPSB2bm9kZS5jb250ZXh0OwogICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7CiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHsKICAgICAgY29tcG9uZW50SW5zdGFuY2UuX2lzTW91bnRlZCA9IHRydWU7CiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpOwogICAgfQogICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7CiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHsKICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTIKICAgICAgICAvLyBEdXJpbmcgdXBkYXRlcywgYSBrZXB0LWFsaXZlIGNvbXBvbmVudCdzIGNoaWxkIGNvbXBvbmVudHMgbWF5CiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzCiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbAogICAgICAgIC8vIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgd2hvbGUgcGF0Y2ggcHJvY2VzcyBlbmRlZC4KICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pOwogICAgICB9CiAgICB9CiAgfSwKCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHsKICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkgewogICAgICAgIGNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7CiAgICAgIH0KICAgIH0KICB9Cn07Cgp2YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7CgpmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKAogIEN0b3IsCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICBpZiAoaXNVbmRlZihDdG9yKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgYmFzZUN0b3IgPSBjb250ZXh0LiRvcHRpb25zLl9iYXNlOwoKICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3IKICBpZiAoaXNPYmplY3QoQ3RvcikpIHsKICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7CiAgfQoKICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksCiAgLy8gcmVqZWN0LgogIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJykgewogICAgewogICAgICB3YXJuKCgiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4KICB9CgogIC8vIGFzeW5jIGNvbXBvbmVudAogIHZhciBhc3luY0ZhY3Rvcnk7CiAgaWYgKGlzVW5kZWYoQ3Rvci5jaWQpKSB7CiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yOwogICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTsKICAgIGlmIChDdG9yID09PSB1bmRlZmluZWQpIHsKICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZAogICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS4KICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgYXN5bmMgc2VydmVyLXJlbmRlcmluZyBhbmQgaHlkcmF0aW9uLgogICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcigKICAgICAgICBhc3luY0ZhY3RvcnksCiAgICAgICAgZGF0YSwKICAgICAgICBjb250ZXh0LAogICAgICAgIGNoaWxkcmVuLAogICAgICAgIHRhZwogICAgICApCiAgICB9CiAgfQoKICBkYXRhID0gZGF0YSB8fCB7fTsKCiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlcgogIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvbgogIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvcik7CgogIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHMKICBpZiAoaXNEZWYoZGF0YS5tb2RlbCkpIHsKICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7CiAgfQoKICAvLyBleHRyYWN0IHByb3BzCiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTsKCiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnQKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkgewogICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoQ3RvciwgcHJvcHNEYXRhLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbikKICB9CgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzLCBzaW5jZSB0aGVzZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzCiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnMKICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjsKICAvLyByZXBsYWNlIHdpdGggbGlzdGVuZXJzIHdpdGggLm5hdGl2ZSBtb2RpZmllcgogIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLgogIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uOwoKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHsKICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmcKICAgIC8vIG90aGVyIHRoYW4gcHJvcHMgJiBsaXN0ZW5lcnMgJiBzbG90CgogICAgLy8gd29yayBhcm91bmQgZmxvdwogICAgdmFyIHNsb3QgPSBkYXRhLnNsb3Q7CiAgICBkYXRhID0ge307CiAgICBpZiAoc2xvdCkgewogICAgICBkYXRhLnNsb3QgPSBzbG90OwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlCiAgaW5zdGFsbENvbXBvbmVudEhvb2tzKGRhdGEpOwoKICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZQogIHZhciBuYW1lID0gQ3Rvci5vcHRpb25zLm5hbWUgfHwgdGFnOwogIHZhciB2bm9kZSA9IG5ldyBWTm9kZSgKICAgICgidnVlLWNvbXBvbmVudC0iICsgKEN0b3IuY2lkKSArIChuYW1lID8gKCItIiArIG5hbWUpIDogJycpKSwKICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHQsCiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LAogICAgYXN5bmNGYWN0b3J5CiAgKTsKCiAgLy8gV2VleCBzcGVjaWZpYzogaW52b2tlIHJlY3ljbGUtbGlzdCBvcHRpbWl6ZWQgQHJlbmRlciBmdW5jdGlvbiBmb3IKICAvLyBleHRyYWN0aW5nIGNlbGwtc2xvdCB0ZW1wbGF0ZS4KICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGFua3MxMDEwMC93ZWV4LW5hdGl2ZS1kaXJlY3RpdmUvdHJlZS9tYXN0ZXIvY29tcG9uZW50CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgcmV0dXJuIHZub2RlCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUgKAogIHZub2RlLCAvLyB3ZSBrbm93IGl0J3MgTW91bnRlZENvbXBvbmVudFZOb2RlIGJ1dCBmbG93IGRvZXNuJ3QKICBwYXJlbnQsIC8vIGFjdGl2ZUluc3RhbmNlIGluIGxpZmVjeWNsZSBzdGF0ZQogIHBhcmVudEVsbSwKICByZWZFbG0KKSB7CiAgdmFyIG9wdGlvbnMgPSB7CiAgICBfaXNDb21wb25lbnQ6IHRydWUsCiAgICBwYXJlbnQ6IHBhcmVudCwKICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsCiAgICBfcGFyZW50RWxtOiBwYXJlbnRFbG0gfHwgbnVsbCwKICAgIF9yZWZFbG06IHJlZkVsbSB8fCBudWxsCiAgfTsKICAvLyBjaGVjayBpbmxpbmUtdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9ucwogIHZhciBpbmxpbmVUZW1wbGF0ZSA9IHZub2RlLmRhdGEuaW5saW5lVGVtcGxhdGU7CiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkgewogICAgb3B0aW9ucy5yZW5kZXIgPSBpbmxpbmVUZW1wbGF0ZS5yZW5kZXI7CiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZuczsKICB9CiAgcmV0dXJuIG5ldyB2bm9kZS5jb21wb25lbnRPcHRpb25zLkN0b3Iob3B0aW9ucykKfQoKZnVuY3Rpb24gaW5zdGFsbENvbXBvbmVudEhvb2tzIChkYXRhKSB7CiAgdmFyIGhvb2tzID0gZGF0YS5ob29rIHx8IChkYXRhLmhvb2sgPSB7fSk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBob29rc1RvTWVyZ2VbaV07CiAgICBob29rc1trZXldID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldOwogIH0KfQoKLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50bwovLyBwcm9wIGFuZCBldmVudCBoYW5kbGVyIHJlc3BlY3RpdmVseS4KZnVuY3Rpb24gdHJhbnNmb3JtTW9kZWwgKG9wdGlvbnMsIGRhdGEpIHsKICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJzsKICB2YXIgZXZlbnQgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLmV2ZW50KSB8fCAnaW5wdXQnOyhkYXRhLnByb3BzIHx8IChkYXRhLnByb3BzID0ge30pKVtwcm9wXSA9IGRhdGEubW9kZWwudmFsdWU7CiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICBpZiAoaXNEZWYob25bZXZlbnRdKSkgewogICAgb25bZXZlbnRdID0gW2RhdGEubW9kZWwuY2FsbGJhY2tdLmNvbmNhdChvbltldmVudF0pOwogIH0gZWxzZSB7CiAgICBvbltldmVudF0gPSBkYXRhLm1vZGVsLmNhbGxiYWNrOwogIH0KfQoKLyogICovCgp2YXIgU0lNUExFX05PUk1BTElaRSA9IDE7CnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjsKCi8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHByb3ZpZGluZyBhIG1vcmUgZmxleGlibGUgaW50ZXJmYWNlCi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvdwpmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlLAogIGFsd2F5c05vcm1hbGl6ZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gZGF0YTsKICAgIGRhdGEgPSB1bmRlZmluZWQ7CiAgfQogIGlmIChpc1RydWUoYWx3YXlzTm9ybWFsaXplKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFOwogIH0KICByZXR1cm4gX2NyZWF0ZUVsZW1lbnQoY29udGV4dCwgdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUpCn0KCmZ1bmN0aW9uIF9jcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlCikgewogIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICJBdm9pZCB1c2luZyBvYnNlcnZlZCBkYXRhIG9iamVjdCBhcyB2bm9kZSBkYXRhOiAiICsgKEpTT04uc3RyaW5naWZ5KGRhdGEpKSArICJcbiIgKwogICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJywKICAgICAgY29udGV4dAogICAgKTsKICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKCkKICB9CiAgLy8gb2JqZWN0IHN5bnRheCBpbiB2LWJpbmQKICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHsKICAgIHRhZyA9IGRhdGEuaXM7CiAgfQogIGlmICghdGFnKSB7CiAgICAvLyBpbiBjYXNlIG9mIGNvbXBvbmVudCA6aXMgc2V0IHRvIGZhbHN5IHZhbHVlCiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQogIC8vIHdhcm4gYWdhaW5zdCBub24tcHJpbWl0aXZlIGtleQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIGlzRGVmKGRhdGEpICYmIGlzRGVmKGRhdGEua2V5KSAmJiAhaXNQcmltaXRpdmUoZGF0YS5rZXkpCiAgKSB7CiAgICB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCAnICsKICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLAogICAgICAgIGNvbnRleHQKICAgICAgKTsKICAgIH0KICB9CiAgLy8gc3VwcG9ydCBzaW5nbGUgZnVuY3Rpb24gY2hpbGRyZW4gYXMgZGVmYXVsdCBzY29wZWQgc2xvdAogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJgogICAgdHlwZW9mIGNoaWxkcmVuWzBdID09PSAnZnVuY3Rpb24nCiAgKSB7CiAgICBkYXRhID0gZGF0YSB8fCB7fTsKICAgIGRhdGEuc2NvcGVkU2xvdHMgPSB7IGRlZmF1bHQ6IGNoaWxkcmVuWzBdIH07CiAgICBjaGlsZHJlbi5sZW5ndGggPSAwOwogIH0KICBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IEFMV0FZU19OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gbm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0KICB2YXIgdm5vZGUsIG5zOwogIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJykgewogICAgdmFyIEN0b3I7CiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpOwogICAgaWYgKGNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHMKICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHRhZyksIGRhdGEsIGNoaWxkcmVuLAogICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0CiAgICAgICk7CiAgICB9IGVsc2UgaWYgKGlzRGVmKEN0b3IgPSByZXNvbHZlQXNzZXQoY29udGV4dC4kb3B0aW9ucywgJ2NvbXBvbmVudHMnLCB0YWcpKSkgewogICAgICAvLyBjb21wb25lbnQKICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7CiAgICB9IGVsc2UgewogICAgICAvLyB1bmtub3duIG9yIHVubGlzdGVkIG5hbWVzcGFjZWQgZWxlbWVudHMKICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHMKICAgICAgLy8gcGFyZW50IG5vcm1hbGl6ZXMgY2hpbGRyZW4KICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbiwKICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dAogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBkaXJlY3QgY29tcG9uZW50IG9wdGlvbnMgLyBjb25zdHJ1Y3RvcgogICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7CiAgfQogIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgcmV0dXJuIHZub2RlCiAgfSBlbHNlIGlmIChpc0RlZih2bm9kZSkpIHsKICAgIGlmIChpc0RlZihucykpIHsgYXBwbHlOUyh2bm9kZSwgbnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH0KICAgIHJldHVybiB2bm9kZQogIH0gZWxzZSB7CiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQp9CgpmdW5jdGlvbiBhcHBseU5TICh2bm9kZSwgbnMsIGZvcmNlKSB7CiAgdm5vZGUubnMgPSBuczsKICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHsKICAgIC8vIHVzZSBkZWZhdWx0IG5hbWVzcGFjZSBpbnNpZGUgZm9yZWlnbk9iamVjdAogICAgbnMgPSB1bmRlZmluZWQ7CiAgICBmb3JjZSA9IHRydWU7CiAgfQogIGlmIChpc0RlZih2bm9kZS5jaGlsZHJlbikpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoY2hpbGQudGFnKSAmJiAoCiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7CiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMsIGZvcmNlKTsKICAgICAgfQogICAgfQogIH0KfQoKLy8gcmVmICM1MzE4Ci8vIG5lY2Vzc2FyeSB0byBlbnN1cmUgcGFyZW50IHJlLXJlbmRlciB3aGVuIGRlZXAgYmluZGluZ3MgbGlrZSA6c3R5bGUgYW5kCi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzCmZ1bmN0aW9uIHJlZ2lzdGVyRGVlcEJpbmRpbmdzIChkYXRhKSB7CiAgaWYgKGlzT2JqZWN0KGRhdGEuc3R5bGUpKSB7CiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTsKICB9CiAgaWYgKGlzT2JqZWN0KGRhdGEuY2xhc3MpKSB7CiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHsKICB2bS5fdm5vZGUgPSBudWxsOyAvLyB0aGUgcm9vdCBvZiB0aGUgY2hpbGQgdHJlZQogIHZtLl9zdGF0aWNUcmVlcyA9IG51bGw7IC8vIHYtb25jZSBjYWNoZWQgdHJlZXMKICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogIHZhciBwYXJlbnRWbm9kZSA9IHZtLiR2bm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZQogIHZhciByZW5kZXJDb250ZXh0ID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuY29udGV4dDsKICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpOwogIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0OwogIC8vIGJpbmQgdGhlIGNyZWF0ZUVsZW1lbnQgZm4gdG8gdGhpcyBpbnN0YW5jZQogIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuCiAgLy8gYXJncyBvcmRlcjogdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUsIGFsd2F5c05vcm1hbGl6ZQogIC8vIGludGVybmFsIHZlcnNpb24gaXMgdXNlZCBieSByZW5kZXIgZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gdGVtcGxhdGVzCiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9OwogIC8vIG5vcm1hbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgZm9yIHRoZSBwdWJsaWMgdmVyc2lvbiwgdXNlZCBpbgogIC8vIHVzZXItd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zLgogIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9OwoKICAvLyAkYXR0cnMgJiAkbGlzdGVuZXJzIGFyZSBleHBvc2VkIGZvciBlYXNpZXIgSE9DIGNyZWF0aW9uLgogIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWQKICB2YXIgcGFyZW50RGF0YSA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmRhdGE7CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgewogICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkYXR0cnMgaXMgcmVhZG9ubHkuIiwgdm0pOwogICAgfSwgdHJ1ZSk7CiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LiIsIHZtKTsKICAgIH0sIHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVuZGVyTWl4aW4gKFZ1ZSkgewogIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzCiAgaW5zdGFsbFJlbmRlckhlbHBlcnMoVnVlLnByb3RvdHlwZSk7CgogIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpCiAgfTsKCiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHZtID0gdGhpczsKICAgIHZhciByZWYgPSB2bS4kb3B0aW9uczsKICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyOwogICAgdmFyIF9wYXJlbnRWbm9kZSA9IHJlZi5fcGFyZW50Vm5vZGU7CgogICAgLy8gcmVzZXQgX3JlbmRlcmVkIGZsYWcgb24gc2xvdHMgZm9yIGR1cGxpY2F0ZSBzbG90IGNoZWNrCiAgICB7CiAgICAgIGZvciAodmFyIGtleSBpbiB2bS4kc2xvdHMpIHsKICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgICB2bS4kc2xvdHNba2V5XS5fcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChfcGFyZW50Vm5vZGUpIHsKICAgICAgdm0uJHNjb3BlZFNsb3RzID0gX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMgfHwgZW1wdHlPYmplY3Q7CiAgICB9CgogICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2VzcwogICAgLy8gdG8gdGhlIGRhdGEgb24gdGhlIHBsYWNlaG9sZGVyIG5vZGUuCiAgICB2bS4kdm5vZGUgPSBfcGFyZW50Vm5vZGU7CiAgICAvLyByZW5kZXIgc2VsZgogICAgdmFyIHZub2RlOwogICAgdHJ5IHsKICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXIiKTsKICAgICAgLy8gcmV0dXJuIGVycm9yIHJlbmRlciByZXN1bHQsCiAgICAgIC8vIG9yIHByZXZpb3VzIHZub2RlIHRvIHByZXZlbnQgcmVuZGVyIGVycm9yIGNhdXNpbmcgYmxhbmsgY29tcG9uZW50CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgICAgIHsKICAgICAgICBpZiAodm0uJG9wdGlvbnMucmVuZGVyRXJyb3IpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXJFcnJvciIpOwogICAgICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGUgPSB2bS5fdm5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0CiAgICBpZiAoISh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdNdWx0aXBsZSByb290IG5vZGVzIHJldHVybmVkIGZyb20gcmVuZGVyIGZ1bmN0aW9uLiBSZW5kZXIgZnVuY3Rpb24gJyArCiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICB2bm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICAgIH0KICAgIC8vIHNldCBwYXJlbnQKICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTsKICAgIHJldHVybiB2bm9kZQogIH07Cn0KCi8qICAqLwoKdmFyIHVpZCQzID0gMDsKCmZ1bmN0aW9uIGluaXRNaXhpbiAoVnVlKSB7CiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgLy8gYSB1aWQKICAgIHZtLl91aWQgPSB1aWQkMysrOwoKICAgIHZhciBzdGFydFRhZywgZW5kVGFnOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgIHN0YXJ0VGFnID0gInZ1ZS1wZXJmLXN0YXJ0OiIgKyAodm0uX3VpZCk7CiAgICAgIGVuZFRhZyA9ICJ2dWUtcGVyZi1lbmQ6IiArICh2bS5fdWlkKTsKICAgICAgbWFyayhzdGFydFRhZyk7CiAgICB9CgogICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWQKICAgIHZtLl9pc1Z1ZSA9IHRydWU7CiAgICAvLyBtZXJnZSBvcHRpb25zCiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkgewogICAgICAvLyBvcHRpbWl6ZSBpbnRlcm5hbCBjb21wb25lbnQgaW5zdGFudGlhdGlvbgogICAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlCiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LgogICAgICBpbml0SW50ZXJuYWxDb21wb25lbnQodm0sIG9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyh2bS5jb25zdHJ1Y3RvciksCiAgICAgICAgb3B0aW9ucyB8fCB7fSwKICAgICAgICB2bQogICAgICApOwogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIHsKICAgICAgaW5pdFByb3h5KHZtKTsKICAgIH0KICAgIC8vIGV4cG9zZSByZWFsIHNlbGYKICAgIHZtLl9zZWxmID0gdm07CiAgICBpbml0TGlmZWN5Y2xlKHZtKTsKICAgIGluaXRFdmVudHModm0pOwogICAgaW5pdFJlbmRlcih2bSk7CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZUNyZWF0ZScpOwogICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHMKICAgIGluaXRTdGF0ZSh2bSk7CiAgICBpbml0UHJvdmlkZSh2bSk7IC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzCiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHsKICAgICAgdm0uX25hbWUgPSBmb3JtYXRDb21wb25lbnROYW1lKHZtLCBmYWxzZSk7CiAgICAgIG1hcmsoZW5kVGFnKTsKICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHZtLl9uYW1lKSArICIgaW5pdCIpLCBzdGFydFRhZywgZW5kVGFnKTsKICAgIH0KCiAgICBpZiAodm0uJG9wdGlvbnMuZWwpIHsKICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBpbml0SW50ZXJuYWxDb21wb25lbnQgKHZtLCBvcHRpb25zKSB7CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7CiAgLy8gZG9pbmcgdGhpcyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZHluYW1pYyBlbnVtZXJhdGlvbi4KICB2YXIgcGFyZW50Vm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsKICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIG9wdHMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7CiAgb3B0cy5fcGFyZW50RWxtID0gb3B0aW9ucy5fcGFyZW50RWxtOwogIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTsKCiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgb3B0cy5wcm9wc0RhdGEgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhOwogIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7CiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47CiAgb3B0cy5fY29tcG9uZW50VGFnID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZzsKCiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7CiAgICBvcHRzLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyOwogICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuczsKICB9Cn0KCmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHsKICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9uczsKICBpZiAoQ3Rvci5zdXBlcikgewogICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7CiAgICB2YXIgY2FjaGVkU3VwZXJPcHRpb25zID0gQ3Rvci5zdXBlck9wdGlvbnM7CiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHsKICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsCiAgICAgIC8vIG5lZWQgdG8gcmVzb2x2ZSBuZXcgb3B0aW9ucy4KICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7CiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NikKICAgICAgdmFyIG1vZGlmaWVkT3B0aW9ucyA9IHJlc29sdmVNb2RpZmllZE9wdGlvbnMoQ3Rvcik7CiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zCiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHsKICAgICAgICBleHRlbmQoQ3Rvci5leHRlbmRPcHRpb25zLCBtb2RpZmllZE9wdGlvbnMpOwogICAgICB9CiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpOwogICAgICBpZiAob3B0aW9ucy5uYW1lKSB7CiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBvcHRpb25zCn0KCmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHsKICB2YXIgbW9kaWZpZWQ7CiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9uczsKICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7CiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9uczsKICBmb3IgKHZhciBrZXkgaW4gbGF0ZXN0KSB7CiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7CiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfQogICAgICBtb2RpZmllZFtrZXldID0gZGVkdXBlKGxhdGVzdFtrZXldLCBleHRlbmRlZFtrZXldLCBzZWFsZWRba2V5XSk7CiAgICB9CiAgfQogIHJldHVybiBtb2RpZmllZAp9CgpmdW5jdGlvbiBkZWR1cGUgKGxhdGVzdCwgZXh0ZW5kZWQsIHNlYWxlZCkgewogIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkCiAgLy8gYmV0d2VlbiBtZXJnZXMKICBpZiAoQXJyYXkuaXNBcnJheShsYXRlc3QpKSB7CiAgICB2YXIgcmVzID0gW107CiAgICBzZWFsZWQgPSBBcnJheS5pc0FycmF5KHNlYWxlZCkgPyBzZWFsZWQgOiBbc2VhbGVkXTsKICAgIGV4dGVuZGVkID0gQXJyYXkuaXNBcnJheShleHRlbmRlZCkgPyBleHRlbmRlZCA6IFtleHRlbmRlZF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykgewogICAgICAvLyBwdXNoIG9yaWdpbmFsIG9wdGlvbnMgYW5kIG5vdCBzZWFsZWQgb3B0aW9ucyB0byBleGNsdWRlIGR1cGxpY2F0ZWQgb3B0aW9ucwogICAgICBpZiAoZXh0ZW5kZWQuaW5kZXhPZihsYXRlc3RbaV0pID49IDAgfHwgc2VhbGVkLmluZGV4T2YobGF0ZXN0W2ldKSA8IDApIHsKICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfSBlbHNlIHsKICAgIHJldHVybiBsYXRlc3QKICB9Cn0KCmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSkKICApIHsKICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTsKICB9CiAgdGhpcy5faW5pdChvcHRpb25zKTsKfQoKaW5pdE1peGluKFZ1ZSk7CnN0YXRlTWl4aW4oVnVlKTsKZXZlbnRzTWl4aW4oVnVlKTsKbGlmZWN5Y2xlTWl4aW4oVnVlKTsKcmVuZGVyTWl4aW4oVnVlKTsKCi8qICAqLwoKZnVuY3Rpb24gaW5pdFVzZSAoVnVlKSB7CiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHsKICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpOwogICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID4gLTEpIHsKICAgICAgcmV0dXJuIHRoaXMKICAgIH0KCiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgYXJncy51bnNoaWZ0KHRoaXMpOwogICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTsKICAgIH0KICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChwbHVnaW4pOwogICAgcmV0dXJuIHRoaXMKICB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHsKICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHsKICAgIHRoaXMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG1peGluKTsKICAgIHJldHVybiB0aGlzCiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHsKICAvKioKICAgKiBFYWNoIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgVnVlLCBoYXMgYSB1bmlxdWUKICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCAiY2hpbGQKICAgKiBjb25zdHJ1Y3RvcnMiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLgogICAqLwogIFZ1ZS5jaWQgPSAwOwogIHZhciBjaWQgPSAxOwoKICAvKioKICAgKiBDbGFzcyBpbmhlcml0YW5jZQogICAqLwogIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbiAoZXh0ZW5kT3B0aW9ucykgewogICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307CiAgICB2YXIgU3VwZXIgPSB0aGlzOwogICAgdmFyIFN1cGVySWQgPSBTdXBlci5jaWQ7CiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pOwogICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7CiAgICAgIHJldHVybiBjYWNoZWRDdG9yc1tTdXBlcklkXQogICAgfQoKICAgIHZhciBuYW1lID0gZXh0ZW5kT3B0aW9ucy5uYW1lIHx8IFN1cGVyLm9wdGlvbnMubmFtZTsKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkgewogICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSk7CiAgICB9CgogICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFZ1ZUNvbXBvbmVudCAob3B0aW9ucykgewogICAgICB0aGlzLl9pbml0KG9wdGlvbnMpOwogICAgfTsKICAgIFN1Yi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSk7CiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViOwogICAgU3ViLmNpZCA9IGNpZCsrOwogICAgU3ViLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgIFN1cGVyLm9wdGlvbnMsCiAgICAgIGV4dGVuZE9wdGlvbnMKICAgICk7CiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjsKCiAgICAvLyBGb3IgcHJvcHMgYW5kIGNvbXB1dGVkIHByb3BlcnRpZXMsIHdlIGRlZmluZSB0aGUgcHJveHkgZ2V0dGVycyBvbgogICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXMKICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC4KICAgIGlmIChTdWIub3B0aW9ucy5wcm9wcykgewogICAgICBpbml0UHJvcHMkMShTdWIpOwogICAgfQogICAgaWYgKFN1Yi5vcHRpb25zLmNvbXB1dGVkKSB7CiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7CiAgICB9CgogICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlCiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kOwogICAgU3ViLm1peGluID0gU3VwZXIubWl4aW47CiAgICBTdWIudXNlID0gU3VwZXIudXNlOwoKICAgIC8vIGNyZWF0ZSBhc3NldCByZWdpc3RlcnMsIHNvIGV4dGVuZGVkIGNsYXNzZXMKICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby4KICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgU3ViW3R5cGVdID0gU3VwZXJbdHlwZV07CiAgICB9KTsKICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXAKICAgIGlmIChuYW1lKSB7CiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7CiAgICB9CgogICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS4KICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlCiAgICAvLyBiZWVuIHVwZGF0ZWQuCiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9uczsKICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9uczsKICAgIFN1Yi5zZWFsZWRPcHRpb25zID0gZXh0ZW5kKHt9LCBTdWIub3B0aW9ucyk7CgogICAgLy8gY2FjaGUgY29uc3RydWN0b3IKICAgIGNhY2hlZEN0b3JzW1N1cGVySWRdID0gU3ViOwogICAgcmV0dXJuIFN1YgogIH07Cn0KCmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7CiAgdmFyIHByb3BzID0gQ29tcC5vcHRpb25zLnByb3BzOwogIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgcHJveHkoQ29tcC5wcm90b3R5cGUsICJfcHJvcHMiLCBrZXkpOwogIH0KfQoKZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHsKICB2YXIgY29tcHV0ZWQgPSBDb21wLm9wdGlvbnMuY29tcHV0ZWQ7CiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7CiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHsKICAvKioKICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuCiAgICovCiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKAogICAgICBpZCwKICAgICAgZGVmaW5pdGlvbgogICAgKSB7CiAgICAgIGlmICghZGVmaW5pdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50JykgewogICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHsKICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDsKICAgICAgICAgIGRlZmluaXRpb24gPSB0aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKGRlZmluaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGRlZmluaXRpb24gPSB7IGJpbmQ6IGRlZmluaXRpb24sIHVwZGF0ZTogZGVmaW5pdGlvbiB9OwogICAgICAgIH0KICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjsKICAgICAgICByZXR1cm4gZGVmaW5pdGlvbgogICAgICB9CiAgICB9OwogIH0pOwp9CgovKiAgKi8KCmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHsKICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZykKfQoKZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkgewogIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgcmV0dXJuIGZhbHNlCn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHsKICB2YXIgY2FjaGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5jYWNoZTsKICB2YXIga2V5cyA9IGtlZXBBbGl2ZUluc3RhbmNlLmtleXM7CiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTsKICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpIHsKICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTsKICAgIGlmIChjYWNoZWROb2RlKSB7CiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjYWNoZWROb2RlLmNvbXBvbmVudE9wdGlvbnMpOwogICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7CiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoCiAgY2FjaGUsCiAga2V5LAogIGtleXMsCiAgY3VycmVudAopIHsKICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTsKICBpZiAoY2FjaGVkJCQxICYmICghY3VycmVudCB8fCBjYWNoZWQkJDEudGFnICE9PSBjdXJyZW50LnRhZykpIHsKICAgIGNhY2hlZCQkMS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpOwogIH0KICBjYWNoZVtrZXldID0gbnVsbDsKICByZW1vdmUoa2V5cywga2V5KTsKfQoKdmFyIHBhdHRlcm5UeXBlcyA9IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldOwoKdmFyIEtlZXBBbGl2ZSA9IHsKICBuYW1lOiAna2VlcC1hbGl2ZScsCiAgYWJzdHJhY3Q6IHRydWUsCgogIHByb3BzOiB7CiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl0KICB9LAoKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHsKICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5rZXlzID0gW107CiAgfSwKCiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQgKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgZm9yICh2YXIga2V5IGluIHRoaXMkMS5jYWNoZSkgewogICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlLCBrZXksIHRoaXMkMS5rZXlzKTsKICAgIH0KICB9LAoKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7CiAgICB9KTsKICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICFtYXRjaGVzKHZhbCwgbmFtZSk7IH0pOwogICAgfSk7CiAgfSwKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkgewogICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0OwogICAgdmFyIHZub2RlID0gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChzbG90KTsKICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9uczsKICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7CiAgICAgIC8vIGNoZWNrIHBhdHRlcm4KICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpOwogICAgICB2YXIgcmVmID0gdGhpczsKICAgICAgdmFyIGluY2x1ZGUgPSByZWYuaW5jbHVkZTsKICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTsKICAgICAgaWYgKAogICAgICAgIC8vIG5vdCBpbmNsdWRlZAogICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8CiAgICAgICAgLy8gZXhjbHVkZWQKICAgICAgICAoZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpCiAgICAgICkgewogICAgICAgIHJldHVybiB2bm9kZQogICAgICB9CgogICAgICB2YXIgcmVmJDEgPSB0aGlzOwogICAgICB2YXIgY2FjaGUgPSByZWYkMS5jYWNoZTsKICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGwKICAgICAgICAvLyBzYW1lIGNvbnN0cnVjdG9yIG1heSBnZXQgcmVnaXN0ZXJlZCBhcyBkaWZmZXJlbnQgbG9jYWwgY29tcG9uZW50cwogICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSkKICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoIjo6IiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpCiAgICAgICAgOiB2bm9kZS5rZXk7CiAgICAgIGlmIChjYWNoZVtrZXldKSB7CiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlOwogICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3QKICAgICAgICByZW1vdmUoa2V5cywga2V5KTsKICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYWNoZVtrZXldID0gdm5vZGU7CiAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5CiAgICAgICAgaWYgKHRoaXMubWF4ICYmIGtleXMubGVuZ3RoID4gcGFyc2VJbnQodGhpcy5tYXgpKSB7CiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKQogIH0KfQoKdmFyIGJ1aWx0SW5Db21wb25lbnRzID0gewogIEtlZXBBbGl2ZTogS2VlcEFsaXZlCn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7CiAgLy8gY29uZmlnCiAgdmFyIGNvbmZpZ0RlZiA9IHt9OwogIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07CiAgewogICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgd2FybigKICAgICAgICAnRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4nCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTsKCiAgLy8gZXhwb3NlZCB1dGlsIG1ldGhvZHMuCiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uCiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay4KICBWdWUudXRpbCA9IHsKICAgIHdhcm46IHdhcm4sCiAgICBleHRlbmQ6IGV4dGVuZCwKICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLAogICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlCiAgfTsKCiAgVnVlLnNldCA9IHNldDsKICBWdWUuZGVsZXRlID0gZGVsOwogIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrOwoKICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0pOwoKICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlICJiYXNlIiBjb25zdHJ1Y3RvciB0byBleHRlbmQgYWxsIHBsYWluLW9iamVjdAogIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLgogIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlOwoKICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpOwoKICBpbml0VXNlKFZ1ZSk7CiAgaW5pdE1peGluJDEoVnVlKTsKICBpbml0RXh0ZW5kKFZ1ZSk7CiAgaW5pdEFzc2V0UmVnaXN0ZXJzKFZ1ZSk7Cn0KCmluaXRHbG9iYWxBUEkoVnVlKTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywgewogIGdldDogaXNTZXJ2ZXJSZW5kZXJpbmcKfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRzc3JDb250ZXh0JywgewogIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICByZXR1cm4gdGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dAogIH0KfSk7CgovLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb24KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0JywgewogIHZhbHVlOiBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dAp9KTsKClZ1ZS52ZXJzaW9uID0gJzIuNS4xNyc7CgovKiAgKi8KCi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheQovLyBkdXJpbmcgdGVtcGxhdGUgY29tcGlsYXRpb24KdmFyIGlzUmVzZXJ2ZWRBdHRyID0gbWFrZU1hcCgnc3R5bGUsY2xhc3MnKTsKCi8vIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgdXNpbmcgcHJvcHMgZm9yIGJpbmRpbmcKdmFyIGFjY2VwdFZhbHVlID0gbWFrZU1hcCgnaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcycpOwp2YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7CiAgcmV0dXJuICgKICAgIChhdHRyID09PSAndmFsdWUnICYmIGFjY2VwdFZhbHVlKHRhZykpICYmIHR5cGUgIT09ICdidXR0b24nIHx8CiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fAogICAgKGF0dHIgPT09ICdjaGVja2VkJyAmJiB0YWcgPT09ICdpbnB1dCcpIHx8CiAgICAoYXR0ciA9PT0gJ211dGVkJyAmJiB0YWcgPT09ICd2aWRlbycpCiAgKQp9OwoKdmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTsKCnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcCgKICAnYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSwnICsKICAnZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLCcgKwogICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgKwogICdtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LCcgKwogICdyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLCcgKwogICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJwopOwoKdmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7Cgp2YXIgaXNYbGluayA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJwp9OwoKdmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIGlzWGxpbmsobmFtZSkgPyBuYW1lLnNsaWNlKDYsIG5hbWUubGVuZ3RoKSA6ICcnCn07Cgp2YXIgaXNGYWxzeUF0dHJWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsKICByZXR1cm4gdmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZQp9OwoKLyogICovCgpmdW5jdGlvbiBnZW5DbGFzc0ZvclZub2RlICh2bm9kZSkgewogIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlOwogIHZhciBjaGlsZE5vZGUgPSB2bm9kZTsKICB3aGlsZSAoaXNEZWYoY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlKSkgewogICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEpIHsKICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGNoaWxkTm9kZS5kYXRhLCBkYXRhKTsKICAgIH0KICB9CiAgd2hpbGUgKGlzRGVmKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHsKICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkgewogICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoZGF0YSwgcGFyZW50Tm9kZS5kYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlbmRlckNsYXNzKGRhdGEuc3RhdGljQ2xhc3MsIGRhdGEuY2xhc3MpCn0KCmZ1bmN0aW9uIG1lcmdlQ2xhc3NEYXRhIChjaGlsZCwgcGFyZW50KSB7CiAgcmV0dXJuIHsKICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksCiAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpCiAgICAgID8gW2NoaWxkLmNsYXNzLCBwYXJlbnQuY2xhc3NdCiAgICAgIDogcGFyZW50LmNsYXNzCiAgfQp9CgpmdW5jdGlvbiByZW5kZXJDbGFzcyAoCiAgc3RhdGljQ2xhc3MsCiAgZHluYW1pY0NsYXNzCikgewogIGlmIChpc0RlZihzdGF0aWNDbGFzcykgfHwgaXNEZWYoZHluYW1pY0NsYXNzKSkgewogICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSkKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7CiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJykKfQoKZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpCiAgfQogIGlmIChpc09iamVjdCh2YWx1ZSkpIHsKICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpCiAgfQogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICByZXR1cm4gdmFsdWUKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIHZhciBzdHJpbmdpZmllZDsKICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgaWYgKHZhbHVlW2tleV0pIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBrZXk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgbmFtZXNwYWNlTWFwID0gewogIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywKICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcKfTsKCnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKAogICdodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSwnICsKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLCcgKwogICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICsKICAnYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LCcgKwogICdzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbywnICsKICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArCiAgJ2NhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLCcgKwogICdidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLCcgKwogICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgKwogICdkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksJyArCiAgJ2NvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QnCik7CgovLyB0aGlzIG1hcCBpcyBpbnRlbnRpb25hbGx5IHNlbGVjdGl2ZSwgb25seSBjb3ZlcmluZyBTVkcgZWxlbWVudHMgdGhhdCBtYXkKLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy4KdmFyIGlzU1ZHID0gbWFrZU1hcCgKICAnc3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLCcgKwogICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICsKICAncG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldycsCiAgdHJ1ZQopOwoKdmFyIGlzUHJlVGFnID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gdGFnID09PSAncHJlJzsgfTsKCnZhciBpc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKHRhZykgewogIHJldHVybiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWRyh0YWcpCn07CgpmdW5jdGlvbiBnZXRUYWdOYW1lc3BhY2UgKHRhZykgewogIGlmIChpc1NWRyh0YWcpKSB7CiAgICByZXR1cm4gJ3N2ZycKICB9CiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MCiAgLy8gbm90ZSBpdCBkb2Vzbid0IHN1cHBvcnQgb3RoZXIgTWF0aE1MIGVsZW1lbnRzIGJlaW5nIGNvbXBvbmVudCByb290cwogIGlmICh0YWcgPT09ICdtYXRoJykgewogICAgcmV0dXJuICdtYXRoJwogIH0KfQoKdmFyIHVua25vd25FbGVtZW50Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpmdW5jdGlvbiBpc1Vua25vd25FbGVtZW50ICh0YWcpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWluQnJvd3NlcikgewogICAgcmV0dXJuIHRydWUKICB9CiAgaWYgKGlzUmVzZXJ2ZWRUYWcodGFnKSkgewogICAgcmV0dXJuIGZhbHNlCiAgfQogIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkgewogICAgcmV0dXJuIHVua25vd25FbGVtZW50Q2FjaGVbdGFnXQogIH0KICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgaWYgKHRhZy5pbmRleE9mKCctJykgPiAtMSkgewogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjgyMTAzNjQvMTA3MDI0NAogICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoCiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTFVua25vd25FbGVtZW50IHx8CiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTEVsZW1lbnQKICAgICkpCiAgfSBlbHNlIHsKICAgIHJldHVybiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddID0gL0hUTUxVbmtub3duRWxlbWVudC8udGVzdChlbC50b1N0cmluZygpKSkKICB9Cn0KCnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpOwoKLyogICovCgovKioKICogUXVlcnkgYW4gZWxlbWVudCBzZWxlY3RvciBpZiBpdCdzIG5vdCBhbiBlbGVtZW50IGFscmVhZHkuCiAqLwpmdW5jdGlvbiBxdWVyeSAoZWwpIHsKICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgewogICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7CiAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdDYW5ub3QgZmluZCBlbGVtZW50OiAnICsgZWwKICAgICAgKTsKICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpCiAgICB9CiAgICByZXR1cm4gc2VsZWN0ZWQKICB9IGVsc2UgewogICAgcmV0dXJuIGVsCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQkMSAodGFnTmFtZSwgdm5vZGUpIHsKICB2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHsKICAgIHJldHVybiBlbG0KICB9CiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3QKICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMubXVsdGlwbGUgIT09IHVuZGVmaW5lZCkgewogICAgZWxtLnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnbXVsdGlwbGUnKTsKICB9CiAgcmV0dXJuIGVsbQp9CgpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkgewogIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlTWFwW25hbWVzcGFjZV0sIHRhZ05hbWUpCn0KCmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlICh0ZXh0KSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHsKICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KQp9CgpmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHsKICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTsKfQoKZnVuY3Rpb24gcmVtb3ZlQ2hpbGQgKG5vZGUsIGNoaWxkKSB7CiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Cn0KCmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkgewogIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwp9CgpmdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7CiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZQp9CgpmdW5jdGlvbiBuZXh0U2libGluZyAobm9kZSkgewogIHJldHVybiBub2RlLm5leHRTaWJsaW5nCn0KCmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHsKICByZXR1cm4gbm9kZS50YWdOYW1lCn0KCmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7CiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7Cn0KCmZ1bmN0aW9uIHNldFN0eWxlU2NvcGUgKG5vZGUsIHNjb3BlSWQpIHsKICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7Cn0KCgp2YXIgbm9kZU9wcyA9IE9iamVjdC5mcmVlemUoewoJY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCQxLAoJY3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsCgljcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsCgljcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LAoJaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsCglyZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsCglhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsCglwYXJlbnROb2RlOiBwYXJlbnROb2RlLAoJbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLAoJdGFnTmFtZTogdGFnTmFtZSwKCXNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCwKCXNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGUKfSk7CgovKiAgKi8KCnZhciByZWYgPSB7CiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7CiAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgICBpZiAob2xkVm5vZGUuZGF0YS5yZWYgIT09IHZub2RlLmRhdGEucmVmKSB7CiAgICAgIHJlZ2lzdGVyUmVmKG9sZFZub2RlLCB0cnVlKTsKICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpOwogICAgfQogIH0sCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHJlZ2lzdGVyUmVmKHZub2RlLCB0cnVlKTsKICB9Cn0KCmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7CiAgdmFyIGtleSA9IHZub2RlLmRhdGEucmVmOwogIGlmICghaXNEZWYoa2V5KSkgeyByZXR1cm4gfQoKICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0OwogIHZhciByZWYgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5lbG07CiAgdmFyIHJlZnMgPSB2bS4kcmVmczsKICBpZiAoaXNSZW1vdmFsKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7CiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7CiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7CiAgICAgIHJlZnNba2V5XSA9IHVuZGVmaW5lZDsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHZub2RlLmRhdGEucmVmSW5Gb3IpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsKICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsKICAgICAgfSBlbHNlIGlmIChyZWZzW2tleV0uaW5kZXhPZihyZWYpIDwgMCkgewogICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlZnNba2V5XSA9IHJlZjsKICAgIH0KICB9Cn0KCi8qKgogKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnkKICogU2ltb24gRnJpaXMgVmluZHVtIChAcGFsZGVwaW5kKQogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UKICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFCiAqCiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKQogKgogKiBOb3QgdHlwZS1jaGVja2luZyB0aGlzIGJlY2F1c2UgdGhpcyBmaWxlIGlzIHBlcmYtY3JpdGljYWwgYW5kIHRoZSBjb3N0CiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LgogKi8KCnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7Cgp2YXIgaG9va3MgPSBbJ2NyZWF0ZScsICdhY3RpdmF0ZScsICd1cGRhdGUnLCAncmVtb3ZlJywgJ2Rlc3Ryb3knXTsKCmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikgewogIHJldHVybiAoCiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKAogICAgICAoCiAgICAgICAgYS50YWcgPT09IGIudGFnICYmCiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmCiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJgogICAgICAgIHNhbWVJbnB1dFR5cGUoYSwgYikKICAgICAgKSB8fCAoCiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJgogICAgICAgIGEuYXN5bmNGYWN0b3J5ID09PSBiLmFzeW5jRmFjdG9yeSAmJgogICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpCiAgICAgICkKICAgICkKICApCn0KCmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHsKICBpZiAoYS50YWcgIT09ICdpbnB1dCcpIHsgcmV0dXJuIHRydWUgfQogIHZhciBpOwogIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7CiAgdmFyIHR5cGVCID0gaXNEZWYoaSA9IGIuZGF0YSkgJiYgaXNEZWYoaSA9IGkuYXR0cnMpICYmIGkudHlwZTsKICByZXR1cm4gdHlwZUEgPT09IHR5cGVCIHx8IGlzVGV4dElucHV0VHlwZSh0eXBlQSkgJiYgaXNUZXh0SW5wdXRUeXBlKHR5cGVCKQp9CgpmdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeCAoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHsKICB2YXIgaSwga2V5OwogIHZhciBtYXAgPSB7fTsKICBmb3IgKGkgPSBiZWdpbklkeDsgaSA8PSBlbmRJZHg7ICsraSkgewogICAga2V5ID0gY2hpbGRyZW5baV0ua2V5OwogICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9CiAgfQogIHJldHVybiBtYXAKfQoKZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkgewogIHZhciBpLCBqOwogIHZhciBjYnMgPSB7fTsKCiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7CiAgdmFyIG5vZGVPcHMgPSBiYWNrZW5kLm5vZGVPcHM7CgogIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkgewogICAgY2JzW2hvb2tzW2ldXSA9IFtdOwogICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHsKICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkgewogICAgICAgIGNic1tob29rc1tpXV0ucHVzaChtb2R1bGVzW2pdW2hvb2tzW2ldXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHsKICAgIHJldHVybiBuZXcgVk5vZGUobm9kZU9wcy50YWdOYW1lKGVsbSkudG9Mb3dlckNhc2UoKSwge30sIFtdLCB1bmRlZmluZWQsIGVsbSkKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZVJtQ2IgKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHsKICAgIGZ1bmN0aW9uIHJlbW92ZSAoKSB7CiAgICAgIGlmICgtLXJlbW92ZS5saXN0ZW5lcnMgPT09IDApIHsKICAgICAgICByZW1vdmVOb2RlKGNoaWxkRWxtKTsKICAgICAgfQogICAgfQogICAgcmVtb3ZlLmxpc3RlbmVycyA9IGxpc3RlbmVyczsKICAgIHJldHVybiByZW1vdmUKICB9CgogIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7CiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTsKICAgIC8vIGVsZW1lbnQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZHVlIHRvIHYtaHRtbCAvIHYtdGV4dAogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQkJDEgKHZub2RlLCBpblZQcmUpIHsKICAgIHJldHVybiAoCiAgICAgICFpblZQcmUgJiYKICAgICAgIXZub2RlLm5zICYmCiAgICAgICEoCiAgICAgICAgY29uZmlnLmlnbm9yZWRFbGVtZW50cy5sZW5ndGggJiYKICAgICAgICBjb25maWcuaWdub3JlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGlnbm9yZSkgewogICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSkKICAgICAgICAgICAgPyBpZ25vcmUudGVzdCh2bm9kZS50YWcpCiAgICAgICAgICAgIDogaWdub3JlID09PSB2bm9kZS50YWcKICAgICAgICB9KQogICAgICApICYmCiAgICAgIGNvbmZpZy5pc1Vua25vd25FbGVtZW50KHZub2RlLnRhZykKICAgICkKICB9CgogIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7CgogIGZ1bmN0aW9uIGNyZWF0ZUVsbSAoCiAgICB2bm9kZSwKICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgIHBhcmVudEVsbSwKICAgIHJlZkVsbSwKICAgIG5lc3RlZCwKICAgIG93bmVyQXJyYXksCiAgICBpbmRleAogICkgewogICAgaWYgKGlzRGVmKHZub2RlLmVsbSkgJiYgaXNEZWYob3duZXJBcnJheSkpIHsKICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciEKICAgICAgLy8gbm93IGl0J3MgdXNlZCBhcyBhIG5ldyBub2RlLCBvdmVyd3JpdGluZyBpdHMgZWxtIHdvdWxkIGNhdXNlCiAgICAgIC8vIHBvdGVudGlhbCBwYXRjaCBlcnJvcnMgZG93biB0aGUgcm9hZCB3aGVuIGl0J3MgdXNlZCBhcyBhbiBpbnNlcnRpb24KICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmcKICAgICAgLy8gYXNzb2NpYXRlZCBET00gZWxlbWVudCBmb3IgaXQuCiAgICAgIHZub2RlID0gb3duZXJBcnJheVtpbmRleF0gPSBjbG9uZVZOb2RlKHZub2RlKTsKICAgIH0KCiAgICB2bm9kZS5pc1Jvb3RJbnNlcnQgPSAhbmVzdGVkOyAvLyBmb3IgdHJhbnNpdGlvbiBlbnRlciBjaGVjawogICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47CiAgICB2YXIgdGFnID0gdm5vZGUudGFnOwogICAgaWYgKGlzRGVmKHRhZykpIHsKICAgICAgewogICAgICAgIGlmIChkYXRhICYmIGRhdGEucHJlKSB7CiAgICAgICAgICBjcmVhdGluZ0VsbUluVlByZSsrOwogICAgICAgIH0KICAgICAgICBpZiAoaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgY3JlYXRpbmdFbG1JblZQcmUpKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArCiAgICAgICAgICAgICdyZWdpc3RlciB0aGUgY29tcG9uZW50IGNvcnJlY3RseT8gRm9yIHJlY3Vyc2l2ZSBjb21wb25lbnRzLCAnICsKICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSAibmFtZSIgb3B0aW9uLicsCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2bm9kZS5lbG0gPSB2bm9kZS5ucwogICAgICAgID8gbm9kZU9wcy5jcmVhdGVFbGVtZW50TlModm5vZGUubnMsIHRhZykKICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTsKICAgICAgc2V0U2NvcGUodm5vZGUpOwoKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIHsKICAgICAgICBjcmVhdGVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9CiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgICB9CgogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRhdGEgJiYgZGF0YS5wcmUpIHsKICAgICAgICBjcmVhdGluZ0VsbUluVlByZS0tOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpKSB7CiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlQ29tbWVudCh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfSBlbHNlIHsKICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgdmFyIGkgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIHZhciBpc1JlYWN0aXZhdGVkID0gaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpICYmIGkua2VlcEFsaXZlOwogICAgICBpZiAoaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsKICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8sIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgICAgfQogICAgICAvLyBhZnRlciBjYWxsaW5nIHRoZSBpbml0IGhvb2ssIGlmIHRoZSB2bm9kZSBpcyBhIGNoaWxkIGNvbXBvbmVudAogICAgICAvLyBpdCBzaG91bGQndmUgY3JlYXRlZCBhIGNoaWxkIGluc3RhbmNlIGFuZCBtb3VudGVkIGl0LiB0aGUgY2hpbGQKICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uCiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGVsZW1lbnQgYW5kIGJlIGRvbmUuCiAgICAgIGlmIChpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHsKICAgICAgICAgIHJlYWN0aXZhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0Q29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkgewogICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaC5hcHBseShpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCk7CiAgICAgIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCA9IG51bGw7CiAgICB9CiAgICB2bm9kZS5lbG0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS4kZWw7CiAgICBpZiAoaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICBzZXRTY29wZSh2bm9kZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC4KICAgICAgLy8gc2tpcCBhbGwgZWxlbWVudC1yZWxhdGVkIG1vZHVsZXMgZXhjZXB0IGZvciByZWYgKCMzNDU1KQogICAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rCiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKHZub2RlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlYWN0aXZhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7CiAgICB2YXIgaTsKICAgIC8vIGhhY2sgZm9yICM0MzM5OiBhIHJlYWN0aXZhdGVkIGNvbXBvbmVudCB3aXRoIGlubmVyIHRyYW5zaXRpb24KICAgIC8vIGRvZXMgbm90IHRyaWdnZXIgYmVjYXVzZSB0aGUgaW5uZXIgbm9kZSdzIGNyZWF0ZWQgaG9va3MgYXJlIG5vdCBjYWxsZWQKICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dAogICAgLy8gdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyBpdC4KICAgIHZhciBpbm5lck5vZGUgPSB2bm9kZTsKICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgaW5uZXJOb2RlID0gaW5uZXJOb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgICAgaWYgKGlzRGVmKGkgPSBpbm5lck5vZGUuZGF0YSkgJiYgaXNEZWYoaSA9IGkudHJhbnNpdGlvbikpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBjYnMuYWN0aXZhdGVbaV0oZW1wdHlOb2RlLCBpbm5lck5vZGUpOwogICAgICAgIH0KICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICAgIC8vIHVubGlrZSBhIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50LAogICAgLy8gYSByZWFjdGl2YXRlZCBrZWVwLWFsaXZlIGNvbXBvbmVudCBkb2Vzbid0IGluc2VydCBpdHNlbGYKICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkgewogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgaWYgKGlzRGVmKHJlZiQkMSkpIHsKICAgICAgICBpZiAocmVmJCQxLnBhcmVudE5vZGUgPT09IHBhcmVudCkgewogICAgICAgICAgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50LCBlbG0sIHJlZiQkMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQocGFyZW50LCBlbG0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgICB7CiAgICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKGNoaWxkcmVuKTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSwgY2hpbGRyZW4sIGkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7CiAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQodm5vZGUuZWxtLCBub2RlT3BzLmNyZWF0ZVRleHROb2RlKFN0cmluZyh2bm9kZS50ZXh0KSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNQYXRjaGFibGUgKHZub2RlKSB7CiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7CiAgICB9CiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKQogIH0KCiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICBjYnMuY3JlYXRlW2kkMV0oZW1wdHlOb2RlLCB2bm9kZSk7CiAgICB9CiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZQogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH0KICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH0KICAgIH0KICB9CgogIC8vIHNldCBzY29wZSBpZCBhdHRyaWJ1dGUgZm9yIHNjb3BlZCBDU1MuCiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuCiAgZnVuY3Rpb24gc2V0U2NvcGUgKHZub2RlKSB7CiAgICB2YXIgaTsKICAgIGlmIChpc0RlZihpID0gdm5vZGUuZm5TY29wZUlkKSkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlOwogICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkgewogICAgICAgICAgbm9kZU9wcy5zZXRTdHlsZVNjb3BlKHZub2RlLmVsbSwgaSk7CiAgICAgICAgfQogICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50OwogICAgICB9CiAgICB9CiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuCiAgICBpZiAoaXNEZWYoaSA9IGFjdGl2ZUluc3RhbmNlKSAmJgogICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmCiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJgogICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkKICAgICkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7CiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnZva2VEZXN0cm95SG9vayAodm5vZGUpIHsKICAgIHZhciBpLCBqOwogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9CiAgICB9CiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkgewogICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHsKICAgICAgICBpbnZva2VEZXN0cm95SG9vayh2bm9kZS5jaGlsZHJlbltqXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHsKICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHsKICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTsKICAgICAgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihjaC50YWcpKSB7CiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTsKICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTsKICAgICAgICB9IGVsc2UgeyAvLyBUZXh0IG5vZGUKICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkgewogICAgaWYgKGlzRGVmKHJtKSB8fCBpc0RlZih2bm9kZS5kYXRhKSkgewogICAgICB2YXIgaTsKICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTsKICAgICAgaWYgKGlzRGVmKHJtKSkgewogICAgICAgIC8vIHdlIGhhdmUgYSByZWN1cnNpdmVseSBwYXNzZWQgZG93biBybSBjYWxsYmFjawogICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnQKICAgICAgICBybS5saXN0ZW5lcnMgKz0gbGlzdGVuZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nCiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTsKICAgICAgfQogICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpc0RlZihpID0gaS5fdm5vZGUpICYmIGlzRGVmKGkuZGF0YSkpIHsKICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGksIHJtKTsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkgewogICAgICAgIGNicy5yZW1vdmVbaV0odm5vZGUsIHJtKTsKICAgICAgfQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkgewogICAgICAgIGkodm5vZGUsIHJtKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBybSgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZW1vdmVOb2RlKHZub2RlLmVsbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbiAocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDsKICAgIHZhciBuZXdTdGFydElkeCA9IDA7CiAgICB2YXIgb2xkRW5kSWR4ID0gb2xkQ2gubGVuZ3RoIC0gMTsKICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07CiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdOwogICAgdmFyIG5ld0VuZElkeCA9IG5ld0NoLmxlbmd0aCAtIDE7CiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdOwogICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTsKICAgIHZhciBvbGRLZXlUb0lkeCwgaWR4SW5PbGQsIHZub2RlVG9Nb3ZlLCByZWZFbG07CgogICAgLy8gcmVtb3ZlT25seSBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgYnkgPHRyYW5zaXRpb24tZ3JvdXA+CiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zCiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9ucwogICAgdmFyIGNhbk1vdmUgPSAhcmVtb3ZlT25seTsKCiAgICB7CiAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhuZXdDaCk7CiAgICB9CgogICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHsKICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnQKICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkgewogICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07CiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7CiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07CiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07CiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCByaWdodAogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpOwogICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsKICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTsKICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnQKICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBvbGRFbmRWbm9kZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsKICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9CiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSkKICAgICAgICAgID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldCiAgICAgICAgICA6IGZpbmRJZHhJbk9sZChuZXdTdGFydFZub2RlLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7CiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50CiAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBmYWxzZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07CiAgICAgICAgICBpZiAoc2FtZVZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgICAgICBwYXRjaFZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCB2bm9kZVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnQKICAgICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsKICAgICAgfQogICAgfQogICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7CiAgICAgIHJlZkVsbSA9IGlzVW5kZWYobmV3Q2hbbmV3RW5kSWR4ICsgMV0pID8gbnVsbCA6IG5ld0NoW25ld0VuZElkeCArIDFdLmVsbTsKICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHsKICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgb2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVLZXlzIChjaGlsZHJlbikgewogICAgdmFyIHNlZW5LZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB2bm9kZSA9IGNoaWxkcmVuW2ldOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5OwogICAgICBpZiAoaXNEZWYoa2V5KSkgewogICAgICAgIGlmIChzZWVuS2V5c1trZXldKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAoIkR1cGxpY2F0ZSBrZXlzIGRldGVjdGVkOiAnIiArIGtleSArICInLiBUaGlzIG1heSBjYXVzZSBhbiB1cGRhdGUgZXJyb3IuIiksCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZW5LZXlzW2tleV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZElkeEluT2xkIChub2RlLCBvbGRDaCwgc3RhcnQsIGVuZCkgewogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGMgPSBvbGRDaFtpXTsKICAgICAgaWYgKGlzRGVmKGMpICYmIHNhbWVWbm9kZShub2RlLCBjKSkgeyByZXR1cm4gaSB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgaWYgKG9sZFZub2RlID09PSB2bm9kZSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtOwoKICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkgewogICAgICBpZiAoaXNEZWYodm5vZGUuYXN5bmNGYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgIGh5ZHJhdGUob2xkVm5vZGUuZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybgogICAgfQoKICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy4KICAgIC8vIG5vdGUgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgLQogICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuCiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc1N0YXRpYykgJiYKICAgICAgaXNUcnVlKG9sZFZub2RlLmlzU3RhdGljKSAmJgogICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJgogICAgICAoaXNUcnVlKHZub2RlLmlzQ2xvbmVkKSB8fCBpc1RydWUodm5vZGUuaXNPbmNlKSkKICAgICkgewogICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgaTsKICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHsKICAgICAgaShvbGRWbm9kZSwgdm5vZGUpOwogICAgfQoKICAgIHZhciBvbGRDaCA9IG9sZFZub2RlLmNoaWxkcmVuOwogICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47CiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKSB7IGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTsgfQogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICAgIGlmIChpc1VuZGVmKHZub2RlLnRleHQpKSB7CiAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7CiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfQogICAgICB9IGVsc2UgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9CiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkQ2gpKSB7CiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpOwogICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7CiAgICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sICcnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7CiAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCB2bm9kZS50ZXh0KTsKICAgIH0KICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucG9zdHBhdGNoKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkgewogICAgLy8gZGVsYXkgaW5zZXJ0IGhvb2tzIGZvciBjb21wb25lbnQgcm9vdCBub2RlcywgaW52b2tlIHRoZW0gYWZ0ZXIgdGhlCiAgICAvLyBlbGVtZW50IGlzIHJlYWxseSBpbnNlcnRlZAogICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7CiAgICAgIHZub2RlLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQgPSBxdWV1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHsKICAgICAgICBxdWV1ZVtpXS5kYXRhLmhvb2suaW5zZXJ0KHF1ZXVlW2ldKTsKICAgICAgfQogICAgfQogIH0KCiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlOwogIC8vIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBza2lwIGNyZWF0ZSBob29rIGR1cmluZyBoeWRyYXRpb24gYmVjYXVzZSB0aGV5CiAgLy8gYXJlIGFscmVhZHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCBvciBoYXMgbm8gbmVlZCBmb3IgaW5pdGlhbGl6YXRpb24KICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmUKICAvLyBkZWVwIHVwZGF0ZXMgKCM3MDYzKS4KICB2YXIgaXNSZW5kZXJlZE1vZHVsZSA9IG1ha2VNYXAoJ2F0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleScpOwoKICAvLyBOb3RlOiB0aGlzIGlzIGEgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uIHNvIHdlIGNhbiBhc3N1bWUgZWxtcyBhcmUgRE9NIG5vZGVzLgogIGZ1bmN0aW9uIGh5ZHJhdGUgKGVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSB7CiAgICB2YXIgaTsKICAgIHZhciB0YWcgPSB2bm9kZS50YWc7CiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjsKICAgIGluVlByZSA9IGluVlByZSB8fCAoZGF0YSAmJiBkYXRhLnByZSk7CiAgICB2bm9kZS5lbG0gPSBlbG07CgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpICYmIGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeSkpIHsKICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIC8vIGFzc2VydCBub2RlIG1hdGNoCiAgICB7CiAgICAgIGlmICghYXNzZXJ0Tm9kZU1hdGNoKGVsbSwgdm5vZGUsIGluVlByZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgfQogICAgfQogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH0KICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS4KICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0KICAgIGlmIChpc0RlZih0YWcpKSB7CiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHsKICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW4KICAgICAgICBpZiAoIWVsbS5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gdi1odG1sIGFuZCBkb21Qcm9wczogaW5uZXJIVE1MCiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7CiAgICAgICAgICAgIGlmIChpICE9PSBlbG0uaW5uZXJIVE1MKSB7CiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkCiAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NlcnZlciBpbm5lckhUTUw6ICcsIGkpOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdjbGllbnQgaW5uZXJIVE1MOiAnLCBlbG0uaW5uZXJIVE1MKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGNvbXBhcmUgY2hpbGRyZW4gbGlzdHMKICAgICAgICAgICAgdmFyIGNoaWxkcmVuTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHsKICAgICAgICAgICAgICBpZiAoIWNoaWxkTm9kZSB8fCAhaHlkcmF0ZShjaGlsZE5vZGUsIGNoaWxkcmVuW2kkMV0sIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSkgewogICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIGNoaWxkTm9kZSBpcyBub3QgbnVsbCwgaXQgbWVhbnMgdGhlIGFjdHVhbCBjaGlsZE5vZGVzIGxpc3QgaXMKICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC4KICAgICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoIHx8IGNoaWxkTm9kZSkgewogICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZAogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgaHlkcmF0aW9uQmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGVsbS5jaGlsZE5vZGVzLCBjaGlsZHJlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgIGlmICghaXNSZW5kZXJlZE1vZHVsZShrZXkpKSB7CiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlOwogICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICAgICAgYnJlYWsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFmdWxsSW52b2tlICYmIGRhdGFbJ2NsYXNzJ10pIHsKICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzCiAgICAgICAgICB0cmF2ZXJzZShkYXRhWydjbGFzcyddKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHsKICAgICAgZWxtLmRhdGEgPSB2bm9kZS50ZXh0OwogICAgfQogICAgcmV0dXJuIHRydWUKICB9CgogIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUsIGluVlByZSkgewogICAgaWYgKGlzRGVmKHZub2RlLnRhZykpIHsKICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKAogICAgICAgICFpc1Vua25vd25FbGVtZW50JCQxKHZub2RlLCBpblZQcmUpICYmCiAgICAgICAgdm5vZGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IChub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpCiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAodm5vZGUuaXNDb21tZW50ID8gOCA6IDMpCiAgICB9CiAgfQoKICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5LCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7CiAgICAgIGlmIChpc0RlZihvbGRWbm9kZSkpIHsgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOyB9CiAgICAgIHJldHVybgogICAgfQoKICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlOwogICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdOwoKICAgIGlmIChpc1VuZGVmKG9sZFZub2RlKSkgewogICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50CiAgICAgIGlzSW5pdGlhbFBhdGNoID0gdHJ1ZTsKICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpOwogICAgICBpZiAoIWlzUmVhbEVsZW1lbnQgJiYgc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHsKICAgICAgICAvLyBwYXRjaCBleGlzdGluZyByb290IG5vZGUKICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNSZWFsRWxlbWVudCkgewogICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnQKICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQgYW5kIGlmIHdlIGNhbiBwZXJmb3JtCiAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgaHlkcmF0aW9uLgogICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHsKICAgICAgICAgICAgb2xkVm5vZGUucmVtb3ZlQXR0cmlidXRlKFNTUl9BVFRSKTsKICAgICAgICAgICAgaHlkcmF0aW5nID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1RydWUoaHlkcmF0aW5nKSkgewogICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHsKICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpOwogICAgICAgICAgICAgIHJldHVybiBvbGRWbm9kZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgICAnVGhlIGNsaWVudC1zaWRlIHJlbmRlcmVkIHZpcnR1YWwgRE9NIHRyZWUgaXMgbm90IG1hdGNoaW5nICcgKwogICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgKwogICAgICAgICAgICAgICAgJ0hUTUwgbWFya3VwLCBmb3IgZXhhbXBsZSBuZXN0aW5nIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSAnICsKICAgICAgICAgICAgICAgICc8cD4sIG9yIG1pc3NpbmcgPHRib2R5Pi4gQmFpbGluZyBoeWRyYXRpb24gYW5kIHBlcmZvcm1pbmcgJyArCiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIGVpdGhlciBub3Qgc2VydmVyLXJlbmRlcmVkLCBvciBoeWRyYXRpb24gZmFpbGVkLgogICAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5vZGUgYW5kIHJlcGxhY2UgaXQKICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnQKICAgICAgICB2YXIgb2xkRWxtID0gb2xkVm5vZGUuZWxtOwogICAgICAgIHZhciBwYXJlbnRFbG0kMSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pOwoKICAgICAgICAvLyBjcmVhdGUgbmV3IG5vZGUKICAgICAgICBjcmVhdGVFbG0oCiAgICAgICAgICB2bm9kZSwKICAgICAgICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhCiAgICAgICAgICAvLyBsZWF2aW5nIHRyYW5zaXRpb24uIE9ubHkgaGFwcGVucyB3aGVuIGNvbWJpbmluZyB0cmFuc2l0aW9uICsKICAgICAgICAgIC8vIGtlZXAtYWxpdmUgKyBIT0NzLiAoIzQ1OTApCiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtJDEsCiAgICAgICAgICBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVsbSkKICAgICAgICApOwoKICAgICAgICAvLyB1cGRhdGUgcGFyZW50IHBsYWNlaG9sZGVyIG5vZGUgZWxlbWVudCwgcmVjdXJzaXZlbHkKICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkgewogICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50OwogICAgICAgICAgdmFyIHBhdGNoYWJsZSA9IGlzUGF0Y2hhYmxlKHZub2RlKTsKICAgICAgICAgIHdoaWxlIChhbmNlc3RvcikgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgY2JzLmRlc3Ryb3lbaV0oYW5jZXN0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFuY2VzdG9yLmVsbSA9IHZub2RlLmVsbTsKICAgICAgICAgICAgaWYgKHBhdGNoYWJsZSkgewogICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICAgICAgICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgYW5jZXN0b3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyAjNjUxMwogICAgICAgICAgICAgIC8vIGludm9rZSBpbnNlcnQgaG9va3MgdGhhdCBtYXkgaGF2ZSBiZWVuIG1lcmdlZCBieSBjcmVhdGUgaG9va3MuCiAgICAgICAgICAgICAgLy8gZS5nLiBmb3IgZGlyZWN0aXZlcyB0aGF0IHVzZXMgdGhlICJpbnNlcnRlZCIgaG9vay4KICAgICAgICAgICAgICB2YXIgaW5zZXJ0ID0gYW5jZXN0b3IuZGF0YS5ob29rLmluc2VydDsKICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkgewogICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgaW5kZXggMSB0byBhdm9pZCByZS1pbnZva2luZyBjb21wb25lbnQgbW91bnRlZCBob29rCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDIgPSAxOyBpJDIgPCBpbnNlcnQuZm5zLmxlbmd0aDsgaSQyKyspIHsKICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlZ2lzdGVyUmVmKGFuY2VzdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRlc3Ryb3kgb2xkIG5vZGUKICAgICAgICBpZiAoaXNEZWYocGFyZW50RWxtJDEpKSB7CiAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtJDEsIFtvbGRWbm9kZV0sIDAsIDApOwogICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkgewogICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpOwogICAgcmV0dXJuIHZub2RlLmVsbQogIH0KfQoKLyogICovCgp2YXIgZGlyZWN0aXZlcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsCiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLAogIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7CiAgICB1cGRhdGVEaXJlY3RpdmVzKHZub2RlLCBlbXB0eU5vZGUpOwogIH0KfQoKZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7CiAgaWYgKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcyB8fCB2bm9kZS5kYXRhLmRpcmVjdGl2ZXMpIHsKICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTsKICB9Cn0KCmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBpc0NyZWF0ZSA9IG9sZFZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTsKICB2YXIgbmV3RGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSh2bm9kZS5kYXRhLmRpcmVjdGl2ZXMsIHZub2RlLmNvbnRleHQpOwoKICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTsKICB2YXIgZGlyc1dpdGhQb3N0cGF0Y2ggPSBbXTsKCiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7CiAgZm9yIChrZXkgaW4gbmV3RGlycykgewogICAgb2xkRGlyID0gb2xkRGlyc1trZXldOwogICAgZGlyID0gbmV3RGlyc1trZXldOwogICAgaWYgKCFvbGREaXIpIHsKICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZAogICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmluc2VydGVkKSB7CiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZQogICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7CiAgICAgIGNhbGxIb29rJDEoZGlyLCAndXBkYXRlJywgdm5vZGUsIG9sZFZub2RlKTsKICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5jb21wb25lbnRVcGRhdGVkKSB7CiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZGlyc1dpdGhJbnNlcnQubGVuZ3RoKSB7CiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzV2l0aEluc2VydC5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhJbnNlcnRbaV0sICdpbnNlcnRlZCcsIHZub2RlLCBvbGRWbm9kZSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaXNDcmVhdGUpIHsKICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxJbnNlcnQoKTsKICAgIH0KICB9CgogIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHsKICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAncG9zdHBhdGNoJywgZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoUG9zdHBhdGNoLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICB9CiAgICB9KTsKICB9CgogIGlmICghaXNDcmVhdGUpIHsKICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHsKICAgICAgaWYgKCFuZXdEaXJzW2tleV0pIHsKICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kCiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CgpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKAogIGRpcnMsCiAgdm0KKSB7CiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFkaXJzKSB7CiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgIHJldHVybiByZXMKICB9CiAgdmFyIGksIGRpcjsKICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIGlmICghZGlyLm1vZGlmaWVycykgewogICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgZGlyLm1vZGlmaWVycyA9IGVtcHR5TW9kaWZpZXJzOwogICAgfQogICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7CiAgICBkaXIuZGVmID0gcmVzb2x2ZUFzc2V0KHZtLiRvcHRpb25zLCAnZGlyZWN0aXZlcycsIGRpci5uYW1lLCB0cnVlKTsKICB9CiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBnZXRSYXdEaXJOYW1lIChkaXIpIHsKICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyAiLiIgKyAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycyB8fCB7fSkuam9pbignLicpKSkKfQoKZnVuY3Rpb24gY2FsbEhvb2skMSAoZGlyLCBob29rLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSkgewogIHZhciBmbiA9IGRpci5kZWYgJiYgZGlyLmRlZltob29rXTsKICBpZiAoZm4pIHsKICAgIHRyeSB7CiAgICAgIGZuKHZub2RlLmVsbSwgZGlyLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGhhbmRsZUVycm9yKGUsIHZub2RlLmNvbnRleHQsICgiZGlyZWN0aXZlICIgKyAoZGlyLm5hbWUpICsgIiAiICsgaG9vayArICIgaG9vayIpKTsKICAgIH0KICB9Cn0KCnZhciBiYXNlTW9kdWxlcyA9IFsKICByZWYsCiAgZGlyZWN0aXZlcwpdCgovKiAgKi8KCmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHsKICB2YXIgb3B0cyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgaWYgKGlzRGVmKG9wdHMpICYmIG9wdHMuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRycyA9PT0gZmFsc2UpIHsKICAgIHJldHVybgogIH0KICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLmF0dHJzKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEuYXR0cnMpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIGtleSwgY3VyLCBvbGQ7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzIHx8IHt9OwogIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKGF0dHJzLl9fb2JfXykpIHsKICAgIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYXR0cnMpOwogIH0KCiAgZm9yIChrZXkgaW4gYXR0cnMpIHsKICAgIGN1ciA9IGF0dHJzW2tleV07CiAgICBvbGQgPSBvbGRBdHRyc1trZXldOwogICAgaWYgKG9sZCAhPT0gY3VyKSB7CiAgICAgIHNldEF0dHIoZWxtLCBrZXksIGN1cik7CiAgICB9CiAgfQogIC8vICM0MzkxOiBpbiBJRTksIHNldHRpbmcgdHlwZSBjYW4gcmVzZXQgdmFsdWUgZm9yIGlucHV0W3R5cGU9cmFkaW9dCiAgLy8gIzY2NjY6IElFL0VkZ2UgZm9yY2VzIHByb2dyZXNzIHZhbHVlIGRvd24gdG8gMSBiZWZvcmUgc2V0dGluZyBhIG1heAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICgoaXNJRSB8fCBpc0VkZ2UpICYmIGF0dHJzLnZhbHVlICE9PSBvbGRBdHRycy52YWx1ZSkgewogICAgc2V0QXR0cihlbG0sICd2YWx1ZScsIGF0dHJzLnZhbHVlKTsKICB9CiAgZm9yIChrZXkgaW4gb2xkQXR0cnMpIHsKICAgIGlmIChpc1VuZGVmKGF0dHJzW2tleV0pKSB7CiAgICAgIGlmIChpc1hsaW5rKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpOwogICAgICB9IGVsc2UgaWYgKCFpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7CiAgaWYgKGVsLnRhZ05hbWUuaW5kZXhPZignLScpID4gLTEpIHsKICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTsKICB9IGVsc2UgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkgewogICAgLy8gc2V0IGF0dHJpYnV0ZSBmb3IgYmxhbmsgdmFsdWUKICAgIC8vIGUuZy4gPG9wdGlvbiBkaXNhYmxlZD5TZWxlY3Qgb25lPC9vcHRpb24+CiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICB9IGVsc2UgewogICAgICAvLyB0ZWNobmljYWxseSBhbGxvd2Z1bGxzY3JlZW4gaXMgYSBib29sZWFuIGF0dHJpYnV0ZSBmb3IgPGlmcmFtZT4sCiAgICAgIC8vIGJ1dCBGbGFzaCBleHBlY3RzIGEgdmFsdWUgb2YgInRydWUiIHdoZW4gdXNlZCBvbiA8ZW1iZWQ+IHRhZwogICAgICB2YWx1ZSA9IGtleSA9PT0gJ2FsbG93ZnVsbHNjcmVlbicgJiYgZWwudGFnTmFtZSA9PT0gJ0VNQkVEJwogICAgICAgID8gJ3RydWUnCiAgICAgICAgOiBrZXk7CiAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzRW51bWVyYXRlZEF0dHIoa2V5KSkgewogICAgZWwuc2V0QXR0cmlidXRlKGtleSwgaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZScgPyAnZmFsc2UnIDogJ3RydWUnKTsKICB9IGVsc2UgaWYgKGlzWGxpbmsoa2V5KSkgewogICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpOwogICAgfQogIH0gZWxzZSB7CiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7CiAgfQp9CgpmdW5jdGlvbiBiYXNlU2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHsKICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpOwogIH0gZWxzZSB7CiAgICAvLyAjNzEzODogSUUxMCAmIDExIGZpcmVzIGlucHV0IGV2ZW50IHdoZW4gc2V0dGluZyBwbGFjZWhvbGRlciBvbgogICAgLy8gPHRleHRhcmVhPi4uLiBibG9jayB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYW5kIHJlbW92ZSB0aGUgYmxvY2tlcgogICAgLy8gaW1tZWRpYXRlbHkuCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgKICAgICAgaXNJRSAmJiAhaXNJRTkgJiYKICAgICAgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyAmJgogICAgICBrZXkgPT09ICdwbGFjZWhvbGRlcicgJiYgIWVsLl9faWVwaAogICAgKSB7CiAgICAgIHZhciBibG9ja2VyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIH07CiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICBlbC5fX2llcGggPSB0cnVlOyAvKiBJRSBwbGFjZWhvbGRlciBwYXRjaGVkICovCiAgICB9CiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CiAgfQp9Cgp2YXIgYXR0cnMgPSB7CiAgY3JlYXRlOiB1cGRhdGVBdHRycywKICB1cGRhdGU6IHVwZGF0ZUF0dHJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlQ2xhc3MgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBlbCA9IHZub2RlLmVsbTsKICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhOwogIGlmICgKICAgIGlzVW5kZWYoZGF0YS5zdGF0aWNDbGFzcykgJiYKICAgIGlzVW5kZWYoZGF0YS5jbGFzcykgJiYgKAogICAgICBpc1VuZGVmKG9sZERhdGEpIHx8ICgKICAgICAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljQ2xhc3MpICYmCiAgICAgICAgaXNVbmRlZihvbGREYXRhLmNsYXNzKQogICAgICApCiAgICApCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjbHMgPSBnZW5DbGFzc0ZvclZub2RlKHZub2RlKTsKCiAgLy8gaGFuZGxlIHRyYW5zaXRpb24gY2xhc3NlcwogIHZhciB0cmFuc2l0aW9uQ2xhc3MgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXM7CiAgaWYgKGlzRGVmKHRyYW5zaXRpb25DbGFzcykpIHsKICAgIGNscyA9IGNvbmNhdChjbHMsIHN0cmluZ2lmeUNsYXNzKHRyYW5zaXRpb25DbGFzcykpOwogIH0KCiAgLy8gc2V0IHRoZSBjbGFzcwogIGlmIChjbHMgIT09IGVsLl9wcmV2Q2xhc3MpIHsKICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbHMpOwogICAgZWwuX3ByZXZDbGFzcyA9IGNsczsKICB9Cn0KCnZhciBrbGFzcyA9IHsKICBjcmVhdGU6IHVwZGF0ZUNsYXNzLAogIHVwZGF0ZTogdXBkYXRlQ2xhc3MKfQoKLyogICovCgp2YXIgdmFsaWREaXZpc2lvbkNoYXJSRSA9IC9bXHcpLitcLV8kXF1dLzsKCmZ1bmN0aW9uIHBhcnNlRmlsdGVycyAoZXhwKSB7CiAgdmFyIGluU2luZ2xlID0gZmFsc2U7CiAgdmFyIGluRG91YmxlID0gZmFsc2U7CiAgdmFyIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsKICB2YXIgaW5SZWdleCA9IGZhbHNlOwogIHZhciBjdXJseSA9IDA7CiAgdmFyIHNxdWFyZSA9IDA7CiAgdmFyIHBhcmVuID0gMDsKICB2YXIgbGFzdEZpbHRlckluZGV4ID0gMDsKICB2YXIgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsKCiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykgewogICAgcHJldiA9IGM7CiAgICBjID0gZXhwLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoaW5TaW5nbGUpIHsKICAgICAgaWYgKGMgPT09IDB4MjcgJiYgcHJldiAhPT0gMHg1QykgeyBpblNpbmdsZSA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7CiAgICAgIGlmIChjID09PSAweDIyICYmIHByZXYgIT09IDB4NUMpIHsgaW5Eb3VibGUgPSBmYWxzZTsgfQogICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7CiAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NUMpIHsgaW5UZW1wbGF0ZVN0cmluZyA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHsKICAgICAgaWYgKGMgPT09IDB4MmYgJiYgcHJldiAhPT0gMHg1QykgeyBpblJlZ2V4ID0gZmFsc2U7IH0KICAgIH0gZWxzZSBpZiAoCiAgICAgIGMgPT09IDB4N0MgJiYgLy8gcGlwZQogICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYKICAgICAgZXhwLmNoYXJDb2RlQXQoaSAtIDEpICE9PSAweDdDICYmCiAgICAgICFjdXJseSAmJiAhc3F1YXJlICYmICFwYXJlbgogICAgKSB7CiAgICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBmaXJzdCBmaWx0ZXIsIGVuZCBvZiBleHByZXNzaW9uCiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaEZpbHRlcigpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlIDB4MjI6IGluRG91YmxlID0gdHJ1ZTsgYnJlYWsgICAgICAgICAvLyAiCiAgICAgICAgY2FzZSAweDI3OiBpblNpbmdsZSA9IHRydWU7IGJyZWFrICAgICAgICAgLy8gJwogICAgICAgIGNhc2UgMHg2MDogaW5UZW1wbGF0ZVN0cmluZyA9IHRydWU7IGJyZWFrIC8vIGAKICAgICAgICBjYXNlIDB4Mjg6IHBhcmVuKys7IGJyZWFrICAgICAgICAgICAgICAgICAvLyAoCiAgICAgICAgY2FzZSAweDI5OiBwYXJlbi0tOyBicmVhayAgICAgICAgICAgICAgICAgLy8gKQogICAgICAgIGNhc2UgMHg1Qjogc3F1YXJlKys7IGJyZWFrICAgICAgICAgICAgICAgIC8vIFsKICAgICAgICBjYXNlIDB4NUQ6IHNxdWFyZS0tOyBicmVhayAgICAgICAgICAgICAgICAvLyBdCiAgICAgICAgY2FzZSAweDdCOiBjdXJseSsrOyBicmVhayAgICAgICAgICAgICAgICAgLy8gewogICAgICAgIGNhc2UgMHg3RDogY3VybHktLTsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgfQogICAgICBpZiAoYyA9PT0gMHgyZikgeyAvLyAvCiAgICAgICAgdmFyIGogPSBpIC0gMTsKICAgICAgICB2YXIgcCA9ICh2b2lkIDApOwogICAgICAgIC8vIGZpbmQgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgcHJldiBjaGFyCiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICBwID0gZXhwLmNoYXJBdChqKTsKICAgICAgICAgIGlmIChwICE9PSAnICcpIHsgYnJlYWsgfQogICAgICAgIH0KICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkgewogICAgICAgICAgaW5SZWdleCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsKICB9IGVsc2UgaWYgKGxhc3RGaWx0ZXJJbmRleCAhPT0gMCkgewogICAgcHVzaEZpbHRlcigpOwogIH0KCiAgZnVuY3Rpb24gcHVzaEZpbHRlciAoKSB7CiAgICAoZmlsdGVycyB8fCAoZmlsdGVycyA9IFtdKSkucHVzaChleHAuc2xpY2UobGFzdEZpbHRlckluZGV4LCBpKS50cmltKCkpOwogICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgfQoKICBpZiAoZmlsdGVycykgewogICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSk7CiAgICB9CiAgfQoKICByZXR1cm4gZXhwcmVzc2lvbgp9CgpmdW5jdGlvbiB3cmFwRmlsdGVyIChleHAsIGZpbHRlcikgewogIHZhciBpID0gZmlsdGVyLmluZGV4T2YoJygnKTsKICBpZiAoaSA8IDApIHsKICAgIC8vIF9mOiByZXNvbHZlRmlsdGVyCiAgICByZXR1cm4gKCJfZihcIiIgKyBmaWx0ZXIgKyAiXCIpKCIgKyBleHAgKyAiKSIpCiAgfSBlbHNlIHsKICAgIHZhciBuYW1lID0gZmlsdGVyLnNsaWNlKDAsIGkpOwogICAgdmFyIGFyZ3MgPSBmaWx0ZXIuc2xpY2UoaSArIDEpOwogICAgcmV0dXJuICgiX2YoXCIiICsgbmFtZSArICJcIikoIiArIGV4cCArIChhcmdzICE9PSAnKScgPyAnLCcgKyBhcmdzIDogYXJncykpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGJhc2VXYXJuIChtc2cpIHsKICBjb25zb2xlLmVycm9yKCgiW1Z1ZSBjb21waWxlcl06ICIgKyBtc2cpKTsKfQoKZnVuY3Rpb24gcGx1Y2tNb2R1bGVGdW5jdGlvbiAoCiAgbW9kdWxlcywKICBrZXkKKSB7CiAgcmV0dXJuIG1vZHVsZXMKICAgID8gbW9kdWxlcy5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1ba2V5XTsgfSkuZmlsdGVyKGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9KQogICAgOiBbXQp9CgpmdW5jdGlvbiBhZGRQcm9wIChlbCwgbmFtZSwgdmFsdWUpIHsKICAoZWwucHJvcHMgfHwgKGVsLnByb3BzID0gW10pKS5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOwogIGVsLnBsYWluID0gZmFsc2U7Cn0KCmZ1bmN0aW9uIGFkZEF0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIChlbC5hdHRycyB8fCAoZWwuYXR0cnMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7CiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKLy8gYWRkIGEgcmF3IGF0dHIgKHVzZSB0aGlzIGluIHByZVRyYW5zZm9ybXMpCmZ1bmN0aW9uIGFkZFJhd0F0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIGVsLmF0dHJzTWFwW25hbWVdID0gdmFsdWU7CiAgZWwuYXR0cnNMaXN0LnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7Cn0KCmZ1bmN0aW9uIGFkZERpcmVjdGl2ZSAoCiAgZWwsCiAgbmFtZSwKICByYXdOYW1lLAogIHZhbHVlLAogIGFyZywKICBtb2RpZmllcnMKKSB7CiAgKGVsLmRpcmVjdGl2ZXMgfHwgKGVsLmRpcmVjdGl2ZXMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCByYXdOYW1lOiByYXdOYW1lLCB2YWx1ZTogdmFsdWUsIGFyZzogYXJnLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9KTsKICBlbC5wbGFpbiA9IGZhbHNlOwp9CgpmdW5jdGlvbiBhZGRIYW5kbGVyICgKICBlbCwKICBuYW1lLAogIHZhbHVlLAogIG1vZGlmaWVycywKICBpbXBvcnRhbnQsCiAgd2FybgopIHsKICBtb2RpZmllcnMgPSBtb2RpZmllcnMgfHwgZW1wdHlPYmplY3Q7CiAgLy8gd2FybiBwcmV2ZW50IGFuZCBwYXNzaXZlIG1vZGlmaWVyCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKAogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4gJiYKICAgIG1vZGlmaWVycy5wcmV2ZW50ICYmIG1vZGlmaWVycy5wYXNzaXZlCiAgKSB7CiAgICB3YXJuKAogICAgICAncGFzc2l2ZSBhbmQgcHJldmVudCBjYW5cJ3QgYmUgdXNlZCB0b2dldGhlci4gJyArCiAgICAgICdQYXNzaXZlIGhhbmRsZXIgY2FuXCd0IHByZXZlbnQgZGVmYXVsdCBldmVudC4nCiAgICApOwogIH0KCiAgLy8gY2hlY2sgY2FwdHVyZSBtb2RpZmllcgogIGlmIChtb2RpZmllcnMuY2FwdHVyZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5jYXB0dXJlOwogICAgbmFtZSA9ICchJyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIGNhcHR1cmVkCiAgfQogIGlmIChtb2RpZmllcnMub25jZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5vbmNlOwogICAgbmFtZSA9ICd+JyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIG9uY2UKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKG1vZGlmaWVycy5wYXNzaXZlKSB7CiAgICBkZWxldGUgbW9kaWZpZXJzLnBhc3NpdmU7CiAgICBuYW1lID0gJyYnICsgbmFtZTsgLy8gbWFyayB0aGUgZXZlbnQgYXMgcGFzc2l2ZQogIH0KCiAgLy8gbm9ybWFsaXplIGNsaWNrLnJpZ2h0IGFuZCBjbGljay5taWRkbGUgc2luY2UgdGhleSBkb24ndCBhY3R1YWxseSBmaXJlCiAgLy8gdGhpcyBpcyB0ZWNobmljYWxseSBicm93c2VyLXNwZWNpZmljLCBidXQgYXQgbGVhc3QgZm9yIG5vdyBicm93c2VycyBhcmUKICAvLyB0aGUgb25seSB0YXJnZXQgZW52cyB0aGF0IGhhdmUgcmlnaHQvbWlkZGxlIGNsaWNrcy4KICBpZiAobmFtZSA9PT0gJ2NsaWNrJykgewogICAgaWYgKG1vZGlmaWVycy5yaWdodCkgewogICAgICBuYW1lID0gJ2NvbnRleHRtZW51JzsKICAgICAgZGVsZXRlIG1vZGlmaWVycy5yaWdodDsKICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLm1pZGRsZSkgewogICAgICBuYW1lID0gJ21vdXNldXAnOwogICAgfQogIH0KCiAgdmFyIGV2ZW50czsKICBpZiAobW9kaWZpZXJzLm5hdGl2ZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5uYXRpdmU7CiAgICBldmVudHMgPSBlbC5uYXRpdmVFdmVudHMgfHwgKGVsLm5hdGl2ZUV2ZW50cyA9IHt9KTsKICB9IGVsc2UgewogICAgZXZlbnRzID0gZWwuZXZlbnRzIHx8IChlbC5ldmVudHMgPSB7fSk7CiAgfQoKICB2YXIgbmV3SGFuZGxlciA9IHsKICAgIHZhbHVlOiB2YWx1ZS50cmltKCkKICB9OwogIGlmIChtb2RpZmllcnMgIT09IGVtcHR5T2JqZWN0KSB7CiAgICBuZXdIYW5kbGVyLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKICB9CgogIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoQXJyYXkuaXNBcnJheShoYW5kbGVycykpIHsKICAgIGltcG9ydGFudCA/IGhhbmRsZXJzLnVuc2hpZnQobmV3SGFuZGxlcikgOiBoYW5kbGVycy5wdXNoKG5ld0hhbmRsZXIpOwogIH0gZWxzZSBpZiAoaGFuZGxlcnMpIHsKICAgIGV2ZW50c1tuYW1lXSA9IGltcG9ydGFudCA/IFtuZXdIYW5kbGVyLCBoYW5kbGVyc10gOiBbaGFuZGxlcnMsIG5ld0hhbmRsZXJdOwogIH0gZWxzZSB7CiAgICBldmVudHNbbmFtZV0gPSBuZXdIYW5kbGVyOwogIH0KCiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0QmluZGluZ0F0dHIgKAogIGVsLAogIG5hbWUsCiAgZ2V0U3RhdGljCikgewogIHZhciBkeW5hbWljVmFsdWUgPQogICAgZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJzonICsgbmFtZSkgfHwKICAgIGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWJpbmQ6JyArIG5hbWUpOwogIGlmIChkeW5hbWljVmFsdWUgIT0gbnVsbCkgewogICAgcmV0dXJuIHBhcnNlRmlsdGVycyhkeW5hbWljVmFsdWUpCiAgfSBlbHNlIGlmIChnZXRTdGF0aWMgIT09IGZhbHNlKSB7CiAgICB2YXIgc3RhdGljVmFsdWUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCBuYW1lKTsKICAgIGlmIChzdGF0aWNWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0aWNWYWx1ZSkKICAgIH0KICB9Cn0KCi8vIG5vdGU6IHRoaXMgb25seSByZW1vdmVzIHRoZSBhdHRyIGZyb20gdGhlIEFycmF5IChhdHRyc0xpc3QpIHNvIHRoYXQgaXQKLy8gZG9lc24ndCBnZXQgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NBdHRycy4KLy8gQnkgZGVmYXVsdCBpdCBkb2VzIE5PVCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwIChhdHRyc01hcCkgYmVjYXVzZSB0aGUgbWFwIGlzCi8vIG5lZWRlZCBkdXJpbmcgY29kZWdlbi4KZnVuY3Rpb24gZ2V0QW5kUmVtb3ZlQXR0ciAoCiAgZWwsCiAgbmFtZSwKICByZW1vdmVGcm9tTWFwCikgewogIHZhciB2YWw7CiAgaWYgKCh2YWwgPSBlbC5hdHRyc01hcFtuYW1lXSkgIT0gbnVsbCkgewogICAgdmFyIGxpc3QgPSBlbC5hdHRyc0xpc3Q7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICBsaXN0LnNwbGljZShpLCAxKTsKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQogIGlmIChyZW1vdmVGcm9tTWFwKSB7CiAgICBkZWxldGUgZWwuYXR0cnNNYXBbbmFtZV07CiAgfQogIHJldHVybiB2YWwKfQoKLyogICovCgovKioKICogQ3Jvc3MtcGxhdGZvcm0gY29kZSBnZW5lcmF0aW9uIGZvciBjb21wb25lbnQgdi1tb2RlbAogKi8KZnVuY3Rpb24gZ2VuQ29tcG9uZW50TW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgcmVmID0gbW9kaWZpZXJzIHx8IHt9OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CgogIHZhciBiYXNlVmFsdWVFeHByZXNzaW9uID0gJyQkdic7CiAgdmFyIHZhbHVlRXhwcmVzc2lvbiA9IGJhc2VWYWx1ZUV4cHJlc3Npb247CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9CiAgICAgICIodHlwZW9mICIgKyBiYXNlVmFsdWVFeHByZXNzaW9uICsgIiA9PT0gJ3N0cmluZyciICsKICAgICAgIj8gIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiLnRyaW0oKSIgKwogICAgICAiOiAiICsgYmFzZVZhbHVlRXhwcmVzc2lvbiArICIpIjsKICB9CiAgaWYgKG51bWJlcikgewogICAgdmFsdWVFeHByZXNzaW9uID0gIl9uKCIgKyB2YWx1ZUV4cHJlc3Npb24gKyAiKSI7CiAgfQogIHZhciBhc3NpZ25tZW50ID0gZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIHZhbHVlRXhwcmVzc2lvbik7CgogIGVsLm1vZGVsID0gewogICAgdmFsdWU6ICgiKCIgKyB2YWx1ZSArICIpIiksCiAgICBleHByZXNzaW9uOiAoIlwiIiArIHZhbHVlICsgIlwiIiksCiAgICBjYWxsYmFjazogKCJmdW5jdGlvbiAoIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiKSB7IiArIGFzc2lnbm1lbnQgKyAifSIpCiAgfTsKfQoKLyoqCiAqIENyb3NzLXBsYXRmb3JtIGNvZGVnZW4gaGVscGVyIGZvciBnZW5lcmF0aW5nIHYtbW9kZWwgdmFsdWUgYXNzaWdubWVudCBjb2RlLgogKi8KZnVuY3Rpb24gZ2VuQXNzaWdubWVudENvZGUgKAogIHZhbHVlLAogIGFzc2lnbm1lbnQKKSB7CiAgdmFyIHJlcyA9IHBhcnNlTW9kZWwodmFsdWUpOwogIGlmIChyZXMua2V5ID09PSBudWxsKSB7CiAgICByZXR1cm4gKHZhbHVlICsgIj0iICsgYXNzaWdubWVudCkKICB9IGVsc2UgewogICAgcmV0dXJuICgiJHNldCgiICsgKHJlcy5leHApICsgIiwgIiArIChyZXMua2V5KSArICIsICIgKyBhc3NpZ25tZW50ICsgIikiKQogIH0KfQoKLyoqCiAqIFBhcnNlIGEgdi1tb2RlbCBleHByZXNzaW9uIGludG8gYSBiYXNlIHBhdGggYW5kIGEgZmluYWwga2V5IHNlZ21lbnQuCiAqIEhhbmRsZXMgYm90aCBkb3QtcGF0aCBhbmQgcG9zc2libGUgc3F1YXJlIGJyYWNrZXRzLgogKgogKiBQb3NzaWJsZSBjYXNlczoKICoKICogLSB0ZXN0CiAqIC0gdGVzdFtrZXldCiAqIC0gdGVzdFt0ZXN0MVtrZXldXQogKiAtIHRlc3RbImEiXVtrZXldCiAqIC0geHh4LnRlc3RbYVthXS50ZXN0MVtrZXldXQogKiAtIHRlc3QueHh4LmFbImFzYSJdW3Rlc3QxW2tleV1dCiAqCiAqLwoKdmFyIGxlbjsKdmFyIHN0cjsKdmFyIGNocjsKdmFyIGluZGV4JDE7CnZhciBleHByZXNzaW9uUG9zOwp2YXIgZXhwcmVzc2lvbkVuZFBvczsKCgoKZnVuY3Rpb24gcGFyc2VNb2RlbCAodmFsKSB7CiAgLy8gRml4IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvcHVsbC83NzMwCiAgLy8gYWxsb3cgdi1tb2RlbD0ib2JqLnZhbCAiICh0cmFpbGluZyB3aGl0ZXNwYWNlKQogIHZhbCA9IHZhbC50cmltKCk7CiAgbGVuID0gdmFsLmxlbmd0aDsKCiAgaWYgKHZhbC5pbmRleE9mKCdbJykgPCAwIHx8IHZhbC5sYXN0SW5kZXhPZignXScpIDwgbGVuIC0gMSkgewogICAgaW5kZXgkMSA9IHZhbC5sYXN0SW5kZXhPZignLicpOwogICAgaWYgKGluZGV4JDEgPiAtMSkgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLnNsaWNlKDAsIGluZGV4JDEpLAogICAgICAgIGtleTogJyInICsgdmFsLnNsaWNlKGluZGV4JDEgKyAxKSArICciJwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLAogICAgICAgIGtleTogbnVsbAogICAgICB9CiAgICB9CiAgfQoKICBzdHIgPSB2YWw7CiAgaW5kZXgkMSA9IGV4cHJlc3Npb25Qb3MgPSBleHByZXNzaW9uRW5kUG9zID0gMDsKCiAgd2hpbGUgKCFlb2YoKSkgewogICAgY2hyID0gbmV4dCgpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QikgewogICAgICBwYXJzZUJyYWNrZXQoY2hyKTsKICAgIH0KICB9CgogIHJldHVybiB7CiAgICBleHA6IHZhbC5zbGljZSgwLCBleHByZXNzaW9uUG9zKSwKICAgIGtleTogdmFsLnNsaWNlKGV4cHJlc3Npb25Qb3MgKyAxLCBleHByZXNzaW9uRW5kUG9zKQogIH0KfQoKZnVuY3Rpb24gbmV4dCAoKSB7CiAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgkMSkKfQoKZnVuY3Rpb24gZW9mICgpIHsKICByZXR1cm4gaW5kZXgkMSA+PSBsZW4KfQoKZnVuY3Rpb24gaXNTdHJpbmdTdGFydCAoY2hyKSB7CiAgcmV0dXJuIGNociA9PT0gMHgyMiB8fCBjaHIgPT09IDB4MjcKfQoKZnVuY3Rpb24gcGFyc2VCcmFja2V0IChjaHIpIHsKICB2YXIgaW5CcmFja2V0ID0gMTsKICBleHByZXNzaW9uUG9zID0gaW5kZXgkMTsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAoY2hyID09PSAweDVCKSB7IGluQnJhY2tldCsrOyB9CiAgICBpZiAoY2hyID09PSAweDVEKSB7IGluQnJhY2tldC0tOyB9CiAgICBpZiAoaW5CcmFja2V0ID09PSAwKSB7CiAgICAgIGV4cHJlc3Npb25FbmRQb3MgPSBpbmRleCQxOwogICAgICBicmVhawogICAgfQogIH0KfQoKZnVuY3Rpb24gcGFyc2VTdHJpbmcgKGNocikgewogIHZhciBzdHJpbmdRdW90ZSA9IGNocjsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoY2hyID09PSBzdHJpbmdRdW90ZSkgewogICAgICBicmVhawogICAgfQogIH0KfQoKLyogICovCgp2YXIgd2FybiQxOwoKLy8gaW4gc29tZSBjYXNlcywgdGhlIGV2ZW50IHVzZWQgaGFzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZQovLyBzbyB3ZSB1c2VkIHNvbWUgcmVzZXJ2ZWQgdG9rZW5zIGR1cmluZyBjb21waWxlLgp2YXIgUkFOR0VfVE9LRU4gPSAnX19yJzsKdmFyIENIRUNLQk9YX1JBRElPX1RPS0VOID0gJ19fYyc7CgpmdW5jdGlvbiBtb2RlbCAoCiAgZWwsCiAgZGlyLAogIF93YXJuCikgewogIHdhcm4kMSA9IF93YXJuOwogIHZhciB2YWx1ZSA9IGRpci52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVyczsKICB2YXIgdGFnID0gZWwudGFnOwogIHZhciB0eXBlID0gZWwuYXR0cnNNYXAudHlwZTsKCiAgewogICAgLy8gaW5wdXRzIHdpdGggdHlwZT0iZmlsZSIgYXJlIHJlYWQgb25seSBhbmQgc2V0dGluZyB0aGUgaW5wdXQncwogICAgLy8gdmFsdWUgd2lsbCB0aHJvdyBhbiBlcnJvci4KICAgIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2ZpbGUnKSB7CiAgICAgIHdhcm4kMSgKICAgICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIiB0eXBlPVwiZmlsZVwiPjpcbiIgKwogICAgICAgICJGaWxlIGlucHV0cyBhcmUgcmVhZCBvbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLiIKICAgICAgKTsKICAgIH0KICB9CgogIGlmIChlbC5jb21wb25lbnQpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgIGdlblNlbGVjdChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2NoZWNrYm94JykgewogICAgZ2VuQ2hlY2tib3hNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ3JhZGlvJykgewogICAgZ2VuUmFkaW9Nb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7CiAgICBnZW5EZWZhdWx0TW9kZWwoZWwsIHZhbHVlLCBtb2RpZmllcnMpOwogIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgewogICAgd2FybiQxKAogICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIj46ICIgKwogICAgICAidi1tb2RlbCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZWxlbWVudCB0eXBlLiAiICsKICAgICAgJ0lmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbnRlbnRlZGl0YWJsZSwgaXRcJ3MgcmVjb21tZW5kZWQgdG8gJyArCiAgICAgICd3cmFwIGEgbGlicmFyeSBkZWRpY2F0ZWQgZm9yIHRoYXQgcHVycG9zZSBpbnNpZGUgYSBjdXN0b20gY29tcG9uZW50LicKICAgICk7CiAgfQoKICAvLyBlbnN1cmUgcnVudGltZSBkaXJlY3RpdmUgbWV0YWRhdGEKICByZXR1cm4gdHJ1ZQp9CgpmdW5jdGlvbiBnZW5DaGVja2JveE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciB2YWx1ZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3ZhbHVlJykgfHwgJ251bGwnOwogIHZhciB0cnVlVmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICd0cnVlLXZhbHVlJykgfHwgJ3RydWUnOwogIHZhciBmYWxzZVZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnZmFsc2UtdmFsdWUnKSB8fCAnZmFsc2UnOwogIGFkZFByb3AoZWwsICdjaGVja2VkJywKICAgICJBcnJheS5pc0FycmF5KCIgKyB2YWx1ZSArICIpIiArCiAgICAiP19pKCIgKyB2YWx1ZSArICIsIiArIHZhbHVlQmluZGluZyArICIpPi0xIiArICgKICAgICAgdHJ1ZVZhbHVlQmluZGluZyA9PT0gJ3RydWUnCiAgICAgICAgPyAoIjooIiArIHZhbHVlICsgIikiKQogICAgICAgIDogKCI6X3EoIiArIHZhbHVlICsgIiwiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpIikKICAgICkKICApOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLAogICAgInZhciAkJGE9IiArIHZhbHVlICsgIiwiICsKICAgICAgICAnJCRlbD0kZXZlbnQudGFyZ2V0LCcgKwogICAgICAgICIkJGM9JCRlbC5jaGVja2VkPygiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpOigiICsgZmFsc2VWYWx1ZUJpbmRpbmcgKyAiKTsiICsKICAgICdpZihBcnJheS5pc0FycmF5KCQkYSkpeycgKwogICAgICAidmFyICQkdj0iICsgKG51bWJlciA/ICdfbignICsgdmFsdWVCaW5kaW5nICsgJyknIDogdmFsdWVCaW5kaW5nKSArICIsIiArCiAgICAgICAgICAnJCRpPV9pKCQkYSwkJHYpOycgKwogICAgICAiaWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIgKyAoZ2VuQXNzaWdubWVudENvZGUodmFsdWUsICckJGEuY29uY2F0KFskJHZdKScpKSArICIpfSIgKwogICAgICAiZWxzZXskJGk+LTEmJigiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSknKSkgKyAiKX0iICsKICAgICJ9ZWxzZXsiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRjJykpICsgIn0iLAogICAgbnVsbCwgdHJ1ZQogICk7Cn0KCmZ1bmN0aW9uIGdlblJhZGlvTW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgbnVtYmVyID0gbW9kaWZpZXJzICYmIG1vZGlmaWVycy5udW1iZXI7CiAgdmFyIHZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKSB8fCAnbnVsbCc7CiAgdmFsdWVCaW5kaW5nID0gbnVtYmVyID8gKCJfbigiICsgdmFsdWVCaW5kaW5nICsgIikiKSA6IHZhbHVlQmluZGluZzsKICBhZGRQcm9wKGVsLCAnY2hlY2tlZCcsICgiX3EoIiArIHZhbHVlICsgIiwiICsgdmFsdWVCaW5kaW5nICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsIGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCB2YWx1ZUJpbmRpbmcpLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuU2VsZWN0ICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciBzZWxlY3RlZFZhbCA9ICJBcnJheS5wcm90b3R5cGUuZmlsdGVyIiArCiAgICAiLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLGZ1bmN0aW9uKG8pe3JldHVybiBvLnNlbGVjdGVkfSkiICsKICAgICIubWFwKGZ1bmN0aW9uKG8pe3ZhciB2YWwgPSBcIl92YWx1ZVwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7IiArCiAgICAicmV0dXJuICIgKyAobnVtYmVyID8gJ19uKHZhbCknIDogJ3ZhbCcpICsgIn0pIjsKCiAgdmFyIGFzc2lnbm1lbnQgPSAnJGV2ZW50LnRhcmdldC5tdWx0aXBsZSA/ICQkc2VsZWN0ZWRWYWwgOiAkJHNlbGVjdGVkVmFsWzBdJzsKICB2YXIgY29kZSA9ICJ2YXIgJCRzZWxlY3RlZFZhbCA9ICIgKyBzZWxlY3RlZFZhbCArICI7IjsKICBjb2RlID0gY29kZSArICIgIiArIChnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgYXNzaWdubWVudCkpOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLCBjb2RlLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuRGVmYXVsdE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIHR5cGUgPSBlbC5hdHRyc01hcC50eXBlOwoKICAvLyB3YXJuIGlmIHYtYmluZDp2YWx1ZSBjb25mbGljdHMgd2l0aCB2LW1vZGVsCiAgLy8gZXhjZXB0IGZvciBpbnB1dHMgd2l0aCB2LWJpbmQ6dHlwZQogIHsKICAgIHZhciB2YWx1ZSQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddIHx8IGVsLmF0dHJzTWFwWyc6dmFsdWUnXTsKICAgIHZhciB0eXBlQmluZGluZyA9IGVsLmF0dHJzTWFwWyd2LWJpbmQ6dHlwZSddIHx8IGVsLmF0dHJzTWFwWyc6dHlwZSddOwogICAgaWYgKHZhbHVlJDEgJiYgIXR5cGVCaW5kaW5nKSB7CiAgICAgIHZhciBiaW5kaW5nID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddID8gJ3YtYmluZDp2YWx1ZScgOiAnOnZhbHVlJzsKICAgICAgd2FybiQxKAogICAgICAgIGJpbmRpbmcgKyAiPVwiIiArIHZhbHVlJDEgKyAiXCIgY29uZmxpY3RzIHdpdGggdi1tb2RlbCBvbiB0aGUgc2FtZSBlbGVtZW50ICIgKwogICAgICAgICdiZWNhdXNlIHRoZSBsYXR0ZXIgYWxyZWFkeSBleHBhbmRzIHRvIGEgdmFsdWUgYmluZGluZyBpbnRlcm5hbGx5JwogICAgICApOwogICAgfQogIH0KCiAgdmFyIHJlZiA9IG1vZGlmaWVycyB8fCB7fTsKICB2YXIgbGF6eSA9IHJlZi5sYXp5OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CiAgdmFyIG5lZWRDb21wb3NpdGlvbkd1YXJkID0gIWxhenkgJiYgdHlwZSAhPT0gJ3JhbmdlJzsKICB2YXIgZXZlbnQgPSBsYXp5CiAgICA/ICdjaGFuZ2UnCiAgICA6IHR5cGUgPT09ICdyYW5nZScKICAgICAgPyBSQU5HRV9UT0tFTgogICAgICA6ICdpbnB1dCc7CgogIHZhciB2YWx1ZUV4cHJlc3Npb24gPSAnJGV2ZW50LnRhcmdldC52YWx1ZSc7CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKSI7CiAgfQogIGlmIChudW1iZXIpIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICJfbigiICsgdmFsdWVFeHByZXNzaW9uICsgIikiOwogIH0KCiAgdmFyIGNvZGUgPSBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgdmFsdWVFeHByZXNzaW9uKTsKICBpZiAobmVlZENvbXBvc2l0aW9uR3VhcmQpIHsKICAgIGNvZGUgPSAiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIgKyBjb2RlOwogIH0KCiAgYWRkUHJvcChlbCwgJ3ZhbHVlJywgKCIoIiArIHZhbHVlICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgZXZlbnQsIGNvZGUsIG51bGwsIHRydWUpOwogIGlmICh0cmltIHx8IG51bWJlcikgewogICAgYWRkSGFuZGxlcihlbCwgJ2JsdXInLCAnJGZvcmNlVXBkYXRlKCknKTsKICB9Cn0KCi8qICAqLwoKLy8gbm9ybWFsaXplIHYtbW9kZWwgZXZlbnQgdG9rZW5zIHRoYXQgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLgovLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlCi8vIHRoZSB3aG9sZSBwb2ludCBpcyBlbnN1cmluZyB0aGUgdi1tb2RlbCBjYWxsYmFjayBnZXRzIGNhbGxlZCBiZWZvcmUKLy8gdXNlci1hdHRhY2hlZCBoYW5kbGVycy4KZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltSQU5HRV9UT0tFTl0pKSB7CiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50CiAgICB2YXIgZXZlbnQgPSBpc0lFID8gJ2NoYW5nZScgOiAnaW5wdXQnOwogICAgb25bZXZlbnRdID0gW10uY29uY2F0KG9uW1JBTkdFX1RPS0VOXSwgb25bZXZlbnRdIHx8IFtdKTsKICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07CiAgfQogIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gZml4ICM0NTIxIGJ1dCBubyBsb25nZXIgbmVjZXNzYXJ5CiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltDSEVDS0JPWF9SQURJT19UT0tFTl0pKSB7CiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pOwogICAgZGVsZXRlIG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXTsKICB9Cn0KCnZhciB0YXJnZXQkMTsKCmZ1bmN0aW9uIGNyZWF0ZU9uY2VIYW5kbGVyIChoYW5kbGVyLCBldmVudCwgY2FwdHVyZSkgewogIHZhciBfdGFyZ2V0ID0gdGFyZ2V0JDE7IC8vIHNhdmUgY3VycmVudCB0YXJnZXQgZWxlbWVudCBpbiBjbG9zdXJlCiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHsKICAgIHZhciByZXMgPSBoYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzICE9PSBudWxsKSB7CiAgICAgIHJlbW92ZSQyKGV2ZW50LCBvbmNlSGFuZGxlciwgY2FwdHVyZSwgX3RhcmdldCk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBhZGQkMSAoCiAgZXZlbnQsCiAgaGFuZGxlciwKICBvbmNlJCQxLAogIGNhcHR1cmUsCiAgcGFzc2l2ZQopIHsKICBoYW5kbGVyID0gd2l0aE1hY3JvVGFzayhoYW5kbGVyKTsKICBpZiAob25jZSQkMSkgeyBoYW5kbGVyID0gY3JlYXRlT25jZUhhbmRsZXIoaGFuZGxlciwgZXZlbnQsIGNhcHR1cmUpOyB9CiAgdGFyZ2V0JDEuYWRkRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlciwKICAgIHN1cHBvcnRzUGFzc2l2ZQogICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9CiAgICAgIDogY2FwdHVyZQogICk7Cn0KCmZ1bmN0aW9uIHJlbW92ZSQyICgKICBldmVudCwKICBoYW5kbGVyLAogIGNhcHR1cmUsCiAgX3RhcmdldAopIHsKICAoX3RhcmdldCB8fCB0YXJnZXQkMSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlci5fd2l0aFRhc2sgfHwgaGFuZGxlciwKICAgIGNhcHR1cmUKICApOwp9CgpmdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEub24pICYmIGlzVW5kZWYodm5vZGUuZGF0YS5vbikpIHsKICAgIHJldHVybgogIH0KICB2YXIgb24gPSB2bm9kZS5kYXRhLm9uIHx8IHt9OwogIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307CiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07CiAgbm9ybWFsaXplRXZlbnRzKG9uKTsKICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpOwogIHRhcmdldCQxID0gdW5kZWZpbmVkOwp9Cgp2YXIgZXZlbnRzID0gewogIGNyZWF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzLAogIHVwZGF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlRE9NUHJvcHMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuZG9tUHJvcHMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5kb21Qcm9wcykpIHsKICAgIHJldHVybgogIH0KICB2YXIga2V5LCBjdXI7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkUHJvcHMgPSBvbGRWbm9kZS5kYXRhLmRvbVByb3BzIHx8IHt9OwogIHZhciBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKHByb3BzLl9fb2JfXykpIHsKICAgIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHMpOwogIH0KCiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHsKICAgIGlmIChpc1VuZGVmKHByb3BzW2tleV0pKSB7CiAgICAgIGVsbVtrZXldID0gJyc7CiAgICB9CiAgfQogIGZvciAoa2V5IGluIHByb3BzKSB7CiAgICBjdXIgPSBwcm9wc1trZXldOwogICAgLy8gaWdub3JlIGNoaWxkcmVuIGlmIHRoZSBub2RlIGhhcyB0ZXh0Q29udGVudCBvciBpbm5lckhUTUwsCiAgICAvLyBhcyB0aGVzZSB3aWxsIHRocm93IGF3YXkgZXhpc3RpbmcgRE9NIG5vZGVzIGFuZCBjYXVzZSByZW1vdmFsIGVycm9ycwogICAgLy8gb24gc3Vic2VxdWVudCBwYXRjaGVzICgjMzM2MCkKICAgIGlmIChrZXkgPT09ICd0ZXh0Q29udGVudCcgfHwga2V5ID09PSAnaW5uZXJIVE1MJykgewogICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHsgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID0gMDsgfQogICAgICBpZiAoY3VyID09PSBvbGRQcm9wc1trZXldKSB7IGNvbnRpbnVlIH0KICAgICAgLy8gIzY2MDEgd29yayBhcm91bmQgQ2hyb21lIHZlcnNpb24gPD0gNTUgYnVnIHdoZXJlIHNpbmdsZSB0ZXh0Tm9kZQogICAgICAvLyByZXBsYWNlZCBieSBpbm5lckhUTUwvdGV4dENvbnRlbnQgcmV0YWlucyBpdHMgcGFyZW50Tm9kZSBwcm9wZXJ0eQogICAgICBpZiAoZWxtLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5jaGlsZE5vZGVzWzBdKTsKICAgICAgfQogICAgfQoKICAgIGlmIChrZXkgPT09ICd2YWx1ZScpIHsKICAgICAgLy8gc3RvcmUgdmFsdWUgYXMgX3ZhbHVlIGFzIHdlbGwgc2luY2UKICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZAogICAgICBlbG0uX3ZhbHVlID0gY3VyOwogICAgICAvLyBhdm9pZCByZXNldHRpbmcgY3Vyc29yIHBvc2l0aW9uIHdoZW4gdmFsdWUgaXMgdGhlIHNhbWUKICAgICAgdmFyIHN0ckN1ciA9IGlzVW5kZWYoY3VyKSA/ICcnIDogU3RyaW5nKGN1cik7CiAgICAgIGlmIChzaG91bGRVcGRhdGVWYWx1ZShlbG0sIHN0ckN1cikpIHsKICAgICAgICBlbG0udmFsdWUgPSBzdHJDdXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVsbVtrZXldID0gY3VyOwogICAgfQogIH0KfQoKLy8gY2hlY2sgcGxhdGZvcm1zL3dlYi91dGlsL2F0dHJzLmpzIGFjY2VwdFZhbHVlCgoKZnVuY3Rpb24gc2hvdWxkVXBkYXRlVmFsdWUgKGVsbSwgY2hlY2tWYWwpIHsKICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmICgKICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fAogICAgaXNOb3RJbkZvY3VzQW5kRGlydHkoZWxtLCBjaGVja1ZhbCkgfHwKICAgIGlzRGlydHlXaXRoTW9kaWZpZXJzKGVsbSwgY2hlY2tWYWwpCiAgKSkKfQoKZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHsKICAvLyByZXR1cm4gdHJ1ZSB3aGVuIHRleHRib3ggKC5udW1iZXIgYW5kIC50cmltKSBsb3NlcyBmb2N1cyBhbmQgaXRzIHZhbHVlIGlzCiAgLy8gbm90IGVxdWFsIHRvIHRoZSB1cGRhdGVkIHZhbHVlCiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlOwogIC8vICM2MTU3CiAgLy8gd29yayBhcm91bmQgSUUgYnVnIHdoZW4gYWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW4gYW4gaWZyYW1lCiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge30KICByZXR1cm4gbm90SW5Gb2N1cyAmJiBlbG0udmFsdWUgIT09IGNoZWNrVmFsCn0KCmZ1bmN0aW9uIGlzRGlydHlXaXRoTW9kaWZpZXJzIChlbG0sIG5ld1ZhbCkgewogIHZhciB2YWx1ZSA9IGVsbS52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWUKICBpZiAoaXNEZWYobW9kaWZpZXJzKSkgewogICAgaWYgKG1vZGlmaWVycy5sYXp5KSB7CiAgICAgIC8vIGlucHV0cyB3aXRoIGxhenkgc2hvdWxkIG9ubHkgYmUgdXBkYXRlZCB3aGVuIG5vdCBpbiBmb2N1cwogICAgICByZXR1cm4gZmFsc2UKICAgIH0KICAgIGlmIChtb2RpZmllcnMubnVtYmVyKSB7CiAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgIT09IHRvTnVtYmVyKG5ld1ZhbCkKICAgIH0KICAgIGlmIChtb2RpZmllcnMudHJpbSkgewogICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSBuZXdWYWwudHJpbSgpCiAgICB9CiAgfQogIHJldHVybiB2YWx1ZSAhPT0gbmV3VmFsCn0KCnZhciBkb21Qcm9wcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLAogIHVwZGF0ZTogdXBkYXRlRE9NUHJvcHMKfQoKLyogICovCgp2YXIgcGFyc2VTdHlsZVRleHQgPSBjYWNoZWQoZnVuY3Rpb24gKGNzc1RleHQpIHsKICB2YXIgcmVzID0ge307CiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXCkpL2c7CiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLzsKICBjc3NUZXh0LnNwbGl0KGxpc3REZWxpbWl0ZXIpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmIChpdGVtKSB7CiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTsKICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJlc1t0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpOwogICAgfQogIH0pOwogIHJldHVybiByZXMKfSk7CgovLyBtZXJnZSBzdGF0aWMgYW5kIGR5bmFtaWMgc3R5bGUgZGF0YSBvbiB0aGUgc2FtZSB2bm9kZQpmdW5jdGlvbiBub3JtYWxpemVTdHlsZURhdGEgKGRhdGEpIHsKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZGF0YS5zdHlsZSk7CiAgLy8gc3RhdGljIHN0eWxlIGlzIHByZS1wcm9jZXNzZWQgaW50byBhbiBvYmplY3QgZHVyaW5nIGNvbXBpbGF0aW9uCiAgLy8gYW5kIGlzIGFsd2F5cyBhIGZyZXNoIG9iamVjdCwgc28gaXQncyBzYWZlIHRvIG1lcmdlIGludG8gaXQKICByZXR1cm4gZGF0YS5zdGF0aWNTdHlsZQogICAgPyBleHRlbmQoZGF0YS5zdGF0aWNTdHlsZSwgc3R5bGUpCiAgICA6IHN0eWxlCn0KCi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3QKZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHsKICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nU3R5bGUpKSB7CiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKQogIH0KICBpZiAodHlwZW9mIGJpbmRpbmdTdHlsZSA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpCiAgfQogIHJldHVybiBiaW5kaW5nU3R5bGUKfQoKLyoqCiAqIHBhcmVudCBjb21wb25lbnQgc3R5bGUgc2hvdWxkIGJlIGFmdGVyIGNoaWxkJ3MKICogc28gdGhhdCBwYXJlbnQgY29tcG9uZW50J3Mgc3R5bGUgY291bGQgb3ZlcnJpZGUgaXQKICovCmZ1bmN0aW9uIGdldFN0eWxlICh2bm9kZSwgY2hlY2tDaGlsZCkgewogIHZhciByZXMgPSB7fTsKICB2YXIgc3R5bGVEYXRhOwoKICBpZiAoY2hlY2tDaGlsZCkgewogICAgdmFyIGNoaWxkTm9kZSA9IHZub2RlOwogICAgd2hpbGUgKGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZSkgewogICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlOwogICAgICBpZiAoCiAgICAgICAgY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhICYmCiAgICAgICAgKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YShjaGlsZE5vZGUuZGF0YSkpCiAgICAgICkgewogICAgICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICgoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHZub2RlLmRhdGEpKSkgewogICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICB9CgogIHZhciBwYXJlbnROb2RlID0gdm5vZGU7CiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7CiAgICBpZiAocGFyZW50Tm9kZS5kYXRhICYmIChzdHlsZURhdGEgPSBub3JtYWxpemVTdHlsZURhdGEocGFyZW50Tm9kZS5kYXRhKSkpIHsKICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCnZhciBjc3NWYXJSRSA9IC9eLS0vOwp2YXIgaW1wb3J0YW50UkUgPSAvXHMqIWltcG9ydGFudCQvOwp2YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGNzc1ZhclJFLnRlc3QobmFtZSkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7CiAgfSBlbHNlIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCAnJyksICdpbXBvcnRhbnQnKTsKICB9IGVsc2UgewogICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplKG5hbWUpOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAvLyBTdXBwb3J0IHZhbHVlcyBhcnJheSBjcmVhdGVkIGJ5IGF1dG9wcmVmaXhlciwgZS5nLgogICAgICAvLyB7ZGlzcGxheTogWyItd2Via2l0LWJveCIsICItbXMtZmxleGJveCIsICJmbGV4Il19CiAgICAgIC8vIFNldCB0aGVtIG9uZSBieSBvbmUsIGFuZCB0aGUgYnJvd3NlciB3aWxsIG9ubHkgc2V0IHRob3NlIGl0IGNhbiByZWNvZ25pemUKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbC5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbFtpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsOwogICAgfQogIH0KfTsKCnZhciB2ZW5kb3JOYW1lcyA9IFsnV2Via2l0JywgJ01veicsICdtcyddOwoKdmFyIGVtcHR5U3R5bGU7CnZhciBub3JtYWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHByb3ApIHsKICBlbXB0eVN0eWxlID0gZW1wdHlTdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKICBwcm9wID0gY2FtZWxpemUocHJvcCk7CiAgaWYgKHByb3AgIT09ICdmaWx0ZXInICYmIChwcm9wIGluIGVtcHR5U3R5bGUpKSB7CiAgICByZXR1cm4gcHJvcAogIH0KICB2YXIgY2FwTmFtZSA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBuYW1lID0gdmVuZG9yTmFtZXNbaV0gKyBjYXBOYW1lOwogICAgaWYgKG5hbWUgaW4gZW1wdHlTdHlsZSkgewogICAgICByZXR1cm4gbmFtZQogICAgfQogIH0KfSk7CgpmdW5jdGlvbiB1cGRhdGVTdHlsZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTsKCiAgaWYgKGlzVW5kZWYoZGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihkYXRhLnN0eWxlKSAmJgogICAgaXNVbmRlZihvbGREYXRhLnN0YXRpY1N0eWxlKSAmJiBpc1VuZGVmKG9sZERhdGEuc3R5bGUpCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjdXIsIG5hbWU7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwogIHZhciBvbGRTdGF0aWNTdHlsZSA9IG9sZERhdGEuc3RhdGljU3R5bGU7CiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZERhdGEubm9ybWFsaXplZFN0eWxlIHx8IG9sZERhdGEuc3R5bGUgfHwge307CgogIC8vIGlmIHN0YXRpYyBzdHlsZSBleGlzdHMsIHN0eWxlYmluZGluZyBhbHJlYWR5IG1lcmdlZCBpbnRvIGl0IHdoZW4gZG9pbmcgbm9ybWFsaXplU3R5bGVEYXRhCiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nOwoKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcodm5vZGUuZGF0YS5zdHlsZSkgfHwge307CgogIC8vIHN0b3JlIG5vcm1hbGl6ZWQgc3R5bGUgdW5kZXIgYSBkaWZmZXJlbnQga2V5IGZvciBuZXh0IGRpZmYKICAvLyBtYWtlIHN1cmUgdG8gY2xvbmUgaXQgaWYgaXQncyByZWFjdGl2ZSwgc2luY2UgdGhlIHVzZXIgbGlrZWx5IHdhbnRzCiAgLy8gdG8gbXV0YXRlIGl0LgogIHZub2RlLmRhdGEubm9ybWFsaXplZFN0eWxlID0gaXNEZWYoc3R5bGUuX19vYl9fKQogICAgPyBleHRlbmQoe30sIHN0eWxlKQogICAgOiBzdHlsZTsKCiAgdmFyIG5ld1N0eWxlID0gZ2V0U3R5bGUodm5vZGUsIHRydWUpOwoKICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHsKICAgIGlmIChpc1VuZGVmKG5ld1N0eWxlW25hbWVdKSkgewogICAgICBzZXRQcm9wKGVsLCBuYW1lLCAnJyk7CiAgICB9CiAgfQogIGZvciAobmFtZSBpbiBuZXdTdHlsZSkgewogICAgY3VyID0gbmV3U3R5bGVbbmFtZV07CiAgICBpZiAoY3VyICE9PSBvbGRTdHlsZVtuYW1lXSkgewogICAgICAvLyBpZTkgc2V0dGluZyB0byBudWxsIGhhcyBubyBlZmZlY3QsIG11c3QgdXNlIGVtcHR5IHN0cmluZwogICAgICBzZXRQcm9wKGVsLCBuYW1lLCBjdXIgPT0gbnVsbCA/ICcnIDogY3VyKTsKICAgIH0KICB9Cn0KCnZhciBzdHlsZSA9IHsKICBjcmVhdGU6IHVwZGF0ZVN0eWxlLAogIHVwZGF0ZTogdXBkYXRlU3R5bGUKfQoKLyogICovCgovKioKICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gYWRkQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbHMpOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgY3VyID0gIiAiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAiICI7CiAgICBpZiAoY3VyLmluZGV4T2YoJyAnICsgY2xzICsgJyAnKSA8IDApIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIChjdXIgKyBjbHMpLnRyaW0oKSk7CiAgICB9CiAgfQp9CgovKioKICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gcmVtb3ZlQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbHMpOwogICAgfQogICAgaWYgKCFlbC5jbGFzc0xpc3QubGVuZ3RoKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgIH0KICB9IGVsc2UgewogICAgdmFyIGN1ciA9ICIgIiArIChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiOwogICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJzsKICAgIHdoaWxlIChjdXIuaW5kZXhPZih0YXIpID49IDApIHsKICAgICAgY3VyID0gY3VyLnJlcGxhY2UodGFyLCAnICcpOwogICAgfQogICAgY3VyID0gY3VyLnRyaW0oKTsKICAgIGlmIChjdXIpIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGN1cik7CiAgICB9IGVsc2UgewogICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uIChkZWYpIHsKICBpZiAoIWRlZikgewogICAgcmV0dXJuCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKHR5cGVvZiBkZWYgPT09ICdvYmplY3QnKSB7CiAgICB2YXIgcmVzID0ge307CiAgICBpZiAoZGVmLmNzcyAhPT0gZmFsc2UpIHsKICAgICAgZXh0ZW5kKHJlcywgYXV0b0Nzc1RyYW5zaXRpb24oZGVmLm5hbWUgfHwgJ3YnKSk7CiAgICB9CiAgICBleHRlbmQocmVzLCBkZWYpOwogICAgcmV0dXJuIHJlcwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZiA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYpCiAgfQp9Cgp2YXIgYXV0b0Nzc1RyYW5zaXRpb24gPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHsKICByZXR1cm4gewogICAgZW50ZXJDbGFzczogKG5hbWUgKyAiLWVudGVyIiksCiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgIi1lbnRlci10byIpLAogICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyAiLWVudGVyLWFjdGl2ZSIpLAogICAgbGVhdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlIiksCiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgIi1sZWF2ZS10byIpLAogICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlLWFjdGl2ZSIpCiAgfQp9KTsKCnZhciBoYXNUcmFuc2l0aW9uID0gaW5Ccm93c2VyICYmICFpc0lFOTsKdmFyIFRSQU5TSVRJT04gPSAndHJhbnNpdGlvbic7CnZhciBBTklNQVRJT04gPSAnYW5pbWF0aW9uJzsKCi8vIFRyYW5zaXRpb24gcHJvcGVydHkvZXZlbnQgc25pZmZpbmcKdmFyIHRyYW5zaXRpb25Qcm9wID0gJ3RyYW5zaXRpb24nOwp2YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3RyYW5zaXRpb25lbmQnOwp2YXIgYW5pbWF0aW9uUHJvcCA9ICdhbmltYXRpb24nOwp2YXIgYW5pbWF0aW9uRW5kRXZlbnQgPSAnYW5pbWF0aW9uZW5kJzsKaWYgKGhhc1RyYW5zaXRpb24pIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAod2luZG93Lm9udHJhbnNpdGlvbmVuZCA9PT0gdW5kZWZpbmVkICYmCiAgICB3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kICE9PSB1bmRlZmluZWQKICApIHsKICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nOwogICAgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnOwogIH0KICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiYKICAgIHdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCAhPT0gdW5kZWZpbmVkCiAgKSB7CiAgICBhbmltYXRpb25Qcm9wID0gJ1dlYmtpdEFuaW1hdGlvbic7CiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnOwogIH0KfQoKLy8gYmluZGluZyB0byB3aW5kb3cgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaG90IHJlbG9hZCB3b3JrIGluIElFIGluIHN0cmljdCBtb2RlCnZhciByYWYgPSBpbkJyb3dzZXIKICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUKICAgID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykKICAgIDogc2V0VGltZW91dAogIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9OwoKZnVuY3Rpb24gbmV4dEZyYW1lIChmbikgewogIHJhZihmdW5jdGlvbiAoKSB7CiAgICByYWYoZm4pOwogIH0pOwp9CgpmdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICB2YXIgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXMgfHwgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcyA9IFtdKTsKICBpZiAodHJhbnNpdGlvbkNsYXNzZXMuaW5kZXhPZihjbHMpIDwgMCkgewogICAgdHJhbnNpdGlvbkNsYXNzZXMucHVzaChjbHMpOwogICAgYWRkQ2xhc3MoZWwsIGNscyk7CiAgfQp9CgpmdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7CiAgICByZW1vdmUoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpOwogIH0KICByZW1vdmVDbGFzcyhlbCwgY2xzKTsKfQoKZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzICgKICBlbCwKICBleHBlY3RlZFR5cGUsCiAgY2IKKSB7CiAgdmFyIHJlZiA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpOwogIHZhciB0eXBlID0gcmVmLnR5cGU7CiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDsKICB2YXIgcHJvcENvdW50ID0gcmVmLnByb3BDb3VudDsKICBpZiAoIXR5cGUpIHsgcmV0dXJuIGNiKCkgfQogIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDsKICB2YXIgZW5kZWQgPSAwOwogIHZhciBlbmQgPSBmdW5jdGlvbiAoKSB7CiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7CiAgICBjYigpOwogIH07CiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHsKICAgIGlmIChlLnRhcmdldCA9PT0gZWwpIHsKICAgICAgaWYgKCsrZW5kZWQgPj0gcHJvcENvdW50KSB7CiAgICAgICAgZW5kKCk7CiAgICAgIH0KICAgIH0KICB9OwogIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7CiAgICAgIGVuZCgpOwogICAgfQogIH0sIHRpbWVvdXQgKyAxKTsKICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7Cn0KCnZhciB0cmFuc2Zvcm1SRSA9IC9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLzsKCmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvIChlbCwgZXhwZWN0ZWRUeXBlKSB7CiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTsKICB2YXIgdHJhbnNpdGlvbkRlbGF5cyA9IHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEZWxheSddLnNwbGl0KCcsICcpOwogIHZhciB0cmFuc2l0aW9uRHVyYXRpb25zID0gc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7CiAgdmFyIHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTsKICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uRHVyYXRpb25zID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRHVyYXRpb24nXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpOwoKICB2YXIgdHlwZTsKICB2YXIgdGltZW91dCA9IDA7CiAgdmFyIHByb3BDb3VudCA9IDA7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gVFJBTlNJVElPTikgewogICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkgewogICAgICB0eXBlID0gVFJBTlNJVElPTjsKICAgICAgdGltZW91dCA9IHRyYW5zaXRpb25UaW1lb3V0OwogICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDsKICAgIH0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gQU5JTUFUSU9OKSB7CiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHsKICAgICAgdHlwZSA9IEFOSU1BVElPTjsKICAgICAgdGltZW91dCA9IGFuaW1hdGlvblRpbWVvdXQ7CiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7CiAgICB9CiAgfSBlbHNlIHsKICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7CiAgICB0eXBlID0gdGltZW91dCA+IDAKICAgICAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQKICAgICAgICA/IFRSQU5TSVRJT04KICAgICAgICA6IEFOSU1BVElPTgogICAgICA6IG51bGw7CiAgICBwcm9wQ291bnQgPSB0eXBlCiAgICAgID8gdHlwZSA9PT0gVFJBTlNJVElPTgogICAgICAgID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgOiAwOwogIH0KICB2YXIgaGFzVHJhbnNmb3JtID0KICAgIHR5cGUgPT09IFRSQU5TSVRJT04gJiYKICAgIHRyYW5zZm9ybVJFLnRlc3Qoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ1Byb3BlcnR5J10pOwogIHJldHVybiB7CiAgICB0eXBlOiB0eXBlLAogICAgdGltZW91dDogdGltZW91dCwKICAgIHByb3BDb3VudDogcHJvcENvdW50LAogICAgaGFzVHJhbnNmb3JtOiBoYXNUcmFuc2Zvcm0KICB9Cn0KCmZ1bmN0aW9uIGdldFRpbWVvdXQgKGRlbGF5cywgZHVyYXRpb25zKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICB3aGlsZSAoZGVsYXlzLmxlbmd0aCA8IGR1cmF0aW9ucy5sZW5ndGgpIHsKICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTsKICB9CgogIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBkdXJhdGlvbnMubWFwKGZ1bmN0aW9uIChkLCBpKSB7CiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKQogIH0pKQp9CgpmdW5jdGlvbiB0b01zIChzKSB7CiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKSkgKiAxMDAwCn0KCi8qICAqLwoKZnVuY3Rpb24gZW50ZXIgKHZub2RlLCB0b2dnbGVEaXNwbGF5KSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHsKICAgIGVsLl9sZWF2ZUNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fbGVhdmVDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsKICAgIHJldHVybgogIH0KCiAgdmFyIGNzcyA9IGRhdGEuY3NzOwogIHZhciB0eXBlID0gZGF0YS50eXBlOwogIHZhciBlbnRlckNsYXNzID0gZGF0YS5lbnRlckNsYXNzOwogIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzczsKICB2YXIgZW50ZXJBY3RpdmVDbGFzcyA9IGRhdGEuZW50ZXJBY3RpdmVDbGFzczsKICB2YXIgYXBwZWFyQ2xhc3MgPSBkYXRhLmFwcGVhckNsYXNzOwogIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzOwogIHZhciBhcHBlYXJBY3RpdmVDbGFzcyA9IGRhdGEuYXBwZWFyQWN0aXZlQ2xhc3M7CiAgdmFyIGJlZm9yZUVudGVyID0gZGF0YS5iZWZvcmVFbnRlcjsKICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyOwogIHZhciBhZnRlckVudGVyID0gZGF0YS5hZnRlckVudGVyOwogIHZhciBlbnRlckNhbmNlbGxlZCA9IGRhdGEuZW50ZXJDYW5jZWxsZWQ7CiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyOwogIHZhciBhcHBlYXIgPSBkYXRhLmFwcGVhcjsKICB2YXIgYWZ0ZXJBcHBlYXIgPSBkYXRhLmFmdGVyQXBwZWFyOwogIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDsKICB2YXIgZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uOwoKICAvLyBhY3RpdmVJbnN0YW5jZSB3aWxsIGFsd2F5cyBiZSB0aGUgPHRyYW5zaXRpb24+IGNvbXBvbmVudCBtYW5hZ2luZyB0aGlzCiAgLy8gdHJhbnNpdGlvbi4gT25lIGVkZ2UgY2FzZSB0byBjaGVjayBpcyB3aGVuIHRoZSA8dHJhbnNpdGlvbj4gaXMgcGxhY2VkCiAgLy8gYXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNoaWxkIGNvbXBvbmVudC4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY2hlY2sKICAvLyA8dHJhbnNpdGlvbj4ncyBwYXJlbnQgZm9yIGFwcGVhciBjaGVjay4KICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlOwogIHZhciB0cmFuc2l0aW9uTm9kZSA9IGFjdGl2ZUluc3RhbmNlLiR2bm9kZTsKICB3aGlsZSAodHJhbnNpdGlvbk5vZGUgJiYgdHJhbnNpdGlvbk5vZGUucGFyZW50KSB7CiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDsKICAgIGNvbnRleHQgPSB0cmFuc2l0aW9uTm9kZS5jb250ZXh0OwogIH0KCiAgdmFyIGlzQXBwZWFyID0gIWNvbnRleHQuX2lzTW91bnRlZCB8fCAhdm5vZGUuaXNSb290SW5zZXJ0OwoKICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBzdGFydENsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyQ2xhc3MKICAgID8gYXBwZWFyQ2xhc3MKICAgIDogZW50ZXJDbGFzczsKICB2YXIgYWN0aXZlQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJBY3RpdmVDbGFzcwogICAgPyBhcHBlYXJBY3RpdmVDbGFzcwogICAgOiBlbnRlckFjdGl2ZUNsYXNzOwogIHZhciB0b0NsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyVG9DbGFzcwogICAgPyBhcHBlYXJUb0NsYXNzCiAgICA6IGVudGVyVG9DbGFzczsKCiAgdmFyIGJlZm9yZUVudGVySG9vayA9IGlzQXBwZWFyCiAgICA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpCiAgICA6IGJlZm9yZUVudGVyOwogIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAodHlwZW9mIGFwcGVhciA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGVhciA6IGVudGVyKQogICAgOiBlbnRlcjsKICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAoYWZ0ZXJBcHBlYXIgfHwgYWZ0ZXJFbnRlcikKICAgIDogYWZ0ZXJFbnRlcjsKICB2YXIgZW50ZXJDYW5jZWxsZWRIb29rID0gaXNBcHBlYXIKICAgID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkKICAgIDogZW50ZXJDYW5jZWxsZWQ7CgogIHZhciBleHBsaWNpdEVudGVyRHVyYXRpb24gPSB0b051bWJlcigKICAgIGlzT2JqZWN0KGR1cmF0aW9uKQogICAgICA/IGR1cmF0aW9uLmVudGVyCiAgICAgIDogZHVyYXRpb24KICApOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV4cGxpY2l0RW50ZXJEdXJhdGlvbiAhPSBudWxsKSB7CiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbiwgJ2VudGVyJywgdm5vZGUpOwogIH0KCiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTsKICB2YXIgdXNlcldhbnRzQ29udHJvbCA9IGdldEhvb2tBcmd1bWVudHNMZW5ndGgoZW50ZXJIb29rKTsKCiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHsKICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgdG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgfQogICAgaWYgKGNiLmNhbmNlbGxlZCkgewogICAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7CiAgICAgIH0KICAgICAgZW50ZXJDYW5jZWxsZWRIb29rICYmIGVudGVyQ2FuY2VsbGVkSG9vayhlbCk7CiAgICB9IGVsc2UgewogICAgICBhZnRlckVudGVySG9vayAmJiBhZnRlckVudGVySG9vayhlbCk7CiAgICB9CiAgICBlbC5fZW50ZXJDYiA9IG51bGw7CiAgfSk7CgogIGlmICghdm5vZGUuZGF0YS5zaG93KSB7CiAgICAvLyByZW1vdmUgcGVuZGluZyBsZWF2ZSBlbGVtZW50IG9uIGVudGVyIGJ5IGluamVjdGluZyBhbiBpbnNlcnQgaG9vawogICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlOwogICAgICB2YXIgcGVuZGluZ05vZGUgPSBwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nICYmIHBhcmVudC5fcGVuZGluZ1t2bm9kZS5rZXldOwogICAgICBpZiAocGVuZGluZ05vZGUgJiYKICAgICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJgogICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYgogICAgICApIHsKICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTsKICAgICAgfQogICAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgICB9KTsKICB9CgogIC8vIHN0YXJ0IGVudGVyIHRyYW5zaXRpb24KICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTsKICBpZiAoZXhwZWN0c0NTUykgewogICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHsKICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpOwogICAgICAgIGlmICghdXNlcldhbnRzQ29udHJvbCkgewogICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdEVudGVyRHVyYXRpb24pKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0RW50ZXJEdXJhdGlvbik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgaWYgKHZub2RlLmRhdGEuc2hvdykgewogICAgdG9nZ2xlRGlzcGxheSAmJiB0b2dnbGVEaXNwbGF5KCk7CiAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgfQoKICBpZiAoIWV4cGVjdHNDU1MgJiYgIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgIGNiKCk7CiAgfQp9CgpmdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikpIHsKICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fZW50ZXJDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7CiAgICByZXR1cm4gcm0oKQogIH0KCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGlzRGVmKGVsLl9sZWF2ZUNiKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgY3NzID0gZGF0YS5jc3M7CiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7CiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7CiAgdmFyIGxlYXZlVG9DbGFzcyA9IGRhdGEubGVhdmVUb0NsYXNzOwogIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzOwogIHZhciBiZWZvcmVMZWF2ZSA9IGRhdGEuYmVmb3JlTGVhdmU7CiAgdmFyIGxlYXZlID0gZGF0YS5sZWF2ZTsKICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTsKICB2YXIgbGVhdmVDYW5jZWxsZWQgPSBkYXRhLmxlYXZlQ2FuY2VsbGVkOwogIHZhciBkZWxheUxlYXZlID0gZGF0YS5kZWxheUxlYXZlOwogIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247CgogIHZhciBleHBlY3RzQ1NTID0gY3NzICE9PSBmYWxzZSAmJiAhaXNJRTk7CiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGxlYXZlKTsKCiAgdmFyIGV4cGxpY2l0TGVhdmVEdXJhdGlvbiA9IHRvTnVtYmVyKAogICAgaXNPYmplY3QoZHVyYXRpb24pCiAgICAgID8gZHVyYXRpb24ubGVhdmUKICAgICAgOiBkdXJhdGlvbgogICk7CgogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZXhwbGljaXRMZWF2ZUR1cmF0aW9uKSkgewogICAgY2hlY2tEdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24sICdsZWF2ZScsIHZub2RlKTsKICB9CgogIHZhciBjYiA9IGVsLl9sZWF2ZUNiID0gb25jZShmdW5jdGlvbiAoKSB7CiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7CiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7CiAgICB9CiAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7CiAgICB9CiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgfQogICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7CiAgICB9IGVsc2UgewogICAgICBybSgpOwogICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpOwogICAgfQogICAgZWwuX2xlYXZlQ2IgPSBudWxsOwogIH0pOwoKICBpZiAoZGVsYXlMZWF2ZSkgewogICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpOwogIH0gZWxzZSB7CiAgICBwZXJmb3JtTGVhdmUoKTsKICB9CgogIGZ1bmN0aW9uIHBlcmZvcm1MZWF2ZSAoKSB7CiAgICAvLyB0aGUgZGVsYXllZCBsZWF2ZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkCiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIHJldHVybgogICAgfQogICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudAogICAgaWYgKCF2bm9kZS5kYXRhLnNob3cpIHsKICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlOwogICAgfQogICAgYmVmb3JlTGVhdmUgJiYgYmVmb3JlTGVhdmUoZWwpOwogICAgaWYgKGV4cGVjdHNDU1MpIHsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTsKICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpOwogICAgICAgIGlmICghY2IuY2FuY2VsbGVkKSB7CiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgICAgICBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24pKSB7CiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpOwogICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7CiAgICAgIGNiKCk7CiAgICB9CiAgfQp9CgovLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGUKZnVuY3Rpb24gY2hlY2tEdXJhdGlvbiAodmFsLCBuYW1lLCB2bm9kZSkgewogIGlmICh0eXBlb2YgdmFsICE9PSAnbnVtYmVyJykgewogICAgd2FybigKICAgICAgIjx0cmFuc2l0aW9uPiBleHBsaWNpdCAiICsgbmFtZSArICIgZHVyYXRpb24gaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gIiArCiAgICAgICJnb3QgIiArIChKU09OLnN0cmluZ2lmeSh2YWwpKSArICIuIiwKICAgICAgdm5vZGUuY29udGV4dAogICAgKTsKICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHsKICAgIHdhcm4oCiAgICAgICI8dHJhbnNpdGlvbj4gZXhwbGljaXQgIiArIG5hbWUgKyAiIGR1cmF0aW9uIGlzIE5hTiAtICIgKwogICAgICAndGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LicsCiAgICAgIHZub2RlLmNvbnRleHQKICAgICk7CiAgfQp9CgpmdW5jdGlvbiBpc1ZhbGlkRHVyYXRpb24gKHZhbCkgewogIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKQp9CgovKioKICogTm9ybWFsaXplIGEgdHJhbnNpdGlvbiBob29rJ3MgYXJndW1lbnQgbGVuZ3RoLiBUaGUgaG9vayBtYXkgYmU6CiAqIC0gYSBtZXJnZWQgaG9vayAoaW52b2tlcikgd2l0aCB0aGUgb3JpZ2luYWwgaW4gLmZucwogKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aCkKICogLSBhIHBsYWluIGZ1bmN0aW9uICgubGVuZ3RoKQogKi8KZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHsKICBpZiAoaXNVbmRlZihmbikpIHsKICAgIHJldHVybiBmYWxzZQogIH0KICB2YXIgaW52b2tlckZucyA9IGZuLmZuczsKICBpZiAoaXNEZWYoaW52b2tlckZucykpIHsKICAgIC8vIGludm9rZXIKICAgIHJldHVybiBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKAogICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpCiAgICAgICAgPyBpbnZva2VyRm5zWzBdCiAgICAgICAgOiBpbnZva2VyRm5zCiAgICApCiAgfSBlbHNlIHsKICAgIHJldHVybiAoZm4uX2xlbmd0aCB8fCBmbi5sZW5ndGgpID4gMQogIH0KfQoKZnVuY3Rpb24gX2VudGVyIChfLCB2bm9kZSkgewogIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgIGVudGVyKHZub2RlKTsKICB9Cn0KCnZhciB0cmFuc2l0aW9uID0gaW5Ccm93c2VyID8gewogIGNyZWF0ZTogX2VudGVyLAogIGFjdGl2YXRlOiBfZW50ZXIsCiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUkJDEgKHZub2RlLCBybSkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgICAgbGVhdmUodm5vZGUsIHJtKTsKICAgIH0gZWxzZSB7CiAgICAgIHJtKCk7CiAgICB9CiAgfQp9IDoge30KCnZhciBwbGF0Zm9ybU1vZHVsZXMgPSBbCiAgYXR0cnMsCiAga2xhc3MsCiAgZXZlbnRzLAogIGRvbVByb3BzLAogIHN0eWxlLAogIHRyYW5zaXRpb24KXQoKLyogICovCgovLyB0aGUgZGlyZWN0aXZlIG1vZHVsZSBzaG91bGQgYmUgYXBwbGllZCBsYXN0LCBhZnRlciBhbGwKLy8gYnVpbHQtaW4gbW9kdWxlcyBoYXZlIGJlZW4gYXBwbGllZC4KdmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTsKCnZhciBwYXRjaCA9IGNyZWF0ZVBhdGNoRnVuY3Rpb24oeyBub2RlT3BzOiBub2RlT3BzLCBtb2R1bGVzOiBtb2R1bGVzIH0pOwoKLyoqCiAqIE5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBsaWtlIGF0dGFjaGluZwogKiBwcm9wZXJ0aWVzIHRvIEVsZW1lbnRzLgogKi8KCi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwppZiAoaXNJRTkpIHsKICAvLyBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L2ludGVybmV0LWV4cGxvcmVyLTktb25pbnB1dC8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgaWYgKGVsICYmIGVsLnZtb2RlbCkgewogICAgICB0cmlnZ2VyKGVsLCAnaW5wdXQnKTsKICAgIH0KICB9KTsKfQoKdmFyIGRpcmVjdGl2ZSA9IHsKICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVm5vZGUpIHsKICAgIGlmICh2bm9kZS50YWcgPT09ICdzZWxlY3QnKSB7CiAgICAgIC8vICM2OTAzCiAgICAgIGlmIChvbGRWbm9kZS5lbG0gJiYgIW9sZFZub2RlLmVsbS5fdk9wdGlvbnMpIHsKICAgICAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGRpcmVjdGl2ZS5jb21wb25lbnRVcGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICB9CiAgICAgIGVsLl92T3B0aW9ucyA9IFtdLm1hcC5jYWxsKGVsLm9wdGlvbnMsIGdldFZhbHVlKTsKICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGlzVGV4dElucHV0VHlwZShlbC50eXBlKSkgewogICAgICBlbC5fdk1vZGlmaWVycyA9IGJpbmRpbmcubW9kaWZpZXJzOwogICAgICBpZiAoIWJpbmRpbmcubW9kaWZpZXJzLmxhenkpIHsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpOwogICAgICAgIC8vIFNhZmFyaSA8IDEwLjIgJiBVSVdlYlZpZXcgZG9lc24ndCBmaXJlIGNvbXBvc2l0aW9uZW5kIHdoZW4KICAgICAgICAvLyBzd2l0Y2hpbmcgZm9jdXMgYmVmb3JlIGNvbmZpcm1pbmcgY29tcG9zaXRpb24gY2hvaWNlCiAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZQogICAgICAgIC8vIGZpcmVzICJjaGFuZ2UiIGluc3RlYWQgb2YgImlucHV0IiBvbiBhdXRvY29tcGxldGUuCiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKGlzSUU5KSB7CiAgICAgICAgICBlbC52bW9kZWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIGNvbXBvbmVudFVwZGF0ZWQ6IGZ1bmN0aW9uIGNvbXBvbmVudFVwZGF0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSkgewogICAgaWYgKHZub2RlLnRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICAvLyBpbiBjYXNlIHRoZSBvcHRpb25zIHJlbmRlcmVkIGJ5IHYtZm9yIGhhdmUgY2hhbmdlZCwKICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHRoZSB2YWx1ZSBpcyBvdXQtb2Ytc3luYyB3aXRoIHRoZSByZW5kZXJlZCBvcHRpb25zLgogICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmcKICAgICAgLy8gb3B0aW9uIGluIHRoZSBET00uCiAgICAgIHZhciBwcmV2T3B0aW9ucyA9IGVsLl92T3B0aW9uczsKICAgICAgdmFyIGN1ck9wdGlvbnMgPSBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7CiAgICAgIGlmIChjdXJPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG8sIGkpIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHByZXZPcHRpb25zW2ldKTsgfSkpIHsKICAgICAgICAvLyB0cmlnZ2VyIGNoYW5nZSBldmVudCBpZgogICAgICAgIC8vIG5vIG1hdGNoaW5nIG9wdGlvbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlCiAgICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlCiAgICAgICAgICA/IGJpbmRpbmcudmFsdWUuc29tZShmdW5jdGlvbiAodikgeyByZXR1cm4gaGFzTm9NYXRjaGluZ09wdGlvbih2LCBjdXJPcHRpb25zKTsgfSkKICAgICAgICAgIDogYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSAmJiBoYXNOb01hdGNoaW5nT3B0aW9uKGJpbmRpbmcudmFsdWUsIGN1ck9wdGlvbnMpOwogICAgICAgIGlmIChuZWVkUmVzZXQpIHsKICAgICAgICAgIHRyaWdnZXIoZWwsICdjaGFuZ2UnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgpmdW5jdGlvbiBzZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0lFIHx8IGlzRWRnZSkgewogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIGFjdHVhbGx5U2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZtKTsKICAgIH0sIDApOwogIH0KfQoKZnVuY3Rpb24gYWN0dWFsbHlTZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgdmFyIHZhbHVlID0gYmluZGluZy52YWx1ZTsKICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlOwogIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICI8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw9XCIiICsgKGJpbmRpbmcuZXhwcmVzc2lvbikgKyAiXCI+ICIgKwogICAgICAiZXhwZWN0cyBhbiBBcnJheSB2YWx1ZSBmb3IgaXRzIGJpbmRpbmcsIGJ1dCBnb3QgIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSksCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciBzZWxlY3RlZCwgb3B0aW9uOwogIGZvciAodmFyIGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07CiAgICBpZiAoaXNNdWx0aXBsZSkgewogICAgICBzZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgZ2V0VmFsdWUob3B0aW9uKSkgPiAtMTsKICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHsKICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7CiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIHsKICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgICAgfQogICAgfQogIH0KICBpZiAoIWlzTXVsdGlwbGUpIHsKICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTsKICB9Cn0KCmZ1bmN0aW9uIGhhc05vTWF0Y2hpbmdPcHRpb24gKHZhbHVlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG9wdGlvbnMuZXZlcnkoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHZhbHVlKTsgfSkKfQoKZnVuY3Rpb24gZ2V0VmFsdWUgKG9wdGlvbikgewogIHJldHVybiAnX3ZhbHVlJyBpbiBvcHRpb24KICAgID8gb3B0aW9uLl92YWx1ZQogICAgOiBvcHRpb24udmFsdWUKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0IChlKSB7CiAgZS50YXJnZXQuY29tcG9zaW5nID0gdHJ1ZTsKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZCAoZSkgewogIC8vIHByZXZlbnQgdHJpZ2dlcmluZyBhbiBpbnB1dCBldmVudCBmb3Igbm8gcmVhc29uCiAgaWYgKCFlLnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuIH0KICBlLnRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTsKICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTsKfQoKZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHsKICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7CiAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7CiAgZWwuZGlzcGF0Y2hFdmVudChlKTsKfQoKLyogICovCgovLyByZWN1cnNpdmVseSBzZWFyY2ggZm9yIHBvc3NpYmxlIHRyYW5zaXRpb24gZGVmaW5lZCBpbnNpZGUgdGhlIGNvbXBvbmVudCByb290CmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7CiAgcmV0dXJuIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmICghdm5vZGUuZGF0YSB8fCAhdm5vZGUuZGF0YS50cmFuc2l0aW9uKQogICAgPyBsb2NhdGVOb2RlKHZub2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkKICAgIDogdm5vZGUKfQoKdmFyIHNob3cgPSB7CiAgYmluZDogZnVuY3Rpb24gYmluZCAoZWwsIHJlZiwgdm5vZGUpIHsKICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTsKCiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPQogICAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7CiAgICBpZiAodmFsdWUgJiYgdHJhbnNpdGlvbiQkMSkgewogICAgICB2bm9kZS5kYXRhLnNob3cgPSB0cnVlOwogICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkgewogICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gb3JpZ2luYWxEaXNwbGF5IDogJ25vbmUnOwogICAgfQogIH0sCgogIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkgewogICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlOwogICAgdmFyIG9sZFZhbHVlID0gcmVmLm9sZFZhbHVlOwoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKSB7IHJldHVybiB9CiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIGlmICh0cmFuc2l0aW9uJCQxKSB7CiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGVudGVyKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgOiAnbm9uZSc7CiAgICB9CiAgfSwKCiAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQgKAogICAgZWwsCiAgICBiaW5kaW5nLAogICAgdm5vZGUsCiAgICBvbGRWbm9kZSwKICAgIGlzRGVzdHJveQogICkgewogICAgaWYgKCFpc0Rlc3Ryb3kpIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheTsKICAgIH0KICB9Cn0KCnZhciBwbGF0Zm9ybURpcmVjdGl2ZXMgPSB7CiAgbW9kZWw6IGRpcmVjdGl2ZSwKICBzaG93OiBzaG93Cn0KCi8qICAqLwoKLy8gUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBhIHNpbmdsZSBlbGVtZW50L2NvbXBvbmVudC4KLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpCgp2YXIgdHJhbnNpdGlvblByb3BzID0gewogIG5hbWU6IFN0cmluZywKICBhcHBlYXI6IEJvb2xlYW4sCiAgY3NzOiBCb29sZWFuLAogIG1vZGU6IFN0cmluZywKICB0eXBlOiBTdHJpbmcsCiAgZW50ZXJDbGFzczogU3RyaW5nLAogIGxlYXZlQ2xhc3M6IFN0cmluZywKICBlbnRlclRvQ2xhc3M6IFN0cmluZywKICBsZWF2ZVRvQ2xhc3M6IFN0cmluZywKICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsCiAgbGVhdmVBY3RpdmVDbGFzczogU3RyaW5nLAogIGFwcGVhckNsYXNzOiBTdHJpbmcsCiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZywKICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsCiAgZHVyYXRpb246IFtOdW1iZXIsIFN0cmluZywgT2JqZWN0XQp9OwoKLy8gaW4gY2FzZSB0aGUgY2hpbGQgaXMgYWxzbyBhbiBhYnN0cmFjdCBjb21wb25lbnQsIGUuZy4gPGtlZXAtYWxpdmU+Ci8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkCmZ1bmN0aW9uIGdldFJlYWxDaGlsZCAodm5vZGUpIHsKICB2YXIgY29tcE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHJldHVybiBnZXRSZWFsQ2hpbGQoZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChjb21wT3B0aW9ucy5jaGlsZHJlbikpCiAgfSBlbHNlIHsKICAgIHJldHVybiB2bm9kZQogIH0KfQoKZnVuY3Rpb24gZXh0cmFjdFRyYW5zaXRpb25EYXRhIChjb21wKSB7CiAgdmFyIGRhdGEgPSB7fTsKICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7CiAgLy8gcHJvcHMKICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5wcm9wc0RhdGEpIHsKICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTsKICB9CiAgLy8gZXZlbnRzLgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kcwogIHZhciBsaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgZm9yICh2YXIga2V5JDEgaW4gbGlzdGVuZXJzKSB7CiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdOwogIH0KICByZXR1cm4gZGF0YQp9CgpmdW5jdGlvbiBwbGFjZWhvbGRlciAoaCwgcmF3Q2hpbGQpIHsKICBpZiAoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHJhd0NoaWxkLnRhZykpIHsKICAgIHJldHVybiBoKCdrZWVwLWFsaXZlJywgewogICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEKICAgIH0pCiAgfQp9CgpmdW5jdGlvbiBoYXNQYXJlbnRUcmFuc2l0aW9uICh2bm9kZSkgewogIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7CiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBpc1NhbWVDaGlsZCAoY2hpbGQsIG9sZENoaWxkKSB7CiAgcmV0dXJuIG9sZENoaWxkLmtleSA9PT0gY2hpbGQua2V5ICYmIG9sZENoaWxkLnRhZyA9PT0gY2hpbGQudGFnCn0KCnZhciBUcmFuc2l0aW9uID0gewogIG5hbWU6ICd0cmFuc2l0aW9uJywKICBwcm9wczogdHJhbnNpdGlvblByb3BzLAogIGFic3RyYWN0OiB0cnVlLAoKICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdDsKICAgIGlmICghY2hpbGRyZW4pIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcykKICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH0pOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigKICAgICAgICAnPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudC4gVXNlICcgKwogICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsCiAgICAgICAgdGhpcy4kcGFyZW50CiAgICAgICk7CiAgICB9CgogICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7CgogICAgLy8gd2FybiBpbnZhbGlkIG1vZGUKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJwogICAgKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLAogICAgICAgIHRoaXMuJHBhcmVudAogICAgICApOwogICAgfQoKICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdOwoKICAgIC8vIGlmIHRoaXMgaXMgYSBjb21wb25lbnQgcm9vdCBub2RlIGFuZCB0aGUgY29tcG9uZW50J3MKICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLgogICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7CiAgICAgIHJldHVybiByYXdDaGlsZAogICAgfQoKICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gZGF0YSB0byBjaGlsZAogICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZQogICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCFjaGlsZCkgewogICAgICByZXR1cm4gcmF3Q2hpbGQKICAgIH0KCiAgICBpZiAodGhpcy5fbGVhdmluZykgewogICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICB9CgogICAgLy8gZW5zdXJlIGEga2V5IHRoYXQgaXMgdW5pcXVlIHRvIHRoZSB2bm9kZSB0eXBlIGFuZCB0byB0aGlzIHRyYW5zaXRpb24KICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXMKICAgIC8vIGR1cmluZyBlbnRlcmluZy4KICAgIHZhciBpZCA9ICJfX3RyYW5zaXRpb24tIiArICh0aGlzLl91aWQpICsgIi0iOwogICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGwKICAgICAgPyBjaGlsZC5pc0NvbW1lbnQKICAgICAgICA/IGlkICsgJ2NvbW1lbnQnCiAgICAgICAgOiBpZCArIGNoaWxkLnRhZwogICAgICA6IGlzUHJpbWl0aXZlKGNoaWxkLmtleSkKICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KQogICAgICAgIDogY2hpbGQua2V5OwoKICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7CiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTsKICAgIHZhciBvbGRDaGlsZCA9IGdldFJlYWxDaGlsZChvbGRSYXdDaGlsZCk7CgogICAgLy8gbWFyayB2LXNob3cKICAgIC8vIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gbW9kdWxlIGNhbiBoYW5kIG92ZXIgdGhlIGNvbnRyb2wgdG8gdGhlIGRpcmVjdGl2ZQogICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5uYW1lID09PSAnc2hvdyc7IH0pKSB7CiAgICAgIGNoaWxkLmRhdGEuc2hvdyA9IHRydWU7CiAgICB9CgogICAgaWYgKAogICAgICBvbGRDaGlsZCAmJgogICAgICBvbGRDaGlsZC5kYXRhICYmCiAgICAgICFpc1NhbWVDaGlsZChjaGlsZCwgb2xkQ2hpbGQpICYmCiAgICAgICFpc0FzeW5jUGxhY2Vob2xkZXIob2xkQ2hpbGQpICYmCiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlCiAgICAgICEob2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UgJiYgb2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkKICAgICkgewogICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmUKICAgICAgLy8gaW1wb3J0YW50IGZvciBkeW5hbWljIHRyYW5zaXRpb25zIQogICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkLmRhdGEudHJhbnNpdGlvbiA9IGV4dGVuZCh7fSwgZGF0YSk7CiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGUKICAgICAgaWYgKG1vZGUgPT09ICdvdXQtaW4nKSB7CiAgICAgICAgLy8gcmV0dXJuIHBsYWNlaG9sZGVyIG5vZGUgYW5kIHF1ZXVlIHVwZGF0ZSB3aGVuIGxlYXZlIGZpbmlzaGVzCiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2FmdGVyTGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aGlzJDEuX2xlYXZpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHsKICAgICAgICBpZiAoaXNBc3luY1BsYWNlaG9sZGVyKGNoaWxkKSkgewogICAgICAgICAgcmV0dXJuIG9sZFJhd0NoaWxkCiAgICAgICAgfQogICAgICAgIHZhciBkZWxheWVkTGVhdmU7CiAgICAgICAgdmFyIHBlcmZvcm1MZWF2ZSA9IGZ1bmN0aW9uICgpIHsgZGVsYXllZExlYXZlKCk7IH07CiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpOwogICAgICAgIG1lcmdlVk5vZGVIb29rKGRhdGEsICdlbnRlckNhbmNlbGxlZCcsIHBlcmZvcm1MZWF2ZSk7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2RlbGF5TGVhdmUnLCBmdW5jdGlvbiAobGVhdmUpIHsgZGVsYXllZExlYXZlID0gbGVhdmU7IH0pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJhd0NoaWxkCiAgfQp9CgovKiAgKi8KCi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgbGlzdCBpdGVtcy4KLy8gc3VwcG9ydHMgbW92ZSB0cmFuc2l0aW9ucyB1c2luZyB0aGUgRkxJUCB0ZWNobmlxdWUuCgovLyBCZWNhdXNlIHRoZSB2ZG9tJ3MgY2hpbGRyZW4gdXBkYXRlIGFsZ29yaXRobSBpcyAidW5zdGFibGUiIC0gaS5lLgovLyBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcmVtb3ZlZCBlbGVtZW50cywKLy8gd2UgZm9yY2UgdHJhbnNpdGlvbi1ncm91cCB0byB1cGRhdGUgaXRzIGNoaWxkcmVuIGludG8gdHdvIHBhc3NlczoKLy8gaW4gdGhlIGZpcnN0IHBhc3MsIHdlIHJlbW92ZSBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQsCi8vIHRyaWdnZXJpbmcgdGhlaXIgbGVhdmluZyB0cmFuc2l0aW9uOyBpbiB0aGUgc2Vjb25kIHBhc3MsIHdlIGluc2VydC9tb3ZlCi8vIGludG8gdGhlIGZpbmFsIGRlc2lyZWQgc3RhdGUuIFRoaXMgd2F5IGluIHRoZSBzZWNvbmQgcGFzcyByZW1vdmVkCi8vIG5vZGVzIHdpbGwgcmVtYWluIHdoZXJlIHRoZXkgc2hvdWxkIGJlLgoKdmFyIHByb3BzID0gZXh0ZW5kKHsKICB0YWc6IFN0cmluZywKICBtb3ZlQ2xhc3M6IFN0cmluZwp9LCB0cmFuc2l0aW9uUHJvcHMpOwoKZGVsZXRlIHByb3BzLm1vZGU7Cgp2YXIgVHJhbnNpdGlvbkdyb3VwID0gewogIHByb3BzOiBwcm9wcywKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHsKICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7CiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdOwogICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTsKICAgICAgaWYgKGMudGFnKSB7CiAgICAgICAgaWYgKGMua2V5ICE9IG51bGwgJiYgU3RyaW5nKGMua2V5KS5pbmRleE9mKCdfX3ZsaXN0JykgIT09IDApIHsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7CiAgICAgICAgICBtYXBbYy5rZXldID0gYwogICAgICAgICAgOyhjLmRhdGEgfHwgKGMuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25EYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgb3B0cyA9IGMuY29tcG9uZW50T3B0aW9uczsKICAgICAgICAgIHZhciBuYW1lID0gb3B0cyA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnIHx8ICcnKSA6IGMudGFnOwogICAgICAgICAgd2FybigoIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8IiArIG5hbWUgKyAiPiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJldkNoaWxkcmVuKSB7CiAgICAgIHZhciBrZXB0ID0gW107CiAgICAgIHZhciByZW1vdmVkID0gW107CiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7CiAgICAgICAgdmFyIGMkMSA9IHByZXZDaGlsZHJlbltpJDFdOwogICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTsKICAgICAgICBjJDEuZGF0YS5wb3MgPSBjJDEuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmIChtYXBbYyQxLmtleV0pIHsKICAgICAgICAgIGtlcHQucHVzaChjJDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZW1vdmVkLnB1c2goYyQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5rZXB0ID0gaCh0YWcsIG51bGwsIGtlcHQpOwogICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkOwogICAgfQoKICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pCiAgfSwKCiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkgewogICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzcwogICAgdGhpcy5fX3BhdGNoX18oCiAgICAgIHRoaXMuX3Zub2RlLAogICAgICB0aGlzLmtlcHQsCiAgICAgIGZhbHNlLCAvLyBoeWRyYXRpbmcKICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpCiAgICApOwogICAgdGhpcy5fdm5vZGUgPSB0aGlzLmtlcHQ7CiAgfSwKCiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCAoKSB7CiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjsKICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7CiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5oYXNNb3ZlKGNoaWxkcmVuWzBdLmVsbSwgbW92ZUNsYXNzKSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3ZSBkaXZpZGUgdGhlIHdvcmsgaW50byB0aHJlZSBsb29wcyB0byBhdm9pZCBtaXhpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMKICAgIC8vIGluIGVhY2ggaXRlcmF0aW9uIC0gd2hpY2ggaGVscHMgcHJldmVudCBsYXlvdXQgdGhyYXNoaW5nLgogICAgY2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7CiAgICBjaGlsZHJlbi5mb3JFYWNoKHJlY29yZFBvc2l0aW9uKTsKICAgIGNoaWxkcmVuLmZvckVhY2goYXBwbHlUcmFuc2xhdGlvbik7CgogICAgLy8gZm9yY2UgcmVmbG93IHRvIHB1dCBldmVyeXRoaW5nIGluIHBvc2l0aW9uCiAgICAvLyBhc3NpZ24gdG8gdGhpcyB0byBhdm9pZCBiZWluZyByZW1vdmVkIGluIHRyZWUtc2hha2luZwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICB0aGlzLl9yZWZsb3cgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDsKCiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmRhdGEubW92ZWQpIHsKICAgICAgICB2YXIgZWwgPSBjLmVsbTsKICAgICAgICB2YXIgcyA9IGVsLnN0eWxlOwogICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTsKICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJzsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmRFdmVudCwgZWwuX21vdmVDYiA9IGZ1bmN0aW9uIGNiIChlKSB7CiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7CiAgICAgICAgICAgIGVsLl9tb3ZlQ2IgPSBudWxsOwogICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0sCgogIG1ldGhvZHM6IHsKICAgIGhhc01vdmU6IGZ1bmN0aW9uIGhhc01vdmUgKGVsLCBtb3ZlQ2xhc3MpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikgewogICAgICAgIHJldHVybiBmYWxzZQogICAgICB9CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAodGhpcy5faGFzTW92ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNNb3ZlCiAgICAgIH0KICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBtb3ZlIGNsYXNzIGFwcGxpZWQgaGFzCiAgICAgIC8vIENTUyB0cmFuc2l0aW9ucy4gU2luY2UgdGhlIGVsZW1lbnQgbWF5IGJlIGluc2lkZSBhbiBlbnRlcmluZwogICAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlCiAgICAgIC8vIGFsbCBvdGhlciB0cmFuc2l0aW9uIGNsYXNzZXMgYXBwbGllZCB0byBlbnN1cmUgb25seSB0aGUgbW92ZSBjbGFzcwogICAgICAvLyBpcyBhcHBsaWVkLgogICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTsKICAgICAgaWYgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcykgewogICAgICAgIGVsLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHsgcmVtb3ZlQ2xhc3MoY2xvbmUsIGNscyk7IH0pOwogICAgICB9CiAgICAgIGFkZENsYXNzKGNsb25lLCBtb3ZlQ2xhc3MpOwogICAgICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB0aGlzLiRlbC5hcHBlbmRDaGlsZChjbG9uZSk7CiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpOwogICAgICB0aGlzLiRlbC5yZW1vdmVDaGlsZChjbG9uZSk7CiAgICAgIHJldHVybiAodGhpcy5faGFzTW92ZSA9IGluZm8uaGFzVHJhbnNmb3JtKQogICAgfQogIH0KfQoKZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMgKGMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX21vdmVDYikgewogICAgYy5lbG0uX21vdmVDYigpOwogIH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX2VudGVyQ2IpIHsKICAgIGMuZWxtLl9lbnRlckNiKCk7CiAgfQp9CgpmdW5jdGlvbiByZWNvcmRQb3NpdGlvbiAoYykgewogIGMuZGF0YS5uZXdQb3MgPSBjLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKfQoKZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbiAoYykgewogIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zOwogIHZhciBuZXdQb3MgPSBjLmRhdGEubmV3UG9zOwogIHZhciBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7CiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7CiAgaWYgKGR4IHx8IGR5KSB7CiAgICBjLmRhdGEubW92ZWQgPSB0cnVlOwogICAgdmFyIHMgPSBjLmVsbS5zdHlsZTsKICAgIHMudHJhbnNmb3JtID0gcy5XZWJraXRUcmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBkeCArICJweCwiICsgZHkgKyAicHgpIjsKICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJzsKICB9Cn0KCnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7CiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbiwKICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cAp9CgovKiAgKi8KCi8vIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMgdXRpbHMKVnVlLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyID0gaXNSZXNlcnZlZEF0dHI7ClZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZ2V0VGFnTmFtZXNwYWNlOwpWdWUuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50OwoKLy8gaW5zdGFsbCBwbGF0Zm9ybSBydW50aW1lIGRpcmVjdGl2ZXMgJiBjb21wb25lbnRzCmV4dGVuZChWdWUub3B0aW9ucy5kaXJlY3RpdmVzLCBwbGF0Zm9ybURpcmVjdGl2ZXMpOwpleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgcGxhdGZvcm1Db21wb25lbnRzKTsKCi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb24KVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gPSBpbkJyb3dzZXIgPyBwYXRjaCA6IG5vb3A7CgovLyBwdWJsaWMgbW91bnQgbWV0aG9kClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDsKICByZXR1cm4gbW91bnRDb21wb25lbnQodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8vIGRldnRvb2xzIGdsb2JhbCBob29rCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmlmIChpbkJyb3dzZXIpIHsKICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIGlmIChjb25maWcuZGV2dG9vbHMpIHsKICAgICAgaWYgKGRldnRvb2xzKSB7CiAgICAgICAgZGV2dG9vbHMuZW1pdCgnaW5pdCcsIFZ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgICAgaXNDaHJvbWUKICAgICAgKSB7CiAgICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oCiAgICAgICAgICAnRG93bmxvYWQgdGhlIFZ1ZSBEZXZ0b29scyBleHRlbnNpb24gZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6XG4nICsKICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWRldnRvb2xzJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgIGNvbmZpZy5wcm9kdWN0aW9uVGlwICE9PSBmYWxzZSAmJgogICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcKICAgICkgewogICAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/ICdpbmZvJyA6ICdsb2cnXSgKICAgICAgICAiWW91IGFyZSBydW5uaW5nIFZ1ZSBpbiBkZXZlbG9wbWVudCBtb2RlLlxuIiArCiAgICAgICAgIk1ha2Ugc3VyZSB0byB0dXJuIG9uIHByb2R1Y3Rpb24gbW9kZSB3aGVuIGRlcGxveWluZyBmb3IgcHJvZHVjdGlvbi5cbiIgKwogICAgICAgICJTZWUgbW9yZSB0aXBzIGF0IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2RlcGxveW1lbnQuaHRtbCIKICAgICAgKTsKICAgIH0KICB9LCAwKTsKfQoKLyogICovCgp2YXIgZGVmYXVsdFRhZ1JFID0gL1x7XHsoKD86LnxcbikrPylcfVx9L2c7CnZhciByZWdleEVzY2FwZVJFID0gL1stLiorP14ke30oKXxbXF1cL1xcXS9nOwoKdmFyIGJ1aWxkUmVnZXggPSBjYWNoZWQoZnVuY3Rpb24gKGRlbGltaXRlcnMpIHsKICB2YXIgb3BlbiA9IGRlbGltaXRlcnNbMF0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHZhciBjbG9zZSA9IGRlbGltaXRlcnNbMV0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHJldHVybiBuZXcgUmVnRXhwKG9wZW4gKyAnKCg/Oi58XFxuKSs/KScgKyBjbG9zZSwgJ2cnKQp9KTsKCgoKZnVuY3Rpb24gcGFyc2VUZXh0ICgKICB0ZXh0LAogIGRlbGltaXRlcnMKKSB7CiAgdmFyIHRhZ1JFID0gZGVsaW1pdGVycyA/IGJ1aWxkUmVnZXgoZGVsaW1pdGVycykgOiBkZWZhdWx0VGFnUkU7CiAgaWYgKCF0YWdSRS50ZXN0KHRleHQpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIHRva2VucyA9IFtdOwogIHZhciByYXdUb2tlbnMgPSBbXTsKICB2YXIgbGFzdEluZGV4ID0gdGFnUkUubGFzdEluZGV4ID0gMDsKICB2YXIgbWF0Y2gsIGluZGV4LCB0b2tlblZhbHVlOwogIHdoaWxlICgobWF0Y2ggPSB0YWdSRS5leGVjKHRleHQpKSkgewogICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgIC8vIHB1c2ggdGV4dCB0b2tlbgogICAgaWYgKGluZGV4ID4gbGFzdEluZGV4KSB7CiAgICAgIHJhd1Rva2Vucy5wdXNoKHRva2VuVmFsdWUgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTsKICAgICAgdG9rZW5zLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW5WYWx1ZSkpOwogICAgfQogICAgLy8gdGFnIHRva2VuCiAgICB2YXIgZXhwID0gcGFyc2VGaWx0ZXJzKG1hdGNoWzFdLnRyaW0oKSk7CiAgICB0b2tlbnMucHVzaCgoIl9zKCIgKyBleHAgKyAiKSIpKTsKICAgIHJhd1Rva2Vucy5wdXNoKHsgJ0BiaW5kaW5nJzogZXhwIH0pOwogICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CiAgfQogIGlmIChsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgcmF3VG9rZW5zLnB1c2godG9rZW5WYWx1ZSA9IHRleHQuc2xpY2UobGFzdEluZGV4KSk7CiAgICB0b2tlbnMucHVzaChKU09OLnN0cmluZ2lmeSh0b2tlblZhbHVlKSk7CiAgfQogIHJldHVybiB7CiAgICBleHByZXNzaW9uOiB0b2tlbnMuam9pbignKycpLAogICAgdG9rZW5zOiByYXdUb2tlbnMKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gdHJhbnNmb3JtTm9kZSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljQ2xhc3MgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnY2xhc3MnKTsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHN0YXRpY0NsYXNzKSB7CiAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY0NsYXNzLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgaWYgKHJlcykgewogICAgICB3YXJuKAogICAgICAgICJjbGFzcz1cIiIgKyBzdGF0aWNDbGFzcyArICJcIjogIiArCiAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArCiAgICAgICAgJ1VzZSB2LWJpbmQgb3IgdGhlIGNvbG9uIHNob3J0aGFuZCBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgJyArCiAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBjbGFzcz0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpjbGFzcz0idmFsIj4uJwogICAgICApOwogICAgfQogIH0KICBpZiAoc3RhdGljQ2xhc3MpIHsKICAgIGVsLnN0YXRpY0NsYXNzID0gSlNPTi5zdHJpbmdpZnkoc3RhdGljQ2xhc3MpOwogIH0KICB2YXIgY2xhc3NCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdjbGFzcycsIGZhbHNlIC8qIGdldFN0YXRpYyAqLyk7CiAgaWYgKGNsYXNzQmluZGluZykgewogICAgZWwuY2xhc3NCaW5kaW5nID0gY2xhc3NCaW5kaW5nOwogIH0KfQoKZnVuY3Rpb24gZ2VuRGF0YSAoZWwpIHsKICB2YXIgZGF0YSA9ICcnOwogIGlmIChlbC5zdGF0aWNDbGFzcykgewogICAgZGF0YSArPSAic3RhdGljQ2xhc3M6IiArIChlbC5zdGF0aWNDbGFzcykgKyAiLCI7CiAgfQogIGlmIChlbC5jbGFzc0JpbmRpbmcpIHsKICAgIGRhdGEgKz0gImNsYXNzOiIgKyAoZWwuY2xhc3NCaW5kaW5nKSArICIsIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIGtsYXNzJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNDbGFzcyddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUsCiAgZ2VuRGF0YTogZ2VuRGF0YQp9CgovKiAgKi8KCmZ1bmN0aW9uIHRyYW5zZm9ybU5vZGUkMSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljU3R5bGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc3R5bGUnKTsKICBpZiAoc3RhdGljU3R5bGUpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY1N0eWxlLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgICBpZiAocmVzKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJzdHlsZT1cIiIgKyBzdGF0aWNTdHlsZSArICJcIjogIiArCiAgICAgICAgICAnSW50ZXJwb2xhdGlvbiBpbnNpZGUgYXR0cmlidXRlcyBoYXMgYmVlbiByZW1vdmVkLiAnICsKICAgICAgICAgICdVc2Ugdi1iaW5kIG9yIHRoZSBjb2xvbiBzaG9ydGhhbmQgaW5zdGVhZC4gRm9yIGV4YW1wbGUsICcgKwogICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBzdHlsZT0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpzdHlsZT0idmFsIj4uJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGVsLnN0YXRpY1N0eWxlID0gSlNPTi5zdHJpbmdpZnkocGFyc2VTdHlsZVRleHQoc3RhdGljU3R5bGUpKTsKICB9CgogIHZhciBzdHlsZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3N0eWxlJywgZmFsc2UgLyogZ2V0U3RhdGljICovKTsKICBpZiAoc3R5bGVCaW5kaW5nKSB7CiAgICBlbC5zdHlsZUJpbmRpbmcgPSBzdHlsZUJpbmRpbmc7CiAgfQp9CgpmdW5jdGlvbiBnZW5EYXRhJDEgKGVsKSB7CiAgdmFyIGRhdGEgPSAnJzsKICBpZiAoZWwuc3RhdGljU3R5bGUpIHsKICAgIGRhdGEgKz0gInN0YXRpY1N0eWxlOiIgKyAoZWwuc3RhdGljU3R5bGUpICsgIiwiOwogIH0KICBpZiAoZWwuc3R5bGVCaW5kaW5nKSB7CiAgICBkYXRhICs9ICJzdHlsZTooIiArIChlbC5zdHlsZUJpbmRpbmcpICsgIiksIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIHN0eWxlJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNTdHlsZSddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUkMSwKICBnZW5EYXRhOiBnZW5EYXRhJDEKfQoKLyogICovCgp2YXIgZGVjb2RlcjsKCnZhciBoZSA9IHsKICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZSAoaHRtbCkgewogICAgZGVjb2RlciA9IGRlY29kZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkZWNvZGVyLmlubmVySFRNTCA9IGh0bWw7CiAgICByZXR1cm4gZGVjb2Rlci50ZXh0Q29udGVudAogIH0KfQoKLyogICovCgp2YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoCiAgJ2FyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLCcgKwogICdsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicKKTsKCi8vIEVsZW1lbnRzIHRoYXQgeW91IGNhbiwgaW50ZW50aW9uYWxseSwgbGVhdmUgb3BlbgovLyAoYW5kIHdoaWNoIGNsb3NlIHRoZW1zZWx2ZXMpCnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcCgKICAnY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZScKKTsKCi8vIEhUTUw1IHRhZ3MgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sI2VsZW1lbnRzLTMKLy8gUGhyYXNpbmcgQ29udGVudCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNwaHJhc2luZy1jb250ZW50CnZhciBpc05vblBocmFzaW5nVGFnID0gbWFrZU1hcCgKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLCcgKwogICdkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sJyArCiAgJ2gxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLCcgKwogICdvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsJyArCiAgJ3RpdGxlLHRyLHRyYWNrJwopOwoKLyoqCiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGl0J3MgbW9zdGx5IHZlbmRvciBjb2RlLgogKi8KCi8qIQogKiBIVE1MIFBhcnNlciBCeSBKb2huIFJlc2lnIChlam9obi5vcmcpCiAqIE1vZGlmaWVkIGJ5IEp1cml5ICJrYW5nYXgiIFpheXRzZXYKICogT3JpZ2luYWwgY29kZSBieSBFcmlrIEFydmlkc3NvbiwgTW96aWxsYSBQdWJsaWMgTGljZW5zZQogKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qcwogKi8KCi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlcwp2YXIgYXR0cmlidXRlID0gL15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vOwovLyBjb3VsZCB1c2UgaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhtbC1uYW1lcy0xOTk5MDExNC8jTlQtUU5hbWUKLy8gYnV0IGZvciBWdWUgdGVtcGxhdGVzIHdlIGNhbiBlbmZvcmNlIGEgc2ltcGxlIGNoYXJzZXQKdmFyIG5jbmFtZSA9ICdbYS16QS1aX11bXFx3XFwtXFwuXSonOwp2YXIgcW5hbWVDYXB0dXJlID0gIigoPzoiICsgbmNuYW1lICsgIlxcOik/IiArIG5jbmFtZSArICIpIjsKdmFyIHN0YXJ0VGFnT3BlbiA9IG5ldyBSZWdFeHAoKCJePCIgKyBxbmFtZUNhcHR1cmUpKTsKdmFyIHN0YXJ0VGFnQ2xvc2UgPSAvXlxzKihcLz8pPi87CnZhciBlbmRUYWcgPSBuZXcgUmVnRXhwKCgiXjxcXC8iICsgcW5hbWVDYXB0dXJlICsgIltePl0qPiIpKTsKdmFyIGRvY3R5cGUgPSAvXjwhRE9DVFlQRSBbXj5dKz4vaTsKLy8gIzcyOTg6IGVzY2FwZSAtIHRvIGF2b2lkIGJlaW5nIHBhc2VkIGFzIEhUTUwgY29tbWVudCB3aGVuIGlubGluZWQgaW4gcGFnZQp2YXIgY29tbWVudCA9IC9ePCFcLS0vOwp2YXIgY29uZGl0aW9uYWxDb21tZW50ID0gL148IVxbLzsKCnZhciBJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOID0gZmFsc2U7Cid4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobSwgZykgewogIElTX1JFR0VYX0NBUFRVUklOR19CUk9LRU4gPSBnID09PSAnJzsKfSk7CgovLyBTcGVjaWFsIEVsZW1lbnRzIChjYW4gY29udGFpbiBhbnl0aGluZykKdmFyIGlzUGxhaW5UZXh0RWxlbWVudCA9IG1ha2VNYXAoJ3NjcmlwdCxzdHlsZSx0ZXh0YXJlYScsIHRydWUpOwp2YXIgcmVDYWNoZSA9IHt9OwoKdmFyIGRlY29kaW5nTWFwID0gewogICcmbHQ7JzogJzwnLAogICcmZ3Q7JzogJz4nLAogICcmcXVvdDsnOiAnIicsCiAgJyZhbXA7JzogJyYnLAogICcmIzEwOyc6ICdcbicsCiAgJyYjOTsnOiAnXHQnCn07CnZhciBlbmNvZGVkQXR0ciA9IC8mKD86bHR8Z3R8cXVvdHxhbXApOy9nOwp2YXIgZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgPSAvJig/Omx0fGd0fHF1b3R8YW1wfCMxMHwjOSk7L2c7CgovLyAjNTk5Mgp2YXIgaXNJZ25vcmVOZXdsaW5lVGFnID0gbWFrZU1hcCgncHJlLHRleHRhcmVhJywgdHJ1ZSk7CnZhciBzaG91bGRJZ25vcmVGaXJzdE5ld2xpbmUgPSBmdW5jdGlvbiAodGFnLCBodG1sKSB7IHJldHVybiB0YWcgJiYgaXNJZ25vcmVOZXdsaW5lVGFnKHRhZykgJiYgaHRtbFswXSA9PT0gJ1xuJzsgfTsKCmZ1bmN0aW9uIGRlY29kZUF0dHIgKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykgewogIHZhciByZSA9IHNob3VsZERlY29kZU5ld2xpbmVzID8gZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgOiBlbmNvZGVkQXR0cjsKICByZXR1cm4gdmFsdWUucmVwbGFjZShyZSwgZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBkZWNvZGluZ01hcFttYXRjaF07IH0pCn0KCmZ1bmN0aW9uIHBhcnNlSFRNTCAoaHRtbCwgb3B0aW9ucykgewogIHZhciBzdGFjayA9IFtdOwogIHZhciBleHBlY3RIVE1MID0gb3B0aW9ucy5leHBlY3RIVE1MOwogIHZhciBpc1VuYXJ5VGFnJCQxID0gb3B0aW9ucy5pc1VuYXJ5VGFnIHx8IG5vOwogIHZhciBjYW5CZUxlZnRPcGVuVGFnJCQxID0gb3B0aW9ucy5jYW5CZUxlZnRPcGVuVGFnIHx8IG5vOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxhc3QsIGxhc3RUYWc7CiAgd2hpbGUgKGh0bWwpIHsKICAgIGxhc3QgPSBodG1sOwogICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBpbiBhIHBsYWludGV4dCBjb250ZW50IGVsZW1lbnQgbGlrZSBzY3JpcHQvc3R5bGUKICAgIGlmICghbGFzdFRhZyB8fCAhaXNQbGFpblRleHRFbGVtZW50KGxhc3RUYWcpKSB7CiAgICAgIHZhciB0ZXh0RW5kID0gaHRtbC5pbmRleE9mKCc8Jyk7CiAgICAgIGlmICh0ZXh0RW5kID09PSAwKSB7CiAgICAgICAgLy8gQ29tbWVudDoKICAgICAgICBpZiAoY29tbWVudC50ZXN0KGh0bWwpKSB7CiAgICAgICAgICB2YXIgY29tbWVudEVuZCA9IGh0bWwuaW5kZXhPZignLS0+Jyk7CgogICAgICAgICAgaWYgKGNvbW1lbnRFbmQgPj0gMCkgewogICAgICAgICAgICBpZiAob3B0aW9ucy5zaG91bGRLZWVwQ29tbWVudCkgewogICAgICAgICAgICAgIG9wdGlvbnMuY29tbWVudChodG1sLnN1YnN0cmluZyg0LCBjb21tZW50RW5kKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZShjb21tZW50RW5kICsgMyk7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmRpdGlvbmFsX2NvbW1lbnQjRG93bmxldmVsLXJldmVhbGVkX2NvbmRpdGlvbmFsX2NvbW1lbnQKICAgICAgICBpZiAoY29uZGl0aW9uYWxDb21tZW50LnRlc3QoaHRtbCkpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25hbEVuZCA9IGh0bWwuaW5kZXhPZignXT4nKTsKCiAgICAgICAgICBpZiAoY29uZGl0aW9uYWxFbmQgPj0gMCkgewogICAgICAgICAgICBhZHZhbmNlKGNvbmRpdGlvbmFsRW5kICsgMik7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEb2N0eXBlOgogICAgICAgIHZhciBkb2N0eXBlTWF0Y2ggPSBodG1sLm1hdGNoKGRvY3R5cGUpOwogICAgICAgIGlmIChkb2N0eXBlTWF0Y2gpIHsKICAgICAgICAgIGFkdmFuY2UoZG9jdHlwZU1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgLy8gRW5kIHRhZzoKICAgICAgICB2YXIgZW5kVGFnTWF0Y2ggPSBodG1sLm1hdGNoKGVuZFRhZyk7CiAgICAgICAgaWYgKGVuZFRhZ01hdGNoKSB7CiAgICAgICAgICB2YXIgY3VySW5kZXggPSBpbmRleDsKICAgICAgICAgIGFkdmFuY2UoZW5kVGFnTWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgIHBhcnNlRW5kVGFnKGVuZFRhZ01hdGNoWzFdLCBjdXJJbmRleCwgaW5kZXgpOwogICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIC8vIFN0YXJ0IHRhZzoKICAgICAgICB2YXIgc3RhcnRUYWdNYXRjaCA9IHBhcnNlU3RhcnRUYWcoKTsKICAgICAgICBpZiAoc3RhcnRUYWdNYXRjaCkgewogICAgICAgICAgaGFuZGxlU3RhcnRUYWcoc3RhcnRUYWdNYXRjaCk7CiAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKGxhc3RUYWcsIGh0bWwpKSB7CiAgICAgICAgICAgIGFkdmFuY2UoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHRleHQgPSAodm9pZCAwKSwgcmVzdCA9ICh2b2lkIDApLCBuZXh0ID0gKHZvaWQgMCk7CiAgICAgIGlmICh0ZXh0RW5kID49IDApIHsKICAgICAgICByZXN0ID0gaHRtbC5zbGljZSh0ZXh0RW5kKTsKICAgICAgICB3aGlsZSAoCiAgICAgICAgICAhZW5kVGFnLnRlc3QocmVzdCkgJiYKICAgICAgICAgICFzdGFydFRhZ09wZW4udGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbW1lbnQudGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbmRpdGlvbmFsQ29tbWVudC50ZXN0KHJlc3QpCiAgICAgICAgKSB7CiAgICAgICAgICAvLyA8IGluIHBsYWluIHRleHQsIGJlIGZvcmdpdmluZyBhbmQgdHJlYXQgaXQgYXMgdGV4dAogICAgICAgICAgbmV4dCA9IHJlc3QuaW5kZXhPZignPCcsIDEpOwogICAgICAgICAgaWYgKG5leHQgPCAwKSB7IGJyZWFrIH0KICAgICAgICAgIHRleHRFbmQgKz0gbmV4dDsKICAgICAgICAgIHJlc3QgPSBodG1sLnNsaWNlKHRleHRFbmQpOwogICAgICAgIH0KICAgICAgICB0ZXh0ID0gaHRtbC5zdWJzdHJpbmcoMCwgdGV4dEVuZCk7CiAgICAgICAgYWR2YW5jZSh0ZXh0RW5kKTsKICAgICAgfQoKICAgICAgaWYgKHRleHRFbmQgPCAwKSB7CiAgICAgICAgdGV4dCA9IGh0bWw7CiAgICAgICAgaHRtbCA9ICcnOwogICAgICB9CgogICAgICBpZiAob3B0aW9ucy5jaGFycyAmJiB0ZXh0KSB7CiAgICAgICAgb3B0aW9ucy5jaGFycyh0ZXh0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGVuZFRhZ0xlbmd0aCA9IDA7CiAgICAgIHZhciBzdGFja2VkVGFnID0gbGFzdFRhZy50b0xvd2VyQ2FzZSgpOwogICAgICB2YXIgcmVTdGFja2VkVGFnID0gcmVDYWNoZVtzdGFja2VkVGFnXSB8fCAocmVDYWNoZVtzdGFja2VkVGFnXSA9IG5ldyBSZWdFeHAoJyhbXFxzXFxTXSo/KSg8LycgKyBzdGFja2VkVGFnICsgJ1tePl0qPiknLCAnaScpKTsKICAgICAgdmFyIHJlc3QkMSA9IGh0bWwucmVwbGFjZShyZVN0YWNrZWRUYWcsIGZ1bmN0aW9uIChhbGwsIHRleHQsIGVuZFRhZykgewogICAgICAgIGVuZFRhZ0xlbmd0aCA9IGVuZFRhZy5sZW5ndGg7CiAgICAgICAgaWYgKCFpc1BsYWluVGV4dEVsZW1lbnQoc3RhY2tlZFRhZykgJiYgc3RhY2tlZFRhZyAhPT0gJ25vc2NyaXB0JykgewogICAgICAgICAgdGV4dCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCAnJDEnKSAvLyAjNzI5OAogICAgICAgICAgICAucmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csICckMScpOwogICAgICAgIH0KICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKHN0YWNrZWRUYWcsIHRleHQpKSB7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnMpIHsKICAgICAgICAgIG9wdGlvbnMuY2hhcnModGV4dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJwogICAgICB9KTsKICAgICAgaW5kZXggKz0gaHRtbC5sZW5ndGggLSByZXN0JDEubGVuZ3RoOwogICAgICBodG1sID0gcmVzdCQxOwogICAgICBwYXJzZUVuZFRhZyhzdGFja2VkVGFnLCBpbmRleCAtIGVuZFRhZ0xlbmd0aCwgaW5kZXgpOwogICAgfQoKICAgIGlmIChodG1sID09PSBsYXN0KSB7CiAgICAgIG9wdGlvbnMuY2hhcnMgJiYgb3B0aW9ucy5jaGFycyhodG1sKTsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiAhc3RhY2subGVuZ3RoICYmIG9wdGlvbnMud2FybikgewogICAgICAgIG9wdGlvbnMud2FybigoIk1hbC1mb3JtYXR0ZWQgdGFnIGF0IGVuZCBvZiB0ZW1wbGF0ZTogXCIiICsgaHRtbCArICJcIiIpKTsKICAgICAgfQogICAgICBicmVhawogICAgfQogIH0KCiAgLy8gQ2xlYW4gdXAgYW55IHJlbWFpbmluZyB0YWdzCiAgcGFyc2VFbmRUYWcoKTsKCiAgZnVuY3Rpb24gYWR2YW5jZSAobikgewogICAgaW5kZXggKz0gbjsKICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhuKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3RhcnRUYWcgKCkgewogICAgdmFyIHN0YXJ0ID0gaHRtbC5tYXRjaChzdGFydFRhZ09wZW4pOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIHZhciBtYXRjaCA9IHsKICAgICAgICB0YWdOYW1lOiBzdGFydFsxXSwKICAgICAgICBhdHRyczogW10sCiAgICAgICAgc3RhcnQ6IGluZGV4CiAgICAgIH07CiAgICAgIGFkdmFuY2Uoc3RhcnRbMF0ubGVuZ3RoKTsKICAgICAgdmFyIGVuZCwgYXR0cjsKICAgICAgd2hpbGUgKCEoZW5kID0gaHRtbC5tYXRjaChzdGFydFRhZ0Nsb3NlKSkgJiYgKGF0dHIgPSBodG1sLm1hdGNoKGF0dHJpYnV0ZSkpKSB7CiAgICAgICAgYWR2YW5jZShhdHRyWzBdLmxlbmd0aCk7CiAgICAgICAgbWF0Y2guYXR0cnMucHVzaChhdHRyKTsKICAgICAgfQogICAgICBpZiAoZW5kKSB7CiAgICAgICAgbWF0Y2gudW5hcnlTbGFzaCA9IGVuZFsxXTsKICAgICAgICBhZHZhbmNlKGVuZFswXS5sZW5ndGgpOwogICAgICAgIG1hdGNoLmVuZCA9IGluZGV4OwogICAgICAgIHJldHVybiBtYXRjaAogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVTdGFydFRhZyAobWF0Y2gpIHsKICAgIHZhciB0YWdOYW1lID0gbWF0Y2gudGFnTmFtZTsKICAgIHZhciB1bmFyeVNsYXNoID0gbWF0Y2gudW5hcnlTbGFzaDsKCiAgICBpZiAoZXhwZWN0SFRNTCkgewogICAgICBpZiAobGFzdFRhZyA9PT0gJ3AnICYmIGlzTm9uUGhyYXNpbmdUYWcodGFnTmFtZSkpIHsKICAgICAgICBwYXJzZUVuZFRhZyhsYXN0VGFnKTsKICAgICAgfQogICAgICBpZiAoY2FuQmVMZWZ0T3BlblRhZyQkMSh0YWdOYW1lKSAmJiBsYXN0VGFnID09PSB0YWdOYW1lKSB7CiAgICAgICAgcGFyc2VFbmRUYWcodGFnTmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdW5hcnkgPSBpc1VuYXJ5VGFnJCQxKHRhZ05hbWUpIHx8ICEhdW5hcnlTbGFzaDsKCiAgICB2YXIgbCA9IG1hdGNoLmF0dHJzLmxlbmd0aDsKICAgIHZhciBhdHRycyA9IG5ldyBBcnJheShsKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBhcmdzID0gbWF0Y2guYXR0cnNbaV07CiAgICAgIC8vIGhhY2tpc2ggd29yayBhcm91bmQgRkYgYnVnIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTM2OTc3OAogICAgICBpZiAoSVNfUkVHRVhfQ0FQVFVSSU5HX0JST0tFTiAmJiBhcmdzWzBdLmluZGV4T2YoJyIiJykgPT09IC0xKSB7CiAgICAgICAgaWYgKGFyZ3NbM10gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzNdOyB9CiAgICAgICAgaWYgKGFyZ3NbNF0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzRdOyB9CiAgICAgICAgaWYgKGFyZ3NbNV0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzVdOyB9CiAgICAgIH0KICAgICAgdmFyIHZhbHVlID0gYXJnc1szXSB8fCBhcmdzWzRdIHx8IGFyZ3NbNV0gfHwgJyc7CiAgICAgIHZhciBzaG91bGREZWNvZGVOZXdsaW5lcyA9IHRhZ05hbWUgPT09ICdhJyAmJiBhcmdzWzFdID09PSAnaHJlZicKICAgICAgICA/IG9wdGlvbnMuc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmCiAgICAgICAgOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzOwogICAgICBhdHRyc1tpXSA9IHsKICAgICAgICBuYW1lOiBhcmdzWzFdLAogICAgICAgIHZhbHVlOiBkZWNvZGVBdHRyKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykKICAgICAgfTsKICAgIH0KCiAgICBpZiAoIXVuYXJ5KSB7CiAgICAgIHN0YWNrLnB1c2goeyB0YWc6IHRhZ05hbWUsIGxvd2VyQ2FzZWRUYWc6IHRhZ05hbWUudG9Mb3dlckNhc2UoKSwgYXR0cnM6IGF0dHJzIH0pOwogICAgICBsYXN0VGFnID0gdGFnTmFtZTsKICAgIH0KCiAgICBpZiAob3B0aW9ucy5zdGFydCkgewogICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIGF0dHJzLCB1bmFyeSwgbWF0Y2guc3RhcnQsIG1hdGNoLmVuZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZUVuZFRhZyAodGFnTmFtZSwgc3RhcnQsIGVuZCkgewogICAgdmFyIHBvcywgbG93ZXJDYXNlZFRhZ05hbWU7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgeyBzdGFydCA9IGluZGV4OyB9CiAgICBpZiAoZW5kID09IG51bGwpIHsgZW5kID0gaW5kZXg7IH0KCiAgICBpZiAodGFnTmFtZSkgewogICAgICBsb3dlckNhc2VkVGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIH0KCiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG9wZW5lZCB0YWcgb2YgdGhlIHNhbWUgdHlwZQogICAgaWYgKHRhZ05hbWUpIHsKICAgICAgZm9yIChwb3MgPSBzdGFjay5sZW5ndGggLSAxOyBwb3MgPj0gMDsgcG9zLS0pIHsKICAgICAgICBpZiAoc3RhY2tbcG9zXS5sb3dlckNhc2VkVGFnID09PSBsb3dlckNhc2VkVGFnTmFtZSkgewogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIG5vIHRhZyBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhbiBzaG9wCiAgICAgIHBvcyA9IDA7CiAgICB9CgogICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrCiAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IHBvczsgaS0tKSB7CiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgKGkgPiBwb3MgfHwgIXRhZ05hbWUpICYmCiAgICAgICAgICBvcHRpb25zLndhcm4KICAgICAgICApIHsKICAgICAgICAgIG9wdGlvbnMud2FybigKICAgICAgICAgICAgKCJ0YWcgPCIgKyAoc3RhY2tbaV0udGFnKSArICI+IGhhcyBubyBtYXRjaGluZyBlbmQgdGFnLiIpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy5lbmQpIHsKICAgICAgICAgIG9wdGlvbnMuZW5kKHN0YWNrW2ldLnRhZywgc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZW1vdmUgdGhlIG9wZW4gZWxlbWVudHMgZnJvbSB0aGUgc3RhY2sKICAgICAgc3RhY2subGVuZ3RoID0gcG9zOwogICAgICBsYXN0VGFnID0gcG9zICYmIHN0YWNrW3BvcyAtIDFdLnRhZzsKICAgIH0gZWxzZSBpZiAobG93ZXJDYXNlZFRhZ05hbWUgPT09ICdicicpIHsKICAgICAgaWYgKG9wdGlvbnMuc3RhcnQpIHsKICAgICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIFtdLCB0cnVlLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChsb3dlckNhc2VkVGFnTmFtZSA9PT0gJ3AnKSB7CiAgICAgIGlmIChvcHRpb25zLnN0YXJ0KSB7CiAgICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBbXSwgZmFsc2UsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmVuZCkgewogICAgICAgIG9wdGlvbnMuZW5kKHRhZ05hbWUsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciBvblJFID0gL15AfF52LW9uOi87CnZhciBkaXJSRSA9IC9edi18XkB8XjovOwp2YXIgZm9yQWxpYXNSRSA9IC8oW15dKj8pXHMrKD86aW58b2YpXHMrKFteXSopLzsKdmFyIGZvckl0ZXJhdG9yUkUgPSAvLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLzsKdmFyIHN0cmlwUGFyZW5zUkUgPSAvXlwofFwpJC9nOwoKdmFyIGFyZ1JFID0gLzooLiopJC87CnZhciBiaW5kUkUgPSAvXjp8XnYtYmluZDovOwp2YXIgbW9kaWZpZXJSRSA9IC9cLlteLl0rL2c7Cgp2YXIgZGVjb2RlSFRNTENhY2hlZCA9IGNhY2hlZChoZS5kZWNvZGUpOwoKLy8gY29uZmlndXJhYmxlIHN0YXRlCnZhciB3YXJuJDI7CnZhciBkZWxpbWl0ZXJzOwp2YXIgdHJhbnNmb3JtczsKdmFyIHByZVRyYW5zZm9ybXM7CnZhciBwb3N0VHJhbnNmb3JtczsKdmFyIHBsYXRmb3JtSXNQcmVUYWc7CnZhciBwbGF0Zm9ybU11c3RVc2VQcm9wOwp2YXIgcGxhdGZvcm1HZXRUYWdOYW1lc3BhY2U7CgoKCmZ1bmN0aW9uIGNyZWF0ZUFTVEVsZW1lbnQgKAogIHRhZywKICBhdHRycywKICBwYXJlbnQKKSB7CiAgcmV0dXJuIHsKICAgIHR5cGU6IDEsCiAgICB0YWc6IHRhZywKICAgIGF0dHJzTGlzdDogYXR0cnMsCiAgICBhdHRyc01hcDogbWFrZUF0dHJzTWFwKGF0dHJzKSwKICAgIHBhcmVudDogcGFyZW50LAogICAgY2hpbGRyZW46IFtdCiAgfQp9CgovKioKICogQ29udmVydCBIVE1MIHN0cmluZyB0byBBU1QuCiAqLwpmdW5jdGlvbiBwYXJzZSAoCiAgdGVtcGxhdGUsCiAgb3B0aW9ucwopIHsKICB3YXJuJDIgPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CgogIHBsYXRmb3JtSXNQcmVUYWcgPSBvcHRpb25zLmlzUHJlVGFnIHx8IG5vOwogIHBsYXRmb3JtTXVzdFVzZVByb3AgPSBvcHRpb25zLm11c3RVc2VQcm9wIHx8IG5vOwogIHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlID0gb3B0aW9ucy5nZXRUYWdOYW1lc3BhY2UgfHwgbm87CgogIHRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3RyYW5zZm9ybU5vZGUnKTsKICBwcmVUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwcmVUcmFuc2Zvcm1Ob2RlJyk7CiAgcG9zdFRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3Bvc3RUcmFuc2Zvcm1Ob2RlJyk7CgogIGRlbGltaXRlcnMgPSBvcHRpb25zLmRlbGltaXRlcnM7CgogIHZhciBzdGFjayA9IFtdOwogIHZhciBwcmVzZXJ2ZVdoaXRlc3BhY2UgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSAhPT0gZmFsc2U7CiAgdmFyIHJvb3Q7CiAgdmFyIGN1cnJlbnRQYXJlbnQ7CiAgdmFyIGluVlByZSA9IGZhbHNlOwogIHZhciBpblByZSA9IGZhbHNlOwogIHZhciB3YXJuZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gd2Fybk9uY2UgKG1zZykgewogICAgaWYgKCF3YXJuZWQpIHsKICAgICAgd2FybmVkID0gdHJ1ZTsKICAgICAgd2FybiQyKG1zZyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbG9zZUVsZW1lbnQgKGVsZW1lbnQpIHsKICAgIC8vIGNoZWNrIHByZSBzdGF0ZQogICAgaWYgKGVsZW1lbnQucHJlKSB7CiAgICAgIGluVlByZSA9IGZhbHNlOwogICAgfQogICAgaWYgKHBsYXRmb3JtSXNQcmVUYWcoZWxlbWVudC50YWcpKSB7CiAgICAgIGluUHJlID0gZmFsc2U7CiAgICB9CiAgICAvLyBhcHBseSBwb3N0LXRyYW5zZm9ybXMKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zdFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgcG9zdFRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucyk7CiAgICB9CiAgfQoKICBwYXJzZUhUTUwodGVtcGxhdGUsIHsKICAgIHdhcm46IHdhcm4kMiwKICAgIGV4cGVjdEhUTUw6IG9wdGlvbnMuZXhwZWN0SFRNTCwKICAgIGlzVW5hcnlUYWc6IG9wdGlvbnMuaXNVbmFyeVRhZywKICAgIGNhbkJlTGVmdE9wZW5UYWc6IG9wdGlvbnMuY2FuQmVMZWZ0T3BlblRhZywKICAgIHNob3VsZERlY29kZU5ld2xpbmVzOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzLAogICAgc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiwKICAgIHNob3VsZEtlZXBDb21tZW50OiBvcHRpb25zLmNvbW1lbnRzLAogICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0ICh0YWcsIGF0dHJzLCB1bmFyeSkgewogICAgICAvLyBjaGVjayBuYW1lc3BhY2UuCiAgICAgIC8vIGluaGVyaXQgcGFyZW50IG5zIGlmIHRoZXJlIGlzIG9uZQogICAgICB2YXIgbnMgPSAoY3VycmVudFBhcmVudCAmJiBjdXJyZW50UGFyZW50Lm5zKSB8fCBwbGF0Zm9ybUdldFRhZ05hbWVzcGFjZSh0YWcpOwoKICAgICAgLy8gaGFuZGxlIElFIHN2ZyBidWcKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmIChpc0lFICYmIG5zID09PSAnc3ZnJykgewogICAgICAgIGF0dHJzID0gZ3VhcmRJRVNWR0J1ZyhhdHRycyk7CiAgICAgIH0KCiAgICAgIHZhciBlbGVtZW50ID0gY3JlYXRlQVNURWxlbWVudCh0YWcsIGF0dHJzLCBjdXJyZW50UGFyZW50KTsKICAgICAgaWYgKG5zKSB7CiAgICAgICAgZWxlbWVudC5ucyA9IG5zOwogICAgICB9CgogICAgICBpZiAoaXNGb3JiaWRkZW5UYWcoZWxlbWVudCkgJiYgIWlzU2VydmVyUmVuZGVyaW5nKCkpIHsKICAgICAgICBlbGVtZW50LmZvcmJpZGRlbiA9IHRydWU7CiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4kMigKICAgICAgICAgICdUZW1wbGF0ZXMgc2hvdWxkIG9ubHkgYmUgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgdGhlIHN0YXRlIHRvIHRoZSAnICsKICAgICAgICAgICdVSS4gQXZvaWQgcGxhY2luZyB0YWdzIHdpdGggc2lkZS1lZmZlY3RzIGluIHlvdXIgdGVtcGxhdGVzLCBzdWNoIGFzICcgKwogICAgICAgICAgIjwiICsgdGFnICsgIj4iICsgJywgYXMgdGhleSB3aWxsIG5vdCBiZSBwYXJzZWQuJwogICAgICAgICk7CiAgICAgIH0KCiAgICAgIC8vIGFwcGx5IHByZS10cmFuc2Zvcm1zCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlVHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGVsZW1lbnQgPSBwcmVUcmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgICAgIH0KCiAgICAgIGlmICghaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1ByZShlbGVtZW50KTsKICAgICAgICBpZiAoZWxlbWVudC5wcmUpIHsKICAgICAgICAgIGluVlByZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwbGF0Zm9ybUlzUHJlVGFnKGVsZW1lbnQudGFnKSkgewogICAgICAgIGluUHJlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1Jhd0F0dHJzKGVsZW1lbnQpOwogICAgICB9IGVsc2UgaWYgKCFlbGVtZW50LnByb2Nlc3NlZCkgewogICAgICAgIC8vIHN0cnVjdHVyYWwgZGlyZWN0aXZlcwogICAgICAgIHByb2Nlc3NGb3IoZWxlbWVudCk7CiAgICAgICAgcHJvY2Vzc0lmKGVsZW1lbnQpOwogICAgICAgIHByb2Nlc3NPbmNlKGVsZW1lbnQpOwogICAgICAgIC8vIGVsZW1lbnQtc2NvcGUgc3R1ZmYKICAgICAgICBwcm9jZXNzRWxlbWVudChlbGVtZW50LCBvcHRpb25zKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2hlY2tSb290Q29uc3RyYWludHMgKGVsKSB7CiAgICAgICAgewogICAgICAgICAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnIHx8IGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8IiArIChlbC50YWcpICsgIj4gYXMgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlIGl0IG1heSAiICsKICAgICAgICAgICAgICAnY29udGFpbiBtdWx0aXBsZSBub2Rlcy4nCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZWwuYXR0cnNNYXAuaGFzT3duUHJvcGVydHkoJ3YtZm9yJykpIHsKICAgICAgICAgICAgd2Fybk9uY2UoCiAgICAgICAgICAgICAgJ0Nhbm5vdCB1c2Ugdi1mb3Igb24gc3RhdGVmdWwgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlICcgKwogICAgICAgICAgICAgICdpdCByZW5kZXJzIG11bHRpcGxlIGVsZW1lbnRzLicKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIHRyZWUgbWFuYWdlbWVudAogICAgICBpZiAoIXJvb3QpIHsKICAgICAgICByb290ID0gZWxlbWVudDsKICAgICAgICBjaGVja1Jvb3RDb25zdHJhaW50cyhyb290KTsKICAgICAgfSBlbHNlIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgLy8gYWxsb3cgcm9vdCBlbGVtZW50cyB3aXRoIHYtaWYsIHYtZWxzZS1pZiBhbmQgdi1lbHNlCiAgICAgICAgaWYgKHJvb3QuaWYgJiYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkpIHsKICAgICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKGVsZW1lbnQpOwogICAgICAgICAgYWRkSWZDb25kaXRpb24ocm9vdCwgewogICAgICAgICAgICBleHA6IGVsZW1lbnQuZWxzZWlmLAogICAgICAgICAgICBibG9jazogZWxlbWVudAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm5PbmNlKAogICAgICAgICAgICAiQ29tcG9uZW50IHRlbXBsYXRlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gIiArCiAgICAgICAgICAgICJJZiB5b3UgYXJlIHVzaW5nIHYtaWYgb24gbXVsdGlwbGUgZWxlbWVudHMsICIgKwogICAgICAgICAgICAidXNlIHYtZWxzZS1pZiB0byBjaGFpbiB0aGVtIGluc3RlYWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgJiYgIWVsZW1lbnQuZm9yYmlkZGVuKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkgewogICAgICAgICAgcHJvY2Vzc0lmQ29uZGl0aW9ucyhlbGVtZW50LCBjdXJyZW50UGFyZW50KTsKICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc2xvdFNjb3BlKSB7IC8vIHNjb3BlZCBzbG90CiAgICAgICAgICBjdXJyZW50UGFyZW50LnBsYWluID0gZmFsc2U7CiAgICAgICAgICB2YXIgbmFtZSA9IGVsZW1lbnQuc2xvdFRhcmdldCB8fCAnImRlZmF1bHQiJzsoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyB8fCAoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyA9IHt9KSlbbmFtZV0gPSBlbGVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goZWxlbWVudCk7CiAgICAgICAgICBlbGVtZW50LnBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdW5hcnkpIHsKICAgICAgICBjdXJyZW50UGFyZW50ID0gZWxlbWVudDsKICAgICAgICBzdGFjay5wdXNoKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgICAgfQogICAgfSwKCiAgICBlbmQ6IGZ1bmN0aW9uIGVuZCAoKSB7CiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgIHZhciBlbGVtZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIHZhciBsYXN0Tm9kZSA9IGVsZW1lbnQuY2hpbGRyZW5bZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDMgJiYgbGFzdE5vZGUudGV4dCA9PT0gJyAnICYmICFpblByZSkgewogICAgICAgIGVsZW1lbnQuY2hpbGRyZW4ucG9wKCk7CiAgICAgIH0KICAgICAgLy8gcG9wIHN0YWNrCiAgICAgIHN0YWNrLmxlbmd0aCAtPSAxOwogICAgICBjdXJyZW50UGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgIH0sCgogICAgY2hhcnM6IGZ1bmN0aW9uIGNoYXJzICh0ZXh0KSB7CiAgICAgIGlmICghY3VycmVudFBhcmVudCkgewogICAgICAgIHsKICAgICAgICAgIGlmICh0ZXh0ID09PSB0ZW1wbGF0ZSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAnQ29tcG9uZW50IHRlbXBsYXRlIHJlcXVpcmVzIGEgcm9vdCBlbGVtZW50LCByYXRoZXIgdGhhbiBqdXN0IHRleHQuJwogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIGlmICgodGV4dCA9IHRleHQudHJpbSgpKSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAoInRleHQgXCIiICsgdGV4dCArICJcIiBvdXRzaWRlIHJvb3QgZWxlbWVudCB3aWxsIGJlIGlnbm9yZWQuIikKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgLy8gSUUgdGV4dGFyZWEgcGxhY2Vob2xkZXIgYnVnCiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoaXNJRSAmJgogICAgICAgIGN1cnJlbnRQYXJlbnQudGFnID09PSAndGV4dGFyZWEnICYmCiAgICAgICAgY3VycmVudFBhcmVudC5hdHRyc01hcC5wbGFjZWhvbGRlciA9PT0gdGV4dAogICAgICApIHsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50UGFyZW50LmNoaWxkcmVuOwogICAgICB0ZXh0ID0gaW5QcmUgfHwgdGV4dC50cmltKCkKICAgICAgICA/IGlzVGV4dFRhZyhjdXJyZW50UGFyZW50KSA/IHRleHQgOiBkZWNvZGVIVE1MQ2FjaGVkKHRleHQpCiAgICAgICAgLy8gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGlmIGl0cyBub3QgcmlnaHQgYWZ0ZXIgYSBzdGFydGluZyB0YWcKICAgICAgICA6IHByZXNlcnZlV2hpdGVzcGFjZSAmJiBjaGlsZHJlbi5sZW5ndGggPyAnICcgOiAnJzsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIGlmICghaW5WUHJlICYmIHRleHQgIT09ICcgJyAmJiAocmVzID0gcGFyc2VUZXh0KHRleHQsIGRlbGltaXRlcnMpKSkgewogICAgICAgICAgY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHR5cGU6IDIsCiAgICAgICAgICAgIGV4cHJlc3Npb246IHJlcy5leHByZXNzaW9uLAogICAgICAgICAgICB0b2tlbnM6IHJlcy50b2tlbnMsCiAgICAgICAgICAgIHRleHQ6IHRleHQKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAodGV4dCAhPT0gJyAnIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dCAhPT0gJyAnKSB7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgdHlwZTogMywKICAgICAgICAgICAgdGV4dDogdGV4dAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY29tbWVudDogZnVuY3Rpb24gY29tbWVudCAodGV4dCkgewogICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goewogICAgICAgIHR5cGU6IDMsCiAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICBpc0NvbW1lbnQ6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJvb3QKfQoKZnVuY3Rpb24gcHJvY2Vzc1ByZSAoZWwpIHsKICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtcHJlJykgIT0gbnVsbCkgewogICAgZWwucHJlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSYXdBdHRycyAoZWwpIHsKICB2YXIgbCA9IGVsLmF0dHJzTGlzdC5sZW5ndGg7CiAgaWYgKGwpIHsKICAgIHZhciBhdHRycyA9IGVsLmF0dHJzID0gbmV3IEFycmF5KGwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgYXR0cnNbaV0gPSB7CiAgICAgICAgbmFtZTogZWwuYXR0cnNMaXN0W2ldLm5hbWUsCiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVsLmF0dHJzTGlzdFtpXS52YWx1ZSkKICAgICAgfTsKICAgIH0KICB9IGVsc2UgaWYgKCFlbC5wcmUpIHsKICAgIC8vIG5vbiByb290IG5vZGUgaW4gcHJlIGJsb2NrcyB3aXRoIG5vIGF0dHJpYnV0ZXMKICAgIGVsLnBsYWluID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50IChlbGVtZW50LCBvcHRpb25zKSB7CiAgcHJvY2Vzc0tleShlbGVtZW50KTsKCiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgYWZ0ZXIKICAvLyByZW1vdmluZyBzdHJ1Y3R1cmFsIGF0dHJpYnV0ZXMKICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFlbGVtZW50LmF0dHJzTGlzdC5sZW5ndGg7CgogIHByb2Nlc3NSZWYoZWxlbWVudCk7CiAgcHJvY2Vzc1Nsb3QoZWxlbWVudCk7CiAgcHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgIGVsZW1lbnQgPSB0cmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgfQogIHByb2Nlc3NBdHRycyhlbGVtZW50KTsKfQoKZnVuY3Rpb24gcHJvY2Vzc0tleSAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QmluZGluZ0F0dHIoZWwsICdrZXknKTsKICBpZiAoZXhwKSB7CiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICB3YXJuJDIoIjx0ZW1wbGF0ZT4gY2Fubm90IGJlIGtleWVkLiBQbGFjZSB0aGUga2V5IG9uIHJlYWwgZWxlbWVudHMgaW5zdGVhZC4iKTsKICAgIH0KICAgIGVsLmtleSA9IGV4cDsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSZWYgKGVsKSB7CiAgdmFyIHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAncmVmJyk7CiAgaWYgKHJlZikgewogICAgZWwucmVmID0gcmVmOwogICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NGb3IgKGVsKSB7CiAgdmFyIGV4cDsKICBpZiAoKGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWZvcicpKSkgewogICAgdmFyIHJlcyA9IHBhcnNlRm9yKGV4cCk7CiAgICBpZiAocmVzKSB7CiAgICAgIGV4dGVuZChlbCwgcmVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdhcm4kMigKICAgICAgICAoIkludmFsaWQgdi1mb3IgZXhwcmVzc2lvbjogIiArIGV4cCkKICAgICAgKTsKICAgIH0KICB9Cn0KCgoKZnVuY3Rpb24gcGFyc2VGb3IgKGV4cCkgewogIHZhciBpbk1hdGNoID0gZXhwLm1hdGNoKGZvckFsaWFzUkUpOwogIGlmICghaW5NYXRjaCkgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICByZXMuZm9yID0gaW5NYXRjaFsyXS50cmltKCk7CiAgdmFyIGFsaWFzID0gaW5NYXRjaFsxXS50cmltKCkucmVwbGFjZShzdHJpcFBhcmVuc1JFLCAnJyk7CiAgdmFyIGl0ZXJhdG9yTWF0Y2ggPSBhbGlhcy5tYXRjaChmb3JJdGVyYXRvclJFKTsKICBpZiAoaXRlcmF0b3JNYXRjaCkgewogICAgcmVzLmFsaWFzID0gYWxpYXMucmVwbGFjZShmb3JJdGVyYXRvclJFLCAnJyk7CiAgICByZXMuaXRlcmF0b3IxID0gaXRlcmF0b3JNYXRjaFsxXS50cmltKCk7CiAgICBpZiAoaXRlcmF0b3JNYXRjaFsyXSkgewogICAgICByZXMuaXRlcmF0b3IyID0gaXRlcmF0b3JNYXRjaFsyXS50cmltKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJlcy5hbGlhcyA9IGFsaWFzOwogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIHByb2Nlc3NJZiAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtaWYnKTsKICBpZiAoZXhwKSB7CiAgICBlbC5pZiA9IGV4cDsKICAgIGFkZElmQ29uZGl0aW9uKGVsLCB7CiAgICAgIGV4cDogZXhwLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScpICE9IG51bGwpIHsKICAgICAgZWwuZWxzZSA9IHRydWU7CiAgICB9CiAgICB2YXIgZWxzZWlmID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZS1pZicpOwogICAgaWYgKGVsc2VpZikgewogICAgICBlbC5lbHNlaWYgPSBlbHNlaWY7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBwcm9jZXNzSWZDb25kaXRpb25zIChlbCwgcGFyZW50KSB7CiAgdmFyIHByZXYgPSBmaW5kUHJldkVsZW1lbnQocGFyZW50LmNoaWxkcmVuKTsKICBpZiAocHJldiAmJiBwcmV2LmlmKSB7CiAgICBhZGRJZkNvbmRpdGlvbihwcmV2LCB7CiAgICAgIGV4cDogZWwuZWxzZWlmLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICB3YXJuJDIoCiAgICAgICJ2LSIgKyAoZWwuZWxzZWlmID8gKCdlbHNlLWlmPSInICsgZWwuZWxzZWlmICsgJyInKSA6ICdlbHNlJykgKyAiICIgKwogICAgICAidXNlZCBvbiBlbGVtZW50IDwiICsgKGVsLnRhZykgKyAiPiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdi1pZi4iCiAgICApOwogIH0KfQoKZnVuY3Rpb24gZmluZFByZXZFbGVtZW50IChjaGlsZHJlbikgewogIHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIGlmIChjaGlsZHJlbltpXS50eXBlID09PSAxKSB7CiAgICAgIHJldHVybiBjaGlsZHJlbltpXQogICAgfSBlbHNlIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGlsZHJlbltpXS50ZXh0ICE9PSAnICcpIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAidGV4dCBcIiIgKyAoY2hpbGRyZW5baV0udGV4dC50cmltKCkpICsgIlwiIGJldHdlZW4gdi1pZiBhbmQgdi1lbHNlKC1pZikgIiArCiAgICAgICAgICAid2lsbCBiZSBpZ25vcmVkLiIKICAgICAgICApOwogICAgICB9CiAgICAgIGNoaWxkcmVuLnBvcCgpOwogICAgfQogIH0KfQoKZnVuY3Rpb24gYWRkSWZDb25kaXRpb24gKGVsLCBjb25kaXRpb24pIHsKICBpZiAoIWVsLmlmQ29uZGl0aW9ucykgewogICAgZWwuaWZDb25kaXRpb25zID0gW107CiAgfQogIGVsLmlmQ29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NPbmNlIChlbCkgewogIHZhciBvbmNlJCQxID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Ytb25jZScpOwogIGlmIChvbmNlJCQxICE9IG51bGwpIHsKICAgIGVsLm9uY2UgPSB0cnVlOwogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc1Nsb3QgKGVsKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnKSB7CiAgICBlbC5zbG90TmFtZSA9IGdldEJpbmRpbmdBdHRyKGVsLCAnbmFtZScpOwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBlbC5rZXkpIHsKICAgICAgd2FybiQyKAogICAgICAgICJga2V5YCBkb2VzIG5vdCB3b3JrIG9uIDxzbG90PiBiZWNhdXNlIHNsb3RzIGFyZSBhYnN0cmFjdCBvdXRsZXRzICIgKwogICAgICAgICJhbmQgY2FuIHBvc3NpYmx5IGV4cGFuZCBpbnRvIG11bHRpcGxlIGVsZW1lbnRzLiAiICsKICAgICAgICAiVXNlIHRoZSBrZXkgb24gYSB3cmFwcGluZyBlbGVtZW50IGluc3RlYWQuIgogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgc2xvdFNjb3BlOwogICAgaWYgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICBzbG90U2NvcGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2NvcGUnKTsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgc2xvdFNjb3BlKSB7CiAgICAgICAgd2FybiQyKAogICAgICAgICAgInRoZSBcInNjb3BlXCIgYXR0cmlidXRlIGZvciBzY29wZWQgc2xvdHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kICIgKwogICAgICAgICAgInJlcGxhY2VkIGJ5IFwic2xvdC1zY29wZVwiIHNpbmNlIDIuNS4gVGhlIG5ldyBcInNsb3Qtc2NvcGVcIiBhdHRyaWJ1dGUgIiArCiAgICAgICAgICAiY2FuIGFsc28gYmUgdXNlZCBvbiBwbGFpbiBlbGVtZW50cyBpbiBhZGRpdGlvbiB0byA8dGVtcGxhdGU+IHRvICIgKwogICAgICAgICAgImRlbm90ZSBzY29wZWQgc2xvdHMuIiwKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICB9CiAgICAgIGVsLnNsb3RTY29wZSA9IHNsb3RTY29wZSB8fCBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2xvdC1zY29wZScpOwogICAgfSBlbHNlIGlmICgoc2xvdFNjb3BlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Nsb3Qtc2NvcGUnKSkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgZWwuYXR0cnNNYXBbJ3YtZm9yJ10pIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAiQW1iaWd1b3VzIGNvbWJpbmVkIHVzYWdlIG9mIHNsb3Qtc2NvcGUgYW5kIHYtZm9yIG9uIDwiICsgKGVsLnRhZykgKyAiPiAiICsKICAgICAgICAgICIodi1mb3IgdGFrZXMgaGlnaGVyIHByaW9yaXR5KS4gVXNlIGEgd3JhcHBlciA8dGVtcGxhdGU+IGZvciB0aGUgIiArCiAgICAgICAgICAic2NvcGVkIHNsb3QgdG8gbWFrZSBpdCBjbGVhcmVyLiIsCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgfQogICAgICBlbC5zbG90U2NvcGUgPSBzbG90U2NvcGU7CiAgICB9CiAgICB2YXIgc2xvdFRhcmdldCA9IGdldEJpbmRpbmdBdHRyKGVsLCAnc2xvdCcpOwogICAgaWYgKHNsb3RUYXJnZXQpIHsKICAgICAgZWwuc2xvdFRhcmdldCA9IHNsb3RUYXJnZXQgPT09ICciIicgPyAnImRlZmF1bHQiJyA6IHNsb3RUYXJnZXQ7CiAgICAgIC8vIHByZXNlcnZlIHNsb3QgYXMgYW4gYXR0cmlidXRlIGZvciBuYXRpdmUgc2hhZG93IERPTSBjb21wYXQKICAgICAgLy8gb25seSBmb3Igbm9uLXNjb3BlZCBzbG90cy4KICAgICAgaWYgKGVsLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICAgICAgYWRkQXR0cihlbCwgJ3Nsb3QnLCBzbG90VGFyZ2V0KTsKICAgICAgfQogICAgfQogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc0NvbXBvbmVudCAoZWwpIHsKICB2YXIgYmluZGluZzsKICBpZiAoKGJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2lzJykpKSB7CiAgICBlbC5jb21wb25lbnQgPSBiaW5kaW5nOwogIH0KICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ2lubGluZS10ZW1wbGF0ZScpICE9IG51bGwpIHsKICAgIGVsLmlubGluZVRlbXBsYXRlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NBdHRycyAoZWwpIHsKICB2YXIgbGlzdCA9IGVsLmF0dHJzTGlzdDsKICB2YXIgaSwgbCwgbmFtZSwgcmF3TmFtZSwgdmFsdWUsIG1vZGlmaWVycywgaXNQcm9wOwogIGZvciAoaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgbmFtZSA9IHJhd05hbWUgPSBsaXN0W2ldLm5hbWU7CiAgICB2YWx1ZSA9IGxpc3RbaV0udmFsdWU7CiAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAvLyBtYXJrIGVsZW1lbnQgYXMgZHluYW1pYwogICAgICBlbC5oYXNCaW5kaW5ncyA9IHRydWU7CiAgICAgIC8vIG1vZGlmaWVycwogICAgICBtb2RpZmllcnMgPSBwYXJzZU1vZGlmaWVycyhuYW1lKTsKICAgICAgaWYgKG1vZGlmaWVycykgewogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UobW9kaWZpZXJSRSwgJycpOwogICAgICB9CiAgICAgIGlmIChiaW5kUkUudGVzdChuYW1lKSkgeyAvLyB2LWJpbmQKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGJpbmRSRSwgJycpOwogICAgICAgIHZhbHVlID0gcGFyc2VGaWx0ZXJzKHZhbHVlKTsKICAgICAgICBpc1Byb3AgPSBmYWxzZTsKICAgICAgICBpZiAobW9kaWZpZXJzKSB7CiAgICAgICAgICBpZiAobW9kaWZpZXJzLnByb3ApIHsKICAgICAgICAgICAgaXNQcm9wID0gdHJ1ZTsKICAgICAgICAgICAgbmFtZSA9IGNhbWVsaXplKG5hbWUpOwogICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2lubmVySHRtbCcpIHsgbmFtZSA9ICdpbm5lckhUTUwnOyB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobW9kaWZpZXJzLmNhbWVsKSB7CiAgICAgICAgICAgIG5hbWUgPSBjYW1lbGl6ZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb2RpZmllcnMuc3luYykgewogICAgICAgICAgICBhZGRIYW5kbGVyKAogICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICgidXBkYXRlOiIgKyAoY2FtZWxpemUobmFtZSkpKSwKICAgICAgICAgICAgICBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgIiRldmVudCIpCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1Byb3AgfHwgKAogICAgICAgICAgIWVsLmNvbXBvbmVudCAmJiBwbGF0Zm9ybU11c3RVc2VQcm9wKGVsLnRhZywgZWwuYXR0cnNNYXAudHlwZSwgbmFtZSkKICAgICAgICApKSB7CiAgICAgICAgICBhZGRQcm9wKGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZEF0dHIoZWwsIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob25SRS50ZXN0KG5hbWUpKSB7IC8vIHYtb24KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9uUkUsICcnKTsKICAgICAgICBhZGRIYW5kbGVyKGVsLCBuYW1lLCB2YWx1ZSwgbW9kaWZpZXJzLCBmYWxzZSwgd2FybiQyKTsKICAgICAgfSBlbHNlIHsgLy8gbm9ybWFsIGRpcmVjdGl2ZXMKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGRpclJFLCAnJyk7CiAgICAgICAgLy8gcGFyc2UgYXJnCiAgICAgICAgdmFyIGFyZ01hdGNoID0gbmFtZS5tYXRjaChhcmdSRSk7CiAgICAgICAgdmFyIGFyZyA9IGFyZ01hdGNoICYmIGFyZ01hdGNoWzFdOwogICAgICAgIGlmIChhcmcpIHsKICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC0oYXJnLmxlbmd0aCArIDEpKTsKICAgICAgICB9CiAgICAgICAgYWRkRGlyZWN0aXZlKGVsLCBuYW1lLCByYXdOYW1lLCB2YWx1ZSwgYXJnLCBtb2RpZmllcnMpOwogICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSA9PT0gJ21vZGVsJykgewogICAgICAgICAgY2hlY2tGb3JBbGlhc01vZGVsKGVsLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBsaXRlcmFsIGF0dHJpYnV0ZQogICAgICB7CiAgICAgICAgdmFyIHJlcyA9IHBhcnNlVGV4dCh2YWx1ZSwgZGVsaW1pdGVycyk7CiAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgd2FybiQyKAogICAgICAgICAgICBuYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIjogIiArCiAgICAgICAgICAgICdJbnRlcnBvbGF0aW9uIGluc2lkZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIHJlbW92ZWQuICcgKwogICAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICsKICAgICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBpZD0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDppZD0idmFsIj4uJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkQXR0cihlbCwgbmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgICAgLy8gIzY4ODcgZmlyZWZveCBkb2Vzbid0IHVwZGF0ZSBtdXRlZCBzdGF0ZSBpZiBzZXQgdmlhIGF0dHJpYnV0ZQogICAgICAvLyBldmVuIGltbWVkaWF0ZWx5IGFmdGVyIGVsZW1lbnQgY3JlYXRpb24KICAgICAgaWYgKCFlbC5jb21wb25lbnQgJiYKICAgICAgICAgIG5hbWUgPT09ICdtdXRlZCcgJiYKICAgICAgICAgIHBsYXRmb3JtTXVzdFVzZVByb3AoZWwudGFnLCBlbC5hdHRyc01hcC50eXBlLCBuYW1lKSkgewogICAgICAgIGFkZFByb3AoZWwsIG5hbWUsICd0cnVlJyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrSW5Gb3IgKGVsKSB7CiAgdmFyIHBhcmVudCA9IGVsOwogIHdoaWxlIChwYXJlbnQpIHsKICAgIGlmIChwYXJlbnQuZm9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgfQogIHJldHVybiBmYWxzZQp9CgpmdW5jdGlvbiBwYXJzZU1vZGlmaWVycyAobmFtZSkgewogIHZhciBtYXRjaCA9IG5hbWUubWF0Y2gobW9kaWZpZXJSRSk7CiAgaWYgKG1hdGNoKSB7CiAgICB2YXIgcmV0ID0ge307CiAgICBtYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7IHJldFttLnNsaWNlKDEpXSA9IHRydWU7IH0pOwogICAgcmV0dXJuIHJldAogIH0KfQoKZnVuY3Rpb24gbWFrZUF0dHJzTWFwIChhdHRycykgewogIHZhciBtYXAgPSB7fTsKICBmb3IgKHZhciBpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKAogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbWFwW2F0dHJzW2ldLm5hbWVdICYmICFpc0lFICYmICFpc0VkZ2UKICAgICkgewogICAgICB3YXJuJDIoJ2R1cGxpY2F0ZSBhdHRyaWJ1dGU6ICcgKyBhdHRyc1tpXS5uYW1lKTsKICAgIH0KICAgIG1hcFthdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlOwogIH0KICByZXR1cm4gbWFwCn0KCi8vIGZvciBzY3JpcHQgKGUuZy4gdHlwZT0ieC90ZW1wbGF0ZSIpIG9yIHN0eWxlLCBkbyBub3QgZGVjb2RlIGNvbnRlbnQKZnVuY3Rpb24gaXNUZXh0VGFnIChlbCkgewogIHJldHVybiBlbC50YWcgPT09ICdzY3JpcHQnIHx8IGVsLnRhZyA9PT0gJ3N0eWxlJwp9CgpmdW5jdGlvbiBpc0ZvcmJpZGRlblRhZyAoZWwpIHsKICByZXR1cm4gKAogICAgZWwudGFnID09PSAnc3R5bGUnIHx8CiAgICAoZWwudGFnID09PSAnc2NyaXB0JyAmJiAoCiAgICAgICFlbC5hdHRyc01hcC50eXBlIHx8CiAgICAgIGVsLmF0dHJzTWFwLnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnCiAgICApKQogICkKfQoKdmFyIGllTlNCdWcgPSAvXnhtbG5zOk5TXGQrLzsKdmFyIGllTlNQcmVmaXggPSAvXk5TXGQrOi87CgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBndWFyZElFU1ZHQnVnIChhdHRycykgewogIHZhciByZXMgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldOwogICAgaWYgKCFpZU5TQnVnLnRlc3QoYXR0ci5uYW1lKSkgewogICAgICBhdHRyLm5hbWUgPSBhdHRyLm5hbWUucmVwbGFjZShpZU5TUHJlZml4LCAnJyk7CiAgICAgIHJlcy5wdXNoKGF0dHIpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrRm9yQWxpYXNNb2RlbCAoZWwsIHZhbHVlKSB7CiAgdmFyIF9lbCA9IGVsOwogIHdoaWxlIChfZWwpIHsKICAgIGlmIChfZWwuZm9yICYmIF9lbC5hbGlhcyA9PT0gdmFsdWUpIHsKICAgICAgd2FybiQyKAogICAgICAgICI8IiArIChlbC50YWcpICsgIiB2LW1vZGVsPVwiIiArIHZhbHVlICsgIlwiPjogIiArCiAgICAgICAgIllvdSBhcmUgYmluZGluZyB2LW1vZGVsIGRpcmVjdGx5IHRvIGEgdi1mb3IgaXRlcmF0aW9uIGFsaWFzLiAiICsKICAgICAgICAiVGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgdi1mb3Igc291cmNlIGFycmF5IGJlY2F1c2UgIiArCiAgICAgICAgIndyaXRpbmcgdG8gdGhlIGFsaWFzIGlzIGxpa2UgbW9kaWZ5aW5nIGEgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGUuICIgKwogICAgICAgICJDb25zaWRlciB1c2luZyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCB1c2Ugdi1tb2RlbCBvbiBhbiBvYmplY3QgcHJvcGVydHkgaW5zdGVhZC4iCiAgICAgICk7CiAgICB9CiAgICBfZWwgPSBfZWwucGFyZW50OwogIH0KfQoKLyogICovCgovKioKICogRXhwYW5kIGlucHV0W3YtbW9kZWxdIHdpdGggZHlhbm1pYyB0eXBlIGJpbmRpbmdzIGludG8gdi1pZi1lbHNlIGNoYWlucwogKiBUdXJuIHRoaXM6CiAqICAgPGlucHV0IHYtbW9kZWw9ImRhdGFbdHlwZV0iIDp0eXBlPSJ0eXBlIj4KICogaW50byB0aGlzOgogKiAgIDxpbnB1dCB2LWlmPSJ0eXBlID09PSAnY2hlY2tib3gnIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iZGF0YVt0eXBlXSI+CiAqICAgPGlucHV0IHYtZWxzZS1pZj0idHlwZSA9PT0gJ3JhZGlvJyIgdHlwZT0icmFkaW8iIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKiAgIDxpbnB1dCB2LWVsc2UgOnR5cGU9InR5cGUiIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKi8KCmZ1bmN0aW9uIHByZVRyYW5zZm9ybU5vZGUgKGVsLCBvcHRpb25zKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ2lucHV0JykgewogICAgdmFyIG1hcCA9IGVsLmF0dHJzTWFwOwogICAgaWYgKCFtYXBbJ3YtbW9kZWwnXSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgdHlwZUJpbmRpbmc7CiAgICBpZiAobWFwWyc6dHlwZSddIHx8IG1hcFsndi1iaW5kOnR5cGUnXSkgewogICAgICB0eXBlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndHlwZScpOwogICAgfQogICAgaWYgKCFtYXAudHlwZSAmJiAhdHlwZUJpbmRpbmcgJiYgbWFwWyd2LWJpbmQnXSkgewogICAgICB0eXBlQmluZGluZyA9ICIoIiArIChtYXBbJ3YtYmluZCddKSArICIpLnR5cGUiOwogICAgfQoKICAgIGlmICh0eXBlQmluZGluZykgewogICAgICB2YXIgaWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1pZicsIHRydWUpOwogICAgICB2YXIgaWZDb25kaXRpb25FeHRyYSA9IGlmQ29uZGl0aW9uID8gKCImJigiICsgaWZDb25kaXRpb24gKyAiKSIpIDogIiI7CiAgICAgIHZhciBoYXNFbHNlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScsIHRydWUpICE9IG51bGw7CiAgICAgIHZhciBlbHNlSWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1lbHNlLWlmJywgdHJ1ZSk7CiAgICAgIC8vIDEuIGNoZWNrYm94CiAgICAgIHZhciBicmFuY2gwID0gY2xvbmVBU1RFbGVtZW50KGVsKTsKICAgICAgLy8gcHJvY2VzcyBmb3Igb24gdGhlIG1haW4gbm9kZQogICAgICBwcm9jZXNzRm9yKGJyYW5jaDApOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDAsICd0eXBlJywgJ2NoZWNrYm94Jyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDAsIG9wdGlvbnMpOwogICAgICBicmFuY2gwLnByb2Nlc3NlZCA9IHRydWU7IC8vIHByZXZlbnQgaXQgZnJvbSBkb3VibGUtcHJvY2Vzc2VkCiAgICAgIGJyYW5jaDAuaWYgPSAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J2NoZWNrYm94JyIgKyBpZkNvbmRpdGlvbkV4dHJhOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiBicmFuY2gwLmlmLAogICAgICAgIGJsb2NrOiBicmFuY2gwCiAgICAgIH0pOwogICAgICAvLyAyLiBhZGQgcmFkaW8gZWxzZS1pZiBjb25kaXRpb24KICAgICAgdmFyIGJyYW5jaDEgPSBjbG9uZUFTVEVsZW1lbnQoZWwpOwogICAgICBnZXRBbmRSZW1vdmVBdHRyKGJyYW5jaDEsICd2LWZvcicsIHRydWUpOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDEsICd0eXBlJywgJ3JhZGlvJyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDEsIG9wdGlvbnMpOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J3JhZGlvJyIgKyBpZkNvbmRpdGlvbkV4dHJhLAogICAgICAgIGJsb2NrOiBicmFuY2gxCiAgICAgIH0pOwogICAgICAvLyAzLiBvdGhlcgogICAgICB2YXIgYnJhbmNoMiA9IGNsb25lQVNURWxlbWVudChlbCk7CiAgICAgIGdldEFuZFJlbW92ZUF0dHIoYnJhbmNoMiwgJ3YtZm9yJywgdHJ1ZSk7CiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMiwgJzp0eXBlJywgdHlwZUJpbmRpbmcpOwogICAgICBwcm9jZXNzRWxlbWVudChicmFuY2gyLCBvcHRpb25zKTsKICAgICAgYWRkSWZDb25kaXRpb24oYnJhbmNoMCwgewogICAgICAgIGV4cDogaWZDb25kaXRpb24sCiAgICAgICAgYmxvY2s6IGJyYW5jaDIKICAgICAgfSk7CgogICAgICBpZiAoaGFzRWxzZSkgewogICAgICAgIGJyYW5jaDAuZWxzZSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoZWxzZUlmQ29uZGl0aW9uKSB7CiAgICAgICAgYnJhbmNoMC5lbHNlaWYgPSBlbHNlSWZDb25kaXRpb247CiAgICAgIH0KCiAgICAgIHJldHVybiBicmFuY2gwCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFTVEVsZW1lbnQgKGVsKSB7CiAgcmV0dXJuIGNyZWF0ZUFTVEVsZW1lbnQoZWwudGFnLCBlbC5hdHRyc0xpc3Quc2xpY2UoKSwgZWwucGFyZW50KQp9Cgp2YXIgbW9kZWwkMiA9IHsKICBwcmVUcmFuc2Zvcm1Ob2RlOiBwcmVUcmFuc2Zvcm1Ob2RlCn0KCnZhciBtb2R1bGVzJDEgPSBbCiAga2xhc3MkMSwKICBzdHlsZSQxLAogIG1vZGVsJDIKXQoKLyogICovCgpmdW5jdGlvbiB0ZXh0IChlbCwgZGlyKSB7CiAgaWYgKGRpci52YWx1ZSkgewogICAgYWRkUHJvcChlbCwgJ3RleHRDb250ZW50JywgKCJfcygiICsgKGRpci52YWx1ZSkgKyAiKSIpKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaHRtbCAoZWwsIGRpcikgewogIGlmIChkaXIudmFsdWUpIHsKICAgIGFkZFByb3AoZWwsICdpbm5lckhUTUwnLCAoIl9zKCIgKyAoZGlyLnZhbHVlKSArICIpIikpOwogIH0KfQoKdmFyIGRpcmVjdGl2ZXMkMSA9IHsKICBtb2RlbDogbW9kZWwsCiAgdGV4dDogdGV4dCwKICBodG1sOiBodG1sCn0KCi8qICAqLwoKdmFyIGJhc2VPcHRpb25zID0gewogIGV4cGVjdEhUTUw6IHRydWUsCiAgbW9kdWxlczogbW9kdWxlcyQxLAogIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXMkMSwKICBpc1ByZVRhZzogaXNQcmVUYWcsCiAgaXNVbmFyeVRhZzogaXNVbmFyeVRhZywKICBtdXN0VXNlUHJvcDogbXVzdFVzZVByb3AsCiAgY2FuQmVMZWZ0T3BlblRhZzogY2FuQmVMZWZ0T3BlblRhZywKICBpc1Jlc2VydmVkVGFnOiBpc1Jlc2VydmVkVGFnLAogIGdldFRhZ05hbWVzcGFjZTogZ2V0VGFnTmFtZXNwYWNlLAogIHN0YXRpY0tleXM6IGdlblN0YXRpY0tleXMobW9kdWxlcyQxKQp9OwoKLyogICovCgp2YXIgaXNTdGF0aWNLZXk7CnZhciBpc1BsYXRmb3JtUmVzZXJ2ZWRUYWc7Cgp2YXIgZ2VuU3RhdGljS2V5c0NhY2hlZCA9IGNhY2hlZChnZW5TdGF0aWNLZXlzJDEpOwoKLyoqCiAqIEdvYWwgb2YgdGhlIG9wdGltaXplcjogd2FsayB0aGUgZ2VuZXJhdGVkIHRlbXBsYXRlIEFTVCB0cmVlCiAqIGFuZCBkZXRlY3Qgc3ViLXRyZWVzIHRoYXQgYXJlIHB1cmVseSBzdGF0aWMsIGkuZS4gcGFydHMgb2YKICogdGhlIERPTSB0aGF0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZS4KICoKICogT25jZSB3ZSBkZXRlY3QgdGhlc2Ugc3ViLXRyZWVzLCB3ZSBjYW46CiAqCiAqIDEuIEhvaXN0IHRoZW0gaW50byBjb25zdGFudHMsIHNvIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8KICogICAgY3JlYXRlIGZyZXNoIG5vZGVzIGZvciB0aGVtIG9uIGVhY2ggcmUtcmVuZGVyOwogKiAyLiBDb21wbGV0ZWx5IHNraXAgdGhlbSBpbiB0aGUgcGF0Y2hpbmcgcHJvY2Vzcy4KICovCmZ1bmN0aW9uIG9wdGltaXplIChyb290LCBvcHRpb25zKSB7CiAgaWYgKCFyb290KSB7IHJldHVybiB9CiAgaXNTdGF0aWNLZXkgPSBnZW5TdGF0aWNLZXlzQ2FjaGVkKG9wdGlvbnMuc3RhdGljS2V5cyB8fCAnJyk7CiAgaXNQbGF0Zm9ybVJlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIC8vIGZpcnN0IHBhc3M6IG1hcmsgYWxsIG5vbi1zdGF0aWMgbm9kZXMuCiAgbWFya1N0YXRpYyQxKHJvb3QpOwogIC8vIHNlY29uZCBwYXNzOiBtYXJrIHN0YXRpYyByb290cy4KICBtYXJrU3RhdGljUm9vdHMocm9vdCwgZmFsc2UpOwp9CgpmdW5jdGlvbiBnZW5TdGF0aWNLZXlzJDEgKGtleXMpIHsKICByZXR1cm4gbWFrZU1hcCgKICAgICd0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzJyArCiAgICAoa2V5cyA/ICcsJyArIGtleXMgOiAnJykKICApCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMkMSAobm9kZSkgewogIG5vZGUuc3RhdGljID0gaXNTdGF0aWMobm9kZSk7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgLy8gZG8gbm90IG1ha2UgY29tcG9uZW50IHNsb3QgY29udGVudCBzdGF0aWMuIHRoaXMgYXZvaWRzCiAgICAvLyAxLiBjb21wb25lbnRzIG5vdCBhYmxlIHRvIG11dGF0ZSBzbG90IG5vZGVzCiAgICAvLyAyLiBzdGF0aWMgc2xvdCBjb250ZW50IGZhaWxzIGZvciBob3QtcmVsb2FkaW5nCiAgICBpZiAoCiAgICAgICFpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcobm9kZS50YWcpICYmCiAgICAgIG5vZGUudGFnICE9PSAnc2xvdCcgJiYKICAgICAgbm9kZS5hdHRyc01hcFsnaW5saW5lLXRlbXBsYXRlJ10gPT0gbnVsbAogICAgKSB7CiAgICAgIHJldHVybgogICAgfQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldOwogICAgICBtYXJrU3RhdGljJDEoY2hpbGQpOwogICAgICBpZiAoIWNoaWxkLnN0YXRpYykgewogICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICB2YXIgYmxvY2sgPSBub2RlLmlmQ29uZGl0aW9uc1tpJDFdLmJsb2NrOwogICAgICAgIG1hcmtTdGF0aWMkMShibG9jayk7CiAgICAgICAgaWYgKCFibG9jay5zdGF0aWMpIHsKICAgICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljUm9vdHMgKG5vZGUsIGlzSW5Gb3IpIHsKICBpZiAobm9kZS50eXBlID09PSAxKSB7CiAgICBpZiAobm9kZS5zdGF0aWMgfHwgbm9kZS5vbmNlKSB7CiAgICAgIG5vZGUuc3RhdGljSW5Gb3IgPSBpc0luRm9yOwogICAgfQogICAgLy8gRm9yIGEgbm9kZSB0byBxdWFsaWZ5IGFzIGEgc3RhdGljIHJvb3QsIGl0IHNob3VsZCBoYXZlIGNoaWxkcmVuIHRoYXQKICAgIC8vIGFyZSBub3QganVzdCBzdGF0aWMgdGV4dC4gT3RoZXJ3aXNlIHRoZSBjb3N0IG9mIGhvaXN0aW5nIG91dCB3aWxsCiAgICAvLyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgYW5kIGl0J3MgYmV0dGVyIG9mZiB0byBqdXN0IGFsd2F5cyByZW5kZXIgaXQgZnJlc2guCiAgICBpZiAobm9kZS5zdGF0aWMgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgISgKICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYKICAgICAgbm9kZS5jaGlsZHJlblswXS50eXBlID09PSAzCiAgICApKSB7CiAgICAgIG5vZGUuc3RhdGljUm9vdCA9IHRydWU7CiAgICAgIHJldHVybgogICAgfSBlbHNlIHsKICAgICAgbm9kZS5zdGF0aWNSb290ID0gZmFsc2U7CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgbWFya1N0YXRpY1Jvb3RzKG5vZGUuY2hpbGRyZW5baV0sIGlzSW5Gb3IgfHwgISFub2RlLmZvcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICBtYXJrU3RhdGljUm9vdHMobm9kZS5pZkNvbmRpdGlvbnNbaSQxXS5ibG9jaywgaXNJbkZvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGlzU3RhdGljIChub2RlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMikgeyAvLyBleHByZXNzaW9uCiAgICByZXR1cm4gZmFsc2UKICB9CiAgaWYgKG5vZGUudHlwZSA9PT0gMykgeyAvLyB0ZXh0CiAgICByZXR1cm4gdHJ1ZQogIH0KICByZXR1cm4gISEobm9kZS5wcmUgfHwgKAogICAgIW5vZGUuaGFzQmluZGluZ3MgJiYgLy8gbm8gZHluYW1pYyBiaW5kaW5ncwogICAgIW5vZGUuaWYgJiYgIW5vZGUuZm9yICYmIC8vIG5vdCB2LWlmIG9yIHYtZm9yIG9yIHYtZWxzZQogICAgIWlzQnVpbHRJblRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgYnVpbHQtaW4KICAgIGlzUGxhdGZvcm1SZXNlcnZlZFRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgY29tcG9uZW50CiAgICAhaXNEaXJlY3RDaGlsZE9mVGVtcGxhdGVGb3Iobm9kZSkgJiYKICAgIE9iamVjdC5rZXlzKG5vZGUpLmV2ZXJ5KGlzU3RhdGljS2V5KQogICkpCn0KCmZ1bmN0aW9uIGlzRGlyZWN0Q2hpbGRPZlRlbXBsYXRlRm9yIChub2RlKSB7CiAgd2hpbGUgKG5vZGUucGFyZW50KSB7CiAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICBpZiAobm9kZS50YWcgIT09ICd0ZW1wbGF0ZScpIHsKICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgICBpZiAobm9kZS5mb3IpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlCn0KCi8qICAqLwoKdmFyIGZuRXhwUkUgPSAvXihbXHckX10rfFwoW14pXSo/XCkpXHMqPT58XmZ1bmN0aW9uXHMqXCgvOwp2YXIgc2ltcGxlUGF0aFJFID0gL15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLzsKCi8vIEtleWJvYXJkRXZlbnQua2V5Q29kZSBhbGlhc2VzCnZhciBrZXlDb2RlcyA9IHsKICBlc2M6IDI3LAogIHRhYjogOSwKICBlbnRlcjogMTMsCiAgc3BhY2U6IDMyLAogIHVwOiAzOCwKICBsZWZ0OiAzNywKICByaWdodDogMzksCiAgZG93bjogNDAsCiAgJ2RlbGV0ZSc6IFs4LCA0Nl0KfTsKCi8vIEtleWJvYXJkRXZlbnQua2V5IGFsaWFzZXMKdmFyIGtleU5hbWVzID0gewogIGVzYzogJ0VzY2FwZScsCiAgdGFiOiAnVGFiJywKICBlbnRlcjogJ0VudGVyJywKICBzcGFjZTogJyAnLAogIC8vICM3ODA2OiBJRTExIHVzZXMga2V5IG5hbWVzIHdpdGhvdXQgYEFycm93YCBwcmVmaXggZm9yIGFycm93IGtleXMuCiAgdXA6IFsnVXAnLCAnQXJyb3dVcCddLAogIGxlZnQ6IFsnTGVmdCcsICdBcnJvd0xlZnQnXSwKICByaWdodDogWydSaWdodCcsICdBcnJvd1JpZ2h0J10sCiAgZG93bjogWydEb3duJywgJ0Fycm93RG93biddLAogICdkZWxldGUnOiBbJ0JhY2tzcGFjZScsICdEZWxldGUnXQp9OwoKLy8gIzQ4Njg6IG1vZGlmaWVycyB0aGF0IHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbGlzdGVuZXIKLy8gbmVlZCB0byBleHBsaWNpdGx5IHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIHRvIHJlbW92ZQovLyB0aGUgbGlzdGVuZXIgZm9yIC5vbmNlCnZhciBnZW5HdWFyZCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHsgcmV0dXJuICgiaWYoIiArIGNvbmRpdGlvbiArICIpcmV0dXJuIG51bGw7Iik7IH07Cgp2YXIgbW9kaWZpZXJDb2RlID0gewogIHN0b3A6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JywKICBwcmV2ZW50OiAnJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JywKICBzZWxmOiBnZW5HdWFyZCgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSwKICBjdHJsOiBnZW5HdWFyZCgiISRldmVudC5jdHJsS2V5IiksCiAgc2hpZnQ6IGdlbkd1YXJkKCIhJGV2ZW50LnNoaWZ0S2V5IiksCiAgYWx0OiBnZW5HdWFyZCgiISRldmVudC5hbHRLZXkiKSwKICBtZXRhOiBnZW5HdWFyZCgiISRldmVudC5tZXRhS2V5IiksCiAgbGVmdDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAwIiksCiAgbWlkZGxlOiBnZW5HdWFyZCgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSwKICByaWdodDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyIikKfTsKCmZ1bmN0aW9uIGdlbkhhbmRsZXJzICgKICBldmVudHMsCiAgaXNOYXRpdmUsCiAgd2FybgopIHsKICB2YXIgcmVzID0gaXNOYXRpdmUgPyAnbmF0aXZlT246eycgOiAnb246eyc7CiAgZm9yICh2YXIgbmFtZSBpbiBldmVudHMpIHsKICAgIHJlcyArPSAiXCIiICsgbmFtZSArICJcIjoiICsgKGdlbkhhbmRsZXIobmFtZSwgZXZlbnRzW25hbWVdKSkgKyAiLCI7CiAgfQogIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ30nCn0KCmZ1bmN0aW9uIGdlbkhhbmRsZXIgKAogIG5hbWUsCiAgaGFuZGxlcgopIHsKICBpZiAoIWhhbmRsZXIpIHsKICAgIHJldHVybiAnZnVuY3Rpb24oKXt9JwogIH0KCiAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHsKICAgIHJldHVybiAoIlsiICsgKGhhbmRsZXIubWFwKGZ1bmN0aW9uIChoYW5kbGVyKSB7IHJldHVybiBnZW5IYW5kbGVyKG5hbWUsIGhhbmRsZXIpOyB9KS5qb2luKCcsJykpICsgIl0iKQogIH0KCiAgdmFyIGlzTWV0aG9kUGF0aCA9IHNpbXBsZVBhdGhSRS50ZXN0KGhhbmRsZXIudmFsdWUpOwogIHZhciBpc0Z1bmN0aW9uRXhwcmVzc2lvbiA9IGZuRXhwUkUudGVzdChoYW5kbGVyLnZhbHVlKTsKCiAgaWYgKCFoYW5kbGVyLm1vZGlmaWVycykgewogICAgaWYgKGlzTWV0aG9kUGF0aCB8fCBpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gaGFuZGxlci52YWx1ZQogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICByZXR1cm4gKCJmdW5jdGlvbigkZXZlbnQpeyIgKyAoaGFuZGxlci52YWx1ZSkgKyAifSIpIC8vIGlubGluZSBzdGF0ZW1lbnQKICB9IGVsc2UgewogICAgdmFyIGNvZGUgPSAnJzsKICAgIHZhciBnZW5Nb2RpZmllckNvZGUgPSAnJzsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gaGFuZGxlci5tb2RpZmllcnMpIHsKICAgICAgaWYgKG1vZGlmaWVyQ29kZVtrZXldKSB7CiAgICAgICAgZ2VuTW9kaWZpZXJDb2RlICs9IG1vZGlmaWVyQ29kZVtrZXldOwogICAgICAgIC8vIGxlZnQvcmlnaHQKICAgICAgICBpZiAoa2V5Q29kZXNba2V5XSkgewogICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4YWN0JykgewogICAgICAgIHZhciBtb2RpZmllcnMgPSAoaGFuZGxlci5tb2RpZmllcnMpOwogICAgICAgIGdlbk1vZGlmaWVyQ29kZSArPSBnZW5HdWFyZCgKICAgICAgICAgIFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnbWV0YSddCiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleU1vZGlmaWVyKSB7IHJldHVybiAhbW9kaWZpZXJzW2tleU1vZGlmaWVyXTsgfSkKICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5TW9kaWZpZXIpIHsgcmV0dXJuICgiJGV2ZW50LiIgKyBrZXlNb2RpZmllciArICJLZXkiKTsgfSkKICAgICAgICAgICAgLmpvaW4oJ3x8JykKICAgICAgICApOwogICAgICB9IGVsc2UgewogICAgICAgIGtleXMucHVzaChrZXkpOwogICAgICB9CiAgICB9CiAgICBpZiAoa2V5cy5sZW5ndGgpIHsKICAgICAgY29kZSArPSBnZW5LZXlGaWx0ZXIoa2V5cyk7CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgbW9kaWZpZXJzIGxpa2UgcHJldmVudCBhbmQgc3RvcCBnZXQgZXhlY3V0ZWQgYWZ0ZXIga2V5IGZpbHRlcmluZwogICAgaWYgKGdlbk1vZGlmaWVyQ29kZSkgewogICAgICBjb2RlICs9IGdlbk1vZGlmaWVyQ29kZTsKICAgIH0KICAgIHZhciBoYW5kbGVyQ29kZSA9IGlzTWV0aG9kUGF0aAogICAgICA/ICgicmV0dXJuICIgKyAoaGFuZGxlci52YWx1ZSkgKyAiKCRldmVudCkiKQogICAgICA6IGlzRnVuY3Rpb25FeHByZXNzaW9uCiAgICAgICAgPyAoInJldHVybiAoIiArIChoYW5kbGVyLnZhbHVlKSArICIpKCRldmVudCkiKQogICAgICAgIDogaGFuZGxlci52YWx1ZTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgcmV0dXJuICgiZnVuY3Rpb24oJGV2ZW50KXsiICsgY29kZSArIGhhbmRsZXJDb2RlICsgIn0iKQogIH0KfQoKZnVuY3Rpb24gZ2VuS2V5RmlsdGVyIChrZXlzKSB7CiAgcmV0dXJuICgiaWYoISgnYnV0dG9uJyBpbiAkZXZlbnQpJiYiICsgKGtleXMubWFwKGdlbkZpbHRlckNvZGUpLmpvaW4oJyYmJykpICsgIilyZXR1cm4gbnVsbDsiKQp9CgpmdW5jdGlvbiBnZW5GaWx0ZXJDb2RlIChrZXkpIHsKICB2YXIga2V5VmFsID0gcGFyc2VJbnQoa2V5LCAxMCk7CiAgaWYgKGtleVZhbCkgewogICAgcmV0dXJuICgiJGV2ZW50LmtleUNvZGUhPT0iICsga2V5VmFsKQogIH0KICB2YXIga2V5Q29kZSA9IGtleUNvZGVzW2tleV07CiAgdmFyIGtleU5hbWUgPSBrZXlOYW1lc1trZXldOwogIHJldHVybiAoCiAgICAiX2soJGV2ZW50LmtleUNvZGUsIiArCiAgICAoSlNPTi5zdHJpbmdpZnkoa2V5KSkgKyAiLCIgKwogICAgKEpTT04uc3RyaW5naWZ5KGtleUNvZGUpKSArICIsIiArCiAgICAiJGV2ZW50LmtleSwiICsKICAgICIiICsgKEpTT04uc3RyaW5naWZ5KGtleU5hbWUpKSArCiAgICAiKSIKICApCn0KCi8qICAqLwoKZnVuY3Rpb24gb24gKGVsLCBkaXIpIHsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRpci5tb2RpZmllcnMpIHsKICAgIHdhcm4oInYtb24gd2l0aG91dCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IG1vZGlmaWVycy4iKTsKICB9CiAgZWwud3JhcExpc3RlbmVycyA9IGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiAoIl9nKCIgKyBjb2RlICsgIiwiICsgKGRpci52YWx1ZSkgKyAiKSIpOyB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGJpbmQkMSAoZWwsIGRpcikgewogIGVsLndyYXBEYXRhID0gZnVuY3Rpb24gKGNvZGUpIHsKICAgIHJldHVybiAoIl9iKCIgKyBjb2RlICsgIiwnIiArIChlbC50YWcpICsgIicsIiArIChkaXIudmFsdWUpICsgIiwiICsgKGRpci5tb2RpZmllcnMgJiYgZGlyLm1vZGlmaWVycy5wcm9wID8gJ3RydWUnIDogJ2ZhbHNlJykgKyAoZGlyLm1vZGlmaWVycyAmJiBkaXIubW9kaWZpZXJzLnN5bmMgPyAnLHRydWUnIDogJycpICsgIikiKQogIH07Cn0KCi8qICAqLwoKdmFyIGJhc2VEaXJlY3RpdmVzID0gewogIG9uOiBvbiwKICBiaW5kOiBiaW5kJDEsCiAgY2xvYWs6IG5vb3AKfQoKLyogICovCgp2YXIgQ29kZWdlblN0YXRlID0gZnVuY3Rpb24gQ29kZWdlblN0YXRlIChvcHRpb25zKSB7CiAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICB0aGlzLndhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CiAgdGhpcy50cmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICd0cmFuc2Zvcm1Db2RlJyk7CiAgdGhpcy5kYXRhR2VuRm5zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdnZW5EYXRhJyk7CiAgdGhpcy5kaXJlY3RpdmVzID0gZXh0ZW5kKGV4dGVuZCh7fSwgYmFzZURpcmVjdGl2ZXMpLCBvcHRpb25zLmRpcmVjdGl2ZXMpOwogIHZhciBpc1Jlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIHRoaXMubWF5YmVDb21wb25lbnQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICFpc1Jlc2VydmVkVGFnKGVsLnRhZyk7IH07CiAgdGhpcy5vbmNlSWQgPSAwOwogIHRoaXMuc3RhdGljUmVuZGVyRm5zID0gW107Cn07CgoKCmZ1bmN0aW9uIGdlbmVyYXRlICgKICBhc3QsCiAgb3B0aW9ucwopIHsKICB2YXIgc3RhdGUgPSBuZXcgQ29kZWdlblN0YXRlKG9wdGlvbnMpOwogIHZhciBjb2RlID0gYXN0ID8gZ2VuRWxlbWVudChhc3QsIHN0YXRlKSA6ICdfYygiZGl2IiknOwogIHJldHVybiB7CiAgICByZW5kZXI6ICgid2l0aCh0aGlzKXtyZXR1cm4gIiArIGNvZGUgKyAifSIpLAogICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMKICB9Cn0KCmZ1bmN0aW9uIGdlbkVsZW1lbnQgKGVsLCBzdGF0ZSkgewogIGlmIChlbC5zdGF0aWNSb290ICYmICFlbC5zdGF0aWNQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5TdGF0aWMoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwub25jZSAmJiAhZWwub25jZVByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbk9uY2UoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuZm9yICYmICFlbC5mb3JQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5Gb3IoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuaWYgJiYgIWVsLmlmUHJvY2Vzc2VkKSB7CiAgICByZXR1cm4gZ2VuSWYoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwudGFnID09PSAndGVtcGxhdGUnICYmICFlbC5zbG90VGFyZ2V0KSB7CiAgICByZXR1cm4gZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlKSB8fCAndm9pZCAwJwogIH0gZWxzZSBpZiAoZWwudGFnID09PSAnc2xvdCcpIHsKICAgIHJldHVybiBnZW5TbG90KGVsLCBzdGF0ZSkKICB9IGVsc2UgewogICAgLy8gY29tcG9uZW50IG9yIGVsZW1lbnQKICAgIHZhciBjb2RlOwogICAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgICBjb2RlID0gZ2VuQ29tcG9uZW50KGVsLmNvbXBvbmVudCwgZWwsIHN0YXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBkYXRhID0gZWwucGxhaW4gPyB1bmRlZmluZWQgOiBnZW5EYXRhJDIoZWwsIHN0YXRlKTsKCiAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmlubGluZVRlbXBsYXRlID8gbnVsbCA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSwgdHJ1ZSk7CiAgICAgIGNvZGUgPSAiX2MoJyIgKyAoZWwudGFnKSArICInIiArIChkYXRhID8gKCIsIiArIGRhdGEpIDogJycpICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKSArICIpIjsKICAgIH0KICAgIC8vIG1vZHVsZSB0cmFuc2Zvcm1zCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLnRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29kZSA9IHN0YXRlLnRyYW5zZm9ybXNbaV0oZWwsIGNvZGUpOwogICAgfQogICAgcmV0dXJuIGNvZGUKICB9Cn0KCi8vIGhvaXN0IHN0YXRpYyBzdWItdHJlZXMgb3V0CmZ1bmN0aW9uIGdlblN0YXRpYyAoZWwsIHN0YXRlKSB7CiAgZWwuc3RhdGljUHJvY2Vzc2VkID0gdHJ1ZTsKICBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMucHVzaCgoIndpdGgodGhpcyl7cmV0dXJuICIgKyAoZ2VuRWxlbWVudChlbCwgc3RhdGUpKSArICJ9IikpOwogIHJldHVybiAoIl9tKCIgKyAoc3RhdGUuc3RhdGljUmVuZGVyRm5zLmxlbmd0aCAtIDEpICsgKGVsLnN0YXRpY0luRm9yID8gJyx0cnVlJyA6ICcnKSArICIpIikKfQoKLy8gdi1vbmNlCmZ1bmN0aW9uIGdlbk9uY2UgKGVsLCBzdGF0ZSkgewogIGVsLm9uY2VQcm9jZXNzZWQgPSB0cnVlOwogIGlmIChlbC5pZiAmJiAhZWwuaWZQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5JZihlbCwgc3RhdGUpCiAgfSBlbHNlIGlmIChlbC5zdGF0aWNJbkZvcikgewogICAgdmFyIGtleSA9ICcnOwogICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgaWYgKHBhcmVudC5mb3IpIHsKICAgICAgICBrZXkgPSBwYXJlbnQua2V5OwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGlmICgha2V5KSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzdGF0ZS53YXJuKAogICAgICAgICJ2LW9uY2UgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgdi1mb3IgdGhhdCBpcyBrZXllZC4gIgogICAgICApOwogICAgICByZXR1cm4gZ2VuRWxlbWVudChlbCwgc3RhdGUpCiAgICB9CiAgICByZXR1cm4gKCJfbygiICsgKGdlbkVsZW1lbnQoZWwsIHN0YXRlKSkgKyAiLCIgKyAoc3RhdGUub25jZUlkKyspICsgIiwiICsga2V5ICsgIikiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuU3RhdGljKGVsLCBzdGF0ZSkKICB9Cn0KCmZ1bmN0aW9uIGdlbklmICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0RW1wdHkKKSB7CiAgZWwuaWZQcm9jZXNzZWQgPSB0cnVlOyAvLyBhdm9pZCByZWN1cnNpb24KICByZXR1cm4gZ2VuSWZDb25kaXRpb25zKGVsLmlmQ29uZGl0aW9ucy5zbGljZSgpLCBzdGF0ZSwgYWx0R2VuLCBhbHRFbXB0eSkKfQoKZnVuY3Rpb24gZ2VuSWZDb25kaXRpb25zICgKICBjb25kaXRpb25zLAogIHN0YXRlLAogIGFsdEdlbiwKICBhbHRFbXB0eQopIHsKICBpZiAoIWNvbmRpdGlvbnMubGVuZ3RoKSB7CiAgICByZXR1cm4gYWx0RW1wdHkgfHwgJ19lKCknCiAgfQoKICB2YXIgY29uZGl0aW9uID0gY29uZGl0aW9ucy5zaGlmdCgpOwogIGlmIChjb25kaXRpb24uZXhwKSB7CiAgICByZXR1cm4gKCIoIiArIChjb25kaXRpb24uZXhwKSArICIpPyIgKyAoZ2VuVGVybmFyeUV4cChjb25kaXRpb24uYmxvY2spKSArICI6IiArIChnZW5JZkNvbmRpdGlvbnMoY29uZGl0aW9ucywgc3RhdGUsIGFsdEdlbiwgYWx0RW1wdHkpKSkKICB9IGVsc2UgewogICAgcmV0dXJuICgiIiArIChnZW5UZXJuYXJ5RXhwKGNvbmRpdGlvbi5ibG9jaykpKQogIH0KCiAgLy8gdi1pZiB3aXRoIHYtb25jZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBsaWtlIChhKT9fbSgwKTpfbSgxKQogIGZ1bmN0aW9uIGdlblRlcm5hcnlFeHAgKGVsKSB7CiAgICByZXR1cm4gYWx0R2VuCiAgICAgID8gYWx0R2VuKGVsLCBzdGF0ZSkKICAgICAgOiBlbC5vbmNlCiAgICAgICAgPyBnZW5PbmNlKGVsLCBzdGF0ZSkKICAgICAgICA6IGdlbkVsZW1lbnQoZWwsIHN0YXRlKQogIH0KfQoKZnVuY3Rpb24gZ2VuRm9yICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0SGVscGVyCikgewogIHZhciBleHAgPSBlbC5mb3I7CiAgdmFyIGFsaWFzID0gZWwuYWxpYXM7CiAgdmFyIGl0ZXJhdG9yMSA9IGVsLml0ZXJhdG9yMSA/ICgiLCIgKyAoZWwuaXRlcmF0b3IxKSkgOiAnJzsKICB2YXIgaXRlcmF0b3IyID0gZWwuaXRlcmF0b3IyID8gKCIsIiArIChlbC5pdGVyYXRvcjIpKSA6ICcnOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICBzdGF0ZS5tYXliZUNvbXBvbmVudChlbCkgJiYKICAgIGVsLnRhZyAhPT0gJ3Nsb3QnICYmCiAgICBlbC50YWcgIT09ICd0ZW1wbGF0ZScgJiYKICAgICFlbC5rZXkKICApIHsKICAgIHN0YXRlLndhcm4oCiAgICAgICI8IiArIChlbC50YWcpICsgIiB2LWZvcj1cIiIgKyBhbGlhcyArICIgaW4gIiArIGV4cCArICJcIj46IGNvbXBvbmVudCBsaXN0cyByZW5kZXJlZCB3aXRoICIgKwogICAgICAidi1mb3Igc2hvdWxkIGhhdmUgZXhwbGljaXQga2V5cy4gIiArCiAgICAgICJTZWUgaHR0cHM6Ly92dWVqcy5vcmcvZ3VpZGUvbGlzdC5odG1sI2tleSBmb3IgbW9yZSBpbmZvLiIsCiAgICAgIHRydWUgLyogdGlwICovCiAgICApOwogIH0KCiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuIChhbHRIZWxwZXIgfHwgJ19sJykgKyAiKCgiICsgZXhwICsgIiksIiArCiAgICAiZnVuY3Rpb24oIiArIGFsaWFzICsgaXRlcmF0b3IxICsgaXRlcmF0b3IyICsgIil7IiArCiAgICAgICJyZXR1cm4gIiArICgoYWx0R2VuIHx8IGdlbkVsZW1lbnQpKGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuRGF0YSQyIChlbCwgc3RhdGUpIHsKICB2YXIgZGF0YSA9ICd7JzsKCiAgLy8gZGlyZWN0aXZlcyBmaXJzdC4KICAvLyBkaXJlY3RpdmVzIG1heSBtdXRhdGUgdGhlIGVsJ3Mgb3RoZXIgcHJvcGVydGllcyBiZWZvcmUgdGhleSBhcmUgZ2VuZXJhdGVkLgogIHZhciBkaXJzID0gZ2VuRGlyZWN0aXZlcyhlbCwgc3RhdGUpOwogIGlmIChkaXJzKSB7IGRhdGEgKz0gZGlycyArICcsJzsgfQoKICAvLyBrZXkKICBpZiAoZWwua2V5KSB7CiAgICBkYXRhICs9ICJrZXk6IiArIChlbC5rZXkpICsgIiwiOwogIH0KICAvLyByZWYKICBpZiAoZWwucmVmKSB7CiAgICBkYXRhICs9ICJyZWY6IiArIChlbC5yZWYpICsgIiwiOwogIH0KICBpZiAoZWwucmVmSW5Gb3IpIHsKICAgIGRhdGEgKz0gInJlZkluRm9yOnRydWUsIjsKICB9CiAgLy8gcHJlCiAgaWYgKGVsLnByZSkgewogICAgZGF0YSArPSAicHJlOnRydWUsIjsKICB9CiAgLy8gcmVjb3JkIG9yaWdpbmFsIHRhZyBuYW1lIGZvciBjb21wb25lbnRzIHVzaW5nICJpcyIgYXR0cmlidXRlCiAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgZGF0YSArPSAidGFnOlwiIiArIChlbC50YWcpICsgIlwiLCI7CiAgfQogIC8vIG1vZHVsZSBkYXRhIGdlbmVyYXRpb24gZnVuY3Rpb25zCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5kYXRhR2VuRm5zLmxlbmd0aDsgaSsrKSB7CiAgICBkYXRhICs9IHN0YXRlLmRhdGFHZW5GbnNbaV0oZWwpOwogIH0KICAvLyBhdHRyaWJ1dGVzCiAgaWYgKGVsLmF0dHJzKSB7CiAgICBkYXRhICs9ICJhdHRyczp7IiArIChnZW5Qcm9wcyhlbC5hdHRycykpICsgIn0sIjsKICB9CiAgLy8gRE9NIHByb3BzCiAgaWYgKGVsLnByb3BzKSB7CiAgICBkYXRhICs9ICJkb21Qcm9wczp7IiArIChnZW5Qcm9wcyhlbC5wcm9wcykpICsgIn0sIjsKICB9CiAgLy8gZXZlbnQgaGFuZGxlcnMKICBpZiAoZWwuZXZlbnRzKSB7CiAgICBkYXRhICs9IChnZW5IYW5kbGVycyhlbC5ldmVudHMsIGZhbHNlLCBzdGF0ZS53YXJuKSkgKyAiLCI7CiAgfQogIGlmIChlbC5uYXRpdmVFdmVudHMpIHsKICAgIGRhdGEgKz0gKGdlbkhhbmRsZXJzKGVsLm5hdGl2ZUV2ZW50cywgdHJ1ZSwgc3RhdGUud2FybikpICsgIiwiOwogIH0KICAvLyBzbG90IHRhcmdldAogIC8vIG9ubHkgZm9yIG5vbi1zY29wZWQgc2xvdHMKICBpZiAoZWwuc2xvdFRhcmdldCAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICBkYXRhICs9ICJzbG90OiIgKyAoZWwuc2xvdFRhcmdldCkgKyAiLCI7CiAgfQogIC8vIHNjb3BlZCBzbG90cwogIGlmIChlbC5zY29wZWRTbG90cykgewogICAgZGF0YSArPSAoZ2VuU2NvcGVkU2xvdHMoZWwuc2NvcGVkU2xvdHMsIHN0YXRlKSkgKyAiLCI7CiAgfQogIC8vIGNvbXBvbmVudCB2LW1vZGVsCiAgaWYgKGVsLm1vZGVsKSB7CiAgICBkYXRhICs9ICJtb2RlbDp7dmFsdWU6IiArIChlbC5tb2RlbC52YWx1ZSkgKyAiLGNhbGxiYWNrOiIgKyAoZWwubW9kZWwuY2FsbGJhY2spICsgIixleHByZXNzaW9uOiIgKyAoZWwubW9kZWwuZXhwcmVzc2lvbikgKyAifSwiOwogIH0KICAvLyBpbmxpbmUtdGVtcGxhdGUKICBpZiAoZWwuaW5saW5lVGVtcGxhdGUpIHsKICAgIHZhciBpbmxpbmVUZW1wbGF0ZSA9IGdlbklubGluZVRlbXBsYXRlKGVsLCBzdGF0ZSk7CiAgICBpZiAoaW5saW5lVGVtcGxhdGUpIHsKICAgICAgZGF0YSArPSBpbmxpbmVUZW1wbGF0ZSArICIsIjsKICAgIH0KICB9CiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLCQvLCAnJykgKyAnfSc7CiAgLy8gdi1iaW5kIGRhdGEgd3JhcAogIGlmIChlbC53cmFwRGF0YSkgewogICAgZGF0YSA9IGVsLndyYXBEYXRhKGRhdGEpOwogIH0KICAvLyB2LW9uIGRhdGEgd3JhcAogIGlmIChlbC53cmFwTGlzdGVuZXJzKSB7CiAgICBkYXRhID0gZWwud3JhcExpc3RlbmVycyhkYXRhKTsKICB9CiAgcmV0dXJuIGRhdGEKfQoKZnVuY3Rpb24gZ2VuRGlyZWN0aXZlcyAoZWwsIHN0YXRlKSB7CiAgdmFyIGRpcnMgPSBlbC5kaXJlY3RpdmVzOwogIGlmICghZGlycykgeyByZXR1cm4gfQogIHZhciByZXMgPSAnZGlyZWN0aXZlczpbJzsKICB2YXIgaGFzUnVudGltZSA9IGZhbHNlOwogIHZhciBpLCBsLCBkaXIsIG5lZWRSdW50aW1lOwogIGZvciAoaSA9IDAsIGwgPSBkaXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIG5lZWRSdW50aW1lID0gdHJ1ZTsKICAgIHZhciBnZW4gPSBzdGF0ZS5kaXJlY3RpdmVzW2Rpci5uYW1lXTsKICAgIGlmIChnZW4pIHsKICAgICAgLy8gY29tcGlsZS10aW1lIGRpcmVjdGl2ZSB0aGF0IG1hbmlwdWxhdGVzIEFTVC4KICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IGFsc28gbmVlZHMgYSBydW50aW1lIGNvdW50ZXJwYXJ0LgogICAgICBuZWVkUnVudGltZSA9ICEhZ2VuKGVsLCBkaXIsIHN0YXRlLndhcm4pOwogICAgfQogICAgaWYgKG5lZWRSdW50aW1lKSB7CiAgICAgIGhhc1J1bnRpbWUgPSB0cnVlOwogICAgICByZXMgKz0gIntuYW1lOlwiIiArIChkaXIubmFtZSkgKyAiXCIscmF3TmFtZTpcIiIgKyAoZGlyLnJhd05hbWUpICsgIlwiIiArIChkaXIudmFsdWUgPyAoIix2YWx1ZTooIiArIChkaXIudmFsdWUpICsgIiksZXhwcmVzc2lvbjoiICsgKEpTT04uc3RyaW5naWZ5KGRpci52YWx1ZSkpKSA6ICcnKSArIChkaXIuYXJnID8gKCIsYXJnOlwiIiArIChkaXIuYXJnKSArICJcIiIpIDogJycpICsgKGRpci5tb2RpZmllcnMgPyAoIixtb2RpZmllcnM6IiArIChKU09OLnN0cmluZ2lmeShkaXIubW9kaWZpZXJzKSkpIDogJycpICsgIn0sIjsKICAgIH0KICB9CiAgaWYgKGhhc1J1bnRpbWUpIHsKICAgIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ10nCiAgfQp9CgpmdW5jdGlvbiBnZW5JbmxpbmVUZW1wbGF0ZSAoZWwsIHN0YXRlKSB7CiAgdmFyIGFzdCA9IGVsLmNoaWxkcmVuWzBdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgKAogICAgZWwuY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGFzdC50eXBlICE9PSAxCiAgKSkgewogICAgc3RhdGUud2FybignSW5saW5lLXRlbXBsYXRlIGNvbXBvbmVudHMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGVsZW1lbnQuJyk7CiAgfQogIGlmIChhc3QudHlwZSA9PT0gMSkgewogICAgdmFyIGlubGluZVJlbmRlckZucyA9IGdlbmVyYXRlKGFzdCwgc3RhdGUub3B0aW9ucyk7CiAgICByZXR1cm4gKCJpbmxpbmVUZW1wbGF0ZTp7cmVuZGVyOmZ1bmN0aW9uKCl7IiArIChpbmxpbmVSZW5kZXJGbnMucmVuZGVyKSArICJ9LHN0YXRpY1JlbmRlckZuczpbIiArIChpbmxpbmVSZW5kZXJGbnMuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gKCJmdW5jdGlvbigpeyIgKyBjb2RlICsgIn0iKTsgfSkuam9pbignLCcpKSArICJdfSIpCiAgfQp9CgpmdW5jdGlvbiBnZW5TY29wZWRTbG90cyAoCiAgc2xvdHMsCiAgc3RhdGUKKSB7CiAgcmV0dXJuICgic2NvcGVkU2xvdHM6X3UoWyIgKyAoT2JqZWN0LmtleXMoc2xvdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7CiAgICAgIHJldHVybiBnZW5TY29wZWRTbG90KGtleSwgc2xvdHNba2V5XSwgc3RhdGUpCiAgICB9KS5qb2luKCcsJykpICsgIl0pIikKfQoKZnVuY3Rpb24gZ2VuU2NvcGVkU2xvdCAoCiAga2V5LAogIGVsLAogIHN0YXRlCikgewogIGlmIChlbC5mb3IgJiYgIWVsLmZvclByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbkZvclNjb3BlZFNsb3Qoa2V5LCBlbCwgc3RhdGUpCiAgfQogIHZhciBmbiA9ICJmdW5jdGlvbigiICsgKFN0cmluZyhlbC5zbG90U2NvcGUpKSArICIpeyIgKwogICAgInJldHVybiAiICsgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJwogICAgICA/IGVsLmlmCiAgICAgICAgPyAoKGVsLmlmKSArICI/IiArIChnZW5DaGlsZHJlbihlbCwgc3RhdGUpIHx8ICd1bmRlZmluZWQnKSArICI6dW5kZWZpbmVkIikKICAgICAgICA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSkgfHwgJ3VuZGVmaW5lZCcKICAgICAgOiBnZW5FbGVtZW50KGVsLCBzdGF0ZSkpICsgIn0iOwogIHJldHVybiAoIntrZXk6IiArIGtleSArICIsZm46IiArIGZuICsgIn0iKQp9CgpmdW5jdGlvbiBnZW5Gb3JTY29wZWRTbG90ICgKICBrZXksCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGV4cCA9IGVsLmZvcjsKICB2YXIgYWxpYXMgPSBlbC5hbGlhczsKICB2YXIgaXRlcmF0b3IxID0gZWwuaXRlcmF0b3IxID8gKCIsIiArIChlbC5pdGVyYXRvcjEpKSA6ICcnOwogIHZhciBpdGVyYXRvcjIgPSBlbC5pdGVyYXRvcjIgPyAoIiwiICsgKGVsLml0ZXJhdG9yMikpIDogJyc7CiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuICJfbCgoIiArIGV4cCArICIpLCIgKwogICAgImZ1bmN0aW9uKCIgKyBhbGlhcyArIGl0ZXJhdG9yMSArIGl0ZXJhdG9yMiArICIpeyIgKwogICAgICAicmV0dXJuICIgKyAoZ2VuU2NvcGVkU2xvdChrZXksIGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuQ2hpbGRyZW4gKAogIGVsLAogIHN0YXRlLAogIGNoZWNrU2tpcCwKICBhbHRHZW5FbGVtZW50LAogIGFsdEdlbk5vZGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47CiAgaWYgKGNoaWxkcmVuLmxlbmd0aCkgewogICAgdmFyIGVsJDEgPSBjaGlsZHJlblswXTsKICAgIC8vIG9wdGltaXplIHNpbmdsZSB2LWZvcgogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJgogICAgICBlbCQxLmZvciAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3Nsb3QnCiAgICApIHsKICAgICAgcmV0dXJuIChhbHRHZW5FbGVtZW50IHx8IGdlbkVsZW1lbnQpKGVsJDEsIHN0YXRlKQogICAgfQogICAgdmFyIG5vcm1hbGl6YXRpb25UeXBlID0gY2hlY2tTa2lwCiAgICAgID8gZ2V0Tm9ybWFsaXphdGlvblR5cGUoY2hpbGRyZW4sIHN0YXRlLm1heWJlQ29tcG9uZW50KQogICAgICA6IDA7CiAgICB2YXIgZ2VuID0gYWx0R2VuTm9kZSB8fCBnZW5Ob2RlOwogICAgcmV0dXJuICgiWyIgKyAoY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBnZW4oYywgc3RhdGUpOyB9KS5qb2luKCcsJykpICsgIl0iICsgKG5vcm1hbGl6YXRpb25UeXBlID8gKCIsIiArIG5vcm1hbGl6YXRpb25UeXBlKSA6ICcnKSkKICB9Cn0KCi8vIGRldGVybWluZSB0aGUgbm9ybWFsaXphdGlvbiBuZWVkZWQgZm9yIHRoZSBjaGlsZHJlbiBhcnJheS4KLy8gMDogbm8gbm9ybWFsaXphdGlvbiBuZWVkZWQKLy8gMTogc2ltcGxlIG5vcm1hbGl6YXRpb24gbmVlZGVkIChwb3NzaWJsZSAxLWxldmVsIGRlZXAgbmVzdGVkIGFycmF5KQovLyAyOiBmdWxsIG5vcm1hbGl6YXRpb24gbmVlZGVkCmZ1bmN0aW9uIGdldE5vcm1hbGl6YXRpb25UeXBlICgKICBjaGlsZHJlbiwKICBtYXliZUNvbXBvbmVudAopIHsKICB2YXIgcmVzID0gMDsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZWwgPSBjaGlsZHJlbltpXTsKICAgIGlmIChlbC50eXBlICE9PSAxKSB7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAobmVlZHNOb3JtYWxpemF0aW9uKGVsKSB8fAogICAgICAgIChlbC5pZkNvbmRpdGlvbnMgJiYgZWwuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIG5lZWRzTm9ybWFsaXphdGlvbihjLmJsb2NrKTsgfSkpKSB7CiAgICAgIHJlcyA9IDI7CiAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAobWF5YmVDb21wb25lbnQoZWwpIHx8CiAgICAgICAgKGVsLmlmQ29uZGl0aW9ucyAmJiBlbC5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gbWF5YmVDb21wb25lbnQoYy5ibG9jayk7IH0pKSkgewogICAgICByZXMgPSAxOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIG5lZWRzTm9ybWFsaXphdGlvbiAoZWwpIHsKICByZXR1cm4gZWwuZm9yICE9PSB1bmRlZmluZWQgfHwgZWwudGFnID09PSAndGVtcGxhdGUnIHx8IGVsLnRhZyA9PT0gJ3Nsb3QnCn0KCmZ1bmN0aW9uIGdlbk5vZGUgKG5vZGUsIHN0YXRlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgcmV0dXJuIGdlbkVsZW1lbnQobm9kZSwgc3RhdGUpCiAgfSBpZiAobm9kZS50eXBlID09PSAzICYmIG5vZGUuaXNDb21tZW50KSB7CiAgICByZXR1cm4gZ2VuQ29tbWVudChub2RlKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuVGV4dChub2RlKQogIH0KfQoKZnVuY3Rpb24gZ2VuVGV4dCAodGV4dCkgewogIHJldHVybiAoIl92KCIgKyAodGV4dC50eXBlID09PSAyCiAgICA/IHRleHQuZXhwcmVzc2lvbiAvLyBubyBuZWVkIGZvciAoKSBiZWNhdXNlIGFscmVhZHkgd3JhcHBlZCBpbiBfcygpCiAgICA6IHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyhKU09OLnN0cmluZ2lmeSh0ZXh0LnRleHQpKSkgKyAiKSIpCn0KCmZ1bmN0aW9uIGdlbkNvbW1lbnQgKGNvbW1lbnQpIHsKICByZXR1cm4gKCJfZSgiICsgKEpTT04uc3RyaW5naWZ5KGNvbW1lbnQudGV4dCkpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5TbG90IChlbCwgc3RhdGUpIHsKICB2YXIgc2xvdE5hbWUgPSBlbC5zbG90TmFtZSB8fCAnImRlZmF1bHQiJzsKICB2YXIgY2hpbGRyZW4gPSBnZW5DaGlsZHJlbihlbCwgc3RhdGUpOwogIHZhciByZXMgPSAiX3QoIiArIHNsb3ROYW1lICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKTsKICB2YXIgYXR0cnMgPSBlbC5hdHRycyAmJiAoInsiICsgKGVsLmF0dHJzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChjYW1lbGl6ZShhLm5hbWUpKSArICI6IiArIChhLnZhbHVlKSk7IH0pLmpvaW4oJywnKSkgKyAifSIpOwogIHZhciBiaW5kJCQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZCddOwogIGlmICgoYXR0cnMgfHwgYmluZCQkMSkgJiYgIWNoaWxkcmVuKSB7CiAgICByZXMgKz0gIixudWxsIjsKICB9CiAgaWYgKGF0dHJzKSB7CiAgICByZXMgKz0gIiwiICsgYXR0cnM7CiAgfQogIGlmIChiaW5kJCQxKSB7CiAgICByZXMgKz0gKGF0dHJzID8gJycgOiAnLG51bGwnKSArICIsIiArIGJpbmQkJDE7CiAgfQogIHJldHVybiByZXMgKyAnKScKfQoKLy8gY29tcG9uZW50TmFtZSBpcyBlbC5jb21wb25lbnQsIHRha2UgaXQgYXMgYXJndW1lbnQgdG8gc2h1biBmbG93J3MgcGVzc2ltaXN0aWMgcmVmaW5lbWVudApmdW5jdGlvbiBnZW5Db21wb25lbnQgKAogIGNvbXBvbmVudE5hbWUsCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuaW5saW5lVGVtcGxhdGUgPyBudWxsIDogZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlLCB0cnVlKTsKICByZXR1cm4gKCJfYygiICsgY29tcG9uZW50TmFtZSArICIsIiArIChnZW5EYXRhJDIoZWwsIHN0YXRlKSkgKyAoY2hpbGRyZW4gPyAoIiwiICsgY2hpbGRyZW4pIDogJycpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5Qcm9wcyAocHJvcHMpIHsKICB2YXIgcmVzID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgdmFyIHByb3AgPSBwcm9wc1tpXTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICByZXMgKz0gIlwiIiArIChwcm9wLm5hbWUpICsgIlwiOiIgKyAodHJhbnNmb3JtU3BlY2lhbE5ld2xpbmVzKHByb3AudmFsdWUpKSArICIsIjsKICAgIH0KICB9CiAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkKfQoKLy8gIzM4OTUsICM0MjY4CmZ1bmN0aW9uIHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyAodGV4dCkgewogIHJldHVybiB0ZXh0CiAgICAucmVwbGFjZSgvXHUyMDI4L2csICdcXHUyMDI4JykKICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKQp9CgovKiAgKi8KCi8vIHRoZXNlIGtleXdvcmRzIHNob3VsZCBub3QgYXBwZWFyIGluc2lkZSBleHByZXNzaW9ucywgYnV0IG9wZXJhdG9ycyBsaWtlCi8vIHR5cGVvZiwgaW5zdGFuY2VvZiBhbmQgaW4gYXJlIGFsbG93ZWQKdmFyIHByb2hpYml0ZWRLZXl3b3JkUkUgPSBuZXcgUmVnRXhwKCdcXGInICsgKAogICdkbyxpZixmb3IsbGV0LG5ldyx0cnksdmFyLGNhc2UsZWxzZSx3aXRoLGF3YWl0LGJyZWFrLGNhdGNoLGNsYXNzLGNvbnN0LCcgKwogICdzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsJyArCiAgJ2V4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMnCikuc3BsaXQoJywnKS5qb2luKCdcXGJ8XFxiJykgKyAnXFxiJyk7CgovLyB0aGVzZSB1bmFyeSBvcGVyYXRvcnMgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHByb3BlcnR5L21ldGhvZCBuYW1lcwp2YXIgdW5hcnlPcGVyYXRvcnNSRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyAoCiAgJ2RlbGV0ZSx0eXBlb2Ysdm9pZCcKKS5zcGxpdCgnLCcpLmpvaW4oJ1xccypcXChbXlxcKV0qXFwpfFxcYicpICsgJ1xccypcXChbXlxcKV0qXFwpJyk7CgovLyBzdHJpcCBzdHJpbmdzIGluIGV4cHJlc3Npb25zCnZhciBzdHJpcFN0cmluZ1JFID0gLycoPzpbXidcXF18XFwuKSonfCIoPzpbXiJcXF18XFwuKSoifGAoPzpbXmBcXF18XFwuKSpcJFx7fFx9KD86W15gXFxdfFxcLikqYHxgKD86W15gXFxdfFxcLikqYC9nOwoKLy8gZGV0ZWN0IHByb2JsZW1hdGljIGV4cHJlc3Npb25zIGluIGEgdGVtcGxhdGUKZnVuY3Rpb24gZGV0ZWN0RXJyb3JzIChhc3QpIHsKICB2YXIgZXJyb3JzID0gW107CiAgaWYgKGFzdCkgewogICAgY2hlY2tOb2RlKGFzdCwgZXJyb3JzKTsKICB9CiAgcmV0dXJuIGVycm9ycwp9CgpmdW5jdGlvbiBjaGVja05vZGUgKG5vZGUsIGVycm9ycykgewogIGlmIChub2RlLnR5cGUgPT09IDEpIHsKICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZS5hdHRyc01hcCkgewogICAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuYXR0cnNNYXBbbmFtZV07CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAobmFtZSA9PT0gJ3YtZm9yJykgewogICAgICAgICAgICBjaGVja0Zvcihub2RlLCAoInYtZm9yPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9IGVsc2UgaWYgKG9uUkUudGVzdChuYW1lKSkgewogICAgICAgICAgICBjaGVja0V2ZW50KHZhbHVlLCAobmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIiKSwgZXJyb3JzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoZWNrRXhwcmVzc2lvbih2YWx1ZSwgKG5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGVja05vZGUobm9kZS5jaGlsZHJlbltpXSwgZXJyb3JzKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAyKSB7CiAgICBjaGVja0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBub2RlLnRleHQsIGVycm9ycyk7CiAgfQp9CgpmdW5jdGlvbiBjaGVja0V2ZW50IChleHAsIHRleHQsIGVycm9ycykgewogIHZhciBzdGlwcGVkID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpOwogIHZhciBrZXl3b3JkTWF0Y2ggPSBzdGlwcGVkLm1hdGNoKHVuYXJ5T3BlcmF0b3JzUkUpOwogIGlmIChrZXl3b3JkTWF0Y2ggJiYgc3RpcHBlZC5jaGFyQXQoa2V5d29yZE1hdGNoLmluZGV4IC0gMSkgIT09ICckJykgewogICAgZXJyb3JzLnB1c2goCiAgICAgICJhdm9pZCB1c2luZyBKYXZhU2NyaXB0IHVuYXJ5IG9wZXJhdG9yIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAiXCIiICsgKGtleXdvcmRNYXRjaFswXSkgKyAiXCIgaW4gZXhwcmVzc2lvbiAiICsgKHRleHQudHJpbSgpKQogICAgKTsKICB9CiAgY2hlY2tFeHByZXNzaW9uKGV4cCwgdGV4dCwgZXJyb3JzKTsKfQoKZnVuY3Rpb24gY2hlY2tGb3IgKG5vZGUsIHRleHQsIGVycm9ycykgewogIGNoZWNrRXhwcmVzc2lvbihub2RlLmZvciB8fCAnJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5hbGlhcywgJ3YtZm9yIGFsaWFzJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5pdGVyYXRvcjEsICd2LWZvciBpdGVyYXRvcicsIHRleHQsIGVycm9ycyk7CiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuaXRlcmF0b3IyLCAndi1mb3IgaXRlcmF0b3InLCB0ZXh0LCBlcnJvcnMpOwp9CgpmdW5jdGlvbiBjaGVja0lkZW50aWZpZXIgKAogIGlkZW50LAogIHR5cGUsCiAgdGV4dCwKICBlcnJvcnMKKSB7CiAgaWYgKHR5cGVvZiBpZGVudCA9PT0gJ3N0cmluZycpIHsKICAgIHRyeSB7CiAgICAgIG5ldyBGdW5jdGlvbigoInZhciAiICsgaWRlbnQgKyAiPV8iKSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGVycm9ycy5wdXNoKCgiaW52YWxpZCAiICsgdHlwZSArICIgXCIiICsgaWRlbnQgKyAiXCIgaW4gZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkpKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrRXhwcmVzc2lvbiAoZXhwLCB0ZXh0LCBlcnJvcnMpIHsKICB0cnkgewogICAgbmV3IEZ1bmN0aW9uKCgicmV0dXJuICIgKyBleHApKTsKICB9IGNhdGNoIChlKSB7CiAgICB2YXIga2V5d29yZE1hdGNoID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpLm1hdGNoKHByb2hpYml0ZWRLZXl3b3JkUkUpOwogICAgaWYgKGtleXdvcmRNYXRjaCkgewogICAgICBlcnJvcnMucHVzaCgKICAgICAgICAiYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAgICJcIiIgKyAoa2V5d29yZE1hdGNoWzBdKSArICJcIlxuICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9ycy5wdXNoKAogICAgICAgICJpbnZhbGlkIGV4cHJlc3Npb246ICIgKyAoZS5tZXNzYWdlKSArICIgaW5cblxuIiArCiAgICAgICAgIiAgICAiICsgZXhwICsgIlxuXG4iICsKICAgICAgICAiICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkgKyAiXG4iCiAgICAgICk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uIChjb2RlLCBlcnJvcnMpIHsKICB0cnkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlKQogIH0gY2F0Y2ggKGVycikgewogICAgZXJyb3JzLnB1c2goeyBlcnI6IGVyciwgY29kZTogY29kZSB9KTsKICAgIHJldHVybiBub29wCiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuIChjb21waWxlKSB7CiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBpbGVUb0Z1bmN0aW9ucyAoCiAgICB0ZW1wbGF0ZSwKICAgIG9wdGlvbnMsCiAgICB2bQogICkgewogICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICB2YXIgd2FybiQkMSA9IG9wdGlvbnMud2FybiB8fCB3YXJuOwogICAgZGVsZXRlIG9wdGlvbnMud2FybjsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIHsKICAgICAgLy8gZGV0ZWN0IHBvc3NpYmxlIENTUCByZXN0cmljdGlvbgogICAgICB0cnkgewogICAgICAgIG5ldyBGdW5jdGlvbigncmV0dXJuIDEnKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLnRvU3RyaW5nKCkubWF0Y2goL3Vuc2FmZS1ldmFsfENTUC8pKSB7CiAgICAgICAgICB3YXJuJCQxKAogICAgICAgICAgICAnSXQgc2VlbXMgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhbG9uZSBidWlsZCBvZiBWdWUuanMgaW4gYW4gJyArCiAgICAgICAgICAgICdlbnZpcm9ubWVudCB3aXRoIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IHRoYXQgcHJvaGliaXRzIHVuc2FmZS1ldmFsLiAnICsKICAgICAgICAgICAgJ1RoZSB0ZW1wbGF0ZSBjb21waWxlciBjYW5ub3Qgd29yayBpbiB0aGlzIGVudmlyb25tZW50LiBDb25zaWRlciAnICsKICAgICAgICAgICAgJ3JlbGF4aW5nIHRoZSBwb2xpY3kgdG8gYWxsb3cgdW5zYWZlLWV2YWwgb3IgcHJlLWNvbXBpbGluZyB5b3VyICcgKwogICAgICAgICAgICAndGVtcGxhdGVzIGludG8gcmVuZGVyIGZ1bmN0aW9ucy4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIGNoZWNrIGNhY2hlCiAgICB2YXIga2V5ID0gb3B0aW9ucy5kZWxpbWl0ZXJzCiAgICAgID8gU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVycykgKyB0ZW1wbGF0ZQogICAgICA6IHRlbXBsYXRlOwogICAgaWYgKGNhY2hlW2tleV0pIHsKICAgICAgcmV0dXJuIGNhY2hlW2tleV0KICAgIH0KCiAgICAvLyBjb21waWxlCiAgICB2YXIgY29tcGlsZWQgPSBjb21waWxlKHRlbXBsYXRlLCBvcHRpb25zKTsKCiAgICAvLyBjaGVjayBjb21waWxhdGlvbiBlcnJvcnMvdGlwcwogICAgewogICAgICBpZiAoY29tcGlsZWQuZXJyb3JzICYmIGNvbXBpbGVkLmVycm9ycy5sZW5ndGgpIHsKICAgICAgICB3YXJuJCQxKAogICAgICAgICAgIkVycm9yIGNvbXBpbGluZyB0ZW1wbGF0ZTpcblxuIiArIHRlbXBsYXRlICsgIlxuXG4iICsKICAgICAgICAgIGNvbXBpbGVkLmVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuICgiLSAiICsgZSk7IH0pLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChjb21waWxlZC50aXBzICYmIGNvbXBpbGVkLnRpcHMubGVuZ3RoKSB7CiAgICAgICAgY29tcGlsZWQudGlwcy5mb3JFYWNoKGZ1bmN0aW9uIChtc2cpIHsgcmV0dXJuIHRpcChtc2csIHZtKTsgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyB0dXJuIGNvZGUgaW50byBmdW5jdGlvbnMKICAgIHZhciByZXMgPSB7fTsKICAgIHZhciBmbkdlbkVycm9ycyA9IFtdOwogICAgcmVzLnJlbmRlciA9IGNyZWF0ZUZ1bmN0aW9uKGNvbXBpbGVkLnJlbmRlciwgZm5HZW5FcnJvcnMpOwogICAgcmVzLnN0YXRpY1JlbmRlckZucyA9IGNvbXBpbGVkLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKGNvZGUsIGZuR2VuRXJyb3JzKQogICAgfSk7CgogICAgLy8gY2hlY2sgZnVuY3Rpb24gZ2VuZXJhdGlvbiBlcnJvcnMuCiAgICAvLyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29tcGlsZXIgaXRzZWxmLgogICAgLy8gbW9zdGx5IGZvciBjb2RlZ2VuIGRldmVsb3BtZW50IHVzZQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICB7CiAgICAgIGlmICgoIWNvbXBpbGVkLmVycm9ycyB8fCAhY29tcGlsZWQuZXJyb3JzLmxlbmd0aCkgJiYgZm5HZW5FcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgd2FybiQkMSgKICAgICAgICAgICJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVuZGVyIGZ1bmN0aW9uOlxuXG4iICsKICAgICAgICAgIGZuR2VuRXJyb3JzLm1hcChmdW5jdGlvbiAocmVmKSB7CiAgICAgICAgICAgIHZhciBlcnIgPSByZWYuZXJyOwogICAgICAgICAgICB2YXIgY29kZSA9IHJlZi5jb2RlOwoKICAgICAgICAgICAgcmV0dXJuICgoZXJyLnRvU3RyaW5nKCkpICsgIiBpblxuXG4iICsgY29kZSArICJcbiIpOwogICAgICAgIH0pLmpvaW4oJ1xuJyksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKGNhY2hlW2tleV0gPSByZXMpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBpbGVyQ3JlYXRvciAoYmFzZUNvbXBpbGUpIHsKICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQ29tcGlsZXIgKGJhc2VPcHRpb25zKSB7CiAgICBmdW5jdGlvbiBjb21waWxlICgKICAgICAgdGVtcGxhdGUsCiAgICAgIG9wdGlvbnMKICAgICkgewogICAgICB2YXIgZmluYWxPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShiYXNlT3B0aW9ucyk7CiAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgdmFyIHRpcHMgPSBbXTsKICAgICAgZmluYWxPcHRpb25zLndhcm4gPSBmdW5jdGlvbiAobXNnLCB0aXApIHsKICAgICAgICAodGlwID8gdGlwcyA6IGVycm9ycykucHVzaChtc2cpOwogICAgICB9OwoKICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAvLyBtZXJnZSBjdXN0b20gbW9kdWxlcwogICAgICAgIGlmIChvcHRpb25zLm1vZHVsZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5tb2R1bGVzID0KICAgICAgICAgICAgKGJhc2VPcHRpb25zLm1vZHVsZXMgfHwgW10pLmNvbmNhdChvcHRpb25zLm1vZHVsZXMpOwogICAgICAgIH0KICAgICAgICAvLyBtZXJnZSBjdXN0b20gZGlyZWN0aXZlcwogICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5kaXJlY3RpdmVzID0gZXh0ZW5kKAogICAgICAgICAgICBPYmplY3QuY3JlYXRlKGJhc2VPcHRpb25zLmRpcmVjdGl2ZXMgfHwgbnVsbCksCiAgICAgICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlcwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy8gY29weSBvdGhlciBvcHRpb25zCiAgICAgICAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgICAgICAgIGlmIChrZXkgIT09ICdtb2R1bGVzJyAmJiBrZXkgIT09ICdkaXJlY3RpdmVzJykgewogICAgICAgICAgICBmaW5hbE9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBjb21waWxlZCA9IGJhc2VDb21waWxlKHRlbXBsYXRlLCBmaW5hbE9wdGlvbnMpOwogICAgICB7CiAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBkZXRlY3RFcnJvcnMoY29tcGlsZWQuYXN0KSk7CiAgICAgIH0KICAgICAgY29tcGlsZWQuZXJyb3JzID0gZXJyb3JzOwogICAgICBjb21waWxlZC50aXBzID0gdGlwczsKICAgICAgcmV0dXJuIGNvbXBpbGVkCiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgY29tcGlsZTogY29tcGlsZSwKICAgICAgY29tcGlsZVRvRnVuY3Rpb25zOiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuKGNvbXBpbGUpCiAgICB9CiAgfQp9CgovKiAgKi8KCi8vIGBjcmVhdGVDb21waWxlckNyZWF0b3JgIGFsbG93cyBjcmVhdGluZyBjb21waWxlcnMgdGhhdCB1c2UgYWx0ZXJuYXRpdmUKLy8gcGFyc2VyL29wdGltaXplci9jb2RlZ2VuLCBlLmcgdGhlIFNTUiBvcHRpbWl6aW5nIGNvbXBpbGVyLgovLyBIZXJlIHdlIGp1c3QgZXhwb3J0IGEgZGVmYXVsdCBjb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCBwYXJ0cy4KdmFyIGNyZWF0ZUNvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXJDcmVhdG9yKGZ1bmN0aW9uIGJhc2VDb21waWxlICgKICB0ZW1wbGF0ZSwKICBvcHRpb25zCikgewogIHZhciBhc3QgPSBwYXJzZSh0ZW1wbGF0ZS50cmltKCksIG9wdGlvbnMpOwogIGlmIChvcHRpb25zLm9wdGltaXplICE9PSBmYWxzZSkgewogICAgb3B0aW1pemUoYXN0LCBvcHRpb25zKTsKICB9CiAgdmFyIGNvZGUgPSBnZW5lcmF0ZShhc3QsIG9wdGlvbnMpOwogIHJldHVybiB7CiAgICBhc3Q6IGFzdCwKICAgIHJlbmRlcjogY29kZS5yZW5kZXIsCiAgICBzdGF0aWNSZW5kZXJGbnM6IGNvZGUuc3RhdGljUmVuZGVyRm5zCiAgfQp9KTsKCi8qICAqLwoKdmFyIHJlZiQxID0gY3JlYXRlQ29tcGlsZXIoYmFzZU9wdGlvbnMpOwp2YXIgY29tcGlsZVRvRnVuY3Rpb25zID0gcmVmJDEuY29tcGlsZVRvRnVuY3Rpb25zOwoKLyogICovCgovLyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgYnJvd3NlciBlbmNvZGVzIGEgY2hhciBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcwp2YXIgZGl2OwpmdW5jdGlvbiBnZXRTaG91bGREZWNvZGUgKGhyZWYpIHsKICBkaXYgPSBkaXYgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGl2LmlubmVySFRNTCA9IGhyZWYgPyAiPGEgaHJlZj1cIlxuXCIvPiIgOiAiPGRpdiBhPVwiXG5cIi8+IjsKICByZXR1cm4gZGl2LmlubmVySFRNTC5pbmRleE9mKCcmIzEwOycpID4gMAp9CgovLyAjMzY2MzogSUUgZW5jb2RlcyBuZXdsaW5lcyBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcyB3aGlsZSBvdGhlciBicm93c2VycyBkb24ndAp2YXIgc2hvdWxkRGVjb2RlTmV3bGluZXMgPSBpbkJyb3dzZXIgPyBnZXRTaG91bGREZWNvZGUoZmFsc2UpIDogZmFsc2U7Ci8vICM2ODI4OiBjaHJvbWUgZW5jb2RlcyBjb250ZW50IGluIGFbaHJlZl0KdmFyIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiA9IGluQnJvd3NlciA/IGdldFNob3VsZERlY29kZSh0cnVlKSA6IGZhbHNlOwoKLyogICovCgp2YXIgaWRUb1RlbXBsYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChpZCkgewogIHZhciBlbCA9IHF1ZXJ5KGlkKTsKICByZXR1cm4gZWwgJiYgZWwuaW5uZXJIVE1MCn0pOwoKdmFyIG1vdW50ID0gVnVlLnByb3RvdHlwZS4kbW91bnQ7ClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIHF1ZXJ5KGVsKTsKCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5IHx8IGVsID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAiRG8gbm90IG1vdW50IFZ1ZSB0byA8aHRtbD4gb3IgPGJvZHk+IC0gbW91bnQgdG8gbm9ybWFsIGVsZW1lbnRzIGluc3RlYWQuIgogICAgKTsKICAgIHJldHVybiB0aGlzCiAgfQoKICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7CiAgLy8gcmVzb2x2ZSB0ZW1wbGF0ZS9lbCBhbmQgY29udmVydCB0byByZW5kZXIgZnVuY3Rpb24KICBpZiAoIW9wdGlvbnMucmVuZGVyKSB7CiAgICB2YXIgdGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlOwogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdCgwKSA9PT0gJyMnKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IGlkVG9UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgKCJUZW1wbGF0ZSBlbGVtZW50IG5vdCBmb3VuZCBvciBpcyBlbXB0eTogIiArIChvcHRpb25zLnRlbXBsYXRlKSksCiAgICAgICAgICAgICAgdGhpcwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkgewogICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuaW5uZXJIVE1MOwogICAgICB9IGVsc2UgewogICAgICAgIHsKICAgICAgICAgIHdhcm4oJ2ludmFsaWQgdGVtcGxhdGUgb3B0aW9uOicgKyB0ZW1wbGF0ZSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWwpIHsKICAgICAgdGVtcGxhdGUgPSBnZXRPdXRlckhUTUwoZWwpOwogICAgfQogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgICAgbWFyaygnY29tcGlsZScpOwogICAgICB9CgogICAgICB2YXIgcmVmID0gY29tcGlsZVRvRnVuY3Rpb25zKHRlbXBsYXRlLCB7CiAgICAgICAgc2hvdWxkRGVjb2RlTmV3bGluZXM6IHNob3VsZERlY29kZU5ld2xpbmVzLAogICAgICAgIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjogc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmLAogICAgICAgIGRlbGltaXRlcnM6IG9wdGlvbnMuZGVsaW1pdGVycywKICAgICAgICBjb21tZW50czogb3B0aW9ucy5jb21tZW50cwogICAgICB9LCB0aGlzKTsKICAgICAgdmFyIHJlbmRlciA9IHJlZi5yZW5kZXI7CiAgICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zOwogICAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlcjsKICAgICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnM7CgogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgICAgIG1hcmsoJ2NvbXBpbGUgZW5kJyk7CiAgICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHRoaXMuX25hbWUpICsgIiBjb21waWxlIiksICdjb21waWxlJywgJ2NvbXBpbGUgZW5kJyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG1vdW50LmNhbGwodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8qKgogKiBHZXQgb3V0ZXJIVE1MIG9mIGVsZW1lbnRzLCB0YWtpbmcgY2FyZQogKiBvZiBTVkcgZWxlbWVudHMgaW4gSUUgYXMgd2VsbC4KICovCmZ1bmN0aW9uIGdldE91dGVySFRNTCAoZWwpIHsKICBpZiAoZWwub3V0ZXJIVE1MKSB7CiAgICByZXR1cm4gZWwub3V0ZXJIVE1MCiAgfSBlbHNlIHsKICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbC5jbG9uZU5vZGUodHJ1ZSkpOwogICAgcmV0dXJuIGNvbnRhaW5lci5pbm5lckhUTUwKICB9Cn0KClZ1ZS5jb21waWxlID0gY29tcGlsZVRvRnVuY3Rpb25zOwoKcmV0dXJuIFZ1ZTsKCn0pKSk7Cg==" >
tail j=5409 line=
tail j=5410 line=<!-- <script type="text/javascript" src="/jquery-3.3.1.js" > -->
tail j=5411 line= <script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkgewoKCSJ1c2Ugc3RyaWN0IjsKCglpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2AKCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgoJCS8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgCgkJLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuCgkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uCgkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPwoJCQlmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6CgkJCWZ1bmN0aW9uKCB3ICkgewoJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50IiApOwoJCQkJfQoJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKCQkJfTsKCX0gZWxzZSB7CgkJZmFjdG9yeSggZ2xvYmFsICk7Cgl9CgovLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAp9ICkoIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CgovLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjEKLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlCi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uCi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLgoidXNlIHN0cmljdCI7Cgp2YXIgYXJyID0gW107Cgp2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cgp2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7Cgp2YXIgc2xpY2UgPSBhcnIuc2xpY2U7Cgp2YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKCnZhciBwdXNoID0gYXJyLnB1c2g7Cgp2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOwoKdmFyIGNsYXNzMnR5cGUgPSB7fTsKCnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7Cgp2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKCnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nOwoKdmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTsKCnZhciBzdXBwb3J0ID0ge307Cgp2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHsKCiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTIKICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgImZ1bmN0aW9uIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50cwogICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib2JqZWN0IiApID09PSAiZnVuY3Rpb24iYCkuCiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi4KICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gIm51bWJlciI7CiAgfTsKCgp2YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Cgl9OwoKCgoKCXZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0gewoJCXR5cGU6IHRydWUsCgkJc3JjOiB0cnVlLAoJCW5vTW9kdWxlOiB0cnVlCgl9OwoKCWZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYywgbm9kZSApIHsKCQlkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7CgoJCXZhciBpLAoJCQlzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsKCgkJc2NyaXB0LnRleHQgPSBjb2RlOwoJCWlmICggbm9kZSApIHsKCQkJZm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkgewoJCQkJaWYgKCBub2RlWyBpIF0gKSB7CgkJCQkJc2NyaXB0WyBpIF0gPSBub2RlWyBpIF07CgkJCQl9CgkJCX0KCQl9CgkJZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJfQoKCmZ1bmN0aW9uIHRvVHlwZSggb2JqICkgewoJaWYgKCBvYmogPT0gbnVsbCApIHsKCQlyZXR1cm4gb2JqICsgIiI7Cgl9CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApCglyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CgkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CgkJdHlwZW9mIG9iajsKfQovKiBnbG9iYWwgU3ltYm9sICovCi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsCi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlCgoKCnZhcgoJdmVyc2lvbiA9ICIzLjMuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfSwKCgkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHkKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAoJcnRyaW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogdmVyc2lvbiwKCgljb25zdHJ1Y3RvcjogalF1ZXJ5LAoKCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVuZ3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgoJCS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKCQlpZiAoIG51bSA9PSBudWxsICkgewoJCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApOwoJCX0KCgkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAoJCXJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoKCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAoJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSApICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpOwoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KCXB1c2g6IHB1c2gsCglzb3J0OiBhcnIuc29ydCwKCXNwbGljZTogYXJyLnNwbGljZQp9OwoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKCQl0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSwKCQlpID0gMSwKCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAoJCWRlZXAgPSBmYWxzZTsKCgkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKCQlkZWVwID0gdGFyZ2V0OwoKCQkvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CgkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CgkJaSsrOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGkgPT09IGxlbmd0aCApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCWktLTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgewoKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHwKCQkJCQkoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHsKCgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCWV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAoKCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCglpc1JlYWR5OiB0cnVlLAoKCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewoJCXRocm93IG5ldyBFcnJvciggbXNnICk7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgcHJvdG8sIEN0b3I7CgoJCS8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlcwoJCS8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0cwoJCWlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gIltvYmplY3QgT2JqZWN0XSIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXByb3RvID0gZ2V0UHJvdG8oIG9iaiApOwoKCQkvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluCgkJaWYgKCAhcHJvdG8gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb24KCQlDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCAiY29uc3RydWN0b3IiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7CgkJcmV0dXJuIHR5cGVvZiBDdG9yID09PSAiZnVuY3Rpb24iICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZzsKCX0sCgoJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCgkJLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KCQkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjUKCQl2YXIgbmFtZTsKCgkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHsKCQlET01FdmFsKCBjb2RlICk7Cgl9LAoKCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkgewoJCXZhciBsZW5ndGgsIGkgPSAwOwoKCQlpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHsKCQkJbGVuZ3RoID0gb2JqLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvciAoIGkgaW4gb2JqICkgewoJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seQoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CgkJCSIiIDoKCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCX0sCgoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIGFyciAhPSBudWxsICkgewoJCQlpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKCQlyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seQoJLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdAoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJCXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNoZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKCQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2YXIgbGVuZ3RoLCB2YWx1ZSwKCQkJaSA9IDAsCgkJCXJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwoJCWlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7CgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBpIGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldC5wdXNoKCB2YWx1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCgkvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgoJc3VwcG9ydDogc3VwcG9ydAp9ICk7CgppZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CglqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTsKfQoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCAiICIgKSwKZnVuY3Rpb24oIGksIG5hbWUgKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9ICk7CgpmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkgewoKCS8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcikKCS8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSkKCS8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwoJLy8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRQoJdmFyIGxlbmd0aCA9ICEhb2JqICYmICJsZW5ndGgiIGluIG9iaiAmJiBvYmoubGVuZ3RoLAoJCXR5cGUgPSB0b1R5cGUoIG9iaiApOwoKCWlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKCQl0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKfQp2YXIgU2l6emxlID0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNi0wOC0wOAogKi8KKGZ1bmN0aW9uKCB3aW5kb3cgKSB7Cgp2YXIgaSwKCXN1cHBvcnQsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJdG9rZW5pemUsCgljb21waWxlLAoJc2VsZWN0LAoJb3V0ZXJtb3N0Q29udGV4dCwKCXNvcnRJbnB1dCwKCWhhc0R1cGxpY2F0ZSwKCgkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCglzZXREb2N1bWVudCwKCWRvY3VtZW50LAoJZG9jRWxlbSwKCWRvY3VtZW50SXNIVE1MLAoJcmJ1Z2d5UVNBLAoJcmJ1Z2d5TWF0Y2hlcywKCW1hdGNoZXMsCgljb250YWlucywKCgkvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCglleHBhbmRvID0gInNpenpsZSIgKyAxICogbmV3IERhdGUoKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMgPSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVybiAwOwoJfSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNlLAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlCgkvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81CglpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7CgkJdmFyIGkgPSAwLAoJCQlsZW4gPSBsaXN0Lmxlbmd0aDsKCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfSwKCglib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCgoJLy8gUmVndWxhciBleHByZXNzaW9ucwoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRpZmllciA9ICIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsCgoJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGlkZW50aWZpZXIgKyAiKSg/OiIgKyB3aGl0ZXNwYWNlICsKCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQoJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKwoJCS8vICJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdIgoJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCgkJIipcXF0iLAoKCXBzZXVkb3MgPSAiOigiICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKwoJCS8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgoJcndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgIisiLCAiZyIgKSwKCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAoKCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAoJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAoKCXJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCAiPSIgKyB3aGl0ZXNwYWNlICsgIiooW15cXF0nXCJdKj8pIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsICJnIiApLAoKCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCglyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoICJeIiArIGlkZW50aWZpZXIgKyAiJCIgKSwKCgltYXRjaEV4cHIgPSB7CgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBpZGVudGlmaWVyICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50aWZpZXIgKyAiKSIgKSwKCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGlkZW50aWZpZXIgKyAifFsqXSkiICksCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCgkJIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwKCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKCQkvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgCgkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCgkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQoJfSwKCglyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJoZWFkZXIgPSAvXmhcZCQvaSwKCglybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCgoJcnNpYmxpbmcgPSAvWyt+XS8sCgoJLy8gQ1NTIGVzY2FwZXMKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKCXJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJcXFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIpfC4pIiwgImlnIiApLAoJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgewoJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwoJCS8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CgkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAoJCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKCQlyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/CgkJCWVzY2FwZWQgOgoJCQloaWdoIDwgMCA/CgkJCQkvLyBCTVAgY29kZXBvaW50CgkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQoJCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Cgl9LAoKCS8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uCgkvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXMKCXJjc3Nlc2NhcGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywKCWZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkgewoJCWlmICggYXNDb2RlUG9pbnQgKSB7CgoJCQkvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIKCQkJaWYgKCBjaCA9PT0gIlwwIiApIHsKCQkJCXJldHVybiAiXHVGRkZEIjsKCQkJfQoKCQkJLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHMKCQkJcmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgIlxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArICIgIjsKCQl9CgoJCS8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWQKCQlyZXR1cm4gIlxcIiArIGNoOwoJfSwKCgkvLyBVc2VkIGZvciBpZnJhbWVzCgkvLyBTZWUgc2V0RG9jdW1lbnQoKQoJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgoJLy8gZXJyb3IgaW4gSUUKCXVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKCQlzZXREb2N1bWVudCgpOwoJfSwKCglkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcigKCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgKCJmb3JtIiBpbiBlbGVtIHx8ICJsYWJlbCIgaW4gZWxlbSk7CgkJfSwKCQl7IGRpcjogInBhcmVudE5vZGUiLCBuZXh0OiAibGVnZW5kIiB9CgkpOwoKLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKdHJ5IHsKCXB1c2guYXBwbHkoCgkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAoJCXByZWZlcnJlZERvYy5jaGlsZE5vZGVzCgkpOwoJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKCS8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHkKCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cn0gY2F0Y2ggKCBlICkgewoJcHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggPwoKCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQoJCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CgkJfSA6CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5CgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCgkJCQlpID0gMDsKCQkJLy8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoCgkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Cgl2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3RvciwKCQluZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsCgoJCS8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnQKCQlub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTsKCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCgkvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dAoJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciIHx8ICFzZWxlY3RvciB8fAoJCW5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHsKCgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgoJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50cwoJaWYgKCAhc2VlZCApIHsKCgkJaWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHsKCQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CgoJCQkvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgImdldCpCeSoiIERPTSBtZXRob2QKCQkJLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQoJCQlpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewoKCQkJCS8vIElEIHNlbGVjdG9yCgkJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgewoKCQkJCQkvLyBEb2N1bWVudCBjb250ZXh0CgkJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJCS8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zCgkJCQkJCQkvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoKCQkJCQkvLyBFbGVtZW50IGNvbnRleHQKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJLy8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnMKCQkJCQkJLy8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCgkJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmCgkJCQkJCQllbGVtLmlkID09PSBtICkgewoKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9CgoJCQkJLy8gVHlwZSBzZWxlY3RvcgoJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwoJCQkJCXJldHVybiByZXN1bHRzOwoKCQkJCS8vIENsYXNzIHNlbGVjdG9yCgkJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYKCQkJCQljb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CgoJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CgkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQl9CgkJCX0KCgkJCS8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGwKCQkJaWYgKCBzdXBwb3J0LnFzYSAmJgoJCQkJIWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF0gJiYKCQkJCSghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgoJCQkJaWYgKCBub2RlVHlwZSAhPT0gMSApIHsKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IHNlbGVjdG9yOwoKCQkJCS8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudAoJCQkJLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKCQkJCS8vIFN1cHBvcnQ6IElFIDw9OAoJCQkJLy8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHMKCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgoJCQkJCS8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CgkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIChuaWQgPSBleHBhbmRvKSApOwoJCQkJCX0KCgkJCQkJLy8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7CgkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCWdyb3Vwc1tpXSA9ICIjIiArIG5pZCArICIgIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwoJCQkJCX0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCAiLCIgKTsKCgkJCQkJLy8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzCgkJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8CgkJCQkJCWNvbnRleHQ7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAoJCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCgkJCQkJCSk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0gY2F0Y2ggKCBxc2FFcnJvciApIHsKCQkJCQl9IGZpbmFsbHkgewoJCQkJCQlpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQWxsIG90aGVycwoJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwp9CgovKioKICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGgKICoJcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQogKi8KZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7Cgl2YXIga2V5cyA9IFtdOwoKCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgewoJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQoJCWlmICgga2V5cy5wdXNoKCBrZXkgKyAiICIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwoJCX0KCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsKCX0KCXJldHVybiBjYWNoZTsKfQoKLyoqCiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCiAqLwpmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewoJZm5bIGV4cGFuZG8gXSA9IHRydWU7CglyZXR1cm4gZm47Cn0KCi8qKgogKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkgewoJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTsKCgl0cnkgewoJCXJldHVybiAhIWZuKCBlbCApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVybiBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CgkJaWYgKCBlbC5wYXJlbnROb2RlICkgewoJCQllbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApOwoJCX0KCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCWVsID0gbnVsbDsKCX0KfQoKLyoqCiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQKICovCmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Cgl2YXIgYXJyID0gYXR0cnMuc3BsaXQoInwiKSwKCQlpID0gYXJyLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBhCiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBiICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkCiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWQKICovCmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHsKCgkvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGUKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWQKCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkCgkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWQKCQlpZiAoICJmb3JtIiBpbiBlbGVtICkgewoKCQkJLy8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOgoJCQkvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldAoJCQkvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkCgkJCS8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkCgkJCS8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkCgkJCS8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSAiZm9ybSIgcHJvcGVydHkuCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkgewoKCQkJCS8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50CgkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbSApIHsKCQkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQlyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFN1cHBvcnQ6IElFIDYgLSAxMQoJCQkJLy8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnMKCQkJCXJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8CgoJCQkJCS8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5CgkJCQkJLyoganNoaW50IC1XMDE4ICovCgkJCQkJZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiYKCQkJCQkJZGlzYWJsZWRBbmNlc3RvciggZWxlbSApID09PSBkaXNhYmxlZDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkOwoKCQkvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuCgkJLy8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0CgkJLy8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuCgkJfSBlbHNlIGlmICggImxhYmVsIiBpbiBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJfQoKCQkvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZAoJCXJldHVybiBmYWxzZTsKCX07Cn0KCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCiAqLwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAogKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dAogKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKICovCmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkgewoJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1MIG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LAoJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKCgkvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZAoJaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgoJLy8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXMKCWRvY3VtZW50ID0gZG9jOwoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCWRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApOwoKCS8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2UKCS8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpCglpZiAoIHByZWZlcnJlZERvYyAhPT0gZG9jdW1lbnQgJiYKCQkoc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHsKCgkJLy8gU3VwcG9ydDogSUUgMTEsIEVkZ2UKCQlpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJCQlzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5CgkJfSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkgewoJCQlzdWJXaW5kb3cuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIHVubG9hZEhhbmRsZXIgKTsKCQl9Cgl9CgoJLyogQXR0cmlidXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFN1cHBvcnQ6IElFPDgKCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcwoJLy8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCglzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Cgl9KTsKCgkvKiBnZXRFbGVtZW50KHMpQnkqCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCXN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Cgl9KTsKCgkvLyBTdXBwb3J0OiBJRTw5CglzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsKCgkvLyBTdXBwb3J0OiBJRTwxMAoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lCgkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcywKCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAoJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbzsKCQlyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKCX0pOwoKCS8vIElEIGZpbHRlciBhbmQgZmluZAoJaWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7CgkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJCUV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCQl2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJCQlyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107CgkJCX0KCQl9OwoJfSBlbHNlIHsKCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCQkJZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOwoJCQl9OwoJCX07CgoJCS8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHkKCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CgkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBub2RlLCBpLCBlbGVtcywKCQkJCQllbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCgkJCQlpZiAoIGVsZW0gKSB7CgoJCQkJCS8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlCgkJCQkJbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7CgkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQl9CgoJCQkJCS8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZQoJCQkJCWVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTsKCQkJCQlpID0gMDsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7CgkJCQkJCW5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgkJCQkJCWlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHsKCQkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gW107CgkJCX0KCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROCgkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgewoJCQkJcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CgkJCX0KCQl9IDoKCgkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJdmFyIGVsZW0sCgkJCQl0bXAgPSBbXSwKCQkJCWkgPSAwLAoJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbwoJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdG1wOwoJCQl9CgkJCXJldHVybiByZXN1bHRzOwoJCX07CgoJLy8gQ2xhc3MKCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCX0KCX07CgoJLyogUVNBL21hdGNoZXNTZWxlY3RvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKCgkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJcmJ1Z2d5TWF0Y2hlcyA9IFtdOwoKCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCgkvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3IKCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKCS8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCgkvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CglyYnVnZ3lRU0EgPSBbXTsKCglpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHsKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQoJCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCgkJCQkiPHNlbGVjdCBpZD0nIiArIGV4cGFuZG8gKyAiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPiIgKwoJCQkJIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKCgkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQoJCQkvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCAic2FmZSIgZm9yIFdpblJUCgkJCS8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IElFOAoJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44KwoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgifj0iKTsKCQkJfQoKCQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKCQkJaWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MQoJCQkvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzCgkJCWlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCIuIy4rWyt+XSIpOwoJCQl9CgkJfSk7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCWVsLmlubmVySFRNTCA9ICI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPiIgKwoJCQkJIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iOwoKCQkJLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzCgkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAoJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKCQkJZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiApOwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJuYW1lIiArIHdoaXRlc3BhY2UgKyAiKlsqXiR8IX5dPz0iICk7CgkJCX0KCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggIT09IDIgKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogSUU5LTExKwoJCQkvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHMKCQkJZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7CgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoICE9PSAyICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CgkJCX0KCgkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCgkJCWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQoJCQlzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgIioiICk7CgoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBlbCwgIltzIT0nJ106eCIgKTsKCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CgkJfSk7Cgl9CgoJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CglyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCJ8IikgKTsKCgkvKiBDb250YWlucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwoKCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgoJLy8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlCgkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8KCQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBiICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYgKCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJaWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKCQkJcmV0dXJuIHNvcnRJbnB1dCA/CgkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVudE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJYnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsKCQkJcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgoJCQkJYiA9PT0gZG9jdW1lbnQgPyAxIDoKCQkJCWF1cCA/IC0xIDoKCQkJCWJ1cCA/IDEgOgoJCQkJc29ydElucHV0ID8KCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJCX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2N1bWVudDsKfTsKClNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKfTsKClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCglleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOwoKCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkhY29tcGlsZXJDYWNoZVsgZXhwciArICIgIiBdICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoIChlKSB7fQoJfQoKCXJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cn07CgpTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7Cgl9CglyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxlbSApOwoJfQoKCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCgkJLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCgkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwoJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgoJCQl1bmRlZmluZWQ7CgoJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KCQl2YWwgOgoJCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwoJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CgkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKfTsKClNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkgewoJcmV0dXJuIChzZWwgKyAiIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8qKgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRlcyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKCWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJbnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hFeHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwKCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHktY29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJCX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJCXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKCQkJCX0pOwoJCX0sCgoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CgoJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CgkJCQl9CgkJCQlpZiAoICFvcGVyYXRvciApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCgkJCQlyZXN1bHQgKz0gIiI7CgoJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgoJCQkJCW9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJCQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAoJCQkJCQlkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIsCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCXVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLAoJCQkJCQlkaWZmID0gZmFsc2U7CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJCXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZUeXBlID8KCQkJCQkJCQkJCW5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CgkJCQkJCQkJCQlub2RlLm5vZGVUeXBlID09PSAxICkgewoKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewoKCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAoKCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCW5vZGUgPSBwYXJlbnQ7CgkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUgPDkgb25seQoJCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCShvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQkJY2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdOwoJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOwoJCQkJCQkJbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CgoJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKCgkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKCgkJCQkJCQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CgkJCQkJCQkJCXVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCgkJCQkJCQlpZiAoIHVzZUNhY2hlICkgewoJCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCQlub2RlID0gZWxlbTsKCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQljYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJCWRpZmYgPSBub2RlSW5kZXg7CgkJCQkJCQl9CgoJCQkJCQkJLy8geG1sIDpudGgtY2hpbGQoLi4uKQoJCQkJCQkJLy8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQoJCQkJCQkJaWYgKCBkaWZmID09PSBmYWxzZSApIHsKCQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CgkJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewoKCQkJCQkJCQkJaWYgKCAoIG9mVHlwZSA/CgkJCQkJCQkJCQlub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOgoJCQkJCQkJCQkJbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmCgkJCQkJCQkJCQkrK2RpZmYgKSB7CgoJCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAoJCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKCQkJCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQoJCQkJCQlkaWZmIC09IGxhc3Q7CgkJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJCX07CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwoJCQkvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCgkJCXZhciBhcmdzLAoJCQkJZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOwoKCQkJLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCgkJCWlmICggZm5bIGV4cGFuZG8gXSApIHsKCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKCQkJfQoKCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKCQkJCWFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKCQkJCQkJdmFyIGlkeCwKCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOwoJCQkJCQl9CgkJCQkJfSkgOgoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKCQkJCQl9OwoJCQl9CgoJCQlyZXR1cm4gZm47CgkJfQoJfSwKCglwc2V1ZG9zOiB7CgkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwoJCQl2YXIgaW5wdXQgPSBbXSwKCQkJCXJlc3VsdHMgPSBbXSwKCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CgoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsKCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pIDoKCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCQkJaW5wdXRbMF0gPSBlbGVtOwoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKCQkJCQkvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQoJCQkJCWlucHV0WzBdID0gbnVsbDsKCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7CgkJCQl9OwoJCX0pLAoKCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwoJCQl9OwoJCX0pLAoKCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CgkJCX07CgkJfSksCgoJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCgkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKCQkvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAoJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgoJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoJCS8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgoJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CgkJCS8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7CgkJCX0KCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgZWxlbUxhbmc7CgkJCQlkbyB7CgkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/CgkJCQkJCWVsZW0ubGFuZyA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgewoKCQkJCQkJZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwoJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOwoJCQkJCX0KCQkJCX0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJCX0pLAoKCQkvLyBNaXNjZWxsYW5lb3VzCgkJInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwoJCX0sCgoJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBkb2NFbGVtOwoJCX0sCgoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOwoJCX0sCgoJCS8vIEJvb2xlYW4gcHJvcGVydGllcwoJCSJlbmFibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksCgkJImRpc2FibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSwKCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwoJCX0sCgoJCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCgkJLy8gQ29udGVudHMKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAoJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQoJCQkvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwoJCX0sCgoJCS8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGF0dHI7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCgoJCQkJLy8gU3VwcG9ydDogSUU8OAoJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgoJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKCQl9LAoKCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CgkJfSksCgoJCSJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwoJCX0pLAoKCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDA7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CgkJCXZhciBpID0gMTsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwoJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CgkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KQoJfQp9OwoKRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKCi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwp9CmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CglFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwp9CgovLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOwpFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwoKdG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAoJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKCglpZiAoIGNhY2hlZCApIHsKCQlyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwoJfQoKCXNvRmFyID0gc2VsZWN0b3I7Cglncm91cHMgPSBbXTsKCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKCgl3aGlsZSAoIHNvRmFyICkgewoKCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CgkJCWlmICggbWF0Y2ggKSB7CgkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CgkJCX0KCQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKCQl9CgoJCW1hdGNoZWQgPSBmYWxzZTsKCgkJLy8gQ29tYmluYXRvcnMKCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKCQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCXRva2Vucy5wdXNoKHsKCQkJCXZhbHVlOiBtYXRjaGVkLAoJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCgkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKCQkJfSk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJfQoKCQkvLyBGaWx0ZXJzCgkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CgkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKCQkJCXRva2Vucy5wdXNoKHsKCQkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCW1hdGNoZXM6IG1hdGNoCgkJCQl9KTsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJCX0KCQl9CgoJCWlmICggIW1hdGNoZWQgKSB7CgkJCWJyZWFrOwoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCglyZXR1cm4gcGFyc2VPbmx5ID8KCQlzb0Zhci5sZW5ndGggOgoJCXNvRmFyID8KCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKCQkJLy8gQ2FjaGUgdGhlIHRva2VucwoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKfTsKCmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKCXZhciBpID0gMCwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCXNlbGVjdG9yID0gIiI7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7Cgl9CglyZXR1cm4gc2VsZWN0b3I7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJc2tpcCA9IGNvbWJpbmF0b3IubmV4dCwKCQlrZXkgPSBza2lwIHx8IGRpciwKCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewoJCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSA6CgoJCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsCgkJCQluZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTsKCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZwoJCQlpZiAoIHhtbCApIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKCgkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCXVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQlpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoJCQkJCQkJZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07CgkJCQkJCX0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiYKCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CgoJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKCQkJCQkJCXJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cwoJCQkJCQkJdW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7CgoJCQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Owp9CgpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IDoKCQltYXRjaGVyc1swXTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Cgl9CglyZXR1cm4gcmVzdWx0czsKfQoKZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsKCXZhciBlbGVtLAoJCW5ld1VubWF0Y2hlZCA9IFtdLAoJCWkgPSAwLAoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCgkJbWFwcGVkID0gbWFwICE9IG51bGw7CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCWlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCWlmICggbWFwcGVkICkgewoJCQkJCW1hcC5wdXNoKCBpICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG5ld1VubWF0Y2hlZDsKfQoKZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgewoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKCX0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKCX0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKCQl2YXIgdGVtcCwgaSwgZWxlbSwKCQkJcHJlTWFwID0gW10sCgkJCXBvc3RNYXAgPSBbXSwKCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0CgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCgoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CgkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6CgkJCQllbGVtcywKCgkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CgoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQoJCQkJCVtdIDoKCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5CgkJCQkJcmVzdWx0cyA6CgkJCQltYXRjaGVySW47CgoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCgkJaWYgKCBtYXRjaGVyICkgewoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwoJCX0KCgkJLy8gQXBwbHkgcG9zdEZpbHRlcgoJCWlmICggcG9zdEZpbHRlciApIHsKCQkJdGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKCgkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KCQkJaSA9IHRlbXAubGVuZ3RoOwoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggc2VlZCApIHsKCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKCQkJCWlmICggcG9zdEZpbmRlciApIHsKCQkJCQkvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHMKCQkJCQl0ZW1wID0gW107CgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAoJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CgkJCQl9CgoJCQkJLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCXdoaWxlICggaS0tICkgewoJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCQkvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSkKCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKCQkJcmV0dXJuIHJldDsKCQl9IF07CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKCQl9IGVsc2UgewoJCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7CgoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgoJCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZwoJCQkJaiA9ICsraTsKCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoCgkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCgkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmAKCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCgkJCQkJbWF0Y2hlciwKCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCgkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7CgkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAoJCQkJbWF0Y2hlZENvdW50ID0gMCwKCQkJCWkgPSAiMCIsCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAoJCQkJc2V0TWF0Y2hlZCA9IFtdLAoJCQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJtb3N0ICksCgkJCQkvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCgkJCQlsZW4gPSBlbGVtcy5sZW5ndGg7CgoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDsKCQkJfQoKCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCgkJCS8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlqID0gMDsKCQkJCQlpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7CgkJCQkJCXNldERvY3VtZW50KCBlbGVtICk7CgkJCQkJCXhtbCA9ICFkb2N1bWVudElzSFRNTDsKCQkJCQl9CgkJCQkJd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKCQkJCWlmICggYnlTZXQgKSB7CgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKCQkJCQkJbWF0Y2hlZENvdW50LS07CgkJCQkJfQoKCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CgkJCQkJaWYgKCBzZWVkICkgewoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YAoJCQkvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLgoJCQltYXRjaGVkQ291bnQgKz0gaTsKCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQkvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgCgkJCS8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQoJCQkvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLgoJCQkvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyAiMCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdAoJCQkvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvCgkJCS8vIG51bWVyaWNhbGx5IHplcm8uCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNlZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJCQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJaWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsKCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9ucwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKCS8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dCkKCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgoJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewoKCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbAoJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7CgkJCX0KCgkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOwoJCX0KCgkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJdG9rZW4gPSB0b2tlbnNbaV07CgoJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKCQkJCS8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycwoJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAoJCQkJCXJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKCQkJCSkpICkgewoKCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CgkJCQkJc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKCQkJCQlpZiAoICFzZWxlY3RvciApIHsKCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZAoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAoJCXNlZWQsCgkJY29udGV4dCwKCQkhZG9jdW1lbnRJc0hUTUwsCgkJcmVzdWx0cywKCQkhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CgkpOwoJcmV0dXJuIHJlc3VsdHM7Cn07CgovLyBPbmUtdGltZSBhc3NpZ25tZW50cwoKLy8gU29ydCBzdGFiaWxpdHkKc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CgovLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24Kc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7CgovLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKc2V0RG9jdW1lbnQoKTsKCi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgpzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKCXJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgovLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAppZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cn0pICkgewoJYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CgkJfQoJfSk7Cn0KCi8vIFN1cHBvcnQ6IElFPDkKLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKCWVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCXJldHVybiBlbC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKfSkgKSB7CglhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJdmFyIHZhbDsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CgkJCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KCQkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKCQl9Cgl9KTsKfQoKcmV0dXJuIFNpenpsZTsKCn0pKCB3aW5kb3cgKTsKCgoKalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKCi8vIERlcHJlY2F0ZWQKalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwpqUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlOwoKCgoKdmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJdmFyIG1hdGNoZWQgPSBbXSwKCQl0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CgoJd2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQlpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJbWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJfQoJfQoJcmV0dXJuIG1hdGNoZWQ7Cn07CgoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7Cgl2YXIgbWF0Y2hlZCA9IFtdOwoKCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CgkJCW1hdGNoZWQucHVzaCggbiApOwoJCX0KCX0KCglyZXR1cm4gbWF0Y2hlZDsKfTsKCgp2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKCgoKZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7CgogIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKfTsKdmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pICk7CgoKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewoJaWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwoJCX0gKTsKCX0KCgkvLyBTaW5nbGUgZWxlbWVudAoJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7CgkJfSApOwoJfQoKCS8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KQoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDsKCQl9ICk7Cgl9CgoJLy8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9ycwoJcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJfQoKCWlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJcmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTsKCX0KCglyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCX0gKSApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCByZXQsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfSApICk7CgkJfQoKCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTsKCgkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJcmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7Cgl9LAoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKCX0sCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5ndGg7Cgl9Cn0gKTsKCgovLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAoKCi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQp2YXIgcm9vdGpRdWVyeSwKCgkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCgkvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkCglycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLywKCglpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7CgkJdmFyIG1hdGNoLCBlbGVtOwoKCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCgkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CgkJLy8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKQoJCXJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCgkJCQlzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYKCQkJCXNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewoKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsgMSBdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDsKCgkJCQkJLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWyAxIF0sCgkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCgkJCQkJCXRydWUKCQkJCQkpICk7CgoJCQkJCS8vIEhBTkRMRTogJChodG1sLCBwcm9wcykKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCWZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7CgoJCQkJCQkJLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZQoJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CgkJCQkJCQkJdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOwoKCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQoJCQkJfSBlbHNlIHsKCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTsKCgkJCQkJaWYgKCBlbGVtICkgewoKCQkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpc1sgMCBdID0gZWxlbTsKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKCQkJdGhpc1sgMCBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID8KCQkJCXJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgoKCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKCQkJCXNlbGVjdG9yKCBqUXVlcnkgKTsKCQl9CgoJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwoJfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgovLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CgoKdmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoKCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWwgPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSAwOwoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CgkJdmFyIGN1ciwKCQkJaSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJbWF0Y2hlZCA9IFtdLAoJCQl0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTsKCgkJLy8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dAoJCWlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgoJCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID8KCQkJCQkJdGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6CgoJCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKCQkJCQkJY3VyLm5vZGVUeXBlID09PSAxICYmCgkJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKCgkJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBJbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLAoKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQoJCSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZVNvcnQoCgkJCQlqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCgkJCSkKCQkpOwoJfSwKCglhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Cn0gKTsKCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJd2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goIHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewogICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDsKICAgICAgICB9CgogICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seQogICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdAogICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgInRlbXBsYXRlIiApICkgewogICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CgoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcwoJCQlpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCQltYXRjaGVkLnJldmVyc2UoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7Cgl9Owp9ICk7CnZhciBybm90aHRtbHdoaXRlID0gKCAvW15ceDIwXHRcclxuXGZdKy9nICk7CgoKCi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0ge307CglqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9ICk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoKICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCWNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZwoJCWZpcmluZywKCgkJLy8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMKCQltZW1vcnksCgoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCgkJZmlyZWQsCgoJCS8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmcKCQlsb2NrZWQsCgoJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoKCQkvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXF1ZXVlID0gW10sCgoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKQoJCWZpcmluZ0luZGV4ID0gLTEsCgoJCS8vIEZpcmUgY2FsbGJhY2tzCgkJZmlyZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nCgkJCWxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7CgoJCQkvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucywKCQkJLy8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlcwoJCQlmaXJlZCA9IGZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkgewoJCQkJbWVtb3J5ID0gcXVldWUuc2hpZnQoKTsKCQkJCXdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgewoKCQkJCQkvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvbgoJCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmCgkJCQkJCW9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgoJCQkJCQkvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCgkJCQkJCWZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7CgkJCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdAoJCQlpZiAoICFvcHRpb25zLm1lbW9yeSApIHsKCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQl9CgoJCQlmaXJpbmcgPSBmYWxzZTsKCgkJCS8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kCgkJCWlmICggbG9ja2VkICkgewoKCQkJCS8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHMKCQkJCWlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCgkJCQkvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50CgkJCQl9IGVsc2UgewoJCQkJCWxpc3QgPSAiIjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCgkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCgkJCQkJLy8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmcKCQkJCQlpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewoJCQkJCQlmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTsKCQkJCQkJcXVldWUucHVzaCggbWVtb3J5ICk7CgkJCQkJfQoKCQkJCQkoIGZ1bmN0aW9uIGFkZCggYXJncyApIHsKCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCQlpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gInN0cmluZyIgKSB7CgoJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKCQkJCQkJCQlhZGQoIGFyZyApOwoJCQkJCQkJfQoJCQkJCQl9ICk7CgkJCQkJfSApKCBhcmd1bWVudHMgKTsKCgkJCQkJaWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHsKCQkJCQkJZmlyZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJCQl2YXIgaW5kZXg7CgkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7CgkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoKCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQlmaXJpbmdJbmRleC0tOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CgkJCQlyZXR1cm4gZm4gPwoJCQkJCWpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOgoJCQkJCWxpc3QubGVuZ3RoID4gMDsKCQkJfSwKCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZAoJCQkvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnMKCQkJLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbG9ja2VkID0gcXVldWUgPSBbXTsKCQkJCWxpc3QgPSBtZW1vcnkgPSAiIjsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgoJCQkvLyBEaXNhYmxlIC5maXJlCgkJCS8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpCgkJCS8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlsb2NrZWQgPSBxdWV1ZSA9IFtdOwoJCQkJaWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7CgkJCQkJbGlzdCA9IG1lbW9yeSA9ICIiOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFsb2NrZWQ7CgkJCX0sCgoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWlmICggIWxvY2tlZCApIHsKCQkJCQlhcmdzID0gYXJncyB8fCBbXTsKCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOwoJCQkJCXF1ZXVlLnB1c2goIGFyZ3MgKTsKCQkJCQlpZiAoICFmaXJpbmcgKSB7CgkJCQkJCWZpcmUoKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CgoKZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7CglyZXR1cm4gdjsKfQpmdW5jdGlvbiBUaHJvd2VyKCBleCApIHsKCXRocm93IGV4Owp9CgpmdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkgewoJdmFyIG1ldGhvZDsKCgl0cnkgewoKCQkvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yCgkJaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkgewoJCQltZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7CgoJCS8vIE90aGVyIHRoZW5hYmxlcwoJCX0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7CgkJCW1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7CgoJCS8vIE90aGVyIG5vbi10aGVuYWJsZXMKCQl9IGVsc2UgewoKCQkJLy8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOgoJCQkvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApCgkJCS8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpCgkJCXJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTsKCQl9CgoJLy8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zCgkvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluCgkvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLgoJfSBjYXRjaCAoIHZhbHVlICkgewoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5CgkJLy8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dAoJCXJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCggewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoKCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsCgkJCQkvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJtZW1vcnkiICksIDIgXSwKCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKCQkJCQlqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIDAsICJyZXNvbHZlZCIgXSwKCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwgMSwgInJlamVjdGVkIiBdCgkJCV0sCgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJCSJjYXRjaCI6IGZ1bmN0aW9uKCBmbiApIHsKCQkJCQlyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApOwoJCQkJfSwKCgkJCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJCQlwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CgkJCQkJdmFyIGZucyA9IGFyZ3VtZW50czsKCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgoJCQkJCQkJLy8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpCgkJCQkJCQl2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdOwoKCQkJCQkJCS8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KQoJCQkJCQkJLy8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pCgkJCQkJCQkvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KQoJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKAoJCQkJCQkJCQkJdGhpcywKCQkJCQkJCQkJCWZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzCgkJCQkJCQkJCSk7CgkJCQkJCQkJfQoJCQkJCQkJfSApOwoJCQkJCQl9ICk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSApLnByb21pc2UoKTsKCQkJCX0sCgkJCQl0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7CgkJCQkJdmFyIG1heERlcHRoID0gMDsKCQkJCQlmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7CgkJCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkJCXZhciB0aGF0ID0gdGhpcywKCQkJCQkJCQlhcmdzID0gYXJndW1lbnRzLAoJCQkJCQkJCW1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyIHJldHVybmVkLCB0aGVuOwoKCQkJCQkJCQkJLy8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjMKCQkJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTkKCQkJCQkJCQkJLy8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzCgkJCQkJCQkJCWlmICggZGVwdGggPCBtYXhEZXB0aCApIHsKCQkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7CgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xCgkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4CgkJCQkJCQkJCWlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHsKCQkJCQkJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iICk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNQoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NAoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NQoJCQkJCQkJCQkvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlCgkJCQkJCQkJCXRoZW4gPSByZXR1cm5lZCAmJgoKCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjQKCQkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0CgkJCQkJCQkJCQkvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHkKCQkJCQkJCQkJCSggdHlwZW9mIHJldHVybmVkID09PSAib2JqZWN0IiB8fAoJCQkJCQkJCQkJCXR5cGVvZiByZXR1cm5lZCA9PT0gImZ1bmN0aW9uIiApICYmCgkJCQkJCQkJCQlyZXR1cm5lZC50aGVuOwoKCQkJCQkJCQkJLy8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGUKCQkJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7CgoJCQkJCQkJCQkJLy8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvbgoJCQkJCQkJCQkJaWYgKCBzcGVjaWFsICkgewoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICkKCQkJCQkJCQkJCQkpOwoKCQkJCQkJCQkJCS8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzcwoJCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkJLy8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlcwoJCQkJCQkJCQkJCW1heERlcHRoKys7CgoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksCgkJCQkJCQkJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoICkKCQkJCQkJCQkJCQkpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXMKCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0CgkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCWlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7CgkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQlhcmdzID0gWyByZXR1cm5lZCBdOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpCgkJCQkJCQkJCQkvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZQoJCQkJCQkJCQkJKCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0sCgoJCQkJCQkJCS8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9ucwoJCQkJCQkJCXByb2Nlc3MgPSBzcGVjaWFsID8KCQkJCQkJCQkJbWlnaHRUaHJvdyA6CgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJCQltaWdodFRocm93KCk7CgkJCQkJCQkJCQl9IGNhdGNoICggZSApIHsKCgkJCQkJCQkJCQkJaWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHsKCQkJCQkJCQkJCQkJalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsCgkJCQkJCQkJCQkJCQlwcm9jZXNzLnN0YWNrVHJhY2UgKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjEKCQkJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MQoJCQkJCQkJCQkJCS8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9ucwoJCQkJCQkJCQkJCWlmICggZGVwdGggKyAxID49IG1heERlcHRoICkgewoKCQkJCQkJCQkJCQkJLy8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dAoJCQkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCQkJaWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkgewoJCQkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQkJCWFyZ3MgPSBbIGUgXTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJfTsKCgkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMQoJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTcKCQkJCQkJCS8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb20KCQkJCQkJCS8vIHN1YnNlcXVlbnQgZXJyb3JzCgkJCQkJCQlpZiAoIGRlcHRoICkgewoJCQkJCQkJCXByb2Nlc3MoKTsKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCS8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvbgoJCQkJCQkJCS8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luYwoJCQkJCQkJCWlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHsKCQkJCQkJCQkJcHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpOwoJCQkJCQkJCX0KCQkJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApOwoJCQkJCQkJfQoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoKCQkJCQkJLy8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKQoJCQkJCQl0dXBsZXNbIDAgXVsgMyBdLmFkZCgKCQkJCQkJCXJlc29sdmUoCgkJCQkJCQkJMCwKCQkJCQkJCQluZXdEZWZlciwKCQkJCQkJCQlpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgPwoJCQkJCQkJCQlvblByb2dyZXNzIDoKCQkJCQkJCQkJSWRlbnRpdHksCgkJCQkJCQkJbmV3RGVmZXIubm90aWZ5V2l0aAoJCQkJCQkJKQoJCQkJCQkpOwoKCQkJCQkJLy8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAxIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/CgkJCQkJCQkJCW9uRnVsZmlsbGVkIDoKCQkJCQkJCQkJSWRlbnRpdHkKCQkJCQkJCSkKCQkJCQkJKTsKCgkJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAyIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25SZWplY3RlZCApID8KCQkJCQkJCQkJb25SZWplY3RlZCA6CgkJCQkJCQkJCVRocm93ZXIKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQl9ICkucHJvbWlzZSgpOwoJCQkJfSwKCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwKCQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdOwoKCQkJLy8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkCgkJCXByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVTdHJpbmcgKSB7CgkJCQlsaXN0LmFkZCgKCQkJCQlmdW5jdGlvbigpIHsKCgkJCQkJCS8vIHN0YXRlID0gInJlc29sdmVkIiAoaS5lLiwgZnVsZmlsbGVkKQoJCQkJCQkvLyBzdGF0ZSA9ICJyZWplY3RlZCIKCQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKCQkJCQl9LAoKCQkJCQkvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCS8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsCgoJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGUKCQkJCQkvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsCgoJCQkJCS8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDIgXS5sb2NrLAoKCQkJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDMgXS5sb2NrCgkJCQkpOwoJCQl9CgoJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlCgkJCS8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlCgkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmUKCQkJbGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApOwoKCQkJLy8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfQoJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7CgkJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgoJCQkvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aAoJCQkvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJLy8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSApOwoKCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CgoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoKCQkvLyBBbGwgZG9uZSEKCQlyZXR1cm4gZGVmZXJyZWQ7Cgl9LAoKCS8vIERlZmVycmVkIGhlbHBlcgoJd2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkgewoJCXZhcgoKCQkJLy8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCgkJCXJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsCgoJCQkvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHMKCQkJaSA9IHJlbWFpbmluZywKCgkJCS8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGEKCQkJcmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSwKCQkJcmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoKCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZAoJCQltYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCgkJCS8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3RvcnkKCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwoJCQkJCWlmICggISggLS1yZW1haW5pbmcgKSApIHsKCQkJCQkJbWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoKCQkvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmUKCQlpZiAoIHJlbWFpbmluZyA8PSAxICkgewoJCQlhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsCgkJCQkhcmVtYWluaW5nICk7CgoJCQkvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApCgkJCWlmICggbWFzdGVyLnN0YXRlKCkgPT09ICJwZW5kaW5nIiB8fAoJCQkJaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7CgoJCQkJcmV0dXJuIG1hc3Rlci50aGVuKCk7CgkJCX0KCQl9CgoJCS8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzCgkJd2hpbGUgKCBpLS0gKSB7CgkJCWFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7CgkJfQoKCQlyZXR1cm4gbWFzdGVyLnByb21pc2UoKTsKCX0KfSApOwoKCi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LAovLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC4KdmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87CgpqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7CgoJLy8gU3VwcG9ydDogSUUgOCAtIDkgb25seQoJLy8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKCWlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7CgkJd2luZG93LmNvbnNvbGUud2FybiggImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTsKCX0KfTsKCgoKCmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQl0aHJvdyBlcnJvcjsKCX0gKTsKfTsKCgoKCi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQp2YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgoJcmVhZHlMaXN0CgkJLnRoZW4oIGZuICkKCgkJLy8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXAKCQkvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2sKCQkvLyByZWdpc3RyYXRpb24uCgkJLmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7CgkJCWpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTsKCQl9ICk7CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KCWlzUmVhZHk6IGZhbHNlLAoKCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCglyZWFkeVdhaXQ6IDEsCgoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewoKCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CgkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCX0KfSApOwoKalF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjsKCi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHsKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKCWpRdWVyeS5yZWFkeSgpOwp9CgovLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZAovLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seQovLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyAiaW50ZXJhY3RpdmUiIHRvbyBzb29uCmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fAoJKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkgewoKCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwoKfSBlbHNlIHsKCgkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCApOwoKCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKfQoKCgoKLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgp2YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGVsZW1zLmxlbmd0aCwKCQlidWxrID0ga2V5ID09IG51bGw7CgoJLy8gU2V0cyBtYW55IHZhbHVlcwoJaWYgKCB0b1R5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKCQljaGFpbmFibGUgPSB0cnVlOwoJCWZvciAoIGkgaW4ga2V5ICkgewoJCQlhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8gU2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmF3ID0gdHJ1ZTsKCQl9CgoJCWlmICggYnVsayApIHsKCgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0KCQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQkJZm4oCgkJCQkJZWxlbXNbIGkgXSwga2V5LCByYXcgPwoJCQkJCXZhbHVlIDoKCQkJCQl2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQoJCQkJKTsKCQkJfQoJCX0KCX0KCglpZiAoIGNoYWluYWJsZSApIHsKCQlyZXR1cm4gZWxlbXM7Cgl9CgoJLy8gR2V0cwoJaWYgKCBidWxrICkgewoJCXJldHVybiBmbi5jYWxsKCBlbGVtcyApOwoJfQoKCXJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDsKfTsKCgovLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKdmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7CgovLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7CglyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Cn0KCi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQovLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkgewoJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwp9CnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgewoKCS8vIEFjY2VwdHMgb25seToKCS8vICAtIE5vZGUKCS8vICAgIC0gTm9kZS5FTEVNRU5UX05PREUKCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCgkvLyAgLSBPYmplY3QKCS8vICAgIC0gQW55CglyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cn07CgoKCgpmdW5jdGlvbiBEYXRhKCkgewoJdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwp9CgpEYXRhLnVpZCA9IDE7CgpEYXRhLnByb3RvdHlwZSA9IHsKCgljYWNoZTogZnVuY3Rpb24oIG93bmVyICkgewoKCQkvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUKCQl2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCS8vIElmIG5vdCwgY3JlYXRlIG9uZQoJCWlmICggIXZhbHVlICkgewoJCQl2YWx1ZSA9IHt9OwoKCQkJLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCgkJCS8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCgkJCS8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LgoJCQlpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CgoJCQkJLy8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlcgoJCQkJLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQKCQkJCWlmICggb3duZXIubm9kZVR5cGUgKSB7CgkJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7CgoJCQkJLy8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5CgkJCQkvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQoJCQkJLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoJCQkJfSBlbHNlIHsKCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHsKCQkJCQkJdmFsdWU6IHZhbHVlLAoJCQkJCQljb25maWd1cmFibGU6IHRydWUKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB2YWx1ZTsKCX0sCglzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CgkJdmFyIHByb3AsCgkJCWNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJncwoJCS8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1NykKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJY2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKCQl9IGVsc2UgewoKCQkJLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKCQkJZm9yICggcHJvcCBpbiBkYXRhICkgewoJCQkJY2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07CgkJCX0KCQl9CgkJcmV0dXJuIGNhY2hlOwoJfSwKCWdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcy5jYWNoZSggb3duZXIgKSA6CgoJCQkvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpCgkJCW93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTsKCX0sCglhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHsKCgkJLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAoJCS8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAoJCS8vCgkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQoJCS8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKCQkvLwoJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKCQkvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5CgkJLy8KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CgkJCQkoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7CgkJfQoKCQkvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQoJCS8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwoJCS8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCgkJLy8KCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKCgkJLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cwoJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQoJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7Cgl9LAoJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKCQl2YXIgaSwKCQkJY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCWlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzCgkJCWlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7CgoJCQkJLy8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KCQkJCS8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LgoJCQkJa2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7CgkJCX0gZWxzZSB7CgkJCQlrZXkgPSBjYW1lbENhc2UoIGtleSApOwoKCQkJCS8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC4KCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCgkJCQlrZXkgPSBrZXkgaW4gY2FjaGUgPwoJCQkJCVsga2V5IF0gOgoJCQkJCSgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTsKCQkJfQoKCQkJaSA9IGtleS5sZW5ndGg7CgoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKCgkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUKCQkJLy8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKCQkJLy8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZAoJCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKQoJCQlpZiAoIG93bmVyLm5vZGVUeXBlICkgewoJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKCQkJfQoJCX0KCX0sCgloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CgkJdmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdOwoJCXJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTsKCX0KfTsKdmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTsKCnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7CgoKCi8vCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKLy8KLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAovLwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLy8JCXBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS4KLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgovLwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQovLwk1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcykKLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0Cgp2YXIgcmJyYWNlID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvW0EtWl0vZzsKCmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7CglpZiAoIGRhdGEgPT09ICJ0cnVlIiApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGRhdGEgPT09ICJmYWxzZSIgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggZGF0YSA9PT0gIm51bGwiICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCglpZiAoIGRhdGEgPT09ICtkYXRhICsgIiIgKSB7CgkJcmV0dXJuICtkYXRhOwoJfQoKCWlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHsKCQlyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApOwoJfQoKCXJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewoJdmFyIG5hbWU7CgoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNhc2UoKTsKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0gZ2V0RGF0YSggZGF0YSApOwoJCQl9IGNhdGNoICggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCXJldHVybiBkYXRhOwp9CgpqUXVlcnkuZXh0ZW5kKCB7CgloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTsKCX0sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWQKCS8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKCX0sCgoJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaSwgbmFtZSwgZGF0YSwKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJYXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgImhhc0RhdGFBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUgMTEgb25seQoJCQkJCQkvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NCkKCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgewoJCQkJCQkJbmFtZSA9IGF0dHJzWyBpIF0ubmFtZTsKCQkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CgkJCQkJCQkJbmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTsKCQkJfSApOwoJCX0KCgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZGF0YTsKCgkJCS8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CgkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCgkJCS8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0CgkJCS8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KCQkJaWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZQoJCQkJLy8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGEKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gQXR0ZW1wdCB0byAiZGlzY292ZXIiIHRoZSBkYXRhIGluCgkJCQkvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCgkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRhdGEuLi4KCQkJdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCgkJCQkvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5CgkJCQlkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApOwoJCX0gKTsKCX0KfSApOwoKCmpRdWVyeS5leHRlbmQoIHsKCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKCQl2YXIgcXVldWU7CgoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwoJCQlxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApOwoKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJcXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWV1ZS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOwoJCX0KCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCgkJCW5leHQgPSBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CgkJCX07CgoJCS8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkJc3RhcnRMZW5ndGgtLTsKCQl9CgoJCWlmICggZm4gKSB7CgoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CgkJCX0KCgkJCS8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CgkJfQoKCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCX0KCX0sCgoJLy8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmUKCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKCQlyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwgewoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLmFkZCggZnVuY3Rpb24oKSB7CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1ZSIsIGtleSBdICk7CgkJCX0gKQoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWyAwIF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9ICk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSApOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoKCS8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsKCQl2YXIgdG1wLAoJCQljb3VudCA9IDEsCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IHRoaXMubGVuZ3RoLAoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwoJCQkJfQoJCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJb2JqID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJd2hpbGUgKCBpLS0gKSB7CgkJCXRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0gKTsKdmFyIHBudW0gPSAoIC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8gKS5zb3VyY2U7Cgp2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CgoKdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKCnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgoJCS8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwoJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAoJCWVsZW0gPSBlbCB8fCBlbGVtOwoKCQkvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbAoJCXJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fAoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmCgoJCQkvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlCgkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1CgkJCS8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpcwoJCQkvLyBpbiB0aGUgZG9jdW1lbnQuCgkJCWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiYKCgkJCWpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSI7Cgl9OwoKdmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Cgl2YXIgcmV0LCBuYW1lLAoJCW9sZCA9IHt9OwoKCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCX0KCglyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwoKCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQoKCXJldHVybiByZXQ7Cn07CgoKCgpmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgewoJdmFyIGFkanVzdGVkLCBzY2FsZSwKCQltYXhJdGVyYXRpb25zID0gMjAsCgkJY3VycmVudFZhbHVlID0gdHdlZW4gPwoJCQlmdW5jdGlvbigpIHsKCQkJCXJldHVybiB0d2Vlbi5jdXIoKTsKCQkJfSA6CgkJCWZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsICIiICk7CgkJCX0sCgkJaW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLAoJCXVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAoKCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCWluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKCQkJcmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTsKCglpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgewoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTQKCQkvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpCgkJaW5pdGlhbCA9IGluaXRpYWwgLyAyOwoKCQkvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzCgkJdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdOwoKCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCWluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxOwoKCQl3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHsKCgkJCS8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuCgkJCS8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS4KCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApOwoJCQlpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHsKCQkJCW1heEl0ZXJhdGlvbnMgPSAwOwoJCQl9CgkJCWluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CgoJCX0KCgkJaW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyOwoJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTsKCgkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCXZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdOwoJfQoKCWlmICggdmFsdWVQYXJ0cyApIHsKCQlpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDsKCgkJLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkCgkJYWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gPwoJCQlpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOgoJCQkrdmFsdWVQYXJ0c1sgMiBdOwoJCWlmICggdHdlZW4gKSB7CgkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQl0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7CgkJCXR3ZWVuLmVuZCA9IGFkanVzdGVkOwoJCX0KCX0KCXJldHVybiBhZGp1c3RlZDsKfQoKCnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9OwoKZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7Cgl2YXIgdGVtcCwKCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCgkJbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLAoJCWRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTsKCglpZiAoIGRpc3BsYXkgKSB7CgkJcmV0dXJuIGRpc3BsYXk7Cgl9CgoJdGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApOwoJZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsICJkaXNwbGF5IiApOwoKCXRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApOwoKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCWRpc3BsYXkgPSAiYmxvY2siOwoJfQoJZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZGlzcGxheSwgZWxlbSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCS8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZQoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoKCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwoJCWlmICggc2hvdyApIHsKCgkJCS8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdykKCQkJLy8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyCgkJCS8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZCkKCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJkaXNwbGF5IiApIHx8IG51bGw7CgkJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CgkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQl9CgkJCX0KCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gIm5vbmUiOwoKCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmcKCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvdwoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkgewoJCQllbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgewoJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CgkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0gKTsKCX0KfSApOwp2YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7Cgp2YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pICk7Cgp2YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApOwoKCgovLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKQp2YXIgd3JhcE1hcCA9IHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCgkvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZQoJLy8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlbgoJLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgoJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgljb2w6IFsgMiwgIjx0YWJsZT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAoKCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCn07CgovLyBTdXBwb3J0OiBJRSA8PTkgb25seQp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Cgp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5CgkvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpCgl2YXIgcmV0OwoKCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgewoJCXJldCA9IFtdOwoJfQoKCWlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHsKCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKCi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZApmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Cgl2YXIgaSA9IDAsCgkJbCA9IGVsZW1zLmxlbmd0aDsKCglmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJZGF0YVByaXYuc2V0KAoJCQllbGVtc1sgaSBdLAoJCQkiZ2xvYmFsRXZhbCIsCgkJCSFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCgkJKTsKCX0KfQoKCnZhciByaHRtbCA9IC88fCYjP1x3KzsvOwoKZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKCXZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlub2RlcyA9IFtdLAoJCWkgPSAwLAoJCWwgPSBlbGVtcy5sZW5ndGg7CgoJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1sgaSBdOwoKCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKCgkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQoJCQlpZiAoIHRvVHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQoJCQl9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CgoJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKCQkJfSBlbHNlIHsKCQkJCXRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CgoJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgoJCQkJdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwoJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07CgoJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CgkJCQlqID0gd3JhcFsgMCBdOwoJCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQkJdG1wID0gdG1wLmxhc3RDaGlsZDsKCQkJCX0KCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CgoJCQkJLy8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIKCQkJCXRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQkJLy8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKQoJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9Cgl9CgoJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAoJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKCglpID0gMDsKCXdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CgoJCS8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpCgkJaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7CgkJCWlmICggaWdub3JlZCApIHsKCQkJCWlnbm9yZWQucHVzaCggZWxlbSApOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCgkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKCQl0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlpZiAoIGNvbnRhaW5zICkgewoJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKCQl9CgoJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKCQlpZiAoIHNjcmlwdHMgKSB7CgkJCWogPSAwOwoJCQl3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHsKCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGZyYWdtZW50Owp9CgoKKCBmdW5jdGlvbigpIHsKCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApLAoJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHkKCS8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpCgkvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCgkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAicmFkaW8iICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seQoJLy8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZAoJZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOwp9ICkoKTsKdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgoKdmFyCglya2V5RXZlbnQgPSAvXmtleS8sCglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkvOwoKZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKCXJldHVybiBmYWxzZTsKfQoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvCmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewoJdHJ5IHsKCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCX0gY2F0Y2ggKCBlcnIgKSB7IH0KfQoKZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHsKCXZhciBvcmlnRm4sIHR5cGU7CgoJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCglpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCW9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJfQoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgoJCS8vICggdHlwZXMsIGZuICkKCQlmbiA9IHNlbGVjdG9yOwoJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0gZWxzZSB7CgoJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9Cgl9CglpZiAoIGZuID09PSBmYWxzZSApIHsKCQlmbiA9IHJldHVybkZhbHNlOwoJfSBlbHNlIGlmICggIWZuICkgewoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggb25lID09PSAxICkgewoJCW9yaWdGbiA9IGZuOwoJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCgkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKCX0KCXJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkgewoJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCX0gKTsKfQoKLyoKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCWdsb2JhbDoge30sCgoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewoKCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCgkJCWV2ZW50cywgdCwgaGFuZGxlT2JqLAoJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCgkJCWVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZQoJCS8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KQoJCWlmICggc2VsZWN0b3IgKSB7CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAoJCWlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7CgkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OwoJCX0KCQlpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7CgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPwoJCQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCgkJCWlmICggIXR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCgkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9yaWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oICIuIiApCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQlpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fAoJCQkJCXNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CgoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2UgewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJfSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCgkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCWlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwoJCQl0bXAgPSB0bXBbIDIgXSAmJgoJCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOwoJCQl3aGlsZSAoIGotLSApIHsKCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CgoJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgoJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCgkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgoJCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwKCQkJCQkJc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CgkJCQkJfQoJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwKCQkJCQlzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCgkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CgkJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgImhhbmRsZSBldmVudHMiICk7CgkJfQoJfSwKCglkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkgewoKCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKCQl2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApOwoKCQl2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSwKCQkJYXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLAoJCQloYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJCS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1sgMCBdID0gZXZlbnQ7CgoJCWZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewoJCQlhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTsKCQl9CgoJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJd2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CgoJCQlqID0gMDsKCQkJd2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiYKCQkJCSFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoKCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2UocykKCQkJCS8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgoJCQkJaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKCgkJCQkJcmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fAoJCQkJCQloYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycywKCQkJaGFuZGxlclF1ZXVlID0gW10sCgkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAoJCQljdXIgPSBldmVudC50YXJnZXQ7CgoJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OQoJCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MCkKCQkJY3VyLm5vZGVUeXBlICYmCgoJCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDIKCQkJLy8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKQoJCQkvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrCgkJCS8vIFN1cHBvcnQ6IElFIDExIG9ubHkKCQkJLy8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgImNsaWNrcyIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0MykKCQkJISggZXZlbnQudHlwZSA9PT0gImNsaWNrIiAmJiBldmVudC5idXR0b24gPj0gMSApICkgewoKCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CgoJCQkJLy8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpCgkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09ICJjbGljayIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7CgkJCQkJbWF0Y2hlZEhhbmRsZXJzID0gW107CgkJCQkJbWF0Y2hlZFNlbGVjdG9ycyA9IHt9OwoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgewoJCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwoKCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwoKCQkJCQkJaWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7CgkJCQkJCQltYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycwoJCWN1ciA9IHRoaXM7CgkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewoJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTsKCQl9CgoJCXJldHVybiBoYW5kbGVyUXVldWU7Cgl9LAoKCWFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkgewoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwgewoJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQljb25maWd1cmFibGU6IHRydWUsCgoJCQlnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/CgkJCQlmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHsKCQkJCQkJCXJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTsKCQkJCQl9CgkJCQl9IDoKCQkJCWZ1bmN0aW9uKCkgewoJCQkJCWlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkgewoJCQkJCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdOwoJCQkJCX0KCQkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwgewoJCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCQkJCXdyaXRhYmxlOiB0cnVlLAoJCQkJCXZhbHVlOiB2YWx1ZQoJCQkJfSApOwoJCQl9CgkJfSApOwoJfSwKCglmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkgewoJCXJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KCQkJb3JpZ2luYWxFdmVudCA6CgkJCW5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCgkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKCQkJbm9CdWJibGU6IHRydWUKCQl9LAoJCWZvY3VzOiB7CgoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgoJCX0sCgkJYmx1cjogewoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKCQl9LAoJCWNsaWNrOiB7CgoJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKCQkJCQl0aGlzLmNsaWNrKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoKCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCgkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlyZXR1cm4gbm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCgkvLyBUaGlzICJpZiIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzCglpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApOwoJfQp9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKCQkJCXNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiYKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkKCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7CgoJCS8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllcwoJCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHkKCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCXRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/CgkJCXNyYy50YXJnZXQucGFyZW50Tm9kZSA6CgkJCXNyYy50YXJnZXQ7CgoJCXRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0OwoJCXRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0OwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwovLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzU2ltdWxhdGVkOiBmYWxzZSwKCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJfQoKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfQp9OwoKLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHMKalF1ZXJ5LmVhY2goIHsKCWFsdEtleTogdHJ1ZSwKCWJ1YmJsZXM6IHRydWUsCgljYW5jZWxhYmxlOiB0cnVlLAoJY2hhbmdlZFRvdWNoZXM6IHRydWUsCgljdHJsS2V5OiB0cnVlLAoJZGV0YWlsOiB0cnVlLAoJZXZlbnRQaGFzZTogdHJ1ZSwKCW1ldGFLZXk6IHRydWUsCglwYWdlWDogdHJ1ZSwKCXBhZ2VZOiB0cnVlLAoJc2hpZnRLZXk6IHRydWUsCgl2aWV3OiB0cnVlLAoJImNoYXIiOiB0cnVlLAoJY2hhckNvZGU6IHRydWUsCglrZXk6IHRydWUsCglrZXlDb2RlOiB0cnVlLAoJYnV0dG9uOiB0cnVlLAoJYnV0dG9uczogdHJ1ZSwKCWNsaWVudFg6IHRydWUsCgljbGllbnRZOiB0cnVlLAoJb2Zmc2V0WDogdHJ1ZSwKCW9mZnNldFk6IHRydWUsCglwb2ludGVySWQ6IHRydWUsCglwb2ludGVyVHlwZTogdHJ1ZSwKCXNjcmVlblg6IHRydWUsCglzY3JlZW5ZOiB0cnVlLAoJdGFyZ2V0VG91Y2hlczogdHJ1ZSwKCXRvRWxlbWVudDogdHJ1ZSwKCXRvdWNoZXM6IHRydWUsCgoJd2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uOwoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJcmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkgewoJCQlpZiAoIGJ1dHRvbiAmIDEgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCBidXR0b24gJiAyICkgewoJCQkJcmV0dXJuIDM7CgkJCX0KCgkJCWlmICggYnV0dG9uICYgNCApIHsKCQkJCXJldHVybiAyOwoJCQl9CgoJCQlyZXR1cm4gMDsKCQl9CgoJCXJldHVybiBldmVudC53aGljaDsKCX0KfSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwovLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LgovLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dAovLwovLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5Ci8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNTgKLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4KalF1ZXJ5LmVhY2goIHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKCXBvaW50ZXJlbnRlcjogInBvaW50ZXJvdmVyIiwKCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCWRlbGVnYXRlVHlwZTogZml4LAoJCWJpbmRUeXBlOiBmaXgsCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcmV0LAoJCQkJdGFyZ2V0ID0gdGhpcywKCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAoJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwoKCQkJLy8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewoJCXJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8KCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDoKCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9ICk7Cgl9Cn0gKTsKCgp2YXIKCgkvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgoJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5CglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksCgoJLyogZXNsaW50LWVuYWJsZSAqLwoKCS8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHkKCS8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuCgkvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLwoJcm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksCgoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKCi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93cwpmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglpZiAoIG5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgKSB7CgoJCXJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggInRib2R5IiApWyAwIF0gfHwgZWxlbTsKCX0KCglyZXR1cm4gZWxlbTsKfQoKLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgpmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgewoJZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICkgIT09IG51bGwgKSArICIvIiArIGVsZW0udHlwZTsKCXJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CglpZiAoICggZWxlbS50eXBlIHx8ICIiICkuc2xpY2UoIDAsIDUgKSA9PT0gInRydWUvIiApIHsKCQllbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTsKCX0gZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoICJ0eXBlIiApOwoJfQoKCXJldHVybiBlbGVtOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoJdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgoJaWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKCQlwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7CgkJcGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CgkJZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CgoJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyAyLiBDb3B5IHVzZXIgZGF0YQoJaWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHsKCQl1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7CgkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKCgkJZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOwoJfQp9CgovLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoJfQp9CgpmdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7CgoJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJYXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgl2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsCgkJaSA9IDAsCgkJbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAoJCWlOb0Nsb25lID0gbCAtIDEsCgkJdmFsdWUgPSBhcmdzWyAwIF0sCgkJdmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCWlmICggdmFsdWVJc0Z1bmN0aW9uIHx8CgkJCSggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJgoJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQl2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7CgkJCWlmICggdmFsdWVJc0Z1bmN0aW9uICkgewoJCQkJYXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7CgkJCX0KCQkJZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CgkJfSApOwoJfQoKCWlmICggbCApIHsKCQlmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApOwoJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQl9CgoJCS8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjawoJCWlmICggZmlyc3QgfHwgaWdub3JlZCApIHsKCQkJc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOwoKCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbQoJCQkvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJbm9kZSA9IGZyYWdtZW50OwoKCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CgkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwoKCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJCQkJaWYgKCBoYXNTY3JpcHRzICkgewoKCQkJCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJCQl9CgkJCQl9CgoJCQkJY2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7CgkJCX0KCgkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CgoJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwoJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOwoKCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewoJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07CgkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgoJCQkJCQkhZGF0YVByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgoJCQkJCQlqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJaWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCAiIiApLnRvTG93ZXJDYXNlKCkgICE9PSAibW9kdWxlIiApIHsKCgkJCQkJCQkvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudAoJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CgkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICksIGRvYywgbm9kZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBjb2xsZWN0aW9uOwp9CgpmdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCXZhciBub2RlLAoJCW5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSwKCQlpID0gMDsKCglmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7CgkJaWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKCQl9CgoJCWlmICggbm9kZS5wYXJlbnROb2RlICkgewoJCQlpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7CgkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJfQoJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTsKCQl9Cgl9CgoJcmV0dXJuIGVsZW07Cn0KCmpRdWVyeS5leHRlbmQoIHsKCWh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAoJCQlpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCgkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgoJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJCX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKCQkJaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCQlpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkgewoJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CgkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CgoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJaWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgkJfQoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOwoJfSwKCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwoJCQkJCX0KCQkJCX0gKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0gKTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKCQkJCXRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0gKTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwoKCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7CgkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOwoKCQlyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0gKTsKCX0sCgoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CgoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2ggKCBlICkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgaWdub3JlZCA9IFtdOwoKCQkvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnQKCQlyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQlpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkgewoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKCQkJCWlmICggcGFyZW50ICkgewoJCQkJCXBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJCX0KCQkJfQoKCQkvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uCgkJfSwgaWdub3JlZCApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAoJCQlpID0gMDsKCgkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKCQkJalF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0gKTsKdmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApOwoKdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApCgkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCgkJLy8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoICJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlIgoJCXZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQlpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHsKCQkJdmlldyA9IHdpbmRvdzsKCQl9CgoJCXJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTsKCX07Cgp2YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oICJ8IiApLCAiaSIgKTsKCgoKKCBmdW5jdGlvbigpIHsKCgkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQKCS8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uCglmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHsKCgkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZQoJCWlmICggIWRpdiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4OyIgKwoJCQkibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIjsKCQlkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7IiArCgkJCSJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4OyIgKwoJCQkid2lkdGg6NjAlO3RvcDoxJSI7CgkJZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTsKCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0CgkJcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjMKCQkvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3QKCQlkaXYuc3R5bGUucmlnaHQgPSAiNjAlIjsKCQlwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkJLy8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50cwoJCWJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjsKCgkJLy8gU3VwcG9ydDogSUUgOSBvbmx5CgkJLy8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KQoJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgImFic29sdXRlIjsKCgkJZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCgkJLy8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZAoJCS8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQKCQlkaXYgPSBudWxsOwoJfQoKCWZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHsKCQlyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7Cgl9CgoJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCwKCQlyZWxpYWJsZU1hcmdpbkxlZnRWYWwsCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFkaXYuc3R5bGUgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCS8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CglkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOwoKCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKCQl9LAoJCXBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsOwoJCX0sCgkJcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgkJcmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKCQl9LAoJCXNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkgewoJCQljb21wdXRlU3R5bGVUZXN0cygpOwoJCQlyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDsKCQl9Cgl9ICk7Cn0gKSgpOwoKCmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7Cgl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDUxKwoJCS8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3cKCQkvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzCgkJLy8gb24gZGV0YWNoZWQgZWxlbWVudHMKCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6CgkvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNykKCS8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KQoJaWYgKCBjb21wdXRlZCApIHsKCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKCgkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQl9CgoJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJLy8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsCgkJLy8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy4KCQkvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQlpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CgkJfQoJfQoKCXJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CgoJCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCQkvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgoJCXJldCArICIiIDoKCQlyZXQ7Cn0KCgpmdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgoJLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KCXJldHVybiB7CgkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJaWYgKCBjb25kaXRpb25GbigpICkgewoKCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZQoJCQkJLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCQkJcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfTsKfQoKCnZhcgoKCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUKCS8vIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglyY3VzdG9tUHJvcCA9IC9eLS0vLAoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogIjAiLAoJCWZvbnRXZWlnaHQ6ICI0MDAiCgl9LAoKCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk1veiIsICJtcyIgXSwKCWVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLnN0eWxlOwoKLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHsKCgkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAoJaWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHsKCQkJcmV0dXJuIG5hbWU7CgkJfQoJfQp9CgovLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG8KLy8gYSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkuCmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7Cgl2YXIgcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF07CglpZiAoICFyZXQgKSB7CgkJcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7Cgl9CglyZXR1cm4gcmV0Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoKCS8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4KCS8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludAoJdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CglyZXR1cm4gbWF0Y2hlcyA/CgoJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcwoJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgInB4IiApIDoKCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7Cgl2YXIgaSA9IGRpbWVuc2lvbiA9PT0gIndpZHRoIiA/IDEgOiAwLAoJCWV4dHJhID0gMCwKCQlkZWx0YSA9IDA7CgoJLy8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeQoJaWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApICkgewoJCXJldHVybiAwOwoJfQoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCgkJLy8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luCgkJaWYgKCBib3ggPT09ICJtYXJnaW4iICkgewoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgkJfQoKCQkvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgInBhZGRpbmciIG9yICJib3JkZXIiIG9yICJtYXJnaW4iCgkJaWYgKCAhaXNCb3JkZXJCb3ggKSB7CgoJCQkvLyBBZGQgcGFkZGluZwoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgoJCQkvLyBGb3IgImJvcmRlciIgb3IgIm1hcmdpbiIsIGFkZCBib3JkZXIKCQkJaWYgKCBib3ggIT09ICJwYWRkaW5nIiApIHsKCQkJCWRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKCgkJCS8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZQoJCQl9IGVsc2UgewoJCQkJZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgoJCS8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgImNvbnRlbnQiIG9yCgkJLy8gInBhZGRpbmciIG9yICJtYXJnaW4iCgkJfSBlbHNlIHsKCgkJCS8vIEZvciAiY29udGVudCIsIHN1YnRyYWN0IHBhZGRpbmcKCQkJaWYgKCBib3ggPT09ICJjb250ZW50IiApIHsKCQkJCWRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQkJfQoKCQkJLy8gRm9yICJjb250ZW50IiBvciAicGFkZGluZyIsIHN1YnRyYWN0IGJvcmRlcgoJCQlpZiAoIGJveCAhPT0gIm1hcmdpbiIgKSB7CgkJCQlkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CgkJCX0KCQl9Cgl9CgoJLy8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWwKCWlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7CgoJCS8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXIKCQkvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duCgkJZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbCgKCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCWNvbXB1dGVkVmFsIC0KCQkJZGVsdGEgLQoJCQlleHRyYSAtCgkJCTAuNQoJCSkgKTsKCX0KCglyZXR1cm4gZGVsdGE7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7CgoJLy8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZQoJdmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAoJCXZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7CgoJLy8gU3VwcG9ydDogRmlyZWZveCA8PTU0CgkvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS4KCWlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkgewoJCWlmICggIWV4dHJhICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCQl2YWwgPSAiYXV0byI7Cgl9CgoJLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKCXZhbHVlSXNCb3JkZXJCb3ggPSB2YWx1ZUlzQm9yZGVyQm94ICYmCgkJKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSApOwoKCS8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyAiYXV0byIKCS8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSkKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seQoJLy8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMikKCWlmICggdmFsID09PSAiYXV0byIgfHwKCQkhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiLCBmYWxzZSwgc3R5bGVzICkgPT09ICJpbmxpbmUiICkgewoKCQl2YWwgPSBlbGVtWyAib2Zmc2V0IiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdOwoKCQkvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlcwoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlOwoJfQoKCS8vIE5vcm1hbGl6ZSAiIiBhbmQgYXV0bwoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsCglyZXR1cm4gKCB2YWwgKwoJCWJveE1vZGVsQWRqdXN0bWVudCgKCQkJZWxlbSwKCQkJZGltZW5zaW9uLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveCwKCQkJc3R5bGVzLAoKCQkJLy8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSkKCQkJdmFsCgkJKQoJKSArICJweCI7Cn0KCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCgljc3NOdW1iZXI6IHsKCQkiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAoJCSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHt9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndAoJCS8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eQoJCS8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC4KCQlpZiAoICFpc0N1c3RvbVByb3AgKSB7CgkJCW5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApOwoJCX0KCgkJLy8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOwoKCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsKCQkJCXZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTsKCgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNikKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gIiIgOiAicHgiICk7CgkJCX0KCgkJCS8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXMKCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CgkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISggInNldCIgaW4gaG9va3MgKSB8fAoJCQkJKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggaXNDdXN0b21Qcm9wICkgewoJCQkJCXN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJfSBlbHNlIHsKCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKCQl2YXIgdmFsLCBudW0sIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3QKCQkvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5CgkJLy8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLgoJCWlmICggIWlzQ3VzdG9tUHJvcCApIHsKCQkJbmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7CgkJfQoKCQkvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwoJCX0KCgkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwoJCX0KCgkJLy8gQ29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQoJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CgkJfQoKCQkvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgoJCXJldHVybiB2YWw7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBkaW1lbnNpb24gKSB7CglqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0CgkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKCgkJCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrCgkJCQkJLy8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm8KCQkJCQkvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQoJCQkJCS8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGUKCQkJCQkvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuCgkJCQkJKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID8KCQkJCQkJc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApOwoJCQkJCQl9ICkgOgoJCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXZhciBtYXRjaGVzLAoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCgkJCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQkJCXN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KAoJCQkJCWVsZW0sCgkJCQkJZGltZW5zaW9uLAoJCQkJCWV4dHJhLAoJCQkJCWlzQm9yZGVyQm94LAoJCQkJCXN0eWxlcwoJCQkJKTsKCgkJCS8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZAoJCQkvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KQoJCQlpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7CgkJCQlzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoCgkJCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCQkJcGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC0KCQkJCQlib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgImJvcmRlciIsIGZhbHNlLCBzdHlsZXMgKSAtCgkJCQkJMC41CgkJCQkpOwoJCQl9CgoJCQkvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZAoJCQlpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmCgkJCQkoIG1hdGNoZXNbIDMgXSB8fCAicHgiICkgIT09ICJweCIgKSB7CgoJCQkJZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTsKCQkJCXZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7CgkJCX0KCgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CgkJfQoJfTsKfSApOwoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LAoJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCWlmICggY29tcHV0ZWQgKSB7CgkJCXJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgIm1hcmdpbkxlZnQiICkgKSB8fAoJCQkJZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KCQkJCQlzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CgkJCQkJfSApCgkJCQkpICsgInB4IjsKCQl9Cgl9Cik7CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKCB7CgltYXJnaW46ICIiLAoJcGFkZGluZzogIiIsCglib3JkZXI6ICJXaWR0aCIKfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKCQlleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGkgPSAwLAoJCQkJZXhwYW5kZWQgPSB7fSwKCgkJCQkvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCAiICIgKSA6IFsgdmFsdWUgXTsKCgkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggcHJlZml4ICE9PSAibWFyZ2luIiApIHsKCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZXMsIGxlbiwKCQkJCW1hcCA9IHt9LAoJCQkJaSA9IDA7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApOwoJCQkJbGVuID0gbmFtZS5sZW5ndGg7CgoJCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwoJCQkJfQoKCQkJCXJldHVybiBtYXA7CgkJCX0KCgkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CgkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9Cn0gKTsKCgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJLy8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCwKCQkJLy8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy4KCQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgoJCQkvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7CgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOwoKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCgkJCS8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LgoJCQkvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuCgkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7CgkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKCQkJCSggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8CgkJCQkJalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwoJCQl9IGVsc2UgewoJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCQl9CgkJfQoJfQp9OwoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKCX0sCglfZGVmYXVsdDogInN3aW5nIgp9OwoKalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CgovLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKCgoKdmFyCglmeE5vdywgaW5Qcm9ncmVzcywKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC87CgpmdW5jdGlvbiBzY2hlZHVsZSgpIHsKCWlmICggaW5Qcm9ncmVzcyApIHsKCQlpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApOwoJCX0KCgkJalF1ZXJ5LmZ4LnRpY2soKTsKCX0KfQoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0gKTsKCXJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApOwp9CgovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNoLAoJCWkgPSAwLAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKCgkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCgkvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7Cglmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJaWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHsKCgkJCS8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCXJldHVybiB0d2VlbjsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewoJdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LAoJCWlzQm94ID0gIndpZHRoIiBpbiBwcm9wcyB8fCAiaGVpZ2h0IiBpbiBwcm9wcywKCQlhbmltID0gdGhpcywKCQlvcmlnID0ge30sCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCWhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksCgkJZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzCglpZiAoICFvcHRzLnF1ZXVlICkgewoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7CgkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewoJCQlob29rcy51bnF1ZXVlZCA9IDA7CgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwoJCQlob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKCQkJCQlvbGRmaXJlKCk7CgkJCQl9CgkJCX07CgkJfQoJCWhvb2tzLnVucXVldWVkKys7CgoJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9ICk7CgkJfSApOwoJfQoKCS8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CgkJaWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCgkJCQkvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgInNob3ciIGFuZAoJCQkJLy8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGUKCQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsKCgkJCQkvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhCgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgkJfQoJfQoKCS8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpCglwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7CglpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKCQlyZXR1cm47Cgl9CgoJLy8gUmVzdHJpY3QgIm92ZXJmbG93IiBhbmQgImRpc3BsYXkiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnMKCWlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZAoJCS8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9ycwoJCS8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZQoJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTsKCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCAiZGlzcGxheSIgKTsKCQl9CgkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ICkgewoJCQkJZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQl9IGVsc2UgewoKCQkJCS8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHkKCQkJCXNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApOwoJCQkJcmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7CgkJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0gKTsKCQkJfQoJCX0KCgkJLy8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrCgkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkgewoJCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoKCQkJCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zCgkJCQlpZiAoICFwcm9wVHdlZW4gKSB7CgkJCQkJYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKCQkJCQkJc3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQkJCX0gKTsKCQkJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCQkJCWRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5OwoJCQkJCQlyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/ICIiIDogZGlzcGxheTsKCQkJCQl9CgkJCQl9CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJYW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOwoJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJfSApOwoJfQoKCS8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJcHJvcFR3ZWVuID0gZmFsc2U7Cglmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgoJCS8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uCgkJaWYgKCAhcHJvcFR3ZWVuICkgewoJCQlpZiAoIGRhdGFTaG93ICkgewoJCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApOwoJCQl9CgoJCQkvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCAicmV2ZXJzZXMiCgkJCWlmICggdG9nZ2xlICkgewoJCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKCQkJfQoKCQkJLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW0KCQkJaWYgKCBoaWRkZW4gKSB7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTsKCQkJfQoKCQkJLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovCgoJCQlhbmltLmRvbmUoIGZ1bmN0aW9uKCkgewoKCQkJLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi8KCgkJCQkvLyBUaGUgZmluYWwgc3RlcCBvZiBhICJoaWRlIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50CgkJCQlpZiAoICFoaWRkZW4gKSB7CgkJCQkJc2hvd0hpZGUoIFsgZWxlbSBdICk7CgkJCQl9CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CgkJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gUGVyLXByb3BlcnR5IHNldHVwCgkJcHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CgkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCWRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7CgkJCWlmICggaGlkZGVuICkgewoJCQkJcHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDsKCQkJCXByb3BUd2Vlbi5zdGFydCA9IDA7CgkJCX0KCQl9Cgl9Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7CgkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCgkJCS8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAoJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0gKSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoKCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHkKCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJCWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApOwoKCQkJLy8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZAoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvbgoJCQlpZiAoICFsZW5ndGggKSB7CgkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7CgkJCX0KCgkJCS8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uCgkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsKCQkJCXNwZWNpYWxFYXNpbmc6IHt9LAoJCQkJZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CgkJCX0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4gdHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJdmFyIGluZGV4ID0gMCwKCgkJCQkJLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCQkJCWlmICggc3RvcHBlZCApIHsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJCXN0b3BwZWQgPSB0cnVlOwoJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOwoJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSApLAoJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOwoKCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwoJCWlmICggcmVzdWx0ICkgewoJCQlpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7CgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQoJCQkJCXJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApOwoJCQl9CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfQoKCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CgoJaWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwoJfQoKCS8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglhbmltYXRpb24KCQkucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQllbGVtOiBlbGVtLAoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQoJCX0gKQoJKTsKCglyZXR1cm4gYW5pbWF0aW9uOwp9CgpqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CgoJdHdlZW5lcnM6IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApOwoJCQlhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTsKCQkJcmV0dXJuIHR3ZWVuOwoJCX0gXQoJfSwKCgl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewoJCWlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0KCX0sCgoJcHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCUFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CgkJfQoJfQp9ICk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJZHVyYXRpb246IHNwZWVkLAoJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCS8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZgoJaWYgKCBqUXVlcnkuZngub2ZmICkgewoJCW9wdC5kdXJhdGlvbiA9IDA7CgoJfSBlbHNlIHsKCQlpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09ICJudW1iZXIiICkgewoJCQlpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07CgoJCQl9IGVsc2UgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCQkJfQoJCX0KCX0KCgkvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCglpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKCQlvcHQucXVldWUgPSAiZngiOwoJfQoKCS8vIFF1ZXVlaW5nCglvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoKCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoKCQkvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CgkJCQl2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CgoJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CgkJCQlpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJgoJCQkJCSggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgewoKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuCgkJCS8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSApOwoJfSwKCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CgkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0cnVlOwoKCQkJLy8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7CgkJfSApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCggewoJc2xpZGVEb3duOiBnZW5GeCggInNob3ciICksCglzbGlkZVVwOiBnZW5GeCggImhpZGUiICksCglzbGlkZVRvZ2dsZTogZ2VuRngoICJ0b2dnbGUiICksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCWkgPSAwLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJZnhOb3cgPSBEYXRlLm5vdygpOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoKCQkvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWpRdWVyeS5meC5zdGFydCgpOwp9OwoKalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewoJaWYgKCBpblByb2dyZXNzICkgewoJCXJldHVybjsKCX0KCglpblByb2dyZXNzID0gdHJ1ZTsKCXNjaGVkdWxlKCk7Cn07CgpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgewoJaW5Qcm9ncmVzcyA9IG51bGw7Cn07CgpqUXVlcnkuZnguc3BlZWRzID0gewoJc2xvdzogNjAwLAoJZmFzdDogMjAwLAoKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKCQl2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CgkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsKCX0gKTsKfTsKCgooIGZ1bmN0aW9uKCkgewoJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAoJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCgkJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib3B0aW9uIiApICk7CgoJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5CgkvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSAib24iCglzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdAoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKCgkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHkKCS8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQudHlwZSA9ICJyYWRpbyI7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwp9ICkoKTsKCgp2YXIgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOwoJCX0KCgkJLy8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgoJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CgkJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTsKCgkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQlyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKCQkJCQlub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLAoJCQlpID0gMCwKCgkJCS8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKCQkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7CgoJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCXdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJfQoJCX0KCX0KfSApOwoKLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCXZhciByZXQsIGhhbmRsZSwKCQkJbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCgkJaWYgKCAhaXNYTUwgKSB7CgoJCQkvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCgkJCWhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTsKCQkJYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0OwoJCQlyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CgkJCQlsb3dlcmNhc2VOYW1lIDoKCQkJCW51bGw7CgkJCWF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gKTsKCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYKCQkJCSggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seQoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCgkJCQkvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKCgkJCQlpZiAoIHRhYmluZGV4ICkgewoJCQkJCXJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7CgkJCQl9CgoJCQkJaWYgKAoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CgkJCQkJcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYKCQkJCQllbGVtLmhyZWYKCQkJCSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCX0sCgoJcHJvcEZpeDogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNsYXNzIjogImNsYXNzTmFtZSIKCX0KfSApOwoKLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5Ci8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eQovLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCi8vIG9uIHRoZSBvcHRpb24KLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWQKLy8gd2hlbiBpbiBhbiBvcHRncm91cAovLyBlc2xpbnQgcnVsZSAibm8tdW51c2VkLWV4cHJlc3Npb25zIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlCi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcAppZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJLyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogIm9mZiIgKi8KCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJCWlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiAib2ZmIiAqLwoKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgpqUXVlcnkuZWFjaCggWwoJInRhYkluZGV4IiwKCSJyZWFkT25seSIsCgkibWF4TGVuZ3RoIiwKCSJjZWxsU3BhY2luZyIsCgkiY2VsbFBhZGRpbmciLAoJInJvd1NwYW4iLAoJImNvbFNwYW4iLAoJInVzZU1hcCIsCgkiZnJhbWVCb3JkZXIiLAoJImNvbnRlbnRFZGl0YWJsZSIKXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOwp9ICk7CgoKCgoJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlYwoJLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlCglmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHsKCQl2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTsKCQlyZXR1cm4gdG9rZW5zLmpvaW4oICIgIiApOwoJfQoKCmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgewoJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCAiY2xhc3MiICkgfHwgIiI7Cn0KCmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHsKCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CglpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107Cgl9CglyZXR1cm4gW107Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJY2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApOwoKCQlpZiAoIGNsYXNzZXMubGVuZ3RoICkgewoJCQl3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7CgkJCQljdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgewoJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgoJCQkJCWZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTsKCQkJCQlpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggImNsYXNzIiwgZmluYWxWYWx1ZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuYXR0ciggImNsYXNzIiwgIiIgKTsKCQl9CgoJCWNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJaWYgKCBjbGFzc2VzLmxlbmd0aCApIHsKCQkJd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgewoJCQkJY3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApOwoKCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgoJCQkJCQkvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPiAtMSApIHsKCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApOwoJCQkJCWlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7CgkJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09ICJzdHJpbmciIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7CgoJCWlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgaXNWYWxpZFZhbHVlICkgewoJCQlyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcygKCQkJCQl2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLAoJCQkJCXN0YXRlVmFsCgkJCQkpOwoJCQl9ICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJdmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lczsKCgkJCWlmICggaXNWYWxpZFZhbHVlICkgewoKCQkJCS8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCQlpID0gMDsKCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJCQl3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHsKCgkJCQkJLy8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQljbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApOwoJCQkJaWYgKCBjbGFzc05hbWUgKSB7CgoJCQkJCS8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlkYXRhUHJpdi5zZXQoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKCQkJCS8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCgkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAoJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgoJCQkJaWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHsKCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSggImNsYXNzIiwKCQkJCQkJY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CgkJCQkJCSIiIDoKCQkJCQkJZGF0YVByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIgoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSwgZWxlbSwKCQkJaSA9IDA7CgoJCWNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiOwoJCXdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCgkJCQkoICIgIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArICIgIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KfSApOwoKCgoKdmFyIHJyZXR1cm4gPSAvXHIvZzsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sCgkJCWVsZW0gPSB0aGlzWyAwIF07CgoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fAoJCQkJCWpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJgoJCQkJCSJnZXQiIGluIGhvb2tzICYmCgkJCQkJKCByZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSApICE9PSB1bmRlZmluZWQKCQkJCSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJcmV0ID0gZWxlbS52YWx1ZTsKCgkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCgkJCQlpZiAoIHR5cGVvZiByZXQgPT09ICJzdHJpbmciICkgewoJCQkJCXJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgIiIgKTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCXJldHVybiByZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQl2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewoJCQkJdmFsICs9ICIiOwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKCQkJCX0gKTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7CgkJCX0KCQl9ICk7Cgl9Cn0gKTsKCmpRdWVyeS5leHRlbmQoIHsKCXZhbEhvb2tzOiB7CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CgkJCQkJdmFsIDoKCgkJCQkJLy8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHkKCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCgkJCQkJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UKCQkJCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZQoJCQkJCXN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKCQkJfQoJCX0sCgkJc2VsZWN0OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgdmFsdWUsIG9wdGlvbiwgaSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsKCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlpID0gbWF4OwoKCQkJCX0gZWxzZSB7CgkJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAoJCQkJCQkJIW9wdGlvbi5kaXNhYmxlZCAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwKCQkJCQkJCQkhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxlbmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovCgoJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkID0KCQkJCQkJalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMQoJCQkJCSkgewoJCQkJCQlvcHRpb25TZXQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqLwoJCQkJfQoKCQkJCS8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CgkJCQlpZiAoICFvcHRpb25TZXQgKSB7CgkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9CgkJfQoJfQp9ICk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVlcnkuZWFjaCggWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7CgkJCX0KCQl9Cgl9OwoJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgewoJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwoJCX07Cgl9Cn0gKTsKCgoKCi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KCgpzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CgoKdmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAoJc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwgewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoKCQl2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCwKCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCgkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAoJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOwoKCQljdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewoKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggIi4iICk7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoICI6IiApIDwgMCAmJiAib24iICsgdHlwZTsKCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CgkJCWV2ZW50IDoKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwoKCQkvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCgkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKCQlldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID8KCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoKCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsKCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCQl9CgkJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKCQkJCXRtcCA9IGN1cjsKCQkJfQoKCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCgkJCWlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkgewoJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwoJCQl9CgkJfQoKCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCgkJaSA9IDA7CgkJd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbGFzdEVsZW1lbnQgPSBjdXI7CgkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CgkJCQlidWJibGVUeXBlIDoKCQkJCXNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKCgkJCS8vIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmCgkJCQlkYXRhUHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBOYXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgewoJCQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9CgkJfQoJCWV2ZW50LnR5cGUgPSB0eXBlOwoKCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCgkJCWlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAoJCQkJc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiYKCQkJCWFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJaWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKCgkJCQkJaWYgKCB0bXAgKSB7CgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQl9CgoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgoJCQkJCWlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQkJbGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTsKCQkJCQl9CgoJCQkJCWVsZW1bIHR5cGUgXSgpOwoKCQkJCQlpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCWxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7CgkJCQkJfQoKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoKCQkJCQlpZiAoIHRtcCApIHsKCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUKCS8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCglzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkgewoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVudCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlCgkJCX0KCQkpOwoKCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJfQoKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0gKTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIGVsZW0gPSB0aGlzWyAwIF07CgkJaWYgKCBlbGVtICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKCQl9Cgl9Cn0gKTsKCgovLyBTdXBwb3J0OiBGaXJlZm94IDw9NDQKLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50cwovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4NwovLwovLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjEKLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlcgovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1NwppZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7CglqUXVlcnkuZWFjaCggeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsKCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCQlkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7CgoJCQkJfSBlbHNlIHsKCQkJCQlkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOwoJCQkJfQoJCQl9CgkJfTsKCX0gKTsKfQp2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247Cgp2YXIgbm9uY2UgPSBEYXRlLm5vdygpOwoKdmFyIHJxdWVyeSA9ICggL1w/LyApOwoKCgovLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkgewoJdmFyIHhtbDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC4KCXRyeSB7CgkJeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7Cgl9IGNhdGNoICggZSApIHsKCQl4bWwgPSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKCX0KCXJldHVybiB4bWw7Cn07CgoKdmFyCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLAoJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwoKZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgewoJdmFyIG5hbWU7CgoJaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHsKCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCgkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CgkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CgoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcygKCQkJCQlwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKCQkJCQl2LAoJCQkJCXRyYWRpdGlvbmFsLAoJCQkJCWFkZAoJCQkJKTsKCQkJfQoJCX0gKTsKCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7CgoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlCgkJCXZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID8KCQkJCXZhbHVlT3JGdW5jdGlvbigpIDoKCQkJCXZhbHVlT3JGdW5jdGlvbjsKCgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsKCQkJCWVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQl9OwoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9ICk7CgoJfSBlbHNlIHsKCgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKCX0sCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0gKQoJCS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQl2YXIgdHlwZSA9IHRoaXMudHlwZTsKCgkJCS8vIFVzZSAuaXMoICI6ZGlzYWJsZWQiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTsKCQl9ICkKCQkubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJcmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQl9ICk7CgkJCX0KCgkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9ICkuZ2V0KCk7Cgl9Cn0gKTsKCgp2YXIKCXIyMCA9IC8lMjAvZywKCXJoYXNoID0gLyMuKiQvLAoJcmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCglybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKCXJwcm90b2NvbCA9IC9eXC9cLy8sCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKCgkvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW4KCW9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJb3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsCgkJCWkgPSAwLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdOwoKCQlpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJd2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkgewoKCQkJCS8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCgkJCQlpZiAoIGRhdGFUeXBlWyAwIF0gPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgIioiOwoJCQkJCSggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApOwoKCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKCQkJCX0gZWxzZSB7CgkJCQkJKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKCgl2YXIgaW5zcGVjdGVkID0ge30sCgkJc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7CgoJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CgkJdmFyIHNlbGVjdGVkOwoJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKCQkJdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkJaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYKCQkJCSFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9ICk7CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCglmb3IgKCBrZXkgaW4gc3JjICkgewoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgewoJCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCgkJY29udGVudHMgPSBzLmNvbnRlbnRzLAoJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCiAqLwpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7Cgl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKCQljb252ZXJ0ZXJzID0ge30sCgoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOwoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCgl3aGlsZSAoIGN1cnJlbnQgKSB7CgoJCWlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewoJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKCQl9CgoJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCgkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCQl9CgoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkJaWYgKCBjdXJyZW50ICkgewoKCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCQlpZiAoIGN1cnJlbnQgPT09ICIqIiApIHsKCgkJCQljdXJyZW50ID0gcHJldjsKCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7CgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CgoJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0CgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKCQkJCQkJCWlmICggY29udiApIHsKCgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzLnRocm93cyApIHsKCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJcmV0dXJuIHsKCQkJCQkJCQlzdGF0ZTogInBhcnNlcmVycm9yIiwKCQkJCQkJCQllcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudAoJCQkJCQkJfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQl0eXBlOiAiR0VUIiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLAoJCWdsb2JhbDogdHJ1ZSwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czogZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAvXGJ4bWxcYi8sCgkJCWh0bWw6IC9cYmh0bWwvLAoJCQlqc29uOiAvXGJqc29uXGIvCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKCQkJanNvbjogInJlc3BvbnNlSlNPTiIKCQl9LAoKCQkvLyBEYXRhIGNvbnZlcnRlcnMKCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0IjogU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogSlNPTi5wYXJzZSwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJdXJsOiB0cnVlLAoJCQljb250ZXh0OiB0cnVlCgkJfQoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJcmV0dXJuIHNldHRpbmdzID8KCgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKCgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIHRyYW5zcG9ydCwKCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KCQkJY2FjaGVVUkwsCgoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVXJsIGNsZWFudXAgdmFyCgkJCXVybEFuY2hvciwKCgkJCS8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbikKCQkJY29tcGxldGVkLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoKCQkJLy8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsCgkJCXVuY2FjaGVkLAoKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CgkJCQkJalF1ZXJ5LmV2ZW50LAoKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoKCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKCQkJcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAoKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID0KCQkJCQkJCXJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJCXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIGNvbXBsZXRlZCApIHsKCgkJCQkJCQkvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzCgkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CgkJCQkJfQoJCQkJCWRvbmUoIDAsIGZpbmFsVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCgkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgIiIgKQoJCQkucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKTsKCgkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CgkJcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAoJCXMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQl1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTUKCQkJLy8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCwKCQkJLy8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4LwoJCQl0cnkgewoJCQkJdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKCgkJCQkvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5CgkJCQkvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQoJCQkJdXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjsKCQkJCXMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyAiLy8iICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09CgkJCQkJdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiArIHVybEFuY2hvci5ob3N0OwoJCQl9IGNhdGNoICggZSApIHsKCgkJCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbiwKCQkJCS8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWQKCQkJCXMuY3Jvc3NEb21haW4gPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggY29tcGxldGVkICkgewoJCQlyZXR1cm4ganFYSFI7CgkJfQoKCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwoJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCgkJZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCgkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCgkJLy8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvbgoJCWNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrCgkJCXVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApOwoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgKSApIHsKCQkJCWNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgkJCQljYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsICIkMSIgKTsKCQkJCXVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7CgkJCX0KCgkJCS8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMikKCQkJcy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkOwoKCQkvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OCkKCQl9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJgoJCQkoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiApID09PSAwICkgewoJCQlzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCAiKyIgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAoJCQkiQWNjZXB0IiwKCQkJcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArCgkJCQkJKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CgkJCQlzLmFjY2VwdHNbICIqIiBdCgkJKTsKCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCgkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CgkJfQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYKCQkJKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHsKCgkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKCQl9CgoJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJY29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTsKCQlqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTsKCQlqcVhIUi5mYWlsKCBzLmVycm9yICk7CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCgkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50CgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CgkJCX0KCgkJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuIGpxWEhSOwoJCQl9CgoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJY29tcGxldGVkID0gZmFsc2U7CgkJCQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJLy8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9ucwoJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCgkJCQkvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHMKCQkJCWRvbmUoIC0xLCBlICk7CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb21wbGV0ZWQgPSB0cnVlOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImV0YWciICk7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaWYgbm8gY29udGVudAoJCQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7CgoJCQkJLy8gaWYgbm90IG1vZGlmaWVkCgkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKCQkJCX0gZWxzZSB7CgkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwoJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoKCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKCQkJCWlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOwoJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKCQkJCQkJc3RhdHVzID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0CgkJCWpxWEhSLnN0YXR1cyA9IHN0YXR1czsKCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKCgkJCS8vIFN1Y2Nlc3MvRXJyb3IKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKCQkJfSBlbHNlIHsKCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7CgkJCXN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBDb21wbGV0ZQoJCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CgoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCgkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKCQlpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKQoJCXJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCggewoJCQl1cmw6IHVybCwKCQkJdHlwZTogbWV0aG9kLAoJCQlkYXRhVHlwZTogdHlwZSwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2sKCQl9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTsKCX07Cn0gKTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KCB7CgkJdXJsOiB1cmwsCgoJCS8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KQoJCXR5cGU6ICJHRVQiLAoJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQljYWNoZTogdHJ1ZSwKCQlhc3luYzogZmFsc2UsCgkJZ2xvYmFsOiBmYWxzZSwKCQkidGhyb3dzIjogdHJ1ZQoJfSApOwp9OwoKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciB3cmFwOwoKCQlpZiAoIHRoaXNbIDAgXSApIHsKCQkJaWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCQlodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTsKCQkJfQoKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CgoJCQlpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOwoJCQl9CgoJCQl3cmFwLm1hcCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9ICkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7CgkJCX0gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSApOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApOwoJCX0gKTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCAiYm9keSIgKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCX0gKTsKCQlyZXR1cm4gdGhpczsKCX0KfSApOwoKCmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApOwp9OwpqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCXJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7Cn07CgoKCgpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoIGUgKSB7fQp9OwoKdmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7CgoJCS8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCgkJMDogMjAwLAoKCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCS8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCTEyMjM6IDIwNAoJfSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7CgpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwpzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKCmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHsKCXZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKCgkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CglpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoJCQkJdmFyIGksCgkJCQkJeGhyID0gb3B0aW9ucy54aHIoKTsKCgkJCQl4aHIub3BlbigKCQkJCQlvcHRpb25zLnR5cGUsCgkJCQkJb3B0aW9ucy51cmwsCgkJCQkJb3B0aW9ucy5hc3luYywKCQkJCQlvcHRpb25zLnVzZXJuYW1lLAoJCQkJCW9wdGlvbnMucGFzc3dvcmQKCQkJCSk7CgoJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKCQkJCQlmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgewoJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOwoJCQkJfQoKCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCgkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdICkgewoJCQkJCWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCX0KCgkJCQkvLyBTZXQgaGVhZGVycwoJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCX0KCgkJCQkvLyBDYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQljYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID0KCQkJCQkJCQl4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsKCQkJCQkJCQl4aHIuYWJvcnQoKTsKCQkJCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJCQkJLy8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzCgkJCQkJCQkJLy8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZQoJCQkJCQkJCWlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgewoJCQkJCQkJCQljb21wbGV0ZSggMCwgImVycm9yIiApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWNvbXBsZXRlKAoKCQkJCQkJCQkJCS8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CgkJCQkJCQkJCQl4aHIuc3RhdHVzLAoJCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKCQkJCQkJCQkJKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWNvbXBsZXRlKAoJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCQkJCQkJCQkvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpCgkJCQkJCQkJCS8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpCgkJCQkJCQkJCSggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRleHQiICB8fAoJCQkJCQkJCQl0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gInN0cmluZyIgPwoJCQkJCQkJCQkJeyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDoKCQkJCQkJCQkJCXsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAoJCQkJCQkJCQl4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX07CgoJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cwoJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CgkJCQllcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soICJlcnJvciIgKTsKCgkJCQkvLyBTdXBwb3J0OiBJRSA5IG9ubHkKCQkJCS8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CgkJCQkvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzCgkJCQlpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJeGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrOwoJCQkJfSBlbHNlIHsKCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgoJCQkJCQkvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXMKCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCgkJCQkJCQkvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCwKCQkJCQkJCS8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydAoJCQkJCQkJLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKCQkJCQkJCS8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZAoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQkJCWVycm9yQ2FsbGJhY2soKTsKCQkJCQkJCQl9CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoKCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIgKTsKCgkJCQl0cnkgewoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pCgkJCQkJeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwoJCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJdGhyb3cgZTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9ICk7CgoKCgovLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKQpqUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTsKCX0KfSApOwoKLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCggewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgIiArCgkJCSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSApOwoKLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpbgpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJfQp9ICk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJdmFyIHNjcmlwdCwgY2FsbGJhY2s7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewoJCQkJc2NyaXB0ID0galF1ZXJ5KCAiPHNjcmlwdD4iICkucHJvcCggewoJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKCQkJCQlzcmM6IHMudXJsCgkJCQl9ICkub24oCgkJCQkJImxvYWQgZXJyb3IiLAoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKCQkJCQkJc2NyaXB0LnJlbW92ZSgpOwoJCQkJCQljYWxsYmFjayA9IG51bGw7CgkJCQkJCWlmICggZXZ0ICkgewoJCQkJCQkJY29tcGxldGUoIGV2dC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwLCBldnQudHlwZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJKTsKCgkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CgkJCX0sCgkJCWFib3J0OiBmdW5jdGlvbigpIHsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0KCQkJfQoJCX07Cgl9Cn0gKTsKCgoKCnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoIHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwoJCXRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOwoJCXJldHVybiBjYWxsYmFjazsKCX0KfSApOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KCQkJInVybCIgOgoJCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJgoJCQkJKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkKCQkJCQkuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgoJCQkJcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgoJCSk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KCQkJcy5qc29ucENhbGxiYWNrKCkgOgoJCQlzLmpzb25wQ2FsbGJhY2s7CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIGpzb25Qcm9wICkgewoJCQlzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBGb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7CgoJCQkvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXQKCQkJaWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkgewoJCQkJalF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKCgkJCS8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCgkJCX0gZWxzZSB7CgkJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgkJCX0KCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCgkJCWlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgewoJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoKCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDsKCQl9ICk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSApOwoKCgoKLy8gU3VwcG9ydDogU2FmYXJpIDggb25seQovLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50Ci8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLgovLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzcKc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkgewoJdmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICkuYm9keTsKCWJvZHkuaW5uZXJIVE1MID0gIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IjsKCXJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwp9ICkoKTsKCgovLyBBcmd1bWVudCAiZGF0YSIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sCi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwKLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnQKLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwpqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkgewoJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIFtdOwoJfQoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9CgoJdmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0czsKCglpZiAoICFjb250ZXh0ICkgewoKCQkvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKCQkvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbgoJCWlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICk7CgoJCQkvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnQKCQkJLy8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHMKCQkJLy8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSkKCQkJYmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggImJhc2UiICk7CgkJCWJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CgkJCWNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApOwoJCX0gZWxzZSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudDsKCQl9Cgl9CgoJcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7CglzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwoKCS8vIFNpbmdsZSB0YWcKCWlmICggcGFyc2VkICkgewoJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdOwoJfQoKCXBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwp9OwoKCi8qKgogKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCiAqLwpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7Cgl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAoJCXNlbGYgPSB0aGlzLAoJCW9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCglpZiAoIG9mZiA+IC0xICkgewoJCXNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoKCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCWNhbGxiYWNrID0gcGFyYW1zOwoJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJdHlwZSA9ICJQT1NUIjsKCX0KCgkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAoJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CgkJalF1ZXJ5LmFqYXgoIHsKCQkJdXJsOiB1cmwsCgoJCQkvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCgkJCS8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZQoJCQkvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2QKCQkJdHlwZTogdHlwZSB8fCAiR0VUIiwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CgoJCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKCQkJCS8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwoJCQkJalF1ZXJ5KCAiPGRpdj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQgKTsKCgkJLy8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyAiZGF0YSIsICJzdGF0dXMiLCAianFYSFIiCgkJLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLgoJCS8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgImpxWEhSIiwgInN0YXR1cyIsICJlcnJvciIKCQl9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJc2VsZi5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJCX0gKTsKCQl9ICk7Cgl9CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWwoJImFqYXhTdGFydCIsCgkiYWpheFN0b3AiLAoJImFqYXhDb21wbGV0ZSIsCgkiYWpheEVycm9yIiwKCSJhamF4U3VjY2VzcyIsCgkiYWpheFNlbmQiCl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cgl9Owp9ICk7CgoKCgpqUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKCX0gKS5sZW5ndGg7Cn07CgoKCgpqUXVlcnkub2Zmc2V0ID0gewoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOwoKCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlcgoJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7CgkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwoJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0OwoKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCgkJCS8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KQoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoKCQl9IGVsc2UgewoJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKCQl9Cgl9Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJLy8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luCglvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQkvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KCQkJCXRoaXMgOgoJCQkJdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSApOwoJCX0KCgkJdmFyIHJlY3QsIHdpbiwKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApCgkJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkJLy8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYQoJCS8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvcgoJCWlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJLy8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUgoJCXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsKCQlyZXR1cm4gewoJCQl0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LAoJCQlsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQKCQl9OwoJfSwKCgkvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveAoJLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1sgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYywKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJLy8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKCgkJCS8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3QKCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJfSBlbHNlIHsKCQkJb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCgkJCS8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50CgkJCS8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYKCQkJCSggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJgoJCQkJalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlOwoJCQl9CgkJCWlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luCgkJCQlwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpOwoJCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUgKTsKCQkJfQoJCX0KCgkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwoJCXJldHVybiB7CgkJCXRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKCQl9OwoJfSwKCgkvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKCS8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KCS8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvdwoJLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAoJLy8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZgoJLy8KCS8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcwoJLy8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuCgkvLwoJLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OwoKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoKCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CgkJfSApOwoJfQp9ICk7CgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gInBhZ2VZT2Zmc2V0IiA9PT0gcHJvcDsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CgoJCQkvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3MKCQkJdmFyIHdpbjsKCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoJCQkJd2luID0gZWxlbTsKCQkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7CgkJCX0KCgkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCwKCQkJCQl0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXQKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApOwoJfTsKfSApOwoKLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OQovLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgovLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDcKLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUKalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCgkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCgkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7CgkJCX0KCQl9CgkpOwp9ICk7CgoKLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LAoJCWZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgewoKCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKCQkJCXZhciBkb2M7CgoJCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KQoJCQkJCXJldHVybiBmdW5jTmFtZS5pbmRleE9mKCAib3V0ZXIiICkgPT09IDAgPwoJCQkJCQllbGVtWyAiaW5uZXIiICsgbmFtZSBdIDoKCQkJCQkJZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAoJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoKCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApOwoJCX07Cgl9ICk7Cn0gKTsKCgpqUXVlcnkuZWFjaCggKCAiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIgKS5zcGxpdCggIiAiICksCglmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewoJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwoJfQp9ICk7CgoKCgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPwoJCQl0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6CgkJCXRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0KfSApOwoKLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55Ci8vIGFyZ3VtZW50cy4KLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKQovLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb24KalF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJdmFyIHRtcCwgYXJncywgcHJveHk7CgoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJdG1wID0gZm5bIGNvbnRleHQgXTsKCQljb250ZXh0ID0gZm47CgkJZm4gPSB0bXA7Cgl9CgoJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCglpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkgewoJCXJldHVybiB1bmRlZmluZWQ7Cgl9CgoJLy8gU2ltdWxhdGVkIGJpbmQKCWFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Cgl9OwoKCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJcmV0dXJuIHByb3h5Owp9OwoKalF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkgewoJaWYgKCBob2xkICkgewoJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCX0gZWxzZSB7CgkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7Cgl9Cn07CmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKalF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7CmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lOwpqUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93OwpqUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlOwpqUXVlcnkudHlwZSA9IHRvVHlwZTsKCmpRdWVyeS5ub3cgPSBEYXRlLm5vdzsKCmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkgewoKCS8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvCgkvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpCgkvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKQoJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CglyZXR1cm4gKCB0eXBlID09PSAibnVtYmVyIiB8fCB0eXBlID09PSAic3RyaW5nIiApICYmCgoJCS8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzICgiIikKCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQoJCS8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgoJCSFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTsKfTsKCgoKCi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgovLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAovLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQovLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoKLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhbgovLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQovLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCgppZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5OwoJfSApOwp9CgoKCgp2YXIKCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoKCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfJCA9IHdpbmRvdy4kOwoKalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cuJCA9IF8kOwoJfQoKCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CgkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Cgl9CgoJcmV0dXJuIGpRdWVyeTsKfTsKCi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1ECi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQppZiAoICFub0dsb2JhbCApIHsKCXdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKfQoKCgoKcmV0dXJuIGpRdWVyeTsKfSApOwo=" >
tail j=5412 line=
tail j=5413 line= </script>
tail j=5414 line=
tail j=5415 line=<!-- <script type="text/javascript" src="js/custom.js"></script> -->
tail j=5416 line=<!-- <script type="text/javascript" src="js/custom.js"></script> -->
tail j=5417 line=
tail j=5418 line=
tail j=5419 line= <script id="script_file" type="text/javascript">
tail j=5420 line= $(function() {
tail j=5421 line=// grab the file input and bind a change event onto it
tail j=5422 line= $('#file').bind("change", function() {
tail j=5423 line=// new html5 formdata object.
tail j=5424 line= var formData = new FormData();
tail j=5425 line=// for each entry, add to formdata to later access via $_FILES["file" + i]
tail j=5426 line= for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
tail j=5427 line= formData.append("file" + i, document.getElementById('file').files[i]);
tail j=5428 line= }
tail j=5429 line=
tail j=5430 line=//send formdata to server-side
tail j=5431 line= $.ajax({
tail j=5432 line=// url: "file-upload.php", // our php file
tail j=5433 line=// url: "ka1_fileupload.php", // our php file
tail j=5434 line=// nurl: "http://ka1/ka1.php?q=up", // our php file
tail j=5435 line=// url: "/kup.php", // our php file
tail j=5436 line=// url: "/ka1_up.php", // our php file
tail j=5437 line=// url: "/ka1.php?q=kup", // our php file
tail j=5438 line=// url: "/ko0.php?q=kup", // our php file
tail j=5439 line=// url: "/ko1.php?q=kup", // our php file
tail j=5440 line= url: "/ko2.php?q=kup", // our php file
tail j=5441 line=// bugs url: "10.0.0.112:/ka1.php?q=up", // our php file
tail j=5442 line= type: 'post',
tail j=5443 line= data: formData,
tail j=5444 line= dataType: 'html', // we return html from our php file
tail j=5445 line= async: true,
tail j=5446 line= processData: false, // tell jQuery not to process the data
tail j=5447 line= contentType: false, // tell jQuery not to set contentType
tail j=5448 line= success : function(data) {
tail j=5449 line= $('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
tail j=5450 line= $('#upload-result .alert').append(data);
tail j=5451 line= },
tail j=5452 line= error : function(request) {
tail j=5453 line= console.log(request.responseText);
tail j=5454 line= }
tail j=5455 line= });
tail j=5456 line= });
tail j=5457 line= });
tail j=5458 line= </script id="script_file" >
tail j=5459 line=
tail j=5460 line= <hr color=white>
tail j=5461 line= <hr color=black>
tail j=5462 line= <div id='editableDiv' contenteditable='true'>paste
tail j=5463 line= </div id="editableDiv" >
tail j=5464 line= <hr color=black>
tail j=5465 line= <hr color=white>
tail j=5466 line= <hr color=black>
tail j=5467 line= <div id="div_ffpaste" contenteditable='true'>ffpaste
tail j=5468 line= </div id="div_ffpaste">
tail j=5469 line= <hr color=black>
tail j=5470 line= <hr color=white>
tail j=5471 line=
tail j=5472 line= <script id="script_clipboard" >
tail j=5473 line= function handlePaste (e) {
tail j=5474 line= var clipboardData, pastedData;
tail j=5475 line=
tail j=5476 line=// Stop data actually being pasted into div
tail j=5477 line= e.stopPropagation();
tail j=5478 line= e.preventDefault();
tail j=5479 line=
tail j=5480 line=// Get pasted data via clipboard API
tail j=5481 line= clipboardData = e.clipboardData || window.clipboardData;
tail j=5482 line= pastedData = clipboardData.getData('Text');
tail j=5483 line=
tail j=5484 line=// Do whatever with pasteddata
tail j=5485 line= alert(pastedData);
tail j=5486 line= }
tail j=5487 line=
tail j=5488 line= document.getElementById('editableDiv').addEventListener('paste', handlePaste);
tail j=5489 line= </script id="script_clipboard" >
tail j=5490 line=
tail j=5491 line=
tail j=5492 line= <script id="script_clipboard_ff" >
tail j=5493 line= function handlepaste_ff (e) {
tail j=5494 line= var types, pastedData, savedContent;
tail j=5495 line=
tail j=5496 line=// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
tail j=5497 line= if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {
tail j=5498 line=
tail j=5499 line=// Check for 'text/html' in types list. See abligh's answer below for deatils on
tail j=5500 line=// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
tail j=5501 line=// Safari/Edge don't advertise HTML data even if it is available
tail j=5502 line= types = e.clipboardData.types;
tail j=5503 line= if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {
tail j=5504 line=
tail j=5505 line=// Extract data and pass it to callback
tail j=5506 line= pastedData = e.clipboardData.getData('text/html');
tail j=5507 line=// processPaste(editableDiv, pastedData);
tail j=5508 line= processPaste_ff(editableDiv, pastedData);
tail j=5509 line=
tail j=5510 line=// Stop the data from actually being pasted
tail j=5511 line= e.stopPropagation();
tail j=5512 line= e.preventDefault();
tail j=5513 line= return false;
tail j=5514 line= }
tail j=5515 line= }
tail j=5516 line=
tail j=5517 line=// Everything else: Move existing element contents to a DocumentFragment for safekeeping
tail j=5518 line= savedContent = document.createDocumentFragment();
tail j=5519 line= while(editableDiv.childNodes.length > 0) {
tail j=5520 line= savedContent.appendChild(editableDiv.childNodes[0]);
tail j=5521 line= }
tail j=5522 line=
tail j=5523 line=// Then wait for browser to paste content into it and cleanup
tail j=5524 line= waitForPastedData(editableDiv, savedContent);
tail j=5525 line= return true;
tail j=5526 line= }
tail j=5527 line=
tail j=5528 line= function waitForPastedData (elem, savedContent) {
tail j=5529 line=
tail j=5530 line=// If data has been processes by browser, process it
tail j=5531 line= if (elem.childNodes && elem.childNodes.length > 0) {
tail j=5532 line=
tail j=5533 line=// Retrieve pasted content via innerHTML
tail j=5534 line=// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
tail j=5535 line= var pastedData = elem.innerHTML;
tail j=5536 line=
tail j=5537 line=// Restore saved content
tail j=5538 line= elem.innerHTML = "";
tail j=5539 line= elem.appendChild(savedContent);
tail j=5540 line=
tail j=5541 line=// Call callback
tail j=5542 line= processPaste_ff(elem, pastedData);
tail j=5543 line= }
tail j=5544 line=
tail j=5545 line=// Else wait 20ms and try again
tail j=5546 line= else {
tail j=5547 line= setTimeout(function () {
tail j=5548 line= waitForPastedData(elem, savedContent)
tail j=5549 line= }, 20);
tail j=5550 line= }
tail j=5551 line= }
tail j=5552 line=
tail j=5553 line= function processPaste_ff (elem, pastedData) {
tail j=5554 line=// Do whatever with gathered data;
tail j=5555 line= alert(pastedData);
tail j=5556 line= elem.focus();
tail j=5557 line= }
tail j=5558 line=
tail j=5559 line=// Modern browsers. Note: 3rd argument is required for Firefox <= 6
tail j=5560 line= if (editableDiv.addEventListener) {
tail j=5561 line= editableDiv.addEventListener('paste', handlepaste, false);
tail j=5562 line= }
tail j=5563 line=// IE <= 8
tail j=5564 line= else {
tail j=5565 line= editableDiv.attachEvent('onpaste', handlepaste);
tail j=5566 line= }
tail j=5567 line=
tail j=5568 line= $(document).on('paste','[contenteditable]',function(e) {
tail j=5569 line= e.preventDefault();
tail j=5570 line= var text = (e.originalEvent || e).clipboardData.getData('text/plain');
tail j=5571 line= window.document.execCommand('insertText', false, text);
tail j=5572 line= });
tail j=5573 line= </script id="script_clipboard_ff" >
tail j=5574 line=
tail j=5575 line= <script id="script_clipboard_jskit" >
tail j=5576 line= function getSelectionText(){
tail j=5577 line= var selectedText = ""
tail j=5578 line= if (window.getSelection){ // all modern browsers and IE9+
tail j=5579 line= selectedText = window.getSelection().toString()
tail j=5580 line= }
tail j=5581 line= return selectedText
tail j=5582 line= }
tail j=5583 line=
tail j=5584 line=
tail j=5585 line= document.addEventListener('mouseup', function(){
tail j=5586 line= var thetext = getSelectionText()
tail j=5587 line= if (thetext.length > 0){ // check there's some text selected
tail j=5588 line= console.log(thetext) // logs whatever textual content the user has selected on the page
tail j=5589 line= }
tail j=5590 line= }, false)
tail j=5591 line=
tail j=5592 line= function copySelectionText(){
tail j=5593 line= var copysuccess // var to check whether execCommand successfully executed
tail j=5594 line= try{
tail j=5595 line= copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
tail j=5596 line= }
tail j=5597 line= catch(e){
tail j=5598 line= copysuccess = false
tail j=5599 line= }
tail j=5600 line= return copysuccess
tail j=5601 line= }
tail j=5602 line=
tail j=5603 line= </script id="script_clipboard_jskit" >
tail j=5604 line=
tail j=5605 line=<!--
tail j=5606 line= <div name="div_dd" id="div_dd" hidden>
tail j=5607 line= <div id="drop">
tail j=5608 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=5609 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=5610 line= <img height=200 width=300
tail j=5611 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=5612 line= </a>
tail j=5613 line= </div>
tail j=5614 line=
tail j=5615 line= <div id="drag"> jtfdc:<br />
tail j=5616 line= <img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=5617 line=
tail j=5618 line= <div class="drg"><h1>konet llc </h1>
tail j=5619 line= <pre>timejask jkwii</pre>
tail j=5620 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=5621 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=5622 line= <pre>timesak skwii</pre>
tail j=5623 line= </div>
tail j=5624 line=
tail j=5625 line= <div class="drg"><h1>jtf29 </h1>
tail j=5626 line= <a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=5627 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=5628 line= </a>
tail j=5629 line= </div>
tail j=5630 line=
tail j=5631 line=
tail j=5632 line= <div class="drg"><h1>dogheads</h1>
tail j=5633 line= <div id="div_jtf_vid5">
tail j=5634 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=5635 line= <source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5636 line= </video>
tail j=5637 line= </div>
tail j=5638 line= </div>
tail j=5639 line=
tail j=5640 line= <div class="drg"><h1>jtfdc night court lights action 3720</h1>
tail j=5641 line= <div id="div_vid">
tail j=5642 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=5643 line= <source src="index_avril.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5644 line= <source src="index_avril.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=5645 line= </video>
tail j=5646 line= </div>
tail j=5647 line= </div>
tail j=5648 line= </div>
tail j=5649 line= </div>
tail j=5650 line= -->
tail j=5651 line=
tail j=5652 line= <script id="script_ytlist_load" >
tail j=5653 line= function ytlist_load() {
tail j=5654 line= j=0;;
tail j=5655 line=
tail j=5656 line= ytlist[j++] = 'ko0|ko0|ko0.us|';
tail j=5657 line= ytlist[j++] = 'ko2|ko2|ko2.us|';
tail j=5658 line= ytlist[j++] = '|duckduck_go|https://duckduckgo.com/';
tail j=5659 line= ytlist[j++] = '|jpl_curiosity|https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2287';
tail j=5660 line= ytlist[j++] = '|jpl_insight|https://mars.nasa.gov/insight/';
tail j=5661 line= ytlist[j++] = '|jpl_bennu|http://pluto.jhuapl.edu/';
tail j=5662 line= ytlist[j++] = '|jpl_osirisrex_thule|https://www.asteroidmission.org/';
tail j=5663 line= ytlist[j++] = '|whatsitmean|http://whatdoesitmean.com/|';
tail j=5664 line= ytlist[j++] = '|dailymail|https://www.dailymail.co.uk/ushome/index.html';
tail j=5665 line= ytlist[j++] = '|zerohedge|http://zerohedge.com/';
tail j=5666 line= ytlist[j++] = 'bluehost|http://bluehost.com/track/konet/ko2.us|';
tail j=5667 line= ytlist[j++] = '|webb|webb_george|https://www.youtube.com/results?search_query=webb_george';
tail j=5668 line= ytlist[j++] = '|preppy|preppy_kitty|https://www.youtube.com/results?search_query=prepper+kitty';
tail j=5669 line= ytlist[j++] = '|quinn|quinn_micheals||https://www.youtube.com/user/quinnmichaels';
tail j=5670 line= ytlist[j++] = '|kennedy|kennedy|https://www.youtube.com/channel/UCl609oqTRx-zBZ4vPfN2mqA';
tail j=5671 line= ytlist[j++] = '|stropyme|stroppy_me|https://www.youtube.com/results?search_query=stroppy+me|';
tail j=5672 line= ytlist[j++] = '|outerlite|outer_light|https://www.youtube.com/results?search_query=outer+light|';
tail j=5673 line= ytlist[j++] = '|munder|munder|https://www.youtube.com/user/1Munder1|';
tail j=5674 line= ytlist[j++] = '|dahboo77|dahboo77|https://www.youtube.com/results?search_query=dahboo77';
tail j=5675 line= ytlist[j++] = '|secureteam|secureteam10|https://www.youtube.com/results?search_query=secureteam10';
tail j=5676 line= ytlist[j++] = '|vlad96|vlad9t|https://www.youtube.com/results?search_query=vlad9t';
tail j=5677 line= ytlist[j++] = '|newearth|newearth|https://www.youtube.com/results?search_query=new+earth';
tail j=5678 line= ytlist[j++] = '|forester|forester_brian|https://www.youtube.com/results?search_query=brian+forrester';
tail j=5679 line= ytlist[j++] = '|hoagland|hoagland|https://www.youtube.com/results?search_query=hoagland+richard';
tail j=5680 line= ytlist[j++] = '|levenda||levenda|https://www.youtube.com/results?search_query=levenda+peter|';
tail j=5681 line= ytlist[j++] = 'borealus|borealus_forum|https://www.youtube.com/results?search_query=borealis+forum';
tail j=5682 line= ytlist[j++] = '|earthfiles|howe_linda_moultan|https://www.youtube.com/results?search_query=howe+linda';
tail j=5683 line= ytlist[j++] = '|newsbud|https://www.youtube.com/results?search_query=newsbud|';
tail j=5684 line= ytlist[j++] = '|lional|lional_nation|https://www.youtube.com/results?search_query=lionel+nation|';
tail j=5685 line= ytlist[j++] = '|gooman|jason_goodman|https://www.youtube.com/channel/UC8Cl9QaRtuW9CNjP7pP4BBQ|';
tail j=5686 line= ytlist[j++] = '|cernovich|cernovich|https://www.youtube.com/results?search_query=cernovich|';
tail j=5687 line= ytlist[j++] = '|conte|conte_marcus|https://www.youtube.com/results?search_query=conte+marcus|';
tail j=5688 line= ytlist[j++] = '|fulford|fulford_benjamin|https://www.youtube.com/results?search_query=fulford+benjamin';
tail j=5689 line= ytlist[j++] = '||Julijana Sarac I Put A Spell On You|https://www.youtube.com/watch?v=jGhA2_ZcRVY&list=RDjGhA2_ZcRVY&start_radio=1';
tail j=5690 line=
tail j=5691 line= ytlist[j++] = 'redding|dreams_to_remeber|pn://www.youtube.com/watch?v=8UOf6kngJGw&list=RD8UOf6kngJGw&start_radio=1';
tail j=5692 line=
tail j=5693 line= ytlist[j++] = '|haggard|A place to fall apart Merle Haggard Janie Fricke|https://www.youtube.com/watch?v=iXPdB1ykWHE&list=RDiXPdB1ykWHE&start_radio=1|';
tail j=5694 line=
tail j=5695 line= ytlist[j++] = '|dreamers|Freddie & The Dreamers ~ I Understand/Auld Lang Syne|http://www.youtube.com/watch?v=Hy0AGS13dqc';
tail j=5696 line=
tail j=5697 line= ytlist[j++] = '|dreamers|telln_you_now_dreamers|https://www.youtube.com/watch?v=Qu3Yk_0oRy0&start_radio=1&list=RDQu3Yk_0oRy0';
tail j=5698 line=
tail j=5699 line= ytlist[j++] = '|drezmers|hog4u|https://www.youtube.com/watch?v=911rMO4l0sA';
tail j=5700 line=
tail j=5701 line= ytlist[j++] = '|cher|sony_cher-gotubabe|https://www.youtube.com/watch?v=Vp2Du8j2_L0';
tail j=5702 line=
tail j=5703 line= ytlist[j++] = '|remR|Everybody Hurts (Live at Glastonbury 2003) HQ|http://www.youtube.com/watch?v=NLlOeGeVih4';
tail j=5704 line=
tail j=5705 line= ytlist[j++] = '|once|once_upontime_west|https://www.youtube.com/watch?v=kOy6M_X2MO8';
tail j=5706 line=
tail j=5707 line= ytlist[j++] = '|pale|procol_harme_litershade_denmark|https://www.youtube.com/watch?v=St6jyEFe5WM';
tail j=5708 line=
tail j=5709 line= ytlist[j++] = '|pale|Procol Harum Whiter Shade of Pale 2verses|http://www.youtube.com/watch?v=vIWCSrG1d-Y';
tail j=5710 line=
tail j=5711 line= ytlist[j++] = 'deadsouth| - In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY|';
tail j=5712 line= ytlist[j++] = '|pale|shadofpale_ships|https://www.youtube.com/watch?v=PYBqv3NIqho';
tail j=5713 line=
tail j=5714 line= ytlist[j++] = '|caro| nightlikethis|https://www.youtube.com/watch?v=Fc6izYdLhNE';
tail j=5715 line=
tail j=5716 line= ytlist[j++] = '|waits|time_cover_guitar|http://www.youtube.com/watch?v=uja4SHnfogo';
tail j=5717 line=
tail j=5718 line= ytlist[j++] = 'morrison|4seasons_back_on_top|https://www.youtube.com/watch?v=7fjTY_ABMj0&list=PL5A2209DE63BA79B8';
tail j=5719 line=
tail j=5720 line= ytlist[j++] = 'gurumal|delta_Delta Bayini|https://www.youtube.com/watch?v=oi6zbPjtO6I';
tail j=5721 line=
tail j=5722 line= ytlist[j++] = '|cohen|youb_you_got_me_singin|https://www.youtube.com/watch?v=3sFsT9vT6Fo';
tail j=5723 line=
tail j=5724 line= ytlist[j++] = 'dreamers|iunderst|https://www.youtube.com/watch?v=yo-1Des8i5M&list=PL9DF20D3DD3895F1C&index=4';
tail j=5725 line=
tail j=5726 line= ytlist[j++] = 'sledge|dark_end_of_the_street|https://www.youtube.com/watch?v=Gj3UdRmhgvM';
tail j=5727 line=
tail j=5728 line= ytlist[j++] = 'oesch|bavaria_yodl| https://www.youtube.com/watch?v=hVjNxV7qM90';
tail j=5729 line=
tail j=5730 line= ytlist[j++] = 'hagardlife_isgone2hellhttps://www.youtube.com/watch?v=iXPdB1ykWHE&start_radio=1&list=RDMMiXPdB1ykWHE';
tail j=5731 line=
tail j=5732 line= ytlist[j++] = 'claypton|xmas| https://www.youtube.com/watch?v=R7iKUCWTNWc&list=RDR7iKUCWTNWc&start_radio=1';
tail j=5733 line=
tail j=5734 line= ytlist[j++] = 'Guadalupe Pineda|Historia De Un Amor|https://www.youtube.com/watch?v=HzjE33U_gy8';
tail j=5735 line=
tail j=5736 line= ytlist[j++] = 'deadsouth|In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY';
tail j=5737 line=
tail j=5738 line= ytlist[j++] = 'morisson|4seasons|https://www.youtube.com/watch?v=zbxUXAMUeGk&list=PLFCFB9B1A93E89756&index=10';
tail j=5739 line=
tail j=5740 line= ytlist[j++] = 'morisan|playhousedown|https://www.youtube.com/watch?v=b0jqe40gmH4&list=PLFCFB9B1A93E89756&index=5';
tail j=5741 line=
tail j=5742 line= ytlist[j++] = '|van_morison|end_ofthe_land|https://www.youtube.com/watch?v=dui7_N0g_VY&index=6&list=PLFCFB9B1A93E89756';
tail j=5743 line=
tail j=5744 line= ytlist[j++] = '|vanloss|stariway|https://www.youtube.com/watch?v=gCE0MapWKJ8&index=7&list=PLFCFB9B1A93E89756';
tail j=5745 line=
tail j=5746 line= ytlist[j++] = 'fureys|last lovesong| https://www.youtube.com/watch?v=yNFiD1ZQZLU';
tail j=5747 line=
tail j=5748 line= ytlist[j++] = '|rush|cirlce_game|https://www.youtube.com/watch?v=q_C_rOOdXxs';
tail j=5749 line=
tail j=5750 line= ytlist[j++] = '|rush|circlgam2|https://www.youtube.com/watch?v=9yN-6PbqAPM';
tail j=5751 line=
tail j=5752 line= ytlist[j++] = 'rush|remberbergame| https://www.youtube.com/watch?v=xMFtm02rgF0';
tail j=5753 line=
tail j=5754 line= ytlist[j++] = 'lucinda_williams|broken_butterflies|https://www.youtube.com/watch?v=gLQ23LLtKJk';
tail j=5755 line=
tail j=5756 line=
tail j=5757 line= ytlist[j++] = 'kou|python|https://www.youtube.com/watch?v=rfscVS0vtbw';
tail j=5758 line=
tail j=5759 line= ytlist[j++] = 'kou|blender28|https://www.youtube.com/watch?v=jBqYTgaFDxU';
tail j=5760 line=
tail j=5761 line= ytlist[j++] = 'kou|html|https://www.youtube.com/watch?v=pQN-pnXPaVg';
tail j=5762 line=
tail j=5763 line= ytlist[j++] = 'kou|sqlite3|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5764 line=
tail j=5765 line=
tail j=5766 line= ytlist[j++] = 'kou|visual_studio|https://www.youtube.com/watch?v=fnPhJHN0jTE';
tail j=5767 line=
tail j=5768 line= ytlist[j++] = 'kou|visual_studio_py|https://www.youtube.com/watch?v=72Alzsz8RyI';
tail j=5769 line=
tail j=5770 line=
tail j=5771 line= ytlist[j++] = 'kou|php|https://www.youtube.com/watch?v=OK_JCtrrv-c';
tail j=5772 line=
tail j=5773 line= ytlist[j++] = 'kou|tensor|https://www.youtube.com/watch?v=tYYVSEHq-io';
tail j=5774 line=
tail j=5775 line= ytlist[j++] = 'kou|go|https://www.youtube.com/watch?v=5PTXdR8hLlQ';
tail j=5776 line=
tail j=5777 line= ytlist[j++] = 'kou|vi|https://www.youtube.com/watch?v=HMpB28l1sLc';
tail j=5778 line=
tail j=5779 line= ytlist[j++] = 'kou|tech_ingredients_speakers|https://www.youtube.com/watch?v=zdkyGDqU7xA';
tail j=5780 line=
tail j=5781 line= ytlist[j++] = 'kou|tech_ingredients_labshop|https://www.youtube.com/watch?v=nZefdoHmtJo';
tail j=5782 line=
tail j=5783 line= ytlist[j++] = 'kou|tech_ingredients_magnetics|https://www.youtube.com/watch?v=LS3GQk9ETRU';
tail j=5784 line=
tail j=5785 line= ytlist[j++] = 'kou|3dprint|https://www.youtube.com/watch?v=3LBTkLsjHGQ';
tail j=5786 line=
tail j=5787 line= ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5788 line=
tail j=5789 line= ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5790 line=
tail j=5791 line= alert( "BUGS_4715 ytlist len="+j );
tail j=5792 line= }
tail j=5793 line=
tail j=5794 line= </script id="script_ytlist_load" >
tail j=5795 line=
tail j=5796 line=
tail j=5797 line=<!---
tail j=5798 line= <script id="script_dragable" type="text/javascript">
tail j=5799 line=
tail j=5800 line= $(document).ready(function() {
tail j=5801 line=// sets the draggable
tail j=5802 line= $('#drag .drg').draggable({
tail j=5803 line= cursor: 'move', // sets the cursor apperance
tail j=5804 line= revert: 'valid'
tail j=5805 line= });
tail j=5806 line=
tail j=5807 line=
tail j=5808 line=// sets droppable
tail j=5809 line=// after the draggable is droped, hides it with a hide() effect
tail j=5810 line= $('#drop').droppable({
tail j=5811 line= drop: function(event, ui) {
tail j=5812 line= ui.draggable.hide(1000);
tail j=5813 line=
tail j=5814 line= }
tail j=5815 line= });
tail j=5816 line=
tail j=5817 line=// after the draggable is droped, hides it with a hide() effect
tail j=5818 line= $('#drop1').droppable({
tail j=5819 line= drop: function(event, ui) {
tail j=5820 line= ui.draggable.hide(1000);
tail j=5821 line= }
tail j=5822 line= });
tail j=5823 line=
tail j=5824 line= $('#drop2').droppable({
tail j=5825 line= drop: function(event, ui) {
tail j=5826 line=// after the draggable is droped, hides it with a hide() effect
tail j=5827 line= ui.draggable.hide(1000);
tail j=5828 line= }
tail j=5829 line= });
tail j=5830 line=
tail j=5831 line=// when the "#sw" element (inside the "#drop") is clicked
tail j=5832 line=// show the items with class "drg", contained in "#drag"
tail j=5833 line=// $('#drag .drg').slideDown(1000);
tail j=5834 line= $('#drop #sw').click(function(){
tail j=5835 line= var url = "https://ka6//ko_center/ko_center.php?q=jqui/dragdrop1/"
tail j=5836 line= $(location).attr('href',url);
tail j=5837 line= });
tail j=5838 line= });
tail j=5839 line= </script>
tail j=5840 line= -->
tail j=5841 line=<!--
tail j=5842 line=
tail j=5843 line= <style type="text/css">
tail j=5844 line= #drop {
tail j=5845 line= width:200px;
tail j=5846 line= height:150px;
tail j=5847 line= margin:3px auto;
tail j=5848 line= background:#eddaa8;
tail j=5849 line= font-size:16px;
tail j=5850 line= }
tail j=5851 line= #drop #sw { text-decoration:underline; cursor:pointer; }
tail j=5852 line= #drag {
tail j=5853 line=// width:450px;
tail j=5854 line=// height:180px;
tail j=5855 line= width:50px;
tail j=5856 line= height:50px;
tail j=5857 line=
tail j=5858 line= margin:12px auto;
tail j=5859 line= border:1px solid darkslategrey;
tail j=5860 line=// border:1px solid silver;
tail j=5861 line= font-size:16px;
tail j=5862 line= }
tail j=5863 line= #drag .drg { margin:10px 12px; }
tail j=5864 line= #drag div.drg {
tail j=5865 line= width:150px;
tail j=5866 line= height:50px;
tail j=5867 line= background:#07da08;
tail j=5868 line= border:2px solid lightblue;
tail j=5869 line= }
tail j=5870 line= </style>
tail j=5871 line= -->
tail j=5872 line=
tail j=5873 line=
tail j=5874 line=
tail j=5875 line=<!--
tail j=5876 line= <div name="div_dd" id="div_dd" hidden>
tail j=5877 line= <div id="drop">
tail j=5878 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=5879 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=5880 line= <img height=200 width=300
tail j=5881 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=5882 line= </a>
tail j=5883 line= </div>
tail j=5884 line= -->
tail j=5885 line=<!--
tail j=5886 line= <div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
tail j=5887 line= <img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=5888 line=
tail j=5889 line= <div class="drg"><h1>konet llc </h1>
tail j=5890 line= <pre>timejask jkwii</pre>
tail j=5891 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=5892 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=5893 line= <pre>timesak skwii</pre>
tail j=5894 line= </div>
tail j=5895 line=
tail j=5896 line= <div class="drg"><h1>jtf29 </h1>
tail j=5897 line= <a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=5898 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=5899 line= </a>
tail j=5900 line= </div>
tail j=5901 line=
tail j=5902 line=
tail j=5903 line= <div class="drg"><h1>dogheads</h1>
tail j=5904 line= <div id="div_jtf_vid5">
tail j=5905 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=5906 line= <source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5907 line= </video>
tail j=5908 line= </div>
tail j=5909 line= </div>
tail j=5910 line=
tail j=5911 line= <div class="drg"><h1>jtfdc night court lights action 3720</h1>
tail j=5912 line= <div id="div_vid">
tail j=5913 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=5914 line= <source src="index_avril.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5915 line= <source src="index_avril.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=5916 line= </video>
tail j=5917 line= </div>
tail j=5918 line= </div>
tail j=5919 line= </div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
tail j=5920 line= </div>
tail j=5921 line= -->
tail j=5922 line=
tail j=5923 line= <div id="myCanvas_jkwii" ></div>
tail j=5924 line=
tail j=5925 line=<!--
tail j=5926 line= <script id="script_js_bb_onload" type='text/javascript'>
tail j=5927 line= window.onload = function() {
tail j=5928 line=// startup();
tail j=5929 line= var myCanvas = document.getElementById('myCanvas_jkwii');
tail j=5930 line= var ctx = myCanvas.getContext('2d');
tail j=5931 line=
tail j=5932 line= myCanvas.width = window.innerWidth; myCanvas.height = window.innerHeight;
tail j=5933 line= myCanvas.width = window.innerWidth / 2; myCanvas.height = window.innerHeight / 2 ;
tail j=5934 line= ctx.fillStyle='black'
tail j=5935 line= ctx.fillStyle='white'
tail j=5936 line= ctx.fillStyle='blue'
tail j=5937 line= ctx.fillRect(0, 0, myCanvas.width, myCanvas.height);
tail j=5938 line= }
tail j=5939 line= </script id="script_js_bb_onload" >
tail j=5940 line=
tail j=5941 line= <script id="script_js_bb_mouse" >
tail j=5942 line=// Mouse Event Handlers
tail j=5943 line= if(myCanvas){
tail j=5944 line= var isDown = false;
tail j=5945 line= var canvasX, canvasY;
tail j=5946 line= ctx.lineWidth = 5;
tail j=5947 line=
tail j=5948 line=
tail j=5949 line= $(myCanvas)
tail j=5950 line= .mousedown(function(e){
tail j=5951 line= isDown = true;
tail j=5952 line= ctx.beginPath();
tail j=5953 line= canvasX = e.pageX - myCanvas.offsetLeft;
tail j=5954 line= canvasY = e.pageY - myCanvas.offsetTop;
tail j=5955 line= ctx.moveTo(canvasX, canvasY);
tail j=5956 line= })
tail j=5957 line= .mousemove(function(e){
tail j=5958 line= if(isDown !== false) {
tail j=5959 line= canvasX = e.pageX - myCanvas.offsetLeft;
tail j=5960 line= canvasY = e.pageY - myCanvas.offsetTop;
tail j=5961 line= ctx.lineTo(canvasX, canvasY);
tail j=5962 line=// ctx.strokeStyle = '#000';
tail j=5963 line= ctx.strokeStyle = '#fff';
tail j=5964 line=
tail j=5965 line= ctx.stroke();
tail j=5966 line= }
tail j=5967 line= })
tail j=5968 line= .mouseup(function(e){
tail j=5969 line= isDown = false;
tail j=5970 line= ctx.closePath();
tail j=5971 line= });
tail j=5972 line= }
tail j=5973 line=
tail j=5974 line=// Touch Events Handlers
tail j=5975 line= draw = {
tail j=5976 line= started: false,
tail j=5977 line= start: function(evt) {
tail j=5978 line=
tail j=5979 line= ctx.beginPath();
tail j=5980 line= ctx.moveTo(
tail j=5981 line= evt.touches[0].pageX,
tail j=5982 line= evt.touches[0].pageY
tail j=5983 line= );
tail j=5984 line=
tail j=5985 line= this.started = true;
tail j=5986 line=
tail j=5987 line= },
tail j=5988 line= move: function(evt) {
tail j=5989 line=
tail j=5990 line= if (this.started) {
tail j=5991 line= ctx.lineTo(
tail j=5992 line= evt.touches[0].pageX,
tail j=5993 line= evt.touches[0].pageY
tail j=5994 line= );
tail j=5995 line=
tail j=5996 line= ctx.strokeStyle = '#000';
tail j=5997 line= ctx.lineWidth = 5;
tail j=5998 line= ctx.stroke();
tail j=5999 line= }
tail j=6000 line=
tail j=6001 line= },
tail j=6002 line= end: function(evt) {
tail j=6003 line= this.started = false;
tail j=6004 line= }
tail j=6005 line= };
tail j=6006 line=
tail j=6007 line=// Touch Events
tail j=6008 line= myCanvas.addEventListener('touchstart', draw.start, false);
tail j=6009 line= myCanvas.addEventListener('touchend', draw.end, false);
tail j=6010 line= myCanvas.addEventListener('touchmove', draw.move, false);
tail j=6011 line=
tail j=6012 line=// Disable Page Move
tail j=6013 line= document.body.addEventListener('touchmove',function(evt){
tail j=6014 line= evt.preventDefault();
tail j=6015 line= },false);
tail j=6016 line= };
tail j=6017 line= </script id="script_js_bb_mouse" >
tail j=6018 line=
tail j=6019 line= <script id="script_js_bb">
tail j=6020 line=// var c5 = document.getElementById("c5");
tail j=6021 line=// var c5_context = c5.getContext("2d");
tail j=6022 line= var c5 = document.getElementById("myCanvas");
tail j=6023 line= var c5_context = c5.getContext("2d");
tail j=6024 line=
tail j=6025 line= var dragon = new Image();
tail j=6026 line= dragon.src = 'dragon.png';
tail j=6027 line= var img = new Image();
tail j=6028 line= img.src = 'dragon.png';
tail j=6029 line=
tail j=6030 line= function draw_img() {
tail j=6031 line= c5_context.drawImage(img, 100, 5);
tail j=6032 line= }
tail j=6033 line= </script id="script_js_bb">
tail j=6034 line=
tail j=6035 line=
tail j=6036 line= <script id=script_mycanvas_write >
tail j=6037 line=// mycanvas_write( context, x, y, font, fontsize, fillstyle, text );
tail j=6038 line= function mycanvas_write( ctx, x, y, font, fontsize, fillstyle, text ) {
tail j=6039 line=// ctx.font = 'italic bold 30px sans-serif';
tail j=6040 line= ctx.fillStyle = 'white';
tail j=6041 line= ctx.fillStyle = 'black';
tail j=6042 line= ctx.fillStyle = "'" + fillstyle + "'";
tail j=6043 line= ctx.fillStyle = fillstyle;
tail j=6044 line= ctx.font = 'italic bold 30px roman';
tail j=6045 line= ctx.font = 'italic bold 30px arial';
tail j=6046 line= ctx.font = 'italic bold 30px monospace';
tail j=6047 line= ctx.font = 'italic bold 30px cursive';
tail j=6048 line= ctx.font = 'italic bold 30px fantasy';
tail j=6049 line= ctx.font = 'italic bold 30px yokkmokkOT';
tail j=6050 line= ctx.font = 'bold 30px sans-serif';
tail j=6051 line=// ctx.font = 'italic bold ' + fontsize + " " + font;
tail j=6052 line= ctx.font = '' + fontsize + " " + font;
tail j=6053 line= ctx.textBaseline = 'bottom';
tail j=6054 line= ctx.fillText( text, x, y);
tail j=6055 line= }
tail j=6056 line=
tail j=6057 line= function mycanvas_write0( ctx0, text, fillstyle, x, y ) {
tail j=6058 line= ctx0.fillStyle = 'white';
tail j=6059 line= ctx0.fillStyle = fillstyle;
tail j=6060 line= ctx0.font = 'italic bold 30px yokkmokkOT';
tail j=6061 line= ctx0.textBaseline = 'bottom';
tail j=6062 line=// ctx0.fillText('timejak-0: jkwii', x, y);
tail j=6063 line= ctx0.fillText( text, x, y);
tail j=6064 line= }
tail j=6065 line= </script id=script_mycanvas_write >
tail j=6066 line= -->
tail j=6067 line=
tail j=6068 line= <img src="/imgs/btn/koeye.png" onclick="script_ajax()">
tail j=6069 line= <script id="script_ajax">
tail j=6070 line= php="index_ko.php";
tail j=6071 line= db3="index_ko.db3";
tail j=6072 line= sql="select * from list limit 5";
tail j=6073 line= script_ajax(php,db3,sql)
tail j=6074 line= function script_ajax(php, db3,sql) {
tail j=6075 line= alert( "BUGS_4895" )
tail j=6076 line= $("button").click(function(){
tail j=6077 line= $.post( php, {
tail j=6078 line= db3: db3,
tail j=6079 line= sql: "select * from list limit 10"
tail j=6080 line= },
tail j=6081 line= function(data, status){
tail j=6082 line= line = data.split("\n");
tail j=6083 line= htmout="";
tail j=6084 line= for( z=0; z<line.length; z++ ) {
tail j=6085 line= htmout += "<a href="+line+" target=_blank>";
tail j=6086 line= htmout += " <img src="+line+" border=0>";
tail j=6087 line= htmout += " </a>";
tail j=6088 line= }
tail j=6089 line= getelementbyID('div_ajaxdb");
tail j=6090 line=// alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
tail j=6091 line= document.write( htmout );
tail j=6092 line= });
tail j=6093 line= });
tail j=6094 line= }
tail j=6095 line= </script id="script_ajax">
tail j=6096 line=
tail j=6097 line= <script id="script_kolines">
tail j=6098 line= function kolines(color,count,position) {
tail j=6099 line= var htmout = "";
tail j=6100 line= img="/imgs/btn/kob.png";
tail j=6101 line= if( color=="w" ) { img="/imgs/btn/kow.png"; }
tail j=6102 line=// alert( "BUGS_kolines_beg color="+color+" count="+count+" img="+img );
tail j=6103 line=
tail j=6104 line= for( j=1; j<=count; j++ ) {
tail j=6105 line=// alert( "BUGS_kolines_loop color="+color+" count="+count+" img="+img );
tail j=6106 line= htmout += '<img class="drg" height=20 src="'+img+'">';
tail j=6107 line=// alert( "BUGS_kolines_loop j="+j+" color="+color+" count="+count+" htmout="+htmout );
tail j=6108 line= }
tail j=6109 line=
tail j=6110 line=// alert( "BUGS_kolines_end j="+j+" color="+color+" count="+count+" htmout="+htmout );
tail j=6111 line=// htmout += '<img src="/imgs/btn/kop34.png">';
tail j=6112 line=
tail j=6113 line= if( color == 'b' ) {
tail j=6114 line=// div_kolineb = document.getElementById('div_kolineb');
tail j=6115 line=// if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
tail j=6116 line=// if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
tail j=6117 line=// if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6118 line=// if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6119 line=// if( position == "ih" ) div_kolineb.innerHTML( htmout);
tail j=6120 line=
tail j=6121 line=`j if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6122 line= if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6123 line=// if( position == "ae" ) img_kolineb.insertAdjacentElement('afterend', htmout);
tail j=6124 line= }
tail j=6125 line= if( color == 'w' ) {
tail j=6126 line=// div_kolinew = document.getElementById('div_kolinew');
tail j=6127 line=// if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
tail j=6128 line=// if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
tail j=6129 line=// if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6130 line=// if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6131 line=// if( position == "ih" ) div_kolineb.innerHTML( htmout);
tail j=6132 line=
tail j=6133 line= img_kolinew = document.getElementById('img_kolinew' );
tail j=6134 line= if( position == "bb" ) img_kolineb.insertAdjacentHTML('beforebegin', htmout);
tail j=6135 line= if( position == "ab" ) img_kolineb.insertAdjacentHTML('afterbegin', htmout);
tail j=6136 line= if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6137 line= if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6138 line= }
tail j=6139 line= }
tail j=6140 line= </script id="script_kolines">
tail j=6141 line=
tail j=6142 line=
tail j=6143 line=
tail j=6144 line= <hr color=white>
tail j=6145 line= <hr color=black>
tail j=6146 line=
tail j=6147 line= <div id="drag" name="div_drag_2>
tail j=6148 line=<!--
tail j=6149 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
tail j=6150 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','ab' )" >
tail j=6151 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','ih' )" >
tail j=6152 line= <img src="/imgs/btn/kop12.png" onclick="kolines('b','3','ae" )" >
tail j=6153 line= <img src="/imgs/btn/kop34.png" onclick="kolines('b','3','bb" )" >
tail j=6154 line= -->
tail j=6155 line=
tail j=6156 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','256','bb' )" >
tail j=6157 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','16','bb' )" >
tail j=6158 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','8','bb' )" >
tail j=6159 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','4','bb' )" >
tail j=6160 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','2','bb' )" >
tail j=6161 line= <img height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
tail j=6162 line= <img height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','ae' )" >
tail j=6163 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','2','ae' )" >
tail j=6164 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','4','ae' )" >
tail j=6165 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','8','ae' )" >
tail j=6166 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','16','ae' )" >
tail j=6167 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','256','ae' )" >
tail j=6168 line= </div id="drag" name="div_drag_2>
tail j=6169 line=
tail j=6170 line= <hr color=black>
tail j=6171 line= <div id="div_kolineb">
tail j=6172 line= <img id="img_kolineb" height=30 class="drg" src="/imgs/btn/kop12.png">
tail j=6173 line= </div id="div_kolineb">
tail j=6174 line= <div id="div_kolinew">
tail j=6175 line= <img id="img_kolinew" height=30 class="drg" src="/imgs/btn/kop34.png">
tail j=6176 line= </div id="div_kolinew">
tail j=6177 line= <hr color=white>
tail j=6178 line=
tail j=6179 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','2','bb' )" >
tail j=6180 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','4','bb' )" >
tail j=6181 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','8','bb' )" >
tail j=6182 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','16','bb' )" >
tail j=6183 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','256','bb' )" >
tail j=6184 line=
tail j=6185 line= <img height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','bb' )" >
tail j=6186 line= <img height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','ae' )" >
tail j=6187 line=
tail j=6188 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','2','ae' )" >
tail j=6189 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','4','ae' )" >
tail j=6190 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','8','ae' )" >
tail j=6191 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','16','ae' )" >
tail j=6192 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','256','ae' )" >
tail j=6193 line=<!--
tail j=6194 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','be' )" >
tail j=6195 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','ab' )" >
tail j=6196 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','ih' )" >
tail j=6197 line= -->
tail j=6198 line= </div>
tail j=6199 line=<br><br><br><br>
tail j=6200 line=
tail j=6201 line= <hr color=black>
tail j=6202 line= <hr color=white>
tail j=6203 line=
tail j=6204 line= <div id="div_sllist" >
tail j=6205 line= <h3>div_sllist</h3>
tail j=6206 line= </div id="div_sllist" >
tail j=6207 line=
tail j=6208 line=
tail j=6209 line= <script id="script_bugs" >
tail j=6210 line= function script_bugs(bugid) {
tail j=6211 line= alert( "BUGS_5033 script_bugs="+bugid );
tail j=6212 line= }
tail j=6213 line= </script id="script_bugs" >
tail j=6214 line=
tail j=6215 line=
tail j=6216 line=<!--
tail j=6217 line= <img src="/imgs/btn/koeye_handhither.gif" onclick="script_bugs('')">
tail j=6218 line= <img src="/imgs/btn/koeyew.png" onclick="script_bugs('aaaaaaaaaaa' )" >
tail j=6219 line= <img src="/imgs/btn/koeyeb.png" onclick="script_bugs('bbbbbbbbbbbbb' )" >
tail j=6220 line= <img src="/imgs/btn/koeye.png" onclick="script_bugs('ccccccccccccc')" >
tail j=6221 line= <img src="/imgs/btn/koeyew.png" onclick="script_slist_show()" >
tail j=6222 line= -->
tail j=6223 line=
tail j=6224 line=
tail j=6225 line=
tail j=6226 line= <script id="script_sllist_load">
tail j=6227 line= function script_sllist_load() {
tail j=6228 line= alert( "BUGS_5107 script_sllist_load" );
tail j=6229 line= sllist = new Array();
tail j=6230 line= z = 0;
tail j=6231 line= sllist[z++] = 'sllist1';
tail j=6232 line= sllist[z++] = 'sllist2';
tail j=6233 line= sllist[z++] = 'sllist3';
tail j=6234 line= sllist[z++] = 'sllist4';
tail j=6235 line= sllist[z++] = 'sllist5';
tail j=6236 line= sllist[z++] = 'sllist6';
tail j=6237 line= sllist[z++] = 'sllist7';
tail j=6238 line= sllist[z++] = 'sllist8';
tail j=6239 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
tail j=6240 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
tail j=6241 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
tail j=6242 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
tail j=6245 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
tail j=6246 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
tail j=6247 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
tail j=6248 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
tail j=6249 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
tail j=6250 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
tail j=6251 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
tail j=6252 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
tail j=6253 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
tail j=6254 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
tail j=6255 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 246402 Jun 9 2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
tail j=6256 line= sllist[z++] = '-rw-r--r-- 1 konet staff 208180 Apr 8 2015 kb/books/Atlas_1931/IMG_3851.JPG';
tail j=6257 line= sllist[z++] = '-rw-r--r-- 1 konet staff 208180 Apr 8 2015 kb/books/Atlas_1931/IMG_3851.JPG';
tail j=6258 line= sllist[z++] = '-rw-r--r-- 1 konet staff 180223 Apr 8 2015 kb/books/Atlas_1931/IMG_3852.JPG';
tail j=6259 line= sllist[z++] = '-rw-r--r-- 1 konet staff 170251 Apr 8 2015 kb/books/Atlas_1931/IMG_3853.JPG';
tail j=6260 line= sllist[z++] = '-rw-r--r-- 1 konet staff 157741 Apr 8 2015 kb/books/Atlas_1931/IMG_3854.JPG';
tail j=6261 line= sllist[z++] = '-rw-r--r-- 1 konet staff 231492 Apr 8 2015 kb/books/Atlas_1931/IMG_3855.JPG';
tail j=6262 line= sllist[z++] = '-rw-r--r-- 1 konet staff 225773 Apr 8 2015 kb/books/Atlas_1931/IMG_3856.JPG';
tail j=6263 line= sllist[z++] = '-rw-r--r-- 1 konet staff 285875 Apr 8 2015 kb/books/Atlas_1931/IMG_3857.JPG';
tail j=6264 line= sllist[z++] = '-rw-r--r-- 1 konet staff 303677 Apr 8 2015 kb/books/Atlas_1931/IMG_3858.JPG';
tail j=6265 line= sllist[z++] = '-rw-r--r-- 1 konet staff 286921 Apr 8 2015 kb/books/Atlas_1931/IMG_3859.JPG';
tail j=6266 line= sllist[z++] = '-rw-r--r-- 1 konet staff 327242 Apr 8 2015 kb/books/Atlas_1931/IMG_3860.JPG';
tail j=6267 line= sllist[z++] = '-rw-r--r-- 1 konet staff 305251 Apr 8 2015 kb/books/Atlas_1931/IMG_3861.JPG';
tail j=6268 line= sllist[z++] = '-rw-r--r-- 1 konet staff 275734 Apr 8 2015 kb/books/Atlas_1931/IMG_3862.JPG';
tail j=6269 line= sllist[z++] = '-rw-r--r-- 1 konet staff 306566 Apr 8 2015 kb/books/Atlas_1931/IMG_3863.JPG';
tail j=6270 line= sllist[z++] = '-rw-r--r-- 1 konet staff 295127 Apr 8 2015 kb/books/Atlas_1931/IMG_3864.JPG';
tail j=6271 line= sllist[z++] = '-rw-r--r-- 1 konet staff 346338 Apr 8 2015 kb/books/Atlas_1931/IMG_3865.JPG';
tail j=6272 line= sllist[z++] = '-rw-r--r-- 1 konet staff 307752 Apr 8 2015 kb/books/Atlas_1931/IMG_3866.JPG';
tail j=6273 line= sllist[z++] = '-rw-r--r-- 1 konet staff 268685 Apr 8 2015 kb/books/Atlas_1931/IMG_3867.JPG';
tail j=6274 line= sllist[z++] = '-rw-r--r-- 1 konet staff 276633 Apr 8 2015 kb/books/Atlas_1931/IMG_3868.JPG';
tail j=6275 line= sllist[z++] = '-rw-r--r-- 1 konet staff 278776 Apr 8 2015 kb/books/Atlas_1931/IMG_3869.JPG';
tail j=6276 line= sllist[z++] = '-rw-r--r-- 1 konet staff 312322 Apr 8 2015 kb/books/Atlas_1931/IMG_3870.JPG';
tail j=6277 line= sllist[z++] = '-rw-r--r-- 1 konet staff 293924 Apr 8 2015 kb/books/Atlas_1931/IMG_3871.JPG';
tail j=6278 line= sllist[z++] = '-rw-r--r-- 1 konet staff 314761 Apr 8 2015 kb/books/Atlas_1931/IMG_3872.JPG';
tail j=6279 line= sllist[z++] = '-rw-r--r-- 1 konet staff 319755 Apr 8 2015 kb/books/Atlas_1931/IMG_3873.JPG';
tail j=6280 line= sllist[z++] = '-rw-r--r-- 1 konet staff 260878 Apr 8 2015 kb/books/Atlas_1931/IMG_3874.JPG';
tail j=6281 line= sllist[z++] = '-rw-r--r-- 1 konet staff 282075 Apr 8 2015 kb/books/Atlas_1931/IMG_3875.JPG';
tail j=6282 line= sllist[z++] = '-rw-r--r-- 1 konet staff 347889 Apr 8 2015 kb/books/Atlas_1931/IMG_3876.JPG';
tail j=6283 line= sllist[z++] = '-rw-r--r-- 1 konet staff 187358 Mar 31 2015 kb/books/music/Theory/IMG_7247.JPG';
tail j=6284 line= sllist[z++] = '-rw-r--r-- 1 konet staff 233375 Mar 31 2015 kb/books/music/Theory/IMG_7248.JPG';
tail j=6285 line= sllist[z++] = '-rw-r--r-- 1 konet staff 216447 Mar 31 2015 kb/books/music/Theory/IMG_7249.JPG';
tail j=6286 line= sllist[z++] = '-rw-r--r-- 1 konet staff 216059 Mar 31 2015 kb/books/music/Theory/IMG_7250.JPG';
tail j=6287 line= sllist[z++] = '-rw-r--r-- 1 konet staff 222009 Mar 31 2015 kb/books/music/Theory/IMG_7251.JPG';
tail j=6288 line= sllist[z++] = '-rw-r--r-- 1 konet staff 213330 Mar 31 2015 kb/books/music/Theory/IMG_7252.JPG';
tail j=6289 line= sllist[z++] = '-rw-r--r-- 1 konet staff 199485 Mar 31 2015 kb/books/music/Theory/IMG_7253.JPG';
tail j=6290 line= sllist[z++] = '-rw-r--r-- 1 konet staff 239114 Mar 31 2015 kb/books/music/Theory/IMG_7254.JPG';
tail j=6291 line= sllist[z++] = '-rw-r--r-- 1 konet staff 162254 Mar 31 2015 kb/books/music/Theory/IMG_7255.JPG';
tail j=6292 line=// alert( "BUGS_10895 script_sllist_load len="+sllist.length );
tail j=6293 line= return( sllist );
tail j=6294 line= }
tail j=6295 line= </script id="script_sllist_load">
tail j=6296 line=
tail j=6297 line= <script id="script_pdflist_load">
tail j=6298 line= function script_pdflist_load() {
tail j=6299 line= pdflist = new Array();
tail j=6300 line= z = 0;
tail j=6301 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
tail j=6302 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
tail j=6303 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
tail j=6304 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
tail j=6307 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
tail j=6308 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
tail j=6309 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
tail j=6310 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
tail j=6311 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
tail j=6312 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
tail j=6313 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
tail j=6314 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
tail j=6315 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
tail j=6316 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
tail j=6317 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 246402 Jun 9 2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
tail j=6318 line=// alert( "BUGS_10925 script_pdflist_load len="+pdflist.length );
tail j=6319 line= return( pdflist );
tail j=6320 line= }
tail j=6321 line= </script id="script_pdflist_load">
tail j=6322 line=
tail j=6323 line=<!--
tail j=6324 line= <script id="script_startup2" >
tail j=6325 line= function startup2( url ) {
tail j=6326 line=// url="index.html";
tail j=6327 line= alert( "BUGS_10930_startup" );
tail j=6328 line= htmout="htmout";
tail j=6329 line= img="/imgs/btn/koeye.gif";
tail j=6330 line= imgurl="/imgs/btn/koeye_handhither.gif";
tail j=6331 line= if( urlexists(url)) { img=imgurl; }
tail j=6332 line=
tail j=6333 line= htmout += '<a href="'+url+'" target=_blank class="drag" id="drg">
tail j=6334 line= htmout += ' <img src="'+img+'" border=0>";
tail j=6335 line= htmout += ' <span><img src="'+img+'" border=0></span>';
tail j=6336 line= htmout += ' </a>';
tail j=6337 line= document.write( htmout );
tail j=6338 line= alert("BUGS_10934_startup isurl="+isurl(url) );
tail j=6339 line= }
tail j=6340 line= </script>
tail j=6341 line= -->
tail j=6342 line=
tail j=6343 line= <script id="script_isurl">
tail j=6344 line= function isurl(url) {
tail j=6345 line= $.get(url).done(function() {
tail j=6346 line= return("ok");
tail j=6347 line= }).fail(function() {
tail j=6348 line= return("ko");
tail j=6349 line= })
tail j=6350 line= }
tail j=6351 line= </script id="script_isurl">
tail j=6352 line=
tail j=6353 line= <script id="script_urlexists">
tail j=6354 line= function urlexists(url) {
tail j=6355 line= var http = new XMLHttpRequest();
tail j=6356 line= http.open('HEAD', url, false);
tail j=6357 line= http.send();
tail j=6358 line= return http.status!=404;
tail j=6359 line= }
tail j=6360 line= </script id="script_urlexists">
tail j=6361 line=
tail j=6362 line= <script id="script_mth2mm">
tail j=6363 line= function mth2mm(mth) {
tail j=6364 line= if( mth == "Jan" ) return("01");
tail j=6365 line= if( mth == "Feb" ) return("02");
tail j=6366 line= if( mth == "Mar" ) return("03");
tail j=6367 line= if( mth == "Apr" ) return("04");
tail j=6368 line= if( mth == "May" ) return("05");
tail j=6369 line= if( mth == "Jun" ) return("06");
tail j=6370 line= if( mth == "Jul" ) return("07");
tail j=6371 line= if( mth == "Aug" ) return("08");
tail j=6372 line= if( mth == "Sep" ) return("09");
tail j=6373 line= if( mth == "Oct" ) return("10");
tail j=6374 line= if( mth == "Nov" ) return("11");
tail j=6375 line= if( mth == "Dec" ) return("12");
tail j=6376 line= return( "00" );
tail j=6377 line= }
tail j=6378 line= </script id="script_mth2mm">
tail j=6379 line=
tail j=6380 line= <script id="script_unique">
tail j=6381 line= function unique() {
tail j=6382 line= alert( "BUGS_11334 unique" );
tail j=6383 line= }
tail j=6384 line= function uniquelist(list) {
tail j=6385 line= alert( "BUGS_11336 uniquelist" );
tail j=6386 line= for (i = 0; i<list.length; i++) {
tail j=6387 line= for (j=i+1; j<list.length; j++) {
tail j=6388 line= if (list[i] == list[j]) {
tail j=6389 line= list.splice(j, 1);
tail j=6390 line= j--;
tail j=6391 line= }
tail j=6392 line= }
tail j=6393 line= }
tail j=6394 line= }
tail j=6395 line= </script id="script_unique">
tail j=6396 line=
tail j=6397 line= <script id="script_file2array" >
tail j=6398 line= script_file2array(url) {
tail j=6399 line= if( urlexists(url) ) {
tail j=6400 line= alert( BUGS_11350 FOUND urlexists="+url );
tail j=6401 line= }
tail j=6402 line= else {
tail j=6403 line= alert( BUGS_11351 NOTFOUND urlexists="+url );
tail j=6404 line= }
tail j=6405 line=// $.ajax({
tail j=6406 line=//// url: "/kb/csv/sl.csv",
tail j=6407 line=//// url: "/kb/csv/sl.csv",
tail j=6408 line=//// url: "sl.csv",
tail j=6409 line=// url: url,
tail j=6410 line=// async: false,
tail j=6411 line=// success: function(csvd) {
tail j=6412 line=// kolist = $.csv.toArrays(csvd);
tail j=6413 line=// },
tail j=6414 line=//
tail j=6415 line=// dataType: "text",
tail j=6416 line=//// call a function on complete
tail j=6417 line=// complete: function () {
tail j=6418 line=// alert( "BUGS_11363 ajax rul="+url+" kolist="+kolist );
tail j=6419 line=//// script_kolist_load(kolist);
tail j=6420 line=// script_kolist_show(kolist);
tail j=6421 line=// }
tail j=6422 line=// });
tail j=6423 line= }
tail j=6424 line= </script id="script_file2array" >
tail j=6425 line=
tail j=6426 line=<!-- <script id="script_async_sljs" src="sl.js" async></script> -->
tail j=6427 line= <script id="script_requestcsv" >
tail j=6428 line= function callback() {
tail j=6429 line= alert( "BUGS_11480 callback" );
tail j=6430 line= }
tail j=6431 line=// var foo = requestCSV("sl.csv",drawlines(lines));
tail j=6432 line=// var foo = requestCSV("sl.csv",script_kolist(kolist));
tail j=6433 line=//// function requestCSV(f,c){return new csvajax(f,c);};
tail j=6434 line= filecsv="sl.csv";
tail j=6435 line= function csvajax(filecsv,callback) {
tail j=6436 line= alert( "BUGS_11383 script_requestcsv filepath="+filepath+" callback="+callback );
tail j=6437 line=// this.request = new XMLHttpRequest();
tail j=6438 line=// this.request.timeout = 10000;
tail j=6439 line=// this.request.open("GET", filepath, true);
tail j=6440 line=// this.request.parent = this;
tail j=6441 line=// this.callback = callback;
tail j=6442 line=// this.request.onload = function() {
tail j=6443 line=// var d = this.response.split('\n'); /*1st separator*/
tail j=6444 line=// var i = d.length;
tail j=6445 line=// while(i--) {
tail j=6446 line=// if(d[i] !== "")
tail j=6447 line=// d[i] = d[i].split(','); /*2nd separator*/
tail j=6448 line=// else
tail j=6449 line=// d.splice(i,1);
tail j=6450 line=// }
tail j=6451 line=// this.parent.response = d;
tail j=6452 line=// if(typeof this.parent.callback !== "undefined")
tail j=6453 line=// this.parent.callback(d);
tail j=6454 line=// };
tail j=6455 line=// this.request.send();
tail j=6456 line= };
tail j=6457 line= </script id="script_requestcsv" >
tail j=6458 line=
tail j=6459 line=<!--
tail j=6460 line= <script id="script_db32array" >
tail j=6461 line=//// function script_db2array("sl.db3", "select * from kolist where koid='koid'" ) {
tail j=6462 line=//// function script_db2array("/kb/db3/sl.db3", "/kb/sql/sl.sql" ) {
tail j=6463 line=// function script_db2array( db3, sql ) {
tail j=6464 line=// var dblist = new Array();
tail j=6465 line=// alert( "BUGS_11400 script_db2array db3="+db3+" sql="+sql+" dblist="+dblist );
tail j=6466 line=// return( dblist );
tail j=6467 line=// }
tail j=6468 line=
tail j=6469 line=// filedb3="sl.db3";
tail j=6470 line=// filepsv="sl.psv";
tail j=6471 line=// tblnam="sl";
tail j=6472 line=// $rr=exec("sqlite3 filedb3 \".separator '|'\" ");
tail j=6473 line=// $rr=exec("sqlite3 filedb3 \".import filepsv tblnam\" ");
tail j=6474 line=// $rr= exec ("sqlite3 filedb3 \"pragma encoding = 'utf-8'\" ");
tail j=6475 line=// $rr=exec("sqlite3 filedb3 \".separator '|'\" && sqlite3 fildb3 \"pragma encoding = 'utf-8'\" && sqlite3 filedb3 \".import filepsv tablename\" ");
tail j=6476 line= </script>
tail j=6477 line= -->
tail j=6478 line=
tail j=6479 line=<!-- Create the database -->
tail j=6480 line=<!--
tail j=6481 line= <script id="script_sqljs_include" src='js/sql.js'></script>
tail j=6482 line= <script id="script_sqljs">
tail j=6483 line= function script_sqljs() {
tail j=6484 line= var db = new SQL.Database();
tail j=6485 line=
tail j=6486 line=// Run a query without reading the results
tail j=6487 line= db.run("CREATE TABLE test (col1, col2);");
tail j=6488 line=
tail j=6489 line=// Insert two rows: (1,111) and (2,222)
tail j=6490 line= db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]);
tail j=6491 line=
tail j=6492 line=// Prepare a statement
tail j=6493 line= var stmt = db.prepare("SELECT * FROM test WHERE a BETWEEN $start AND $end");
tail j=6494 line= stmt.getAsObject({$start:1, $end:1}); // {col1:1, col2:111}
tail j=6495 line=
tail j=6496 line=// Bind new values
tail j=6497 line= stmt.bind({$start:1, $end:2});
tail j=6498 line= while(stmt.step()) { //
tail j=6499 line= var row = stmt.getAsObject();
tail j=6500 line=// [...] do something with the row of result
tail j=6501 line= }
tail j=6502 line= }
tail j=6503 line= </script>
tail j=6504 line= -->
tail j=6505 line= <a href=+ class="popover" >
tail j=6506 line= <img src="/imgs/btn/kb.png" onclick="script_startup('timejak_startup')">
tail j=6507 line= <span><img src="/imgs/btn/kw.png" onclick="script_startup('timejak_startup')"></span>
tail j=6508 line= </a>
tail j=6509 line= <script id="script_startup" >
tail j=6510 line= function script_startup( msg ) {
tail j=6511 line= alert( "BUGS_6200 script_startup msg="+msg );
tail j=6512 line=
tail j=6513 line= }
tail j=6514 line= </script id="script_startup" >
tail j=6515 line=
tail j=6516 line=<!-- <div id="div_balls_n_cubes_btn"> -->
tail j=6517 line=
tail j=6518 line= <div id="div_kobuttonset" >
tail j=6519 line= <a href=+ class="popover" >
tail j=6520 line= <img height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_b('5400')">
tail j=6521 line= <span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeye_b('5400')"></span>
tail j=6522 line= </a>
tail j=6523 line=
tail j=6524 line= <a href=+ class="popover" >
tail j=6525 line= <img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyeb_w('5400')">
tail j=6526 line= <span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_bw('5400')"></span>
tail j=6527 line= </a>
tail j=6528 line=
tail j=6529 line=
tail j=6530 line= <a href=+ class="popover" >
tail j=6531 line= <img height=50 src="/imgs/btn/kobubble_b1.png" onclick="script_bubble('5400')">
tail j=6532 line= <span><img height=50 src="/imgs/btn/kobubblew.png" onclick="script_bubble('5400')"></span>
tail j=6533 line= </a>
tail j=6534 line=
tail j=6535 line=
tail j=6536 line= <a href=+ class="popover" >
tail j=6537 line= <img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeyew_b('5500')">
tail j=6538 line= <span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyew_b('5400')"></span>
tail j=6539 line= </a>
tail j=6540 line=
tail j=6541 line=
tail j=6542 line= <a href=+ class="popover" >
tail j=6543 line= <img height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_w('5400')">
tail j=6544 line= <span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_w('5400')"></span>
tail j=6545 line= </a>
tail j=6546 line=
tail j=6547 line=
tail j=6548 line= <a href=+ class="popover" >
tail j=6549 line= <img src="/imgs/btn/kw.png" onclick="script_kw('timejak_shutdown')">
tail j=6550 line= <span><img src="/imgs/btn/kb.png" onclick="script_kw('timejak_shutdown')"></span>
tail j=6551 line= </a>
tail j=6552 line= </div id="div_kobuttonset" >
tail j=6553 line=
tail j=6554 line=
tail j=6555 line=
tail j=6556 line= <div id="div_ajax2php_form" class="drg" >
tail j=6557 line= <form id="comment">
tail j=6558 line= <input type="text" id="userInput" name="comment" placeholder="needdb3data4me" /></input>
tail j=6559 line= <input type="submit" value="Submit" /></input>
tail j=6560 line= </form>
tail j=6561 line= </div id="div_ajax2php_form" >
tail j=6562 line=
tail j=6563 line=
tail j=6564 line=<!--
tail j=6565 line= <button onclice="script_ajax2php">script_ajax2php</button>
tail j=6566 line= -->
tail j=6567 line=
tail j=6568 line=<script id="script_ajax2php">
tail j=6569 line= function script_ajax2php () {
tail j=6570 line= alert( "BUGS_5396 script_ajax2php" );
tail j=6571 line=
tail j=6572 line=// Stop the form from being submitted the standard way
tail j=6573 line= $("#comment").on('submit', function(e) {
tail j=6574 line= e.preventDefault();
tail j=6575 line=
tail j=6576 line=// Put the user's input into a variable
tail j=6577 line= var userInput = $('#userInput').val();
tail j=6578 line=
tail j=6579 line=// Do some validation of the data if needed
tail j=6580 line=// ...
tail j=6581 line=
tail j=6582 line=
tail j=6583 line=// Perform AJAX request (a.k.a send the data to the server)
tail j=6584 line=// There are many parameters one can use here
tail j=6585 line=// Browse the documentation to get familiar with the most useful ones
tail j=6586 line= $.ajax({
tail j=6587 line= url: 'index_zm.php', // The PHP script that will handle the request
tail j=6588 line= db3 = "index_zm.db3",
tail j=6589 line= sql: "select * from list",
tail j=6590 line= type: 'POST', // This can be set to GET, but in this case we'd use POST
tail j=6591 line= data: {
tail j=6592 line= db3: sql,
tail j=6593 line= sql: sql,
tail j=6594 line= }, // "comment" will result in $_POST['comment'], and userInput is the value of it
tail j=6595 line=
tail j=6596 line=// If the script returns a 200 status (meaning the request was successful)
tail j=6597 line=// The data variable will be the response from the PHP script
tail j=6598 line=// Depending on what you are going to do with the data returned,
tail j=6599 line=// you may want to ensure it is returned as valid JSON
tail j=6600 line= success: function(data) {
tail j=6601 line= alert( "BUGS ajaxphp MSG data="+data );
tail j=6602 line= },
tail j=6603 line=
tail j=6604 line=// The request failed - So something here
tail j=6605 line= error: function() {
tail j=6606 line= alert( "BUGS ajaxphp ERR data="+data );
tail j=6607 line= }
tail j=6608 line= });
tail j=6609 line=
tail j=6610 line= });
tail j=6611 line= }
tail j=6612 line= </script id="script_ajax2php">
tail j=6613 line=
tail j=6614 line=
tail j=6615 line= <button type="button" onclick="balls_n_cubes('/imgs/btn/ok.png')">balls_n_cubes</button>
tail j=6616 line=
tail j=6617 line= <button onclick="showFillText();return true;">filltxt</button>
tail j=6618 line= <button onclick="showStrokeText();return true;">stroketxt</button>
tail j=6619 line= <button onclick="Clear_text();return true;">cleartxt</button>
tail j=6620 line=
tail j=6621 line= <button onclick="draw_dragon();return true;">dragon</button>
tail j=6622 line= <button onclick="draw_smaller_dragon();return true;">dragonette</button>
tail j=6623 line= <button onclick="draw_dragon_head();return true;">draghead</button>
tail j=6624 line= <button onclick="Clear_image();return true;">clearimg</button>
tail j=6625 line=<!-- orphan div </div> -->
tail j=6626 line=
tail j=6627 line=
tail j=6628 line=
tail j=6629 line= <div id="div_canvas_balls" style="background:tan; position:relative; width:800px; height:120px">
tail j=6630 line= <canvas id="layer1"
tail j=6631 line= style="z-index: 1;
tail j=6632 line= position:absolute;
tail j=6633 line= left:0px;
tail j=6634 line= top:0px;
tail j=6635 line= " height="100px" width="800">
tail j=6636 line= unauthorized access logged
tail j=6637 line= </canvas>
tail j=6638 line= <canvas id="layer2"
tail j=6639 line= style="z-index: 2;
tail j=6640 line= position:absolute;
tail j=6641 line= left:0px;
tail j=6642 line= top:0px;
tail j=6643 line= " height="100px" width="800">
tail j=6644 line= unauthorized access logged
tail j=6645 line= </canvas>
tail j=6646 line= <canvas id="layer3"
tail j=6647 line= style="z-index: 3;
tail j=6648 line= position:absolute;
tail j=6649 line= left:0px;
tail j=6650 line= top:0px;
tail j=6651 line= " height="100px" width="800">
tail j=6652 line= unauthorized access logged
tail j=6653 line= </canvas>
tail j=6654 line=
tail j=6655 line= <canvas id="layer4"
tail j=6656 line= style="z-index: 4;
tail j=6657 line= position:absolute;
tail j=6658 line= left:0px;
tail j=6659 line= top:0px;
tail j=6660 line= " height="100px" width="800">
tail j=6661 line= unauthorized access logged b
tail j=6662 line= </canvas>
tail j=6663 line= <canvas id="layer5"
tail j=6664 line= style="z-index: 5;
tail j=6665 line= position:absolute;
tail j=6666 line= left:0px;
tail j=6667 line= top:0px;
tail j=6668 line= " height="100px" width="800">
tail j=6669 line= unauthorized access logged
tail j=6670 line= </canvas>
tail j=6671 line= <canvas id="layer6"
tail j=6672 line= style="z-index: 6;
tail j=6673 line= position:absolute;
tail j=6674 line= left:0px;
tail j=6675 line= top:0px;
tail j=6676 line= " height="100px" width="800">
tail j=6677 line= unauthorized access logged
tail j=6678 line= </canvas>
tail j=6679 line= <canvas id="layer7"
tail j=6680 line= style="z-index: 7;
tail j=6681 line= position:absolute;
tail j=6682 line= left:0px;
tail j=6683 line= top:0px;
tail j=6684 line= " height="100px" width="800">
tail j=6685 line= unauthorized access logged
tail j=6686 line= </canvas>
tail j=6687 line= </div>
tail j=6688 line= </div id="div_canvas_balls" >
tail j=6689 line=
tail j=6690 line=
tail j=6691 line=
tail j=6692 line=
tail j=6693 line= <script id="script_canvas_balls_n_cubes_w" type="text/javascript">
tail j=6694 line= var layer1; var layer2; var layer3;
tail j=6695 line= var layer4; var layer5; var layer6; var layer7;
tail j=6696 line= var layer_b; var layer_w; var layer_i; var layer_t;
tail j=6697 line=
tail j=6698 line= var ctx1; var ctx2; var ctx3;
tail j=6699 line= var ctx_b; var ctx_w; var ctx_i; var ctx_t;
tail j=6700 line= var x = 800; var y = 100; var dx = 2; var dy = 4;
tail j=6701 line= var b_x = 800; var b_y = 100; var b_dx = 2; var b_dy = 4;
tail j=6702 line= var w_x = 800; var w_y = 100; var w_dx = 2; var w_dy = 4;
tail j=6703 line= var i_x = 800; var i_y = 100; var i_dx = 2; var i_dy = 4;
tail j=6704 line= var t_x = 800; var t_y = 100; var t_dx = 2; var t_dy = 4;
tail j=6705 line=
tail j=6706 line= var WIDTH = 800;
tail j=6707 line= var HEIGHT = 100;
tail j=6708 line=
tail j=6709 line= var city = new Image();
tail j=6710 line= var city_b = new Image();
tail j=6711 line= var city_w = new Image();
tail j=6712 line= var img_b = new Image();
tail j=6713 line= var img_w = new Image();
tail j=6714 line= var gif = new Image();
tail j=6715 line= var img = new Image();
tail j=6716 line= var txt = new Image();
tail j=6717 line= img_new = new Image();
tail j=6718 line=
tail j=6719 line= img_mask = new Image();
tail j=6720 line= img_mask_w = new Image();
tail j=6721 line= img_mask_b = new Image();
tail j=6722 line= img_mask_ko = new Image();
tail j=6723 line= img_mask_kow = new Image();
tail j=6724 line= img_mask_kob = new Image();
tail j=6725 line= img_mask_koeye = new Image();
tail j=6726 line= img_mask_koeyew = new Image();
tail j=6727 line= img_mask_koeyeb = new Image();
tail j=6728 line=
tail j=6729 line= myimg="";
tail j=6730 line= myimg="/imgs/btn/koeye_handhi.gif";
tail j=6731 line= myimg="/imgs/btn/koeye_handhither.gif";
tail j=6732 line= balls_n_cubes( myimg );
tail j=6733 line=
tail j=6734 line= function showFillText() {
tail j=6735 line= ctx_t.fillStyle = '#f00';
tail j=6736 line= ctx_t.fillStyle = 'yellow';
tail j=6737 line=// ctx_t.font = 'italic bold 30px sans-serif';
tail j=6738 line= ctx_t.font = 'italic bold 40px yokkmokkOT';
tail j=6739 line= ctx_t.textBaseline = 'bottom';
tail j=6740 line= ctx_t.fillText('timejaks: jkwii is here', 50, 100);
tail j=6741 line= }
tail j=6742 line=
tail j=6743 line= function showStrokeText() {
tail j=6744 line= ctx_t.strokeStyle = "#003300";
tail j=6745 line= ctx_t.font = '40px san-serif';
tail j=6746 line= ctx_t.textBaseline = 'bottom';
tail j=6747 line= ctx_t.strokeText('timejaks jkwii is us', 300, 100);
tail j=6748 line= }
tail j=6749 line=
tail j=6750 line=// textBaseline top,hanging,middle,alphabetic,ideographic,bottom default: alphabetic
tail j=6751 line= function Clear_text() {
tail j=6752 line= ctx_t.textBaseline = "top";
tail j=6753 line= ctx_t.fillText('Top', 5, 100);
tail j=6754 line= ctx_t.textBaseline = "bottom";
tail j=6755 line= ctx_t.fillText('Bottom', 80, 100);
tail j=6756 line= ctx_t.textBaseline = "middle";
tail j=6757 line= ctx_t.fillText('Middle', 200, 100);
tail j=6758 line= ctx_t.textBaseline = "alphabetic";
tail j=6759 line= ctx_t.fillText('Alphabetic', 300, 100);
tail j=6760 line= ctx_t.textBaseline = "hanging";
tail j=6761 line= ctx_t.fillText('Hanging', 400, 100);
tail j=6762 line= ctx_t.clearRect(1, 1, 600, 300);
tail j=6763 line= }
tail j=6764 line=
tail j=6765 line=// var c5 = document.getElementById("c5");
tail j=6766 line=// var c5_context = c5.getContext("2d");
tail j=6767 line=
tail j=6768 line= var dragon = new Image();
tail j=6769 line= dragon.src = '/imgs/btn/dragon.png';
tail j=6770 line=
tail j=6771 line= function draw_dragon() {
tail j=6772 line= ctx_i.drawImage(dragon, 100, 5);
tail j=6773 line= }
tail j=6774 line=
tail j=6775 line= function draw_smaller_dragon() {
tail j=6776 line= ctx_i.drawImage(dragon, 10, 5, 58, 100);
tail j=6777 line= }
tail j=6778 line=
tail j=6779 line= function draw_dragon_head() {
tail j=6780 line= ctx_i.drawImage(dragon, 0, 19, 69, 97, 300, 100, 103, 145);
tail j=6781 line= }
tail j=6782 line=
tail j=6783 line= function Clear_image() {
tail j=6784 line= ctx_i.clearRect(1, 1, 600, 300);
tail j=6785 line= }
tail j=6786 line=
tail j=6787 line=
tail j=6788 line=
tail j=6789 line=
tail j=6790 line= function balls_n_cubes(myimg) {
tail j=6791 line=// alert( "BUGS_5780 myimg="+myimg );
tail j=6792 line= imgs_new = new Array(); z=0;
tail j=6793 line= imgs_new[z++] = "/imgs/btn/koeye_handhi.gif";
tail j=6794 line= imgs_new[z++] = "/imgs/btn/ko.png";
tail j=6795 line= imgs_new[z++] = "/imgs/btn/ok.png";
tail j=6796 line= imgs_new[z++] = "/imgs/btn/koeyew.png";
tail j=6797 line= imgs_new[z++] = "/imgs/btn/koeyeb.png";
tail j=6798 line= imgs_new[z++] = "/imgs/btn/koeye.png";
tail j=6799 line= imgs_new[z++] = "/imgs/btn/koeye_handhither.gif";
tail j=6800 line=// alert( "BUGS_5790 myimg="+myimg );
tail j=6801 line= if( myimg == "" ) {
tail j=6802 line=// alert( "BUGS_5791 OLD myimg="+myimg );
tail j=6803 line=// img_new.src = myimg;
tail j=6804 line=// img_new.src = "/imgs/btn/ko.png";
tail j=6805 line= img_new.src = "/imgs/btn/koeye_handhither.gif";
tail j=6806 line= img_new.src = "/imgs/btn/koeye_handhi.gif";
tail j=6807 line= }
tail j=6808 line= else {
tail j=6809 line=// alert( "BUGS_5792 NEW myimg="+myimg );
tail j=6810 line=// img_new.src = "/imgs/btn/ok.png";
tail j=6811 line= img_new.src = "/imgs/btn/koeye_handhither.gif";
tail j=6812 line= img_new.src = myimg;
tail j=6813 line= }
tail j=6814 line= return( img_new );
tail j=6815 line= }
tail j=6816 line=
tail j=6817 line=// function init() {
tail j=6818 line=// myimg = "/imgs/btn/ko.png";
tail j=6819 line=// myimg = "";
tail j=6820 line= function init_balls_n_cubes(myimg) {
tail j=6821 line=// alert( "BUGS_5810 balls_n_cubes myimg="+myimg );
tail j=6822 line= city.src ="/imgs/btn/koeye.png";
tail j=6823 line= city_b.src ="/imgs/btn/koeyeb.png";
tail j=6824 line= city_w.src ="/imgs/btn/koeyew.png";
tail j=6825 line=
tail j=6826 line= img.src ="/imgs/btn/kob.png";
tail j=6827 line= txt.src ="/imgs/btn/kow.png";
tail j=6828 line= img_b.src ="/imgs/btn/koeyeb.png";
tail j=6829 line= img_w.src ="/imgs/btn/koeyew.png";
tail j=6830 line=
tail j=6831 line= img_mask.src ="/imgs/btn/kob.png";
tail j=6832 line= img_mask_w.src ="/imgs/btn/kob.png";
tail j=6833 line= img_mask_b.src ="/imgs/btn/kob.png";
tail j=6834 line= img_mask_koeye.src = "/imgs/btn/koeye_mask.png";
tail j=6835 line= img_mask_koeyew.src = "/imgs/btn/koeyew_mask.png";
tail j=6836 line= img_mask_koeyeb.src = "/imgs/btn/koeyeb_mask.png";
tail j=6837 line= img_mask_ko.src = "/imgs/btn/ko_mask.png";
tail j=6838 line= img_mask_kow.src = "/imgs/btn/kow_mask.png";
tail j=6839 line= img_mask_kob.src = "/imgs/btn/kob_mask.png";
tail j=6840 line=
tail j=6841 line=
tail j=6842 line= gif.src = "/imgs/btn/koeye_handhither.gif";
tail j=6843 line=// gif.src = "/imgs/btn/ok.png";
tail j=6844 line=// img_new = balls_n_cubes('');
tail j=6845 line=// img_new = balls_n_cubes(myimg);
tail j=6846 line= gif.src = img_new.src;
tail j=6847 line=
tail j=6848 line= layer1 = document.getElementById("layer1");
tail j=6849 line= ctx1 = layer1.getContext("2d");
tail j=6850 line= layer2 = document.getElementById("layer2");
tail j=6851 line= ctx2 = layer2.getContext("2d");
tail j=6852 line= layer3 = document.getElementById("layer3");
tail j=6853 line= ctx3 = layer3.getContext("2d");
tail j=6854 line=
tail j=6855 line= layer4 = document.getElementById("layer4");
tail j=6856 line= ctx_b = layer4.getContext("2d");
tail j=6857 line= layer5 = document.getElementById("layer5");
tail j=6858 line= ctx_w = layer5.getContext("2d");
tail j=6859 line= layer6 = document.getElementById("layer6");
tail j=6860 line= ctx_i = layer6.getContext("2d");
tail j=6861 line= layer7 = document.getElementById("layer7");
tail j=6862 line= ctx_t = layer7.getContext("2d");
tail j=6863 line=
tail j=6864 line= setInterval(drawAll, 20);
tail j=6865 line= }
tail j=6866 line=
tail j=6867 line= function draw1() {
tail j=6868 line= ctx1.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6869 line= ctx1.fillStyle = "#FAF7F8";
tail j=6870 line= ctx1.fillStyle = "darkslaegrey";
tail j=6871 line= ctx1.beginPath();
tail j=6872 line= ctx1.rect(0,0,WIDTH,HEIGHT);
tail j=6873 line= ctx1.closePath();
tail j=6874 line= ctx1.fill();
tail j=6875 line= ctx1.fillStyle = "#444444";
tail j=6876 line=// ctx1.fillStyle = "yellow";
tail j=6877 line= ctx1.beginPath();
tail j=6878 line= ctx1.arc(x, y, 10, 0, Math.PI*2, true);
tail j=6879 line= ctx1.closePath();
tail j=6880 line= ctx1.fill();
tail j=6881 line=
tail j=6882 line= if (x + dx > WIDTH || x + dx < 0) dx = -dx;
tail j=6883 line= if (y + dy > HEIGHT || y + dy < 0) dy = -dy;
tail j=6884 line=
tail j=6885 line= x += dx;
tail j=6886 line= y += dy;
tail j=6887 line= }
tail j=6888 line=
tail j=6889 line=
tail j=6890 line=
tail j=6891 line= function draw_b() {
tail j=6892 line= ctx_b.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6893 line= ctx_b.fillStyle = "#FAF7F8";
tail j=6894 line= ctx_b.fillStyle = "darkslaegrey";
tail j=6895 line= ctx_b.beginPath();
tail j=6896 line= ctx_b.rect(0,0,WIDTH,HEIGHT);
tail j=6897 line= ctx_b.closePath();
tail j=6898 line= ctx_b.fill();
tail j=6899 line=// ctx_b.fillStyle = "#444444";
tail j=6900 line= ctx_b.fillStyle = "red";
tail j=6901 line= ctx_b.beginPath();
tail j=6902 line= ctx_b.arc(b_x, b_y, 10, 0, Math.PI*2, true);
tail j=6903 line= ctx_b.closePath();
tail j=6904 line= ctx_b.fill();
tail j=6905 line=
tail j=6906 line= if (b_x + b_dx > WIDTH || b_x + b_dx < 0) b_dx = -b_dx;
tail j=6907 line= if (b_y + b_dy > HEIGHT || b_y + b_dy < 0) b_dy = -b_dy;
tail j=6908 line=
tail j=6909 line= b_x += b_dx;
tail j=6910 line= b_y += b_dy;
tail j=6911 line= }
tail j=6912 line=
tail j=6913 line= function draw_w() {
tail j=6914 line= ctx_w.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6915 line=// ctx_w.fillStyle = "#FAF7F8";
tail j=6916 line= ctx_w.fillStyle = "darkslaegrey";
tail j=6917 line= ctx_w.beginPath();
tail j=6918 line= ctx_w.rect(0,0,WIDTH,HEIGHT);
tail j=6919 line= ctx_w.closePath();
tail j=6920 line= ctx_w.fill();
tail j=6921 line= ctx_w.fillStyle = "#444444";
tail j=6922 line= ctx_w.fillStyle = "yellow";
tail j=6923 line= ctx_w.fillStyle = "darkslategrey";
tail j=6924 line= ctx_w.beginPath();
tail j=6925 line= ctx_w.arc(w_x, w_y, 10, 0, Math.PI*2, true);
tail j=6926 line= ctx_w.closePath();
tail j=6927 line= ctx_w.fill();
tail j=6928 line=
tail j=6929 line= if (w_x + w_dx > WIDTH || w_x + w_dx < 0) w_dx = -w_dx;
tail j=6930 line= if (w_y + w_dy > HEIGHT || w_y + w_dy < 0) w_dy = -w_dy;
tail j=6931 line=
tail j=6932 line= w_x += w_dx; w_y += w_dy;
tail j=6933 line= }
tail j=6934 line=
tail j=6935 line=
tail j=6936 line=
tail j=6937 line=
tail j=6938 line=
tail j=6939 line= function draw2() {
tail j=6940 line= ctx2.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6941 line= ctx2.drawImage(city, WIDTH/2-100, 10 );
tail j=6942 line= ctx2.drawImage(city_w, WIDTH/2-100, 10 );
tail j=6943 line= ctx2.drawImage(city_b, WIDTH/2-100, 10 );
tail j=6944 line= ctx2.drawImage(gif, WIDTH/2-100, 10 );
tail j=6945 line=
tail j=6946 line=
tail j=6947 line=// ctx2.drawImage(img_mask, 0, 0);
tail j=6948 line=// ctx2.globalCompositeOperation = 'source-in';
tail j=6949 line=// ctx2.drawImage(city_w, 10 , 10);
tail j=6950 line=// ctx2.drawImage(img_mask, 0, 0);
tail j=6951 line= }
tail j=6952 line=
tail j=6953 line= function draw_i() {
tail j=6954 line=// img_mask="/imgs/btn/koeye_mask.png";
tail j=6955 line=// ctx_i.drawImage(img_mask, 0, 0);
tail j=6956 line=// ctx_i.globalCompositeOperation = 'source-in';
tail j=6957 line=// ctx_i.drawImage(img_w, 0 , 0);
tail j=6958 line=
tail j=6959 line=
tail j=6960 line=
tail j=6961 line= ctx_i.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6962 line= ctx_i.drawImage(img, WIDTH/2-100, 10 );
tail j=6963 line=// ctx_i.drawImage(img_i, WIDTH/2-100, 10 );
tail j=6964 line= }
tail j=6965 line=
tail j=6966 line= function draw_t() {
tail j=6967 line= txt="timejaks: jkwii";
tail j=6968 line=// ctx_t.drawImage(txt, 0, 0);
tail j=6969 line=// ctx_t.drawImage(img_t, WIDTH/2-100, 10 );
tail j=6970 line=// ctx_t.fillStyle = '#f00';
tail j=6971 line=// ctx_t.font = 'italic bold 30px sans-serif';
tail j=6972 line=// ctx_t.fillText(txt, 50, 100);
tail j=6973 line=// ctx_t.fillText("timejaks: jkwii is me", 0, 0);
tail j=6974 line=// ctx_t.fillText("timejaks: jkwii is he", x, y);
tail j=6975 line=
tail j=6976 line= ctx_t.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6977 line= ctx_t.fillStyle = 'black';
tail j=6978 line= ctx_t.fillStyle = 'goldenrod';
tail j=6979 line= ctx_t.fillStyle = 'darkslategrey';
tail j=6980 line= ctx_t.font = '50px yokkmokkOT';
tail j=6981 line= ctx_t.textBaseline = 'bottom';
tail j=6982 line= ctx_t.fillText("timejaks: jkwii is where", x, y);
tail j=6983 line=
tail j=6984 line=// alert( "BUGS_5900 drat_t txt="+txt );
tail j=6985 line= }
tail j=6986 line=
tail j=6987 line=
tail j=6988 line=
tail j=6989 line=
tail j=6990 line=
tail j=6991 line= function draw3() {
tail j=6992 line= ctx3.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6993 line= ctx3.fillStyle = "#444444";
tail j=6994 line=// ctx3.fillStyle = "darkslategrey";
tail j=6995 line=// ctx3.translate(100,100);
tail j=6996 line=// ctx3.fillRect(-15, -15, 50, 50);
tail j=6997 line= ctx3.save();
tail j=6998 line= ctx3.translate(400,50);
tail j=6999 line= ctx3.rotate(x/20);
tail j=7000 line= ctx3.fillRect(10, 0, 25, 25);
tail j=7001 line= ctx3.restore();
tail j=7002 line= }
tail j=7003 line=
tail j=7004 line=
tail j=7005 line=
tail j=7006 line=
tail j=7007 line=
tail j=7008 line=
tail j=7009 line= function drawAll() {
tail j=7010 line= draw_b();
tail j=7011 line= draw_w();
tail j=7012 line= draw_i();
tail j=7013 line= draw_t();
tail j=7014 line=
tail j=7015 line= draw1();
tail j=7016 line= draw2();
tail j=7017 line= draw3();
tail j=7018 line= }
tail j=7019 line=
tail j=7020 line=
tail j=7021 line=
tail j=7022 line=
tail j=7023 line=
tail j=7024 line=
tail j=7025 line=
tail j=7026 line=// init(img_new);
tail j=7027 line= init_balls_n_cubes(myimg);
tail j=7028 line= </script id="script_canvas_balls_n_cubes_w" >
tail j=7029 line=
tail j=7030 line= <script id="script_load_urlbtn">
tail j=7031 line= function load_urlbtn(btnid) {
tail j=7032 line= img_dragon: url("/imgs/links/tn/tn_dragon.png" );
tail j=7033 line= img_ko: url("/imgs/btn/ko.png");
tail j=7034 line= img_ok: url("/imgs/btn/ok.png");
tail j=7035 line= img_kb: url("/imgs/btn/kb.png");
tail j=7036 line= img_kw: url("/imgs/btn/kw.png");
tail j=7037 line= img_ki: url("/imgs/btn/ki.png");
tail j=7038 line=
tail j=7039 line= img_kob: url("/imgs/btn/kob.png");
tail j=7040 line= img_kow: url("/imgs/btn/kow.png");
tail j=7041 line= img_kib: url("/imgs/btn/kib.png");
tail j=7042 line= img_kiw: url("/imgs/btn/kiw.png");
tail j=7043 line=
tail j=7044 line= img_koeye: url("/imgs/btn/koeye.png");
tail j=7045 line= img_koeyeb: url("/imgs/btn/koeyeb.png");
tail j=7046 line= img_koeyew: url("/imgs/btn/koeyew.png");
tail j=7047 line= img_koeye_handhither: url("/imgs/btn/koeye_handhither.gif");
tail j=7048 line= img_koeye_handhi: url("/imgs/btn/koeye_handhi.gif");
tail j=7049 line=
tail j=7050 line= img_kop1: url("/imgs/btn/kop1.png");
tail j=7051 line= img_kop2: url("/imgs/btn/kop2.png");
tail j=7052 line= img_kop3: url("/imgs/btn/kop3.png");
tail j=7053 line= img_kop4: url("/imgs/btn/kop4.png");
tail j=7054 line=
tail j=7055 line= img_kop12: url("/imgs/btn/kop12.png");
tail j=7056 line= img_kop23: url("/imgs/btn/ko23.png");
tail j=7057 line= img_kop34: url("/imgs/btn/kop34.png");
tail j=7058 line= img_kop14: url("/imgs/btn/kop14.png");
tail j=7059 line=
tail j=7060 line= img_btn: url("/imgs/btn/btn.png");
tail j=7061 line= img_btn_n: url("/imgs/btn/btn_n.png");
tail j=7062 line= img_btn_s: url("/imgs/btn/btn_s.png");
tail j=7063 line= img_btn_e: url("/imgs/btn/btn_e.png");
tail j=7064 line= img_btn_w: url("/imgs/btn/btn_w.png");
tail j=7065 line= return(img);
tail j=7066 line= }
tail j=7067 line= </script id="script_load_urlbtn">
tail j=7068 line=
tail j=7069 line=
tail j=7070 line= <script id="script_load_b64btn" >
tail j=7071 line= function load_b64btn(btnid) {
tail j=7072 line= ko_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAE1FJREFUeNq0m09sI9d5wH/fG1I7FEXJWi4trow0cpKDgSBA4FzUS9tL29W5h0WSNg0QA/WaVNEI9tWHRZGitSEXEendAknhokWBHHr1Oj0VPRQC2hpt3AB7KBDFi11zJVFckZI4FGfe18ObIWck6t/aJRbickgO3+99f9/3vSfK1R/bQYWOT4MaNF8LcPeQBffUQgFRcpH7uKKegEaCAFrlqXrFe6/9cAOGsAYbQfGw0gcgYJ4d/8WrDkmuzrHX+I5IVYlQAdj1whwQ3nS3CslJC0ATDjT3H98qtwkFQaHiSUv/63fxRHmqOYBp78AP3tpYZSOgOLWt/1gvXA3mihx7eyILUU5FeZqM0aIS5cPrnYqheKW7HWJ3UJ2b6a2Orq2vueeNnl4vFP5fOHrbVRgTAEqOSKKXnkjhQOWl6StK9vY9P3rv+28BrANgjTUAOJi/bb1Y+sI5tiwLjkBFIQcMRbDT/ZsHxW6vFAhF/7h8RR0NV1kHbPayscaxbByYpS+UY+vFlqNQcgzBmeyc8CxXfvLiERxjEcoBlasIBNZHECvu6cEIxrmAme2lL4zj7h+qOIYhIIi+eNykTqEXlMMjgCDyDFiE4qVJbsN6DLHyiTqn4XzdUSdBWYMfyVe+II6tSBLvqSY0M6ZZv/PLTX6wMTvgCPCfffwqonz8KiBl3nv7ShQr/EJJj0PAfOPBygMAswY/8pa+CI6735U4BACl5lvf/yWfHHauBXP0PMAP/u1VkMT0ReUyIrkdU6wA/62MZBHfSDDfcCpmWLsEyGU4/ldywxyUoV2c2Z1nmc39ta//mR75AeDzjOxcqpS5yM/cHlPwScSpUQiYo2VnLYY1/nLp83P82gplgGhY/+kym+yv/U2e4/jdyOhUW1IeRwCKpnxJYWwyrXYSiJij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");
tail j=7073 line= ok_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD9/f0bIQwZHgowLzEoKCohISIvMDU1NjoqLDOCg4S1trQUGQemqZ54e28fIxE0NiyFiXaSlYZNTkkuMCNZWlRvcGonKRo9PzEKCgUREQtBQUDU1NMZGBQfHhp9fHozLiv8/Pz5+fn39/f09PTv7+/n5+fe3t4AAADXRk1jAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////6eH29uXl7e3t7e3t9uHs4elWVlbk5OTp6elW5YHq39zd9PTc3d3d3dzc297f39/e29zc3d3d3d3d3eDc3N3c3Nzc3d319PT09PT03dzc3Nzc3N3d5YHs7OyBge3t5fb24en/////////////////////////////////////////////////////////////////////AP//////////////////////////////////////////////////////////6eH27YHb3PLs4eHpVlbpVuHp4e3q4ODg4ODc3fT09fTx8azc3fX08dzc3N3d3Nzb39/y36zg3N3d3d3d3d3d4Nzd3d3d3fX08PD09PT09PT13ODg4ODc4N3x8fHx8fDx8fT09d3c24Ht//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////9u3b3OlWVlZWVlZW5FZWVlZWVlZWVlbp9urb3N3d8vT0//////////////////////////////////////////////////////////////T08t3u3ODb3t3e3uDc3d3d3d3d3fT09fT18fTd3Nvt/////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////8tz0VlZWVlZW5OTk5OTk4uTi5OTk5OTkVlZWVlbhgfL17Vb////////////////////////////////////////////////////////////////12tna5t3c9tve3eDg3Nzd3d3d3d3d3d3d9PT19PT03PL/////////////////////////////////////////////////////////AP//////////////////////////////////////////////////393pVlZWVuTk5OLk4uLi4uLi4uLi4uLi4uLi5OTk5FZW6e3//////////////////////////////////////////////////////////////+zy6t/f3ubZ5vTp9dzl293d3Nvg4ODg3Nzc3dzd3d3d3d303d3f//////////////////////////////////////////////////////8A////////////////////////////////////////////////3/XpVlZW5OTk4uLi4uLi4uLiKysrKysrK+Li4uLi4uLk5ORWVlb//////////////////////////////////////////////////////////+rq8t/f3t7g4Obm5vDa9OHd7e3s3d3d3dzc29vb4ODc3N3d3d3d9N313////////////////////////////////////////////////////wD//////////////////////////////////////////////93cVlZW5OTi4uLi4uLi8/38/Pz8/f39/f39/P3+K+Li4uLi4uTkVlZW/////////////////////////////////////////////////////+rq39/e3uDg4N7b3ubm5ubm8PTh6fbt7YGB7PLc3dzc29vb2+Dc3N3d3d3c3YH/////////////////////////////////////////////////AP///////////////////////////////////////////9/cVlZW5OLi4uLiK+Ir/vz8/Pv7+/v7+/v7+/v7+/z8/Ssr4uLi4uLk5FZWVv///////////////////////////////////////////////4Hy8t/e3t7erN7e397erN7u5ubm5vDw9+lW8/MrVu2B7Ore3ODe39/e29zc3d3d3N////////////////////////////////////////////////8A///////////////////////////////////////////f3FZW5OTi4uLi4isr/vz8+/v7+/v7+vr6+vr7+/v7+/v7/CsrKyvi4uLi5ORWVv/////////////////////////////////////////////q6t/e397f39/f39/f397e3qzm7ubm5ubj8PDh6eLz/isrVvaB7N/f39/f397b3Nzd3IH//////////////////////////////////////////////wD/////////////////////////////////////////31ZW5OTi4uLiKysr8/37+/v6+vr6+vr6+vr6+vr6+vr6+vv7/isrKysr4uLi4uTkVv//////////////////////////////////////////8vLf3t/f397e3t7e3t7e3t7e3t7u7ubm5ubu5vDxgVbk8ysr8/Pi9urf8vLy39/f2+Dc2///////////////////////////////////////////////AP///////////////////////////////////////+BWVuTk4uLiKysrK/P9+/r6+fn5+fn5+fn5+fn5+fn5+fn6+vz98/MrKysr4uLi4uTkVlb/////////////////////////////////////7Orf39/f397e3t7e3t7e3t7g4N/y7O3r7u7u7u7u7u709O9W5PPzKyvzVurv8vLy8vLf397g//////////////////////////////////////////////8A///////////////////////////////////////yVlbk4uLiKysrKyvz/v38+/z8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/f7+/vPzKysrK+Li4uLkVlb//////////////////////////////////+ry39/f39/e3t6s3t7e3t7g4PLt4eHh4eHn6+vr6+vr5+fr693y5OQr8/Mr7fLy8vLq8vLy39/b4P///////////////////////////////////////////wD/////////////////////////////////////6lbk5OLi4uIrKyvz/v7+/f39/fz9/Pz8/Pz8/Pz8/Pz8/P38/P39/f39/v7+8ysrKyvi4uLkVlb////////////////////////////////q8t/f39/f36ze3t7g3t7e4PKB4eHh4eHh4eHv7+/n7+/v7+/v5+fc9+Hk4uTt6urq6urq6vLy8t/e8v//////////////////////////////////////////AP///////////////////////////////////+pWVuTi4uIrKyvz8/7+/v39/fz8/Pz8/Pz8+/v7+/v7+/v7/Pz8/Pz8/f39/v7+8/MrKyvi4uLkVlb/////////////////////////////6t/f39/f39/e4ODg4N7g4ODy7fbh9uHh4eHh4eHv7+/v7+/v7+/v7+/y3+/q7Ozs7Orq7Ozq6vLy8vLf8v////////////////////////////////////////8A////////////////////////////////////VuTk4uIrKysr8/7+/v39/fz8/Pz8+/v7+/v7+/v7+/v7+/v7+/v8/Pz8/P39/f7+8/MrKyvi4uLkVlb//////////////////////////+ry39/f39/e4ODg4ODe3t7g34Hh4eHh4eHh4eHh4eHy8vLy8vLy8vLy8vLq6urs7Ozs7Ozs7IHq6ury8vLf6v///////////////////////////////////////wD/////////////////////////////////7VZW5OLi4isrK/7+/v39/fz8/Pz7+/v7+/r6+vn5+vr6+vn5+vr7+/v7+/z8/Pz9/f3+/vMrKyvi4uLkVv/////////////////////////s8t/f3t/e4ODg4ODg4N7e4ODfgeHh4eHh4eHh4eHh4eHq6urq6urq6urq6vLq6uzsgYHsgezs7Ozs6urq6t/f6v//////////////////////////////////////AP///////////////////////////////4FWVuTi4isrK/Pz/v79/fz8/Pz7+/v7+vn6+fn5+fn5+fn5+fn5+fr5+vr7+/v8/Pz8/f3+/vMrKyvi4uLkVv//////////////////////gd/f3t/e4ODg3uDg4N7e4N7g3t/sge329uH29u2B7e3tgerq6oLqgurqgurs6urs7OzsgeyBgYGB7Ozs7Orq6vLf6v////////////////////////////////////8A////////////////////////////////Vlbk4uLiKyvz8/7+/f38/Pz7+/v6+vr5+fn5+fn4+Pj4+Pj4+fn5+fn5+fn6+/v7/Pz8/f3+/v4rKyvi4uLkVv///////////////////+Xf3t7e4ODg4N7g4N7e3uDe3t7e3t7y6vLy8vLf397e4ODe6+qC6urs7Ozs7Ozs7Ozs7IHsgYGBgYGBgYHs7Ozs6vLf8v///////////////////////////////////wD//////////////////////////////1ZW5OLi4isrK/P+/v39/Pz8+/v7+vn5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+fn5+fn6+/v7/Pz8/f3+/vPzKyvi4uTkVv//////////////////3+Dg4ODg4ODe3uDg4ODg3uDe3t7e3uDg4N7e4ODg4ODe3t7g2+zs7OyC7Ozs7IGCgYGB7IHtge3t7e2BgYGB7Ors6vLq////////////////////////////////////AP/////////////////////////////tVlbk4uIrKyvz/v39/fz8+/v7+vr5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5+fn6+vv7+/z8/f3+/vMrKyvi4uRW/////////////////+rg4ODg4ODg4N7g4ODg4ODe3uDg3t7g4ODg4N7g3t7e3t7e3t7e2+zs7IGBgu2BgYGBge3tge3t7e3t7eXt7YGB7Ozq6vLs//////////////////////////////////8A/////////////////////////////1ZW5OLi4isr8/7+/f38/Pz7+/r5+fn5+Pj4+Pj4+Pj42NjY2NjY+Pj4+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrKyvi4uRW//////////////+B4ODg4ODg4ODg4N7b4ODg4ODg4ODg4ODg3t7e3t7e3t7e4N7e3t7e7+yBgu3t7e3t7e3t7e3t7e3t5eXl5eXl7e2Bgezq6vL//////////////////////////////////wD////////////////////////////hVlbi4uIrK/P+/v39/Pz8+/r6+fn5+Pj4+Pj4+NjY2NjY2NjY2NjY2NjY+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrK+Li5OT///////////////Lf4ODg4ODg4ODg4ODg4ODc4Nzg4ODg4N7e3t6s3t/f397e3t7e3t/f7+3t7e3t7eXl7eXt5eXl5eX29vb29vbl5e2Bgezs8v//////////////////////////////////AP///////////////////////////1ZW5OLiKyvz8/79/f38/Pv6+vn5+fj4+Pj4+NjY2NjY2NjY2NjY2NjY2NjY2Pj4+Pj4+Pn5+vr7+/z8/f3+/vMrK+Li5Fb/////////////8t7g4ODg4ODg4ODg4ODg4ODg4ODb4N7e397f3t/f397e3qze3t7e3t7frIHt7e3l5eXl5eXl5eXl6Ojo4eHh4eH29uXtgezs8uz///////////////////////////////8A//////////////////////////9WVuTi4isrK/P+/v39/Pz8+/r6+fn4+Pj4+PjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz8/f7+8ysr4uLi5P////////////Lf3+Dg4ODg4ODg4ODg4ODg4ODg297e39/f39/e3t7e3uDg4ODg4ODe4N7b5+3t5eXl5ejo6Ojo6Ojo6Ojo6Onp4eHh9vbtgezs6v///////////////////////////////wD//////////////////////////1ZW4uLi4ivz/v79/f38/Pv7+vn5+Pj4+Pj42NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz9/f7z8ysr4uLkVv/////////q8t/e3t7e4ODg4ODg4ODg4ODb3t7e3t/frN7e3uDg4ODc4Nzg3ODg4ODg4ODb6+Xl5ejo6Ojo6Ono6ejp6enp6enp6enh4fbtgezqgf//////////////////////////////AP/////////////////////////lVuTi4isr8/P+/v39/fz8+/r5+fn5+Pj4+NjY2NjY2NjY2NgAAAAAAAAA2NjY2NjY2Nj4+Pj4+Pn5+vv7/Pz9/f7zKysr4uTk//////////Lf4N7e3uDg4ODg4ODg4ODg3t7g3t7e3uDg4ODg3ODc4ODg4ODg4ODg4ODc4Nzg6+Xo6Ojo6ejp6enp6enp6enp6elWVunp6eHtgYHq7f////////////////////////////8A////////////////////////7Vbk4uLiKyvz8/7+/f38/Pv7+vn5+fn4+Pj42NjY2NjY2NjYAAAAAAAAAAAAANjY2NjY2Nj4+Pj4+fn5+vv7/Pz9/v7zK+Li4uT////////t397e3t7g4ODg3t7e3t7g4ODg4N7g4ODg4ODg4ODg4N7e3t7e3uDg4ODg4ODc3Nzc4Ojo6Ojo6enp6enp6enp6enp6elWVlbp6eHt7YHs7f///////////////////////////wD//////////////////////+WBVuTi4isr8/P+/v39/fz7+/r6+fn5+fj4+PjY2NjY2NjY2AAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn5+vv8/P39/vPzKyvi5Fb//////+zf4ODg4ODg4N7f39/f39/e3uDg4ODg4ODg4ODg4ODg4N7e3t7e4ODg4ODg3Nzc3Nzc3Ojo6enp6enpVuTkVuTk5ORW5OlW5FZW6eH27YHs////////////////////////////AP/////////////////////27O3k4uIrKyvz/v7+/f38/Pv7+vn5+fn5+Pj4+NjY2NjY2NjYAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn6+/z8/P3+/vMr4uLi5P//////8t7g4N7e39/f39/f39/f39/e3t7g4ODg3uDg4ODg4ODg4ODg4ODg4ODg4ODg4ODc3Nzc3O7p6enp6eTp5Onk5OTk5OTk5OTkVuRWVuH27YHs9v////////////////////////8A//////////////////+s4eyB4eLi4isr8/P+/v39/fz7+/r7+/r6+vn5+Pj4+NjY2NjY2AAAAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj5+fn6+/z8/f3+8ysr4uLk///////e4ODe39/f39/f39/f39/f397e3t7g3t7g4ODg4ODg4ODe3t7e3uDg3t7e2+Dg4Nzg4Nzd8fXp6Vbk5OTk5OTk5OTk5OTk5OTk5Fbp4eH27YHs/////////////////////////wD////////////////y4ezsgYHi4isrKyvz/v79/f39/Pz8+/v6+vr6+fn4+Pj4+NjY2NgA+fn5+fj4+fn5AAAAAAAAAADY2NjY2Pj4+Pj5+fr7+/z9/f7z8yvi4uRW////7ODg4N7f39/f39/f3t/f39/e3t7g4ODg4ODg4ODg4N7e3t7e3t/f3t7f397f39/f4ODg4ODd9PTu5OTk5OTk5OQs5CzkLOTk5OTk6enp4fbt7YH/////////////////////////AP/////////////t4ezq7IGB7eLiKysr8/7+/v39/fz8/Pz7+/r6+vr5+fj5+Pj4+NjYAPn6+vr6+vr6+vn5AAAAAAAAAADY2NjY2Pj4+Pn5+fr7/Pz9/v4rKyvi4lb////y4ODe3t/f39/f397e3t7e4N7g4ODg4ODc4ODg4ODg3t7e3t7e3t7e3t7e3t/f39/g4ODg4ODd8fHj5unk5OQs5OLk4uTi5Czk5OTk5Ono6OXtgYHs6v////////////////////8A/////////////4Hq6uzs7IHt4uIr8/P+/v79/f38/Pz8+/v7+/r6+fn5+fj4+Pj42Nj5+/r8+/v7+/v7+fr4AAAAAAAAANjY2NjY+Pj4+Pn5+vv8/P39/vMrK+Lk5P///97g4N7e3t/f3t7e4ODg4ODg3ODc4ODc4Nzc3ODg4N7g3uDe3t7e3t7e3t7g3t7g4ODg3Nzc3dz19PT049nk5OTk5OTk5OTi5OTk5OTp6eno5eWB7Ozs/////////////////////wD//////////+Xs6urq7Ozt6OTiKyvz8/7+/f39/Pz8/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+fn5+fv7+vr4AAAAAAAAANjY2NjY+Pj4+fn6+/v8/f3+8ysr4uLk///s4ODe3t7f3t7e3uDg3Nzc3Nzc3Nzg3ODc3d3c4ODe4N7g3t7e3t7g4ODg4N7g4ODc4ODg3N319fX09PX08fDx5uTk5OTk5OTk5OTk5OTp6eno5eXt7Ozq6ur/////////////////AP///////+3s6urq7OyB7e3o5OIrK/P+/v39/fz8/Pz7+/v6+vn5+fn5+fn5+fj5+Pn6+/v7+djY2NjY+fv6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT///Lg4N7e3t7e4ODg3Nzc3N3c3dzc4Nzg3fX19PXd3ODg4ODe4N7e4N7e4ODe4ODg3ODg3ODd9fX09PT09fX18fDw8OPu6eTk5OTk5Onp6enp6Ojo5e3t7Ozs6urq7P////////////8A5Fbh7IHs7Ors7Ozs7O3t5eji4isr8/7+/f38/fz8+/v7+vr6+fn5+fn5+fn5+fn5+vr7+/nY2NjY2NjY+fv6+fkAAAAAAAAA2NjY2Pj4+Pn5+fr7/Pz9/v4rK+LiVv/t3t7g4ODe4ODg3Nzd3Nzc3fX13dzg3Nz19fX19fX13dzg4ODg4ODe4ODg4ODg4ODg4ODg3PX19fT09PT19fX19fX19fXu7urs6enk6eTp6enp6Ojl5e3tguzs7Ozq7OyB7IH26eXt9wD19fX19Nrj4+Pj49ra4+Pa2lbiKyvz/v39/fz8/Pz7+/r6+fn5+fn5+fn5+vn5+fn7+/v6+NjY2NjY2NjY+fv6+QAAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMrK+LkK+zd3uDg3ODg4Nzg3fX13d319fX13eDg9fX13fX19fX09d3c3ODc4Nzg4Nzc3Nzg3ODb4Nz19fX19PT09PT19fX19fX19fX13Ovc6+vr5u7q7IHt9unpVuTi4uLi4isrKysr4uLi5FboAP//////////////////////K+IrK/P+/v39/Pz8+/v6+vn5+fn5+fn5+vr6+vr5+vv7+vjY2NjY2NjY2NjY+fn5AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8yvi4uQr8vXb3dzd3dzg3N319fXd9fX09fXc3Nz19d3u9fX19PT03dzg4ODc3N3c3d3d3d3d3dzc9fX19PT09PT09PX09PX19fX19fX13dzc4ODe7P////////////////////////////////8A///////////////////////i4isr8/7+/f38/Pv7+vr5+fn5+fn5+fn5+vr5+vn6+/v52NjY2NjY2NjY2Nj6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7/Pz9/v7zKyvi4ivn9d319d313d319fX19fX19PT09Nzc3PT19fX19PX19fX03Nzg3d313fX19fX19fX19fT09fT09PTx9PT09fTx9PX19fX19fX13d3c297s/////////////////////////////////wD//////////////////////+LiKyvz8/79/fz8+/r6+fn5+fn5+fn5+vr6+/r7+vv8/PnY2NjY2NjY2NjY2Pn6+fgAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMr4uLk/ef19fT09fX19fX09fXd9fX09PT13dzd9fX09fX09PT09PXd4Nz19PT19PT09fX13fX19PT19PT09PT09PT19PH09PT09fX09fX19d3c3uz/////////////////////////////////AP//////////////////////4uLiK/Pz/v39/Pz7+vn5+fn5+fn5+fn6+vv6+/r7+/v8+fjY2NjY2NjY2Nj4+fn4AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8ysr4uLz5/X09PX19fX19fX19fX19fX09PT19fX19PT09PT09PT09PXc3fTx9PH09PT09PT09PT09PT09PT08fT09PX08fHx8fT09PT09fX19e7e7P////////////+GchQ3AAAfU0lEQVT///////////////////8A///////////////////////i4uIr8/P+/vz8+/v6+fn5+fn4+fn5+fr6+vr7+/v7/Pz5+PjY2NjY2NjY2Pj5+fkAAAAAAADY2NjY2Nj4+Pj5+fr7/Pz9/v7zK+Li5OLv9PHx8fHx9PT09PT09PX19fX09Nr09PX19fT09PT09PX19fX19PH08fTx8fH09PT09PT09PT09PTx9PH09PX08fT09PT09PT19fT13d7s/////////////////////////////////wD//////////////////////+Li4isr8/79/fz8+/r5+fn5+Pj5+fn5+fn6+vv7+vz8/Pr4+NjY2NjY2Nj4+fn5+djYAAAAANjY2NjY2Pj4+Pn5+vv8/P3+/vMrK+Li/+ra8fHx8fD09PHx8fT09PT09PTa2ub19fTd9fX19fXd9fXm5ub09PT08fHx8fH09PX09Ob09PT09PHx9PT09fTx9PX09PT09fX19PX12+z/////////////////////////////////AP///////////////////////+TiKyvz/v39/Pz7+vn5+fn4+Pn5+fn5+fr6+vv7/Pz8/Pr4+NjY2NjY+Pn5+fj42NjY2NjY2NjY2NjY+Pj4+fn6+/z8/f7+8yvi4uT/gebw8fHw8PDx8fHx8fT09PT09PTa9PT09PX19d313fXd9ebm5ubZ9fT08fH09fX15ubm5ubm5vT09PTj2trm5vT09eb19fX09fX05t3r6v////////////////////////////////8A8u/n6+vr6+vn7+/y6uzt6Fbk4ivz/v38/Pz8/PP+/v7+/fz6+fn5+fn5+fn6+vr7+/z8+/r42NjY2Pj5+fn5+dj42PjY2NjY2NjY2Pj4+Pn5+fr7/Pz9/v7zKyvi5P//5+Pw8fHx8PDw8PHx9PTx8fH08fT09PT09PT19fX19fXd9fTm5ubm5ub02tnm5ubm5tnZ2ubm5tra2trZ2ebm5ubm5ubm5ubm5ubm3evc/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+QDu9+3l6faB7IHs7Orq7Ozs7IHt5eXo6Ojp6enpVlZWVunp6eriK/v5+fn4+fn6+/v7/Pz8+/r5+fn5+fn5+fj4+Pj4+Pj42NjY2NjY+Pj4+fn5+/v8/P398ysr4uLk///q2uPj4/Hw8PDw8fH08fH08fHx4/T09PT09PT19fX19fX13eb05vTm5ubZ2dra2tra49ra2drZ2dnZ2dnZ2uba2tna5tn05ubm5u7m6+rp6enp6Ojl5e2Bgezs6uzq7OyB7IH26eXtAP/////////////t7Ozq6uzsge3t5ejo6enpVuTk6eTk5OTk6eTp5P35+fj4+Pn6+vv7/Pz8+/v6+vr6+fn5+Pj4+Pj4+PjY2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT//+3u2uPj4/Dw8PDx8fHx8fH08fH08fT09PT09PT09fX13fXd9ebm2dna2dnZ2drZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tnm5ub17u7r8unp6ejo6OXtgYLs7Orq6uz///////////8A////////////////5ezq6uqC7IHl5ejo6enp5OTk5OTk5OTk5OTkVlbk/fj4+Pn6+/v7+/v7+/r6+vr5+fj5+fj4+Pj4+Pj42PjY+Pj4+Pn5+vv8/P39/vMrK+Li5P///+fa4+Pj4/Dw8PHx8fHx8fHx8fTx8fT09PT09PX19fX13fXd9eba2dra2tra2trZ2tna2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ5vT19fXu3efs5Onp6ejl5YHs7Orq6uz//////////////wD//////////////////4Hq6uzs7IHl6OjpVunk5OTk5OTk5OTk5OTk5ORW5Pz4+Pr6+/v7+/v7+vr6+fn5+Pn5+fj4+Pj4+Pj42Pj4+Pj5+fn7+/z8/f7+8ysr4uTi////8tna2uPj8PDw8PDw8fHx8fHj9PT08fT09PT19PX19fXd9fX12tra2tra2tra2tra2tra2tra2dnm5tna2tra2trZ2vT09fX13d3u5+3p6eno5eWBgezs6uqB////////////////AP//////////////////7eHs6uyBge3l6Onp5OTk5OQs4iziLOLkLOTk5OTk6eT8+fr6+/v7+/r6+vn5+fn5+fn5+fj4+Pj4+Pj4+fj4+Pn5+vv7/Pz9/v7zK+Li4v/////t7tna4+Pw8PDx8PDw8fHx8eP09PTx9PT09PX09fX19fX13fX02tra4+Pj2tra2tra2tra2trZ2dra2tra2uPj2tr08fT09PX19e7v7eTp6Ojl7YGB7Ors//////////////////8A////////////////////5fLh7OyB7e324ejp6eTk5OTk5OTi5OLk5OTk5OTkVunk/Pr5+/v7+/v6+/r6+fn5+fn5+fj4+fn5+fn4+Pj4+fn6+/v8/f3+8/Mr4uJW///////n5trj4/Hx8PHx8fHx8PHj8fT09PT09PT09PT19fX19fX19OPj4+Pj4+Pj2uPa2tra2tra2tra4+Pa2trj4+Pa2vHx9PT09fX17vLp6enh9u3tgers//L//////////////////wD///////////////////////Ks4eyB7eXh6elW5OTk5OTk5OTk5OTk5OTk6eTp6enp9vv6+vv7+/v7+/v6+fr5+fn5+fn5+fn5+fn5+fn5+fr7/Pz9/f7zKyvi4uL//////+rm2drj4/Hw8fHx8fDx4+P09PT09PT08fHx8fT09fX19PT04+Pj2uPj4+Pj2tra2tra2trj2ub09ebm49rj4+P09PHx9PH09PXr7Onp6eHl7YHs////////////////////////AP/////////////////////////y9uyB7fbh6Vbk5OTk5OTk5OTk5OTk6eTk6enp6enoVvn6+vv7+/v7+/r6+vr5+fn5+fn5+fn5+fn5+fn6+/v8/P3+/vMr4uLk4v///////+7m2drj4+Pj4/Dx8fDj4+Pj4/Tj9PHx8fHx8fTx9PT04+Pj4+Pj4+Pj4+Pa2tra49rj4/T19fT19e7m4+Pj4/Tx8fHx8Nr09OeBVlbh9u2B7Pb///////////////////////8A///////////////////////////c7eyB7fbh6Vbp5Onp5Onk5Onk6enk6enp6enp6Ono6fz6+/v7+/v7+/r6+vn5+fn5+fn5+fn5+fn5+vv7/Pz9/f7zKyvi4uT/////////5+bZ2ePj4/Hj4+P02uPj4+Px4+Pj4+Px8fHw8PDw8fHx4+Pj4+Pj49ra2dra2trj4/Tm9fX09PX09fX04+Pj9PHx8fHj9PH03+lW4fbtgezl8v///////////////////////wD////////////////////////////g7eqB7e3h6VbpVuTp6enp6enp5Onp6enp6ejp6Ojo5fv6+/v7+/v6+vr6+fn5+fn5+fn5+fr6+fr7+/z8/P3+/vMrK+Li///////////q5tnZ2drj4+Pj8Nr04+Px4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj8ePj2tra2uPj4+Pa9fX09PT09PTa9OPj4+Pj8fH09PTj8e7s6fbt7YHs7fL/////////////////////////AP/////////////////////////////bgeqBge3h4enp6Vbp6enp6enp6enp6eno6ejo6Ojl7fr6+vv7+/v7+vr6+vr6+vr6+vr6+vr6+/v8/Pz9/f7z8yvi4lb////////////u5tnZ2dna4+Pj9OPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Px4+Pj2trj4+Pj4+Pa2ub02vTa9OPj4+Pj4+Pj4+Pj4+bm2tra5/bh7YGB6oHy//////////////////////////8A///////////////////////////////bgezsge324eHp6enp6enp6eno6ejp6Ojo6Ojo5eXlgfr6+/v7+/r7+vr6+vr6+vr6+vr6+vv7+/z8/f3+/vMrK+Li4v////////////Lm5tnZ2tna2tra4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj8ePj4/Ta2uPj2tra4+Pj4+Pj9Nrm5u7y9u2B7OqB8v///////////////////////////wD////////////////////////////////f8uzsge329uHh6enp6Ojo6Ojo6Ojo6Ojo5eXl5eXt7Pv6+vv7+/v6+vv6+/r6+/v7+/v7+/v8/Pz9/f7zKyvi4lb//////////////+7m2dnZ2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj2tra4+Pj2uPj49rZ5ubu5+3tgezs6vL/////////////////////////////AP///////////////////////////////9/s8uzsge3l9vbh9uHh4ejo6OXl6OXl5eXl5e3t7e3t7Pv6+/v7+vv7+/v7+/v7+/v7+/v8/Pz8/f3+8/MrK+JW4v//////////////8ubm2dnZ2tra2tra2trj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj2uPj49ra2trj4+Pj4+Pj4+Pa2tra2dnZ2dnZ2ebm7uvf7YHs7PLs7P////////////////////////////8A/////////////////////////////////9zq6ursgYHt5eX29vb29uXl9uXt5eXl5eXl5e3tgu2B7Pv6+/v7+/v7+/v7+/v8+/z8/Pz8/P39/v7zKyvi4uT/////////////////6+bZ2dna2tra2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pa2tra2uPj4+Pa4+Pa2tnZ2dnZ2dnZ2dnZ5ubm5+yB7Ozy7PL//////////////////////////////wD//////////////////////////////////9/f6uzs7IHt7eXl5eXl5e3t7e3t7e3t7e3t7e3tgYLs7Pv7+/v7+/v7/Pz8/Pz8/Pz8/Pz9/f7+8ysr4uJW4v/////////////////q7ubZ2dnZ2tra2tra2tra2tra2trj4+Pj49ra49ra2uPj4+Pa2uPj4+Pj4+Pj2tra2tnm2dnZ2dnZ2drZ2dnm5uvf7Ozq6vLy////////////////////////////////AP//////////////////////////////////8urf6uzs7Ozt7e3t7e3t7e3t7YGBgYGBgoGCgYKB7Ozs6vv7+/v8/Pz8/Pz8/Pz8/Pz9/f3+/vPzKyvi5OL////////////////////v5ubZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2uPj4+Pj4+Pj49ra2trZ2dnZ2dnZ2tnZ2dnZ2dnZ5ubu7+zs7Orf7IH///////////////////////////////8A////////////////////////////////////3/Ly6urs7IGB7e3t7e3t7YGBgoGC7OyB7IHs7OyC7Ozs6vv7/Pz8/Pz8/fz9/P39/f39/v7z8ysr4uLk///////////////////////r5ubZ2drZ2dnZ2tra2tra2dra2tra2tra2tra2tra2tra2tra2tna2dnZ2dnZ2dra2trZ2dnZ2dnZ2dnm7ufq6uzq3+zq/////////////////////////////////wD/////////////////////////////////////3t/y6urs7OyBgYGBgYGBgYHsgYHs7OyC7Ozs7Ozsgurq7Pz8/Pz8/f39/f39/f39/v7+8/MrK+LiVv/////////////////////////u5tnZ2dra2tra2tra2tra2tra2tra2dra2tra2tra2tnZ2dra2dnZ2dnZ2tra2tnZ2dnZ2dnZ2dnZ5u7n5+zs8vLf8v//////////////////////////////////AP/////////////////////////////////////e8t/y6urq6uzs7OzsgYHsgezs7Ozq6uzs6oLq6urqgurq6vz8/f39/f39/v7+/v7+/vMrKyvi4v///////////////////////////+rm5tnZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2drZ2tra2tra2tra2trZ2dnZ2dnZ2dnm2ebu79vq6ury3+rs//////////////////////////////////8A///////////////////////////////////////c39/y6urq6uzsgezs7OyB7Ozs6urq6urq6uqC6urq6urq/f39/f39/v7+/v7z8/MrKysr4uL///////////////////////////////Lm5tnZ2dna2tra2tra2tra2tra2tra2tnZ2dna2dnZ2dra2tra2tra2trZ2dna2drZ2dnZ2ebu7uvc6urq8t/q8v///////////////////////////////////wD////////////////////////////////////////c39/f8urq6urs7Ozs7OyB7Orq6vLy7+/v7+/v7+/v7+/v9vz8/f3+8/PzK/MrKysr4uLi/////////////////////////////////+/m5tnZ2dnZ2trZ2tra2tra2dna2tnZ2tra2tra2tra2tra2tna2tnZ2drZ2dna2dnZ2ebm5uvr3Ory8vLe6vL/////////////////////////////////////AP/////////////////////////////////////////b39/y8vLy6uzs7Ors7Ozs7Orv7/Ly7+/v7+/v7+/v7+/v8vz8/vPzKysrK+Ir4uLi4v///////////////////////////////////+/m5tnZ2dna2tra2tra2tra2tra2dna2tra2tra2tra2dnZ2dnZ2drZ2tna2tnZ2dnm5u7r7tzy8vLy3vLq//////////////////////////////////////8A///////////////////////////////////////////c397f8vLy6urq6vLq6u3k4uTh9+vn5+/v7+/v7+/v7+/v/P3zKysrK+Li4uLi4lb///////////////////////////////////////Lu5tnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnm5ubu5+7c8vLy397y6v///////////////////////////////////////wD////////////////////////////////////////////c3Nve3/Ly8ury8vLy7Svz8yvk5PLu6+vn5+vr6+vr6+frKysr4uLi4uLi5Fb//////////////////////////////////////////+/u5tnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ5ubm7ufu3PLy397b4PL/////////////////////////////////////////AP/////////////////////////////////////////////03ODe3t/y8vLy8vLqVvMrK/Pz5Fbv9PTu7uvu7u7u7uvu4uLi4uTk5FZW//////////////////////////////////////////////Ln5ubZ2dnZ2trZ2dra2trZ2dra2tra2dra2tra2tnZ2dnZ2dnZ2dnZ5ubm7u7u9dzy39/e4N/c7P////////////////////////////////////////8A///////////////////////////////////////////////f3Nzg29/f3/Ly79/q9uLz8yvz8+RWgfHw5ubm5ubm7u7u4uTk5FZW/////////////////////////////////////////////////+rv7ubm5tnZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2tra2trZ2drZ2dnZ2ebm5u7r7t3f39/b4Nzb3////////////////////////////////////////////wD////////////////////////////////////////////////f3N3c3Nve3t/y39/f6oH2VuLz8/Pi6eHw8OPm5ubm7ubuVlZWVv/////////////////////////////////////////////////////g5+7m5tnZ2dnZ2dnZ2dnZ2dnZ2tra2trZ2dna2dnZ2dnZ2ebm5ubu7u7d3t7b3Nzd3N//////////////////////////////////////////////AP/////////////////////////////////////////////////f3N3d3Nzc297f397e3N7q7IHtViv+81bp5/Dw5ubm5ubu6v/////////////////////////////////////////////////////////y3Ofm5tnm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ5ubm5ubu5+713tvc3Nzd3dzf//////////////////////////////////////////////8A///////////////////////////////////////////////////s3d3d3d3d3Nzg29vb29zc3eDy7IGB7e324en08Obm5ubm6///////////////////////////////////////////////////////////8uvr7ubm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnm5ubm5ubu5+713dzc3d3d3dzd8v///////////////////////////////////////////////wD/////////////////////////////////////////////////////3/Xd9N3d3d3c3Nzc4Nvb2+Dd3d3d3eztgd3h9Nrw5ubu7v///////////////////////////////////////////////////////////9/n6+7m5ubm2dnZ2dnZ2dnZ2dnZ5ubm5ubm7u7r7t303d3d3d3d9N303///////////////////////////////////////////////////AP///////////////////////////////////////////////////////9/d3fTd9d3d3d3c3Nzc3Nzg4ODb3N3d2+Xc3ena5tnm5v/////////////////////////////////////////////////////////////y2+fr7u7m5ubm5ubm5ubm5u7m7u7u6+fu3fT09d3d3d3d9N3d3/////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////f4PTx9PT03d313d3d3d3d3Nzc3Nzb3dvb9tz15trZ2uv//////////////////////////////////////////////////////////////93d9+fr6+vr7u7u6+vr6+v19OPd9PT03d3d9PT08fTc8v///////////////////////////////////////////////////////wD////////////////////////////////////////////////////////////////e3N3x9PT09PX03d313d3d3Nzg3t7d29vg3O718vT///////////////////////////////////////////////////////////T08vXd3d3d3fH08fHx8fHx9PX09PT19PT09PHd3N7t////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////+B3uDd3fX09PTd3d3d3d3d3dzc4ODg3N319PX19d3f39/f/////////////////////////////+Xtgezs6vLy8urs9PT09PT03dys8vLq8t736+vr6+719PTd9N3d4OCB//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////////////////////////9u3t7dze3d3c8t3d29/f8t703dze3ODd3d3d3dzc34Hs6vLf29zc3Nzb39zh7YHq8t/b8vLy8t/e3Nzc3t/p6enh4YHh4eHs8vLf8t7f3t7f8vLy8uzsgYHt9v///////////////////////////////////////////////////////////////////5cpK5EsZ8r3AAAAAElFTkSuQmCC");
tail j=7074 line= kb_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAABRCAMAAAB7eHFAAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAyMjc2NjpCQkZJSUxUVFc8PD6Dg4YmJywrLDEtLjMvMDUpLDQsLzd9f4UoKi9wcnclKzcjJCYvMik1OC8jKBYUGQYSFgYYHQkZHgoVGQkQEwcbIA0eIxAqLSEYGg8KCgYPDwoiIh8bGhUUEw8gHxseHBgYFhMAAAD3jX3ZAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGvBJREFUeNoB5Roa5QD///////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////d/d2ebh4eDg////////////////////////////////////////////////////AP////////////////////////////////////////ys29rd2dis2KzZ2dnd2trd2Nna/////////////////////////////////////////////wD////////////////////////////////////qrNrZ4N/f39/f5ubm5ubm4ODg4djZ3dvZ2v////////////////////////////////////////8A/////////////////////////////////9zb2ODp39/f3+Dg5ubm5ubm5ubg4ODg4OHi2Nnb2dv/////////////////////////////////////AP//////////////////////////////6qys5uDm4ODg4ODg4ODg4ODm5ubm4ODg4ODg4OHi2Nnd293//////////////////////////////////wD////////////////////////////q6tnh4eHh4eDh4eDg4OHh4eHh4eHg4eHh4ODh4eDg4ODh2Njd293///////////////////////////////8A/////////////////////////+vq3eLh4uHh4eLi4uLi4uLi4tji4uLi4uLi4eLi4tjY4uLi4uLi4tnd3dz/////////////////////////////AP///////////////////////+rbrOHh4ODg4eLY2NjY2NjY2NjY2NjY2OLi4uLi4tjY2NjY2NjY2NjY2dnb2v///////////////////////////wD//////////////////////+rd4eDg4ODi2NjY2NnZ2NjY2NjZ3d3d3djk4uLi4uLi4eLi4tjY2NjY2NjY2d3a//////////////////////////8A/////////////////////9nY4Obg4OLY2NnZ2dnZ2dnY2Nvn3t7e3uXe5efc2tjj4+Ph4eLi4uLi4uLZ2djZ2dvb////////////////////////AP///////////////////9vh5ubh4tjZ2dnZ3d3d3dnZ2oHe3t7e3t7e3uXl5eXl59ro5OLi4uHh4uLi4tnZ2dnZ2tr//////////////////////wD//////////////////93m5uDi2NnZ2NjZ2d3d2dnZ3OXe3t7e3t7e5d7l5eXl5eXlgdno4eHg4OHh4uLY2dnZ2dnd3f////////////////////8A/////////////////93g4OHY2dnZ2d3d2d3Z2d3d2ufe3t7e3t7e3t7e3uXl5eXl5eXn2ujj4+Pg4+Dh4tjZ2djZ2d3a////////////////////AP///////////////93i2NjZ2d3d3d3d3d3d3d3d3drn3t7e3t7e3t7e5d7l5eXl5eXl5YHk6OHh4eDj4+Pj5NjZ2NnZ3dr//////////////////wD//////////////9vZ2dnd3d3d3d3d3d3d3d3d3d3d3OXe3t7e3uXe3uXl5eXl5eXl5eWB2ePh4eHg4+Pj6Ojj5NjY2Nnd3P////////////////8A/////////////9/d3dnd3d3d3d3d3d3d3d3d3d3Z2d3b3NzcgYGBgeeB5+fn5eXl5+eB3OTk4eHh4ePg4+Pk4+Po5Njk2Nnb////////////////AP/////////////d3d3d3d3Z2dnZ2d3d3d3d2dnZ2azY4uHh4Obj5OHj5OHY3dra2tra2uTY4uHh4eDh4eHg4eHk4+jk5OTk2Nv//////////////wD////////////a3d3d3dnZ2NjYrNis2dnYrNjYrOLh4ODg4ODg4eHh4eDg4ODg4OHg4ODh4uHh4eHg4ODg4ODh4ePj6Ojo6Ojk3P////////////8A///////////b3d3Z2dnY4uHg4ODg4eHg4ODm4ODg4ODg4eHh4eLi4uHh4eHh4eHg4ODg4OHh4ODg4eDg4ODg4OPg4+Pj5Ojo6Nn/////////////AP//////////3dnY2Nji4Obf39/f39/f39/m4ODg4eHi2NjY4uHh4eDh4eLi4eLi4uHg4ODg4ODg5uDm5uPg4OHg4+Pm4+Pj6Ojk2v///////////wD/////////2tji4eDm39/f3+bg4ODg4OHirNji4uLY2NnZ2dji4uLi4uLY2Nji4uLh4eHg4ODm5ubm5ubm4+Pg4OPj4+Pj6Ojo5N3///////////8A/////////djg5t/f3+bg4eLYrKysrKzZ2Nji4uLY2KzYrOLi4uLh4uLi4tjY2Nji2NjY4eHg4ODm5ubm4+bj4+Pj6Ojo6Ojo5OTZ2v//////////AP///////93g39/f5uDY2ays4Pn9/fz54OLh4eHi4uLi4eHg4ODg4Obm4ODg4eLi4tjYrNnY4uHg4ODg4+Pj4+Pm5uPj6Ojk6OTY2d3//////////wD////////h39/f4OLY2OHf/Pr6+vr+/vng4ODh4eHg4ODm5ubg4Obm5ubm5ubm5uDg4eLi2Nji4uHh4eDg4+bj4+Pj4+Pj5OTk5Njd2/////////8A///////a5t/f5uDh4N/9+v7++v7++/796ebg4ODg5ubm5ubj4+jj4+Pg4ODg5ubf3+bm4OHh4eHh4eHh4OPj4+Pj4+Pj4+Ph5OTk2N3/////////AP//////2Obm4ODg3/n6+v7+/f77/v7++vrp39/f39/f3+bj4+Pj6OTk4uLk4uTj4+Pj5ubm5ubg4ODg4OPg4eTi5OTj4+Pj4+Hk5OTZ2////////wD//////ODf39/f3/n6/v7++vr7/v7+/v7++unf39/f39/m5uPj4+Pj5OTk5OTk4+Po6Ojo4+bm5ubg4ODh4djZ2dnZ2OTk4+Pk5OPk2Nr///////8A/////93f39/f6fn9+v7+/v7+/v7+/v77+/7p39/f39/f5uDg4+Pj4+Dj4+Pj4+Pj4+jo4+Pk4+Pj4+Hi4tjZ2dnZ2dnZ2NjY5OTk4+TZ////////AP/////Y3+np6en9/fr+/v7++/7+/v7+/vv76d/f3+bm4ODh4eHi4eDj4eTk5OTj4+Pk4+Pg4eHj4+Dh4uLY2djZ2NjZ2dnZ2djY5OPj2N3//////wD////65unp6en8/fr+/v7++/v7+/j7+/v7+ebm4Obg2dnZ2djY2OLi2Nji4uHk4eHg4+bm5ubg4ODg4OHh4tjY2NjY2NnZ2dnZ2OTj4+Pa//////8A////2t/p6en8+v36/v76/vv4+Pj4+Pj76eDg5ubg4NjZ2OLi4uLi4uLi4uLh4eHh4OPm5ubm5ubm5ubm4ODh4eHh4eLY2NjZ2dni5Obj2f//////AP///9nf6fnp/v7+/vv+/vv39/f4+/7+/N/53+bm5uDm4ODh4eHh4eHg4eLi4eHh4ODg5ubm39/f5ubf39/m5ubm4ODg4eLi2NnY2OTj5uTa/////wD////Y3+np6fr7/vv7+/j31/f7+v39+vr9/fnf5ubm5ubm4ODg4ODg4ODh4uLh4ODg4ODm3/z83+bm39/f39/f39/f5uDh4eLi2OLi4ePj3f////8A////4t/p6d/6+/v4+/j49/f7/f39+v76+v386ebm5ubm5uDg4ODg4ODg4ODg4ODg4Obf+f39/fzp5ubf3+np6enf39/f5uDg4eHi5OHj49jc////AP///+Hm5t/f6en8/Pr6/fz9/f39+vr+/vr9/f3f5uDg4Obg4ODg4ODg4ODg5ubm5t/5/fz9/fz8/enm39/5/Pz539/p+d/m5uDg4OPj4+Hg3P///wD///ng4ODm39/p/P39/fz9/fr9/f7+/v7++v39/Ong4Obm5t/f39/m5ubm5ubm3+n9+vz8/Pz5/P3839/p/f36/fzp+fz53+bm5ubm5ubh+d3///8A///f4eDg5t/5/Pz8/f39/fr++v3+/v7+/v76/f396d/5/On5/Pz56fnp6d/m5t/8+vr6/f38+fz8/d/f6fr6+vr9/P39/fnf39/p+en54Pms3P//AP//5uLg3/n8/f39/P38/fr++/79/v7++/v+/v39+vr9/Pz8/Pz9/f38+fzp5ubp/fr9/f36/fz9/frp5un6+v76+v38/P39/Pn5/fz9/fz99dz//wD//+Di6fz8/P36+vr6+vv++/v+/f7+/vv+/v7++vr6/fz8/f36+vr6+vr++t/f6fr6/v76+v39/f36+d/5+v7++v38/Pz9+vr9/fz8+vr6/PX///8A///f4vn9+v39+vr6+v77+/v7+vr+/vv7/v7+/v7+/vr6+vr6/v77+/v7+/7p6fn6/v7+/v76+v76/f38/fr6+v39/f39/f39+vr9+vr7/v31////AP//rKz5/fr9/fr6+vr+/vv7+/r6/v77+/7+/v7++v7++vv++/v7+/v7+/v+/fz6+vr6+v76/vr6+vr69vb29vr9+v36+v7++vr++Pv7+/j+9f///wD//93h/P3++v36+vr6+vr++/b9+vb7+/v+/vr6+vr6+vr6/vv4+Pv7/v729vr0+v38/P38/P39/P36+vb29vr++vr6/v77+Pv++/f4+Pj49vX///8A///f9fn99vr9+vr6/fT6+vb0+u/29vv79vb6+vPz8/P9/f36+/Ly+vb6+vr09P38/Pz8/Pz9+vr6+v729vb++/77+v77+Pj4+Pf3+Pj48vT1////AP///vXs9PT09PT09PTz8/Pz+vPz8PD29vbz9PPz8/P29PP69PP29vT69PT0+v38/Pz8/Pz9/fr+/v7+/vb7+/v7+/77+Pj39/f3+PLy8vbs/////wD///f17Pz0/fT0+vPz8/Pz8/Pz8/Pz8/Pz8/Pz8O/v8PDw8PPz8/P09PPz8/38/Pn8/fz9/fr+/v7+/vv2+/j7+/j4+/j49/f39/Ly8vHw9f////8A///+9ez8/PT98/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Dw8PPw8PDw8PPz8/Pz8/r8/Pn8/f39+vr6/v7+/vv7+/L4+/v7+Pj4+Pf39/jx7vL29PX/////AP//9+r5+fz9/frz8/Dw8PDw8PPz8/Pz8/Pw8/Pw8PDw8PDw8PDw8PDw8PP9/Pz8/P39/fr6/v7+/vv7+/7y+Pv4+Pj4+Pj39/fy8fHx8PX//////wD////r+fn5/f36+vbw8PDv7+/w8PPz8/Pz8PDv8O/v7+/v7+/v7+/v8PD2/fz5/Pz8/f39/f7+/v77/v728vj7+/j4+Pf39/f37vHx8fPr//////8A////6vn8/P36+v779u/v8fHx7+/v8PDw8PDw7+/v7+/v7+/t7e3t7e3v9vr8/Pz8/fz6+v36/v7++/76+u7y+Pj4+Pf3+Pf39+7x8fPs9f//////AP////31/Pr6/v7++/v28e3t8e/v8PHx8e/w8O/v7+/x7+3v7e3t7e3t8fH6/fz9/f39/fr+/v7+/v7++vr78vL3+Pj4+Pj39/Lu8e/09f///////wD////39f36+/v++/v79vHt8e/x8/39+v3x8fHv7+/w7+/v8fHt7e3t7e3x9vr6/fz6+v77+Pv7+/7+/v7+8e7y8vLy8vLy9/Lu8fHz9Ov///////8A/////+r++/b3+Pv4+/bx8e7x+vn9/fr9/fbx7fHx7+/v7/Hx7e3t7e3t7vHx+/77+/v4+Pj4+/v79vHx7vLu7vLy8vLy8u7u7fHz8+z1////////AP/////q+vvx8vj4+Pv77vHx9v39+v36+vr9+vHx8fHx7/bz7+/t7u7u7e3u8vLy9/f39/Ly8vLy7u7y7u7u7vH2/vLy7u7u7fHw8/T1/////////wD/////9/ny+/b6+/Ly7u7u8fHx9vH29vr69v399u7u7fHv7+/v8e7y7u7u7u7u8vHx8e7u7u7t7e7t7u7u8u7x+/by8u7u8e/z8/P06/////////8A///////q9vD28/rx7vHt7vLu7u7u7vH29vb29vbv7+3u7u7u8fb28e7u7u7t8fHx8fHt7fHu7u7x7e3t7fHx7u728fHx7/Dz8/Pz9f//////////AP//////+/X08/D28e7u8e3t7+/v8fH29vHt7u7u7u7t8fHx7fHv8PDv8e3t7e3t7u3t7u7u7u3t7e3u7e3t7e3x7+/v7/Dw8PDz9Ov//////////wD////////q7Oz08/Px8fHv8e3x7+/v7fHx7e3t7e7u7u3t8fHx8fHt7e3t7e3t7fHu7u3t7e3t7e7u7u7u7e3x7+/v7+/w8PPz9Oz8//////////8A////////+/Xs9PTz8/Pz8/Pw7+/v8e3t7e3t7e3t8fHv7+/x8fHx8e3t7e3t7fHx7u3t7e7u7u7u7u3t7fHv7+/v7/Dw8PPz8/Tr////////////AP/////////q7PT08/Pz8/Pz8/Pz8/Pv7/Ht7e3t7e3v9vDx7/Hx8fHx7e3t7e3t7u7u7e3t7e3t7e3v7/Dw8PDw8O/w8PDz8/T1/////////////wD/////////9/X09PPz8PDz8/Pz8/Pz8/Pw8PDv7e3t7e7t7fHv7/Ht7fHv8e3t7e3t7e3t7e3v7+/v7+/v8PDw7+/v8PPz8/Ts6/////////////8A///////////r7PT08/Pw8/Pz8/Pw8PDz8/Pz8O/w7/Hx8e3t7u3t7e3v7+/v7+/x7+3t7e3v7+/v7/Dw7/Dw8PDw8PDz8/T06v//////////////AP///////////+rs9PPz8/Pw8PPz8/Dv7/Dz8/Pz8/Pw8PDw8O/v7+/v7+/v7/Dw8PDw8O/w7+/w8O/v8O/w8/Pz8PDw8/P09f///////////////wD/////////////6uz08/Pw8PPz9vPz8/P27+/w8/Pz8/Dz8PPz8/Dw8O/w7+/w8PDw8PDw8O/v7+/v7+/v7/Dw8PDz8/P07Pn///////////////8A///////////////r7PTz9PPz8/Pz8/Pz8/bx8e/w8PDz8PDz8PDz8/Dz8/Pw8O/v8PDv8PDv7+/v7+/w7+/w8PDw8/P07Ov/////////////////AP//////////////9+r19PPz8/Dw8PDw8PDz8+/v7/Dv7/Dw7+/w8PDw8PDw8PDw8PDw8PDv7+/v7+/v7+/w8PDw8PPz9Or//////////////////wD////////////////39fXs9PTz8/Dw8PDw8+/w8PDv7/Dv7+/v7+/v7+/v7+/w8PDw8PDw8O/v7+/w8PDw8PDz8/Pz9Or///////////////////8A//////////////////f19ez08/Pz8PDv7/Dw8PDw8PDz8PDw8O/v7+/v8O/v7/Dw7+/v7+/v7+/v8O/v8PDz8PP07Or/////////////////////AP//////////////////1/nq7Oz09PPz8PDw7+/v8PDv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7/Dw8PPz8PP07Ov//////////////////////wD/////////////////////+ers9PT08/Pw8/Pz8/Dw8PDw7+/v7+/v7+/v8O/v7/Dv7+/w8O/v7+/v8PPw8/P09er///////////////////////8A///////////////////////+9fXs9PTz8/Pz8/Pz8/Dw8/Pw8PDw7/Dw8PDv7+/w8O/w8O/w8O/v8PDw8/Ts6t//////////////////////////AP////////////////////////j86uz09PPz8PPz8O/w8O/w7+/v8PPw8PDw8O/v8PDw8PDw8PDw8PP09PT16+b//////////////////////////wD///////////////////////////ns9fT09PTz8/Pz8/Pw8PDw8PDv7+/w8PDw8PDw8PDw8PDz8/P09Ozq6eH///////////////////////////8A////////////////////////////+/nq7PT08/P08/Pz8/Dw8/Dz8PDw8/Pz8PDw8PDw8/Pz8/P07Orp6f//////////////////////////////AP/////////////////////////////4+/nq9ez09PTz9PPz8/Pw8PDw8PDz8/Dz8PDz8/Dz8/Ts9fXp/////////////////////////////////wD////////////////////////////////4+/ns6vXs9PT09PTz8/Pz8/Pz8/Pz8/Pz8/T09Oz16+D///////////////////////////////////8A//////////////////////////////////////787Or19ezs7PT09PT09PT09PT09Ozs6urf3///////////////////////////////////////AP////////////////////////////////////////j+/Pb7/PX19fX19fX19fX16urq6f37/////////////////////////////////////////wD/////////////////////////////////////////////+vr78vj4+/v7+/v9/Pnp/Pr///////////////////////////////////////////8A//////////////////////////////////////////////////X19fX19azd3Nz/////////////////////////////////////////////////AP////////////////////////////////////////////////////f39+np+fn8//////////////////////////////////////////////////1fE+3PNdRKAAAAAElFTkSuQmCC");
tail j=7075 line= kw_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAABRCAMAAAB2ZgEHAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD+/v79/f38/Pz7+/v6+vr5+fn4+Pj39/f29vb19fX09PTz8/P8+/z5+vl/f379/fz6+vn39/b29vX19fT09PN0c3P6+fn49/f29fX5+fny8vLw8PDv7+/t7e3p6enj4+Pc3NzU1NTAwMC1tbWoqKiVlZWQkJAAAABtqN+JAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGk5JREFUeNoBQxq85QD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////7+/v7+/v7+/v7+/v////////////////////////////////////////////////8A/////////////////////////////////////////v79/f1WVlZWVlZWVlZWVlb9/f7+/////////////////////////////////////////wD///////////////////////////////////7+/VZWVvxW/Pz8/Pz8/Pz8/Pz8VvxWVlZW/f7/////////////////////////////////////AP/////////////////////////////////9/VZW/Pz8/Pz7/Pv7+/v7+/v7/Pv8/Pz8/PxWVlb9/v////////////////////////////////8A///////////////////////////////9Vlb8/Pz8+/v7+/v7+vor+iv6+vr6+/v7+/v8/Pz8VlZW/f7//////////////////////////////wD////////////////////////////9Vlb8/Pz7+/v7+/r49fX19fX19fT09fX19iv6+/r7+/v7/PxWVv3/////////////////////////////AP/////////////////////////9Vlb8/Pz7+/v6+iv28/Lj4+Pj4uLi4uLj4+Py9PX4K/r6+/v7/Pz8Vlb9//////////////////////////8A/////////////////////////Vb8/Pz7+/r6+isr9ePi4uHh4eHg4ODg4OHh4eHi4vL1+Cv6+vr7+/z8/FZW/////////////////////////wD//////////////////////1ZW/Pz7+/r6+isrK/fi4eDg39/f39/f39/f39/f4ODg4eHy9vgr+vr6+/v8/FZW/f//////////////////////AP////////////////////1W/Pz7+/v6+isr+fn49/Lg3t7e3d3d3d3d3d3d3d7e3t7e3+Dy9vkrK/r6+vv7/PxW/f////////////////////8A///////////////////9Vvz8+/v6+isr+fn4+Pj39vX19fX19PT09PT09PT09fX09PPy8vP2+Pn5Kyv6+vv7/PxW/f///////////////////wD//////////////////Vb8/Pv7+isr+fn4+Pf39/b29vX19fX09PT08/T09PT09fX19fb29vf3+Pj5+Ssr+vr7/PxWVv//////////////////AP////////////////1W/Pz7+vorK/n5+Pj39/b29fX19PPy8vLy4+Pj4/Ly8vLy8/T09fX29vf3+Pj4+Ssr+vr7+/xWVv////////////////8A///////////////9Vvz8+/r6Kyv5+Pj39/b29fT08vLy4+Li4eHh4eHh4eHi4uLj8vLz9PT19vb39/j4+fkr+vr7+/xW/f3//////////////wD//////////////1b8/Pv6+iv5+fj49/b29fTz8vLj4uHh4ODe3t/f39/e3t/g4OHh4uPy8vP09fb29/j4+fkr+vr7+/xW/eb/////////////AP////////////9W/Pz7+vor+fn49/f29vX08vLi4eDg3t/e3t3d3d3d3d3d3d7e397g4eHi8vL09fX29/f4+Pkr+vr7/PxW/f////////////8A////////////Vvz8+/r6K/n5+Pf39vX08/Lj4d/e3t7d3dzc3Nvb29vb29vc3Nzd3d7f39/h4/Lz9fX29vf4+fkr+vr7/PxWVub//////////wD//////////1ZW/Pv6+isr+Pj39vb19PLj4uHf3t3d3Nzb29vb29ra2trb29vb29vc3N3e3t/h4uPy9PX29/f4+Pkr+vr7/PxWVv//////////AP//////////Vvz7+/or+fn49/b29fTy4+Hg397d3Nvb29ra2tra2tra2tra2tra29vb3Nzd3t/g4ePy9PX29vf4+fkr+vv7/Fb97f////////8A/////////1b8/Pv6Kyv5+Pf39vXz8uLh397d3Nvb29ra2tra2tnZ2dnZ2dra2tra2trb29zc3d7f4ePy9PX29/f4+Ssr+vv7/FZW/////////wD/////////Vvz7+vor+fj39/b18/Li4N/e3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dra2trb29vc3d7f4OLy9PX29/j4+Ssr+vv8/P3t////////AP///////1b8+/v6K/n4+Pf29fTy4uDf3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3d3f4OPz9fb29/j4Kyv6+/v8Vlb///////8A/////////Pz7+isr+fj39vX08uLg393c29va2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3uDg4vL09fb39/j5Kyv6+/z8Vu3//////wD//////1b8+/v6K/n49/b29fLj4N/d3Nvb2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3eDi8vP19vb3+Pj5K/r6+/z8Vv//////AP//////Vvz7+isr+Pj39vXz4+Hf3dzb29ra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dna2tvb3Nzd3t/i8/X29/f3+PkrK/r7+/xW5v////8A///////8+/v6K/n49/b19PLi397c3Nva2trZ2dnZ2dnZ2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra29vc3N3e3+Hi8/X29/f4+fkrK/r7/Pz8/////wD/////Vvz7+isr+Pj39vXy4+De3dzb2tra2dnZ2dnZ2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2trb29zc3N3f4OHy9Pb29/j4+fkr+vr7/Fb/////AP/////8/Pv6K/n49/b19PLh393c29va2tnZ2dnZ2djY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2trb3Nzc3d7f4ePy9Pb39/j4+Ssr+vv7/P////8A//////z7+/or+fj39vXy4uDe3dzb2trZ2dnZ2dnY2NjY2NjYAAAAAAAAAADY2dnZ2dnZ2trb29zd3+Dg4eHg4uP09vb39/j4+Ssr+vv8/v///wD///9W/Pv6Kyv4+Pf29fLh393c29va2tnZ2dnZ2NjY2NjY2ADc3Nzb29zc3N3Y2dnZ2dra2tvb3d3f4ODg4uPy9PX29vb3+Pj5+Sv6+vv7////AP///1b8+/or+fj39vXz4+De3dzb2trZ2dnZ2djY2NjY2NgA3N7p39/f3+Dq39zY2dna2tra3Nvd3d/f4ODh4/Lz9PX29vf39/j5+Sv6+vv///8A/////Pz7+iv5+Pf29fLi4N7c29va2tnZ2dnZ2NjY2NjYANvg3uPs7Ozs4/Lf4dzZ2dra29rb3Nze3t/g4eLj8vL09PX19vf3+Pj5+Sv6+////wD////8+/srK/n49/b08uHf3dzb2trZ2dnZ2djY2NjY2ADb6eDh8t3d3d3d8uPr4dza2trb3Nvd3N3e3t/f4OHi8vL09fX29vf3+Pj5K/r7+v//AP////z7+isr+Pj29fTy4d/d3Nva2tnZ2dnZ2NjY2NjY293f4OLd2dnZ2dne4uLi39zb3Nvd3Nzd3d3d3t7f4OHj8vP09fX29vf4+fkr+vv6//8A/////Pv7Kyv49/b18+Pg3t3c29ra2dnZ2djY2NjY2Nje3uDh3NnZ2dnZ2dne4uLg39zd3N7e3t3e3t3e3t/g4OHi8vP09fb29vf4+Sv6+vv//wD////8+/or+fj39/Xz4+De3dvb2tnZ2dnZ2NjY2NjY2N3p8NzZ2dnZ2dnZ2drf4+zh3t3e3t/e3t7e3d3d3d7f4OHj8vP09fb29/j5Kyv6+///AP////z7+isr+Pf29fPi4N7c29va2dnZ2dnY2NjY2NgA3N3e2dnZ2dnZ2dnZ2dvf4+Lf3t/g39/f3t7d3t7e3d7f4OHj8vT19vf3+Pkr+vr7//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2djY2NjY2Nve3+/Z2dnZ2dnZ2dnZ2dzi4uDe397f4N7e3t3d3d3e3d7f4OLj8vT29/j4+Sv6+/v//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2NjY2NjY297f3tnZ2dnZ2dnZ2dnZ3PLy4uDh3+Lg39/e3d3c3N3d3d3f4OLy9Pb39/j5K/r7/P//AP////z7+iv5+Pf29fLi4N7c29ra2dnZ2dnY2NjY2NjY29zd2tnZ2dnZ2dnZ2drc8vLy4+Dh4OHf4N7d3Nzc3N3d3d3f4fL09vf4+Csr+vv8//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2dnY2NjY2Njc3d3b2dnZ2dnZ2dna2tzy8vLi4eHg4N/f3t3c3Nvc3Nzd3eDi8vT19/j5Kyv7+/z//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2djY2NjZ2dzd3d3b2dnZ2dnZ2dra4PTz8uDh4eDf3t7d3dzc29vc3Nzd4OLy9fb39/kr+vr8/P//AP////z7+iv5+Pf29fPi4N7d29va2dnZ2dnZ2dnZ2dnZ29vl3dzb2dnZ2dna2uDy9PLz4eHg39/e3dzd3dzb29zc3N7g4vL19vf4+Sv6+/z///8A/////Pv6K/n49/b19OPg3t3c29ra2dnZ2dnZ2dna2drZ3N3o7tzb2dnZ2eTg8vPz8uLg4N/e3d3c3Nzc3Nzb3N3c3uHy8/T29/j5K/r7/P///wD////8+/r6+fj49vXz4+He3dzb2trZ2dnZ2dna2tra2trb293d3d7c6N3e6fLy9PLi4eHf3t3b3Nzc3Nzd3d3c3d7e4fLz9fb3+Pkr+vv7////AP////z7+ysr+Pj39fTy4d/d3Nva2tnZ2dnZ2dra2trb29vb3N3d39/p6uLi8/Pz4+Lg393b29vc29zc3N3e3d3e3t/j8vT19/f4+fr6+vz///8A////Vvz6+iv5+Pf29PLh397c29va2tna2dra2tra29vb3Nzb3N7f39/g4ezy8uPi4eDd29va3Nzc3Nzd3d3e3t7f4OPy9PX3+Pgr+iv7/P///wD//////Pv6K/n49/b18uLh3t3c29ra2tna2tra2tvb293d3Nvd3t7f4ODh4eLi4+Hg39va2tvb3Nzc3N3d3t/f4ODh4/P19vf4+Sv6+vv/////AP/////8+/or+fj39vXz4+Hf3dzb2tvc29vb2tvb29vd3d3c3N3e3t7f3+Di4uLh4N/c2dna2tvb3Nzd3d7e3t/g4OPy9PX29/j5Kyv6+/////8A//////77+isr+Pj39vTy4d/e3Nvb29vc3Nzc3Nvb3N3d3d3c3t/g4eDi4uLi4d7f3NnZ2dra2tvc3d3e3t/g4ODi4/P09vf4+fn5K/v8/////wD/////Vvv7+iv5+Pf29fPj4N7d3Nzc3Nzc3Nzc3Nzd3d3d397f4eHh4+Li4eDf4tzn2tra2dra29zd3t7f3+Dh4ePy9PX29/j5+Sv6+///////AP/////t/Pv6K/n49/b29PLh4N7e3dzd3Nzc3N3c3d3e3t/f3+Dh4uLj4uPg397Z2dra2tva2tvc3N3e3t/g4eHi8vP19vf4+Pkr+vv8//////8A//////9W+/orK/j49/b18+Ph397d3d3d3d3d3d7d3t7e3+Dg4eHj4+Pi4d/f2tnZ2tra29vb3Nzd3t7f3+Hi4/L09Pb29/j4+Sv6+/z//////wD//////4H7+/or+fj39vX08uPh397f397e3t3e3t7e3t7f4ODg4uLi4uHf39vZ2dnZ2tvb29vc3N3e3t/h4ePy8/X19/f4+Csr+vv8////////AP///////1b7+isr+Pj39vX08uLh3+Df39/f39/f39/f39/g4eHi4eLg4Nzb2tna2dra2tvb3Nzd3d7f4OHj8vT09fb3+Pj5K/r7+/z///////8A////////7fv7+iv5+Pf39vX08uLh4ODg4ODg4N/g4ODg4OHg4eLh4eDc3Nrb2dra2tvb29zc3d7e3+Dh4/Lz9fX39/j4+Sv6+vv8/////////wD/////////Vvv6Kyv5+Pf29fTz8uPi4uHh4eHg4OHg4eDg4eHi4uDg4Nza2tra2tva29zd3N3e3t/g4uLy8/X29vf4+Pkr+vr7/Fb/////////AP/////////t/fv6K/n4+Pf29fTz8vLj4+Pi4uLi4uHh4eHg4eHh4N/e29va2tvb29vc3N3e39/g4eHj8vT19vb3+PgrKyv6+/z8//////////8A//////////9W+/r6K/n49/f29fT08/Ly8vLy8uPj4uLi4eLi4eDg3dzb2trb3Nzc3N3e3t/f4OLi4/L09fb29/j4+Sv6+vv8/Fb//////////wD//////////+ZW+/orK/n49/f29fX09PPz8/Pz8/Ly4+Pj4+Hh4N3c3Nvb29vc3d3e3t/f3+Di4/Lz9PX29/f4+CsrK/r7/PxW////////////AP////////////9W+/or+fn49/f29vX19PT09fT09PPz8vLj4uHg3Nzc3Nzd3d7e3+Df4eHi4/Ly9PT19vb3+Pn5K/r6+/v8Vv////////////8A/////////////+b7+vor+fj49/f39vb19vX29fX19fTz8vLj4t7e3d7e3t7e3uDh4eLi4/Ly8/T19vb3+Pj5+Sv6+vv8/Fb//////////////wD///////////////37+vorK/n4+Pf39/b39vb29vb19fT08vLg4N/f3+Dg4OHh4uLj8vLy9PT19fb29/j4+Ssr+vr7/PxW/f//////////////AP/////////////////7+vorK/n4+Pj49/f39/f39vb29fX08+Ph4eHh4eLi4/Ly8vP09PX19vb39/j4+fkrK/r6+/z8Vlb///////////////8A///////////////////7+vorKyv5+fj5+Pj4+Pf39vb29vXz8vLy8vLy8/Pz9PX19fX29vb39/f4+Pn5Kyv6+/v8/FZW/////////////////wD////////////////////7+/r6KysrK/n5+fn49/b19fX19PT08/Pz9PT09PT09fX19fX29/j4+Pn5Kyv6+vv7/PxW/f//////////////////AP/////////////////////8+/v7+vr6Kysr+fn39fTy4+Df39/e3d3e3t3d3d3d3t7e4PT3+Pn5Kyv6+vv7+/z8Vv3///////////////////8A///////////////////////9/Pv7+/r6+vorK/n39PLi4eHg39/f39/f39/f39/f4ODh4vcrKyv6+vr7+/z8Vlb//////////////////////wD/////////////////////////Vvz8/Pv7+/r6+iv49fPj4uHh4eHg4ODg4OHh4eHi4uP1+Sv6+vr7+/z8/Fb9////////////////////////AP///////////////////////////Vb8/Pz7+/v6+vor+PX08uPj4+Li4uLi4+Pj4/L09iv6+vv7+/z8/Fb9/f////////////////////////8A//////////////////////////////1WVvz8/Pv7+/r6+iv29fX19fX19fX19fX19/r7+/v7+/z8/FZW/f///////////////////////////wD///////////////////////////////79Vlb8/Pz8+/v7+/v7+vorKysrK/r6+/v7+/v7/Pz8VlZW/f//////////////////////////////AP/////////////////////////////////+/f1WVvz8/Pz8+/v7+/z7+/z7+/v7/Pz8/Pz8VlZW/f////////////////////////////////8A//////////////////////////////////////79VlZWVvxW/Pz8/Pz8/Pz8/Pz8/PxWVlb9/v7//////////////////////////////////wD//////////////////////////////////////////v5W/VZWVlZWVlZWVlZW/f39/v7+////////////////////////////////////////AP////////////////////////////////////////////////7+/v7+/f7+/v7+/v7///////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////8kfX8xueSoCAAAAAElFTkSuQmCC");
tail j=7076 line= ki_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
tail j=7077 line= kob_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAACgxJREFUeNrcm0tvJNd1gL9zz62q7iJnTIG0ARGhIujh1SiGgcSL/BID3vtHGd4GQXbZee+FFwaMIDA3yUgDWQtrQcXSZMiu1z33eHGrujlKwhnZmO6eNIaD6nqxPp73ObfE+X/xkb+CI3+R06MJ52/fVg771x+5Jr9+cv0JREMnkY/fNo6bX/+dNw7QADCCdBJzPiTKd+b4zG213gBCPe8aAUQ2EnL46O3guPk1/zjW425HvXAUkpjDB8fPccPXKwAXHKTsdAFHcEA6qsOQfAeOr/xF5bIDgE27Q9kwf+ki/uERc9w8//d/wEFk89L+8vj39gnBPz5ajpsX0YFQTNwBJALTab4nk/mm0T4+Uo7/9FU9EjZbq0BPO6AZmnCX8wnk5VCHC4H9eq7weqd9unpcT6HvRIgxRgj/oh3AAHl98ih2lQq4A2sEsj89Qnk8WzOGjeAIkQS6HsqRZijBkF/+9HsDjiBsBCDywbFxPFOkEyCSYiJij7rd0RkkvHg8gamJbAQX9mokr6NXz6q+76XoUyTGlw4226zxn1OVs5gGOTlxcZI+PSqOT1Mn1ctPr3fNFmILwt00b1Tx5AT3pJ8dkV59nkkvi4BEzAL/BPz8Fz+HDIFf/GyFAcEUcap0e3ore8u3Xs3xbH50IC5bv3/SOl6bWBDrKisB8bb1OU0R1KsE3OpHR8LxVIGEw/WT60/w6ydc/8R9jtzg29uI+O47gQog9R8eBcengQTeui9xfM52pfz4EhaXw/MN1bQE/Oc/PAo7D2lyX69idnfP2b0eQST0XSe4ZxBBJAglCtZe1wpiiuITnOzHacVXaFVu3euBgWauln7zpIUNUrLdklS1W1lBDQoGGFSAHoFe5aereoBmFNlcA3zitLDh+sn1T+bkkA3QbmA9k2BqFAZI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");
tail j=7078 line= kow_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAB8VJREFUeNrsm02OG8cZhp+3mjIEy6OmBvEiNxCQVVPxWcZDnSC7nCBn8C4nCAe6Spx0bwMoeyNQMCaRSHIsdr1ZVFV3z4QzGi3Cpg1T0A+bGqAefv9ffZ/Mz+KlE+GYHkM/VQ5juJw8uEKfSDM7h/ElbNabybP1Zg1cST8djsglGwAPJ5HT+defgjIvR0wQzpJpuqYr9qFPI5mTI1EYwLEvaibQV10SilhzFU6bY6Awzbe9d0UugjqoetEhEA8kmY0jXm6yo2r487XxhAOxrKoXHcltrXl1shwXbAoFf3lj3w4g4tkiFJIHiGQejni5yRpFi/3hOk4jYbJznS+qFYXkYyCzcCSMTAG2b4R0YWxUBbGiexDIHBwZI1E423r+rdFEECKT6GNGMgNHvNzgIgxnFBvYAXVSKsovlEVyP8jxOUaMTGEi7EZLF6hGGmlWCeSKcEIcFwmjTQi2zc7GRJQCoRBSjVRgCsg/fn0yHCNGEkZkaxPlqZ3LQWhJKEJZJRu529iPzXEDw7Z3MZrB3ofoIUEItQJCShIRa765QyLhyBgk23B6xe02RtvR0UXJSO+jHeN22+cnbYPNht9zEhxsDE2bxRF3MWOkF5AIE4tjjLuYP2kbMFxdn4JeXWywG9pE4W0iGBP3SVWbjF0h1CGZ+4ruHu97bHnYjBgx5i8fijiGf2Xzif02JtSWxrC5QyCL44rD0LT52Nvo6Emie6PYFUYGh7hbljdgXR4WyFHlsQE3+SuPI4Z9uH9ibKlYP1kgXM/NcYGB1jbE3YhxZyPIuU7MOVgLNpvfnYB9uEkHPIAx8VkFRAhiv805MCSf9d3M/qo3btocOHpHRld1u/oYPBaSgp6FlKGs6CSoZpXHxSAO4i4WPzV4sUOdxfRRcmrJRLBZzyuPHg/i+D4mrfKBo2uS94oSRELKs+iEqnn97nDcuC0hYvr8ef70b5oEwiCEvXuGZbldNZ1ytTUTx8VmUCtuWHTB+HvpXn3QtBmHQ6iDcq3YrjD9Ym5/1WI77qbiGDDCWbVYVIunYeGhtB18bvoJm7Y56KiPx7G5kZvcjn3PXy/48ezs7Kx6zKNF7jbIcjISj+lK28ycl5gm/50D9EQcz18/fV/Vb9KRHr8jAsGyZSxtlzFAAhPw4dHMdu6DSQi8Du+kN3uAfy7eq8KysIoO7WqTIDR//aHMsrsZtQEqST/uAfiwB1WSFAK52+64HS2EQ/4qHFUe7RAdbuVVfrL8kDvu7Ht9EQIh30nZMdrejS6umT2/WjHpu02t3P++7gem/f69JGVpSHJycsWFdbNztKMq+aZ5hGeTDldvBDElG7aVOxKehpUZ66j7Xt9P3yzZolhFDT1Thxi40Tidt669I/Xq+4ntClhWDlFo0MLofDuyOon6/JAPKw3dG4+sSYjxEA7zJdVpykMCwniURRBxbDkMjkHC0B1wu3NwKCezhUECx8co5I8/OyfV5WCPfaDJD1cnwTFcb4yFX9QPT84TyOefnct879SKyyQCLe+rlY7qrzoj45sKntq59tu3CvrirR49RXFrRTtm5ySn71uHS8aj5yXNCoTq/7HUYsOVzhb/kbzDMfZxuMGVUInvHfPax1ruBnXS2EYoFawtePfOn9tbmxhJWaGwVBItsaLRrHr1qldp4Cr0wsMkiSCkFqIEb98h29HDoImGzgkIupn7JVMtSucPuZ1DKNmwbUG0+5jbEMqtq1Dr7izxqBwBWCFJNYPCKGjwxAqVqgDu3feTVpyCyPc5okUzx8GvUZeOrJAOVdQmhUEFUYFjXPRPpFELQVKd//fqoFodk+OPY+irFVJHZ+zv5AtaZPt9/y+YGLdQnblX3eFBpiNynK+zYiEF5VtAJZVJUpEgmv0Q6cvdbViGj8xhHdPOf1MUC9UhSCHdNA0lYqqX2JsbsTIUaYgXq06HuonH5fjDy8HSQ63kqxTyEVMSGN3vXXxUNg1CHcpEQHeXVI56P3j9NDXcsZ17o2NpZMl4T1TUePmcmZO/WnXcIY7jxo/zl8AqabqWIYRxYiHJwzCE8VAsKYsuY6xPQB5cL6ObNl9hmh1jL84C2302DRUzD3UOli+gk6jmt3M4v4RulQKCguq6Xi6XyT6CSElViixJBkEDhug6iTWnwME3L5U0q5xV0rJeSkGG3uXKI3myoOUyFE8FEutXp2DnABd/8jAkk3LFVIfvbO/HuOiAVJONZJj4uXME6+gc331pmjbfk+WOOml4aV8qi+Rmbw8u3SONWebI4jBEVobB0/TV9dAOEarJjVEpT8TdP6N4/Lw9LETHSuXbzn8EVQohKITwbLlchlApKChIA8Z9h51lXnRvGmizOPJoRhzGZCaNiDxomYZ4T2s+EWCfL3VaJnMxlPZtGeAVPHjwdaZ56j4du4GWGB13fWlWldnw8KtKheJE53cp7do0atHGPm5vXVQJ6cvfMoxTf3TCfb59g4uybUDz1364UR/7jeeL1TCo//GNgxn3P/LGQSZx3E046hC+GhYnrh7gVWfdx5msgNB8Oz1JqEpH6IGLLPPuFdm3FosAutFrrXngOs7se172sOiVTqPhGvATKE5if9C+5PbmXd7xevgS4Wnsc5qvryZ7kFd3XjudOAdFsYZe+qfupuqXPeFfOP4f1cDPA4P/DgAwWJQLXj/G2gAAAABJRU5ErkJggg==");
tail j=7079 line= kib_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrC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");
tail j=7080 line= kiw_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
tail j=7081 line= koeye_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
tail j=7082 line= koeyew_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
tail j=7083 line= koeyeb_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrC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");
tail j=7084 line= kop1_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA7JJREFUeNrs2b9vG2Ucx/H39/zjHjvJ1aQJhlCI6khZUZYwds0IGZhYCl3ToQKBxYYUZHWAISsSHVnIf8AAIxM/guQmSFFU1NYiOGrOPt8P3z0Mjt2UpK7DQO7Q851Oz9c6+aXP8zz3+Cyai1aPmC8+CcqAD4UwmbZOtxMAi/+45OKO+CAcXiqAUEAgLi5yKQQA8hf7ePcBoJaBAwAdIZIjzmmdLHUuDXHBPJrA8gBAVIgAbSG5RL9+UOuAhQPpdzRZmD4AiEBjAUIshaT6sNZWCVS4zJrU0RwkEaGtwWoQgKWEP3LXOu3KZTMmdDRZPoBIW4igdSKSm7cRgrZS7QpcOmMyR3Phrwhtyc/Am/HOmorlvXuam1vOYypAMgsZcDSXf9fk5Kd12F5PNu98cE+DuFceMZuQDsZEG+XynuR3lmor7PN29+GH1m961b2ZU48qlQRI0sCYKI89kdo+wHXv/a9X+RH39rvvdPrDx+I8mXDsWlLbhyp9KPc1q9/d/iY+YgZ3cIM5MuHYzdX2oap8AN0Ni3J85Ycb398Y9tPBeKFj99f1fa7mFRzjeOU4Km+vXG/Ptof9q2TCcT8v1cEhtowHlI+Lw3XRz/fz/bQwXnBOvL+zUoXQ8cADKAN5jkb9a2lhjM9j75eVqvIVHmBDAGWOR0ffVDnGPT+OZaWqUF5sf+m6DRo2eI8d76SmpqbSwxjrmLGqCmK7cVifB7mFbduO5ziD47nnvZQexrh5pfEUnt2oA4dz/PnVrWeavEY2HN+uKWKEAMCdOxx8+xOG6FQxxs2rNUXckCCAQqczE8wAMiiQdKUxJo9ua9GzJYACLaocwXTnZEZp0SyQEYdOPFuCAi0UPkAxLIbFk6XBq2TEEeY8WxJaavCWalRFQKeP8TxHGBWQpKXYYGs06A8lr5ARx2efxkLyhA3YAnqUeqURpZhCxvmOyNqsB221AXdPD5cGjjfIiKNT2qwH7Y/grvJRvhqtkBLwMmTEEeQ360GhpXrqmWEfoJRSxllHYBMKQeEJPQXh6X3KZ5G01pnfH/183OBOJ1Q99VQBYRE/vYpz8og9XJFQ0eNpHkXSrfhnHl1Cz3FFgN5oOoGfcsTpPLp9cKfwHFeQEEUPUL5K9ao45Yg+5+O8tf0WMIWH4yJCCAp6Kd6fzjiaiw9Ilrzzeg7ZqX/x/6BxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxTFDW/4PB3wMA+/KA0gruu+gAAAAASUVORK5CYII=");
tail j=7085 line= kop2_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABARJREFUeNrs2b9vm0Ucx/H397nH9pPYjZ2koSnUzQ+IitRWRN0y8T+whAEhho6VqFRERqSqEnIFgoEFESSGLDDwH8DarVClQ7o4Vt02bUOaOLWb+LHv+TI8sZNKQXRB9aE7T36e8yO/9Lk73/csyv+iiXd4h3d4h3d4h3c43wJ8Hj4Pn4d3eId3eId3eId3eId3eId3+DrK5+Ed3uEd3uEd3uEd3uEdA+m4pzBhjrtVdMkRTua2Sw+LewCSvoQAgdY2kFd72qlxpRY2EEEECRBa6U1RGHbAcjg/qjNA56mICIHQQvqdlHz3tDvzfC9ifTq2DZFAaAlE6fV9QIkmXalrh7p71KDwgyYKfQZRFEUi7c3Hzqy7HTqPp5s5rDSPBpJGgubtpBsONkt0c82cFZqtdH5E+9H+wSSBvOaKTjhY/CnsRDeWrHwCFQRUDgyQB6yedsIBiytJ5saSleYVKkev5w88g7kIH7MvWVz58qOTOZImV6iQp9VTgEJC8qYj+6vFlb2/Tn29lNB86XLaM2EgIcfuEzdL8dCezVmBZu/79xCg6OBBjj0XnehG60OmbRQKBeRET5EEoAry0JF9+5Ptc7WpOM5h091JA0Ya0htdCskZR+qPtXNobEOwwO5IajkyUQYN8k/n7WeTXyVruhUMMNKg0QA0baAqdUfqwbUMsxoTf7sEPBujwuWXl66k7EIevNuhJtls9lq7ssVYZWuJQqFQPJrIfSccnJ3u1ITAmGvL7a3Ly22MMTvjSl8S7LhxzrAmdy8pZ8IYu1OyGDDZOOApoOnHhk46kAdf6IXbMvNAgsCUdp4bgG5A5i1VRQHVFy6MK36e0gu3a2fJEDCuxgAhmbrVE72hxc62E+dXL+6Hd+aDMkbjbJcwxmZe/HZpNL3ZDYFupuiAg/Z6mJiAsllnhgen9HG0P7w98Tvv93uYURccXP90M1mdD5jGUi/bjrJw/mZ3dPONw5+SMRccrGGU1XkCyvXR4ofLC9zi2effn+hvU2QwIP96vrv7yCTC6jxBEiQy+XyYhVtc/i6nw7vpA9DxwV6v0jbyi30n0Av2z9sk/LEx8Y05LwvLUZDthiMhoCpbLuQBrM1VBYusAhf17gftOPfxj8o+2zPsAqJh0QUHa8xVkV4xophkrn3zag4rzezB8Bp3wUGrzlwVBEvfAsx2uF/Kdkd2Xz/kVf/H2a8xRxWQtLQCUVFDMlXXUvD6E3n1/6NadTiwHIRijUWCOxfPPNIxCAvGCQfQehKTYmarqcYirL535yIBoyUwbjgAdgtyr//mbaCapqPBLAC1KeqUzfpsv1Nj47A4GxwHNAO+umpMFmqw8lmOKswB1gCsQxkwh899vnG0zPyPHH8PAM6XwR7zuxV1AAAAAElFTkSuQmCC");
tail j=7086 line= kop3_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/xJREFUeNrs2c9vG0UUwPHv2x3ba+IoKXXqCsVKFaQSCVqJU/8Fjpw5tCoSHHqKUPghlCMCCYnABd+olFvpgb+CSw9VL1wqIMk2UkPiTXBqQ3azOzMc1kmhpGlSiXoXzZzWI+9oPnrz3ozHYvlfNHEO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53CO/6Sp0sy0f1RnfQXa67O/lsDRl54RAAseNSRlbKCwAD++3Zj6gk+hVfB1FcUWz3iAAYtHTUjHBgpbhTMlyY/oT/EAsnzRGKxXQ1KLmgKkJPnRjT0fMoAsn6cFJB0LFJBVypHn3djzckTeMgV4NenwCUJmaqWoV929fEX9Y572XFQHFJmhVoa62981gsFDDdeVAjDnaCUxi9pgg3+94xWxRhksYAyglFIK4IMFooTOojb2alCG/TyKwTxZjxZgOZqMO4s741e/L8W5ZEOR5NvFkGLFygLL+MkSi599fDSjcI4NRVJLwHjmsO/DZcDf7cyP92tPYRTN8Wg/n0/yuKsJRK0krgZqUDsiw4uY5w/3yQSgdlhZm0SR30riTqBs1wtKcW5/KFDJ922osweTbLYgIa4G6sHM/bmnvlqkeGwNS5SIiEhMvU6PVpIk8VI1UHIco0jx2AoGh7U2Pz3lqyjuMB8o+eGN2UoZHJv6iU3jYNad+QAlhp/nyvC79ve9w8fGoAF8A9ygwzyBQsL2sYzC5MdO6is1PEkNIAhgnvfSKvNBQyFh+st0Ge4ZfpO/LakmZMT5c6AACY0kx4ajKPGogR22qanuMMmDQRCoSETCu1lyoQT3PrsasWIPIjLZZRKIzmf0poDw7iXTmC6+o/9H9eBxYndivY3XD1BRk0wJIe3QZK9WKL5j93GpYmK/uq1RtbOARULahCZrNp81RgHyY5t63iYmHjWr7++81WyeodfrhfIgpB2umNbtZzIKEI9tdXCdUNXj73zZ5Ap33r1l1gHaoVYmZY7iO3ra1z5Aff/rj67dvMIdorMv2fX2eptQq9RP504yzKgdvRzhV+k2jQW5/t3Sog1nIESr1NP2RIwRO/pa+0AdI9duIte/rQaV1Uz8e2/eu6xSD8lOyBhtnvc0PtQ3u1YPXtdfqVv9rbU1LejLckm0Lzo9KWOk8egB9T2/oj6/8fIKgBFQkOIhZFjmTjzWCB09wK+otfMbghEFkIKXH95Ppxiho4/2dQO75lujSPM/B/KTSYaFUylG5rgPrcZKJfONh6CHggy4sHpqw4t3rJICnmSA0hUgzT+g0uFXXpPnGvnF1iutPd/385lOz+wbs2/19E8++PbixdnZV25PT+8938h/DQAMRqY09QFaLwAAAABJRU5ErkJggg==");
tail j=7087 line= kop4_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/tJREFUeNrs2b1vHEUYwOHfzO5yu3c+nz/OCXEIkWMjuYA4pVuQoKCipKLgS8hSRGkKKwVCikxEYSG5cERFgcSfEDoqd7GRkSLZYCw5duy7893lvtbZnZ0Ud2efFIGdAnyDZqrd2ZV2nn3fmXm1KzT/Qnv095emgBj80x5F3d8bLV2H0EsWv2SQt1aZ3Xi5J4r/2DG1NUWM1wZsO4BCTsQubHVvGS+Nh25a9IPjHE1BJbvtsH7ztxmUhPZAJkFvAanXPDMcqBrKUdmd8X20QMlEghZdzSYwbYQDVVPg8KyiXy1oknaOAZ3YTLL5EpILdAAlIFen+uynuZE/gLYGBVIDk+eXXKyDigLIiVJrKFqeR8WHOqFjkWgmN88JkRfKYMgBqNZGrhaS36Mo+Gzo9WtX1hXr6xsbItHiT6kefW1APDq5BTgD8UEw1oDMhytLC9trt2CNGYW8sfnzHRMcXQjkYvERPzC7SnnwSAPotRmUSCZSJjgoCdDZ+kAdmX36xb0RZln95L5ygYJemyFJpo1wcKSczlLsFCaOP733/iqZUgo0goJem9HXfCMcHKnT41/fPvIkOvdK9HSwxKigoLVW00Y4KpF7elIee3Br3I3wj0mFfl1A4eHNsyD94eBINE5me5VBvFToEQFeTATFh2/qaRMcsAvdEjeLB9qDIuQj/zgC8eAMSN84Cs86wxHDZT2iwSMBWcwT+cdPyJ8BkX3CYCwtEAIhqCDLVD1YpFy6nySe0tfR7zlvVE2IB+zK09QCRiivwOduvDIvI5+6OIymjXDwWLZHJIbLAKzMgRcBy/My8utF/Q+QfnLwWJ4EpLMOe5EHRGRl5Nd/+cDp//kBcFULwHVdt83wPBQueF7trhMOvNswI6+APQkuPbv7ABTzxBBlld/Qg4Y42PdAOQoI/dAPAQJa5ImjrHT+umGKg33ZVvR0BUAGWlnpKM+E+QFwRSsIQyDoNrjNxw2C2l21e2xKPOCJIOxEgWa6CWm4DXyfaS3P7/14xxQHxUZX0ds7D98ORcsLtZwReQXkM34ANJvtAUopJZJFCNxg7pts1ZR4QHgQNF94yQlpMvESC62Ua4gDDkSzXaV0OzQkaTIxSyzsXHpBIvuTweVLQZL01o1CIJsUQyC6fNhsxGbEA+CgxWkJrIEkTct34tHI3xnFyZjigGLS7MmYBNItHyfWejiC0oQxDqDY0MhEQgKkaeE7xBqt0eSy5jiAStwIaO+HtPBxYjS6/eNn9Z2U/o6vjHCceHpP/E4dmd6GscKESQ4jvpdYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3V0mvx/MHg+AP4/vJxNJjIqAAAAAElFTkSuQmCC");
tail j=7088 line= kop12_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABqpJREFUeNrs209MHNcdwPHvb3aX2Rl2vdiw65iNsaGyFCmJipAacU2q5t5TLlZkiUo9xdwsEalVVVd1zaESOfVQoirqpZHaa2/u1afILhywYhvbsCCz2Ga9uzO7O8z79bB/WGLjQKuWmYp3QDBvBumj937z3pv3fqIctdQJ+GLWtlKwmi8P60DpUn+1V6K4/8r/osjRHVrd6P0+DqyFAqAWxVKxVHQ5jnJEx8MWMB6WOg9DiLD0QwOaGMLleBBHdKwAY3sEgFCwDBOPJp673jEqjuJYaRsECLsSTWAK2xNN9WCE4yyHdbQVnY7UFgA/2OVxUb1s9bgZh3SsMFZCegYS4ajt41K30ScjcOyMwzlWxkpCiCwB7+vyx7bvXv5SSbBmiITicI6VsY0QWWIKvpm6eP3qz79UECsVEnpEg3Eox7cGWZoygKVnmoNM356+lW2lEtXOvxg+fgbWYQY+WU5NmnyeMyNzyR9Pc9t7t76e8msigkgkGIdoj/tmacpQQAGnpUzf+uy349+OCO0n5QyxcNw3KUNeyuTZGTUvlFNrmv/Hh73nosH4Xsf9u5PkkUyQMlgBZkO++ai//jSxcNxbniyAS8B2AQMpPBR2uvVjxMJxb3myUM67hMaikgUrZTaGdnrhr5FhvPl9dW/5J1ImEwamWikPNLEINkddEQEB6U4Wo94e3vpbkiHANKktMrswa1ez1pbd7LXH2/FwrBoZJzBNd6vA1uLcVgZavcomRIjxJseqKWQC/IU5oJxna3GmfX2gBQNAnng4/vpxJjDzc9QBvHwZ6N08EDHGmxzVTOAvzNWBTNkBPADX63CKxMNR1Wzgu3XIwPZIGRz8dngDGjXGwY4HE82mW8+wnYNKb8Do9q1RYuJo2M2mK2zn6DH6WiNyjIPGwcpGc96VIMhx5enTRqd0vy5I9BgHtMevLw+7SMAV5nXfXWlAzxETR5C8Pldv5K4wz/4ulW6k4S1i4tjJXZ+rN2Zh3vFxfAf6XlUXISaO3cT1uXomYMvZd9kH0IgyXnXsJqm41DPBU3H6BnAE8C9AXBwP3zbzXPWlIQ79dRJlxWscGphnItJA2GsPIdqK7zqquJt2S1y/6+iGRrQR/Y6qsiOITUsQoYEAju/EAQFI+Bs+N/VbHwCMbtq0EEHoDN6RfT+94liR4W0uNV5X5xKf8m/sD544ThwnjhPHieM/cdxT/g+GD5JnXTGVWx+gArJvOBdQ0umhWPWrg6ZXPmCb0RjFh67maU93hf3TXXx0YDQ+cb77JF8e7y0/9q0+8Bk4F2VH//erZNFhFTJ/dDQNfm85qKrqOK3Hm7F57zZJPBl/+eryXFTAR+1z8XDgWyQSL916JmCrHSAqKnufS9Kn7ej3K8D51IThqRuDtQrXrvm+Dw3Ex/d9QJXG841YOPiL82m4+4sbg+kKXAPfx/c7baGQTou1EYd+BfDJVzf3f94V7d6VBsUU4+Hgk69uXh6dn5MAuHKzezXdSAMokYS8dp7oW/r67Q9t/9Bi5OOjHe2JtYe27WltJFWBXA+h0g4TKcfDwbOwULUdb7BWS6dSKUZUVdNoZzxRba3Hw3H2nZLUUo73xSC1GiM1HMfxVFW1O1VZj0N8ALutv/dvn7c3nffuHaBxPh7rwRV7/3EGbsz0KSBikIPXtSt253jJwkyBGzOLzNJ3vqQJZiwWjp2B9YSMm9A0F2ZrLDIzDNUcvfM+KoOn4+BgRZYnhQuEmGq2id20ra1Cgk26JwIYPBPx9xUAF/S9O5p/7CVSVrbasrGhmNjwNKfaOQ5Qi057JH51YFVq6PnZf2YLBEnLOC8zooiQ0PROtnuSDOO50e9XsHs/eXdqmL7joqmXmgz77tC0GwMHwYPk3vFdXPNCJbumy3y4BxmOfHwAqa/PW8Edq7yVz+sLrTM46P5o6Jcf/bS8TWd0l2dxaA9YIaEsTRny5XyY/NniNLfxPvuD3VlbCehIHBxUNhNG6KQbXKw0B5m+jdefbhAJyPfmG+S+Ds9b+l5w545l8bcXhd/vvivTbph8mchm3fakazsO7cGB6Tgzf1q7QLtRXDcOjlfTo8w5+3ezLvVGTjvdKxb5UTQeddLVQr6TrpZottPV4pGvBq2HB6QPjj9upw/GJH8QGo/opXN2szlBLMOExXGncx5tX62xsS+9FoFQwLr7PnrpuXucW1hH3h+snKqVen+MA2tGhU66M8VSchhAyhO9m7wnvV/fiY4D6nvp5/DnqwMl4BLQnvs+aB98l8xeaK32PfzfkvxrALevHeCpERZIAAAAAElFTkSuQmCC");
tail j=7089 line= kop23_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAoJyglIyYrKi0uLTAhICQaGh0wMDM/P0Cdoo6IjHywtaJaXkxqblx0eGd+gnGnq5iSlYdMTz4nKhY5PCpAQzFFRztRU0ZdXlcfIRAwMiEJCQZiYl7V1dS+vr0XFg8zMSl4d3OBgHxvbmsjIR06OTlTUlJJSEgAAAA68G0oAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9SmnbfAAAfU0lEQVT///////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A2PfY2PH79vb29vb29vb29vb29vb29vbw9vb2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vb29vb29vb29vb29vb29vb29vb2+9jx2PfY+wD7gfr5/fys6enp6e7u4+Pv5OTl5ubh4eHo6Ojg4ODo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9uXh6Ojg4ODo6Ojo4eHm5uXk5O/j4+7u6enp6az8/fn6gdn7AP///////////u3t7enu4+Pv5OXl5uHh6Ojg4ODg4Ofn5+Dg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l4eDg4ODn5+fg4ODg6Ojh4ebl5eTv4+7u6e3t7f////////////8A//////////////////7+7uPv5OXm5uHo4ODg5+fn5+fn5+fn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Xo4ODn5+fn5+fn5+fn4ODg6OHm5uXk8+Pu/v7+/v///////////////wD//////////////////////e/v5OXm4ejo4ODn5+fi4uLi4uLn5+fn4P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn5+Li4uLi4uLn5+fn4Ojo4ebl8/P9/f3+/vn/////////////////AP/////////////////////+/fOBgfjm4ejg5+fi4uLi4uLi4uLi4uLn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn4uLi4uLi4uLi4uLi5+fg6OHm+PqB8/3+/vny//////////////////8A//////////////////////n//4H6+vn54ejg5+fn4uLi4uLi4uLi5+fn5+fg/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bo4ODn5+fn4uLi4uLi4uLi5+fn4Ojo+fn6gYH9/fny/////////////////////wD////////////////////////5/YH6+Pno6ODn5+fn5+fn5+fn4ufn5+Dg4ODg6P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Lh6ODg4ODn5+fn5+fn5+fn5+fn5+Dg6Oj5+PqB/fny////////////////////////AP/////////////////////////4/YH6+OFWVlbg5+Dn4Ofn5+fg4ODg4ODg6Ojo6P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l5ujo6ODg4ODg4ODn5+fn5+fg4ODgVlbo4fj6gf34//////////////////////////8A///////////////////////////6/YH6+PnoVlZW4ODg4ODg4ODg4ODg4Ojo6Ojh4eH/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eHh4eHo6Ojo4ODg4ODg4ODg4ODg4FZWVuH4+oH9+P///////////////////////////wD///////////////////////////+B/YGB+Pno6FZWVujo6Ojg4Ojg6Ojo6Ojh4eHm4eb//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Tm5uHh4eHo6Ojo6ODo4Ojg6OjoVlZWVuj5+vrz/YH/////////////////////////////AP////////////////////////////+B/vOB+vnh6OjoVujo6Ojo6Ojo6Ojh4eHh4eHm5ub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////k5ubm4eHh4eHo6Ojo6Ojo6Ojo6FboVujh+fqB8/6B//////////////////////////////8A///////////////////////////////z/e/z+vn54ejo6Ojh4eHh4eHh4eHh4eHm5ubm5eX/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5OXl5ubm5uHh4eHh4eHh4eHh4ejo6Oj5+fn68+/98////////////////////////////////wD////////////////////////////////8/e/z+vj5+fnh6Ojh4eHh4ebh5uHm5ubm5eXl5eX//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pl5eXl5ebm5ubh5uHm4eHh4eHo6OHh+fn4+vPv/fz/////////////////////////////////AP////////////////////////////////7f/e/z+vj4+fn5+eH55vnm5vjm5ubm5ubl5eTl5OT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j5OTk5eXl5ubm5ubm+Obm5vn5+eH5+fn4+Prz7/3f/v////////////////////////////////8A///////////////////////////////////+/e/zgfr4+Pj5+ebm+Pj45eXl5eXl5eXl5eTk5OT/////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+Tk5OTl5eXl5eXl5eXl+Pj45ub5+Pn4+PqB8+/9/v7//////////////////////////////////wD//////////////////////////////////6z+/f3zgfr6+Pj4+Pjl5eXl5frk5OTk5OTk5OTj5OP//////////////////////////////////////////////////////////////////////////////////////////////////////////////+7k4+Tk5OTk5OTk5OX65eX65fjl+Pj4+Pr6ge/v/f6s9v//////////////////////////////////AP///////////////////////////////////Pz+/f3v84H6+vr65fr6+oHk5OTk5OTk5OTk5OTj4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////p4+Pj7+Tk5OTk5OTk5OTkgeT6+vrl+vr6gfPv/f3+/PzX//////////////////////////////////8A/////////////////////////////////////N/+/f3v8/P65Pr6geT65PPz8/Pv7+/v7+Pj4+Pj4+P/////////////////////////////////////////////////////////////////////////////////////////////////////////7ePu4+Pj4+Pv7+/v7/Pz8/Pk+oH6+vqB+vPz/f39/t/81////////////////////////////////////wD////////////////////////////////////229/+/f397/PzgeTkgfOB8+/v7/3j4+Pj4+Pj4+7u7u7//////////////////////////////////////////////////////////////////////////////////////////////////////+zu7u7j4+Pj4+Pj4+Pj7+/v84HzgeTk8/Pz7/39/f7f2/b4////////////////////////////////////AP/////////////////////////////////////arN/+/f79/e/v7/Pz8/Pz7/394+7u7u7u7u7u7u7p6en////////////////////////////////////////////////////////////////////////////////////////////////////r6enp7u7u7u7u7u7u7v394+/v8/Pz7+/v7/397v3+36za1/////////////////////////////////////8A///////////////////////////////////////YrN/+/v7u/e/v7+/v7/Pv7/397v7+6enp6enp6enp6f///////////////////////////////////////////////////////////////////////////////////////////////////+3p6enp6enp6enp6f7+7v3v7/Pv7+/v7+/97v7+/t+s2Nf//////////////////////////////////////wD////////////////////////////////////////Y3t/+/v7+7u/v/f3v7+/v/e7+7e3t7e3t7e3s7ezt7P////////////////////////////////////////////////////////////////////////////////////////////////Hs7O3s7ezt7e3t7e3t7f7u/f3v7+/j/e/v7v7+/v7frNjX////////////////////////////////////////AP/////////////////////////////////////////ZrPzf3+3+/f397u794/3z/vys3/zs/Ozs7Ozs7Ozs7P/////////////////////////////////////////////////////////////////////////////////////////////26+zs7Ozs7Ozs/Oz8/N+s/P7z7+P97u79/f3+39/f/KzZ1/////////////////////////////////////////8A///////////////////////////////////////////c3vzf39/+/f3+/v7++Ofi5+jb8ffr6+vr6+vr6+vr6/////////////////////////////////////////////////////////////////////////////////////////////Hr6+vr6+vr6+vr6/f39+Hi4uf4/v7p/v79/t/f/Pzb2df//////////////////////////////////////////wD////////////////////////////////////////////Z297839/f/v7t7e369fT0K+dW3/vY9/fx8fHx8fHx6//////////////////////////////////////////////////////////////////////////////////////////q6/Hx8fHx8ff38dj731bnK/T09frt7d/+/v7f3/ys29ny////////////////////////////////////////////AP//////////////////////////////////////////////2t7e/N/f39/f/P5W9Csr9PTnVvz29vHq6urq6urq6v//////////////////////////////////////////////////////////////////////////////////////6vHq6urq6urq6vbd/Fbn9PQrK/RW/vzf39/f/Pze3tr71/////////////////////////////////////////////8A///////////////////////////////////////////////d2NrerPz83/zf/P344vT0K/Qr51bz8vLw8PDw8PDq6v////////////////////////////////////////////////////////////////////////////////////Dq6vDw8PDw8PLy8+jnK/Qr9PTi+P38/N/f/Pze3trY3dfz/////////////////////////////////////////////wD//////////////////////////////////////////////9f23Nja296s/Pz8rPz9gfhW9fT09PXo4fLy9vDw8PDw6v/////////////////////////////////////////////////////////////////////////////////w6vDw8PDw9vLy4ej19PT09Vb4gf38rPz8/Kze29rY3PbXgf//////////////////////////////////////////////AP///////////////////////////////////////////////9f23dzZ2NrbrKysrNvY3v7v8/pW9fT0Vujb8tfw8PDw6v/////////////////////////////////////////////////////////////////////////////28Orw8PDw8tfb6Fb09PVW+vPv/qzY26ysrKzb2tnZ3N321/r///////////////////////////////////////////////8A/////////////////////////////////////////////////9fX9t3d3NnY2trb3t7b2tnc2v7v8/P6+vjh6Pby8PDw8PD/////////////////////////////////////////////////////////////////////////8PDw8PDw8vbh6Pj6+vPz7/7a2dna29ve29ra2Nzc3N321////////////////////////////////////////////////////wD////////////////////////////////////////////////////X1/bd3d3c3NnY2tra29vb2Nnc3Nzc/fr63OH28Nfw8PD///////////////////////////////////////////////////////////////////////Dw8PDy9vbh3Pr6/dzc3NzZ2Nvb29ra2tjZ3Nzd3d3219f/////////////////////////////////////////////////////AP//////////////////////////////////////////////////////19f23d3d3N3c3NnZ2Nra2tra29vY3Nzb+Nz76Pbw8PD/////////////////////////////////////////////////////////////////9vbw8PDw9uj72fjb3NzY29ra2tra2NjY2dzc3N3d3d3219f///////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////9fX19f23d3d3dzd3dzc3NnZ2dna2tvc3tv52fvw8PD29v////////////////////////////////////////////////////////////b29vDw8Pvc+dve3Nva2tnZ2dnc3Nzc3d3d3d3d9tfX19f//////////////////////////////////////////////////////////wD//////////////////////////////////////////////////////////////tfX19fX9t3d3d3d3d3d3NzZ2tre3tze29rY+93w9vb////////////////////////////////////////////////////////d9vbw+9ja3t7c3t7a2tnc3Nzd3d3d3d3d9tfX19fX/u//////////////////////////////////////////////////////////////AP///////////////////////////////////////////////////////////////////f7X19fX19fX19fy8vLy8tnY2trb29vY+9323fbd9v/////y8tfX19fX19fX19fX19fX19fX19fX19fX19fy1/Ly8vb29t323fvY29vb2trY2fLy8vLy19fX19fX19fX/v3z+Pn1//////////////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////////////19fj4gfPv7/39/f7+/oH49t3/////////////////9t3w3fbX19fX19fX19fX19fX19fX19fX19fX19fX19fy8vLy8vb//////////////932+IH+/v79/f3v7/OB+Pj19Sv09Cv//////////////////////////////////////////////////////////////62tvpqb3Y+CAAAAAElFTkSuQmCC");
tail j=7090 line= kop34_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABrFJREFUeNrs201vG8cZwPH/DHep5ctKZCwZUhPKTQzDApK2QHUu0PYDBPCtBZq0gFFAMNBLUl4iJAVSpEAt5VjCtwIuCjQ+xB8ih16kAkZTIC5qJ6LUWJYoS/KulxRndqaHJSXasiPaRc3dwnNaragVf5wZztvzCMv/oHzxDb97BcD6RzduUlt+Hwx0kEu/xuH7q8x//nT/UTxnR6LgawDXOKDBzgBs9F9y3nStlPk0OIYoN2G6dFs61khirAQBKMACnI9K2XAQYKSh9GVtkzinsYAk0aCwwFwmHAQYQOrd+OWtmDivAQwCpOhZ5rLgAPaBXCz17jjVrwzS2DxoMEIiQA0vGa2DfQBy/y6Wx5apY4q3LMIBNEZIgbJDQuRIGUxINMTT1btbv/qHlO5PKq986+xql9UbN/7uWh07+ZtffJiB+gD2tQMgBbvlkgXx1h+XF8X1C7CG6JLT9toHWXCwr3GS5mWdzsJV5ldpVccErNdYE9o43TOFLDjY7zi9qxbnfvrxFPOsvv0Xuw5QWxNadufS3j+STuLopIxXXtv+c/z2Nqv8aSesVmdnWZezN6QbZKI+4K44vPzsTdiUWO8UYJBNaqwZNZcJR9Dutywqe5X1lQuiY/ACfJBNqF3/bjyXBQd3XRzt6L7Gx3QAjw5qAmiufMfMZcFBMgPulZl9nw5IA+Ahh4CkxrGlodirjQD/3ksdmcy38ADZXPmensuCg3uyN28HoAhyqb4HFTAeyKY9qBWz4OBrdxAB8KDBJWjUyYNsrrw+lwlHAtFHP7uNS8lFo248pOWfc5lwsKeOFG6/ZoCIxrt48tM3zmfDwV77UNBT3K9ggKhRN55EZMTBtsZV7lGtVPYqbE9hICoZb2NWZMTBtnbRjgaUq1wFUCZkChOVjCdkVhzcSWpDDdwqAwUIS8brFlI8332ozChAKaDcL7DAz9uUH3zc9T7MSn3AHYHq1ULgB4APC8CVQtio5z/6ICsOWu2e4qG7dVg+FTUWD4qZaFfAZMEtQxAk709KKSWSJSjvFC99NBZlpT4g2CsHxz9l41MwyywqXc6IAzbHAgkcjXy252CZRY5LZDoZTFfzxgwwEAIZsH0f6HbGSp0wG/UBsNlFHlIsYPBD11HjHkgOvKw4oJULBlqMwSd0cVQldCcG21zqHUCrbZFGggF8QlwHNR65RGUYz44DCA7aZXoDYoiLo6iELkSAM2nVZd7LhOPQ87ibhdvw6pevZcmRif2SF44XjheOF44TivN/MXrcyoAjyO0ki5Gj0Xw8wo0A/nrhrLrMezCd8nbValtAGjk4u6qEbsRDs6t0949HZ7v4oYujHI7NdtPcPza7SImworf6kMYHHDWOB4+sPtLr2OySbOcmH7vAAqHrNKjnJQfH1rXpbFePX52HnIoo5VGachb2fYL1sQBjAGstFmuTD7s8BY28amt1fL8khY7WgzK+DyahYDEY826d0NBYVHr3YpUMOFptFYbgA5ikYOr1JQqnouXFXX2x9kkW5iUDu7sQgB/4BHWuUDDLvP/bdy5+kon51R3B4bFHvyxwhXAqbNS9JzLS5nj86Uc41Tv9iFX1CX+Yrv6x7eI4gOsOMMJCjyGazpMY6XJsa6VUMjS7bsF1XXeKQmEKYy6XjLchrJeJ9UfvtLYfLZOc1oLpn9bezEYcwBNOzyMa1I0nP33jjJcFx6PRDIfn6ENEM6TIcf/g6LoogSXgEg3qGO+k6JL0OO7JqPhotM/SL4eN9kmNY0tTjA7faBJFBhhpkugrE+tvjodLyfeuBxFRFEVRNDExASCNCUOMF0gpm0bp32Rg3+euS8cbiE7cxwWilwaiE7/tpd8RtJ3+oKEn94KVH1UjPAh8kMEutTUdn8RIxbo2Err/jfvZm61Xf/ygbb0kJE42YcWYePIkRhr6xw42KdXq3g9zxZ/9YGryNEEQ+HKjSc3M69PXJk98yOjb1c5hv8gb/7HR7cMks4zcsd8PP85Z5xccZRus1+hlGwyVySJHz8ABmcvt7uWuXkW8Hv9+2mtC7fpaM1bCDscYcX0ERjtAbuNsuHAV8dYfSqb4lcrbv8G8tkgxdF7RSB297CirGVuGuineEsbmAY3JIbKS55Vkq20WZ37H4m0kz56tNlLHPiC1T3dLYfMaSAJjEsRTZQ+O0BFgpCmhN63JaSP4r7I5R+YYyK4VuteOkm2Slzee2vD8Hf8ygJBCAW4sAJMTCsDt9l5yXjzTk5/v+CFyuZyTS97p6ZlYxrHVpz93wInPnavVzlybnVXP9uT/DADjuRVfTGbbYQAAAABJRU5ErkJggg== ");
tail j=7091 line= kop14_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABtVJREFUeNrs2c1vG8cZx/Hv7Ctt0qRkhrIpW9zENhADKVqgBqpTb7mkJ6MnB0gLFL4rgIFGEODm4AoVnAICqrvRoscCLfwH5NZehCJB7fogJ7VdipaoWJUorkSK+/r0sKREN3EiSpQSFPs7kTvk7Hz4zA5nSSUMmjY6d2+F5EHBr6fj+qX+5t16caNcffXbLwAYp/YPPC1rd38FAi7G/DQRP1pk8tFgg1KDO2L1+KUx1UVDQXR5uVwv18ungG1WXslYuQAG1Mv1yhMdhFiVgf13vCltU4Wnj9UhjwGceu8pkcIg1iKJLy8XLU4duKenZfzsE80g1ggRHVTSkNTyzebIsTmWegRRCESAQiktqvz7UgsGUQC74EO2OrGsxyIIoNPTlKvA1WNxLOHUQZQQIRqAIjKQiefORt6HwqDzcxcfsNziU6emCHUBiEF1a1OuDiA5qKOrIBINFERKB96IWDZLfr18CAZAE9AM1oMK+jMgEh0EYqWjBpIczLGEU0ci0VA6kYgeX2ka2MRf2PkwhkMyEghoxro9ouERFv4lKIUeCbEBqlw9IEQ7EMOxVsMg1h49fPgg8vUrY+dev2Ep9d5mbbThx+AXDsmgYOFD7I82apvvKWXdeH187MqDKHrw8OEjiaNw1dpdCoZVjyVnNdSU/ul1uH9dzU7//PcCatsbxfAB/BJHSNO3AKyQhn1GQP3ij3dvy/3rcP+HkcTGePVPHw7H8TTQjE+vU5uoTajgxVkmFyc/fv+eEAPgcyQGNH2s7txQLXl7cXKRzTFTqDHBMmFs+hdzQ5lXkWVUrtVq1Ca0d8N3Jlncfqv0B106vu/7/pEZFLCTnjodvVV6a3uRyXfCdzWgVqtUDCu68nwY9fhM0ys1cGjAmUCY/Pj9uxefOPhJs/8aR866Sgpi4dcvP5/+3duLKHMb14EqE/d/EJfPHNnxRKvUwBEU4DcCU22PWTv77UNggOvvP87BC4U5arFeQlSVCZ7F8dUjzqvP/lGpkXcEtrZkxcxdLP3NyLZGVS9DYWDS629Umeba38cv5nZXxNwSxKFWe+Of2tLR6vHYUg6wpcjjAvnmSKO3t1KipMhw4gYoUdLdYjG6VcCFnXEXGQGqn3xPrh7B8fjRNQe2Ci4ARkie5gjre+1jDC2b4f7jElsFFyM5km+OHADytY7PH15zRAkuGABhntXsXmswVMd/YjD71rDVHAaEQJ5mQVU/+X509ZDXx6665gjito2FVnOeeXDd8VY3YJpDZPCabpr0Om+tujmMeeZbLcNouwXEuaYc75AOy3AEt23YzZmxezftmxiG4eZyuRxAq9UaZZgpSqu7YOVyuZxhGNy0GRuz522jDeIY1rPDzasITXCN+RlgvQRzN/tvqOAiQ84LH3Kt/ef3bo51z3wrzKNiPr96GMeffyq052eS7ccGQOkF+4vV0BnQaO+tWKjSOqX14kYR0JibIq/+8pNTh3GIuMb8TAyKDc52Kb1iJLfmw85ztXdHCFCETYqiBG3uVphXfU0Hdki14hp2jALWzm8UNzi72UWIkuNhJBDVo5zdhCKsnQdB88L8sqMGdkTKNexYwZqNB2AGZmB2i8E4x5Tn3TtmCMzADABsPM4jmhfmRR/UsXPaNWxhzQa8l3YQIMfHgJVk9vTfPNnAKCgvzLdzg627d7LtBVvWGjZTYHcDEASgjpHBBVHJWfZOa8MUP2usib3Qzt4ZqB53bs8yrRpMwQLQIdPJkFTGDMwyx5oVjaBbBTqZTqaTgSlgYVThnZ798OCOQJ+diVVjCj7qP5xJJBWOOathl9HpP/oB/PacNnc7sA/q8MzZmfiLX8JHtmd7fVdIBjjH8WdVaXuIZNQe8AEL3ishX+HwjdmZWDXo7L8+MLuWzEkwYLthd/YMex8vGUZFm7sdeme++Tr3sWZnUN0SBEkIwLZtnJNhcKYSZxJG0EtXpWDWyPrb3+gw4x3m4o01u2Mny8beJt0773BiKZ+z8PqX3yDA7rC2Ec/Qxsz9r+RL8yp2aSkV2HSwe/2YgHeCiG7q/v4QkjFk8EzJcxoUgfVqh7DVyrWUIrA7/dPzW0AkF7ze6R8FZDwTkcJWduSljVifQxoQmi1yLYUKsJP1wgaPbwnRW4SlNw7I4GEKkt3JEhhwdt8R/GZGDLn/Y8CkRa6FUiRXVefE1qevz24jtOn0vr9MRMjukCUA/npdhWruxiW15FQpn/7Sb8G+xWB/y5yE5yt/MnpSrjvVy4f4f/A7mdSROlJH6kgdqSN1pI7UkTpSR+pIHakjdaSO1JE6UkfqSB2pI3WkjtSROlJH6kgdqSN1pI7vWrT/Dwb/HQCWcg5gw1gsvgAAAABJRU5ErkJggg== ");
tail j=7092 line= btn_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAACT1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgID///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAABAgID///+AAAD/AP+lmdfcAAAAwHRSTlM8ODQwLCgkIBwYFBAMCAQAQERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+PxTzsGTAAAAAWJLR0TEFAwb4QAAARNJREFUeJxjOEwLwHD4ABzY29naWFtZWpibmZoYGxka6Ovp6mhraWqoq6mqKCspKsjLycpIS0lKiIuJiggLCQowMDIxs7CysXNwcnHz8PLxw8GoqaOmjpo6auqoqaOm0szUg3BQX1dbU11VWVFeVlpSXFRYkJ+Xm5OdlZmRnpaakpyUmBAfFxsTHRUZER4WGhIcFBjg7+fr4+3l6eHu5uri7OToAAejpo6aOmrqqKmjpo6aSjNTD8HB/n179+zetXPH9m1bt2zetHHD+nVr16xetXLF8mVLlyxetHDB/Hlz58yeNXPG9GlTp0yeNHFCf19vT3dXZ0d7W2tLc1NjAxyMmjpq6qipo6aOmjpqKs1MpQUAAIrvy8PKBZ9nAAAAAElFTkSuQmCC");
tail j=7093 line= btn_n_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0CRzonygAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6SgsCoMgp1Q3Iv75/UqMBh2QXplGAK7Ib0SDIXfIL0iDIM9kF4BhsNeSC8PI+B3SC8HI2EfpJeFUbAf0svAaDgA6V/AGPgD0kvDWDgI6aVgHByC9JLwLRyG9BLwHRyB9AL4Ho5CejX4AY5BenUYD8chvQZMgBOQXhMmwp+QXgsmwUlI/xImwylIrw1T4C9IrwNT4TSk14VpcAbS68GPcBbS68N0OAfpDWAGnIf0hjATLkB6I/gJLkJ6Y5gFlyC9CcyGy5DeFObAFUhvBnPhKqQ3h3lwDdJbwHz4G9JbwgK4DumtYCHcgPTWsAhuQnobWAy3IL0tLIHbkN4OfoY7kN4elsJdSO8Ay+AfSO8Iy+FfSO8EK+AepHeGX+A+pH8FK+E/SP8aVsEDSO8Cq+EhpHeFX+ERpHeDNfAY0rvDWvgf0nvAOngC6d/AengK6T1hAzyD9F6wEZ5Dem/YBC8gvQ9shpeQ3he2wCtI7wdb4TWk94dt8AbSB8B2eAvpA2EHvIP09/ABPkJxL+6f14vkEzs8y8O5aXg1AAAAAElFTkSuQmCC");
tail j=7094 line= btn_s_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0Us+6SmwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6Sg8D18gI9Q3Iv75/WBsAPeQfoA2A5vIb0/bIM3kN4PtsJrSO8LW+AVpPeBzfAS0nvDJngB6b1gIzyH9J6wAZ5B+jewHp5Ceg9YB08gvTushf8hvRusgceQ3hV+hUeQ3gVWw0NI/xpWwQNI/wpWwn+Q3hl+gfuQ3glWwD1I7wjL4V9I7wDL4B9Ibw9L4S6kt4Of4Q6kt4UlcBvS28BiuAXprWER3IT0VrAQbkB6S1gA1yG9BcyHvyG9OcyDa5DeDObCVUhvCnPgCqQ3gdlwGdIbwyy4BOmN4Ce4COkNYSZcgPQGMAPOQ3p9mA7nIL0e/AhnIb0uTIMzkF4HpsJpSK8NU+AvSP8SJsMpSK8Fk+AkpNeEifAnpNeACXAC0qvDeDgO6dXgBzgG6QXwPRyF9BLwHRyB9JLwLRyG9FIwDg5BemkYCwch/QsYA39AehkYDQcgvSyMgv2QXg5Gwj5ILw8j4HdIrwDDYS+kV4RhsAfSK8FQ+A3SK8MQ2A3pVWAw7IL0qjAIdkJxL+6f14vkE2w6y8NwNQP6AAAAAElFTkSuQmCC");
tail j=7095 line= btn_e_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwh/EZn+QAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8Bw+AAc2NvZ2lhbWVqYm5maGBsZGujr6epoa2lqqKupqigrKSrIy8nKSEtJSoiLiYoICwkKMDAyMbOwsrFzcHJx8/Dy8cPBqKmjpo6aOmrqqKmjptLM1INwUF9XW1NdVVlRXlZaUlxUWJCfl5uTnZWZkZ6WmpKclJgQHxcbEx0VGREeFhoSHBQY4O/n6+Pt5enh7ubq4uzk6AAHo6aOmjpq6qipo6aOmkozUw/Bwf59e/fs3rVzx/ZtW7ds3rRxw/p1a9esXrVyxfJlS5csXrRwwfx5c+fMnjVzxvRpU6dMnjRxQn9fb093V2dHe1trS3NTYwMcjJo6auqoqaOmjpo6airNTKUFAACK78vDr8GZlgAAAABJRU5ErkJggg==");
tail j=7096 line= btn_w_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwV3fKTTAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8BwmB8O+Hh5uLk4OdjZWFmYmRgZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTS1tHV09fQNDI2MTUzNzC0sraxtbO3sD8DBqKmjpo6aOmrqqKmjptLMVAc4cHRydnF1c/fw9PL28fXzDwgMCg4JDQuPiIyKjomNi09ITEpOSU1Lz8jMys7JzcsvKCwqLiktK6+orKquqa2rPwgHo6aOmjpq6qipo6aOmkozUxvgoLGpuaW1rb2js6u7p7evf8LESZOnTJ02fcbMWbPnzJ03f8HCRYuXLF22fMXKVavXrF23fsPGTZu3bN22fcfOXbv37N23/xAcjJo6auqoqaOmjpo6airNTKUFAACeeMvDg3itZwAAAABJRU5ErkJggg==");
tail j=7097 line= dragon_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV0AAAH+CAMAAAAI3i3FAAAAB3RJTUUH4wIIEhsKtTHtmQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFsCIdvScaqS0xtiwvyQ4SxCUgwDEbwjAu1QkO0hQR0B4S0hwezi0U1i0U0ioh0ist3gAI3ggI5wAI4wER3gwM5BUI4goU4xIX4SIL5ykI3ikQ5C4N3hwY4i0U5CQZ4Sco8wAE9wAI7wgI7xAI9wgI9xAI/wAA/wAI/wgI/xAI7wAQ7wgQ7wAY7wgY7xAQ7xAc7xgI9xgI/xgI7yEI7ykI9yUI7zUI9zkI7xwQ/yEI/y0I/zkI7xwY8SsQ7yMi6zEku0MezkUY2j8W2U8VxWEd0WQa3l4U2GwZ6jwQ60YQ6VIK7EoV61oI61QU614Q52wU9z0M+UQK904M/0oI/1II91IQ91oI/1oI814Q92MI92MQ/2MI72sI82cQ8XEQ/28InUY3mE5OsUktsUlCmGJJk2dXsGY0rGlKxUgsx0tA40oo3k0/yWQ7xnVE5Ggy330+jWtommpklntnkntzjH5+l358kIiKlJCStGlitH1rrYx6q5CP1Gdh035u0ZFr046KnJyUpZyUnJycoJygpaWcnKWlpZylpaWlrZ6OuZ2KraCcu6SUrZylramlt56evamcpaWtpa2traWttaWltampra2tra21rbW1uampva2lubWpu6+xtbW1tbW9tb29vbe3yqCE0KSG2qN52aSGxqSYz6GW26SP3LCUzKWj1qKi2qae46efyrKn0bao4bOi376jxq21xrW1vb29vcHGzre11rm1yMC9zsa53rKv27215bax67u42sex2sq96cay6867xr3GxsbGxsbOxs7OzsbGzsbOzs7Gzs7O1sbG1srK3sbGzs7W09DT1tbO1tbW1tbe3sbO3tDI4s7K6c7I4tbS597O4djY597W887I79bO99bO79bW797G897O797W99bW1t7e3t7e3t7n4uLi5+Li797e7+fW7+fe5+fn7+fn7+/n5+fv5+/v7+fv7+/v7+/37/f3997W997e997n9+fW9+fe9+fn9+/n9+/v9/fv9/f39/f/9/////f3///3/////ZWRgQAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAINoSURBVHja7Jz/a9v2uscTyUJ2BbGPFOxfzOz8qq3rP1Daf8U6wgzhXywU23Isozbh3NyO02yjS7fRrP0lGXG7Xu7SpqTJLzdbIKkJGScJaYOhLCSm9j0Hc+BC8dW9Yff5SP4i+Vv8ra7p3QMdi2M70kuP3s+Xz6PPyO9/2Luzkfd9AB+0/UH3XdofdN+lDR1dLf8yq73vg+iXDRtd7Wzn1mL2fR9Fv2zY6BbTS7Kc/lCcd9joZlMyr6zmPhC8w0Y3owpOYXG78L6Poz82ZHS1A8Vpd8bnTz4M5x0uulr+UYihKe7GbuF/3vex9MOGi24+nfSxE24uuvX3D8J5h4tuNqVcmZhgApFnH0ZcGy66ENM+Abq8dO/DEN7hovsq6WSBLiZ+u9dl1qAV85nMq1fHmXzx/H2fzdDRVSiD7p0uczItn15Wk4qSVNcOi+/7bIaUbkD868/N6Z5rxUZ+ibz2+GBNVQSn0ynISzv59302w0Z3Q7DrdMMt6J4XzvYb+WV+/zF4bch35ROWZUj+1tYfdK2mbYSY1nTPi9mDjUdqKmPxXng1c7COvJZCn5+gHbiceHBSKBTz+SxYpmLwQz6fLxQHFDOHia6WXwu5/Iiu9NfGuntezKSQf4ZSRybvPS8cptSS18LHJxgCEyOx25t7hy9W11KppSUVWTIJ/1lKpZ6u7vztZWEweIeJbvFQ9dETOt3bjeiCi6ZTitPDME51q5wQw4vHGz+A27qR1yLHZYhAcDIaTcwtL6EAByZUDP0EmFPps4HgHSa6b5YVD+LDcI3pFg9TyZAPVJXiEw/2jGoOeTP47TVw2xJcO86FAW4kLgtO37UrYJcvfwLGwr/L6Mdr13whdXUgqjxEdLWDJKoldN/9ereO7vnbA3BcXZdJOXF3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");
tail j=7098 line= koeye_handhither_gif = url("data:/img/png;base64,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
tail j=7099 line=");
tail j=7100 line= koeye_handhi_gif = url("data:/img/png;base64,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
tail j=7101 line=");
tail j=7102 line=
tail j=7103 line= return(img);
tail j=7104 line= }
tail j=7105 line= </script id="script_load_b64btn" >
tail j=7106 line=
tail j=7107 line= <script id="script_pdflist_show">
tail j=7108 line= function script_pdflist_show() {
tail j=7109 line= var z = 0; var pdfout=""; var len=pdflist.length;
tail j=7110 line= var pdfid = ""; var pdfurl = "";
tail j=7111 line= img_pdfid="/imgs/links/tn/tn_dragons_koo.png";
tail j=7112 line= tn_pdfid="/imgs/links/tn/tn_dragons_oko.png";
tail j=7113 line= for( z=0; z< pdflist.length; z++ ) {
tail j=7114 line= pdfid = pdflist[z].split(" " )[10];
tail j=7115 line=// alert( 'BUGS_1000 script_pdflist_show z="+z+" pdfid="+pdfid+" pdflist="+pdflist[z] );
tail j=7116 line= pdfid_code = pdflist[z].replace('.json','' );
tail j=7117 line=// img_pdfid = pdflist[z].replace('.json','.jpg' );
tail j=7118 line=// tn_pdfid = pdflist[z].replace('.json','.png' );
tail j=7119 line=// pdfout += "<h1><b>pdflist_"+z+"</b><h1>";
tail j=7120 line= pdfurl = pdfid;
tail j=7121 line=
tail j=7122 line=// http://ka12/kb/pdf/pdf_20190126/kou_20190125_2400_Understand
tail j=7123 line=// pdfout += "<a href='./index_vu.html?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
tail j=7124 line=// pdfout += "<a href='?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
tail j=7125 line= pdfout += '<a href='+pdfurl+' class="popover" target=_blank>';
tail j=7126 line= pdfout += " <img name='img_" + pdfid + "' height=100 src='"+tn_pdfid+"' border=0 height=100 >\n";
tail j=7127 line= pdfout += " <span><img name='img_" + pdfid + "' height=100 src='"+img_pdfid+"' border=0 height=100 ></span>\n";
tail j=7128 line= pdfout += " </a>";
tail j=7129 line=// alert( "bugs_196 pdfid=" + pdfid + " tn_pdfid=" + tn_pdfid );
tail j=7130 line= }
tail j=7131 line=// document.write( "bugs_198 pdfout=" + pdfout );
tail j=7132 line=
tail j=7133 line=// alert( "BUGS432_show pdflist("+len+")="+pdflist[z] + " len="+pdflist.length );
tail j=7134 line=// document.getElementById('div_tllist').innerHTML += pdfout;
tail j=7135 line= var parent = document.getElementById('div_pdflist');
tail j=7136 line= parent.insertAdjacentHTML('beforeend', pdfout);
tail j=7137 line= }
tail j=7138 line= </script id="script_pdflist_show">
tail j=7139 line=
tail j=7140 line= <div id="div_pdflist">
tail j=7141 line= <h1>div_pdflist</h1>
tail j=7142 line= </div id="div_pdflist">
tail j=7143 line=
tail j=7144 line= <hr color=yellow>
tail j=7145 line=
tail j=7146 line=
tail j=7147 line=
tail j=7148 line=
tail j=7149 line=
tail j=7150 line= <a href=# class="popover" alt="script_bugs">
tail j=7151 line= <img height=150 src="/imgs/links/tn/tn_dragon_b2.png" onclick="script_bugs('5400')">
tail j=7152 line= <span><img height=150 src="/imgs/links/tn/tn_dragon_w1.png" onclick="script_bugs('5400')"></span>
tail j=7153 line= </a>
tail j=7154 line=
tail j=7155 line= <script id="script_kob" >
tail j=7156 line= function script_kob(kobid) {
tail j=7157 line= alert( "BUGS_kob_6500 script_kob="+kobid );
tail j=7158 line= }
tail j=7159 line= </script id="script_kob" >
tail j=7160 line=
tail j=7161 line= <script id="script_kow" >
tail j=7162 line= function script_kow(kowid) {
tail j=7163 line= alert( "BUGS_kow_6500 script_kow="+kowid );
tail j=7164 line= }
tail j=7165 line= </script id="script_kow" >
tail j=7166 line=
tail j=7167 line=
tail j=7168 line= <button onclick="script_ajax2php">ajax2php</button>
tail j=7169 line= <button onclick="script_sllist">sllist</button>
tail j=7170 line= <button onclick="script_pdflist">pdflist</button>
tail j=7171 line=
tail j=7172 line= <button id="btn_sllist" onclick="script_sllist()">-= slflist =-</button>
tail j=7173 line= <a href=# class="popover" alt="script_slist()">
tail j=7174 line= <img height=100 src="/imgs/links/tn/tn_dragons_oko.png" onclick="script_sllist();" >
tail j=7175 line= <span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_sllist();" ></span>
tail j=7176 line= </a>
tail j=7177 line=
tail j=7178 line=
tail j=7179 line= <button id="btn_pdflist" onclick="script_pdflist()">-= pdflist =-</button>
tail j=7180 line= <a href=# class="popover" alt="script_pdflist()">
tail j=7181 line= <img height=100 src="imgs/links/tn/tn_dragons_oko.png" onclick="script_pdflist();" >
tail j=7182 line= <span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_pdflist();" ></span>
tail j=7183 line= </a>
tail j=7184 line=
tail j=7185 line= <script id="script_pdflist">
tail j=7186 line= function script_pdflist() {
tail j=7187 line= script_pdflist_load();
tail j=7188 line= script_pdflist_show();
tail j=7189 line= }
tail j=7190 line= </script id="script_pdflist">
tail j=7191 line=
tail j=7192 line= <script id="script_sllist">
tail j=7193 line= function script_sllist() {
tail j=7194 line= script_sllist_load();
tail j=7195 line= script_sllist_show();
tail j=7196 line= }
tail j=7197 line= </script id="script_sllist">
tail j=7198 line=
tail j=7199 line=
tail j=7200 line= <a href="/?js=script_shutdown" class="popover" alt="script_shutdown">
tail j=7201 line= <img height=150 src="/imgs/links/tn/tn_dragon_w2.png" onclick="script_shutdown('5600')">
tail j=7202 line= <span><img height=150 src="/imgs/links/tn/tn_dragon_b1.png" onclick="script_shutdown('5600')"></span>
tail j=7203 line= </a>
tail j=7204 line=
tail j=7205 line=
tail j=7206 line= <br><br><br><br><br><br><br>
tail j=7207 line= <div id="txtName"><h1>txtName</h1>
tail j=7208 line= </div id="txtName">
tail j=7209 line=
tail j=7210 line=
tail j=7211 line= <script id="script_ajaxdb3">
tail j=7212 line=// exit function if nothing has been typed in the textbox
tail j=7213 line= function showName(str){
tail j=7214 line= if (str.length == 0){
tail j=7215 line= document.getElementById("txtName").innerHTML=""; //clear previous results
tail j=7216 line= return;
tail j=7217 line= }
tail j=7218 line=
tail j=7219 line=// code for IE7+, Firefox, Chrome, Opera, Safari
tail j=7220 line=// code for IE6, IE5
tail j=7221 line= if (window.XMLHttpRequest) {
tail j=7222 line= xmlhttp=new XMLHttpRequest();
tail j=7223 line= }
tail j=7224 line= else {
tail j=7225 line= xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
tail j=7226 line= }
tail j=7227 line= xmlhttp.onreadystatechange=function() {
tail j=7228 line= if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
tail j=7229 line= document.getElementById("txtName").innerHTML=xmlhttp.responseText;
tail j=7230 line= }
tail j=7231 line= }
tail j=7232 line=// xmlhttp.open("POST","idx.php?name="+str,true);
tail j=7233 line= xmlhttp.open("GET","ajaxdb_page.php?name="+str,true);
tail j=7234 line= xmlhttp.send();
tail j=7235 line= </script id="script_ajaxdb3">
tail j=7236 line=
tail j=7237 line=
tail j=7238 line= <br><br><br><br><br>
tail j=7239 line= <div id="div_kogrids_b"></div>
tail j=7240 line=
tail j=7241 line=
tail j=7242 line= <script id="script_gethint_ajax">
tail j=7243 line= function showHint(str) {
tail j=7244 line= if (str.length == 0) {
tail j=7245 line= document.getElementById("txtHint").innerHTML = "";
tail j=7246 line= return;
tail j=7247 line= }
tail j=7248 line= else {
tail j=7249 line= var xmlhttp = new XMLHttpRequest();
tail j=7250 line= xmlhttp.onreadystatechange = function() {
tail j=7251 line= if (this.readyState == 4 && this.status == 200) {
tail j=7252 line= document.getElementById("txtHint").innerHTML = this.responseText;
tail j=7253 line= }
tail j=7254 line= };
tail j=7255 line= xmlhttp.open("GET", "gethint.php?q=" + str, true);
tail j=7256 line= xmlhttp.send();
tail j=7257 line= }
tail j=7258 line= }
tail j=7259 line= </script id="script_gethint_ajax">
tail j=7260 line=
tail j=7261 line= <script id="script_ajaxjs" >
tail j=7262 line=
tail j=7263 line=
tail j=7264 line=function js_ajax() {
tail j=7265 line= $(document).ready(function(){
tail j=7266 line= $.ajax({
tail j=7267 line= url: 'idx.php',
tail j=7268 line= type: 'get',
tail j=7269 line= dataType: 'JSON',
tail j=7270 line= success: function(response){
tail j=7271 line= var len = response.length;
tail j=7272 line= for(var i=0; i<len; i++){
tail j=7273 line= var id = response[i].id;
tail j=7274 line= var username = response[i].username;
tail j=7275 line= var name = response[i].name;
tail j=7276 line= var email = response[i].email;
tail j=7277 line=
tail j=7278 line= var tr_str = "<tr>" +
tail j=7279 line= "<td align='center'>" + (i+1) + "</td>" +
tail j=7280 line= "<td align='center'>" + username + "</td>" +
tail j=7281 line= "<td align='center'>" + name + "</td>" +
tail j=7282 line= "<td align='center'>" + email + "</td>" +
tail j=7283 line= "</tr>";
tail j=7284 line= $("#userTable tbody").append(tr_str);
tail j=7285 line= }
tail j=7286 line=
tail j=7287 line= }
tail j=7288 line= });
tail j=7289 line= });
tail j=7290 line= return( $ajaxjs );
tail j=7291 line= }
tail j=7292 line=
tail j=7293 line= </script id="script_ajaxjs" >
tail j=7294 line=
tail j=7295 line=
tail j=7296 line= <h1>gethint_ajax</h1>
tail j=7297 line= <script id="script_gethint_ajax">
tail j=7298 line= function showHint(str) {
tail j=7299 line= if (str.length == 0) {
tail j=7300 line= document.getElementById("txtHint").innerHTML = "";
tail j=7301 line= return;
tail j=7302 line= }
tail j=7303 line= else {
tail j=7304 line= var xmlhttp = new XMLHttpRequest();
tail j=7305 line= xmlhttp.onreadystatechange = function() {
tail j=7306 line= if (this.readyState == 4 && this.status == 200) {
tail j=7307 line= document.getElementById("txtHint").innerHTML = this.responseText;
tail j=7308 line= }
tail j=7309 line= };
tail j=7310 line= xmlhttp.open("POST", "idx.php?hint=" + str, true);
tail j=7311 line= xmlhttp.send();
tail j=7312 line= }
tail j=7313 line= }
tail j=7314 line= </script id="script_gethint_ajax">
tail j=7315 line=
tail j=7316 line= </body>
tail j=7317 line= </html>
tail j=7318 line=<!--
tail j=7319 line=elise legrow - who do you love:https://www.youtube.com/watch?v=4BYzRmiBwRE
tail j=7320 line= -->
ko 20190222_062304 MAIN 0-0 fildb3=ko.db3 sqltbl=ko fillogd=ko_20190222.log
MSG_7500 FINDDT: ifile=index_dk.html findmath=style_dk tailmatch=style_dk ofile=style_dk
MSG_400: ko 20190222_062304 -= findt =- 0-0 ifile=index_dk.html findmatch=style_dkstyle_dk ofile=style_dk
EXIT_500 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ko 20190222_062304 -= findt =- 0-0 ___FOUND ifile=index_dk.html findmatch=style_dk ofile=style_dk
ko 20190222_062304 MAIN 0-0 fildb3=ko.db3 sqltbl=ko fillogd=ko_20190222.log
MSG_7500 FINDDT: ifile=index.html findmath=style_drop tailmatch=style_drop ofile=style_drop
MSG_400: ko 20190222_062304 -= findt =- 0-0 ifile=index.html findmatch=style_dropstyle_drop ofile=style_drop
EXIT_500 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ko 20190222_062304 -= findt =- 0-0 ___FOUND ifile=index.html findmatch=style_drop ofile=style_drop
match j=1532 line= <style id="style_drop" type="text/css">
FIND j=1533 line= #drop {
FIND j=1534 line= width:800px;
FIND j=1535 line= height:250px;
FIND j=1536 line= margin:3px auto;
FIND j=1537 line=// background:#eddaa8;
FIND j=1538 line= background:ivory;
FIND j=1539 line= font-size:16px;
FIND j=1540 line= }
FIND j=1541 line= #drop #sw { text-decoration:underline; cursor:pointer; }
FIND j=1542 line= #drag {
FIND j=1543 line=// width:450px;
FIND j=1544 line=// height:180px;
FIND j=1545 line= width:800;
FIND j=1546 line= height:480px;
FIND j=1547 line= margin:12px auto;
FIND j=1548 line= border:1px solid silver;
FIND j=1549 line= font-size:16px;
FIND j=1550 line= }
FIND j=1551 line= #drag .drg { margin:10px 12px; }
FIND j=1552 line= #drag div.drg {
FIND j=1553 line= width:150px;
FIND j=1554 line= height:50px;
FIND j=1555 line= background:#07da08;
FIND j=1556 line= border:2px solid blue;
FIND j=1557 line= }
TAIL j=1558 line= </style id="style_drop" type="text/css">
tail j=1559 line=
tail j=1560 line= <style id="style_div_csv type="text/css">
tail j=1561 line= body {
tail j=1562 line=// font-family: Arial;
tail j=1563 line= font-family: yokkmokkOT;
tail j=1564 line= font-family: arial;
tail j=1565 line= font-size: 8pt;
tail j=1566 line= }
tail j=1567 line= table {
tail j=1568 line= border: 1px solid #ccc;
tail j=1569 line= }
tail j=1570 line= table th {
tail j=1571 line=// background-color: #F7F7F7;
tail j=1572 line= background-color: darkSlategrey;
tail j=1573 line=// color: #333;
tail j=1574 line= color: ivory;
tail j=1575 line= font-weight: bold;
tail j=1576 line= }
tail j=1577 line= table th, table td {
tail j=1578 line= padding: 5px;
tail j=1579 line= border-color: #ccc;
tail j=1580 line= }
tail j=1581 line= </style id="style_div_csv type="text/css">
tail j=1582 line=
tail j=1583 line= <style id="style_thumb_3800">
tail j=1584 line= .thumb {
tail j=1585 line= height: 75px;
tail j=1586 line= border: 1px solid #000;
tail j=1587 line= margin: 10px 5px 0 0;
tail j=1588 line= }
tail j=1589 line= </style>
tail j=1590 line=
tail j=1591 line= <style id="style_byte_content" >
tail j=1592 line= #byte_content {
tail j=1593 line= margin: 5px 0;
tail j=1594 line= max-height: 100px;
tail j=1595 line= overflow-y: auto;
tail j=1596 line= overflow-x: hidden;
tail j=1597 line= }
tail j=1598 line= #byte_range { margin-top: 5px; }
tail j=1599 line= </style>
tail j=1600 line=
tail j=1601 line= <script id="load_vues" >
tail j=1602 line= function load_vues(args) {
tail j=1603 line=// alert( "BUG_1000 load_vues"+args );
tail j=1604 line= vues = "";
tail j=1605 line= vues += "old|\n";
tail j=1606 line= vues += "ko|\n";
tail j=1607 line= vues += "new|\n";
tail j=1608 line= vues += "work|\n";
tail j=1609 line= vues += "focus|\n";
tail j=1610 line= vues += "where|";
tail j=1611 line= vues += "courtreport|\n";
tail j=1612 line= vues += "jtfdc|\n";
tail j=1613 line= vues += "jtrdcr|\n";
tail j=1614 line= vues += "jtfinc|\n";
tail j=1615 line= vues += "byrdpuckers|\n";
tail j=1616 line=
tail j=1617 line= vues += "kassil|\n";
tail j=1618 line= vues += "konet|\n";
tail j=1619 line= vues += "iperms|\n";
tail j=1620 line=
tail j=1621 line= vues += "memes|\n";
tail j=1622 line= vues += "food|\n";
tail j=1623 line= vues += "kids|\n";
tail j=1624 line= vues += "dogs|\n";
tail j=1625 line=
tail j=1626 line= vues += "jkwii|\n";
tail j=1627 line= vues += "kou|\n";
tail j=1628 line= vues += "konabus|\n";
tail j=1629 line= vues += "go|\n";
tail j=1630 line= vues += "kt|\n";
tail j=1631 line= vues += "ka|\n";
tail j=1632 line= vues += "ko|\n";
tail j=1633 line=
tail j=1634 line= vues += "ko0|\n";
tail j=1635 line= vues += "ko1|\n";
tail j=1636 line= vues += "ko2|\n";
tail j=1637 line= vues += "ka1|\n";
tail j=1638 line= vues += "ka2|\n";
tail j=1639 line=
tail j=1640 line= vues += "ka11|\n";
tail j=1641 line= vues += "ka12|\n";
tail j=1642 line= vues += "ka21|\n";
tail j=1643 line= vues += "ka22|\n";
tail j=1644 line=
tail j=1645 line= vues += "av|\n";
tail j=1646 line= vues += "bb|\n";
tail j=1647 line= vues += "dd|\n";
tail j=1648 line= vues += "pn|\n";
tail j=1649 line= vues += "sl|\n";
tail j=1650 line= vues += "tm|\n";
tail j=1651 line= vues += "tl|\n";
tail j=1652 line= vues += "vu|\n";
tail j=1653 line= vues += "yt|\n";
tail j=1654 line= vues += "zm|\n";
tail j=1655 line=
tail j=1656 line= vues += "old|\n";
tail j=1657 line=
tail j=1658 line=// alert( "BUG_1100 end load_vues vues="+vues );
tail j=1659 line= return( vues );
tail j=1660 line= }
tail j=1661 line= </script>
tail j=1662 line=
tail j=1663 line= <script id="script_show_vues">
tail j=1664 line= function show_vues(args) {
tail j=1665 line= alert( "BUGS_1060 BEG show_vues args="+args );
tail j=1666 line=
tail j=1667 line= vues = load_vues('').split("|");
tail j=1668 line= vuelen = vues.length;
tail j=1669 line= alert( "BUGS_1070 show_vues AAA htmout="+vuelen );
tail j=1670 line=
tail j=1671 line= htmout="";
tail j=1672 line= htmout_script_vues="";
tail j=1673 line= htmout_button_vues="";
tail j=1674 line= htmout_div_vues="";
tail j=1675 line= htmout="";
tail j=1676 line= htmout="";
tail j=1677 line=
tail j=1678 line= z=0;
tail j=1679 line=
tail j=1680 line= for( z=0; z<vuelen; z++ ) {
tail j=1681 line= vue = vues[z];
tail j=1682 line= url = '/?vuid="'+vue+'"';
tail j=1683 line= tn = "/imgs/gif/ringd.gif"; img = "/imgs/gif/ringb.gif";
tail j=1684 line= tn = "/imgs/gif/ringsd.gif"; img = "/imgs/gif/ringsb.png";
tail j=1685 line=
tail j=1686 line= background="yellow";
tail j=1687 line= color="black";
tail j=1688 line= font="yokkmokkOT";
tail j=1689 line= fontsize="12pt";
tail j=1690 line= width="35%";
tail j=1691 line=
tail j=1692 line= alert( "BUGS_1090 show_vues z="+z+" vue="+vue );
tail j=1693 line=
tail j=1694 line= htmout += "<hr color=yellow";
tail j=1695 line= htmout += "<hr color=red";
tail j=1696 line= htmout += '<img src="/imgs/gif/rings.gif" >\n';
tail j=1697 line= htmout += '<a href="'+url+'" alt="'+vue+'" class="popover" id="drg" target=_blank>';
tail j=1698 line= htmout += ' <img class="drg" src="'+tn+'" border=0>';
tail j=1699 line= htmout += ' <span><img class="drg" src="'+img+'" border=0></span>';
tail j=1700 line= htmout += ' </a>';
tail j=1701 line= htmout += "<hr color=yellow";
tail j=1702 line= htmout += "<hr color=red";
tail j=1703 line=
tail j=1704 line=// htmout_script_vues += '<script id="'+z+'" >';
tail j=1705 line= htmout_script_vues += '<script id="vue_kov_'+vue+'" >';
tail j=1706 line= htmout_script_vues += ' var kov = new Vue({ el: "#kov'+kovid+'",';
tail j=1707 line= htmout_script_vues += 'data: {collapsed: false},';
tail j=1708 line=
tail j=1709 line= htmout_script_vues += 'methods: {\n';
tail j=1710 line= htmout_script_vues += ' showhide_kov: function() {\n';
tail j=1711 line= htmout_script_vues += ' if (!this.collapsed) this.collapsed = true;\n';
tail j=1712 line= htmout_script_vues += ' else this.collapsed = false;\n';
tail j=1713 line= htmout_script_vues += ' },\n';
tail j=1714 line= htmout_script_vues += 'document.body.style.background = "'+background+'"';
tail j=1715 line=
tail j=1716 line= htmout_script_vues += 'document.body.style.color = "'+color+'"';
tail j=1717 line= htmout_script_vues += 'document.body.style.fontfamily = "'+font+'"';
tail j=1718 line= htmout_script_vues += 'document.body.style.fontsize = "'+fontsize+'"';
tail j=1719 line= htmout_script_vues += ' },\n';
tail j=1720 line= htmout_script_vues += ' </script" >';
tail j=1721 line=
tail j=1722 line= htmout_style_vues = '<style id="style_kov_'+vue+'\n';
tail j=1723 line= htmout_style_vues += ' .detail_'+vue+' { \n';
tail j=1724 line= htmout_style_vues += ' background: '+background+';\n';
tail j=1725 line= htmout_style_vues += ' width: '+width+';\n';
tail j=1726 line= htmout_style_vues += ' padding: 20px;\n';
tail j=1727 line= htmout_style_vues += ' border: 1px solid black;\n';
tail j=1728 line= htmout_style_vues += ' font-family: '+font+';\n';
tail j=1729 line= htmout_style_vues += ' color: '+color+';\n';
tail j=1730 line= htmout_style_vues += ' }\n';
tail j=1731 line= htmout_style_vues += ' </style>\n';
tail j=1732 line=
tail j=1733 line=// alert( "BUGS_1092 show_vues VUEHTM vuelen="+vuelen+" htmout_style_vues=\n"+htmout_style_vues );
tail j=1734 line= alert( "BUGS_1733 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues=\n"+htmout_script_vues );
tail j=1735 line= }
tail j=1736 line=
tail j=1737 line=
tail j=1738 line=// alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout="+htmout );
tail j=1739 line=// alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues="+htmout_script_vues );
tail j=1740 line=
tail j=1741 line= div_style_vues = document.getElementById('div_style_vues');
tail j=1742 line= div_style_vues.insertAdjacentHTML('afterbegin', htmout_style_vues );
tail j=1743 line=
tail j=1744 line= div_script_vues = document.getElementById('div_script_vues');
tail j=1745 line= div_script_vues.insertAdjacentHTML('afterbegin', htmout_script_vues );
tail j=1746 line=
tail j=1747 line=
tail j=1748 line= div_show_vues = document.getElementById('div_show_vues');
tail j=1749 line= div_show_vues.insertAdjacentHTML('afterbegin', htmout);
tail j=1750 line=
tail j=1751 line=
tail j=1752 line=// div_show_vues.insertAdjacentHTML('beforebegin', htmout);
tail j=1753 line=
tail j=1754 line=// div_show_vues = getelementbyID('div_show_vues");
tail j=1755 line=// div_show_vues.innerHTML = htmout;
tail j=1756 line=
tail j=1757 line=// alert("BUGS_2892 vuelen=" + vues.length + "\nStatus: " + status);
tail j=1758 line=// document.write( htmout );
tail j=1759 line=
tail j=1760 line=// alert( "BUGS_1100 END show_vues htmout="+htmout );
tail j=1761 line= return(htmout);
tail j=1762 line= }
tail j=1763 line= </script id="script_show_vues">
tail j=1764 line=
tail j=1765 line=
tail j=1766 line= <div id="div_style_vues"></div>
tail j=1767 line=
tail j=1768 line= <div id="div_script_vues"></div>
tail j=1769 line=
tail j=1770 line= <script id="script_kovs_hideshow">
tail j=1771 line=
tail j=1772 line= function kovs_hideshow( todo, kovs ) {
tail j=1773 line= kovlist = "";
tail j=1774 line= kovlist += "ko|go|kt|old|new|";
tail j=1775 line= kovlist += "kassil|konet|iperms|konabus|courtreport|";
tail j=1776 line= kovlist += "jkwii|byrdpucker|kou|jtfdc|jtfinc|";
tail j=1777 line= kovlist += "where|work|memes|focus|food|";
tail j=1778 line= kovlist += "dogs|kids|preserve|protect";
tail j=1779 line= kovs = kovlist.split('|');
tail j=1780 line= kovs_len = kovs.length;
tail j=1781 line=// alert( "BUS_1340 kovs_hideshow todo="+todo+" kovlist="+kovlist+" kovs_len="+kovs_len );
tail j=1782 line= htmout = "";
tail j=1783 line= z=0;
tail j=1784 line= for( z=0; z<kovs_len; z++ ) {
tail j=1785 line= kov=kovs[z];
tail j=1786 line= kovid="kov_"+kov;
tail j=1787 line= if( todo == "hide" ) {
tail j=1788 line= document.getElementById(kovid).style.visibility = "hidden";
tail j=1789 line= }
tail j=1790 line= if( todo == "show" ) {
tail j=1791 line= document.getElementById(kovid).style.visibility = "visible";
tail j=1792 line= }
tail j=1793 line= htmout += "z="+z+" todo="+todo+ " kovid="+kovid+"<br>\n";
tail j=1794 line=// alert( "BUS_1350 kovs_hideshow todo="+todo+" z="+z+" kovid="+kovid );
tail j=1795 line= }
tail j=1796 line= alert( "BUGS_1371 htmout="+htmout );
tail j=1797 line=// alert( "BUS_1370 kovs_hideshow todo="+todo+" kovs="+kovs );
tail j=1798 line= }
tail j=1799 line= </script>
tail j=1800 line=
tail j=1801 line= <script id="script_vues_hideshow">
tail j=1802 line= function vues_hideshow(hideshow,kovs) {
tail j=1803 line= alert( "BUGS_1220 vues_hideshow kovs="+kovs );
tail j=1804 line= kovs = "";
tail j=1805 line= kovs += "ko new focus work where memes ";
tail j=1806 line= kovs += "jtfdc jtfdcr jtfinc byrdpucker courtreport ";
tail j=1807 line= kovs += "jkwii kou kids dogs ";
tail j=1808 line= kovs += "kassil konet iperms konabus ko go kt old";
tail j=1809 line= alert( "BUGS_1221 vues_hideshow kovs="+kovs );
tail j=1810 line= z=0;
tail j=1811 line= for( kov in kovs.split(" ") ) {
tail j=1812 line= z=z+1;
tail j=1813 line= alert( "BUGS vues_hideshow z="+z+" kov="+kov );
tail j=1814 line= }
tail j=1815 line= }
tail j=1816 line= function vues_hideshow1(hideshow,divid) {
tail j=1817 line= alert( "BUGS_1230 vues_hideshow args="+args );
tail j=1818 line= htmout_vues_all="";
tail j=1819 line= if( hideshow == 'hide' ) {
tail j=1820 line= if( divid == "" ) or ( divid == "all" ) {
tail j=1821 line= alert( "MGS_1261 vues_showhide HIDE" );
tail j=1822 line= document.getElementById("btn_vues_hide").style.visibility = "hidden";
tail j=1823 line= document.getElementById("btn_vues_show").style.visibility = "visible";
tail j=1824 line=
tail j=1825 line= document.getElementById("kov_ko").style.visibility = "hidden";
tail j=1826 line= document.getElementById("kov_new").style.visibility = "hidden";
tail j=1827 line= document.getElementById("kov_focus").style.visibility = "hidden";
tail j=1828 line= document.getElementById("kov_food").style.visibility = "hidden";
tail j=1829 line= document.getElementById("kov_courtreport").style.visibility = "hidden";
tail j=1830 line= document.getElementById("kov_where").style.visibility = "hidden";
tail j=1831 line= document.getElementById("kov_work").style.visibility = "hidden";
tail j=1832 line= document.getElementById("kov_memes").style.visibility = "hidden";
tail j=1833 line= document.getElementById("kov_kids").style.visibility = "hidden";
tail j=1834 line= document.getElementById("kov_dogs").style.visibility = "hidden";
tail j=1835 line= document.getElementById("kov_preserve").style.visibility = "hidden";
tail j=1836 line= document.getElementById("kov_protect").style.visibility = "hidden";
tail j=1837 line= document.getElementById("kov_jtfdc").style.visibility = "hidden";
tail j=1838 line= document.getElementById("kov_jtfinc").style.visibility = "hidden";
tail j=1839 line= document.getElementById("kov_byrdpucker").style.visibility = "hidden";
tail j=1840 line= document.getElementById("kov_jkwii").style.visibility = "hidden";
tail j=1841 line= document.getElementById("kov_kou").style.visibility = "hidden";
tail j=1842 line= document.getElementById("kov_kassil").style.visibility = "hidden";
tail j=1843 line= document.getElementById("kov_konet").style.visibility = "hidden";
tail j=1844 line= document.getElementById("kov_iperms").style.visibility = "hidden";
tail j=1845 line= document.getElementById("kov_konabus").style.visibility = "hidden";
tail j=1846 line= document.getElementById("kov_kt").style.visibility = "hidden";
tail j=1847 line= document.getElementById("kov_go").style.visibility = "hidden";
tail j=1848 line= document.getElementById("kov_old").style.visibility = "hidden";
tail j=1849 line= }
tail j=1850 line= else {
tail j=1851 line= document.getElementById(divid).style.visibility = "hiddtn";
tail j=1852 line= }
tail j=1853 line=
tail j=1854 line=// var div_vues_all = document.getElementById('div_vues_all');
tail j=1855 line=// htmout_vues= div_vues_all.innerHTML;
tail j=1856 line=// div_vues_all.innerHTML = '<div id="div_vues_all" hidden><h1>div_vues_all_hidden</h1>\n';
tail j=1857 line=// htmout_vues = document.getElementById('div_vues_all').innerHTML;
tail j=1858 line= alert( "BUGS_1291 vues_hideshow HIDE=");
tail j=1859 line=// div_vues.innerHTML = '<h1>div_vues</h1><div id="div_vues" hidden>\n";
tail j=1860 line= }
tail j=1861 line= if( args == 'show' ) {
tail j=1862 line= if( divid == "" ) or ( divid == "all" ) {
tail j=1863 line= alert( "MGS_1262 vues_showhide HIDE" );
tail j=1864 line= document.getElementById("btn_vues_hide").style.visibility = "visible";
tail j=1865 line= document.getElementById("btn_vues_show").style.visibility = "hidden";
tail j=1866 line=
tail j=1867 line=
tail j=1868 line=
tail j=1869 line= document.getElementById("kov_ko").style.visibility = "visible";
tail j=1870 line= document.getElementById("kov_new").style.visibility = "visible";
tail j=1871 line= document.getElementById("kov_focus").style.visibility = "visible";
tail j=1872 line= document.getElementById("kov_food").style.visibility = "visible";
tail j=1873 line= document.getElementById("kov_courtreport").style.visibility = "visible";
tail j=1874 line= document.getElementById("kov_where").style.visibility = "visible";
tail j=1875 line= document.getElementById("kov_work").style.visibility = "visible";
tail j=1876 line= document.getElementById("kov_memes").style.visibility = "visible";
tail j=1877 line= document.getElementById("kov_kids").style.visibility = "visible";
tail j=1878 line= document.getElementById("kov_dogs").style.visibility = "visible";
tail j=1879 line= document.getElementById("kov_preserve").style.visibility = "visible";
tail j=1880 line= document.getElementById("kov_protect").style.visibility = "visible";
tail j=1881 line= document.getElementById("kov_jtfdc").style.visibility = "visible";
tail j=1882 line= document.getElementById("kov_jtfinc").style.visibility = "visible";
tail j=1883 line= document.getElementById("kov_byrdpucker").style.visibility = "visible";
tail j=1884 line= document.getElementById("kov_jkwii").style.visibility = "visible";
tail j=1885 line= document.getElementById("kov_kou").style.visibility = "visible";
tail j=1886 line= document.getElementById("kov_kassil").style.visibility = "visible";
tail j=1887 line= document.getElementById("kov_konet").style.visibility = "visible";
tail j=1888 line= document.getElementById("kov_iperms").style.visibility = "visible";
tail j=1889 line= document.getElementById("kov_konabus").style.visibility = "visible";
tail j=1890 line= document.getElementById("kov_kt").style.visibility = "visible";
tail j=1891 line= document.getElementById("kov_go").style.visibility = "visible";
tail j=1892 line= document.getElementById("kov_old").style.visibility = "visible";
tail j=1893 line= }
tail j=1894 line= else {
tail j=1895 line= document.getElementById(divid).style.visibility = "visible";
tail j=1896 line= }
tail j=1897 line= alert( "BUGS_1292 vues_hideshow SHOW htmout_vues=");
tail j=1898 line= }
tail j=1899 line= }
tail j=1900 line= </script id="script_vues_hideshow">
tail j=1901 line=
tail j=1902 line= <script id="script_kb" >function script_kb(args) {
tail j=1903 line= alert( "script_kb args="+args );
tail j=1904 line= }
tail j=1905 line= <script id="script_kw" >function script_kw(args) {
tail j=1906 line= alert( "script_kw args="+args );
tail j=1907 line= }
tail j=1908 line= <script id="script_koeyeb_w" >function script_koeyeb_w(args) {
tail j=1909 line= alert( "script_koeyeb_w args="+args );
tail j=1910 line= }
tail j=1911 line= <script id="script_koeyew_b" >function script_koeyew_b(args) {
tail j=1912 line= alert( "script_koeyew_b args="+args );
tail j=1913 line= }
tail j=1914 line= <script id="script_koeye_b" >function script_koeye_b(args) {
tail j=1915 line= alert( "script_koeye_b args="+args );
tail j=1916 line= }
tail j=1917 line= <script id="script_koeye_w" >function script_koeye_w(args) {
tail j=1918 line= alert( "script_koeye_w args="+args );
tail j=1919 line= }
tail j=1920 line= <script id="script_bubble" >function script_bubble(args) {
tail j=1921 line= alert( "script_bubble args="+args );
tail j=1922 line= }
tail j=1923 line=
tail j=1924 line= <script id="script_shutdown" >
tail j=1925 line= function script_shutdown( msg ) {
tail j=1926 line= alert( "BUGS_6100 script_shutdown msg="+msg );
tail j=1927 line= }
tail j=1928 line= </script id="script_shutdown" >
tail j=1929 line=
tail j=1930 line=
tail j=1931 line=
tail j=1932 line= </head>
tail j=1933 line=
tail j=1934 line=
tail j=1935 line=
tail j=1936 line=<!-- <body onload="init_pano('canvas'); kogrids();"> -->
tail j=1937 line=
tail j=1938 line=
tail j=1939 line=<body onload="startup();">
tail j=1940 line=
tail j=1941 line=<br><br><br><br>
tail j=1942 line=<br><br><br><br>
tail j=1943 line=
tail j=1944 line= <div id="div_kogrids_w"></div>
tail j=1945 line=
tail j=1946 line=
tail j=1947 line=<br><br><br><br><br>
tail j=1948 line=<hr color=yellow>
tail j=1949 line= <button type="btn_kovs_hideshow" id="kovs_hideshow" onclick="kovs_hideshow()">kovs_hideshow</button>
tail j=1950 line= <a href=# onclick="kovs_hideshow("hide","all"); return false;" class="popover">
tail j=1951 line= <img height=200 src=/imgs/gif/ringb.gif onclick="kovs_hideshow('hide','all')">
tail j=1952 line= <span><img height=200 src=/imgs/gif/ringp.gif onclick="kovs_hideshow('hide','all')"></span>
tail j=1953 line= <a>
tail j=1954 line=
tail j=1955 line=<!-- <img src=/imgs/gif/rings.gif onclick="kovs_hideshow('show','all')"> -->
tail j=1956 line=
tail j=1957 line= <a href=# onclick="kovs_hideshow("show","all"); return false;" class="popover">
tail j=1958 line= <img height=200 src=/imgs/gif/ringd.gif onclick="kovs_hideshow('show','all')">
tail j=1959 line= <span><img height=200 src=/imgs/gif/ringq.gif onclick="kovs_hideshow('show','all')"></span>
tail j=1960 line= <a>
tail j=1961 line=
tail j=1962 line= <script id="script_bugs" >
tail j=1963 line= function bugs(h,d) {
tail j=1964 line= alert( "BUGS " );
tail j=1965 line= }
tail j=1966 line= </script>
tail j=1967 line=
tail j=1968 line= <button type="btn_kovs_hide" id="btn_kovs_hide" onclick="kovs_hideshow('hide','all')>
tail j=1969 line= -= kovs_hide_all =-
tail j=1970 line= </button>
tail j=1971 line= <button type="btn_kovs_show" id="btn_kovs_show" onclick="kovs_hideshow('show','all')>
tail j=1972 line= -= kovs_show_all =-
tail j=1973 line= </button>
tail j=1974 line=
tail j=1975 line=<hr color=yellow>
tail j=1976 line=<br><br><br><br><br>
tail j=1977 line=<br><br><br><br><br>
tail j=1978 line=<br><br><br><br><br>
tail j=1979 line=<br><br><br><br><br>
tail j=1980 line=
tail j=1981 line= <button type="show_vues" id="show_vues" onclick="show_vues('')">show_vues</button>
tail j=1982 line=<!--
tail j=1983 line= <a href=# class=popover id="drag" >
tail j=1984 line= <img height=400 width=600 src="/imgs/gif/ringsb.gif" onclick="show_vues('')" >
tail j=1985 line= <span><img height=400 width=600 src="/imgs/gif/ringsq.gif" onclick="show_vues('')" ></span>
tail j=1986 line= </a>
tail j=1987 line= -->
tail j=1988 line=
tail j=1989 line=<button type="show_vues" id="show_vues" onclick="show_vues('')">show_vuew</button>
tail j=1990 line= <div id="div_show_vues" ><h1>div_show_vues_w</h1></div>
tail j=1991 line=
tail j=1992 line=
tail j=1993 line=<button type="kov_links_main" id="kov_links_main" onclick="kov_links()">kov_links_main</button>
tail j=1994 line=<!-- <button type="clear_div_kov" id="clear_div_kov" onclick="clear_div_kov()">clear_div_kov</button> -->
tail j=1995 line=<!-- <button type="load_kov_links" id="load_kov_links" onclick="load_kov_links()">load_kov_links</button> -->
tail j=1996 line=<!-- <button type="show_kov_links" id="show_kov_links" onclick="show_kov_links()">show_kov_links</button> -->
tail j=1997 line=
tail j=1998 line=
tail j=1999 line= <div id="div_kov_links"></div>
tail j=2000 line=
tail j=2001 line= <div id="v_hoverdate">
tail j=2002 line= <span v-bind:title="message"><font style="font-family: times, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
tail j=2003 line= <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
tail j=2004 line= </div>
tail j=2005 line= <script id="script_hoverdate" >
tail j=2006 line= kotxt = "";
tail j=2007 line= kotxt += "-== kako =- preview embed vu emchat -= 20190218_0800 =-";
tail j=2008 line=// kotxt += new Date().toLocaleString();
tail j=2009 line=// message: 'hoverdate ' + kotxt;
tail j=2010 line= var app2 = new Vue({el: '#v_hoverdate',
tail j=2011 line= data: {
tail j=2012 line= message: 'hover_dttm ' + new Date().toLocaleString() + kotxt
tail j=2013 line= }
tail j=2014 line= })
tail j=2015 line= </script id="script_hoverdate" >
tail j=2016 line=
tail j=2017 line=
tail j=2018 line= <dic id="div_vues" ><h1>div_vues</h1></div>
tail j=2019 line=<!-- <button type="button" onclick="script_ajax()">loadlist</button> -->
tail j=2020 line=
tail j=2021 line=
tail j=2022 line= <hr color=yellow>
tail j=2023 line= <div id="dynDataField"></div>
tail j=2024 line= <hr color=yellow>
tail j=2025 line=
tail j=2026 line= <h1 id="ajaxdb3">ajaxdb3.</h1>
tail j=2027 line= <button type="button" onclick="script_ajaxdb3()">ajaxdb3</button>
tail j=2028 line=
tail j=2029 line= <script id="script_ajaxdb3">
tail j=2030 line= db3=indexx.db3;
tail j=2031 line= sql="select * from list limit 5";
tail j=2032 line= function script_ajaxdb3(db3,sql) {
tail j=2033 line= $("button").click(function(){
tail j=2034 line= $.post("indexx.php", {
tail j=2035 line= db3: db3,
tail j=2036 line= sql: "select * from list limit 10"
tail j=2037 line= },
tail j=2038 line= function(data, status){
tail j=2039 line= lines = data.split("\n");
tail j=2040 line= linelen=lines.length;
tail j=2041 line= htmout="";
tail j=2042 line= alert( "BUGS1240 linelen="+linelen );
tail j=2043 line= for( z=0; z<lines.length; z++ ) {
tail j=2044 line= line=lines[z];
tail j=2045 line= if( line.length < 3 ) continue;
tail j=2046 line= z=z+1;
tail j=2047 line= flds = line.split(" ");
tail j=2048 line= img = flds[8];
tail j=2049 line= dd = flds[7];
tail j=2050 line= mth = flds[5];
tail j=2051 line= yyyy = flds[6];
tail j=2052 line= size = flds[4];
tail j=2053 line=// htmout += line+"\n";
tail j=2054 line= htmout += "img="+img+" dd="+dd+" "+yyyy+" "+mth+"\n";
tail j=2055 line=// alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
tail j=2056 line= }
tail j=2057 line= alert( "BUGS_1400 ajaxdb3 z="+z+" htmout="+htmout );
tail j=2058 line= for( z=0; z<lines.length; z++ ) {
tail j=2059 line= line=lines[z];
tail j=2060 line= alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
tail j=2061 line= flds = lines.split(" ");
tail j=2062 line= fldlen = flds.length;
tail j=2063 line= alert( "BUGS_1260 ajaxdb3 z="+z+" fldlen="+fldlen );
tail j=2064 line= psv=parseline(line);
tail j=2065 line= alert( "BUGS_1251 ajaxdb3 psv="+psv );
tail j=2066 line=// (url,img,id,tn,grp,desc) = parseline(line);
tail j=2067 line=// url = line.split(" ")[0];
tail j=2068 line=// img = line.split(" ")[1];
tail j=2069 line=// alert( "BUGS_1251 ajaxdb3 url="+url+" img="+img );
tail j=2070 line=// id = line.split("|")[2];
tail j=2071 line=// tn = line.split("|")[3];
tail j=2072 line=// grp = line.split("|")[4];
tail j=2073 line=// desc = line.split("|")[5];
tail j=2074 line=
tail j=2075 line= htmout += '<div id="drag">\n';
tail j=2076 line= htmout += '<div class="drg" >\n';
tail j=2077 line= htmout += '<a href="+url+" class="thumbnail" target=_blank>\n';
tail j=2078 line= htmout += ' <img class="drg" src="+img+" border=0>\n';
tail j=2079 line= htmout += ' <span><img class="drg" src="+img+" border=0></span>\n';
tail j=2080 line= htmout += ' </a>\n';
tail j=2081 line= htmout += ' </div>\n';
tail j=2082 line= htmout += ' </div>\n';
tail j=2083 line=// alert( "BUGS_1248 ajaxdb3 htmout="+htmout );
tail j=2084 line= }
tail j=2085 line=
tail j=2086 line=// getelementbyID('div_ajaxdb3");
tail j=2087 line=// alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
tail j=2088 line=
tail j=2089 line= div_ajaxdb3 = document.getElementById('div_ajaxdb3');
tail j=2090 line= div_ajaxdb3.insertAdjacentHTML('afterbegin', htmout);
tail j=2091 line=// document.write( htmout );
tail j=2092 line= });
tail j=2093 line= });
tail j=2094 line= }
tail j=2095 line= </script id="script_ajaxdb3">
tail j=2096 line=
tail j=2097 line=
tail j=2098 line= <script id="script_parseline">
tail j=2099 line= function parseline(line) {
tail j=2100 line= alert( "BUGS_1280 line="+line );
tail j=2101 line= flds=line.split(" ");
tail j=2102 line=
tail j=2103 line= url="index.html";
tail j=2104 line= img="/imgs/gif/ringsb.gif";
tail j=2105 line= id="jkwii";
tail j=2106 line= tn="/imgs/btn/ringsd.gif";
tail j=2107 line= grp="group";
tail j=2108 line= desc="timejak jkwii";
tail j=2109 line= psv=url+"|"+img+"|"+id+"|"+tn+"|"+grp+"|"+desc
tail j=2110 line=
tail j=2111 line=// return(url,img,id,tn,grp,desc);
tail j=2112 line= return(psv);
tail j=2113 line= }
tail j=2114 line= </script id="script_parseline">
tail j=2115 line=
tail j=2116 line= <hr color=yellow>
tail j=2117 line= <div id="div_ajaxdb3"></div>
tail j=2118 line= <hr color=yellow>
tail j=2119 line=
tail j=2120 line=
tail j=2121 line=<!-- <div id="ajax_loadlist">xxx ajax_loadlist xxx</div> -->
tail j=2122 line= <hr color=yellow>
tail j=2123 line=
tail j=2124 line=
tail j=2125 line=
tail j=2126 line= <div id="div_vues" >
tail j=2127 line=
tail j=2128 line= <div id="app_jkwii">
tail j=2129 line= <div>
tail j=2130 line=
tail j=2131 line= <h1 v-on:click="showhide" >= = : : jkwii is me : : = =</h1>
tail j=2132 line= <h2 v-on:click="showhide" >:: -=ko0us=- preview 20190218_0800 us_med_rectin</h2>
tail j=2133 line= <h2>private tours available on request</h2>
tail j=2134 line=
tail j=2135 line=<a id="drag" class="popover" href="/ani.html" target=_blank>
tail j=2136 line= <img class="drg" height=450 width=800 src="/imgs/gif/firebubblesb.gif" alt="firebubbles" border=0>
tail j=2137 line= <span><img height=450 width=800 class="drg" src="/imgs/gif/firebubblesq.gif" border=0></span>
tail j=2138 line= </a>
tail j=2139 line=
tail j=2140 line= <iframe frameborder='0' height='200' width=800 marginheight='0' marginwidth='0' scrolling='no'
tail j=2141 line= src='/ani.html'
tail j=2142 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=2143 line= </iframe>
tail j=2144 line=
tail j=2145 line= <hr color=blue>
tail j=2146 line= <hr color=white>
tail j=2147 line= <hr color=red>
tail j=2148 line=
tail j=2149 line=<!--
tail j=2150 line= <iframe id="myframe" src="/svc/emchat/index.html" width="600" height="500"
tail j=2151 line= frameborder="0" scrolling="yes"></iframe>
tail j=2152 line= -->
tail j=2153 line=
tail j=2154 line=<!--
tail j=2155 line= <img height=50 src="/imgs/btn/kob.png">
tail j=2156 line= <img height=50 src="/imgs/btn/koeyeb.png">
tail j=2157 line= <img height=50 src="/imgs/btn/koeye.png">
tail j=2158 line= <img height=50 src="/imgs/btn/koeyew.png">
tail j=2159 line= <img height=50 src="/imgs/btn/kow.png">
tail j=2160 line= -->
tail j=2161 line=
tail j=2162 line= <a href=/svc/emchat/index.html class="thumbnail" target=_blank>
tail j=2163 line= <img class="drg" height=200 src=/imgs/links/tn/tn_chat.png border=0>
tail j=2164 line= <span><img class="drg" height=400 src=/imgs/links/tn/tn_chat.png border=0></span>
tail j=2165 line= </a>
tail j=2166 line=
tail j=2167 line= <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
tail j=2168 line= <img class="drg" height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=2169 line= <span><img class="drg" height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=2170 line= </a>
tail j=2171 line=
tail j=2172 line= <a class="thumbnail" href=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin target=_blank>
tail j=2173 line= <img class="drg" height=200 src=/tl/imgs/tn/tn_jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0>
tail j=2174 line= <span><img class="drg" height=800 src=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0></span>
tail j=2175 line= </a>
tail j=2176 line=
tail j=2177 line= <a href=# v-on:click="showhide" class=thumbnail >
tail j=2178 line= <img class="drg" v-on:click="showhide" height=200 src=/tl/imgs/construction_sawhorse.gif border=0>
tail j=2179 line= <span><img class="drg" v-on:click="showhide" height=400 src=/tl/imgs/construction_sawhorse.gif border=0></span>
tail j=2180 line= </a>
tail j=2181 line=
tail j=2182 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.jpg alt=jtf31_streetswing_sawhorse_n_speedbump=_blank>
tail j=2183 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0>
tail j=2184 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0></span>
tail j=2185 line= </a>
tail j=2186 line=
tail j=2187 line= <a class="thumbnail" v-on:click="showhide" href=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0>
tail j=2188 line= <img class="drg" v-on:click="showhide" height=200 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
tail j=2189 line= <span><img class="drg" v-on:click="showhide" height=400 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0></span>
tail j=2190 line= </a>
tail j=2191 line=
tail j=2192 line=
tail j=2193 line=
tail j=2194 line= <br><br>
tail j=2195 line= <hr color=red>
tail j=2196 line= <hr color=white>
tail j=2197 line= <hr color=blue>
tail j=2198 line= <h2 v-on:click="showhide" >== jtfdc OPEN BORDER problem ==</h2>
tail j=2199 line= !! NO wall !! NO sawhorse !! NO tape !! NO chalk !!
tail j=2200 line= <br>
tail j=2201 line= !! NO EAGLES - OUR NO EAGLES !!
tail j=2202 line=
tail j=2203 line= <h1>
tail j=2204 line= <a href=/imgs/links_201901/great_wall_of_china_1870.jpg class="thumbnail_not" target=_blank>
tail j=2205 line= <img src=/imgs/links_201901/tn/tn_great_wall_of_china_1870.png border=0>
tail j=2206 line= </a>
tail j=2207 line= <a href=https://www.youtube.com/watch?v=OfCS1yXg8gk class="thumbnail_not" target=_blank>
tail j=2208 line= <img src=/imgs/links_201901/tn/tn_youb_across_the_border.png border=0>
tail j=2209 line= </a>
tail j=2210 line=
tail j=2211 line= <a href=/imgs/links/Image332.png class="thumbnail_not" target=_blank>
tail j=2212 line= <img src=/imgs/links/tn/tn_Image332.png border=0>
tail j=2213 line=<!-- <span><img src=/imgs/links/Image332.png border=0></span> -- >
tail j=2214 line= </a>
tail j=2215 line=
tail j=2216 line=
tail j=2217 line=
tail j=2218 line=<!--
tail j=2219 line= <a href=https://https://www.youtube.com/watch?v=Gj3UdRmhgvM&start_radio=1&list=RDGj3UdRmhgvM class="thumbnail_not" target=_blank>
tail j=2220 line= <img src=/imgs/links_201901/tn/tn_youb_dark_end_ofthe_street.png border=0>
tail j=2221 line= </a>
tail j=2222 line= -->
tail j=2223 line=<!-- -->
tail j=2224 line= <br>
tail j=2225 line=
tail j=2226 line=
tail j=2227 line= <a href=https://en.wikipedia.org/wiki/Moat class="thumbnail_not" target=_blank>
tail j=2228 line= <img src=/imgs/links_201901/tn/tn_Vellorefort.png border=0>
tail j=2229 line= </a>
tail j=2230 line=
tail j=2231 line= - ?? moat ?? -
tail j=2232 line= <a href=https://upload.wikimedia.org/wikipedia/commons/0/00/Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.JPG class="thumbnail_not" target=_blank>
tail j=2233 line= <img src=/imgs/links_201901/tn/tn_Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.png border=0></span>
tail j=2234 line= </a>
tail j=2235 line= </h1>
tail j=2236 line= <br>
tail j=2237 line= <a href=https://en.wikipedia.org/wiki/American_Gothic class="thumbnail_not" target=_blank>
tail j=2238 line= <img src=/imgs/links_201901/tn/tn_Grant_Wood_-_American_Gothic_-_Google_Art_Project.png border=0>
tail j=2239 line= </a>
tail j=2240 line=
tail j=2241 line= <hr color=blue>
tail j=2242 line= <hr color=white>
tail j=2243 line= <hr color=red>
tail j=2244 line=
tail j=2245 line=
tail j=2246 line=
tail j=2247 line=
tail j=2248 line=
tail j=2249 line=
tail j=2250 line=
tail j=2251 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5320_jtfdc_eagle_n.JPG alt=jtfdc_eagle_n target=_blank>
tail j=2252 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0>
tail j=2253 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0></span>
tail j=2254 line= </a>
tail j=2255 line=
tail j=2256 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.jpg alt=jtfdc_original_notresspassing_willprosecuted target=_blank>
tail j=2257 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0>
tail j=2258 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0></span>
tail j=2259 line= </a>
tail j=2260 line=
tail j=2261 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5704_jtfdc_eagle_s.JPG alt=jtfdc_eagle_s target=_blank>
tail j=2262 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0>
tail j=2263 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0></span>
tail j=2264 line= </a>
tail j=2265 line=
tail j=2266 line= <a href=# class=thumbnail>
tail j=2267 line= <img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
tail j=2268 line= <span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
tail j=2269 line= </a>
tail j=2270 line=
tail j=2271 line= <a class="thumbnail" href="mailto:adminihe@ko0.us?subject=adminihe_what?">
tail j=2272 line= <img height=50 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0>
tail j=2273 line= <span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0></span>
tail j=2274 line= </a>
tail j=2275 line=
tail j=2276 line= <a href=# class=thumbnail>
tail j=2277 line= <img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" >
tail j=2278 line= <span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
tail j=2279 line= </a>
tail j=2280 line= <a class="thumbnail" href="mailto:adminishe@ko0.us?subject=adminishe_what?">
tail j=2281 line= <img class="drg" height=50 src="/imgs/links/email.gif" alt="adminiwii_what" border=0>
tail j=2282 line= <span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminiwii_what" border=0></span>
tail j=2283 line= </a>
tail j=2284 line=
tail j=2285 line=<br><br><br>
tail j=2286 line= <div id="drag">
tail j=2287 line= <div class="drg">
tail j=2288 line= <h3>us_med_rechtin</h3>
tail j=2289 line= <a class="thumbnail" href=/us/med/rechtin target=_blank>
tail j=2290 line= <img height=200 src=/imgs/us/tn/tn_med_rechtin.png border=0>
tail j=2291 line= <span><img height=400 src=/imgs/us/med_rechtin.png border=0></span>
tail j=2292 line= </a>
tail j=2293 line= </div>
tail j=2294 line= </div>
tail j=2295 line=<br><br><br>
tail j=2296 line=<br><br><br>
tail j=2297 line= <div id="drag" >
tail j=2298 line= <div class="drg" >
tail j=2299 line= <h3>jtfdc_defford_courtreport</h3>
tail j=2300 line= <a class="thumbnail" href=/imgs/links/jtfdc_defford_courtreport.jpg target=_blank>
tail j=2301 line= <img height=200 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0>
tail j=2302 line= <span><img height=400 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0></span>
tail j=2303 line= </a>
tail j=2304 line= </div>
tail j=2305 line= </div>
tail j=2306 line=
tail j=2307 line=
tail j=2308 line=
tail j=2309 line=
tail j=2310 line=
tail j=2311 line=
tail j=2312 line=
tail j=2313 line=
tail j=2314 line=
tail j=2315 line=<hr color=yellow>
tail j=2316 line=
tail j=2317 line= <a href="index_tl.html" class="thumbnail" target=_blank>
tail j=2318 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2319 line= <span><img src="/imgs/links/index_tl.png" alt="tl" width="300px" height="200px" border="0"></span>
tail j=2320 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="tl" width="200px" height="150px" border="0"></span> -->
tail j=2321 line= </a>
tail j=2322 line=
tail j=2323 line= <a class="thumbnail" href="index_sl.html" target=_blank>
tail j=2324 line= <img src="/imgs/btn/koeyeb.png" alt="sl" width="200px" height="100px" border="0">
tail j=2325 line= <span><img src="/imgs/links/index_sl.png" alt="sl" width="400px" height="300px" border="0"></span>
tail j=2326 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="sl" width="200px" height="150px" border="0"></span> -->
tail j=2327 line= </a>
tail j=2328 line=
tail j=2329 line= <a class="thumbnail" href="sl/index_slv.html" target=_blank>
tail j=2330 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2331 line= <span><img src="/imgs/links/index_slv.jpg" alt="slv" width="400px" height=300px" border="0"></span>
tail j=2332 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="slv" width="200px" height=150px" border="0"></span> -->
tail j=2333 line= </a>
tail j=2334 line=
tail j=2335 line= <a class="thumbnail" href="index_pn.html" target=_blank>
tail j=2336 line= <img src="/imgs/btn/koeyeb.png" alt="pn" width="200px" height="100px" border="0">
tail j=2337 line= <span><img src="/imgs/links/index_pn.jpg" alt="pn" width="400px" height="300px" border="0"></span>
tail j=2338 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="pn" width="200px" height="150px" border="0"></span> -->
tail j=2339 line= </a>
tail j=2340 line=
tail j=2341 line= <a class="thumbnail" href="index_zm.html" target=_blank>
tail j=2342 line= <img src="/imgs/btn/koeyew.png" alt="zm" width="200px" height="100px" border="0">
tail j=2343 line= <span><img src="/imgs/links/index_zm.png" alt="zm" width="400px" height="300px" border="0"></span>
tail j=2344 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="zm" width="200px" height="150px" border="0"></span> -->
tail j=2345 line= </a>
tail j=2346 line=
tail j=2347 line= <a class="thumbnail" href="index_dd.html" target=_blank>
tail j=2348 line= <img src="/imgs/btn/koeyeb.png" alt="dd" width="200px" height="100px" border="0">
tail j=2349 line= <span><img src="/imgs/links/index_dd.jpg" alt="dd" width="400px" height="300px" border="0"></span>
tail j=2350 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="dd" width="200px" height="150px" border="0"></span> -->
tail j=2351 line= </a>
tail j=2352 line=
tail j=2353 line= <a class="thumbnail" href="index_av.html" target=_blank>
tail j=2354 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2355 line= <span><img src="/imgs/links/index_av.jpg" alt="av" width="400px" height="300px" border="0"></span>
tail j=2356 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="av" width="200px" height="150px" border="0"></span> -->
tail j=2357 line= </a>
tail j=2358 line=
tail j=2359 line=
tail j=2360 line= <a class="thumbnail" href="index_vu.html" target=_blank>
tail j=2361 line= <img src="/imgs/btn/koeyeb.png" alt="vu" width="200px" height="100px" border="0">
tail j=2362 line= <span><img src="/imgs/links/index_vu.jpg" alt="vu" width="400px" height="300px" border="0"></span>
tail j=2363 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="vu" width="200px" height="150px" border="0"></span> -->
tail j=2364 line= </a>
tail j=2365 line=
tail j=2366 line=
tail j=2367 line=
tail j=2368 line=
tail j=2369 line=
tail j=2370 line=
tail j=2371 line=
tail j=2372 line= <hr color=red>
tail j=2373 line= <hr color=white>
tail j=2374 line=
tail j=2375 line=
tail j=2376 line=
tail j=2377 line=
tail j=2378 line=
tail j=2379 line=
tail j=2380 line=
tail j=2381 line=<!--
tail j=2382 line=
tail j=2383 line= <img v-on:click="showhidr" src="/tl/imgs/jtfdc_private_court_since_1979_viewin.png">
tail j=2384 line= <img v-on:click="showhide" src="/heart/heart.gif" alt="koeye.png" border=0>
tail j=2385 line= <span><img v-on:click="showhide" src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
tail j=2386 line= <img v-on:click="showhide" src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
tail j=2387 line= <button v-on:click="showhide">showhide</button>
tail j=2388 line= <button v-on:click="showhide">yokkmokk</button>
tail j=2389 line= -->
tail j=2390 line=
tail j=2391 line=
tail j=2392 line= <hr>
tail j=2393 line= </div>
tail j=2394 line=
tail j=2395 line= <div v-show="collapsed" class="detail">
tail j=2396 line= jaokim kopernicus wundersteine ii
tail j=2397 line=
tail j=2398 line= <hr>
tail j=2399 line= <a class="thumbnail" href=https://meet.jit.si/ko target=_blank>
tail j=2400 line= <img src=/imgs/links/tn/tn_meet_jkwii.png border=0>
tail j=2401 line= <span><img src=/imgs/links/meet_jkwii.png border=0></span>
tail j=2402 line= </a>
tail j=2403 line= <a class="thumbnail" href=./?q=jkwii4trustee target=_blank>
tail j=2404 line= <img src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
tail j=2405 line= <span><img src=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0></span>
tail j=2406 line= </a>
tail j=2407 line=
tail j=2408 line= <a class="thumbnail" href="/?q=unclesam">
tail j=2409 line= <img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
tail j=2410 line= <span> <img height=400 width=220 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
tail j=2411 line= </a>
tail j=2412 line=
tail j=2413 line=
tail j=2414 line= <a class="thumbnail" href=/ko_jtf/zm/jtf_parcels/jtfdc_012.html target=_blank>
tail j=2415 line= <img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
tail j=2416 line= <span> <img height=400 width=220 src="/tn_snap_20170123_110294.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
tail j=2417 line= </a>
tail j=2418 line=<!-- -->
tail j=2419 line= <a class="thumbnail" href="/?q=columgia">
tail j=2420 line= <img src="/imgs/btn/koeyew.png" alt="koeyew.png" width="200px" height="80" border="0" >
tail j=2421 line= <span> <img height=400 width=220 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
tail j=2422 line= </a>
tail j=2423 line= <a class="popover" href=./?q=handhither target=_blank>
tail j=2424 line= <img src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
tail j=2425 line= <span><img src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
tail j=2426 line= </a>
tail j=2427 line=
tail j=2428 line=<!--
tail j=2429 line= <h1>link_kludge</h1>
tail j=2430 line= <div id="link_kludge" >
tail j=2431 line= <a class="thumbnail" href="/?q=tn1">
tail j=2432 line= <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0">
tail j=2433 line= <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
tail j=2434 line=
tail j=2435 line= <a class="thumbnail" href="/?q=tn2">
tail j=2436 line= <img src="/imgs/btn/koeyew.png" alt="ok" width="50px" height="25px" border="0">
tail j=2437 line= <span><img src="/imgs/globes/globedragon.png" alt="globedragon"></span></a>
tail j=2438 line=
tail j=2439 line= <a class="thumbnail" href="/?q=tn2">
tail j=2440 line= <img src="/imgs/btn/koeyeb.png" alt="ok" width="50px" height="25px" border="0">
tail j=2441 line= <span><img src="/imgs/globes/globewrap.png" alt="globewrap"></span></a>
tail j=2442 line=
tail j=2443 line= <h1>overview</h1>
tail j=2444 line= <a class="thumbnail" href="/?q=overview"> <img src="/tl/imgs/tn/tn_construction_lights.gif" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/construction_lights.gif" alt="construction_lights"></span></a>
tail j=2445 line= <a class="thumbnail" href="/?q=ein_hundes_leben"> <img src="/tl/imgs/tn/tn_index_book-ein_hundes_leben.png" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/index_book-ein_hundes_leben.gif" alt="construction_lights"></span></a>
tail j=2446 line= <a class="thumbnail" href="/?q=deffords_charm"> <img src="/tl/imgs/tn/tn_tl_jtf28_jd.jpg" alt="deffords_charm" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_jtf28_jd.png" alt="deffords_charm"></span></a>
tail j=2447 line= <a class="thumbnail" href="/?q=jtf29_jak3busstop"> <img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop"></span></a>
tail j=2448 line= <a class="thumbnail" href="/?q=jtf29_pre_jtf31"> <img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31"></span></a>
tail j=2449 line= <a class="thumbnail" href="/?q=jtf29_private_court_since_1979_viewin"> <img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin"></span></a>
tail j=2450 line= <a class="thumbnail" href="/?q=jtfinc"> <img src="/tl/imgs/jtfinc.png" alt="jtfinc" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtfinc.png" alt="jtfinc"></span></a>
tail j=2451 line= <a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
tail j=2452 line= <a class="thumbnail" href="/?q=tl_kassil_walter_mil"> <img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter_mil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter"></span></a>
tail j=2453 line= <a class="thumbnail" href="/?q=tl_kassil_walter"> <img src="/tl/imgs/tl_kassil_mil.png" alt="tl_kassil_walter" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter.png" alt="tl_kassil_walter"></span></a>
tail j=2454 line= <a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
tail j=2455 line= <a class="thumbnail" href="/?q=tl_konet_text"> <img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text"></span></a>
tail j=2456 line= <a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
tail j=2457 line= <a class="thumbnail" href="/?q=iperms_hub"> <img src="/tl/imgs/img575.png" alt="iperms_hub" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms_hub.png" alt="iperms_hub"></span></a>
tail j=2458 line= <a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
tail j=2459 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot"></span></a>
tail j=2460 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones"></span></a>
tail j=2461 line= <a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye"></span></a>
tail j=2462 line= <a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc"></span></a>
tail j=2463 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief"></span></a>
tail j=2464 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2465 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2466 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2467 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2468 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2469 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0"> <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
tail j=2470 line= </div>
tail j=2471 line= -->
tail j=2472 line=
tail j=2473 line= </div>
tail j=2474 line= </div>
tail j=2475 line=
tail j=2476 line= <script id="script_new_vue">
tail j=2477 line= var app = new Vue({ el: "#app_jkwii",
tail j=2478 line= data: {
tail j=2479 line= collapsed: false
tail j=2480 line= },
tail j=2481 line= methods: {
tail j=2482 line= showhide: function() {
tail j=2483 line= if (!this.collapsed)
tail j=2484 line= this.collapsed = true;
tail j=2485 line= else
tail j=2486 line= this.collapsed = false;
tail j=2487 line= }
tail j=2488 line= }
tail j=2489 line= });
tail j=2490 line= </script id="script_new_vue">
tail j=2491 line=
tail j=2492 line=<!-- jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj -->
tail j=2493 line=
tail j=2494 line= <script id="script_resize" >
tail j=2495 line= document.body.style.fontfamily = "arial";
tail j=2496 line= function resizeText(multiplier) {
tail j=2497 line= if (document.body.style.fontSize == "") {
tail j=2498 line= document.body.style.fontSize = "1.0em";
tail j=2499 line= }
tail j=2500 line= document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
tail j=2501 line= }
tail j=2502 line= function refontText(multiplier) {
tail j=2503 line= if (document.body.style.fontSize == "") {
tail j=2504 line= document.body.style.fontSize = "2.0em";
tail j=2505 line= }
tail j=2506 line= document.body.style.font = "yokkmokkOT";
tail j=2507 line= }
tail j=2508 line= </script id="script_resize">
tail j=2509 line=<!--
tail j=2510 line= <img id="plustext" alt="Increase text size" height=50 src="/imgs/btn/kob.png" onclick="resizeText(1)" />
tail j=2511 line= < >
tail j=2512 line= <img id="minustext" alt="Decrease text size" height=50 src="/imgs/btn/kow.png" onclick="resizeText(-1)" />
tail j=2513 line= <img id="plusfont" alt="fontup" height=50 src="/imgs/btn/kob.png" onclick="refontText(1)" />
tail j=2514 line= < >
tail j=2515 line= <img id="minusfont" alt="fontdown" height=50 src="/imgs/btn/kow.png" onclick="refontText(-1)" />
tail j=2516 line= -->
tail j=2517 line= <hr>
tail j=2518 line= <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:48pt; font-style:italic" >
tail j=2519 line= abcdefghijklmnopqrstuvwxyz <br>
tail j=2520 line= ABCDEFGHIJKLMNOPQRSTUVWXYZ <br>
tail j=2521 line= 01234567890
tail j=2522 line= </font></span>
tail j=2523 line= <hr>
tail j=2524 line=
tail j=2525 line=<!-- <button type="kogrids" id="kogrids" onclick="kogrids('')">-= kogrids =-</button> -->
tail j=2526 line= <div id="div_kogrids"></div>
tail j=2527 line=
tail j=2528 line=
tail j=2529 line=<!--
tail j=2530 line= <div id="kov">
tail j=2531 line= <div>
tail j=2532 line= kov is it: kov
tail j=2533 line= </div>
tail j=2534 line= <button v-on:click="showhide_kov">showhide_kov</button>
tail j=2535 line= <img v-on:click="showhide_kov1" src="/imgs/btn/kob.png" >
tail j=2536 line= <img v-on:click="showhide_kov" src="/imgs/btn/koeye.png" >
tail j=2537 line= <img v-on:click="showhide_kov2" src="/imgs/btn/kow.png" >
tail j=2538 line=
tail j=2539 line= <div v-show="collapsed" class="detail">
tail j=2540 line= kov detail
tail j=2541 line= <hr>
tail j=2542 line= <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
tail j=2543 line= <img src=/imgs/links/tn/tn_meet.png border=0>
tail j=2544 line= <span><img src=/imgs/links/meet.png border=0></span>
tail j=2545 line= </a>
tail j=2546 line= <hr>
tail j=2547 line= </div>
tail j=2548 line= </div>
tail j=2549 line= <script id="script_new_vue_kov">
tail j=2550 line= var kov = new Vue({ el: "#kov",
tail j=2551 line= data: {collapsed: false},
tail j=2552 line= methods: {
tail j=2553 line= showhide_kov: function() {
tail j=2554 line= if (!this.collapsed) this.collapsed = true;
tail j=2555 line= else this.collapsed = false;
tail j=2556 line=// document.body.style.background = "darkslategrey";
tail j=2557 line=// document.body.style.color = "black";
tail j=2558 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2559 line=// document.body.style.fontsize = "24pt";
tail j=2560 line= },
tail j=2561 line= showhide_kov1: function() {
tail j=2562 line= if (!this.collapsed) this.collapsed = true;
tail j=2563 line= else this.collapsed = false;
tail j=2564 line= },
tail j=2565 line= showhide_kov2: function() {
tail j=2566 line= if (!this.collapsed) this.collapsed = true;
tail j=2567 line= else this.collapsed = false;
tail j=2568 line= }
tail j=2569 line= }
tail j=2570 line= });
tail j=2571 line= </script id="script_new_vue_kov">
tail j=2572 line=
tail j=2573 line= <hr>
tail j=2574 line=abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 01234567890
tail j=2575 line= <hr>
tail j=2576 line= -->
tail j=2577 line=
tail j=2578 line=
tail j=2579 line= <div id="kov_ko">
tail j=2580 line= <div>
tail j=2581 line= ko: kov_ko
tail j=2582 line= </div>
tail j=2583 line= <button v-on:click="showhide_kov_ko">showhide_kov_ko</button>
tail j=2584 line= <img v-on:click="showhide_kov_ko1" src="/imgs/btn/kob.png" >
tail j=2585 line= <img v-on:click="showhide_kov_ko" src="/imgs/btn/koeye.png" >
tail j=2586 line= <img v-on:click="showhide_kov_ko2" src="/imgs/btn/kow.png" >
tail j=2587 line=
tail j=2588 line= <div v-show="collapsed" class="detail_ko">
tail j=2589 line= ko
tail j=2590 line= <hr>
tail j=2591 line= <a href=kov_ko.html class="thumbnail" target=_blank>
tail j=2592 line= <img src=/imgs/kov/tn/tn_kov_ko.png border=0>
tail j=2593 line= <span><img src=/imgs/kov/tn/tn_kov_ko.png border=0></span>
tail j=2594 line= </a>
tail j=2595 line= <hr>
tail j=2596 line=
tail j=2597 line=
tail j=2598 line=
tail j=2599 line= <div id="drag" >
tail j=2600 line= <a class="popover" href="/?q=bigtn_drag1">
tail j=2601 line= <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
tail j=2602 line= <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
tail j=2603 line= </a>
tail j=2604 line= </div>
tail j=2605 line=
tail j=2606 line=
tail j=2607 line=
tail j=2608 line=<!--
tail j=2609 line= <div id="drop">
tail j=2610 line= <span id="sw"><h1>droptop</h2></span>
tail j=2611 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=2612 line= <img height=200 width=300
tail j=2613 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=2614 line= </a>
tail j=2615 line= </div>
tail j=2616 line= -->
tail j=2617 line=
tail j=2618 line=
tail j=2619 line=
tail j=2620 line= </div>
tail j=2621 line= </div>
tail j=2622 line=
tail j=2623 line=
tail j=2624 line=
tail j=2625 line= <div id="div_showhide" hidden>
tail j=2626 line= <button type="button" id="show">Show Content</button>
tail j=2627 line= <button type="button" id="hide">Hide Content</button>
tail j=2628 line= <button type="show_dd" id="show_dd">Show_dd</button>
tail j=2629 line= <button type="hide_dd" id="hide_dd">Hide_dd</button>
tail j=2630 line= <button type="show_bb" id="show_bb">Show_bb</button>
tail j=2631 line= <button type="hide_bb" id="hide_bb">Hide_bb</button>
tail j=2632 line= <button type="show_tl" id="show_tl">Show_tl</button>
tail j=2633 line= <button type="hide_tl" id="hide_tl">Hide_tl</button>
tail j=2634 line= <button type="show_colors" id="show_colors">Show_colors</button>
tail j=2635 line= <button type="hide_colors" id="hide_colors">Hide_colors</button>
tail j=2636 line= <button type="show_fonts" id="show_fonts">Show_fonts</button>
tail j=2637 line= <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
tail j=2638 line= <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
tail j=2639 line= <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
tail j=2640 line= </div>
tail j=2641 line=
tail j=2642 line= <div id="item" hidden>
tail j=2643 line= <hr><h1>div_showhide</h1><hr>
tail j=2644 line= </div>
tail j=2645 line=
tail j=2646 line= <script id="script_showhide">
tail j=2647 line= $( "#show" ).click(function() {$('#item').show(); });
tail j=2648 line= $( "#hide" ).click(function() {$('#item').hide();});
tail j=2649 line= $( "#show_dd" ).click(function() {$('#div_dd').show(); });
tail j=2650 line= $( "#hide_dd" ).click(function() {$('#div_dd').hide();});
tail j=2651 line= $( "#show_bb" ).click(function() {$('#div_bb').show(); });
tail j=2652 line= $( "#hide_bb" ).click(function() {$('#div_bb').hide();});
tail j=2653 line= $( "#show_tl" ).click(function() {$('#div_tl').show(); });
tail j=2654 line= $( "#hide_tl" ).click(function() {$('#div_tl').hide();});
tail j=2655 line= $( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
tail j=2656 line= $( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
tail j=2657 line= $( "#show_colors" ).click(function() {$('#div_colors').show(); });
tail j=2658 line= $( "#hide_colors" ).click(function() {$('#div_colors').hide();});
tail j=2659 line= $( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
tail j=2660 line= $( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
tail j=2661 line= $( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
tail j=2662 line= $( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
tail j=2663 line= </script id="script_showhide">
tail j=2664 line=
tail j=2665 line=
tail j=2666 line= </div>
tail j=2667 line= </div>
tail j=2668 line= </div>
tail j=2669 line=
tail j=2670 line= <script id="script_kov_ko" >
tail j=2671 line= var kov_ko = new Vue({ el: "#kov_ko",
tail j=2672 line= data: {collapsed: false},
tail j=2673 line= methods: {
tail j=2674 line= showhide_kov_ko: function() {
tail j=2675 line= if (!this.collapsed) this.collapsed = true;
tail j=2676 line= else this.collapsed = false;
tail j=2677 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=2678 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2679 line=
tail j=2680 line= },
tail j=2681 line= showhide_kov_ko1: function() {
tail j=2682 line= if (!this.collapsed) this.collapsed = true;
tail j=2683 line= else this.collapsed = false;
tail j=2684 line= },
tail j=2685 line= showhide_kov_ko2: function() {
tail j=2686 line= if (!this.collapsed) this.collapsed = true;
tail j=2687 line= else this.collapsed = false;
tail j=2688 line= }
tail j=2689 line= }
tail j=2690 line= });
tail j=2691 line= </script id="script_kov_ko" >
tail j=2692 line=
tail j=2693 line=
tail j=2694 line=
tail j=2695 line=
tail j=2696 line=
tail j=2697 line=
tail j=2698 line= <div id="kov_new">
tail j=2699 line= <div>
tail j=2700 line= new: kov_new
tail j=2701 line= </div>
tail j=2702 line= <button v-on:click="showhide_kov_new">showhide_kov_new</button>
tail j=2703 line= <img v-on:click="showhide_kov_new" src="/imgs/btn/koeye.png" >
tail j=2704 line= <img v-on:click="showhide_kov_new1" src="/imgs/btn/kob.png" >
tail j=2705 line= <img v-on:click="showhide_kov_new2" src="/imgs/btn/kow.png" >
tail j=2706 line=
tail j=2707 line= <div v-show="collapsed" class="detail_new">
tail j=2708 line= new
tail j=2709 line= <hr>
tail j=2710 line= <a href=https://meet.jit.si/new class="thumbnail" target=_blank>
tail j=2711 line= <img src=/imgs/links/tn/tn_meet_new.png border=0>
tail j=2712 line= <span><img src=/imgs/links/tn/tn_meet_new.png border=0></span>
tail j=2713 line= </a>
tail j=2714 line=
tail j=2715 line=
tail j=2716 line= <hr color=yellow>
tail j=2717 line= <h1>atwist_page</h1>
tail j=2718 line= <div id="container" class="">
tail j=2719 line= <div class="box"></div>
tail j=2720 line= <div class="box-back"></div>
tail j=2721 line= </div>
tail j=2722 line=
tail j=2723 line=
tail j=2724 line= <button id="animate" class="kogo">kogo</button>
tail j=2725 line= <script id="script_atwist_page">
tail j=2726 line= var goButton = document.getElementById("animate");
tail j=2727 line= var container = document.getElementById("container");
tail j=2728 line= goButton.addEventListener('click', function() {
tail j=2729 line= container.classList.toggle('active');
tail j=2730 line= });
tail j=2731 line= </script id="script_atwist_page">
tail j=2732 line=
tail j=2733 line= <hr color=yellow>
tail j=2734 line=
tail j=2735 line=
tail j=2736 line=
tail j=2737 line=
tail j=2738 line=
tail j=2739 line=<a id="drag" class="thumbnail" href="/index_zm.html?zmid=zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility" target=_blank>
tail j=2740 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility/TileGroup0/0-0-0.jpg" border=0>
tail j=2741 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_donovanlaw_containment_facility.png" border=0></span>
tail j=2742 line= </a>
tail j=2743 line=
tail j=2744 line=<a id="drag" class="thumbnail" href="/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus" target=_blank>
tail j=2745 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus/TileGroup0/0-0-0.jpg" border=0>
tail j=2746 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_byrdpuckers_dogpony_campus.png" border=0></span>
tail j=2747 line= </a>
tail j=2748 line=
tail j=2749 line=<a id="drag" class="popover" href=/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_kou_campus target=_blank>
tail j=2750 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_kou_campus/TileGroup0/0-0-0.jpg" border=0>
tail j=2751 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_kou_campus.png" border=0></span>
tail j=2752 line= </a>
tail j=2753 line=
tail j=2754 line=<img src="/imgs/links/eyes_023.gif">
tail j=2755 line=
tail j=2756 line=
tail j=2757 line=
tail j=2758 line=
tail j=2759 line=
tail j=2760 line= </div>
tail j=2761 line= </div>
tail j=2762 line=
tail j=2763 line= <script id="script_kov_new">
tail j=2764 line= var kov_new = new Vue({ el: "#kov_new",
tail j=2765 line= data: {collapsed: false},
tail j=2766 line= methods: {
tail j=2767 line= showhide_kov_new: function() {
tail j=2768 line= if (!this.collapsed) this.collapsed = true;
tail j=2769 line= else this.collapsed = false;
tail j=2770 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=2771 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2772 line=
tail j=2773 line=// document.body.style.background = "darkslategrey";
tail j=2774 line=// document.body.style.color = "black";
tail j=2775 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2776 line=// document.body.style.fontsize = "24pt";
tail j=2777 line= },
tail j=2778 line= showhide_kov_new1: function() {
tail j=2779 line= if (!this.collapsed) this.collapsed = true;
tail j=2780 line= else this.collapsed = false;
tail j=2781 line= },
tail j=2782 line= showhide_kov_new2: function() {
tail j=2783 line= if (!this.collapsed) this.collapsed = true;
tail j=2784 line= else this.collapsed = false;
tail j=2785 line= }
tail j=2786 line= }
tail j=2787 line= });
tail j=2788 line= </script id="script_kov_new">
tail j=2789 line=
tail j=2790 line=
tail j=2791 line= <div id="div_kov_focus">
tail j=2792 line= <div>
tail j=2793 line= focus: kov_focus
tail j=2794 line= </div>
tail j=2795 line= <button v-on:click="showhide_kov_focus">showhide_kov_focus</button>
tail j=2796 line= <img v-on:click="showhide_kov_focus" src="/imgs/btn/koeye.png" >
tail j=2797 line= <img v-on:click="showhide_kov_focus1" src="/imgs/btn/kob.png" >
tail j=2798 line= <img v-on:click="showhide_kov_focus2" src="/imgs/btn/kow.png" >
tail j=2799 line=
tail j=2800 line= <div v-show="collapsed" class="detail_focus">
tail j=2801 line= focus2
tail j=2802 line= <hr>
tail j=2803 line= <a href=https://meet.jit.si/focus class="thumbnail" target=_blank>
tail j=2804 line= <img height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=2805 line= <span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=2806 line= </a>
tail j=2807 line= <hr>
tail j=2808 line=
tail j=2809 line= <a href=/imgs/links/warning_light.gif id="drag" target=_blank>
tail j=2810 line= <img class="drg" height=200 src=/imgs/links/warning_light.gif border=0>
tail j=2811 line= </a>
tail j=2812 line=
tail j=2813 line= <div id="drag">
tail j=2814 line= <div class="drg">
tail j=2815 line= <h3>preview_deck_rocksoup</h3>
tail j=2816 line= <div id="div_deck_rocksoup">
tail j=2817 line= <a class="popover" href=http://ka12/index_dk.html#rocksoup alt=index_dk_rocksoup target=_blank>
tail j=2818 line= <img width=200 height=200 src=imgs/links/rocksoup_rock.png alt=rocksoup_rock border=0>
tail j=2819 line= <span><img width=200 height=200 src=/imgs/links/rocksoup_pot.png alt=rocksoup_pot border=0></span>
tail j=2820 line= </a>
tail j=2821 line= </div>
tail j=2822 line= </div>
tail j=2823 line= </div>
tail j=2824 line=
tail j=2825 line=
tail j=2826 line=
tail j=2827 line= <a id="drag" class="thumbnail" href="svc/emchat/index.html" target=_blank>
tail j=2828 line= <img class="drg" src="/imgs/links/links_emchat.png" border=0>
tail j=2829 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_emchat.png" border=0></span>
tail j=2830 line= </a>
tail j=2831 line=
tail j=2832 line= <a id="drag" class="thumbnail" href="svc/ol/ht/index.html" target=_blank>
tail j=2833 line= <img class="drg" src="/imgs/links/links_ol.png" border=0>
tail j=2834 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_ol.png" border=0></span>
tail j=2835 line= </a>
tail j=2836 line=
tail j=2837 line=<!--
tail j=2838 line= <button type="button" onclick="script_ajax()">ajax</button>
tail j=2839 line= <img src="/imgs/btn/koeye_handhi.gif" onclick="script_ajax()">
tail j=2840 line= <div id="div_ajaxdb"><h2>div_ajaxdb</h2></div>
tail j=2841 line= -->
tail j=2842 line=
tail j=2843 line= </div>
tail j=2844 line= </div id="div_kov_focus">
tail j=2845 line=
tail j=2846 line= <script id="script_kov_focus" >
tail j=2847 line= var kov_focus = new Vue({ el: "#kov_focus",
tail j=2848 line= data: {collapsed: false},
tail j=2849 line= methods: {
tail j=2850 line= showhide_kov_focus: function() {
tail j=2851 line= if (!this.collapsed) this.collapsed = true;
tail j=2852 line= else this.collapsed = false;
tail j=2853 line= document.getElementById("kov_focus").style.font = "italic bold 20px arial,serif";
tail j=2854 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2855 line=
tail j=2856 line=// document.body.style.background = "darkslategrey";
tail j=2857 line=// document.body.style.color = "black";
tail j=2858 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2859 line=// document.body.style.fontsize = "24pt";
tail j=2860 line= },
tail j=2861 line= showhide_kov_focus1: function() {
tail j=2862 line= if (!this.collapsed) this.collapsed = true;
tail j=2863 line= else this.collapsed = false;
tail j=2864 line= },
tail j=2865 line= showhide_kov_focus2: function() {
tail j=2866 line= if (!this.collapsed) this.collapsed = true;
tail j=2867 line= else this.collapsed = false;
tail j=2868 line= }
tail j=2869 line= }
tail j=2870 line= });
tail j=2871 line= </script id="script_kov_focus" >
tail j=2872 line=
tail j=2873 line=
tail j=2874 line=
tail j=2875 line=
tail j=2876 line=
tail j=2877 line= <div id="kov_food">
tail j=2878 line= <div>
tail j=2879 line= kov_food:
tail j=2880 line= </div>
tail j=2881 line= <button v-on:click="showhide_kov_food">showhide_kov_food</button>
tail j=2882 line= <img v-on:click="showhide_kov_food" src="/imgs/btn/koeye.png" >
tail j=2883 line= <img v-on:click="showhide_kov_food1" src="/imgs/btn/kob.png" >
tail j=2884 line= <img v-on:click="showhide_kov_food2" src="/imgs/btn/kow.png" >
tail j=2885 line=
tail j=2886 line= <div v-show="collapsed" class="detail_food">
tail j=2887 line= kov_food
tail j=2888 line= <div id="drag"> kov_food:<br />
tail j=2889 line= <a href=kov_food.html class="thumbnail" target=_blank>
tail j=2890 line= <img class="drg" src="/imgs/kov/tn/tn_kov_food.png" alt="kov_food" width="50" class="drg"/>
tail j=2891 line= <span><img class="drg" src="/imgs/kov/kov_food.png" alt="kov_food" width="50" class="drg"/></span>
tail j=2892 line= </a>
tail j=2893 line= </div>
tail j=2894 line=
tail j=2895 line=
tail j=2896 line= </div>
tail j=2897 line= </div>
tail j=2898 line=
tail j=2899 line= <script>var kov_food = new Vue({ el: "#kov_food",
tail j=2900 line= data: {collapsed: false},
tail j=2901 line= methods: {
tail j=2902 line= showhide_kov_food: function() {
tail j=2903 line= if (!this.collapsed) this.collapsed = true;
tail j=2904 line= else this.collapsed = false;
tail j=2905 line= document.getElementById("kov_food").style.font = "italic bold 20px arial,serif";
tail j=2906 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2907 line=
tail j=2908 line=// document.body.style.background = "darkslategrey";
tail j=2909 line=// document.body.style.color = "black";
tail j=2910 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2911 line=// document.body.style.fontsize = "24pt";
tail j=2912 line= },
tail j=2913 line= showhide_kov_food1: function() {
tail j=2914 line= if (!this.collapsed) this.collapsed = true;
tail j=2915 line= else this.collapsed = false;
tail j=2916 line= },
tail j=2917 line= showhide_kov_food2: function() {
tail j=2918 line= if (!this.collapsed) this.collapsed = true;
tail j=2919 line= else this.collapsed = false;
tail j=2920 line= }
tail j=2921 line= }
tail j=2922 line= });
tail j=2923 line= </script>
tail j=2924 line=
tail j=2925 line=
tail j=2926 line=
tail j=2927 line=
tail j=2928 line= <div id="kov_courtreport">
tail j=2929 line= <div>
tail j=2930 line= kov_courtreport:
tail j=2931 line= </div>
tail j=2932 line= <button v-on:click="showhide_kov_courtreport">showhide_kov_courtreport</button>
tail j=2933 line= <img v-on:click="showhide_kov_courtreport" src="/imgs/btn/koeye.png" >
tail j=2934 line= <img v-on:click="showhide_kov_courtreport1" src="/imgs/btn/kob.png" >
tail j=2935 line= <img v-on:click="showhide_kov_courtreport2" src="/imgs/btn/kow.png" >
tail j=2936 line=
tail j=2937 line= <div v-show="collapsed" class="detail_courtreport">
tail j=2938 line= kov_courtreport
tail j=2939 line= <div id="drag"> kov_courtreport:<br />
tail j=2940 line= <a href=kov_food.html class="thumbnail" target=_blank>
tail j=2941 line= <img class="drg" src="/imgs/kov/tn/tn_kov_courtreport.png" alt="kov_food" width="50" class="drg"/>
tail j=2942 line= <span><img class="drg" src="/imgs/kov/kov_courtreport.png" alt="kov_food" width="50" class="drg"/></span>
tail j=2943 line= </a>
tail j=2944 line= </div>
tail j=2945 line=
tail j=2946 line= </div>
tail j=2947 line= </div>
tail j=2948 line=
tail j=2949 line= <script>var kov_courtreport = new Vue({ el: "#kov_courtreport",
tail j=2950 line= data: {collapsed: false},
tail j=2951 line= methods: {
tail j=2952 line= showhide_kov_courtreport: function() {
tail j=2953 line= if (!this.collapsed) this.collapsed = true;
tail j=2954 line= else this.collapsed = false;
tail j=2955 line= document.getElementById("kov_courtreport").style.font = "italic bold 20px arial,serif";
tail j=2956 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2957 line=
tail j=2958 line=// document.body.style.background = "darkslategrey";
tail j=2959 line=// document.body.style.color = "black";
tail j=2960 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2961 line=// document.body.style.fontsize = "24pt";
tail j=2962 line= },
tail j=2963 line= showhide_kov_courtreport1: function() {
tail j=2964 line= if (!this.collapsed) this.collapsed = true;
tail j=2965 line= else this.collapsed = false;
tail j=2966 line= },
tail j=2967 line= showhide_kov_courtreport2: function() {
tail j=2968 line= if (!this.collapsed) this.collapsed = true;
tail j=2969 line= else this.collapsed = false;
tail j=2970 line= }
tail j=2971 line= }
tail j=2972 line= });
tail j=2973 line= </script>
tail j=2974 line=
tail j=2975 line=
tail j=2976 line=
tail j=2977 line=
tail j=2978 line= <div id="kov_where">
tail j=2979 line= <div>
tail j=2980 line= kov_where:
tail j=2981 line= </div>
tail j=2982 line= <button v-on:click="showhide_kov_where">showhide_kov_where</button>
tail j=2983 line= <img v-on:click="showhide_kov_where" src="/imgs/btn/koeye.png" >
tail j=2984 line= <img v-on:click="showhide_kov_where1" src="/imgs/btn/kob.png" >
tail j=2985 line= <img v-on:click="showhide_kov_where2" src="/imgs/btn/kow.png" >
tail j=2986 line=
tail j=2987 line= <div v-show="collapsed" class="detail_where">
tail j=2988 line=
tail j=2989 line= where
tail j=2990 line= <hr color=yellow>
tail j=2991 line=
tail j=2992 line= <a id="drag" class="thumbnail" href="/svc/ol/ht/index.html" target=_blank>
tail j=2993 line= <img class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0>
tail j=2994 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0></span>
tail j=2995 line= </a>
tail j=2996 line=
tail j=2997 line=
tail j=2998 line= <div id="div_gigapan" id="drag" >
tail j=2999 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
tail j=3000 line= <img class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
tail j=3001 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
tail j=3002 line= </a>
tail j=3003 line=
tail j=3004 line=
tail j=3005 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com" target=_blank>
tail j=3006 line= <img height=200 class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0>
tail j=3007 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0></span>
tail j=3008 line= </a>
tail j=3009 line= </div>
tail j=3010 line=
tail j=3011 line=
tail j=3012 line=
tail j=3013 line= <div id="drag"> where:<br />
tail j=3014 line=
tail j=3015 line=<!--
tail j=3016 line= <a href=https://meet.jit.si/where class="thumbnail" target=_blank>
tail j=3017 line= <img height=100 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=3018 line= <span><img height=200 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/></span>
tail j=3019 line= </a>
tail j=3020 line= -->
tail j=3021 line=
tail j=3022 line=<!--
tail j=3023 line= <div class="drg"><h1>konet llc </h1>
tail j=3024 line= <pre>timejask jkwii</pre>
tail j=3025 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=3026 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=3027 line= <pre>timesak where</pre>
tail j=3028 line= </div>
tail j=3029 line= -->
tail j=3030 line=
tail j=3031 line= <div class="drg"><h1>jitsimeet/where </h1>
tail j=3032 line= <a href="https://jit.si.meee/where" id="drag" targer=_blank class="thumbnail">
tail j=3033 line= <img height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=3034 line= <span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=3035 line= </a>
tail j=3036 line= </div>
tail j=3037 line=
tail j=3038 line= <div id="drag"> where:<br />
tail j=3039 line= <a class="drg" href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
tail j=3040 line= <img height=200 src=/imgs/links/warning_light.gif border=0>
tail j=3041 line= <span><img src=/links/warning_light.gif border=0></span>
tail j=3042 line= </a>
tail j=3043 line= </div>
tail j=3044 line= </div>
tail j=3045 line= </div>
tail j=3046 line= <hr>
tail j=3047 line=
tail j=3048 line=
tail j=3049 line=
tail j=3050 line=
tail j=3051 line=
tail j=3052 line= </div>
tail j=3053 line= </div>
tail j=3054 line=
tail j=3055 line= <script>var kov_where = new Vue({ el: "#kov_where",
tail j=3056 line= data: {collapsed: false},
tail j=3057 line= methods: {
tail j=3058 line= showhide_kov_where: function() {
tail j=3059 line= if (!this.collapsed) this.collapsed = true;
tail j=3060 line= else this.collapsed = false;
tail j=3061 line= document.getElementById("kov_where").style.font = "italic bold 20px arial,serif";
tail j=3062 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3063 line=
tail j=3064 line=// document.body.style.background = "darkslategrey";
tail j=3065 line=// document.body.style.color = "black";
tail j=3066 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3067 line=// document.body.style.fontsize = "24pt";
tail j=3068 line= },
tail j=3069 line= showhide_kov_where1: function() {
tail j=3070 line= if (!this.collapsed) this.collapsed = true;
tail j=3071 line= else this.collapsed = false;
tail j=3072 line= },
tail j=3073 line= showhide_kov_where2: function() {
tail j=3074 line= if (!this.collapsed) this.collapsed = true;
tail j=3075 line= else this.collapsed = false;
tail j=3076 line= }
tail j=3077 line= }
tail j=3078 line= });
tail j=3079 line= </script>
tail j=3080 line=
tail j=3081 line=
tail j=3082 line=
tail j=3083 line=
tail j=3084 line=
tail j=3085 line=
tail j=3086 line=
tail j=3087 line=
tail j=3088 line=
tail j=3089 line=
tail j=3090 line=
tail j=3091 line=
tail j=3092 line=
tail j=3093 line=
tail j=3094 line=
tail j=3095 line=
tail j=3096 line=
tail j=3097 line= <div id="kov_work">
tail j=3098 line= <div>
tail j=3099 line= kov_work:
tail j=3100 line= </div>
tail j=3101 line= <button v-on:click="showhide_kov_work">showhide_kov_work</button>
tail j=3102 line= <img v-on:click="showhide_kov_work" src="/imgs/btn/koeye.png" >
tail j=3103 line= <img v-on:click="showhide_kov_work1" src="/imgs/btn/kob.png" >
tail j=3104 line= <img v-on:click="showhide_kov_work2" src="/imgs/btn/kow.png" >
tail j=3105 line=
tail j=3106 line= <div v-show="collapsed" class="detail_work">
tail j=3107 line= kov_work
tail j=3108 line= <div id="drag"> kov_work:<br />
tail j=3109 line= <a href=kov_work.html class="thumbnail" target=_blank>
tail j=3110 line= <img class="drg" src="/imgs/kov/tn/tn_kov_work.png" alt="kov_food" width="50" class="drg"/>
tail j=3111 line= <span><img class="drg" src="/imgs/kov/kov_work.png" alt="kov_food" width="50" class="drg"/></span>
tail j=3112 line= </a>
tail j=3113 line= </div>
tail j=3114 line=
tail j=3115 line=
tail j=3116 line= </div>
tail j=3117 line= </div>
tail j=3118 line=
tail j=3119 line= <script>var kov = new Vue({ el: "#kov_work",
tail j=3120 line= data: {collapsed: false},
tail j=3121 line= methods: {
tail j=3122 line= showhide_kov_work: function() {
tail j=3123 line= if (!this.collapsed) this.collapsed = true;
tail j=3124 line= else this.collapsed = false;
tail j=3125 line=// document.body.style.background = "darkslategrey";
tail j=3126 line=// document.body.style.color = "black";
tail j=3127 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3128 line=// document.body.style.fontsize = "24pt";
tail j=3129 line= },
tail j=3130 line= showhide_kov_work1: function() {
tail j=3131 line= if (!this.collapsed) this.collapsed = true;
tail j=3132 line= else this.collapsed = false;
tail j=3133 line= },
tail j=3134 line= showhide_kov_work2: function() {
tail j=3135 line= if (!this.collapsed) this.collapsed = true;
tail j=3136 line= else this.collapsed = false;
tail j=3137 line= }
tail j=3138 line= }
tail j=3139 line= });
tail j=3140 line= </script>
tail j=3141 line=
tail j=3142 line=
tail j=3143 line=
tail j=3144 line= <div id="kov_memes">
tail j=3145 line= <div>
tail j=3146 line= memes: kov_memes
tail j=3147 line= </div>
tail j=3148 line= <button v-on:click="showhide_kov_memes">showhide_kov_memes</button>
tail j=3149 line= <img v-on:click="showhide_kov_memes" src="/imgs/btn/koeye.png" >
tail j=3150 line= <img v-on:click="showhide_kov_memes1" src="/imgs/btn/kob.png" >
tail j=3151 line= <img v-on:click="showhide_kov_memes2" src="/imgs/btn/kow.png" >
tail j=3152 line=
tail j=3153 line= <div v-show="collapsed" class="detail_memes">
tail j=3154 line= kov_memes
tail j=3155 line= <div id="drag"> kov_memes:<br />
tail j=3156 line= <a href=kov_memes.html class="thumbnail" target=_blank>
tail j=3157 line= <img class="drg" src="/imgs/kov/tn/tn_kov_memes.png" alt="kov_food" width="50" class="drg"/>
tail j=3158 line= <span><img class="drg" src="/imgs/kov/kov_memes.png" alt="kov_food" width="50" class="drg"/></span>
tail j=3159 line= </a>
tail j=3160 line= </div>
tail j=3161 line=
tail j=3162 line= </div>
tail j=3163 line= </div>
tail j=3164 line=
tail j=3165 line= <script>var kov_memes = new Vue({ el: "#kov_memes",
tail j=3166 line= data: {collapsed: false},
tail j=3167 line= methods: {
tail j=3168 line= showhide_kov_memes: function() {
tail j=3169 line= if (!this.collapsed) this.collapsed = true;
tail j=3170 line= else this.collapsed = false;
tail j=3171 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3172 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3173 line=
tail j=3174 line=// document.body.style.background = "darkslategrey";
tail j=3175 line=// document.body.style.color = "black";
tail j=3176 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3177 line=// document.body.style.fontsize = "24pt";
tail j=3178 line= },
tail j=3179 line= showhide_kov_memes1: function() {
tail j=3180 line= if (!this.collapsed) this.collapsed = true;
tail j=3181 line= else this.collapsed = false;
tail j=3182 line= },
tail j=3183 line= showhide_kov_memes2: function() {
tail j=3184 line= if (!this.collapsed) this.collapsed = true;
tail j=3185 line= else this.collapsed = false;
tail j=3186 line= }
tail j=3187 line= }
tail j=3188 line= });
tail j=3189 line= </script>
tail j=3190 line=
tail j=3191 line=
tail j=3192 line= <div id="kov_kids">
tail j=3193 line= <div>
tail j=3194 line= kids: kov_kids
tail j=3195 line= </div>
tail j=3196 line= <button v-on:click="showhide_kov_kids">showhide_kov_kids</button>
tail j=3197 line= <img v-on:click="showhide_kov_kids" src="/imgs/btn/koeye.png" >
tail j=3198 line= <img v-on:click="showhide_kov_kids1" src="/imgs/btn/kob.png" >
tail j=3199 line= <img v-on:click="showhide_kov_kids2" src="/imgs/btn/kow.png" >
tail j=3200 line=
tail j=3201 line= <div v-show="collapsed" class="detail_kids">
tail j=3202 line= kov_kids
tail j=3203 line= <div id="drag"> kov_kids:<br />
tail j=3204 line= <a href=kov_kids.html class="thumbnail" target=_blank>
tail j=3205 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kids.png" alt="kov_food" width="200" class="drg"/>
tail j=3206 line= <span><img class="drg" src="/imgs/kov/kov_kids.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3207 line= </a>
tail j=3208 line=
tail j=3209 line=
tail j=3210 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
tail j=3211 line= <img class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
tail j=3212 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
tail j=3213 line= </a>
tail j=3214 line=
tail j=3215 line=
tail j=3216 line= <a href=/ko/svc/js/stemkoskijs/Three.js/Voxel-Painter.html class="thumbnail" target=_blank>
tail j=3217 line= <img height =200 src="/imgs/links/tn/tn_voxelpainter.png">
tail j=3218 line= <span><img height=400 src="/imgs/links/tn/tn_voxelpainter.png"></span>
tail j=3219 line= </a>
tail j=3220 line=
tail j=3221 line= <a href=/ko/svc/js/stemkoskijs/Three.js/ class="thumbnail" target=_blank>
tail j=3222 line= <img height =200 src="/imgs/links/tn/tn_stemkoskijs.png">
tail j=3223 line= <span><img height=400 src="/imgs/links/tn/tn_stemkoskijs.png"></span>
tail j=3224 line= </a>
tail j=3225 line=
tail j=3226 line= <a href=ko/svc/js/stemkoskijs/Three.js/ target=_blank>
tail j=3227 line=
tail j=3228 line= </a>
tail j=3229 line=
tail j=3230 line=
tail j=3231 line= </div>
tail j=3232 line= </div>
tail j=3233 line=
tail j=3234 line=<!--
tail j=3235 line=harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
tail j=3236 line=morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
tail j=3237 line=morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
tail j=3238 line=harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
tail j=3239 line=georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
tail j=3240 line= -->
tail j=3241 line=
tail j=3242 line=
tail j=3243 line=
tail j=3244 line= </div>
tail j=3245 line=
tail j=3246 line= </a>
tail j=3247 line=
tail j=3248 line=
tail j=3249 line= </div>
tail j=3250 line= </div>
tail j=3251 line=
tail j=3252 line=<!--
tail j=3253 line=harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
tail j=3254 line=morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
tail j=3255 line=morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
tail j=3256 line=harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
tail j=3257 line=georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
tail j=3258 line= -->
tail j=3259 line=
tail j=3260 line=
tail j=3261 line=
tail j=3262 line= </div>
tail j=3263 line= </div>
tail j=3264 line=
tail j=3265 line= <script>var kov_kids = new Vue({ el: "#kov_kids",
tail j=3266 line= data: {collapsed: false},
tail j=3267 line= methods: {
tail j=3268 line= showhide_kov_kids: function() {
tail j=3269 line= if (!this.collapsed) this.collapsed = true;
tail j=3270 line= else this.collapsed = false;
tail j=3271 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3272 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3273 line=
tail j=3274 line=// document.body.style.background = "darkslategrey";
tail j=3275 line=// document.body.style.color = "black";
tail j=3276 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3277 line=// document.body.style.fontsize = "24pt";
tail j=3278 line= },
tail j=3279 line= showhide_kov_kids1: function() {
tail j=3280 line= if (!this.collapsed) this.collapsed = true;
tail j=3281 line= else this.collapsed = false;
tail j=3282 line= },
tail j=3283 line= showhide_kov_kids2: function() {
tail j=3284 line= if (!this.collapsed) this.collapsed = true;
tail j=3285 line= else this.collapsed = false;
tail j=3286 line= }
tail j=3287 line= }
tail j=3288 line= });
tail j=3289 line= </script>
tail j=3290 line=
tail j=3291 line=
tail j=3292 line=
tail j=3293 line=
tail j=3294 line=
tail j=3295 line=
tail j=3296 line= <div id="kov_dogs">
tail j=3297 line= <div>
tail j=3298 line= dogs: kov_dogs
tail j=3299 line= </div>
tail j=3300 line= <button v-on:click="showhide_kov_dogs">showhide_kov_dogs</button>
tail j=3301 line= <img v-on:click="showhide_kov_dogs" src="/imgs/btn/koeye.png" >
tail j=3302 line= <img v-on:click="showhide_kov_dogs1" src="/imgs/btn/kob.png" >
tail j=3303 line= <img v-on:click="showhide_kov_dogs2" src="/imgs/btn/kow.png" >
tail j=3304 line=
tail j=3305 line= <div v-show="collapsed" class="detail_dogs">
tail j=3306 line= kov_dogs
tail j=3307 line= <div id="drag"> kov_dogs:<br />
tail j=3308 line= <a href=kov_dogs.html class="thumbnail" target=_blank>
tail j=3309 line= <img class="drg" src="/imgs/kov/tn/tn_kov_dogs.png" alt="kov_food" width="200" class="drg"/>
tail j=3310 line= <span><img class="drg" src="/imgs/kov/kov_dogs.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3311 line= </a>
tail j=3312 line= </div>
tail j=3313 line=
tail j=3314 line= <a href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
tail j=3315 line= <img height=200 src=/imgs/links/warning_light.gif border=0>
tail j=3316 line= <span><img src=/links/warning_light.gif border=0></span>
tail j=3317 line= </a>
tail j=3318 line=
tail j=3319 line=<!-- kov_dogs_end -->
tail j=3320 line= </div>
tail j=3321 line= </div>
tail j=3322 line=
tail j=3323 line= <script>var kov_dogs = new Vue({ el: "#kov_dogs",
tail j=3324 line= data: {collapsed: false},
tail j=3325 line= methods: {
tail j=3326 line= showhide_kov_dogs: function() {
tail j=3327 line= if (!this.collapsed) this.collapsed = true;
tail j=3328 line= else this.collapsed = false;
tail j=3329 line= document.getElementById("kov_dogs").style.font = "italic bold 20px arial,serif";
tail j=3330 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3331 line=
tail j=3332 line=// document.body.style.background = "darkslategrey";
tail j=3333 line=// document.body.style.color = "black";
tail j=3334 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3335 line=// document.body.style.fontsize = "24pt";
tail j=3336 line= },
tail j=3337 line= showhide_kov_dogs1: function() {
tail j=3338 line= if (!this.collapsed) this.collapsed = true;
tail j=3339 line= else this.collapsed = false;
tail j=3340 line= },
tail j=3341 line= showhide_kov_dogs2: function() {
tail j=3342 line= if (!this.collapsed) this.collapsed = true;
tail j=3343 line= else this.collapsed = false;
tail j=3344 line= }
tail j=3345 line= }
tail j=3346 line= });
tail j=3347 line= </script>
tail j=3348 line=
tail j=3349 line=
tail j=3350 line= <div id="kov_preserve">
tail j=3351 line= <div>
tail j=3352 line= preserve: kov_preserve
tail j=3353 line= </div>
tail j=3354 line= <button v-on:click="showhide_kov_preserve">showhide_kov_preserve</button>
tail j=3355 line= <img v-on:click="showhide_kov_preserve" src="/imgs/btn/koeye.png" >
tail j=3356 line= <img v-on:click="showhide_kov_preserve1" src="/imgs/btn/kob.png" >
tail j=3357 line= <img v-on:click="showhide_kov_preserve2" src="/imgs/btn/kow.png" >
tail j=3358 line=
tail j=3359 line= <div v-show="collapsed" class="detail_preserve">
tail j=3360 line= <div id="drag"> kov_preserve:<br />
tail j=3361 line= <a href=kov_preserve.html class="thumbnail" target=_blank>
tail j=3362 line= <img class="drg" src="/imgs/kov/tn/tn_kov_preserve.png" alt="kov_food" width="200" class="drg"/>
tail j=3363 line= <span><img class="drg" src="/imgs/kov/kov_preserve.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3364 line= </a>
tail j=3365 line= </div>
tail j=3366 line=
tail j=3367 line=
tail j=3368 line= </div>
tail j=3369 line= </div>
tail j=3370 line=
tail j=3371 line= <script>var kov_preserve = new Vue({ el: "#kov_preserve",
tail j=3372 line= data: {collapsed: false},
tail j=3373 line= methods: {
tail j=3374 line= showhide_kov_preserve: function() {
tail j=3375 line= if (!this.collapsed) this.collapsed = true;
tail j=3376 line= else this.collapsed = false;
tail j=3377 line= document.getElementById("kov_preserve").style.font = "italic bold 20px arial,serif";
tail j=3378 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3379 line=
tail j=3380 line=// document.body.style.background = "darkslategrey";
tail j=3381 line=// document.body.style.color = "black";
tail j=3382 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3383 line=// document.body.style.fontsize = "24pt";
tail j=3384 line= },
tail j=3385 line= showhide_kov_preserve1: function() {
tail j=3386 line= if (!this.collapsed) this.collapsed = true;
tail j=3387 line= else this.collapsed = false;
tail j=3388 line= },
tail j=3389 line= showhide_kov_preserve2: function() {
tail j=3390 line= if (!this.collapsed) this.collapsed = true;
tail j=3391 line= else this.collapsed = false;
tail j=3392 line= }
tail j=3393 line= }
tail j=3394 line= });
tail j=3395 line= </script>
tail j=3396 line=
tail j=3397 line=
tail j=3398 line=
tail j=3399 line= <div id="kov_protect">
tail j=3400 line= <div>
tail j=3401 line= protect: kov_protect
tail j=3402 line= </div>
tail j=3403 line= <button v-on:click="showhide_kov_protect">showhide_kov_protect</button>
tail j=3404 line= <img v-on:click="showhide_kov_protect" src="/imgs/btn/koeye.png" >
tail j=3405 line= <img v-on:click="showhide_kov_protect1" src="/imgs/btn/kob.png" >
tail j=3406 line= <img v-on:click="showhide_kov_protect2" src="/imgs/btn/kow.png" >
tail j=3407 line=
tail j=3408 line= <div v-show="collapsed" class="detail_protect">
tail j=3409 line= <div id="drag"> kov_protect:<br />
tail j=3410 line= <a href=kov_protect.html class="thumbnail" target=_blank>
tail j=3411 line= <img class="drg" src="/imgs/kov/tn/tn_kov_protect.png" alt="kov_food" width="200" class="drg"/>
tail j=3412 line= <span><img class="drg" src="/imgs/kov/kov_protect.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3413 line= </a>
tail j=3414 line= </div>
tail j=3415 line=
tail j=3416 line=
tail j=3417 line= </div>
tail j=3418 line= </div>
tail j=3419 line=
tail j=3420 line=
tail j=3421 line= <script>var kov_protect = new Vue({ el: "#kov_protect",
tail j=3422 line= data: {collapsed: false},
tail j=3423 line= methods: {
tail j=3424 line= showhide_kov_protect: function() {
tail j=3425 line= if (!this.collapsed) this.collapsed = true;
tail j=3426 line= else this.collapsed = false;
tail j=3427 line= document.getElementById("kov_protect").style.font = "italic bold 20px arial,serif";
tail j=3428 line= },
tail j=3429 line= showhide_kov_protect1: function() {
tail j=3430 line= if (!this.collapsed) this.collapsed = true;
tail j=3431 line= else this.collapsed = false;
tail j=3432 line= },
tail j=3433 line= showhide_kov_protect2: function() {
tail j=3434 line= if (!this.collapsed) this.collapsed = true;
tail j=3435 line= else this.collapsed = false;
tail j=3436 line= }
tail j=3437 line= }
tail j=3438 line= });
tail j=3439 line= </script>
tail j=3440 line=
tail j=3441 line=
tail j=3442 line=
tail j=3443 line= <div id="kov_jtfdc">
tail j=3444 line= <div>
tail j=3445 line= jtfdc: kov_jtfdc
tail j=3446 line= </div>
tail j=3447 line= <button v-on:click="showhide_kov_jtfdc">showhide_kov_jtfdc</button>
tail j=3448 line= <img v-on:click="showhide_kov_jtfdc" src="/imgs/btn/koeye.png" >
tail j=3449 line= <img v-on:click="showhide_kov_jtfdc1" src="/imgs/btn/kob.png" >
tail j=3450 line= <img v-on:click="showhide_kov_jtfdc2" src="/imgs/btn/kow.png" >
tail j=3451 line=
tail j=3452 line= <div v-show="collapsed" class="detail_jtfdc">
tail j=3453 line= <div id="drag"> kov_jtfdc:<br />
tail j=3454 line= <a href=kov_jtfdc.html class="thumbnail" target=_blank>
tail j=3455 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jtfdc.png" alt="kov_food" width="200" class="drg"/>
tail j=3456 line= <span><img class="drg" src="/imgs/kov/kov_jtfdc.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3457 line= </a>
tail j=3458 line= </div>
tail j=3459 line=
tail j=3460 line=
tail j=3461 line= </div>
tail j=3462 line= </div>
tail j=3463 line=
tail j=3464 line=
tail j=3465 line= <script>var kov_jtfdc = new Vue({ el: "#kov_jtfdc",
tail j=3466 line= data: {collapsed: false},
tail j=3467 line= methods: {
tail j=3468 line= showhide_kov_jtfdc: function() {
tail j=3469 line= if (!this.collapsed) this.collapsed = true;
tail j=3470 line= else this.collapsed = false;
tail j=3471 line= },
tail j=3472 line= showhide_kov_jtfdc1: function() {
tail j=3473 line= if (!this.collapsed) this.collapsed = true;
tail j=3474 line= else this.collapsed = false;
tail j=3475 line= },
tail j=3476 line= showhide_kov_jtfdc2: function() {
tail j=3477 line= if (!this.collapsed) this.collapsed = true;
tail j=3478 line= else this.collapsed = false;
tail j=3479 line= }
tail j=3480 line= }
tail j=3481 line= });
tail j=3482 line= </script>
tail j=3483 line=
tail j=3484 line= <div id="kov_jtfinc">
tail j=3485 line= <div>
tail j=3486 line= jtfinc: kov_jtfinc
tail j=3487 line= </div>
tail j=3488 line= <button v-on:click="showhide_kov_jtfinc">showhide_kov_jtfinc</button>
tail j=3489 line= <img v-on:click="showhide_kov_jtfinc" src="/imgs/btn/koeye.png" >
tail j=3490 line= <img v-on:click="showhide_kov_jtfinc1" src="/imgs/btn/kob.png" >
tail j=3491 line= <img v-on:click="showhide_kov_jtfinc2" src="/imgs/btn/kow.png" >
tail j=3492 line=
tail j=3493 line= <div v-show="collapsed" class="detail_jtfinc">
tail j=3494 line= <div id="drag"> kov_jtfinc:<br />
tail j=3495 line= <a href=kov_jtfinc.html class="thumbnail" target=_blank>
tail j=3496 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jtfinc.png" alt="kov_food" width="200" class="drg"/>
tail j=3497 line= <span><img class="drg" src="/imgs/kov/kov_jtfinc.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3498 line= </a>
tail j=3499 line= </div>
tail j=3500 line=
tail j=3501 line=
tail j=3502 line= </div>
tail j=3503 line= </div>
tail j=3504 line=
tail j=3505 line=
tail j=3506 line= <script>var kov_jtfinc = new Vue({ el: "#kov_jtfinc",
tail j=3507 line= data: {collapsed: false},
tail j=3508 line= methods: {
tail j=3509 line= showhide_kov_jtfinc: function() {
tail j=3510 line= if (!this.collapsed) this.collapsed = true;
tail j=3511 line= else this.collapsed = false;
tail j=3512 line= },
tail j=3513 line= showhide_kov_jtfinc1: function() {
tail j=3514 line= if (!this.collapsed) this.collapsed = true;
tail j=3515 line= else this.collapsed = false;
tail j=3516 line= },
tail j=3517 line= showhide_kov_jtfinc2: function() {
tail j=3518 line= if (!this.collapsed) this.collapsed = true;
tail j=3519 line= else this.collapsed = false;
tail j=3520 line= }
tail j=3521 line= }
tail j=3522 line= });
tail j=3523 line= </script>
tail j=3524 line=
tail j=3525 line=
tail j=3526 line=
tail j=3527 line=
tail j=3528 line= <div id="kov_byrdpucker">
tail j=3529 line= <div>
tail j=3530 line= byrdpucker is dogs-n-ponies:
tail j=3531 line= </div>
tail j=3532 line= <button v-on:click="showhide_kov_byrdpucker">showhide_kov_byrdpucker</button>
tail j=3533 line= <img v-on:click="showhide_kov_byrdpucker" src="/imgs/btn/koeye.png" >
tail j=3534 line= <img v-on:click="showhide_kov_byrdpucker1" src="/imgs/btn/kob.png" >
tail j=3535 line= <img v-on:click="showhide_kov_byrdpucker2" src="/imgs/btn/kow.png" >
tail j=3536 line=
tail j=3537 line= <div v-show="collapsed" class="detail_byrdpucker">
tail j=3538 line= byrdpucker dog and pony club cyclers and donuts too
tail j=3539 line= <hr>
tail j=3540 line= <div id="drag"> kov_byrpucker:<br />
tail j=3541 line= <a href=kov_byrpucker.html class="thumbnail" target=_blank>
tail j=3542 line= <img class="drg" src="/imgs/kov/tn/tn_kov_byrpucker.png" alt="kov_food" width="200" class="drg"/>
tail j=3543 line= <span><img class="drg" src="/imgs/kov/kov_byrpucker.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3544 line= </a>
tail j=3545 line= </div>
tail j=3546 line=
tail j=3547 line=
tail j=3548 line= </div>
tail j=3549 line= </div>
tail j=3550 line=
tail j=3551 line= <script>var kov_byrdpucker = new Vue({ el: "#kov_byrdpucker",
tail j=3552 line= data: {collapsed: false},
tail j=3553 line= methods: {
tail j=3554 line= showhide_kov_byrdpucker: function() {
tail j=3555 line= if (!this.collapsed) this.collapsed = true;
tail j=3556 line= else this.collapsed = false;
tail j=3557 line=// document.body.style.background = "darkslategrey";
tail j=3558 line=// document.body.style.color = "black";
tail j=3559 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3560 line=// document.body.style.fontsize = "24pt";
tail j=3561 line= },
tail j=3562 line= showhide_kov_byrdpucker1: function() {
tail j=3563 line= if (!this.collapsed) this.collapsed = true;
tail j=3564 line= else this.collapsed = false;
tail j=3565 line= },
tail j=3566 line= showhide_kov_byrdpucker2: function() {
tail j=3567 line= if (!this.collapsed) this.collapsed = true;
tail j=3568 line= else this.collapsed = false;
tail j=3569 line= }
tail j=3570 line= }
tail j=3571 line= });
tail j=3572 line= </script>
tail j=3573 line=
tail j=3574 line=
tail j=3575 line=
tail j=3576 line= <div id="kov_jkwii">
tail j=3577 line= <div>
tail j=3578 line= jkwii is me: kov_jkwii
tail j=3579 line= </div>
tail j=3580 line= <button v-on:click="showhide_kov_jkwii">showhide_kov_jkwii</button>
tail j=3581 line= <img v-on:click="showhide_kov_jkwii" src="/imgs/btn/koeye.png" >
tail j=3582 line= <img v-on:click="showhide_kov_jkwii1" src="/imgs/btn/kob.png" >
tail j=3583 line= <img v-on:click="showhide_kov_jkwii2" src="/imgs/btn/kow.png" >
tail j=3584 line=
tail j=3585 line= <div v-show="collapsed" class="detail_jkwii">
tail j=3586 line= jookiim kopernicus wundersteine ii
tail j=3587 line= <hr>
tail j=3588 line= <div id="drag"> kov_jkwii:<br />
tail j=3589 line= <a href=kov_jkwii.html class="thumbnail" target=_blank>
tail j=3590 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jkwii.png" alt="kov_food" width="200" class="drg"/>
tail j=3591 line= <span><img class="drg" src="/imgs/kov/kov_jkwii.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3592 line= </a>
tail j=3593 line= </div>
tail j=3594 line=
tail j=3595 line= <a href="mailto:jkwii@ko0.us?subject=jkwii?"><img src="/imgs/links/email.gif" alt="jkwii_what" border=0></a>
tail j=3596 line=
tail j=3597 line= <a href="mailto:skwii@ko0.us?subject=skwii?"><img src="/imgs/links/email.gif" alt="skwii_what" border=0></a>
tail j=3598 line= <hr>
tail j=3599 line=
tail j=3600 line= <a href=/imgs/links/eurodoor_Image429.png class="thumbnail" target=_blank>
tail j=3601 line= <img height=200 src=/imgs/links/tn/tn_eurodoor_Image429.png alt="eurodoor" border=0>
tail j=3602 line= <span><img src=/imgs/links/eurodoor_Image429.png alt="eurodoor" border=0></span>
tail j=3603 line= </a>
tail j=3604 line=
tail j=3605 line=
tail j=3606 line= </div>
tail j=3607 line= </div>
tail j=3608 line=
tail j=3609 line= <script>var kov_jkwii = new Vue({ el: "#kov_jkwii",
tail j=3610 line= data: {collapsed: false},
tail j=3611 line= methods: {
tail j=3612 line= showhide_kov_jkwii: function() {
tail j=3613 line= if (!this.collapsed) this.collapsed = true;
tail j=3614 line= else this.collapsed = false;
tail j=3615 line=// document.body.style.background = "darkslategrey";
tail j=3616 line=// document.body.style.color = "black";
tail j=3617 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3618 line=// document.body.style.fontsize = "24pt";
tail j=3619 line= },
tail j=3620 line= showhide_kov_jkwii1: function() {
tail j=3621 line= if (!this.collapsed) this.collapsed = true;
tail j=3622 line= else this.collapsed = false;
tail j=3623 line= },
tail j=3624 line= showhide_kov_jkwii2: function() {
tail j=3625 line= if (!this.collapsed) this.collapsed = true;
tail j=3626 line= else this.collapsed = false;
tail j=3627 line= }
tail j=3628 line= }
tail j=3629 line= });
tail j=3630 line= </script>
tail j=3631 line=
tail j=3632 line=
tail j=3633 line=
tail j=3634 line= <div id="kov_kou">
tail j=3635 line= <div>
tail j=3636 line= ko university digital ars technica:
tail j=3637 line= </div>
tail j=3638 line= <button v-on:click="showhide_kov_kou">showhide_kov_kou</button>
tail j=3639 line= <img v-on:click="showhide_kov_kou" src="/imgs/btn/koeye.png" >
tail j=3640 line= <img v-on:click="showhide_kov_kou1" src="/imgs/btn/kob.png" >
tail j=3641 line= <img v-on:click="showhide_kov_kou2" src="/imgs/btn/kow.png" >
tail j=3642 line=
tail j=3643 line= <div v-show="collapsed" class="detail_kou">
tail j=3644 line= kou digital ars technica
tail j=3645 line= <hr>
tail j=3646 line= <div id="drag"> kov_kou:<br />
tail j=3647 line= <a href=kov_kou.html class="thumbnail" target=_blank>
tail j=3648 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kou.png" alt="kov_food" width="200" class="drg"/>
tail j=3649 line= <span><img class="drg" src="/imgs/kov/kov_kou.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3650 line= </a>
tail j=3651 line= </div>
tail j=3652 line=
tail j=3653 line= </div>
tail j=3654 line= </div>
tail j=3655 line=
tail j=3656 line=
tail j=3657 line=
tail j=3658 line= <script>var kov_kou = new Vue({ el: "#kov_kou",
tail j=3659 line= data: {collapsed: false},
tail j=3660 line= methods: {
tail j=3661 line= showhide_kov_kou: function() {
tail j=3662 line= if (!this.collapsed) this.collapsed = true;
tail j=3663 line= else this.collapsed = false;
tail j=3664 line=// document.body.style.background = "darkslategrey";
tail j=3665 line=// document.body.style.color = "black";
tail j=3666 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3667 line=// document.body.style.fontsize = "24pt";
tail j=3668 line= },
tail j=3669 line= showhide_kov_kou1: function() {
tail j=3670 line= if (!this.collapsed) this.collapsed = true;
tail j=3671 line= else this.collapsed = false;
tail j=3672 line= },
tail j=3673 line= showhide_kov_kou2: function() {
tail j=3674 line= if (!this.collapsed) this.collapsed = true;
tail j=3675 line= else this.collapsed = false;
tail j=3676 line= }
tail j=3677 line= }
tail j=3678 line= });
tail j=3679 line= </script>
tail j=3680 line=
tail j=3681 line=
tail j=3682 line=
tail j=3683 line=
tail j=3684 line= <div id="kov_kassil">
tail j=3685 line= <div>
tail j=3686 line= kassil and others are us: kov_kassil
tail j=3687 line= </div>
tail j=3688 line= <button v-on:click="showhide_kov_kassil">showhide_kov_kassil</button>
tail j=3689 line= <img v-on:click="showhide_kov_kassil" src="/imgs/btn/koeye.png" >
tail j=3690 line= <img v-on:click="showhide_kov_kassil1" src="/imgs/btn/kob.png" >
tail j=3691 line= <img v-on:click="showhide_kov_kassil2" src="/imgs/btn/kow.png" >
tail j=3692 line=
tail j=3693 line= <div v-show="collapsed" class="detail_kassil">
tail j=3694 line= kassil & others
tail j=3695 line= <div id="drag"> kov_kassil:<br />
tail j=3696 line= <a href=kov_kassil.html class="thumbnail" target=_blank>
tail j=3697 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kassil.png" alt="kov_food" width="200" class="drg"/>
tail j=3698 line= <span><img class="drg" src="/imgs/kov/kov_kassil.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3699 line= </a>
tail j=3700 line= </div>
tail j=3701 line= <hr>
tail j=3702 line=
tail j=3703 line=
tail j=3704 line= </div>
tail j=3705 line= </div>
tail j=3706 line=
tail j=3707 line= <script>var kov_kassil = new Vue({ el: "#kov_kassil",
tail j=3708 line= data: {collapsed: false},
tail j=3709 line= methods: {
tail j=3710 line= showhide_kov_kassil: function() {
tail j=3711 line= if (!this.collapsed) this.collapsed = true;
tail j=3712 line= else this.collapsed = false;
tail j=3713 line=// document.body.style.background = "darkslategrey";
tail j=3714 line=// document.body.style.color = "black";
tail j=3715 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3716 line=// document.body.style.fontsize = "24pt";
tail j=3717 line= },
tail j=3718 line= showhide_kov_kassil1: function() {
tail j=3719 line= if (!this.collapsed) this.collapsed = true;
tail j=3720 line= else this.collapsed = false;
tail j=3721 line= },
tail j=3722 line= showhide_kov_kassil2: function() {
tail j=3723 line= if (!this.collapsed) this.collapsed = true;
tail j=3724 line= else this.collapsed = false;
tail j=3725 line= }
tail j=3726 line= }
tail j=3727 line= });
tail j=3728 line= </script>
tail j=3729 line=
tail j=3730 line=
tail j=3731 line=
tail j=3732 line=
tail j=3733 line= <div id="kov_konet">
tail j=3734 line= <div>
tail j=3735 line= konet is biz: kov_konet
tail j=3736 line= </div>
tail j=3737 line= <button v-on:click="showhide_kov_konet">showhide_kov_konet</button>
tail j=3738 line= <img v-on:click="showhide_kov_konet" src="/imgs/btn/koeye.png" >
tail j=3739 line= <img v-on:click="showhide_kov_konet1" src="/imgs/btn/kob.png" >
tail j=3740 line= <img v-on:click="showhide_kov_konet2" src="/imgs/btn/kow.png" >
tail j=3741 line=
tail j=3742 line= <div v-show="collapsed" class="detail_konet">
tail j=3743 line= konet is biz
tail j=3744 line= <hr>
tail j=3745 line= <div id="drag"> kov_konet:<br />
tail j=3746 line= <a href=kov_konet.html class="thumbnail" target=_blank>
tail j=3747 line= <img class="drg" src="/imgs/kov/tn/tn_kov_konet.png" alt="kov_food" width="200" class="drg"/>
tail j=3748 line= <span><img class="drg" src="/imgs/kov/kov_konet.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3749 line= </a>
tail j=3750 line= </div>
tail j=3751 line=
tail j=3752 line=
tail j=3753 line= </div>
tail j=3754 line= </div>
tail j=3755 line=
tail j=3756 line= <script>var kov_konet = new Vue({ el: "#kov_konet",
tail j=3757 line= data: {collapsed: false},
tail j=3758 line= methods: {
tail j=3759 line= showhide_kov_konet: function() {
tail j=3760 line= if (!this.collapsed) this.collapsed = true;
tail j=3761 line= else this.collapsed = false;
tail j=3762 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3763 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3764 line=
tail j=3765 line=// document.body.style.background = "darkslategrey";
tail j=3766 line=// document.body.style.color = "black";
tail j=3767 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3768 line=// document.body.style.fontsize = "24pt";
tail j=3769 line= },
tail j=3770 line= showhide_kov_konet1: function() {
tail j=3771 line= if (!this.collapsed) this.collapsed = true;
tail j=3772 line= else this.collapsed = false;
tail j=3773 line= },
tail j=3774 line= showhide_kov_konet2: function() {
tail j=3775 line= if (!this.collapsed) this.collapsed = true;
tail j=3776 line= else this.collapsed = false;
tail j=3777 line= }
tail j=3778 line= }
tail j=3779 line= });
tail j=3780 line= </script>
tail j=3781 line=
tail j=3782 line=
tail j=3783 line=
tail j=3784 line=
tail j=3785 line= <div id="kov_iperms">
tail j=3786 line= <div>
tail j=3787 line= iperms
tail j=3788 line=<!-- <h1 v-on:click="showhide_kov_iperms" >= = : : iperms : : = =</h1> -->
tail j=3789 line= </div>
tail j=3790 line= <button v-on:click="showhide_kov_iperms">showhide_kov_iperms</button>
tail j=3791 line= <img v-on:click="showhide_kov_iperms" src="/imgs/btn/koeye.png" >
tail j=3792 line= <img v-on:click="showhide_kov_iperms1" src="/imgs/btn/kob.png" >
tail j=3793 line= <img v-on:click="showhide_kov_iperms2" src="/imgs/btn/kow.png" >
tail j=3794 line=
tail j=3795 line= <div v-show="collapsed" class="detail_iperms">
tail j=3796 line= iperms
tail j=3797 line= <hr>
tail j=3798 line= <div id="drag"> kov_iperms:<br />
tail j=3799 line= <a href=kov_iperms.html class="thumbnail" target=_blank>
tail j=3800 line= <img class="drg" src="/imgs/kov/tn/tn_kov_iperms.png" alt="kov_food" width="200" class="drg"/>
tail j=3801 line= <span><img class="drg" src="/imgs/kov/kov_iperms.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3802 line= </a>
tail j=3803 line= </div>
tail j=3804 line=
tail j=3805 line=
tail j=3806 line= </div>
tail j=3807 line= </div>
tail j=3808 line=
tail j=3809 line= <script>var kov_iperms = new Vue({ el: "#kov_iperms",
tail j=3810 line= data: {collapsed: false},
tail j=3811 line= methods: {
tail j=3812 line= showhide_kov_iperms: function() {
tail j=3813 line= if (!this.collapsed) this.collapsed = true;
tail j=3814 line= else this.collapsed = false;
tail j=3815 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3816 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3817 line=
tail j=3818 line=// document.body.style.background = "darkslategrey";
tail j=3819 line=// document.body.style.color = "black";
tail j=3820 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3821 line=// document.body.style.fontsize = "24pt";
tail j=3822 line= },
tail j=3823 line= showhide_kov_iperms1: function() {
tail j=3824 line= if (!this.collapsed) this.collapsed = true;
tail j=3825 line= else this.collapsed = false;
tail j=3826 line= },
tail j=3827 line= showhide_kov_iperms2: function() {
tail j=3828 line= if (!this.collapsed) this.collapsed = true;
tail j=3829 line= else this.collapsed = false;
tail j=3830 line= }
tail j=3831 line= }
tail j=3832 line= });
tail j=3833 line= </script>
tail j=3834 line=
tail j=3835 line=
tail j=3836 line=
tail j=3837 line=
tail j=3838 line= <div id="kov_konabus">
tail j=3839 line= <div>
tail j=3840 line= konabus: kov_konabus
tail j=3841 line= </div>
tail j=3842 line= <button v-on:click="showhide_kov_konabus">showhide_kov_konabus</button>
tail j=3843 line= <img v-on:click="showhide_kov_konabus" src="/imgs/btn/koeye.png" >
tail j=3844 line= <img v-on:click="showhide_kov_konabus1" src="/imgs/btn/kob.png" >
tail j=3845 line= <img v-on:click="showhide_kov_konabus2" src="/imgs/btn/kow.png" >
tail j=3846 line=
tail j=3847 line= <div v-show="collapsed" class="detail_konabus">
tail j=3848 line= konabus
tail j=3849 line= <hr>
tail j=3850 line= <div id="drag"> kov_konabus:<br />
tail j=3851 line= <a href=kov_konabus.html class="thumbnail" target=_blank>
tail j=3852 line= <img class="drg" src="/imgs/kov/tn/tn_kov_konabus.png" alt="kov_food" width="200" class="drg"/>
tail j=3853 line= <span><img class="drg" src="/imgs/kov/kov_konabus.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3854 line= </a>
tail j=3855 line= </div>
tail j=3856 line=
tail j=3857 line= </div>
tail j=3858 line= </div>
tail j=3859 line=
tail j=3860 line= <script>var kov_konabus = new Vue({ el: "#kov_konabus",
tail j=3861 line= data: {collapsed: false},
tail j=3862 line= methods: {
tail j=3863 line= showhide_kov_konabus: function() {
tail j=3864 line= if (!this.collapsed) this.collapsed = true;
tail j=3865 line= else this.collapsed = false;
tail j=3866 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3867 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3868 line=
tail j=3869 line=// document.body.style.background = "darkslategrey";
tail j=3870 line=// document.body.style.color = "black";
tail j=3871 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3872 line=// document.body.style.fontsize = "24pt";
tail j=3873 line= },
tail j=3874 line= showhide_kov_konabus1: function() {
tail j=3875 line= if (!this.collapsed) this.collapsed = true;
tail j=3876 line= else this.collapsed = false;
tail j=3877 line= },
tail j=3878 line= showhide_kov_konabus2: function() {
tail j=3879 line= if (!this.collapsed) this.collapsed = true;
tail j=3880 line= else this.collapsed = false;
tail j=3881 line= }
tail j=3882 line= }
tail j=3883 line= });
tail j=3884 line= </script>
tail j=3885 line=
tail j=3886 line=
tail j=3887 line=
tail j=3888 line=
tail j=3889 line= <div id="kov_kt">
tail j=3890 line= <div>
tail j=3891 line= kt: kov_kt
tail j=3892 line= </div>
tail j=3893 line= <button v-on:click="showhide_kov_kt">showhide_kov_kt</button>
tail j=3894 line= <img v-on:click="showhide_kov_kt" src="/imgs/btn/koeye.png" >
tail j=3895 line= <img v-on:click="showhide_kov_kt1" src="/imgs/btn/kob.png" >
tail j=3896 line= <img v-on:click="showhide_kov_kt2" src="/imgs/btn/kow.png" >
tail j=3897 line=
tail j=3898 line= <div v-show="collapsed" class="detail_kt">
tail j=3899 line= kt
tail j=3900 line= <hr>
tail j=3901 line= <div id="drag"> kov_kt:<br />
tail j=3902 line= <a href=kov_kt.html class="thumbnail" target=_blank>
tail j=3903 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kt.png" alt="kov_food" width="200" class="drg"/>
tail j=3904 line= <span><img class="drg" src="/imgs/kov/kov_kt.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3905 line= </a>
tail j=3906 line= </div>
tail j=3907 line=
tail j=3908 line=
tail j=3909 line= </div>
tail j=3910 line= </div>
tail j=3911 line=
tail j=3912 line= <script>var kov_kt = new Vue({ el: "#kov_kt",
tail j=3913 line= data: {collapsed: false},
tail j=3914 line= methods: {
tail j=3915 line= showhide_kov_kt: function() {
tail j=3916 line= if (!this.collapsed) this.collapsed = true;
tail j=3917 line= else this.collapsed = false;
tail j=3918 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3919 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3920 line=
tail j=3921 line=// document.body.style.background = "darkslategrey";
tail j=3922 line=// document.body.style.color = "black";
tail j=3923 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3924 line=// document.body.style.fontsize = "24pt";
tail j=3925 line= },
tail j=3926 line= showhide_kov_kt1: function() {
tail j=3927 line= if (!this.collapsed) this.collapsed = true;
tail j=3928 line= else this.collapsed = false;
tail j=3929 line= },
tail j=3930 line= showhide_kov_kt2: function() {
tail j=3931 line= if (!this.collapsed) this.collapsed = true;
tail j=3932 line= else this.collapsed = false;
tail j=3933 line= }
tail j=3934 line= }
tail j=3935 line= });
tail j=3936 line= </script>
tail j=3937 line=
tail j=3938 line=
tail j=3939 line=
tail j=3940 line= <div id="kov_go">
tail j=3941 line= <div>
tail j=3942 line= go: kov_go
tail j=3943 line= </div>
tail j=3944 line= <button v-on:click="showhide_kov_go">showhide_kov_go</button>
tail j=3945 line= <img v-on:click="showhide_kov_go" src="/imgs/btn/koeye.png" >
tail j=3946 line= <img v-on:click="showhide_kov_go1" src="/imgs/btn/kob.png" >
tail j=3947 line= <img v-on:click="showhide_kov_go2" src="/imgs/btn/kow.png" >
tail j=3948 line=
tail j=3949 line= <div v-show="collapsed" class="detail_go">
tail j=3950 line= go
tail j=3951 line= <hr>
tail j=3952 line= <div id="drag"> kov_go:<br />
tail j=3953 line= <a href=kov_go.html class="thumbnail" target=_blank>
tail j=3954 line= <img class="drg" src="/imgs/kov/tn/tn_kov_go.png" alt="kov_food" width="200" class="drg"/>
tail j=3955 line= <span><img class="drg" src="/imgs/kov/kov_go.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3956 line= </a>
tail j=3957 line= </div>
tail j=3958 line=
tail j=3959 line=
tail j=3960 line= </div>
tail j=3961 line= </div>
tail j=3962 line=
tail j=3963 line= <script>var kov_go = new Vue({ el: "#kov_go",
tail j=3964 line= data: {collapsed: false},
tail j=3965 line= methods: {
tail j=3966 line= showhide_kov_go: function() {
tail j=3967 line= if (!this.collapsed) this.collapsed = true;
tail j=3968 line= else this.collapsed = false;
tail j=3969 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3970 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3971 line=
tail j=3972 line=// document.body.style.background = "darkslategrey";
tail j=3973 line=// document.body.style.color = "black";
tail j=3974 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3975 line=// document.body.style.fontsize = "24pt";
tail j=3976 line= },
tail j=3977 line= showhide_kov_go1: function() {
tail j=3978 line= if (!this.collapsed) this.collapsed = true;
tail j=3979 line= else this.collapsed = false;
tail j=3980 line= },
tail j=3981 line= showhide_kov_go2: function() {
tail j=3982 line= if (!this.collapsed) this.collapsed = true;
tail j=3983 line= else this.collapsed = false;
tail j=3984 line= }
tail j=3985 line= }
tail j=3986 line= });
tail j=3987 line= </script>
tail j=3988 line=
tail j=3989 line=
tail j=3990 line=
tail j=3991 line= <div id="div_kov_old">
tail j=3992 line= <div>
tail j=3993 line= old: kov_old
tail j=3994 line= </div>
tail j=3995 line= <button v-on:click="showhide_kov_old">showhide_kov_old</button>
tail j=3996 line= <img v-on:click="showhide_kov_old" src="/imgs/btn/koeye.png" >
tail j=3997 line= <img v-on:click="showhide_kov_old1" src="/imgs/btn/kob.png" >
tail j=3998 line= <img v-on:click="showhide_kov_old2" src="/imgs/btn/kow.png" >
tail j=3999 line=
tail j=4000 line= <div v-show="collapsed" class="detail_old">
tail j=4001 line=
tail j=4002 line= old
tail j=4003 line= <hr>
tail j=4004 line= <div id="drag"> kov_old:<br />
tail j=4005 line= <a href=kov_old.html class="thumbnail" target=_blank>
tail j=4006 line= <img class="drg" src="/imgs/kov/tn/tn_kov_old.png" alt="kov_food" width="200" class="drg"/>
tail j=4007 line= <span><img class="drg" src="/imgs/kov/kov_old.png" alt="kov_food" width="400" class="drg"/></span>
tail j=4008 line= </a>
tail j=4009 line= </div>
tail j=4010 line=
tail j=4011 line=
tail j=4012 line= </div>
tail j=4013 line= </div id="div_kov_old">
tail j=4014 line=
tail j=4015 line= <script id="script_kov_old">
tail j=4016 line= var kov_old = new Vue({ el: "#kov_old",
tail j=4017 line= data: {collapsed: false},
tail j=4018 line= methods: {
tail j=4019 line= showhide_kov_old: function() {
tail j=4020 line= if (!this.collapsed) this.collapsed = true;
tail j=4021 line= else this.collapsed = false;
tail j=4022 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=4023 line=// font-style font-variant font-weight font-size line-height font-family
tail j=4024 line=
tail j=4025 line=// document.body.style.background = "darkslategrey";
tail j=4026 line=// document.body.style.color = "black";
tail j=4027 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=4028 line=// document.body.style.fontsize = "24pt";
tail j=4029 line= },
tail j=4030 line= showhide_kov_old1: function() {
tail j=4031 line= if (!this.collapsed) this.collapsed = true;
tail j=4032 line= else this.collapsed = false;
tail j=4033 line= },
tail j=4034 line= showhide_kov_old2: function() {
tail j=4035 line= if (!this.collapsed) this.collapsed = true;
tail j=4036 line= else this.collapsed = false;
tail j=4037 line= }
tail j=4038 line= }
tail j=4039 line= });
tail j=4040 line= </script id="script_kov_old">
tail j=4041 line=
tail j=4042 line= </div id="div_vues_end" >
tail j=4043 line=
tail j=4044 line=<!-- kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk -->
tail j=4045 line=
tail j=4046 line=
tail j=4047 line=
tail j=4048 line=
tail j=4049 line=
tail j=4050 line=
tail j=4051 line=
tail j=4052 line=
tail j=4053 line=
tail j=4054 line=
tail j=4055 line=
tail j=4056 line= <ul id="kov_list">
tail j=4057 line= <li v-for="(item, index) in items">
tail j=4058 line= {{ parentMessage }} - {{ index }} - {{ item.message }}
tail j=4059 line= </li>
tail j=4060 line= </ul>
tail j=4061 line= <script id="script_kov_list" >
tail j=4062 line= var kov_list = new Vue({el: '#kov_list',
tail j=4063 line= data: {
tail j=4064 line= parentMessage: 'Parent',
tail j=4065 line= items: [
tail j=4066 line= { message: 'new' },
tail j=4067 line= { message: 'focus' },
tail j=4068 line= { message: 'work' },
tail j=4069 line= { message: 'memes' },
tail j=4070 line= { message: 'jtfdc' },
tail j=4071 line= { message: 'jtfinc' },
tail j=4072 line= { message: 'byrdpucker',
tail j=4073 line= { message: 'jkwii' },
tail j=4074 line= { message: 'kou' },
tail j=4075 line= { message: 'kassil' },
tail j=4076 line= { message: 'konet' },
tail j=4077 line= { message: 'iperms' },
tail j=4078 line= { message: 'konabus' },
tail j=4079 line= { message: 'kt' },
tail j=4080 line= { message: 'go' },
tail j=4081 line= { message: 'old' }
tail j=4082 line= ]
tail j=4083 line= }
tail j=4084 line= })
tail j=4085 line= </script id="script_kov_list" >
tail j=4086 line=
tail j=4087 line=
tail j=4088 line= <div id="div_url">
tail j=4089 line= <script id="script_url">
tail j=4090 line= var url = document.createElement("a");
tail j=4091 line= url.href=location.href;
tail j=4092 line= var output = "output";
tail j=4093 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
tail j=4094 line=
tail j=4095 line=// if( url.search != "" ) {
tail j=4096 line=// script_zm_view( url.search );
tail j=4097 line=// }
tail j=4098 line=
tail j=4099 line=// alert(location.href)
tail j=4100 line=// alert(url.protocol)
tail j=4101 line=// alert(url.hostname)
tail j=4102 line=// alert(url.pathname)
tail j=4103 line=// alert(url.search)
tail j=4104 line=// alert(url.hash)
tail j=4105 line=
tail j=4106 line=
tail j=4107 line=// document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
tail j=4108 line=// document.write( "pathname=" + url.pathname + " search=" + url.search );
tail j=4109 line= </script>
tail j=4110 line= </script id="script_url">
tail j=4111 line= </div id="div_url">
tail j=4112 line=
tail j=4113 line=
tail j=4114 line=
tail j=4115 line= <script id="script_document_ready" type="text/javascript">
tail j=4116 line= $(document).ready(function() {
tail j=4117 line=// sets the draggable
tail j=4118 line= $('#drag .drg').draggable({
tail j=4119 line= cursor: 'move', // sets the cursor apperance
tail j=4120 line= revert: 'valid'
tail j=4121 line= });
tail j=4122 line=
tail j=4123 line=// sets droppable
tail j=4124 line=// after the draggable is droped, hides it with a hide() effect
tail j=4125 line= $('#drop').droppable({
tail j=4126 line= drop: function(event, ui) {
tail j=4127 line= ui.draggable.hide(1000);
tail j=4128 line= }
tail j=4129 line= });
tail j=4130 line=
tail j=4131 line=// after the draggable is droped, hides it with a hide() effect
tail j=4132 line= $('#drop1').droppable({
tail j=4133 line= drop: function(event, ui) {
tail j=4134 line= ui.draggable.hide(1000);
tail j=4135 line= }
tail j=4136 line= });
tail j=4137 line=
tail j=4138 line=// after the draggable is droped, hides it with a hide() effect
tail j=4139 line= $('#drop2').droppable({
tail j=4140 line= drop: function(event, ui) {
tail j=4141 line= ui.draggable.hide(1000);
tail j=4142 line= }
tail j=4143 line= });
tail j=4144 line=
tail j=4145 line=// when the "#sw" element (inside the "#drop") is clicked
tail j=4146 line=// show the items with class "drg", contained in "#drag"
tail j=4147 line=// $('#drag .drg').slideDown(1000);
tail j=4148 line= $('#drop #sw').click(function(){
tail j=4149 line= var url = "/ko_center/ko_center.php?q=jqui/dragdrop1/"
tail j=4150 line= $(location).attr('href',url);
tail j=4151 line= });
tail j=4152 line= });
tail j=4153 line= </script id="script_document_ready" >
tail j=4154 line=
tail j=4155 line=
tail j=4156 line=
tail j=4157 line= <script id="script_load_liks" >
tail j=4158 line= var svc_links = new Array();
tail j=4159 line= var ko_links = new Array();
tail j=4160 line= var us_links = new Array();
tail j=4161 line= var u_links = new Array();
tail j=4162 line= var now_links = new Array();
tail j=4163 line= var srv_links = new Array();
tail j=4164 line= var kov_links = new Array();
tail j=4165 line= function load_svc_links() {
tail j=4166 line= var j=0;
tail j=4167 line= svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
tail j=4168 line= svc_links[j++]="/index_bb.html|/imgs/links/index_bb.png|index_bb|/imgs/btn/kob.png";
tail j=4169 line= svc_links[j++]="/index_bp.html|/imgs/links/index_bp.png|index_bb|/imgs/btn/kob.png";
tail j=4170 line= svc_links[j++]="/index_dd.html|/imgs/links/index_dd.png|index_dd|/imgs/btn/kob.png";
tail j=4171 line= svc_links[j++]="/index_dl.html|/imgs/links/index_dl.png|index_dl|/imgs/btn/kob.png";
tail j=4172 line= svc_links[j++]="/index_dp.html|/imgs/links/index_dp.png|index_dp|/imgs/btn/kob.png";
tail j=4173 line= svc_links[j++]="/index_fl.html|/imgs/links/index_fl.png|index_fl|/imgs/btn/kob.png";
tail j=4174 line= svc_links[j++]="/index_jg.html|/imgs/links/index_jg.png|index_jg|/imgs/btn/kob.png";
tail j=4175 line= svc_links[j++]="/index_pn.html|/imgs/links/index_pn.png|index_pn|/imgs/btn/kob.png";
tail j=4176 line= svc_links[j++]="/index_sc.html|/imgs/links/index_sc.png|index_sc|/imgs/btn/kob.png";
tail j=4177 line= svc_links[j++]="/index_sl.html|/imgs/links/index_sl.png|index_sl|/imgs/btn/kob.png";
tail j=4178 line= svc_links[j++]="/index_tl.html|/imgs/links/index_tl.png|index_tl|/imgs/btn/kob.png";
tail j=4179 line= svc_links[j++]="/index_tm.html|/imgs/links/index_tm.png|index_tm|/imgs/btn/kob.png";
tail j=4180 line= svc_links[j++]="/index_us.html|/imgs/links/index_us.png|index_us|/imgs/btn/kob.png";
tail j=4181 line= svc_links[j++]="/index_wc.html|/imgs/links/index_wc.png|index_wc|/imgs/btn/kob.png";
tail j=4182 line= svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
tail j=4183 line= svc_links[j++]="/index_zm.html|/imgs/links/index_zm.png|index_zm|/imgs/btn/kob.png";
tail j=4184 line= return( svc_links );
tail j=4185 line= }
tail j=4186 line=
tail j=4187 line= function load_srv_links() {
tail j=4188 line= srv_links[0]="ko0.us/index.html|/imgs/btn/koeyeb.png|ko0us|/imgs/btn/kob.png";
tail j=4189 line= srv_links[1]="ko1.us/index.html|/imgs/btn/koeye.png|ko1us|/imgs/btn/kop1234.png";
tail j=4190 line= srv_links[2]="ko2.us/index.html|/imgs/btn/koeyew.png|ko2us|/imgs/btn/kow.png";
tail j=4191 line= srv_links[3]="konet.org/index.html|/imgs/btn/ko.png|konet-org|/imgs/btn/kib.png";
tail j=4192 line= srv_links[4]="iperms.com/index.html|/imgs/links/iperms.png|iperms-com|/imgs/btn/kop34.png";
tail j=4193 line= srv_links[5]="kassil.com/index.html|/imgs/links/kassil.png|kassil-com|/imgs/btn/kop12.png";
tail j=4194 line= return( srv_links );
tail j=4195 line= }
tail j=4196 line=
tail j=4197 line= function load_ko_links() {
tail j=4198 line= var j=0;
tail j=4199 line= ko_links[j++]="/jkwii/blackboard.html|/imgs/links/blackboard.png|blackboard|/imgs/btn/koeye.png";
tail j=4200 line= ko_links[j++]="/jkwii/js/threejs/examples/index.html|/imgs/links/index_js3d.png|index_js3d|/imgs/btn/koeye.png";
tail j=4201 line= ko_links[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
tail j=4202 line= ko_links[j++]="/jkwii/js/gojs/index.html|/imgs/links/index_jsgo.png|index_jsgo|/imgs/btn/koeye.png";
tail j=4203 line= ko_links[j++]="/index_jsdk.html|/imgs/links/index_jsdk.png|index_jsdk|/imgs/btn/koeye.png";
tail j=4204 line= ko_links[j++]="/jkwii/koh5_globe/koh5_globe.html|/imgs/links/koh5_globe.png|koh5_globe|/imgs/btn/koeye.png";
tail j=4205 line= ko_links[j++]="/jkwii/aud/keybd/index.html|/imgs/links/index_jskb.png|index_jskb|/imgs/btn/koeye.png";
tail j=4206 line= ko_links[j++]="/svc/kokbdm/index.html|/imgs/links/index_jskb-dm.png|index_jskb-dm|/imgs/btn/koeye.png";
tail j=4207 line= ko_links[j++]="/svc/kokbdms/index.html|/imgs/links/index_jskb-dms.png|index_jskb-dms|/imgs/btn/koeye.png";
tail j=4208 line= ko_links[j++]="/piano.html|/imgs/links/index_piano.png|index_piano|/imgs/btn/koeye.png";
tail j=4209 line= ko_links[j++]="/jkwii/aud/piano_uri/koh5_piano_uri.html|/imgs/links/index_jskb-uri.png|index_jskb_uri|/imgs/btn/koeye.png";
tail j=4210 line= ko_links[j++]="/ko/svc/js/stemkoskijs/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
tail j=4211 line= ko_links[j++]="/ko/svc/aud/mrcoles/koh5_mrcoles.html|/imgs/links/mrcoles.png|mrcoles|/imgs/btn/koeye.png";
tail j=4212 line= ko_links[j++]="http://effectgames.com/demos/canvascycle/|/imgs/links/index_effectgames.png|index_effectgames|/imgs/btn/koeye.png";
tail j=4213 line= ko_links[j++]="https://www.leshylabs.com/apps/sfMaker/|/imgs/links/index_sfmaker.png|index_sfmaker|/imgs/btn/koeye.png";
tail j=4214 line= ko_links[j++]="https://dragongoserver.net/|/imgs/links/index_dgs.png|index_dgs|/imgs/btn/koeye.png";
tail j=4215 line= ko_links[j++]="/ko_center/ko_center.php|/imgs/links/ko_center.png|ko_center|/imgs/btn/kob.png";
tail j=4216 line= ko_links[j++]="/ko_saic/ko_saic.php|/imgs/links/ko_saic.png|ko_saic|/imgs/btn/kob.png";
tail j=4217 line= ko_links[j++]="/index_kt.html|/imgs/links/index_kt.png|index_kt|/imgs/btn/kob.png";
tail j=4218 line= ko_links[j++]="/index_jtf.html|/imgs/links/index_jtf.png|index_jtf|/imgs/btn/kob.png";
tail j=4219 line= ko_links[j++]="/index2big.html|/imgs/links/index2big.png|index2big|/imgs/btn/kob.png";
tail j=4220 line= ko_links[j++]="/index2big.htm|/imgs/links/index2big_noel.png|index2big_noel|/imgs/btn/kob.png";
tail j=4221 line= ko_links[j++]="/jkwii/whiteboard.html|/imgs/links/whiteboard.png|whiteboard|/imgs/btn/koeye.png";
tail j=4222 line= return( ko_links );
tail j=4223 line= }
tail j=4224 line=
tail j=4225 line=
tail j=4226 line=
tail j=4227 line= function load_us_links() {
tail j=4228 line= var j=0;
tail j=4229 line=// https://www.yelp.com/biz_photos/rechtin-family-and-cosmetic-dental-care-st-louis-2?adjust_creative=dWJMtmYxpd5N5yoyzSuhtA&utm_campaign=yelp_api&utm_medium=api_v2_business&utm_source=dWJMtmYxpd5N5yoyzSuhtA|
tail j=4230 line= us_links[j++]="/us/med/kov_rechtin.html|/imgs/us/med_rechtin.png|med_rechtin|/imgs/btn/koeye.png|med";
tail j=4231 line= us_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4232 line= us_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4233 line=
tail j=4234 line= us_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
tail j=4235 line= us_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
tail j=4236 line= us_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
tail j=4237 line= us_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
tail j=4238 line= us_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
tail j=4239 line= us_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
tail j=4240 line= us_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
tail j=4241 line= us_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
tail j=4242 line= us_links[j++]="http://www.fdazol.com/|/imgs/us/law_azol.png|law_azol_f|/imgs/btn/koeye.png|law";
tail j=4243 line=
tail j=4244 line= us_links[j++]="https://jmhalumni.com|/imgs/us/jmhalumni.png|ed_jmhalumni|/imgs/btn/koeye.png|edu";
tail j=4245 line= us_links[j++]="https://johnmarshallhighschool.com|/imgs/us/johnmarshallhighschool.png|ed_johnmarshallhighschool|/imgs/btn/koeye.png|edu";
tail j=4246 line= us_links[j++]="https://www.greatschools.org/kentucky/brandenburg/1993-Brandenburg-High-School/|/imgs/us/brandenburg_highschool.png|ed_brandenburg-highschool|/imgs/btn/koeye.png|edu";
tail j=4247 line= us_links[j++]="https://www.hazelwoodschools.org/Page/3143|/imgs/us/hazelwood_schools.png|ed_hazelwood_schools|/imgs/btn/koeye.png|edu";
tail j=4248 line= us_links[j++]="https://bw.edu|/imgs/us/bw.png|ed_bw|/imgs/btn/koeye.png|edu";
tail j=4249 line=
tail j=4250 line= us_links[j++]="http://oldtowndonuts.com|/imgs/us/oldtowndonuts.png|food_oldtowndonuts|/imgs/btn/koeye.png|food";
tail j=4251 line= us_links[j++]="http://farkaspastries.com|/imgs/us/farkaspastries.png|food_farkaspastries|/imgs/btn/koeye.png|food";
tail j=4252 line= us_links[j++]="https://www.facebook.com/HansaImportHouse|/imgs/us/hansaimporthouse.png|food_hansaimporthouse|/imgs/btn/koeye.png|food";
tail j=4253 line= us_links[j++]="http://havanagrillco.com|/imgs/us/havanagrillco.png|food_havanagrillco|/imgs/btn/koeye.png|food";
tail j=4254 line= us_links[j++]="http://spiros-restaurant.com|/imgs/us/spiros_restaurant.png|food_spiros_restaurant|/imgs/btn/koeye.png|food";
tail j=4255 line= us_links[j++]="https://www.opentable.com/jake-and-tellys-greek-taverna?page=1|/imgs/us/food_jake_tellys.png|food_jake_tellys|/imgs/btn/koeye.png|food";
tail j=4256 line= us_links[j++]="http://edelweissrest.com|/imgs/us/edelweissrest.png|food_edelweissrest|/imgs/btn/koeye.png|food";
tail j=4257 line= us_links[j++]="http://bierwerks.com|/imgs/us/food_bierwerks.png|food_bierwerks|/imgs/btn/koeye.png|food";
tail j=4258 line= us_links[j++]="http://www.savellispizzapastasubs.com/|/imgs/us/food_savellispizza.png|food_savellispizza|/imgs/bmtn/koeye.png|food";
tail j=4259 line= us_links[j++]="https://www.facebook.com/woohoogreekfood2/|/imgs/us/woohoogreekfood2.png|food_woohoogreekfood2|/imgs/btn/koeye.png|food";
tail j=4260 line=
tail j=4261 line= us_links[j++]="https://bdo.com/about/us-locations/bdo-st-louis|/imgs/us/bdo-stl.png|acct_bdo-stl|/imgs/btn/koeye.png|acct";
tail j=4262 line= us_links[j++]="https://bdo.com/about/us-locations/bdo-cleveland-office|/imgs/us/bdo-cle.png|acct_bdo-cle|/imgs/btn/koeye.png|acct";
tail j=4263 line= us_links[j++]="http://www.gatewayloan.com/|/imgs/us/gateway_mortgage.png|gateway_mortgage|/imgs/btn/koeye.png|acct";
tail j=4264 line= us_links[j++]="https://chesonsulting.com|/imgs/us/checonsulting.png|biz_checonsulting|/imgs/btn/koeye.png|biz";
tail j=4265 line= us_links[j++]="http://saic.com|/imgs/us/saic.png|saic|/imgs/btn/koeye.png|biz";
tail j=4266 line= us_links[j++]="http://leidos.com|/imgs/us/leidos.png|leidos|/imgs/btn/koeye.png|biz";
tail j=4267 line=
tail j=4268 line=
tail j=4269 line= us_links[j++]="http://ko2.us/index_focus.com|/imgs/us/focus_solutions.png|focus_solutions|/imgs/btn/koeye.png|biz";
tail j=4270 line= us_links[j++]="http://www.finduslocal.com/hardware-stores/kentucky/brandenburg/allens-s-t-hardware-inc|/imgs/us/biz_allens_hardware.png|biz_allens_hardware|/imgs/btn/koeye.png|biz";
tail j=4271 line= us_links[j++]="http://growwarehouse.com|/imgs/us/grow_warehouse.png|grow_warehouse|/imgs/btn/koeye.png|biz";
tail j=4272 line= us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
tail j=4273 line= us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
tail j=4274 line= us_links[j++]="http://www.savellidanceandmartialarts.com/?load=html|/imgs/us/savelli_dance_martialarts.png|savelli_dance_martialarts|/imgs/btn/koeye.png|phy";
tail j=4275 line= us_links[j++]="http://myfusiondance.com/?load=html|/imgs/us/fusion_dance.png|fusion_dance|/imgs/btn/koeye.png|phy";
tail j=4276 line= us_links[j++]="http://www.superseriesbaseball.com/|/imgs/us/super_series_baseball.png|super_series_baseball|/imgs/btn/koeye.png|phy";
tail j=4277 line=
tail j=4278 line= us_links[j++]="https://ftknox.afceachapters.org/|/imgs/us/afcea_knox.png|afcea_knox|/imgs/btn/koeye.png|org";
tail j=4279 line= us_links[j++]="https://scott.afceachapters.org/|/imgs/us/afcea_scott.png|afcea_scott|/imgs/btn/koeye.png|org";
tail j=4280 line= us_links[j++]="https://www.ble-t.org/|/imgs/us/ble.png|ble|/imgs/btn/koeye.png|org";
tail j=4281 line= us_links[j++]="http://www.doevalley.org/|/imgs/us/doe_valley.png|doe_valley|/imgs/btn/koeye.png|org";
tail j=4282 line=
tail j=4283 line= us_links[j++]="http://www.chapelofthecross.org/|/imgs/us/chapel_of_the_cross.png|chapel_of_the_cross|/imgs/btn/koeye.png|rel";
tail j=4284 line= us_links[j++]="https://www.lds.org/temples/details/st.-louis-missouri-temple|/imgs/us/lds_stl.png|lds_stl|/imgs/btn/koeye.png|rel";
tail j=4285 line= us_links[j++]="https://www.bethanyenglish.org/|/imgs/us/bethany_english_lutheran.png|bethany_english_lutheran|/imgs/btn/koeye.png|rel";
tail j=4286 line= us_links[j++]="https://www.meadecountymessenger.com/|/imgs/us/meade_county_messenger.png|meade_county_messenger|/imgs/btn/koeye.png|media";
tail j=4287 line= us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
tail j=4288 line= us_links[j++]="https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2088|/imgs/us/mars_jpl_nasa.png|mars_jpl_nasa|/imgs/btn/koeye.png|sci";
tail j=4289 line= us_links[j++]="https://mars.nasa.gov/mer/gallery/all/opportunity.html|/imgs/us/mars_nasa_gov.png|mars_nasa_gov|/imgs/btn/koeye.png|sci";
tail j=4290 line= us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
tail j=4291 line= return( us_links );
tail j=4292 line= }
tail j=4293 line=
tail j=4294 line=
tail j=4295 line=
tail j=4296 line= function load_u_links() {
tail j=4297 line= var j=0;
tail j=4298 line= u_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4299 line= u_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4300 line=
tail j=4301 line= u_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
tail j=4302 line= u_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
tail j=4303 line= u_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
tail j=4304 line= u_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
tail j=4305 line= u_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
tail j=4306 line= u_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
tail j=4307 line= u_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
tail j=4308 line= u_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
tail j=4309 line= return( u_links );
tail j=4310 line= }
tail j=4311 line=
tail j=4312 line=
tail j=4313 line=
tail j=4314 line= function load_now_links() {
tail j=4315 line= var j=0;
tail j=4316 line= now_links[j++]="http://index_party.html|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4317 line= now_links[j++]="http://index_jtfdc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4318 line= now_links[j++]="http://index_jtfinc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4319 line= now_links[j++]="http://index_stlc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4320 line= now_links[j++]="http://index_jtfdcr.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4321 line= now_links[j++]="http://index_byrdpucker.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4322 line= return( now_links );
tail j=4323 line= }
tail j=4324 line=
tail j=4325 line=
tail j=4326 line= function show_svc_links(mode) {
tail j=4327 line= svc_links = load_svc_links();
tail j=4328 line= htmout_svc_links = "";
tail j=4329 line= htmout_svc_linkz = "";
tail j=4330 line= for (i = 0; i < svc_links.length; i++) {
tail j=4331 line= my_btnimg = "/imgs/btn/kib.png";
tail j=4332 line= my_href = svc_links[i].split("|")[0];
tail j=4333 line= my_popimg = svc_links[i].split("|")[1];
tail j=4334 line= my_alt = svc_links[i].split("|")[2];
tail j=4335 line=
tail j=4336 line=// htmout_svc_linkz += '<div class="drag" name="'+my_alt+'" >\n';
tail j=4337 line= htmout_svc_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4338 line= htmout_svc_linkz += '<img id="drg" src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4339 line=// htmout_svc_linkz += '</div >';
tail j=4340 line=
tail j=4341 line=// htmout_svc_links += '<div class="drag" name="'+my_alt+'" >\n';
tail j=4342 line= htmout_svc_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4343 line= htmout_svc_links += '<img class="drag" id="drg" src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4344 line= htmout_svc_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4345 line=// htmout_svc_links += '</div >';
tail j=4346 line= }
tail j=4347 line= if( mode === 'pop' ) {
tail j=4348 line= htmout_svc_links += "<br><br>\n";
tail j=4349 line= var div_svc_links = document.getElementById('div_svc_links');
tail j=4350 line= div_svc_links.insertAdjacentHTML('beforeend', htmout_svc_links);
tail j=4351 line= return( htmout_svc_links );
tail j=4352 line= }
tail j=4353 line=
tail j=4354 line= htmout_svc_linkz += "<br><br>\n";
tail j=4355 line= var div_svc_linkz = document.getElementById('div_svc_linkz');
tail j=4356 line= div_svc_linkz.insertAdjacentHTML('beforeend', htmout_svc_linkz);
tail j=4357 line= return( htmout_svc_linkz );
tail j=4358 line= }
tail j=4359 line=
tail j=4360 line= function show_ko_links(mode) {
tail j=4361 line= ko_links = load_ko_links();
tail j=4362 line= htmout_ko_links = "";
tail j=4363 line= htmout_ko_linkz = "";
tail j=4364 line= for (i = 0; i < ko_links.length; i++) {
tail j=4365 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4366 line= my_href = ko_links[i].split("|")[0];
tail j=4367 line= my_popimg = ko_links[i].split("|")[1];
tail j=4368 line= my_alt = ko_links[i].split("|")[2];
tail j=4369 line=
tail j=4370 line= htmout_ko_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4371 line= htmout_ko_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4372 line=
tail j=4373 line= htmout_ko_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4374 line= htmout_ko_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4375 line= htmout_ko_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4376 line= }
tail j=4377 line=
tail j=4378 line= if( mode === 'pop' ) {
tail j=4379 line= htmout_ko_links += "<br><br>";
tail j=4380 line= var div_ko_links = document.getElementById('div_ko_links');
tail j=4381 line= div_ko_links.insertAdjacentHTML('beforeend', htmout_ko_links);
tail j=4382 line= return( htmout_ko_links );
tail j=4383 line= }
tail j=4384 line=
tail j=4385 line= htmout_ko_linkz += "<br><br>";
tail j=4386 line= var div_ko_linkz = document.getElementById('div_ko_linkz');
tail j=4387 line= div_ko_linkz.insertAdjacentHTML('beforeend', htmout_ko_linkz);
tail j=4388 line= return( htmout_ko_linkz );
tail j=4389 line= }
tail j=4390 line=
tail j=4391 line=
tail j=4392 line= function show_us_links(mode) {
tail j=4393 line= us_links = load_us_links();
tail j=4394 line= htmout_us_links = "";
tail j=4395 line= htmout_us_linkz = "";
tail j=4396 line= for (i = 0; i < us_links.length; i++) {
tail j=4397 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4398 line= my_href = us_links[i].split("|")[0];
tail j=4399 line= my_popimg = us_links[i].split("|")[1];
tail j=4400 line= my_alt = us_links[i].split("|")[2];
tail j=4401 line=
tail j=4402 line= htmout_us_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4403 line= htmout_us_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4404 line=
tail j=4405 line= htmout_us_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4406 line= htmout_us_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4407 line= htmout_us_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4408 line= }
tail j=4409 line=
tail j=4410 line= if( mode === 'pop' ) {
tail j=4411 line= htmout_us_links += "<br><br>";
tail j=4412 line= var div_us_links = document.getElementById('div_us_links');
tail j=4413 line= div_us_links.insertAdjacentHTML('beforeend', htmout_us_links);
tail j=4414 line= return( htmout_us_links );
tail j=4415 line= }
tail j=4416 line=
tail j=4417 line= htmout_us_linkz += "<br><br>";
tail j=4418 line= var div_us_linkz = document.getElementById('div_us_linkz');
tail j=4419 line= div_us_linkz.insertAdjacentHTML('beforeend', htmout_us_linkz);
tail j=4420 line= return( htmout_us_linkz );
tail j=4421 line= }
tail j=4422 line=
tail j=4423 line=
tail j=4424 line=
tail j=4425 line=
tail j=4426 line=
tail j=4427 line=
tail j=4428 line=
tail j=4429 line= function show_u_links(mode) {
tail j=4430 line= u_links = load_u_links();
tail j=4431 line= htmout_u_links = "";
tail j=4432 line= htmout_u_linkz = "";
tail j=4433 line= for (i = 0; i < u_links.length; i++) {
tail j=4434 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4435 line= my_href = u_links[i].split("|")[0];
tail j=4436 line= my_popimg = u_links[i].split("|")[1];
tail j=4437 line= my_alt = u_links[i].split("|")[2];
tail j=4438 line=
tail j=4439 line= htmout_u_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4440 line= htmout_u_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4441 line=
tail j=4442 line= htmout_u_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4443 line= htmout_u_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4444 line= htmout_u_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4445 line= }
tail j=4446 line=
tail j=4447 line= if( mode === 'pop' ) {
tail j=4448 line= htmout_u_links += "<br><br>";
tail j=4449 line= var div_u_links = document.getElementById('div_u_links');
tail j=4450 line= div_u_links.insertAdjacentHTML('beforeend', htmout_u_links);
tail j=4451 line= return( htmout_u_links );
tail j=4452 line= }
tail j=4453 line=
tail j=4454 line= htmout_u_linkz += "<br><br>";
tail j=4455 line= var div_u_linkz = document.getElementById('div_u_linkz');
tail j=4456 line= div_u_linkz.insertAdjacentHTML('beforeend', htmout_u_linkz);
tail j=4457 line= return( htmout_u_linkz );
tail j=4458 line= }
tail j=4459 line=
tail j=4460 line=
tail j=4461 line=
tail j=4462 line= function show_now_links(mode) {
tail j=4463 line= now_links = load_now_links();
tail j=4464 line= htmout_now_links = "";
tail j=4465 line= htmout_now_linkz = "";
tail j=4466 line= for (i = 0; i < now_links.length; i++) {
tail j=4467 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4468 line= my_href = now_links[i].split("|")[0];
tail j=4469 line= my_popimg = now_links[i].split("|")[1];
tail j=4470 line= my_alt = now_links[i].split("|")[2];
tail j=4471 line=
tail j=4472 line= htmout_now_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4473 line= htmout_now_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4474 line=
tail j=4475 line= htmout_now_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4476 line= htmout_now_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4477 line= htmout_now_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4478 line= }
tail j=4479 line=
tail j=4480 line= if( mode === 'pop' ) {
tail j=4481 line= htmout_now_links += "<br><br>";
tail j=4482 line= var div_now_links = document.getElementById('div_now_links');
tail j=4483 line= div_now_links.insertAdjacentHTML('beforeend', htmout_now_links);
tail j=4484 line= return( htmout_now_links );
tail j=4485 line= }
tail j=4486 line=
tail j=4487 line= htmout_now_linkz += "<br><br>";
tail j=4488 line= var div_now_linkz = document.getElementById('div_now_linkz');
tail j=4489 line= div_now_linkz.insertAdjacentHTML('beforeend', htmout_now_linkz);
tail j=4490 line= return( htmout_now_linkz );
tail j=4491 line= }
tail j=4492 line=
tail j=4493 line= function show_srv_links(mode) {
tail j=4494 line= srv_links = load_srv_links();
tail j=4495 line= htmout_srv_links = "";
tail j=4496 line= htmout_srv_linkz = "";
tail j=4497 line= for (i = 0; i < srv_links.length; i++) {
tail j=4498 line= my_btnimg = "/imgs/btn/kiw.png";
tail j=4499 line= my_href = srv_links[i].split("|")[0];
tail j=4500 line= my_popimg = srv_links[i].split("|")[1];
tail j=4501 line= my_alt = srv_links[i].split("|")[2];
tail j=4502 line=
tail j=4503 line= htmout_srv_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4504 line= htmout_srv_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4505 line=
tail j=4506 line= htmout_srv_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4507 line= htmout_srv_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4508 line= htmout_srv_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4509 line= }
tail j=4510 line= if( mode === 'pop' ) {
tail j=4511 line= htmout_srv_links += "<br><br>\n"
tail j=4512 line= var div_srv_links = document.getElementById('div_srv_links');
tail j=4513 line= div_srv_links.insertAdjacentHTML('beforeend', htmout_srv_links);
tail j=4514 line= return( htmout_srv_links );
tail j=4515 line= }
tail j=4516 line=
tail j=4517 line= htmout_srv_linkz += "<br><br>\n"
tail j=4518 line= var div_srv_linkz = document.getElementById('div_srv_linkz');
tail j=4519 line= div_srv_linkz.insertAdjacentHTML('beforeend', htmout_srv_linkz);
tail j=4520 line= return( htmout_srv_linkz );
tail j=4521 line= }
tail j=4522 line=
tail j=4523 line=// document.write( htmout_svc_links );
tail j=4524 line=// document.write( htmout_ko_links );
tail j=4525 line=// document.write( htmout_srv_links );
tail j=4526 line=
tail j=4527 line=// var div_ko_links = document.getElementById("div_ko_links");
tail j=4528 line=// var div_ko_links_orig = div_ko_links.innerHTML;
tail j=4529 line=// alert( "BUGS_500 div_ko_links_orig="+div_ko_links_orig );
tail j=4530 line=
tail j=4531 line=// div_ko_links.innerHTML = "";
tail j=4532 line=// div_ko_links.appendChild( htmout_ko_links);
tail j=4533 line=
tail j=4534 line=
tail j=4535 line=// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
tail j=4536 line=//
tail j=4537 line=// getElementById("foo").insertAdjacentHTML
tail j=4538 line=// <!-- beforebegin / before -->
tail j=4539 line=// <p>
tail j=4540 line=// <!-- afterbegin / prepend -->
tail j=4541 line=// foo
tail j=4542 line=// <!-- beforeend / append -->
tail j=4543 line=// </p>
tail j=4544 line=// <!-- afterend / after-->
tail j=4545 line=//
tail j=4546 line=// document.getElementById('foo').insertAdjacentHTML("beforebegin", "<hr>")
tail j=4547 line=// $('#foo').before("<hr>")
tail j=4548 line=// document.getElementById('foo').insertAdjacentHTML("afterend", "<hr>")
tail j=4549 line=// $('#foo').append("<hr>")
tail j=4550 line=// document.getElementById('foo').insertAdjacentHTML("beforeend", "<hr>")
tail j=4551 line=// $('#foo').append("<hr>")
tail j=4552 line=// document.getElementById('foo').insertAdjacentHTML("afterbegin", "<hr>")
tail j=4553 line=// $('#foo').prepend("<hr>")
tail j=4554 line=//
tail j=4555 line=// var btn = document.getElementById('btn'); // The button itself with an ID of 'btn'
tail j=4556 line=// var newButton = '<button>New button</button>'; // New button to be inserted
tail j=4557 line=// btn.insertAdjacentHTML('afterend', newButton);
tail j=4558 line=//
tail j=4559 line=// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
tail j=4560 line= function show_all_links(mode) {
tail j=4561 line= show_svc_links(mode);
tail j=4562 line= show_ko_links(mode);
tail j=4563 line= show_us_links(mode);
tail j=4564 line= show_u_links(mode);
tail j=4565 line= show_now_links(mode);
tail j=4566 line= show_srv_links(mode);
tail j=4567 line= }
tail j=4568 line=
tail j=4569 line= </script id="script_load_liks" >
tail j=4570 line=
tail j=4571 line= <div id="div_links" >
tail j=4572 line= <hr color=red>
tail j=4573 line= <div id="div_svc_links" > </div>
tail j=4574 line= <hr color=red>
tail j=4575 line=
tail j=4576 line= <hr color=white>
tail j=4577 line= <div id="div_ko_links" > </div>
tail j=4578 line= <hr color=white>
tail j=4579 line=
tail j=4580 line= <hr color=white>
tail j=4581 line= <div id="div_us_links" > </div>
tail j=4582 line= <hr color=white>
tail j=4583 line=
tail j=4584 line= <hr color=white>
tail j=4585 line= <div id="div_u_links" > </div>
tail j=4586 line= <hr color=white>
tail j=4587 line=
tail j=4588 line= <hr color=white>
tail j=4589 line= <div id="div_now_links" > </div>
tail j=4590 line= <hr color=white>
tail j=4591 line=
tail j=4592 line= <hr color=blue>
tail j=4593 line= <div id="div_srv_links" > </div>
tail j=4594 line= <hr color=blue>
tail j=4595 line= </div id="div_links" >
tail j=4596 line=
tail j=4597 line= <div id="div_linkz" >
tail j=4598 line= <hr color=red>
tail j=4599 line= <div id="div_svc_linkz" > </div>
tail j=4600 line= <hr color=red>
tail j=4601 line=
tail j=4602 line= <hr color=black>
tail j=4603 line= <div id="div_ko_linkz" > </div>
tail j=4604 line= <hr color=black>
tail j=4605 line=
tail j=4606 line= <hr color=black>
tail j=4607 line= <div id="div_us_linkz" > </div>
tail j=4608 line= <hr color=black>
tail j=4609 line=
tail j=4610 line= <hr color=black>
tail j=4611 line= <div id="div_u_linkz" > </div>
tail j=4612 line= <hr color=black>
tail j=4613 line=
tail j=4614 line= <hr color=black>
tail j=4615 line= <div id="div_now_linkz" > </div>
tail j=4616 line= <hr color=black>
tail j=4617 line=
tail j=4618 line= <hr color=blue>
tail j=4619 line= <div id="div_srv_linkz" > </div>
tail j=4620 line= <hr color=blue>
tail j=4621 line= </div id="div_linkz" >
tail j=4622 line=
tail j=4623 line= <div id="div_cfaa" class=ko>
tail j=4624 line=<!-- -->
tail j=4625 line=
tail j=4626 line= <script id="script_cfaa">
tail j=4627 line= var text_cfaa =
tail j=4628 line=`
tail j=4629 line=pqpqpqpqpqpqpqpqpqpq Warning pqpqpqpqpqpqpqpqpqpq<br>
tail j=4630 line=<br>
tail j=4631 line=This site may be protected under the
tail j=4632 line=<br>
tail j=4633 line=<br>
tail j=4634 line=<b>CFAA</b>
tail j=4635 line=<br>
tail j=4636 line=Computer Fraud and Abuse Act
tail j=4637 line=<br>
tail j=4638 line=<br>
tail j=4639 line=your attemped access has been logged
tail j=4640 line=<br>
tail j=4641 line=repeated attemps by unauthorized guests will be reported
tail j=4642 line=<br>
tail j=4643 line=<br>
tail j=4644 line=By continuing You are acknowledging
tail j=4645 line=<br>
tail j=4646 line=you are fully authorized and
tail j=4647 line=<br>
tail j=4648 line=understand the responsibilites to access the content on the site
tail j=4649 line=<br>
tail j=4650 line=<br>
tail j=4651 line=This page must not be removed
tail j=4652 line=<br>
tail j=4653 line=bdbdbdbdbdbdbdbdbdbd Warning bdbdbdbdbdbdbdbdbdbd
tail j=4654 line=<br>
tail j=4655 line=<br>
tail j=4656 line=unauthoriced users should
tail j=4657 line=<br>
tail j=4658 line=consider browsing elsewhere:
tail j=4659 line=
tail j=4660 line=
tail j=4661 line=<hr color=black>
tail j=4662 line=<hr color=ivory>
tail j=4663 line=<hr color=red>
tail j=4664 line=<hr color=blue>
tail j=4665 line=<hr color=ebony>
tail j=4666 line=<hr color=white>
tail j=4667 line=
tail j=4668 line=<a href=duckduckgo.com > <img src="ok.png" alt="duckduckgo" height=10 border=0></a>
tail j=4669 line=     
tail j=4670 line=<a href=bing.com > <img src="ok.png" alt="bing" height=10 border=0></a>
tail j=4671 line=     
tail j=4672 line=<a href=google.com > <img src="ok.png" alt="google" height=10 border=0></a>
tail j=4673 line=     
tail j=4674 line=<a href=yahoo.com > <img src="ok.png" alt="yahoo" height=10 border=0></a>
tail j=4675 line=     
tail j=4676 line= <a href=https://mars.jpl.nasa.gov/msl/multimedia/raw target=_blank>
tail j=4677 line= <img src="ok.png" border=0 height=10>
tail j=4678 line= </a>
tail j=4679 line=     
tail j=4680 line= <a href=http://youtube.com target=_blank>
tail j=4681 line= <img src="ok.png" border=0 height=10>
tail j=4682 line= </a>
tail j=4683 line= </div id="div_cfaa" class=ko>
tail j=4684 line=
tail j=4685 line=<hr color=white>
tail j=4686 line=<hr color=ebony>
tail j=4687 line=<hr color=blue>
tail j=4688 line=<hr color=red>
tail j=4689 line=<hr color=ivory>
tail j=4690 line=<hr color=black>
tail j=4691 line=
tail j=4692 line= <div id="div_warn2" class=ko>
tail j=4693 line= <p id=p_warn2 class=ko>
tail j=4694 line= <hr color=black>
tail j=4695 line= <hr color=white>
tail j=4696 line= <hr color=red>
tail j=4697 line= If you are seeing this page
tail j=4698 line= <br>
tail j=4699 line= you are probably unauthorized
tail j=4700 line= <br>
tail j=4701 line= you should <b>NOT</b> continue
tail j=4702 line= <br>
tail j=4703 line= accessing site content here may be
tail j=4704 line= <br>
tail j=4705 line= protected under <b>CFAA</b>
tail j=4706 line= <hr color=red>
tail j=4707 line= <hr color=white>
tail j=4708 line= <hr color=black>
tail j=4709 line= </p>
tail j=4710 line=
tail j=4711 line= authorized sites are available from bluehost
tail j=4712 line=
tail j=4713 line= <a href="https://www.bluehost.com/?utm_source=%28direct%29&utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype" target=_blank>
tail j=4714 line= <img src=/imgs/bh/bh_anim.gif height=30 border=0 alt=bluehost.com affiliate></a>
tail j=4715 line= <div id=kobh_offer class=ko>
tail j=4716 line= bluehost offers
tail j=4717 line= 50 gb space
tail j=4718 line= 999 gb bandwidth
tail j=4719 line=
tail j=4720 line= 6 domains on 1 account
tail j=4721 line= and more for only $6.95/month
tail j=4722 line= </div>
tail j=4723 line= </div id="div_warn2" class=ko>
tail j=4724 line=
tail j=4725 line=
tail j=4726 line= <script id="script_url">
tail j=4727 line= var url = document.createElement("a");
tail j=4728 line= url.href=location.href
tail j=4729 line= var output = "output"
tail j=4730 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
tail j=4731 line=// alert(location.href)
tail j=4732 line=// alert(url.protocol)
tail j=4733 line=// alert(url.hostname)
tail j=4734 line=// alert(url.pathname)
tail j=4735 line=// alert(url.search)
tail j=4736 line=// alert(url.hash)
tail j=4737 line=
tail j=4738 line= if( url.search == "" ) {document.write( text_cfaa );}
tail j=4739 line= if( url.search == "?q=cfaa" ) {document.write( text_cfaa ); }
tail j=4740 line= </script id="script_url">
tail j=4741 line= </div>
tail j=4742 line=
tail j=4743 line=
tail j=4744 line=
tail j=4745 line=<!--
tail j=4746 line= <iframe id="myframe" src="/svc/kokbdm/index.html" width="1000" height="500"
tail j=4747 line= frameborder="0" scrolling="yes"></iframe>
tail j=4748 line= -->
tail j=4749 line=
tail j=4750 line= <hr color=red><hr color=black><hr color=white>
tail j=4751 line= <button type="button" onclick="show_all_links('pop')">show_all_links</button>
tail j=4752 line=<!-- <button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
tail j=4753 line= <hr color=red><hr color=white><hr color=blue>
tail j=4754 line= <button type="button" onclick="show_svc_links('pop')">show_svc_links</button>
tail j=4755 line= <button type="button" onclick="show_ko_links('pop')">show_ko_links</button>
tail j=4756 line= <button type="button" onclick="show_us_links('pop')">show_us_links</button>
tail j=4757 line= <button type="button" onclick="show_u_links('pop')">show_u_links</button>
tail j=4758 line= <button type="button" onclick="show_now_links('pop')">show_now_links</button>
tail j=4759 line= <button type="button" onclick="show_srv_links('pop')">show_srv_links</button>
tail j=4760 line= <hr color=blue><hr color=white><hr color=black>
tail j=4761 line=
tail j=4762 line=<!--
tail j=4763 line= <img src="/imgs/btn/kib.png" height="50" size="150" alt="koeye" onclick="show_svc_links()">
tail j=4764 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_ko_links()">
tail j=4765 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_us_links()">
tail j=4766 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_u_links()">
tail j=4767 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_now_links()">
tail j=4768 line= <img src="/imgs/btn/kiw.png" height="50" size="150" alt="koeyew" onclick="show_srv_links()">
tail j=4769 line= -->
tail j=4770 line=
tail j=4771 line= <div id="div_kobuttons">
tail j=4772 line= <a href=# class="popover" onclick="show_svc_links();">
tail j=4773 line= <img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" >
tail j=4774 line= <span><img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" ></span>
tail j=4775 line= </a>
tail j=4776 line=
tail j=4777 line= <a href=# class="popover" onclick="show_ko_links();">
tail j=4778 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4779 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4780 line= </a>
tail j=4781 line=
tail j=4782 line= <a href=# class="popover" onclick="show_us_links();">
tail j=4783 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4784 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4785 line= </a>
tail j=4786 line=
tail j=4787 line= <a href=# class="popover" onclick="show_u_links();">
tail j=4788 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4789 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4790 line= </a>
tail j=4791 line=
tail j=4792 line= <a href=# class="popover" onclick="show_now_links();">
tail j=4793 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4794 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4795 line= </a>
tail j=4796 line=
tail j=4797 line= <a href=# class="popover" onclick="show_srv_links();">
tail j=4798 line= <img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" >
tail j=4799 line= <span><img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" ></span>
tail j=4800 line= </a>
tail j=4801 line= </div id="div_kobuttons">
tail j=4802 line=
tail j=4803 line= <hr color=blue><hr color=white><hr color=red>
tail j=4804 line=
tail j=4805 line=<!--
tail j=4806 line= <div id="div_drop">
tail j=4807 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=4808 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=4809 line= <img height=200 width=300
tail j=4810 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=4811 line= </a>
tail j=4812 line= <div id="div_drop">
tail j=4813 line= -->
tail j=4814 line= <hr color=red>
tail j=4815 line= <hr color=white>
tail j=4816 line= <hr color=blue>
tail j=4817 line=
tail j=4818 line= <div id="div_drag" >
tail j=4819 line= <a class="popover" href="/?q=bigtn_drag1">
tail j=4820 line= <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
tail j=4821 line= <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
tail j=4822 line= </a>
tail j=4823 line= </div id="div_drag" >
tail j=4824 line=
tail j=4825 line=
tail j=4826 line=
tail j=4827 line= <div id="div_drop_zm">
tail j=4828 line= <span id="sw"><h3>droptop</h3></span>
tail j=4829 line= <a class="thumbnail" href=/index_vu.html?zmid=/zm/komap target=_blank>
tail j=4830 line= <img height=200 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 >
tail j=4831 line= <span><img height=400 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 ></span>
tail j=4832 line= </a>
tail j=4833 line= </div id="div_drop_zm">
tail j=4834 line=
tail j=4835 line=
tail j=4836 line= <div id="div_drag_main"> drag:<br />
tail j=4837 line= <img class="drg" src="/images/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=4838 line=
tail j=4839 line= <div class="drg"><h1>konet llc </h1>
tail j=4840 line= <pre>timesak skwii</pre>
tail j=4841 line= <img class="drg" src="/imgs/links/keyeb.png" alt="keyeb.png" width="50" >
tail j=4842 line= <img class="drg" src="/imgs/links/keyw.png" alt="keyew.png" width="50" >
tail j=4843 line= <pre>timesak skwii</pre>
tail j=4844 line= </div>
tail j=4845 line=
tail j=4846 line= <div class="drg"><h3>jtf29 </h3>
tail j=4847 line= <a href=/ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=4848 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=4849 line= </a>
tail j=4850 line= </div>
tail j=4851 line=
tail j=4852 line=
tail j=4853 line= <div class="drg"><h3>dogheads</h3>
tail j=4854 line= <div id="div_jtf_vid5">
tail j=4855 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=4856 line= <source src="/ko_jtf/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4857 line= </video>
tail j=4858 line= </div>
tail j=4859 line= </div>
tail j=4860 line=
tail j=4861 line= <div class="drg"><h3>jtfdc night court lights action 3720</h3>
tail j=4862 line= <div id="div_vid">
tail j=4863 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=4864 line= <source src="index.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4865 line= <source src="index.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4866 line= </video>
tail j=4867 line= </div>
tail j=4868 line= </div>
tail j=4869 line=
tail j=4870 line= <div class="drg"><h3>vid1: </h3>
tail j=4871 line= <div id="div_vid1">
tail j=4872 line= <video controls="controls" defaultmuted="" muted="true" style="width:320;height:180;" poster="index1_mp4.png">
tail j=4873 line= <source src="index1.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4874 line= <source src="index1.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4875 line= </video>
tail j=4876 line= </div>
tail j=4877 line= </div>
tail j=4878 line=
tail j=4879 line= <div class="drg"><h3>vid2_avril</h3>
tail j=4880 line= <div id="div_vid2_avril">
tail j=4881 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index2_mp4.png">
tail j=4882 line= <source src="index2.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4883 line= <source src="index2.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4884 line= </video>
tail j=4885 line= </div>
tail j=4886 line= </div>
tail j=4887 line=
tail j=4888 line= <div class="drg"><h3>vid3_jtfinc_dogpatrol_tresspass</h3>
tail j=4889 line= <div id="div_vid3">
tail j=4890 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index3_mp4.png">
tail j=4891 line= <source src="index3.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4892 line= <source src="index3.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4893 line= </video>
tail j=4894 line= </div>
tail j=4895 line= </div>
tail j=4896 line=
tail j=4897 line=
tail j=4898 line= <div class="drg">konet llc
tail j=4899 line= <img src="/imgs/btn/kob.png" alt="ko.png" width="50" class="drg" />
tail j=4900 line=
tail j=4901 line= </div>
tail j=4902 line= </div id="div_drag_main">
tail j=4903 line=
tail j=4904 line=
tail j=4905 line= <hr color=yellow>
tail j=4906 line= <hr color=white>
tail j=4907 line= <hr color=yellow>
tail j=4908 line=
tail j=4909 line= <div id="div_neave_im" >
tail j=4910 line= <iframe frameborder='0' height='250' marginheight='0' marginwidth='0' scrolling='no'
tail j=4911 line= src='/index_neave_im.html'
tail j=4912 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=4913 line= </iframe>
tail j=4914 line= <a class="popover" href="/index_neave_im.html" target=_blank>
tail j=4915 line= <img height=50 width=1600 src="/imgs/links/index_neave_im.png" alt="index_neave_im" border=0>
tail j=4916 line= <span><img height=50 width=1600 src="/imgs/links/index_neave_im_pop.png" border=0></span>
tail j=4917 line= </a>
tail j=4918 line= </div id="div_neave_im" >
tail j=4919 line=
tail j=4920 line= <div id="div_iframe" height-"150" >
tail j=4921 line= </div id="div_ifram" >
tail j=4922 line=
tail j=4923 line= <div id="div_neave_wobble" >
tail j=4924 line=
tail j=4925 line= <a class="popover" href="/index_neave_wobble.html" target=_blank>
tail j=4926 line= <img height=50 width=1600 src="/imgs/links/index_neave_wobble.png" alt="index_neave_wobble" border=0>
tail j=4927 line= <span><img height=50 width=1600 src="/imgs/links/index_neave_wobble_pop.png" border=0></span>
tail j=4928 line= </a>
tail j=4929 line= <iframe frameborder='0' height='150' marginheight='0' marginwidth='0' scrolling='no'
tail j=4930 line= src='/index_neave_wobble.html'
tail j=4931 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=4932 line= </iframe>
tail j=4933 line= </div id="div_neave_wobble" >
tail j=4934 line=
tail j=4935 line=
tail j=4936 line=
tail j=4937 line=
tail j=4938 line= <div id="div_files" >
tail j=4939 line= <output id="zonelist"></output>
tail j=4940 line= <div id="dropzone">
tail j=4941 line= dropzone
tail j=4942 line= <div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
tail j=4943 line= <canvas id="canvas_dropzone" style="z-index: 1;
tail j=4944 line= position:absolute;
tail j=4945 line= left:0px;
tail j=4946 line= top:0px;
tail j=4947 line= " height="100px" width="200" background-color="darkSlategrey" color="ivory">
tail j=4948 line= WARN_1387 unauthorized access has been logged
tail j=4949 line= </canvas>
tail j=4950 line= </div id="div_files" >
tail j=4951 line=
tail j=4952 line= <script id="scrip_fileselect" name="script_fileselect">
tail j=4953 line= function handleFileSelect(evt) {
tail j=4954 line= evt.stopPropagation();
tail j=4955 line= evt.preventDefault();
tail j=4956 line=
tail j=4957 line= var files = evt.dataTransfer.files; // FileList object.
tail j=4958 line=
tail j=4959 line=// files is a FileList of File objects. List some properties.
tail j=4960 line= var output = [];
tail j=4961 line= for (var i = 0, f; f = files[i]; i++) {
tail j=4962 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
tail j=4963 line= f.size, ' bytes, last modified: ',
tail j=4964 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
tail j=4965 line= '</li>');
tail j=4966 line= }
tail j=4967 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
tail j=4968 line= }
tail j=4969 line=
tail j=4970 line= function handleDragOver(evt) {
tail j=4971 line= evt.stopPropagation();
tail j=4972 line= evt.preventDefault();
tail j=4973 line= evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
tail j=4974 line= }
tail j=4975 line=
tail j=4976 line= // Setup the dnd listeners.
tail j=4977 line= var dropZone = document.getElementById('dropzone');
tail j=4978 line= dropZone.addEventListener('dragover', handleDragOver, false);
tail j=4979 line= dropZone.addEventListener('drop', handleFileSelect, false);
tail j=4980 line= </script id="scrip_fileselect" name="script_fileselect">
tail j=4981 line=
tail j=4982 line=<hr><hr><hr>
tail j=4983 line= <div id="div_zonelist">
tail j=4984 line= <label class="fileContainer">
tail j=4985 line= files
tail j=4986 line= <input id="files" name="files[]" multiple="" type="file">
tail j=4987 line= </label>
tail j=4988 line= <output id="zonelist"></output>
tail j=4989 line= <div id="div_zonelist">
tail j=4990 line=
tail j=4991 line= <script id="script_hfileselect" >
tail j=4992 line= function handleFileSelect(evt) {
tail j=4993 line= var files = evt.target.files; // FileList object
tail j=4994 line=
tail j=4995 line= // files is a FileList of File objects. List some properties.
tail j=4996 line= var output = [];
tail j=4997 line= for (var i = 0, f; f = files[i]; i++) {
tail j=4998 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
tail j=4999 line= f.size, ' bytes, last modified: ',
tail j=5000 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
tail j=5001 line= '</li>');
tail j=5002 line= }
tail j=5003 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
tail j=5004 line= }
tail j=5005 line=
tail j=5006 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
tail j=5007 line= </script id="script_hfileselect" >
tail j=5008 line=
tail j=5009 line= <div id="div_files2" hidden >
tail j=5010 line= <label class="fileContainer">
tail j=5011 line= files2
tail j=5012 line= <input id="files" name="files[]" multiple="" type="file">
tail j=5013 line= </label>
tail j=5014 line= <output id="zonelist"></output>
tail j=5015 line= </div id="div_files2" hidden >
tail j=5016 line=
tail j=5017 line= <script id="script_hfileselect2" >
tail j=5018 line= function handleFileSelect(evt) {
tail j=5019 line= var files = evt.target.files; // FileList object
tail j=5020 line=
tail j=5021 line= // Loop through the FileList and render image files as thumbnails.
tail j=5022 line= for (var i = 0, f; f = files[i]; i++) {
tail j=5023 line=
tail j=5024 line=// Only process image files.
tail j=5025 line= if (!f.type.match('image.*')) { continue; }
tail j=5026 line=
tail j=5027 line= var reader = new FileReader();
tail j=5028 line=
tail j=5029 line= // Closure to capture the file information.
tail j=5030 line= reader.onload = (function(theFile) {
tail j=5031 line= return function(e) {
tail j=5032 line= // Render thumbnail.
tail j=5033 line= var span = document.createElement('span');
tail j=5034 line= span.innerHTML = ['<img class="thumb" src="', e.target.result,
tail j=5035 line= '" title="', escape(theFile.name), '"/>'].join('');
tail j=5036 line= document.getElementById('zonelist').insertBefore(span, null);
tail j=5037 line= };
tail j=5038 line= })(f);
tail j=5039 line=
tail j=5040 line= // Read in the image file as a data URL.
tail j=5041 line= reader.readAsDataURL(f);
tail j=5042 line= }
tail j=5043 line= }
tail j=5044 line=
tail j=5045 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
tail j=5046 line= </script id="script_hfileselect2" >
tail j=5047 line=
tail j=5048 line= <script id="script_previewfile">
tail j=5049 line= function previewfile(file) {
tail j=5050 line= if (tests.filereader === true && acceptedTypes[file.type] === true) {
tail j=5051 line= var reader = new FileReader();
tail j=5052 line= reader.onload = function (event) {
tail j=5053 line= var image = new Image();
tail j=5054 line= image.src = event.target.result;
tail j=5055 line= image.width = 250; // a fake resize
tail j=5056 line= holder.appendChild(image);
tail j=5057 line= };
tail j=5058 line=
tail j=5059 line= reader.readAsDataURL(file);
tail j=5060 line= }
tail j=5061 line= else {
tail j=5062 line= holder.innerHTML +=
tail j=5063 line= '<p>done: koupload'
tail j=5064 line= + file.name
tail j=5065 line= + ' '
tail j=5066 line= + (file.size ? (file.size/1024|0) + 'K' : '');
tail j=5067 line= console.log(file);
tail j=5068 line= }
tail j=5069 line= }
tail j=5070 line=
tail j=5071 line= function readfiles(files) {
tail j=5072 line= debugger;
tail j=5073 line= var formData = tests.formdata ? new FormData() : null;
tail j=5074 line= for (var i = 0; i < files.length; i++) {
tail j=5075 line= if (tests.formdata) formData.append('file', files[i]);
tail j=5076 line= previewfile(files[i]);
tail j=5077 line= }
tail j=5078 line=
tail j=5079 line=// now post a new XHR request
tail j=5080 line= if (tests.formdata) {
tail j=5081 line= var xhr = new XMLHttpRequest();
tail j=5082 line= xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
tail j=5083 line=// xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
tail j=5084 line= xhr.onload = function() {
tail j=5085 line= progress.value = progress.innerHTML = 100;
tail j=5086 line= };
tail j=5087 line=
tail j=5088 line= if (tests.progress) {
tail j=5089 line= xhr.upload.onprogress = function (event) {
tail j=5090 line= if (event.lengthComputable) {
tail j=5091 line= var complete = (event.loaded / event.total * 100 | 0);
tail j=5092 line= progress.value = progress.innerHTML = complete;
tail j=5093 line= }
tail j=5094 line= }
tail j=5095 line= }
tail j=5096 line=
tail j=5097 line= xhr.send(formData);
tail j=5098 line= }
tail j=5099 line= }
tail j=5100 line=
tail j=5101 line= if (tests.dnd) {
tail j=5102 line= holder.ondragover = function () { this.className = 'hover'; return false; };
tail j=5103 line= holder.ondragend = function () { this.className = ''; return false; };
tail j=5104 line= holder.ondrop = function (e) {
tail j=5105 line= this.className = '';
tail j=5106 line= e.preventDefault();
tail j=5107 line= readfiles(e.dataTransfer.files);
tail j=5108 line= }
tail j=5109 line= }
tail j=5110 line= else {
tail j=5111 line= fileupload.className = 'hidden';
tail j=5112 line= fileupload.querySelector('input').onchange = function () {
tail j=5113 line= readfiles(this.files);
tail j=5114 line= };
tail j=5115 line= }
tail j=5116 line= </script id="script_previewfile">
tail j=5117 line=
tail j=5118 line= <script id="script_myfilework>
tail j=5119 line= funtion myfilework( j, file ) {
tail j=5120 line=
tail j=5121 line= alert( j+" file="+file );
tail j=5122 line= }
tail j=5123 line=
tail j=5124 line= </script id="script_myfilework>
tail j=5125 line=
tail j=5126 line=
tail j=5127 line=
tail j=5128 line=
tail j=5129 line=
tail j=5130 line= <script id="script_upload_input">>
tail j=5131 line= var upload = document.getElementsByTagName('input')[0],
tail j=5132 line= holder2 = document.getElementById('holder2'),
tail j=5133 line= state = document.getElementById('status');
tail j=5134 line=
tail j=5135 line= if (typeof window.FileReader === 'undefined') {
tail j=5136 line= state.className = 'fail';
tail j=5137 line= }
tail j=5138 line= else {
tail j=5139 line= state.className = 'success';
tail j=5140 line= state.innerHTML = 'File API & FileReader available';
tail j=5141 line= }
tail j=5142 line=
tail j=5143 line= upload.onchange = function (e) {
tail j=5144 line= e.preventDefault();
tail j=5145 line=
tail j=5146 line= var file = upload.files[0],
tail j=5147 line= reader = new FileReader();
tail j=5148 line= reader.onload = function (event) {
tail j=5149 line= var img = new Image();
tail j=5150 line= img.src = event.target.result;
tail j=5151 line=// note: no onload required since we've got the dataurl...I think! :)
tail j=5152 line= if (img.width > 560) { // holder width
tail j=5153 line= img.width = 560;
tail j=5154 line= }
tail j=5155 line= holder2.innerHTML = '';
tail j=5156 line= holder.appendChild(img);
tail j=5157 line= };
tail j=5158 line= reader.readAsDataURL(file);
tail j=5159 line=
tail j=5160 line= return false;
tail j=5161 line= };
tail j=5162 line=
tail j=5163 line=// var formData = new FormData();
tail j=5164 line=// formData.append("part_num", "123ABC");
tail j=5165 line=// formData.append("part_price", 7.95);
tail j=5166 line=// formData.append("part_image", somefile)
tail j=5167 line=//
tail j=5168 line=// var xhr = new XMLHttpRequest();
tail j=5169 line=// xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");
tail j=5170 line=// xhr.send(formData);
tail j=5171 line= </script id="script_upload_input">>
tail j=5172 line=
tail j=5173 line= <canvas id="canvas_1" color="darkSlategrey" height="100" width="400">
tail j=5174 line= </canvas id="canvas_1" >
tail j=5175 line=
tail j=5176 line=
tail j=5177 line= <script id="script_canvas_1" >
tail j=5178 line= var canvas = document.getElementsByTagName('canvas_1')[0],
tail j=5179 line= ctx = null,
tail j=5180 line= grad = null,
tail j=5181 line= body = document.getElementsByTagName('body')[0],
tail j=5182 line= color = 255;
tail j=5183 line= color = lightblue;
tail j=5184 line=
tail j=5185 line=if (canvas.getContext('2d')) {
tail j=5186 line= ctx = canvas.getContext('2d');
tail j=5187 line= ctx.clearRect(0, 0, 600, 600);
tail j=5188 line= ctx.save();
tail j=5189 line=
tail j=5190 line=// Create radial gradient
tail j=5191 line=// grad = ctx.createRadialGradient(0,0,0,0,0,600);
tail j=5192 line=// grad.addColorStop(0, '#000');
tail j=5193 line=// grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');
tail j=5194 line=
tail j=5195 line= // assign gradients to fill
tail j=5196 line=// ctx.fillStyle = grad;
tail j=5197 line= ctx.fillstyle = "lightblue";
tail j=5198 line=
tail j=5199 line= // draw 600x600 fill
tail j=5200 line= ctx.fillRect(0,0,600,600);
tail j=5201 line= ctx.save();
tail j=5202 line=
tail j=5203 line= body.onmousemove = function (event) {
tail j=5204 line= var width = window.innerWidth,
tail j=5205 line= height = window.innerHeight,
tail j=5206 line= x = event.clientX,
tail j=5207 line= y = event.clientY,
tail j=5208 line= rx = 600 * x / width,
tail j=5209 line= ry = 600 * y / height;
tail j=5210 line=
tail j=5211 line= var xc = ~~(256 * x / width);
tail j=5212 line= var yc = ~~(256 * y / height);
tail j=5213 line=
tail j=5214 line= grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600);
tail j=5215 line= grad.addColorStop(0, '#000');
tail j=5216 line= grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
tail j=5217 line= // ctx.restore();
tail j=5218 line=// ctx.fillStyle = grad;
tail j=5219 line= ctx.fillstyle="lightblue";
tail j=5220 line= ctx.fillRect(0,0,600,600);
tail j=5221 line= // ctx.save();
tail j=5222 line= };
tail j=5223 line=}
tail j=5224 line= </script id="script_canvas_1" >
tail j=5225 line=
tail j=5226 line= <div id="div_csv"><h3></h3>
tail j=5227 line= </div id="div_csv">
tail j=5228 line=
tail j=5229 line= <script id="script_upload" type="text/javascript">
tail j=5230 line=// function upload_csv() {
tail j=5231 line= function Upload() {
tail j=5232 line=// var files = evt.dataTransfer.files; // FileList object.
tail j=5233 line=// var fileUpload = document.getElementById("upload_files");
tail j=5234 line= var fileUpload = document.getElementById("fileUpload");
tail j=5235 line= var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
tail j=5236 line=// if (regex.test(fileUpload.value.toLowerCase())) {
tail j=5237 line= if (regex.test(fileUpload.value.toLowerCase())) {
tail j=5238 line= if (typeof (FileReader) != "undefined") {
tail j=5239 line= var reader = new FileReader();
tail j=5240 line= reader.onload = function (e) {
tail j=5241 line= var table = document.createElement("table");
tail j=5242 line= var rows = e.target.result.split("\n");
tail j=5243 line= for (var i = 0; i < rows.length; i++) {
tail j=5244 line= var row = table.insertRow(-1);
tail j=5245 line=
tail j=5246 line=// var cells = rows[i].split("|");
tail j=5247 line= var cells = rows[i].split(",");
tail j=5248 line= for (var j = 0; j < cells.length; j++) {
tail j=5249 line= var cell = row.insertCell(-1);
tail j=5250 line= cell.innerHTML = cells[j];
tail j=5251 line= }
tail j=5252 line= }
tail j=5253 line= var csv2tbl = document.getElementById("csv2tbl");
tail j=5254 line= csv2tbl.innerHTML = "";
tail j=5255 line= csv2tbl.appendChild(table);
tail j=5256 line= }
tail j=5257 line= reader.readAsText(fileUpload.files[0]);
tail j=5258 line= file_csv=fileUpload.files[0];
tail j=5259 line= file_csvlen = fileUpload.files.length;
tail j=5260 line= alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
tail j=5261 line= load_file_csv(file_csv);
tail j=5262 line= }
tail j=5263 line= else {
tail j=5264 line= alert("csv2tbl warn: unauthorized access noted");
tail j=5265 line= }
tail j=5266 line= }
tail j=5267 line= else {
tail j=5268 line= alert("csv2tbl fail: unsuppoted format");
tail j=5269 line= }
tail j=5270 line= }
tail j=5271 line= </script id="script_upload" type="text/javascript">
tail j=5272 line=
tail j=5273 line= <script id="script_load_file_csv">
tail j=5274 line= function load_file_csv(file_csv) {
tail j=5275 line= alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
tail j=5276 line= file_psv=file_csv;
tail j=5277 line= return(file_psv);
tail j=5278 line= }
tail j=5279 line= </script id="script_load_file_csv">
tail j=5280 line=
tail j=5281 line= <div id="div_filecontainer" >
tail j=5282 line= <label class="fileContainer">
tail j=5283 line= files.csv.psv.txt
tail j=5284 line= <input id="fileUpload" type="file"></input>
tail j=5285 line= </label>
tail j=5286 line=
tail j=5287 line=      
tail j=5288 line= <label class="fileContainer">
tail j=5289 line= parse.csv.psv.txt
tail j=5290 line= <input id="upload" value="Upload" onclick="Upload()" type="button"></input>
tail j=5291 line= </label>
tail j=5292 line= </div id="div_filecontainer" >
tail j=5293 line=
tail j=5294 line=
tail j=5295 line=
tail j=5296 line= <div id="div_csv2tbl"><h3>csv2tbl</h3>
tail j=5297 line= </div id="div_csv2tbl" >
tail j=5298 line=
tail j=5299 line=<!--
tail j=5300 line= <button type="button" id="fileUpload" type="file" >select</button>
tail j=5301 line= <button type="button" id="upload" value="Upload" onclick="Upload()">upload</button>
tail j=5302 line= -->
tail j=5303 line=
tail j=5304 line=<!--
tail j=5305 line=
tail j=5306 line= <div id="div_showhide" hidden>
tail j=5307 line= <script id="script_showhide" >
tail j=5308 line= function show_files() {
tail j=5309 line= var div_files = document.getElementbyID("div_files");
tail j=5310 line= div_files.show();
tail j=5311 line= }
tail j=5312 line= function hide_files() {
tail j=5313 line= var div_files = document.getElementbyID("div_files");
tail j=5314 line= div_files.hide();
tail j=5315 line= }
tail j=5316 line= </script id="script_showhide" hidden>
tail j=5317 line=
tail j=5318 line= <button type="button" id="show">show</button>
tail j=5319 line= <button type="button" id="hide">hide</button>
tail j=5320 line= <button type="show_files" id="show_files" onclick="show_files()">Show_files</button>
tail j=5321 line= <button type="hide_files" id="hide_files" onclick="hide_files()">Hide_files</button>
tail j=5322 line= <button type="show_neave_wobble" id="show_neave_wobble">Show_neave_wobble</button>
tail j=5323 line= <button type="hide_neave_wobble" id="hide_neave_wobble">Hide_neave_wobble</button>
tail j=5324 line= -->
tail j=5325 line=<!--
tail j=5326 line= <button type="show_dd" id="show_dd">Show_dd</button>
tail j=5327 line= <button type="hide_dd" id="hide_dd">Hide_dd</button>
tail j=5328 line= <button type="show_bb" id="show_bb">Show_bb</button>
tail j=5329 line= <button type="hide_bb" id="hide_bb">Hide_bb</button>
tail j=5330 line= <button type="show_tl" id="show_tl">Show_tl</button>
tail j=5331 line= <button type="hide_tl" id="hide_tl">Hide_tl</button>
tail j=5332 line= <button type="show_colors" id="show_colors">Show_colors</button>
tail j=5333 line= <button type="hide_colors" id="hide_colors">Hide_colors</button>
tail j=5334 line= <button type="show_fonts" id="show_fonts">Show_fonts</button>
tail j=5335 line= <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
tail j=5336 line= <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
tail j=5337 line= <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
tail j=5338 line= -->
tail j=5339 line= </div id="dvi_showhide" >
tail j=5340 line=
tail j=5341 line=
tail j=5342 line= <div id="item" >div_item
tail j=5343 line= </div id="item">
tail j=5344 line=
tail j=5345 line=<!--
tail j=5346 line= <script id="script_showhide">
tail j=5347 line= $( "#show" ).click(function() {$('#item').show(); });
tail j=5348 line= $( "#hide" ).click(function() {$('#item').hide();});
tail j=5349 line= $( "#show_files" ).click(function() {$('#div_files').show(); });
tail j=5350 line= $( "#hide_files" ).click(function() {$('#div_files').hide();});
tail j=5351 line= $( "#show_neave_wobble" ).click(function() {$('#div_neave_wobble').show(); });
tail j=5352 line= $( "#hide_neave_wobble" ).click(function() {$('#div_neave_wobble').hide();});
tail j=5353 line=// $( "#show_dd" ).click(function() {$('#div_dd').show(); });
tail j=5354 line=// $( "#hide_dd" ).click(function() {$('#div_dd').hide();});
tail j=5355 line=// $( "#show_bb" ).click(function() {$('#div_bb').show(); });
tail j=5356 line=// $( "#hide_bb" ).click(function() {$('#div_bb').hide();});
tail j=5357 line=// $( "#show_tl" ).click(function() {$('#div_tl').show(); });
tail j=5358 line=// $( "#hide_tl" ).click(function() {$('#div_tl').hide();});
tail j=5359 line=// $( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
tail j=5360 line=// $( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
tail j=5361 line=// $( "#show_colors" ).click(function() {$('#div_colors').show(); });
tail j=5362 line=// $( "#hide_colors" ).click(function() {$('#div_colors').hide();});
tail j=5363 line=// $( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
tail j=5364 line=// $( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
tail j=5365 line=// $( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
tail j=5366 line=// $( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
tail j=5367 line= </script id="script_showhide" >
tail j=5368 line= -->
tail j=5369 line=
tail j=5370 line=
tail j=5371 line=<!--[if IE] -->
tail j=5372 line=<!--
tail j=5373 line= <script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
tail j=5374 line= -->
tail j=5375 line=<!-- <![endif]-->
tail j=5376 line=<!--
tail j=5377 line= <div class="la-anim-10" hidden></div>
tail j=5378 line= -->
tail j=5379 line=
tail j=5380 line=<!-- .corner-preloader -->
tail j=5381 line=<!--
tail j=5382 line= <div id="wrapper" hidden>
tail j=5383 line= <div id="upload-widget">
tail j=5384 line= <h1>
tail j=5385 line= <i class="fa fa-cloud-upload"></i> File Uploader
tail j=5386 line= </h1>
tail j=5387 line=
tail j=5388 line= <form id="file-upload-form">
tail j=5389 line= <div class="file-input-wrap">
tail j=5390 line= fups
tail j=5391 line= <input type="file" name="file" id="file" multiple>
tail j=5392 line= </div><!-- .file-input-wrap -->
tail j=5393 line= </form><!-- #file-upload-form -->
tail j=5394 line= </div><!-- #upload-widget -->
tail j=5395 line=
tail j=5396 line= <div id="upload-result">
tail j=5397 line= </div><!-- #upload-result -->
tail j=5398 line= </div><!-- #wrapper -->
tail j=5399 line=
tail j=5400 line= <div id="preloader">
tail j=5401 line= <img height=50 src="/imgs/btn/kob.png" alt="preloader_up" />
tail j=5402 line= </a>
tail j=5403 line= </div>
tail j=5404 line=
tail j=5405 line= <!-- SCRIPTS -->
tail j=5406 line=<!-- <script type="text/javascript" src="js/libraries/jquery-2.1.1.min.js"></script> -->
tail j=5407 line=<!-- <script type="text/javascript" src="/js/vue.js" > -->
tail j=5408 line= <script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIFZ1ZS5qcyB2Mi41LjE3CiAqIChjKSAyMDE0LTIwMTggRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDoKCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6CgkoZ2xvYmFsLlZ1ZSA9IGZhY3RvcnkoKSk7Cn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOwoKLyogICovCgp2YXIgZW1wdHlPYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTsKCi8vIHRoZXNlIGhlbHBlcnMgcHJvZHVjZXMgYmV0dGVyIHZtIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXIKLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZwpmdW5jdGlvbiBpc1VuZGVmICh2KSB7CiAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsCn0KCmZ1bmN0aW9uIGlzRGVmICh2KSB7CiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsCn0KCmZ1bmN0aW9uIGlzVHJ1ZSAodikgewogIHJldHVybiB2ID09PSB0cnVlCn0KCmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHsKICByZXR1cm4gdiA9PT0gZmFsc2UKfQoKLyoqCiAqIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZQogKi8KZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbHVlKSB7CiAgcmV0dXJuICgKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwKICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fAogICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicKICApCn0KCi8qKgogKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGwKICogT2JqZWN0cyBmcm9tIHByaW1pdGl2ZSB2YWx1ZXMgd2hlbiB3ZSBrbm93IHRoZSB2YWx1ZQogKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuCiAqLwpmdW5jdGlvbiBpc09iamVjdCAob2JqKSB7CiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jwp9CgovKioKICogR2V0IHRoZSByYXcgdHlwZSBzdHJpbmcgb2YgYSB2YWx1ZSBlLmcuIFtvYmplY3QgT2JqZWN0XQogKi8KdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpmdW5jdGlvbiB0b1Jhd1R5cGUgKHZhbHVlKSB7CiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSkKfQoKLyoqCiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWUKICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy4KICovCmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJwp9CgpmdW5jdGlvbiBpc1JlZ0V4cCAodikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXScKfQoKLyoqCiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LgogKi8KZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkgewogIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodmFsKSk7CiAgcmV0dXJuIG4gPj0gMCAmJiBNYXRoLmZsb29yKG4pID09PSBuICYmIGlzRmluaXRlKHZhbCkKfQoKLyoqCiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLgogKi8KZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkgewogIHJldHVybiB2YWwgPT0gbnVsbAogICAgPyAnJwogICAgOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JwogICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMikKICAgICAgOiBTdHJpbmcodmFsKQp9CgovKioKICogQ29udmVydCBhIGlucHV0IHZhbHVlIHRvIGEgbnVtYmVyIGZvciBwZXJzaXN0ZW5jZS4KICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuCiAqLwpmdW5jdGlvbiB0b051bWJlciAodmFsKSB7CiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7CiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbgp9CgovKioKICogTWFrZSBhIG1hcCBhbmQgcmV0dXJuIGEgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGEga2V5CiAqIGlzIGluIHRoYXQgbWFwLgogKi8KZnVuY3Rpb24gbWFrZU1hcCAoCiAgc3RyLAogIGV4cGVjdHNMb3dlckNhc2UKKSB7CiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7CiAgfQogIHJldHVybiBleHBlY3RzTG93ZXJDYXNlCiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH0KICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH0KfQoKLyoqCiAqIENoZWNrIGlmIGEgdGFnIGlzIGEgYnVpbHQtaW4gdGFnLgogKi8KdmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7CgovKioKICogQ2hlY2sgaWYgYSBhdHRyaWJ1dGUgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUuCiAqLwp2YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzJyk7CgovKioKICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheQogKi8KZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHsKICBpZiAoYXJyLmxlbmd0aCkgewogICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSkKICAgIH0KICB9Cn0KCi8qKgogKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS4KICovCnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHsKICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkKfQoKLyoqCiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi4KICovCmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHsKICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHJldHVybiAoZnVuY3Rpb24gY2FjaGVkRm4gKHN0cikgewogICAgdmFyIGhpdCA9IGNhY2hlW3N0cl07CiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSkKICB9KQp9CgovKioKICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy4KICovCnZhciBjYW1lbGl6ZVJFID0gLy0oXHcpL2c7CnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIGZ1bmN0aW9uIChfLCBjKSB7IHJldHVybiBjID8gYy50b1VwcGVyQ2FzZSgpIDogJyc7IH0pCn0pOwoKLyoqCiAqIENhcGl0YWxpemUgYSBzdHJpbmcuCiAqLwp2YXIgY2FwaXRhbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKQp9KTsKCi8qKgogKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLgogKi8KdmFyIGh5cGhlbmF0ZVJFID0gL1xCKFtBLVpdKS9nOwp2YXIgaHlwaGVuYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsICctJDEnKS50b0xvd2VyQ2FzZSgpCn0pOwoKLyoqCiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdC4uLiBlLmcuCiAqIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5IHdlIGRvbid0IG5lZWQgdGhpcyBhbnltb3JlIHNpbmNlIG5hdGl2ZSBiaW5kIGlzCiAqIG5vdyBtb3JlIHBlcmZvcm1hbnQgaW4gbW9zdCBicm93c2VycywgYnV0IHJlbW92aW5nIGl0IHdvdWxkIGJlIGJyZWFraW5nIGZvcgogKiBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluIFBoYW50b21KUyAxLngsIHNvIHRoaXMgbXVzdCBiZSBrZXB0IGZvcgogKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICovCgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBwb2x5ZmlsbEJpbmQgKGZuLCBjdHgpIHsKICBmdW5jdGlvbiBib3VuZEZuIChhKSB7CiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICByZXR1cm4gbAogICAgICA/IGwgPiAxCiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cykKICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKQogICAgICA6IGZuLmNhbGwoY3R4KQogIH0KCiAgYm91bmRGbi5fbGVuZ3RoID0gZm4ubGVuZ3RoOwogIHJldHVybiBib3VuZEZuCn0KCmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHsKICByZXR1cm4gZm4uYmluZChjdHgpCn0KCnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQKICA/IG5hdGl2ZUJpbmQKICA6IHBvbHlmaWxsQmluZDsKCi8qKgogKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS4KICovCmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7CiAgc3RhcnQgPSBzdGFydCB8fCAwOwogIHZhciBpID0gbGlzdC5sZW5ndGggLSBzdGFydDsKICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpOwogIHdoaWxlIChpLS0pIHsKICAgIHJldFtpXSA9IGxpc3RbaSArIHN0YXJ0XTsKICB9CiAgcmV0dXJuIHJldAp9CgovKioKICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LgogKi8KZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHsKICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHsKICAgIHRvW2tleV0gPSBfZnJvbVtrZXldOwogIH0KICByZXR1cm4gdG8KfQoKLyoqCiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuCiAqLwpmdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7CiAgdmFyIHJlcyA9IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoYXJyW2ldKSB7CiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyoqCiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLgogKiBTdHViYmluZyBhcmdzIHRvIG1ha2UgRmxvdyBoYXBweSB3aXRob3V0IGxlYXZpbmcgdXNlbGVzcyB0cmFuc3BpbGVkIGNvZGUKICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pCiAqLwpmdW5jdGlvbiBub29wIChhLCBiLCBjKSB7fQoKLyoqCiAqIEFsd2F5cyByZXR1cm4gZmFsc2UuCiAqLwp2YXIgbm8gPSBmdW5jdGlvbiAoYSwgYiwgYykgeyByZXR1cm4gZmFsc2U7IH07CgovKioKICogUmV0dXJuIHNhbWUgdmFsdWUKICovCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9OwoKLyoqCiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy4KICovCmZ1bmN0aW9uIGdlblN0YXRpY0tleXMgKG1vZHVsZXMpIHsKICByZXR1cm4gbW9kdWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGtleXMsIG0pIHsKICAgIHJldHVybiBrZXlzLmNvbmNhdChtLnN0YXRpY0tleXMgfHwgW10pCiAgfSwgW10pLmpvaW4oJywnKQp9CgovKioKICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsCiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT8KICovCmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHsKICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9CiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpOwogIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTsKICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0QikgewogICAgdHJ5IHsKICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTsKICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTsKICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7CiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKQogICAgICAgIH0pCiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5QikgewogICAgICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKGEpOwogICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpOwogICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChhW2tleV0sIGJba2V5XSkKICAgICAgICB9KQogICAgICB9IGVsc2UgewogICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHsKICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2UKICB9Cn0KCmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgaWYgKGxvb3NlRXF1YWwoYXJyW2ldLCB2YWwpKSB7IHJldHVybiBpIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qKgogKiBFbnN1cmUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlLgogKi8KZnVuY3Rpb24gb25jZSAoZm4pIHsKICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgIGlmICghY2FsbGVkKSB7CiAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfQp9Cgp2YXIgU1NSX0FUVFIgPSAnZGF0YS1zZXJ2ZXItcmVuZGVyZWQnOwoKdmFyIEFTU0VUX1RZUEVTID0gWwogICdjb21wb25lbnQnLAogICdkaXJlY3RpdmUnLAogICdmaWx0ZXInCl07Cgp2YXIgTElGRUNZQ0xFX0hPT0tTID0gWwogICdiZWZvcmVDcmVhdGUnLAogICdjcmVhdGVkJywKICAnYmVmb3JlTW91bnQnLAogICdtb3VudGVkJywKICAnYmVmb3JlVXBkYXRlJywKICAndXBkYXRlZCcsCiAgJ2JlZm9yZURlc3Ryb3knLAogICdkZXN0cm95ZWQnLAogICdhY3RpdmF0ZWQnLAogICdkZWFjdGl2YXRlZCcsCiAgJ2Vycm9yQ2FwdHVyZWQnCl07CgovKiAgKi8KCnZhciBjb25maWcgPSAoewogIC8qKgogICAqIE9wdGlvbiBtZXJnZSBzdHJhdGVnaWVzICh1c2VkIGluIGNvcmUvdXRpbC9vcHRpb25zKQogICAqLwogIC8vICRmbG93LWRpc2FibGUtbGluZQogIG9wdGlvbk1lcmdlU3RyYXRlZ2llczogT2JqZWN0LmNyZWF0ZShudWxsKSwKCiAgLyoqCiAgICogV2hldGhlciB0byBzdXBwcmVzcyB3YXJuaW5ncy4KICAgKi8KICBzaWxlbnQ6IGZhbHNlLAoKICAvKioKICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290PwogICAqLwogIHByb2R1Y3Rpb25UaXA6ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJywKCiAgLyoqCiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHMKICAgKi8KICBkZXZ0b29sczogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nLAoKICAvKioKICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmCiAgICovCiAgcGVyZm9ybWFuY2U6IGZhbHNlLAoKICAvKioKICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9ycwogICAqLwogIGVycm9ySGFuZGxlcjogbnVsbCwKCiAgLyoqCiAgICogV2FybiBoYW5kbGVyIGZvciB3YXRjaGVyIHdhcm5zCiAgICovCiAgd2FybkhhbmRsZXI6IG51bGwsCgogIC8qKgogICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50cwogICAqLwogIGlnbm9yZWRFbGVtZW50czogW10sCgogIC8qKgogICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uCiAgICovCiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCgogIC8qKgogICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYQogICAqIGNvbXBvbmVudC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi4KICAgKi8KICBpc1Jlc2VydmVkVGFnOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnQKICAgKiBwcm9wLiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLgogICAqLwogIGlzUmVzZXJ2ZWRBdHRyOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LgogICAqIFBsYXRmb3JtLWRlcGVuZGVudC4KICAgKi8KICBpc1Vua25vd25FbGVtZW50OiBubywKCiAgLyoqCiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudAogICAqLwogIGdldFRhZ05hbWVzcGFjZTogbm9vcCwKCiAgLyoqCiAgICogUGFyc2UgdGhlIHJlYWwgdGFnIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybS4KICAgKi8KICBwYXJzZVBsYXRmb3JtVGFnTmFtZTogaWRlbnRpdHksCgogIC8qKgogICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIGJvdW5kIHVzaW5nIHByb3BlcnR5LCBlLmcuIHZhbHVlCiAgICogUGxhdGZvcm0tZGVwZW5kZW50LgogICAqLwogIG11c3RVc2VQcm9wOiBubywKCiAgLyoqCiAgICogRXhwb3NlZCBmb3IgbGVnYWN5IHJlYXNvbnMKICAgKi8KICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LUwp9KQoKLyogICovCgovKioKICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfCiAqLwpmdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHsKICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTsKICByZXR1cm4gYyA9PT0gMHgyNCB8fCBjID09PSAweDVGCn0KCi8qKgogKiBEZWZpbmUgYSBwcm9wZXJ0eS4KICovCmZ1bmN0aW9uIGRlZiAob2JqLCBrZXksIHZhbCwgZW51bWVyYWJsZSkgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgdmFsdWU6IHZhbCwKICAgIGVudW1lcmFibGU6ICEhZW51bWVyYWJsZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7Cn0KCi8qKgogKiBQYXJzZSBzaW1wbGUgcGF0aC4KICovCnZhciBiYWlsUkUgPSAvW15cdy4kXS87CmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkgewogIGlmIChiYWlsUkUudGVzdChwYXRoKSkgewogICAgcmV0dXJuCiAgfQogIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy4nKTsKICByZXR1cm4gZnVuY3Rpb24gKG9iaikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIW9iaikgeyByZXR1cm4gfQogICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dOwogICAgfQogICAgcmV0dXJuIG9iagogIH0KfQoKLyogICovCgovLyBjYW4gd2UgdXNlIF9fcHJvdG9fXz8KdmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307CgovLyBCcm93c2VyIGVudmlyb25tZW50IHNuaWZmaW5nCnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJzsKdmFyIGluV2VleCA9IHR5cGVvZiBXWEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhIVdYRW52aXJvbm1lbnQucGxhdGZvcm07CnZhciB3ZWV4UGxhdGZvcm0gPSBpbldlZXggJiYgV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOwp2YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKdmFyIGlzSUUgPSBVQSAmJiAvbXNpZXx0cmlkZW50Ly50ZXN0KFVBKTsKdmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7CnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDsKdmFyIGlzQW5kcm9pZCA9IChVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwKSB8fCAod2VleFBsYXRmb3JtID09PSAnYW5kcm9pZCcpOwp2YXIgaXNJT1MgPSAoVUEgJiYgL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KFVBKSkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2lvcycpOwp2YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXC9cZCsvLnRlc3QoVUEpICYmICFpc0VkZ2U7CgovLyBGaXJlZm94IGhhcyBhICJ3YXRjaCIgZnVuY3Rpb24gb24gT2JqZWN0LnByb3RvdHlwZS4uLgp2YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoOwoKdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlOwppZiAoaW5Ccm93c2VyKSB7CiAgdHJ5IHsKICAgIHZhciBvcHRzID0ge307CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOwogICAgICB9CiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODUKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTsKICB9IGNhdGNoIChlKSB7fQp9CgovLyB0aGlzIG5lZWRzIHRvIGJlIGxhenktZXZhbGVkIGJlY2F1c2UgdnVlIG1heSBiZSByZXF1aXJlZCBiZWZvcmUKLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlYKdmFyIF9pc1NlcnZlcjsKdmFyIGlzU2VydmVyUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkgewogIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWluQnJvd3NlciAmJiAhaW5XZWV4ICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZAogICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzCiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJzsKICAgIH0gZWxzZSB7CiAgICAgIF9pc1NlcnZlciA9IGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gX2lzU2VydmVyCn07CgovLyBkZXRlY3QgZGV2dG9vbHMKdmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fOwoKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHsKICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSkKfQoKdmFyIGhhc1N5bWJvbCA9CiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJgogIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpOwoKdmFyIF9TZXQ7Ci8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLyAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHsKICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS4KICBfU2V0ID0gU2V0Owp9IGVsc2UgewogIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy4KICBfU2V0ID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFNldCAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWUKICAgIH07CiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoa2V5KSB7CiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlOwogICAgfTsKICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH07CgogICAgcmV0dXJuIFNldDsKICB9KCkpOwp9CgovKiAgKi8KCnZhciB3YXJuID0gbm9vcDsKdmFyIHRpcCA9IG5vb3A7CnZhciBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gKG5vb3ApOyAvLyB3b3JrIGFyb3VuZCBmbG93IGNoZWNrCnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApOwoKewogIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnOwogIHZhciBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXHcpL2c7CiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyCiAgICAucmVwbGFjZShjbGFzc2lmeVJFLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KQogICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9OwoKICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHsKICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJzsKCiAgICBpZiAoY29uZmlnLndhcm5IYW5kbGVyKSB7CiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTsKICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoKCJbVnVlIHdhcm5dOiAiICsgbXNnICsgdHJhY2UpKTsKICAgIH0KICB9OwoKICB0aXAgPSBmdW5jdGlvbiAobXNnLCB2bSkgewogICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkgewogICAgICBjb25zb2xlLndhcm4oIltWdWUgdGlwXTogIiArIG1zZyArICgKICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJycKICAgICAgKSk7CiAgICB9CiAgfTsKCiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHsKICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHsKICAgICAgcmV0dXJuICc8Um9vdD4nCiAgICB9CiAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiB2bSA9PT0gJ2Z1bmN0aW9uJyAmJiB2bS5jaWQgIT0gbnVsbAogICAgICA/IHZtLm9wdGlvbnMKICAgICAgOiB2bS5faXNWdWUKICAgICAgICA/IHZtLiRvcHRpb25zIHx8IHZtLmNvbnN0cnVjdG9yLm9wdGlvbnMKICAgICAgICA6IHZtIHx8IHt9OwogICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnOwogICAgdmFyIGZpbGUgPSBvcHRpb25zLl9fZmlsZTsKICAgIGlmICghbmFtZSAmJiBmaWxlKSB7CiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXF0rKVwudnVlJC8pOwogICAgICBuYW1lID0gbWF0Y2ggJiYgbWF0Y2hbMV07CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgKG5hbWUgPyAoIjwiICsgKGNsYXNzaWZ5KG5hbWUpKSArICI+IikgOiAiPEFub255bW91cz4iKSArCiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/ICgiIGF0ICIgKyBmaWxlKSA6ICcnKQogICAgKQogIH07CgogIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7CiAgICB2YXIgcmVzID0gJyc7CiAgICB3aGlsZSAobikgewogICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfQogICAgICBpZiAobiA+IDEpIHsgc3RyICs9IHN0cjsgfQogICAgICBuID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlcwogIH07CgogIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSBmdW5jdGlvbiAodm0pIHsKICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkgewogICAgICB2YXIgdHJlZSA9IFtdOwogICAgICB2YXIgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgd2hpbGUgKHZtKSB7CiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07CiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7CiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDsKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkgewogICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJlZS5wdXNoKHZtKTsKICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuICdcblxuZm91bmQgaW5cblxuJyArIHRyZWUKICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKCIiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSkKICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArICIuLi4gKCIgKyAodm1bMV0pICsgIiByZWN1cnNpdmUgY2FsbHMpIikKICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KQogICAgICAgIC5qb2luKCdcbicpCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gKCJcblxuKGZvdW5kIGluICIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgIikiKQogICAgfQogIH07Cn0KCi8qICAqLwoKCnZhciB1aWQgPSAwOwoKLyoqCiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZQogKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LgogKi8KdmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7CiAgdGhpcy5pZCA9IHVpZCsrOwogIHRoaXMuc3VicyA9IFtdOwp9OwoKRGVwLnByb3RvdHlwZS5hZGRTdWIgPSBmdW5jdGlvbiBhZGRTdWIgKHN1YikgewogIHRoaXMuc3Vicy5wdXNoKHN1Yik7Cn07CgpEZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7CiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTsKfTsKCkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHsKICBpZiAoRGVwLnRhcmdldCkgewogICAgRGVwLnRhcmdldC5hZGREZXAodGhpcyk7CiAgfQp9OwoKRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkgewogIC8vIHN0YWJpbGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0CiAgdmFyIHN1YnMgPSB0aGlzLnN1YnMuc2xpY2UoKTsKICBmb3IgKHZhciBpID0gMCwgbCA9IHN1YnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICBzdWJzW2ldLnVwZGF0ZSgpOwogIH0KfTsKCi8vIHRoZSBjdXJyZW50IHRhcmdldCB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZC4KLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZQovLyB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZCBhdCBhbnkgdGltZS4KRGVwLnRhcmdldCA9IG51bGw7CnZhciB0YXJnZXRTdGFjayA9IFtdOwoKZnVuY3Rpb24gcHVzaFRhcmdldCAoX3RhcmdldCkgewogIGlmIChEZXAudGFyZ2V0KSB7IHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldCk7IH0KICBEZXAudGFyZ2V0ID0gX3RhcmdldDsKfQoKZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHsKICBEZXAudGFyZ2V0ID0gdGFyZ2V0U3RhY2sucG9wKCk7Cn0KCi8qICAqLwoKdmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUgKAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIHRleHQsCiAgZWxtLAogIGNvbnRleHQsCiAgY29tcG9uZW50T3B0aW9ucywKICBhc3luY0ZhY3RvcnkKKSB7CiAgdGhpcy50YWcgPSB0YWc7CiAgdGhpcy5kYXRhID0gZGF0YTsKICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgdGhpcy50ZXh0ID0gdGV4dDsKICB0aGlzLmVsbSA9IGVsbTsKICB0aGlzLm5zID0gdW5kZWZpbmVkOwogIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7CiAgdGhpcy5mbk9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgdGhpcy5mblNjb3BlSWQgPSB1bmRlZmluZWQ7CiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5OwogIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7CiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDsKICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDsKICB0aGlzLnJhdyA9IGZhbHNlOwogIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTsKICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7CiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTsKICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7CiAgdGhpcy5pc09uY2UgPSBmYWxzZTsKICB0aGlzLmFzeW5jRmFjdG9yeSA9IGFzeW5jRmFjdG9yeTsKICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDsKICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlOwp9OwoKdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTsKCi8vIERFUFJFQ0FURUQ6IGFsaWFzIGZvciBjb21wb25lbnRJbnN0YW5jZSBmb3IgYmFja3dhcmRzIGNvbXBhdC4KLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KcHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZQp9OwoKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZOb2RlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7Cgp2YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgaWYgKCB0ZXh0ID09PSB2b2lkIDAgKSB0ZXh0ID0gJyc7CgogIHZhciBub2RlID0gbmV3IFZOb2RlKCk7CiAgbm9kZS50ZXh0ID0gdGV4dDsKICBub2RlLmlzQ29tbWVudCA9IHRydWU7CiAgcmV0dXJuIG5vZGUKfTsKCmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7CiAgcmV0dXJuIG5ldyBWTm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBTdHJpbmcodmFsKSkKfQoKLy8gb3B0aW1pemVkIHNoYWxsb3cgY2xvbmUKLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zcwovLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHkKLy8gb24gdGhlaXIgZWxtIHJlZmVyZW5jZS4KZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHsKICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKAogICAgdm5vZGUudGFnLAogICAgdm5vZGUuZGF0YSwKICAgIHZub2RlLmNoaWxkcmVuLAogICAgdm5vZGUudGV4dCwKICAgIHZub2RlLmVsbSwKICAgIHZub2RlLmNvbnRleHQsCiAgICB2bm9kZS5jb21wb25lbnRPcHRpb25zLAogICAgdm5vZGUuYXN5bmNGYWN0b3J5CiAgKTsKICBjbG9uZWQubnMgPSB2bm9kZS5uczsKICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYzsKICBjbG9uZWQua2V5ID0gdm5vZGUua2V5OwogIGNsb25lZC5pc0NvbW1lbnQgPSB2bm9kZS5pc0NvbW1lbnQ7CiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDsKICBjbG9uZWQuZm5PcHRpb25zID0gdm5vZGUuZm5PcHRpb25zOwogIGNsb25lZC5mblNjb3BlSWQgPSB2bm9kZS5mblNjb3BlSWQ7CiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTsKICByZXR1cm4gY2xvbmVkCn0KCi8qCiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aAogKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGUKICovCgp2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTsKdmFyIGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90byk7Cgp2YXIgbWV0aG9kc1RvUGF0Y2ggPSBbCiAgJ3B1c2gnLAogICdwb3AnLAogICdzaGlmdCcsCiAgJ3Vuc2hpZnQnLAogICdzcGxpY2UnLAogICdzb3J0JywKICAncmV2ZXJzZScKXTsKCi8qKgogKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHMKICovCm1ldGhvZHNUb1BhdGNoLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZAogIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTsKICBkZWYoYXJyYXlNZXRob2RzLCBtZXRob2QsIGZ1bmN0aW9uIG11dGF0b3IgKCkgewogICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07CgogICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgdmFyIG9iID0gdGhpcy5fX29iX187CiAgICB2YXIgaW5zZXJ0ZWQ7CiAgICBzd2l0Y2ggKG1ldGhvZCkgewogICAgICBjYXNlICdwdXNoJzoKICAgICAgY2FzZSAndW5zaGlmdCc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzOwogICAgICAgIGJyZWFrCiAgICAgIGNhc2UgJ3NwbGljZSc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpOwogICAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfQogICAgLy8gbm90aWZ5IGNoYW5nZQogICAgb2IuZGVwLm5vdGlmeSgpOwogICAgcmV0dXJuIHJlc3VsdAogIH0pOwp9KTsKCi8qICAqLwoKdmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7CgovKioKICogSW4gc29tZSBjYXNlcyB3ZSBtYXkgd2FudCB0byBkaXNhYmxlIG9ic2VydmF0aW9uIGluc2lkZSBhIGNvbXBvbmVudCdzCiAqIHVwZGF0ZSBjb21wdXRhdGlvbi4KICovCnZhciBzaG91bGRPYnNlcnZlID0gdHJ1ZTsKCmZ1bmN0aW9uIHRvZ2dsZU9ic2VydmluZyAodmFsdWUpIHsKICBzaG91bGRPYnNlcnZlID0gdmFsdWU7Cn0KCi8qKgogKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWQKICogb2JqZWN0LiBPbmNlIGF0dGFjaGVkLCB0aGUgb2JzZXJ2ZXIgY29udmVydHMgdGhlIHRhcmdldAogKiBvYmplY3QncyBwcm9wZXJ0eSBrZXlzIGludG8gZ2V0dGVyL3NldHRlcnMgdGhhdAogKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy4KICovCnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkgewogIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB0aGlzLmRlcCA9IG5ldyBEZXAoKTsKICB0aGlzLnZtQ291bnQgPSAwOwogIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpOwogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90bwogICAgICA/IHByb3RvQXVnbWVudAogICAgICA6IGNvcHlBdWdtZW50OwogICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpOwogICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpOwogIH0gZWxzZSB7CiAgICB0aGlzLndhbGsodmFsdWUpOwogIH0KfTsKCi8qKgogKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG8KICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCiAqIHZhbHVlIHR5cGUgaXMgT2JqZWN0LgogKi8KT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBkZWZpbmVSZWFjdGl2ZShvYmosIGtleXNbaV0pOwogIH0KfTsKCi8qKgogKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy4KICovCk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9ic2VydmUoaXRlbXNbaV0pOwogIH0KfTsKCi8vIGhlbHBlcnMKCi8qKgogKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nCiAqIHRoZSBwcm90b3R5cGUgY2hhaW4gdXNpbmcgX19wcm90b19fCiAqLwpmdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7CiAgLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi8KICB0YXJnZXQuX19wcm90b19fID0gc3JjOwogIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi8KfQoKLyoqCiAqIEF1Z21lbnQgYW4gdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZwogKiBoaWRkZW4gcHJvcGVydGllcy4KICovCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmZ1bmN0aW9uIGNvcHlBdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykgewogIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgZGVmKHRhcmdldCwga2V5LCBzcmNba2V5XSk7CiAgfQp9CgovKioKICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsCiAqIHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBpZiBzdWNjZXNzZnVsbHkgb2JzZXJ2ZWQsCiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLgogKi8KZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIGFzUm9vdERhdGEpIHsKICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIG9iOwogIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikgewogICAgb2IgPSB2YWx1ZS5fX29iX187CiAgfSBlbHNlIGlmICgKICAgIHNob3VsZE9ic2VydmUgJiYKICAgICFpc1NlcnZlclJlbmRlcmluZygpICYmCiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpICYmCiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJgogICAgIXZhbHVlLl9pc1Z1ZQogICkgewogICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpOwogIH0KICBpZiAoYXNSb290RGF0YSAmJiBvYikgewogICAgb2Iudm1Db3VudCsrOwogIH0KICByZXR1cm4gb2IKfQoKLyoqCiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC4KICovCmZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlICgKICBvYmosCiAga2V5LAogIHZhbCwKICBjdXN0b21TZXR0ZXIsCiAgc2hhbGxvdwopIHsKICB2YXIgZGVwID0gbmV3IERlcCgpOwoKICB2YXIgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTsKICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkgewogICAgcmV0dXJuCiAgfQoKICAvLyBjYXRlciBmb3IgcHJlLWRlZmluZWQgZ2V0dGVyL3NldHRlcnMKICB2YXIgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0OwogIGlmICghZ2V0dGVyICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgIHZhbCA9IG9ialtrZXldOwogIH0KICB2YXIgc2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuc2V0OwoKICB2YXIgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUodmFsKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHsKICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsKICAgICAgaWYgKERlcC50YXJnZXQpIHsKICAgICAgICBkZXAuZGVwZW5kKCk7CiAgICAgICAgaWYgKGNoaWxkT2IpIHsKICAgICAgICAgIGNoaWxkT2IuZGVwLmRlcGVuZCgpOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlCiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7CiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7CiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7CiAgICAgICAgY3VzdG9tU2V0dGVyKCk7CiAgICAgIH0KICAgICAgaWYgKHNldHRlcikgewogICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWwgPSBuZXdWYWw7CiAgICAgIH0KICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTsKICAgICAgZGVwLm5vdGlmeSgpOwogICAgfQogIH0pOwp9CgovKioKICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kCiAqIHRyaWdnZXJzIGNoYW5nZSBub3RpZmljYXRpb24gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QKICogYWxyZWFkeSBleGlzdC4KICovCmZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbCkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3Qgc2V0IHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5sZW5ndGggPSBNYXRoLm1heCh0YXJnZXQubGVuZ3RoLCBrZXkpOwogICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7CiAgICB0YXJnZXRba2V5XSA9IHZhbDsKICAgIHJldHVybiB2YWwKICB9CiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fOwogIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICdBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICsKICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLicKICAgICk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmICghb2IpIHsKICAgIHRhcmdldFtrZXldID0gdmFsOwogICAgcmV0dXJuIHZhbAogIH0KICBkZWZpbmVSZWFjdGl2ZShvYi52YWx1ZSwga2V5LCB2YWwpOwogIG9iLmRlcC5ub3RpZnkoKTsKICByZXR1cm4gdmFsCn0KCi8qKgogKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5LgogKi8KZnVuY3Rpb24gZGVsICh0YXJnZXQsIGtleSkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3QgZGVsZXRlIHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxKTsKICAgIHJldHVybgogIH0KICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187CiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArCiAgICAgICctIGp1c3Qgc2V0IGl0IHRvIG51bGwuJwogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIHsKICAgIHJldHVybgogIH0KICBkZWxldGUgdGFyZ2V0W2tleV07CiAgaWYgKCFvYikgewogICAgcmV0dXJuCiAgfQogIG9iLmRlcC5ub3RpZnkoKTsKfQoKLyoqCiAqIENvbGxlY3QgZGVwZW5kZW5jaWVzIG9uIGFycmF5IGVsZW1lbnRzIHdoZW4gdGhlIGFycmF5IGlzIHRvdWNoZWQsIHNpbmNlCiAqIHdlIGNhbm5vdCBpbnRlcmNlcHQgYXJyYXkgZWxlbWVudCBhY2Nlc3MgbGlrZSBwcm9wZXJ0eSBnZXR0ZXJzLgogKi8KZnVuY3Rpb24gZGVwZW5kQXJyYXkgKHZhbHVlKSB7CiAgZm9yICh2YXIgZSA9ICh2b2lkIDApLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZSA9IHZhbHVlW2ldOwogICAgZSAmJiBlLl9fb2JfXyAmJiBlLl9fb2JfXy5kZXAuZGVwZW5kKCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICBkZXBlbmRBcnJheShlKTsKICAgIH0KICB9Cn0KCi8qICAqLwoKLyoqCiAqIE9wdGlvbiBvdmVyd3JpdGluZyBzdHJhdGVnaWVzIGFyZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb24KICogdmFsdWUgaW50byB0aGUgZmluYWwgdmFsdWUuCiAqLwp2YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llczsKCi8qKgogKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zCiAqLwp7CiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7CiAgICBpZiAoIXZtKSB7CiAgICAgIHdhcm4oCiAgICAgICAgIm9wdGlvbiBcIiIgKyBrZXkgKyAiXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgIiArCiAgICAgICAgJ2NyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJwogICAgICApOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRTdHJhdChwYXJlbnQsIGNoaWxkKQogIH07Cn0KCi8qKgogKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci4KICovCmZ1bmN0aW9uIG1lcmdlRGF0YSAodG8sIGZyb20pIHsKICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH0KICB2YXIga2V5LCB0b1ZhbCwgZnJvbVZhbDsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyb20pOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAga2V5ID0ga2V5c1tpXTsKICAgIHRvVmFsID0gdG9ba2V5XTsKICAgIGZyb21WYWwgPSBmcm9tW2tleV07CiAgICBpZiAoIWhhc093bih0bywga2V5KSkgewogICAgICBzZXQodG8sIGtleSwgZnJvbVZhbCk7CiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodG9WYWwpICYmIGlzUGxhaW5PYmplY3QoZnJvbVZhbCkpIHsKICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTsKICAgIH0KICB9CiAgcmV0dXJuIHRvCn0KCi8qKgogKiBEYXRhCiAqLwpmdW5jdGlvbiBtZXJnZURhdGFPckZuICgKICBwYXJlbnRWYWwsCiAgY2hpbGRWYWwsCiAgdm0KKSB7CiAgaWYgKCF2bSkgewogICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnMKICAgIGlmICghY2hpbGRWYWwpIHsKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgaWYgKCFwYXJlbnRWYWwpIHsKICAgICAgcmV0dXJuIGNoaWxkVmFsCiAgICB9CiAgICAvLyB3aGVuIHBhcmVudFZhbCAmIGNoaWxkVmFsIGFyZSBib3RoIHByZXNlbnQsCiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0bwogICAgLy8gY2hlY2sgaWYgcGFyZW50VmFsIGlzIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlCiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy4KICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkgewogICAgICByZXR1cm4gbWVyZ2VEYXRhKAogICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCwKICAgICAgICB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nID8gcGFyZW50VmFsLmNhbGwodGhpcywgdGhpcykgOiBwYXJlbnRWYWwKICAgICAgKQogICAgfQogIH0gZWxzZSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkSW5zdGFuY2VEYXRhRm4gKCkgewogICAgICAvLyBpbnN0YW5jZSBtZXJnZQogICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBjaGlsZFZhbC5jYWxsKHZtLCB2bSkKICAgICAgICA6IGNoaWxkVmFsOwogICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSwgdm0pCiAgICAgICAgOiBwYXJlbnRWYWw7CiAgICAgIGlmIChpbnN0YW5jZURhdGEpIHsKICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRhCiAgICAgIH0KICAgIH0KICB9Cn0KCnN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bQopIHsKICBpZiAoIXZtKSB7CiAgICBpZiAoY2hpbGRWYWwgJiYgdHlwZW9mIGNoaWxkVmFsICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdUaGUgImRhdGEiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICsKICAgICAgICAndGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCAnICsKICAgICAgICAnZGVmaW5pdGlvbnMuJywKICAgICAgICB2bQogICAgICApOwoKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCkKICB9CgogIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKQp9OwoKLyoqCiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy4KICovCmZ1bmN0aW9uIG1lcmdlSG9vayAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsCikgewogIHJldHVybiBjaGlsZFZhbAogICAgPyBwYXJlbnRWYWwKICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKQogICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpCiAgICAgICAgPyBjaGlsZFZhbAogICAgICAgIDogW2NoaWxkVmFsXQogICAgOiBwYXJlbnRWYWwKfQoKTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHsKICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7Cn0pOwoKLyoqCiAqIEFzc2V0cwogKgogKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvCiAqIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gY29uc3RydWN0b3Igb3B0aW9ucywgaW5zdGFuY2UKICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuCiAqLwpmdW5jdGlvbiBtZXJnZUFzc2V0cyAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICB2YXIgcmVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCk7CiAgaWYgKGNoaWxkVmFsKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgICByZXR1cm4gZXh0ZW5kKHJlcywgY2hpbGRWYWwpCiAgfSBlbHNlIHsKICAgIHJldHVybiByZXMKICB9Cn0KCkFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0czsKfSk7CgovKioKICogV2F0Y2hlcnMuCiAqCiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmUKICogYW5vdGhlciwgc28gd2UgbWVyZ2UgdGhlbSBhcyBhcnJheXMuCiAqLwpzdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLgogIGlmIChwYXJlbnRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IHBhcmVudFZhbCA9IHVuZGVmaW5lZDsgfQogIGlmIChjaGlsZFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgY2hpbGRWYWwgPSB1bmRlZmluZWQ7IH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKSB9CiAgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IHt9OwogIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7CiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHsKICAgIHZhciBwYXJlbnQgPSByZXRba2V5JDFdOwogICAgdmFyIGNoaWxkID0gY2hpbGRWYWxba2V5JDFdOwogICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7CiAgICAgIHBhcmVudCA9IFtwYXJlbnRdOwogICAgfQogICAgcmV0W2tleSQxXSA9IHBhcmVudAogICAgICA/IHBhcmVudC5jb25jYXQoY2hpbGQpCiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07CiAgfQogIHJldHVybiByZXQKfTsKCi8qKgogKiBPdGhlciBvYmplY3QgaGFzaGVzLgogKi8Kc3RyYXRzLnByb3BzID0Kc3RyYXRzLm1ldGhvZHMgPQpzdHJhdHMuaW5qZWN0ID0Kc3RyYXRzLmNvbXB1dGVkID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bSwKICBrZXkKKSB7CiAgaWYgKGNoaWxkVmFsICYmICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTsKICBpZiAoY2hpbGRWYWwpIHsgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOyB9CiAgcmV0dXJuIHJldAp9OwpzdHJhdHMucHJvdmlkZSA9IG1lcmdlRGF0YU9yRm47CgovKioKICogRGVmYXVsdCBzdHJhdGVneS4KICovCnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkgewogIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkCiAgICA/IHBhcmVudFZhbAogICAgOiBjaGlsZFZhbAp9OwoKLyoqCiAqIFZhbGlkYXRlIGNvbXBvbmVudCBuYW1lcwogKi8KZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7CiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykgewogICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7CiAgfQp9CgpmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUgKG5hbWUpIHsKICBpZiAoIS9eW2EtekEtWl1bXHctXSokLy50ZXN0KG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogIicgKyBuYW1lICsgJyIuIENvbXBvbmVudCBuYW1lcyAnICsKICAgICAgJ2NhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHRoZSBoeXBoZW4sICcgKwogICAgICAnYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci4nCiAgICApOwogIH0KICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCAnICsKICAgICAgJ2lkOiAnICsgbmFtZQogICAgKTsKICB9Cn0KCi8qKgogKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGUKICogT2JqZWN0LWJhc2VkIGZvcm1hdC4KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkgewogIHZhciBwcm9wcyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKCFwcm9wcykgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICB2YXIgaSwgdmFsLCBuYW1lOwogIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgewogICAgaSA9IHByb3BzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdmFsID0gcHJvcHNbaV07CiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgICAgIG5hbWUgPSBjYW1lbGl6ZSh2YWwpOwogICAgICAgIHJlc1tuYW1lXSA9IHsgdHlwZTogbnVsbCB9OwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oJ3Byb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4nKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgICB2YWwgPSBwcm9wc1trZXldOwogICAgICBuYW1lID0gY2FtZWxpemUoa2V5KTsKICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpCiAgICAgICAgPyB2YWwKICAgICAgICA6IHsgdHlwZTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJwcm9wc1wiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsICIgKwogICAgICAiYnV0IGdvdCAiICsgKHRvUmF3VHlwZShwcm9wcykpICsgIi4iLAogICAgICB2bQogICAgKTsKICB9CiAgb3B0aW9ucy5wcm9wcyA9IHJlczsKfQoKLyoqCiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXQKICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdCAob3B0aW9ucywgdm0pIHsKICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7CiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH0KICB2YXIgbm9ybWFsaXplZCA9IG9wdGlvbnMuaW5qZWN0ID0ge307CiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHsKICAgICAgbm9ybWFsaXplZFtpbmplY3RbaV1dID0geyBmcm9tOiBpbmplY3RbaV0gfTsKICAgIH0KICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkgewogICAgZm9yICh2YXIga2V5IGluIGluamVjdCkgewogICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07CiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKQogICAgICAgID8gZXh0ZW5kKHsgZnJvbToga2V5IH0sIHZhbCkKICAgICAgICA6IHsgZnJvbTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJpbmplY3RcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUoaW5qZWN0KSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogIH0KfQoKLyoqCiAqIE5vcm1hbGl6ZSByYXcgZnVuY3Rpb24gZGlyZWN0aXZlcyBpbnRvIG9iamVjdCBmb3JtYXQuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7CiAgdmFyIGRpcnMgPSBvcHRpb25zLmRpcmVjdGl2ZXM7CiAgaWYgKGRpcnMpIHsKICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7CiAgICAgIHZhciBkZWYgPSBkaXJzW2tleV07CiAgICAgIGlmICh0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkgewogIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsgbmFtZSArICJcIjogZXhwZWN0ZWQgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUodmFsdWUpKSArICIuIiwKICAgICAgdm0KICAgICk7CiAgfQp9CgovKioKICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLgogKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLgogKi8KZnVuY3Rpb24gbWVyZ2VPcHRpb25zICgKICBwYXJlbnQsCiAgY2hpbGQsCiAgdm0KKSB7CiAgewogICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTsKICB9CgogIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHsKICAgIGNoaWxkID0gY2hpbGQub3B0aW9uczsKICB9CgogIG5vcm1hbGl6ZVByb3BzKGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7CiAgdmFyIGV4dGVuZHNGcm9tID0gY2hpbGQuZXh0ZW5kczsKICBpZiAoZXh0ZW5kc0Zyb20pIHsKICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGV4dGVuZHNGcm9tLCB2bSk7CiAgfQogIGlmIChjaGlsZC5taXhpbnMpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTsKICAgIH0KICB9CiAgdmFyIG9wdGlvbnMgPSB7fTsKICB2YXIga2V5OwogIGZvciAoa2V5IGluIHBhcmVudCkgewogICAgbWVyZ2VGaWVsZChrZXkpOwogIH0KICBmb3IgKGtleSBpbiBjaGlsZCkgewogICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7CiAgICAgIG1lcmdlRmllbGQoa2V5KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7CiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7CiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7CiAgfQogIHJldHVybiBvcHRpb25zCn0KCi8qKgogKiBSZXNvbHZlIGFuIGFzc2V0LgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3MKICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLgogKi8KZnVuY3Rpb24gcmVzb2x2ZUFzc2V0ICgKICBvcHRpb25zLAogIHR5cGUsCiAgaWQsCiAgd2Fybk1pc3NpbmcKKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHsKICAgIHJldHVybgogIH0KICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTsKICAvLyBjaGVjayBsb2NhbCByZWdpc3RyYXRpb24gdmFyaWF0aW9ucyBmaXJzdAogIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfQogIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTsKICBpZiAoaGFzT3duKGFzc2V0cywgY2FtZWxpemVkSWQpKSB7IHJldHVybiBhc3NldHNbY2FtZWxpemVkSWRdIH0KICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7CiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH0KICAvLyBmYWxsYmFjayB0byBwcm90b3R5cGUgY2hhaW4KICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykgewogICAgd2FybigKICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCwKICAgICAgb3B0aW9ucwogICAgKTsKICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIHZhbGlkYXRlUHJvcCAoCiAga2V5LAogIHByb3BPcHRpb25zLAogIHByb3BzRGF0YSwKICB2bQopIHsKICB2YXIgcHJvcCA9IHByb3BPcHRpb25zW2tleV07CiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpOwogIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldOwogIC8vIGJvb2xlYW4gY2FzdGluZwogIHZhciBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTsKICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHsKICAgIGlmIChhYnNlbnQgJiYgIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7CiAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHsKICAgICAgLy8gb25seSBjYXN0IGVtcHR5IHN0cmluZyAvIHNhbWUgbmFtZSB0byBib29sZWFuIGlmCiAgICAgIC8vIGJvb2xlYW4gaGFzIGhpZ2hlciBwcmlvcml0eQogICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpOwogICAgICBpZiAoc3RyaW5nSW5kZXggPCAwIHx8IGJvb2xlYW5JbmRleCA8IHN0cmluZ0luZGV4KSB7CiAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQogIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUKICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpOwogICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LAogICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuCiAgICB2YXIgcHJldlNob3VsZE9ic2VydmUgPSBzaG91bGRPYnNlcnZlOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogICAgb2JzZXJ2ZSh2YWx1ZSk7CiAgICB0b2dnbGVPYnNlcnZpbmcocHJldlNob3VsZE9ic2VydmUpOwogIH0KICB7CiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpOwogIH0KICByZXR1cm4gdmFsdWUKfQoKLyoqCiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuCiAqLwpmdW5jdGlvbiBnZXRQcm9wRGVmYXVsdFZhbHVlICh2bSwgcHJvcCwga2V5KSB7CiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZAogIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHsKICAgIHJldHVybiB1bmRlZmluZWQKICB9CiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDsKICAvLyB3YXJuIGFnYWluc3Qgbm9uLWZhY3RvcnkgZGVmYXVsdHMgZm9yIE9iamVjdCAmIEFycmF5CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wICInICsga2V5ICsgJyI6ICcgKwogICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArCiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJywKICAgICAgdm0KICAgICk7CiAgfQogIC8vIHRoZSByYXcgcHJvcCB2YWx1ZSB3YXMgYWxzbyB1bmRlZmluZWQgZnJvbSBwcmV2aW91cyByZW5kZXIsCiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyCiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJgogICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhW2tleV0gPT09IHVuZGVmaW5lZCAmJgogICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZAogICkgewogICAgcmV0dXJuIHZtLl9wcm9wc1trZXldCiAgfQogIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzCiAgLy8gYSB2YWx1ZSBpcyBGdW5jdGlvbiBpZiBpdHMgcHJvdG90eXBlIGlzIGZ1bmN0aW9uIGV2ZW4gYWNyb3NzIGRpZmZlcmVudCBleGVjdXRpb24gY29udGV4dAogIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJwogICAgPyBkZWYuY2FsbCh2bSkKICAgIDogZGVmCn0KCi8qKgogKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuCiAqLwpmdW5jdGlvbiBhc3NlcnRQcm9wICgKICBwcm9wLAogIG5hbWUsCiAgdmFsdWUsCiAgdm0sCiAgYWJzZW50CikgewogIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkgewogICAgd2FybigKICAgICAgJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogIicgKyBuYW1lICsgJyInLAogICAgICB2bQogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkgewogICAgcmV0dXJuCiAgfQogIHZhciB0eXBlID0gcHJvcC50eXBlOwogIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7CiAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTsKICBpZiAodHlwZSkgewogICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7CiAgICAgIHR5cGUgPSBbdHlwZV07CiAgICB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7CiAgICAgIHZhciBhc3NlcnRlZFR5cGUgPSBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlW2ldKTsKICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpOwogICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDsKICAgIH0KICB9CiAgaWYgKCF2YWxpZCkgewogICAgd2FybigKICAgICAgIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIiICsgbmFtZSArICJcIi4iICsKICAgICAgIiBFeHBlY3RlZCAiICsgKGV4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oJywgJykpICsKICAgICAgIiwgZ290ICIgKyAodG9SYXdUeXBlKHZhbHVlKSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjsKICBpZiAodmFsaWRhdG9yKSB7CiAgICBpZiAoIXZhbGlkYXRvcih2YWx1ZSkpIHsKICAgICAgd2FybigKICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJyArIG5hbWUgKyAnIi4nLAogICAgICAgIHZtCiAgICAgICk7CiAgICB9CiAgfQp9Cgp2YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87CgpmdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkgewogIHZhciB2YWxpZDsKICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTsKICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTsKICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzCiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlOwogICAgfQogIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0JykgewogICAgdmFsaWQgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTsKICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5JykgewogICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTsKICB9IGVsc2UgewogICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7CiAgfQogIHJldHVybiB7CiAgICB2YWxpZDogdmFsaWQsCiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZQogIH0KfQoKLyoqCiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcywKICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nCiAqIGFjcm9zcyBkaWZmZXJlbnQgdm1zIC8gaWZyYW1lcy4KICovCmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7CiAgdmFyIG1hdGNoID0gZm4gJiYgZm4udG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7CiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJwp9CgpmdW5jdGlvbiBpc1NhbWVUeXBlIChhLCBiKSB7CiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYikKfQoKZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7CiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMQogIH0KICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgaWYgKGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlc1tpXSwgdHlwZSkpIHsKICAgICAgcmV0dXJuIGkKICAgIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qICAqLwoKZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAodm0pIHsKICAgIHZhciBjdXIgPSB2bTsKICAgIHdoaWxlICgoY3VyID0gY3VyLiRwYXJlbnQpKSB7CiAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkOwogICAgICBpZiAoaG9va3MpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7CiAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7IHJldHVybiB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKQogICAgfSBjYXRjaCAoZSkgewogICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpOwogICAgfQogIH0KICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICB7CiAgICB3YXJuKCgiRXJyb3IgaW4gIiArIGluZm8gKyAiOiBcIiIgKyAoZXJyLnRvU3RyaW5nKCkpICsgIlwiIiksIHZtKTsKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAoKGluQnJvd3NlciB8fCBpbldlZXgpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgewogICAgY29uc29sZS5lcnJvcihlcnIpOwogIH0gZWxzZSB7CiAgICB0aHJvdyBlcnIKICB9Cn0KCi8qICAqLwovKiBnbG9iYWxzIE1lc3NhZ2VDaGFubmVsICovCgp2YXIgY2FsbGJhY2tzID0gW107CnZhciBwZW5kaW5nID0gZmFsc2U7CgpmdW5jdGlvbiBmbHVzaENhbGxiYWNrcyAoKSB7CiAgcGVuZGluZyA9IGZhbHNlOwogIHZhciBjb3BpZXMgPSBjYWxsYmFja3Muc2xpY2UoMCk7CiAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHsKICAgIGNvcGllc1tpXSgpOwogIH0KfQoKLy8gSGVyZSB3ZSBoYXZlIGFzeW5jIGRlZmVycmluZyB3cmFwcGVycyB1c2luZyBib3RoIG1pY3JvdGFza3MgYW5kIChtYWNybykgdGFza3MuCi8vIEluIDwgMi40IHdlIHVzZWQgbWljcm90YXNrcyBldmVyeXdoZXJlLCBidXQgdGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZXJlCi8vIG1pY3JvdGFza3MgaGF2ZSB0b28gaGlnaCBhIHByaW9yaXR5IGFuZCBmaXJlIGluIGJldHdlZW4gc3VwcG9zZWRseQovLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTApIG9yIGV2ZW4gYmV0d2VlbiBidWJibGluZyBvZiB0aGUgc2FtZQovLyBldmVudCAoIzY1NjYpLiBIb3dldmVyLCB1c2luZyAobWFjcm8pIHRhc2tzIGV2ZXJ5d2hlcmUgYWxzbyBoYXMgc3VidGxlIHByb2JsZW1zCi8vIHdoZW4gc3RhdGUgaXMgY2hhbmdlZCByaWdodCBiZWZvcmUgcmVwYWludCAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS4KLy8gSGVyZSB3ZSB1c2UgbWljcm90YXNrIGJ5IGRlZmF1bHQsIGJ1dCBleHBvc2UgYSB3YXkgdG8gZm9yY2UgKG1hY3JvKSB0YXNrIHdoZW4KLy8gbmVlZGVkIChlLmcuIGluIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIGJ5IHYtb24pLgp2YXIgbWljcm9UaW1lckZ1bmM7CnZhciBtYWNyb1RpbWVyRnVuYzsKdmFyIHVzZU1hY3JvVGFzayA9IGZhbHNlOwoKLy8gRGV0ZXJtaW5lIChtYWNybykgdGFzayBkZWZlciBpbXBsZW1lbnRhdGlvbi4KLy8gVGVjaG5pY2FsbHkgc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBidXQgaXQncyBvbmx5IGF2YWlsYWJsZQovLyBpbiBJRS4gVGhlIG9ubHkgcG9seWZpbGwgdGhhdCBjb25zaXN0ZW50bHkgcXVldWVzIHRoZSBjYWxsYmFjayBhZnRlciBhbGwgRE9NCi8vIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIHNhbWUgbG9vcCBpcyBieSB1c2luZyBNZXNzYWdlQ2hhbm5lbC4KLyogaXN0YW5idWwgaWdub3JlIGlmICovCmlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShzZXRJbW1lZGlhdGUpKSB7CiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpOwogIH07Cn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJyAmJiAoCiAgaXNOYXRpdmUoTWVzc2FnZUNoYW5uZWwpIHx8CiAgLy8gUGhhbnRvbUpTCiAgTWVzc2FnZUNoYW5uZWwudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgTWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvcl0nCikpIHsKICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjsKICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoQ2FsbGJhY2tzOwogIG1hY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcG9ydC5wb3N0TWVzc2FnZSgxKTsKICB9Owp9IGVsc2UgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRUaW1lb3V0KGZsdXNoQ2FsbGJhY2tzLCAwKTsKICB9Owp9CgovLyBEZXRlcm1pbmUgbWljcm90YXNrIGRlZmVyIGltcGxlbWVudGF0aW9uLgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovCmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHsKICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpOwogIG1pY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcC50aGVuKGZsdXNoQ2FsbGJhY2tzKTsKICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dAogICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlCiAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYnV0IHRoZSBxdWV1ZSBpc24ndCBiZWluZyBmbHVzaGVkLCB1bnRpbCB0aGUgYnJvd3NlcgogICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuCiAgICAvLyAiZm9yY2UiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuCiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfQogIH07Cn0gZWxzZSB7CiAgLy8gZmFsbGJhY2sgdG8gbWFjcm8KICBtaWNyb1RpbWVyRnVuYyA9IG1hY3JvVGltZXJGdW5jOwp9CgovKioKICogV3JhcCBhIGZ1bmN0aW9uIHNvIHRoYXQgaWYgYW55IGNvZGUgaW5zaWRlIHRyaWdnZXJzIHN0YXRlIGNoYW5nZSwKICogdGhlIGNoYW5nZXMgYXJlIHF1ZXVlZCB1c2luZyBhIChtYWNybykgdGFzayBpbnN0ZWFkIG9mIGEgbWljcm90YXNrLgogKi8KZnVuY3Rpb24gd2l0aE1hY3JvVGFzayAoZm4pIHsKICByZXR1cm4gZm4uX3dpdGhUYXNrIHx8IChmbi5fd2l0aFRhc2sgPSBmdW5jdGlvbiAoKSB7CiAgICB1c2VNYWNyb1Rhc2sgPSB0cnVlOwogICAgdmFyIHJlcyA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB1c2VNYWNyb1Rhc2sgPSBmYWxzZTsKICAgIHJldHVybiByZXMKICB9KQp9CgpmdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkgewogIHZhciBfcmVzb2x2ZTsKICBjYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7CiAgICBpZiAoY2IpIHsKICAgICAgdHJ5IHsKICAgICAgICBjYi5jYWxsKGN0eCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7CiAgICAgIF9yZXNvbHZlKGN0eCk7CiAgICB9CiAgfSk7CiAgaWYgKCFwZW5kaW5nKSB7CiAgICBwZW5kaW5nID0gdHJ1ZTsKICAgIGlmICh1c2VNYWNyb1Rhc2spIHsKICAgICAgbWFjcm9UaW1lckZ1bmMoKTsKICAgIH0gZWxzZSB7CiAgICAgIG1pY3JvVGltZXJGdW5jKCk7CiAgICB9CiAgfQogIC8vICRmbG93LWRpc2FibGUtbGluZQogIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgX3Jlc29sdmUgPSByZXNvbHZlOwogICAgfSkKICB9Cn0KCi8qICAqLwoKdmFyIG1hcms7CnZhciBtZWFzdXJlOwoKewogIHZhciBwZXJmID0gaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoCiAgICBwZXJmICYmCiAgICBwZXJmLm1hcmsgJiYKICAgIHBlcmYubWVhc3VyZSAmJgogICAgcGVyZi5jbGVhck1hcmtzICYmCiAgICBwZXJmLmNsZWFyTWVhc3VyZXMKICApIHsKICAgIG1hcmsgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiBwZXJmLm1hcmsodGFnKTsgfTsKICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykgewogICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpOwogICAgICBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSk7CiAgICB9OwogIH0KfQoKLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovCgp2YXIgaW5pdFByb3h5OwoKewogIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoCiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICsKICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICsKICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArCiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeQogICk7CgogIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgewogICAgd2FybigKICAgICAgIlByb3BlcnR5IG9yIG1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCAiICsKICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArCiAgICAgICdlaXRoZXIgaW4gdGhlIGRhdGEgb3B0aW9uLCBvciBmb3IgY2xhc3MtYmFzZWQgY29tcG9uZW50cywgYnkgJyArCiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICsKICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsCiAgICAgIHRhcmdldAogICAgKTsKICB9OwoKICB2YXIgaGFzUHJveHkgPQogICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7CgogIGlmIChoYXNQcm94eSkgewogICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpOwogICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2RlcywgewogICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7CiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHsKICAgICAgICAgIHdhcm4oKCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC4iICsga2V5KSk7CiAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZhciBoYXNIYW5kbGVyID0gewogICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7CiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0OwogICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fCBrZXkuY2hhckF0KDApID09PSAnXyc7CiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkCiAgICB9CiAgfTsKCiAgdmFyIGdldEhhbmRsZXIgPSB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHsKICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldFtrZXldCiAgICB9CiAgfTsKCiAgaW5pdFByb3h5ID0gZnVuY3Rpb24gaW5pdFByb3h5ICh2bSkgewogICAgaWYgKGhhc1Byb3h5KSB7CiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZQogICAgICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogICAgICB2YXIgaGFuZGxlcnMgPSBvcHRpb25zLnJlbmRlciAmJiBvcHRpb25zLnJlbmRlci5fd2l0aFN0cmlwcGVkCiAgICAgICAgPyBnZXRIYW5kbGVyCiAgICAgICAgOiBoYXNIYW5kbGVyOwogICAgICB2bS5fcmVuZGVyUHJveHkgPSBuZXcgUHJveHkodm0sIGhhbmRsZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtOwogICAgfQogIH07Cn0KCi8qICAqLwoKdmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTsKCi8qKgogKiBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZAogKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdAogKiBpcyBjb2xsZWN0ZWQgYXMgYSAiZGVlcCIgZGVwZW5kZW5jeS4KICovCmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHsKICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7CiAgc2Vlbk9iamVjdHMuY2xlYXIoKTsKfQoKZnVuY3Rpb24gX3RyYXZlcnNlICh2YWwsIHNlZW4pIHsKICB2YXIgaSwga2V5czsKICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpOwogIGlmICgoIWlzQSAmJiAhaXNPYmplY3QodmFsKSkgfHwgT2JqZWN0LmlzRnJvemVuKHZhbCkgfHwgdmFsIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybgogIH0KICBpZiAodmFsLl9fb2JfXykgewogICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7CiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7CiAgICAgIHJldHVybgogICAgfQogICAgc2Vlbi5hZGQoZGVwSWQpOwogIH0KICBpZiAoaXNBKSB7CiAgICBpID0gdmFsLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtpXSwgc2Vlbik7IH0KICB9IGVsc2UgewogICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7CiAgICBpID0ga2V5cy5sZW5ndGg7CiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9CiAgfQp9CgovKiAgKi8KCnZhciBub3JtYWxpemVFdmVudCA9IGNhY2hlZChmdW5jdGlvbiAobmFtZSkgewogIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJzsKICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lOwogIHZhciBvbmNlJCQxID0gbmFtZS5jaGFyQXQoMCkgPT09ICd+JzsgLy8gUHJlZml4ZWQgbGFzdCwgY2hlY2tlZCBmaXJzdAogIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnOwogIG5hbWUgPSBjYXB0dXJlID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgcmV0dXJuIHsKICAgIG5hbWU6IG5hbWUsCiAgICBvbmNlOiBvbmNlJCQxLAogICAgY2FwdHVyZTogY2FwdHVyZSwKICAgIHBhc3NpdmU6IHBhc3NpdmUKICB9Cn0pOwoKZnVuY3Rpb24gY3JlYXRlRm5JbnZva2VyIChmbnMpIHsKICBmdW5jdGlvbiBpbnZva2VyICgpIHsKICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50czsKCiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7CiAgICAgIHZhciBjbG9uZWQgPSBmbnMuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVycwogICAgICByZXR1cm4gZm5zLmFwcGx5KG51bGwsIGFyZ3VtZW50cykKICAgIH0KICB9CiAgaW52b2tlci5mbnMgPSBmbnM7CiAgcmV0dXJuIGludm9rZXIKfQoKZnVuY3Rpb24gdXBkYXRlTGlzdGVuZXJzICgKICBvbiwKICBvbGRPbiwKICBhZGQsCiAgcmVtb3ZlJCQxLAogIHZtCikgewogIHZhciBuYW1lLCBkZWYsIGN1ciwgb2xkLCBldmVudDsKICBmb3IgKG5hbWUgaW4gb24pIHsKICAgIGRlZiA9IGN1ciA9IG9uW25hbWVdOwogICAgb2xkID0gb2xkT25bbmFtZV07CiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNVbmRlZihjdXIpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50IFwiIiArIChldmVudC5uYW1lKSArICJcIjogZ290ICIgKyBTdHJpbmcoY3VyKSwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHsKICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHsKICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZUZuSW52b2tlcihjdXIpOwogICAgICB9CiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50Lm9uY2UsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7CiAgICAgIG9sZC5mbnMgPSBjdXI7CiAgICAgIG9uW25hbWVdID0gb2xkOwogICAgfQogIH0KICBmb3IgKG5hbWUgaW4gb2xkT24pIHsKICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkgewogICAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpOwogICAgfQogIH0KfQoKLyogICovCgpmdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7CiAgaWYgKGRlZiBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pOwogIH0KICB2YXIgaW52b2tlcjsKICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTsKCiAgZnVuY3Rpb24gd3JhcHBlZEhvb2sgKCkgewogICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgLy8gaW1wb3J0YW50OiByZW1vdmUgbWVyZ2VkIGhvb2sgdG8gZW5zdXJlIGl0J3MgY2FsbGVkIG9ubHkgb25jZQogICAgLy8gYW5kIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spOwogIH0KCiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHsKICAgIC8vIG5vIGV4aXN0aW5nIGhvb2sKICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW3dyYXBwZWRIb29rXSk7CiAgfSBlbHNlIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKGlzRGVmKG9sZEhvb2suZm5zKSAmJiBpc1RydWUob2xkSG9vay5tZXJnZWQpKSB7CiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlcgogICAgICBpbnZva2VyID0gb2xkSG9vazsKICAgICAgaW52b2tlci5mbnMucHVzaCh3cmFwcGVkSG9vayk7CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBwbGFpbiBob29rCiAgICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW29sZEhvb2ssIHdyYXBwZWRIb29rXSk7CiAgICB9CiAgfQoKICBpbnZva2VyLm1lcmdlZCA9IHRydWU7CiAgZGVmW2hvb2tLZXldID0gaW52b2tlcjsKfQoKLyogICovCgpmdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhICgKICBkYXRhLAogIEN0b3IsCiAgdGFnCikgewogIC8vIHdlIGFyZSBvbmx5IGV4dHJhY3RpbmcgcmF3IHZhbHVlcyBoZXJlLgogIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZAogIC8vIGNvbXBvbmVudCBpdHNlbGYuCiAgdmFyIHByb3BPcHRpb25zID0gQ3Rvci5vcHRpb25zLnByb3BzOwogIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkgewogICAgcmV0dXJuCiAgfQogIHZhciByZXMgPSB7fTsKICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzOwogIHZhciBwcm9wcyA9IGRhdGEucHJvcHM7CiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykgewogICAgICB2YXIgYWx0S2V5ID0gaHlwaGVuYXRlKGtleSk7CiAgICAgIHsKICAgICAgICB2YXIga2V5SW5Mb3dlckNhc2UgPSBrZXkudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoCiAgICAgICAgICBrZXkgIT09IGtleUluTG93ZXJDYXNlICYmCiAgICAgICAgICBhdHRycyAmJiBoYXNPd24oYXR0cnMsIGtleUluTG93ZXJDYXNlKQogICAgICAgICkgewogICAgICAgICAgdGlwKAogICAgICAgICAgICAiUHJvcCBcIiIgKyBrZXlJbkxvd2VyQ2FzZSArICJcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50ICIgKwogICAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh0YWcgfHwgQ3RvcikpICsgIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXMiICsKICAgICAgICAgICAgIiBcIiIgKyBrZXkgKyAiXCIuICIgKwogICAgICAgICAgICAiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCAiICsKICAgICAgICAgICAgInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gIiArCiAgICAgICAgICAgICJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFwiIiArIGFsdEtleSArICJcIiBpbnN0ZWFkIG9mIFwiIiArIGtleSArICJcIi4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGVja1Byb3AocmVzLCBwcm9wcywga2V5LCBhbHRLZXksIHRydWUpIHx8CiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrUHJvcCAoCiAgcmVzLAogIGhhc2gsCiAga2V5LAogIGFsdEtleSwKICBwcmVzZXJ2ZQopIHsKICBpZiAoaXNEZWYoaGFzaCkpIHsKICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkgewogICAgICByZXNba2V5XSA9IGhhc2hba2V5XTsKICAgICAgaWYgKCFwcmVzZXJ2ZSkgewogICAgICAgIGRlbGV0ZSBoYXNoW2tleV07CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWUKICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHsKICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07CiAgICAgIGlmICghcHJlc2VydmUpIHsKICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQogIHJldHVybiBmYWxzZQp9CgovKiAgKi8KCi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieQovLyBzdGF0aWNhbGx5IGFuYWx5emluZyB0aGUgdGVtcGxhdGUgYXQgY29tcGlsZSB0aW1lLgovLwovLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZQovLyBnZW5lcmF0ZWQgcmVuZGVyIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIEFycmF5PFZOb2RlPi4gVGhlcmUgYXJlCi8vIHR3byBjYXNlcyB3aGVyZSBleHRyYSBub3JtYWxpemF0aW9uIGlzIG5lZWRlZDoKCi8vIDEuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbXBvbmVudHMgLSBiZWNhdXNlIGEgZnVuY3Rpb25hbCBjb21wb25lbnQKLy8gbWF5IHJldHVybiBhbiBBcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJvb3QuIEluIHRoaXMgY2FzZSwganVzdCBhIHNpbXBsZQovLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGUKLy8gdGhpbmcgd2l0aCBBcnJheS5wcm90b3R5cGUuY29uY2F0LiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9ubHkgMS1sZXZlbCBkZWVwCi8vIGJlY2F1c2UgZnVuY3Rpb25hbCBjb21wb25lbnRzIGFscmVhZHkgbm9ybWFsaXplIHRoZWlyIG93biBjaGlsZHJlbi4KZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW5baV0pKSB7CiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbikKICAgIH0KICB9CiAgcmV0dXJuIGNoaWxkcmVuCn0KCi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsCi8vIGUuZy4gPHRlbXBsYXRlPiwgPHNsb3Q+LCB2LWZvciwgb3Igd2hlbiB0aGUgY2hpbGRyZW4gaXMgcHJvdmlkZWQgYnkgdXNlcgovLyB3aXRoIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zIC8gSlNYLiBJbiBzdWNoIGNhc2VzIGEgZnVsbCBub3JtYWxpemF0aW9uCi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLgpmdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbiAoY2hpbGRyZW4pIHsKICByZXR1cm4gaXNQcmltaXRpdmUoY2hpbGRyZW4pCiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXQogICAgOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKQogICAgICA/IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oY2hpbGRyZW4pCiAgICAgIDogdW5kZWZpbmVkCn0KCmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHsKICByZXR1cm4gaXNEZWYobm9kZSkgJiYgaXNEZWYobm9kZS50ZXh0KSAmJiBpc0ZhbHNlKG5vZGUuaXNDb21tZW50KQp9CgpmdW5jdGlvbiBub3JtYWxpemVBcnJheUNoaWxkcmVuIChjaGlsZHJlbiwgbmVzdGVkSW5kZXgpIHsKICB2YXIgcmVzID0gW107CiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDsKICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgIGMgPSBjaGlsZHJlbltpXTsKICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfQogICAgbGFzdEluZGV4ID0gcmVzLmxlbmd0aCAtIDE7CiAgICBsYXN0ID0gcmVzW2xhc3RJbmRleF07CiAgICAvLyAgbmVzdGVkCiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgewogICAgICBpZiAoYy5sZW5ndGggPiAwKSB7CiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyAiXyIgKyBpKSk7CiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcwogICAgICAgIGlmIChpc1RleHROb2RlKGNbMF0pICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIChjWzBdKS50ZXh0KTsKICAgICAgICAgIGMuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBjKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZShjKSkgewogICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkgewogICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMKICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgU1NSIGh5ZHJhdGlvbiBiZWNhdXNlIHRleHQgbm9kZXMgYXJlCiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7CiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHsKICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0byB2bm9kZQogICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBkZWZhdWx0IGtleSBmb3IgbmVzdGVkIGFycmF5IGNoaWxkcmVuIChsaWtlbHkgZ2VuZXJhdGVkIGJ5IHYtZm9yKQogICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmCiAgICAgICAgICBpc0RlZihjLnRhZykgJiYKICAgICAgICAgIGlzVW5kZWYoYy5rZXkpICYmCiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHsKICAgICAgICAgIGMua2V5ID0gIl9fdmxpc3QiICsgbmVzdGVkSW5kZXggKyAiXyIgKyBpICsgIl9fIjsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2goYyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIGVuc3VyZUN0b3IgKGNvbXAsIGJhc2UpIHsKICBpZiAoCiAgICBjb21wLl9fZXNNb2R1bGUgfHwKICAgIChoYXNTeW1ib2wgJiYgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJykKICApIHsKICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7CiAgfQogIHJldHVybiBpc09iamVjdChjb21wKQogICAgPyBiYXNlLmV4dGVuZChjb21wKQogICAgOiBjb21wCn0KCmZ1bmN0aW9uIGNyZWF0ZUFzeW5jUGxhY2Vob2xkZXIgKAogIGZhY3RvcnksCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7CiAgbm9kZS5hc3luY01ldGEgPSB7IGRhdGE6IGRhdGEsIGNvbnRleHQ6IGNvbnRleHQsIGNoaWxkcmVuOiBjaGlsZHJlbiwgdGFnOiB0YWcgfTsKICByZXR1cm4gbm9kZQp9CgpmdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKAogIGZhY3RvcnksCiAgYmFzZUN0b3IsCiAgY29udGV4dAopIHsKICBpZiAoaXNUcnVlKGZhY3RvcnkuZXJyb3IpICYmIGlzRGVmKGZhY3RvcnkuZXJyb3JDb21wKSkgewogICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHsKICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkCiAgfQoKICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHsKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5jb250ZXh0cykpIHsKICAgIC8vIGFscmVhZHkgcGVuZGluZwogICAgZmFjdG9yeS5jb250ZXh0cy5wdXNoKGNvbnRleHQpOwogIH0gZWxzZSB7CiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdOwogICAgdmFyIHN5bmMgPSB0cnVlOwoKICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb250ZXh0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBjb250ZXh0c1tpXS4kZm9yY2VVcGRhdGUoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykgewogICAgICAvLyBjYWNoZSByZXNvbHZlZAogICAgICBmYWN0b3J5LnJlc29sdmVkID0gZW5zdXJlQ3RvcihyZXMsIGJhc2VDdG9yKTsKICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZQogICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUikKICAgICAgaWYgKCFzeW5jKSB7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgYXN5bmMgY29tcG9uZW50OiAiICsgKFN0cmluZyhmYWN0b3J5KSkgKwogICAgICAgIChyZWFzb24gPyAoIlxuUmVhc29uOiAiICsgcmVhc29uKSA6ICcnKQogICAgICApOwogICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7CiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTsKCiAgICBpZiAoaXNPYmplY3QocmVzKSkgewogICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZQogICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7CiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc0RlZihyZXMuY29tcG9uZW50KSAmJiB0eXBlb2YgcmVzLmNvbXBvbmVudC50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7CgogICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7CiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7CiAgICAgICAgICBmYWN0b3J5LmxvYWRpbmdDb21wID0gZW5zdXJlQ3RvcihyZXMubG9hZGluZywgYmFzZUN0b3IpOwogICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkgewogICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCByZXMuZGVsYXkgfHwgMjAwKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc0RlZihyZXMudGltZW91dCkpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgICAgICAgIHJlamVjdCgKICAgICAgICAgICAgICAgICJ0aW1lb3V0ICgiICsgKHJlcy50aW1lb3V0KSArICJtcykiCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgcmVzLnRpbWVvdXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHN5bmMgPSBmYWxzZTsKICAgIC8vIHJldHVybiBpbiBjYXNlIHJlc29sdmVkIHN5bmNocm9ub3VzbHkKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmcKICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wCiAgICAgIDogZmFjdG9yeS5yZXNvbHZlZAogIH0KfQoKLyogICovCgpmdW5jdGlvbiBpc0FzeW5jUGxhY2Vob2xkZXIgKG5vZGUpIHsKICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3RvcnkKfQoKLyogICovCgpmdW5jdGlvbiBnZXRGaXJzdENvbXBvbmVudENoaWxkIChjaGlsZHJlbikgewogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkgewogICAgICAgIHJldHVybiBjCiAgICAgIH0KICAgIH0KICB9Cn0KCi8qICAqLwoKLyogICovCgpmdW5jdGlvbiBpbml0RXZlbnRzICh2bSkgewogIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTsKICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHMKICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczsKICBpZiAobGlzdGVuZXJzKSB7CiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycyk7CiAgfQp9Cgp2YXIgdGFyZ2V0OwoKZnVuY3Rpb24gYWRkIChldmVudCwgZm4sIG9uY2UpIHsKICBpZiAob25jZSkgewogICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7CiAgfSBlbHNlIHsKICAgIHRhcmdldC4kb24oZXZlbnQsIGZuKTsKICB9Cn0KCmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHsKICB0YXJnZXQuJG9mZihldmVudCwgZm4pOwp9CgpmdW5jdGlvbiB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnMgKAogIHZtLAogIGxpc3RlbmVycywKICBvbGRMaXN0ZW5lcnMKKSB7CiAgdGFyZ2V0ID0gdm07CiAgdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzIHx8IHt9LCBhZGQsIHJlbW92ZSQxLCB2bSk7CiAgdGFyZ2V0ID0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7CiAgdmFyIGhvb2tSRSA9IC9eaG9vazovOwogIFZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHRoaXMkMS4kb24oZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKHZtLl9ldmVudHNbZXZlbnRdIHx8ICh2bS5fZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChmbik7CiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uCiAgICAgIC8vIGluc3RlYWQgb2YgYSBoYXNoIGxvb2t1cAogICAgICBpZiAoaG9va1JFLnRlc3QoZXZlbnQpKSB7CiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07CgogIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgZnVuY3Rpb24gb24gKCkgewogICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7CiAgICAgIGZuLmFwcGx5KHZtLCBhcmd1bWVudHMpOwogICAgfQogICAgb24uZm4gPSBmbjsKICAgIHZtLiRvbihldmVudCwgb24pOwogICAgcmV0dXJuIHZtCiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kb2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIC8vIGFsbAogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIGFycmF5IG9mIGV2ZW50cwogICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgdGhpcyQxLiRvZmYoZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIHNwZWNpZmljIGV2ZW50CiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07CiAgICBpZiAoIWNicykgewogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmICghZm4pIHsKICAgICAgdm0uX2V2ZW50c1tldmVudF0gPSBudWxsOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmIChmbikgewogICAgICAvLyBzcGVjaWZpYyBoYW5kbGVyCiAgICAgIHZhciBjYjsKICAgICAgdmFyIGkkMSA9IGNicy5sZW5ndGg7CiAgICAgIHdoaWxlIChpJDEtLSkgewogICAgICAgIGNiID0gY2JzW2kkMV07CiAgICAgICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHsKICAgICAgICAgIGNicy5zcGxpY2UoaSQxLCAxKTsKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdm0KICB9OwoKICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgewogICAgICB2YXIgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7CiAgICAgICAgdGlwKAogICAgICAgICAgIkV2ZW50IFwiIiArIGxvd2VyQ2FzZUV2ZW50ICsgIlwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICIgKwogICAgICAgICAgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArICIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFwiIiArIGV2ZW50ICsgIlwiLiAiICsKICAgICAgICAgICJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSAiICsKICAgICAgICAgICJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gIiArCiAgICAgICAgICAiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIiICsgKGh5cGhlbmF0ZShldmVudCkpICsgIlwiIGluc3RlYWQgb2YgXCIiICsgZXZlbnQgKyAiXCIuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTsKICAgIGlmIChjYnMpIHsKICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7CiAgICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgY2JzW2ldLmFwcGx5KHZtLCBhcmdzKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKCJldmVudCBoYW5kbGVyIGZvciBcIiIgKyBldmVudCArICJcIiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07Cn0KCi8qICAqLwoKCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC4KICovCmZ1bmN0aW9uIHJlc29sdmVTbG90cyAoCiAgY2hpbGRyZW4sCiAgY29udGV4dAopIHsKICB2YXIgc2xvdHMgPSB7fTsKICBpZiAoIWNoaWxkcmVuKSB7CiAgICByZXR1cm4gc2xvdHMKICB9CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgdmFyIGRhdGEgPSBjaGlsZC5kYXRhOwogICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZQogICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHsKICAgICAgZGVsZXRlIGRhdGEuYXR0cnMuc2xvdDsKICAgIH0KICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZQogICAgLy8gc2FtZSBjb250ZXh0LgogICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiYKICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbAogICAgKSB7CiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90OwogICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpOwogICAgICBpZiAoY2hpbGQudGFnID09PSAndGVtcGxhdGUnKSB7CiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbG90LnB1c2goY2hpbGQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAoc2xvdHMuZGVmYXVsdCB8fCAoc2xvdHMuZGVmYXVsdCA9IFtdKSkucHVzaChjaGlsZCk7CiAgICB9CiAgfQogIC8vIGlnbm9yZSBzbG90cyB0aGF0IGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZQogIGZvciAodmFyIG5hbWUkMSBpbiBzbG90cykgewogICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkgewogICAgICBkZWxldGUgc2xvdHNbbmFtZSQxXTsKICAgIH0KICB9CiAgcmV0dXJuIHNsb3RzCn0KCmZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAobm9kZSkgewogIHJldHVybiAobm9kZS5pc0NvbW1lbnQgJiYgIW5vZGUuYXN5bmNGYWN0b3J5KSB8fCBub2RlLnRleHQgPT09ICcgJwp9CgpmdW5jdGlvbiByZXNvbHZlU2NvcGVkU2xvdHMgKAogIGZucywgLy8gc2VlIGZsb3cvdm5vZGUKICByZXMKKSB7CiAgcmVzID0gcmVzIHx8IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnNbaV0pKSB7CiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7CiAgICB9IGVsc2UgewogICAgICByZXNbZm5zW2ldLmtleV0gPSBmbnNbaV0uZm47CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsOwp2YXIgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7CgpmdW5jdGlvbiBpbml0TGlmZWN5Y2xlICh2bSkgewogIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7CgogIC8vIGxvY2F0ZSBmaXJzdCBub24tYWJzdHJhY3QgcGFyZW50CiAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7CiAgICB9CiAgICBwYXJlbnQuJGNoaWxkcmVuLnB1c2godm0pOwogIH0KCiAgdm0uJHBhcmVudCA9IHBhcmVudDsKICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtOwoKICB2bS4kY2hpbGRyZW4gPSBbXTsKICB2bS4kcmVmcyA9IHt9OwoKICB2bS5fd2F0Y2hlciA9IG51bGw7CiAgdm0uX2luYWN0aXZlID0gbnVsbDsKICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTsKICB2bS5faXNNb3VudGVkID0gZmFsc2U7CiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2U7CiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTsKfQoKZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkgewogIFZ1ZS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICh2bm9kZSwgaHlkcmF0aW5nKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKHZtLl9pc01vdW50ZWQpIHsKICAgICAgY2FsbEhvb2sodm0sICdiZWZvcmVVcGRhdGUnKTsKICAgIH0KICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7CiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlOwogICAgdmFyIHByZXZBY3RpdmVJbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlOwogICAgYWN0aXZlSW5zdGFuY2UgPSB2bTsKICAgIHZtLl92bm9kZSA9IHZub2RlOwogICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzCiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC4KICAgIGlmICghcHJldlZub2RlKSB7CiAgICAgIC8vIGluaXRpYWwgcmVuZGVyCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXygKICAgICAgICB2bS4kZWwsIHZub2RlLCBoeWRyYXRpbmcsIGZhbHNlIC8qIHJlbW92ZU9ubHkgKi8sCiAgICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSwKICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtCiAgICAgICk7CiAgICAgIC8vIG5vIG5lZWQgZm9yIHRoZSByZWYgbm9kZXMgYWZ0ZXIgaW5pdGlhbCBwYXRjaAogICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKQogICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtID0gdm0uJG9wdGlvbnMuX3JlZkVsbSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICAvLyB1cGRhdGVzCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhwcmV2Vm5vZGUsIHZub2RlKTsKICAgIH0KICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlOwogICAgLy8gdXBkYXRlIF9fdnVlX18gcmVmZXJlbmNlCiAgICBpZiAocHJldkVsKSB7CiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDsKICAgIH0KICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTsKICAgIH0KICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGwKICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7CiAgICAgIHZtLiRwYXJlbnQuJGVsID0gdm0uJGVsOwogICAgfQogICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZQogICAgLy8gdXBkYXRlZCBpbiBhIHBhcmVudCdzIHVwZGF0ZWQgaG9vay4KICB9OwoKICBWdWUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX2lzQmVpbmdEZXN0cm95ZWQpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZURlc3Ryb3knKTsKICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTsKICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50CiAgICB2YXIgcGFyZW50ID0gdm0uJHBhcmVudDsKICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHsKICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTsKICAgIH0KICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzCiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudGVhcmRvd24oKTsKICAgIH0KICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7CiAgICB9CiAgICAvLyByZW1vdmUgcmVmZXJlbmNlIGZyb20gZGF0YSBvYgogICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuCiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7CiAgICAgIHZtLl9kYXRhLl9fb2JfXy52bUNvdW50LS07CiAgICB9CiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi4KICAgIHZtLl9pc0Rlc3Ryb3llZCA9IHRydWU7CiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWUKICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpOwogICAgLy8gZmlyZSBkZXN0cm95ZWQgaG9vawogICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTsKICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuCiAgICB2bS4kb2ZmKCk7CiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2UKICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSBudWxsOwogICAgfQogICAgLy8gcmVsZWFzZSBjaXJjdWxhciByZWZlcmVuY2UgKCM2NzU5KQogICAgaWYgKHZtLiR2bm9kZSkgewogICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBtb3VudENvbXBvbmVudCAoCiAgdm0sCiAgZWwsCiAgaHlkcmF0aW5nCikgewogIHZtLiRlbCA9IGVsOwogIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7CiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlOwogICAgewogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHwKICAgICAgICB2bS4kb3B0aW9ucy5lbCB8fCBlbCkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArCiAgICAgICAgICAnY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIHByZS1jb21waWxlIHRoZSB0ZW1wbGF0ZXMgaW50byAnICsKICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgfQogIH0KICBjYWxsSG9vayh2bSwgJ2JlZm9yZU1vdW50Jyk7CgogIHZhciB1cGRhdGVDb21wb25lbnQ7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lOwogICAgICB2YXIgaWQgPSB2bS5fdWlkOwogICAgICB2YXIgc3RhcnRUYWcgPSAidnVlLXBlcmYtc3RhcnQ6IiArIGlkOwogICAgICB2YXIgZW5kVGFnID0gInZ1ZS1wZXJmLWVuZDoiICsgaWQ7CgogICAgICBtYXJrKHN0YXJ0VGFnKTsKICAgICAgdmFyIHZub2RlID0gdm0uX3JlbmRlcigpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHJlbmRlciIpLCBzdGFydFRhZywgZW5kVGFnKTsKCiAgICAgIG1hcmsoc3RhcnRUYWcpOwogICAgICB2bS5fdXBkYXRlKHZub2RlLCBoeWRyYXRpbmcpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHBhdGNoIiksIHN0YXJ0VGFnLCBlbmRUYWcpOwogICAgfTsKICB9IGVsc2UgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2bS5fdXBkYXRlKHZtLl9yZW5kZXIoKSwgaHlkcmF0aW5nKTsKICAgIH07CiAgfQoKICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvcgogIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkCiAgLy8gY29tcG9uZW50J3MgbW91bnRlZCBob29rKSwgd2hpY2ggcmVsaWVzIG9uIHZtLl93YXRjaGVyIGJlaW5nIGFscmVhZHkgZGVmaW5lZAogIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIG51bGwsIHRydWUgLyogaXNSZW5kZXJXYXRjaGVyICovKTsKICBoeWRyYXRpbmcgPSBmYWxzZTsKCiAgLy8gbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSwgY2FsbCBtb3VudGVkIG9uIHNlbGYKICAvLyBtb3VudGVkIGlzIGNhbGxlZCBmb3IgcmVuZGVyLWNyZWF0ZWQgY2hpbGQgY29tcG9uZW50cyBpbiBpdHMgaW5zZXJ0ZWQgaG9vawogIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkgewogICAgdm0uX2lzTW91bnRlZCA9IHRydWU7CiAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTsKICB9CiAgcmV0dXJuIHZtCn0KCmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50ICgKICB2bSwKICBwcm9wc0RhdGEsCiAgbGlzdGVuZXJzLAogIHBhcmVudFZub2RlLAogIHJlbmRlckNoaWxkcmVuCikgewogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7CiAgfQoKICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW4KICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG92ZXJ3cml0aW5nICRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbgogIHZhciBoYXNDaGlsZHJlbiA9ICEhKAogICAgcmVuZGVyQ2hpbGRyZW4gfHwgICAgICAgICAgICAgICAvLyBoYXMgbmV3IHN0YXRpYyBzbG90cwogICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90cwogICAgcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyB8fCAvLyBoYXMgbmV3IHNjb3BlZCBzbG90cwogICAgdm0uJHNjb3BlZFNsb3RzICE9PSBlbXB0eU9iamVjdCAvLyBoYXMgb2xkIHNjb3BlZCBzbG90cwogICk7CgogIHZtLiRvcHRpb25zLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlOwogIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyCgogIGlmICh2bS5fdm5vZGUpIHsgLy8gdXBkYXRlIGNoaWxkIHRyZWUncyBwYXJlbnQKICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTsKICB9CiAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW47CgogIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5lcnMgaGFzaAogIC8vIHRoZXNlIGFyZSBhbHNvIHJlYWN0aXZlIHNvIHRoZXkgbWF5IHRyaWdnZXIgY2hpbGQgdXBkYXRlIGlmIHRoZSBjaGlsZAogIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyCiAgdm0uJGF0dHJzID0gcGFyZW50Vm5vZGUuZGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdDsKICB2bS4kbGlzdGVuZXJzID0gbGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0OwoKICAvLyB1cGRhdGUgcHJvcHMKICBpZiAocHJvcHNEYXRhICYmIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgdmFyIHByb3BzID0gdm0uX3Byb3BzOwogICAgdmFyIHByb3BLZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07CiAgICAgIHZhciBwcm9wT3B0aW9ucyA9IHZtLiRvcHRpb25zLnByb3BzOyAvLyB3dGYgZmxvdz8KICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTsKICAgIH0KICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGEKICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YSA9IHByb3BzRGF0YTsKICB9CgogIC8vIHVwZGF0ZSBsaXN0ZW5lcnMKICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7CiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTsKCiAgLy8gcmVzb2x2ZSBzbG90cyArIGZvcmNlIHVwZGF0ZSBpZiBoYXMgY2hpbGRyZW4KICBpZiAoaGFzQ2hpbGRyZW4pIHsKICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7CiAgICB2bS4kZm9yY2VVcGRhdGUoKTsKICB9CgogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlOwogIH0KfQoKZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHsKICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHsKICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfQogIH0KICByZXR1cm4gZmFsc2UKfQoKZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlOwogICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7CiAgICAgIHJldHVybgogICAgfQogIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7CiAgICByZXR1cm4KICB9CiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHsKICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pOwogICAgfQogICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7CiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgfQogIGlmICghdm0uX2luYWN0aXZlKSB7CiAgICB2bS5faW5hY3RpdmUgPSB0cnVlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7CiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHsKICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzCiAgcHVzaFRhcmdldCgpOwogIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdOwogIGlmIChoYW5kbGVycykgewogICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgdHJ5IHsKICAgICAgICBoYW5kbGVyc1tpXS5jYWxsKHZtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoaG9vayArICIgaG9vayIpKTsKICAgICAgfQogICAgfQogIH0KICBpZiAodm0uX2hhc0hvb2tFdmVudCkgewogICAgdm0uJGVtaXQoJ2hvb2s6JyArIGhvb2spOwogIH0KICBwb3BUYXJnZXQoKTsKfQoKLyogICovCgoKdmFyIE1BWF9VUERBVEVfQ09VTlQgPSAxMDA7Cgp2YXIgcXVldWUgPSBbXTsKdmFyIGFjdGl2YXRlZENoaWxkcmVuID0gW107CnZhciBoYXMgPSB7fTsKdmFyIGNpcmN1bGFyID0ge307CnZhciB3YWl0aW5nID0gZmFsc2U7CnZhciBmbHVzaGluZyA9IGZhbHNlOwp2YXIgaW5kZXggPSAwOwoKLyoqCiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS4KICovCmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkgewogIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDsKICBoYXMgPSB7fTsKICB7CiAgICBjaXJjdWxhciA9IHt9OwogIH0KICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTsKfQoKLyoqCiAqIEZsdXNoIGJvdGggcXVldWVzIGFuZCBydW4gdGhlIHdhdGNoZXJzLgogKi8KZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7CiAgZmx1c2hpbmcgPSB0cnVlOwogIHZhciB3YXRjaGVyLCBpZDsKCiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guCiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6CiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5cwogIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZCkKICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlCiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKQogIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sCiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLgogIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTsKCiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkCiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzCiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7CiAgICB3YXRjaGVyID0gcXVldWVbaW5kZXhdOwogICAgaWQgPSB3YXRjaGVyLmlkOwogICAgaGFzW2lkXSA9IG51bGw7CiAgICB3YXRjaGVyLnJ1bigpOwogICAgLy8gaW4gZGV2IGJ1aWxkLCBjaGVjayBhbmQgc3RvcCBjaXJjdWxhciB1cGRhdGVzLgogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHsKICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7CiAgICAgIGlmIChjaXJjdWxhcltpZF0gPiBNQVhfVVBEQVRFX0NPVU5UKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArICgKICAgICAgICAgICAgd2F0Y2hlci51c2VyCiAgICAgICAgICAgICAgPyAoImluIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uIFwiIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgIlwiIikKICAgICAgICAgICAgICA6ICJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uIgogICAgICAgICAgKSwKICAgICAgICAgIHdhdGNoZXIudm0KICAgICAgICApOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICB9CgogIC8vIGtlZXAgY29waWVzIG9mIHBvc3QgcXVldWVzIGJlZm9yZSByZXNldHRpbmcgc3RhdGUKICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpOwogIHZhciB1cGRhdGVkUXVldWUgPSBxdWV1ZS5zbGljZSgpOwoKICByZXNldFNjaGVkdWxlclN0YXRlKCk7CgogIC8vIGNhbGwgY29tcG9uZW50IHVwZGF0ZWQgYW5kIGFjdGl2YXRlZCBob29rcwogIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7CiAgY2FsbFVwZGF0ZWRIb29rcyh1cGRhdGVkUXVldWUpOwoKICAvLyBkZXZ0b29sIGhvb2sKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoZGV2dG9vbHMgJiYgY29uZmlnLmRldnRvb2xzKSB7CiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpOwogIH0KfQoKZnVuY3Rpb24gY2FsbFVwZGF0ZWRIb29rcyAocXVldWUpIHsKICB2YXIgaSA9IHF1ZXVlLmxlbmd0aDsKICB3aGlsZSAoaS0tKSB7CiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2ldOwogICAgdmFyIHZtID0gd2F0Y2hlci52bTsKICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkKSB7CiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpOwogICAgfQogIH0KfQoKLyoqCiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC4KICogVGhlIHF1ZXVlIHdpbGwgYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSBlbnRpcmUgdHJlZSBoYXMgYmVlbiBwYXRjaGVkLgogKi8KZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7CiAgLy8gc2V0dGluZyBfaW5hY3RpdmUgdG8gZmFsc2UgaGVyZSBzbyB0aGF0IGEgcmVuZGVyIGZ1bmN0aW9uIGNhbgogIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpCiAgdm0uX2luYWN0aXZlID0gZmFsc2U7CiAgYWN0aXZhdGVkQ2hpbGRyZW4ucHVzaCh2bSk7Cn0KCmZ1bmN0aW9uIGNhbGxBY3RpdmF0ZWRIb29rcyAocXVldWUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlOwogICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChxdWV1ZVtpXSwgdHJ1ZSAvKiB0cnVlICovKTsKICB9Cn0KCi8qKgogKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLgogKiBKb2JzIHdpdGggZHVwbGljYXRlIElEcyB3aWxsIGJlIHNraXBwZWQgdW5sZXNzIGl0J3MKICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuCiAqLwpmdW5jdGlvbiBxdWV1ZVdhdGNoZXIgKHdhdGNoZXIpIHsKICB2YXIgaWQgPSB3YXRjaGVyLmlkOwogIGlmIChoYXNbaWRdID09IG51bGwpIHsKICAgIGhhc1tpZF0gPSB0cnVlOwogICAgaWYgKCFmbHVzaGluZykgewogICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZAogICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LgogICAgICB2YXIgaSA9IHF1ZXVlLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7CiAgICAgICAgaS0tOwogICAgICB9CiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7CiAgICB9CiAgICAvLyBxdWV1ZSB0aGUgZmx1c2gKICAgIGlmICghd2FpdGluZykgewogICAgICB3YWl0aW5nID0gdHJ1ZTsKICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciB1aWQkMSA9IDA7CgovKioKICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsCiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuCiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLgogKi8KdmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGNiLAogIG9wdGlvbnMsCiAgaXNSZW5kZXJXYXRjaGVyCikgewogIHRoaXMudm0gPSB2bTsKICBpZiAoaXNSZW5kZXJXYXRjaGVyKSB7CiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7CiAgfQogIHZtLl93YXRjaGVycy5wdXNoKHRoaXMpOwogIC8vIG9wdGlvbnMKICBpZiAob3B0aW9ucykgewogICAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7CiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjsKICAgIHRoaXMubGF6eSA9ICEhb3B0aW9ucy5sYXp5OwogICAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7CiAgfSBlbHNlIHsKICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlOwogIH0KICB0aGlzLmNiID0gY2I7CiAgdGhpcy5pZCA9ICsrdWlkJDE7IC8vIHVpZCBmb3IgYmF0Y2hpbmcKICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnMKICB0aGlzLmRlcHMgPSBbXTsKICB0aGlzLm5ld0RlcHMgPSBbXTsKICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7CiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpOwogIHRoaXMuZXhwcmVzc2lvbiA9IGV4cE9yRm4udG9TdHJpbmcoKTsKICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXIKICBpZiAodHlwZW9mIGV4cE9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjsKICB9IGVsc2UgewogICAgdGhpcy5nZXR0ZXIgPSBwYXJzZVBhdGgoZXhwT3JGbik7CiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7CiAgICAgIHRoaXMuZ2V0dGVyID0gZnVuY3Rpb24gKCkge307CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXCIiICsgZXhwT3JGbiArICJcIiAiICsKICAgICAgICAnV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuICcgKwogICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsCiAgICAgICAgdm0KICAgICAgKTsKICAgIH0KICB9CiAgdGhpcy52YWx1ZSA9IHRoaXMubGF6eQogICAgPyB1bmRlZmluZWQKICAgIDogdGhpcy5nZXQoKTsKfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkgewogIHB1c2hUYXJnZXQodGhpcyk7CiAgdmFyIHZhbHVlOwogIHZhciB2bSA9IHRoaXMudm07CiAgdHJ5IHsKICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIGlmICh0aGlzLnVzZXIpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICgiZ2V0dGVyIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZQogICAgfQogIH0gZmluYWxseSB7CiAgICAvLyAidG91Y2giIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzCiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmcKICAgIGlmICh0aGlzLmRlZXApIHsKICAgICAgdHJhdmVyc2UodmFsdWUpOwogICAgfQogICAgcG9wVGFyZ2V0KCk7CiAgICB0aGlzLmNsZWFudXBEZXBzKCk7CiAgfQogIHJldHVybiB2YWx1ZQp9OwoKLyoqCiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5hZGREZXAgPSBmdW5jdGlvbiBhZGREZXAgKGRlcCkgewogIHZhciBpZCA9IGRlcC5pZDsKICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHsKICAgIHRoaXMubmV3RGVwSWRzLmFkZChpZCk7CiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApOwogICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7CiAgICAgIGRlcC5hZGRTdWIodGhpcyk7CiAgICB9CiAgfQp9OwoKLyoqCiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGRlcCA9IHRoaXMkMS5kZXBzW2ldOwogICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7CiAgICAgIGRlcC5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICB9CiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzOwogIHRoaXMuZGVwSWRzID0gdGhpcy5uZXdEZXBJZHM7CiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7CiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTsKICB0bXAgPSB0aGlzLmRlcHM7CiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzOwogIHRoaXMubmV3RGVwcyA9IHRtcDsKICB0aGlzLm5ld0RlcHMubGVuZ3RoID0gMDsKfTsKCi8qKgogKiBTdWJzY3JpYmVyIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy4KICovCldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAodGhpcy5sYXp5KSB7CiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICB9IGVsc2UgaWYgKHRoaXMuc3luYykgewogICAgdGhpcy5ydW4oKTsKICB9IGVsc2UgewogICAgcXVldWVXYXRjaGVyKHRoaXMpOwogIH0KfTsKCi8qKgogKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci4KICovCldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7CiAgaWYgKHRoaXMuYWN0aXZlKSB7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpOwogICAgaWYgKAogICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fAogICAgICAvLyBEZWVwIHdhdGNoZXJzIGFuZCB3YXRjaGVycyBvbiBPYmplY3QvQXJyYXlzIHNob3VsZCBmaXJlIGV2ZW4KICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heQogICAgICAvLyBoYXZlIG11dGF0ZWQuCiAgICAgIGlzT2JqZWN0KHZhbHVlKSB8fAogICAgICB0aGlzLmRlZXAKICAgICkgewogICAgICAvLyBzZXQgbmV3IHZhbHVlCiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgaWYgKHRoaXMudXNlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoImNhbGxiYWNrIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgfQogICAgfQogIH0KfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuCiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy4KICovCldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkgewogIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpOwogIHRoaXMuZGlydHkgPSBmYWxzZTsKfTsKCi8qKgogKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci4KICovCldhdGNoZXIucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIHRoaXMkMS5kZXBzW2ldLmRlcGVuZCgpOwogIH0KfTsKCi8qKgogKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC4KICovCldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogIGlmICh0aGlzLmFjdGl2ZSkgewogICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdAogICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdAogICAgLy8gaWYgdGhlIHZtIGlzIGJlaW5nIGRlc3Ryb3llZC4KICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkgewogICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpOwogICAgfQogICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogICAgd2hpbGUgKGktLSkgewogICAgICB0aGlzJDEuZGVwc1tpXS5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgfQp9OwoKLyogICovCgp2YXIgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uID0gewogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGdldDogbm9vcCwKICBzZXQ6IG5vb3AKfTsKCmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHsKICAgIHJldHVybiB0aGlzW3NvdXJjZUtleV1ba2V5XQogIH07CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHsKICAgIHRoaXNbc291cmNlS2V5XVtrZXldID0gdmFsOwogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pOwp9CgpmdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7CiAgdm0uX3dhdGNoZXJzID0gW107CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9uczsKICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9CiAgaWYgKG9wdHMubWV0aG9kcykgeyBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKTsgfQogIGlmIChvcHRzLmRhdGEpIHsKICAgIGluaXREYXRhKHZtKTsKICB9IGVsc2UgewogICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pOwogIH0KICBpZiAob3B0cy5jb21wdXRlZCkgeyBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpOyB9CiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHsKICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7CiAgfQp9CgpmdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHsKICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9OwogIHZhciBwcm9wcyA9IHZtLl9wcm9wcyA9IHt9OwogIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5CiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uCiAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBbXTsKICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7CiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkCiAgaWYgKCFpc1Jvb3QpIHsKICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7CiAgfQogIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICBrZXlzLnB1c2goa2V5KTsKICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7CiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwogICAgewogICAgICB2YXIgaHlwaGVuYXRlZEtleSA9IGh5cGhlbmF0ZShrZXkpOwogICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShoeXBoZW5hdGVkS2V5KSB8fAogICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiXCIiICsgaHlwaGVuYXRlZEtleSArICJcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuIiksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgZGVmaW5lUmVhY3RpdmUocHJvcHMsIGtleSwgdmFsdWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodm0uJHBhcmVudCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlICIgKwogICAgICAgICAgICAib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgIiArCiAgICAgICAgICAgICJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcIiIgKyBrZXkgKyAiXCIiLAogICAgICAgICAgICB2bQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZQogICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXQKICAgIC8vIGluc3RhbnRpYXRpb24gaGVyZS4KICAgIGlmICghKGtleSBpbiB2bSkpIHsKICAgICAgcHJveHkodm0sICJfcHJvcHMiLCBrZXkpOwogICAgfQogIH07CgogIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApOwogIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKfQoKZnVuY3Rpb24gaW5pdERhdGEgKHZtKSB7CiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhOwogIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nCiAgICA/IGdldERhdGEoZGF0YSwgdm0pCiAgICA6IGRhdGEgfHwge307CiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7CiAgICBkYXRhID0ge307CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ2RhdGEgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0OlxuJyArCiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLAogICAgICB2bQogICAgKTsKICB9CiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgdmFyIG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzOwogIHZhciBpID0ga2V5cy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICB7CiAgICAgIGlmIChtZXRob2RzICYmIGhhc093bihtZXRob2RzLCBrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiTWV0aG9kIFwiIiArIGtleSArICJcIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBkYXRhIHByb3BlcnR5LiIpLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBpZiAocHJvcHMgJiYgaGFzT3duKHByb3BzLCBrZXkpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJUaGUgZGF0YSBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuICIgKwogICAgICAgICJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuIiwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgIHByb3h5KHZtLCAiX2RhdGEiLCBrZXkpOwogICAgfQogIH0KICAvLyBvYnNlcnZlIGRhdGEKICBvYnNlcnZlKGRhdGEsIHRydWUgLyogYXNSb290RGF0YSAqLyk7Cn0KCmZ1bmN0aW9uIGdldERhdGEgKGRhdGEsIHZtKSB7CiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVycwogIHB1c2hUYXJnZXQoKTsKICB0cnkgewogICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pCiAgfSBjYXRjaCAoZSkgewogICAgaGFuZGxlRXJyb3IoZSwgdm0sICJkYXRhKCkiKTsKICAgIHJldHVybiB7fQogIH0gZmluYWxseSB7CiAgICBwb3BUYXJnZXQoKTsKICB9Cn0KCnZhciBjb21wdXRlZFdhdGNoZXJPcHRpb25zID0geyBsYXp5OiB0cnVlIH07CgpmdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkgewogIC8vICRmbG93LWRpc2FibGUtbGluZQogIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUgogIHZhciBpc1NTUiA9IGlzU2VydmVyUmVuZGVyaW5nKCk7CgogIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkgewogICAgdmFyIHVzZXJEZWYgPSBjb21wdXRlZFtrZXldOwogICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0OwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBnZXR0ZXIgPT0gbnVsbCkgewogICAgICB3YXJuKAogICAgICAgICgiR2V0dGVyIGlzIG1pc3NpbmcgZm9yIGNvbXB1dGVkIHByb3BlcnR5IFwiIiArIGtleSArICJcIi4iKSwKICAgICAgICB2bQogICAgICApOwogICAgfQoKICAgIGlmICghaXNTU1IpIHsKICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKAogICAgICAgIHZtLAogICAgICAgIGdldHRlciB8fCBub29wLAogICAgICAgIG5vb3AsCiAgICAgICAgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucwogICAgICApOwogICAgfQoKICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGUKICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkCiAgICAvLyBhdCBpbnN0YW50aWF0aW9uIGhlcmUuCiAgICBpZiAoIShrZXkgaW4gdm0pKSB7CiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkgewogICAgICAgIHdhcm4oKCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLiIpLCB2bSk7CiAgICAgIH0gZWxzZSBpZiAodm0uJG9wdGlvbnMucHJvcHMgJiYga2V5IGluIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICAgICAgd2FybigoIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC4iKSwgdm0pOwogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBkZWZpbmVDb21wdXRlZCAoCiAgdGFyZ2V0LAogIGtleSwKICB1c2VyRGVmCikgewogIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpOwogIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlCiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KQogICAgICA6IHVzZXJEZWY7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDsKICB9IGVsc2UgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHVzZXJEZWYuZ2V0CiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2UKICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSkKICAgICAgICA6IHVzZXJEZWYuZ2V0CiAgICAgIDogbm9vcDsKICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldAogICAgICA/IHVzZXJEZWYuc2V0CiAgICAgIDogbm9vcDsKICB9CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICB3YXJuKAogICAgICAgICgiQ29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIHdhcyBhc3NpZ25lZCB0byBidXQgaXQgaGFzIG5vIHNldHRlci4iKSwKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbik7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXB1dGVkR2V0dGVyIChrZXkpIHsKICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkgewogICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTsKICAgIGlmICh3YXRjaGVyKSB7CiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7CiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpOwogICAgICB9CiAgICAgIGlmIChEZXAudGFyZ2V0KSB7CiAgICAgICAgd2F0Y2hlci5kZXBlbmQoKTsKICAgICAgfQogICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZQogICAgfQogIH0KfQoKZnVuY3Rpb24gaW5pdE1ldGhvZHMgKHZtLCBtZXRob2RzKSB7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHsKICAgIHsKICAgICAgaWYgKG1ldGhvZHNba2V5XSA9PSBudWxsKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiAiICsKICAgICAgICAgICJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAoIk1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgcHJvcC4iKSwKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuICIgKwogICAgICAgICAgIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pOwogIH0KfQoKZnVuY3Rpb24gaW5pdFdhdGNoICh2bSwgd2F0Y2gpIHsKICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHsKICAgIHZhciBoYW5kbGVyID0gd2F0Y2hba2V5XTsKICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykgewogICAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcltpXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcik7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGhhbmRsZXIsCiAgb3B0aW9ucwopIHsKICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkgewogICAgb3B0aW9ucyA9IGhhbmRsZXI7CiAgICBoYW5kbGVyID0gaGFuZGxlci5oYW5kbGVyOwogIH0KICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7CiAgICBoYW5kbGVyID0gdm1baGFuZGxlcl07CiAgfQogIHJldHVybiB2bS4kd2F0Y2goZXhwT3JGbiwgaGFuZGxlciwgb3B0aW9ucykKfQoKZnVuY3Rpb24gc3RhdGVNaXhpbiAoVnVlKSB7CiAgLy8gZmxvdyBzb21laG93IGhhcyBwcm9ibGVtcyB3aXRoIGRpcmVjdGx5IGRlY2xhcmVkIGRlZmluaXRpb24gb2JqZWN0CiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwCiAgLy8gdGhlIG9iamVjdCBoZXJlLgogIHZhciBkYXRhRGVmID0ge307CiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07CiAgdmFyIHByb3BzRGVmID0ge307CiAgcHJvcHNEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHJvcHMgfTsKICB7CiAgICBkYXRhRGVmLnNldCA9IGZ1bmN0aW9uIChuZXdEYXRhKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICsKICAgICAgICAnVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4nLAogICAgICAgIHRoaXMKICAgICAgKTsKICAgIH07CiAgICBwcm9wc0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHdhcm4oIiRwcm9wcyBpcyByZWFkb25seS4iLCB0aGlzKTsKICAgIH07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGRhdGEnLCBkYXRhRGVmKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTsKCiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0OwogIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDsKCiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoCiAgICBleHBPckZuLAogICAgY2IsCiAgICBvcHRpb25zCiAgKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKGlzUGxhaW5PYmplY3QoY2IpKSB7CiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucykKICAgIH0KICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy51c2VyID0gdHJ1ZTsKICAgIHZhciB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKTsKICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZSkgewogICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiB1bndhdGNoRm4gKCkgewogICAgICB3YXRjaGVyLnRlYXJkb3duKCk7CiAgICB9CiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0UHJvdmlkZSAodm0pIHsKICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7CiAgaWYgKHByb3ZpZGUpIHsKICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nCiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKQogICAgICA6IHByb3ZpZGU7CiAgfQp9CgpmdW5jdGlvbiBpbml0SW5qZWN0aW9ucyAodm0pIHsKICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTsKICBpZiAocmVzdWx0KSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgICAgewogICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSAiICsKICAgICAgICAgICAgIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXCIiICsga2V5ICsgIlwiIiwKICAgICAgICAgICAgdm0KICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkgewogIGlmIChpbmplY3QpIHsKICAgIC8vIGluamVjdCBpcyA6YW55IGJlY2F1c2UgZmxvdyBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgY2FjaGVkCiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBrZXlzID0gaGFzU3ltYm9sCiAgICAgID8gUmVmbGVjdC5vd25LZXlzKGluamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwogICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluamVjdCwga2V5KS5lbnVtZXJhYmxlCiAgICAgIH0pCiAgICAgIDogT2JqZWN0LmtleXMoaW5qZWN0KTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTsKICAgICAgdmFyIHNvdXJjZSA9IHZtOwogICAgICB3aGlsZSAoc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDsKICAgICAgfQogICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHsKICAgICAgICAgIHZhciBwcm92aWRlRGVmYXVsdCA9IGluamVjdFtrZXldLmRlZmF1bHQ7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pCiAgICAgICAgICAgIDogcHJvdmlkZURlZmF1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm4oKCJJbmplY3Rpb24gXCIiICsga2V5ICsgIlwiIG5vdCBmb3VuZCIpLCB2bSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLgogKi8KZnVuY3Rpb24gcmVuZGVyTGlzdCAoCiAgdmFsLAogIHJlbmRlcgopIHsKICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpOwogICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHsKICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpOwogICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBrZXkgPSBrZXlzW2ldOwogICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7CiAgICB9CiAgfQogIGlmIChpc0RlZihyZXQpKSB7CiAgICAocmV0KS5faXNWTGlzdCA9IHRydWU7CiAgfQogIHJldHVybiByZXQKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyA8c2xvdD4KICovCmZ1bmN0aW9uIHJlbmRlclNsb3QgKAogIG5hbWUsCiAgZmFsbGJhY2ssCiAgcHJvcHMsCiAgYmluZE9iamVjdAopIHsKICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07CiAgdmFyIG5vZGVzOwogIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3QKICAgIHByb3BzID0gcHJvcHMgfHwge307CiAgICBpZiAoYmluZE9iamVjdCkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc09iamVjdChiaW5kT2JqZWN0KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7CiAgICB9CiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7CiAgfSBlbHNlIHsKICAgIHZhciBzbG90Tm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXTsKICAgIC8vIHdhcm4gZHVwbGljYXRlIHNsb3QgdXNhZ2UKICAgIGlmIChzbG90Tm9kZXMpIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzbG90Tm9kZXMuX3JlbmRlcmVkKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcIiIgKyBuYW1lICsgIlwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlICIgKwogICAgICAgICAgIi0gdGhpcyB3aWxsIGxpa2VseSBjYXVzZSByZW5kZXIgZXJyb3JzLiIsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBzbG90Tm9kZXMuX3JlbmRlcmVkID0gdHJ1ZTsKICAgIH0KICAgIG5vZGVzID0gc2xvdE5vZGVzIHx8IGZhbGxiYWNrOwogIH0KCiAgdmFyIHRhcmdldCA9IHByb3BzICYmIHByb3BzLnNsb3Q7CiAgaWYgKHRhcmdldCkgewogICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpCiAgfSBlbHNlIHsKICAgIHJldHVybiBub2RlcwogIH0KfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzCiAqLwpmdW5jdGlvbiByZXNvbHZlRmlsdGVyIChpZCkgewogIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHkKfQoKLyogICovCgpmdW5jdGlvbiBpc0tleU5vdE1hdGNoIChleHBlY3QsIGFjdHVhbCkgewogIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHsKICAgIHJldHVybiBleHBlY3QuaW5kZXhPZihhY3R1YWwpID09PSAtMQogIH0gZWxzZSB7CiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWwKICB9Cn0KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgY2hlY2tpbmcga2V5Q29kZXMgZnJvbSBjb25maWcuCiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fawogKiBwYXNzaW5nIGluIGV2ZW50S2V5TmFtZSBhcyBsYXN0IGFyZ3VtZW50IHNlcGFyYXRlbHkgZm9yIGJhY2t3YXJkcyBjb21wYXQKICovCmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKAogIGV2ZW50S2V5Q29kZSwKICBrZXksCiAgYnVpbHRJbktleUNvZGUsCiAgZXZlbnRLZXlOYW1lLAogIGJ1aWx0SW5LZXlOYW1lCikgewogIHZhciBtYXBwZWRLZXlDb2RlID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbktleUNvZGU7CiAgaWYgKGJ1aWx0SW5LZXlOYW1lICYmIGV2ZW50S2V5TmFtZSAmJiAhY29uZmlnLmtleUNvZGVzW2tleV0pIHsKICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpCiAgfSBlbHNlIGlmIChtYXBwZWRLZXlDb2RlKSB7CiAgICByZXR1cm4gaXNLZXlOb3RNYXRjaChtYXBwZWRLZXlDb2RlLCBldmVudEtleUNvZGUpCiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHsKICAgIHJldHVybiBoeXBoZW5hdGUoZXZlbnRLZXlOYW1lKSAhPT0ga2V5CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgbWVyZ2luZyB2LWJpbmQ9Im9iamVjdCIgaW50byBhIFZOb2RlJ3MgZGF0YS4KICovCmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoCiAgZGF0YSwKICB0YWcsCiAgdmFsdWUsCiAgYXNQcm9wLAogIGlzU3luYwopIHsKICBpZiAodmFsdWUpIHsKICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICd2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCBvciBBcnJheSB2YWx1ZScsCiAgICAgICAgdGhpcwogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgdmFsdWUgPSB0b09iamVjdCh2YWx1ZSk7CiAgICAgIH0KICAgICAgdmFyIGhhc2g7CiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8CiAgICAgICAgICBrZXkgPT09ICdzdHlsZScgfHwKICAgICAgICAgIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUoa2V5KQogICAgICAgICkgewogICAgICAgICAgaGFzaCA9IGRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7CiAgICAgICAgICBoYXNoID0gYXNQcm9wIHx8IGNvbmZpZy5tdXN0VXNlUHJvcCh0YWcsIHR5cGUsIGtleSkKICAgICAgICAgICAgPyBkYXRhLmRvbVByb3BzIHx8IChkYXRhLmRvbVByb3BzID0ge30pCiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2V5IGluIGhhc2gpKSB7CiAgICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZVtrZXldOwoKICAgICAgICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgICAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICAgICAgICAgICAgb25bKCJ1cGRhdGU6IiArIGtleSldID0gZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuCiAqLwpmdW5jdGlvbiByZW5kZXJTdGF0aWMgKAogIGluZGV4LAogIGlzSW5Gb3IKKSB7CiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTsKICB2YXIgdHJlZSA9IGNhY2hlZFtpbmRleF07CiAgLy8gaWYgaGFzIGFscmVhZHktcmVuZGVyZWQgc3RhdGljIHRyZWUgYW5kIG5vdCBpbnNpZGUgdi1mb3IsCiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuCiAgaWYgKHRyZWUgJiYgIWlzSW5Gb3IpIHsKICAgIHJldHVybiB0cmVlCiAgfQogIC8vIG90aGVyd2lzZSwgcmVuZGVyIGEgZnJlc2ggdHJlZS4KICB0cmVlID0gY2FjaGVkW2luZGV4XSA9IHRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2luZGV4XS5jYWxsKAogICAgdGhpcy5fcmVuZGVyUHJveHksCiAgICBudWxsLAogICAgdGhpcyAvLyBmb3IgcmVuZGVyIGZucyBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9uYWwgY29tcG9uZW50IHRlbXBsYXRlcwogICk7CiAgbWFya1N0YXRpYyh0cmVlLCAoIl9fc3RhdGljX18iICsgaW5kZXgpLCBmYWxzZSk7CiAgcmV0dXJuIHRyZWUKfQoKLyoqCiAqIFJ1bnRpbWUgaGVscGVyIGZvciB2LW9uY2UuCiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LgogKi8KZnVuY3Rpb24gbWFya09uY2UgKAogIHRyZWUsCiAgaW5kZXgsCiAga2V5CikgewogIG1hcmtTdGF0aWModHJlZSwgKCJfX29uY2VfXyIgKyBpbmRleCArIChrZXkgPyAoIl8iICsga2V5KSA6ICIiKSksIHRydWUpOwogIHJldHVybiB0cmVlCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMgKAogIHRyZWUsCiAga2V5LAogIGlzT25jZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykgewogICAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWVbaV0sIChrZXkgKyAiXyIgKyBpKSwgaXNPbmNlKTsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBtYXJrU3RhdGljTm9kZSh0cmVlLCBrZXksIGlzT25jZSk7CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljTm9kZSAobm9kZSwga2V5LCBpc09uY2UpIHsKICBub2RlLmlzU3RhdGljID0gdHJ1ZTsKICBub2RlLmtleSA9IGtleTsKICBub2RlLmlzT25jZSA9IGlzT25jZTsKfQoKLyogICovCgpmdW5jdGlvbiBiaW5kT2JqZWN0TGlzdGVuZXJzIChkYXRhLCB2YWx1ZSkgewogIGlmICh2YWx1ZSkgewogICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJywKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICB2YXIgb24gPSBkYXRhLm9uID0gZGF0YS5vbiA/IGV4dGVuZCh7fSwgZGF0YS5vbikgOiB7fTsKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7CiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTsKICAgICAgICB2YXIgb3VycyA9IHZhbHVlW2tleV07CiAgICAgICAgb25ba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBvdXJzKSA6IG91cnM7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgpmdW5jdGlvbiBpbnN0YWxsUmVuZGVySGVscGVycyAodGFyZ2V0KSB7CiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7CiAgdGFyZ2V0Ll9uID0gdG9OdW1iZXI7CiAgdGFyZ2V0Ll9zID0gdG9TdHJpbmc7CiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDsKICB0YXJnZXQuX3QgPSByZW5kZXJTbG90OwogIHRhcmdldC5fcSA9IGxvb3NlRXF1YWw7CiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mOwogIHRhcmdldC5fbSA9IHJlbmRlclN0YXRpYzsKICB0YXJnZXQuX2YgPSByZXNvbHZlRmlsdGVyOwogIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7CiAgdGFyZ2V0Ll9iID0gYmluZE9iamVjdFByb3BzOwogIHRhcmdldC5fdiA9IGNyZWF0ZVRleHRWTm9kZTsKICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlOwogIHRhcmdldC5fdSA9IHJlc29sdmVTY29wZWRTbG90czsKICB0YXJnZXQuX2cgPSBiaW5kT2JqZWN0TGlzdGVuZXJzOwp9CgovKiAgKi8KCmZ1bmN0aW9uIEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0ICgKICBkYXRhLAogIHByb3BzLAogIGNoaWxkcmVuLAogIHBhcmVudCwKICBDdG9yCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIC8vIGVuc3VyZSB0aGUgY3JlYXRlRWxlbWVudCBmdW5jdGlvbiBpbiBmdW5jdGlvbmFsIGNvbXBvbmVudHMKICAvLyBnZXRzIGEgdW5pcXVlIGNvbnRleHQgLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBuYW1lZCBzbG90IGNoZWNrCiAgdmFyIGNvbnRleHRWbTsKICBpZiAoaGFzT3duKHBhcmVudCwgJ191aWQnKSkgewogICAgY29udGV4dFZtID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQpOwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBjb250ZXh0Vm0uX29yaWdpbmFsID0gcGFyZW50OwogIH0gZWxzZSB7CiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC4KICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYWJsZSB0byBnZXQgYSBob2xkIHRvIHRoZQogICAgLy8gcmVhbCBjb250ZXh0IGluc3RhbmNlLgogICAgY29udGV4dFZtID0gcGFyZW50OwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBwYXJlbnQgPSBwYXJlbnQuX29yaWdpbmFsOwogIH0KICB2YXIgaXNDb21waWxlZCA9IGlzVHJ1ZShvcHRpb25zLl9jb21waWxlZCk7CiAgdmFyIG5lZWROb3JtYWxpemF0aW9uID0gIWlzQ29tcGlsZWQ7CgogIHRoaXMuZGF0YSA9IGRhdGE7CiAgdGhpcy5wcm9wcyA9IHByb3BzOwogIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICB0aGlzLmxpc3RlbmVycyA9IGRhdGEub24gfHwgZW1wdHlPYmplY3Q7CiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTsKICB0aGlzLnNsb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpOyB9OwoKICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlCiAgaWYgKGlzQ29tcGlsZWQpIHsKICAgIC8vIGV4cG9zaW5nICRvcHRpb25zIGZvciByZW5kZXJTdGF0aWMoKQogICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAvLyBwcmUtcmVzb2x2ZSBzbG90cyBmb3IgcmVuZGVyU2xvdCgpCiAgICB0aGlzLiRzbG90cyA9IHRoaXMuc2xvdHMoKTsKICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gZGF0YS5zY29wZWRTbG90cyB8fCBlbXB0eU9iamVjdDsKICB9CgogIGlmIChvcHRpb25zLl9zY29wZUlkKSB7CiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsKICAgICAgdmFyIHZub2RlID0gY3JlYXRlRWxlbWVudChjb250ZXh0Vm0sIGEsIGIsIGMsIGQsIG5lZWROb3JtYWxpemF0aW9uKTsKICAgICAgaWYgKHZub2RlICYmICFBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7CiAgICAgICAgdm5vZGUuZm5Db250ZXh0ID0gcGFyZW50OwogICAgICB9CiAgICAgIHJldHVybiB2bm9kZQogICAgfTsKICB9IGVsc2UgewogICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9OwogIH0KfQoKaW5zdGFsbFJlbmRlckhlbHBlcnMoRnVuY3Rpb25hbFJlbmRlckNvbnRleHQucHJvdG90eXBlKTsKCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKAogIEN0b3IsCiAgcHJvcHNEYXRhLAogIGRhdGEsCiAgY29udGV4dFZtLAogIGNoaWxkcmVuCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIHZhciBwcm9wcyA9IHt9OwogIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKGlzRGVmKHByb3BPcHRpb25zKSkgewogICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7CiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YS5wcm9wcykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5wcm9wcyk7IH0KICB9CgogIHZhciByZW5kZXJDb250ZXh0ID0gbmV3IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0KAogICAgZGF0YSwKICAgIHByb3BzLAogICAgY2hpbGRyZW4sCiAgICBjb250ZXh0Vm0sCiAgICBDdG9yCiAgKTsKCiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTsKCiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucykKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICB2YXIgdm5vZGVzID0gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUpIHx8IFtdOwogICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc1tpXSA9IGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQodm5vZGVzW2ldLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucyk7CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0ICh2bm9kZSwgZGF0YSwgY29udGV4dFZtLCBvcHRpb25zKSB7CiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWQKICAvLyAoZS5nLiBpdCB3YXMgZnJvbSBhIGNhY2hlZCBub3JtYWwgc2xvdCkgdGhlIGZuQ29udGV4dCBjYXVzZXMgbmFtZWQgc2xvdHMKICAvLyB0aGF0IHNob3VsZCBub3QgYmUgbWF0Y2hlZCB0byBtYXRjaC4KICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTsKICBjbG9uZS5mbkNvbnRleHQgPSBjb250ZXh0Vm07CiAgY2xvbmUuZm5PcHRpb25zID0gb3B0aW9uczsKICBpZiAoZGF0YS5zbG90KSB7CiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDsKICB9CiAgcmV0dXJuIGNsb25lCn0KCmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRvLCBmcm9tKSB7CiAgZm9yICh2YXIga2V5IGluIGZyb20pIHsKICAgIHRvW2NhbWVsaXplKGtleSldID0gZnJvbVtrZXldOwogIH0KfQoKLyogICovCgoKCgovLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGhvb2sgdG8gd2VleCBuYXRpdmUgcmVuZGVyIGVuZ2luZS4KLy8gVGhlIGhvb2sgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgbmF0aXZlLCBub3QgamF2YXNjcmlwdC4KCgovLyBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHRvIHdlZXggbmF0aXZlIHJlbmRlciBlbmdpbmUuCgovKiAgKi8KCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYW5rczEwMTAwL3dlZXgtbmF0aXZlLWRpcmVjdGl2ZS90cmVlL21hc3Rlci9jb21wb25lbnQKCi8vIGxpc3RlbmluZyBvbiBuYXRpdmUgY2FsbGJhY2sKCi8qICAqLwoKLyogICovCgovLyBpbmxpbmUgaG9va3MgdG8gYmUgaW52b2tlZCBvbiBjb21wb25lbnQgVk5vZGVzIGR1cmluZyBwYXRjaAp2YXIgY29tcG9uZW50Vk5vZGVIb29rcyA9IHsKICBpbml0OiBmdW5jdGlvbiBpbml0ICgKICAgIHZub2RlLAogICAgaHlkcmF0aW5nLAogICAgcGFyZW50RWxtLAogICAgcmVmRWxtCiAgKSB7CiAgICBpZiAoCiAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmCiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiYKICAgICAgdm5vZGUuZGF0YS5rZWVwQWxpdmUKICAgICkgewogICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2gKICAgICAgdmFyIG1vdW50ZWROb2RlID0gdm5vZGU7IC8vIHdvcmsgYXJvdW5kIGZsb3cKICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKAogICAgICAgIHZub2RlLAogICAgICAgIGFjdGl2ZUluc3RhbmNlLAogICAgICAgIHBhcmVudEVsbSwKICAgICAgICByZWZFbG0KICAgICAgKTsKICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTsKICAgIH0KICB9LAoKICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkgewogICAgdmFyIG9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTsKICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KAogICAgICBjaGlsZCwKICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHMKICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzCiAgICAgIHZub2RlLCAvLyBuZXcgcGFyZW50IHZub2RlCiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuCiAgICApOwogIH0sCgogIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkgewogICAgdmFyIGNvbnRleHQgPSB2bm9kZS5jb250ZXh0OwogICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7CiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHsKICAgICAgY29tcG9uZW50SW5zdGFuY2UuX2lzTW91bnRlZCA9IHRydWU7CiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpOwogICAgfQogICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7CiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHsKICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTIKICAgICAgICAvLyBEdXJpbmcgdXBkYXRlcywgYSBrZXB0LWFsaXZlIGNvbXBvbmVudCdzIGNoaWxkIGNvbXBvbmVudHMgbWF5CiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzCiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbAogICAgICAgIC8vIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgd2hvbGUgcGF0Y2ggcHJvY2VzcyBlbmRlZC4KICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pOwogICAgICB9CiAgICB9CiAgfSwKCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHsKICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkgewogICAgICAgIGNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7CiAgICAgIH0KICAgIH0KICB9Cn07Cgp2YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7CgpmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKAogIEN0b3IsCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICBpZiAoaXNVbmRlZihDdG9yKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgYmFzZUN0b3IgPSBjb250ZXh0LiRvcHRpb25zLl9iYXNlOwoKICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3IKICBpZiAoaXNPYmplY3QoQ3RvcikpIHsKICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7CiAgfQoKICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksCiAgLy8gcmVqZWN0LgogIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJykgewogICAgewogICAgICB3YXJuKCgiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4KICB9CgogIC8vIGFzeW5jIGNvbXBvbmVudAogIHZhciBhc3luY0ZhY3Rvcnk7CiAgaWYgKGlzVW5kZWYoQ3Rvci5jaWQpKSB7CiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yOwogICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTsKICAgIGlmIChDdG9yID09PSB1bmRlZmluZWQpIHsKICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZAogICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS4KICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgYXN5bmMgc2VydmVyLXJlbmRlcmluZyBhbmQgaHlkcmF0aW9uLgogICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcigKICAgICAgICBhc3luY0ZhY3RvcnksCiAgICAgICAgZGF0YSwKICAgICAgICBjb250ZXh0LAogICAgICAgIGNoaWxkcmVuLAogICAgICAgIHRhZwogICAgICApCiAgICB9CiAgfQoKICBkYXRhID0gZGF0YSB8fCB7fTsKCiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlcgogIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvbgogIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvcik7CgogIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHMKICBpZiAoaXNEZWYoZGF0YS5tb2RlbCkpIHsKICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7CiAgfQoKICAvLyBleHRyYWN0IHByb3BzCiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTsKCiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnQKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkgewogICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoQ3RvciwgcHJvcHNEYXRhLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbikKICB9CgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzLCBzaW5jZSB0aGVzZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzCiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnMKICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjsKICAvLyByZXBsYWNlIHdpdGggbGlzdGVuZXJzIHdpdGggLm5hdGl2ZSBtb2RpZmllcgogIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLgogIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uOwoKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHsKICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmcKICAgIC8vIG90aGVyIHRoYW4gcHJvcHMgJiBsaXN0ZW5lcnMgJiBzbG90CgogICAgLy8gd29yayBhcm91bmQgZmxvdwogICAgdmFyIHNsb3QgPSBkYXRhLnNsb3Q7CiAgICBkYXRhID0ge307CiAgICBpZiAoc2xvdCkgewogICAgICBkYXRhLnNsb3QgPSBzbG90OwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlCiAgaW5zdGFsbENvbXBvbmVudEhvb2tzKGRhdGEpOwoKICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZQogIHZhciBuYW1lID0gQ3Rvci5vcHRpb25zLm5hbWUgfHwgdGFnOwogIHZhciB2bm9kZSA9IG5ldyBWTm9kZSgKICAgICgidnVlLWNvbXBvbmVudC0iICsgKEN0b3IuY2lkKSArIChuYW1lID8gKCItIiArIG5hbWUpIDogJycpKSwKICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHQsCiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LAogICAgYXN5bmNGYWN0b3J5CiAgKTsKCiAgLy8gV2VleCBzcGVjaWZpYzogaW52b2tlIHJlY3ljbGUtbGlzdCBvcHRpbWl6ZWQgQHJlbmRlciBmdW5jdGlvbiBmb3IKICAvLyBleHRyYWN0aW5nIGNlbGwtc2xvdCB0ZW1wbGF0ZS4KICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGFua3MxMDEwMC93ZWV4LW5hdGl2ZS1kaXJlY3RpdmUvdHJlZS9tYXN0ZXIvY29tcG9uZW50CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgcmV0dXJuIHZub2RlCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUgKAogIHZub2RlLCAvLyB3ZSBrbm93IGl0J3MgTW91bnRlZENvbXBvbmVudFZOb2RlIGJ1dCBmbG93IGRvZXNuJ3QKICBwYXJlbnQsIC8vIGFjdGl2ZUluc3RhbmNlIGluIGxpZmVjeWNsZSBzdGF0ZQogIHBhcmVudEVsbSwKICByZWZFbG0KKSB7CiAgdmFyIG9wdGlvbnMgPSB7CiAgICBfaXNDb21wb25lbnQ6IHRydWUsCiAgICBwYXJlbnQ6IHBhcmVudCwKICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsCiAgICBfcGFyZW50RWxtOiBwYXJlbnRFbG0gfHwgbnVsbCwKICAgIF9yZWZFbG06IHJlZkVsbSB8fCBudWxsCiAgfTsKICAvLyBjaGVjayBpbmxpbmUtdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9ucwogIHZhciBpbmxpbmVUZW1wbGF0ZSA9IHZub2RlLmRhdGEuaW5saW5lVGVtcGxhdGU7CiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkgewogICAgb3B0aW9ucy5yZW5kZXIgPSBpbmxpbmVUZW1wbGF0ZS5yZW5kZXI7CiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZuczsKICB9CiAgcmV0dXJuIG5ldyB2bm9kZS5jb21wb25lbnRPcHRpb25zLkN0b3Iob3B0aW9ucykKfQoKZnVuY3Rpb24gaW5zdGFsbENvbXBvbmVudEhvb2tzIChkYXRhKSB7CiAgdmFyIGhvb2tzID0gZGF0YS5ob29rIHx8IChkYXRhLmhvb2sgPSB7fSk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBob29rc1RvTWVyZ2VbaV07CiAgICBob29rc1trZXldID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldOwogIH0KfQoKLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50bwovLyBwcm9wIGFuZCBldmVudCBoYW5kbGVyIHJlc3BlY3RpdmVseS4KZnVuY3Rpb24gdHJhbnNmb3JtTW9kZWwgKG9wdGlvbnMsIGRhdGEpIHsKICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJzsKICB2YXIgZXZlbnQgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLmV2ZW50KSB8fCAnaW5wdXQnOyhkYXRhLnByb3BzIHx8IChkYXRhLnByb3BzID0ge30pKVtwcm9wXSA9IGRhdGEubW9kZWwudmFsdWU7CiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICBpZiAoaXNEZWYob25bZXZlbnRdKSkgewogICAgb25bZXZlbnRdID0gW2RhdGEubW9kZWwuY2FsbGJhY2tdLmNvbmNhdChvbltldmVudF0pOwogIH0gZWxzZSB7CiAgICBvbltldmVudF0gPSBkYXRhLm1vZGVsLmNhbGxiYWNrOwogIH0KfQoKLyogICovCgp2YXIgU0lNUExFX05PUk1BTElaRSA9IDE7CnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjsKCi8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHByb3ZpZGluZyBhIG1vcmUgZmxleGlibGUgaW50ZXJmYWNlCi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvdwpmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlLAogIGFsd2F5c05vcm1hbGl6ZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gZGF0YTsKICAgIGRhdGEgPSB1bmRlZmluZWQ7CiAgfQogIGlmIChpc1RydWUoYWx3YXlzTm9ybWFsaXplKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFOwogIH0KICByZXR1cm4gX2NyZWF0ZUVsZW1lbnQoY29udGV4dCwgdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUpCn0KCmZ1bmN0aW9uIF9jcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlCikgewogIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICJBdm9pZCB1c2luZyBvYnNlcnZlZCBkYXRhIG9iamVjdCBhcyB2bm9kZSBkYXRhOiAiICsgKEpTT04uc3RyaW5naWZ5KGRhdGEpKSArICJcbiIgKwogICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJywKICAgICAgY29udGV4dAogICAgKTsKICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKCkKICB9CiAgLy8gb2JqZWN0IHN5bnRheCBpbiB2LWJpbmQKICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHsKICAgIHRhZyA9IGRhdGEuaXM7CiAgfQogIGlmICghdGFnKSB7CiAgICAvLyBpbiBjYXNlIG9mIGNvbXBvbmVudCA6aXMgc2V0IHRvIGZhbHN5IHZhbHVlCiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQogIC8vIHdhcm4gYWdhaW5zdCBub24tcHJpbWl0aXZlIGtleQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIGlzRGVmKGRhdGEpICYmIGlzRGVmKGRhdGEua2V5KSAmJiAhaXNQcmltaXRpdmUoZGF0YS5rZXkpCiAgKSB7CiAgICB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCAnICsKICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLAogICAgICAgIGNvbnRleHQKICAgICAgKTsKICAgIH0KICB9CiAgLy8gc3VwcG9ydCBzaW5nbGUgZnVuY3Rpb24gY2hpbGRyZW4gYXMgZGVmYXVsdCBzY29wZWQgc2xvdAogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJgogICAgdHlwZW9mIGNoaWxkcmVuWzBdID09PSAnZnVuY3Rpb24nCiAgKSB7CiAgICBkYXRhID0gZGF0YSB8fCB7fTsKICAgIGRhdGEuc2NvcGVkU2xvdHMgPSB7IGRlZmF1bHQ6IGNoaWxkcmVuWzBdIH07CiAgICBjaGlsZHJlbi5sZW5ndGggPSAwOwogIH0KICBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IEFMV0FZU19OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gbm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0KICB2YXIgdm5vZGUsIG5zOwogIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJykgewogICAgdmFyIEN0b3I7CiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpOwogICAgaWYgKGNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHMKICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHRhZyksIGRhdGEsIGNoaWxkcmVuLAogICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0CiAgICAgICk7CiAgICB9IGVsc2UgaWYgKGlzRGVmKEN0b3IgPSByZXNvbHZlQXNzZXQoY29udGV4dC4kb3B0aW9ucywgJ2NvbXBvbmVudHMnLCB0YWcpKSkgewogICAgICAvLyBjb21wb25lbnQKICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7CiAgICB9IGVsc2UgewogICAgICAvLyB1bmtub3duIG9yIHVubGlzdGVkIG5hbWVzcGFjZWQgZWxlbWVudHMKICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHMKICAgICAgLy8gcGFyZW50IG5vcm1hbGl6ZXMgY2hpbGRyZW4KICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbiwKICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dAogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBkaXJlY3QgY29tcG9uZW50IG9wdGlvbnMgLyBjb25zdHJ1Y3RvcgogICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7CiAgfQogIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgcmV0dXJuIHZub2RlCiAgfSBlbHNlIGlmIChpc0RlZih2bm9kZSkpIHsKICAgIGlmIChpc0RlZihucykpIHsgYXBwbHlOUyh2bm9kZSwgbnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH0KICAgIHJldHVybiB2bm9kZQogIH0gZWxzZSB7CiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQp9CgpmdW5jdGlvbiBhcHBseU5TICh2bm9kZSwgbnMsIGZvcmNlKSB7CiAgdm5vZGUubnMgPSBuczsKICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHsKICAgIC8vIHVzZSBkZWZhdWx0IG5hbWVzcGFjZSBpbnNpZGUgZm9yZWlnbk9iamVjdAogICAgbnMgPSB1bmRlZmluZWQ7CiAgICBmb3JjZSA9IHRydWU7CiAgfQogIGlmIChpc0RlZih2bm9kZS5jaGlsZHJlbikpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoY2hpbGQudGFnKSAmJiAoCiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7CiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMsIGZvcmNlKTsKICAgICAgfQogICAgfQogIH0KfQoKLy8gcmVmICM1MzE4Ci8vIG5lY2Vzc2FyeSB0byBlbnN1cmUgcGFyZW50IHJlLXJlbmRlciB3aGVuIGRlZXAgYmluZGluZ3MgbGlrZSA6c3R5bGUgYW5kCi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzCmZ1bmN0aW9uIHJlZ2lzdGVyRGVlcEJpbmRpbmdzIChkYXRhKSB7CiAgaWYgKGlzT2JqZWN0KGRhdGEuc3R5bGUpKSB7CiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTsKICB9CiAgaWYgKGlzT2JqZWN0KGRhdGEuY2xhc3MpKSB7CiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHsKICB2bS5fdm5vZGUgPSBudWxsOyAvLyB0aGUgcm9vdCBvZiB0aGUgY2hpbGQgdHJlZQogIHZtLl9zdGF0aWNUcmVlcyA9IG51bGw7IC8vIHYtb25jZSBjYWNoZWQgdHJlZXMKICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogIHZhciBwYXJlbnRWbm9kZSA9IHZtLiR2bm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZQogIHZhciByZW5kZXJDb250ZXh0ID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuY29udGV4dDsKICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpOwogIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0OwogIC8vIGJpbmQgdGhlIGNyZWF0ZUVsZW1lbnQgZm4gdG8gdGhpcyBpbnN0YW5jZQogIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuCiAgLy8gYXJncyBvcmRlcjogdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUsIGFsd2F5c05vcm1hbGl6ZQogIC8vIGludGVybmFsIHZlcnNpb24gaXMgdXNlZCBieSByZW5kZXIgZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gdGVtcGxhdGVzCiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9OwogIC8vIG5vcm1hbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgZm9yIHRoZSBwdWJsaWMgdmVyc2lvbiwgdXNlZCBpbgogIC8vIHVzZXItd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zLgogIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9OwoKICAvLyAkYXR0cnMgJiAkbGlzdGVuZXJzIGFyZSBleHBvc2VkIGZvciBlYXNpZXIgSE9DIGNyZWF0aW9uLgogIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWQKICB2YXIgcGFyZW50RGF0YSA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmRhdGE7CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgewogICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkYXR0cnMgaXMgcmVhZG9ubHkuIiwgdm0pOwogICAgfSwgdHJ1ZSk7CiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LiIsIHZtKTsKICAgIH0sIHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVuZGVyTWl4aW4gKFZ1ZSkgewogIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzCiAgaW5zdGFsbFJlbmRlckhlbHBlcnMoVnVlLnByb3RvdHlwZSk7CgogIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpCiAgfTsKCiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHZtID0gdGhpczsKICAgIHZhciByZWYgPSB2bS4kb3B0aW9uczsKICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyOwogICAgdmFyIF9wYXJlbnRWbm9kZSA9IHJlZi5fcGFyZW50Vm5vZGU7CgogICAgLy8gcmVzZXQgX3JlbmRlcmVkIGZsYWcgb24gc2xvdHMgZm9yIGR1cGxpY2F0ZSBzbG90IGNoZWNrCiAgICB7CiAgICAgIGZvciAodmFyIGtleSBpbiB2bS4kc2xvdHMpIHsKICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgICB2bS4kc2xvdHNba2V5XS5fcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChfcGFyZW50Vm5vZGUpIHsKICAgICAgdm0uJHNjb3BlZFNsb3RzID0gX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMgfHwgZW1wdHlPYmplY3Q7CiAgICB9CgogICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2VzcwogICAgLy8gdG8gdGhlIGRhdGEgb24gdGhlIHBsYWNlaG9sZGVyIG5vZGUuCiAgICB2bS4kdm5vZGUgPSBfcGFyZW50Vm5vZGU7CiAgICAvLyByZW5kZXIgc2VsZgogICAgdmFyIHZub2RlOwogICAgdHJ5IHsKICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXIiKTsKICAgICAgLy8gcmV0dXJuIGVycm9yIHJlbmRlciByZXN1bHQsCiAgICAgIC8vIG9yIHByZXZpb3VzIHZub2RlIHRvIHByZXZlbnQgcmVuZGVyIGVycm9yIGNhdXNpbmcgYmxhbmsgY29tcG9uZW50CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgICAgIHsKICAgICAgICBpZiAodm0uJG9wdGlvbnMucmVuZGVyRXJyb3IpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXJFcnJvciIpOwogICAgICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGUgPSB2bS5fdm5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0CiAgICBpZiAoISh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdNdWx0aXBsZSByb290IG5vZGVzIHJldHVybmVkIGZyb20gcmVuZGVyIGZ1bmN0aW9uLiBSZW5kZXIgZnVuY3Rpb24gJyArCiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICB2bm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICAgIH0KICAgIC8vIHNldCBwYXJlbnQKICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTsKICAgIHJldHVybiB2bm9kZQogIH07Cn0KCi8qICAqLwoKdmFyIHVpZCQzID0gMDsKCmZ1bmN0aW9uIGluaXRNaXhpbiAoVnVlKSB7CiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgLy8gYSB1aWQKICAgIHZtLl91aWQgPSB1aWQkMysrOwoKICAgIHZhciBzdGFydFRhZywgZW5kVGFnOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgIHN0YXJ0VGFnID0gInZ1ZS1wZXJmLXN0YXJ0OiIgKyAodm0uX3VpZCk7CiAgICAgIGVuZFRhZyA9ICJ2dWUtcGVyZi1lbmQ6IiArICh2bS5fdWlkKTsKICAgICAgbWFyayhzdGFydFRhZyk7CiAgICB9CgogICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWQKICAgIHZtLl9pc1Z1ZSA9IHRydWU7CiAgICAvLyBtZXJnZSBvcHRpb25zCiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkgewogICAgICAvLyBvcHRpbWl6ZSBpbnRlcm5hbCBjb21wb25lbnQgaW5zdGFudGlhdGlvbgogICAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlCiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LgogICAgICBpbml0SW50ZXJuYWxDb21wb25lbnQodm0sIG9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyh2bS5jb25zdHJ1Y3RvciksCiAgICAgICAgb3B0aW9ucyB8fCB7fSwKICAgICAgICB2bQogICAgICApOwogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIHsKICAgICAgaW5pdFByb3h5KHZtKTsKICAgIH0KICAgIC8vIGV4cG9zZSByZWFsIHNlbGYKICAgIHZtLl9zZWxmID0gdm07CiAgICBpbml0TGlmZWN5Y2xlKHZtKTsKICAgIGluaXRFdmVudHModm0pOwogICAgaW5pdFJlbmRlcih2bSk7CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZUNyZWF0ZScpOwogICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHMKICAgIGluaXRTdGF0ZSh2bSk7CiAgICBpbml0UHJvdmlkZSh2bSk7IC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzCiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHsKICAgICAgdm0uX25hbWUgPSBmb3JtYXRDb21wb25lbnROYW1lKHZtLCBmYWxzZSk7CiAgICAgIG1hcmsoZW5kVGFnKTsKICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHZtLl9uYW1lKSArICIgaW5pdCIpLCBzdGFydFRhZywgZW5kVGFnKTsKICAgIH0KCiAgICBpZiAodm0uJG9wdGlvbnMuZWwpIHsKICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBpbml0SW50ZXJuYWxDb21wb25lbnQgKHZtLCBvcHRpb25zKSB7CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7CiAgLy8gZG9pbmcgdGhpcyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZHluYW1pYyBlbnVtZXJhdGlvbi4KICB2YXIgcGFyZW50Vm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsKICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIG9wdHMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7CiAgb3B0cy5fcGFyZW50RWxtID0gb3B0aW9ucy5fcGFyZW50RWxtOwogIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTsKCiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgb3B0cy5wcm9wc0RhdGEgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhOwogIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7CiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47CiAgb3B0cy5fY29tcG9uZW50VGFnID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZzsKCiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7CiAgICBvcHRzLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyOwogICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuczsKICB9Cn0KCmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHsKICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9uczsKICBpZiAoQ3Rvci5zdXBlcikgewogICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7CiAgICB2YXIgY2FjaGVkU3VwZXJPcHRpb25zID0gQ3Rvci5zdXBlck9wdGlvbnM7CiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHsKICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsCiAgICAgIC8vIG5lZWQgdG8gcmVzb2x2ZSBuZXcgb3B0aW9ucy4KICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7CiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NikKICAgICAgdmFyIG1vZGlmaWVkT3B0aW9ucyA9IHJlc29sdmVNb2RpZmllZE9wdGlvbnMoQ3Rvcik7CiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zCiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHsKICAgICAgICBleHRlbmQoQ3Rvci5leHRlbmRPcHRpb25zLCBtb2RpZmllZE9wdGlvbnMpOwogICAgICB9CiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpOwogICAgICBpZiAob3B0aW9ucy5uYW1lKSB7CiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBvcHRpb25zCn0KCmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHsKICB2YXIgbW9kaWZpZWQ7CiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9uczsKICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7CiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9uczsKICBmb3IgKHZhciBrZXkgaW4gbGF0ZXN0KSB7CiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7CiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfQogICAgICBtb2RpZmllZFtrZXldID0gZGVkdXBlKGxhdGVzdFtrZXldLCBleHRlbmRlZFtrZXldLCBzZWFsZWRba2V5XSk7CiAgICB9CiAgfQogIHJldHVybiBtb2RpZmllZAp9CgpmdW5jdGlvbiBkZWR1cGUgKGxhdGVzdCwgZXh0ZW5kZWQsIHNlYWxlZCkgewogIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkCiAgLy8gYmV0d2VlbiBtZXJnZXMKICBpZiAoQXJyYXkuaXNBcnJheShsYXRlc3QpKSB7CiAgICB2YXIgcmVzID0gW107CiAgICBzZWFsZWQgPSBBcnJheS5pc0FycmF5KHNlYWxlZCkgPyBzZWFsZWQgOiBbc2VhbGVkXTsKICAgIGV4dGVuZGVkID0gQXJyYXkuaXNBcnJheShleHRlbmRlZCkgPyBleHRlbmRlZCA6IFtleHRlbmRlZF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykgewogICAgICAvLyBwdXNoIG9yaWdpbmFsIG9wdGlvbnMgYW5kIG5vdCBzZWFsZWQgb3B0aW9ucyB0byBleGNsdWRlIGR1cGxpY2F0ZWQgb3B0aW9ucwogICAgICBpZiAoZXh0ZW5kZWQuaW5kZXhPZihsYXRlc3RbaV0pID49IDAgfHwgc2VhbGVkLmluZGV4T2YobGF0ZXN0W2ldKSA8IDApIHsKICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfSBlbHNlIHsKICAgIHJldHVybiBsYXRlc3QKICB9Cn0KCmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSkKICApIHsKICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTsKICB9CiAgdGhpcy5faW5pdChvcHRpb25zKTsKfQoKaW5pdE1peGluKFZ1ZSk7CnN0YXRlTWl4aW4oVnVlKTsKZXZlbnRzTWl4aW4oVnVlKTsKbGlmZWN5Y2xlTWl4aW4oVnVlKTsKcmVuZGVyTWl4aW4oVnVlKTsKCi8qICAqLwoKZnVuY3Rpb24gaW5pdFVzZSAoVnVlKSB7CiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHsKICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpOwogICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID4gLTEpIHsKICAgICAgcmV0dXJuIHRoaXMKICAgIH0KCiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgYXJncy51bnNoaWZ0KHRoaXMpOwogICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTsKICAgIH0KICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChwbHVnaW4pOwogICAgcmV0dXJuIHRoaXMKICB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHsKICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHsKICAgIHRoaXMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG1peGluKTsKICAgIHJldHVybiB0aGlzCiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHsKICAvKioKICAgKiBFYWNoIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgVnVlLCBoYXMgYSB1bmlxdWUKICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCAiY2hpbGQKICAgKiBjb25zdHJ1Y3RvcnMiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLgogICAqLwogIFZ1ZS5jaWQgPSAwOwogIHZhciBjaWQgPSAxOwoKICAvKioKICAgKiBDbGFzcyBpbmhlcml0YW5jZQogICAqLwogIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbiAoZXh0ZW5kT3B0aW9ucykgewogICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307CiAgICB2YXIgU3VwZXIgPSB0aGlzOwogICAgdmFyIFN1cGVySWQgPSBTdXBlci5jaWQ7CiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pOwogICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7CiAgICAgIHJldHVybiBjYWNoZWRDdG9yc1tTdXBlcklkXQogICAgfQoKICAgIHZhciBuYW1lID0gZXh0ZW5kT3B0aW9ucy5uYW1lIHx8IFN1cGVyLm9wdGlvbnMubmFtZTsKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkgewogICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSk7CiAgICB9CgogICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFZ1ZUNvbXBvbmVudCAob3B0aW9ucykgewogICAgICB0aGlzLl9pbml0KG9wdGlvbnMpOwogICAgfTsKICAgIFN1Yi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSk7CiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViOwogICAgU3ViLmNpZCA9IGNpZCsrOwogICAgU3ViLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgIFN1cGVyLm9wdGlvbnMsCiAgICAgIGV4dGVuZE9wdGlvbnMKICAgICk7CiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjsKCiAgICAvLyBGb3IgcHJvcHMgYW5kIGNvbXB1dGVkIHByb3BlcnRpZXMsIHdlIGRlZmluZSB0aGUgcHJveHkgZ2V0dGVycyBvbgogICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXMKICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC4KICAgIGlmIChTdWIub3B0aW9ucy5wcm9wcykgewogICAgICBpbml0UHJvcHMkMShTdWIpOwogICAgfQogICAgaWYgKFN1Yi5vcHRpb25zLmNvbXB1dGVkKSB7CiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7CiAgICB9CgogICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlCiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kOwogICAgU3ViLm1peGluID0gU3VwZXIubWl4aW47CiAgICBTdWIudXNlID0gU3VwZXIudXNlOwoKICAgIC8vIGNyZWF0ZSBhc3NldCByZWdpc3RlcnMsIHNvIGV4dGVuZGVkIGNsYXNzZXMKICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby4KICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgU3ViW3R5cGVdID0gU3VwZXJbdHlwZV07CiAgICB9KTsKICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXAKICAgIGlmIChuYW1lKSB7CiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7CiAgICB9CgogICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS4KICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlCiAgICAvLyBiZWVuIHVwZGF0ZWQuCiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9uczsKICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9uczsKICAgIFN1Yi5zZWFsZWRPcHRpb25zID0gZXh0ZW5kKHt9LCBTdWIub3B0aW9ucyk7CgogICAgLy8gY2FjaGUgY29uc3RydWN0b3IKICAgIGNhY2hlZEN0b3JzW1N1cGVySWRdID0gU3ViOwogICAgcmV0dXJuIFN1YgogIH07Cn0KCmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7CiAgdmFyIHByb3BzID0gQ29tcC5vcHRpb25zLnByb3BzOwogIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgcHJveHkoQ29tcC5wcm90b3R5cGUsICJfcHJvcHMiLCBrZXkpOwogIH0KfQoKZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHsKICB2YXIgY29tcHV0ZWQgPSBDb21wLm9wdGlvbnMuY29tcHV0ZWQ7CiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7CiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHsKICAvKioKICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuCiAgICovCiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKAogICAgICBpZCwKICAgICAgZGVmaW5pdGlvbgogICAgKSB7CiAgICAgIGlmICghZGVmaW5pdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50JykgewogICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHsKICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDsKICAgICAgICAgIGRlZmluaXRpb24gPSB0aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKGRlZmluaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGRlZmluaXRpb24gPSB7IGJpbmQ6IGRlZmluaXRpb24sIHVwZGF0ZTogZGVmaW5pdGlvbiB9OwogICAgICAgIH0KICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjsKICAgICAgICByZXR1cm4gZGVmaW5pdGlvbgogICAgICB9CiAgICB9OwogIH0pOwp9CgovKiAgKi8KCmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHsKICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZykKfQoKZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkgewogIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgcmV0dXJuIGZhbHNlCn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHsKICB2YXIgY2FjaGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5jYWNoZTsKICB2YXIga2V5cyA9IGtlZXBBbGl2ZUluc3RhbmNlLmtleXM7CiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTsKICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpIHsKICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTsKICAgIGlmIChjYWNoZWROb2RlKSB7CiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjYWNoZWROb2RlLmNvbXBvbmVudE9wdGlvbnMpOwogICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7CiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoCiAgY2FjaGUsCiAga2V5LAogIGtleXMsCiAgY3VycmVudAopIHsKICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTsKICBpZiAoY2FjaGVkJCQxICYmICghY3VycmVudCB8fCBjYWNoZWQkJDEudGFnICE9PSBjdXJyZW50LnRhZykpIHsKICAgIGNhY2hlZCQkMS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpOwogIH0KICBjYWNoZVtrZXldID0gbnVsbDsKICByZW1vdmUoa2V5cywga2V5KTsKfQoKdmFyIHBhdHRlcm5UeXBlcyA9IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldOwoKdmFyIEtlZXBBbGl2ZSA9IHsKICBuYW1lOiAna2VlcC1hbGl2ZScsCiAgYWJzdHJhY3Q6IHRydWUsCgogIHByb3BzOiB7CiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl0KICB9LAoKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHsKICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5rZXlzID0gW107CiAgfSwKCiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQgKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgZm9yICh2YXIga2V5IGluIHRoaXMkMS5jYWNoZSkgewogICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlLCBrZXksIHRoaXMkMS5rZXlzKTsKICAgIH0KICB9LAoKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7CiAgICB9KTsKICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICFtYXRjaGVzKHZhbCwgbmFtZSk7IH0pOwogICAgfSk7CiAgfSwKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkgewogICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0OwogICAgdmFyIHZub2RlID0gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChzbG90KTsKICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9uczsKICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7CiAgICAgIC8vIGNoZWNrIHBhdHRlcm4KICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpOwogICAgICB2YXIgcmVmID0gdGhpczsKICAgICAgdmFyIGluY2x1ZGUgPSByZWYuaW5jbHVkZTsKICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTsKICAgICAgaWYgKAogICAgICAgIC8vIG5vdCBpbmNsdWRlZAogICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8CiAgICAgICAgLy8gZXhjbHVkZWQKICAgICAgICAoZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpCiAgICAgICkgewogICAgICAgIHJldHVybiB2bm9kZQogICAgICB9CgogICAgICB2YXIgcmVmJDEgPSB0aGlzOwogICAgICB2YXIgY2FjaGUgPSByZWYkMS5jYWNoZTsKICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGwKICAgICAgICAvLyBzYW1lIGNvbnN0cnVjdG9yIG1heSBnZXQgcmVnaXN0ZXJlZCBhcyBkaWZmZXJlbnQgbG9jYWwgY29tcG9uZW50cwogICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSkKICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoIjo6IiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpCiAgICAgICAgOiB2bm9kZS5rZXk7CiAgICAgIGlmIChjYWNoZVtrZXldKSB7CiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlOwogICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3QKICAgICAgICByZW1vdmUoa2V5cywga2V5KTsKICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYWNoZVtrZXldID0gdm5vZGU7CiAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5CiAgICAgICAgaWYgKHRoaXMubWF4ICYmIGtleXMubGVuZ3RoID4gcGFyc2VJbnQodGhpcy5tYXgpKSB7CiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKQogIH0KfQoKdmFyIGJ1aWx0SW5Db21wb25lbnRzID0gewogIEtlZXBBbGl2ZTogS2VlcEFsaXZlCn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7CiAgLy8gY29uZmlnCiAgdmFyIGNvbmZpZ0RlZiA9IHt9OwogIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07CiAgewogICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgd2FybigKICAgICAgICAnRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4nCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTsKCiAgLy8gZXhwb3NlZCB1dGlsIG1ldGhvZHMuCiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uCiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay4KICBWdWUudXRpbCA9IHsKICAgIHdhcm46IHdhcm4sCiAgICBleHRlbmQ6IGV4dGVuZCwKICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLAogICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlCiAgfTsKCiAgVnVlLnNldCA9IHNldDsKICBWdWUuZGVsZXRlID0gZGVsOwogIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrOwoKICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0pOwoKICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlICJiYXNlIiBjb25zdHJ1Y3RvciB0byBleHRlbmQgYWxsIHBsYWluLW9iamVjdAogIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLgogIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlOwoKICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpOwoKICBpbml0VXNlKFZ1ZSk7CiAgaW5pdE1peGluJDEoVnVlKTsKICBpbml0RXh0ZW5kKFZ1ZSk7CiAgaW5pdEFzc2V0UmVnaXN0ZXJzKFZ1ZSk7Cn0KCmluaXRHbG9iYWxBUEkoVnVlKTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywgewogIGdldDogaXNTZXJ2ZXJSZW5kZXJpbmcKfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRzc3JDb250ZXh0JywgewogIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICByZXR1cm4gdGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dAogIH0KfSk7CgovLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb24KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0JywgewogIHZhbHVlOiBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dAp9KTsKClZ1ZS52ZXJzaW9uID0gJzIuNS4xNyc7CgovKiAgKi8KCi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheQovLyBkdXJpbmcgdGVtcGxhdGUgY29tcGlsYXRpb24KdmFyIGlzUmVzZXJ2ZWRBdHRyID0gbWFrZU1hcCgnc3R5bGUsY2xhc3MnKTsKCi8vIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgdXNpbmcgcHJvcHMgZm9yIGJpbmRpbmcKdmFyIGFjY2VwdFZhbHVlID0gbWFrZU1hcCgnaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcycpOwp2YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7CiAgcmV0dXJuICgKICAgIChhdHRyID09PSAndmFsdWUnICYmIGFjY2VwdFZhbHVlKHRhZykpICYmIHR5cGUgIT09ICdidXR0b24nIHx8CiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fAogICAgKGF0dHIgPT09ICdjaGVja2VkJyAmJiB0YWcgPT09ICdpbnB1dCcpIHx8CiAgICAoYXR0ciA9PT0gJ211dGVkJyAmJiB0YWcgPT09ICd2aWRlbycpCiAgKQp9OwoKdmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTsKCnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcCgKICAnYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSwnICsKICAnZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLCcgKwogICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgKwogICdtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LCcgKwogICdyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLCcgKwogICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJwopOwoKdmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7Cgp2YXIgaXNYbGluayA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJwp9OwoKdmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIGlzWGxpbmsobmFtZSkgPyBuYW1lLnNsaWNlKDYsIG5hbWUubGVuZ3RoKSA6ICcnCn07Cgp2YXIgaXNGYWxzeUF0dHJWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsKICByZXR1cm4gdmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZQp9OwoKLyogICovCgpmdW5jdGlvbiBnZW5DbGFzc0ZvclZub2RlICh2bm9kZSkgewogIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlOwogIHZhciBjaGlsZE5vZGUgPSB2bm9kZTsKICB3aGlsZSAoaXNEZWYoY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlKSkgewogICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEpIHsKICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGNoaWxkTm9kZS5kYXRhLCBkYXRhKTsKICAgIH0KICB9CiAgd2hpbGUgKGlzRGVmKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHsKICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkgewogICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoZGF0YSwgcGFyZW50Tm9kZS5kYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlbmRlckNsYXNzKGRhdGEuc3RhdGljQ2xhc3MsIGRhdGEuY2xhc3MpCn0KCmZ1bmN0aW9uIG1lcmdlQ2xhc3NEYXRhIChjaGlsZCwgcGFyZW50KSB7CiAgcmV0dXJuIHsKICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksCiAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpCiAgICAgID8gW2NoaWxkLmNsYXNzLCBwYXJlbnQuY2xhc3NdCiAgICAgIDogcGFyZW50LmNsYXNzCiAgfQp9CgpmdW5jdGlvbiByZW5kZXJDbGFzcyAoCiAgc3RhdGljQ2xhc3MsCiAgZHluYW1pY0NsYXNzCikgewogIGlmIChpc0RlZihzdGF0aWNDbGFzcykgfHwgaXNEZWYoZHluYW1pY0NsYXNzKSkgewogICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSkKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7CiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJykKfQoKZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpCiAgfQogIGlmIChpc09iamVjdCh2YWx1ZSkpIHsKICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpCiAgfQogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICByZXR1cm4gdmFsdWUKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIHZhciBzdHJpbmdpZmllZDsKICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgaWYgKHZhbHVlW2tleV0pIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBrZXk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgbmFtZXNwYWNlTWFwID0gewogIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywKICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcKfTsKCnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKAogICdodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSwnICsKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLCcgKwogICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICsKICAnYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LCcgKwogICdzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbywnICsKICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArCiAgJ2NhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLCcgKwogICdidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLCcgKwogICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgKwogICdkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksJyArCiAgJ2NvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QnCik7CgovLyB0aGlzIG1hcCBpcyBpbnRlbnRpb25hbGx5IHNlbGVjdGl2ZSwgb25seSBjb3ZlcmluZyBTVkcgZWxlbWVudHMgdGhhdCBtYXkKLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy4KdmFyIGlzU1ZHID0gbWFrZU1hcCgKICAnc3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLCcgKwogICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICsKICAncG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldycsCiAgdHJ1ZQopOwoKdmFyIGlzUHJlVGFnID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gdGFnID09PSAncHJlJzsgfTsKCnZhciBpc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKHRhZykgewogIHJldHVybiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWRyh0YWcpCn07CgpmdW5jdGlvbiBnZXRUYWdOYW1lc3BhY2UgKHRhZykgewogIGlmIChpc1NWRyh0YWcpKSB7CiAgICByZXR1cm4gJ3N2ZycKICB9CiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MCiAgLy8gbm90ZSBpdCBkb2Vzbid0IHN1cHBvcnQgb3RoZXIgTWF0aE1MIGVsZW1lbnRzIGJlaW5nIGNvbXBvbmVudCByb290cwogIGlmICh0YWcgPT09ICdtYXRoJykgewogICAgcmV0dXJuICdtYXRoJwogIH0KfQoKdmFyIHVua25vd25FbGVtZW50Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpmdW5jdGlvbiBpc1Vua25vd25FbGVtZW50ICh0YWcpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWluQnJvd3NlcikgewogICAgcmV0dXJuIHRydWUKICB9CiAgaWYgKGlzUmVzZXJ2ZWRUYWcodGFnKSkgewogICAgcmV0dXJuIGZhbHNlCiAgfQogIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkgewogICAgcmV0dXJuIHVua25vd25FbGVtZW50Q2FjaGVbdGFnXQogIH0KICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgaWYgKHRhZy5pbmRleE9mKCctJykgPiAtMSkgewogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjgyMTAzNjQvMTA3MDI0NAogICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoCiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTFVua25vd25FbGVtZW50IHx8CiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTEVsZW1lbnQKICAgICkpCiAgfSBlbHNlIHsKICAgIHJldHVybiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddID0gL0hUTUxVbmtub3duRWxlbWVudC8udGVzdChlbC50b1N0cmluZygpKSkKICB9Cn0KCnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpOwoKLyogICovCgovKioKICogUXVlcnkgYW4gZWxlbWVudCBzZWxlY3RvciBpZiBpdCdzIG5vdCBhbiBlbGVtZW50IGFscmVhZHkuCiAqLwpmdW5jdGlvbiBxdWVyeSAoZWwpIHsKICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgewogICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7CiAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdDYW5ub3QgZmluZCBlbGVtZW50OiAnICsgZWwKICAgICAgKTsKICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpCiAgICB9CiAgICByZXR1cm4gc2VsZWN0ZWQKICB9IGVsc2UgewogICAgcmV0dXJuIGVsCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQkMSAodGFnTmFtZSwgdm5vZGUpIHsKICB2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHsKICAgIHJldHVybiBlbG0KICB9CiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3QKICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMubXVsdGlwbGUgIT09IHVuZGVmaW5lZCkgewogICAgZWxtLnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnbXVsdGlwbGUnKTsKICB9CiAgcmV0dXJuIGVsbQp9CgpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkgewogIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlTWFwW25hbWVzcGFjZV0sIHRhZ05hbWUpCn0KCmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlICh0ZXh0KSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHsKICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KQp9CgpmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHsKICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTsKfQoKZnVuY3Rpb24gcmVtb3ZlQ2hpbGQgKG5vZGUsIGNoaWxkKSB7CiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Cn0KCmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkgewogIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwp9CgpmdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7CiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZQp9CgpmdW5jdGlvbiBuZXh0U2libGluZyAobm9kZSkgewogIHJldHVybiBub2RlLm5leHRTaWJsaW5nCn0KCmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHsKICByZXR1cm4gbm9kZS50YWdOYW1lCn0KCmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7CiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7Cn0KCmZ1bmN0aW9uIHNldFN0eWxlU2NvcGUgKG5vZGUsIHNjb3BlSWQpIHsKICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7Cn0KCgp2YXIgbm9kZU9wcyA9IE9iamVjdC5mcmVlemUoewoJY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCQxLAoJY3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsCgljcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsCgljcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LAoJaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsCglyZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsCglhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsCglwYXJlbnROb2RlOiBwYXJlbnROb2RlLAoJbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLAoJdGFnTmFtZTogdGFnTmFtZSwKCXNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCwKCXNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGUKfSk7CgovKiAgKi8KCnZhciByZWYgPSB7CiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7CiAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgICBpZiAob2xkVm5vZGUuZGF0YS5yZWYgIT09IHZub2RlLmRhdGEucmVmKSB7CiAgICAgIHJlZ2lzdGVyUmVmKG9sZFZub2RlLCB0cnVlKTsKICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpOwogICAgfQogIH0sCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHJlZ2lzdGVyUmVmKHZub2RlLCB0cnVlKTsKICB9Cn0KCmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7CiAgdmFyIGtleSA9IHZub2RlLmRhdGEucmVmOwogIGlmICghaXNEZWYoa2V5KSkgeyByZXR1cm4gfQoKICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0OwogIHZhciByZWYgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5lbG07CiAgdmFyIHJlZnMgPSB2bS4kcmVmczsKICBpZiAoaXNSZW1vdmFsKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7CiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7CiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7CiAgICAgIHJlZnNba2V5XSA9IHVuZGVmaW5lZDsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHZub2RlLmRhdGEucmVmSW5Gb3IpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsKICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsKICAgICAgfSBlbHNlIGlmIChyZWZzW2tleV0uaW5kZXhPZihyZWYpIDwgMCkgewogICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlZnNba2V5XSA9IHJlZjsKICAgIH0KICB9Cn0KCi8qKgogKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnkKICogU2ltb24gRnJpaXMgVmluZHVtIChAcGFsZGVwaW5kKQogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UKICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFCiAqCiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKQogKgogKiBOb3QgdHlwZS1jaGVja2luZyB0aGlzIGJlY2F1c2UgdGhpcyBmaWxlIGlzIHBlcmYtY3JpdGljYWwgYW5kIHRoZSBjb3N0CiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LgogKi8KCnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7Cgp2YXIgaG9va3MgPSBbJ2NyZWF0ZScsICdhY3RpdmF0ZScsICd1cGRhdGUnLCAncmVtb3ZlJywgJ2Rlc3Ryb3knXTsKCmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikgewogIHJldHVybiAoCiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKAogICAgICAoCiAgICAgICAgYS50YWcgPT09IGIudGFnICYmCiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmCiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJgogICAgICAgIHNhbWVJbnB1dFR5cGUoYSwgYikKICAgICAgKSB8fCAoCiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJgogICAgICAgIGEuYXN5bmNGYWN0b3J5ID09PSBiLmFzeW5jRmFjdG9yeSAmJgogICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpCiAgICAgICkKICAgICkKICApCn0KCmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHsKICBpZiAoYS50YWcgIT09ICdpbnB1dCcpIHsgcmV0dXJuIHRydWUgfQogIHZhciBpOwogIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7CiAgdmFyIHR5cGVCID0gaXNEZWYoaSA9IGIuZGF0YSkgJiYgaXNEZWYoaSA9IGkuYXR0cnMpICYmIGkudHlwZTsKICByZXR1cm4gdHlwZUEgPT09IHR5cGVCIHx8IGlzVGV4dElucHV0VHlwZSh0eXBlQSkgJiYgaXNUZXh0SW5wdXRUeXBlKHR5cGVCKQp9CgpmdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeCAoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHsKICB2YXIgaSwga2V5OwogIHZhciBtYXAgPSB7fTsKICBmb3IgKGkgPSBiZWdpbklkeDsgaSA8PSBlbmRJZHg7ICsraSkgewogICAga2V5ID0gY2hpbGRyZW5baV0ua2V5OwogICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9CiAgfQogIHJldHVybiBtYXAKfQoKZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkgewogIHZhciBpLCBqOwogIHZhciBjYnMgPSB7fTsKCiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7CiAgdmFyIG5vZGVPcHMgPSBiYWNrZW5kLm5vZGVPcHM7CgogIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkgewogICAgY2JzW2hvb2tzW2ldXSA9IFtdOwogICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHsKICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkgewogICAgICAgIGNic1tob29rc1tpXV0ucHVzaChtb2R1bGVzW2pdW2hvb2tzW2ldXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHsKICAgIHJldHVybiBuZXcgVk5vZGUobm9kZU9wcy50YWdOYW1lKGVsbSkudG9Mb3dlckNhc2UoKSwge30sIFtdLCB1bmRlZmluZWQsIGVsbSkKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZVJtQ2IgKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHsKICAgIGZ1bmN0aW9uIHJlbW92ZSAoKSB7CiAgICAgIGlmICgtLXJlbW92ZS5saXN0ZW5lcnMgPT09IDApIHsKICAgICAgICByZW1vdmVOb2RlKGNoaWxkRWxtKTsKICAgICAgfQogICAgfQogICAgcmVtb3ZlLmxpc3RlbmVycyA9IGxpc3RlbmVyczsKICAgIHJldHVybiByZW1vdmUKICB9CgogIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7CiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTsKICAgIC8vIGVsZW1lbnQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZHVlIHRvIHYtaHRtbCAvIHYtdGV4dAogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQkJDEgKHZub2RlLCBpblZQcmUpIHsKICAgIHJldHVybiAoCiAgICAgICFpblZQcmUgJiYKICAgICAgIXZub2RlLm5zICYmCiAgICAgICEoCiAgICAgICAgY29uZmlnLmlnbm9yZWRFbGVtZW50cy5sZW5ndGggJiYKICAgICAgICBjb25maWcuaWdub3JlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGlnbm9yZSkgewogICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSkKICAgICAgICAgICAgPyBpZ25vcmUudGVzdCh2bm9kZS50YWcpCiAgICAgICAgICAgIDogaWdub3JlID09PSB2bm9kZS50YWcKICAgICAgICB9KQogICAgICApICYmCiAgICAgIGNvbmZpZy5pc1Vua25vd25FbGVtZW50KHZub2RlLnRhZykKICAgICkKICB9CgogIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7CgogIGZ1bmN0aW9uIGNyZWF0ZUVsbSAoCiAgICB2bm9kZSwKICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgIHBhcmVudEVsbSwKICAgIHJlZkVsbSwKICAgIG5lc3RlZCwKICAgIG93bmVyQXJyYXksCiAgICBpbmRleAogICkgewogICAgaWYgKGlzRGVmKHZub2RlLmVsbSkgJiYgaXNEZWYob3duZXJBcnJheSkpIHsKICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciEKICAgICAgLy8gbm93IGl0J3MgdXNlZCBhcyBhIG5ldyBub2RlLCBvdmVyd3JpdGluZyBpdHMgZWxtIHdvdWxkIGNhdXNlCiAgICAgIC8vIHBvdGVudGlhbCBwYXRjaCBlcnJvcnMgZG93biB0aGUgcm9hZCB3aGVuIGl0J3MgdXNlZCBhcyBhbiBpbnNlcnRpb24KICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmcKICAgICAgLy8gYXNzb2NpYXRlZCBET00gZWxlbWVudCBmb3IgaXQuCiAgICAgIHZub2RlID0gb3duZXJBcnJheVtpbmRleF0gPSBjbG9uZVZOb2RlKHZub2RlKTsKICAgIH0KCiAgICB2bm9kZS5pc1Jvb3RJbnNlcnQgPSAhbmVzdGVkOyAvLyBmb3IgdHJhbnNpdGlvbiBlbnRlciBjaGVjawogICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47CiAgICB2YXIgdGFnID0gdm5vZGUudGFnOwogICAgaWYgKGlzRGVmKHRhZykpIHsKICAgICAgewogICAgICAgIGlmIChkYXRhICYmIGRhdGEucHJlKSB7CiAgICAgICAgICBjcmVhdGluZ0VsbUluVlByZSsrOwogICAgICAgIH0KICAgICAgICBpZiAoaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgY3JlYXRpbmdFbG1JblZQcmUpKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArCiAgICAgICAgICAgICdyZWdpc3RlciB0aGUgY29tcG9uZW50IGNvcnJlY3RseT8gRm9yIHJlY3Vyc2l2ZSBjb21wb25lbnRzLCAnICsKICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSAibmFtZSIgb3B0aW9uLicsCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2bm9kZS5lbG0gPSB2bm9kZS5ucwogICAgICAgID8gbm9kZU9wcy5jcmVhdGVFbGVtZW50TlModm5vZGUubnMsIHRhZykKICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTsKICAgICAgc2V0U2NvcGUodm5vZGUpOwoKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIHsKICAgICAgICBjcmVhdGVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9CiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgICB9CgogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRhdGEgJiYgZGF0YS5wcmUpIHsKICAgICAgICBjcmVhdGluZ0VsbUluVlByZS0tOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpKSB7CiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlQ29tbWVudCh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfSBlbHNlIHsKICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgdmFyIGkgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIHZhciBpc1JlYWN0aXZhdGVkID0gaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpICYmIGkua2VlcEFsaXZlOwogICAgICBpZiAoaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsKICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8sIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgICAgfQogICAgICAvLyBhZnRlciBjYWxsaW5nIHRoZSBpbml0IGhvb2ssIGlmIHRoZSB2bm9kZSBpcyBhIGNoaWxkIGNvbXBvbmVudAogICAgICAvLyBpdCBzaG91bGQndmUgY3JlYXRlZCBhIGNoaWxkIGluc3RhbmNlIGFuZCBtb3VudGVkIGl0LiB0aGUgY2hpbGQKICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uCiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGVsZW1lbnQgYW5kIGJlIGRvbmUuCiAgICAgIGlmIChpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHsKICAgICAgICAgIHJlYWN0aXZhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0Q29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkgewogICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaC5hcHBseShpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCk7CiAgICAgIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCA9IG51bGw7CiAgICB9CiAgICB2bm9kZS5lbG0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS4kZWw7CiAgICBpZiAoaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICBzZXRTY29wZSh2bm9kZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC4KICAgICAgLy8gc2tpcCBhbGwgZWxlbWVudC1yZWxhdGVkIG1vZHVsZXMgZXhjZXB0IGZvciByZWYgKCMzNDU1KQogICAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rCiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKHZub2RlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlYWN0aXZhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7CiAgICB2YXIgaTsKICAgIC8vIGhhY2sgZm9yICM0MzM5OiBhIHJlYWN0aXZhdGVkIGNvbXBvbmVudCB3aXRoIGlubmVyIHRyYW5zaXRpb24KICAgIC8vIGRvZXMgbm90IHRyaWdnZXIgYmVjYXVzZSB0aGUgaW5uZXIgbm9kZSdzIGNyZWF0ZWQgaG9va3MgYXJlIG5vdCBjYWxsZWQKICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dAogICAgLy8gdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyBpdC4KICAgIHZhciBpbm5lck5vZGUgPSB2bm9kZTsKICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgaW5uZXJOb2RlID0gaW5uZXJOb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgICAgaWYgKGlzRGVmKGkgPSBpbm5lck5vZGUuZGF0YSkgJiYgaXNEZWYoaSA9IGkudHJhbnNpdGlvbikpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBjYnMuYWN0aXZhdGVbaV0oZW1wdHlOb2RlLCBpbm5lck5vZGUpOwogICAgICAgIH0KICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICAgIC8vIHVubGlrZSBhIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50LAogICAgLy8gYSByZWFjdGl2YXRlZCBrZWVwLWFsaXZlIGNvbXBvbmVudCBkb2Vzbid0IGluc2VydCBpdHNlbGYKICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkgewogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgaWYgKGlzRGVmKHJlZiQkMSkpIHsKICAgICAgICBpZiAocmVmJCQxLnBhcmVudE5vZGUgPT09IHBhcmVudCkgewogICAgICAgICAgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50LCBlbG0sIHJlZiQkMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQocGFyZW50LCBlbG0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgICB7CiAgICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKGNoaWxkcmVuKTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSwgY2hpbGRyZW4sIGkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7CiAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQodm5vZGUuZWxtLCBub2RlT3BzLmNyZWF0ZVRleHROb2RlKFN0cmluZyh2bm9kZS50ZXh0KSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNQYXRjaGFibGUgKHZub2RlKSB7CiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7CiAgICB9CiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKQogIH0KCiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICBjYnMuY3JlYXRlW2kkMV0oZW1wdHlOb2RlLCB2bm9kZSk7CiAgICB9CiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZQogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH0KICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH0KICAgIH0KICB9CgogIC8vIHNldCBzY29wZSBpZCBhdHRyaWJ1dGUgZm9yIHNjb3BlZCBDU1MuCiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuCiAgZnVuY3Rpb24gc2V0U2NvcGUgKHZub2RlKSB7CiAgICB2YXIgaTsKICAgIGlmIChpc0RlZihpID0gdm5vZGUuZm5TY29wZUlkKSkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlOwogICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkgewogICAgICAgICAgbm9kZU9wcy5zZXRTdHlsZVNjb3BlKHZub2RlLmVsbSwgaSk7CiAgICAgICAgfQogICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50OwogICAgICB9CiAgICB9CiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuCiAgICBpZiAoaXNEZWYoaSA9IGFjdGl2ZUluc3RhbmNlKSAmJgogICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmCiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJgogICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkKICAgICkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7CiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnZva2VEZXN0cm95SG9vayAodm5vZGUpIHsKICAgIHZhciBpLCBqOwogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9CiAgICB9CiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkgewogICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHsKICAgICAgICBpbnZva2VEZXN0cm95SG9vayh2bm9kZS5jaGlsZHJlbltqXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHsKICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHsKICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTsKICAgICAgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihjaC50YWcpKSB7CiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTsKICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTsKICAgICAgICB9IGVsc2UgeyAvLyBUZXh0IG5vZGUKICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkgewogICAgaWYgKGlzRGVmKHJtKSB8fCBpc0RlZih2bm9kZS5kYXRhKSkgewogICAgICB2YXIgaTsKICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTsKICAgICAgaWYgKGlzRGVmKHJtKSkgewogICAgICAgIC8vIHdlIGhhdmUgYSByZWN1cnNpdmVseSBwYXNzZWQgZG93biBybSBjYWxsYmFjawogICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnQKICAgICAgICBybS5saXN0ZW5lcnMgKz0gbGlzdGVuZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nCiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTsKICAgICAgfQogICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpc0RlZihpID0gaS5fdm5vZGUpICYmIGlzRGVmKGkuZGF0YSkpIHsKICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGksIHJtKTsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkgewogICAgICAgIGNicy5yZW1vdmVbaV0odm5vZGUsIHJtKTsKICAgICAgfQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkgewogICAgICAgIGkodm5vZGUsIHJtKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBybSgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZW1vdmVOb2RlKHZub2RlLmVsbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbiAocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDsKICAgIHZhciBuZXdTdGFydElkeCA9IDA7CiAgICB2YXIgb2xkRW5kSWR4ID0gb2xkQ2gubGVuZ3RoIC0gMTsKICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07CiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdOwogICAgdmFyIG5ld0VuZElkeCA9IG5ld0NoLmxlbmd0aCAtIDE7CiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdOwogICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTsKICAgIHZhciBvbGRLZXlUb0lkeCwgaWR4SW5PbGQsIHZub2RlVG9Nb3ZlLCByZWZFbG07CgogICAgLy8gcmVtb3ZlT25seSBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgYnkgPHRyYW5zaXRpb24tZ3JvdXA+CiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zCiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9ucwogICAgdmFyIGNhbk1vdmUgPSAhcmVtb3ZlT25seTsKCiAgICB7CiAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhuZXdDaCk7CiAgICB9CgogICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHsKICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnQKICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkgewogICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07CiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7CiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07CiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07CiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCByaWdodAogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpOwogICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsKICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTsKICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnQKICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBvbGRFbmRWbm9kZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsKICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9CiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSkKICAgICAgICAgID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldCiAgICAgICAgICA6IGZpbmRJZHhJbk9sZChuZXdTdGFydFZub2RlLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7CiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50CiAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBmYWxzZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07CiAgICAgICAgICBpZiAoc2FtZVZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgICAgICBwYXRjaFZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCB2bm9kZVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnQKICAgICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsKICAgICAgfQogICAgfQogICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7CiAgICAgIHJlZkVsbSA9IGlzVW5kZWYobmV3Q2hbbmV3RW5kSWR4ICsgMV0pID8gbnVsbCA6IG5ld0NoW25ld0VuZElkeCArIDFdLmVsbTsKICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHsKICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgb2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVLZXlzIChjaGlsZHJlbikgewogICAgdmFyIHNlZW5LZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB2bm9kZSA9IGNoaWxkcmVuW2ldOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5OwogICAgICBpZiAoaXNEZWYoa2V5KSkgewogICAgICAgIGlmIChzZWVuS2V5c1trZXldKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAoIkR1cGxpY2F0ZSBrZXlzIGRldGVjdGVkOiAnIiArIGtleSArICInLiBUaGlzIG1heSBjYXVzZSBhbiB1cGRhdGUgZXJyb3IuIiksCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZW5LZXlzW2tleV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZElkeEluT2xkIChub2RlLCBvbGRDaCwgc3RhcnQsIGVuZCkgewogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGMgPSBvbGRDaFtpXTsKICAgICAgaWYgKGlzRGVmKGMpICYmIHNhbWVWbm9kZShub2RlLCBjKSkgeyByZXR1cm4gaSB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgaWYgKG9sZFZub2RlID09PSB2bm9kZSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtOwoKICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkgewogICAgICBpZiAoaXNEZWYodm5vZGUuYXN5bmNGYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgIGh5ZHJhdGUob2xkVm5vZGUuZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybgogICAgfQoKICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy4KICAgIC8vIG5vdGUgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgLQogICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuCiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc1N0YXRpYykgJiYKICAgICAgaXNUcnVlKG9sZFZub2RlLmlzU3RhdGljKSAmJgogICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJgogICAgICAoaXNUcnVlKHZub2RlLmlzQ2xvbmVkKSB8fCBpc1RydWUodm5vZGUuaXNPbmNlKSkKICAgICkgewogICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgaTsKICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHsKICAgICAgaShvbGRWbm9kZSwgdm5vZGUpOwogICAgfQoKICAgIHZhciBvbGRDaCA9IG9sZFZub2RlLmNoaWxkcmVuOwogICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47CiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKSB7IGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTsgfQogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICAgIGlmIChpc1VuZGVmKHZub2RlLnRleHQpKSB7CiAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7CiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfQogICAgICB9IGVsc2UgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9CiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkQ2gpKSB7CiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpOwogICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7CiAgICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sICcnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7CiAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCB2bm9kZS50ZXh0KTsKICAgIH0KICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucG9zdHBhdGNoKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkgewogICAgLy8gZGVsYXkgaW5zZXJ0IGhvb2tzIGZvciBjb21wb25lbnQgcm9vdCBub2RlcywgaW52b2tlIHRoZW0gYWZ0ZXIgdGhlCiAgICAvLyBlbGVtZW50IGlzIHJlYWxseSBpbnNlcnRlZAogICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7CiAgICAgIHZub2RlLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQgPSBxdWV1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHsKICAgICAgICBxdWV1ZVtpXS5kYXRhLmhvb2suaW5zZXJ0KHF1ZXVlW2ldKTsKICAgICAgfQogICAgfQogIH0KCiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlOwogIC8vIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBza2lwIGNyZWF0ZSBob29rIGR1cmluZyBoeWRyYXRpb24gYmVjYXVzZSB0aGV5CiAgLy8gYXJlIGFscmVhZHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCBvciBoYXMgbm8gbmVlZCBmb3IgaW5pdGlhbGl6YXRpb24KICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmUKICAvLyBkZWVwIHVwZGF0ZXMgKCM3MDYzKS4KICB2YXIgaXNSZW5kZXJlZE1vZHVsZSA9IG1ha2VNYXAoJ2F0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleScpOwoKICAvLyBOb3RlOiB0aGlzIGlzIGEgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uIHNvIHdlIGNhbiBhc3N1bWUgZWxtcyBhcmUgRE9NIG5vZGVzLgogIGZ1bmN0aW9uIGh5ZHJhdGUgKGVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSB7CiAgICB2YXIgaTsKICAgIHZhciB0YWcgPSB2bm9kZS50YWc7CiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjsKICAgIGluVlByZSA9IGluVlByZSB8fCAoZGF0YSAmJiBkYXRhLnByZSk7CiAgICB2bm9kZS5lbG0gPSBlbG07CgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpICYmIGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeSkpIHsKICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIC8vIGFzc2VydCBub2RlIG1hdGNoCiAgICB7CiAgICAgIGlmICghYXNzZXJ0Tm9kZU1hdGNoKGVsbSwgdm5vZGUsIGluVlByZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgfQogICAgfQogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH0KICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS4KICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0KICAgIGlmIChpc0RlZih0YWcpKSB7CiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHsKICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW4KICAgICAgICBpZiAoIWVsbS5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gdi1odG1sIGFuZCBkb21Qcm9wczogaW5uZXJIVE1MCiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7CiAgICAgICAgICAgIGlmIChpICE9PSBlbG0uaW5uZXJIVE1MKSB7CiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkCiAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NlcnZlciBpbm5lckhUTUw6ICcsIGkpOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdjbGllbnQgaW5uZXJIVE1MOiAnLCBlbG0uaW5uZXJIVE1MKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGNvbXBhcmUgY2hpbGRyZW4gbGlzdHMKICAgICAgICAgICAgdmFyIGNoaWxkcmVuTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHsKICAgICAgICAgICAgICBpZiAoIWNoaWxkTm9kZSB8fCAhaHlkcmF0ZShjaGlsZE5vZGUsIGNoaWxkcmVuW2kkMV0sIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSkgewogICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIGNoaWxkTm9kZSBpcyBub3QgbnVsbCwgaXQgbWVhbnMgdGhlIGFjdHVhbCBjaGlsZE5vZGVzIGxpc3QgaXMKICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC4KICAgICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoIHx8IGNoaWxkTm9kZSkgewogICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZAogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgaHlkcmF0aW9uQmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGVsbS5jaGlsZE5vZGVzLCBjaGlsZHJlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgIGlmICghaXNSZW5kZXJlZE1vZHVsZShrZXkpKSB7CiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlOwogICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICAgICAgYnJlYWsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFmdWxsSW52b2tlICYmIGRhdGFbJ2NsYXNzJ10pIHsKICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzCiAgICAgICAgICB0cmF2ZXJzZShkYXRhWydjbGFzcyddKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHsKICAgICAgZWxtLmRhdGEgPSB2bm9kZS50ZXh0OwogICAgfQogICAgcmV0dXJuIHRydWUKICB9CgogIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUsIGluVlByZSkgewogICAgaWYgKGlzRGVmKHZub2RlLnRhZykpIHsKICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKAogICAgICAgICFpc1Vua25vd25FbGVtZW50JCQxKHZub2RlLCBpblZQcmUpICYmCiAgICAgICAgdm5vZGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IChub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpCiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAodm5vZGUuaXNDb21tZW50ID8gOCA6IDMpCiAgICB9CiAgfQoKICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5LCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7CiAgICAgIGlmIChpc0RlZihvbGRWbm9kZSkpIHsgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOyB9CiAgICAgIHJldHVybgogICAgfQoKICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlOwogICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdOwoKICAgIGlmIChpc1VuZGVmKG9sZFZub2RlKSkgewogICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50CiAgICAgIGlzSW5pdGlhbFBhdGNoID0gdHJ1ZTsKICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpOwogICAgICBpZiAoIWlzUmVhbEVsZW1lbnQgJiYgc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHsKICAgICAgICAvLyBwYXRjaCBleGlzdGluZyByb290IG5vZGUKICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNSZWFsRWxlbWVudCkgewogICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnQKICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQgYW5kIGlmIHdlIGNhbiBwZXJmb3JtCiAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgaHlkcmF0aW9uLgogICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHsKICAgICAgICAgICAgb2xkVm5vZGUucmVtb3ZlQXR0cmlidXRlKFNTUl9BVFRSKTsKICAgICAgICAgICAgaHlkcmF0aW5nID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1RydWUoaHlkcmF0aW5nKSkgewogICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHsKICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpOwogICAgICAgICAgICAgIHJldHVybiBvbGRWbm9kZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgICAnVGhlIGNsaWVudC1zaWRlIHJlbmRlcmVkIHZpcnR1YWwgRE9NIHRyZWUgaXMgbm90IG1hdGNoaW5nICcgKwogICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgKwogICAgICAgICAgICAgICAgJ0hUTUwgbWFya3VwLCBmb3IgZXhhbXBsZSBuZXN0aW5nIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSAnICsKICAgICAgICAgICAgICAgICc8cD4sIG9yIG1pc3NpbmcgPHRib2R5Pi4gQmFpbGluZyBoeWRyYXRpb24gYW5kIHBlcmZvcm1pbmcgJyArCiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIGVpdGhlciBub3Qgc2VydmVyLXJlbmRlcmVkLCBvciBoeWRyYXRpb24gZmFpbGVkLgogICAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5vZGUgYW5kIHJlcGxhY2UgaXQKICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnQKICAgICAgICB2YXIgb2xkRWxtID0gb2xkVm5vZGUuZWxtOwogICAgICAgIHZhciBwYXJlbnRFbG0kMSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pOwoKICAgICAgICAvLyBjcmVhdGUgbmV3IG5vZGUKICAgICAgICBjcmVhdGVFbG0oCiAgICAgICAgICB2bm9kZSwKICAgICAgICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhCiAgICAgICAgICAvLyBsZWF2aW5nIHRyYW5zaXRpb24uIE9ubHkgaGFwcGVucyB3aGVuIGNvbWJpbmluZyB0cmFuc2l0aW9uICsKICAgICAgICAgIC8vIGtlZXAtYWxpdmUgKyBIT0NzLiAoIzQ1OTApCiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtJDEsCiAgICAgICAgICBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVsbSkKICAgICAgICApOwoKICAgICAgICAvLyB1cGRhdGUgcGFyZW50IHBsYWNlaG9sZGVyIG5vZGUgZWxlbWVudCwgcmVjdXJzaXZlbHkKICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkgewogICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50OwogICAgICAgICAgdmFyIHBhdGNoYWJsZSA9IGlzUGF0Y2hhYmxlKHZub2RlKTsKICAgICAgICAgIHdoaWxlIChhbmNlc3RvcikgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgY2JzLmRlc3Ryb3lbaV0oYW5jZXN0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFuY2VzdG9yLmVsbSA9IHZub2RlLmVsbTsKICAgICAgICAgICAgaWYgKHBhdGNoYWJsZSkgewogICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICAgICAgICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgYW5jZXN0b3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyAjNjUxMwogICAgICAgICAgICAgIC8vIGludm9rZSBpbnNlcnQgaG9va3MgdGhhdCBtYXkgaGF2ZSBiZWVuIG1lcmdlZCBieSBjcmVhdGUgaG9va3MuCiAgICAgICAgICAgICAgLy8gZS5nLiBmb3IgZGlyZWN0aXZlcyB0aGF0IHVzZXMgdGhlICJpbnNlcnRlZCIgaG9vay4KICAgICAgICAgICAgICB2YXIgaW5zZXJ0ID0gYW5jZXN0b3IuZGF0YS5ob29rLmluc2VydDsKICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkgewogICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgaW5kZXggMSB0byBhdm9pZCByZS1pbnZva2luZyBjb21wb25lbnQgbW91bnRlZCBob29rCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDIgPSAxOyBpJDIgPCBpbnNlcnQuZm5zLmxlbmd0aDsgaSQyKyspIHsKICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlZ2lzdGVyUmVmKGFuY2VzdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRlc3Ryb3kgb2xkIG5vZGUKICAgICAgICBpZiAoaXNEZWYocGFyZW50RWxtJDEpKSB7CiAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtJDEsIFtvbGRWbm9kZV0sIDAsIDApOwogICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkgewogICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpOwogICAgcmV0dXJuIHZub2RlLmVsbQogIH0KfQoKLyogICovCgp2YXIgZGlyZWN0aXZlcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsCiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLAogIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7CiAgICB1cGRhdGVEaXJlY3RpdmVzKHZub2RlLCBlbXB0eU5vZGUpOwogIH0KfQoKZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7CiAgaWYgKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcyB8fCB2bm9kZS5kYXRhLmRpcmVjdGl2ZXMpIHsKICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTsKICB9Cn0KCmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBpc0NyZWF0ZSA9IG9sZFZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTsKICB2YXIgbmV3RGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSh2bm9kZS5kYXRhLmRpcmVjdGl2ZXMsIHZub2RlLmNvbnRleHQpOwoKICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTsKICB2YXIgZGlyc1dpdGhQb3N0cGF0Y2ggPSBbXTsKCiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7CiAgZm9yIChrZXkgaW4gbmV3RGlycykgewogICAgb2xkRGlyID0gb2xkRGlyc1trZXldOwogICAgZGlyID0gbmV3RGlyc1trZXldOwogICAgaWYgKCFvbGREaXIpIHsKICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZAogICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmluc2VydGVkKSB7CiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZQogICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7CiAgICAgIGNhbGxIb29rJDEoZGlyLCAndXBkYXRlJywgdm5vZGUsIG9sZFZub2RlKTsKICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5jb21wb25lbnRVcGRhdGVkKSB7CiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZGlyc1dpdGhJbnNlcnQubGVuZ3RoKSB7CiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzV2l0aEluc2VydC5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhJbnNlcnRbaV0sICdpbnNlcnRlZCcsIHZub2RlLCBvbGRWbm9kZSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaXNDcmVhdGUpIHsKICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxJbnNlcnQoKTsKICAgIH0KICB9CgogIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHsKICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAncG9zdHBhdGNoJywgZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoUG9zdHBhdGNoLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICB9CiAgICB9KTsKICB9CgogIGlmICghaXNDcmVhdGUpIHsKICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHsKICAgICAgaWYgKCFuZXdEaXJzW2tleV0pIHsKICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kCiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CgpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKAogIGRpcnMsCiAgdm0KKSB7CiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFkaXJzKSB7CiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgIHJldHVybiByZXMKICB9CiAgdmFyIGksIGRpcjsKICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIGlmICghZGlyLm1vZGlmaWVycykgewogICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgZGlyLm1vZGlmaWVycyA9IGVtcHR5TW9kaWZpZXJzOwogICAgfQogICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7CiAgICBkaXIuZGVmID0gcmVzb2x2ZUFzc2V0KHZtLiRvcHRpb25zLCAnZGlyZWN0aXZlcycsIGRpci5uYW1lLCB0cnVlKTsKICB9CiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBnZXRSYXdEaXJOYW1lIChkaXIpIHsKICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyAiLiIgKyAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycyB8fCB7fSkuam9pbignLicpKSkKfQoKZnVuY3Rpb24gY2FsbEhvb2skMSAoZGlyLCBob29rLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSkgewogIHZhciBmbiA9IGRpci5kZWYgJiYgZGlyLmRlZltob29rXTsKICBpZiAoZm4pIHsKICAgIHRyeSB7CiAgICAgIGZuKHZub2RlLmVsbSwgZGlyLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGhhbmRsZUVycm9yKGUsIHZub2RlLmNvbnRleHQsICgiZGlyZWN0aXZlICIgKyAoZGlyLm5hbWUpICsgIiAiICsgaG9vayArICIgaG9vayIpKTsKICAgIH0KICB9Cn0KCnZhciBiYXNlTW9kdWxlcyA9IFsKICByZWYsCiAgZGlyZWN0aXZlcwpdCgovKiAgKi8KCmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHsKICB2YXIgb3B0cyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgaWYgKGlzRGVmKG9wdHMpICYmIG9wdHMuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRycyA9PT0gZmFsc2UpIHsKICAgIHJldHVybgogIH0KICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLmF0dHJzKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEuYXR0cnMpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIGtleSwgY3VyLCBvbGQ7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzIHx8IHt9OwogIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKGF0dHJzLl9fb2JfXykpIHsKICAgIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYXR0cnMpOwogIH0KCiAgZm9yIChrZXkgaW4gYXR0cnMpIHsKICAgIGN1ciA9IGF0dHJzW2tleV07CiAgICBvbGQgPSBvbGRBdHRyc1trZXldOwogICAgaWYgKG9sZCAhPT0gY3VyKSB7CiAgICAgIHNldEF0dHIoZWxtLCBrZXksIGN1cik7CiAgICB9CiAgfQogIC8vICM0MzkxOiBpbiBJRTksIHNldHRpbmcgdHlwZSBjYW4gcmVzZXQgdmFsdWUgZm9yIGlucHV0W3R5cGU9cmFkaW9dCiAgLy8gIzY2NjY6IElFL0VkZ2UgZm9yY2VzIHByb2dyZXNzIHZhbHVlIGRvd24gdG8gMSBiZWZvcmUgc2V0dGluZyBhIG1heAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICgoaXNJRSB8fCBpc0VkZ2UpICYmIGF0dHJzLnZhbHVlICE9PSBvbGRBdHRycy52YWx1ZSkgewogICAgc2V0QXR0cihlbG0sICd2YWx1ZScsIGF0dHJzLnZhbHVlKTsKICB9CiAgZm9yIChrZXkgaW4gb2xkQXR0cnMpIHsKICAgIGlmIChpc1VuZGVmKGF0dHJzW2tleV0pKSB7CiAgICAgIGlmIChpc1hsaW5rKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpOwogICAgICB9IGVsc2UgaWYgKCFpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7CiAgaWYgKGVsLnRhZ05hbWUuaW5kZXhPZignLScpID4gLTEpIHsKICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTsKICB9IGVsc2UgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkgewogICAgLy8gc2V0IGF0dHJpYnV0ZSBmb3IgYmxhbmsgdmFsdWUKICAgIC8vIGUuZy4gPG9wdGlvbiBkaXNhYmxlZD5TZWxlY3Qgb25lPC9vcHRpb24+CiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICB9IGVsc2UgewogICAgICAvLyB0ZWNobmljYWxseSBhbGxvd2Z1bGxzY3JlZW4gaXMgYSBib29sZWFuIGF0dHJpYnV0ZSBmb3IgPGlmcmFtZT4sCiAgICAgIC8vIGJ1dCBGbGFzaCBleHBlY3RzIGEgdmFsdWUgb2YgInRydWUiIHdoZW4gdXNlZCBvbiA8ZW1iZWQ+IHRhZwogICAgICB2YWx1ZSA9IGtleSA9PT0gJ2FsbG93ZnVsbHNjcmVlbicgJiYgZWwudGFnTmFtZSA9PT0gJ0VNQkVEJwogICAgICAgID8gJ3RydWUnCiAgICAgICAgOiBrZXk7CiAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzRW51bWVyYXRlZEF0dHIoa2V5KSkgewogICAgZWwuc2V0QXR0cmlidXRlKGtleSwgaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZScgPyAnZmFsc2UnIDogJ3RydWUnKTsKICB9IGVsc2UgaWYgKGlzWGxpbmsoa2V5KSkgewogICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpOwogICAgfQogIH0gZWxzZSB7CiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7CiAgfQp9CgpmdW5jdGlvbiBiYXNlU2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHsKICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpOwogIH0gZWxzZSB7CiAgICAvLyAjNzEzODogSUUxMCAmIDExIGZpcmVzIGlucHV0IGV2ZW50IHdoZW4gc2V0dGluZyBwbGFjZWhvbGRlciBvbgogICAgLy8gPHRleHRhcmVhPi4uLiBibG9jayB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYW5kIHJlbW92ZSB0aGUgYmxvY2tlcgogICAgLy8gaW1tZWRpYXRlbHkuCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgKICAgICAgaXNJRSAmJiAhaXNJRTkgJiYKICAgICAgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyAmJgogICAgICBrZXkgPT09ICdwbGFjZWhvbGRlcicgJiYgIWVsLl9faWVwaAogICAgKSB7CiAgICAgIHZhciBibG9ja2VyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIH07CiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICBlbC5fX2llcGggPSB0cnVlOyAvKiBJRSBwbGFjZWhvbGRlciBwYXRjaGVkICovCiAgICB9CiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CiAgfQp9Cgp2YXIgYXR0cnMgPSB7CiAgY3JlYXRlOiB1cGRhdGVBdHRycywKICB1cGRhdGU6IHVwZGF0ZUF0dHJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlQ2xhc3MgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBlbCA9IHZub2RlLmVsbTsKICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhOwogIGlmICgKICAgIGlzVW5kZWYoZGF0YS5zdGF0aWNDbGFzcykgJiYKICAgIGlzVW5kZWYoZGF0YS5jbGFzcykgJiYgKAogICAgICBpc1VuZGVmKG9sZERhdGEpIHx8ICgKICAgICAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljQ2xhc3MpICYmCiAgICAgICAgaXNVbmRlZihvbGREYXRhLmNsYXNzKQogICAgICApCiAgICApCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjbHMgPSBnZW5DbGFzc0ZvclZub2RlKHZub2RlKTsKCiAgLy8gaGFuZGxlIHRyYW5zaXRpb24gY2xhc3NlcwogIHZhciB0cmFuc2l0aW9uQ2xhc3MgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXM7CiAgaWYgKGlzRGVmKHRyYW5zaXRpb25DbGFzcykpIHsKICAgIGNscyA9IGNvbmNhdChjbHMsIHN0cmluZ2lmeUNsYXNzKHRyYW5zaXRpb25DbGFzcykpOwogIH0KCiAgLy8gc2V0IHRoZSBjbGFzcwogIGlmIChjbHMgIT09IGVsLl9wcmV2Q2xhc3MpIHsKICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbHMpOwogICAgZWwuX3ByZXZDbGFzcyA9IGNsczsKICB9Cn0KCnZhciBrbGFzcyA9IHsKICBjcmVhdGU6IHVwZGF0ZUNsYXNzLAogIHVwZGF0ZTogdXBkYXRlQ2xhc3MKfQoKLyogICovCgp2YXIgdmFsaWREaXZpc2lvbkNoYXJSRSA9IC9bXHcpLitcLV8kXF1dLzsKCmZ1bmN0aW9uIHBhcnNlRmlsdGVycyAoZXhwKSB7CiAgdmFyIGluU2luZ2xlID0gZmFsc2U7CiAgdmFyIGluRG91YmxlID0gZmFsc2U7CiAgdmFyIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsKICB2YXIgaW5SZWdleCA9IGZhbHNlOwogIHZhciBjdXJseSA9IDA7CiAgdmFyIHNxdWFyZSA9IDA7CiAgdmFyIHBhcmVuID0gMDsKICB2YXIgbGFzdEZpbHRlckluZGV4ID0gMDsKICB2YXIgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsKCiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykgewogICAgcHJldiA9IGM7CiAgICBjID0gZXhwLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoaW5TaW5nbGUpIHsKICAgICAgaWYgKGMgPT09IDB4MjcgJiYgcHJldiAhPT0gMHg1QykgeyBpblNpbmdsZSA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7CiAgICAgIGlmIChjID09PSAweDIyICYmIHByZXYgIT09IDB4NUMpIHsgaW5Eb3VibGUgPSBmYWxzZTsgfQogICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7CiAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NUMpIHsgaW5UZW1wbGF0ZVN0cmluZyA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHsKICAgICAgaWYgKGMgPT09IDB4MmYgJiYgcHJldiAhPT0gMHg1QykgeyBpblJlZ2V4ID0gZmFsc2U7IH0KICAgIH0gZWxzZSBpZiAoCiAgICAgIGMgPT09IDB4N0MgJiYgLy8gcGlwZQogICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYKICAgICAgZXhwLmNoYXJDb2RlQXQoaSAtIDEpICE9PSAweDdDICYmCiAgICAgICFjdXJseSAmJiAhc3F1YXJlICYmICFwYXJlbgogICAgKSB7CiAgICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBmaXJzdCBmaWx0ZXIsIGVuZCBvZiBleHByZXNzaW9uCiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaEZpbHRlcigpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlIDB4MjI6IGluRG91YmxlID0gdHJ1ZTsgYnJlYWsgICAgICAgICAvLyAiCiAgICAgICAgY2FzZSAweDI3OiBpblNpbmdsZSA9IHRydWU7IGJyZWFrICAgICAgICAgLy8gJwogICAgICAgIGNhc2UgMHg2MDogaW5UZW1wbGF0ZVN0cmluZyA9IHRydWU7IGJyZWFrIC8vIGAKICAgICAgICBjYXNlIDB4Mjg6IHBhcmVuKys7IGJyZWFrICAgICAgICAgICAgICAgICAvLyAoCiAgICAgICAgY2FzZSAweDI5OiBwYXJlbi0tOyBicmVhayAgICAgICAgICAgICAgICAgLy8gKQogICAgICAgIGNhc2UgMHg1Qjogc3F1YXJlKys7IGJyZWFrICAgICAgICAgICAgICAgIC8vIFsKICAgICAgICBjYXNlIDB4NUQ6IHNxdWFyZS0tOyBicmVhayAgICAgICAgICAgICAgICAvLyBdCiAgICAgICAgY2FzZSAweDdCOiBjdXJseSsrOyBicmVhayAgICAgICAgICAgICAgICAgLy8gewogICAgICAgIGNhc2UgMHg3RDogY3VybHktLTsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgfQogICAgICBpZiAoYyA9PT0gMHgyZikgeyAvLyAvCiAgICAgICAgdmFyIGogPSBpIC0gMTsKICAgICAgICB2YXIgcCA9ICh2b2lkIDApOwogICAgICAgIC8vIGZpbmQgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgcHJldiBjaGFyCiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICBwID0gZXhwLmNoYXJBdChqKTsKICAgICAgICAgIGlmIChwICE9PSAnICcpIHsgYnJlYWsgfQogICAgICAgIH0KICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkgewogICAgICAgICAgaW5SZWdleCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsKICB9IGVsc2UgaWYgKGxhc3RGaWx0ZXJJbmRleCAhPT0gMCkgewogICAgcHVzaEZpbHRlcigpOwogIH0KCiAgZnVuY3Rpb24gcHVzaEZpbHRlciAoKSB7CiAgICAoZmlsdGVycyB8fCAoZmlsdGVycyA9IFtdKSkucHVzaChleHAuc2xpY2UobGFzdEZpbHRlckluZGV4LCBpKS50cmltKCkpOwogICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgfQoKICBpZiAoZmlsdGVycykgewogICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSk7CiAgICB9CiAgfQoKICByZXR1cm4gZXhwcmVzc2lvbgp9CgpmdW5jdGlvbiB3cmFwRmlsdGVyIChleHAsIGZpbHRlcikgewogIHZhciBpID0gZmlsdGVyLmluZGV4T2YoJygnKTsKICBpZiAoaSA8IDApIHsKICAgIC8vIF9mOiByZXNvbHZlRmlsdGVyCiAgICByZXR1cm4gKCJfZihcIiIgKyBmaWx0ZXIgKyAiXCIpKCIgKyBleHAgKyAiKSIpCiAgfSBlbHNlIHsKICAgIHZhciBuYW1lID0gZmlsdGVyLnNsaWNlKDAsIGkpOwogICAgdmFyIGFyZ3MgPSBmaWx0ZXIuc2xpY2UoaSArIDEpOwogICAgcmV0dXJuICgiX2YoXCIiICsgbmFtZSArICJcIikoIiArIGV4cCArIChhcmdzICE9PSAnKScgPyAnLCcgKyBhcmdzIDogYXJncykpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGJhc2VXYXJuIChtc2cpIHsKICBjb25zb2xlLmVycm9yKCgiW1Z1ZSBjb21waWxlcl06ICIgKyBtc2cpKTsKfQoKZnVuY3Rpb24gcGx1Y2tNb2R1bGVGdW5jdGlvbiAoCiAgbW9kdWxlcywKICBrZXkKKSB7CiAgcmV0dXJuIG1vZHVsZXMKICAgID8gbW9kdWxlcy5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1ba2V5XTsgfSkuZmlsdGVyKGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9KQogICAgOiBbXQp9CgpmdW5jdGlvbiBhZGRQcm9wIChlbCwgbmFtZSwgdmFsdWUpIHsKICAoZWwucHJvcHMgfHwgKGVsLnByb3BzID0gW10pKS5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOwogIGVsLnBsYWluID0gZmFsc2U7Cn0KCmZ1bmN0aW9uIGFkZEF0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIChlbC5hdHRycyB8fCAoZWwuYXR0cnMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7CiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKLy8gYWRkIGEgcmF3IGF0dHIgKHVzZSB0aGlzIGluIHByZVRyYW5zZm9ybXMpCmZ1bmN0aW9uIGFkZFJhd0F0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIGVsLmF0dHJzTWFwW25hbWVdID0gdmFsdWU7CiAgZWwuYXR0cnNMaXN0LnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7Cn0KCmZ1bmN0aW9uIGFkZERpcmVjdGl2ZSAoCiAgZWwsCiAgbmFtZSwKICByYXdOYW1lLAogIHZhbHVlLAogIGFyZywKICBtb2RpZmllcnMKKSB7CiAgKGVsLmRpcmVjdGl2ZXMgfHwgKGVsLmRpcmVjdGl2ZXMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCByYXdOYW1lOiByYXdOYW1lLCB2YWx1ZTogdmFsdWUsIGFyZzogYXJnLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9KTsKICBlbC5wbGFpbiA9IGZhbHNlOwp9CgpmdW5jdGlvbiBhZGRIYW5kbGVyICgKICBlbCwKICBuYW1lLAogIHZhbHVlLAogIG1vZGlmaWVycywKICBpbXBvcnRhbnQsCiAgd2FybgopIHsKICBtb2RpZmllcnMgPSBtb2RpZmllcnMgfHwgZW1wdHlPYmplY3Q7CiAgLy8gd2FybiBwcmV2ZW50IGFuZCBwYXNzaXZlIG1vZGlmaWVyCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKAogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4gJiYKICAgIG1vZGlmaWVycy5wcmV2ZW50ICYmIG1vZGlmaWVycy5wYXNzaXZlCiAgKSB7CiAgICB3YXJuKAogICAgICAncGFzc2l2ZSBhbmQgcHJldmVudCBjYW5cJ3QgYmUgdXNlZCB0b2dldGhlci4gJyArCiAgICAgICdQYXNzaXZlIGhhbmRsZXIgY2FuXCd0IHByZXZlbnQgZGVmYXVsdCBldmVudC4nCiAgICApOwogIH0KCiAgLy8gY2hlY2sgY2FwdHVyZSBtb2RpZmllcgogIGlmIChtb2RpZmllcnMuY2FwdHVyZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5jYXB0dXJlOwogICAgbmFtZSA9ICchJyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIGNhcHR1cmVkCiAgfQogIGlmIChtb2RpZmllcnMub25jZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5vbmNlOwogICAgbmFtZSA9ICd+JyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIG9uY2UKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKG1vZGlmaWVycy5wYXNzaXZlKSB7CiAgICBkZWxldGUgbW9kaWZpZXJzLnBhc3NpdmU7CiAgICBuYW1lID0gJyYnICsgbmFtZTsgLy8gbWFyayB0aGUgZXZlbnQgYXMgcGFzc2l2ZQogIH0KCiAgLy8gbm9ybWFsaXplIGNsaWNrLnJpZ2h0IGFuZCBjbGljay5taWRkbGUgc2luY2UgdGhleSBkb24ndCBhY3R1YWxseSBmaXJlCiAgLy8gdGhpcyBpcyB0ZWNobmljYWxseSBicm93c2VyLXNwZWNpZmljLCBidXQgYXQgbGVhc3QgZm9yIG5vdyBicm93c2VycyBhcmUKICAvLyB0aGUgb25seSB0YXJnZXQgZW52cyB0aGF0IGhhdmUgcmlnaHQvbWlkZGxlIGNsaWNrcy4KICBpZiAobmFtZSA9PT0gJ2NsaWNrJykgewogICAgaWYgKG1vZGlmaWVycy5yaWdodCkgewogICAgICBuYW1lID0gJ2NvbnRleHRtZW51JzsKICAgICAgZGVsZXRlIG1vZGlmaWVycy5yaWdodDsKICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLm1pZGRsZSkgewogICAgICBuYW1lID0gJ21vdXNldXAnOwogICAgfQogIH0KCiAgdmFyIGV2ZW50czsKICBpZiAobW9kaWZpZXJzLm5hdGl2ZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5uYXRpdmU7CiAgICBldmVudHMgPSBlbC5uYXRpdmVFdmVudHMgfHwgKGVsLm5hdGl2ZUV2ZW50cyA9IHt9KTsKICB9IGVsc2UgewogICAgZXZlbnRzID0gZWwuZXZlbnRzIHx8IChlbC5ldmVudHMgPSB7fSk7CiAgfQoKICB2YXIgbmV3SGFuZGxlciA9IHsKICAgIHZhbHVlOiB2YWx1ZS50cmltKCkKICB9OwogIGlmIChtb2RpZmllcnMgIT09IGVtcHR5T2JqZWN0KSB7CiAgICBuZXdIYW5kbGVyLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKICB9CgogIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoQXJyYXkuaXNBcnJheShoYW5kbGVycykpIHsKICAgIGltcG9ydGFudCA/IGhhbmRsZXJzLnVuc2hpZnQobmV3SGFuZGxlcikgOiBoYW5kbGVycy5wdXNoKG5ld0hhbmRsZXIpOwogIH0gZWxzZSBpZiAoaGFuZGxlcnMpIHsKICAgIGV2ZW50c1tuYW1lXSA9IGltcG9ydGFudCA/IFtuZXdIYW5kbGVyLCBoYW5kbGVyc10gOiBbaGFuZGxlcnMsIG5ld0hhbmRsZXJdOwogIH0gZWxzZSB7CiAgICBldmVudHNbbmFtZV0gPSBuZXdIYW5kbGVyOwogIH0KCiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0QmluZGluZ0F0dHIgKAogIGVsLAogIG5hbWUsCiAgZ2V0U3RhdGljCikgewogIHZhciBkeW5hbWljVmFsdWUgPQogICAgZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJzonICsgbmFtZSkgfHwKICAgIGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWJpbmQ6JyArIG5hbWUpOwogIGlmIChkeW5hbWljVmFsdWUgIT0gbnVsbCkgewogICAgcmV0dXJuIHBhcnNlRmlsdGVycyhkeW5hbWljVmFsdWUpCiAgfSBlbHNlIGlmIChnZXRTdGF0aWMgIT09IGZhbHNlKSB7CiAgICB2YXIgc3RhdGljVmFsdWUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCBuYW1lKTsKICAgIGlmIChzdGF0aWNWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0aWNWYWx1ZSkKICAgIH0KICB9Cn0KCi8vIG5vdGU6IHRoaXMgb25seSByZW1vdmVzIHRoZSBhdHRyIGZyb20gdGhlIEFycmF5IChhdHRyc0xpc3QpIHNvIHRoYXQgaXQKLy8gZG9lc24ndCBnZXQgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NBdHRycy4KLy8gQnkgZGVmYXVsdCBpdCBkb2VzIE5PVCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwIChhdHRyc01hcCkgYmVjYXVzZSB0aGUgbWFwIGlzCi8vIG5lZWRlZCBkdXJpbmcgY29kZWdlbi4KZnVuY3Rpb24gZ2V0QW5kUmVtb3ZlQXR0ciAoCiAgZWwsCiAgbmFtZSwKICByZW1vdmVGcm9tTWFwCikgewogIHZhciB2YWw7CiAgaWYgKCh2YWwgPSBlbC5hdHRyc01hcFtuYW1lXSkgIT0gbnVsbCkgewogICAgdmFyIGxpc3QgPSBlbC5hdHRyc0xpc3Q7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICBsaXN0LnNwbGljZShpLCAxKTsKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQogIGlmIChyZW1vdmVGcm9tTWFwKSB7CiAgICBkZWxldGUgZWwuYXR0cnNNYXBbbmFtZV07CiAgfQogIHJldHVybiB2YWwKfQoKLyogICovCgovKioKICogQ3Jvc3MtcGxhdGZvcm0gY29kZSBnZW5lcmF0aW9uIGZvciBjb21wb25lbnQgdi1tb2RlbAogKi8KZnVuY3Rpb24gZ2VuQ29tcG9uZW50TW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgcmVmID0gbW9kaWZpZXJzIHx8IHt9OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CgogIHZhciBiYXNlVmFsdWVFeHByZXNzaW9uID0gJyQkdic7CiAgdmFyIHZhbHVlRXhwcmVzc2lvbiA9IGJhc2VWYWx1ZUV4cHJlc3Npb247CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9CiAgICAgICIodHlwZW9mICIgKyBiYXNlVmFsdWVFeHByZXNzaW9uICsgIiA9PT0gJ3N0cmluZyciICsKICAgICAgIj8gIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiLnRyaW0oKSIgKwogICAgICAiOiAiICsgYmFzZVZhbHVlRXhwcmVzc2lvbiArICIpIjsKICB9CiAgaWYgKG51bWJlcikgewogICAgdmFsdWVFeHByZXNzaW9uID0gIl9uKCIgKyB2YWx1ZUV4cHJlc3Npb24gKyAiKSI7CiAgfQogIHZhciBhc3NpZ25tZW50ID0gZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIHZhbHVlRXhwcmVzc2lvbik7CgogIGVsLm1vZGVsID0gewogICAgdmFsdWU6ICgiKCIgKyB2YWx1ZSArICIpIiksCiAgICBleHByZXNzaW9uOiAoIlwiIiArIHZhbHVlICsgIlwiIiksCiAgICBjYWxsYmFjazogKCJmdW5jdGlvbiAoIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiKSB7IiArIGFzc2lnbm1lbnQgKyAifSIpCiAgfTsKfQoKLyoqCiAqIENyb3NzLXBsYXRmb3JtIGNvZGVnZW4gaGVscGVyIGZvciBnZW5lcmF0aW5nIHYtbW9kZWwgdmFsdWUgYXNzaWdubWVudCBjb2RlLgogKi8KZnVuY3Rpb24gZ2VuQXNzaWdubWVudENvZGUgKAogIHZhbHVlLAogIGFzc2lnbm1lbnQKKSB7CiAgdmFyIHJlcyA9IHBhcnNlTW9kZWwodmFsdWUpOwogIGlmIChyZXMua2V5ID09PSBudWxsKSB7CiAgICByZXR1cm4gKHZhbHVlICsgIj0iICsgYXNzaWdubWVudCkKICB9IGVsc2UgewogICAgcmV0dXJuICgiJHNldCgiICsgKHJlcy5leHApICsgIiwgIiArIChyZXMua2V5KSArICIsICIgKyBhc3NpZ25tZW50ICsgIikiKQogIH0KfQoKLyoqCiAqIFBhcnNlIGEgdi1tb2RlbCBleHByZXNzaW9uIGludG8gYSBiYXNlIHBhdGggYW5kIGEgZmluYWwga2V5IHNlZ21lbnQuCiAqIEhhbmRsZXMgYm90aCBkb3QtcGF0aCBhbmQgcG9zc2libGUgc3F1YXJlIGJyYWNrZXRzLgogKgogKiBQb3NzaWJsZSBjYXNlczoKICoKICogLSB0ZXN0CiAqIC0gdGVzdFtrZXldCiAqIC0gdGVzdFt0ZXN0MVtrZXldXQogKiAtIHRlc3RbImEiXVtrZXldCiAqIC0geHh4LnRlc3RbYVthXS50ZXN0MVtrZXldXQogKiAtIHRlc3QueHh4LmFbImFzYSJdW3Rlc3QxW2tleV1dCiAqCiAqLwoKdmFyIGxlbjsKdmFyIHN0cjsKdmFyIGNocjsKdmFyIGluZGV4JDE7CnZhciBleHByZXNzaW9uUG9zOwp2YXIgZXhwcmVzc2lvbkVuZFBvczsKCgoKZnVuY3Rpb24gcGFyc2VNb2RlbCAodmFsKSB7CiAgLy8gRml4IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvcHVsbC83NzMwCiAgLy8gYWxsb3cgdi1tb2RlbD0ib2JqLnZhbCAiICh0cmFpbGluZyB3aGl0ZXNwYWNlKQogIHZhbCA9IHZhbC50cmltKCk7CiAgbGVuID0gdmFsLmxlbmd0aDsKCiAgaWYgKHZhbC5pbmRleE9mKCdbJykgPCAwIHx8IHZhbC5sYXN0SW5kZXhPZignXScpIDwgbGVuIC0gMSkgewogICAgaW5kZXgkMSA9IHZhbC5sYXN0SW5kZXhPZignLicpOwogICAgaWYgKGluZGV4JDEgPiAtMSkgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLnNsaWNlKDAsIGluZGV4JDEpLAogICAgICAgIGtleTogJyInICsgdmFsLnNsaWNlKGluZGV4JDEgKyAxKSArICciJwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLAogICAgICAgIGtleTogbnVsbAogICAgICB9CiAgICB9CiAgfQoKICBzdHIgPSB2YWw7CiAgaW5kZXgkMSA9IGV4cHJlc3Npb25Qb3MgPSBleHByZXNzaW9uRW5kUG9zID0gMDsKCiAgd2hpbGUgKCFlb2YoKSkgewogICAgY2hyID0gbmV4dCgpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QikgewogICAgICBwYXJzZUJyYWNrZXQoY2hyKTsKICAgIH0KICB9CgogIHJldHVybiB7CiAgICBleHA6IHZhbC5zbGljZSgwLCBleHByZXNzaW9uUG9zKSwKICAgIGtleTogdmFsLnNsaWNlKGV4cHJlc3Npb25Qb3MgKyAxLCBleHByZXNzaW9uRW5kUG9zKQogIH0KfQoKZnVuY3Rpb24gbmV4dCAoKSB7CiAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgkMSkKfQoKZnVuY3Rpb24gZW9mICgpIHsKICByZXR1cm4gaW5kZXgkMSA+PSBsZW4KfQoKZnVuY3Rpb24gaXNTdHJpbmdTdGFydCAoY2hyKSB7CiAgcmV0dXJuIGNociA9PT0gMHgyMiB8fCBjaHIgPT09IDB4MjcKfQoKZnVuY3Rpb24gcGFyc2VCcmFja2V0IChjaHIpIHsKICB2YXIgaW5CcmFja2V0ID0gMTsKICBleHByZXNzaW9uUG9zID0gaW5kZXgkMTsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAoY2hyID09PSAweDVCKSB7IGluQnJhY2tldCsrOyB9CiAgICBpZiAoY2hyID09PSAweDVEKSB7IGluQnJhY2tldC0tOyB9CiAgICBpZiAoaW5CcmFja2V0ID09PSAwKSB7CiAgICAgIGV4cHJlc3Npb25FbmRQb3MgPSBpbmRleCQxOwogICAgICBicmVhawogICAgfQogIH0KfQoKZnVuY3Rpb24gcGFyc2VTdHJpbmcgKGNocikgewogIHZhciBzdHJpbmdRdW90ZSA9IGNocjsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoY2hyID09PSBzdHJpbmdRdW90ZSkgewogICAgICBicmVhawogICAgfQogIH0KfQoKLyogICovCgp2YXIgd2FybiQxOwoKLy8gaW4gc29tZSBjYXNlcywgdGhlIGV2ZW50IHVzZWQgaGFzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZQovLyBzbyB3ZSB1c2VkIHNvbWUgcmVzZXJ2ZWQgdG9rZW5zIGR1cmluZyBjb21waWxlLgp2YXIgUkFOR0VfVE9LRU4gPSAnX19yJzsKdmFyIENIRUNLQk9YX1JBRElPX1RPS0VOID0gJ19fYyc7CgpmdW5jdGlvbiBtb2RlbCAoCiAgZWwsCiAgZGlyLAogIF93YXJuCikgewogIHdhcm4kMSA9IF93YXJuOwogIHZhciB2YWx1ZSA9IGRpci52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVyczsKICB2YXIgdGFnID0gZWwudGFnOwogIHZhciB0eXBlID0gZWwuYXR0cnNNYXAudHlwZTsKCiAgewogICAgLy8gaW5wdXRzIHdpdGggdHlwZT0iZmlsZSIgYXJlIHJlYWQgb25seSBhbmQgc2V0dGluZyB0aGUgaW5wdXQncwogICAgLy8gdmFsdWUgd2lsbCB0aHJvdyBhbiBlcnJvci4KICAgIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2ZpbGUnKSB7CiAgICAgIHdhcm4kMSgKICAgICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIiB0eXBlPVwiZmlsZVwiPjpcbiIgKwogICAgICAgICJGaWxlIGlucHV0cyBhcmUgcmVhZCBvbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLiIKICAgICAgKTsKICAgIH0KICB9CgogIGlmIChlbC5jb21wb25lbnQpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgIGdlblNlbGVjdChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2NoZWNrYm94JykgewogICAgZ2VuQ2hlY2tib3hNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ3JhZGlvJykgewogICAgZ2VuUmFkaW9Nb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7CiAgICBnZW5EZWZhdWx0TW9kZWwoZWwsIHZhbHVlLCBtb2RpZmllcnMpOwogIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgewogICAgd2FybiQxKAogICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIj46ICIgKwogICAgICAidi1tb2RlbCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZWxlbWVudCB0eXBlLiAiICsKICAgICAgJ0lmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbnRlbnRlZGl0YWJsZSwgaXRcJ3MgcmVjb21tZW5kZWQgdG8gJyArCiAgICAgICd3cmFwIGEgbGlicmFyeSBkZWRpY2F0ZWQgZm9yIHRoYXQgcHVycG9zZSBpbnNpZGUgYSBjdXN0b20gY29tcG9uZW50LicKICAgICk7CiAgfQoKICAvLyBlbnN1cmUgcnVudGltZSBkaXJlY3RpdmUgbWV0YWRhdGEKICByZXR1cm4gdHJ1ZQp9CgpmdW5jdGlvbiBnZW5DaGVja2JveE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciB2YWx1ZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3ZhbHVlJykgfHwgJ251bGwnOwogIHZhciB0cnVlVmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICd0cnVlLXZhbHVlJykgfHwgJ3RydWUnOwogIHZhciBmYWxzZVZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnZmFsc2UtdmFsdWUnKSB8fCAnZmFsc2UnOwogIGFkZFByb3AoZWwsICdjaGVja2VkJywKICAgICJBcnJheS5pc0FycmF5KCIgKyB2YWx1ZSArICIpIiArCiAgICAiP19pKCIgKyB2YWx1ZSArICIsIiArIHZhbHVlQmluZGluZyArICIpPi0xIiArICgKICAgICAgdHJ1ZVZhbHVlQmluZGluZyA9PT0gJ3RydWUnCiAgICAgICAgPyAoIjooIiArIHZhbHVlICsgIikiKQogICAgICAgIDogKCI6X3EoIiArIHZhbHVlICsgIiwiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpIikKICAgICkKICApOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLAogICAgInZhciAkJGE9IiArIHZhbHVlICsgIiwiICsKICAgICAgICAnJCRlbD0kZXZlbnQudGFyZ2V0LCcgKwogICAgICAgICIkJGM9JCRlbC5jaGVja2VkPygiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpOigiICsgZmFsc2VWYWx1ZUJpbmRpbmcgKyAiKTsiICsKICAgICdpZihBcnJheS5pc0FycmF5KCQkYSkpeycgKwogICAgICAidmFyICQkdj0iICsgKG51bWJlciA/ICdfbignICsgdmFsdWVCaW5kaW5nICsgJyknIDogdmFsdWVCaW5kaW5nKSArICIsIiArCiAgICAgICAgICAnJCRpPV9pKCQkYSwkJHYpOycgKwogICAgICAiaWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIgKyAoZ2VuQXNzaWdubWVudENvZGUodmFsdWUsICckJGEuY29uY2F0KFskJHZdKScpKSArICIpfSIgKwogICAgICAiZWxzZXskJGk+LTEmJigiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSknKSkgKyAiKX0iICsKICAgICJ9ZWxzZXsiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRjJykpICsgIn0iLAogICAgbnVsbCwgdHJ1ZQogICk7Cn0KCmZ1bmN0aW9uIGdlblJhZGlvTW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgbnVtYmVyID0gbW9kaWZpZXJzICYmIG1vZGlmaWVycy5udW1iZXI7CiAgdmFyIHZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKSB8fCAnbnVsbCc7CiAgdmFsdWVCaW5kaW5nID0gbnVtYmVyID8gKCJfbigiICsgdmFsdWVCaW5kaW5nICsgIikiKSA6IHZhbHVlQmluZGluZzsKICBhZGRQcm9wKGVsLCAnY2hlY2tlZCcsICgiX3EoIiArIHZhbHVlICsgIiwiICsgdmFsdWVCaW5kaW5nICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsIGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCB2YWx1ZUJpbmRpbmcpLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuU2VsZWN0ICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciBzZWxlY3RlZFZhbCA9ICJBcnJheS5wcm90b3R5cGUuZmlsdGVyIiArCiAgICAiLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLGZ1bmN0aW9uKG8pe3JldHVybiBvLnNlbGVjdGVkfSkiICsKICAgICIubWFwKGZ1bmN0aW9uKG8pe3ZhciB2YWwgPSBcIl92YWx1ZVwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7IiArCiAgICAicmV0dXJuICIgKyAobnVtYmVyID8gJ19uKHZhbCknIDogJ3ZhbCcpICsgIn0pIjsKCiAgdmFyIGFzc2lnbm1lbnQgPSAnJGV2ZW50LnRhcmdldC5tdWx0aXBsZSA/ICQkc2VsZWN0ZWRWYWwgOiAkJHNlbGVjdGVkVmFsWzBdJzsKICB2YXIgY29kZSA9ICJ2YXIgJCRzZWxlY3RlZFZhbCA9ICIgKyBzZWxlY3RlZFZhbCArICI7IjsKICBjb2RlID0gY29kZSArICIgIiArIChnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgYXNzaWdubWVudCkpOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLCBjb2RlLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuRGVmYXVsdE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIHR5cGUgPSBlbC5hdHRyc01hcC50eXBlOwoKICAvLyB3YXJuIGlmIHYtYmluZDp2YWx1ZSBjb25mbGljdHMgd2l0aCB2LW1vZGVsCiAgLy8gZXhjZXB0IGZvciBpbnB1dHMgd2l0aCB2LWJpbmQ6dHlwZQogIHsKICAgIHZhciB2YWx1ZSQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddIHx8IGVsLmF0dHJzTWFwWyc6dmFsdWUnXTsKICAgIHZhciB0eXBlQmluZGluZyA9IGVsLmF0dHJzTWFwWyd2LWJpbmQ6dHlwZSddIHx8IGVsLmF0dHJzTWFwWyc6dHlwZSddOwogICAgaWYgKHZhbHVlJDEgJiYgIXR5cGVCaW5kaW5nKSB7CiAgICAgIHZhciBiaW5kaW5nID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddID8gJ3YtYmluZDp2YWx1ZScgOiAnOnZhbHVlJzsKICAgICAgd2FybiQxKAogICAgICAgIGJpbmRpbmcgKyAiPVwiIiArIHZhbHVlJDEgKyAiXCIgY29uZmxpY3RzIHdpdGggdi1tb2RlbCBvbiB0aGUgc2FtZSBlbGVtZW50ICIgKwogICAgICAgICdiZWNhdXNlIHRoZSBsYXR0ZXIgYWxyZWFkeSBleHBhbmRzIHRvIGEgdmFsdWUgYmluZGluZyBpbnRlcm5hbGx5JwogICAgICApOwogICAgfQogIH0KCiAgdmFyIHJlZiA9IG1vZGlmaWVycyB8fCB7fTsKICB2YXIgbGF6eSA9IHJlZi5sYXp5OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CiAgdmFyIG5lZWRDb21wb3NpdGlvbkd1YXJkID0gIWxhenkgJiYgdHlwZSAhPT0gJ3JhbmdlJzsKICB2YXIgZXZlbnQgPSBsYXp5CiAgICA/ICdjaGFuZ2UnCiAgICA6IHR5cGUgPT09ICdyYW5nZScKICAgICAgPyBSQU5HRV9UT0tFTgogICAgICA6ICdpbnB1dCc7CgogIHZhciB2YWx1ZUV4cHJlc3Npb24gPSAnJGV2ZW50LnRhcmdldC52YWx1ZSc7CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKSI7CiAgfQogIGlmIChudW1iZXIpIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICJfbigiICsgdmFsdWVFeHByZXNzaW9uICsgIikiOwogIH0KCiAgdmFyIGNvZGUgPSBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgdmFsdWVFeHByZXNzaW9uKTsKICBpZiAobmVlZENvbXBvc2l0aW9uR3VhcmQpIHsKICAgIGNvZGUgPSAiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIgKyBjb2RlOwogIH0KCiAgYWRkUHJvcChlbCwgJ3ZhbHVlJywgKCIoIiArIHZhbHVlICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgZXZlbnQsIGNvZGUsIG51bGwsIHRydWUpOwogIGlmICh0cmltIHx8IG51bWJlcikgewogICAgYWRkSGFuZGxlcihlbCwgJ2JsdXInLCAnJGZvcmNlVXBkYXRlKCknKTsKICB9Cn0KCi8qICAqLwoKLy8gbm9ybWFsaXplIHYtbW9kZWwgZXZlbnQgdG9rZW5zIHRoYXQgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLgovLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlCi8vIHRoZSB3aG9sZSBwb2ludCBpcyBlbnN1cmluZyB0aGUgdi1tb2RlbCBjYWxsYmFjayBnZXRzIGNhbGxlZCBiZWZvcmUKLy8gdXNlci1hdHRhY2hlZCBoYW5kbGVycy4KZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltSQU5HRV9UT0tFTl0pKSB7CiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50CiAgICB2YXIgZXZlbnQgPSBpc0lFID8gJ2NoYW5nZScgOiAnaW5wdXQnOwogICAgb25bZXZlbnRdID0gW10uY29uY2F0KG9uW1JBTkdFX1RPS0VOXSwgb25bZXZlbnRdIHx8IFtdKTsKICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07CiAgfQogIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gZml4ICM0NTIxIGJ1dCBubyBsb25nZXIgbmVjZXNzYXJ5CiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltDSEVDS0JPWF9SQURJT19UT0tFTl0pKSB7CiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pOwogICAgZGVsZXRlIG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXTsKICB9Cn0KCnZhciB0YXJnZXQkMTsKCmZ1bmN0aW9uIGNyZWF0ZU9uY2VIYW5kbGVyIChoYW5kbGVyLCBldmVudCwgY2FwdHVyZSkgewogIHZhciBfdGFyZ2V0ID0gdGFyZ2V0JDE7IC8vIHNhdmUgY3VycmVudCB0YXJnZXQgZWxlbWVudCBpbiBjbG9zdXJlCiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHsKICAgIHZhciByZXMgPSBoYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzICE9PSBudWxsKSB7CiAgICAgIHJlbW92ZSQyKGV2ZW50LCBvbmNlSGFuZGxlciwgY2FwdHVyZSwgX3RhcmdldCk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBhZGQkMSAoCiAgZXZlbnQsCiAgaGFuZGxlciwKICBvbmNlJCQxLAogIGNhcHR1cmUsCiAgcGFzc2l2ZQopIHsKICBoYW5kbGVyID0gd2l0aE1hY3JvVGFzayhoYW5kbGVyKTsKICBpZiAob25jZSQkMSkgeyBoYW5kbGVyID0gY3JlYXRlT25jZUhhbmRsZXIoaGFuZGxlciwgZXZlbnQsIGNhcHR1cmUpOyB9CiAgdGFyZ2V0JDEuYWRkRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlciwKICAgIHN1cHBvcnRzUGFzc2l2ZQogICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9CiAgICAgIDogY2FwdHVyZQogICk7Cn0KCmZ1bmN0aW9uIHJlbW92ZSQyICgKICBldmVudCwKICBoYW5kbGVyLAogIGNhcHR1cmUsCiAgX3RhcmdldAopIHsKICAoX3RhcmdldCB8fCB0YXJnZXQkMSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlci5fd2l0aFRhc2sgfHwgaGFuZGxlciwKICAgIGNhcHR1cmUKICApOwp9CgpmdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEub24pICYmIGlzVW5kZWYodm5vZGUuZGF0YS5vbikpIHsKICAgIHJldHVybgogIH0KICB2YXIgb24gPSB2bm9kZS5kYXRhLm9uIHx8IHt9OwogIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307CiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07CiAgbm9ybWFsaXplRXZlbnRzKG9uKTsKICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpOwogIHRhcmdldCQxID0gdW5kZWZpbmVkOwp9Cgp2YXIgZXZlbnRzID0gewogIGNyZWF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzLAogIHVwZGF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlRE9NUHJvcHMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuZG9tUHJvcHMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5kb21Qcm9wcykpIHsKICAgIHJldHVybgogIH0KICB2YXIga2V5LCBjdXI7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkUHJvcHMgPSBvbGRWbm9kZS5kYXRhLmRvbVByb3BzIHx8IHt9OwogIHZhciBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKHByb3BzLl9fb2JfXykpIHsKICAgIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHMpOwogIH0KCiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHsKICAgIGlmIChpc1VuZGVmKHByb3BzW2tleV0pKSB7CiAgICAgIGVsbVtrZXldID0gJyc7CiAgICB9CiAgfQogIGZvciAoa2V5IGluIHByb3BzKSB7CiAgICBjdXIgPSBwcm9wc1trZXldOwogICAgLy8gaWdub3JlIGNoaWxkcmVuIGlmIHRoZSBub2RlIGhhcyB0ZXh0Q29udGVudCBvciBpbm5lckhUTUwsCiAgICAvLyBhcyB0aGVzZSB3aWxsIHRocm93IGF3YXkgZXhpc3RpbmcgRE9NIG5vZGVzIGFuZCBjYXVzZSByZW1vdmFsIGVycm9ycwogICAgLy8gb24gc3Vic2VxdWVudCBwYXRjaGVzICgjMzM2MCkKICAgIGlmIChrZXkgPT09ICd0ZXh0Q29udGVudCcgfHwga2V5ID09PSAnaW5uZXJIVE1MJykgewogICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHsgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID0gMDsgfQogICAgICBpZiAoY3VyID09PSBvbGRQcm9wc1trZXldKSB7IGNvbnRpbnVlIH0KICAgICAgLy8gIzY2MDEgd29yayBhcm91bmQgQ2hyb21lIHZlcnNpb24gPD0gNTUgYnVnIHdoZXJlIHNpbmdsZSB0ZXh0Tm9kZQogICAgICAvLyByZXBsYWNlZCBieSBpbm5lckhUTUwvdGV4dENvbnRlbnQgcmV0YWlucyBpdHMgcGFyZW50Tm9kZSBwcm9wZXJ0eQogICAgICBpZiAoZWxtLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5jaGlsZE5vZGVzWzBdKTsKICAgICAgfQogICAgfQoKICAgIGlmIChrZXkgPT09ICd2YWx1ZScpIHsKICAgICAgLy8gc3RvcmUgdmFsdWUgYXMgX3ZhbHVlIGFzIHdlbGwgc2luY2UKICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZAogICAgICBlbG0uX3ZhbHVlID0gY3VyOwogICAgICAvLyBhdm9pZCByZXNldHRpbmcgY3Vyc29yIHBvc2l0aW9uIHdoZW4gdmFsdWUgaXMgdGhlIHNhbWUKICAgICAgdmFyIHN0ckN1ciA9IGlzVW5kZWYoY3VyKSA/ICcnIDogU3RyaW5nKGN1cik7CiAgICAgIGlmIChzaG91bGRVcGRhdGVWYWx1ZShlbG0sIHN0ckN1cikpIHsKICAgICAgICBlbG0udmFsdWUgPSBzdHJDdXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVsbVtrZXldID0gY3VyOwogICAgfQogIH0KfQoKLy8gY2hlY2sgcGxhdGZvcm1zL3dlYi91dGlsL2F0dHJzLmpzIGFjY2VwdFZhbHVlCgoKZnVuY3Rpb24gc2hvdWxkVXBkYXRlVmFsdWUgKGVsbSwgY2hlY2tWYWwpIHsKICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmICgKICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fAogICAgaXNOb3RJbkZvY3VzQW5kRGlydHkoZWxtLCBjaGVja1ZhbCkgfHwKICAgIGlzRGlydHlXaXRoTW9kaWZpZXJzKGVsbSwgY2hlY2tWYWwpCiAgKSkKfQoKZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHsKICAvLyByZXR1cm4gdHJ1ZSB3aGVuIHRleHRib3ggKC5udW1iZXIgYW5kIC50cmltKSBsb3NlcyBmb2N1cyBhbmQgaXRzIHZhbHVlIGlzCiAgLy8gbm90IGVxdWFsIHRvIHRoZSB1cGRhdGVkIHZhbHVlCiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlOwogIC8vICM2MTU3CiAgLy8gd29yayBhcm91bmQgSUUgYnVnIHdoZW4gYWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW4gYW4gaWZyYW1lCiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge30KICByZXR1cm4gbm90SW5Gb2N1cyAmJiBlbG0udmFsdWUgIT09IGNoZWNrVmFsCn0KCmZ1bmN0aW9uIGlzRGlydHlXaXRoTW9kaWZpZXJzIChlbG0sIG5ld1ZhbCkgewogIHZhciB2YWx1ZSA9IGVsbS52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWUKICBpZiAoaXNEZWYobW9kaWZpZXJzKSkgewogICAgaWYgKG1vZGlmaWVycy5sYXp5KSB7CiAgICAgIC8vIGlucHV0cyB3aXRoIGxhenkgc2hvdWxkIG9ubHkgYmUgdXBkYXRlZCB3aGVuIG5vdCBpbiBmb2N1cwogICAgICByZXR1cm4gZmFsc2UKICAgIH0KICAgIGlmIChtb2RpZmllcnMubnVtYmVyKSB7CiAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgIT09IHRvTnVtYmVyKG5ld1ZhbCkKICAgIH0KICAgIGlmIChtb2RpZmllcnMudHJpbSkgewogICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSBuZXdWYWwudHJpbSgpCiAgICB9CiAgfQogIHJldHVybiB2YWx1ZSAhPT0gbmV3VmFsCn0KCnZhciBkb21Qcm9wcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLAogIHVwZGF0ZTogdXBkYXRlRE9NUHJvcHMKfQoKLyogICovCgp2YXIgcGFyc2VTdHlsZVRleHQgPSBjYWNoZWQoZnVuY3Rpb24gKGNzc1RleHQpIHsKICB2YXIgcmVzID0ge307CiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXCkpL2c7CiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLzsKICBjc3NUZXh0LnNwbGl0KGxpc3REZWxpbWl0ZXIpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmIChpdGVtKSB7CiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTsKICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJlc1t0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpOwogICAgfQogIH0pOwogIHJldHVybiByZXMKfSk7CgovLyBtZXJnZSBzdGF0aWMgYW5kIGR5bmFtaWMgc3R5bGUgZGF0YSBvbiB0aGUgc2FtZSB2bm9kZQpmdW5jdGlvbiBub3JtYWxpemVTdHlsZURhdGEgKGRhdGEpIHsKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZGF0YS5zdHlsZSk7CiAgLy8gc3RhdGljIHN0eWxlIGlzIHByZS1wcm9jZXNzZWQgaW50byBhbiBvYmplY3QgZHVyaW5nIGNvbXBpbGF0aW9uCiAgLy8gYW5kIGlzIGFsd2F5cyBhIGZyZXNoIG9iamVjdCwgc28gaXQncyBzYWZlIHRvIG1lcmdlIGludG8gaXQKICByZXR1cm4gZGF0YS5zdGF0aWNTdHlsZQogICAgPyBleHRlbmQoZGF0YS5zdGF0aWNTdHlsZSwgc3R5bGUpCiAgICA6IHN0eWxlCn0KCi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3QKZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHsKICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nU3R5bGUpKSB7CiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKQogIH0KICBpZiAodHlwZW9mIGJpbmRpbmdTdHlsZSA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpCiAgfQogIHJldHVybiBiaW5kaW5nU3R5bGUKfQoKLyoqCiAqIHBhcmVudCBjb21wb25lbnQgc3R5bGUgc2hvdWxkIGJlIGFmdGVyIGNoaWxkJ3MKICogc28gdGhhdCBwYXJlbnQgY29tcG9uZW50J3Mgc3R5bGUgY291bGQgb3ZlcnJpZGUgaXQKICovCmZ1bmN0aW9uIGdldFN0eWxlICh2bm9kZSwgY2hlY2tDaGlsZCkgewogIHZhciByZXMgPSB7fTsKICB2YXIgc3R5bGVEYXRhOwoKICBpZiAoY2hlY2tDaGlsZCkgewogICAgdmFyIGNoaWxkTm9kZSA9IHZub2RlOwogICAgd2hpbGUgKGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZSkgewogICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlOwogICAgICBpZiAoCiAgICAgICAgY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhICYmCiAgICAgICAgKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YShjaGlsZE5vZGUuZGF0YSkpCiAgICAgICkgewogICAgICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICgoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHZub2RlLmRhdGEpKSkgewogICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICB9CgogIHZhciBwYXJlbnROb2RlID0gdm5vZGU7CiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7CiAgICBpZiAocGFyZW50Tm9kZS5kYXRhICYmIChzdHlsZURhdGEgPSBub3JtYWxpemVTdHlsZURhdGEocGFyZW50Tm9kZS5kYXRhKSkpIHsKICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCnZhciBjc3NWYXJSRSA9IC9eLS0vOwp2YXIgaW1wb3J0YW50UkUgPSAvXHMqIWltcG9ydGFudCQvOwp2YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGNzc1ZhclJFLnRlc3QobmFtZSkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7CiAgfSBlbHNlIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCAnJyksICdpbXBvcnRhbnQnKTsKICB9IGVsc2UgewogICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplKG5hbWUpOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAvLyBTdXBwb3J0IHZhbHVlcyBhcnJheSBjcmVhdGVkIGJ5IGF1dG9wcmVmaXhlciwgZS5nLgogICAgICAvLyB7ZGlzcGxheTogWyItd2Via2l0LWJveCIsICItbXMtZmxleGJveCIsICJmbGV4Il19CiAgICAgIC8vIFNldCB0aGVtIG9uZSBieSBvbmUsIGFuZCB0aGUgYnJvd3NlciB3aWxsIG9ubHkgc2V0IHRob3NlIGl0IGNhbiByZWNvZ25pemUKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbC5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbFtpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsOwogICAgfQogIH0KfTsKCnZhciB2ZW5kb3JOYW1lcyA9IFsnV2Via2l0JywgJ01veicsICdtcyddOwoKdmFyIGVtcHR5U3R5bGU7CnZhciBub3JtYWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHByb3ApIHsKICBlbXB0eVN0eWxlID0gZW1wdHlTdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKICBwcm9wID0gY2FtZWxpemUocHJvcCk7CiAgaWYgKHByb3AgIT09ICdmaWx0ZXInICYmIChwcm9wIGluIGVtcHR5U3R5bGUpKSB7CiAgICByZXR1cm4gcHJvcAogIH0KICB2YXIgY2FwTmFtZSA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBuYW1lID0gdmVuZG9yTmFtZXNbaV0gKyBjYXBOYW1lOwogICAgaWYgKG5hbWUgaW4gZW1wdHlTdHlsZSkgewogICAgICByZXR1cm4gbmFtZQogICAgfQogIH0KfSk7CgpmdW5jdGlvbiB1cGRhdGVTdHlsZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTsKCiAgaWYgKGlzVW5kZWYoZGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihkYXRhLnN0eWxlKSAmJgogICAgaXNVbmRlZihvbGREYXRhLnN0YXRpY1N0eWxlKSAmJiBpc1VuZGVmKG9sZERhdGEuc3R5bGUpCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjdXIsIG5hbWU7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwogIHZhciBvbGRTdGF0aWNTdHlsZSA9IG9sZERhdGEuc3RhdGljU3R5bGU7CiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZERhdGEubm9ybWFsaXplZFN0eWxlIHx8IG9sZERhdGEuc3R5bGUgfHwge307CgogIC8vIGlmIHN0YXRpYyBzdHlsZSBleGlzdHMsIHN0eWxlYmluZGluZyBhbHJlYWR5IG1lcmdlZCBpbnRvIGl0IHdoZW4gZG9pbmcgbm9ybWFsaXplU3R5bGVEYXRhCiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nOwoKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcodm5vZGUuZGF0YS5zdHlsZSkgfHwge307CgogIC8vIHN0b3JlIG5vcm1hbGl6ZWQgc3R5bGUgdW5kZXIgYSBkaWZmZXJlbnQga2V5IGZvciBuZXh0IGRpZmYKICAvLyBtYWtlIHN1cmUgdG8gY2xvbmUgaXQgaWYgaXQncyByZWFjdGl2ZSwgc2luY2UgdGhlIHVzZXIgbGlrZWx5IHdhbnRzCiAgLy8gdG8gbXV0YXRlIGl0LgogIHZub2RlLmRhdGEubm9ybWFsaXplZFN0eWxlID0gaXNEZWYoc3R5bGUuX19vYl9fKQogICAgPyBleHRlbmQoe30sIHN0eWxlKQogICAgOiBzdHlsZTsKCiAgdmFyIG5ld1N0eWxlID0gZ2V0U3R5bGUodm5vZGUsIHRydWUpOwoKICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHsKICAgIGlmIChpc1VuZGVmKG5ld1N0eWxlW25hbWVdKSkgewogICAgICBzZXRQcm9wKGVsLCBuYW1lLCAnJyk7CiAgICB9CiAgfQogIGZvciAobmFtZSBpbiBuZXdTdHlsZSkgewogICAgY3VyID0gbmV3U3R5bGVbbmFtZV07CiAgICBpZiAoY3VyICE9PSBvbGRTdHlsZVtuYW1lXSkgewogICAgICAvLyBpZTkgc2V0dGluZyB0byBudWxsIGhhcyBubyBlZmZlY3QsIG11c3QgdXNlIGVtcHR5IHN0cmluZwogICAgICBzZXRQcm9wKGVsLCBuYW1lLCBjdXIgPT0gbnVsbCA/ICcnIDogY3VyKTsKICAgIH0KICB9Cn0KCnZhciBzdHlsZSA9IHsKICBjcmVhdGU6IHVwZGF0ZVN0eWxlLAogIHVwZGF0ZTogdXBkYXRlU3R5bGUKfQoKLyogICovCgovKioKICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gYWRkQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbHMpOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgY3VyID0gIiAiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAiICI7CiAgICBpZiAoY3VyLmluZGV4T2YoJyAnICsgY2xzICsgJyAnKSA8IDApIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIChjdXIgKyBjbHMpLnRyaW0oKSk7CiAgICB9CiAgfQp9CgovKioKICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gcmVtb3ZlQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbHMpOwogICAgfQogICAgaWYgKCFlbC5jbGFzc0xpc3QubGVuZ3RoKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgIH0KICB9IGVsc2UgewogICAgdmFyIGN1ciA9ICIgIiArIChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiOwogICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJzsKICAgIHdoaWxlIChjdXIuaW5kZXhPZih0YXIpID49IDApIHsKICAgICAgY3VyID0gY3VyLnJlcGxhY2UodGFyLCAnICcpOwogICAgfQogICAgY3VyID0gY3VyLnRyaW0oKTsKICAgIGlmIChjdXIpIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGN1cik7CiAgICB9IGVsc2UgewogICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uIChkZWYpIHsKICBpZiAoIWRlZikgewogICAgcmV0dXJuCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKHR5cGVvZiBkZWYgPT09ICdvYmplY3QnKSB7CiAgICB2YXIgcmVzID0ge307CiAgICBpZiAoZGVmLmNzcyAhPT0gZmFsc2UpIHsKICAgICAgZXh0ZW5kKHJlcywgYXV0b0Nzc1RyYW5zaXRpb24oZGVmLm5hbWUgfHwgJ3YnKSk7CiAgICB9CiAgICBleHRlbmQocmVzLCBkZWYpOwogICAgcmV0dXJuIHJlcwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZiA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYpCiAgfQp9Cgp2YXIgYXV0b0Nzc1RyYW5zaXRpb24gPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHsKICByZXR1cm4gewogICAgZW50ZXJDbGFzczogKG5hbWUgKyAiLWVudGVyIiksCiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgIi1lbnRlci10byIpLAogICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyAiLWVudGVyLWFjdGl2ZSIpLAogICAgbGVhdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlIiksCiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgIi1sZWF2ZS10byIpLAogICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlLWFjdGl2ZSIpCiAgfQp9KTsKCnZhciBoYXNUcmFuc2l0aW9uID0gaW5Ccm93c2VyICYmICFpc0lFOTsKdmFyIFRSQU5TSVRJT04gPSAndHJhbnNpdGlvbic7CnZhciBBTklNQVRJT04gPSAnYW5pbWF0aW9uJzsKCi8vIFRyYW5zaXRpb24gcHJvcGVydHkvZXZlbnQgc25pZmZpbmcKdmFyIHRyYW5zaXRpb25Qcm9wID0gJ3RyYW5zaXRpb24nOwp2YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3RyYW5zaXRpb25lbmQnOwp2YXIgYW5pbWF0aW9uUHJvcCA9ICdhbmltYXRpb24nOwp2YXIgYW5pbWF0aW9uRW5kRXZlbnQgPSAnYW5pbWF0aW9uZW5kJzsKaWYgKGhhc1RyYW5zaXRpb24pIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAod2luZG93Lm9udHJhbnNpdGlvbmVuZCA9PT0gdW5kZWZpbmVkICYmCiAgICB3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kICE9PSB1bmRlZmluZWQKICApIHsKICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nOwogICAgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnOwogIH0KICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiYKICAgIHdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCAhPT0gdW5kZWZpbmVkCiAgKSB7CiAgICBhbmltYXRpb25Qcm9wID0gJ1dlYmtpdEFuaW1hdGlvbic7CiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnOwogIH0KfQoKLy8gYmluZGluZyB0byB3aW5kb3cgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaG90IHJlbG9hZCB3b3JrIGluIElFIGluIHN0cmljdCBtb2RlCnZhciByYWYgPSBpbkJyb3dzZXIKICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUKICAgID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykKICAgIDogc2V0VGltZW91dAogIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9OwoKZnVuY3Rpb24gbmV4dEZyYW1lIChmbikgewogIHJhZihmdW5jdGlvbiAoKSB7CiAgICByYWYoZm4pOwogIH0pOwp9CgpmdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICB2YXIgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXMgfHwgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcyA9IFtdKTsKICBpZiAodHJhbnNpdGlvbkNsYXNzZXMuaW5kZXhPZihjbHMpIDwgMCkgewogICAgdHJhbnNpdGlvbkNsYXNzZXMucHVzaChjbHMpOwogICAgYWRkQ2xhc3MoZWwsIGNscyk7CiAgfQp9CgpmdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7CiAgICByZW1vdmUoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpOwogIH0KICByZW1vdmVDbGFzcyhlbCwgY2xzKTsKfQoKZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzICgKICBlbCwKICBleHBlY3RlZFR5cGUsCiAgY2IKKSB7CiAgdmFyIHJlZiA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpOwogIHZhciB0eXBlID0gcmVmLnR5cGU7CiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDsKICB2YXIgcHJvcENvdW50ID0gcmVmLnByb3BDb3VudDsKICBpZiAoIXR5cGUpIHsgcmV0dXJuIGNiKCkgfQogIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDsKICB2YXIgZW5kZWQgPSAwOwogIHZhciBlbmQgPSBmdW5jdGlvbiAoKSB7CiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7CiAgICBjYigpOwogIH07CiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHsKICAgIGlmIChlLnRhcmdldCA9PT0gZWwpIHsKICAgICAgaWYgKCsrZW5kZWQgPj0gcHJvcENvdW50KSB7CiAgICAgICAgZW5kKCk7CiAgICAgIH0KICAgIH0KICB9OwogIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7CiAgICAgIGVuZCgpOwogICAgfQogIH0sIHRpbWVvdXQgKyAxKTsKICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7Cn0KCnZhciB0cmFuc2Zvcm1SRSA9IC9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLzsKCmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvIChlbCwgZXhwZWN0ZWRUeXBlKSB7CiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTsKICB2YXIgdHJhbnNpdGlvbkRlbGF5cyA9IHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEZWxheSddLnNwbGl0KCcsICcpOwogIHZhciB0cmFuc2l0aW9uRHVyYXRpb25zID0gc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7CiAgdmFyIHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTsKICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uRHVyYXRpb25zID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRHVyYXRpb24nXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpOwoKICB2YXIgdHlwZTsKICB2YXIgdGltZW91dCA9IDA7CiAgdmFyIHByb3BDb3VudCA9IDA7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gVFJBTlNJVElPTikgewogICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkgewogICAgICB0eXBlID0gVFJBTlNJVElPTjsKICAgICAgdGltZW91dCA9IHRyYW5zaXRpb25UaW1lb3V0OwogICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDsKICAgIH0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gQU5JTUFUSU9OKSB7CiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHsKICAgICAgdHlwZSA9IEFOSU1BVElPTjsKICAgICAgdGltZW91dCA9IGFuaW1hdGlvblRpbWVvdXQ7CiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7CiAgICB9CiAgfSBlbHNlIHsKICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7CiAgICB0eXBlID0gdGltZW91dCA+IDAKICAgICAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQKICAgICAgICA/IFRSQU5TSVRJT04KICAgICAgICA6IEFOSU1BVElPTgogICAgICA6IG51bGw7CiAgICBwcm9wQ291bnQgPSB0eXBlCiAgICAgID8gdHlwZSA9PT0gVFJBTlNJVElPTgogICAgICAgID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgOiAwOwogIH0KICB2YXIgaGFzVHJhbnNmb3JtID0KICAgIHR5cGUgPT09IFRSQU5TSVRJT04gJiYKICAgIHRyYW5zZm9ybVJFLnRlc3Qoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ1Byb3BlcnR5J10pOwogIHJldHVybiB7CiAgICB0eXBlOiB0eXBlLAogICAgdGltZW91dDogdGltZW91dCwKICAgIHByb3BDb3VudDogcHJvcENvdW50LAogICAgaGFzVHJhbnNmb3JtOiBoYXNUcmFuc2Zvcm0KICB9Cn0KCmZ1bmN0aW9uIGdldFRpbWVvdXQgKGRlbGF5cywgZHVyYXRpb25zKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICB3aGlsZSAoZGVsYXlzLmxlbmd0aCA8IGR1cmF0aW9ucy5sZW5ndGgpIHsKICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTsKICB9CgogIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBkdXJhdGlvbnMubWFwKGZ1bmN0aW9uIChkLCBpKSB7CiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKQogIH0pKQp9CgpmdW5jdGlvbiB0b01zIChzKSB7CiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKSkgKiAxMDAwCn0KCi8qICAqLwoKZnVuY3Rpb24gZW50ZXIgKHZub2RlLCB0b2dnbGVEaXNwbGF5KSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHsKICAgIGVsLl9sZWF2ZUNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fbGVhdmVDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsKICAgIHJldHVybgogIH0KCiAgdmFyIGNzcyA9IGRhdGEuY3NzOwogIHZhciB0eXBlID0gZGF0YS50eXBlOwogIHZhciBlbnRlckNsYXNzID0gZGF0YS5lbnRlckNsYXNzOwogIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzczsKICB2YXIgZW50ZXJBY3RpdmVDbGFzcyA9IGRhdGEuZW50ZXJBY3RpdmVDbGFzczsKICB2YXIgYXBwZWFyQ2xhc3MgPSBkYXRhLmFwcGVhckNsYXNzOwogIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzOwogIHZhciBhcHBlYXJBY3RpdmVDbGFzcyA9IGRhdGEuYXBwZWFyQWN0aXZlQ2xhc3M7CiAgdmFyIGJlZm9yZUVudGVyID0gZGF0YS5iZWZvcmVFbnRlcjsKICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyOwogIHZhciBhZnRlckVudGVyID0gZGF0YS5hZnRlckVudGVyOwogIHZhciBlbnRlckNhbmNlbGxlZCA9IGRhdGEuZW50ZXJDYW5jZWxsZWQ7CiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyOwogIHZhciBhcHBlYXIgPSBkYXRhLmFwcGVhcjsKICB2YXIgYWZ0ZXJBcHBlYXIgPSBkYXRhLmFmdGVyQXBwZWFyOwogIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDsKICB2YXIgZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uOwoKICAvLyBhY3RpdmVJbnN0YW5jZSB3aWxsIGFsd2F5cyBiZSB0aGUgPHRyYW5zaXRpb24+IGNvbXBvbmVudCBtYW5hZ2luZyB0aGlzCiAgLy8gdHJhbnNpdGlvbi4gT25lIGVkZ2UgY2FzZSB0byBjaGVjayBpcyB3aGVuIHRoZSA8dHJhbnNpdGlvbj4gaXMgcGxhY2VkCiAgLy8gYXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNoaWxkIGNvbXBvbmVudC4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY2hlY2sKICAvLyA8dHJhbnNpdGlvbj4ncyBwYXJlbnQgZm9yIGFwcGVhciBjaGVjay4KICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlOwogIHZhciB0cmFuc2l0aW9uTm9kZSA9IGFjdGl2ZUluc3RhbmNlLiR2bm9kZTsKICB3aGlsZSAodHJhbnNpdGlvbk5vZGUgJiYgdHJhbnNpdGlvbk5vZGUucGFyZW50KSB7CiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDsKICAgIGNvbnRleHQgPSB0cmFuc2l0aW9uTm9kZS5jb250ZXh0OwogIH0KCiAgdmFyIGlzQXBwZWFyID0gIWNvbnRleHQuX2lzTW91bnRlZCB8fCAhdm5vZGUuaXNSb290SW5zZXJ0OwoKICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBzdGFydENsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyQ2xhc3MKICAgID8gYXBwZWFyQ2xhc3MKICAgIDogZW50ZXJDbGFzczsKICB2YXIgYWN0aXZlQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJBY3RpdmVDbGFzcwogICAgPyBhcHBlYXJBY3RpdmVDbGFzcwogICAgOiBlbnRlckFjdGl2ZUNsYXNzOwogIHZhciB0b0NsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyVG9DbGFzcwogICAgPyBhcHBlYXJUb0NsYXNzCiAgICA6IGVudGVyVG9DbGFzczsKCiAgdmFyIGJlZm9yZUVudGVySG9vayA9IGlzQXBwZWFyCiAgICA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpCiAgICA6IGJlZm9yZUVudGVyOwogIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAodHlwZW9mIGFwcGVhciA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGVhciA6IGVudGVyKQogICAgOiBlbnRlcjsKICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAoYWZ0ZXJBcHBlYXIgfHwgYWZ0ZXJFbnRlcikKICAgIDogYWZ0ZXJFbnRlcjsKICB2YXIgZW50ZXJDYW5jZWxsZWRIb29rID0gaXNBcHBlYXIKICAgID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkKICAgIDogZW50ZXJDYW5jZWxsZWQ7CgogIHZhciBleHBsaWNpdEVudGVyRHVyYXRpb24gPSB0b051bWJlcigKICAgIGlzT2JqZWN0KGR1cmF0aW9uKQogICAgICA/IGR1cmF0aW9uLmVudGVyCiAgICAgIDogZHVyYXRpb24KICApOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV4cGxpY2l0RW50ZXJEdXJhdGlvbiAhPSBudWxsKSB7CiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbiwgJ2VudGVyJywgdm5vZGUpOwogIH0KCiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTsKICB2YXIgdXNlcldhbnRzQ29udHJvbCA9IGdldEhvb2tBcmd1bWVudHNMZW5ndGgoZW50ZXJIb29rKTsKCiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHsKICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgdG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgfQogICAgaWYgKGNiLmNhbmNlbGxlZCkgewogICAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7CiAgICAgIH0KICAgICAgZW50ZXJDYW5jZWxsZWRIb29rICYmIGVudGVyQ2FuY2VsbGVkSG9vayhlbCk7CiAgICB9IGVsc2UgewogICAgICBhZnRlckVudGVySG9vayAmJiBhZnRlckVudGVySG9vayhlbCk7CiAgICB9CiAgICBlbC5fZW50ZXJDYiA9IG51bGw7CiAgfSk7CgogIGlmICghdm5vZGUuZGF0YS5zaG93KSB7CiAgICAvLyByZW1vdmUgcGVuZGluZyBsZWF2ZSBlbGVtZW50IG9uIGVudGVyIGJ5IGluamVjdGluZyBhbiBpbnNlcnQgaG9vawogICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlOwogICAgICB2YXIgcGVuZGluZ05vZGUgPSBwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nICYmIHBhcmVudC5fcGVuZGluZ1t2bm9kZS5rZXldOwogICAgICBpZiAocGVuZGluZ05vZGUgJiYKICAgICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJgogICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYgogICAgICApIHsKICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTsKICAgICAgfQogICAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgICB9KTsKICB9CgogIC8vIHN0YXJ0IGVudGVyIHRyYW5zaXRpb24KICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTsKICBpZiAoZXhwZWN0c0NTUykgewogICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHsKICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpOwogICAgICAgIGlmICghdXNlcldhbnRzQ29udHJvbCkgewogICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdEVudGVyRHVyYXRpb24pKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0RW50ZXJEdXJhdGlvbik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgaWYgKHZub2RlLmRhdGEuc2hvdykgewogICAgdG9nZ2xlRGlzcGxheSAmJiB0b2dnbGVEaXNwbGF5KCk7CiAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgfQoKICBpZiAoIWV4cGVjdHNDU1MgJiYgIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgIGNiKCk7CiAgfQp9CgpmdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikpIHsKICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fZW50ZXJDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7CiAgICByZXR1cm4gcm0oKQogIH0KCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGlzRGVmKGVsLl9sZWF2ZUNiKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgY3NzID0gZGF0YS5jc3M7CiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7CiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7CiAgdmFyIGxlYXZlVG9DbGFzcyA9IGRhdGEubGVhdmVUb0NsYXNzOwogIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzOwogIHZhciBiZWZvcmVMZWF2ZSA9IGRhdGEuYmVmb3JlTGVhdmU7CiAgdmFyIGxlYXZlID0gZGF0YS5sZWF2ZTsKICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTsKICB2YXIgbGVhdmVDYW5jZWxsZWQgPSBkYXRhLmxlYXZlQ2FuY2VsbGVkOwogIHZhciBkZWxheUxlYXZlID0gZGF0YS5kZWxheUxlYXZlOwogIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247CgogIHZhciBleHBlY3RzQ1NTID0gY3NzICE9PSBmYWxzZSAmJiAhaXNJRTk7CiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGxlYXZlKTsKCiAgdmFyIGV4cGxpY2l0TGVhdmVEdXJhdGlvbiA9IHRvTnVtYmVyKAogICAgaXNPYmplY3QoZHVyYXRpb24pCiAgICAgID8gZHVyYXRpb24ubGVhdmUKICAgICAgOiBkdXJhdGlvbgogICk7CgogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZXhwbGljaXRMZWF2ZUR1cmF0aW9uKSkgewogICAgY2hlY2tEdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24sICdsZWF2ZScsIHZub2RlKTsKICB9CgogIHZhciBjYiA9IGVsLl9sZWF2ZUNiID0gb25jZShmdW5jdGlvbiAoKSB7CiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7CiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7CiAgICB9CiAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7CiAgICB9CiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgfQogICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7CiAgICB9IGVsc2UgewogICAgICBybSgpOwogICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpOwogICAgfQogICAgZWwuX2xlYXZlQ2IgPSBudWxsOwogIH0pOwoKICBpZiAoZGVsYXlMZWF2ZSkgewogICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpOwogIH0gZWxzZSB7CiAgICBwZXJmb3JtTGVhdmUoKTsKICB9CgogIGZ1bmN0aW9uIHBlcmZvcm1MZWF2ZSAoKSB7CiAgICAvLyB0aGUgZGVsYXllZCBsZWF2ZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkCiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIHJldHVybgogICAgfQogICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudAogICAgaWYgKCF2bm9kZS5kYXRhLnNob3cpIHsKICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlOwogICAgfQogICAgYmVmb3JlTGVhdmUgJiYgYmVmb3JlTGVhdmUoZWwpOwogICAgaWYgKGV4cGVjdHNDU1MpIHsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTsKICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpOwogICAgICAgIGlmICghY2IuY2FuY2VsbGVkKSB7CiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgICAgICBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24pKSB7CiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpOwogICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7CiAgICAgIGNiKCk7CiAgICB9CiAgfQp9CgovLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGUKZnVuY3Rpb24gY2hlY2tEdXJhdGlvbiAodmFsLCBuYW1lLCB2bm9kZSkgewogIGlmICh0eXBlb2YgdmFsICE9PSAnbnVtYmVyJykgewogICAgd2FybigKICAgICAgIjx0cmFuc2l0aW9uPiBleHBsaWNpdCAiICsgbmFtZSArICIgZHVyYXRpb24gaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gIiArCiAgICAgICJnb3QgIiArIChKU09OLnN0cmluZ2lmeSh2YWwpKSArICIuIiwKICAgICAgdm5vZGUuY29udGV4dAogICAgKTsKICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHsKICAgIHdhcm4oCiAgICAgICI8dHJhbnNpdGlvbj4gZXhwbGljaXQgIiArIG5hbWUgKyAiIGR1cmF0aW9uIGlzIE5hTiAtICIgKwogICAgICAndGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LicsCiAgICAgIHZub2RlLmNvbnRleHQKICAgICk7CiAgfQp9CgpmdW5jdGlvbiBpc1ZhbGlkRHVyYXRpb24gKHZhbCkgewogIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKQp9CgovKioKICogTm9ybWFsaXplIGEgdHJhbnNpdGlvbiBob29rJ3MgYXJndW1lbnQgbGVuZ3RoLiBUaGUgaG9vayBtYXkgYmU6CiAqIC0gYSBtZXJnZWQgaG9vayAoaW52b2tlcikgd2l0aCB0aGUgb3JpZ2luYWwgaW4gLmZucwogKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aCkKICogLSBhIHBsYWluIGZ1bmN0aW9uICgubGVuZ3RoKQogKi8KZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHsKICBpZiAoaXNVbmRlZihmbikpIHsKICAgIHJldHVybiBmYWxzZQogIH0KICB2YXIgaW52b2tlckZucyA9IGZuLmZuczsKICBpZiAoaXNEZWYoaW52b2tlckZucykpIHsKICAgIC8vIGludm9rZXIKICAgIHJldHVybiBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKAogICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpCiAgICAgICAgPyBpbnZva2VyRm5zWzBdCiAgICAgICAgOiBpbnZva2VyRm5zCiAgICApCiAgfSBlbHNlIHsKICAgIHJldHVybiAoZm4uX2xlbmd0aCB8fCBmbi5sZW5ndGgpID4gMQogIH0KfQoKZnVuY3Rpb24gX2VudGVyIChfLCB2bm9kZSkgewogIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgIGVudGVyKHZub2RlKTsKICB9Cn0KCnZhciB0cmFuc2l0aW9uID0gaW5Ccm93c2VyID8gewogIGNyZWF0ZTogX2VudGVyLAogIGFjdGl2YXRlOiBfZW50ZXIsCiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUkJDEgKHZub2RlLCBybSkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgICAgbGVhdmUodm5vZGUsIHJtKTsKICAgIH0gZWxzZSB7CiAgICAgIHJtKCk7CiAgICB9CiAgfQp9IDoge30KCnZhciBwbGF0Zm9ybU1vZHVsZXMgPSBbCiAgYXR0cnMsCiAga2xhc3MsCiAgZXZlbnRzLAogIGRvbVByb3BzLAogIHN0eWxlLAogIHRyYW5zaXRpb24KXQoKLyogICovCgovLyB0aGUgZGlyZWN0aXZlIG1vZHVsZSBzaG91bGQgYmUgYXBwbGllZCBsYXN0LCBhZnRlciBhbGwKLy8gYnVpbHQtaW4gbW9kdWxlcyBoYXZlIGJlZW4gYXBwbGllZC4KdmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTsKCnZhciBwYXRjaCA9IGNyZWF0ZVBhdGNoRnVuY3Rpb24oeyBub2RlT3BzOiBub2RlT3BzLCBtb2R1bGVzOiBtb2R1bGVzIH0pOwoKLyoqCiAqIE5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBsaWtlIGF0dGFjaGluZwogKiBwcm9wZXJ0aWVzIHRvIEVsZW1lbnRzLgogKi8KCi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwppZiAoaXNJRTkpIHsKICAvLyBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L2ludGVybmV0LWV4cGxvcmVyLTktb25pbnB1dC8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgaWYgKGVsICYmIGVsLnZtb2RlbCkgewogICAgICB0cmlnZ2VyKGVsLCAnaW5wdXQnKTsKICAgIH0KICB9KTsKfQoKdmFyIGRpcmVjdGl2ZSA9IHsKICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVm5vZGUpIHsKICAgIGlmICh2bm9kZS50YWcgPT09ICdzZWxlY3QnKSB7CiAgICAgIC8vICM2OTAzCiAgICAgIGlmIChvbGRWbm9kZS5lbG0gJiYgIW9sZFZub2RlLmVsbS5fdk9wdGlvbnMpIHsKICAgICAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGRpcmVjdGl2ZS5jb21wb25lbnRVcGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICB9CiAgICAgIGVsLl92T3B0aW9ucyA9IFtdLm1hcC5jYWxsKGVsLm9wdGlvbnMsIGdldFZhbHVlKTsKICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGlzVGV4dElucHV0VHlwZShlbC50eXBlKSkgewogICAgICBlbC5fdk1vZGlmaWVycyA9IGJpbmRpbmcubW9kaWZpZXJzOwogICAgICBpZiAoIWJpbmRpbmcubW9kaWZpZXJzLmxhenkpIHsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpOwogICAgICAgIC8vIFNhZmFyaSA8IDEwLjIgJiBVSVdlYlZpZXcgZG9lc24ndCBmaXJlIGNvbXBvc2l0aW9uZW5kIHdoZW4KICAgICAgICAvLyBzd2l0Y2hpbmcgZm9jdXMgYmVmb3JlIGNvbmZpcm1pbmcgY29tcG9zaXRpb24gY2hvaWNlCiAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZQogICAgICAgIC8vIGZpcmVzICJjaGFuZ2UiIGluc3RlYWQgb2YgImlucHV0IiBvbiBhdXRvY29tcGxldGUuCiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKGlzSUU5KSB7CiAgICAgICAgICBlbC52bW9kZWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIGNvbXBvbmVudFVwZGF0ZWQ6IGZ1bmN0aW9uIGNvbXBvbmVudFVwZGF0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSkgewogICAgaWYgKHZub2RlLnRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICAvLyBpbiBjYXNlIHRoZSBvcHRpb25zIHJlbmRlcmVkIGJ5IHYtZm9yIGhhdmUgY2hhbmdlZCwKICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHRoZSB2YWx1ZSBpcyBvdXQtb2Ytc3luYyB3aXRoIHRoZSByZW5kZXJlZCBvcHRpb25zLgogICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmcKICAgICAgLy8gb3B0aW9uIGluIHRoZSBET00uCiAgICAgIHZhciBwcmV2T3B0aW9ucyA9IGVsLl92T3B0aW9uczsKICAgICAgdmFyIGN1ck9wdGlvbnMgPSBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7CiAgICAgIGlmIChjdXJPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG8sIGkpIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHByZXZPcHRpb25zW2ldKTsgfSkpIHsKICAgICAgICAvLyB0cmlnZ2VyIGNoYW5nZSBldmVudCBpZgogICAgICAgIC8vIG5vIG1hdGNoaW5nIG9wdGlvbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlCiAgICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlCiAgICAgICAgICA/IGJpbmRpbmcudmFsdWUuc29tZShmdW5jdGlvbiAodikgeyByZXR1cm4gaGFzTm9NYXRjaGluZ09wdGlvbih2LCBjdXJPcHRpb25zKTsgfSkKICAgICAgICAgIDogYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSAmJiBoYXNOb01hdGNoaW5nT3B0aW9uKGJpbmRpbmcudmFsdWUsIGN1ck9wdGlvbnMpOwogICAgICAgIGlmIChuZWVkUmVzZXQpIHsKICAgICAgICAgIHRyaWdnZXIoZWwsICdjaGFuZ2UnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgpmdW5jdGlvbiBzZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0lFIHx8IGlzRWRnZSkgewogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIGFjdHVhbGx5U2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZtKTsKICAgIH0sIDApOwogIH0KfQoKZnVuY3Rpb24gYWN0dWFsbHlTZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgdmFyIHZhbHVlID0gYmluZGluZy52YWx1ZTsKICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlOwogIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICI8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw9XCIiICsgKGJpbmRpbmcuZXhwcmVzc2lvbikgKyAiXCI+ICIgKwogICAgICAiZXhwZWN0cyBhbiBBcnJheSB2YWx1ZSBmb3IgaXRzIGJpbmRpbmcsIGJ1dCBnb3QgIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSksCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciBzZWxlY3RlZCwgb3B0aW9uOwogIGZvciAodmFyIGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07CiAgICBpZiAoaXNNdWx0aXBsZSkgewogICAgICBzZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgZ2V0VmFsdWUob3B0aW9uKSkgPiAtMTsKICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHsKICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7CiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIHsKICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgICAgfQogICAgfQogIH0KICBpZiAoIWlzTXVsdGlwbGUpIHsKICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTsKICB9Cn0KCmZ1bmN0aW9uIGhhc05vTWF0Y2hpbmdPcHRpb24gKHZhbHVlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG9wdGlvbnMuZXZlcnkoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHZhbHVlKTsgfSkKfQoKZnVuY3Rpb24gZ2V0VmFsdWUgKG9wdGlvbikgewogIHJldHVybiAnX3ZhbHVlJyBpbiBvcHRpb24KICAgID8gb3B0aW9uLl92YWx1ZQogICAgOiBvcHRpb24udmFsdWUKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0IChlKSB7CiAgZS50YXJnZXQuY29tcG9zaW5nID0gdHJ1ZTsKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZCAoZSkgewogIC8vIHByZXZlbnQgdHJpZ2dlcmluZyBhbiBpbnB1dCBldmVudCBmb3Igbm8gcmVhc29uCiAgaWYgKCFlLnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuIH0KICBlLnRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTsKICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTsKfQoKZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHsKICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7CiAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7CiAgZWwuZGlzcGF0Y2hFdmVudChlKTsKfQoKLyogICovCgovLyByZWN1cnNpdmVseSBzZWFyY2ggZm9yIHBvc3NpYmxlIHRyYW5zaXRpb24gZGVmaW5lZCBpbnNpZGUgdGhlIGNvbXBvbmVudCByb290CmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7CiAgcmV0dXJuIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmICghdm5vZGUuZGF0YSB8fCAhdm5vZGUuZGF0YS50cmFuc2l0aW9uKQogICAgPyBsb2NhdGVOb2RlKHZub2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkKICAgIDogdm5vZGUKfQoKdmFyIHNob3cgPSB7CiAgYmluZDogZnVuY3Rpb24gYmluZCAoZWwsIHJlZiwgdm5vZGUpIHsKICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTsKCiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPQogICAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7CiAgICBpZiAodmFsdWUgJiYgdHJhbnNpdGlvbiQkMSkgewogICAgICB2bm9kZS5kYXRhLnNob3cgPSB0cnVlOwogICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkgewogICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gb3JpZ2luYWxEaXNwbGF5IDogJ25vbmUnOwogICAgfQogIH0sCgogIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkgewogICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlOwogICAgdmFyIG9sZFZhbHVlID0gcmVmLm9sZFZhbHVlOwoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKSB7IHJldHVybiB9CiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIGlmICh0cmFuc2l0aW9uJCQxKSB7CiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGVudGVyKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgOiAnbm9uZSc7CiAgICB9CiAgfSwKCiAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQgKAogICAgZWwsCiAgICBiaW5kaW5nLAogICAgdm5vZGUsCiAgICBvbGRWbm9kZSwKICAgIGlzRGVzdHJveQogICkgewogICAgaWYgKCFpc0Rlc3Ryb3kpIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheTsKICAgIH0KICB9Cn0KCnZhciBwbGF0Zm9ybURpcmVjdGl2ZXMgPSB7CiAgbW9kZWw6IGRpcmVjdGl2ZSwKICBzaG93OiBzaG93Cn0KCi8qICAqLwoKLy8gUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBhIHNpbmdsZSBlbGVtZW50L2NvbXBvbmVudC4KLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpCgp2YXIgdHJhbnNpdGlvblByb3BzID0gewogIG5hbWU6IFN0cmluZywKICBhcHBlYXI6IEJvb2xlYW4sCiAgY3NzOiBCb29sZWFuLAogIG1vZGU6IFN0cmluZywKICB0eXBlOiBTdHJpbmcsCiAgZW50ZXJDbGFzczogU3RyaW5nLAogIGxlYXZlQ2xhc3M6IFN0cmluZywKICBlbnRlclRvQ2xhc3M6IFN0cmluZywKICBsZWF2ZVRvQ2xhc3M6IFN0cmluZywKICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsCiAgbGVhdmVBY3RpdmVDbGFzczogU3RyaW5nLAogIGFwcGVhckNsYXNzOiBTdHJpbmcsCiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZywKICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsCiAgZHVyYXRpb246IFtOdW1iZXIsIFN0cmluZywgT2JqZWN0XQp9OwoKLy8gaW4gY2FzZSB0aGUgY2hpbGQgaXMgYWxzbyBhbiBhYnN0cmFjdCBjb21wb25lbnQsIGUuZy4gPGtlZXAtYWxpdmU+Ci8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkCmZ1bmN0aW9uIGdldFJlYWxDaGlsZCAodm5vZGUpIHsKICB2YXIgY29tcE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHJldHVybiBnZXRSZWFsQ2hpbGQoZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChjb21wT3B0aW9ucy5jaGlsZHJlbikpCiAgfSBlbHNlIHsKICAgIHJldHVybiB2bm9kZQogIH0KfQoKZnVuY3Rpb24gZXh0cmFjdFRyYW5zaXRpb25EYXRhIChjb21wKSB7CiAgdmFyIGRhdGEgPSB7fTsKICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7CiAgLy8gcHJvcHMKICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5wcm9wc0RhdGEpIHsKICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTsKICB9CiAgLy8gZXZlbnRzLgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kcwogIHZhciBsaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgZm9yICh2YXIga2V5JDEgaW4gbGlzdGVuZXJzKSB7CiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdOwogIH0KICByZXR1cm4gZGF0YQp9CgpmdW5jdGlvbiBwbGFjZWhvbGRlciAoaCwgcmF3Q2hpbGQpIHsKICBpZiAoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHJhd0NoaWxkLnRhZykpIHsKICAgIHJldHVybiBoKCdrZWVwLWFsaXZlJywgewogICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEKICAgIH0pCiAgfQp9CgpmdW5jdGlvbiBoYXNQYXJlbnRUcmFuc2l0aW9uICh2bm9kZSkgewogIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7CiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBpc1NhbWVDaGlsZCAoY2hpbGQsIG9sZENoaWxkKSB7CiAgcmV0dXJuIG9sZENoaWxkLmtleSA9PT0gY2hpbGQua2V5ICYmIG9sZENoaWxkLnRhZyA9PT0gY2hpbGQudGFnCn0KCnZhciBUcmFuc2l0aW9uID0gewogIG5hbWU6ICd0cmFuc2l0aW9uJywKICBwcm9wczogdHJhbnNpdGlvblByb3BzLAogIGFic3RyYWN0OiB0cnVlLAoKICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdDsKICAgIGlmICghY2hpbGRyZW4pIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcykKICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH0pOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigKICAgICAgICAnPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudC4gVXNlICcgKwogICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsCiAgICAgICAgdGhpcy4kcGFyZW50CiAgICAgICk7CiAgICB9CgogICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7CgogICAgLy8gd2FybiBpbnZhbGlkIG1vZGUKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJwogICAgKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLAogICAgICAgIHRoaXMuJHBhcmVudAogICAgICApOwogICAgfQoKICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdOwoKICAgIC8vIGlmIHRoaXMgaXMgYSBjb21wb25lbnQgcm9vdCBub2RlIGFuZCB0aGUgY29tcG9uZW50J3MKICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLgogICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7CiAgICAgIHJldHVybiByYXdDaGlsZAogICAgfQoKICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gZGF0YSB0byBjaGlsZAogICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZQogICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCFjaGlsZCkgewogICAgICByZXR1cm4gcmF3Q2hpbGQKICAgIH0KCiAgICBpZiAodGhpcy5fbGVhdmluZykgewogICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICB9CgogICAgLy8gZW5zdXJlIGEga2V5IHRoYXQgaXMgdW5pcXVlIHRvIHRoZSB2bm9kZSB0eXBlIGFuZCB0byB0aGlzIHRyYW5zaXRpb24KICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXMKICAgIC8vIGR1cmluZyBlbnRlcmluZy4KICAgIHZhciBpZCA9ICJfX3RyYW5zaXRpb24tIiArICh0aGlzLl91aWQpICsgIi0iOwogICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGwKICAgICAgPyBjaGlsZC5pc0NvbW1lbnQKICAgICAgICA/IGlkICsgJ2NvbW1lbnQnCiAgICAgICAgOiBpZCArIGNoaWxkLnRhZwogICAgICA6IGlzUHJpbWl0aXZlKGNoaWxkLmtleSkKICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KQogICAgICAgIDogY2hpbGQua2V5OwoKICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7CiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTsKICAgIHZhciBvbGRDaGlsZCA9IGdldFJlYWxDaGlsZChvbGRSYXdDaGlsZCk7CgogICAgLy8gbWFyayB2LXNob3cKICAgIC8vIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gbW9kdWxlIGNhbiBoYW5kIG92ZXIgdGhlIGNvbnRyb2wgdG8gdGhlIGRpcmVjdGl2ZQogICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5uYW1lID09PSAnc2hvdyc7IH0pKSB7CiAgICAgIGNoaWxkLmRhdGEuc2hvdyA9IHRydWU7CiAgICB9CgogICAgaWYgKAogICAgICBvbGRDaGlsZCAmJgogICAgICBvbGRDaGlsZC5kYXRhICYmCiAgICAgICFpc1NhbWVDaGlsZChjaGlsZCwgb2xkQ2hpbGQpICYmCiAgICAgICFpc0FzeW5jUGxhY2Vob2xkZXIob2xkQ2hpbGQpICYmCiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlCiAgICAgICEob2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UgJiYgb2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkKICAgICkgewogICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmUKICAgICAgLy8gaW1wb3J0YW50IGZvciBkeW5hbWljIHRyYW5zaXRpb25zIQogICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkLmRhdGEudHJhbnNpdGlvbiA9IGV4dGVuZCh7fSwgZGF0YSk7CiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGUKICAgICAgaWYgKG1vZGUgPT09ICdvdXQtaW4nKSB7CiAgICAgICAgLy8gcmV0dXJuIHBsYWNlaG9sZGVyIG5vZGUgYW5kIHF1ZXVlIHVwZGF0ZSB3aGVuIGxlYXZlIGZpbmlzaGVzCiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2FmdGVyTGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aGlzJDEuX2xlYXZpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHsKICAgICAgICBpZiAoaXNBc3luY1BsYWNlaG9sZGVyKGNoaWxkKSkgewogICAgICAgICAgcmV0dXJuIG9sZFJhd0NoaWxkCiAgICAgICAgfQogICAgICAgIHZhciBkZWxheWVkTGVhdmU7CiAgICAgICAgdmFyIHBlcmZvcm1MZWF2ZSA9IGZ1bmN0aW9uICgpIHsgZGVsYXllZExlYXZlKCk7IH07CiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpOwogICAgICAgIG1lcmdlVk5vZGVIb29rKGRhdGEsICdlbnRlckNhbmNlbGxlZCcsIHBlcmZvcm1MZWF2ZSk7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2RlbGF5TGVhdmUnLCBmdW5jdGlvbiAobGVhdmUpIHsgZGVsYXllZExlYXZlID0gbGVhdmU7IH0pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJhd0NoaWxkCiAgfQp9CgovKiAgKi8KCi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgbGlzdCBpdGVtcy4KLy8gc3VwcG9ydHMgbW92ZSB0cmFuc2l0aW9ucyB1c2luZyB0aGUgRkxJUCB0ZWNobmlxdWUuCgovLyBCZWNhdXNlIHRoZSB2ZG9tJ3MgY2hpbGRyZW4gdXBkYXRlIGFsZ29yaXRobSBpcyAidW5zdGFibGUiIC0gaS5lLgovLyBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcmVtb3ZlZCBlbGVtZW50cywKLy8gd2UgZm9yY2UgdHJhbnNpdGlvbi1ncm91cCB0byB1cGRhdGUgaXRzIGNoaWxkcmVuIGludG8gdHdvIHBhc3NlczoKLy8gaW4gdGhlIGZpcnN0IHBhc3MsIHdlIHJlbW92ZSBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQsCi8vIHRyaWdnZXJpbmcgdGhlaXIgbGVhdmluZyB0cmFuc2l0aW9uOyBpbiB0aGUgc2Vjb25kIHBhc3MsIHdlIGluc2VydC9tb3ZlCi8vIGludG8gdGhlIGZpbmFsIGRlc2lyZWQgc3RhdGUuIFRoaXMgd2F5IGluIHRoZSBzZWNvbmQgcGFzcyByZW1vdmVkCi8vIG5vZGVzIHdpbGwgcmVtYWluIHdoZXJlIHRoZXkgc2hvdWxkIGJlLgoKdmFyIHByb3BzID0gZXh0ZW5kKHsKICB0YWc6IFN0cmluZywKICBtb3ZlQ2xhc3M6IFN0cmluZwp9LCB0cmFuc2l0aW9uUHJvcHMpOwoKZGVsZXRlIHByb3BzLm1vZGU7Cgp2YXIgVHJhbnNpdGlvbkdyb3VwID0gewogIHByb3BzOiBwcm9wcywKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHsKICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7CiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdOwogICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTsKICAgICAgaWYgKGMudGFnKSB7CiAgICAgICAgaWYgKGMua2V5ICE9IG51bGwgJiYgU3RyaW5nKGMua2V5KS5pbmRleE9mKCdfX3ZsaXN0JykgIT09IDApIHsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7CiAgICAgICAgICBtYXBbYy5rZXldID0gYwogICAgICAgICAgOyhjLmRhdGEgfHwgKGMuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25EYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgb3B0cyA9IGMuY29tcG9uZW50T3B0aW9uczsKICAgICAgICAgIHZhciBuYW1lID0gb3B0cyA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnIHx8ICcnKSA6IGMudGFnOwogICAgICAgICAgd2FybigoIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8IiArIG5hbWUgKyAiPiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJldkNoaWxkcmVuKSB7CiAgICAgIHZhciBrZXB0ID0gW107CiAgICAgIHZhciByZW1vdmVkID0gW107CiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7CiAgICAgICAgdmFyIGMkMSA9IHByZXZDaGlsZHJlbltpJDFdOwogICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTsKICAgICAgICBjJDEuZGF0YS5wb3MgPSBjJDEuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmIChtYXBbYyQxLmtleV0pIHsKICAgICAgICAgIGtlcHQucHVzaChjJDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZW1vdmVkLnB1c2goYyQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5rZXB0ID0gaCh0YWcsIG51bGwsIGtlcHQpOwogICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkOwogICAgfQoKICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pCiAgfSwKCiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkgewogICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzcwogICAgdGhpcy5fX3BhdGNoX18oCiAgICAgIHRoaXMuX3Zub2RlLAogICAgICB0aGlzLmtlcHQsCiAgICAgIGZhbHNlLCAvLyBoeWRyYXRpbmcKICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpCiAgICApOwogICAgdGhpcy5fdm5vZGUgPSB0aGlzLmtlcHQ7CiAgfSwKCiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCAoKSB7CiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjsKICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7CiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5oYXNNb3ZlKGNoaWxkcmVuWzBdLmVsbSwgbW92ZUNsYXNzKSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3ZSBkaXZpZGUgdGhlIHdvcmsgaW50byB0aHJlZSBsb29wcyB0byBhdm9pZCBtaXhpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMKICAgIC8vIGluIGVhY2ggaXRlcmF0aW9uIC0gd2hpY2ggaGVscHMgcHJldmVudCBsYXlvdXQgdGhyYXNoaW5nLgogICAgY2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7CiAgICBjaGlsZHJlbi5mb3JFYWNoKHJlY29yZFBvc2l0aW9uKTsKICAgIGNoaWxkcmVuLmZvckVhY2goYXBwbHlUcmFuc2xhdGlvbik7CgogICAgLy8gZm9yY2UgcmVmbG93IHRvIHB1dCBldmVyeXRoaW5nIGluIHBvc2l0aW9uCiAgICAvLyBhc3NpZ24gdG8gdGhpcyB0byBhdm9pZCBiZWluZyByZW1vdmVkIGluIHRyZWUtc2hha2luZwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICB0aGlzLl9yZWZsb3cgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDsKCiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmRhdGEubW92ZWQpIHsKICAgICAgICB2YXIgZWwgPSBjLmVsbTsKICAgICAgICB2YXIgcyA9IGVsLnN0eWxlOwogICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTsKICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJzsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmRFdmVudCwgZWwuX21vdmVDYiA9IGZ1bmN0aW9uIGNiIChlKSB7CiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7CiAgICAgICAgICAgIGVsLl9tb3ZlQ2IgPSBudWxsOwogICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0sCgogIG1ldGhvZHM6IHsKICAgIGhhc01vdmU6IGZ1bmN0aW9uIGhhc01vdmUgKGVsLCBtb3ZlQ2xhc3MpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikgewogICAgICAgIHJldHVybiBmYWxzZQogICAgICB9CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAodGhpcy5faGFzTW92ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNNb3ZlCiAgICAgIH0KICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBtb3ZlIGNsYXNzIGFwcGxpZWQgaGFzCiAgICAgIC8vIENTUyB0cmFuc2l0aW9ucy4gU2luY2UgdGhlIGVsZW1lbnQgbWF5IGJlIGluc2lkZSBhbiBlbnRlcmluZwogICAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlCiAgICAgIC8vIGFsbCBvdGhlciB0cmFuc2l0aW9uIGNsYXNzZXMgYXBwbGllZCB0byBlbnN1cmUgb25seSB0aGUgbW92ZSBjbGFzcwogICAgICAvLyBpcyBhcHBsaWVkLgogICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTsKICAgICAgaWYgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcykgewogICAgICAgIGVsLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHsgcmVtb3ZlQ2xhc3MoY2xvbmUsIGNscyk7IH0pOwogICAgICB9CiAgICAgIGFkZENsYXNzKGNsb25lLCBtb3ZlQ2xhc3MpOwogICAgICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB0aGlzLiRlbC5hcHBlbmRDaGlsZChjbG9uZSk7CiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpOwogICAgICB0aGlzLiRlbC5yZW1vdmVDaGlsZChjbG9uZSk7CiAgICAgIHJldHVybiAodGhpcy5faGFzTW92ZSA9IGluZm8uaGFzVHJhbnNmb3JtKQogICAgfQogIH0KfQoKZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMgKGMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX21vdmVDYikgewogICAgYy5lbG0uX21vdmVDYigpOwogIH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX2VudGVyQ2IpIHsKICAgIGMuZWxtLl9lbnRlckNiKCk7CiAgfQp9CgpmdW5jdGlvbiByZWNvcmRQb3NpdGlvbiAoYykgewogIGMuZGF0YS5uZXdQb3MgPSBjLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKfQoKZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbiAoYykgewogIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zOwogIHZhciBuZXdQb3MgPSBjLmRhdGEubmV3UG9zOwogIHZhciBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7CiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7CiAgaWYgKGR4IHx8IGR5KSB7CiAgICBjLmRhdGEubW92ZWQgPSB0cnVlOwogICAgdmFyIHMgPSBjLmVsbS5zdHlsZTsKICAgIHMudHJhbnNmb3JtID0gcy5XZWJraXRUcmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBkeCArICJweCwiICsgZHkgKyAicHgpIjsKICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJzsKICB9Cn0KCnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7CiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbiwKICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cAp9CgovKiAgKi8KCi8vIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMgdXRpbHMKVnVlLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyID0gaXNSZXNlcnZlZEF0dHI7ClZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZ2V0VGFnTmFtZXNwYWNlOwpWdWUuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50OwoKLy8gaW5zdGFsbCBwbGF0Zm9ybSBydW50aW1lIGRpcmVjdGl2ZXMgJiBjb21wb25lbnRzCmV4dGVuZChWdWUub3B0aW9ucy5kaXJlY3RpdmVzLCBwbGF0Zm9ybURpcmVjdGl2ZXMpOwpleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgcGxhdGZvcm1Db21wb25lbnRzKTsKCi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb24KVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gPSBpbkJyb3dzZXIgPyBwYXRjaCA6IG5vb3A7CgovLyBwdWJsaWMgbW91bnQgbWV0aG9kClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDsKICByZXR1cm4gbW91bnRDb21wb25lbnQodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8vIGRldnRvb2xzIGdsb2JhbCBob29rCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmlmIChpbkJyb3dzZXIpIHsKICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIGlmIChjb25maWcuZGV2dG9vbHMpIHsKICAgICAgaWYgKGRldnRvb2xzKSB7CiAgICAgICAgZGV2dG9vbHMuZW1pdCgnaW5pdCcsIFZ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgICAgaXNDaHJvbWUKICAgICAgKSB7CiAgICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oCiAgICAgICAgICAnRG93bmxvYWQgdGhlIFZ1ZSBEZXZ0b29scyBleHRlbnNpb24gZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6XG4nICsKICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWRldnRvb2xzJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgIGNvbmZpZy5wcm9kdWN0aW9uVGlwICE9PSBmYWxzZSAmJgogICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcKICAgICkgewogICAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/ICdpbmZvJyA6ICdsb2cnXSgKICAgICAgICAiWW91IGFyZSBydW5uaW5nIFZ1ZSBpbiBkZXZlbG9wbWVudCBtb2RlLlxuIiArCiAgICAgICAgIk1ha2Ugc3VyZSB0byB0dXJuIG9uIHByb2R1Y3Rpb24gbW9kZSB3aGVuIGRlcGxveWluZyBmb3IgcHJvZHVjdGlvbi5cbiIgKwogICAgICAgICJTZWUgbW9yZSB0aXBzIGF0IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2RlcGxveW1lbnQuaHRtbCIKICAgICAgKTsKICAgIH0KICB9LCAwKTsKfQoKLyogICovCgp2YXIgZGVmYXVsdFRhZ1JFID0gL1x7XHsoKD86LnxcbikrPylcfVx9L2c7CnZhciByZWdleEVzY2FwZVJFID0gL1stLiorP14ke30oKXxbXF1cL1xcXS9nOwoKdmFyIGJ1aWxkUmVnZXggPSBjYWNoZWQoZnVuY3Rpb24gKGRlbGltaXRlcnMpIHsKICB2YXIgb3BlbiA9IGRlbGltaXRlcnNbMF0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHZhciBjbG9zZSA9IGRlbGltaXRlcnNbMV0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHJldHVybiBuZXcgUmVnRXhwKG9wZW4gKyAnKCg/Oi58XFxuKSs/KScgKyBjbG9zZSwgJ2cnKQp9KTsKCgoKZnVuY3Rpb24gcGFyc2VUZXh0ICgKICB0ZXh0LAogIGRlbGltaXRlcnMKKSB7CiAgdmFyIHRhZ1JFID0gZGVsaW1pdGVycyA/IGJ1aWxkUmVnZXgoZGVsaW1pdGVycykgOiBkZWZhdWx0VGFnUkU7CiAgaWYgKCF0YWdSRS50ZXN0KHRleHQpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIHRva2VucyA9IFtdOwogIHZhciByYXdUb2tlbnMgPSBbXTsKICB2YXIgbGFzdEluZGV4ID0gdGFnUkUubGFzdEluZGV4ID0gMDsKICB2YXIgbWF0Y2gsIGluZGV4LCB0b2tlblZhbHVlOwogIHdoaWxlICgobWF0Y2ggPSB0YWdSRS5leGVjKHRleHQpKSkgewogICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgIC8vIHB1c2ggdGV4dCB0b2tlbgogICAgaWYgKGluZGV4ID4gbGFzdEluZGV4KSB7CiAgICAgIHJhd1Rva2Vucy5wdXNoKHRva2VuVmFsdWUgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTsKICAgICAgdG9rZW5zLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW5WYWx1ZSkpOwogICAgfQogICAgLy8gdGFnIHRva2VuCiAgICB2YXIgZXhwID0gcGFyc2VGaWx0ZXJzKG1hdGNoWzFdLnRyaW0oKSk7CiAgICB0b2tlbnMucHVzaCgoIl9zKCIgKyBleHAgKyAiKSIpKTsKICAgIHJhd1Rva2Vucy5wdXNoKHsgJ0BiaW5kaW5nJzogZXhwIH0pOwogICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CiAgfQogIGlmIChsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgcmF3VG9rZW5zLnB1c2godG9rZW5WYWx1ZSA9IHRleHQuc2xpY2UobGFzdEluZGV4KSk7CiAgICB0b2tlbnMucHVzaChKU09OLnN0cmluZ2lmeSh0b2tlblZhbHVlKSk7CiAgfQogIHJldHVybiB7CiAgICBleHByZXNzaW9uOiB0b2tlbnMuam9pbignKycpLAogICAgdG9rZW5zOiByYXdUb2tlbnMKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gdHJhbnNmb3JtTm9kZSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljQ2xhc3MgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnY2xhc3MnKTsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHN0YXRpY0NsYXNzKSB7CiAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY0NsYXNzLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgaWYgKHJlcykgewogICAgICB3YXJuKAogICAgICAgICJjbGFzcz1cIiIgKyBzdGF0aWNDbGFzcyArICJcIjogIiArCiAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArCiAgICAgICAgJ1VzZSB2LWJpbmQgb3IgdGhlIGNvbG9uIHNob3J0aGFuZCBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgJyArCiAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBjbGFzcz0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpjbGFzcz0idmFsIj4uJwogICAgICApOwogICAgfQogIH0KICBpZiAoc3RhdGljQ2xhc3MpIHsKICAgIGVsLnN0YXRpY0NsYXNzID0gSlNPTi5zdHJpbmdpZnkoc3RhdGljQ2xhc3MpOwogIH0KICB2YXIgY2xhc3NCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdjbGFzcycsIGZhbHNlIC8qIGdldFN0YXRpYyAqLyk7CiAgaWYgKGNsYXNzQmluZGluZykgewogICAgZWwuY2xhc3NCaW5kaW5nID0gY2xhc3NCaW5kaW5nOwogIH0KfQoKZnVuY3Rpb24gZ2VuRGF0YSAoZWwpIHsKICB2YXIgZGF0YSA9ICcnOwogIGlmIChlbC5zdGF0aWNDbGFzcykgewogICAgZGF0YSArPSAic3RhdGljQ2xhc3M6IiArIChlbC5zdGF0aWNDbGFzcykgKyAiLCI7CiAgfQogIGlmIChlbC5jbGFzc0JpbmRpbmcpIHsKICAgIGRhdGEgKz0gImNsYXNzOiIgKyAoZWwuY2xhc3NCaW5kaW5nKSArICIsIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIGtsYXNzJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNDbGFzcyddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUsCiAgZ2VuRGF0YTogZ2VuRGF0YQp9CgovKiAgKi8KCmZ1bmN0aW9uIHRyYW5zZm9ybU5vZGUkMSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljU3R5bGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc3R5bGUnKTsKICBpZiAoc3RhdGljU3R5bGUpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY1N0eWxlLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgICBpZiAocmVzKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJzdHlsZT1cIiIgKyBzdGF0aWNTdHlsZSArICJcIjogIiArCiAgICAgICAgICAnSW50ZXJwb2xhdGlvbiBpbnNpZGUgYXR0cmlidXRlcyBoYXMgYmVlbiByZW1vdmVkLiAnICsKICAgICAgICAgICdVc2Ugdi1iaW5kIG9yIHRoZSBjb2xvbiBzaG9ydGhhbmQgaW5zdGVhZC4gRm9yIGV4YW1wbGUsICcgKwogICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBzdHlsZT0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpzdHlsZT0idmFsIj4uJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGVsLnN0YXRpY1N0eWxlID0gSlNPTi5zdHJpbmdpZnkocGFyc2VTdHlsZVRleHQoc3RhdGljU3R5bGUpKTsKICB9CgogIHZhciBzdHlsZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3N0eWxlJywgZmFsc2UgLyogZ2V0U3RhdGljICovKTsKICBpZiAoc3R5bGVCaW5kaW5nKSB7CiAgICBlbC5zdHlsZUJpbmRpbmcgPSBzdHlsZUJpbmRpbmc7CiAgfQp9CgpmdW5jdGlvbiBnZW5EYXRhJDEgKGVsKSB7CiAgdmFyIGRhdGEgPSAnJzsKICBpZiAoZWwuc3RhdGljU3R5bGUpIHsKICAgIGRhdGEgKz0gInN0YXRpY1N0eWxlOiIgKyAoZWwuc3RhdGljU3R5bGUpICsgIiwiOwogIH0KICBpZiAoZWwuc3R5bGVCaW5kaW5nKSB7CiAgICBkYXRhICs9ICJzdHlsZTooIiArIChlbC5zdHlsZUJpbmRpbmcpICsgIiksIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIHN0eWxlJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNTdHlsZSddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUkMSwKICBnZW5EYXRhOiBnZW5EYXRhJDEKfQoKLyogICovCgp2YXIgZGVjb2RlcjsKCnZhciBoZSA9IHsKICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZSAoaHRtbCkgewogICAgZGVjb2RlciA9IGRlY29kZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkZWNvZGVyLmlubmVySFRNTCA9IGh0bWw7CiAgICByZXR1cm4gZGVjb2Rlci50ZXh0Q29udGVudAogIH0KfQoKLyogICovCgp2YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoCiAgJ2FyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLCcgKwogICdsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicKKTsKCi8vIEVsZW1lbnRzIHRoYXQgeW91IGNhbiwgaW50ZW50aW9uYWxseSwgbGVhdmUgb3BlbgovLyAoYW5kIHdoaWNoIGNsb3NlIHRoZW1zZWx2ZXMpCnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcCgKICAnY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZScKKTsKCi8vIEhUTUw1IHRhZ3MgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sI2VsZW1lbnRzLTMKLy8gUGhyYXNpbmcgQ29udGVudCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNwaHJhc2luZy1jb250ZW50CnZhciBpc05vblBocmFzaW5nVGFnID0gbWFrZU1hcCgKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLCcgKwogICdkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sJyArCiAgJ2gxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLCcgKwogICdvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsJyArCiAgJ3RpdGxlLHRyLHRyYWNrJwopOwoKLyoqCiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGl0J3MgbW9zdGx5IHZlbmRvciBjb2RlLgogKi8KCi8qIQogKiBIVE1MIFBhcnNlciBCeSBKb2huIFJlc2lnIChlam9obi5vcmcpCiAqIE1vZGlmaWVkIGJ5IEp1cml5ICJrYW5nYXgiIFpheXRzZXYKICogT3JpZ2luYWwgY29kZSBieSBFcmlrIEFydmlkc3NvbiwgTW96aWxsYSBQdWJsaWMgTGljZW5zZQogKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qcwogKi8KCi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlcwp2YXIgYXR0cmlidXRlID0gL15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vOwovLyBjb3VsZCB1c2UgaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhtbC1uYW1lcy0xOTk5MDExNC8jTlQtUU5hbWUKLy8gYnV0IGZvciBWdWUgdGVtcGxhdGVzIHdlIGNhbiBlbmZvcmNlIGEgc2ltcGxlIGNoYXJzZXQKdmFyIG5jbmFtZSA9ICdbYS16QS1aX11bXFx3XFwtXFwuXSonOwp2YXIgcW5hbWVDYXB0dXJlID0gIigoPzoiICsgbmNuYW1lICsgIlxcOik/IiArIG5jbmFtZSArICIpIjsKdmFyIHN0YXJ0VGFnT3BlbiA9IG5ldyBSZWdFeHAoKCJePCIgKyBxbmFtZUNhcHR1cmUpKTsKdmFyIHN0YXJ0VGFnQ2xvc2UgPSAvXlxzKihcLz8pPi87CnZhciBlbmRUYWcgPSBuZXcgUmVnRXhwKCgiXjxcXC8iICsgcW5hbWVDYXB0dXJlICsgIltePl0qPiIpKTsKdmFyIGRvY3R5cGUgPSAvXjwhRE9DVFlQRSBbXj5dKz4vaTsKLy8gIzcyOTg6IGVzY2FwZSAtIHRvIGF2b2lkIGJlaW5nIHBhc2VkIGFzIEhUTUwgY29tbWVudCB3aGVuIGlubGluZWQgaW4gcGFnZQp2YXIgY29tbWVudCA9IC9ePCFcLS0vOwp2YXIgY29uZGl0aW9uYWxDb21tZW50ID0gL148IVxbLzsKCnZhciBJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOID0gZmFsc2U7Cid4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobSwgZykgewogIElTX1JFR0VYX0NBUFRVUklOR19CUk9LRU4gPSBnID09PSAnJzsKfSk7CgovLyBTcGVjaWFsIEVsZW1lbnRzIChjYW4gY29udGFpbiBhbnl0aGluZykKdmFyIGlzUGxhaW5UZXh0RWxlbWVudCA9IG1ha2VNYXAoJ3NjcmlwdCxzdHlsZSx0ZXh0YXJlYScsIHRydWUpOwp2YXIgcmVDYWNoZSA9IHt9OwoKdmFyIGRlY29kaW5nTWFwID0gewogICcmbHQ7JzogJzwnLAogICcmZ3Q7JzogJz4nLAogICcmcXVvdDsnOiAnIicsCiAgJyZhbXA7JzogJyYnLAogICcmIzEwOyc6ICdcbicsCiAgJyYjOTsnOiAnXHQnCn07CnZhciBlbmNvZGVkQXR0ciA9IC8mKD86bHR8Z3R8cXVvdHxhbXApOy9nOwp2YXIgZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgPSAvJig/Omx0fGd0fHF1b3R8YW1wfCMxMHwjOSk7L2c7CgovLyAjNTk5Mgp2YXIgaXNJZ25vcmVOZXdsaW5lVGFnID0gbWFrZU1hcCgncHJlLHRleHRhcmVhJywgdHJ1ZSk7CnZhciBzaG91bGRJZ25vcmVGaXJzdE5ld2xpbmUgPSBmdW5jdGlvbiAodGFnLCBodG1sKSB7IHJldHVybiB0YWcgJiYgaXNJZ25vcmVOZXdsaW5lVGFnKHRhZykgJiYgaHRtbFswXSA9PT0gJ1xuJzsgfTsKCmZ1bmN0aW9uIGRlY29kZUF0dHIgKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykgewogIHZhciByZSA9IHNob3VsZERlY29kZU5ld2xpbmVzID8gZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgOiBlbmNvZGVkQXR0cjsKICByZXR1cm4gdmFsdWUucmVwbGFjZShyZSwgZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBkZWNvZGluZ01hcFttYXRjaF07IH0pCn0KCmZ1bmN0aW9uIHBhcnNlSFRNTCAoaHRtbCwgb3B0aW9ucykgewogIHZhciBzdGFjayA9IFtdOwogIHZhciBleHBlY3RIVE1MID0gb3B0aW9ucy5leHBlY3RIVE1MOwogIHZhciBpc1VuYXJ5VGFnJCQxID0gb3B0aW9ucy5pc1VuYXJ5VGFnIHx8IG5vOwogIHZhciBjYW5CZUxlZnRPcGVuVGFnJCQxID0gb3B0aW9ucy5jYW5CZUxlZnRPcGVuVGFnIHx8IG5vOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxhc3QsIGxhc3RUYWc7CiAgd2hpbGUgKGh0bWwpIHsKICAgIGxhc3QgPSBodG1sOwogICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBpbiBhIHBsYWludGV4dCBjb250ZW50IGVsZW1lbnQgbGlrZSBzY3JpcHQvc3R5bGUKICAgIGlmICghbGFzdFRhZyB8fCAhaXNQbGFpblRleHRFbGVtZW50KGxhc3RUYWcpKSB7CiAgICAgIHZhciB0ZXh0RW5kID0gaHRtbC5pbmRleE9mKCc8Jyk7CiAgICAgIGlmICh0ZXh0RW5kID09PSAwKSB7CiAgICAgICAgLy8gQ29tbWVudDoKICAgICAgICBpZiAoY29tbWVudC50ZXN0KGh0bWwpKSB7CiAgICAgICAgICB2YXIgY29tbWVudEVuZCA9IGh0bWwuaW5kZXhPZignLS0+Jyk7CgogICAgICAgICAgaWYgKGNvbW1lbnRFbmQgPj0gMCkgewogICAgICAgICAgICBpZiAob3B0aW9ucy5zaG91bGRLZWVwQ29tbWVudCkgewogICAgICAgICAgICAgIG9wdGlvbnMuY29tbWVudChodG1sLnN1YnN0cmluZyg0LCBjb21tZW50RW5kKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZShjb21tZW50RW5kICsgMyk7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmRpdGlvbmFsX2NvbW1lbnQjRG93bmxldmVsLXJldmVhbGVkX2NvbmRpdGlvbmFsX2NvbW1lbnQKICAgICAgICBpZiAoY29uZGl0aW9uYWxDb21tZW50LnRlc3QoaHRtbCkpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25hbEVuZCA9IGh0bWwuaW5kZXhPZignXT4nKTsKCiAgICAgICAgICBpZiAoY29uZGl0aW9uYWxFbmQgPj0gMCkgewogICAgICAgICAgICBhZHZhbmNlKGNvbmRpdGlvbmFsRW5kICsgMik7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEb2N0eXBlOgogICAgICAgIHZhciBkb2N0eXBlTWF0Y2ggPSBodG1sLm1hdGNoKGRvY3R5cGUpOwogICAgICAgIGlmIChkb2N0eXBlTWF0Y2gpIHsKICAgICAgICAgIGFkdmFuY2UoZG9jdHlwZU1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgLy8gRW5kIHRhZzoKICAgICAgICB2YXIgZW5kVGFnTWF0Y2ggPSBodG1sLm1hdGNoKGVuZFRhZyk7CiAgICAgICAgaWYgKGVuZFRhZ01hdGNoKSB7CiAgICAgICAgICB2YXIgY3VySW5kZXggPSBpbmRleDsKICAgICAgICAgIGFkdmFuY2UoZW5kVGFnTWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgIHBhcnNlRW5kVGFnKGVuZFRhZ01hdGNoWzFdLCBjdXJJbmRleCwgaW5kZXgpOwogICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIC8vIFN0YXJ0IHRhZzoKICAgICAgICB2YXIgc3RhcnRUYWdNYXRjaCA9IHBhcnNlU3RhcnRUYWcoKTsKICAgICAgICBpZiAoc3RhcnRUYWdNYXRjaCkgewogICAgICAgICAgaGFuZGxlU3RhcnRUYWcoc3RhcnRUYWdNYXRjaCk7CiAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKGxhc3RUYWcsIGh0bWwpKSB7CiAgICAgICAgICAgIGFkdmFuY2UoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHRleHQgPSAodm9pZCAwKSwgcmVzdCA9ICh2b2lkIDApLCBuZXh0ID0gKHZvaWQgMCk7CiAgICAgIGlmICh0ZXh0RW5kID49IDApIHsKICAgICAgICByZXN0ID0gaHRtbC5zbGljZSh0ZXh0RW5kKTsKICAgICAgICB3aGlsZSAoCiAgICAgICAgICAhZW5kVGFnLnRlc3QocmVzdCkgJiYKICAgICAgICAgICFzdGFydFRhZ09wZW4udGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbW1lbnQudGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbmRpdGlvbmFsQ29tbWVudC50ZXN0KHJlc3QpCiAgICAgICAgKSB7CiAgICAgICAgICAvLyA8IGluIHBsYWluIHRleHQsIGJlIGZvcmdpdmluZyBhbmQgdHJlYXQgaXQgYXMgdGV4dAogICAgICAgICAgbmV4dCA9IHJlc3QuaW5kZXhPZignPCcsIDEpOwogICAgICAgICAgaWYgKG5leHQgPCAwKSB7IGJyZWFrIH0KICAgICAgICAgIHRleHRFbmQgKz0gbmV4dDsKICAgICAgICAgIHJlc3QgPSBodG1sLnNsaWNlKHRleHRFbmQpOwogICAgICAgIH0KICAgICAgICB0ZXh0ID0gaHRtbC5zdWJzdHJpbmcoMCwgdGV4dEVuZCk7CiAgICAgICAgYWR2YW5jZSh0ZXh0RW5kKTsKICAgICAgfQoKICAgICAgaWYgKHRleHRFbmQgPCAwKSB7CiAgICAgICAgdGV4dCA9IGh0bWw7CiAgICAgICAgaHRtbCA9ICcnOwogICAgICB9CgogICAgICBpZiAob3B0aW9ucy5jaGFycyAmJiB0ZXh0KSB7CiAgICAgICAgb3B0aW9ucy5jaGFycyh0ZXh0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGVuZFRhZ0xlbmd0aCA9IDA7CiAgICAgIHZhciBzdGFja2VkVGFnID0gbGFzdFRhZy50b0xvd2VyQ2FzZSgpOwogICAgICB2YXIgcmVTdGFja2VkVGFnID0gcmVDYWNoZVtzdGFja2VkVGFnXSB8fCAocmVDYWNoZVtzdGFja2VkVGFnXSA9IG5ldyBSZWdFeHAoJyhbXFxzXFxTXSo/KSg8LycgKyBzdGFja2VkVGFnICsgJ1tePl0qPiknLCAnaScpKTsKICAgICAgdmFyIHJlc3QkMSA9IGh0bWwucmVwbGFjZShyZVN0YWNrZWRUYWcsIGZ1bmN0aW9uIChhbGwsIHRleHQsIGVuZFRhZykgewogICAgICAgIGVuZFRhZ0xlbmd0aCA9IGVuZFRhZy5sZW5ndGg7CiAgICAgICAgaWYgKCFpc1BsYWluVGV4dEVsZW1lbnQoc3RhY2tlZFRhZykgJiYgc3RhY2tlZFRhZyAhPT0gJ25vc2NyaXB0JykgewogICAgICAgICAgdGV4dCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCAnJDEnKSAvLyAjNzI5OAogICAgICAgICAgICAucmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csICckMScpOwogICAgICAgIH0KICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKHN0YWNrZWRUYWcsIHRleHQpKSB7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnMpIHsKICAgICAgICAgIG9wdGlvbnMuY2hhcnModGV4dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJwogICAgICB9KTsKICAgICAgaW5kZXggKz0gaHRtbC5sZW5ndGggLSByZXN0JDEubGVuZ3RoOwogICAgICBodG1sID0gcmVzdCQxOwogICAgICBwYXJzZUVuZFRhZyhzdGFja2VkVGFnLCBpbmRleCAtIGVuZFRhZ0xlbmd0aCwgaW5kZXgpOwogICAgfQoKICAgIGlmIChodG1sID09PSBsYXN0KSB7CiAgICAgIG9wdGlvbnMuY2hhcnMgJiYgb3B0aW9ucy5jaGFycyhodG1sKTsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiAhc3RhY2subGVuZ3RoICYmIG9wdGlvbnMud2FybikgewogICAgICAgIG9wdGlvbnMud2FybigoIk1hbC1mb3JtYXR0ZWQgdGFnIGF0IGVuZCBvZiB0ZW1wbGF0ZTogXCIiICsgaHRtbCArICJcIiIpKTsKICAgICAgfQogICAgICBicmVhawogICAgfQogIH0KCiAgLy8gQ2xlYW4gdXAgYW55IHJlbWFpbmluZyB0YWdzCiAgcGFyc2VFbmRUYWcoKTsKCiAgZnVuY3Rpb24gYWR2YW5jZSAobikgewogICAgaW5kZXggKz0gbjsKICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhuKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3RhcnRUYWcgKCkgewogICAgdmFyIHN0YXJ0ID0gaHRtbC5tYXRjaChzdGFydFRhZ09wZW4pOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIHZhciBtYXRjaCA9IHsKICAgICAgICB0YWdOYW1lOiBzdGFydFsxXSwKICAgICAgICBhdHRyczogW10sCiAgICAgICAgc3RhcnQ6IGluZGV4CiAgICAgIH07CiAgICAgIGFkdmFuY2Uoc3RhcnRbMF0ubGVuZ3RoKTsKICAgICAgdmFyIGVuZCwgYXR0cjsKICAgICAgd2hpbGUgKCEoZW5kID0gaHRtbC5tYXRjaChzdGFydFRhZ0Nsb3NlKSkgJiYgKGF0dHIgPSBodG1sLm1hdGNoKGF0dHJpYnV0ZSkpKSB7CiAgICAgICAgYWR2YW5jZShhdHRyWzBdLmxlbmd0aCk7CiAgICAgICAgbWF0Y2guYXR0cnMucHVzaChhdHRyKTsKICAgICAgfQogICAgICBpZiAoZW5kKSB7CiAgICAgICAgbWF0Y2gudW5hcnlTbGFzaCA9IGVuZFsxXTsKICAgICAgICBhZHZhbmNlKGVuZFswXS5sZW5ndGgpOwogICAgICAgIG1hdGNoLmVuZCA9IGluZGV4OwogICAgICAgIHJldHVybiBtYXRjaAogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVTdGFydFRhZyAobWF0Y2gpIHsKICAgIHZhciB0YWdOYW1lID0gbWF0Y2gudGFnTmFtZTsKICAgIHZhciB1bmFyeVNsYXNoID0gbWF0Y2gudW5hcnlTbGFzaDsKCiAgICBpZiAoZXhwZWN0SFRNTCkgewogICAgICBpZiAobGFzdFRhZyA9PT0gJ3AnICYmIGlzTm9uUGhyYXNpbmdUYWcodGFnTmFtZSkpIHsKICAgICAgICBwYXJzZUVuZFRhZyhsYXN0VGFnKTsKICAgICAgfQogICAgICBpZiAoY2FuQmVMZWZ0T3BlblRhZyQkMSh0YWdOYW1lKSAmJiBsYXN0VGFnID09PSB0YWdOYW1lKSB7CiAgICAgICAgcGFyc2VFbmRUYWcodGFnTmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdW5hcnkgPSBpc1VuYXJ5VGFnJCQxKHRhZ05hbWUpIHx8ICEhdW5hcnlTbGFzaDsKCiAgICB2YXIgbCA9IG1hdGNoLmF0dHJzLmxlbmd0aDsKICAgIHZhciBhdHRycyA9IG5ldyBBcnJheShsKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBhcmdzID0gbWF0Y2guYXR0cnNbaV07CiAgICAgIC8vIGhhY2tpc2ggd29yayBhcm91bmQgRkYgYnVnIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTM2OTc3OAogICAgICBpZiAoSVNfUkVHRVhfQ0FQVFVSSU5HX0JST0tFTiAmJiBhcmdzWzBdLmluZGV4T2YoJyIiJykgPT09IC0xKSB7CiAgICAgICAgaWYgKGFyZ3NbM10gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzNdOyB9CiAgICAgICAgaWYgKGFyZ3NbNF0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzRdOyB9CiAgICAgICAgaWYgKGFyZ3NbNV0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzVdOyB9CiAgICAgIH0KICAgICAgdmFyIHZhbHVlID0gYXJnc1szXSB8fCBhcmdzWzRdIHx8IGFyZ3NbNV0gfHwgJyc7CiAgICAgIHZhciBzaG91bGREZWNvZGVOZXdsaW5lcyA9IHRhZ05hbWUgPT09ICdhJyAmJiBhcmdzWzFdID09PSAnaHJlZicKICAgICAgICA/IG9wdGlvbnMuc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmCiAgICAgICAgOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzOwogICAgICBhdHRyc1tpXSA9IHsKICAgICAgICBuYW1lOiBhcmdzWzFdLAogICAgICAgIHZhbHVlOiBkZWNvZGVBdHRyKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykKICAgICAgfTsKICAgIH0KCiAgICBpZiAoIXVuYXJ5KSB7CiAgICAgIHN0YWNrLnB1c2goeyB0YWc6IHRhZ05hbWUsIGxvd2VyQ2FzZWRUYWc6IHRhZ05hbWUudG9Mb3dlckNhc2UoKSwgYXR0cnM6IGF0dHJzIH0pOwogICAgICBsYXN0VGFnID0gdGFnTmFtZTsKICAgIH0KCiAgICBpZiAob3B0aW9ucy5zdGFydCkgewogICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIGF0dHJzLCB1bmFyeSwgbWF0Y2guc3RhcnQsIG1hdGNoLmVuZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZUVuZFRhZyAodGFnTmFtZSwgc3RhcnQsIGVuZCkgewogICAgdmFyIHBvcywgbG93ZXJDYXNlZFRhZ05hbWU7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgeyBzdGFydCA9IGluZGV4OyB9CiAgICBpZiAoZW5kID09IG51bGwpIHsgZW5kID0gaW5kZXg7IH0KCiAgICBpZiAodGFnTmFtZSkgewogICAgICBsb3dlckNhc2VkVGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIH0KCiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG9wZW5lZCB0YWcgb2YgdGhlIHNhbWUgdHlwZQogICAgaWYgKHRhZ05hbWUpIHsKICAgICAgZm9yIChwb3MgPSBzdGFjay5sZW5ndGggLSAxOyBwb3MgPj0gMDsgcG9zLS0pIHsKICAgICAgICBpZiAoc3RhY2tbcG9zXS5sb3dlckNhc2VkVGFnID09PSBsb3dlckNhc2VkVGFnTmFtZSkgewogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIG5vIHRhZyBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhbiBzaG9wCiAgICAgIHBvcyA9IDA7CiAgICB9CgogICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrCiAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IHBvczsgaS0tKSB7CiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgKGkgPiBwb3MgfHwgIXRhZ05hbWUpICYmCiAgICAgICAgICBvcHRpb25zLndhcm4KICAgICAgICApIHsKICAgICAgICAgIG9wdGlvbnMud2FybigKICAgICAgICAgICAgKCJ0YWcgPCIgKyAoc3RhY2tbaV0udGFnKSArICI+IGhhcyBubyBtYXRjaGluZyBlbmQgdGFnLiIpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy5lbmQpIHsKICAgICAgICAgIG9wdGlvbnMuZW5kKHN0YWNrW2ldLnRhZywgc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZW1vdmUgdGhlIG9wZW4gZWxlbWVudHMgZnJvbSB0aGUgc3RhY2sKICAgICAgc3RhY2subGVuZ3RoID0gcG9zOwogICAgICBsYXN0VGFnID0gcG9zICYmIHN0YWNrW3BvcyAtIDFdLnRhZzsKICAgIH0gZWxzZSBpZiAobG93ZXJDYXNlZFRhZ05hbWUgPT09ICdicicpIHsKICAgICAgaWYgKG9wdGlvbnMuc3RhcnQpIHsKICAgICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIFtdLCB0cnVlLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChsb3dlckNhc2VkVGFnTmFtZSA9PT0gJ3AnKSB7CiAgICAgIGlmIChvcHRpb25zLnN0YXJ0KSB7CiAgICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBbXSwgZmFsc2UsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmVuZCkgewogICAgICAgIG9wdGlvbnMuZW5kKHRhZ05hbWUsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciBvblJFID0gL15AfF52LW9uOi87CnZhciBkaXJSRSA9IC9edi18XkB8XjovOwp2YXIgZm9yQWxpYXNSRSA9IC8oW15dKj8pXHMrKD86aW58b2YpXHMrKFteXSopLzsKdmFyIGZvckl0ZXJhdG9yUkUgPSAvLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLzsKdmFyIHN0cmlwUGFyZW5zUkUgPSAvXlwofFwpJC9nOwoKdmFyIGFyZ1JFID0gLzooLiopJC87CnZhciBiaW5kUkUgPSAvXjp8XnYtYmluZDovOwp2YXIgbW9kaWZpZXJSRSA9IC9cLlteLl0rL2c7Cgp2YXIgZGVjb2RlSFRNTENhY2hlZCA9IGNhY2hlZChoZS5kZWNvZGUpOwoKLy8gY29uZmlndXJhYmxlIHN0YXRlCnZhciB3YXJuJDI7CnZhciBkZWxpbWl0ZXJzOwp2YXIgdHJhbnNmb3JtczsKdmFyIHByZVRyYW5zZm9ybXM7CnZhciBwb3N0VHJhbnNmb3JtczsKdmFyIHBsYXRmb3JtSXNQcmVUYWc7CnZhciBwbGF0Zm9ybU11c3RVc2VQcm9wOwp2YXIgcGxhdGZvcm1HZXRUYWdOYW1lc3BhY2U7CgoKCmZ1bmN0aW9uIGNyZWF0ZUFTVEVsZW1lbnQgKAogIHRhZywKICBhdHRycywKICBwYXJlbnQKKSB7CiAgcmV0dXJuIHsKICAgIHR5cGU6IDEsCiAgICB0YWc6IHRhZywKICAgIGF0dHJzTGlzdDogYXR0cnMsCiAgICBhdHRyc01hcDogbWFrZUF0dHJzTWFwKGF0dHJzKSwKICAgIHBhcmVudDogcGFyZW50LAogICAgY2hpbGRyZW46IFtdCiAgfQp9CgovKioKICogQ29udmVydCBIVE1MIHN0cmluZyB0byBBU1QuCiAqLwpmdW5jdGlvbiBwYXJzZSAoCiAgdGVtcGxhdGUsCiAgb3B0aW9ucwopIHsKICB3YXJuJDIgPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CgogIHBsYXRmb3JtSXNQcmVUYWcgPSBvcHRpb25zLmlzUHJlVGFnIHx8IG5vOwogIHBsYXRmb3JtTXVzdFVzZVByb3AgPSBvcHRpb25zLm11c3RVc2VQcm9wIHx8IG5vOwogIHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlID0gb3B0aW9ucy5nZXRUYWdOYW1lc3BhY2UgfHwgbm87CgogIHRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3RyYW5zZm9ybU5vZGUnKTsKICBwcmVUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwcmVUcmFuc2Zvcm1Ob2RlJyk7CiAgcG9zdFRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3Bvc3RUcmFuc2Zvcm1Ob2RlJyk7CgogIGRlbGltaXRlcnMgPSBvcHRpb25zLmRlbGltaXRlcnM7CgogIHZhciBzdGFjayA9IFtdOwogIHZhciBwcmVzZXJ2ZVdoaXRlc3BhY2UgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSAhPT0gZmFsc2U7CiAgdmFyIHJvb3Q7CiAgdmFyIGN1cnJlbnRQYXJlbnQ7CiAgdmFyIGluVlByZSA9IGZhbHNlOwogIHZhciBpblByZSA9IGZhbHNlOwogIHZhciB3YXJuZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gd2Fybk9uY2UgKG1zZykgewogICAgaWYgKCF3YXJuZWQpIHsKICAgICAgd2FybmVkID0gdHJ1ZTsKICAgICAgd2FybiQyKG1zZyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbG9zZUVsZW1lbnQgKGVsZW1lbnQpIHsKICAgIC8vIGNoZWNrIHByZSBzdGF0ZQogICAgaWYgKGVsZW1lbnQucHJlKSB7CiAgICAgIGluVlByZSA9IGZhbHNlOwogICAgfQogICAgaWYgKHBsYXRmb3JtSXNQcmVUYWcoZWxlbWVudC50YWcpKSB7CiAgICAgIGluUHJlID0gZmFsc2U7CiAgICB9CiAgICAvLyBhcHBseSBwb3N0LXRyYW5zZm9ybXMKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zdFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgcG9zdFRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucyk7CiAgICB9CiAgfQoKICBwYXJzZUhUTUwodGVtcGxhdGUsIHsKICAgIHdhcm46IHdhcm4kMiwKICAgIGV4cGVjdEhUTUw6IG9wdGlvbnMuZXhwZWN0SFRNTCwKICAgIGlzVW5hcnlUYWc6IG9wdGlvbnMuaXNVbmFyeVRhZywKICAgIGNhbkJlTGVmdE9wZW5UYWc6IG9wdGlvbnMuY2FuQmVMZWZ0T3BlblRhZywKICAgIHNob3VsZERlY29kZU5ld2xpbmVzOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzLAogICAgc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiwKICAgIHNob3VsZEtlZXBDb21tZW50OiBvcHRpb25zLmNvbW1lbnRzLAogICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0ICh0YWcsIGF0dHJzLCB1bmFyeSkgewogICAgICAvLyBjaGVjayBuYW1lc3BhY2UuCiAgICAgIC8vIGluaGVyaXQgcGFyZW50IG5zIGlmIHRoZXJlIGlzIG9uZQogICAgICB2YXIgbnMgPSAoY3VycmVudFBhcmVudCAmJiBjdXJyZW50UGFyZW50Lm5zKSB8fCBwbGF0Zm9ybUdldFRhZ05hbWVzcGFjZSh0YWcpOwoKICAgICAgLy8gaGFuZGxlIElFIHN2ZyBidWcKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmIChpc0lFICYmIG5zID09PSAnc3ZnJykgewogICAgICAgIGF0dHJzID0gZ3VhcmRJRVNWR0J1ZyhhdHRycyk7CiAgICAgIH0KCiAgICAgIHZhciBlbGVtZW50ID0gY3JlYXRlQVNURWxlbWVudCh0YWcsIGF0dHJzLCBjdXJyZW50UGFyZW50KTsKICAgICAgaWYgKG5zKSB7CiAgICAgICAgZWxlbWVudC5ucyA9IG5zOwogICAgICB9CgogICAgICBpZiAoaXNGb3JiaWRkZW5UYWcoZWxlbWVudCkgJiYgIWlzU2VydmVyUmVuZGVyaW5nKCkpIHsKICAgICAgICBlbGVtZW50LmZvcmJpZGRlbiA9IHRydWU7CiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4kMigKICAgICAgICAgICdUZW1wbGF0ZXMgc2hvdWxkIG9ubHkgYmUgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgdGhlIHN0YXRlIHRvIHRoZSAnICsKICAgICAgICAgICdVSS4gQXZvaWQgcGxhY2luZyB0YWdzIHdpdGggc2lkZS1lZmZlY3RzIGluIHlvdXIgdGVtcGxhdGVzLCBzdWNoIGFzICcgKwogICAgICAgICAgIjwiICsgdGFnICsgIj4iICsgJywgYXMgdGhleSB3aWxsIG5vdCBiZSBwYXJzZWQuJwogICAgICAgICk7CiAgICAgIH0KCiAgICAgIC8vIGFwcGx5IHByZS10cmFuc2Zvcm1zCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlVHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGVsZW1lbnQgPSBwcmVUcmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgICAgIH0KCiAgICAgIGlmICghaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1ByZShlbGVtZW50KTsKICAgICAgICBpZiAoZWxlbWVudC5wcmUpIHsKICAgICAgICAgIGluVlByZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwbGF0Zm9ybUlzUHJlVGFnKGVsZW1lbnQudGFnKSkgewogICAgICAgIGluUHJlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1Jhd0F0dHJzKGVsZW1lbnQpOwogICAgICB9IGVsc2UgaWYgKCFlbGVtZW50LnByb2Nlc3NlZCkgewogICAgICAgIC8vIHN0cnVjdHVyYWwgZGlyZWN0aXZlcwogICAgICAgIHByb2Nlc3NGb3IoZWxlbWVudCk7CiAgICAgICAgcHJvY2Vzc0lmKGVsZW1lbnQpOwogICAgICAgIHByb2Nlc3NPbmNlKGVsZW1lbnQpOwogICAgICAgIC8vIGVsZW1lbnQtc2NvcGUgc3R1ZmYKICAgICAgICBwcm9jZXNzRWxlbWVudChlbGVtZW50LCBvcHRpb25zKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2hlY2tSb290Q29uc3RyYWludHMgKGVsKSB7CiAgICAgICAgewogICAgICAgICAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnIHx8IGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8IiArIChlbC50YWcpICsgIj4gYXMgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlIGl0IG1heSAiICsKICAgICAgICAgICAgICAnY29udGFpbiBtdWx0aXBsZSBub2Rlcy4nCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZWwuYXR0cnNNYXAuaGFzT3duUHJvcGVydHkoJ3YtZm9yJykpIHsKICAgICAgICAgICAgd2Fybk9uY2UoCiAgICAgICAgICAgICAgJ0Nhbm5vdCB1c2Ugdi1mb3Igb24gc3RhdGVmdWwgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlICcgKwogICAgICAgICAgICAgICdpdCByZW5kZXJzIG11bHRpcGxlIGVsZW1lbnRzLicKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIHRyZWUgbWFuYWdlbWVudAogICAgICBpZiAoIXJvb3QpIHsKICAgICAgICByb290ID0gZWxlbWVudDsKICAgICAgICBjaGVja1Jvb3RDb25zdHJhaW50cyhyb290KTsKICAgICAgfSBlbHNlIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgLy8gYWxsb3cgcm9vdCBlbGVtZW50cyB3aXRoIHYtaWYsIHYtZWxzZS1pZiBhbmQgdi1lbHNlCiAgICAgICAgaWYgKHJvb3QuaWYgJiYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkpIHsKICAgICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKGVsZW1lbnQpOwogICAgICAgICAgYWRkSWZDb25kaXRpb24ocm9vdCwgewogICAgICAgICAgICBleHA6IGVsZW1lbnQuZWxzZWlmLAogICAgICAgICAgICBibG9jazogZWxlbWVudAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm5PbmNlKAogICAgICAgICAgICAiQ29tcG9uZW50IHRlbXBsYXRlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gIiArCiAgICAgICAgICAgICJJZiB5b3UgYXJlIHVzaW5nIHYtaWYgb24gbXVsdGlwbGUgZWxlbWVudHMsICIgKwogICAgICAgICAgICAidXNlIHYtZWxzZS1pZiB0byBjaGFpbiB0aGVtIGluc3RlYWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgJiYgIWVsZW1lbnQuZm9yYmlkZGVuKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkgewogICAgICAgICAgcHJvY2Vzc0lmQ29uZGl0aW9ucyhlbGVtZW50LCBjdXJyZW50UGFyZW50KTsKICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc2xvdFNjb3BlKSB7IC8vIHNjb3BlZCBzbG90CiAgICAgICAgICBjdXJyZW50UGFyZW50LnBsYWluID0gZmFsc2U7CiAgICAgICAgICB2YXIgbmFtZSA9IGVsZW1lbnQuc2xvdFRhcmdldCB8fCAnImRlZmF1bHQiJzsoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyB8fCAoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyA9IHt9KSlbbmFtZV0gPSBlbGVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goZWxlbWVudCk7CiAgICAgICAgICBlbGVtZW50LnBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdW5hcnkpIHsKICAgICAgICBjdXJyZW50UGFyZW50ID0gZWxlbWVudDsKICAgICAgICBzdGFjay5wdXNoKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgICAgfQogICAgfSwKCiAgICBlbmQ6IGZ1bmN0aW9uIGVuZCAoKSB7CiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgIHZhciBlbGVtZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIHZhciBsYXN0Tm9kZSA9IGVsZW1lbnQuY2hpbGRyZW5bZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDMgJiYgbGFzdE5vZGUudGV4dCA9PT0gJyAnICYmICFpblByZSkgewogICAgICAgIGVsZW1lbnQuY2hpbGRyZW4ucG9wKCk7CiAgICAgIH0KICAgICAgLy8gcG9wIHN0YWNrCiAgICAgIHN0YWNrLmxlbmd0aCAtPSAxOwogICAgICBjdXJyZW50UGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgIH0sCgogICAgY2hhcnM6IGZ1bmN0aW9uIGNoYXJzICh0ZXh0KSB7CiAgICAgIGlmICghY3VycmVudFBhcmVudCkgewogICAgICAgIHsKICAgICAgICAgIGlmICh0ZXh0ID09PSB0ZW1wbGF0ZSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAnQ29tcG9uZW50IHRlbXBsYXRlIHJlcXVpcmVzIGEgcm9vdCBlbGVtZW50LCByYXRoZXIgdGhhbiBqdXN0IHRleHQuJwogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIGlmICgodGV4dCA9IHRleHQudHJpbSgpKSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAoInRleHQgXCIiICsgdGV4dCArICJcIiBvdXRzaWRlIHJvb3QgZWxlbWVudCB3aWxsIGJlIGlnbm9yZWQuIikKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgLy8gSUUgdGV4dGFyZWEgcGxhY2Vob2xkZXIgYnVnCiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoaXNJRSAmJgogICAgICAgIGN1cnJlbnRQYXJlbnQudGFnID09PSAndGV4dGFyZWEnICYmCiAgICAgICAgY3VycmVudFBhcmVudC5hdHRyc01hcC5wbGFjZWhvbGRlciA9PT0gdGV4dAogICAgICApIHsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50UGFyZW50LmNoaWxkcmVuOwogICAgICB0ZXh0ID0gaW5QcmUgfHwgdGV4dC50cmltKCkKICAgICAgICA/IGlzVGV4dFRhZyhjdXJyZW50UGFyZW50KSA/IHRleHQgOiBkZWNvZGVIVE1MQ2FjaGVkKHRleHQpCiAgICAgICAgLy8gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGlmIGl0cyBub3QgcmlnaHQgYWZ0ZXIgYSBzdGFydGluZyB0YWcKICAgICAgICA6IHByZXNlcnZlV2hpdGVzcGFjZSAmJiBjaGlsZHJlbi5sZW5ndGggPyAnICcgOiAnJzsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIGlmICghaW5WUHJlICYmIHRleHQgIT09ICcgJyAmJiAocmVzID0gcGFyc2VUZXh0KHRleHQsIGRlbGltaXRlcnMpKSkgewogICAgICAgICAgY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHR5cGU6IDIsCiAgICAgICAgICAgIGV4cHJlc3Npb246IHJlcy5leHByZXNzaW9uLAogICAgICAgICAgICB0b2tlbnM6IHJlcy50b2tlbnMsCiAgICAgICAgICAgIHRleHQ6IHRleHQKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAodGV4dCAhPT0gJyAnIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dCAhPT0gJyAnKSB7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgdHlwZTogMywKICAgICAgICAgICAgdGV4dDogdGV4dAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY29tbWVudDogZnVuY3Rpb24gY29tbWVudCAodGV4dCkgewogICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goewogICAgICAgIHR5cGU6IDMsCiAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICBpc0NvbW1lbnQ6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJvb3QKfQoKZnVuY3Rpb24gcHJvY2Vzc1ByZSAoZWwpIHsKICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtcHJlJykgIT0gbnVsbCkgewogICAgZWwucHJlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSYXdBdHRycyAoZWwpIHsKICB2YXIgbCA9IGVsLmF0dHJzTGlzdC5sZW5ndGg7CiAgaWYgKGwpIHsKICAgIHZhciBhdHRycyA9IGVsLmF0dHJzID0gbmV3IEFycmF5KGwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgYXR0cnNbaV0gPSB7CiAgICAgICAgbmFtZTogZWwuYXR0cnNMaXN0W2ldLm5hbWUsCiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVsLmF0dHJzTGlzdFtpXS52YWx1ZSkKICAgICAgfTsKICAgIH0KICB9IGVsc2UgaWYgKCFlbC5wcmUpIHsKICAgIC8vIG5vbiByb290IG5vZGUgaW4gcHJlIGJsb2NrcyB3aXRoIG5vIGF0dHJpYnV0ZXMKICAgIGVsLnBsYWluID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50IChlbGVtZW50LCBvcHRpb25zKSB7CiAgcHJvY2Vzc0tleShlbGVtZW50KTsKCiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgYWZ0ZXIKICAvLyByZW1vdmluZyBzdHJ1Y3R1cmFsIGF0dHJpYnV0ZXMKICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFlbGVtZW50LmF0dHJzTGlzdC5sZW5ndGg7CgogIHByb2Nlc3NSZWYoZWxlbWVudCk7CiAgcHJvY2Vzc1Nsb3QoZWxlbWVudCk7CiAgcHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgIGVsZW1lbnQgPSB0cmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgfQogIHByb2Nlc3NBdHRycyhlbGVtZW50KTsKfQoKZnVuY3Rpb24gcHJvY2Vzc0tleSAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QmluZGluZ0F0dHIoZWwsICdrZXknKTsKICBpZiAoZXhwKSB7CiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICB3YXJuJDIoIjx0ZW1wbGF0ZT4gY2Fubm90IGJlIGtleWVkLiBQbGFjZSB0aGUga2V5IG9uIHJlYWwgZWxlbWVudHMgaW5zdGVhZC4iKTsKICAgIH0KICAgIGVsLmtleSA9IGV4cDsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSZWYgKGVsKSB7CiAgdmFyIHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAncmVmJyk7CiAgaWYgKHJlZikgewogICAgZWwucmVmID0gcmVmOwogICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NGb3IgKGVsKSB7CiAgdmFyIGV4cDsKICBpZiAoKGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWZvcicpKSkgewogICAgdmFyIHJlcyA9IHBhcnNlRm9yKGV4cCk7CiAgICBpZiAocmVzKSB7CiAgICAgIGV4dGVuZChlbCwgcmVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdhcm4kMigKICAgICAgICAoIkludmFsaWQgdi1mb3IgZXhwcmVzc2lvbjogIiArIGV4cCkKICAgICAgKTsKICAgIH0KICB9Cn0KCgoKZnVuY3Rpb24gcGFyc2VGb3IgKGV4cCkgewogIHZhciBpbk1hdGNoID0gZXhwLm1hdGNoKGZvckFsaWFzUkUpOwogIGlmICghaW5NYXRjaCkgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICByZXMuZm9yID0gaW5NYXRjaFsyXS50cmltKCk7CiAgdmFyIGFsaWFzID0gaW5NYXRjaFsxXS50cmltKCkucmVwbGFjZShzdHJpcFBhcmVuc1JFLCAnJyk7CiAgdmFyIGl0ZXJhdG9yTWF0Y2ggPSBhbGlhcy5tYXRjaChmb3JJdGVyYXRvclJFKTsKICBpZiAoaXRlcmF0b3JNYXRjaCkgewogICAgcmVzLmFsaWFzID0gYWxpYXMucmVwbGFjZShmb3JJdGVyYXRvclJFLCAnJyk7CiAgICByZXMuaXRlcmF0b3IxID0gaXRlcmF0b3JNYXRjaFsxXS50cmltKCk7CiAgICBpZiAoaXRlcmF0b3JNYXRjaFsyXSkgewogICAgICByZXMuaXRlcmF0b3IyID0gaXRlcmF0b3JNYXRjaFsyXS50cmltKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJlcy5hbGlhcyA9IGFsaWFzOwogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIHByb2Nlc3NJZiAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtaWYnKTsKICBpZiAoZXhwKSB7CiAgICBlbC5pZiA9IGV4cDsKICAgIGFkZElmQ29uZGl0aW9uKGVsLCB7CiAgICAgIGV4cDogZXhwLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScpICE9IG51bGwpIHsKICAgICAgZWwuZWxzZSA9IHRydWU7CiAgICB9CiAgICB2YXIgZWxzZWlmID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZS1pZicpOwogICAgaWYgKGVsc2VpZikgewogICAgICBlbC5lbHNlaWYgPSBlbHNlaWY7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBwcm9jZXNzSWZDb25kaXRpb25zIChlbCwgcGFyZW50KSB7CiAgdmFyIHByZXYgPSBmaW5kUHJldkVsZW1lbnQocGFyZW50LmNoaWxkcmVuKTsKICBpZiAocHJldiAmJiBwcmV2LmlmKSB7CiAgICBhZGRJZkNvbmRpdGlvbihwcmV2LCB7CiAgICAgIGV4cDogZWwuZWxzZWlmLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICB3YXJuJDIoCiAgICAgICJ2LSIgKyAoZWwuZWxzZWlmID8gKCdlbHNlLWlmPSInICsgZWwuZWxzZWlmICsgJyInKSA6ICdlbHNlJykgKyAiICIgKwogICAgICAidXNlZCBvbiBlbGVtZW50IDwiICsgKGVsLnRhZykgKyAiPiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdi1pZi4iCiAgICApOwogIH0KfQoKZnVuY3Rpb24gZmluZFByZXZFbGVtZW50IChjaGlsZHJlbikgewogIHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIGlmIChjaGlsZHJlbltpXS50eXBlID09PSAxKSB7CiAgICAgIHJldHVybiBjaGlsZHJlbltpXQogICAgfSBlbHNlIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGlsZHJlbltpXS50ZXh0ICE9PSAnICcpIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAidGV4dCBcIiIgKyAoY2hpbGRyZW5baV0udGV4dC50cmltKCkpICsgIlwiIGJldHdlZW4gdi1pZiBhbmQgdi1lbHNlKC1pZikgIiArCiAgICAgICAgICAid2lsbCBiZSBpZ25vcmVkLiIKICAgICAgICApOwogICAgICB9CiAgICAgIGNoaWxkcmVuLnBvcCgpOwogICAgfQogIH0KfQoKZnVuY3Rpb24gYWRkSWZDb25kaXRpb24gKGVsLCBjb25kaXRpb24pIHsKICBpZiAoIWVsLmlmQ29uZGl0aW9ucykgewogICAgZWwuaWZDb25kaXRpb25zID0gW107CiAgfQogIGVsLmlmQ29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NPbmNlIChlbCkgewogIHZhciBvbmNlJCQxID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Ytb25jZScpOwogIGlmIChvbmNlJCQxICE9IG51bGwpIHsKICAgIGVsLm9uY2UgPSB0cnVlOwogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc1Nsb3QgKGVsKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnKSB7CiAgICBlbC5zbG90TmFtZSA9IGdldEJpbmRpbmdBdHRyKGVsLCAnbmFtZScpOwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBlbC5rZXkpIHsKICAgICAgd2FybiQyKAogICAgICAgICJga2V5YCBkb2VzIG5vdCB3b3JrIG9uIDxzbG90PiBiZWNhdXNlIHNsb3RzIGFyZSBhYnN0cmFjdCBvdXRsZXRzICIgKwogICAgICAgICJhbmQgY2FuIHBvc3NpYmx5IGV4cGFuZCBpbnRvIG11bHRpcGxlIGVsZW1lbnRzLiAiICsKICAgICAgICAiVXNlIHRoZSBrZXkgb24gYSB3cmFwcGluZyBlbGVtZW50IGluc3RlYWQuIgogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgc2xvdFNjb3BlOwogICAgaWYgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICBzbG90U2NvcGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2NvcGUnKTsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgc2xvdFNjb3BlKSB7CiAgICAgICAgd2FybiQyKAogICAgICAgICAgInRoZSBcInNjb3BlXCIgYXR0cmlidXRlIGZvciBzY29wZWQgc2xvdHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kICIgKwogICAgICAgICAgInJlcGxhY2VkIGJ5IFwic2xvdC1zY29wZVwiIHNpbmNlIDIuNS4gVGhlIG5ldyBcInNsb3Qtc2NvcGVcIiBhdHRyaWJ1dGUgIiArCiAgICAgICAgICAiY2FuIGFsc28gYmUgdXNlZCBvbiBwbGFpbiBlbGVtZW50cyBpbiBhZGRpdGlvbiB0byA8dGVtcGxhdGU+IHRvICIgKwogICAgICAgICAgImRlbm90ZSBzY29wZWQgc2xvdHMuIiwKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICB9CiAgICAgIGVsLnNsb3RTY29wZSA9IHNsb3RTY29wZSB8fCBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2xvdC1zY29wZScpOwogICAgfSBlbHNlIGlmICgoc2xvdFNjb3BlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Nsb3Qtc2NvcGUnKSkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgZWwuYXR0cnNNYXBbJ3YtZm9yJ10pIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAiQW1iaWd1b3VzIGNvbWJpbmVkIHVzYWdlIG9mIHNsb3Qtc2NvcGUgYW5kIHYtZm9yIG9uIDwiICsgKGVsLnRhZykgKyAiPiAiICsKICAgICAgICAgICIodi1mb3IgdGFrZXMgaGlnaGVyIHByaW9yaXR5KS4gVXNlIGEgd3JhcHBlciA8dGVtcGxhdGU+IGZvciB0aGUgIiArCiAgICAgICAgICAic2NvcGVkIHNsb3QgdG8gbWFrZSBpdCBjbGVhcmVyLiIsCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgfQogICAgICBlbC5zbG90U2NvcGUgPSBzbG90U2NvcGU7CiAgICB9CiAgICB2YXIgc2xvdFRhcmdldCA9IGdldEJpbmRpbmdBdHRyKGVsLCAnc2xvdCcpOwogICAgaWYgKHNsb3RUYXJnZXQpIHsKICAgICAgZWwuc2xvdFRhcmdldCA9IHNsb3RUYXJnZXQgPT09ICciIicgPyAnImRlZmF1bHQiJyA6IHNsb3RUYXJnZXQ7CiAgICAgIC8vIHByZXNlcnZlIHNsb3QgYXMgYW4gYXR0cmlidXRlIGZvciBuYXRpdmUgc2hhZG93IERPTSBjb21wYXQKICAgICAgLy8gb25seSBmb3Igbm9uLXNjb3BlZCBzbG90cy4KICAgICAgaWYgKGVsLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICAgICAgYWRkQXR0cihlbCwgJ3Nsb3QnLCBzbG90VGFyZ2V0KTsKICAgICAgfQogICAgfQogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc0NvbXBvbmVudCAoZWwpIHsKICB2YXIgYmluZGluZzsKICBpZiAoKGJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2lzJykpKSB7CiAgICBlbC5jb21wb25lbnQgPSBiaW5kaW5nOwogIH0KICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ2lubGluZS10ZW1wbGF0ZScpICE9IG51bGwpIHsKICAgIGVsLmlubGluZVRlbXBsYXRlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NBdHRycyAoZWwpIHsKICB2YXIgbGlzdCA9IGVsLmF0dHJzTGlzdDsKICB2YXIgaSwgbCwgbmFtZSwgcmF3TmFtZSwgdmFsdWUsIG1vZGlmaWVycywgaXNQcm9wOwogIGZvciAoaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgbmFtZSA9IHJhd05hbWUgPSBsaXN0W2ldLm5hbWU7CiAgICB2YWx1ZSA9IGxpc3RbaV0udmFsdWU7CiAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAvLyBtYXJrIGVsZW1lbnQgYXMgZHluYW1pYwogICAgICBlbC5oYXNCaW5kaW5ncyA9IHRydWU7CiAgICAgIC8vIG1vZGlmaWVycwogICAgICBtb2RpZmllcnMgPSBwYXJzZU1vZGlmaWVycyhuYW1lKTsKICAgICAgaWYgKG1vZGlmaWVycykgewogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UobW9kaWZpZXJSRSwgJycpOwogICAgICB9CiAgICAgIGlmIChiaW5kUkUudGVzdChuYW1lKSkgeyAvLyB2LWJpbmQKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGJpbmRSRSwgJycpOwogICAgICAgIHZhbHVlID0gcGFyc2VGaWx0ZXJzKHZhbHVlKTsKICAgICAgICBpc1Byb3AgPSBmYWxzZTsKICAgICAgICBpZiAobW9kaWZpZXJzKSB7CiAgICAgICAgICBpZiAobW9kaWZpZXJzLnByb3ApIHsKICAgICAgICAgICAgaXNQcm9wID0gdHJ1ZTsKICAgICAgICAgICAgbmFtZSA9IGNhbWVsaXplKG5hbWUpOwogICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2lubmVySHRtbCcpIHsgbmFtZSA9ICdpbm5lckhUTUwnOyB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobW9kaWZpZXJzLmNhbWVsKSB7CiAgICAgICAgICAgIG5hbWUgPSBjYW1lbGl6ZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb2RpZmllcnMuc3luYykgewogICAgICAgICAgICBhZGRIYW5kbGVyKAogICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICgidXBkYXRlOiIgKyAoY2FtZWxpemUobmFtZSkpKSwKICAgICAgICAgICAgICBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgIiRldmVudCIpCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1Byb3AgfHwgKAogICAgICAgICAgIWVsLmNvbXBvbmVudCAmJiBwbGF0Zm9ybU11c3RVc2VQcm9wKGVsLnRhZywgZWwuYXR0cnNNYXAudHlwZSwgbmFtZSkKICAgICAgICApKSB7CiAgICAgICAgICBhZGRQcm9wKGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZEF0dHIoZWwsIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob25SRS50ZXN0KG5hbWUpKSB7IC8vIHYtb24KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9uUkUsICcnKTsKICAgICAgICBhZGRIYW5kbGVyKGVsLCBuYW1lLCB2YWx1ZSwgbW9kaWZpZXJzLCBmYWxzZSwgd2FybiQyKTsKICAgICAgfSBlbHNlIHsgLy8gbm9ybWFsIGRpcmVjdGl2ZXMKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGRpclJFLCAnJyk7CiAgICAgICAgLy8gcGFyc2UgYXJnCiAgICAgICAgdmFyIGFyZ01hdGNoID0gbmFtZS5tYXRjaChhcmdSRSk7CiAgICAgICAgdmFyIGFyZyA9IGFyZ01hdGNoICYmIGFyZ01hdGNoWzFdOwogICAgICAgIGlmIChhcmcpIHsKICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC0oYXJnLmxlbmd0aCArIDEpKTsKICAgICAgICB9CiAgICAgICAgYWRkRGlyZWN0aXZlKGVsLCBuYW1lLCByYXdOYW1lLCB2YWx1ZSwgYXJnLCBtb2RpZmllcnMpOwogICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSA9PT0gJ21vZGVsJykgewogICAgICAgICAgY2hlY2tGb3JBbGlhc01vZGVsKGVsLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBsaXRlcmFsIGF0dHJpYnV0ZQogICAgICB7CiAgICAgICAgdmFyIHJlcyA9IHBhcnNlVGV4dCh2YWx1ZSwgZGVsaW1pdGVycyk7CiAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgd2FybiQyKAogICAgICAgICAgICBuYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIjogIiArCiAgICAgICAgICAgICdJbnRlcnBvbGF0aW9uIGluc2lkZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIHJlbW92ZWQuICcgKwogICAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICsKICAgICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBpZD0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDppZD0idmFsIj4uJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkQXR0cihlbCwgbmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgICAgLy8gIzY4ODcgZmlyZWZveCBkb2Vzbid0IHVwZGF0ZSBtdXRlZCBzdGF0ZSBpZiBzZXQgdmlhIGF0dHJpYnV0ZQogICAgICAvLyBldmVuIGltbWVkaWF0ZWx5IGFmdGVyIGVsZW1lbnQgY3JlYXRpb24KICAgICAgaWYgKCFlbC5jb21wb25lbnQgJiYKICAgICAgICAgIG5hbWUgPT09ICdtdXRlZCcgJiYKICAgICAgICAgIHBsYXRmb3JtTXVzdFVzZVByb3AoZWwudGFnLCBlbC5hdHRyc01hcC50eXBlLCBuYW1lKSkgewogICAgICAgIGFkZFByb3AoZWwsIG5hbWUsICd0cnVlJyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrSW5Gb3IgKGVsKSB7CiAgdmFyIHBhcmVudCA9IGVsOwogIHdoaWxlIChwYXJlbnQpIHsKICAgIGlmIChwYXJlbnQuZm9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgfQogIHJldHVybiBmYWxzZQp9CgpmdW5jdGlvbiBwYXJzZU1vZGlmaWVycyAobmFtZSkgewogIHZhciBtYXRjaCA9IG5hbWUubWF0Y2gobW9kaWZpZXJSRSk7CiAgaWYgKG1hdGNoKSB7CiAgICB2YXIgcmV0ID0ge307CiAgICBtYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7IHJldFttLnNsaWNlKDEpXSA9IHRydWU7IH0pOwogICAgcmV0dXJuIHJldAogIH0KfQoKZnVuY3Rpb24gbWFrZUF0dHJzTWFwIChhdHRycykgewogIHZhciBtYXAgPSB7fTsKICBmb3IgKHZhciBpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKAogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbWFwW2F0dHJzW2ldLm5hbWVdICYmICFpc0lFICYmICFpc0VkZ2UKICAgICkgewogICAgICB3YXJuJDIoJ2R1cGxpY2F0ZSBhdHRyaWJ1dGU6ICcgKyBhdHRyc1tpXS5uYW1lKTsKICAgIH0KICAgIG1hcFthdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlOwogIH0KICByZXR1cm4gbWFwCn0KCi8vIGZvciBzY3JpcHQgKGUuZy4gdHlwZT0ieC90ZW1wbGF0ZSIpIG9yIHN0eWxlLCBkbyBub3QgZGVjb2RlIGNvbnRlbnQKZnVuY3Rpb24gaXNUZXh0VGFnIChlbCkgewogIHJldHVybiBlbC50YWcgPT09ICdzY3JpcHQnIHx8IGVsLnRhZyA9PT0gJ3N0eWxlJwp9CgpmdW5jdGlvbiBpc0ZvcmJpZGRlblRhZyAoZWwpIHsKICByZXR1cm4gKAogICAgZWwudGFnID09PSAnc3R5bGUnIHx8CiAgICAoZWwudGFnID09PSAnc2NyaXB0JyAmJiAoCiAgICAgICFlbC5hdHRyc01hcC50eXBlIHx8CiAgICAgIGVsLmF0dHJzTWFwLnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnCiAgICApKQogICkKfQoKdmFyIGllTlNCdWcgPSAvXnhtbG5zOk5TXGQrLzsKdmFyIGllTlNQcmVmaXggPSAvXk5TXGQrOi87CgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBndWFyZElFU1ZHQnVnIChhdHRycykgewogIHZhciByZXMgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldOwogICAgaWYgKCFpZU5TQnVnLnRlc3QoYXR0ci5uYW1lKSkgewogICAgICBhdHRyLm5hbWUgPSBhdHRyLm5hbWUucmVwbGFjZShpZU5TUHJlZml4LCAnJyk7CiAgICAgIHJlcy5wdXNoKGF0dHIpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrRm9yQWxpYXNNb2RlbCAoZWwsIHZhbHVlKSB7CiAgdmFyIF9lbCA9IGVsOwogIHdoaWxlIChfZWwpIHsKICAgIGlmIChfZWwuZm9yICYmIF9lbC5hbGlhcyA9PT0gdmFsdWUpIHsKICAgICAgd2FybiQyKAogICAgICAgICI8IiArIChlbC50YWcpICsgIiB2LW1vZGVsPVwiIiArIHZhbHVlICsgIlwiPjogIiArCiAgICAgICAgIllvdSBhcmUgYmluZGluZyB2LW1vZGVsIGRpcmVjdGx5IHRvIGEgdi1mb3IgaXRlcmF0aW9uIGFsaWFzLiAiICsKICAgICAgICAiVGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgdi1mb3Igc291cmNlIGFycmF5IGJlY2F1c2UgIiArCiAgICAgICAgIndyaXRpbmcgdG8gdGhlIGFsaWFzIGlzIGxpa2UgbW9kaWZ5aW5nIGEgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGUuICIgKwogICAgICAgICJDb25zaWRlciB1c2luZyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCB1c2Ugdi1tb2RlbCBvbiBhbiBvYmplY3QgcHJvcGVydHkgaW5zdGVhZC4iCiAgICAgICk7CiAgICB9CiAgICBfZWwgPSBfZWwucGFyZW50OwogIH0KfQoKLyogICovCgovKioKICogRXhwYW5kIGlucHV0W3YtbW9kZWxdIHdpdGggZHlhbm1pYyB0eXBlIGJpbmRpbmdzIGludG8gdi1pZi1lbHNlIGNoYWlucwogKiBUdXJuIHRoaXM6CiAqICAgPGlucHV0IHYtbW9kZWw9ImRhdGFbdHlwZV0iIDp0eXBlPSJ0eXBlIj4KICogaW50byB0aGlzOgogKiAgIDxpbnB1dCB2LWlmPSJ0eXBlID09PSAnY2hlY2tib3gnIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iZGF0YVt0eXBlXSI+CiAqICAgPGlucHV0IHYtZWxzZS1pZj0idHlwZSA9PT0gJ3JhZGlvJyIgdHlwZT0icmFkaW8iIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKiAgIDxpbnB1dCB2LWVsc2UgOnR5cGU9InR5cGUiIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKi8KCmZ1bmN0aW9uIHByZVRyYW5zZm9ybU5vZGUgKGVsLCBvcHRpb25zKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ2lucHV0JykgewogICAgdmFyIG1hcCA9IGVsLmF0dHJzTWFwOwogICAgaWYgKCFtYXBbJ3YtbW9kZWwnXSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgdHlwZUJpbmRpbmc7CiAgICBpZiAobWFwWyc6dHlwZSddIHx8IG1hcFsndi1iaW5kOnR5cGUnXSkgewogICAgICB0eXBlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndHlwZScpOwogICAgfQogICAgaWYgKCFtYXAudHlwZSAmJiAhdHlwZUJpbmRpbmcgJiYgbWFwWyd2LWJpbmQnXSkgewogICAgICB0eXBlQmluZGluZyA9ICIoIiArIChtYXBbJ3YtYmluZCddKSArICIpLnR5cGUiOwogICAgfQoKICAgIGlmICh0eXBlQmluZGluZykgewogICAgICB2YXIgaWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1pZicsIHRydWUpOwogICAgICB2YXIgaWZDb25kaXRpb25FeHRyYSA9IGlmQ29uZGl0aW9uID8gKCImJigiICsgaWZDb25kaXRpb24gKyAiKSIpIDogIiI7CiAgICAgIHZhciBoYXNFbHNlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScsIHRydWUpICE9IG51bGw7CiAgICAgIHZhciBlbHNlSWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1lbHNlLWlmJywgdHJ1ZSk7CiAgICAgIC8vIDEuIGNoZWNrYm94CiAgICAgIHZhciBicmFuY2gwID0gY2xvbmVBU1RFbGVtZW50KGVsKTsKICAgICAgLy8gcHJvY2VzcyBmb3Igb24gdGhlIG1haW4gbm9kZQogICAgICBwcm9jZXNzRm9yKGJyYW5jaDApOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDAsICd0eXBlJywgJ2NoZWNrYm94Jyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDAsIG9wdGlvbnMpOwogICAgICBicmFuY2gwLnByb2Nlc3NlZCA9IHRydWU7IC8vIHByZXZlbnQgaXQgZnJvbSBkb3VibGUtcHJvY2Vzc2VkCiAgICAgIGJyYW5jaDAuaWYgPSAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J2NoZWNrYm94JyIgKyBpZkNvbmRpdGlvbkV4dHJhOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiBicmFuY2gwLmlmLAogICAgICAgIGJsb2NrOiBicmFuY2gwCiAgICAgIH0pOwogICAgICAvLyAyLiBhZGQgcmFkaW8gZWxzZS1pZiBjb25kaXRpb24KICAgICAgdmFyIGJyYW5jaDEgPSBjbG9uZUFTVEVsZW1lbnQoZWwpOwogICAgICBnZXRBbmRSZW1vdmVBdHRyKGJyYW5jaDEsICd2LWZvcicsIHRydWUpOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDEsICd0eXBlJywgJ3JhZGlvJyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDEsIG9wdGlvbnMpOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J3JhZGlvJyIgKyBpZkNvbmRpdGlvbkV4dHJhLAogICAgICAgIGJsb2NrOiBicmFuY2gxCiAgICAgIH0pOwogICAgICAvLyAzLiBvdGhlcgogICAgICB2YXIgYnJhbmNoMiA9IGNsb25lQVNURWxlbWVudChlbCk7CiAgICAgIGdldEFuZFJlbW92ZUF0dHIoYnJhbmNoMiwgJ3YtZm9yJywgdHJ1ZSk7CiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMiwgJzp0eXBlJywgdHlwZUJpbmRpbmcpOwogICAgICBwcm9jZXNzRWxlbWVudChicmFuY2gyLCBvcHRpb25zKTsKICAgICAgYWRkSWZDb25kaXRpb24oYnJhbmNoMCwgewogICAgICAgIGV4cDogaWZDb25kaXRpb24sCiAgICAgICAgYmxvY2s6IGJyYW5jaDIKICAgICAgfSk7CgogICAgICBpZiAoaGFzRWxzZSkgewogICAgICAgIGJyYW5jaDAuZWxzZSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoZWxzZUlmQ29uZGl0aW9uKSB7CiAgICAgICAgYnJhbmNoMC5lbHNlaWYgPSBlbHNlSWZDb25kaXRpb247CiAgICAgIH0KCiAgICAgIHJldHVybiBicmFuY2gwCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFTVEVsZW1lbnQgKGVsKSB7CiAgcmV0dXJuIGNyZWF0ZUFTVEVsZW1lbnQoZWwudGFnLCBlbC5hdHRyc0xpc3Quc2xpY2UoKSwgZWwucGFyZW50KQp9Cgp2YXIgbW9kZWwkMiA9IHsKICBwcmVUcmFuc2Zvcm1Ob2RlOiBwcmVUcmFuc2Zvcm1Ob2RlCn0KCnZhciBtb2R1bGVzJDEgPSBbCiAga2xhc3MkMSwKICBzdHlsZSQxLAogIG1vZGVsJDIKXQoKLyogICovCgpmdW5jdGlvbiB0ZXh0IChlbCwgZGlyKSB7CiAgaWYgKGRpci52YWx1ZSkgewogICAgYWRkUHJvcChlbCwgJ3RleHRDb250ZW50JywgKCJfcygiICsgKGRpci52YWx1ZSkgKyAiKSIpKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaHRtbCAoZWwsIGRpcikgewogIGlmIChkaXIudmFsdWUpIHsKICAgIGFkZFByb3AoZWwsICdpbm5lckhUTUwnLCAoIl9zKCIgKyAoZGlyLnZhbHVlKSArICIpIikpOwogIH0KfQoKdmFyIGRpcmVjdGl2ZXMkMSA9IHsKICBtb2RlbDogbW9kZWwsCiAgdGV4dDogdGV4dCwKICBodG1sOiBodG1sCn0KCi8qICAqLwoKdmFyIGJhc2VPcHRpb25zID0gewogIGV4cGVjdEhUTUw6IHRydWUsCiAgbW9kdWxlczogbW9kdWxlcyQxLAogIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXMkMSwKICBpc1ByZVRhZzogaXNQcmVUYWcsCiAgaXNVbmFyeVRhZzogaXNVbmFyeVRhZywKICBtdXN0VXNlUHJvcDogbXVzdFVzZVByb3AsCiAgY2FuQmVMZWZ0T3BlblRhZzogY2FuQmVMZWZ0T3BlblRhZywKICBpc1Jlc2VydmVkVGFnOiBpc1Jlc2VydmVkVGFnLAogIGdldFRhZ05hbWVzcGFjZTogZ2V0VGFnTmFtZXNwYWNlLAogIHN0YXRpY0tleXM6IGdlblN0YXRpY0tleXMobW9kdWxlcyQxKQp9OwoKLyogICovCgp2YXIgaXNTdGF0aWNLZXk7CnZhciBpc1BsYXRmb3JtUmVzZXJ2ZWRUYWc7Cgp2YXIgZ2VuU3RhdGljS2V5c0NhY2hlZCA9IGNhY2hlZChnZW5TdGF0aWNLZXlzJDEpOwoKLyoqCiAqIEdvYWwgb2YgdGhlIG9wdGltaXplcjogd2FsayB0aGUgZ2VuZXJhdGVkIHRlbXBsYXRlIEFTVCB0cmVlCiAqIGFuZCBkZXRlY3Qgc3ViLXRyZWVzIHRoYXQgYXJlIHB1cmVseSBzdGF0aWMsIGkuZS4gcGFydHMgb2YKICogdGhlIERPTSB0aGF0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZS4KICoKICogT25jZSB3ZSBkZXRlY3QgdGhlc2Ugc3ViLXRyZWVzLCB3ZSBjYW46CiAqCiAqIDEuIEhvaXN0IHRoZW0gaW50byBjb25zdGFudHMsIHNvIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8KICogICAgY3JlYXRlIGZyZXNoIG5vZGVzIGZvciB0aGVtIG9uIGVhY2ggcmUtcmVuZGVyOwogKiAyLiBDb21wbGV0ZWx5IHNraXAgdGhlbSBpbiB0aGUgcGF0Y2hpbmcgcHJvY2Vzcy4KICovCmZ1bmN0aW9uIG9wdGltaXplIChyb290LCBvcHRpb25zKSB7CiAgaWYgKCFyb290KSB7IHJldHVybiB9CiAgaXNTdGF0aWNLZXkgPSBnZW5TdGF0aWNLZXlzQ2FjaGVkKG9wdGlvbnMuc3RhdGljS2V5cyB8fCAnJyk7CiAgaXNQbGF0Zm9ybVJlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIC8vIGZpcnN0IHBhc3M6IG1hcmsgYWxsIG5vbi1zdGF0aWMgbm9kZXMuCiAgbWFya1N0YXRpYyQxKHJvb3QpOwogIC8vIHNlY29uZCBwYXNzOiBtYXJrIHN0YXRpYyByb290cy4KICBtYXJrU3RhdGljUm9vdHMocm9vdCwgZmFsc2UpOwp9CgpmdW5jdGlvbiBnZW5TdGF0aWNLZXlzJDEgKGtleXMpIHsKICByZXR1cm4gbWFrZU1hcCgKICAgICd0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzJyArCiAgICAoa2V5cyA/ICcsJyArIGtleXMgOiAnJykKICApCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMkMSAobm9kZSkgewogIG5vZGUuc3RhdGljID0gaXNTdGF0aWMobm9kZSk7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgLy8gZG8gbm90IG1ha2UgY29tcG9uZW50IHNsb3QgY29udGVudCBzdGF0aWMuIHRoaXMgYXZvaWRzCiAgICAvLyAxLiBjb21wb25lbnRzIG5vdCBhYmxlIHRvIG11dGF0ZSBzbG90IG5vZGVzCiAgICAvLyAyLiBzdGF0aWMgc2xvdCBjb250ZW50IGZhaWxzIGZvciBob3QtcmVsb2FkaW5nCiAgICBpZiAoCiAgICAgICFpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcobm9kZS50YWcpICYmCiAgICAgIG5vZGUudGFnICE9PSAnc2xvdCcgJiYKICAgICAgbm9kZS5hdHRyc01hcFsnaW5saW5lLXRlbXBsYXRlJ10gPT0gbnVsbAogICAgKSB7CiAgICAgIHJldHVybgogICAgfQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldOwogICAgICBtYXJrU3RhdGljJDEoY2hpbGQpOwogICAgICBpZiAoIWNoaWxkLnN0YXRpYykgewogICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICB2YXIgYmxvY2sgPSBub2RlLmlmQ29uZGl0aW9uc1tpJDFdLmJsb2NrOwogICAgICAgIG1hcmtTdGF0aWMkMShibG9jayk7CiAgICAgICAgaWYgKCFibG9jay5zdGF0aWMpIHsKICAgICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljUm9vdHMgKG5vZGUsIGlzSW5Gb3IpIHsKICBpZiAobm9kZS50eXBlID09PSAxKSB7CiAgICBpZiAobm9kZS5zdGF0aWMgfHwgbm9kZS5vbmNlKSB7CiAgICAgIG5vZGUuc3RhdGljSW5Gb3IgPSBpc0luRm9yOwogICAgfQogICAgLy8gRm9yIGEgbm9kZSB0byBxdWFsaWZ5IGFzIGEgc3RhdGljIHJvb3QsIGl0IHNob3VsZCBoYXZlIGNoaWxkcmVuIHRoYXQKICAgIC8vIGFyZSBub3QganVzdCBzdGF0aWMgdGV4dC4gT3RoZXJ3aXNlIHRoZSBjb3N0IG9mIGhvaXN0aW5nIG91dCB3aWxsCiAgICAvLyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgYW5kIGl0J3MgYmV0dGVyIG9mZiB0byBqdXN0IGFsd2F5cyByZW5kZXIgaXQgZnJlc2guCiAgICBpZiAobm9kZS5zdGF0aWMgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgISgKICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYKICAgICAgbm9kZS5jaGlsZHJlblswXS50eXBlID09PSAzCiAgICApKSB7CiAgICAgIG5vZGUuc3RhdGljUm9vdCA9IHRydWU7CiAgICAgIHJldHVybgogICAgfSBlbHNlIHsKICAgICAgbm9kZS5zdGF0aWNSb290ID0gZmFsc2U7CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgbWFya1N0YXRpY1Jvb3RzKG5vZGUuY2hpbGRyZW5baV0sIGlzSW5Gb3IgfHwgISFub2RlLmZvcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICBtYXJrU3RhdGljUm9vdHMobm9kZS5pZkNvbmRpdGlvbnNbaSQxXS5ibG9jaywgaXNJbkZvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGlzU3RhdGljIChub2RlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMikgeyAvLyBleHByZXNzaW9uCiAgICByZXR1cm4gZmFsc2UKICB9CiAgaWYgKG5vZGUudHlwZSA9PT0gMykgeyAvLyB0ZXh0CiAgICByZXR1cm4gdHJ1ZQogIH0KICByZXR1cm4gISEobm9kZS5wcmUgfHwgKAogICAgIW5vZGUuaGFzQmluZGluZ3MgJiYgLy8gbm8gZHluYW1pYyBiaW5kaW5ncwogICAgIW5vZGUuaWYgJiYgIW5vZGUuZm9yICYmIC8vIG5vdCB2LWlmIG9yIHYtZm9yIG9yIHYtZWxzZQogICAgIWlzQnVpbHRJblRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgYnVpbHQtaW4KICAgIGlzUGxhdGZvcm1SZXNlcnZlZFRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgY29tcG9uZW50CiAgICAhaXNEaXJlY3RDaGlsZE9mVGVtcGxhdGVGb3Iobm9kZSkgJiYKICAgIE9iamVjdC5rZXlzKG5vZGUpLmV2ZXJ5KGlzU3RhdGljS2V5KQogICkpCn0KCmZ1bmN0aW9uIGlzRGlyZWN0Q2hpbGRPZlRlbXBsYXRlRm9yIChub2RlKSB7CiAgd2hpbGUgKG5vZGUucGFyZW50KSB7CiAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICBpZiAobm9kZS50YWcgIT09ICd0ZW1wbGF0ZScpIHsKICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgICBpZiAobm9kZS5mb3IpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlCn0KCi8qICAqLwoKdmFyIGZuRXhwUkUgPSAvXihbXHckX10rfFwoW14pXSo/XCkpXHMqPT58XmZ1bmN0aW9uXHMqXCgvOwp2YXIgc2ltcGxlUGF0aFJFID0gL15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLzsKCi8vIEtleWJvYXJkRXZlbnQua2V5Q29kZSBhbGlhc2VzCnZhciBrZXlDb2RlcyA9IHsKICBlc2M6IDI3LAogIHRhYjogOSwKICBlbnRlcjogMTMsCiAgc3BhY2U6IDMyLAogIHVwOiAzOCwKICBsZWZ0OiAzNywKICByaWdodDogMzksCiAgZG93bjogNDAsCiAgJ2RlbGV0ZSc6IFs4LCA0Nl0KfTsKCi8vIEtleWJvYXJkRXZlbnQua2V5IGFsaWFzZXMKdmFyIGtleU5hbWVzID0gewogIGVzYzogJ0VzY2FwZScsCiAgdGFiOiAnVGFiJywKICBlbnRlcjogJ0VudGVyJywKICBzcGFjZTogJyAnLAogIC8vICM3ODA2OiBJRTExIHVzZXMga2V5IG5hbWVzIHdpdGhvdXQgYEFycm93YCBwcmVmaXggZm9yIGFycm93IGtleXMuCiAgdXA6IFsnVXAnLCAnQXJyb3dVcCddLAogIGxlZnQ6IFsnTGVmdCcsICdBcnJvd0xlZnQnXSwKICByaWdodDogWydSaWdodCcsICdBcnJvd1JpZ2h0J10sCiAgZG93bjogWydEb3duJywgJ0Fycm93RG93biddLAogICdkZWxldGUnOiBbJ0JhY2tzcGFjZScsICdEZWxldGUnXQp9OwoKLy8gIzQ4Njg6IG1vZGlmaWVycyB0aGF0IHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbGlzdGVuZXIKLy8gbmVlZCB0byBleHBsaWNpdGx5IHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIHRvIHJlbW92ZQovLyB0aGUgbGlzdGVuZXIgZm9yIC5vbmNlCnZhciBnZW5HdWFyZCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHsgcmV0dXJuICgiaWYoIiArIGNvbmRpdGlvbiArICIpcmV0dXJuIG51bGw7Iik7IH07Cgp2YXIgbW9kaWZpZXJDb2RlID0gewogIHN0b3A6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JywKICBwcmV2ZW50OiAnJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JywKICBzZWxmOiBnZW5HdWFyZCgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSwKICBjdHJsOiBnZW5HdWFyZCgiISRldmVudC5jdHJsS2V5IiksCiAgc2hpZnQ6IGdlbkd1YXJkKCIhJGV2ZW50LnNoaWZ0S2V5IiksCiAgYWx0OiBnZW5HdWFyZCgiISRldmVudC5hbHRLZXkiKSwKICBtZXRhOiBnZW5HdWFyZCgiISRldmVudC5tZXRhS2V5IiksCiAgbGVmdDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAwIiksCiAgbWlkZGxlOiBnZW5HdWFyZCgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSwKICByaWdodDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyIikKfTsKCmZ1bmN0aW9uIGdlbkhhbmRsZXJzICgKICBldmVudHMsCiAgaXNOYXRpdmUsCiAgd2FybgopIHsKICB2YXIgcmVzID0gaXNOYXRpdmUgPyAnbmF0aXZlT246eycgOiAnb246eyc7CiAgZm9yICh2YXIgbmFtZSBpbiBldmVudHMpIHsKICAgIHJlcyArPSAiXCIiICsgbmFtZSArICJcIjoiICsgKGdlbkhhbmRsZXIobmFtZSwgZXZlbnRzW25hbWVdKSkgKyAiLCI7CiAgfQogIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ30nCn0KCmZ1bmN0aW9uIGdlbkhhbmRsZXIgKAogIG5hbWUsCiAgaGFuZGxlcgopIHsKICBpZiAoIWhhbmRsZXIpIHsKICAgIHJldHVybiAnZnVuY3Rpb24oKXt9JwogIH0KCiAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHsKICAgIHJldHVybiAoIlsiICsgKGhhbmRsZXIubWFwKGZ1bmN0aW9uIChoYW5kbGVyKSB7IHJldHVybiBnZW5IYW5kbGVyKG5hbWUsIGhhbmRsZXIpOyB9KS5qb2luKCcsJykpICsgIl0iKQogIH0KCiAgdmFyIGlzTWV0aG9kUGF0aCA9IHNpbXBsZVBhdGhSRS50ZXN0KGhhbmRsZXIudmFsdWUpOwogIHZhciBpc0Z1bmN0aW9uRXhwcmVzc2lvbiA9IGZuRXhwUkUudGVzdChoYW5kbGVyLnZhbHVlKTsKCiAgaWYgKCFoYW5kbGVyLm1vZGlmaWVycykgewogICAgaWYgKGlzTWV0aG9kUGF0aCB8fCBpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gaGFuZGxlci52YWx1ZQogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICByZXR1cm4gKCJmdW5jdGlvbigkZXZlbnQpeyIgKyAoaGFuZGxlci52YWx1ZSkgKyAifSIpIC8vIGlubGluZSBzdGF0ZW1lbnQKICB9IGVsc2UgewogICAgdmFyIGNvZGUgPSAnJzsKICAgIHZhciBnZW5Nb2RpZmllckNvZGUgPSAnJzsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gaGFuZGxlci5tb2RpZmllcnMpIHsKICAgICAgaWYgKG1vZGlmaWVyQ29kZVtrZXldKSB7CiAgICAgICAgZ2VuTW9kaWZpZXJDb2RlICs9IG1vZGlmaWVyQ29kZVtrZXldOwogICAgICAgIC8vIGxlZnQvcmlnaHQKICAgICAgICBpZiAoa2V5Q29kZXNba2V5XSkgewogICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4YWN0JykgewogICAgICAgIHZhciBtb2RpZmllcnMgPSAoaGFuZGxlci5tb2RpZmllcnMpOwogICAgICAgIGdlbk1vZGlmaWVyQ29kZSArPSBnZW5HdWFyZCgKICAgICAgICAgIFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnbWV0YSddCiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleU1vZGlmaWVyKSB7IHJldHVybiAhbW9kaWZpZXJzW2tleU1vZGlmaWVyXTsgfSkKICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5TW9kaWZpZXIpIHsgcmV0dXJuICgiJGV2ZW50LiIgKyBrZXlNb2RpZmllciArICJLZXkiKTsgfSkKICAgICAgICAgICAgLmpvaW4oJ3x8JykKICAgICAgICApOwogICAgICB9IGVsc2UgewogICAgICAgIGtleXMucHVzaChrZXkpOwogICAgICB9CiAgICB9CiAgICBpZiAoa2V5cy5sZW5ndGgpIHsKICAgICAgY29kZSArPSBnZW5LZXlGaWx0ZXIoa2V5cyk7CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgbW9kaWZpZXJzIGxpa2UgcHJldmVudCBhbmQgc3RvcCBnZXQgZXhlY3V0ZWQgYWZ0ZXIga2V5IGZpbHRlcmluZwogICAgaWYgKGdlbk1vZGlmaWVyQ29kZSkgewogICAgICBjb2RlICs9IGdlbk1vZGlmaWVyQ29kZTsKICAgIH0KICAgIHZhciBoYW5kbGVyQ29kZSA9IGlzTWV0aG9kUGF0aAogICAgICA/ICgicmV0dXJuICIgKyAoaGFuZGxlci52YWx1ZSkgKyAiKCRldmVudCkiKQogICAgICA6IGlzRnVuY3Rpb25FeHByZXNzaW9uCiAgICAgICAgPyAoInJldHVybiAoIiArIChoYW5kbGVyLnZhbHVlKSArICIpKCRldmVudCkiKQogICAgICAgIDogaGFuZGxlci52YWx1ZTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgcmV0dXJuICgiZnVuY3Rpb24oJGV2ZW50KXsiICsgY29kZSArIGhhbmRsZXJDb2RlICsgIn0iKQogIH0KfQoKZnVuY3Rpb24gZ2VuS2V5RmlsdGVyIChrZXlzKSB7CiAgcmV0dXJuICgiaWYoISgnYnV0dG9uJyBpbiAkZXZlbnQpJiYiICsgKGtleXMubWFwKGdlbkZpbHRlckNvZGUpLmpvaW4oJyYmJykpICsgIilyZXR1cm4gbnVsbDsiKQp9CgpmdW5jdGlvbiBnZW5GaWx0ZXJDb2RlIChrZXkpIHsKICB2YXIga2V5VmFsID0gcGFyc2VJbnQoa2V5LCAxMCk7CiAgaWYgKGtleVZhbCkgewogICAgcmV0dXJuICgiJGV2ZW50LmtleUNvZGUhPT0iICsga2V5VmFsKQogIH0KICB2YXIga2V5Q29kZSA9IGtleUNvZGVzW2tleV07CiAgdmFyIGtleU5hbWUgPSBrZXlOYW1lc1trZXldOwogIHJldHVybiAoCiAgICAiX2soJGV2ZW50LmtleUNvZGUsIiArCiAgICAoSlNPTi5zdHJpbmdpZnkoa2V5KSkgKyAiLCIgKwogICAgKEpTT04uc3RyaW5naWZ5KGtleUNvZGUpKSArICIsIiArCiAgICAiJGV2ZW50LmtleSwiICsKICAgICIiICsgKEpTT04uc3RyaW5naWZ5KGtleU5hbWUpKSArCiAgICAiKSIKICApCn0KCi8qICAqLwoKZnVuY3Rpb24gb24gKGVsLCBkaXIpIHsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRpci5tb2RpZmllcnMpIHsKICAgIHdhcm4oInYtb24gd2l0aG91dCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IG1vZGlmaWVycy4iKTsKICB9CiAgZWwud3JhcExpc3RlbmVycyA9IGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiAoIl9nKCIgKyBjb2RlICsgIiwiICsgKGRpci52YWx1ZSkgKyAiKSIpOyB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGJpbmQkMSAoZWwsIGRpcikgewogIGVsLndyYXBEYXRhID0gZnVuY3Rpb24gKGNvZGUpIHsKICAgIHJldHVybiAoIl9iKCIgKyBjb2RlICsgIiwnIiArIChlbC50YWcpICsgIicsIiArIChkaXIudmFsdWUpICsgIiwiICsgKGRpci5tb2RpZmllcnMgJiYgZGlyLm1vZGlmaWVycy5wcm9wID8gJ3RydWUnIDogJ2ZhbHNlJykgKyAoZGlyLm1vZGlmaWVycyAmJiBkaXIubW9kaWZpZXJzLnN5bmMgPyAnLHRydWUnIDogJycpICsgIikiKQogIH07Cn0KCi8qICAqLwoKdmFyIGJhc2VEaXJlY3RpdmVzID0gewogIG9uOiBvbiwKICBiaW5kOiBiaW5kJDEsCiAgY2xvYWs6IG5vb3AKfQoKLyogICovCgp2YXIgQ29kZWdlblN0YXRlID0gZnVuY3Rpb24gQ29kZWdlblN0YXRlIChvcHRpb25zKSB7CiAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICB0aGlzLndhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CiAgdGhpcy50cmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICd0cmFuc2Zvcm1Db2RlJyk7CiAgdGhpcy5kYXRhR2VuRm5zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdnZW5EYXRhJyk7CiAgdGhpcy5kaXJlY3RpdmVzID0gZXh0ZW5kKGV4dGVuZCh7fSwgYmFzZURpcmVjdGl2ZXMpLCBvcHRpb25zLmRpcmVjdGl2ZXMpOwogIHZhciBpc1Jlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIHRoaXMubWF5YmVDb21wb25lbnQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICFpc1Jlc2VydmVkVGFnKGVsLnRhZyk7IH07CiAgdGhpcy5vbmNlSWQgPSAwOwogIHRoaXMuc3RhdGljUmVuZGVyRm5zID0gW107Cn07CgoKCmZ1bmN0aW9uIGdlbmVyYXRlICgKICBhc3QsCiAgb3B0aW9ucwopIHsKICB2YXIgc3RhdGUgPSBuZXcgQ29kZWdlblN0YXRlKG9wdGlvbnMpOwogIHZhciBjb2RlID0gYXN0ID8gZ2VuRWxlbWVudChhc3QsIHN0YXRlKSA6ICdfYygiZGl2IiknOwogIHJldHVybiB7CiAgICByZW5kZXI6ICgid2l0aCh0aGlzKXtyZXR1cm4gIiArIGNvZGUgKyAifSIpLAogICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMKICB9Cn0KCmZ1bmN0aW9uIGdlbkVsZW1lbnQgKGVsLCBzdGF0ZSkgewogIGlmIChlbC5zdGF0aWNSb290ICYmICFlbC5zdGF0aWNQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5TdGF0aWMoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwub25jZSAmJiAhZWwub25jZVByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbk9uY2UoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuZm9yICYmICFlbC5mb3JQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5Gb3IoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuaWYgJiYgIWVsLmlmUHJvY2Vzc2VkKSB7CiAgICByZXR1cm4gZ2VuSWYoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwudGFnID09PSAndGVtcGxhdGUnICYmICFlbC5zbG90VGFyZ2V0KSB7CiAgICByZXR1cm4gZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlKSB8fCAndm9pZCAwJwogIH0gZWxzZSBpZiAoZWwudGFnID09PSAnc2xvdCcpIHsKICAgIHJldHVybiBnZW5TbG90KGVsLCBzdGF0ZSkKICB9IGVsc2UgewogICAgLy8gY29tcG9uZW50IG9yIGVsZW1lbnQKICAgIHZhciBjb2RlOwogICAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgICBjb2RlID0gZ2VuQ29tcG9uZW50KGVsLmNvbXBvbmVudCwgZWwsIHN0YXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBkYXRhID0gZWwucGxhaW4gPyB1bmRlZmluZWQgOiBnZW5EYXRhJDIoZWwsIHN0YXRlKTsKCiAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmlubGluZVRlbXBsYXRlID8gbnVsbCA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSwgdHJ1ZSk7CiAgICAgIGNvZGUgPSAiX2MoJyIgKyAoZWwudGFnKSArICInIiArIChkYXRhID8gKCIsIiArIGRhdGEpIDogJycpICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKSArICIpIjsKICAgIH0KICAgIC8vIG1vZHVsZSB0cmFuc2Zvcm1zCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLnRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29kZSA9IHN0YXRlLnRyYW5zZm9ybXNbaV0oZWwsIGNvZGUpOwogICAgfQogICAgcmV0dXJuIGNvZGUKICB9Cn0KCi8vIGhvaXN0IHN0YXRpYyBzdWItdHJlZXMgb3V0CmZ1bmN0aW9uIGdlblN0YXRpYyAoZWwsIHN0YXRlKSB7CiAgZWwuc3RhdGljUHJvY2Vzc2VkID0gdHJ1ZTsKICBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMucHVzaCgoIndpdGgodGhpcyl7cmV0dXJuICIgKyAoZ2VuRWxlbWVudChlbCwgc3RhdGUpKSArICJ9IikpOwogIHJldHVybiAoIl9tKCIgKyAoc3RhdGUuc3RhdGljUmVuZGVyRm5zLmxlbmd0aCAtIDEpICsgKGVsLnN0YXRpY0luRm9yID8gJyx0cnVlJyA6ICcnKSArICIpIikKfQoKLy8gdi1vbmNlCmZ1bmN0aW9uIGdlbk9uY2UgKGVsLCBzdGF0ZSkgewogIGVsLm9uY2VQcm9jZXNzZWQgPSB0cnVlOwogIGlmIChlbC5pZiAmJiAhZWwuaWZQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5JZihlbCwgc3RhdGUpCiAgfSBlbHNlIGlmIChlbC5zdGF0aWNJbkZvcikgewogICAgdmFyIGtleSA9ICcnOwogICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgaWYgKHBhcmVudC5mb3IpIHsKICAgICAgICBrZXkgPSBwYXJlbnQua2V5OwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGlmICgha2V5KSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzdGF0ZS53YXJuKAogICAgICAgICJ2LW9uY2UgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgdi1mb3IgdGhhdCBpcyBrZXllZC4gIgogICAgICApOwogICAgICByZXR1cm4gZ2VuRWxlbWVudChlbCwgc3RhdGUpCiAgICB9CiAgICByZXR1cm4gKCJfbygiICsgKGdlbkVsZW1lbnQoZWwsIHN0YXRlKSkgKyAiLCIgKyAoc3RhdGUub25jZUlkKyspICsgIiwiICsga2V5ICsgIikiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuU3RhdGljKGVsLCBzdGF0ZSkKICB9Cn0KCmZ1bmN0aW9uIGdlbklmICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0RW1wdHkKKSB7CiAgZWwuaWZQcm9jZXNzZWQgPSB0cnVlOyAvLyBhdm9pZCByZWN1cnNpb24KICByZXR1cm4gZ2VuSWZDb25kaXRpb25zKGVsLmlmQ29uZGl0aW9ucy5zbGljZSgpLCBzdGF0ZSwgYWx0R2VuLCBhbHRFbXB0eSkKfQoKZnVuY3Rpb24gZ2VuSWZDb25kaXRpb25zICgKICBjb25kaXRpb25zLAogIHN0YXRlLAogIGFsdEdlbiwKICBhbHRFbXB0eQopIHsKICBpZiAoIWNvbmRpdGlvbnMubGVuZ3RoKSB7CiAgICByZXR1cm4gYWx0RW1wdHkgfHwgJ19lKCknCiAgfQoKICB2YXIgY29uZGl0aW9uID0gY29uZGl0aW9ucy5zaGlmdCgpOwogIGlmIChjb25kaXRpb24uZXhwKSB7CiAgICByZXR1cm4gKCIoIiArIChjb25kaXRpb24uZXhwKSArICIpPyIgKyAoZ2VuVGVybmFyeUV4cChjb25kaXRpb24uYmxvY2spKSArICI6IiArIChnZW5JZkNvbmRpdGlvbnMoY29uZGl0aW9ucywgc3RhdGUsIGFsdEdlbiwgYWx0RW1wdHkpKSkKICB9IGVsc2UgewogICAgcmV0dXJuICgiIiArIChnZW5UZXJuYXJ5RXhwKGNvbmRpdGlvbi5ibG9jaykpKQogIH0KCiAgLy8gdi1pZiB3aXRoIHYtb25jZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBsaWtlIChhKT9fbSgwKTpfbSgxKQogIGZ1bmN0aW9uIGdlblRlcm5hcnlFeHAgKGVsKSB7CiAgICByZXR1cm4gYWx0R2VuCiAgICAgID8gYWx0R2VuKGVsLCBzdGF0ZSkKICAgICAgOiBlbC5vbmNlCiAgICAgICAgPyBnZW5PbmNlKGVsLCBzdGF0ZSkKICAgICAgICA6IGdlbkVsZW1lbnQoZWwsIHN0YXRlKQogIH0KfQoKZnVuY3Rpb24gZ2VuRm9yICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0SGVscGVyCikgewogIHZhciBleHAgPSBlbC5mb3I7CiAgdmFyIGFsaWFzID0gZWwuYWxpYXM7CiAgdmFyIGl0ZXJhdG9yMSA9IGVsLml0ZXJhdG9yMSA/ICgiLCIgKyAoZWwuaXRlcmF0b3IxKSkgOiAnJzsKICB2YXIgaXRlcmF0b3IyID0gZWwuaXRlcmF0b3IyID8gKCIsIiArIChlbC5pdGVyYXRvcjIpKSA6ICcnOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICBzdGF0ZS5tYXliZUNvbXBvbmVudChlbCkgJiYKICAgIGVsLnRhZyAhPT0gJ3Nsb3QnICYmCiAgICBlbC50YWcgIT09ICd0ZW1wbGF0ZScgJiYKICAgICFlbC5rZXkKICApIHsKICAgIHN0YXRlLndhcm4oCiAgICAgICI8IiArIChlbC50YWcpICsgIiB2LWZvcj1cIiIgKyBhbGlhcyArICIgaW4gIiArIGV4cCArICJcIj46IGNvbXBvbmVudCBsaXN0cyByZW5kZXJlZCB3aXRoICIgKwogICAgICAidi1mb3Igc2hvdWxkIGhhdmUgZXhwbGljaXQga2V5cy4gIiArCiAgICAgICJTZWUgaHR0cHM6Ly92dWVqcy5vcmcvZ3VpZGUvbGlzdC5odG1sI2tleSBmb3IgbW9yZSBpbmZvLiIsCiAgICAgIHRydWUgLyogdGlwICovCiAgICApOwogIH0KCiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuIChhbHRIZWxwZXIgfHwgJ19sJykgKyAiKCgiICsgZXhwICsgIiksIiArCiAgICAiZnVuY3Rpb24oIiArIGFsaWFzICsgaXRlcmF0b3IxICsgaXRlcmF0b3IyICsgIil7IiArCiAgICAgICJyZXR1cm4gIiArICgoYWx0R2VuIHx8IGdlbkVsZW1lbnQpKGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuRGF0YSQyIChlbCwgc3RhdGUpIHsKICB2YXIgZGF0YSA9ICd7JzsKCiAgLy8gZGlyZWN0aXZlcyBmaXJzdC4KICAvLyBkaXJlY3RpdmVzIG1heSBtdXRhdGUgdGhlIGVsJ3Mgb3RoZXIgcHJvcGVydGllcyBiZWZvcmUgdGhleSBhcmUgZ2VuZXJhdGVkLgogIHZhciBkaXJzID0gZ2VuRGlyZWN0aXZlcyhlbCwgc3RhdGUpOwogIGlmIChkaXJzKSB7IGRhdGEgKz0gZGlycyArICcsJzsgfQoKICAvLyBrZXkKICBpZiAoZWwua2V5KSB7CiAgICBkYXRhICs9ICJrZXk6IiArIChlbC5rZXkpICsgIiwiOwogIH0KICAvLyByZWYKICBpZiAoZWwucmVmKSB7CiAgICBkYXRhICs9ICJyZWY6IiArIChlbC5yZWYpICsgIiwiOwogIH0KICBpZiAoZWwucmVmSW5Gb3IpIHsKICAgIGRhdGEgKz0gInJlZkluRm9yOnRydWUsIjsKICB9CiAgLy8gcHJlCiAgaWYgKGVsLnByZSkgewogICAgZGF0YSArPSAicHJlOnRydWUsIjsKICB9CiAgLy8gcmVjb3JkIG9yaWdpbmFsIHRhZyBuYW1lIGZvciBjb21wb25lbnRzIHVzaW5nICJpcyIgYXR0cmlidXRlCiAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgZGF0YSArPSAidGFnOlwiIiArIChlbC50YWcpICsgIlwiLCI7CiAgfQogIC8vIG1vZHVsZSBkYXRhIGdlbmVyYXRpb24gZnVuY3Rpb25zCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5kYXRhR2VuRm5zLmxlbmd0aDsgaSsrKSB7CiAgICBkYXRhICs9IHN0YXRlLmRhdGFHZW5GbnNbaV0oZWwpOwogIH0KICAvLyBhdHRyaWJ1dGVzCiAgaWYgKGVsLmF0dHJzKSB7CiAgICBkYXRhICs9ICJhdHRyczp7IiArIChnZW5Qcm9wcyhlbC5hdHRycykpICsgIn0sIjsKICB9CiAgLy8gRE9NIHByb3BzCiAgaWYgKGVsLnByb3BzKSB7CiAgICBkYXRhICs9ICJkb21Qcm9wczp7IiArIChnZW5Qcm9wcyhlbC5wcm9wcykpICsgIn0sIjsKICB9CiAgLy8gZXZlbnQgaGFuZGxlcnMKICBpZiAoZWwuZXZlbnRzKSB7CiAgICBkYXRhICs9IChnZW5IYW5kbGVycyhlbC5ldmVudHMsIGZhbHNlLCBzdGF0ZS53YXJuKSkgKyAiLCI7CiAgfQogIGlmIChlbC5uYXRpdmVFdmVudHMpIHsKICAgIGRhdGEgKz0gKGdlbkhhbmRsZXJzKGVsLm5hdGl2ZUV2ZW50cywgdHJ1ZSwgc3RhdGUud2FybikpICsgIiwiOwogIH0KICAvLyBzbG90IHRhcmdldAogIC8vIG9ubHkgZm9yIG5vbi1zY29wZWQgc2xvdHMKICBpZiAoZWwuc2xvdFRhcmdldCAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICBkYXRhICs9ICJzbG90OiIgKyAoZWwuc2xvdFRhcmdldCkgKyAiLCI7CiAgfQogIC8vIHNjb3BlZCBzbG90cwogIGlmIChlbC5zY29wZWRTbG90cykgewogICAgZGF0YSArPSAoZ2VuU2NvcGVkU2xvdHMoZWwuc2NvcGVkU2xvdHMsIHN0YXRlKSkgKyAiLCI7CiAgfQogIC8vIGNvbXBvbmVudCB2LW1vZGVsCiAgaWYgKGVsLm1vZGVsKSB7CiAgICBkYXRhICs9ICJtb2RlbDp7dmFsdWU6IiArIChlbC5tb2RlbC52YWx1ZSkgKyAiLGNhbGxiYWNrOiIgKyAoZWwubW9kZWwuY2FsbGJhY2spICsgIixleHByZXNzaW9uOiIgKyAoZWwubW9kZWwuZXhwcmVzc2lvbikgKyAifSwiOwogIH0KICAvLyBpbmxpbmUtdGVtcGxhdGUKICBpZiAoZWwuaW5saW5lVGVtcGxhdGUpIHsKICAgIHZhciBpbmxpbmVUZW1wbGF0ZSA9IGdlbklubGluZVRlbXBsYXRlKGVsLCBzdGF0ZSk7CiAgICBpZiAoaW5saW5lVGVtcGxhdGUpIHsKICAgICAgZGF0YSArPSBpbmxpbmVUZW1wbGF0ZSArICIsIjsKICAgIH0KICB9CiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLCQvLCAnJykgKyAnfSc7CiAgLy8gdi1iaW5kIGRhdGEgd3JhcAogIGlmIChlbC53cmFwRGF0YSkgewogICAgZGF0YSA9IGVsLndyYXBEYXRhKGRhdGEpOwogIH0KICAvLyB2LW9uIGRhdGEgd3JhcAogIGlmIChlbC53cmFwTGlzdGVuZXJzKSB7CiAgICBkYXRhID0gZWwud3JhcExpc3RlbmVycyhkYXRhKTsKICB9CiAgcmV0dXJuIGRhdGEKfQoKZnVuY3Rpb24gZ2VuRGlyZWN0aXZlcyAoZWwsIHN0YXRlKSB7CiAgdmFyIGRpcnMgPSBlbC5kaXJlY3RpdmVzOwogIGlmICghZGlycykgeyByZXR1cm4gfQogIHZhciByZXMgPSAnZGlyZWN0aXZlczpbJzsKICB2YXIgaGFzUnVudGltZSA9IGZhbHNlOwogIHZhciBpLCBsLCBkaXIsIG5lZWRSdW50aW1lOwogIGZvciAoaSA9IDAsIGwgPSBkaXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIG5lZWRSdW50aW1lID0gdHJ1ZTsKICAgIHZhciBnZW4gPSBzdGF0ZS5kaXJlY3RpdmVzW2Rpci5uYW1lXTsKICAgIGlmIChnZW4pIHsKICAgICAgLy8gY29tcGlsZS10aW1lIGRpcmVjdGl2ZSB0aGF0IG1hbmlwdWxhdGVzIEFTVC4KICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IGFsc28gbmVlZHMgYSBydW50aW1lIGNvdW50ZXJwYXJ0LgogICAgICBuZWVkUnVudGltZSA9ICEhZ2VuKGVsLCBkaXIsIHN0YXRlLndhcm4pOwogICAgfQogICAgaWYgKG5lZWRSdW50aW1lKSB7CiAgICAgIGhhc1J1bnRpbWUgPSB0cnVlOwogICAgICByZXMgKz0gIntuYW1lOlwiIiArIChkaXIubmFtZSkgKyAiXCIscmF3TmFtZTpcIiIgKyAoZGlyLnJhd05hbWUpICsgIlwiIiArIChkaXIudmFsdWUgPyAoIix2YWx1ZTooIiArIChkaXIudmFsdWUpICsgIiksZXhwcmVzc2lvbjoiICsgKEpTT04uc3RyaW5naWZ5KGRpci52YWx1ZSkpKSA6ICcnKSArIChkaXIuYXJnID8gKCIsYXJnOlwiIiArIChkaXIuYXJnKSArICJcIiIpIDogJycpICsgKGRpci5tb2RpZmllcnMgPyAoIixtb2RpZmllcnM6IiArIChKU09OLnN0cmluZ2lmeShkaXIubW9kaWZpZXJzKSkpIDogJycpICsgIn0sIjsKICAgIH0KICB9CiAgaWYgKGhhc1J1bnRpbWUpIHsKICAgIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ10nCiAgfQp9CgpmdW5jdGlvbiBnZW5JbmxpbmVUZW1wbGF0ZSAoZWwsIHN0YXRlKSB7CiAgdmFyIGFzdCA9IGVsLmNoaWxkcmVuWzBdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgKAogICAgZWwuY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGFzdC50eXBlICE9PSAxCiAgKSkgewogICAgc3RhdGUud2FybignSW5saW5lLXRlbXBsYXRlIGNvbXBvbmVudHMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGVsZW1lbnQuJyk7CiAgfQogIGlmIChhc3QudHlwZSA9PT0gMSkgewogICAgdmFyIGlubGluZVJlbmRlckZucyA9IGdlbmVyYXRlKGFzdCwgc3RhdGUub3B0aW9ucyk7CiAgICByZXR1cm4gKCJpbmxpbmVUZW1wbGF0ZTp7cmVuZGVyOmZ1bmN0aW9uKCl7IiArIChpbmxpbmVSZW5kZXJGbnMucmVuZGVyKSArICJ9LHN0YXRpY1JlbmRlckZuczpbIiArIChpbmxpbmVSZW5kZXJGbnMuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gKCJmdW5jdGlvbigpeyIgKyBjb2RlICsgIn0iKTsgfSkuam9pbignLCcpKSArICJdfSIpCiAgfQp9CgpmdW5jdGlvbiBnZW5TY29wZWRTbG90cyAoCiAgc2xvdHMsCiAgc3RhdGUKKSB7CiAgcmV0dXJuICgic2NvcGVkU2xvdHM6X3UoWyIgKyAoT2JqZWN0LmtleXMoc2xvdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7CiAgICAgIHJldHVybiBnZW5TY29wZWRTbG90KGtleSwgc2xvdHNba2V5XSwgc3RhdGUpCiAgICB9KS5qb2luKCcsJykpICsgIl0pIikKfQoKZnVuY3Rpb24gZ2VuU2NvcGVkU2xvdCAoCiAga2V5LAogIGVsLAogIHN0YXRlCikgewogIGlmIChlbC5mb3IgJiYgIWVsLmZvclByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbkZvclNjb3BlZFNsb3Qoa2V5LCBlbCwgc3RhdGUpCiAgfQogIHZhciBmbiA9ICJmdW5jdGlvbigiICsgKFN0cmluZyhlbC5zbG90U2NvcGUpKSArICIpeyIgKwogICAgInJldHVybiAiICsgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJwogICAgICA/IGVsLmlmCiAgICAgICAgPyAoKGVsLmlmKSArICI/IiArIChnZW5DaGlsZHJlbihlbCwgc3RhdGUpIHx8ICd1bmRlZmluZWQnKSArICI6dW5kZWZpbmVkIikKICAgICAgICA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSkgfHwgJ3VuZGVmaW5lZCcKICAgICAgOiBnZW5FbGVtZW50KGVsLCBzdGF0ZSkpICsgIn0iOwogIHJldHVybiAoIntrZXk6IiArIGtleSArICIsZm46IiArIGZuICsgIn0iKQp9CgpmdW5jdGlvbiBnZW5Gb3JTY29wZWRTbG90ICgKICBrZXksCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGV4cCA9IGVsLmZvcjsKICB2YXIgYWxpYXMgPSBlbC5hbGlhczsKICB2YXIgaXRlcmF0b3IxID0gZWwuaXRlcmF0b3IxID8gKCIsIiArIChlbC5pdGVyYXRvcjEpKSA6ICcnOwogIHZhciBpdGVyYXRvcjIgPSBlbC5pdGVyYXRvcjIgPyAoIiwiICsgKGVsLml0ZXJhdG9yMikpIDogJyc7CiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuICJfbCgoIiArIGV4cCArICIpLCIgKwogICAgImZ1bmN0aW9uKCIgKyBhbGlhcyArIGl0ZXJhdG9yMSArIGl0ZXJhdG9yMiArICIpeyIgKwogICAgICAicmV0dXJuICIgKyAoZ2VuU2NvcGVkU2xvdChrZXksIGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuQ2hpbGRyZW4gKAogIGVsLAogIHN0YXRlLAogIGNoZWNrU2tpcCwKICBhbHRHZW5FbGVtZW50LAogIGFsdEdlbk5vZGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47CiAgaWYgKGNoaWxkcmVuLmxlbmd0aCkgewogICAgdmFyIGVsJDEgPSBjaGlsZHJlblswXTsKICAgIC8vIG9wdGltaXplIHNpbmdsZSB2LWZvcgogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJgogICAgICBlbCQxLmZvciAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3Nsb3QnCiAgICApIHsKICAgICAgcmV0dXJuIChhbHRHZW5FbGVtZW50IHx8IGdlbkVsZW1lbnQpKGVsJDEsIHN0YXRlKQogICAgfQogICAgdmFyIG5vcm1hbGl6YXRpb25UeXBlID0gY2hlY2tTa2lwCiAgICAgID8gZ2V0Tm9ybWFsaXphdGlvblR5cGUoY2hpbGRyZW4sIHN0YXRlLm1heWJlQ29tcG9uZW50KQogICAgICA6IDA7CiAgICB2YXIgZ2VuID0gYWx0R2VuTm9kZSB8fCBnZW5Ob2RlOwogICAgcmV0dXJuICgiWyIgKyAoY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBnZW4oYywgc3RhdGUpOyB9KS5qb2luKCcsJykpICsgIl0iICsgKG5vcm1hbGl6YXRpb25UeXBlID8gKCIsIiArIG5vcm1hbGl6YXRpb25UeXBlKSA6ICcnKSkKICB9Cn0KCi8vIGRldGVybWluZSB0aGUgbm9ybWFsaXphdGlvbiBuZWVkZWQgZm9yIHRoZSBjaGlsZHJlbiBhcnJheS4KLy8gMDogbm8gbm9ybWFsaXphdGlvbiBuZWVkZWQKLy8gMTogc2ltcGxlIG5vcm1hbGl6YXRpb24gbmVlZGVkIChwb3NzaWJsZSAxLWxldmVsIGRlZXAgbmVzdGVkIGFycmF5KQovLyAyOiBmdWxsIG5vcm1hbGl6YXRpb24gbmVlZGVkCmZ1bmN0aW9uIGdldE5vcm1hbGl6YXRpb25UeXBlICgKICBjaGlsZHJlbiwKICBtYXliZUNvbXBvbmVudAopIHsKICB2YXIgcmVzID0gMDsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZWwgPSBjaGlsZHJlbltpXTsKICAgIGlmIChlbC50eXBlICE9PSAxKSB7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAobmVlZHNOb3JtYWxpemF0aW9uKGVsKSB8fAogICAgICAgIChlbC5pZkNvbmRpdGlvbnMgJiYgZWwuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIG5lZWRzTm9ybWFsaXphdGlvbihjLmJsb2NrKTsgfSkpKSB7CiAgICAgIHJlcyA9IDI7CiAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAobWF5YmVDb21wb25lbnQoZWwpIHx8CiAgICAgICAgKGVsLmlmQ29uZGl0aW9ucyAmJiBlbC5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gbWF5YmVDb21wb25lbnQoYy5ibG9jayk7IH0pKSkgewogICAgICByZXMgPSAxOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIG5lZWRzTm9ybWFsaXphdGlvbiAoZWwpIHsKICByZXR1cm4gZWwuZm9yICE9PSB1bmRlZmluZWQgfHwgZWwudGFnID09PSAndGVtcGxhdGUnIHx8IGVsLnRhZyA9PT0gJ3Nsb3QnCn0KCmZ1bmN0aW9uIGdlbk5vZGUgKG5vZGUsIHN0YXRlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgcmV0dXJuIGdlbkVsZW1lbnQobm9kZSwgc3RhdGUpCiAgfSBpZiAobm9kZS50eXBlID09PSAzICYmIG5vZGUuaXNDb21tZW50KSB7CiAgICByZXR1cm4gZ2VuQ29tbWVudChub2RlKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuVGV4dChub2RlKQogIH0KfQoKZnVuY3Rpb24gZ2VuVGV4dCAodGV4dCkgewogIHJldHVybiAoIl92KCIgKyAodGV4dC50eXBlID09PSAyCiAgICA/IHRleHQuZXhwcmVzc2lvbiAvLyBubyBuZWVkIGZvciAoKSBiZWNhdXNlIGFscmVhZHkgd3JhcHBlZCBpbiBfcygpCiAgICA6IHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyhKU09OLnN0cmluZ2lmeSh0ZXh0LnRleHQpKSkgKyAiKSIpCn0KCmZ1bmN0aW9uIGdlbkNvbW1lbnQgKGNvbW1lbnQpIHsKICByZXR1cm4gKCJfZSgiICsgKEpTT04uc3RyaW5naWZ5KGNvbW1lbnQudGV4dCkpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5TbG90IChlbCwgc3RhdGUpIHsKICB2YXIgc2xvdE5hbWUgPSBlbC5zbG90TmFtZSB8fCAnImRlZmF1bHQiJzsKICB2YXIgY2hpbGRyZW4gPSBnZW5DaGlsZHJlbihlbCwgc3RhdGUpOwogIHZhciByZXMgPSAiX3QoIiArIHNsb3ROYW1lICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKTsKICB2YXIgYXR0cnMgPSBlbC5hdHRycyAmJiAoInsiICsgKGVsLmF0dHJzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChjYW1lbGl6ZShhLm5hbWUpKSArICI6IiArIChhLnZhbHVlKSk7IH0pLmpvaW4oJywnKSkgKyAifSIpOwogIHZhciBiaW5kJCQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZCddOwogIGlmICgoYXR0cnMgfHwgYmluZCQkMSkgJiYgIWNoaWxkcmVuKSB7CiAgICByZXMgKz0gIixudWxsIjsKICB9CiAgaWYgKGF0dHJzKSB7CiAgICByZXMgKz0gIiwiICsgYXR0cnM7CiAgfQogIGlmIChiaW5kJCQxKSB7CiAgICByZXMgKz0gKGF0dHJzID8gJycgOiAnLG51bGwnKSArICIsIiArIGJpbmQkJDE7CiAgfQogIHJldHVybiByZXMgKyAnKScKfQoKLy8gY29tcG9uZW50TmFtZSBpcyBlbC5jb21wb25lbnQsIHRha2UgaXQgYXMgYXJndW1lbnQgdG8gc2h1biBmbG93J3MgcGVzc2ltaXN0aWMgcmVmaW5lbWVudApmdW5jdGlvbiBnZW5Db21wb25lbnQgKAogIGNvbXBvbmVudE5hbWUsCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuaW5saW5lVGVtcGxhdGUgPyBudWxsIDogZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlLCB0cnVlKTsKICByZXR1cm4gKCJfYygiICsgY29tcG9uZW50TmFtZSArICIsIiArIChnZW5EYXRhJDIoZWwsIHN0YXRlKSkgKyAoY2hpbGRyZW4gPyAoIiwiICsgY2hpbGRyZW4pIDogJycpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5Qcm9wcyAocHJvcHMpIHsKICB2YXIgcmVzID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgdmFyIHByb3AgPSBwcm9wc1tpXTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICByZXMgKz0gIlwiIiArIChwcm9wLm5hbWUpICsgIlwiOiIgKyAodHJhbnNmb3JtU3BlY2lhbE5ld2xpbmVzKHByb3AudmFsdWUpKSArICIsIjsKICAgIH0KICB9CiAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkKfQoKLy8gIzM4OTUsICM0MjY4CmZ1bmN0aW9uIHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyAodGV4dCkgewogIHJldHVybiB0ZXh0CiAgICAucmVwbGFjZSgvXHUyMDI4L2csICdcXHUyMDI4JykKICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKQp9CgovKiAgKi8KCi8vIHRoZXNlIGtleXdvcmRzIHNob3VsZCBub3QgYXBwZWFyIGluc2lkZSBleHByZXNzaW9ucywgYnV0IG9wZXJhdG9ycyBsaWtlCi8vIHR5cGVvZiwgaW5zdGFuY2VvZiBhbmQgaW4gYXJlIGFsbG93ZWQKdmFyIHByb2hpYml0ZWRLZXl3b3JkUkUgPSBuZXcgUmVnRXhwKCdcXGInICsgKAogICdkbyxpZixmb3IsbGV0LG5ldyx0cnksdmFyLGNhc2UsZWxzZSx3aXRoLGF3YWl0LGJyZWFrLGNhdGNoLGNsYXNzLGNvbnN0LCcgKwogICdzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsJyArCiAgJ2V4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMnCikuc3BsaXQoJywnKS5qb2luKCdcXGJ8XFxiJykgKyAnXFxiJyk7CgovLyB0aGVzZSB1bmFyeSBvcGVyYXRvcnMgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHByb3BlcnR5L21ldGhvZCBuYW1lcwp2YXIgdW5hcnlPcGVyYXRvcnNSRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyAoCiAgJ2RlbGV0ZSx0eXBlb2Ysdm9pZCcKKS5zcGxpdCgnLCcpLmpvaW4oJ1xccypcXChbXlxcKV0qXFwpfFxcYicpICsgJ1xccypcXChbXlxcKV0qXFwpJyk7CgovLyBzdHJpcCBzdHJpbmdzIGluIGV4cHJlc3Npb25zCnZhciBzdHJpcFN0cmluZ1JFID0gLycoPzpbXidcXF18XFwuKSonfCIoPzpbXiJcXF18XFwuKSoifGAoPzpbXmBcXF18XFwuKSpcJFx7fFx9KD86W15gXFxdfFxcLikqYHxgKD86W15gXFxdfFxcLikqYC9nOwoKLy8gZGV0ZWN0IHByb2JsZW1hdGljIGV4cHJlc3Npb25zIGluIGEgdGVtcGxhdGUKZnVuY3Rpb24gZGV0ZWN0RXJyb3JzIChhc3QpIHsKICB2YXIgZXJyb3JzID0gW107CiAgaWYgKGFzdCkgewogICAgY2hlY2tOb2RlKGFzdCwgZXJyb3JzKTsKICB9CiAgcmV0dXJuIGVycm9ycwp9CgpmdW5jdGlvbiBjaGVja05vZGUgKG5vZGUsIGVycm9ycykgewogIGlmIChub2RlLnR5cGUgPT09IDEpIHsKICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZS5hdHRyc01hcCkgewogICAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuYXR0cnNNYXBbbmFtZV07CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAobmFtZSA9PT0gJ3YtZm9yJykgewogICAgICAgICAgICBjaGVja0Zvcihub2RlLCAoInYtZm9yPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9IGVsc2UgaWYgKG9uUkUudGVzdChuYW1lKSkgewogICAgICAgICAgICBjaGVja0V2ZW50KHZhbHVlLCAobmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIiKSwgZXJyb3JzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoZWNrRXhwcmVzc2lvbih2YWx1ZSwgKG5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGVja05vZGUobm9kZS5jaGlsZHJlbltpXSwgZXJyb3JzKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAyKSB7CiAgICBjaGVja0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBub2RlLnRleHQsIGVycm9ycyk7CiAgfQp9CgpmdW5jdGlvbiBjaGVja0V2ZW50IChleHAsIHRleHQsIGVycm9ycykgewogIHZhciBzdGlwcGVkID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpOwogIHZhciBrZXl3b3JkTWF0Y2ggPSBzdGlwcGVkLm1hdGNoKHVuYXJ5T3BlcmF0b3JzUkUpOwogIGlmIChrZXl3b3JkTWF0Y2ggJiYgc3RpcHBlZC5jaGFyQXQoa2V5d29yZE1hdGNoLmluZGV4IC0gMSkgIT09ICckJykgewogICAgZXJyb3JzLnB1c2goCiAgICAgICJhdm9pZCB1c2luZyBKYXZhU2NyaXB0IHVuYXJ5IG9wZXJhdG9yIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAiXCIiICsgKGtleXdvcmRNYXRjaFswXSkgKyAiXCIgaW4gZXhwcmVzc2lvbiAiICsgKHRleHQudHJpbSgpKQogICAgKTsKICB9CiAgY2hlY2tFeHByZXNzaW9uKGV4cCwgdGV4dCwgZXJyb3JzKTsKfQoKZnVuY3Rpb24gY2hlY2tGb3IgKG5vZGUsIHRleHQsIGVycm9ycykgewogIGNoZWNrRXhwcmVzc2lvbihub2RlLmZvciB8fCAnJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5hbGlhcywgJ3YtZm9yIGFsaWFzJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5pdGVyYXRvcjEsICd2LWZvciBpdGVyYXRvcicsIHRleHQsIGVycm9ycyk7CiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuaXRlcmF0b3IyLCAndi1mb3IgaXRlcmF0b3InLCB0ZXh0LCBlcnJvcnMpOwp9CgpmdW5jdGlvbiBjaGVja0lkZW50aWZpZXIgKAogIGlkZW50LAogIHR5cGUsCiAgdGV4dCwKICBlcnJvcnMKKSB7CiAgaWYgKHR5cGVvZiBpZGVudCA9PT0gJ3N0cmluZycpIHsKICAgIHRyeSB7CiAgICAgIG5ldyBGdW5jdGlvbigoInZhciAiICsgaWRlbnQgKyAiPV8iKSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGVycm9ycy5wdXNoKCgiaW52YWxpZCAiICsgdHlwZSArICIgXCIiICsgaWRlbnQgKyAiXCIgaW4gZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkpKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrRXhwcmVzc2lvbiAoZXhwLCB0ZXh0LCBlcnJvcnMpIHsKICB0cnkgewogICAgbmV3IEZ1bmN0aW9uKCgicmV0dXJuICIgKyBleHApKTsKICB9IGNhdGNoIChlKSB7CiAgICB2YXIga2V5d29yZE1hdGNoID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpLm1hdGNoKHByb2hpYml0ZWRLZXl3b3JkUkUpOwogICAgaWYgKGtleXdvcmRNYXRjaCkgewogICAgICBlcnJvcnMucHVzaCgKICAgICAgICAiYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAgICJcIiIgKyAoa2V5d29yZE1hdGNoWzBdKSArICJcIlxuICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9ycy5wdXNoKAogICAgICAgICJpbnZhbGlkIGV4cHJlc3Npb246ICIgKyAoZS5tZXNzYWdlKSArICIgaW5cblxuIiArCiAgICAgICAgIiAgICAiICsgZXhwICsgIlxuXG4iICsKICAgICAgICAiICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkgKyAiXG4iCiAgICAgICk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uIChjb2RlLCBlcnJvcnMpIHsKICB0cnkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlKQogIH0gY2F0Y2ggKGVycikgewogICAgZXJyb3JzLnB1c2goeyBlcnI6IGVyciwgY29kZTogY29kZSB9KTsKICAgIHJldHVybiBub29wCiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuIChjb21waWxlKSB7CiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBpbGVUb0Z1bmN0aW9ucyAoCiAgICB0ZW1wbGF0ZSwKICAgIG9wdGlvbnMsCiAgICB2bQogICkgewogICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICB2YXIgd2FybiQkMSA9IG9wdGlvbnMud2FybiB8fCB3YXJuOwogICAgZGVsZXRlIG9wdGlvbnMud2FybjsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIHsKICAgICAgLy8gZGV0ZWN0IHBvc3NpYmxlIENTUCByZXN0cmljdGlvbgogICAgICB0cnkgewogICAgICAgIG5ldyBGdW5jdGlvbigncmV0dXJuIDEnKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLnRvU3RyaW5nKCkubWF0Y2goL3Vuc2FmZS1ldmFsfENTUC8pKSB7CiAgICAgICAgICB3YXJuJCQxKAogICAgICAgICAgICAnSXQgc2VlbXMgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhbG9uZSBidWlsZCBvZiBWdWUuanMgaW4gYW4gJyArCiAgICAgICAgICAgICdlbnZpcm9ubWVudCB3aXRoIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IHRoYXQgcHJvaGliaXRzIHVuc2FmZS1ldmFsLiAnICsKICAgICAgICAgICAgJ1RoZSB0ZW1wbGF0ZSBjb21waWxlciBjYW5ub3Qgd29yayBpbiB0aGlzIGVudmlyb25tZW50LiBDb25zaWRlciAnICsKICAgICAgICAgICAgJ3JlbGF4aW5nIHRoZSBwb2xpY3kgdG8gYWxsb3cgdW5zYWZlLWV2YWwgb3IgcHJlLWNvbXBpbGluZyB5b3VyICcgKwogICAgICAgICAgICAndGVtcGxhdGVzIGludG8gcmVuZGVyIGZ1bmN0aW9ucy4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIGNoZWNrIGNhY2hlCiAgICB2YXIga2V5ID0gb3B0aW9ucy5kZWxpbWl0ZXJzCiAgICAgID8gU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVycykgKyB0ZW1wbGF0ZQogICAgICA6IHRlbXBsYXRlOwogICAgaWYgKGNhY2hlW2tleV0pIHsKICAgICAgcmV0dXJuIGNhY2hlW2tleV0KICAgIH0KCiAgICAvLyBjb21waWxlCiAgICB2YXIgY29tcGlsZWQgPSBjb21waWxlKHRlbXBsYXRlLCBvcHRpb25zKTsKCiAgICAvLyBjaGVjayBjb21waWxhdGlvbiBlcnJvcnMvdGlwcwogICAgewogICAgICBpZiAoY29tcGlsZWQuZXJyb3JzICYmIGNvbXBpbGVkLmVycm9ycy5sZW5ndGgpIHsKICAgICAgICB3YXJuJCQxKAogICAgICAgICAgIkVycm9yIGNvbXBpbGluZyB0ZW1wbGF0ZTpcblxuIiArIHRlbXBsYXRlICsgIlxuXG4iICsKICAgICAgICAgIGNvbXBpbGVkLmVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuICgiLSAiICsgZSk7IH0pLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChjb21waWxlZC50aXBzICYmIGNvbXBpbGVkLnRpcHMubGVuZ3RoKSB7CiAgICAgICAgY29tcGlsZWQudGlwcy5mb3JFYWNoKGZ1bmN0aW9uIChtc2cpIHsgcmV0dXJuIHRpcChtc2csIHZtKTsgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyB0dXJuIGNvZGUgaW50byBmdW5jdGlvbnMKICAgIHZhciByZXMgPSB7fTsKICAgIHZhciBmbkdlbkVycm9ycyA9IFtdOwogICAgcmVzLnJlbmRlciA9IGNyZWF0ZUZ1bmN0aW9uKGNvbXBpbGVkLnJlbmRlciwgZm5HZW5FcnJvcnMpOwogICAgcmVzLnN0YXRpY1JlbmRlckZucyA9IGNvbXBpbGVkLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKGNvZGUsIGZuR2VuRXJyb3JzKQogICAgfSk7CgogICAgLy8gY2hlY2sgZnVuY3Rpb24gZ2VuZXJhdGlvbiBlcnJvcnMuCiAgICAvLyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29tcGlsZXIgaXRzZWxmLgogICAgLy8gbW9zdGx5IGZvciBjb2RlZ2VuIGRldmVsb3BtZW50IHVzZQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICB7CiAgICAgIGlmICgoIWNvbXBpbGVkLmVycm9ycyB8fCAhY29tcGlsZWQuZXJyb3JzLmxlbmd0aCkgJiYgZm5HZW5FcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgd2FybiQkMSgKICAgICAgICAgICJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVuZGVyIGZ1bmN0aW9uOlxuXG4iICsKICAgICAgICAgIGZuR2VuRXJyb3JzLm1hcChmdW5jdGlvbiAocmVmKSB7CiAgICAgICAgICAgIHZhciBlcnIgPSByZWYuZXJyOwogICAgICAgICAgICB2YXIgY29kZSA9IHJlZi5jb2RlOwoKICAgICAgICAgICAgcmV0dXJuICgoZXJyLnRvU3RyaW5nKCkpICsgIiBpblxuXG4iICsgY29kZSArICJcbiIpOwogICAgICAgIH0pLmpvaW4oJ1xuJyksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKGNhY2hlW2tleV0gPSByZXMpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBpbGVyQ3JlYXRvciAoYmFzZUNvbXBpbGUpIHsKICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQ29tcGlsZXIgKGJhc2VPcHRpb25zKSB7CiAgICBmdW5jdGlvbiBjb21waWxlICgKICAgICAgdGVtcGxhdGUsCiAgICAgIG9wdGlvbnMKICAgICkgewogICAgICB2YXIgZmluYWxPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShiYXNlT3B0aW9ucyk7CiAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgdmFyIHRpcHMgPSBbXTsKICAgICAgZmluYWxPcHRpb25zLndhcm4gPSBmdW5jdGlvbiAobXNnLCB0aXApIHsKICAgICAgICAodGlwID8gdGlwcyA6IGVycm9ycykucHVzaChtc2cpOwogICAgICB9OwoKICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAvLyBtZXJnZSBjdXN0b20gbW9kdWxlcwogICAgICAgIGlmIChvcHRpb25zLm1vZHVsZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5tb2R1bGVzID0KICAgICAgICAgICAgKGJhc2VPcHRpb25zLm1vZHVsZXMgfHwgW10pLmNvbmNhdChvcHRpb25zLm1vZHVsZXMpOwogICAgICAgIH0KICAgICAgICAvLyBtZXJnZSBjdXN0b20gZGlyZWN0aXZlcwogICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5kaXJlY3RpdmVzID0gZXh0ZW5kKAogICAgICAgICAgICBPYmplY3QuY3JlYXRlKGJhc2VPcHRpb25zLmRpcmVjdGl2ZXMgfHwgbnVsbCksCiAgICAgICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlcwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy8gY29weSBvdGhlciBvcHRpb25zCiAgICAgICAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgICAgICAgIGlmIChrZXkgIT09ICdtb2R1bGVzJyAmJiBrZXkgIT09ICdkaXJlY3RpdmVzJykgewogICAgICAgICAgICBmaW5hbE9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBjb21waWxlZCA9IGJhc2VDb21waWxlKHRlbXBsYXRlLCBmaW5hbE9wdGlvbnMpOwogICAgICB7CiAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBkZXRlY3RFcnJvcnMoY29tcGlsZWQuYXN0KSk7CiAgICAgIH0KICAgICAgY29tcGlsZWQuZXJyb3JzID0gZXJyb3JzOwogICAgICBjb21waWxlZC50aXBzID0gdGlwczsKICAgICAgcmV0dXJuIGNvbXBpbGVkCiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgY29tcGlsZTogY29tcGlsZSwKICAgICAgY29tcGlsZVRvRnVuY3Rpb25zOiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuKGNvbXBpbGUpCiAgICB9CiAgfQp9CgovKiAgKi8KCi8vIGBjcmVhdGVDb21waWxlckNyZWF0b3JgIGFsbG93cyBjcmVhdGluZyBjb21waWxlcnMgdGhhdCB1c2UgYWx0ZXJuYXRpdmUKLy8gcGFyc2VyL29wdGltaXplci9jb2RlZ2VuLCBlLmcgdGhlIFNTUiBvcHRpbWl6aW5nIGNvbXBpbGVyLgovLyBIZXJlIHdlIGp1c3QgZXhwb3J0IGEgZGVmYXVsdCBjb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCBwYXJ0cy4KdmFyIGNyZWF0ZUNvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXJDcmVhdG9yKGZ1bmN0aW9uIGJhc2VDb21waWxlICgKICB0ZW1wbGF0ZSwKICBvcHRpb25zCikgewogIHZhciBhc3QgPSBwYXJzZSh0ZW1wbGF0ZS50cmltKCksIG9wdGlvbnMpOwogIGlmIChvcHRpb25zLm9wdGltaXplICE9PSBmYWxzZSkgewogICAgb3B0aW1pemUoYXN0LCBvcHRpb25zKTsKICB9CiAgdmFyIGNvZGUgPSBnZW5lcmF0ZShhc3QsIG9wdGlvbnMpOwogIHJldHVybiB7CiAgICBhc3Q6IGFzdCwKICAgIHJlbmRlcjogY29kZS5yZW5kZXIsCiAgICBzdGF0aWNSZW5kZXJGbnM6IGNvZGUuc3RhdGljUmVuZGVyRm5zCiAgfQp9KTsKCi8qICAqLwoKdmFyIHJlZiQxID0gY3JlYXRlQ29tcGlsZXIoYmFzZU9wdGlvbnMpOwp2YXIgY29tcGlsZVRvRnVuY3Rpb25zID0gcmVmJDEuY29tcGlsZVRvRnVuY3Rpb25zOwoKLyogICovCgovLyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgYnJvd3NlciBlbmNvZGVzIGEgY2hhciBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcwp2YXIgZGl2OwpmdW5jdGlvbiBnZXRTaG91bGREZWNvZGUgKGhyZWYpIHsKICBkaXYgPSBkaXYgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGl2LmlubmVySFRNTCA9IGhyZWYgPyAiPGEgaHJlZj1cIlxuXCIvPiIgOiAiPGRpdiBhPVwiXG5cIi8+IjsKICByZXR1cm4gZGl2LmlubmVySFRNTC5pbmRleE9mKCcmIzEwOycpID4gMAp9CgovLyAjMzY2MzogSUUgZW5jb2RlcyBuZXdsaW5lcyBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcyB3aGlsZSBvdGhlciBicm93c2VycyBkb24ndAp2YXIgc2hvdWxkRGVjb2RlTmV3bGluZXMgPSBpbkJyb3dzZXIgPyBnZXRTaG91bGREZWNvZGUoZmFsc2UpIDogZmFsc2U7Ci8vICM2ODI4OiBjaHJvbWUgZW5jb2RlcyBjb250ZW50IGluIGFbaHJlZl0KdmFyIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiA9IGluQnJvd3NlciA/IGdldFNob3VsZERlY29kZSh0cnVlKSA6IGZhbHNlOwoKLyogICovCgp2YXIgaWRUb1RlbXBsYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChpZCkgewogIHZhciBlbCA9IHF1ZXJ5KGlkKTsKICByZXR1cm4gZWwgJiYgZWwuaW5uZXJIVE1MCn0pOwoKdmFyIG1vdW50ID0gVnVlLnByb3RvdHlwZS4kbW91bnQ7ClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIHF1ZXJ5KGVsKTsKCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5IHx8IGVsID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAiRG8gbm90IG1vdW50IFZ1ZSB0byA8aHRtbD4gb3IgPGJvZHk+IC0gbW91bnQgdG8gbm9ybWFsIGVsZW1lbnRzIGluc3RlYWQuIgogICAgKTsKICAgIHJldHVybiB0aGlzCiAgfQoKICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7CiAgLy8gcmVzb2x2ZSB0ZW1wbGF0ZS9lbCBhbmQgY29udmVydCB0byByZW5kZXIgZnVuY3Rpb24KICBpZiAoIW9wdGlvbnMucmVuZGVyKSB7CiAgICB2YXIgdGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlOwogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdCgwKSA9PT0gJyMnKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IGlkVG9UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgKCJUZW1wbGF0ZSBlbGVtZW50IG5vdCBmb3VuZCBvciBpcyBlbXB0eTogIiArIChvcHRpb25zLnRlbXBsYXRlKSksCiAgICAgICAgICAgICAgdGhpcwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkgewogICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuaW5uZXJIVE1MOwogICAgICB9IGVsc2UgewogICAgICAgIHsKICAgICAgICAgIHdhcm4oJ2ludmFsaWQgdGVtcGxhdGUgb3B0aW9uOicgKyB0ZW1wbGF0ZSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWwpIHsKICAgICAgdGVtcGxhdGUgPSBnZXRPdXRlckhUTUwoZWwpOwogICAgfQogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgICAgbWFyaygnY29tcGlsZScpOwogICAgICB9CgogICAgICB2YXIgcmVmID0gY29tcGlsZVRvRnVuY3Rpb25zKHRlbXBsYXRlLCB7CiAgICAgICAgc2hvdWxkRGVjb2RlTmV3bGluZXM6IHNob3VsZERlY29kZU5ld2xpbmVzLAogICAgICAgIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjogc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmLAogICAgICAgIGRlbGltaXRlcnM6IG9wdGlvbnMuZGVsaW1pdGVycywKICAgICAgICBjb21tZW50czogb3B0aW9ucy5jb21tZW50cwogICAgICB9LCB0aGlzKTsKICAgICAgdmFyIHJlbmRlciA9IHJlZi5yZW5kZXI7CiAgICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zOwogICAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlcjsKICAgICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnM7CgogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgICAgIG1hcmsoJ2NvbXBpbGUgZW5kJyk7CiAgICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHRoaXMuX25hbWUpICsgIiBjb21waWxlIiksICdjb21waWxlJywgJ2NvbXBpbGUgZW5kJyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG1vdW50LmNhbGwodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8qKgogKiBHZXQgb3V0ZXJIVE1MIG9mIGVsZW1lbnRzLCB0YWtpbmcgY2FyZQogKiBvZiBTVkcgZWxlbWVudHMgaW4gSUUgYXMgd2VsbC4KICovCmZ1bmN0aW9uIGdldE91dGVySFRNTCAoZWwpIHsKICBpZiAoZWwub3V0ZXJIVE1MKSB7CiAgICByZXR1cm4gZWwub3V0ZXJIVE1MCiAgfSBlbHNlIHsKICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbC5jbG9uZU5vZGUodHJ1ZSkpOwogICAgcmV0dXJuIGNvbnRhaW5lci5pbm5lckhUTUwKICB9Cn0KClZ1ZS5jb21waWxlID0gY29tcGlsZVRvRnVuY3Rpb25zOwoKcmV0dXJuIFZ1ZTsKCn0pKSk7Cg==" >
tail j=5409 line=
tail j=5410 line=<!-- <script type="text/javascript" src="/jquery-3.3.1.js" > -->
tail j=5411 line= <script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkgewoKCSJ1c2Ugc3RyaWN0IjsKCglpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2AKCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgoJCS8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgCgkJLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuCgkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uCgkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPwoJCQlmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6CgkJCWZ1bmN0aW9uKCB3ICkgewoJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50IiApOwoJCQkJfQoJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKCQkJfTsKCX0gZWxzZSB7CgkJZmFjdG9yeSggZ2xvYmFsICk7Cgl9CgovLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAp9ICkoIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CgovLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjEKLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlCi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uCi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLgoidXNlIHN0cmljdCI7Cgp2YXIgYXJyID0gW107Cgp2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cgp2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7Cgp2YXIgc2xpY2UgPSBhcnIuc2xpY2U7Cgp2YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKCnZhciBwdXNoID0gYXJyLnB1c2g7Cgp2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOwoKdmFyIGNsYXNzMnR5cGUgPSB7fTsKCnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7Cgp2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKCnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nOwoKdmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTsKCnZhciBzdXBwb3J0ID0ge307Cgp2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHsKCiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTIKICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgImZ1bmN0aW9uIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50cwogICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib2JqZWN0IiApID09PSAiZnVuY3Rpb24iYCkuCiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi4KICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gIm51bWJlciI7CiAgfTsKCgp2YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Cgl9OwoKCgoKCXZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0gewoJCXR5cGU6IHRydWUsCgkJc3JjOiB0cnVlLAoJCW5vTW9kdWxlOiB0cnVlCgl9OwoKCWZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYywgbm9kZSApIHsKCQlkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7CgoJCXZhciBpLAoJCQlzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsKCgkJc2NyaXB0LnRleHQgPSBjb2RlOwoJCWlmICggbm9kZSApIHsKCQkJZm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkgewoJCQkJaWYgKCBub2RlWyBpIF0gKSB7CgkJCQkJc2NyaXB0WyBpIF0gPSBub2RlWyBpIF07CgkJCQl9CgkJCX0KCQl9CgkJZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJfQoKCmZ1bmN0aW9uIHRvVHlwZSggb2JqICkgewoJaWYgKCBvYmogPT0gbnVsbCApIHsKCQlyZXR1cm4gb2JqICsgIiI7Cgl9CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApCglyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CgkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CgkJdHlwZW9mIG9iajsKfQovKiBnbG9iYWwgU3ltYm9sICovCi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsCi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlCgoKCnZhcgoJdmVyc2lvbiA9ICIzLjMuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfSwKCgkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHkKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAoJcnRyaW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogdmVyc2lvbiwKCgljb25zdHJ1Y3RvcjogalF1ZXJ5LAoKCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVuZ3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgoJCS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKCQlpZiAoIG51bSA9PSBudWxsICkgewoJCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApOwoJCX0KCgkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAoJCXJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoKCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAoJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSApICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpOwoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KCXB1c2g6IHB1c2gsCglzb3J0OiBhcnIuc29ydCwKCXNwbGljZTogYXJyLnNwbGljZQp9OwoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKCQl0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSwKCQlpID0gMSwKCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAoJCWRlZXAgPSBmYWxzZTsKCgkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKCQlkZWVwID0gdGFyZ2V0OwoKCQkvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CgkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CgkJaSsrOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGkgPT09IGxlbmd0aCApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCWktLTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgewoKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHwKCQkJCQkoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHsKCgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCWV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAoKCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCglpc1JlYWR5OiB0cnVlLAoKCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewoJCXRocm93IG5ldyBFcnJvciggbXNnICk7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgcHJvdG8sIEN0b3I7CgoJCS8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlcwoJCS8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0cwoJCWlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gIltvYmplY3QgT2JqZWN0XSIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXByb3RvID0gZ2V0UHJvdG8oIG9iaiApOwoKCQkvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluCgkJaWYgKCAhcHJvdG8gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb24KCQlDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCAiY29uc3RydWN0b3IiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7CgkJcmV0dXJuIHR5cGVvZiBDdG9yID09PSAiZnVuY3Rpb24iICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZzsKCX0sCgoJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCgkJLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KCQkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjUKCQl2YXIgbmFtZTsKCgkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHsKCQlET01FdmFsKCBjb2RlICk7Cgl9LAoKCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkgewoJCXZhciBsZW5ndGgsIGkgPSAwOwoKCQlpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHsKCQkJbGVuZ3RoID0gb2JqLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvciAoIGkgaW4gb2JqICkgewoJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seQoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CgkJCSIiIDoKCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCX0sCgoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIGFyciAhPSBudWxsICkgewoJCQlpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKCQlyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seQoJLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdAoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJCXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNoZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKCQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2YXIgbGVuZ3RoLCB2YWx1ZSwKCQkJaSA9IDAsCgkJCXJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwoJCWlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7CgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBpIGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldC5wdXNoKCB2YWx1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCgkvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgoJc3VwcG9ydDogc3VwcG9ydAp9ICk7CgppZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CglqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTsKfQoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCAiICIgKSwKZnVuY3Rpb24oIGksIG5hbWUgKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9ICk7CgpmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkgewoKCS8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcikKCS8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSkKCS8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwoJLy8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRQoJdmFyIGxlbmd0aCA9ICEhb2JqICYmICJsZW5ndGgiIGluIG9iaiAmJiBvYmoubGVuZ3RoLAoJCXR5cGUgPSB0b1R5cGUoIG9iaiApOwoKCWlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKCQl0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKfQp2YXIgU2l6emxlID0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNi0wOC0wOAogKi8KKGZ1bmN0aW9uKCB3aW5kb3cgKSB7Cgp2YXIgaSwKCXN1cHBvcnQsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJdG9rZW5pemUsCgljb21waWxlLAoJc2VsZWN0LAoJb3V0ZXJtb3N0Q29udGV4dCwKCXNvcnRJbnB1dCwKCWhhc0R1cGxpY2F0ZSwKCgkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCglzZXREb2N1bWVudCwKCWRvY3VtZW50LAoJZG9jRWxlbSwKCWRvY3VtZW50SXNIVE1MLAoJcmJ1Z2d5UVNBLAoJcmJ1Z2d5TWF0Y2hlcywKCW1hdGNoZXMsCgljb250YWlucywKCgkvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCglleHBhbmRvID0gInNpenpsZSIgKyAxICogbmV3IERhdGUoKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMgPSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVybiAwOwoJfSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNlLAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlCgkvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81CglpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7CgkJdmFyIGkgPSAwLAoJCQlsZW4gPSBsaXN0Lmxlbmd0aDsKCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfSwKCglib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCgoJLy8gUmVndWxhciBleHByZXNzaW9ucwoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRpZmllciA9ICIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsCgoJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGlkZW50aWZpZXIgKyAiKSg/OiIgKyB3aGl0ZXNwYWNlICsKCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQoJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKwoJCS8vICJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdIgoJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCgkJIipcXF0iLAoKCXBzZXVkb3MgPSAiOigiICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKwoJCS8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgoJcndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgIisiLCAiZyIgKSwKCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAoKCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAoJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAoKCXJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCAiPSIgKyB3aGl0ZXNwYWNlICsgIiooW15cXF0nXCJdKj8pIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsICJnIiApLAoKCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCglyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoICJeIiArIGlkZW50aWZpZXIgKyAiJCIgKSwKCgltYXRjaEV4cHIgPSB7CgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBpZGVudGlmaWVyICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50aWZpZXIgKyAiKSIgKSwKCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGlkZW50aWZpZXIgKyAifFsqXSkiICksCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCgkJIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwKCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKCQkvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgCgkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCgkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQoJfSwKCglyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJoZWFkZXIgPSAvXmhcZCQvaSwKCglybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCgoJcnNpYmxpbmcgPSAvWyt+XS8sCgoJLy8gQ1NTIGVzY2FwZXMKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKCXJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJcXFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIpfC4pIiwgImlnIiApLAoJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgewoJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwoJCS8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CgkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAoJCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKCQlyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/CgkJCWVzY2FwZWQgOgoJCQloaWdoIDwgMCA/CgkJCQkvLyBCTVAgY29kZXBvaW50CgkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQoJCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Cgl9LAoKCS8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uCgkvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXMKCXJjc3Nlc2NhcGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywKCWZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkgewoJCWlmICggYXNDb2RlUG9pbnQgKSB7CgoJCQkvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIKCQkJaWYgKCBjaCA9PT0gIlwwIiApIHsKCQkJCXJldHVybiAiXHVGRkZEIjsKCQkJfQoKCQkJLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHMKCQkJcmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgIlxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArICIgIjsKCQl9CgoJCS8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWQKCQlyZXR1cm4gIlxcIiArIGNoOwoJfSwKCgkvLyBVc2VkIGZvciBpZnJhbWVzCgkvLyBTZWUgc2V0RG9jdW1lbnQoKQoJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgoJLy8gZXJyb3IgaW4gSUUKCXVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKCQlzZXREb2N1bWVudCgpOwoJfSwKCglkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcigKCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgKCJmb3JtIiBpbiBlbGVtIHx8ICJsYWJlbCIgaW4gZWxlbSk7CgkJfSwKCQl7IGRpcjogInBhcmVudE5vZGUiLCBuZXh0OiAibGVnZW5kIiB9CgkpOwoKLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKdHJ5IHsKCXB1c2guYXBwbHkoCgkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAoJCXByZWZlcnJlZERvYy5jaGlsZE5vZGVzCgkpOwoJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKCS8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHkKCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cn0gY2F0Y2ggKCBlICkgewoJcHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggPwoKCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQoJCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CgkJfSA6CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5CgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCgkJCQlpID0gMDsKCQkJLy8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoCgkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Cgl2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3RvciwKCQluZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsCgoJCS8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnQKCQlub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTsKCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCgkvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dAoJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciIHx8ICFzZWxlY3RvciB8fAoJCW5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHsKCgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgoJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50cwoJaWYgKCAhc2VlZCApIHsKCgkJaWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHsKCQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CgoJCQkvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgImdldCpCeSoiIERPTSBtZXRob2QKCQkJLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQoJCQlpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewoKCQkJCS8vIElEIHNlbGVjdG9yCgkJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgewoKCQkJCQkvLyBEb2N1bWVudCBjb250ZXh0CgkJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJCS8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zCgkJCQkJCQkvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoKCQkJCQkvLyBFbGVtZW50IGNvbnRleHQKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJLy8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnMKCQkJCQkJLy8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCgkJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmCgkJCQkJCQllbGVtLmlkID09PSBtICkgewoKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9CgoJCQkJLy8gVHlwZSBzZWxlY3RvcgoJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwoJCQkJCXJldHVybiByZXN1bHRzOwoKCQkJCS8vIENsYXNzIHNlbGVjdG9yCgkJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYKCQkJCQljb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CgoJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CgkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQl9CgkJCX0KCgkJCS8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGwKCQkJaWYgKCBzdXBwb3J0LnFzYSAmJgoJCQkJIWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF0gJiYKCQkJCSghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgoJCQkJaWYgKCBub2RlVHlwZSAhPT0gMSApIHsKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IHNlbGVjdG9yOwoKCQkJCS8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudAoJCQkJLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKCQkJCS8vIFN1cHBvcnQ6IElFIDw9OAoJCQkJLy8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHMKCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgoJCQkJCS8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CgkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIChuaWQgPSBleHBhbmRvKSApOwoJCQkJCX0KCgkJCQkJLy8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7CgkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCWdyb3Vwc1tpXSA9ICIjIiArIG5pZCArICIgIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwoJCQkJCX0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCAiLCIgKTsKCgkJCQkJLy8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzCgkJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8CgkJCQkJCWNvbnRleHQ7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAoJCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCgkJCQkJCSk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0gY2F0Y2ggKCBxc2FFcnJvciApIHsKCQkJCQl9IGZpbmFsbHkgewoJCQkJCQlpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQWxsIG90aGVycwoJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwp9CgovKioKICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGgKICoJcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQogKi8KZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7Cgl2YXIga2V5cyA9IFtdOwoKCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgewoJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQoJCWlmICgga2V5cy5wdXNoKCBrZXkgKyAiICIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwoJCX0KCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsKCX0KCXJldHVybiBjYWNoZTsKfQoKLyoqCiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCiAqLwpmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewoJZm5bIGV4cGFuZG8gXSA9IHRydWU7CglyZXR1cm4gZm47Cn0KCi8qKgogKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkgewoJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTsKCgl0cnkgewoJCXJldHVybiAhIWZuKCBlbCApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVybiBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CgkJaWYgKCBlbC5wYXJlbnROb2RlICkgewoJCQllbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApOwoJCX0KCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCWVsID0gbnVsbDsKCX0KfQoKLyoqCiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQKICovCmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Cgl2YXIgYXJyID0gYXR0cnMuc3BsaXQoInwiKSwKCQlpID0gYXJyLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBhCiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBiICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkCiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWQKICovCmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHsKCgkvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGUKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWQKCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkCgkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWQKCQlpZiAoICJmb3JtIiBpbiBlbGVtICkgewoKCQkJLy8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOgoJCQkvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldAoJCQkvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkCgkJCS8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkCgkJCS8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkCgkJCS8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSAiZm9ybSIgcHJvcGVydHkuCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkgewoKCQkJCS8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50CgkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbSApIHsKCQkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQlyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFN1cHBvcnQ6IElFIDYgLSAxMQoJCQkJLy8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnMKCQkJCXJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8CgoJCQkJCS8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5CgkJCQkJLyoganNoaW50IC1XMDE4ICovCgkJCQkJZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiYKCQkJCQkJZGlzYWJsZWRBbmNlc3RvciggZWxlbSApID09PSBkaXNhYmxlZDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkOwoKCQkvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuCgkJLy8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0CgkJLy8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuCgkJfSBlbHNlIGlmICggImxhYmVsIiBpbiBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJfQoKCQkvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZAoJCXJldHVybiBmYWxzZTsKCX07Cn0KCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCiAqLwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAogKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dAogKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKICovCmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkgewoJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1MIG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LAoJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKCgkvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZAoJaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgoJLy8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXMKCWRvY3VtZW50ID0gZG9jOwoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCWRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApOwoKCS8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2UKCS8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpCglpZiAoIHByZWZlcnJlZERvYyAhPT0gZG9jdW1lbnQgJiYKCQkoc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHsKCgkJLy8gU3VwcG9ydDogSUUgMTEsIEVkZ2UKCQlpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJCQlzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5CgkJfSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkgewoJCQlzdWJXaW5kb3cuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIHVubG9hZEhhbmRsZXIgKTsKCQl9Cgl9CgoJLyogQXR0cmlidXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFN1cHBvcnQ6IElFPDgKCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcwoJLy8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCglzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Cgl9KTsKCgkvKiBnZXRFbGVtZW50KHMpQnkqCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCXN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Cgl9KTsKCgkvLyBTdXBwb3J0OiBJRTw5CglzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsKCgkvLyBTdXBwb3J0OiBJRTwxMAoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lCgkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcywKCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAoJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbzsKCQlyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKCX0pOwoKCS8vIElEIGZpbHRlciBhbmQgZmluZAoJaWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7CgkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJCUV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCQl2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJCQlyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107CgkJCX0KCQl9OwoJfSBlbHNlIHsKCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCQkJZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOwoJCQl9OwoJCX07CgoJCS8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHkKCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CgkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBub2RlLCBpLCBlbGVtcywKCQkJCQllbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCgkJCQlpZiAoIGVsZW0gKSB7CgoJCQkJCS8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlCgkJCQkJbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7CgkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQl9CgoJCQkJCS8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZQoJCQkJCWVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTsKCQkJCQlpID0gMDsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7CgkJCQkJCW5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgkJCQkJCWlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHsKCQkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gW107CgkJCX0KCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROCgkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgewoJCQkJcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CgkJCX0KCQl9IDoKCgkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJdmFyIGVsZW0sCgkJCQl0bXAgPSBbXSwKCQkJCWkgPSAwLAoJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbwoJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdG1wOwoJCQl9CgkJCXJldHVybiByZXN1bHRzOwoJCX07CgoJLy8gQ2xhc3MKCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCX0KCX07CgoJLyogUVNBL21hdGNoZXNTZWxlY3RvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKCgkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJcmJ1Z2d5TWF0Y2hlcyA9IFtdOwoKCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCgkvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3IKCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKCS8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCgkvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CglyYnVnZ3lRU0EgPSBbXTsKCglpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHsKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQoJCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCgkJCQkiPHNlbGVjdCBpZD0nIiArIGV4cGFuZG8gKyAiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPiIgKwoJCQkJIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKCgkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQoJCQkvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCAic2FmZSIgZm9yIFdpblJUCgkJCS8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IElFOAoJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44KwoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgifj0iKTsKCQkJfQoKCQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKCQkJaWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MQoJCQkvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzCgkJCWlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCIuIy4rWyt+XSIpOwoJCQl9CgkJfSk7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCWVsLmlubmVySFRNTCA9ICI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPiIgKwoJCQkJIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iOwoKCQkJLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzCgkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAoJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKCQkJZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiApOwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJuYW1lIiArIHdoaXRlc3BhY2UgKyAiKlsqXiR8IX5dPz0iICk7CgkJCX0KCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggIT09IDIgKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogSUU5LTExKwoJCQkvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHMKCQkJZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7CgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoICE9PSAyICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CgkJCX0KCgkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCgkJCWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQoJCQlzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgIioiICk7CgoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBlbCwgIltzIT0nJ106eCIgKTsKCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CgkJfSk7Cgl9CgoJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CglyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCJ8IikgKTsKCgkvKiBDb250YWlucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwoKCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgoJLy8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlCgkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8KCQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBiICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYgKCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJaWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKCQkJcmV0dXJuIHNvcnRJbnB1dCA/CgkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVudE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJYnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsKCQkJcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgoJCQkJYiA9PT0gZG9jdW1lbnQgPyAxIDoKCQkJCWF1cCA/IC0xIDoKCQkJCWJ1cCA/IDEgOgoJCQkJc29ydElucHV0ID8KCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJCX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2N1bWVudDsKfTsKClNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKfTsKClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCglleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOwoKCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkhY29tcGlsZXJDYWNoZVsgZXhwciArICIgIiBdICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoIChlKSB7fQoJfQoKCXJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cn07CgpTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7Cgl9CglyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxlbSApOwoJfQoKCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCgkJLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCgkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwoJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgoJCQl1bmRlZmluZWQ7CgoJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KCQl2YWwgOgoJCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwoJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CgkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKfTsKClNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkgewoJcmV0dXJuIChzZWwgKyAiIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8qKgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRlcyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKCWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJbnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hFeHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwKCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHktY29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJCX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJCXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKCQkJCX0pOwoJCX0sCgoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CgoJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CgkJCQl9CgkJCQlpZiAoICFvcGVyYXRvciApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCgkJCQlyZXN1bHQgKz0gIiI7CgoJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgoJCQkJCW9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJCQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAoJCQkJCQlkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIsCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCXVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLAoJCQkJCQlkaWZmID0gZmFsc2U7CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJCXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZUeXBlID8KCQkJCQkJCQkJCW5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CgkJCQkJCQkJCQlub2RlLm5vZGVUeXBlID09PSAxICkgewoKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewoKCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAoKCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCW5vZGUgPSBwYXJlbnQ7CgkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUgPDkgb25seQoJCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCShvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQkJY2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdOwoJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOwoJCQkJCQkJbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CgoJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKCgkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKCgkJCQkJCQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CgkJCQkJCQkJCXVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCgkJCQkJCQlpZiAoIHVzZUNhY2hlICkgewoJCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCQlub2RlID0gZWxlbTsKCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQljYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJCWRpZmYgPSBub2RlSW5kZXg7CgkJCQkJCQl9CgoJCQkJCQkJLy8geG1sIDpudGgtY2hpbGQoLi4uKQoJCQkJCQkJLy8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQoJCQkJCQkJaWYgKCBkaWZmID09PSBmYWxzZSApIHsKCQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CgkJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewoKCQkJCQkJCQkJaWYgKCAoIG9mVHlwZSA/CgkJCQkJCQkJCQlub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOgoJCQkJCQkJCQkJbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmCgkJCQkJCQkJCQkrK2RpZmYgKSB7CgoJCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAoJCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKCQkJCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQoJCQkJCQlkaWZmIC09IGxhc3Q7CgkJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJCX07CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwoJCQkvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCgkJCXZhciBhcmdzLAoJCQkJZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOwoKCQkJLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCgkJCWlmICggZm5bIGV4cGFuZG8gXSApIHsKCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKCQkJfQoKCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKCQkJCWFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKCQkJCQkJdmFyIGlkeCwKCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOwoJCQkJCQl9CgkJCQkJfSkgOgoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKCQkJCQl9OwoJCQl9CgoJCQlyZXR1cm4gZm47CgkJfQoJfSwKCglwc2V1ZG9zOiB7CgkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwoJCQl2YXIgaW5wdXQgPSBbXSwKCQkJCXJlc3VsdHMgPSBbXSwKCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CgoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsKCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pIDoKCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCQkJaW5wdXRbMF0gPSBlbGVtOwoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKCQkJCQkvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQoJCQkJCWlucHV0WzBdID0gbnVsbDsKCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7CgkJCQl9OwoJCX0pLAoKCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwoJCQl9OwoJCX0pLAoKCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CgkJCX07CgkJfSksCgoJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCgkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKCQkvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAoJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgoJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoJCS8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgoJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CgkJCS8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7CgkJCX0KCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgZWxlbUxhbmc7CgkJCQlkbyB7CgkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/CgkJCQkJCWVsZW0ubGFuZyA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgewoKCQkJCQkJZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwoJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOwoJCQkJCX0KCQkJCX0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJCX0pLAoKCQkvLyBNaXNjZWxsYW5lb3VzCgkJInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwoJCX0sCgoJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBkb2NFbGVtOwoJCX0sCgoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOwoJCX0sCgoJCS8vIEJvb2xlYW4gcHJvcGVydGllcwoJCSJlbmFibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksCgkJImRpc2FibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSwKCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwoJCX0sCgoJCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCgkJLy8gQ29udGVudHMKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAoJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQoJCQkvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwoJCX0sCgoJCS8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGF0dHI7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCgoJCQkJLy8gU3VwcG9ydDogSUU8OAoJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgoJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKCQl9LAoKCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CgkJfSksCgoJCSJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwoJCX0pLAoKCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDA7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CgkJCXZhciBpID0gMTsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwoJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CgkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KQoJfQp9OwoKRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKCi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwp9CmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CglFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwp9CgovLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOwpFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwoKdG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAoJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKCglpZiAoIGNhY2hlZCApIHsKCQlyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwoJfQoKCXNvRmFyID0gc2VsZWN0b3I7Cglncm91cHMgPSBbXTsKCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKCgl3aGlsZSAoIHNvRmFyICkgewoKCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CgkJCWlmICggbWF0Y2ggKSB7CgkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CgkJCX0KCQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKCQl9CgoJCW1hdGNoZWQgPSBmYWxzZTsKCgkJLy8gQ29tYmluYXRvcnMKCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKCQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCXRva2Vucy5wdXNoKHsKCQkJCXZhbHVlOiBtYXRjaGVkLAoJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCgkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKCQkJfSk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJfQoKCQkvLyBGaWx0ZXJzCgkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CgkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKCQkJCXRva2Vucy5wdXNoKHsKCQkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCW1hdGNoZXM6IG1hdGNoCgkJCQl9KTsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJCX0KCQl9CgoJCWlmICggIW1hdGNoZWQgKSB7CgkJCWJyZWFrOwoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCglyZXR1cm4gcGFyc2VPbmx5ID8KCQlzb0Zhci5sZW5ndGggOgoJCXNvRmFyID8KCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKCQkJLy8gQ2FjaGUgdGhlIHRva2VucwoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKfTsKCmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKCXZhciBpID0gMCwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCXNlbGVjdG9yID0gIiI7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7Cgl9CglyZXR1cm4gc2VsZWN0b3I7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJc2tpcCA9IGNvbWJpbmF0b3IubmV4dCwKCQlrZXkgPSBza2lwIHx8IGRpciwKCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewoJCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSA6CgoJCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsCgkJCQluZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTsKCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZwoJCQlpZiAoIHhtbCApIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKCgkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCXVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQlpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoJCQkJCQkJZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07CgkJCQkJCX0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiYKCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CgoJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKCQkJCQkJCXJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cwoJCQkJCQkJdW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7CgoJCQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Owp9CgpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IDoKCQltYXRjaGVyc1swXTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Cgl9CglyZXR1cm4gcmVzdWx0czsKfQoKZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsKCXZhciBlbGVtLAoJCW5ld1VubWF0Y2hlZCA9IFtdLAoJCWkgPSAwLAoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCgkJbWFwcGVkID0gbWFwICE9IG51bGw7CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCWlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCWlmICggbWFwcGVkICkgewoJCQkJCW1hcC5wdXNoKCBpICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG5ld1VubWF0Y2hlZDsKfQoKZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgewoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKCX0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKCX0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKCQl2YXIgdGVtcCwgaSwgZWxlbSwKCQkJcHJlTWFwID0gW10sCgkJCXBvc3RNYXAgPSBbXSwKCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0CgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCgoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CgkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6CgkJCQllbGVtcywKCgkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CgoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQoJCQkJCVtdIDoKCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5CgkJCQkJcmVzdWx0cyA6CgkJCQltYXRjaGVySW47CgoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCgkJaWYgKCBtYXRjaGVyICkgewoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwoJCX0KCgkJLy8gQXBwbHkgcG9zdEZpbHRlcgoJCWlmICggcG9zdEZpbHRlciApIHsKCQkJdGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKCgkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KCQkJaSA9IHRlbXAubGVuZ3RoOwoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggc2VlZCApIHsKCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKCQkJCWlmICggcG9zdEZpbmRlciApIHsKCQkJCQkvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHMKCQkJCQl0ZW1wID0gW107CgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAoJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CgkJCQl9CgoJCQkJLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCXdoaWxlICggaS0tICkgewoJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCQkvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSkKCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKCQkJcmV0dXJuIHJldDsKCQl9IF07CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKCQl9IGVsc2UgewoJCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7CgoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgoJCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZwoJCQkJaiA9ICsraTsKCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoCgkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCgkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmAKCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCgkJCQkJbWF0Y2hlciwKCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCgkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7CgkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAoJCQkJbWF0Y2hlZENvdW50ID0gMCwKCQkJCWkgPSAiMCIsCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAoJCQkJc2V0TWF0Y2hlZCA9IFtdLAoJCQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJtb3N0ICksCgkJCQkvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCgkJCQlsZW4gPSBlbGVtcy5sZW5ndGg7CgoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDsKCQkJfQoKCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCgkJCS8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlqID0gMDsKCQkJCQlpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7CgkJCQkJCXNldERvY3VtZW50KCBlbGVtICk7CgkJCQkJCXhtbCA9ICFkb2N1bWVudElzSFRNTDsKCQkJCQl9CgkJCQkJd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKCQkJCWlmICggYnlTZXQgKSB7CgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKCQkJCQkJbWF0Y2hlZENvdW50LS07CgkJCQkJfQoKCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CgkJCQkJaWYgKCBzZWVkICkgewoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YAoJCQkvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLgoJCQltYXRjaGVkQ291bnQgKz0gaTsKCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQkvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgCgkJCS8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQoJCQkvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLgoJCQkvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyAiMCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdAoJCQkvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvCgkJCS8vIG51bWVyaWNhbGx5IHplcm8uCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNlZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJCQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJaWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsKCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9ucwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKCS8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dCkKCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgoJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewoKCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbAoJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7CgkJCX0KCgkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOwoJCX0KCgkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJdG9rZW4gPSB0b2tlbnNbaV07CgoJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKCQkJCS8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycwoJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAoJCQkJCXJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKCQkJCSkpICkgewoKCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CgkJCQkJc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKCQkJCQlpZiAoICFzZWxlY3RvciApIHsKCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZAoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAoJCXNlZWQsCgkJY29udGV4dCwKCQkhZG9jdW1lbnRJc0hUTUwsCgkJcmVzdWx0cywKCQkhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CgkpOwoJcmV0dXJuIHJlc3VsdHM7Cn07CgovLyBPbmUtdGltZSBhc3NpZ25tZW50cwoKLy8gU29ydCBzdGFiaWxpdHkKc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CgovLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24Kc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7CgovLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKc2V0RG9jdW1lbnQoKTsKCi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgpzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKCXJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgovLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAppZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cn0pICkgewoJYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CgkJfQoJfSk7Cn0KCi8vIFN1cHBvcnQ6IElFPDkKLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKCWVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCXJldHVybiBlbC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKfSkgKSB7CglhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJdmFyIHZhbDsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CgkJCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KCQkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKCQl9Cgl9KTsKfQoKcmV0dXJuIFNpenpsZTsKCn0pKCB3aW5kb3cgKTsKCgoKalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKCi8vIERlcHJlY2F0ZWQKalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwpqUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlOwoKCgoKdmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJdmFyIG1hdGNoZWQgPSBbXSwKCQl0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CgoJd2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQlpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJbWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJfQoJfQoJcmV0dXJuIG1hdGNoZWQ7Cn07CgoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7Cgl2YXIgbWF0Y2hlZCA9IFtdOwoKCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CgkJCW1hdGNoZWQucHVzaCggbiApOwoJCX0KCX0KCglyZXR1cm4gbWF0Y2hlZDsKfTsKCgp2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKCgoKZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7CgogIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKfTsKdmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pICk7CgoKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewoJaWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwoJCX0gKTsKCX0KCgkvLyBTaW5nbGUgZWxlbWVudAoJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7CgkJfSApOwoJfQoKCS8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KQoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDsKCQl9ICk7Cgl9CgoJLy8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9ycwoJcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJfQoKCWlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJcmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTsKCX0KCglyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCX0gKSApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCByZXQsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfSApICk7CgkJfQoKCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTsKCgkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJcmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7Cgl9LAoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKCX0sCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5ndGg7Cgl9Cn0gKTsKCgovLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAoKCi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQp2YXIgcm9vdGpRdWVyeSwKCgkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCgkvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkCglycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLywKCglpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7CgkJdmFyIG1hdGNoLCBlbGVtOwoKCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCgkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CgkJLy8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKQoJCXJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCgkJCQlzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYKCQkJCXNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewoKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsgMSBdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDsKCgkJCQkJLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWyAxIF0sCgkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCgkJCQkJCXRydWUKCQkJCQkpICk7CgoJCQkJCS8vIEhBTkRMRTogJChodG1sLCBwcm9wcykKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCWZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7CgoJCQkJCQkJLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZQoJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CgkJCQkJCQkJdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOwoKCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQoJCQkJfSBlbHNlIHsKCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTsKCgkJCQkJaWYgKCBlbGVtICkgewoKCQkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpc1sgMCBdID0gZWxlbTsKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKCQkJdGhpc1sgMCBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID8KCQkJCXJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgoKCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKCQkJCXNlbGVjdG9yKCBqUXVlcnkgKTsKCQl9CgoJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwoJfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgovLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CgoKdmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoKCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWwgPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSAwOwoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CgkJdmFyIGN1ciwKCQkJaSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJbWF0Y2hlZCA9IFtdLAoJCQl0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTsKCgkJLy8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dAoJCWlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgoJCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID8KCQkJCQkJdGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6CgoJCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKCQkJCQkJY3VyLm5vZGVUeXBlID09PSAxICYmCgkJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKCgkJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBJbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLAoKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQoJCSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZVNvcnQoCgkJCQlqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCgkJCSkKCQkpOwoJfSwKCglhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Cn0gKTsKCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJd2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goIHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewogICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDsKICAgICAgICB9CgogICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seQogICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdAogICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgInRlbXBsYXRlIiApICkgewogICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CgoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcwoJCQlpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCQltYXRjaGVkLnJldmVyc2UoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7Cgl9Owp9ICk7CnZhciBybm90aHRtbHdoaXRlID0gKCAvW15ceDIwXHRcclxuXGZdKy9nICk7CgoKCi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0ge307CglqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9ICk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoKICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCWNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZwoJCWZpcmluZywKCgkJLy8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMKCQltZW1vcnksCgoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCgkJZmlyZWQsCgoJCS8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmcKCQlsb2NrZWQsCgoJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoKCQkvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXF1ZXVlID0gW10sCgoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKQoJCWZpcmluZ0luZGV4ID0gLTEsCgoJCS8vIEZpcmUgY2FsbGJhY2tzCgkJZmlyZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nCgkJCWxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7CgoJCQkvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucywKCQkJLy8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlcwoJCQlmaXJlZCA9IGZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkgewoJCQkJbWVtb3J5ID0gcXVldWUuc2hpZnQoKTsKCQkJCXdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgewoKCQkJCQkvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvbgoJCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmCgkJCQkJCW9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgoJCQkJCQkvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCgkJCQkJCWZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7CgkJCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdAoJCQlpZiAoICFvcHRpb25zLm1lbW9yeSApIHsKCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQl9CgoJCQlmaXJpbmcgPSBmYWxzZTsKCgkJCS8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kCgkJCWlmICggbG9ja2VkICkgewoKCQkJCS8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHMKCQkJCWlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCgkJCQkvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50CgkJCQl9IGVsc2UgewoJCQkJCWxpc3QgPSAiIjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCgkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCgkJCQkJLy8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmcKCQkJCQlpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewoJCQkJCQlmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTsKCQkJCQkJcXVldWUucHVzaCggbWVtb3J5ICk7CgkJCQkJfQoKCQkJCQkoIGZ1bmN0aW9uIGFkZCggYXJncyApIHsKCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCQlpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gInN0cmluZyIgKSB7CgoJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKCQkJCQkJCQlhZGQoIGFyZyApOwoJCQkJCQkJfQoJCQkJCQl9ICk7CgkJCQkJfSApKCBhcmd1bWVudHMgKTsKCgkJCQkJaWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHsKCQkJCQkJZmlyZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJCQl2YXIgaW5kZXg7CgkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7CgkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoKCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQlmaXJpbmdJbmRleC0tOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CgkJCQlyZXR1cm4gZm4gPwoJCQkJCWpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOgoJCQkJCWxpc3QubGVuZ3RoID4gMDsKCQkJfSwKCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZAoJCQkvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnMKCQkJLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbG9ja2VkID0gcXVldWUgPSBbXTsKCQkJCWxpc3QgPSBtZW1vcnkgPSAiIjsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgoJCQkvLyBEaXNhYmxlIC5maXJlCgkJCS8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpCgkJCS8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlsb2NrZWQgPSBxdWV1ZSA9IFtdOwoJCQkJaWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7CgkJCQkJbGlzdCA9IG1lbW9yeSA9ICIiOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFsb2NrZWQ7CgkJCX0sCgoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWlmICggIWxvY2tlZCApIHsKCQkJCQlhcmdzID0gYXJncyB8fCBbXTsKCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOwoJCQkJCXF1ZXVlLnB1c2goIGFyZ3MgKTsKCQkJCQlpZiAoICFmaXJpbmcgKSB7CgkJCQkJCWZpcmUoKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CgoKZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7CglyZXR1cm4gdjsKfQpmdW5jdGlvbiBUaHJvd2VyKCBleCApIHsKCXRocm93IGV4Owp9CgpmdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkgewoJdmFyIG1ldGhvZDsKCgl0cnkgewoKCQkvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yCgkJaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkgewoJCQltZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7CgoJCS8vIE90aGVyIHRoZW5hYmxlcwoJCX0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7CgkJCW1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7CgoJCS8vIE90aGVyIG5vbi10aGVuYWJsZXMKCQl9IGVsc2UgewoKCQkJLy8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOgoJCQkvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApCgkJCS8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpCgkJCXJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTsKCQl9CgoJLy8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zCgkvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluCgkvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLgoJfSBjYXRjaCAoIHZhbHVlICkgewoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5CgkJLy8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dAoJCXJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCggewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoKCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsCgkJCQkvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJtZW1vcnkiICksIDIgXSwKCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKCQkJCQlqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIDAsICJyZXNvbHZlZCIgXSwKCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwgMSwgInJlamVjdGVkIiBdCgkJCV0sCgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJCSJjYXRjaCI6IGZ1bmN0aW9uKCBmbiApIHsKCQkJCQlyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApOwoJCQkJfSwKCgkJCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJCQlwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CgkJCQkJdmFyIGZucyA9IGFyZ3VtZW50czsKCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgoJCQkJCQkJLy8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpCgkJCQkJCQl2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdOwoKCQkJCQkJCS8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KQoJCQkJCQkJLy8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pCgkJCQkJCQkvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KQoJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKAoJCQkJCQkJCQkJdGhpcywKCQkJCQkJCQkJCWZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzCgkJCQkJCQkJCSk7CgkJCQkJCQkJfQoJCQkJCQkJfSApOwoJCQkJCQl9ICk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSApLnByb21pc2UoKTsKCQkJCX0sCgkJCQl0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7CgkJCQkJdmFyIG1heERlcHRoID0gMDsKCQkJCQlmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7CgkJCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkJCXZhciB0aGF0ID0gdGhpcywKCQkJCQkJCQlhcmdzID0gYXJndW1lbnRzLAoJCQkJCQkJCW1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyIHJldHVybmVkLCB0aGVuOwoKCQkJCQkJCQkJLy8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjMKCQkJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTkKCQkJCQkJCQkJLy8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzCgkJCQkJCQkJCWlmICggZGVwdGggPCBtYXhEZXB0aCApIHsKCQkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7CgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xCgkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4CgkJCQkJCQkJCWlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHsKCQkJCQkJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iICk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNQoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NAoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NQoJCQkJCQkJCQkvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlCgkJCQkJCQkJCXRoZW4gPSByZXR1cm5lZCAmJgoKCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjQKCQkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0CgkJCQkJCQkJCQkvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHkKCQkJCQkJCQkJCSggdHlwZW9mIHJldHVybmVkID09PSAib2JqZWN0IiB8fAoJCQkJCQkJCQkJCXR5cGVvZiByZXR1cm5lZCA9PT0gImZ1bmN0aW9uIiApICYmCgkJCQkJCQkJCQlyZXR1cm5lZC50aGVuOwoKCQkJCQkJCQkJLy8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGUKCQkJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7CgoJCQkJCQkJCQkJLy8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvbgoJCQkJCQkJCQkJaWYgKCBzcGVjaWFsICkgewoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICkKCQkJCQkJCQkJCQkpOwoKCQkJCQkJCQkJCS8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzcwoJCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkJLy8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlcwoJCQkJCQkJCQkJCW1heERlcHRoKys7CgoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksCgkJCQkJCQkJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoICkKCQkJCQkJCQkJCQkpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXMKCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0CgkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCWlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7CgkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQlhcmdzID0gWyByZXR1cm5lZCBdOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpCgkJCQkJCQkJCQkvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZQoJCQkJCQkJCQkJKCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0sCgoJCQkJCQkJCS8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9ucwoJCQkJCQkJCXByb2Nlc3MgPSBzcGVjaWFsID8KCQkJCQkJCQkJbWlnaHRUaHJvdyA6CgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJCQltaWdodFRocm93KCk7CgkJCQkJCQkJCQl9IGNhdGNoICggZSApIHsKCgkJCQkJCQkJCQkJaWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHsKCQkJCQkJCQkJCQkJalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsCgkJCQkJCQkJCQkJCQlwcm9jZXNzLnN0YWNrVHJhY2UgKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjEKCQkJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MQoJCQkJCQkJCQkJCS8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9ucwoJCQkJCQkJCQkJCWlmICggZGVwdGggKyAxID49IG1heERlcHRoICkgewoKCQkJCQkJCQkJCQkJLy8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dAoJCQkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCQkJaWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkgewoJCQkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQkJCWFyZ3MgPSBbIGUgXTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJfTsKCgkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMQoJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTcKCQkJCQkJCS8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb20KCQkJCQkJCS8vIHN1YnNlcXVlbnQgZXJyb3JzCgkJCQkJCQlpZiAoIGRlcHRoICkgewoJCQkJCQkJCXByb2Nlc3MoKTsKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCS8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvbgoJCQkJCQkJCS8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luYwoJCQkJCQkJCWlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHsKCQkJCQkJCQkJcHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpOwoJCQkJCQkJCX0KCQkJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApOwoJCQkJCQkJfQoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoKCQkJCQkJLy8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKQoJCQkJCQl0dXBsZXNbIDAgXVsgMyBdLmFkZCgKCQkJCQkJCXJlc29sdmUoCgkJCQkJCQkJMCwKCQkJCQkJCQluZXdEZWZlciwKCQkJCQkJCQlpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgPwoJCQkJCQkJCQlvblByb2dyZXNzIDoKCQkJCQkJCQkJSWRlbnRpdHksCgkJCQkJCQkJbmV3RGVmZXIubm90aWZ5V2l0aAoJCQkJCQkJKQoJCQkJCQkpOwoKCQkJCQkJLy8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAxIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/CgkJCQkJCQkJCW9uRnVsZmlsbGVkIDoKCQkJCQkJCQkJSWRlbnRpdHkKCQkJCQkJCSkKCQkJCQkJKTsKCgkJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAyIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25SZWplY3RlZCApID8KCQkJCQkJCQkJb25SZWplY3RlZCA6CgkJCQkJCQkJCVRocm93ZXIKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQl9ICkucHJvbWlzZSgpOwoJCQkJfSwKCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwKCQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdOwoKCQkJLy8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkCgkJCXByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVTdHJpbmcgKSB7CgkJCQlsaXN0LmFkZCgKCQkJCQlmdW5jdGlvbigpIHsKCgkJCQkJCS8vIHN0YXRlID0gInJlc29sdmVkIiAoaS5lLiwgZnVsZmlsbGVkKQoJCQkJCQkvLyBzdGF0ZSA9ICJyZWplY3RlZCIKCQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKCQkJCQl9LAoKCQkJCQkvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCS8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsCgoJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGUKCQkJCQkvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsCgoJCQkJCS8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDIgXS5sb2NrLAoKCQkJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDMgXS5sb2NrCgkJCQkpOwoJCQl9CgoJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlCgkJCS8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlCgkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmUKCQkJbGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApOwoKCQkJLy8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfQoJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7CgkJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgoJCQkvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aAoJCQkvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJLy8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSApOwoKCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CgoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoKCQkvLyBBbGwgZG9uZSEKCQlyZXR1cm4gZGVmZXJyZWQ7Cgl9LAoKCS8vIERlZmVycmVkIGhlbHBlcgoJd2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkgewoJCXZhcgoKCQkJLy8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCgkJCXJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsCgoJCQkvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHMKCQkJaSA9IHJlbWFpbmluZywKCgkJCS8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGEKCQkJcmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSwKCQkJcmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoKCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZAoJCQltYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCgkJCS8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3RvcnkKCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwoJCQkJCWlmICggISggLS1yZW1haW5pbmcgKSApIHsKCQkJCQkJbWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoKCQkvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmUKCQlpZiAoIHJlbWFpbmluZyA8PSAxICkgewoJCQlhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsCgkJCQkhcmVtYWluaW5nICk7CgoJCQkvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApCgkJCWlmICggbWFzdGVyLnN0YXRlKCkgPT09ICJwZW5kaW5nIiB8fAoJCQkJaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7CgoJCQkJcmV0dXJuIG1hc3Rlci50aGVuKCk7CgkJCX0KCQl9CgoJCS8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzCgkJd2hpbGUgKCBpLS0gKSB7CgkJCWFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7CgkJfQoKCQlyZXR1cm4gbWFzdGVyLnByb21pc2UoKTsKCX0KfSApOwoKCi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LAovLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC4KdmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87CgpqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7CgoJLy8gU3VwcG9ydDogSUUgOCAtIDkgb25seQoJLy8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKCWlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7CgkJd2luZG93LmNvbnNvbGUud2FybiggImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTsKCX0KfTsKCgoKCmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQl0aHJvdyBlcnJvcjsKCX0gKTsKfTsKCgoKCi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQp2YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgoJcmVhZHlMaXN0CgkJLnRoZW4oIGZuICkKCgkJLy8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXAKCQkvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2sKCQkvLyByZWdpc3RyYXRpb24uCgkJLmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7CgkJCWpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTsKCQl9ICk7CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KCWlzUmVhZHk6IGZhbHNlLAoKCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCglyZWFkeVdhaXQ6IDEsCgoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewoKCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CgkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCX0KfSApOwoKalF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjsKCi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHsKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKCWpRdWVyeS5yZWFkeSgpOwp9CgovLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZAovLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seQovLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyAiaW50ZXJhY3RpdmUiIHRvbyBzb29uCmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fAoJKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkgewoKCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwoKfSBlbHNlIHsKCgkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCApOwoKCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKfQoKCgoKLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgp2YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGVsZW1zLmxlbmd0aCwKCQlidWxrID0ga2V5ID09IG51bGw7CgoJLy8gU2V0cyBtYW55IHZhbHVlcwoJaWYgKCB0b1R5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKCQljaGFpbmFibGUgPSB0cnVlOwoJCWZvciAoIGkgaW4ga2V5ICkgewoJCQlhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8gU2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmF3ID0gdHJ1ZTsKCQl9CgoJCWlmICggYnVsayApIHsKCgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0KCQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQkJZm4oCgkJCQkJZWxlbXNbIGkgXSwga2V5LCByYXcgPwoJCQkJCXZhbHVlIDoKCQkJCQl2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQoJCQkJKTsKCQkJfQoJCX0KCX0KCglpZiAoIGNoYWluYWJsZSApIHsKCQlyZXR1cm4gZWxlbXM7Cgl9CgoJLy8gR2V0cwoJaWYgKCBidWxrICkgewoJCXJldHVybiBmbi5jYWxsKCBlbGVtcyApOwoJfQoKCXJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDsKfTsKCgovLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKdmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7CgovLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7CglyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Cn0KCi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQovLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkgewoJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwp9CnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgewoKCS8vIEFjY2VwdHMgb25seToKCS8vICAtIE5vZGUKCS8vICAgIC0gTm9kZS5FTEVNRU5UX05PREUKCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCgkvLyAgLSBPYmplY3QKCS8vICAgIC0gQW55CglyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cn07CgoKCgpmdW5jdGlvbiBEYXRhKCkgewoJdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwp9CgpEYXRhLnVpZCA9IDE7CgpEYXRhLnByb3RvdHlwZSA9IHsKCgljYWNoZTogZnVuY3Rpb24oIG93bmVyICkgewoKCQkvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUKCQl2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCS8vIElmIG5vdCwgY3JlYXRlIG9uZQoJCWlmICggIXZhbHVlICkgewoJCQl2YWx1ZSA9IHt9OwoKCQkJLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCgkJCS8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCgkJCS8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LgoJCQlpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CgoJCQkJLy8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlcgoJCQkJLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQKCQkJCWlmICggb3duZXIubm9kZVR5cGUgKSB7CgkJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7CgoJCQkJLy8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5CgkJCQkvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQoJCQkJLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoJCQkJfSBlbHNlIHsKCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHsKCQkJCQkJdmFsdWU6IHZhbHVlLAoJCQkJCQljb25maWd1cmFibGU6IHRydWUKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB2YWx1ZTsKCX0sCglzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CgkJdmFyIHByb3AsCgkJCWNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJncwoJCS8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1NykKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJY2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKCQl9IGVsc2UgewoKCQkJLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKCQkJZm9yICggcHJvcCBpbiBkYXRhICkgewoJCQkJY2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07CgkJCX0KCQl9CgkJcmV0dXJuIGNhY2hlOwoJfSwKCWdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcy5jYWNoZSggb3duZXIgKSA6CgoJCQkvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpCgkJCW93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTsKCX0sCglhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHsKCgkJLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAoJCS8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAoJCS8vCgkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQoJCS8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKCQkvLwoJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKCQkvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5CgkJLy8KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CgkJCQkoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7CgkJfQoKCQkvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQoJCS8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwoJCS8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCgkJLy8KCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKCgkJLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cwoJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQoJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7Cgl9LAoJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKCQl2YXIgaSwKCQkJY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCWlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzCgkJCWlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7CgoJCQkJLy8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KCQkJCS8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LgoJCQkJa2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7CgkJCX0gZWxzZSB7CgkJCQlrZXkgPSBjYW1lbENhc2UoIGtleSApOwoKCQkJCS8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC4KCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCgkJCQlrZXkgPSBrZXkgaW4gY2FjaGUgPwoJCQkJCVsga2V5IF0gOgoJCQkJCSgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTsKCQkJfQoKCQkJaSA9IGtleS5sZW5ndGg7CgoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKCgkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUKCQkJLy8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKCQkJLy8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZAoJCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKQoJCQlpZiAoIG93bmVyLm5vZGVUeXBlICkgewoJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKCQkJfQoJCX0KCX0sCgloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CgkJdmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdOwoJCXJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTsKCX0KfTsKdmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTsKCnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7CgoKCi8vCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKLy8KLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAovLwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLy8JCXBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS4KLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgovLwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQovLwk1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcykKLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0Cgp2YXIgcmJyYWNlID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvW0EtWl0vZzsKCmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7CglpZiAoIGRhdGEgPT09ICJ0cnVlIiApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGRhdGEgPT09ICJmYWxzZSIgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggZGF0YSA9PT0gIm51bGwiICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCglpZiAoIGRhdGEgPT09ICtkYXRhICsgIiIgKSB7CgkJcmV0dXJuICtkYXRhOwoJfQoKCWlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHsKCQlyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApOwoJfQoKCXJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewoJdmFyIG5hbWU7CgoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNhc2UoKTsKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0gZ2V0RGF0YSggZGF0YSApOwoJCQl9IGNhdGNoICggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCXJldHVybiBkYXRhOwp9CgpqUXVlcnkuZXh0ZW5kKCB7CgloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTsKCX0sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWQKCS8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKCX0sCgoJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaSwgbmFtZSwgZGF0YSwKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJYXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgImhhc0RhdGFBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUgMTEgb25seQoJCQkJCQkvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NCkKCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgewoJCQkJCQkJbmFtZSA9IGF0dHJzWyBpIF0ubmFtZTsKCQkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CgkJCQkJCQkJbmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTsKCQkJfSApOwoJCX0KCgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZGF0YTsKCgkJCS8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CgkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCgkJCS8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0CgkJCS8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KCQkJaWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZQoJCQkJLy8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGEKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gQXR0ZW1wdCB0byAiZGlzY292ZXIiIHRoZSBkYXRhIGluCgkJCQkvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCgkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRhdGEuLi4KCQkJdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCgkJCQkvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5CgkJCQlkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApOwoJCX0gKTsKCX0KfSApOwoKCmpRdWVyeS5leHRlbmQoIHsKCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKCQl2YXIgcXVldWU7CgoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwoJCQlxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApOwoKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJcXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWV1ZS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOwoJCX0KCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCgkJCW5leHQgPSBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CgkJCX07CgoJCS8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkJc3RhcnRMZW5ndGgtLTsKCQl9CgoJCWlmICggZm4gKSB7CgoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CgkJCX0KCgkJCS8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CgkJfQoKCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCX0KCX0sCgoJLy8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmUKCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKCQlyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwgewoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLmFkZCggZnVuY3Rpb24oKSB7CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1ZSIsIGtleSBdICk7CgkJCX0gKQoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWyAwIF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9ICk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSApOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoKCS8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsKCQl2YXIgdG1wLAoJCQljb3VudCA9IDEsCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IHRoaXMubGVuZ3RoLAoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwoJCQkJfQoJCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJb2JqID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJd2hpbGUgKCBpLS0gKSB7CgkJCXRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0gKTsKdmFyIHBudW0gPSAoIC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8gKS5zb3VyY2U7Cgp2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CgoKdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKCnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgoJCS8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwoJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAoJCWVsZW0gPSBlbCB8fCBlbGVtOwoKCQkvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbAoJCXJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fAoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmCgoJCQkvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlCgkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1CgkJCS8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpcwoJCQkvLyBpbiB0aGUgZG9jdW1lbnQuCgkJCWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiYKCgkJCWpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSI7Cgl9OwoKdmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Cgl2YXIgcmV0LCBuYW1lLAoJCW9sZCA9IHt9OwoKCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCX0KCglyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwoKCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQoKCXJldHVybiByZXQ7Cn07CgoKCgpmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgewoJdmFyIGFkanVzdGVkLCBzY2FsZSwKCQltYXhJdGVyYXRpb25zID0gMjAsCgkJY3VycmVudFZhbHVlID0gdHdlZW4gPwoJCQlmdW5jdGlvbigpIHsKCQkJCXJldHVybiB0d2Vlbi5jdXIoKTsKCQkJfSA6CgkJCWZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsICIiICk7CgkJCX0sCgkJaW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLAoJCXVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAoKCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCWluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKCQkJcmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTsKCglpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgewoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTQKCQkvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpCgkJaW5pdGlhbCA9IGluaXRpYWwgLyAyOwoKCQkvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzCgkJdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdOwoKCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCWluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxOwoKCQl3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHsKCgkJCS8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuCgkJCS8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS4KCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApOwoJCQlpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHsKCQkJCW1heEl0ZXJhdGlvbnMgPSAwOwoJCQl9CgkJCWluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CgoJCX0KCgkJaW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyOwoJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTsKCgkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCXZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdOwoJfQoKCWlmICggdmFsdWVQYXJ0cyApIHsKCQlpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDsKCgkJLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkCgkJYWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gPwoJCQlpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOgoJCQkrdmFsdWVQYXJ0c1sgMiBdOwoJCWlmICggdHdlZW4gKSB7CgkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQl0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7CgkJCXR3ZWVuLmVuZCA9IGFkanVzdGVkOwoJCX0KCX0KCXJldHVybiBhZGp1c3RlZDsKfQoKCnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9OwoKZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7Cgl2YXIgdGVtcCwKCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCgkJbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLAoJCWRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTsKCglpZiAoIGRpc3BsYXkgKSB7CgkJcmV0dXJuIGRpc3BsYXk7Cgl9CgoJdGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApOwoJZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsICJkaXNwbGF5IiApOwoKCXRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApOwoKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCWRpc3BsYXkgPSAiYmxvY2siOwoJfQoJZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZGlzcGxheSwgZWxlbSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCS8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZQoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoKCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwoJCWlmICggc2hvdyApIHsKCgkJCS8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdykKCQkJLy8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyCgkJCS8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZCkKCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJkaXNwbGF5IiApIHx8IG51bGw7CgkJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CgkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQl9CgkJCX0KCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gIm5vbmUiOwoKCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmcKCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvdwoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkgewoJCQllbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgewoJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CgkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0gKTsKCX0KfSApOwp2YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7Cgp2YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pICk7Cgp2YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApOwoKCgovLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKQp2YXIgd3JhcE1hcCA9IHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCgkvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZQoJLy8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlbgoJLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgoJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgljb2w6IFsgMiwgIjx0YWJsZT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAoKCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCn07CgovLyBTdXBwb3J0OiBJRSA8PTkgb25seQp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Cgp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5CgkvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpCgl2YXIgcmV0OwoKCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgewoJCXJldCA9IFtdOwoJfQoKCWlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHsKCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKCi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZApmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Cgl2YXIgaSA9IDAsCgkJbCA9IGVsZW1zLmxlbmd0aDsKCglmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJZGF0YVByaXYuc2V0KAoJCQllbGVtc1sgaSBdLAoJCQkiZ2xvYmFsRXZhbCIsCgkJCSFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCgkJKTsKCX0KfQoKCnZhciByaHRtbCA9IC88fCYjP1x3KzsvOwoKZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKCXZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlub2RlcyA9IFtdLAoJCWkgPSAwLAoJCWwgPSBlbGVtcy5sZW5ndGg7CgoJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1sgaSBdOwoKCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKCgkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQoJCQlpZiAoIHRvVHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQoJCQl9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CgoJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKCQkJfSBlbHNlIHsKCQkJCXRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CgoJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgoJCQkJdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwoJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07CgoJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CgkJCQlqID0gd3JhcFsgMCBdOwoJCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQkJdG1wID0gdG1wLmxhc3RDaGlsZDsKCQkJCX0KCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CgoJCQkJLy8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIKCQkJCXRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQkJLy8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKQoJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9Cgl9CgoJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAoJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKCglpID0gMDsKCXdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CgoJCS8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpCgkJaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7CgkJCWlmICggaWdub3JlZCApIHsKCQkJCWlnbm9yZWQucHVzaCggZWxlbSApOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCgkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKCQl0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlpZiAoIGNvbnRhaW5zICkgewoJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKCQl9CgoJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKCQlpZiAoIHNjcmlwdHMgKSB7CgkJCWogPSAwOwoJCQl3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHsKCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGZyYWdtZW50Owp9CgoKKCBmdW5jdGlvbigpIHsKCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApLAoJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHkKCS8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpCgkvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCgkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAicmFkaW8iICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seQoJLy8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZAoJZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOwp9ICkoKTsKdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgoKdmFyCglya2V5RXZlbnQgPSAvXmtleS8sCglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkvOwoKZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKCXJldHVybiBmYWxzZTsKfQoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvCmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewoJdHJ5IHsKCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCX0gY2F0Y2ggKCBlcnIgKSB7IH0KfQoKZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHsKCXZhciBvcmlnRm4sIHR5cGU7CgoJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCglpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCW9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJfQoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgoJCS8vICggdHlwZXMsIGZuICkKCQlmbiA9IHNlbGVjdG9yOwoJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0gZWxzZSB7CgoJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9Cgl9CglpZiAoIGZuID09PSBmYWxzZSApIHsKCQlmbiA9IHJldHVybkZhbHNlOwoJfSBlbHNlIGlmICggIWZuICkgewoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggb25lID09PSAxICkgewoJCW9yaWdGbiA9IGZuOwoJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCgkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKCX0KCXJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkgewoJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCX0gKTsKfQoKLyoKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCWdsb2JhbDoge30sCgoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewoKCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCgkJCWV2ZW50cywgdCwgaGFuZGxlT2JqLAoJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCgkJCWVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZQoJCS8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KQoJCWlmICggc2VsZWN0b3IgKSB7CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAoJCWlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7CgkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OwoJCX0KCQlpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7CgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPwoJCQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCgkJCWlmICggIXR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCgkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9yaWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oICIuIiApCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQlpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fAoJCQkJCXNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CgoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2UgewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJfSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCgkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCWlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwoJCQl0bXAgPSB0bXBbIDIgXSAmJgoJCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOwoJCQl3aGlsZSAoIGotLSApIHsKCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CgoJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgoJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCgkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgoJCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwKCQkJCQkJc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CgkJCQkJfQoJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwKCQkJCQlzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCgkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CgkJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgImhhbmRsZSBldmVudHMiICk7CgkJfQoJfSwKCglkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkgewoKCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKCQl2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApOwoKCQl2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSwKCQkJYXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLAoJCQloYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJCS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1sgMCBdID0gZXZlbnQ7CgoJCWZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewoJCQlhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTsKCQl9CgoJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJd2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CgoJCQlqID0gMDsKCQkJd2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiYKCQkJCSFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoKCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2UocykKCQkJCS8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgoJCQkJaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKCgkJCQkJcmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fAoJCQkJCQloYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycywKCQkJaGFuZGxlclF1ZXVlID0gW10sCgkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAoJCQljdXIgPSBldmVudC50YXJnZXQ7CgoJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OQoJCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MCkKCQkJY3VyLm5vZGVUeXBlICYmCgoJCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDIKCQkJLy8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKQoJCQkvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrCgkJCS8vIFN1cHBvcnQ6IElFIDExIG9ubHkKCQkJLy8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgImNsaWNrcyIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0MykKCQkJISggZXZlbnQudHlwZSA9PT0gImNsaWNrIiAmJiBldmVudC5idXR0b24gPj0gMSApICkgewoKCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CgoJCQkJLy8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpCgkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09ICJjbGljayIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7CgkJCQkJbWF0Y2hlZEhhbmRsZXJzID0gW107CgkJCQkJbWF0Y2hlZFNlbGVjdG9ycyA9IHt9OwoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgewoJCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwoKCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwoKCQkJCQkJaWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7CgkJCQkJCQltYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycwoJCWN1ciA9IHRoaXM7CgkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewoJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTsKCQl9CgoJCXJldHVybiBoYW5kbGVyUXVldWU7Cgl9LAoKCWFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkgewoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwgewoJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQljb25maWd1cmFibGU6IHRydWUsCgoJCQlnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/CgkJCQlmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHsKCQkJCQkJCXJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTsKCQkJCQl9CgkJCQl9IDoKCQkJCWZ1bmN0aW9uKCkgewoJCQkJCWlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkgewoJCQkJCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdOwoJCQkJCX0KCQkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwgewoJCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCQkJCXdyaXRhYmxlOiB0cnVlLAoJCQkJCXZhbHVlOiB2YWx1ZQoJCQkJfSApOwoJCQl9CgkJfSApOwoJfSwKCglmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkgewoJCXJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KCQkJb3JpZ2luYWxFdmVudCA6CgkJCW5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCgkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKCQkJbm9CdWJibGU6IHRydWUKCQl9LAoJCWZvY3VzOiB7CgoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgoJCX0sCgkJYmx1cjogewoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKCQl9LAoJCWNsaWNrOiB7CgoJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKCQkJCQl0aGlzLmNsaWNrKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoKCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCgkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlyZXR1cm4gbm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCgkvLyBUaGlzICJpZiIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzCglpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApOwoJfQp9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKCQkJCXNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiYKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkKCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7CgoJCS8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllcwoJCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHkKCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCXRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/CgkJCXNyYy50YXJnZXQucGFyZW50Tm9kZSA6CgkJCXNyYy50YXJnZXQ7CgoJCXRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0OwoJCXRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0OwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwovLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzU2ltdWxhdGVkOiBmYWxzZSwKCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJfQoKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfQp9OwoKLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHMKalF1ZXJ5LmVhY2goIHsKCWFsdEtleTogdHJ1ZSwKCWJ1YmJsZXM6IHRydWUsCgljYW5jZWxhYmxlOiB0cnVlLAoJY2hhbmdlZFRvdWNoZXM6IHRydWUsCgljdHJsS2V5OiB0cnVlLAoJZGV0YWlsOiB0cnVlLAoJZXZlbnRQaGFzZTogdHJ1ZSwKCW1ldGFLZXk6IHRydWUsCglwYWdlWDogdHJ1ZSwKCXBhZ2VZOiB0cnVlLAoJc2hpZnRLZXk6IHRydWUsCgl2aWV3OiB0cnVlLAoJImNoYXIiOiB0cnVlLAoJY2hhckNvZGU6IHRydWUsCglrZXk6IHRydWUsCglrZXlDb2RlOiB0cnVlLAoJYnV0dG9uOiB0cnVlLAoJYnV0dG9uczogdHJ1ZSwKCWNsaWVudFg6IHRydWUsCgljbGllbnRZOiB0cnVlLAoJb2Zmc2V0WDogdHJ1ZSwKCW9mZnNldFk6IHRydWUsCglwb2ludGVySWQ6IHRydWUsCglwb2ludGVyVHlwZTogdHJ1ZSwKCXNjcmVlblg6IHRydWUsCglzY3JlZW5ZOiB0cnVlLAoJdGFyZ2V0VG91Y2hlczogdHJ1ZSwKCXRvRWxlbWVudDogdHJ1ZSwKCXRvdWNoZXM6IHRydWUsCgoJd2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uOwoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJcmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkgewoJCQlpZiAoIGJ1dHRvbiAmIDEgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCBidXR0b24gJiAyICkgewoJCQkJcmV0dXJuIDM7CgkJCX0KCgkJCWlmICggYnV0dG9uICYgNCApIHsKCQkJCXJldHVybiAyOwoJCQl9CgoJCQlyZXR1cm4gMDsKCQl9CgoJCXJldHVybiBldmVudC53aGljaDsKCX0KfSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwovLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LgovLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dAovLwovLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5Ci8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNTgKLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4KalF1ZXJ5LmVhY2goIHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKCXBvaW50ZXJlbnRlcjogInBvaW50ZXJvdmVyIiwKCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCWRlbGVnYXRlVHlwZTogZml4LAoJCWJpbmRUeXBlOiBmaXgsCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcmV0LAoJCQkJdGFyZ2V0ID0gdGhpcywKCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAoJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwoKCQkJLy8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewoJCXJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8KCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDoKCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9ICk7Cgl9Cn0gKTsKCgp2YXIKCgkvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgoJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5CglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksCgoJLyogZXNsaW50LWVuYWJsZSAqLwoKCS8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHkKCS8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuCgkvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLwoJcm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksCgoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKCi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93cwpmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglpZiAoIG5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgKSB7CgoJCXJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggInRib2R5IiApWyAwIF0gfHwgZWxlbTsKCX0KCglyZXR1cm4gZWxlbTsKfQoKLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgpmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgewoJZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICkgIT09IG51bGwgKSArICIvIiArIGVsZW0udHlwZTsKCXJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CglpZiAoICggZWxlbS50eXBlIHx8ICIiICkuc2xpY2UoIDAsIDUgKSA9PT0gInRydWUvIiApIHsKCQllbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTsKCX0gZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoICJ0eXBlIiApOwoJfQoKCXJldHVybiBlbGVtOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoJdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgoJaWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKCQlwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7CgkJcGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CgkJZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CgoJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyAyLiBDb3B5IHVzZXIgZGF0YQoJaWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHsKCQl1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7CgkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKCgkJZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOwoJfQp9CgovLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoJfQp9CgpmdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7CgoJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJYXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgl2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsCgkJaSA9IDAsCgkJbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAoJCWlOb0Nsb25lID0gbCAtIDEsCgkJdmFsdWUgPSBhcmdzWyAwIF0sCgkJdmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCWlmICggdmFsdWVJc0Z1bmN0aW9uIHx8CgkJCSggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJgoJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQl2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7CgkJCWlmICggdmFsdWVJc0Z1bmN0aW9uICkgewoJCQkJYXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7CgkJCX0KCQkJZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CgkJfSApOwoJfQoKCWlmICggbCApIHsKCQlmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApOwoJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQl9CgoJCS8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjawoJCWlmICggZmlyc3QgfHwgaWdub3JlZCApIHsKCQkJc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOwoKCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbQoJCQkvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJbm9kZSA9IGZyYWdtZW50OwoKCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CgkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwoKCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJCQkJaWYgKCBoYXNTY3JpcHRzICkgewoKCQkJCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJCQl9CgkJCQl9CgoJCQkJY2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7CgkJCX0KCgkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CgoJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwoJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOwoKCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewoJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07CgkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgoJCQkJCQkhZGF0YVByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgoJCQkJCQlqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJaWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCAiIiApLnRvTG93ZXJDYXNlKCkgICE9PSAibW9kdWxlIiApIHsKCgkJCQkJCQkvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudAoJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CgkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICksIGRvYywgbm9kZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBjb2xsZWN0aW9uOwp9CgpmdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCXZhciBub2RlLAoJCW5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSwKCQlpID0gMDsKCglmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7CgkJaWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKCQl9CgoJCWlmICggbm9kZS5wYXJlbnROb2RlICkgewoJCQlpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7CgkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJfQoJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTsKCQl9Cgl9CgoJcmV0dXJuIGVsZW07Cn0KCmpRdWVyeS5leHRlbmQoIHsKCWh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAoJCQlpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCgkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgoJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJCX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKCQkJaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCQlpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkgewoJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CgkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CgoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJaWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgkJfQoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOwoJfSwKCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwoJCQkJCX0KCQkJCX0gKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0gKTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKCQkJCXRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0gKTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwoKCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7CgkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOwoKCQlyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0gKTsKCX0sCgoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CgoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2ggKCBlICkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgaWdub3JlZCA9IFtdOwoKCQkvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnQKCQlyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQlpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkgewoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKCQkJCWlmICggcGFyZW50ICkgewoJCQkJCXBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJCX0KCQkJfQoKCQkvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uCgkJfSwgaWdub3JlZCApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAoJCQlpID0gMDsKCgkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKCQkJalF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0gKTsKdmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApOwoKdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApCgkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCgkJLy8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoICJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlIgoJCXZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQlpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHsKCQkJdmlldyA9IHdpbmRvdzsKCQl9CgoJCXJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTsKCX07Cgp2YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oICJ8IiApLCAiaSIgKTsKCgoKKCBmdW5jdGlvbigpIHsKCgkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQKCS8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uCglmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHsKCgkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZQoJCWlmICggIWRpdiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4OyIgKwoJCQkibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIjsKCQlkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7IiArCgkJCSJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4OyIgKwoJCQkid2lkdGg6NjAlO3RvcDoxJSI7CgkJZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTsKCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0CgkJcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjMKCQkvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3QKCQlkaXYuc3R5bGUucmlnaHQgPSAiNjAlIjsKCQlwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkJLy8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50cwoJCWJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjsKCgkJLy8gU3VwcG9ydDogSUUgOSBvbmx5CgkJLy8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KQoJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgImFic29sdXRlIjsKCgkJZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCgkJLy8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZAoJCS8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQKCQlkaXYgPSBudWxsOwoJfQoKCWZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHsKCQlyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7Cgl9CgoJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCwKCQlyZWxpYWJsZU1hcmdpbkxlZnRWYWwsCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFkaXYuc3R5bGUgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCS8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CglkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOwoKCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKCQl9LAoJCXBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsOwoJCX0sCgkJcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgkJcmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKCQl9LAoJCXNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkgewoJCQljb21wdXRlU3R5bGVUZXN0cygpOwoJCQlyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDsKCQl9Cgl9ICk7Cn0gKSgpOwoKCmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7Cgl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDUxKwoJCS8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3cKCQkvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzCgkJLy8gb24gZGV0YWNoZWQgZWxlbWVudHMKCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6CgkvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNykKCS8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KQoJaWYgKCBjb21wdXRlZCApIHsKCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKCgkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQl9CgoJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJLy8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsCgkJLy8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy4KCQkvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQlpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CgkJfQoJfQoKCXJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CgoJCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCQkvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgoJCXJldCArICIiIDoKCQlyZXQ7Cn0KCgpmdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgoJLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KCXJldHVybiB7CgkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJaWYgKCBjb25kaXRpb25GbigpICkgewoKCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZQoJCQkJLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCQkJcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfTsKfQoKCnZhcgoKCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUKCS8vIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglyY3VzdG9tUHJvcCA9IC9eLS0vLAoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogIjAiLAoJCWZvbnRXZWlnaHQ6ICI0MDAiCgl9LAoKCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk1veiIsICJtcyIgXSwKCWVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLnN0eWxlOwoKLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHsKCgkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAoJaWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHsKCQkJcmV0dXJuIG5hbWU7CgkJfQoJfQp9CgovLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG8KLy8gYSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkuCmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7Cgl2YXIgcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF07CglpZiAoICFyZXQgKSB7CgkJcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7Cgl9CglyZXR1cm4gcmV0Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoKCS8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4KCS8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludAoJdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CglyZXR1cm4gbWF0Y2hlcyA/CgoJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcwoJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgInB4IiApIDoKCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7Cgl2YXIgaSA9IGRpbWVuc2lvbiA9PT0gIndpZHRoIiA/IDEgOiAwLAoJCWV4dHJhID0gMCwKCQlkZWx0YSA9IDA7CgoJLy8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeQoJaWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApICkgewoJCXJldHVybiAwOwoJfQoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCgkJLy8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luCgkJaWYgKCBib3ggPT09ICJtYXJnaW4iICkgewoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgkJfQoKCQkvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgInBhZGRpbmciIG9yICJib3JkZXIiIG9yICJtYXJnaW4iCgkJaWYgKCAhaXNCb3JkZXJCb3ggKSB7CgoJCQkvLyBBZGQgcGFkZGluZwoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgoJCQkvLyBGb3IgImJvcmRlciIgb3IgIm1hcmdpbiIsIGFkZCBib3JkZXIKCQkJaWYgKCBib3ggIT09ICJwYWRkaW5nIiApIHsKCQkJCWRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKCgkJCS8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZQoJCQl9IGVsc2UgewoJCQkJZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgoJCS8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgImNvbnRlbnQiIG9yCgkJLy8gInBhZGRpbmciIG9yICJtYXJnaW4iCgkJfSBlbHNlIHsKCgkJCS8vIEZvciAiY29udGVudCIsIHN1YnRyYWN0IHBhZGRpbmcKCQkJaWYgKCBib3ggPT09ICJjb250ZW50IiApIHsKCQkJCWRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQkJfQoKCQkJLy8gRm9yICJjb250ZW50IiBvciAicGFkZGluZyIsIHN1YnRyYWN0IGJvcmRlcgoJCQlpZiAoIGJveCAhPT0gIm1hcmdpbiIgKSB7CgkJCQlkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CgkJCX0KCQl9Cgl9CgoJLy8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWwKCWlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7CgoJCS8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXIKCQkvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duCgkJZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbCgKCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCWNvbXB1dGVkVmFsIC0KCQkJZGVsdGEgLQoJCQlleHRyYSAtCgkJCTAuNQoJCSkgKTsKCX0KCglyZXR1cm4gZGVsdGE7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7CgoJLy8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZQoJdmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAoJCXZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7CgoJLy8gU3VwcG9ydDogRmlyZWZveCA8PTU0CgkvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS4KCWlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkgewoJCWlmICggIWV4dHJhICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCQl2YWwgPSAiYXV0byI7Cgl9CgoJLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKCXZhbHVlSXNCb3JkZXJCb3ggPSB2YWx1ZUlzQm9yZGVyQm94ICYmCgkJKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSApOwoKCS8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyAiYXV0byIKCS8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSkKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seQoJLy8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMikKCWlmICggdmFsID09PSAiYXV0byIgfHwKCQkhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiLCBmYWxzZSwgc3R5bGVzICkgPT09ICJpbmxpbmUiICkgewoKCQl2YWwgPSBlbGVtWyAib2Zmc2V0IiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdOwoKCQkvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlcwoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlOwoJfQoKCS8vIE5vcm1hbGl6ZSAiIiBhbmQgYXV0bwoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsCglyZXR1cm4gKCB2YWwgKwoJCWJveE1vZGVsQWRqdXN0bWVudCgKCQkJZWxlbSwKCQkJZGltZW5zaW9uLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveCwKCQkJc3R5bGVzLAoKCQkJLy8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSkKCQkJdmFsCgkJKQoJKSArICJweCI7Cn0KCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCgljc3NOdW1iZXI6IHsKCQkiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAoJCSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHt9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndAoJCS8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eQoJCS8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC4KCQlpZiAoICFpc0N1c3RvbVByb3AgKSB7CgkJCW5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApOwoJCX0KCgkJLy8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOwoKCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsKCQkJCXZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTsKCgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNikKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gIiIgOiAicHgiICk7CgkJCX0KCgkJCS8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXMKCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CgkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISggInNldCIgaW4gaG9va3MgKSB8fAoJCQkJKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggaXNDdXN0b21Qcm9wICkgewoJCQkJCXN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJfSBlbHNlIHsKCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKCQl2YXIgdmFsLCBudW0sIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3QKCQkvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5CgkJLy8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLgoJCWlmICggIWlzQ3VzdG9tUHJvcCApIHsKCQkJbmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7CgkJfQoKCQkvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwoJCX0KCgkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwoJCX0KCgkJLy8gQ29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQoJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CgkJfQoKCQkvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgoJCXJldHVybiB2YWw7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBkaW1lbnNpb24gKSB7CglqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0CgkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKCgkJCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrCgkJCQkJLy8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm8KCQkJCQkvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQoJCQkJCS8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGUKCQkJCQkvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuCgkJCQkJKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID8KCQkJCQkJc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApOwoJCQkJCQl9ICkgOgoJCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXZhciBtYXRjaGVzLAoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCgkJCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQkJCXN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KAoJCQkJCWVsZW0sCgkJCQkJZGltZW5zaW9uLAoJCQkJCWV4dHJhLAoJCQkJCWlzQm9yZGVyQm94LAoJCQkJCXN0eWxlcwoJCQkJKTsKCgkJCS8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZAoJCQkvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KQoJCQlpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7CgkJCQlzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoCgkJCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCQkJcGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC0KCQkJCQlib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgImJvcmRlciIsIGZhbHNlLCBzdHlsZXMgKSAtCgkJCQkJMC41CgkJCQkpOwoJCQl9CgoJCQkvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZAoJCQlpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmCgkJCQkoIG1hdGNoZXNbIDMgXSB8fCAicHgiICkgIT09ICJweCIgKSB7CgoJCQkJZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTsKCQkJCXZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7CgkJCX0KCgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CgkJfQoJfTsKfSApOwoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LAoJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCWlmICggY29tcHV0ZWQgKSB7CgkJCXJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgIm1hcmdpbkxlZnQiICkgKSB8fAoJCQkJZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KCQkJCQlzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CgkJCQkJfSApCgkJCQkpICsgInB4IjsKCQl9Cgl9Cik7CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKCB7CgltYXJnaW46ICIiLAoJcGFkZGluZzogIiIsCglib3JkZXI6ICJXaWR0aCIKfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKCQlleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGkgPSAwLAoJCQkJZXhwYW5kZWQgPSB7fSwKCgkJCQkvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCAiICIgKSA6IFsgdmFsdWUgXTsKCgkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggcHJlZml4ICE9PSAibWFyZ2luIiApIHsKCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZXMsIGxlbiwKCQkJCW1hcCA9IHt9LAoJCQkJaSA9IDA7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApOwoJCQkJbGVuID0gbmFtZS5sZW5ndGg7CgoJCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwoJCQkJfQoKCQkJCXJldHVybiBtYXA7CgkJCX0KCgkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CgkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9Cn0gKTsKCgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJLy8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCwKCQkJLy8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy4KCQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgoJCQkvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7CgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOwoKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCgkJCS8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LgoJCQkvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuCgkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7CgkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKCQkJCSggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8CgkJCQkJalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwoJCQl9IGVsc2UgewoJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCQl9CgkJfQoJfQp9OwoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKCX0sCglfZGVmYXVsdDogInN3aW5nIgp9OwoKalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CgovLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKCgoKdmFyCglmeE5vdywgaW5Qcm9ncmVzcywKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC87CgpmdW5jdGlvbiBzY2hlZHVsZSgpIHsKCWlmICggaW5Qcm9ncmVzcyApIHsKCQlpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApOwoJCX0KCgkJalF1ZXJ5LmZ4LnRpY2soKTsKCX0KfQoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0gKTsKCXJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApOwp9CgovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNoLAoJCWkgPSAwLAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKCgkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCgkvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7Cglmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJaWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHsKCgkJCS8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCXJldHVybiB0d2VlbjsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewoJdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LAoJCWlzQm94ID0gIndpZHRoIiBpbiBwcm9wcyB8fCAiaGVpZ2h0IiBpbiBwcm9wcywKCQlhbmltID0gdGhpcywKCQlvcmlnID0ge30sCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCWhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksCgkJZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzCglpZiAoICFvcHRzLnF1ZXVlICkgewoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7CgkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewoJCQlob29rcy51bnF1ZXVlZCA9IDA7CgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwoJCQlob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKCQkJCQlvbGRmaXJlKCk7CgkJCQl9CgkJCX07CgkJfQoJCWhvb2tzLnVucXVldWVkKys7CgoJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9ICk7CgkJfSApOwoJfQoKCS8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CgkJaWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCgkJCQkvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgInNob3ciIGFuZAoJCQkJLy8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGUKCQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsKCgkJCQkvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhCgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgkJfQoJfQoKCS8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpCglwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7CglpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKCQlyZXR1cm47Cgl9CgoJLy8gUmVzdHJpY3QgIm92ZXJmbG93IiBhbmQgImRpc3BsYXkiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnMKCWlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZAoJCS8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9ycwoJCS8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZQoJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTsKCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCAiZGlzcGxheSIgKTsKCQl9CgkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ICkgewoJCQkJZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQl9IGVsc2UgewoKCQkJCS8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHkKCQkJCXNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApOwoJCQkJcmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7CgkJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0gKTsKCQkJfQoJCX0KCgkJLy8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrCgkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkgewoJCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoKCQkJCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zCgkJCQlpZiAoICFwcm9wVHdlZW4gKSB7CgkJCQkJYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKCQkJCQkJc3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQkJCX0gKTsKCQkJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCQkJCWRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5OwoJCQkJCQlyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/ICIiIDogZGlzcGxheTsKCQkJCQl9CgkJCQl9CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJYW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOwoJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJfSApOwoJfQoKCS8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJcHJvcFR3ZWVuID0gZmFsc2U7Cglmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgoJCS8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uCgkJaWYgKCAhcHJvcFR3ZWVuICkgewoJCQlpZiAoIGRhdGFTaG93ICkgewoJCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApOwoJCQl9CgoJCQkvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCAicmV2ZXJzZXMiCgkJCWlmICggdG9nZ2xlICkgewoJCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKCQkJfQoKCQkJLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW0KCQkJaWYgKCBoaWRkZW4gKSB7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTsKCQkJfQoKCQkJLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovCgoJCQlhbmltLmRvbmUoIGZ1bmN0aW9uKCkgewoKCQkJLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi8KCgkJCQkvLyBUaGUgZmluYWwgc3RlcCBvZiBhICJoaWRlIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50CgkJCQlpZiAoICFoaWRkZW4gKSB7CgkJCQkJc2hvd0hpZGUoIFsgZWxlbSBdICk7CgkJCQl9CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CgkJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gUGVyLXByb3BlcnR5IHNldHVwCgkJcHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CgkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCWRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7CgkJCWlmICggaGlkZGVuICkgewoJCQkJcHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDsKCQkJCXByb3BUd2Vlbi5zdGFydCA9IDA7CgkJCX0KCQl9Cgl9Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7CgkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCgkJCS8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAoJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0gKSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoKCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHkKCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJCWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApOwoKCQkJLy8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZAoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvbgoJCQlpZiAoICFsZW5ndGggKSB7CgkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7CgkJCX0KCgkJCS8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uCgkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsKCQkJCXNwZWNpYWxFYXNpbmc6IHt9LAoJCQkJZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CgkJCX0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4gdHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJdmFyIGluZGV4ID0gMCwKCgkJCQkJLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCQkJCWlmICggc3RvcHBlZCApIHsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJCXN0b3BwZWQgPSB0cnVlOwoJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOwoJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSApLAoJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOwoKCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwoJCWlmICggcmVzdWx0ICkgewoJCQlpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7CgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQoJCQkJCXJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApOwoJCQl9CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfQoKCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CgoJaWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwoJfQoKCS8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglhbmltYXRpb24KCQkucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQllbGVtOiBlbGVtLAoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQoJCX0gKQoJKTsKCglyZXR1cm4gYW5pbWF0aW9uOwp9CgpqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CgoJdHdlZW5lcnM6IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApOwoJCQlhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTsKCQkJcmV0dXJuIHR3ZWVuOwoJCX0gXQoJfSwKCgl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewoJCWlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0KCX0sCgoJcHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCUFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CgkJfQoJfQp9ICk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJZHVyYXRpb246IHNwZWVkLAoJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCS8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZgoJaWYgKCBqUXVlcnkuZngub2ZmICkgewoJCW9wdC5kdXJhdGlvbiA9IDA7CgoJfSBlbHNlIHsKCQlpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09ICJudW1iZXIiICkgewoJCQlpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07CgoJCQl9IGVsc2UgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCQkJfQoJCX0KCX0KCgkvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCglpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKCQlvcHQucXVldWUgPSAiZngiOwoJfQoKCS8vIFF1ZXVlaW5nCglvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoKCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoKCQkvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CgkJCQl2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CgoJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CgkJCQlpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJgoJCQkJCSggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgewoKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuCgkJCS8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSApOwoJfSwKCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CgkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0cnVlOwoKCQkJLy8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7CgkJfSApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCggewoJc2xpZGVEb3duOiBnZW5GeCggInNob3ciICksCglzbGlkZVVwOiBnZW5GeCggImhpZGUiICksCglzbGlkZVRvZ2dsZTogZ2VuRngoICJ0b2dnbGUiICksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCWkgPSAwLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJZnhOb3cgPSBEYXRlLm5vdygpOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoKCQkvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWpRdWVyeS5meC5zdGFydCgpOwp9OwoKalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewoJaWYgKCBpblByb2dyZXNzICkgewoJCXJldHVybjsKCX0KCglpblByb2dyZXNzID0gdHJ1ZTsKCXNjaGVkdWxlKCk7Cn07CgpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgewoJaW5Qcm9ncmVzcyA9IG51bGw7Cn07CgpqUXVlcnkuZnguc3BlZWRzID0gewoJc2xvdzogNjAwLAoJZmFzdDogMjAwLAoKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKCQl2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CgkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsKCX0gKTsKfTsKCgooIGZ1bmN0aW9uKCkgewoJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAoJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCgkJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib3B0aW9uIiApICk7CgoJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5CgkvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSAib24iCglzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdAoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKCgkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHkKCS8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQudHlwZSA9ICJyYWRpbyI7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwp9ICkoKTsKCgp2YXIgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOwoJCX0KCgkJLy8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgoJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CgkJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTsKCgkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQlyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKCQkJCQlub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLAoJCQlpID0gMCwKCgkJCS8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKCQkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7CgoJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCXdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJfQoJCX0KCX0KfSApOwoKLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCXZhciByZXQsIGhhbmRsZSwKCQkJbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCgkJaWYgKCAhaXNYTUwgKSB7CgoJCQkvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCgkJCWhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTsKCQkJYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0OwoJCQlyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CgkJCQlsb3dlcmNhc2VOYW1lIDoKCQkJCW51bGw7CgkJCWF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gKTsKCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYKCQkJCSggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seQoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCgkJCQkvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKCgkJCQlpZiAoIHRhYmluZGV4ICkgewoJCQkJCXJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7CgkJCQl9CgoJCQkJaWYgKAoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CgkJCQkJcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYKCQkJCQllbGVtLmhyZWYKCQkJCSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCX0sCgoJcHJvcEZpeDogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNsYXNzIjogImNsYXNzTmFtZSIKCX0KfSApOwoKLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5Ci8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eQovLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCi8vIG9uIHRoZSBvcHRpb24KLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWQKLy8gd2hlbiBpbiBhbiBvcHRncm91cAovLyBlc2xpbnQgcnVsZSAibm8tdW51c2VkLWV4cHJlc3Npb25zIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlCi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcAppZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJLyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogIm9mZiIgKi8KCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJCWlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiAib2ZmIiAqLwoKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgpqUXVlcnkuZWFjaCggWwoJInRhYkluZGV4IiwKCSJyZWFkT25seSIsCgkibWF4TGVuZ3RoIiwKCSJjZWxsU3BhY2luZyIsCgkiY2VsbFBhZGRpbmciLAoJInJvd1NwYW4iLAoJImNvbFNwYW4iLAoJInVzZU1hcCIsCgkiZnJhbWVCb3JkZXIiLAoJImNvbnRlbnRFZGl0YWJsZSIKXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOwp9ICk7CgoKCgoJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlYwoJLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlCglmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHsKCQl2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTsKCQlyZXR1cm4gdG9rZW5zLmpvaW4oICIgIiApOwoJfQoKCmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgewoJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCAiY2xhc3MiICkgfHwgIiI7Cn0KCmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHsKCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CglpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107Cgl9CglyZXR1cm4gW107Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJY2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApOwoKCQlpZiAoIGNsYXNzZXMubGVuZ3RoICkgewoJCQl3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7CgkJCQljdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgewoJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgoJCQkJCWZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTsKCQkJCQlpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggImNsYXNzIiwgZmluYWxWYWx1ZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuYXR0ciggImNsYXNzIiwgIiIgKTsKCQl9CgoJCWNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJaWYgKCBjbGFzc2VzLmxlbmd0aCApIHsKCQkJd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgewoJCQkJY3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApOwoKCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgoJCQkJCQkvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPiAtMSApIHsKCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApOwoJCQkJCWlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7CgkJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09ICJzdHJpbmciIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7CgoJCWlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgaXNWYWxpZFZhbHVlICkgewoJCQlyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcygKCQkJCQl2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLAoJCQkJCXN0YXRlVmFsCgkJCQkpOwoJCQl9ICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJdmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lczsKCgkJCWlmICggaXNWYWxpZFZhbHVlICkgewoKCQkJCS8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCQlpID0gMDsKCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJCQl3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHsKCgkJCQkJLy8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQljbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApOwoJCQkJaWYgKCBjbGFzc05hbWUgKSB7CgoJCQkJCS8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlkYXRhUHJpdi5zZXQoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKCQkJCS8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCgkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAoJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgoJCQkJaWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHsKCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSggImNsYXNzIiwKCQkJCQkJY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CgkJCQkJCSIiIDoKCQkJCQkJZGF0YVByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIgoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSwgZWxlbSwKCQkJaSA9IDA7CgoJCWNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiOwoJCXdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCgkJCQkoICIgIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArICIgIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KfSApOwoKCgoKdmFyIHJyZXR1cm4gPSAvXHIvZzsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sCgkJCWVsZW0gPSB0aGlzWyAwIF07CgoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fAoJCQkJCWpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJgoJCQkJCSJnZXQiIGluIGhvb2tzICYmCgkJCQkJKCByZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSApICE9PSB1bmRlZmluZWQKCQkJCSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJcmV0ID0gZWxlbS52YWx1ZTsKCgkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCgkJCQlpZiAoIHR5cGVvZiByZXQgPT09ICJzdHJpbmciICkgewoJCQkJCXJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgIiIgKTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCXJldHVybiByZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQl2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewoJCQkJdmFsICs9ICIiOwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKCQkJCX0gKTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7CgkJCX0KCQl9ICk7Cgl9Cn0gKTsKCmpRdWVyeS5leHRlbmQoIHsKCXZhbEhvb2tzOiB7CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CgkJCQkJdmFsIDoKCgkJCQkJLy8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHkKCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCgkJCQkJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UKCQkJCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZQoJCQkJCXN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKCQkJfQoJCX0sCgkJc2VsZWN0OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgdmFsdWUsIG9wdGlvbiwgaSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsKCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlpID0gbWF4OwoKCQkJCX0gZWxzZSB7CgkJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAoJCQkJCQkJIW9wdGlvbi5kaXNhYmxlZCAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwKCQkJCQkJCQkhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxlbmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovCgoJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkID0KCQkJCQkJalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMQoJCQkJCSkgewoJCQkJCQlvcHRpb25TZXQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqLwoJCQkJfQoKCQkJCS8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CgkJCQlpZiAoICFvcHRpb25TZXQgKSB7CgkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9CgkJfQoJfQp9ICk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVlcnkuZWFjaCggWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7CgkJCX0KCQl9Cgl9OwoJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgewoJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwoJCX07Cgl9Cn0gKTsKCgoKCi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KCgpzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CgoKdmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAoJc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwgewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoKCQl2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCwKCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCgkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAoJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOwoKCQljdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewoKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggIi4iICk7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoICI6IiApIDwgMCAmJiAib24iICsgdHlwZTsKCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CgkJCWV2ZW50IDoKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwoKCQkvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCgkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKCQlldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID8KCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoKCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsKCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCQl9CgkJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKCQkJCXRtcCA9IGN1cjsKCQkJfQoKCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCgkJCWlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkgewoJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwoJCQl9CgkJfQoKCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCgkJaSA9IDA7CgkJd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbGFzdEVsZW1lbnQgPSBjdXI7CgkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CgkJCQlidWJibGVUeXBlIDoKCQkJCXNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKCgkJCS8vIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmCgkJCQlkYXRhUHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBOYXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgewoJCQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9CgkJfQoJCWV2ZW50LnR5cGUgPSB0eXBlOwoKCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCgkJCWlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAoJCQkJc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiYKCQkJCWFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJaWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKCgkJCQkJaWYgKCB0bXAgKSB7CgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQl9CgoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgoJCQkJCWlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQkJbGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTsKCQkJCQl9CgoJCQkJCWVsZW1bIHR5cGUgXSgpOwoKCQkJCQlpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCWxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7CgkJCQkJfQoKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoKCQkJCQlpZiAoIHRtcCApIHsKCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUKCS8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCglzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkgewoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVudCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlCgkJCX0KCQkpOwoKCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJfQoKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0gKTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIGVsZW0gPSB0aGlzWyAwIF07CgkJaWYgKCBlbGVtICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKCQl9Cgl9Cn0gKTsKCgovLyBTdXBwb3J0OiBGaXJlZm94IDw9NDQKLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50cwovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4NwovLwovLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjEKLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlcgovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1NwppZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7CglqUXVlcnkuZWFjaCggeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsKCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCQlkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7CgoJCQkJfSBlbHNlIHsKCQkJCQlkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOwoJCQkJfQoJCQl9CgkJfTsKCX0gKTsKfQp2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247Cgp2YXIgbm9uY2UgPSBEYXRlLm5vdygpOwoKdmFyIHJxdWVyeSA9ICggL1w/LyApOwoKCgovLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkgewoJdmFyIHhtbDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC4KCXRyeSB7CgkJeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7Cgl9IGNhdGNoICggZSApIHsKCQl4bWwgPSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKCX0KCXJldHVybiB4bWw7Cn07CgoKdmFyCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLAoJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwoKZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgewoJdmFyIG5hbWU7CgoJaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHsKCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCgkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CgkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CgoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcygKCQkJCQlwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKCQkJCQl2LAoJCQkJCXRyYWRpdGlvbmFsLAoJCQkJCWFkZAoJCQkJKTsKCQkJfQoJCX0gKTsKCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7CgoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlCgkJCXZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID8KCQkJCXZhbHVlT3JGdW5jdGlvbigpIDoKCQkJCXZhbHVlT3JGdW5jdGlvbjsKCgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsKCQkJCWVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQl9OwoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9ICk7CgoJfSBlbHNlIHsKCgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKCX0sCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0gKQoJCS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQl2YXIgdHlwZSA9IHRoaXMudHlwZTsKCgkJCS8vIFVzZSAuaXMoICI6ZGlzYWJsZWQiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTsKCQl9ICkKCQkubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJcmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQl9ICk7CgkJCX0KCgkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9ICkuZ2V0KCk7Cgl9Cn0gKTsKCgp2YXIKCXIyMCA9IC8lMjAvZywKCXJoYXNoID0gLyMuKiQvLAoJcmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCglybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKCXJwcm90b2NvbCA9IC9eXC9cLy8sCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKCgkvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW4KCW9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJb3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsCgkJCWkgPSAwLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdOwoKCQlpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJd2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkgewoKCQkJCS8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCgkJCQlpZiAoIGRhdGFUeXBlWyAwIF0gPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgIioiOwoJCQkJCSggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApOwoKCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKCQkJCX0gZWxzZSB7CgkJCQkJKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKCgl2YXIgaW5zcGVjdGVkID0ge30sCgkJc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7CgoJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CgkJdmFyIHNlbGVjdGVkOwoJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKCQkJdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkJaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYKCQkJCSFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9ICk7CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCglmb3IgKCBrZXkgaW4gc3JjICkgewoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgewoJCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCgkJY29udGVudHMgPSBzLmNvbnRlbnRzLAoJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCiAqLwpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7Cgl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKCQljb252ZXJ0ZXJzID0ge30sCgoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOwoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCgl3aGlsZSAoIGN1cnJlbnQgKSB7CgoJCWlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewoJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKCQl9CgoJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCgkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCQl9CgoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkJaWYgKCBjdXJyZW50ICkgewoKCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCQlpZiAoIGN1cnJlbnQgPT09ICIqIiApIHsKCgkJCQljdXJyZW50ID0gcHJldjsKCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7CgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CgoJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0CgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKCQkJCQkJCWlmICggY29udiApIHsKCgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzLnRocm93cyApIHsKCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJcmV0dXJuIHsKCQkJCQkJCQlzdGF0ZTogInBhcnNlcmVycm9yIiwKCQkJCQkJCQllcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudAoJCQkJCQkJfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQl0eXBlOiAiR0VUIiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLAoJCWdsb2JhbDogdHJ1ZSwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czogZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAvXGJ4bWxcYi8sCgkJCWh0bWw6IC9cYmh0bWwvLAoJCQlqc29uOiAvXGJqc29uXGIvCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKCQkJanNvbjogInJlc3BvbnNlSlNPTiIKCQl9LAoKCQkvLyBEYXRhIGNvbnZlcnRlcnMKCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0IjogU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogSlNPTi5wYXJzZSwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJdXJsOiB0cnVlLAoJCQljb250ZXh0OiB0cnVlCgkJfQoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJcmV0dXJuIHNldHRpbmdzID8KCgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKCgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIHRyYW5zcG9ydCwKCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KCQkJY2FjaGVVUkwsCgoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVXJsIGNsZWFudXAgdmFyCgkJCXVybEFuY2hvciwKCgkJCS8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbikKCQkJY29tcGxldGVkLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoKCQkJLy8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsCgkJCXVuY2FjaGVkLAoKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CgkJCQkJalF1ZXJ5LmV2ZW50LAoKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoKCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKCQkJcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAoKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID0KCQkJCQkJCXJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJCXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIGNvbXBsZXRlZCApIHsKCgkJCQkJCQkvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzCgkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CgkJCQkJfQoJCQkJCWRvbmUoIDAsIGZpbmFsVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCgkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgIiIgKQoJCQkucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKTsKCgkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CgkJcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAoJCXMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQl1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTUKCQkJLy8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCwKCQkJLy8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4LwoJCQl0cnkgewoJCQkJdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKCgkJCQkvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5CgkJCQkvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQoJCQkJdXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjsKCQkJCXMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyAiLy8iICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09CgkJCQkJdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiArIHVybEFuY2hvci5ob3N0OwoJCQl9IGNhdGNoICggZSApIHsKCgkJCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbiwKCQkJCS8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWQKCQkJCXMuY3Jvc3NEb21haW4gPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggY29tcGxldGVkICkgewoJCQlyZXR1cm4ganFYSFI7CgkJfQoKCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwoJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCgkJZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCgkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCgkJLy8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvbgoJCWNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrCgkJCXVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApOwoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgKSApIHsKCQkJCWNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgkJCQljYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsICIkMSIgKTsKCQkJCXVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7CgkJCX0KCgkJCS8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMikKCQkJcy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkOwoKCQkvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OCkKCQl9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJgoJCQkoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiApID09PSAwICkgewoJCQlzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCAiKyIgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAoJCQkiQWNjZXB0IiwKCQkJcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArCgkJCQkJKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CgkJCQlzLmFjY2VwdHNbICIqIiBdCgkJKTsKCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCgkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CgkJfQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYKCQkJKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHsKCgkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKCQl9CgoJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJY29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTsKCQlqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTsKCQlqcVhIUi5mYWlsKCBzLmVycm9yICk7CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCgkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50CgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CgkJCX0KCgkJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuIGpxWEhSOwoJCQl9CgoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJY29tcGxldGVkID0gZmFsc2U7CgkJCQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJLy8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9ucwoJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCgkJCQkvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHMKCQkJCWRvbmUoIC0xLCBlICk7CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb21wbGV0ZWQgPSB0cnVlOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImV0YWciICk7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaWYgbm8gY29udGVudAoJCQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7CgoJCQkJLy8gaWYgbm90IG1vZGlmaWVkCgkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKCQkJCX0gZWxzZSB7CgkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwoJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoKCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKCQkJCWlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOwoJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKCQkJCQkJc3RhdHVzID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0CgkJCWpxWEhSLnN0YXR1cyA9IHN0YXR1czsKCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKCgkJCS8vIFN1Y2Nlc3MvRXJyb3IKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKCQkJfSBlbHNlIHsKCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7CgkJCXN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBDb21wbGV0ZQoJCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CgoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCgkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKCQlpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKQoJCXJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCggewoJCQl1cmw6IHVybCwKCQkJdHlwZTogbWV0aG9kLAoJCQlkYXRhVHlwZTogdHlwZSwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2sKCQl9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTsKCX07Cn0gKTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KCB7CgkJdXJsOiB1cmwsCgoJCS8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KQoJCXR5cGU6ICJHRVQiLAoJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQljYWNoZTogdHJ1ZSwKCQlhc3luYzogZmFsc2UsCgkJZ2xvYmFsOiBmYWxzZSwKCQkidGhyb3dzIjogdHJ1ZQoJfSApOwp9OwoKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciB3cmFwOwoKCQlpZiAoIHRoaXNbIDAgXSApIHsKCQkJaWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCQlodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTsKCQkJfQoKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CgoJCQlpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOwoJCQl9CgoJCQl3cmFwLm1hcCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9ICkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7CgkJCX0gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSApOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApOwoJCX0gKTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCAiYm9keSIgKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCX0gKTsKCQlyZXR1cm4gdGhpczsKCX0KfSApOwoKCmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApOwp9OwpqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCXJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7Cn07CgoKCgpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoIGUgKSB7fQp9OwoKdmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7CgoJCS8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCgkJMDogMjAwLAoKCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCS8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCTEyMjM6IDIwNAoJfSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7CgpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwpzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKCmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHsKCXZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKCgkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CglpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoJCQkJdmFyIGksCgkJCQkJeGhyID0gb3B0aW9ucy54aHIoKTsKCgkJCQl4aHIub3BlbigKCQkJCQlvcHRpb25zLnR5cGUsCgkJCQkJb3B0aW9ucy51cmwsCgkJCQkJb3B0aW9ucy5hc3luYywKCQkJCQlvcHRpb25zLnVzZXJuYW1lLAoJCQkJCW9wdGlvbnMucGFzc3dvcmQKCQkJCSk7CgoJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKCQkJCQlmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgewoJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOwoJCQkJfQoKCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCgkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdICkgewoJCQkJCWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCX0KCgkJCQkvLyBTZXQgaGVhZGVycwoJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCX0KCgkJCQkvLyBDYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQljYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID0KCQkJCQkJCQl4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsKCQkJCQkJCQl4aHIuYWJvcnQoKTsKCQkJCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJCQkJLy8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzCgkJCQkJCQkJLy8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZQoJCQkJCQkJCWlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgewoJCQkJCQkJCQljb21wbGV0ZSggMCwgImVycm9yIiApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWNvbXBsZXRlKAoKCQkJCQkJCQkJCS8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CgkJCQkJCQkJCQl4aHIuc3RhdHVzLAoJCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKCQkJCQkJCQkJKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWNvbXBsZXRlKAoJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCQkJCQkJCQkvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpCgkJCQkJCQkJCS8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpCgkJCQkJCQkJCSggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRleHQiICB8fAoJCQkJCQkJCQl0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gInN0cmluZyIgPwoJCQkJCQkJCQkJeyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDoKCQkJCQkJCQkJCXsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAoJCQkJCQkJCQl4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX07CgoJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cwoJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CgkJCQllcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soICJlcnJvciIgKTsKCgkJCQkvLyBTdXBwb3J0OiBJRSA5IG9ubHkKCQkJCS8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CgkJCQkvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzCgkJCQlpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJeGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrOwoJCQkJfSBlbHNlIHsKCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgoJCQkJCQkvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXMKCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCgkJCQkJCQkvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCwKCQkJCQkJCS8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydAoJCQkJCQkJLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKCQkJCQkJCS8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZAoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQkJCWVycm9yQ2FsbGJhY2soKTsKCQkJCQkJCQl9CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoKCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIgKTsKCgkJCQl0cnkgewoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pCgkJCQkJeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwoJCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJdGhyb3cgZTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9ICk7CgoKCgovLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKQpqUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTsKCX0KfSApOwoKLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCggewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgIiArCgkJCSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSApOwoKLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpbgpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJfQp9ICk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJdmFyIHNjcmlwdCwgY2FsbGJhY2s7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewoJCQkJc2NyaXB0ID0galF1ZXJ5KCAiPHNjcmlwdD4iICkucHJvcCggewoJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKCQkJCQlzcmM6IHMudXJsCgkJCQl9ICkub24oCgkJCQkJImxvYWQgZXJyb3IiLAoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKCQkJCQkJc2NyaXB0LnJlbW92ZSgpOwoJCQkJCQljYWxsYmFjayA9IG51bGw7CgkJCQkJCWlmICggZXZ0ICkgewoJCQkJCQkJY29tcGxldGUoIGV2dC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwLCBldnQudHlwZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJKTsKCgkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CgkJCX0sCgkJCWFib3J0OiBmdW5jdGlvbigpIHsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0KCQkJfQoJCX07Cgl9Cn0gKTsKCgoKCnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoIHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwoJCXRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOwoJCXJldHVybiBjYWxsYmFjazsKCX0KfSApOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KCQkJInVybCIgOgoJCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJgoJCQkJKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkKCQkJCQkuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgoJCQkJcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgoJCSk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KCQkJcy5qc29ucENhbGxiYWNrKCkgOgoJCQlzLmpzb25wQ2FsbGJhY2s7CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIGpzb25Qcm9wICkgewoJCQlzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBGb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7CgoJCQkvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXQKCQkJaWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkgewoJCQkJalF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKCgkJCS8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCgkJCX0gZWxzZSB7CgkJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgkJCX0KCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCgkJCWlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgewoJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoKCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDsKCQl9ICk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSApOwoKCgoKLy8gU3VwcG9ydDogU2FmYXJpIDggb25seQovLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50Ci8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLgovLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzcKc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkgewoJdmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICkuYm9keTsKCWJvZHkuaW5uZXJIVE1MID0gIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IjsKCXJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwp9ICkoKTsKCgovLyBBcmd1bWVudCAiZGF0YSIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sCi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwKLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnQKLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwpqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkgewoJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIFtdOwoJfQoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9CgoJdmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0czsKCglpZiAoICFjb250ZXh0ICkgewoKCQkvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKCQkvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbgoJCWlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICk7CgoJCQkvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnQKCQkJLy8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHMKCQkJLy8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSkKCQkJYmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggImJhc2UiICk7CgkJCWJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CgkJCWNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApOwoJCX0gZWxzZSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudDsKCQl9Cgl9CgoJcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7CglzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwoKCS8vIFNpbmdsZSB0YWcKCWlmICggcGFyc2VkICkgewoJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdOwoJfQoKCXBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwp9OwoKCi8qKgogKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCiAqLwpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7Cgl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAoJCXNlbGYgPSB0aGlzLAoJCW9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCglpZiAoIG9mZiA+IC0xICkgewoJCXNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoKCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCWNhbGxiYWNrID0gcGFyYW1zOwoJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJdHlwZSA9ICJQT1NUIjsKCX0KCgkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAoJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CgkJalF1ZXJ5LmFqYXgoIHsKCQkJdXJsOiB1cmwsCgoJCQkvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCgkJCS8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZQoJCQkvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2QKCQkJdHlwZTogdHlwZSB8fCAiR0VUIiwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CgoJCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKCQkJCS8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwoJCQkJalF1ZXJ5KCAiPGRpdj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQgKTsKCgkJLy8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyAiZGF0YSIsICJzdGF0dXMiLCAianFYSFIiCgkJLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLgoJCS8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgImpxWEhSIiwgInN0YXR1cyIsICJlcnJvciIKCQl9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJc2VsZi5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJCX0gKTsKCQl9ICk7Cgl9CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWwoJImFqYXhTdGFydCIsCgkiYWpheFN0b3AiLAoJImFqYXhDb21wbGV0ZSIsCgkiYWpheEVycm9yIiwKCSJhamF4U3VjY2VzcyIsCgkiYWpheFNlbmQiCl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cgl9Owp9ICk7CgoKCgpqUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKCX0gKS5sZW5ndGg7Cn07CgoKCgpqUXVlcnkub2Zmc2V0ID0gewoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOwoKCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlcgoJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7CgkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwoJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0OwoKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCgkJCS8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KQoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoKCQl9IGVsc2UgewoJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKCQl9Cgl9Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJLy8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luCglvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQkvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KCQkJCXRoaXMgOgoJCQkJdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSApOwoJCX0KCgkJdmFyIHJlY3QsIHdpbiwKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApCgkJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkJLy8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYQoJCS8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvcgoJCWlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJLy8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUgoJCXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsKCQlyZXR1cm4gewoJCQl0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LAoJCQlsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQKCQl9OwoJfSwKCgkvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveAoJLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1sgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYywKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJLy8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKCgkJCS8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3QKCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJfSBlbHNlIHsKCQkJb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCgkJCS8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50CgkJCS8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYKCQkJCSggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJgoJCQkJalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlOwoJCQl9CgkJCWlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luCgkJCQlwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpOwoJCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUgKTsKCQkJfQoJCX0KCgkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwoJCXJldHVybiB7CgkJCXRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKCQl9OwoJfSwKCgkvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKCS8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KCS8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvdwoJLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAoJLy8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZgoJLy8KCS8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcwoJLy8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuCgkvLwoJLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OwoKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoKCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CgkJfSApOwoJfQp9ICk7CgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gInBhZ2VZT2Zmc2V0IiA9PT0gcHJvcDsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CgoJCQkvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3MKCQkJdmFyIHdpbjsKCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoJCQkJd2luID0gZWxlbTsKCQkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7CgkJCX0KCgkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCwKCQkJCQl0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXQKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApOwoJfTsKfSApOwoKLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OQovLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgovLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDcKLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUKalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCgkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCgkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7CgkJCX0KCQl9CgkpOwp9ICk7CgoKLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LAoJCWZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgewoKCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKCQkJCXZhciBkb2M7CgoJCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KQoJCQkJCXJldHVybiBmdW5jTmFtZS5pbmRleE9mKCAib3V0ZXIiICkgPT09IDAgPwoJCQkJCQllbGVtWyAiaW5uZXIiICsgbmFtZSBdIDoKCQkJCQkJZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAoJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoKCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApOwoJCX07Cgl9ICk7Cn0gKTsKCgpqUXVlcnkuZWFjaCggKCAiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIgKS5zcGxpdCggIiAiICksCglmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewoJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwoJfQp9ICk7CgoKCgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPwoJCQl0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6CgkJCXRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0KfSApOwoKLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55Ci8vIGFyZ3VtZW50cy4KLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKQovLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb24KalF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJdmFyIHRtcCwgYXJncywgcHJveHk7CgoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJdG1wID0gZm5bIGNvbnRleHQgXTsKCQljb250ZXh0ID0gZm47CgkJZm4gPSB0bXA7Cgl9CgoJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCglpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkgewoJCXJldHVybiB1bmRlZmluZWQ7Cgl9CgoJLy8gU2ltdWxhdGVkIGJpbmQKCWFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Cgl9OwoKCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJcmV0dXJuIHByb3h5Owp9OwoKalF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkgewoJaWYgKCBob2xkICkgewoJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCX0gZWxzZSB7CgkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7Cgl9Cn07CmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKalF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7CmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lOwpqUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93OwpqUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlOwpqUXVlcnkudHlwZSA9IHRvVHlwZTsKCmpRdWVyeS5ub3cgPSBEYXRlLm5vdzsKCmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkgewoKCS8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvCgkvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpCgkvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKQoJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CglyZXR1cm4gKCB0eXBlID09PSAibnVtYmVyIiB8fCB0eXBlID09PSAic3RyaW5nIiApICYmCgoJCS8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzICgiIikKCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQoJCS8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgoJCSFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTsKfTsKCgoKCi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgovLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAovLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQovLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoKLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhbgovLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQovLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCgppZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5OwoJfSApOwp9CgoKCgp2YXIKCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoKCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfJCA9IHdpbmRvdy4kOwoKalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cuJCA9IF8kOwoJfQoKCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CgkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Cgl9CgoJcmV0dXJuIGpRdWVyeTsKfTsKCi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1ECi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQppZiAoICFub0dsb2JhbCApIHsKCXdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKfQoKCgoKcmV0dXJuIGpRdWVyeTsKfSApOwo=" >
tail j=5412 line=
tail j=5413 line= </script>
tail j=5414 line=
tail j=5415 line=<!-- <script type="text/javascript" src="js/custom.js"></script> -->
tail j=5416 line=<!-- <script type="text/javascript" src="js/custom.js"></script> -->
tail j=5417 line=
tail j=5418 line=
tail j=5419 line= <script id="script_file" type="text/javascript">
tail j=5420 line= $(function() {
tail j=5421 line=// grab the file input and bind a change event onto it
tail j=5422 line= $('#file').bind("change", function() {
tail j=5423 line=// new html5 formdata object.
tail j=5424 line= var formData = new FormData();
tail j=5425 line=// for each entry, add to formdata to later access via $_FILES["file" + i]
tail j=5426 line= for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
tail j=5427 line= formData.append("file" + i, document.getElementById('file').files[i]);
tail j=5428 line= }
tail j=5429 line=
tail j=5430 line=//send formdata to server-side
tail j=5431 line= $.ajax({
tail j=5432 line=// url: "file-upload.php", // our php file
tail j=5433 line=// url: "ka1_fileupload.php", // our php file
tail j=5434 line=// nurl: "http://ka1/ka1.php?q=up", // our php file
tail j=5435 line=// url: "/kup.php", // our php file
tail j=5436 line=// url: "/ka1_up.php", // our php file
tail j=5437 line=// url: "/ka1.php?q=kup", // our php file
tail j=5438 line=// url: "/ko0.php?q=kup", // our php file
tail j=5439 line=// url: "/ko1.php?q=kup", // our php file
tail j=5440 line= url: "/ko2.php?q=kup", // our php file
tail j=5441 line=// bugs url: "10.0.0.112:/ka1.php?q=up", // our php file
tail j=5442 line= type: 'post',
tail j=5443 line= data: formData,
tail j=5444 line= dataType: 'html', // we return html from our php file
tail j=5445 line= async: true,
tail j=5446 line= processData: false, // tell jQuery not to process the data
tail j=5447 line= contentType: false, // tell jQuery not to set contentType
tail j=5448 line= success : function(data) {
tail j=5449 line= $('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
tail j=5450 line= $('#upload-result .alert').append(data);
tail j=5451 line= },
tail j=5452 line= error : function(request) {
tail j=5453 line= console.log(request.responseText);
tail j=5454 line= }
tail j=5455 line= });
tail j=5456 line= });
tail j=5457 line= });
tail j=5458 line= </script id="script_file" >
tail j=5459 line=
tail j=5460 line= <hr color=white>
tail j=5461 line= <hr color=black>
tail j=5462 line= <div id='editableDiv' contenteditable='true'>paste
tail j=5463 line= </div id="editableDiv" >
tail j=5464 line= <hr color=black>
tail j=5465 line= <hr color=white>
tail j=5466 line= <hr color=black>
tail j=5467 line= <div id="div_ffpaste" contenteditable='true'>ffpaste
tail j=5468 line= </div id="div_ffpaste">
tail j=5469 line= <hr color=black>
tail j=5470 line= <hr color=white>
tail j=5471 line=
tail j=5472 line= <script id="script_clipboard" >
tail j=5473 line= function handlePaste (e) {
tail j=5474 line= var clipboardData, pastedData;
tail j=5475 line=
tail j=5476 line=// Stop data actually being pasted into div
tail j=5477 line= e.stopPropagation();
tail j=5478 line= e.preventDefault();
tail j=5479 line=
tail j=5480 line=// Get pasted data via clipboard API
tail j=5481 line= clipboardData = e.clipboardData || window.clipboardData;
tail j=5482 line= pastedData = clipboardData.getData('Text');
tail j=5483 line=
tail j=5484 line=// Do whatever with pasteddata
tail j=5485 line= alert(pastedData);
tail j=5486 line= }
tail j=5487 line=
tail j=5488 line= document.getElementById('editableDiv').addEventListener('paste', handlePaste);
tail j=5489 line= </script id="script_clipboard" >
tail j=5490 line=
tail j=5491 line=
tail j=5492 line= <script id="script_clipboard_ff" >
tail j=5493 line= function handlepaste_ff (e) {
tail j=5494 line= var types, pastedData, savedContent;
tail j=5495 line=
tail j=5496 line=// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
tail j=5497 line= if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {
tail j=5498 line=
tail j=5499 line=// Check for 'text/html' in types list. See abligh's answer below for deatils on
tail j=5500 line=// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
tail j=5501 line=// Safari/Edge don't advertise HTML data even if it is available
tail j=5502 line= types = e.clipboardData.types;
tail j=5503 line= if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {
tail j=5504 line=
tail j=5505 line=// Extract data and pass it to callback
tail j=5506 line= pastedData = e.clipboardData.getData('text/html');
tail j=5507 line=// processPaste(editableDiv, pastedData);
tail j=5508 line= processPaste_ff(editableDiv, pastedData);
tail j=5509 line=
tail j=5510 line=// Stop the data from actually being pasted
tail j=5511 line= e.stopPropagation();
tail j=5512 line= e.preventDefault();
tail j=5513 line= return false;
tail j=5514 line= }
tail j=5515 line= }
tail j=5516 line=
tail j=5517 line=// Everything else: Move existing element contents to a DocumentFragment for safekeeping
tail j=5518 line= savedContent = document.createDocumentFragment();
tail j=5519 line= while(editableDiv.childNodes.length > 0) {
tail j=5520 line= savedContent.appendChild(editableDiv.childNodes[0]);
tail j=5521 line= }
tail j=5522 line=
tail j=5523 line=// Then wait for browser to paste content into it and cleanup
tail j=5524 line= waitForPastedData(editableDiv, savedContent);
tail j=5525 line= return true;
tail j=5526 line= }
tail j=5527 line=
tail j=5528 line= function waitForPastedData (elem, savedContent) {
tail j=5529 line=
tail j=5530 line=// If data has been processes by browser, process it
tail j=5531 line= if (elem.childNodes && elem.childNodes.length > 0) {
tail j=5532 line=
tail j=5533 line=// Retrieve pasted content via innerHTML
tail j=5534 line=// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
tail j=5535 line= var pastedData = elem.innerHTML;
tail j=5536 line=
tail j=5537 line=// Restore saved content
tail j=5538 line= elem.innerHTML = "";
tail j=5539 line= elem.appendChild(savedContent);
tail j=5540 line=
tail j=5541 line=// Call callback
tail j=5542 line= processPaste_ff(elem, pastedData);
tail j=5543 line= }
tail j=5544 line=
tail j=5545 line=// Else wait 20ms and try again
tail j=5546 line= else {
tail j=5547 line= setTimeout(function () {
tail j=5548 line= waitForPastedData(elem, savedContent)
tail j=5549 line= }, 20);
tail j=5550 line= }
tail j=5551 line= }
tail j=5552 line=
tail j=5553 line= function processPaste_ff (elem, pastedData) {
tail j=5554 line=// Do whatever with gathered data;
tail j=5555 line= alert(pastedData);
tail j=5556 line= elem.focus();
tail j=5557 line= }
tail j=5558 line=
tail j=5559 line=// Modern browsers. Note: 3rd argument is required for Firefox <= 6
tail j=5560 line= if (editableDiv.addEventListener) {
tail j=5561 line= editableDiv.addEventListener('paste', handlepaste, false);
tail j=5562 line= }
tail j=5563 line=// IE <= 8
tail j=5564 line= else {
tail j=5565 line= editableDiv.attachEvent('onpaste', handlepaste);
tail j=5566 line= }
tail j=5567 line=
tail j=5568 line= $(document).on('paste','[contenteditable]',function(e) {
tail j=5569 line= e.preventDefault();
tail j=5570 line= var text = (e.originalEvent || e).clipboardData.getData('text/plain');
tail j=5571 line= window.document.execCommand('insertText', false, text);
tail j=5572 line= });
tail j=5573 line= </script id="script_clipboard_ff" >
tail j=5574 line=
tail j=5575 line= <script id="script_clipboard_jskit" >
tail j=5576 line= function getSelectionText(){
tail j=5577 line= var selectedText = ""
tail j=5578 line= if (window.getSelection){ // all modern browsers and IE9+
tail j=5579 line= selectedText = window.getSelection().toString()
tail j=5580 line= }
tail j=5581 line= return selectedText
tail j=5582 line= }
tail j=5583 line=
tail j=5584 line=
tail j=5585 line= document.addEventListener('mouseup', function(){
tail j=5586 line= var thetext = getSelectionText()
tail j=5587 line= if (thetext.length > 0){ // check there's some text selected
tail j=5588 line= console.log(thetext) // logs whatever textual content the user has selected on the page
tail j=5589 line= }
tail j=5590 line= }, false)
tail j=5591 line=
tail j=5592 line= function copySelectionText(){
tail j=5593 line= var copysuccess // var to check whether execCommand successfully executed
tail j=5594 line= try{
tail j=5595 line= copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
tail j=5596 line= }
tail j=5597 line= catch(e){
tail j=5598 line= copysuccess = false
tail j=5599 line= }
tail j=5600 line= return copysuccess
tail j=5601 line= }
tail j=5602 line=
tail j=5603 line= </script id="script_clipboard_jskit" >
tail j=5604 line=
tail j=5605 line=<!--
tail j=5606 line= <div name="div_dd" id="div_dd" hidden>
tail j=5607 line= <div id="drop">
tail j=5608 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=5609 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=5610 line= <img height=200 width=300
tail j=5611 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=5612 line= </a>
tail j=5613 line= </div>
tail j=5614 line=
tail j=5615 line= <div id="drag"> jtfdc:<br />
tail j=5616 line= <img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=5617 line=
tail j=5618 line= <div class="drg"><h1>konet llc </h1>
tail j=5619 line= <pre>timejask jkwii</pre>
tail j=5620 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=5621 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=5622 line= <pre>timesak skwii</pre>
tail j=5623 line= </div>
tail j=5624 line=
tail j=5625 line= <div class="drg"><h1>jtf29 </h1>
tail j=5626 line= <a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=5627 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=5628 line= </a>
tail j=5629 line= </div>
tail j=5630 line=
tail j=5631 line=
tail j=5632 line= <div class="drg"><h1>dogheads</h1>
tail j=5633 line= <div id="div_jtf_vid5">
tail j=5634 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=5635 line= <source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5636 line= </video>
tail j=5637 line= </div>
tail j=5638 line= </div>
tail j=5639 line=
tail j=5640 line= <div class="drg"><h1>jtfdc night court lights action 3720</h1>
tail j=5641 line= <div id="div_vid">
tail j=5642 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=5643 line= <source src="index_avril.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5644 line= <source src="index_avril.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=5645 line= </video>
tail j=5646 line= </div>
tail j=5647 line= </div>
tail j=5648 line= </div>
tail j=5649 line= </div>
tail j=5650 line= -->
tail j=5651 line=
tail j=5652 line= <script id="script_ytlist_load" >
tail j=5653 line= function ytlist_load() {
tail j=5654 line= j=0;;
tail j=5655 line=
tail j=5656 line= ytlist[j++] = 'ko0|ko0|ko0.us|';
tail j=5657 line= ytlist[j++] = 'ko2|ko2|ko2.us|';
tail j=5658 line= ytlist[j++] = '|duckduck_go|https://duckduckgo.com/';
tail j=5659 line= ytlist[j++] = '|jpl_curiosity|https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2287';
tail j=5660 line= ytlist[j++] = '|jpl_insight|https://mars.nasa.gov/insight/';
tail j=5661 line= ytlist[j++] = '|jpl_bennu|http://pluto.jhuapl.edu/';
tail j=5662 line= ytlist[j++] = '|jpl_osirisrex_thule|https://www.asteroidmission.org/';
tail j=5663 line= ytlist[j++] = '|whatsitmean|http://whatdoesitmean.com/|';
tail j=5664 line= ytlist[j++] = '|dailymail|https://www.dailymail.co.uk/ushome/index.html';
tail j=5665 line= ytlist[j++] = '|zerohedge|http://zerohedge.com/';
tail j=5666 line= ytlist[j++] = 'bluehost|http://bluehost.com/track/konet/ko2.us|';
tail j=5667 line= ytlist[j++] = '|webb|webb_george|https://www.youtube.com/results?search_query=webb_george';
tail j=5668 line= ytlist[j++] = '|preppy|preppy_kitty|https://www.youtube.com/results?search_query=prepper+kitty';
tail j=5669 line= ytlist[j++] = '|quinn|quinn_micheals||https://www.youtube.com/user/quinnmichaels';
tail j=5670 line= ytlist[j++] = '|kennedy|kennedy|https://www.youtube.com/channel/UCl609oqTRx-zBZ4vPfN2mqA';
tail j=5671 line= ytlist[j++] = '|stropyme|stroppy_me|https://www.youtube.com/results?search_query=stroppy+me|';
tail j=5672 line= ytlist[j++] = '|outerlite|outer_light|https://www.youtube.com/results?search_query=outer+light|';
tail j=5673 line= ytlist[j++] = '|munder|munder|https://www.youtube.com/user/1Munder1|';
tail j=5674 line= ytlist[j++] = '|dahboo77|dahboo77|https://www.youtube.com/results?search_query=dahboo77';
tail j=5675 line= ytlist[j++] = '|secureteam|secureteam10|https://www.youtube.com/results?search_query=secureteam10';
tail j=5676 line= ytlist[j++] = '|vlad96|vlad9t|https://www.youtube.com/results?search_query=vlad9t';
tail j=5677 line= ytlist[j++] = '|newearth|newearth|https://www.youtube.com/results?search_query=new+earth';
tail j=5678 line= ytlist[j++] = '|forester|forester_brian|https://www.youtube.com/results?search_query=brian+forrester';
tail j=5679 line= ytlist[j++] = '|hoagland|hoagland|https://www.youtube.com/results?search_query=hoagland+richard';
tail j=5680 line= ytlist[j++] = '|levenda||levenda|https://www.youtube.com/results?search_query=levenda+peter|';
tail j=5681 line= ytlist[j++] = 'borealus|borealus_forum|https://www.youtube.com/results?search_query=borealis+forum';
tail j=5682 line= ytlist[j++] = '|earthfiles|howe_linda_moultan|https://www.youtube.com/results?search_query=howe+linda';
tail j=5683 line= ytlist[j++] = '|newsbud|https://www.youtube.com/results?search_query=newsbud|';
tail j=5684 line= ytlist[j++] = '|lional|lional_nation|https://www.youtube.com/results?search_query=lionel+nation|';
tail j=5685 line= ytlist[j++] = '|gooman|jason_goodman|https://www.youtube.com/channel/UC8Cl9QaRtuW9CNjP7pP4BBQ|';
tail j=5686 line= ytlist[j++] = '|cernovich|cernovich|https://www.youtube.com/results?search_query=cernovich|';
tail j=5687 line= ytlist[j++] = '|conte|conte_marcus|https://www.youtube.com/results?search_query=conte+marcus|';
tail j=5688 line= ytlist[j++] = '|fulford|fulford_benjamin|https://www.youtube.com/results?search_query=fulford+benjamin';
tail j=5689 line= ytlist[j++] = '||Julijana Sarac I Put A Spell On You|https://www.youtube.com/watch?v=jGhA2_ZcRVY&list=RDjGhA2_ZcRVY&start_radio=1';
tail j=5690 line=
tail j=5691 line= ytlist[j++] = 'redding|dreams_to_remeber|pn://www.youtube.com/watch?v=8UOf6kngJGw&list=RD8UOf6kngJGw&start_radio=1';
tail j=5692 line=
tail j=5693 line= ytlist[j++] = '|haggard|A place to fall apart Merle Haggard Janie Fricke|https://www.youtube.com/watch?v=iXPdB1ykWHE&list=RDiXPdB1ykWHE&start_radio=1|';
tail j=5694 line=
tail j=5695 line= ytlist[j++] = '|dreamers|Freddie & The Dreamers ~ I Understand/Auld Lang Syne|http://www.youtube.com/watch?v=Hy0AGS13dqc';
tail j=5696 line=
tail j=5697 line= ytlist[j++] = '|dreamers|telln_you_now_dreamers|https://www.youtube.com/watch?v=Qu3Yk_0oRy0&start_radio=1&list=RDQu3Yk_0oRy0';
tail j=5698 line=
tail j=5699 line= ytlist[j++] = '|drezmers|hog4u|https://www.youtube.com/watch?v=911rMO4l0sA';
tail j=5700 line=
tail j=5701 line= ytlist[j++] = '|cher|sony_cher-gotubabe|https://www.youtube.com/watch?v=Vp2Du8j2_L0';
tail j=5702 line=
tail j=5703 line= ytlist[j++] = '|remR|Everybody Hurts (Live at Glastonbury 2003) HQ|http://www.youtube.com/watch?v=NLlOeGeVih4';
tail j=5704 line=
tail j=5705 line= ytlist[j++] = '|once|once_upontime_west|https://www.youtube.com/watch?v=kOy6M_X2MO8';
tail j=5706 line=
tail j=5707 line= ytlist[j++] = '|pale|procol_harme_litershade_denmark|https://www.youtube.com/watch?v=St6jyEFe5WM';
tail j=5708 line=
tail j=5709 line= ytlist[j++] = '|pale|Procol Harum Whiter Shade of Pale 2verses|http://www.youtube.com/watch?v=vIWCSrG1d-Y';
tail j=5710 line=
tail j=5711 line= ytlist[j++] = 'deadsouth| - In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY|';
tail j=5712 line= ytlist[j++] = '|pale|shadofpale_ships|https://www.youtube.com/watch?v=PYBqv3NIqho';
tail j=5713 line=
tail j=5714 line= ytlist[j++] = '|caro| nightlikethis|https://www.youtube.com/watch?v=Fc6izYdLhNE';
tail j=5715 line=
tail j=5716 line= ytlist[j++] = '|waits|time_cover_guitar|http://www.youtube.com/watch?v=uja4SHnfogo';
tail j=5717 line=
tail j=5718 line= ytlist[j++] = 'morrison|4seasons_back_on_top|https://www.youtube.com/watch?v=7fjTY_ABMj0&list=PL5A2209DE63BA79B8';
tail j=5719 line=
tail j=5720 line= ytlist[j++] = 'gurumal|delta_Delta Bayini|https://www.youtube.com/watch?v=oi6zbPjtO6I';
tail j=5721 line=
tail j=5722 line= ytlist[j++] = '|cohen|youb_you_got_me_singin|https://www.youtube.com/watch?v=3sFsT9vT6Fo';
tail j=5723 line=
tail j=5724 line= ytlist[j++] = 'dreamers|iunderst|https://www.youtube.com/watch?v=yo-1Des8i5M&list=PL9DF20D3DD3895F1C&index=4';
tail j=5725 line=
tail j=5726 line= ytlist[j++] = 'sledge|dark_end_of_the_street|https://www.youtube.com/watch?v=Gj3UdRmhgvM';
tail j=5727 line=
tail j=5728 line= ytlist[j++] = 'oesch|bavaria_yodl| https://www.youtube.com/watch?v=hVjNxV7qM90';
tail j=5729 line=
tail j=5730 line= ytlist[j++] = 'hagardlife_isgone2hellhttps://www.youtube.com/watch?v=iXPdB1ykWHE&start_radio=1&list=RDMMiXPdB1ykWHE';
tail j=5731 line=
tail j=5732 line= ytlist[j++] = 'claypton|xmas| https://www.youtube.com/watch?v=R7iKUCWTNWc&list=RDR7iKUCWTNWc&start_radio=1';
tail j=5733 line=
tail j=5734 line= ytlist[j++] = 'Guadalupe Pineda|Historia De Un Amor|https://www.youtube.com/watch?v=HzjE33U_gy8';
tail j=5735 line=
tail j=5736 line= ytlist[j++] = 'deadsouth|In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY';
tail j=5737 line=
tail j=5738 line= ytlist[j++] = 'morisson|4seasons|https://www.youtube.com/watch?v=zbxUXAMUeGk&list=PLFCFB9B1A93E89756&index=10';
tail j=5739 line=
tail j=5740 line= ytlist[j++] = 'morisan|playhousedown|https://www.youtube.com/watch?v=b0jqe40gmH4&list=PLFCFB9B1A93E89756&index=5';
tail j=5741 line=
tail j=5742 line= ytlist[j++] = '|van_morison|end_ofthe_land|https://www.youtube.com/watch?v=dui7_N0g_VY&index=6&list=PLFCFB9B1A93E89756';
tail j=5743 line=
tail j=5744 line= ytlist[j++] = '|vanloss|stariway|https://www.youtube.com/watch?v=gCE0MapWKJ8&index=7&list=PLFCFB9B1A93E89756';
tail j=5745 line=
tail j=5746 line= ytlist[j++] = 'fureys|last lovesong| https://www.youtube.com/watch?v=yNFiD1ZQZLU';
tail j=5747 line=
tail j=5748 line= ytlist[j++] = '|rush|cirlce_game|https://www.youtube.com/watch?v=q_C_rOOdXxs';
tail j=5749 line=
tail j=5750 line= ytlist[j++] = '|rush|circlgam2|https://www.youtube.com/watch?v=9yN-6PbqAPM';
tail j=5751 line=
tail j=5752 line= ytlist[j++] = 'rush|remberbergame| https://www.youtube.com/watch?v=xMFtm02rgF0';
tail j=5753 line=
tail j=5754 line= ytlist[j++] = 'lucinda_williams|broken_butterflies|https://www.youtube.com/watch?v=gLQ23LLtKJk';
tail j=5755 line=
tail j=5756 line=
tail j=5757 line= ytlist[j++] = 'kou|python|https://www.youtube.com/watch?v=rfscVS0vtbw';
tail j=5758 line=
tail j=5759 line= ytlist[j++] = 'kou|blender28|https://www.youtube.com/watch?v=jBqYTgaFDxU';
tail j=5760 line=
tail j=5761 line= ytlist[j++] = 'kou|html|https://www.youtube.com/watch?v=pQN-pnXPaVg';
tail j=5762 line=
tail j=5763 line= ytlist[j++] = 'kou|sqlite3|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5764 line=
tail j=5765 line=
tail j=5766 line= ytlist[j++] = 'kou|visual_studio|https://www.youtube.com/watch?v=fnPhJHN0jTE';
tail j=5767 line=
tail j=5768 line= ytlist[j++] = 'kou|visual_studio_py|https://www.youtube.com/watch?v=72Alzsz8RyI';
tail j=5769 line=
tail j=5770 line=
tail j=5771 line= ytlist[j++] = 'kou|php|https://www.youtube.com/watch?v=OK_JCtrrv-c';
tail j=5772 line=
tail j=5773 line= ytlist[j++] = 'kou|tensor|https://www.youtube.com/watch?v=tYYVSEHq-io';
tail j=5774 line=
tail j=5775 line= ytlist[j++] = 'kou|go|https://www.youtube.com/watch?v=5PTXdR8hLlQ';
tail j=5776 line=
tail j=5777 line= ytlist[j++] = 'kou|vi|https://www.youtube.com/watch?v=HMpB28l1sLc';
tail j=5778 line=
tail j=5779 line= ytlist[j++] = 'kou|tech_ingredients_speakers|https://www.youtube.com/watch?v=zdkyGDqU7xA';
tail j=5780 line=
tail j=5781 line= ytlist[j++] = 'kou|tech_ingredients_labshop|https://www.youtube.com/watch?v=nZefdoHmtJo';
tail j=5782 line=
tail j=5783 line= ytlist[j++] = 'kou|tech_ingredients_magnetics|https://www.youtube.com/watch?v=LS3GQk9ETRU';
tail j=5784 line=
tail j=5785 line= ytlist[j++] = 'kou|3dprint|https://www.youtube.com/watch?v=3LBTkLsjHGQ';
tail j=5786 line=
tail j=5787 line= ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5788 line=
tail j=5789 line= ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5790 line=
tail j=5791 line= alert( "BUGS_4715 ytlist len="+j );
tail j=5792 line= }
tail j=5793 line=
tail j=5794 line= </script id="script_ytlist_load" >
tail j=5795 line=
tail j=5796 line=
tail j=5797 line=<!---
tail j=5798 line= <script id="script_dragable" type="text/javascript">
tail j=5799 line=
tail j=5800 line= $(document).ready(function() {
tail j=5801 line=// sets the draggable
tail j=5802 line= $('#drag .drg').draggable({
tail j=5803 line= cursor: 'move', // sets the cursor apperance
tail j=5804 line= revert: 'valid'
tail j=5805 line= });
tail j=5806 line=
tail j=5807 line=
tail j=5808 line=// sets droppable
tail j=5809 line=// after the draggable is droped, hides it with a hide() effect
tail j=5810 line= $('#drop').droppable({
tail j=5811 line= drop: function(event, ui) {
tail j=5812 line= ui.draggable.hide(1000);
tail j=5813 line=
tail j=5814 line= }
tail j=5815 line= });
tail j=5816 line=
tail j=5817 line=// after the draggable is droped, hides it with a hide() effect
tail j=5818 line= $('#drop1').droppable({
tail j=5819 line= drop: function(event, ui) {
tail j=5820 line= ui.draggable.hide(1000);
tail j=5821 line= }
tail j=5822 line= });
tail j=5823 line=
tail j=5824 line= $('#drop2').droppable({
tail j=5825 line= drop: function(event, ui) {
tail j=5826 line=// after the draggable is droped, hides it with a hide() effect
tail j=5827 line= ui.draggable.hide(1000);
tail j=5828 line= }
tail j=5829 line= });
tail j=5830 line=
tail j=5831 line=// when the "#sw" element (inside the "#drop") is clicked
tail j=5832 line=// show the items with class "drg", contained in "#drag"
tail j=5833 line=// $('#drag .drg').slideDown(1000);
tail j=5834 line= $('#drop #sw').click(function(){
tail j=5835 line= var url = "https://ka6//ko_center/ko_center.php?q=jqui/dragdrop1/"
tail j=5836 line= $(location).attr('href',url);
tail j=5837 line= });
tail j=5838 line= });
tail j=5839 line= </script>
tail j=5840 line= -->
tail j=5841 line=<!--
tail j=5842 line=
tail j=5843 line= <style type="text/css">
tail j=5844 line= #drop {
tail j=5845 line= width:200px;
tail j=5846 line= height:150px;
tail j=5847 line= margin:3px auto;
tail j=5848 line= background:#eddaa8;
tail j=5849 line= font-size:16px;
tail j=5850 line= }
tail j=5851 line= #drop #sw { text-decoration:underline; cursor:pointer; }
tail j=5852 line= #drag {
tail j=5853 line=// width:450px;
tail j=5854 line=// height:180px;
tail j=5855 line= width:50px;
tail j=5856 line= height:50px;
tail j=5857 line=
tail j=5858 line= margin:12px auto;
tail j=5859 line= border:1px solid darkslategrey;
tail j=5860 line=// border:1px solid silver;
tail j=5861 line= font-size:16px;
tail j=5862 line= }
tail j=5863 line= #drag .drg { margin:10px 12px; }
tail j=5864 line= #drag div.drg {
tail j=5865 line= width:150px;
tail j=5866 line= height:50px;
tail j=5867 line= background:#07da08;
tail j=5868 line= border:2px solid lightblue;
tail j=5869 line= }
tail j=5870 line= </style>
tail j=5871 line= -->
tail j=5872 line=
tail j=5873 line=
tail j=5874 line=
tail j=5875 line=<!--
tail j=5876 line= <div name="div_dd" id="div_dd" hidden>
tail j=5877 line= <div id="drop">
tail j=5878 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=5879 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=5880 line= <img height=200 width=300
tail j=5881 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=5882 line= </a>
tail j=5883 line= </div>
tail j=5884 line= -->
tail j=5885 line=<!--
tail j=5886 line= <div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
tail j=5887 line= <img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=5888 line=
tail j=5889 line= <div class="drg"><h1>konet llc </h1>
tail j=5890 line= <pre>timejask jkwii</pre>
tail j=5891 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=5892 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=5893 line= <pre>timesak skwii</pre>
tail j=5894 line= </div>
tail j=5895 line=
tail j=5896 line= <div class="drg"><h1>jtf29 </h1>
tail j=5897 line= <a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=5898 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=5899 line= </a>
tail j=5900 line= </div>
tail j=5901 line=
tail j=5902 line=
tail j=5903 line= <div class="drg"><h1>dogheads</h1>
tail j=5904 line= <div id="div_jtf_vid5">
tail j=5905 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=5906 line= <source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5907 line= </video>
tail j=5908 line= </div>
tail j=5909 line= </div>
tail j=5910 line=
tail j=5911 line= <div class="drg"><h1>jtfdc night court lights action 3720</h1>
tail j=5912 line= <div id="div_vid">
tail j=5913 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=5914 line= <source src="index_avril.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5915 line= <source src="index_avril.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=5916 line= </video>
tail j=5917 line= </div>
tail j=5918 line= </div>
tail j=5919 line= </div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
tail j=5920 line= </div>
tail j=5921 line= -->
tail j=5922 line=
tail j=5923 line= <div id="myCanvas_jkwii" ></div>
tail j=5924 line=
tail j=5925 line=<!--
tail j=5926 line= <script id="script_js_bb_onload" type='text/javascript'>
tail j=5927 line= window.onload = function() {
tail j=5928 line=// startup();
tail j=5929 line= var myCanvas = document.getElementById('myCanvas_jkwii');
tail j=5930 line= var ctx = myCanvas.getContext('2d');
tail j=5931 line=
tail j=5932 line= myCanvas.width = window.innerWidth; myCanvas.height = window.innerHeight;
tail j=5933 line= myCanvas.width = window.innerWidth / 2; myCanvas.height = window.innerHeight / 2 ;
tail j=5934 line= ctx.fillStyle='black'
tail j=5935 line= ctx.fillStyle='white'
tail j=5936 line= ctx.fillStyle='blue'
tail j=5937 line= ctx.fillRect(0, 0, myCanvas.width, myCanvas.height);
tail j=5938 line= }
tail j=5939 line= </script id="script_js_bb_onload" >
tail j=5940 line=
tail j=5941 line= <script id="script_js_bb_mouse" >
tail j=5942 line=// Mouse Event Handlers
tail j=5943 line= if(myCanvas){
tail j=5944 line= var isDown = false;
tail j=5945 line= var canvasX, canvasY;
tail j=5946 line= ctx.lineWidth = 5;
tail j=5947 line=
tail j=5948 line=
tail j=5949 line= $(myCanvas)
tail j=5950 line= .mousedown(function(e){
tail j=5951 line= isDown = true;
tail j=5952 line= ctx.beginPath();
tail j=5953 line= canvasX = e.pageX - myCanvas.offsetLeft;
tail j=5954 line= canvasY = e.pageY - myCanvas.offsetTop;
tail j=5955 line= ctx.moveTo(canvasX, canvasY);
tail j=5956 line= })
tail j=5957 line= .mousemove(function(e){
tail j=5958 line= if(isDown !== false) {
tail j=5959 line= canvasX = e.pageX - myCanvas.offsetLeft;
tail j=5960 line= canvasY = e.pageY - myCanvas.offsetTop;
tail j=5961 line= ctx.lineTo(canvasX, canvasY);
tail j=5962 line=// ctx.strokeStyle = '#000';
tail j=5963 line= ctx.strokeStyle = '#fff';
tail j=5964 line=
tail j=5965 line= ctx.stroke();
tail j=5966 line= }
tail j=5967 line= })
tail j=5968 line= .mouseup(function(e){
tail j=5969 line= isDown = false;
tail j=5970 line= ctx.closePath();
tail j=5971 line= });
tail j=5972 line= }
tail j=5973 line=
tail j=5974 line=// Touch Events Handlers
tail j=5975 line= draw = {
tail j=5976 line= started: false,
tail j=5977 line= start: function(evt) {
tail j=5978 line=
tail j=5979 line= ctx.beginPath();
tail j=5980 line= ctx.moveTo(
tail j=5981 line= evt.touches[0].pageX,
tail j=5982 line= evt.touches[0].pageY
tail j=5983 line= );
tail j=5984 line=
tail j=5985 line= this.started = true;
tail j=5986 line=
tail j=5987 line= },
tail j=5988 line= move: function(evt) {
tail j=5989 line=
tail j=5990 line= if (this.started) {
tail j=5991 line= ctx.lineTo(
tail j=5992 line= evt.touches[0].pageX,
tail j=5993 line= evt.touches[0].pageY
tail j=5994 line= );
tail j=5995 line=
tail j=5996 line= ctx.strokeStyle = '#000';
tail j=5997 line= ctx.lineWidth = 5;
tail j=5998 line= ctx.stroke();
tail j=5999 line= }
tail j=6000 line=
tail j=6001 line= },
tail j=6002 line= end: function(evt) {
tail j=6003 line= this.started = false;
tail j=6004 line= }
tail j=6005 line= };
tail j=6006 line=
tail j=6007 line=// Touch Events
tail j=6008 line= myCanvas.addEventListener('touchstart', draw.start, false);
tail j=6009 line= myCanvas.addEventListener('touchend', draw.end, false);
tail j=6010 line= myCanvas.addEventListener('touchmove', draw.move, false);
tail j=6011 line=
tail j=6012 line=// Disable Page Move
tail j=6013 line= document.body.addEventListener('touchmove',function(evt){
tail j=6014 line= evt.preventDefault();
tail j=6015 line= },false);
tail j=6016 line= };
tail j=6017 line= </script id="script_js_bb_mouse" >
tail j=6018 line=
tail j=6019 line= <script id="script_js_bb">
tail j=6020 line=// var c5 = document.getElementById("c5");
tail j=6021 line=// var c5_context = c5.getContext("2d");
tail j=6022 line= var c5 = document.getElementById("myCanvas");
tail j=6023 line= var c5_context = c5.getContext("2d");
tail j=6024 line=
tail j=6025 line= var dragon = new Image();
tail j=6026 line= dragon.src = 'dragon.png';
tail j=6027 line= var img = new Image();
tail j=6028 line= img.src = 'dragon.png';
tail j=6029 line=
tail j=6030 line= function draw_img() {
tail j=6031 line= c5_context.drawImage(img, 100, 5);
tail j=6032 line= }
tail j=6033 line= </script id="script_js_bb">
tail j=6034 line=
tail j=6035 line=
tail j=6036 line= <script id=script_mycanvas_write >
tail j=6037 line=// mycanvas_write( context, x, y, font, fontsize, fillstyle, text );
tail j=6038 line= function mycanvas_write( ctx, x, y, font, fontsize, fillstyle, text ) {
tail j=6039 line=// ctx.font = 'italic bold 30px sans-serif';
tail j=6040 line= ctx.fillStyle = 'white';
tail j=6041 line= ctx.fillStyle = 'black';
tail j=6042 line= ctx.fillStyle = "'" + fillstyle + "'";
tail j=6043 line= ctx.fillStyle = fillstyle;
tail j=6044 line= ctx.font = 'italic bold 30px roman';
tail j=6045 line= ctx.font = 'italic bold 30px arial';
tail j=6046 line= ctx.font = 'italic bold 30px monospace';
tail j=6047 line= ctx.font = 'italic bold 30px cursive';
tail j=6048 line= ctx.font = 'italic bold 30px fantasy';
tail j=6049 line= ctx.font = 'italic bold 30px yokkmokkOT';
tail j=6050 line= ctx.font = 'bold 30px sans-serif';
tail j=6051 line=// ctx.font = 'italic bold ' + fontsize + " " + font;
tail j=6052 line= ctx.font = '' + fontsize + " " + font;
tail j=6053 line= ctx.textBaseline = 'bottom';
tail j=6054 line= ctx.fillText( text, x, y);
tail j=6055 line= }
tail j=6056 line=
tail j=6057 line= function mycanvas_write0( ctx0, text, fillstyle, x, y ) {
tail j=6058 line= ctx0.fillStyle = 'white';
tail j=6059 line= ctx0.fillStyle = fillstyle;
tail j=6060 line= ctx0.font = 'italic bold 30px yokkmokkOT';
tail j=6061 line= ctx0.textBaseline = 'bottom';
tail j=6062 line=// ctx0.fillText('timejak-0: jkwii', x, y);
tail j=6063 line= ctx0.fillText( text, x, y);
tail j=6064 line= }
tail j=6065 line= </script id=script_mycanvas_write >
tail j=6066 line= -->
tail j=6067 line=
tail j=6068 line= <img src="/imgs/btn/koeye.png" onclick="script_ajax()">
tail j=6069 line= <script id="script_ajax">
tail j=6070 line= php="index_ko.php";
tail j=6071 line= db3="index_ko.db3";
tail j=6072 line= sql="select * from list limit 5";
tail j=6073 line= script_ajax(php,db3,sql)
tail j=6074 line= function script_ajax(php, db3,sql) {
tail j=6075 line= alert( "BUGS_4895" )
tail j=6076 line= $("button").click(function(){
tail j=6077 line= $.post( php, {
tail j=6078 line= db3: db3,
tail j=6079 line= sql: "select * from list limit 10"
tail j=6080 line= },
tail j=6081 line= function(data, status){
tail j=6082 line= line = data.split("\n");
tail j=6083 line= htmout="";
tail j=6084 line= for( z=0; z<line.length; z++ ) {
tail j=6085 line= htmout += "<a href="+line+" target=_blank>";
tail j=6086 line= htmout += " <img src="+line+" border=0>";
tail j=6087 line= htmout += " </a>";
tail j=6088 line= }
tail j=6089 line= getelementbyID('div_ajaxdb");
tail j=6090 line=// alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
tail j=6091 line= document.write( htmout );
tail j=6092 line= });
tail j=6093 line= });
tail j=6094 line= }
tail j=6095 line= </script id="script_ajax">
tail j=6096 line=
tail j=6097 line= <script id="script_kolines">
tail j=6098 line= function kolines(color,count,position) {
tail j=6099 line= var htmout = "";
tail j=6100 line= img="/imgs/btn/kob.png";
tail j=6101 line= if( color=="w" ) { img="/imgs/btn/kow.png"; }
tail j=6102 line=// alert( "BUGS_kolines_beg color="+color+" count="+count+" img="+img );
tail j=6103 line=
tail j=6104 line= for( j=1; j<=count; j++ ) {
tail j=6105 line=// alert( "BUGS_kolines_loop color="+color+" count="+count+" img="+img );
tail j=6106 line= htmout += '<img class="drg" height=20 src="'+img+'">';
tail j=6107 line=// alert( "BUGS_kolines_loop j="+j+" color="+color+" count="+count+" htmout="+htmout );
tail j=6108 line= }
tail j=6109 line=
tail j=6110 line=// alert( "BUGS_kolines_end j="+j+" color="+color+" count="+count+" htmout="+htmout );
tail j=6111 line=// htmout += '<img src="/imgs/btn/kop34.png">';
tail j=6112 line=
tail j=6113 line= if( color == 'b' ) {
tail j=6114 line=// div_kolineb = document.getElementById('div_kolineb');
tail j=6115 line=// if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
tail j=6116 line=// if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
tail j=6117 line=// if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6118 line=// if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6119 line=// if( position == "ih" ) div_kolineb.innerHTML( htmout);
tail j=6120 line=
tail j=6121 line=`j if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6122 line= if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6123 line=// if( position == "ae" ) img_kolineb.insertAdjacentElement('afterend', htmout);
tail j=6124 line= }
tail j=6125 line= if( color == 'w' ) {
tail j=6126 line=// div_kolinew = document.getElementById('div_kolinew');
tail j=6127 line=// if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
tail j=6128 line=// if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
tail j=6129 line=// if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6130 line=// if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6131 line=// if( position == "ih" ) div_kolineb.innerHTML( htmout);
tail j=6132 line=
tail j=6133 line= img_kolinew = document.getElementById('img_kolinew' );
tail j=6134 line= if( position == "bb" ) img_kolineb.insertAdjacentHTML('beforebegin', htmout);
tail j=6135 line= if( position == "ab" ) img_kolineb.insertAdjacentHTML('afterbegin', htmout);
tail j=6136 line= if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
tail j=6137 line= if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
tail j=6138 line= }
tail j=6139 line= }
tail j=6140 line= </script id="script_kolines">
tail j=6141 line=
tail j=6142 line=
tail j=6143 line=
tail j=6144 line= <hr color=white>
tail j=6145 line= <hr color=black>
tail j=6146 line=
tail j=6147 line= <div id="drag" name="div_drag_2>
tail j=6148 line=<!--
tail j=6149 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
tail j=6150 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','ab' )" >
tail j=6151 line= <img src="/imgs/btn/kob.png" onclick="kolines('b','1','ih' )" >
tail j=6152 line= <img src="/imgs/btn/kop12.png" onclick="kolines('b','3','ae" )" >
tail j=6153 line= <img src="/imgs/btn/kop34.png" onclick="kolines('b','3','bb" )" >
tail j=6154 line= -->
tail j=6155 line=
tail j=6156 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','256','bb' )" >
tail j=6157 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','16','bb' )" >
tail j=6158 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','8','bb' )" >
tail j=6159 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','4','bb' )" >
tail j=6160 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','2','bb' )" >
tail j=6161 line= <img height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
tail j=6162 line= <img height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','ae' )" >
tail j=6163 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','2','ae' )" >
tail j=6164 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','4','ae' )" >
tail j=6165 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','8','ae' )" >
tail j=6166 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','16','ae' )" >
tail j=6167 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','256','ae' )" >
tail j=6168 line= </div id="drag" name="div_drag_2>
tail j=6169 line=
tail j=6170 line= <hr color=black>
tail j=6171 line= <div id="div_kolineb">
tail j=6172 line= <img id="img_kolineb" height=30 class="drg" src="/imgs/btn/kop12.png">
tail j=6173 line= </div id="div_kolineb">
tail j=6174 line= <div id="div_kolinew">
tail j=6175 line= <img id="img_kolinew" height=30 class="drg" src="/imgs/btn/kop34.png">
tail j=6176 line= </div id="div_kolinew">
tail j=6177 line= <hr color=white>
tail j=6178 line=
tail j=6179 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','2','bb' )" >
tail j=6180 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','4','bb' )" >
tail j=6181 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','8','bb' )" >
tail j=6182 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','16','bb' )" >
tail j=6183 line= <img height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','256','bb' )" >
tail j=6184 line=
tail j=6185 line= <img height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','bb' )" >
tail j=6186 line= <img height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','ae' )" >
tail j=6187 line=
tail j=6188 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','2','ae' )" >
tail j=6189 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','4','ae' )" >
tail j=6190 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','8','ae' )" >
tail j=6191 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','16','ae' )" >
tail j=6192 line= <img height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','256','ae' )" >
tail j=6193 line=<!--
tail j=6194 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','be' )" >
tail j=6195 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','ab' )" >
tail j=6196 line= <img src="/imgs/btn/kow.png" onclick="kolines('w','1','ih' )" >
tail j=6197 line= -->
tail j=6198 line= </div>
tail j=6199 line=<br><br><br><br>
tail j=6200 line=
tail j=6201 line= <hr color=black>
tail j=6202 line= <hr color=white>
tail j=6203 line=
tail j=6204 line= <div id="div_sllist" >
tail j=6205 line= <h3>div_sllist</h3>
tail j=6206 line= </div id="div_sllist" >
tail j=6207 line=
tail j=6208 line=
tail j=6209 line= <script id="script_bugs" >
tail j=6210 line= function script_bugs(bugid) {
tail j=6211 line= alert( "BUGS_5033 script_bugs="+bugid );
tail j=6212 line= }
tail j=6213 line= </script id="script_bugs" >
tail j=6214 line=
tail j=6215 line=
tail j=6216 line=<!--
tail j=6217 line= <img src="/imgs/btn/koeye_handhither.gif" onclick="script_bugs('')">
tail j=6218 line= <img src="/imgs/btn/koeyew.png" onclick="script_bugs('aaaaaaaaaaa' )" >
tail j=6219 line= <img src="/imgs/btn/koeyeb.png" onclick="script_bugs('bbbbbbbbbbbbb' )" >
tail j=6220 line= <img src="/imgs/btn/koeye.png" onclick="script_bugs('ccccccccccccc')" >
tail j=6221 line= <img src="/imgs/btn/koeyew.png" onclick="script_slist_show()" >
tail j=6222 line= -->
tail j=6223 line=
tail j=6224 line=
tail j=6225 line=
tail j=6226 line= <script id="script_sllist_load">
tail j=6227 line= function script_sllist_load() {
tail j=6228 line= alert( "BUGS_5107 script_sllist_load" );
tail j=6229 line= sllist = new Array();
tail j=6230 line= z = 0;
tail j=6231 line= sllist[z++] = 'sllist1';
tail j=6232 line= sllist[z++] = 'sllist2';
tail j=6233 line= sllist[z++] = 'sllist3';
tail j=6234 line= sllist[z++] = 'sllist4';
tail j=6235 line= sllist[z++] = 'sllist5';
tail j=6236 line= sllist[z++] = 'sllist6';
tail j=6237 line= sllist[z++] = 'sllist7';
tail j=6238 line= sllist[z++] = 'sllist8';
tail j=6239 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
tail j=6240 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
tail j=6241 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
tail j=6242 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
tail j=6245 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
tail j=6246 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
tail j=6247 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
tail j=6248 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
tail j=6249 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
tail j=6250 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
tail j=6251 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
tail j=6252 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
tail j=6253 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
tail j=6254 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
tail j=6255 line= sllist[z++] = '-rw-r--r--@ 1 konet staff 246402 Jun 9 2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
tail j=6256 line= sllist[z++] = '-rw-r--r-- 1 konet staff 208180 Apr 8 2015 kb/books/Atlas_1931/IMG_3851.JPG';
tail j=6257 line= sllist[z++] = '-rw-r--r-- 1 konet staff 208180 Apr 8 2015 kb/books/Atlas_1931/IMG_3851.JPG';
tail j=6258 line= sllist[z++] = '-rw-r--r-- 1 konet staff 180223 Apr 8 2015 kb/books/Atlas_1931/IMG_3852.JPG';
tail j=6259 line= sllist[z++] = '-rw-r--r-- 1 konet staff 170251 Apr 8 2015 kb/books/Atlas_1931/IMG_3853.JPG';
tail j=6260 line= sllist[z++] = '-rw-r--r-- 1 konet staff 157741 Apr 8 2015 kb/books/Atlas_1931/IMG_3854.JPG';
tail j=6261 line= sllist[z++] = '-rw-r--r-- 1 konet staff 231492 Apr 8 2015 kb/books/Atlas_1931/IMG_3855.JPG';
tail j=6262 line= sllist[z++] = '-rw-r--r-- 1 konet staff 225773 Apr 8 2015 kb/books/Atlas_1931/IMG_3856.JPG';
tail j=6263 line= sllist[z++] = '-rw-r--r-- 1 konet staff 285875 Apr 8 2015 kb/books/Atlas_1931/IMG_3857.JPG';
tail j=6264 line= sllist[z++] = '-rw-r--r-- 1 konet staff 303677 Apr 8 2015 kb/books/Atlas_1931/IMG_3858.JPG';
tail j=6265 line= sllist[z++] = '-rw-r--r-- 1 konet staff 286921 Apr 8 2015 kb/books/Atlas_1931/IMG_3859.JPG';
tail j=6266 line= sllist[z++] = '-rw-r--r-- 1 konet staff 327242 Apr 8 2015 kb/books/Atlas_1931/IMG_3860.JPG';
tail j=6267 line= sllist[z++] = '-rw-r--r-- 1 konet staff 305251 Apr 8 2015 kb/books/Atlas_1931/IMG_3861.JPG';
tail j=6268 line= sllist[z++] = '-rw-r--r-- 1 konet staff 275734 Apr 8 2015 kb/books/Atlas_1931/IMG_3862.JPG';
tail j=6269 line= sllist[z++] = '-rw-r--r-- 1 konet staff 306566 Apr 8 2015 kb/books/Atlas_1931/IMG_3863.JPG';
tail j=6270 line= sllist[z++] = '-rw-r--r-- 1 konet staff 295127 Apr 8 2015 kb/books/Atlas_1931/IMG_3864.JPG';
tail j=6271 line= sllist[z++] = '-rw-r--r-- 1 konet staff 346338 Apr 8 2015 kb/books/Atlas_1931/IMG_3865.JPG';
tail j=6272 line= sllist[z++] = '-rw-r--r-- 1 konet staff 307752 Apr 8 2015 kb/books/Atlas_1931/IMG_3866.JPG';
tail j=6273 line= sllist[z++] = '-rw-r--r-- 1 konet staff 268685 Apr 8 2015 kb/books/Atlas_1931/IMG_3867.JPG';
tail j=6274 line= sllist[z++] = '-rw-r--r-- 1 konet staff 276633 Apr 8 2015 kb/books/Atlas_1931/IMG_3868.JPG';
tail j=6275 line= sllist[z++] = '-rw-r--r-- 1 konet staff 278776 Apr 8 2015 kb/books/Atlas_1931/IMG_3869.JPG';
tail j=6276 line= sllist[z++] = '-rw-r--r-- 1 konet staff 312322 Apr 8 2015 kb/books/Atlas_1931/IMG_3870.JPG';
tail j=6277 line= sllist[z++] = '-rw-r--r-- 1 konet staff 293924 Apr 8 2015 kb/books/Atlas_1931/IMG_3871.JPG';
tail j=6278 line= sllist[z++] = '-rw-r--r-- 1 konet staff 314761 Apr 8 2015 kb/books/Atlas_1931/IMG_3872.JPG';
tail j=6279 line= sllist[z++] = '-rw-r--r-- 1 konet staff 319755 Apr 8 2015 kb/books/Atlas_1931/IMG_3873.JPG';
tail j=6280 line= sllist[z++] = '-rw-r--r-- 1 konet staff 260878 Apr 8 2015 kb/books/Atlas_1931/IMG_3874.JPG';
tail j=6281 line= sllist[z++] = '-rw-r--r-- 1 konet staff 282075 Apr 8 2015 kb/books/Atlas_1931/IMG_3875.JPG';
tail j=6282 line= sllist[z++] = '-rw-r--r-- 1 konet staff 347889 Apr 8 2015 kb/books/Atlas_1931/IMG_3876.JPG';
tail j=6283 line= sllist[z++] = '-rw-r--r-- 1 konet staff 187358 Mar 31 2015 kb/books/music/Theory/IMG_7247.JPG';
tail j=6284 line= sllist[z++] = '-rw-r--r-- 1 konet staff 233375 Mar 31 2015 kb/books/music/Theory/IMG_7248.JPG';
tail j=6285 line= sllist[z++] = '-rw-r--r-- 1 konet staff 216447 Mar 31 2015 kb/books/music/Theory/IMG_7249.JPG';
tail j=6286 line= sllist[z++] = '-rw-r--r-- 1 konet staff 216059 Mar 31 2015 kb/books/music/Theory/IMG_7250.JPG';
tail j=6287 line= sllist[z++] = '-rw-r--r-- 1 konet staff 222009 Mar 31 2015 kb/books/music/Theory/IMG_7251.JPG';
tail j=6288 line= sllist[z++] = '-rw-r--r-- 1 konet staff 213330 Mar 31 2015 kb/books/music/Theory/IMG_7252.JPG';
tail j=6289 line= sllist[z++] = '-rw-r--r-- 1 konet staff 199485 Mar 31 2015 kb/books/music/Theory/IMG_7253.JPG';
tail j=6290 line= sllist[z++] = '-rw-r--r-- 1 konet staff 239114 Mar 31 2015 kb/books/music/Theory/IMG_7254.JPG';
tail j=6291 line= sllist[z++] = '-rw-r--r-- 1 konet staff 162254 Mar 31 2015 kb/books/music/Theory/IMG_7255.JPG';
tail j=6292 line=// alert( "BUGS_10895 script_sllist_load len="+sllist.length );
tail j=6293 line= return( sllist );
tail j=6294 line= }
tail j=6295 line= </script id="script_sllist_load">
tail j=6296 line=
tail j=6297 line= <script id="script_pdflist_load">
tail j=6298 line= function script_pdflist_load() {
tail j=6299 line= pdflist = new Array();
tail j=6300 line= z = 0;
tail j=6301 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
tail j=6302 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
tail j=6303 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
tail j=6304 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
tail j=6307 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
tail j=6308 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
tail j=6309 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
tail j=6310 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
tail j=6311 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
tail j=6312 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
tail j=6313 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
tail j=6314 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
tail j=6315 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
tail j=6316 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
tail j=6317 line= pdflist[z++] = '-rw-r--r--@ 1 konet staff 246402 Jun 9 2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
tail j=6318 line=// alert( "BUGS_10925 script_pdflist_load len="+pdflist.length );
tail j=6319 line= return( pdflist );
tail j=6320 line= }
tail j=6321 line= </script id="script_pdflist_load">
tail j=6322 line=
tail j=6323 line=<!--
tail j=6324 line= <script id="script_startup2" >
tail j=6325 line= function startup2( url ) {
tail j=6326 line=// url="index.html";
tail j=6327 line= alert( "BUGS_10930_startup" );
tail j=6328 line= htmout="htmout";
tail j=6329 line= img="/imgs/btn/koeye.gif";
tail j=6330 line= imgurl="/imgs/btn/koeye_handhither.gif";
tail j=6331 line= if( urlexists(url)) { img=imgurl; }
tail j=6332 line=
tail j=6333 line= htmout += '<a href="'+url+'" target=_blank class="drag" id="drg">
tail j=6334 line= htmout += ' <img src="'+img+'" border=0>";
tail j=6335 line= htmout += ' <span><img src="'+img+'" border=0></span>';
tail j=6336 line= htmout += ' </a>';
tail j=6337 line= document.write( htmout );
tail j=6338 line= alert("BUGS_10934_startup isurl="+isurl(url) );
tail j=6339 line= }
tail j=6340 line= </script>
tail j=6341 line= -->
tail j=6342 line=
tail j=6343 line= <script id="script_isurl">
tail j=6344 line= function isurl(url) {
tail j=6345 line= $.get(url).done(function() {
tail j=6346 line= return("ok");
tail j=6347 line= }).fail(function() {
tail j=6348 line= return("ko");
tail j=6349 line= })
tail j=6350 line= }
tail j=6351 line= </script id="script_isurl">
tail j=6352 line=
tail j=6353 line= <script id="script_urlexists">
tail j=6354 line= function urlexists(url) {
tail j=6355 line= var http = new XMLHttpRequest();
tail j=6356 line= http.open('HEAD', url, false);
tail j=6357 line= http.send();
tail j=6358 line= return http.status!=404;
tail j=6359 line= }
tail j=6360 line= </script id="script_urlexists">
tail j=6361 line=
tail j=6362 line= <script id="script_mth2mm">
tail j=6363 line= function mth2mm(mth) {
tail j=6364 line= if( mth == "Jan" ) return("01");
tail j=6365 line= if( mth == "Feb" ) return("02");
tail j=6366 line= if( mth == "Mar" ) return("03");
tail j=6367 line= if( mth == "Apr" ) return("04");
tail j=6368 line= if( mth == "May" ) return("05");
tail j=6369 line= if( mth == "Jun" ) return("06");
tail j=6370 line= if( mth == "Jul" ) return("07");
tail j=6371 line= if( mth == "Aug" ) return("08");
tail j=6372 line= if( mth == "Sep" ) return("09");
tail j=6373 line= if( mth == "Oct" ) return("10");
tail j=6374 line= if( mth == "Nov" ) return("11");
tail j=6375 line= if( mth == "Dec" ) return("12");
tail j=6376 line= return( "00" );
tail j=6377 line= }
tail j=6378 line= </script id="script_mth2mm">
tail j=6379 line=
tail j=6380 line= <script id="script_unique">
tail j=6381 line= function unique() {
tail j=6382 line= alert( "BUGS_11334 unique" );
tail j=6383 line= }
tail j=6384 line= function uniquelist(list) {
tail j=6385 line= alert( "BUGS_11336 uniquelist" );
tail j=6386 line= for (i = 0; i<list.length; i++) {
tail j=6387 line= for (j=i+1; j<list.length; j++) {
tail j=6388 line= if (list[i] == list[j]) {
tail j=6389 line= list.splice(j, 1);
tail j=6390 line= j--;
tail j=6391 line= }
tail j=6392 line= }
tail j=6393 line= }
tail j=6394 line= }
tail j=6395 line= </script id="script_unique">
tail j=6396 line=
tail j=6397 line= <script id="script_file2array" >
tail j=6398 line= script_file2array(url) {
tail j=6399 line= if( urlexists(url) ) {
tail j=6400 line= alert( BUGS_11350 FOUND urlexists="+url );
tail j=6401 line= }
tail j=6402 line= else {
tail j=6403 line= alert( BUGS_11351 NOTFOUND urlexists="+url );
tail j=6404 line= }
tail j=6405 line=// $.ajax({
tail j=6406 line=//// url: "/kb/csv/sl.csv",
tail j=6407 line=//// url: "/kb/csv/sl.csv",
tail j=6408 line=//// url: "sl.csv",
tail j=6409 line=// url: url,
tail j=6410 line=// async: false,
tail j=6411 line=// success: function(csvd) {
tail j=6412 line=// kolist = $.csv.toArrays(csvd);
tail j=6413 line=// },
tail j=6414 line=//
tail j=6415 line=// dataType: "text",
tail j=6416 line=//// call a function on complete
tail j=6417 line=// complete: function () {
tail j=6418 line=// alert( "BUGS_11363 ajax rul="+url+" kolist="+kolist );
tail j=6419 line=//// script_kolist_load(kolist);
tail j=6420 line=// script_kolist_show(kolist);
tail j=6421 line=// }
tail j=6422 line=// });
tail j=6423 line= }
tail j=6424 line= </script id="script_file2array" >
tail j=6425 line=
tail j=6426 line=<!-- <script id="script_async_sljs" src="sl.js" async></script> -->
tail j=6427 line= <script id="script_requestcsv" >
tail j=6428 line= function callback() {
tail j=6429 line= alert( "BUGS_11480 callback" );
tail j=6430 line= }
tail j=6431 line=// var foo = requestCSV("sl.csv",drawlines(lines));
tail j=6432 line=// var foo = requestCSV("sl.csv",script_kolist(kolist));
tail j=6433 line=//// function requestCSV(f,c){return new csvajax(f,c);};
tail j=6434 line= filecsv="sl.csv";
tail j=6435 line= function csvajax(filecsv,callback) {
tail j=6436 line= alert( "BUGS_11383 script_requestcsv filepath="+filepath+" callback="+callback );
tail j=6437 line=// this.request = new XMLHttpRequest();
tail j=6438 line=// this.request.timeout = 10000;
tail j=6439 line=// this.request.open("GET", filepath, true);
tail j=6440 line=// this.request.parent = this;
tail j=6441 line=// this.callback = callback;
tail j=6442 line=// this.request.onload = function() {
tail j=6443 line=// var d = this.response.split('\n'); /*1st separator*/
tail j=6444 line=// var i = d.length;
tail j=6445 line=// while(i--) {
tail j=6446 line=// if(d[i] !== "")
tail j=6447 line=// d[i] = d[i].split(','); /*2nd separator*/
tail j=6448 line=// else
tail j=6449 line=// d.splice(i,1);
tail j=6450 line=// }
tail j=6451 line=// this.parent.response = d;
tail j=6452 line=// if(typeof this.parent.callback !== "undefined")
tail j=6453 line=// this.parent.callback(d);
tail j=6454 line=// };
tail j=6455 line=// this.request.send();
tail j=6456 line= };
tail j=6457 line= </script id="script_requestcsv" >
tail j=6458 line=
tail j=6459 line=<!--
tail j=6460 line= <script id="script_db32array" >
tail j=6461 line=//// function script_db2array("sl.db3", "select * from kolist where koid='koid'" ) {
tail j=6462 line=//// function script_db2array("/kb/db3/sl.db3", "/kb/sql/sl.sql" ) {
tail j=6463 line=// function script_db2array( db3, sql ) {
tail j=6464 line=// var dblist = new Array();
tail j=6465 line=// alert( "BUGS_11400 script_db2array db3="+db3+" sql="+sql+" dblist="+dblist );
tail j=6466 line=// return( dblist );
tail j=6467 line=// }
tail j=6468 line=
tail j=6469 line=// filedb3="sl.db3";
tail j=6470 line=// filepsv="sl.psv";
tail j=6471 line=// tblnam="sl";
tail j=6472 line=// $rr=exec("sqlite3 filedb3 \".separator '|'\" ");
tail j=6473 line=// $rr=exec("sqlite3 filedb3 \".import filepsv tblnam\" ");
tail j=6474 line=// $rr= exec ("sqlite3 filedb3 \"pragma encoding = 'utf-8'\" ");
tail j=6475 line=// $rr=exec("sqlite3 filedb3 \".separator '|'\" && sqlite3 fildb3 \"pragma encoding = 'utf-8'\" && sqlite3 filedb3 \".import filepsv tablename\" ");
tail j=6476 line= </script>
tail j=6477 line= -->
tail j=6478 line=
tail j=6479 line=<!-- Create the database -->
tail j=6480 line=<!--
tail j=6481 line= <script id="script_sqljs_include" src='js/sql.js'></script>
tail j=6482 line= <script id="script_sqljs">
tail j=6483 line= function script_sqljs() {
tail j=6484 line= var db = new SQL.Database();
tail j=6485 line=
tail j=6486 line=// Run a query without reading the results
tail j=6487 line= db.run("CREATE TABLE test (col1, col2);");
tail j=6488 line=
tail j=6489 line=// Insert two rows: (1,111) and (2,222)
tail j=6490 line= db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]);
tail j=6491 line=
tail j=6492 line=// Prepare a statement
tail j=6493 line= var stmt = db.prepare("SELECT * FROM test WHERE a BETWEEN $start AND $end");
tail j=6494 line= stmt.getAsObject({$start:1, $end:1}); // {col1:1, col2:111}
tail j=6495 line=
tail j=6496 line=// Bind new values
tail j=6497 line= stmt.bind({$start:1, $end:2});
tail j=6498 line= while(stmt.step()) { //
tail j=6499 line= var row = stmt.getAsObject();
tail j=6500 line=// [...] do something with the row of result
tail j=6501 line= }
tail j=6502 line= }
tail j=6503 line= </script>
tail j=6504 line= -->
tail j=6505 line= <a href=+ class="popover" >
tail j=6506 line= <img src="/imgs/btn/kb.png" onclick="script_startup('timejak_startup')">
tail j=6507 line= <span><img src="/imgs/btn/kw.png" onclick="script_startup('timejak_startup')"></span>
tail j=6508 line= </a>
tail j=6509 line= <script id="script_startup" >
tail j=6510 line= function script_startup( msg ) {
tail j=6511 line= alert( "BUGS_6200 script_startup msg="+msg );
tail j=6512 line=
tail j=6513 line= }
tail j=6514 line= </script id="script_startup" >
tail j=6515 line=
tail j=6516 line=<!-- <div id="div_balls_n_cubes_btn"> -->
tail j=6517 line=
tail j=6518 line= <div id="div_kobuttonset" >
tail j=6519 line= <a href=+ class="popover" >
tail j=6520 line= <img height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_b('5400')">
tail j=6521 line= <span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeye_b('5400')"></span>
tail j=6522 line= </a>
tail j=6523 line=
tail j=6524 line= <a href=+ class="popover" >
tail j=6525 line= <img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyeb_w('5400')">
tail j=6526 line= <span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_bw('5400')"></span>
tail j=6527 line= </a>
tail j=6528 line=
tail j=6529 line=
tail j=6530 line= <a href=+ class="popover" >
tail j=6531 line= <img height=50 src="/imgs/btn/kobubble_b1.png" onclick="script_bubble('5400')">
tail j=6532 line= <span><img height=50 src="/imgs/btn/kobubblew.png" onclick="script_bubble('5400')"></span>
tail j=6533 line= </a>
tail j=6534 line=
tail j=6535 line=
tail j=6536 line= <a href=+ class="popover" >
tail j=6537 line= <img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeyew_b('5500')">
tail j=6538 line= <span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyew_b('5400')"></span>
tail j=6539 line= </a>
tail j=6540 line=
tail j=6541 line=
tail j=6542 line= <a href=+ class="popover" >
tail j=6543 line= <img height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_w('5400')">
tail j=6544 line= <span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_w('5400')"></span>
tail j=6545 line= </a>
tail j=6546 line=
tail j=6547 line=
tail j=6548 line= <a href=+ class="popover" >
tail j=6549 line= <img src="/imgs/btn/kw.png" onclick="script_kw('timejak_shutdown')">
tail j=6550 line= <span><img src="/imgs/btn/kb.png" onclick="script_kw('timejak_shutdown')"></span>
tail j=6551 line= </a>
tail j=6552 line= </div id="div_kobuttonset" >
tail j=6553 line=
tail j=6554 line=
tail j=6555 line=
tail j=6556 line= <div id="div_ajax2php_form" class="drg" >
tail j=6557 line= <form id="comment">
tail j=6558 line= <input type="text" id="userInput" name="comment" placeholder="needdb3data4me" /></input>
tail j=6559 line= <input type="submit" value="Submit" /></input>
tail j=6560 line= </form>
tail j=6561 line= </div id="div_ajax2php_form" >
tail j=6562 line=
tail j=6563 line=
tail j=6564 line=<!--
tail j=6565 line= <button onclice="script_ajax2php">script_ajax2php</button>
tail j=6566 line= -->
tail j=6567 line=
tail j=6568 line=<script id="script_ajax2php">
tail j=6569 line= function script_ajax2php () {
tail j=6570 line= alert( "BUGS_5396 script_ajax2php" );
tail j=6571 line=
tail j=6572 line=// Stop the form from being submitted the standard way
tail j=6573 line= $("#comment").on('submit', function(e) {
tail j=6574 line= e.preventDefault();
tail j=6575 line=
tail j=6576 line=// Put the user's input into a variable
tail j=6577 line= var userInput = $('#userInput').val();
tail j=6578 line=
tail j=6579 line=// Do some validation of the data if needed
tail j=6580 line=// ...
tail j=6581 line=
tail j=6582 line=
tail j=6583 line=// Perform AJAX request (a.k.a send the data to the server)
tail j=6584 line=// There are many parameters one can use here
tail j=6585 line=// Browse the documentation to get familiar with the most useful ones
tail j=6586 line= $.ajax({
tail j=6587 line= url: 'index_zm.php', // The PHP script that will handle the request
tail j=6588 line= db3 = "index_zm.db3",
tail j=6589 line= sql: "select * from list",
tail j=6590 line= type: 'POST', // This can be set to GET, but in this case we'd use POST
tail j=6591 line= data: {
tail j=6592 line= db3: sql,
tail j=6593 line= sql: sql,
tail j=6594 line= }, // "comment" will result in $_POST['comment'], and userInput is the value of it
tail j=6595 line=
tail j=6596 line=// If the script returns a 200 status (meaning the request was successful)
tail j=6597 line=// The data variable will be the response from the PHP script
tail j=6598 line=// Depending on what you are going to do with the data returned,
tail j=6599 line=// you may want to ensure it is returned as valid JSON
tail j=6600 line= success: function(data) {
tail j=6601 line= alert( "BUGS ajaxphp MSG data="+data );
tail j=6602 line= },
tail j=6603 line=
tail j=6604 line=// The request failed - So something here
tail j=6605 line= error: function() {
tail j=6606 line= alert( "BUGS ajaxphp ERR data="+data );
tail j=6607 line= }
tail j=6608 line= });
tail j=6609 line=
tail j=6610 line= });
tail j=6611 line= }
tail j=6612 line= </script id="script_ajax2php">
tail j=6613 line=
tail j=6614 line=
tail j=6615 line= <button type="button" onclick="balls_n_cubes('/imgs/btn/ok.png')">balls_n_cubes</button>
tail j=6616 line=
tail j=6617 line= <button onclick="showFillText();return true;">filltxt</button>
tail j=6618 line= <button onclick="showStrokeText();return true;">stroketxt</button>
tail j=6619 line= <button onclick="Clear_text();return true;">cleartxt</button>
tail j=6620 line=
tail j=6621 line= <button onclick="draw_dragon();return true;">dragon</button>
tail j=6622 line= <button onclick="draw_smaller_dragon();return true;">dragonette</button>
tail j=6623 line= <button onclick="draw_dragon_head();return true;">draghead</button>
tail j=6624 line= <button onclick="Clear_image();return true;">clearimg</button>
tail j=6625 line=<!-- orphan div </div> -->
tail j=6626 line=
tail j=6627 line=
tail j=6628 line=
tail j=6629 line= <div id="div_canvas_balls" style="background:tan; position:relative; width:800px; height:120px">
tail j=6630 line= <canvas id="layer1"
tail j=6631 line= style="z-index: 1;
tail j=6632 line= position:absolute;
tail j=6633 line= left:0px;
tail j=6634 line= top:0px;
tail j=6635 line= " height="100px" width="800">
tail j=6636 line= unauthorized access logged
tail j=6637 line= </canvas>
tail j=6638 line= <canvas id="layer2"
tail j=6639 line= style="z-index: 2;
tail j=6640 line= position:absolute;
tail j=6641 line= left:0px;
tail j=6642 line= top:0px;
tail j=6643 line= " height="100px" width="800">
tail j=6644 line= unauthorized access logged
tail j=6645 line= </canvas>
tail j=6646 line= <canvas id="layer3"
tail j=6647 line= style="z-index: 3;
tail j=6648 line= position:absolute;
tail j=6649 line= left:0px;
tail j=6650 line= top:0px;
tail j=6651 line= " height="100px" width="800">
tail j=6652 line= unauthorized access logged
tail j=6653 line= </canvas>
tail j=6654 line=
tail j=6655 line= <canvas id="layer4"
tail j=6656 line= style="z-index: 4;
tail j=6657 line= position:absolute;
tail j=6658 line= left:0px;
tail j=6659 line= top:0px;
tail j=6660 line= " height="100px" width="800">
tail j=6661 line= unauthorized access logged b
tail j=6662 line= </canvas>
tail j=6663 line= <canvas id="layer5"
tail j=6664 line= style="z-index: 5;
tail j=6665 line= position:absolute;
tail j=6666 line= left:0px;
tail j=6667 line= top:0px;
tail j=6668 line= " height="100px" width="800">
tail j=6669 line= unauthorized access logged
tail j=6670 line= </canvas>
tail j=6671 line= <canvas id="layer6"
tail j=6672 line= style="z-index: 6;
tail j=6673 line= position:absolute;
tail j=6674 line= left:0px;
tail j=6675 line= top:0px;
tail j=6676 line= " height="100px" width="800">
tail j=6677 line= unauthorized access logged
tail j=6678 line= </canvas>
tail j=6679 line= <canvas id="layer7"
tail j=6680 line= style="z-index: 7;
tail j=6681 line= position:absolute;
tail j=6682 line= left:0px;
tail j=6683 line= top:0px;
tail j=6684 line= " height="100px" width="800">
tail j=6685 line= unauthorized access logged
tail j=6686 line= </canvas>
tail j=6687 line= </div>
tail j=6688 line= </div id="div_canvas_balls" >
tail j=6689 line=
tail j=6690 line=
tail j=6691 line=
tail j=6692 line=
tail j=6693 line= <script id="script_canvas_balls_n_cubes_w" type="text/javascript">
tail j=6694 line= var layer1; var layer2; var layer3;
tail j=6695 line= var layer4; var layer5; var layer6; var layer7;
tail j=6696 line= var layer_b; var layer_w; var layer_i; var layer_t;
tail j=6697 line=
tail j=6698 line= var ctx1; var ctx2; var ctx3;
tail j=6699 line= var ctx_b; var ctx_w; var ctx_i; var ctx_t;
tail j=6700 line= var x = 800; var y = 100; var dx = 2; var dy = 4;
tail j=6701 line= var b_x = 800; var b_y = 100; var b_dx = 2; var b_dy = 4;
tail j=6702 line= var w_x = 800; var w_y = 100; var w_dx = 2; var w_dy = 4;
tail j=6703 line= var i_x = 800; var i_y = 100; var i_dx = 2; var i_dy = 4;
tail j=6704 line= var t_x = 800; var t_y = 100; var t_dx = 2; var t_dy = 4;
tail j=6705 line=
tail j=6706 line= var WIDTH = 800;
tail j=6707 line= var HEIGHT = 100;
tail j=6708 line=
tail j=6709 line= var city = new Image();
tail j=6710 line= var city_b = new Image();
tail j=6711 line= var city_w = new Image();
tail j=6712 line= var img_b = new Image();
tail j=6713 line= var img_w = new Image();
tail j=6714 line= var gif = new Image();
tail j=6715 line= var img = new Image();
tail j=6716 line= var txt = new Image();
tail j=6717 line= img_new = new Image();
tail j=6718 line=
tail j=6719 line= img_mask = new Image();
tail j=6720 line= img_mask_w = new Image();
tail j=6721 line= img_mask_b = new Image();
tail j=6722 line= img_mask_ko = new Image();
tail j=6723 line= img_mask_kow = new Image();
tail j=6724 line= img_mask_kob = new Image();
tail j=6725 line= img_mask_koeye = new Image();
tail j=6726 line= img_mask_koeyew = new Image();
tail j=6727 line= img_mask_koeyeb = new Image();
tail j=6728 line=
tail j=6729 line= myimg="";
tail j=6730 line= myimg="/imgs/btn/koeye_handhi.gif";
tail j=6731 line= myimg="/imgs/btn/koeye_handhither.gif";
tail j=6732 line= balls_n_cubes( myimg );
tail j=6733 line=
tail j=6734 line= function showFillText() {
tail j=6735 line= ctx_t.fillStyle = '#f00';
tail j=6736 line= ctx_t.fillStyle = 'yellow';
tail j=6737 line=// ctx_t.font = 'italic bold 30px sans-serif';
tail j=6738 line= ctx_t.font = 'italic bold 40px yokkmokkOT';
tail j=6739 line= ctx_t.textBaseline = 'bottom';
tail j=6740 line= ctx_t.fillText('timejaks: jkwii is here', 50, 100);
tail j=6741 line= }
tail j=6742 line=
tail j=6743 line= function showStrokeText() {
tail j=6744 line= ctx_t.strokeStyle = "#003300";
tail j=6745 line= ctx_t.font = '40px san-serif';
tail j=6746 line= ctx_t.textBaseline = 'bottom';
tail j=6747 line= ctx_t.strokeText('timejaks jkwii is us', 300, 100);
tail j=6748 line= }
tail j=6749 line=
tail j=6750 line=// textBaseline top,hanging,middle,alphabetic,ideographic,bottom default: alphabetic
tail j=6751 line= function Clear_text() {
tail j=6752 line= ctx_t.textBaseline = "top";
tail j=6753 line= ctx_t.fillText('Top', 5, 100);
tail j=6754 line= ctx_t.textBaseline = "bottom";
tail j=6755 line= ctx_t.fillText('Bottom', 80, 100);
tail j=6756 line= ctx_t.textBaseline = "middle";
tail j=6757 line= ctx_t.fillText('Middle', 200, 100);
tail j=6758 line= ctx_t.textBaseline = "alphabetic";
tail j=6759 line= ctx_t.fillText('Alphabetic', 300, 100);
tail j=6760 line= ctx_t.textBaseline = "hanging";
tail j=6761 line= ctx_t.fillText('Hanging', 400, 100);
tail j=6762 line= ctx_t.clearRect(1, 1, 600, 300);
tail j=6763 line= }
tail j=6764 line=
tail j=6765 line=// var c5 = document.getElementById("c5");
tail j=6766 line=// var c5_context = c5.getContext("2d");
tail j=6767 line=
tail j=6768 line= var dragon = new Image();
tail j=6769 line= dragon.src = '/imgs/btn/dragon.png';
tail j=6770 line=
tail j=6771 line= function draw_dragon() {
tail j=6772 line= ctx_i.drawImage(dragon, 100, 5);
tail j=6773 line= }
tail j=6774 line=
tail j=6775 line= function draw_smaller_dragon() {
tail j=6776 line= ctx_i.drawImage(dragon, 10, 5, 58, 100);
tail j=6777 line= }
tail j=6778 line=
tail j=6779 line= function draw_dragon_head() {
tail j=6780 line= ctx_i.drawImage(dragon, 0, 19, 69, 97, 300, 100, 103, 145);
tail j=6781 line= }
tail j=6782 line=
tail j=6783 line= function Clear_image() {
tail j=6784 line= ctx_i.clearRect(1, 1, 600, 300);
tail j=6785 line= }
tail j=6786 line=
tail j=6787 line=
tail j=6788 line=
tail j=6789 line=
tail j=6790 line= function balls_n_cubes(myimg) {
tail j=6791 line=// alert( "BUGS_5780 myimg="+myimg );
tail j=6792 line= imgs_new = new Array(); z=0;
tail j=6793 line= imgs_new[z++] = "/imgs/btn/koeye_handhi.gif";
tail j=6794 line= imgs_new[z++] = "/imgs/btn/ko.png";
tail j=6795 line= imgs_new[z++] = "/imgs/btn/ok.png";
tail j=6796 line= imgs_new[z++] = "/imgs/btn/koeyew.png";
tail j=6797 line= imgs_new[z++] = "/imgs/btn/koeyeb.png";
tail j=6798 line= imgs_new[z++] = "/imgs/btn/koeye.png";
tail j=6799 line= imgs_new[z++] = "/imgs/btn/koeye_handhither.gif";
tail j=6800 line=// alert( "BUGS_5790 myimg="+myimg );
tail j=6801 line= if( myimg == "" ) {
tail j=6802 line=// alert( "BUGS_5791 OLD myimg="+myimg );
tail j=6803 line=// img_new.src = myimg;
tail j=6804 line=// img_new.src = "/imgs/btn/ko.png";
tail j=6805 line= img_new.src = "/imgs/btn/koeye_handhither.gif";
tail j=6806 line= img_new.src = "/imgs/btn/koeye_handhi.gif";
tail j=6807 line= }
tail j=6808 line= else {
tail j=6809 line=// alert( "BUGS_5792 NEW myimg="+myimg );
tail j=6810 line=// img_new.src = "/imgs/btn/ok.png";
tail j=6811 line= img_new.src = "/imgs/btn/koeye_handhither.gif";
tail j=6812 line= img_new.src = myimg;
tail j=6813 line= }
tail j=6814 line= return( img_new );
tail j=6815 line= }
tail j=6816 line=
tail j=6817 line=// function init() {
tail j=6818 line=// myimg = "/imgs/btn/ko.png";
tail j=6819 line=// myimg = "";
tail j=6820 line= function init_balls_n_cubes(myimg) {
tail j=6821 line=// alert( "BUGS_5810 balls_n_cubes myimg="+myimg );
tail j=6822 line= city.src ="/imgs/btn/koeye.png";
tail j=6823 line= city_b.src ="/imgs/btn/koeyeb.png";
tail j=6824 line= city_w.src ="/imgs/btn/koeyew.png";
tail j=6825 line=
tail j=6826 line= img.src ="/imgs/btn/kob.png";
tail j=6827 line= txt.src ="/imgs/btn/kow.png";
tail j=6828 line= img_b.src ="/imgs/btn/koeyeb.png";
tail j=6829 line= img_w.src ="/imgs/btn/koeyew.png";
tail j=6830 line=
tail j=6831 line= img_mask.src ="/imgs/btn/kob.png";
tail j=6832 line= img_mask_w.src ="/imgs/btn/kob.png";
tail j=6833 line= img_mask_b.src ="/imgs/btn/kob.png";
tail j=6834 line= img_mask_koeye.src = "/imgs/btn/koeye_mask.png";
tail j=6835 line= img_mask_koeyew.src = "/imgs/btn/koeyew_mask.png";
tail j=6836 line= img_mask_koeyeb.src = "/imgs/btn/koeyeb_mask.png";
tail j=6837 line= img_mask_ko.src = "/imgs/btn/ko_mask.png";
tail j=6838 line= img_mask_kow.src = "/imgs/btn/kow_mask.png";
tail j=6839 line= img_mask_kob.src = "/imgs/btn/kob_mask.png";
tail j=6840 line=
tail j=6841 line=
tail j=6842 line= gif.src = "/imgs/btn/koeye_handhither.gif";
tail j=6843 line=// gif.src = "/imgs/btn/ok.png";
tail j=6844 line=// img_new = balls_n_cubes('');
tail j=6845 line=// img_new = balls_n_cubes(myimg);
tail j=6846 line= gif.src = img_new.src;
tail j=6847 line=
tail j=6848 line= layer1 = document.getElementById("layer1");
tail j=6849 line= ctx1 = layer1.getContext("2d");
tail j=6850 line= layer2 = document.getElementById("layer2");
tail j=6851 line= ctx2 = layer2.getContext("2d");
tail j=6852 line= layer3 = document.getElementById("layer3");
tail j=6853 line= ctx3 = layer3.getContext("2d");
tail j=6854 line=
tail j=6855 line= layer4 = document.getElementById("layer4");
tail j=6856 line= ctx_b = layer4.getContext("2d");
tail j=6857 line= layer5 = document.getElementById("layer5");
tail j=6858 line= ctx_w = layer5.getContext("2d");
tail j=6859 line= layer6 = document.getElementById("layer6");
tail j=6860 line= ctx_i = layer6.getContext("2d");
tail j=6861 line= layer7 = document.getElementById("layer7");
tail j=6862 line= ctx_t = layer7.getContext("2d");
tail j=6863 line=
tail j=6864 line= setInterval(drawAll, 20);
tail j=6865 line= }
tail j=6866 line=
tail j=6867 line= function draw1() {
tail j=6868 line= ctx1.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6869 line= ctx1.fillStyle = "#FAF7F8";
tail j=6870 line= ctx1.fillStyle = "darkslaegrey";
tail j=6871 line= ctx1.beginPath();
tail j=6872 line= ctx1.rect(0,0,WIDTH,HEIGHT);
tail j=6873 line= ctx1.closePath();
tail j=6874 line= ctx1.fill();
tail j=6875 line= ctx1.fillStyle = "#444444";
tail j=6876 line=// ctx1.fillStyle = "yellow";
tail j=6877 line= ctx1.beginPath();
tail j=6878 line= ctx1.arc(x, y, 10, 0, Math.PI*2, true);
tail j=6879 line= ctx1.closePath();
tail j=6880 line= ctx1.fill();
tail j=6881 line=
tail j=6882 line= if (x + dx > WIDTH || x + dx < 0) dx = -dx;
tail j=6883 line= if (y + dy > HEIGHT || y + dy < 0) dy = -dy;
tail j=6884 line=
tail j=6885 line= x += dx;
tail j=6886 line= y += dy;
tail j=6887 line= }
tail j=6888 line=
tail j=6889 line=
tail j=6890 line=
tail j=6891 line= function draw_b() {
tail j=6892 line= ctx_b.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6893 line= ctx_b.fillStyle = "#FAF7F8";
tail j=6894 line= ctx_b.fillStyle = "darkslaegrey";
tail j=6895 line= ctx_b.beginPath();
tail j=6896 line= ctx_b.rect(0,0,WIDTH,HEIGHT);
tail j=6897 line= ctx_b.closePath();
tail j=6898 line= ctx_b.fill();
tail j=6899 line=// ctx_b.fillStyle = "#444444";
tail j=6900 line= ctx_b.fillStyle = "red";
tail j=6901 line= ctx_b.beginPath();
tail j=6902 line= ctx_b.arc(b_x, b_y, 10, 0, Math.PI*2, true);
tail j=6903 line= ctx_b.closePath();
tail j=6904 line= ctx_b.fill();
tail j=6905 line=
tail j=6906 line= if (b_x + b_dx > WIDTH || b_x + b_dx < 0) b_dx = -b_dx;
tail j=6907 line= if (b_y + b_dy > HEIGHT || b_y + b_dy < 0) b_dy = -b_dy;
tail j=6908 line=
tail j=6909 line= b_x += b_dx;
tail j=6910 line= b_y += b_dy;
tail j=6911 line= }
tail j=6912 line=
tail j=6913 line= function draw_w() {
tail j=6914 line= ctx_w.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6915 line=// ctx_w.fillStyle = "#FAF7F8";
tail j=6916 line= ctx_w.fillStyle = "darkslaegrey";
tail j=6917 line= ctx_w.beginPath();
tail j=6918 line= ctx_w.rect(0,0,WIDTH,HEIGHT);
tail j=6919 line= ctx_w.closePath();
tail j=6920 line= ctx_w.fill();
tail j=6921 line= ctx_w.fillStyle = "#444444";
tail j=6922 line= ctx_w.fillStyle = "yellow";
tail j=6923 line= ctx_w.fillStyle = "darkslategrey";
tail j=6924 line= ctx_w.beginPath();
tail j=6925 line= ctx_w.arc(w_x, w_y, 10, 0, Math.PI*2, true);
tail j=6926 line= ctx_w.closePath();
tail j=6927 line= ctx_w.fill();
tail j=6928 line=
tail j=6929 line= if (w_x + w_dx > WIDTH || w_x + w_dx < 0) w_dx = -w_dx;
tail j=6930 line= if (w_y + w_dy > HEIGHT || w_y + w_dy < 0) w_dy = -w_dy;
tail j=6931 line=
tail j=6932 line= w_x += w_dx; w_y += w_dy;
tail j=6933 line= }
tail j=6934 line=
tail j=6935 line=
tail j=6936 line=
tail j=6937 line=
tail j=6938 line=
tail j=6939 line= function draw2() {
tail j=6940 line= ctx2.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6941 line= ctx2.drawImage(city, WIDTH/2-100, 10 );
tail j=6942 line= ctx2.drawImage(city_w, WIDTH/2-100, 10 );
tail j=6943 line= ctx2.drawImage(city_b, WIDTH/2-100, 10 );
tail j=6944 line= ctx2.drawImage(gif, WIDTH/2-100, 10 );
tail j=6945 line=
tail j=6946 line=
tail j=6947 line=// ctx2.drawImage(img_mask, 0, 0);
tail j=6948 line=// ctx2.globalCompositeOperation = 'source-in';
tail j=6949 line=// ctx2.drawImage(city_w, 10 , 10);
tail j=6950 line=// ctx2.drawImage(img_mask, 0, 0);
tail j=6951 line= }
tail j=6952 line=
tail j=6953 line= function draw_i() {
tail j=6954 line=// img_mask="/imgs/btn/koeye_mask.png";
tail j=6955 line=// ctx_i.drawImage(img_mask, 0, 0);
tail j=6956 line=// ctx_i.globalCompositeOperation = 'source-in';
tail j=6957 line=// ctx_i.drawImage(img_w, 0 , 0);
tail j=6958 line=
tail j=6959 line=
tail j=6960 line=
tail j=6961 line= ctx_i.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6962 line= ctx_i.drawImage(img, WIDTH/2-100, 10 );
tail j=6963 line=// ctx_i.drawImage(img_i, WIDTH/2-100, 10 );
tail j=6964 line= }
tail j=6965 line=
tail j=6966 line= function draw_t() {
tail j=6967 line= txt="timejaks: jkwii";
tail j=6968 line=// ctx_t.drawImage(txt, 0, 0);
tail j=6969 line=// ctx_t.drawImage(img_t, WIDTH/2-100, 10 );
tail j=6970 line=// ctx_t.fillStyle = '#f00';
tail j=6971 line=// ctx_t.font = 'italic bold 30px sans-serif';
tail j=6972 line=// ctx_t.fillText(txt, 50, 100);
tail j=6973 line=// ctx_t.fillText("timejaks: jkwii is me", 0, 0);
tail j=6974 line=// ctx_t.fillText("timejaks: jkwii is he", x, y);
tail j=6975 line=
tail j=6976 line= ctx_t.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6977 line= ctx_t.fillStyle = 'black';
tail j=6978 line= ctx_t.fillStyle = 'goldenrod';
tail j=6979 line= ctx_t.fillStyle = 'darkslategrey';
tail j=6980 line= ctx_t.font = '50px yokkmokkOT';
tail j=6981 line= ctx_t.textBaseline = 'bottom';
tail j=6982 line= ctx_t.fillText("timejaks: jkwii is where", x, y);
tail j=6983 line=
tail j=6984 line=// alert( "BUGS_5900 drat_t txt="+txt );
tail j=6985 line= }
tail j=6986 line=
tail j=6987 line=
tail j=6988 line=
tail j=6989 line=
tail j=6990 line=
tail j=6991 line= function draw3() {
tail j=6992 line= ctx3.clearRect(0, 0, WIDTH, HEIGHT);
tail j=6993 line= ctx3.fillStyle = "#444444";
tail j=6994 line=// ctx3.fillStyle = "darkslategrey";
tail j=6995 line=// ctx3.translate(100,100);
tail j=6996 line=// ctx3.fillRect(-15, -15, 50, 50);
tail j=6997 line= ctx3.save();
tail j=6998 line= ctx3.translate(400,50);
tail j=6999 line= ctx3.rotate(x/20);
tail j=7000 line= ctx3.fillRect(10, 0, 25, 25);
tail j=7001 line= ctx3.restore();
tail j=7002 line= }
tail j=7003 line=
tail j=7004 line=
tail j=7005 line=
tail j=7006 line=
tail j=7007 line=
tail j=7008 line=
tail j=7009 line= function drawAll() {
tail j=7010 line= draw_b();
tail j=7011 line= draw_w();
tail j=7012 line= draw_i();
tail j=7013 line= draw_t();
tail j=7014 line=
tail j=7015 line= draw1();
tail j=7016 line= draw2();
tail j=7017 line= draw3();
tail j=7018 line= }
tail j=7019 line=
tail j=7020 line=
tail j=7021 line=
tail j=7022 line=
tail j=7023 line=
tail j=7024 line=
tail j=7025 line=
tail j=7026 line=// init(img_new);
tail j=7027 line= init_balls_n_cubes(myimg);
tail j=7028 line= </script id="script_canvas_balls_n_cubes_w" >
tail j=7029 line=
tail j=7030 line= <script id="script_load_urlbtn">
tail j=7031 line= function load_urlbtn(btnid) {
tail j=7032 line= img_dragon: url("/imgs/links/tn/tn_dragon.png" );
tail j=7033 line= img_ko: url("/imgs/btn/ko.png");
tail j=7034 line= img_ok: url("/imgs/btn/ok.png");
tail j=7035 line= img_kb: url("/imgs/btn/kb.png");
tail j=7036 line= img_kw: url("/imgs/btn/kw.png");
tail j=7037 line= img_ki: url("/imgs/btn/ki.png");
tail j=7038 line=
tail j=7039 line= img_kob: url("/imgs/btn/kob.png");
tail j=7040 line= img_kow: url("/imgs/btn/kow.png");
tail j=7041 line= img_kib: url("/imgs/btn/kib.png");
tail j=7042 line= img_kiw: url("/imgs/btn/kiw.png");
tail j=7043 line=
tail j=7044 line= img_koeye: url("/imgs/btn/koeye.png");
tail j=7045 line= img_koeyeb: url("/imgs/btn/koeyeb.png");
tail j=7046 line= img_koeyew: url("/imgs/btn/koeyew.png");
tail j=7047 line= img_koeye_handhither: url("/imgs/btn/koeye_handhither.gif");
tail j=7048 line= img_koeye_handhi: url("/imgs/btn/koeye_handhi.gif");
tail j=7049 line=
tail j=7050 line= img_kop1: url("/imgs/btn/kop1.png");
tail j=7051 line= img_kop2: url("/imgs/btn/kop2.png");
tail j=7052 line= img_kop3: url("/imgs/btn/kop3.png");
tail j=7053 line= img_kop4: url("/imgs/btn/kop4.png");
tail j=7054 line=
tail j=7055 line= img_kop12: url("/imgs/btn/kop12.png");
tail j=7056 line= img_kop23: url("/imgs/btn/ko23.png");
tail j=7057 line= img_kop34: url("/imgs/btn/kop34.png");
tail j=7058 line= img_kop14: url("/imgs/btn/kop14.png");
tail j=7059 line=
tail j=7060 line= img_btn: url("/imgs/btn/btn.png");
tail j=7061 line= img_btn_n: url("/imgs/btn/btn_n.png");
tail j=7062 line= img_btn_s: url("/imgs/btn/btn_s.png");
tail j=7063 line= img_btn_e: url("/imgs/btn/btn_e.png");
tail j=7064 line= img_btn_w: url("/imgs/btn/btn_w.png");
tail j=7065 line= return(img);
tail j=7066 line= }
tail j=7067 line= </script id="script_load_urlbtn">
tail j=7068 line=
tail j=7069 line=
tail j=7070 line= <script id="script_load_b64btn" >
tail j=7071 line= function load_b64btn(btnid) {
tail j=7072 line= ko_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD9/f0bIQwZHgowLzEoKCohISIvMDU1NjoqLDOCg4S1trQUGQemqZ54e28fIxE0NiyFiXaSlYZNTkkuMCNZWlRvcGonKRo9PzEKCgUREQtBQUDU1NMZGBQfHhp9fHozLiv8/Pz5+fn39/f09PTv7+/n5+fe3t7////X+GtxAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAE1FJREFUeNq0m09sI9d5wH/fG1I7FEXJWi4trow0cpKDgSBA4FzUS9tL29W5h0WSNg0QA/WaVNEI9tWHRZGitSEXEendAknhokWBHHr1Oj0VPRQC2hpt3AB7KBDFi11zJVFckZI4FGfe18ObIWck6t/aJRbickgO3+99f9/3vSfK1R/bQYWOT4MaNF8LcPeQBffUQgFRcpH7uKKegEaCAFrlqXrFe6/9cAOGsAYbQfGw0gcgYJ4d/8WrDkmuzrHX+I5IVYlQAdj1whwQ3nS3CslJC0ATDjT3H98qtwkFQaHiSUv/63fxRHmqOYBp78AP3tpYZSOgOLWt/1gvXA3mihx7eyILUU5FeZqM0aIS5cPrnYqheKW7HWJ3UJ2b6a2Orq2vueeNnl4vFP5fOHrbVRgTAEqOSKKXnkjhQOWl6StK9vY9P3rv+28BrANgjTUAOJi/bb1Y+sI5tiwLjkBFIQcMRbDT/ZsHxW6vFAhF/7h8RR0NV1kHbPayscaxbByYpS+UY+vFlqNQcgzBmeyc8CxXfvLiERxjEcoBlasIBNZHECvu6cEIxrmAme2lL4zj7h+qOIYhIIi+eNykTqEXlMMjgCDyDFiE4qVJbsN6DLHyiTqn4XzdUSdBWYMfyVe+II6tSBLvqSY0M6ZZv/PLTX6wMTvgCPCfffwqonz8KiBl3nv7ShQr/EJJj0PAfOPBygMAswY/8pa+CI6735U4BACl5lvf/yWfHHauBXP0PMAP/u1VkMT0ReUyIrkdU6wA/62MZBHfSDDfcCpmWLsEyGU4/ldywxyUoV2c2Z1nmc39ta//mR75AeDzjOxcqpS5yM/cHlPwScSpUQiYo2VnLYY1/nLp83P82gplgGhY/+kym+yv/U2e4/jdyOhUW1IeRwCKpnxJYWwyrXYSiJij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");
tail j=7073 line= ok_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD9/f0bIQwZHgowLzEoKCohISIvMDU1NjoqLDOCg4S1trQUGQemqZ54e28fIxE0NiyFiXaSlYZNTkkuMCNZWlRvcGonKRo9PzEKCgUREQtBQUDU1NMZGBQfHhp9fHozLiv8/Pz5+fn39/f09PTv7+/n5+fe3t4AAADXRk1jAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////6eH29uXl7e3t7e3t9uHs4elWVlbk5OTp6elW5YHq39zd9PTc3d3d3dzc297f39/e29zc3d3d3d3d3eDc3N3c3Nzc3d319PT09PT03dzc3Nzc3N3d5YHs7OyBge3t5fb24en/////////////////////////////////////////////////////////////////////AP//////////////////////////////////////////////////////////6eH27YHb3PLs4eHpVlbpVuHp4e3q4ODg4ODc3fT09fTx8azc3fX08dzc3N3d3Nzb39/y36zg3N3d3d3d3d3d4Nzd3d3d3fX08PD09PT09PT13ODg4ODc4N3x8fHx8fDx8fT09d3c24Ht//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////9u3b3OlWVlZWVlZW5FZWVlZWVlZWVlbp9urb3N3d8vT0//////////////////////////////////////////////////////////////T08t3u3ODb3t3e3uDc3d3d3d3d3fT09fT18fTd3Nvt/////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////8tz0VlZWVlZW5OTk5OTk4uTi5OTk5OTkVlZWVlbhgfL17Vb////////////////////////////////////////////////////////////////12tna5t3c9tve3eDg3Nzd3d3d3d3d3d3d9PT19PT03PL/////////////////////////////////////////////////////////AP//////////////////////////////////////////////////393pVlZWVuTk5OLk4uLi4uLi4uLi4uLi4uLi5OTk5FZW6e3//////////////////////////////////////////////////////////////+zy6t/f3ubZ5vTp9dzl293d3Nvg4ODg3Nzc3dzd3d3d3d303d3f//////////////////////////////////////////////////////8A////////////////////////////////////////////////3/XpVlZW5OTk4uLi4uLi4uLiKysrKysrK+Li4uLi4uLk5ORWVlb//////////////////////////////////////////////////////////+rq8t/f3t7g4Obm5vDa9OHd7e3s3d3d3dzc29vb4ODc3N3d3d3d9N313////////////////////////////////////////////////////wD//////////////////////////////////////////////93cVlZW5OTi4uLi4uLi8/38/Pz8/f39/f39/P3+K+Li4uLi4uTkVlZW/////////////////////////////////////////////////////+rq39/e3uDg4N7b3ubm5ubm8PTh6fbt7YGB7PLc3dzc29vb2+Dc3N3d3d3c3YH/////////////////////////////////////////////////AP///////////////////////////////////////////9/cVlZW5OLi4uLiK+Ir/vz8/Pv7+/v7+/v7+/v7+/z8/Ssr4uLi4uLk5FZWVv///////////////////////////////////////////////4Hy8t/e3t7erN7e397erN7u5ubm5vDw9+lW8/MrVu2B7Ore3ODe39/e29zc3d3d3N////////////////////////////////////////////////8A///////////////////////////////////////////f3FZW5OTi4uLi4isr/vz8+/v7+/v7+vr6+vr7+/v7+/v7/CsrKyvi4uLi5ORWVv/////////////////////////////////////////////q6t/e397f39/f39/f397e3qzm7ubm5ubj8PDh6eLz/isrVvaB7N/f39/f397b3Nzd3IH//////////////////////////////////////////////wD/////////////////////////////////////////31ZW5OTi4uLiKysr8/37+/v6+vr6+vr6+vr6+vr6+vr6+vv7/isrKysr4uLi4uTkVv//////////////////////////////////////////8vLf3t/f397e3t7e3t7e3t7e3t7u7ubm5ubu5vDxgVbk8ysr8/Pi9urf8vLy39/f2+Dc2///////////////////////////////////////////////AP///////////////////////////////////////+BWVuTk4uLiKysrK/P9+/r6+fn5+fn5+fn5+fn5+fn5+fn6+vz98/MrKysr4uLi4uTkVlb/////////////////////////////////////7Orf39/f397e3t7e3t7e3t7g4N/y7O3r7u7u7u7u7u709O9W5PPzKyvzVurv8vLy8vLf397g//////////////////////////////////////////////8A///////////////////////////////////////yVlbk4uLiKysrKyvz/v38+/z8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/f7+/vPzKysrK+Li4uLkVlb//////////////////////////////////+ry39/f39/e3t6s3t7e3t7g4PLt4eHh4eHn6+vr6+vr5+fr693y5OQr8/Mr7fLy8vLq8vLy39/b4P///////////////////////////////////////////wD/////////////////////////////////////6lbk5OLi4uIrKyvz/v7+/f39/fz9/Pz8/Pz8/Pz8/Pz8/P38/P39/f39/v7+8ysrKyvi4uLkVlb////////////////////////////////q8t/f39/f36ze3t7g3t7e4PKB4eHh4eHh4eHv7+/n7+/v7+/v5+fc9+Hk4uTt6urq6urq6vLy8t/e8v//////////////////////////////////////////AP///////////////////////////////////+pWVuTi4uIrKyvz8/7+/v39/fz8/Pz8/Pz8+/v7+/v7+/v7/Pz8/Pz8/f39/v7+8/MrKyvi4uLkVlb/////////////////////////////6t/f39/f39/e4ODg4N7g4ODy7fbh9uHh4eHh4eHv7+/v7+/v7+/v7+/y3+/q7Ozs7Orq7Ozq6vLy8vLf8v////////////////////////////////////////8A////////////////////////////////////VuTk4uIrKysr8/7+/v39/fz8/Pz8+/v7+/v7+/v7+/v7+/v7+/v8/Pz8/P39/f7+8/MrKyvi4uLkVlb//////////////////////////+ry39/f39/e4ODg4ODe3t7g34Hh4eHh4eHh4eHh4eHy8vLy8vLy8vLy8vLq6urs7Ozs7Ozs7IHq6ury8vLf6v///////////////////////////////////////wD/////////////////////////////////7VZW5OLi4isrK/7+/v39/fz8/Pz7+/v7+/r6+vn5+vr6+vn5+vr7+/v7+/z8/Pz9/f3+/vMrKyvi4uLkVv/////////////////////////s8t/f3t/e4ODg4ODg4N7e4ODfgeHh4eHh4eHh4eHh4eHq6urq6urq6urq6vLq6uzsgYHsgezs7Ozs6urq6t/f6v//////////////////////////////////////AP///////////////////////////////4FWVuTi4isrK/Pz/v79/fz8/Pz7+/v7+vn6+fn5+fn5+fn5+fn5+fr5+vr7+/v8/Pz8/f3+/vMrKyvi4uLkVv//////////////////////gd/f3t/e4ODg3uDg4N7e4N7g3t/sge329uH29u2B7e3tgerq6oLqgurqgurs6urs7OzsgeyBgYGB7Ozs7Orq6vLf6v////////////////////////////////////8A////////////////////////////////Vlbk4uLiKyvz8/7+/f38/Pz7+/v6+vr5+fn5+fn4+Pj4+Pj4+fn5+fn5+fn6+/v7/Pz8/f3+/v4rKyvi4uLkVv///////////////////+Xf3t7e4ODg4N7g4N7e3uDe3t7e3t7y6vLy8vLf397e4ODe6+qC6urs7Ozs7Ozs7Ozs7IHsgYGBgYGBgYHs7Ozs6vLf8v///////////////////////////////////wD//////////////////////////////1ZW5OLi4isrK/P+/v39/Pz8+/v7+vn5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+fn5+fn6+/v7/Pz8/f3+/vPzKyvi4uTkVv//////////////////3+Dg4ODg4ODe3uDg4ODg3uDe3t7e3uDg4N7e4ODg4ODe3t7g2+zs7OyC7Ozs7IGCgYGB7IHtge3t7e2BgYGB7Ors6vLq////////////////////////////////////AP/////////////////////////////tVlbk4uIrKyvz/v39/fz8+/v7+vr5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5+fn6+vv7+/z8/f3+/vMrKyvi4uRW/////////////////+rg4ODg4ODg4N7g4ODg4ODe3uDg3t7g4ODg4N7g3t7e3t7e3t7e2+zs7IGBgu2BgYGBge3tge3t7e3t7eXt7YGB7Ozq6vLs//////////////////////////////////8A/////////////////////////////1ZW5OLi4isr8/7+/f38/Pz7+/r5+fn5+Pj4+Pj4+Pj42NjY2NjY+Pj4+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrKyvi4uRW//////////////+B4ODg4ODg4ODg4N7b4ODg4ODg4ODg4ODg3t7e3t7e3t7e4N7e3t7e7+yBgu3t7e3t7e3t7e3t7e3t5eXl5eXl7e2Bgezq6vL//////////////////////////////////wD////////////////////////////hVlbi4uIrK/P+/v39/Pz8+/r6+fn5+Pj4+Pj4+NjY2NjY2NjY2NjY2NjY+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrK+Li5OT///////////////Lf4ODg4ODg4ODg4ODg4ODc4Nzg4ODg4N7e3t6s3t/f397e3t7e3t/f7+3t7e3t7eXl7eXt5eXl5eX29vb29vbl5e2Bgezs8v//////////////////////////////////AP///////////////////////////1ZW5OLiKyvz8/79/f38/Pv6+vn5+fj4+Pj4+NjY2NjY2NjY2NjY2NjY2NjY2Pj4+Pj4+Pn5+vr7+/z8/f3+/vMrK+Li5Fb/////////////8t7g4ODg4ODg4ODg4ODg4ODg4ODb4N7e397f3t/f397e3qze3t7e3t7frIHt7e3l5eXl5eXl5eXl6Ojo4eHh4eH29uXtgezs8uz///////////////////////////////8A//////////////////////////9WVuTi4isrK/P+/v39/Pz8+/r6+fn4+Pj4+PjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz8/f7+8ysr4uLi5P////////////Lf3+Dg4ODg4ODg4ODg4ODg4ODg297e39/f39/e3t7e3uDg4ODg4ODe4N7b5+3t5eXl5ejo6Ojo6Ojo6Ojo6Onp4eHh9vbtgezs6v///////////////////////////////wD//////////////////////////1ZW4uLi4ivz/v79/f38/Pv7+vn5+Pj4+Pj42NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz9/f7z8ysr4uLkVv/////////q8t/e3t7e4ODg4ODg4ODg4ODb3t7e3t/frN7e3uDg4ODc4Nzg3ODg4ODg4ODb6+Xl5ejo6Ojo6Ono6ejp6enp6enp6enh4fbtgezqgf//////////////////////////////AP/////////////////////////lVuTi4isr8/P+/v39/fz8+/r5+fn5+Pj4+NjY2NjY2NjY2NgAAAAAAAAA2NjY2NjY2Nj4+Pj4+Pn5+vv7/Pz9/f7zKysr4uTk//////////Lf4N7e3uDg4ODg4ODg4ODg3t7g3t7e3uDg4ODg3ODc4ODg4ODg4ODg4ODc4Nzg6+Xo6Ojo6ejp6enp6enp6enp6elWVunp6eHtgYHq7f////////////////////////////8A////////////////////////7Vbk4uLiKyvz8/7+/f38/Pv7+vn5+fn4+Pj42NjY2NjY2NjYAAAAAAAAAAAAANjY2NjY2Nj4+Pj4+fn5+vv7/Pz9/v7zK+Li4uT////////t397e3t7g4ODg3t7e3t7g4ODg4N7g4ODg4ODg4ODg4N7e3t7e3uDg4ODg4ODc3Nzc4Ojo6Ojo6enp6enp6enp6enp6elWVlbp6eHt7YHs7f///////////////////////////wD//////////////////////+WBVuTi4isr8/P+/v39/fz7+/r6+fn5+fj4+PjY2NjY2NjY2AAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn5+vv8/P39/vPzKyvi5Fb//////+zf4ODg4ODg4N7f39/f39/e3uDg4ODg4ODg4ODg4ODg4N7e3t7e4ODg4ODg3Nzc3Nzc3Ojo6enp6enpVuTkVuTk5ORW5OlW5FZW6eH27YHs////////////////////////////AP/////////////////////27O3k4uIrKyvz/v7+/f38/Pv7+vn5+fn5+Pj4+NjY2NjY2NjYAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn6+/z8/P3+/vMr4uLi5P//////8t7g4N7e39/f39/f39/f39/e3t7g4ODg3uDg4ODg4ODg4ODg4ODg4ODg4ODg4ODc3Nzc3O7p6enp6eTp5Onk5OTk5OTk5OTkVuRWVuH27YHs9v////////////////////////8A//////////////////+s4eyB4eLi4isr8/P+/v39/fz7+/r7+/r6+vn5+Pj4+NjY2NjY2AAAAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj5+fn6+/z8/f3+8ysr4uLk///////e4ODe39/f39/f39/f39/f397e3t7g3t7g4ODg4ODg4ODe3t7e3uDg3t7e2+Dg4Nzg4Nzd8fXp6Vbk5OTk5OTk5OTk5OTk5OTk5Fbp4eH27YHs/////////////////////////wD////////////////y4ezsgYHi4isrKyvz/v79/f39/Pz8+/v6+vr6+fn4+Pj4+NjY2NgA+fn5+fj4+fn5AAAAAAAAAADY2NjY2Pj4+Pj5+fr7+/z9/f7z8yvi4uRW////7ODg4N7f39/f39/f3t/f39/e3t7g4ODg4ODg4ODg4N7e3t7e3t/f3t7f397f39/f4ODg4ODd9PTu5OTk5OTk5OQs5CzkLOTk5OTk6enp4fbt7YH/////////////////////////AP/////////////t4ezq7IGB7eLiKysr8/7+/v39/fz8/Pz7+/r6+vr5+fj5+Pj4+NjYAPn6+vr6+vr6+vn5AAAAAAAAAADY2NjY2Pj4+Pn5+fr7/Pz9/v4rKyvi4lb////y4ODe3t/f39/f397e3t7e4N7g4ODg4ODc4ODg4ODg3t7e3t7e3t7e3t7e3t/f39/g4ODg4ODd8fHj5unk5OQs5OLk4uTi5Czk5OTk5Ono6OXtgYHs6v////////////////////8A/////////////4Hq6uzs7IHt4uIr8/P+/v79/f38/Pz8+/v7+/r6+fn5+fj4+Pj42Nj5+/r8+/v7+/v7+fr4AAAAAAAAANjY2NjY+Pj4+Pn5+vv8/P39/vMrK+Lk5P///97g4N7e3t/f3t7e4ODg4ODg3ODc4ODc4Nzc3ODg4N7g3uDe3t7e3t7e3t7g3t7g4ODg3Nzc3dz19PT049nk5OTk5OTk5OTi5OTk5OTp6eno5eWB7Ozs/////////////////////wD//////////+Xs6urq7Ozt6OTiKyvz8/7+/f39/Pz8/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+fn5+fv7+vr4AAAAAAAAANjY2NjY+Pj4+fn6+/v8/f3+8ysr4uLk///s4ODe3t7f3t7e3uDg3Nzc3Nzc3Nzg3ODc3d3c4ODe4N7g3t7e3t7g4ODg4N7g4ODc4ODg3N319fX09PX08fDx5uTk5OTk5OTk5OTk5OTp6eno5eXt7Ozq6ur/////////////////AP///////+3s6urq7OyB7e3o5OIrK/P+/v39/fz8/Pz7+/v6+vn5+fn5+fn5+fj5+Pn6+/v7+djY2NjY+fv6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT///Lg4N7e3t7e4ODg3Nzc3N3c3dzc4Nzg3fX19PXd3ODg4ODe4N7e4N7e4ODe4ODg3ODg3ODd9fX09PT09fX18fDw8OPu6eTk5OTk5Onp6enp6Ojo5e3t7Ozs6urq7P////////////8A5Fbh7IHs7Ors7Ozs7O3t5eji4isr8/7+/f38/fz8+/v7+vr6+fn5+fn5+fn5+fn5+vr7+/nY2NjY2NjY+fv6+fkAAAAAAAAA2NjY2Pj4+Pn5+fr7/Pz9/v4rK+LiVv/t3t7g4ODe4ODg3Nzd3Nzc3fX13dzg3Nz19fX19fX13dzg4ODg4ODe4ODg4ODg4ODg4ODg3PX19fT09PT19fX19fX19fXu7urs6enk6eTp6enp6Ojl5e3tguzs7Ozq7OyB7IH26eXt9wD19fX19Nrj4+Pj49ra4+Pa2lbiKyvz/v39/fz8/Pz7+/r6+fn5+fn5+fn5+vn5+fn7+/v6+NjY2NjY2NjY+fv6+QAAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMrK+LkK+zd3uDg3ODg4Nzg3fX13d319fX13eDg9fX13fX19fX09d3c3ODc4Nzg4Nzc3Nzg3ODb4Nz19fX19PT09PT19fX19fX19fX13Ovc6+vr5u7q7IHt9unpVuTi4uLi4isrKysr4uLi5FboAP//////////////////////K+IrK/P+/v39/Pz8+/v6+vn5+fn5+fn5+vr6+vr5+vv7+vjY2NjY2NjY2NjY+fn5AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8yvi4uQr8vXb3dzd3dzg3N319fXd9fX09fXc3Nz19d3u9fX19PT03dzg4ODc3N3c3d3d3d3d3dzc9fX19PT09PT09PX09PX19fX19fX13dzc4ODe7P////////////////////////////////8A///////////////////////i4isr8/7+/f38/Pv7+vr5+fn5+fn5+fn5+vr5+vn6+/v52NjY2NjY2NjY2Nj6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7/Pz9/v7zKyvi4ivn9d319d313d319fX19fX19PT09Nzc3PT19fX19PX19fX03Nzg3d313fX19fX19fX19fT09fT09PTx9PT09fTx9PX19fX19fX13d3c297s/////////////////////////////////wD//////////////////////+LiKyvz8/79/fz8+/r6+fn5+fn5+fn5+vr6+/r7+vv8/PnY2NjY2NjY2NjY2Pn6+fgAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMr4uLk/ef19fT09fX19fX09fXd9fX09PT13dzd9fX09fX09PT09PXd4Nz19PT19PT09fX13fX19PT19PT09PT09PT19PH09PT09fX09fX19d3c3uz/////////////////////////////////AP//////////////////////4uLiK/Pz/v39/Pz7+vn5+fn5+fn5+fn6+vv6+/r7+/v8+fjY2NjY2NjY2Nj4+fn4AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8ysr4uLz5/X09PX19fX19fX19fX19fX09PT19fX19PT09PT09PT09PXc3fTx9PH09PT09PT09PT09PT09PT08fT09PX08fHx8fT09PT09fX19e7e7P////////////+GchQ3AAAfU0lEQVT///////////////////8A///////////////////////i4uIr8/P+/vz8+/v6+fn5+fn4+fn5+fr6+vr7+/v7/Pz5+PjY2NjY2NjY2Pj5+fkAAAAAAADY2NjY2Nj4+Pj5+fr7/Pz9/v7zK+Li5OLv9PHx8fHx9PT09PT09PX19fX09Nr09PX19fT09PT09PX19fX19PH08fTx8fH09PT09PT09PT09PTx9PH09PX08fT09PT09PT19fT13d7s/////////////////////////////////wD//////////////////////+Li4isr8/79/fz8+/r5+fn5+Pj5+fn5+fn6+vv7+vz8/Pr4+NjY2NjY2Nj4+fn5+djYAAAAANjY2NjY2Pj4+Pn5+vv8/P3+/vMrK+Li/+ra8fHx8fD09PHx8fT09PT09PTa2ub19fTd9fX19fXd9fXm5ub09PT08fHx8fH09PX09Ob09PT09PHx9PT09fTx9PX09PT09fX19PX12+z/////////////////////////////////AP///////////////////////+TiKyvz/v39/Pz7+vn5+fn4+Pn5+fn5+fr6+vv7/Pz8/Pr4+NjY2NjY+Pn5+fj42NjY2NjY2NjY2NjY+Pj4+fn6+/z8/f7+8yvi4uT/gebw8fHw8PDx8fHx8fT09PT09PTa9PT09PX19d313fXd9ebm5ubZ9fT08fH09fX15ubm5ubm5vT09PTj2trm5vT09eb19fX09fX05t3r6v////////////////////////////////8A8u/n6+vr6+vn7+/y6uzt6Fbk4ivz/v38/Pz8/PP+/v7+/fz6+fn5+fn5+fn6+vr7+/z8+/r42NjY2Pj5+fn5+dj42PjY2NjY2NjY2Pj4+Pn5+fr7/Pz9/v7zKyvi5P//5+Pw8fHx8PDw8PHx9PTx8fH08fT09PT09PT19fX19fXd9fTm5ubm5ub02tnm5ubm5tnZ2ubm5tra2trZ2ebm5ubm5ubm5ubm5ubm3evc/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+QDu9+3l6faB7IHs7Orq7Ozs7IHt5eXo6Ojp6enpVlZWVunp6eriK/v5+fn4+fn6+/v7/Pz8+/r5+fn5+fn5+fj4+Pj4+Pj42NjY2NjY+Pj4+fn5+/v8/P398ysr4uLk///q2uPj4/Hw8PDw8fH08fH08fHx4/T09PT09PT19fX19fX13eb05vTm5ubZ2dra2tra49ra2drZ2dnZ2dnZ2uba2tna5tn05ubm5u7m6+rp6enp6Ojl5e2Bgezs6uzq7OyB7IH26eXtAP/////////////t7Ozq6uzsge3t5ejo6enpVuTk6eTk5OTk6eTp5P35+fj4+Pn6+vv7/Pz8+/v6+vr6+fn5+Pj4+Pj4+PjY2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT//+3u2uPj4/Dw8PDx8fHx8fH08fH08fT09PT09PT09fX13fXd9ebm2dna2dnZ2drZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tnm5ub17u7r8unp6ejo6OXtgYLs7Orq6uz///////////8A////////////////5ezq6uqC7IHl5ejo6enp5OTk5OTk5OTk5OTkVlbk/fj4+Pn6+/v7+/v7+/r6+vr5+fj5+fj4+Pj4+Pj42PjY+Pj4+Pn5+vv8/P39/vMrK+Li5P///+fa4+Pj4/Dw8PHx8fHx8fHx8fTx8fT09PT09PX19fX13fXd9eba2dra2tra2trZ2tna2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ5vT19fXu3efs5Onp6ejl5YHs7Orq6uz//////////////wD//////////////////4Hq6uzs7IHl6OjpVunk5OTk5OTk5OTk5OTk5ORW5Pz4+Pr6+/v7+/v7+vr6+fn5+Pn5+fj4+Pj4+Pj42Pj4+Pj5+fn7+/z8/f7+8ysr4uTi////8tna2uPj8PDw8PDw8fHx8fHj9PT08fT09PT19PX19fXd9fX12tra2tra2tra2tra2tra2tra2dnm5tna2tra2trZ2vT09fX13d3u5+3p6eno5eWBgezs6uqB////////////////AP//////////////////7eHs6uyBge3l6Onp5OTk5OQs4iziLOLkLOTk5OTk6eT8+fr6+/v7+/r6+vn5+fn5+fn5+fj4+Pj4+Pj4+fj4+Pn5+vv7/Pz9/v7zK+Li4v/////t7tna4+Pw8PDx8PDw8fHx8eP09PTx9PT09PX09fX19fX13fX02tra4+Pj2tra2tra2tra2trZ2dra2tra2uPj2tr08fT09PX19e7v7eTp6Ojl7YGB7Ors//////////////////8A////////////////////5fLh7OyB7e324ejp6eTk5OTk5OTi5OLk5OTk5OTkVunk/Pr5+/v7+/v6+/r6+fn5+fn5+fj4+fn5+fn4+Pj4+fn6+/v8/f3+8/Mr4uJW///////n5trj4/Hx8PHx8fHx8PHj8fT09PT09PT09PT19fX19fX19OPj4+Pj4+Pj2uPa2tra2tra2tra4+Pa2trj4+Pa2vHx9PT09fX17vLp6enh9u3tgers//L//////////////////wD///////////////////////Ks4eyB7eXh6elW5OTk5OTk5OTk5OTk5OTk6eTp6enp9vv6+vv7+/v7+/v6+fr5+fn5+fn5+fn5+fn5+fn5+fr7/Pz9/f7zKyvi4uL//////+rm2drj4/Hw8fHx8fDx4+P09PT09PT08fHx8fT09fX19PT04+Pj2uPj4+Pj2tra2tra2trj2ub09ebm49rj4+P09PHx9PH09PXr7Onp6eHl7YHs////////////////////////AP/////////////////////////y9uyB7fbh6Vbk5OTk5OTk5OTk5OTk6eTk6enp6enoVvn6+vv7+/v7+/r6+vr5+fn5+fn5+fn5+fn5+fn6+/v8/P3+/vMr4uLk4v///////+7m2drj4+Pj4/Dx8fDj4+Pj4/Tj9PHx8fHx8fTx9PT04+Pj4+Pj4+Pj4+Pa2tra49rj4/T19fT19e7m4+Pj4/Tx8fHx8Nr09OeBVlbh9u2B7Pb///////////////////////8A///////////////////////////c7eyB7fbh6Vbp5Onp5Onk5Onk6enk6enp6enp6Ono6fz6+/v7+/v7+/r6+vn5+fn5+fn5+fn5+fn5+vv7/Pz9/f7zKyvi4uT/////////5+bZ2ePj4/Hj4+P02uPj4+Px4+Pj4+Px8fHw8PDw8fHx4+Pj4+Pj49ra2dra2trj4/Tm9fX09PX09fX04+Pj9PHx8fHj9PH03+lW4fbtgezl8v///////////////////////wD////////////////////////////g7eqB7e3h6VbpVuTp6enp6enp5Onp6enp6ejp6Ojo5fv6+/v7+/v6+vr6+fn5+fn5+fn5+fr6+fr7+/z8/P3+/vMrK+Li///////////q5tnZ2drj4+Pj8Nr04+Px4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj8ePj2tra2uPj4+Pa9fX09PT09PTa9OPj4+Pj8fH09PTj8e7s6fbt7YHs7fL/////////////////////////AP/////////////////////////////bgeqBge3h4enp6Vbp6enp6enp6enp6eno6ejo6Ojl7fr6+vv7+/v7+vr6+vr6+vr6+vr6+vr6+/v8/Pz9/f7z8yvi4lb////////////u5tnZ2dna4+Pj9OPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Px4+Pj2trj4+Pj4+Pa2ub02vTa9OPj4+Pj4+Pj4+Pj4+bm2tra5/bh7YGB6oHy//////////////////////////8A///////////////////////////////bgezsge324eHp6enp6enp6eno6ejp6Ojo6Ojo5eXlgfr6+/v7+/r7+vr6+vr6+vr6+vr6+vv7+/z8/f3+/vMrK+Li4v////////////Lm5tnZ2tna2tra4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj8ePj4/Ta2uPj2tra4+Pj4+Pj9Nrm5u7y9u2B7OqB8v///////////////////////////wD////////////////////////////////f8uzsge329uHh6enp6Ojo6Ojo6Ojo6Ojo5eXl5eXt7Pv6+vv7+/v6+vv6+/r6+/v7+/v7+/v8/Pz9/f7zKyvi4lb//////////////+7m2dnZ2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj2tra4+Pj2uPj49rZ5ubu5+3tgezs6vL/////////////////////////////AP///////////////////////////////9/s8uzsge3l9vbh9uHh4ejo6OXl6OXl5eXl5e3t7e3t7Pv6+/v7+vv7+/v7+/v7+/v7+/v8/Pz8/f3+8/MrK+JW4v//////////////8ubm2dnZ2tra2tra2trj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj2uPj49ra2trj4+Pj4+Pj4+Pa2tra2dnZ2dnZ2ebm7uvf7YHs7PLs7P////////////////////////////8A/////////////////////////////////9zq6ursgYHt5eX29vb29uXl9uXt5eXl5eXl5e3tgu2B7Pv6+/v7+/v7+/v7+/v8+/z8/Pz8/P39/v7zKyvi4uT/////////////////6+bZ2dna2tra2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pa2tra2uPj4+Pa4+Pa2tnZ2dnZ2dnZ2dnZ5ubm5+yB7Ozy7PL//////////////////////////////wD//////////////////////////////////9/f6uzs7IHt7eXl5eXl5e3t7e3t7e3t7e3t7e3tgYLs7Pv7+/v7+/v7/Pz8/Pz8/Pz8/Pz9/f7+8ysr4uJW4v/////////////////q7ubZ2dnZ2tra2tra2tra2tra2trj4+Pj49ra49ra2uPj4+Pa2uPj4+Pj4+Pj2tra2tnm2dnZ2dnZ2drZ2dnm5uvf7Ozq6vLy////////////////////////////////AP//////////////////////////////////8urf6uzs7Ozt7e3t7e3t7e3t7YGBgYGBgoGCgYKB7Ozs6vv7+/v8/Pz8/Pz8/Pz8/Pz9/f3+/vPzKyvi5OL////////////////////v5ubZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2uPj4+Pj4+Pj49ra2trZ2dnZ2dnZ2tnZ2dnZ2dnZ5ubu7+zs7Orf7IH///////////////////////////////8A////////////////////////////////////3/Ly6urs7IGB7e3t7e3t7YGBgoGC7OyB7IHs7OyC7Ozs6vv7/Pz8/Pz8/fz9/P39/f39/v7z8ysr4uLk///////////////////////r5ubZ2drZ2dnZ2tra2tra2dra2tra2tra2tra2tra2tra2tra2tna2dnZ2dnZ2dra2trZ2dnZ2dnZ2dnm7ufq6uzq3+zq/////////////////////////////////wD/////////////////////////////////////3t/y6urs7OyBgYGBgYGBgYHsgYHs7OyC7Ozs7Ozsgurq7Pz8/Pz8/f39/f39/f39/v7+8/MrK+LiVv/////////////////////////u5tnZ2dra2tra2tra2tra2tra2tra2dra2tra2tra2tnZ2dra2dnZ2dnZ2tra2tnZ2dnZ2dnZ2dnZ5u7n5+zs8vLf8v//////////////////////////////////AP/////////////////////////////////////e8t/y6urq6uzs7OzsgYHsgezs7Ozq6uzs6oLq6urqgurq6vz8/f39/f39/v7+/v7+/vMrKyvi4v///////////////////////////+rm5tnZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2drZ2tra2tra2tra2trZ2dnZ2dnZ2dnm2ebu79vq6ury3+rs//////////////////////////////////8A///////////////////////////////////////c39/y6urq6uzsgezs7OyB7Ozs6urq6urq6uqC6urq6urq/f39/f39/v7+/v7z8/MrKysr4uL///////////////////////////////Lm5tnZ2dna2tra2tra2tra2tra2tra2tnZ2dna2dnZ2dra2tra2tra2trZ2dna2drZ2dnZ2ebu7uvc6urq8t/q8v///////////////////////////////////wD////////////////////////////////////////c39/f8urq6urs7Ozs7OyB7Orq6vLy7+/v7+/v7+/v7+/v9vz8/f3+8/PzK/MrKysr4uLi/////////////////////////////////+/m5tnZ2dnZ2trZ2tra2tra2dna2tnZ2tra2tra2tra2tra2tna2tnZ2drZ2dna2dnZ2ebm5uvr3Ory8vLe6vL/////////////////////////////////////AP/////////////////////////////////////////b39/y8vLy6uzs7Ors7Ozs7Orv7/Ly7+/v7+/v7+/v7+/v8vz8/vPzKysrK+Ir4uLi4v///////////////////////////////////+/m5tnZ2dna2tra2tra2tra2tra2dna2tra2tra2tra2dnZ2dnZ2drZ2tna2tnZ2dnm5u7r7tzy8vLy3vLq//////////////////////////////////////8A///////////////////////////////////////////c397f8vLy6urq6vLq6u3k4uTh9+vn5+/v7+/v7+/v7+/v/P3zKysrK+Li4uLi4lb///////////////////////////////////////Lu5tnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnm5ubu5+7c8vLy397y6v///////////////////////////////////////wD////////////////////////////////////////////c3Nve3/Ly8ury8vLy7Svz8yvk5PLu6+vn5+vr6+vr6+frKysr4uLi4uLi5Fb//////////////////////////////////////////+/u5tnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ5ubm7ufu3PLy397b4PL/////////////////////////////////////////AP/////////////////////////////////////////////03ODe3t/y8vLy8vLqVvMrK/Pz5Fbv9PTu7uvu7u7u7uvu4uLi4uTk5FZW//////////////////////////////////////////////Ln5ubZ2dnZ2trZ2dra2trZ2dra2tra2dra2tra2tnZ2dnZ2dnZ2dnZ5ubm7u7u9dzy39/e4N/c7P////////////////////////////////////////8A///////////////////////////////////////////////f3Nzg29/f3/Ly79/q9uLz8yvz8+RWgfHw5ubm5ubm7u7u4uTk5FZW/////////////////////////////////////////////////+rv7ubm5tnZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2tra2trZ2drZ2dnZ2ebm5u7r7t3f39/b4Nzb3////////////////////////////////////////////wD////////////////////////////////////////////////f3N3c3Nve3t/y39/f6oH2VuLz8/Pi6eHw8OPm5ubm7ubuVlZWVv/////////////////////////////////////////////////////g5+7m5tnZ2dnZ2dnZ2dnZ2dnZ2tra2trZ2dna2dnZ2dnZ2ebm5ubu7u7d3t7b3Nzd3N//////////////////////////////////////////////AP/////////////////////////////////////////////////f3N3d3Nzc297f397e3N7q7IHtViv+81bp5/Dw5ubm5ubu6v/////////////////////////////////////////////////////////y3Ofm5tnm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ5ubm5ubu5+713tvc3Nzd3dzf//////////////////////////////////////////////8A///////////////////////////////////////////////////s3d3d3d3d3Nzg29vb29zc3eDy7IGB7e324en08Obm5ubm6///////////////////////////////////////////////////////////8uvr7ubm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnm5ubm5ubu5+713dzc3d3d3dzd8v///////////////////////////////////////////////wD/////////////////////////////////////////////////////3/Xd9N3d3d3c3Nzc4Nvb2+Dd3d3d3eztgd3h9Nrw5ubu7v///////////////////////////////////////////////////////////9/n6+7m5ubm2dnZ2dnZ2dnZ2dnZ5ubm5ubm7u7r7t303d3d3d3d9N303///////////////////////////////////////////////////AP///////////////////////////////////////////////////////9/d3fTd9d3d3d3c3Nzc3Nzg4ODb3N3d2+Xc3ena5tnm5v/////////////////////////////////////////////////////////////y2+fr7u7m5ubm5ubm5ubm5u7m7u7u6+fu3fT09d3d3d3d9N3d3/////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////f4PTx9PT03d313d3d3d3d3Nzc3Nzb3dvb9tz15trZ2uv//////////////////////////////////////////////////////////////93d9+fr6+vr7u7u6+vr6+v19OPd9PT03d3d9PT08fTc8v///////////////////////////////////////////////////////wD////////////////////////////////////////////////////////////////e3N3x9PT09PX03d313d3d3Nzg3t7d29vg3O718vT///////////////////////////////////////////////////////////T08vXd3d3d3fH08fHx8fHx9PX09PT19PT09PHd3N7t////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////+B3uDd3fX09PTd3d3d3d3d3dzc4ODg3N319PX19d3f39/f/////////////////////////////+Xtgezs6vLy8urs9PT09PT03dys8vLq8t736+vr6+719PTd9N3d4OCB//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////////////////////////9u3t7dze3d3c8t3d29/f8t703dze3ODd3d3d3dzc34Hs6vLf29zc3Nzb39zh7YHq8t/b8vLy8t/e3Nzc3t/p6enh4YHh4eHs8vLf8t7f3t7f8vLy8uzsgYHt9v///////////////////////////////////////////////////////////////////5cpK5EsZ8r3AAAAAElFTkSuQmCC");
tail j=7074 line= kb_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAABRCAMAAAB7eHFAAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAyMjc2NjpCQkZJSUxUVFc8PD6Dg4YmJywrLDEtLjMvMDUpLDQsLzd9f4UoKi9wcnclKzcjJCYvMik1OC8jKBYUGQYSFgYYHQkZHgoVGQkQEwcbIA0eIxAqLSEYGg8KCgYPDwoiIh8bGhUUEw8gHxseHBgYFhMAAAD3jX3ZAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGvBJREFUeNoB5Roa5QD///////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////d/d2ebh4eDg////////////////////////////////////////////////////AP////////////////////////////////////////ys29rd2dis2KzZ2dnd2trd2Nna/////////////////////////////////////////////wD////////////////////////////////////qrNrZ4N/f39/f5ubm5ubm4ODg4djZ3dvZ2v////////////////////////////////////////8A/////////////////////////////////9zb2ODp39/f3+Dg5ubm5ubm5ubg4ODg4OHi2Nnb2dv/////////////////////////////////////AP//////////////////////////////6qys5uDm4ODg4ODg4ODg4ODm5ubm4ODg4ODg4OHi2Nnd293//////////////////////////////////wD////////////////////////////q6tnh4eHh4eDh4eDg4OHh4eHh4eHg4eHh4ODh4eDg4ODh2Njd293///////////////////////////////8A/////////////////////////+vq3eLh4uHh4eLi4uLi4uLi4tji4uLi4uLi4eLi4tjY4uLi4uLi4tnd3dz/////////////////////////////AP///////////////////////+rbrOHh4ODg4eLY2NjY2NjY2NjY2NjY2OLi4uLi4tjY2NjY2NjY2NjY2dnb2v///////////////////////////wD//////////////////////+rd4eDg4ODi2NjY2NnZ2NjY2NjZ3d3d3djk4uLi4uLi4eLi4tjY2NjY2NjY2d3a//////////////////////////8A/////////////////////9nY4Obg4OLY2NnZ2dnZ2dnY2Nvn3t7e3uXe5efc2tjj4+Ph4eLi4uLi4uLZ2djZ2dvb////////////////////////AP///////////////////9vh5ubh4tjZ2dnZ3d3d3dnZ2oHe3t7e3t7e3uXl5eXl59ro5OLi4uHh4uLi4tnZ2dnZ2tr//////////////////////wD//////////////////93m5uDi2NnZ2NjZ2d3d2dnZ3OXe3t7e3t7e5d7l5eXl5eXlgdno4eHg4OHh4uLY2dnZ2dnd3f////////////////////8A/////////////////93g4OHY2dnZ2d3d2d3Z2d3d2ufe3t7e3t7e3t7e3uXl5eXl5eXn2ujj4+Pg4+Dh4tjZ2djZ2d3a////////////////////AP///////////////93i2NjZ2d3d3d3d3d3d3d3d3drn3t7e3t7e3t7e5d7l5eXl5eXl5YHk6OHh4eDj4+Pj5NjZ2NnZ3dr//////////////////wD//////////////9vZ2dnd3d3d3d3d3d3d3d3d3d3d3OXe3t7e3uXe3uXl5eXl5eXl5eWB2ePh4eHg4+Pj6Ojj5NjY2Nnd3P////////////////8A/////////////9/d3dnd3d3d3d3d3d3d3d3d3d3Z2d3b3NzcgYGBgeeB5+fn5eXl5+eB3OTk4eHh4ePg4+Pk4+Po5Njk2Nnb////////////////AP/////////////d3d3d3d3Z2dnZ2d3d3d3d2dnZ2azY4uHh4Obj5OHj5OHY3dra2tra2uTY4uHh4eDh4eHg4eHk4+jk5OTk2Nv//////////////wD////////////a3d3d3dnZ2NjYrNis2dnYrNjYrOLh4ODg4ODg4eHh4eDg4ODg4OHg4ODh4uHh4eHg4ODg4ODh4ePj6Ojo6Ojk3P////////////8A///////////b3d3Z2dnY4uHg4ODg4eHg4ODm4ODg4ODg4eHh4eLi4uHh4eHh4eHg4ODg4OHh4ODg4eDg4ODg4OPg4+Pj5Ojo6Nn/////////////AP//////////3dnY2Nji4Obf39/f39/f39/m4ODg4eHi2NjY4uHh4eDh4eLi4eLi4uHg4ODg4ODg5uDm5uPg4OHg4+Pm4+Pj6Ojk2v///////////wD/////////2tji4eDm39/f3+bg4ODg4OHirNji4uLY2NnZ2dji4uLi4uLY2Nji4uLh4eHg4ODm5ubm5ubm4+Pg4OPj4+Pj6Ojo5N3///////////8A/////////djg5t/f3+bg4eLYrKysrKzZ2Nji4uLY2KzYrOLi4uLh4uLi4tjY2Nji2NjY4eHg4ODm5ubm4+bj4+Pj6Ojo6Ojo5OTZ2v//////////AP///////93g39/f5uDY2ays4Pn9/fz54OLh4eHi4uLi4eHg4ODg4Obm4ODg4eLi4tjYrNnY4uHg4ODg4+Pj4+Pm5uPj6Ojk6OTY2d3//////////wD////////h39/f4OLY2OHf/Pr6+vr+/vng4ODh4eHg4ODm5ubg4Obm5ubm5ubm5uDg4eLi2Nji4uHh4eDg4+bj4+Pj4+Pj5OTk5Njd2/////////8A///////a5t/f5uDh4N/9+v7++v7++/796ebg4ODg5ubm5ubj4+jj4+Pg4ODg5ubf3+bm4OHh4eHh4eHh4OPj4+Pj4+Pj4+Ph5OTk2N3/////////AP//////2Obm4ODg3/n6+v7+/f77/v7++vrp39/f39/f3+bj4+Pj6OTk4uLk4uTj4+Pj5ubm5ubg4ODg4OPg4eTi5OTj4+Pj4+Hk5OTZ2////////wD//////ODf39/f3/n6/v7++vr7/v7+/v7++unf39/f39/m5uPj4+Pj5OTk5OTk4+Po6Ojo4+bm5ubg4ODh4djZ2dnZ2OTk4+Pk5OPk2Nr///////8A/////93f39/f6fn9+v7+/v7+/v7+/v77+/7p39/f39/f5uDg4+Pj4+Dj4+Pj4+Pj4+jo4+Pk4+Pj4+Hi4tjZ2dnZ2dnZ2NjY5OTk4+TZ////////AP/////Y3+np6en9/fr+/v7++/7+/v7+/vv76d/f3+bm4ODh4eHi4eDj4eTk5OTj4+Pk4+Pg4eHj4+Dh4uLY2djZ2NjZ2dnZ2djY5OPj2N3//////wD////65unp6en8/fr+/v7++/v7+/j7+/v7+ebm4Obg2dnZ2djY2OLi2Nji4uHk4eHg4+bm5ubg4ODg4OHh4tjY2NjY2NnZ2dnZ2OTj4+Pa//////8A////2t/p6en8+v36/v76/vv4+Pj4+Pj76eDg5ubg4NjZ2OLi4uLi4uLi4uLh4eHh4OPm5ubm5ubm5ubm4ODh4eHh4eLY2NjZ2dni5Obj2f//////AP///9nf6fnp/v7+/vv+/vv39/f4+/7+/N/53+bm5uDm4ODh4eHh4eHg4eLi4eHh4ODg5ubm39/f5ubf39/m5ubm4ODg4eLi2NnY2OTj5uTa/////wD////Y3+np6fr7/vv7+/j31/f7+v39+vr9/fnf5ubm5ubm4ODg4ODg4ODh4uLh4ODg4ODm3/z83+bm39/f39/f39/f5uDh4eLi2OLi4ePj3f////8A////4t/p6d/6+/v4+/j49/f7/f39+v76+v386ebm5ubm5uDg4ODg4ODg4ODg4ODg4Obf+f39/fzp5ubf3+np6enf39/f5uDg4eHi5OHj49jc////AP///+Hm5t/f6en8/Pr6/fz9/f39+vr+/vr9/f3f5uDg4Obg4ODg4ODg4ODg5ubm5t/5/fz9/fz8/enm39/5/Pz539/p+d/m5uDg4OPj4+Hg3P///wD///ng4ODm39/p/P39/fz9/fr9/f7+/v7++v39/Ong4Obm5t/f39/m5ubm5ubm3+n9+vz8/Pz5/P3839/p/f36/fzp+fz53+bm5ubm5ubh+d3///8A///f4eDg5t/5/Pz8/f39/fr++v3+/v7+/v76/f396d/5/On5/Pz56fnp6d/m5t/8+vr6/f38+fz8/d/f6fr6+vr9/P39/fnf39/p+en54Pms3P//AP//5uLg3/n8/f39/P38/fr++/79/v7++/v+/v39+vr9/Pz8/Pz9/f38+fzp5ubp/fr9/f36/fz9/frp5un6+v76+v38/P39/Pn5/fz9/fz99dz//wD//+Di6fz8/P36+vr6+vv++/v+/f7+/vv+/v7++vr6/fz8/f36+vr6+vr++t/f6fr6/v76+v39/f36+d/5+v7++v38/Pz9+vr9/fz8+vr6/PX///8A///f4vn9+v39+vr6+v77+/v7+vr+/vv7/v7+/v7+/vr6+vr6/v77+/v7+/7p6fn6/v7+/v76+v76/f38/fr6+v39/f39/f39+vr9+vr7/v31////AP//rKz5/fr9/fr6+vr+/vv7+/r6/v77+/7+/v7++v7++vv++/v7+/v7+/v+/fz6+vr6+v76/vr6+vr69vb29vr9+v36+v7++vr++Pv7+/j+9f///wD//93h/P3++v36+vr6+vr++/b9+vb7+/v+/vr6+vr6+vr6/vv4+Pv7/v729vr0+v38/P38/P39/P36+vb29vr++vr6/v77+Pv++/f4+Pj49vX///8A///f9fn99vr9+vr6/fT6+vb0+u/29vv79vb6+vPz8/P9/f36+/Ly+vb6+vr09P38/Pz8/Pz9+vr6+v729vb++/77+v77+Pj4+Pf3+Pj48vT1////AP///vXs9PT09PT09PTz8/Pz+vPz8PD29vbz9PPz8/P29PP69PP29vT69PT0+v38/Pz8/Pz9/fr+/v7+/vb7+/v7+/77+Pj39/f3+PLy8vbs/////wD///f17Pz0/fT0+vPz8/Pz8/Pz8/Pz8/Pz8/Pz8O/v8PDw8PPz8/P09PPz8/38/Pn8/fz9/fr+/v7+/vv2+/j7+/j4+/j49/f39/Ly8vHw9f////8A///+9ez8/PT98/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Dw8PPw8PDw8PPz8/Pz8/r8/Pn8/f39+vr6/v7+/vv7+/L4+/v7+Pj4+Pf39/jx7vL29PX/////AP//9+r5+fz9/frz8/Dw8PDw8PPz8/Pz8/Pw8/Pw8PDw8PDw8PDw8PDw8PP9/Pz8/P39/fr6/v7+/vv7+/7y+Pv4+Pj4+Pj39/fy8fHx8PX//////wD////r+fn5/f36+vbw8PDv7+/w8PPz8/Pz8PDv8O/v7+/v7+/v7+/v8PD2/fz5/Pz8/f39/f7+/v77/v728vj7+/j4+Pf39/f37vHx8fPr//////8A////6vn8/P36+v779u/v8fHx7+/v8PDw8PDw7+/v7+/v7+/t7e3t7e3v9vr8/Pz8/fz6+v36/v7++/76+u7y+Pj4+Pf3+Pf39+7x8fPs9f//////AP////31/Pr6/v7++/v28e3t8e/v8PHx8e/w8O/v7+/x7+3v7e3t7e3t8fH6/fz9/f39/fr+/v7+/v7++vr78vL3+Pj4+Pj39/Lu8e/09f///////wD////39f36+/v++/v79vHt8e/x8/39+v3x8fHv7+/w7+/v8fHt7e3t7e3x9vr6/fz6+v77+Pv7+/7+/v7+8e7y8vLy8vLy9/Lu8fHz9Ov///////8A/////+r++/b3+Pv4+/bx8e7x+vn9/fr9/fbx7fHx7+/v7/Hx7e3t7e3t7vHx+/77+/v4+Pj4+/v79vHx7vLu7vLy8vLy8u7u7fHz8+z1////////AP/////q+vvx8vj4+Pv77vHx9v39+v36+vr9+vHx8fHx7/bz7+/t7u7u7e3u8vLy9/f39/Ly8vLy7u7y7u7u7vH2/vLy7u7u7fHw8/T1/////////wD/////9/ny+/b6+/Ly7u7u8fHx9vH29vr69v399u7u7fHv7+/v8e7y7u7u7u7u8vHx8e7u7u7t7e7t7u7u8u7x+/by8u7u8e/z8/P06/////////8A///////q9vD28/rx7vHt7vLu7u7u7vH29vb29vbv7+3u7u7u8fb28e7u7u7t8fHx8fHt7fHu7u7x7e3t7fHx7u728fHx7/Dz8/Pz9f//////////AP//////+/X08/D28e7u8e3t7+/v8fH29vHt7u7u7u7t8fHx7fHv8PDv8e3t7e3t7u3t7u7u7u3t7e3u7e3t7e3x7+/v7/Dw8PDz9Ov//////////wD////////q7Oz08/Px8fHv8e3x7+/v7fHx7e3t7e7u7u3t8fHx8fHt7e3t7e3t7fHu7u3t7e3t7e7u7u7u7e3x7+/v7+/w8PPz9Oz8//////////8A////////+/Xs9PTz8/Pz8/Pw7+/v8e3t7e3t7e3t8fHv7+/x8fHx8e3t7e3t7fHx7u3t7e7u7u7u7u3t7fHv7+/v7/Dw8PPz8/Tr////////////AP/////////q7PT08/Pz8/Pz8/Pz8/Pv7/Ht7e3t7e3v9vDx7/Hx8fHx7e3t7e3t7u7u7e3t7e3t7e3v7/Dw8PDw8O/w8PDz8/T1/////////////wD/////////9/X09PPz8PDz8/Pz8/Pz8/Pw8PDv7e3t7e7t7fHv7/Ht7fHv8e3t7e3t7e3t7e3v7+/v7+/v8PDw7+/v8PPz8/Ts6/////////////8A///////////r7PT08/Pw8/Pz8/Pw8PDz8/Pz8O/w7/Hx8e3t7u3t7e3v7+/v7+/x7+3t7e3v7+/v7/Dw7/Dw8PDw8PDz8/T06v//////////////AP///////////+rs9PPz8/Pw8PPz8/Dv7/Dz8/Pz8/Pw8PDw8O/v7+/v7+/v7/Dw8PDw8O/w7+/w8O/v8O/w8/Pz8PDw8/P09f///////////////wD/////////////6uz08/Pw8PPz9vPz8/P27+/w8/Pz8/Dz8PPz8/Dw8O/w7+/w8PDw8PDw8O/v7+/v7+/v7/Dw8PDz8/P07Pn///////////////8A///////////////r7PTz9PPz8/Pz8/Pz8/bx8e/w8PDz8PDz8PDz8/Dz8/Pw8O/v8PDv8PDv7+/v7+/w7+/w8PDw8/P07Ov/////////////////AP//////////////9+r19PPz8/Dw8PDw8PDz8+/v7/Dv7/Dw7+/w8PDw8PDw8PDw8PDw8PDv7+/v7+/v7+/w8PDw8PPz9Or//////////////////wD////////////////39fXs9PTz8/Dw8PDw8+/w8PDv7/Dv7+/v7+/v7+/v7+/w8PDw8PDw8O/v7+/w8PDw8PDz8/Pz9Or///////////////////8A//////////////////f19ez08/Pz8PDv7/Dw8PDw8PDz8PDw8O/v7+/v8O/v7/Dw7+/v7+/v7+/v8O/v8PDz8PP07Or/////////////////////AP//////////////////1/nq7Oz09PPz8PDw7+/v8PDv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7/Dw8PPz8PP07Ov//////////////////////wD/////////////////////+ers9PT08/Pw8/Pz8/Dw8PDw7+/v7+/v7+/v8O/v7/Dv7+/w8O/v7+/v8PPw8/P09er///////////////////////8A///////////////////////+9fXs9PTz8/Pz8/Pz8/Dw8/Pw8PDw7/Dw8PDv7+/w8O/w8O/w8O/v8PDw8/Ts6t//////////////////////////AP////////////////////////j86uz09PPz8PPz8O/w8O/w7+/v8PPw8PDw8O/v8PDw8PDw8PDw8PP09PT16+b//////////////////////////wD///////////////////////////ns9fT09PTz8/Pz8/Pw8PDw8PDv7+/w8PDw8PDw8PDw8PDz8/P09Ozq6eH///////////////////////////8A////////////////////////////+/nq7PT08/P08/Pz8/Dw8/Dz8PDw8/Pz8PDw8PDw8/Pz8/P07Orp6f//////////////////////////////AP/////////////////////////////4+/nq9ez09PTz9PPz8/Pw8PDw8PDz8/Dz8PDz8/Dz8/Ts9fXp/////////////////////////////////wD////////////////////////////////4+/ns6vXs9PT09PTz8/Pz8/Pz8/Pz8/Pz8/T09Oz16+D///////////////////////////////////8A//////////////////////////////////////787Or19ezs7PT09PT09PT09PT09Ozs6urf3///////////////////////////////////////AP////////////////////////////////////////j+/Pb7/PX19fX19fX19fX16urq6f37/////////////////////////////////////////wD/////////////////////////////////////////////+vr78vj4+/v7+/v9/Pnp/Pr///////////////////////////////////////////8A//////////////////////////////////////////////////X19fX19azd3Nz/////////////////////////////////////////////////AP////////////////////////////////////////////////////f39+np+fn8//////////////////////////////////////////////////1fE+3PNdRKAAAAAElFTkSuQmCC");
tail j=7075 line= kw_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAABRCAMAAAB2ZgEHAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD+/v79/f38/Pz7+/v6+vr5+fn4+Pj39/f29vb19fX09PTz8/P8+/z5+vl/f379/fz6+vn39/b29vX19fT09PN0c3P6+fn49/f29fX5+fny8vLw8PDv7+/t7e3p6enj4+Pc3NzU1NTAwMC1tbWoqKiVlZWQkJAAAABtqN+JAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGk5JREFUeNoBQxq85QD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////7+/v7+/v7+/v7+/v////////////////////////////////////////////////8A/////////////////////////////////////////v79/f1WVlZWVlZWVlZWVlb9/f7+/////////////////////////////////////////wD///////////////////////////////////7+/VZWVvxW/Pz8/Pz8/Pz8/Pz8VvxWVlZW/f7/////////////////////////////////////AP/////////////////////////////////9/VZW/Pz8/Pz7/Pv7+/v7+/v7/Pv8/Pz8/PxWVlb9/v////////////////////////////////8A///////////////////////////////9Vlb8/Pz8+/v7+/v7+vor+iv6+vr6+/v7+/v8/Pz8VlZW/f7//////////////////////////////wD////////////////////////////9Vlb8/Pz7+/v7+/r49fX19fX19fT09fX19iv6+/r7+/v7/PxWVv3/////////////////////////////AP/////////////////////////9Vlb8/Pz7+/v6+iv28/Lj4+Pj4uLi4uLj4+Py9PX4K/r6+/v7/Pz8Vlb9//////////////////////////8A/////////////////////////Vb8/Pz7+/r6+isr9ePi4uHh4eHg4ODg4OHh4eHi4vL1+Cv6+vr7+/z8/FZW/////////////////////////wD//////////////////////1ZW/Pz7+/r6+isrK/fi4eDg39/f39/f39/f39/f4ODg4eHy9vgr+vr6+/v8/FZW/f//////////////////////AP////////////////////1W/Pz7+/v6+isr+fn49/Lg3t7e3d3d3d3d3d3d3d7e3t7e3+Dy9vkrK/r6+vv7/PxW/f////////////////////8A///////////////////9Vvz8+/v6+isr+fn4+Pj39vX19fX19PT09PT09PT09fX09PPy8vP2+Pn5Kyv6+vv7/PxW/f///////////////////wD//////////////////Vb8/Pv7+isr+fn4+Pf39/b29vX19fX09PT08/T09PT09fX19fb29vf3+Pj5+Ssr+vr7/PxWVv//////////////////AP////////////////1W/Pz7+vorK/n5+Pj39/b29fX19PPy8vLy4+Pj4/Ly8vLy8/T09fX29vf3+Pj4+Ssr+vr7+/xWVv////////////////8A///////////////9Vvz8+/r6Kyv5+Pj39/b29fT08vLy4+Li4eHh4eHh4eHi4uLj8vLz9PT19vb39/j4+fkr+vr7+/xW/f3//////////////wD//////////////1b8/Pv6+iv5+fj49/b29fTz8vLj4uHh4ODe3t/f39/e3t/g4OHh4uPy8vP09fb29/j4+fkr+vr7+/xW/eb/////////////AP////////////9W/Pz7+vor+fn49/f29vX08vLi4eDg3t/e3t3d3d3d3d3d3d7e397g4eHi8vL09fX29/f4+Pkr+vr7/PxW/f////////////8A////////////Vvz8+/r6K/n5+Pf39vX08/Lj4d/e3t7d3dzc3Nvb29vb29vc3Nzd3d7f39/h4/Lz9fX29vf4+fkr+vr7/PxWVub//////////wD//////////1ZW/Pv6+isr+Pj39vb19PLj4uHf3t3d3Nzb29vb29ra2trb29vb29vc3N3e3t/h4uPy9PX29/f4+Pkr+vr7/PxWVv//////////AP//////////Vvz7+/or+fn49/b29fTy4+Hg397d3Nvb29ra2tra2tra2tra2tra29vb3Nzd3t/g4ePy9PX29vf4+fkr+vv7/Fb97f////////8A/////////1b8/Pv6Kyv5+Pf39vXz8uLh397d3Nvb29ra2tra2tnZ2dnZ2dra2tra2trb29zc3d7f4ePy9PX29/f4+Ssr+vv7/FZW/////////wD/////////Vvz7+vor+fj39/b18/Li4N/e3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dra2trb29vc3d7f4OLy9PX29/j4+Ssr+vv8/P3t////////AP///////1b8+/v6K/n4+Pf29fTy4uDf3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3d3f4OPz9fb29/j4Kyv6+/v8Vlb///////8A/////////Pz7+isr+fj39vX08uLg393c29va2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3uDg4vL09fb39/j5Kyv6+/z8Vu3//////wD//////1b8+/v6K/n49/b29fLj4N/d3Nvb2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3eDi8vP19vb3+Pj5K/r6+/z8Vv//////AP//////Vvz7+isr+Pj39vXz4+Hf3dzb29ra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dna2tvb3Nzd3t/i8/X29/f3+PkrK/r7+/xW5v////8A///////8+/v6K/n49/b19PLi397c3Nva2trZ2dnZ2dnZ2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra29vc3N3e3+Hi8/X29/f4+fkrK/r7/Pz8/////wD/////Vvz7+isr+Pj39vXy4+De3dzb2tra2dnZ2dnZ2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2trb29zc3N3f4OHy9Pb29/j4+fkr+vr7/Fb/////AP/////8/Pv6K/n49/b19PLh393c29va2tnZ2dnZ2djY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2trb3Nzc3d7f4ePy9Pb39/j4+Ssr+vv7/P////8A//////z7+/or+fj39vXy4uDe3dzb2trZ2dnZ2dnY2NjY2NjYAAAAAAAAAADY2dnZ2dnZ2trb29zd3+Dg4eHg4uP09vb39/j4+Ssr+vv8/v///wD///9W/Pv6Kyv4+Pf29fLh393c29va2tnZ2dnZ2NjY2NjY2ADc3Nzb29zc3N3Y2dnZ2dra2tvb3d3f4ODg4uPy9PX29vb3+Pj5+Sv6+vv7////AP///1b8+/or+fj39vXz4+De3dzb2trZ2dnZ2djY2NjY2NgA3N7p39/f3+Dq39zY2dna2tra3Nvd3d/f4ODh4/Lz9PX29vf39/j5+Sv6+vv///8A/////Pz7+iv5+Pf29fLi4N7c29va2tnZ2dnZ2NjY2NjYANvg3uPs7Ozs4/Lf4dzZ2dra29rb3Nze3t/g4eLj8vL09PX19vf3+Pj5+Sv6+////wD////8+/srK/n49/b08uHf3dzb2trZ2dnZ2djY2NjY2ADb6eDh8t3d3d3d8uPr4dza2trb3Nvd3N3e3t/f4OHi8vL09fX29vf3+Pj5K/r7+v//AP////z7+isr+Pj29fTy4d/d3Nva2tnZ2dnZ2NjY2NjY293f4OLd2dnZ2dne4uLi39zb3Nvd3Nzd3d3d3t7f4OHj8vP09fX29vf4+fkr+vv6//8A/////Pv7Kyv49/b18+Pg3t3c29ra2dnZ2djY2NjY2Nje3uDh3NnZ2dnZ2dne4uLg39zd3N7e3t3e3t3e3t/g4OHi8vP09fb29vf4+Sv6+vv//wD////8+/or+fj39/Xz4+De3dvb2tnZ2dnZ2NjY2NjY2N3p8NzZ2dnZ2dnZ2drf4+zh3t3e3t/e3t7e3d3d3d7f4OHj8vP09fb29/j5Kyv6+///AP////z7+isr+Pf29fPi4N7c29va2dnZ2dnY2NjY2NgA3N3e2dnZ2dnZ2dnZ2dvf4+Lf3t/g39/f3t7d3t7e3d7f4OHj8vT19vf3+Pkr+vr7//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2djY2NjY2Nve3+/Z2dnZ2dnZ2dnZ2dzi4uDe397f4N7e3t3d3d3e3d7f4OLj8vT29/j4+Sv6+/v//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2NjY2NjY297f3tnZ2dnZ2dnZ2dnZ3PLy4uDh3+Lg39/e3d3c3N3d3d3f4OLy9Pb39/j5K/r7/P//AP////z7+iv5+Pf29fLi4N7c29ra2dnZ2dnY2NjY2NjY29zd2tnZ2dnZ2dnZ2drc8vLy4+Dh4OHf4N7d3Nzc3N3d3d3f4fL09vf4+Csr+vv8//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2dnY2NjY2Njc3d3b2dnZ2dnZ2dna2tzy8vLi4eHg4N/f3t3c3Nvc3Nzd3eDi8vT19/j5Kyv7+/z//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2djY2NjZ2dzd3d3b2dnZ2dnZ2dra4PTz8uDh4eDf3t7d3dzc29vc3Nzd4OLy9fb39/kr+vr8/P//AP////z7+iv5+Pf29fPi4N7d29va2dnZ2dnZ2dnZ2dnZ29vl3dzb2dnZ2dna2uDy9PLz4eHg39/e3dzd3dzb29zc3N7g4vL19vf4+Sv6+/z///8A/////Pv6K/n49/b19OPg3t3c29ra2dnZ2dnZ2dna2drZ3N3o7tzb2dnZ2eTg8vPz8uLg4N/e3d3c3Nzc3Nzb3N3c3uHy8/T29/j5K/r7/P///wD////8+/r6+fj49vXz4+He3dzb2trZ2dnZ2dna2tra2trb293d3d7c6N3e6fLy9PLi4eHf3t3b3Nzc3Nzd3d3c3d7e4fLz9fb3+Pkr+vv7////AP////z7+ysr+Pj39fTy4d/d3Nva2tnZ2dnZ2dra2trb29vb3N3d39/p6uLi8/Pz4+Lg393b29vc29zc3N3e3d3e3t/j8vT19/f4+fr6+vz///8A////Vvz6+iv5+Pf29PLh397c29va2tna2dra2tra29vb3Nzb3N7f39/g4ezy8uPi4eDd29va3Nzc3Nzd3d3e3t7f4OPy9PX3+Pgr+iv7/P///wD//////Pv6K/n49/b18uLh3t3c29ra2tna2tra2tvb293d3Nvd3t7f4ODh4eLi4+Hg39va2tvb3Nzc3N3d3t/f4ODh4/P19vf4+Sv6+vv/////AP/////8+/or+fj39vXz4+Hf3dzb2tvc29vb2tvb29vd3d3c3N3e3t7f3+Di4uLh4N/c2dna2tvb3Nzd3d7e3t/g4OPy9PX29/j5Kyv6+/////8A//////77+isr+Pj39vTy4d/e3Nvb29vc3Nzc3Nvb3N3d3d3c3t/g4eDi4uLi4d7f3NnZ2dra2tvc3d3e3t/g4ODi4/P09vf4+fn5K/v8/////wD/////Vvv7+iv5+Pf29fPj4N7d3Nzc3Nzc3Nzc3Nzd3d3d397f4eHh4+Li4eDf4tzn2tra2dra29zd3t7f3+Dh4ePy9PX29/j5+Sv6+///////AP/////t/Pv6K/n49/b29PLh4N7e3dzd3Nzc3N3c3d3e3t/f3+Dh4uLj4uPg397Z2dra2tva2tvc3N3e3t/g4eHi8vP19vf4+Pkr+vv8//////8A//////9W+/orK/j49/b18+Ph397d3d3d3d3d3d7d3t7e3+Dg4eHj4+Pi4d/f2tnZ2tra29vb3Nzd3t7f3+Hi4/L09Pb29/j4+Sv6+/z//////wD//////4H7+/or+fj39vX08uPh397f397e3t3e3t7e3t7f4ODg4uLi4uHf39vZ2dnZ2tvb29vc3N3e3t/h4ePy8/X19/f4+Csr+vv8////////AP///////1b7+isr+Pj39vX08uLh3+Df39/f39/f39/f39/g4eHi4eLg4Nzb2tna2dra2tvb3Nzd3d7f4OHj8vT09fb3+Pj5K/r7+/z///////8A////////7fv7+iv5+Pf39vX08uLh4ODg4ODg4N/g4ODg4OHg4eLh4eDc3Nrb2dra2tvb29zc3d7e3+Dh4/Lz9fX39/j4+Sv6+vv8/////////wD/////////Vvv6Kyv5+Pf29fTz8uPi4uHh4eHg4OHg4eDg4eHi4uDg4Nza2tra2tva29zd3N3e3t/g4uLy8/X29vf4+Pkr+vr7/Fb/////////AP/////////t/fv6K/n4+Pf29fTz8vLj4+Pi4uLi4uHh4eHg4eHh4N/e29va2tvb29vc3N3e39/g4eHj8vT19vb3+PgrKyv6+/z8//////////8A//////////9W+/r6K/n49/f29fT08/Ly8vLy8uPj4uLi4eLi4eDg3dzb2trb3Nzc3N3e3t/f4OLi4/L09fb29/j4+Sv6+vv8/Fb//////////wD//////////+ZW+/orK/n49/f29fX09PPz8/Pz8/Ly4+Pj4+Hh4N3c3Nvb29vc3d3e3t/f3+Di4/Lz9PX29/f4+CsrK/r7/PxW////////////AP////////////9W+/or+fn49/f29vX19PT09fT09PPz8vLj4uHg3Nzc3Nzd3d7e3+Df4eHi4/Ly9PT19vb3+Pn5K/r6+/v8Vv////////////8A/////////////+b7+vor+fj49/f39vb19vX29fX19fTz8vLj4t7e3d7e3t7e3uDh4eLi4/Ly8/T19vb3+Pj5+Sv6+vv8/Fb//////////////wD///////////////37+vorK/n4+Pf39/b39vb29vb19fT08vLg4N/f3+Dg4OHh4uLj8vLy9PT19fb29/j4+Ssr+vr7/PxW/f//////////////AP/////////////////7+vorK/n4+Pj49/f39/f39vb29fX08+Ph4eHh4eLi4/Ly8vP09PX19vb39/j4+fkrK/r6+/z8Vlb///////////////8A///////////////////7+vorKyv5+fj5+Pj4+Pf39vb29vXz8vLy8vLy8/Pz9PX19fX29vb39/f4+Pn5Kyv6+/v8/FZW/////////////////wD////////////////////7+/r6KysrK/n5+fn49/b19fX19PT08/Pz9PT09PT09fX19fX29/j4+Pn5Kyv6+vv7/PxW/f//////////////////AP/////////////////////8+/v7+vr6Kysr+fn39fTy4+Df39/e3d3e3t3d3d3d3t7e4PT3+Pn5Kyv6+vv7+/z8Vv3///////////////////8A///////////////////////9/Pv7+/r6+vorK/n39PLi4eHg39/f39/f39/f39/f4ODh4vcrKyv6+vr7+/z8Vlb//////////////////////wD/////////////////////////Vvz8/Pv7+/r6+iv49fPj4uHh4eHg4ODg4OHh4eHi4uP1+Sv6+vr7+/z8/Fb9////////////////////////AP///////////////////////////Vb8/Pz7+/v6+vor+PX08uPj4+Li4uLi4+Pj4/L09iv6+vv7+/z8/Fb9/f////////////////////////8A//////////////////////////////1WVvz8/Pv7+/r6+iv29fX19fX19fX19fX19/r7+/v7+/z8/FZW/f///////////////////////////wD///////////////////////////////79Vlb8/Pz8+/v7+/v7+vorKysrK/r6+/v7+/v7/Pz8VlZW/f//////////////////////////////AP/////////////////////////////////+/f1WVvz8/Pz8+/v7+/z7+/z7+/v7/Pz8/Pz8VlZW/f////////////////////////////////8A//////////////////////////////////////79VlZWVvxW/Pz8/Pz8/Pz8/Pz8/PxWVlb9/v7//////////////////////////////////wD//////////////////////////////////////////v5W/VZWVlZWVlZWVlZW/f39/v7+////////////////////////////////////////AP////////////////////////////////////////////////7+/v7+/f7+/v7+/v7///////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////8kfX8xueSoCAAAAAElFTkSuQmCC");
tail j=7076 line= ki_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
tail j=7077 line= kob_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAACgxJREFUeNrcm0tvJNd1gL9zz62q7iJnTIG0ARGhIujh1SiGgcSL/BID3vtHGd4GQXbZee+FFwaMIDA3yUgDWQtrQcXSZMiu1z33eHGrujlKwhnZmO6eNIaD6nqxPp73ObfE+X/xkb+CI3+R06MJ52/fVg771x+5Jr9+cv0JREMnkY/fNo6bX/+dNw7QADCCdBJzPiTKd+b4zG213gBCPe8aAUQ2EnL46O3guPk1/zjW425HvXAUkpjDB8fPccPXKwAXHKTsdAFHcEA6qsOQfAeOr/xF5bIDgE27Q9kwf+ki/uERc9w8//d/wEFk89L+8vj39gnBPz5ajpsX0YFQTNwBJALTab4nk/mm0T4+Uo7/9FU9EjZbq0BPO6AZmnCX8wnk5VCHC4H9eq7weqd9unpcT6HvRIgxRgj/oh3AAHl98ih2lQq4A2sEsj89Qnk8WzOGjeAIkQS6HsqRZijBkF/+9HsDjiBsBCDywbFxPFOkEyCSYiJij7rd0RkkvHg8gamJbAQX9mokr6NXz6q+76XoUyTGlw4226zxn1OVs5gGOTlxcZI+PSqOT1Mn1ctPr3fNFmILwt00b1Tx5AT3pJ8dkV59nkkvi4BEzAL/BPz8Fz+HDIFf/GyFAcEUcap0e3ore8u3Xs3xbH50IC5bv3/SOl6bWBDrKisB8bb1OU0R1KsE3OpHR8LxVIGEw/WT60/w6ydc/8R9jtzg29uI+O47gQog9R8eBcengQTeui9xfM52pfz4EhaXw/MN1bQE/Oc/PAo7D2lyX69idnfP2b0eQST0XSe4ZxBBJAglCtZe1wpiiuITnOzHacVXaFVu3euBgWauln7zpIUNUrLdklS1W1lBDQoGGFSAHoFe5aereoBmFNlcA3zitLDh+sn1T+bkkA3QbmA9k2BqFAZI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");
tail j=7078 line= kow_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAB8VJREFUeNrsm02OG8cZhp+3mjIEy6OmBvEiNxCQVVPxWcZDnSC7nCBn8C4nCAe6Spx0bwMoeyNQMCaRSHIsdr1ZVFV3z4QzGi3Cpg1T0A+bGqAefv9ffZ/Mz+KlE+GYHkM/VQ5juJw8uEKfSDM7h/ElbNabybP1Zg1cST8djsglGwAPJ5HT+defgjIvR0wQzpJpuqYr9qFPI5mTI1EYwLEvaibQV10SilhzFU6bY6Awzbe9d0UugjqoetEhEA8kmY0jXm6yo2r487XxhAOxrKoXHcltrXl1shwXbAoFf3lj3w4g4tkiFJIHiGQejni5yRpFi/3hOk4jYbJznS+qFYXkYyCzcCSMTAG2b4R0YWxUBbGiexDIHBwZI1E423r+rdFEECKT6GNGMgNHvNzgIgxnFBvYAXVSKsovlEVyP8jxOUaMTGEi7EZLF6hGGmlWCeSKcEIcFwmjTQi2zc7GRJQCoRBSjVRgCsg/fn0yHCNGEkZkaxPlqZ3LQWhJKEJZJRu529iPzXEDw7Z3MZrB3ofoIUEItQJCShIRa765QyLhyBgk23B6xe02RtvR0UXJSO+jHeN22+cnbYPNht9zEhxsDE2bxRF3MWOkF5AIE4tjjLuYP2kbMFxdn4JeXWywG9pE4W0iGBP3SVWbjF0h1CGZ+4ruHu97bHnYjBgx5i8fijiGf2Xzif02JtSWxrC5QyCL44rD0LT52Nvo6Emie6PYFUYGh7hbljdgXR4WyFHlsQE3+SuPI4Z9uH9ibKlYP1kgXM/NcYGB1jbE3YhxZyPIuU7MOVgLNpvfnYB9uEkHPIAx8VkFRAhiv805MCSf9d3M/qo3btocOHpHRld1u/oYPBaSgp6FlKGs6CSoZpXHxSAO4i4WPzV4sUOdxfRRcmrJRLBZzyuPHg/i+D4mrfKBo2uS94oSRELKs+iEqnn97nDcuC0hYvr8ef70b5oEwiCEvXuGZbldNZ1ytTUTx8VmUCtuWHTB+HvpXn3QtBmHQ6iDcq3YrjD9Ym5/1WI77qbiGDDCWbVYVIunYeGhtB18bvoJm7Y56KiPx7G5kZvcjn3PXy/48ezs7Kx6zKNF7jbIcjISj+lK28ycl5gm/50D9EQcz18/fV/Vb9KRHr8jAsGyZSxtlzFAAhPw4dHMdu6DSQi8Du+kN3uAfy7eq8KysIoO7WqTIDR//aHMsrsZtQEqST/uAfiwB1WSFAK52+64HS2EQ/4qHFUe7RAdbuVVfrL8kDvu7Ht9EQIh30nZMdrejS6umT2/WjHpu02t3P++7gem/f69JGVpSHJycsWFdbNztKMq+aZ5hGeTDldvBDElG7aVOxKehpUZ66j7Xt9P3yzZolhFDT1Thxi40Tidt669I/Xq+4ntClhWDlFo0MLofDuyOon6/JAPKw3dG4+sSYjxEA7zJdVpykMCwniURRBxbDkMjkHC0B1wu3NwKCezhUECx8co5I8/OyfV5WCPfaDJD1cnwTFcb4yFX9QPT84TyOefnct879SKyyQCLe+rlY7qrzoj45sKntq59tu3CvrirR49RXFrRTtm5ySn71uHS8aj5yXNCoTq/7HUYsOVzhb/kbzDMfZxuMGVUInvHfPax1ruBnXS2EYoFawtePfOn9tbmxhJWaGwVBItsaLRrHr1qldp4Cr0wsMkiSCkFqIEb98h29HDoImGzgkIupn7JVMtSucPuZ1DKNmwbUG0+5jbEMqtq1Dr7izxqBwBWCFJNYPCKGjwxAqVqgDu3feTVpyCyPc5okUzx8GvUZeOrJAOVdQmhUEFUYFjXPRPpFELQVKd//fqoFodk+OPY+irFVJHZ+zv5AtaZPt9/y+YGLdQnblX3eFBpiNynK+zYiEF5VtAJZVJUpEgmv0Q6cvdbViGj8xhHdPOf1MUC9UhSCHdNA0lYqqX2JsbsTIUaYgXq06HuonH5fjDy8HSQ63kqxTyEVMSGN3vXXxUNg1CHcpEQHeXVI56P3j9NDXcsZ17o2NpZMl4T1TUePmcmZO/WnXcIY7jxo/zl8AqabqWIYRxYiHJwzCE8VAsKYsuY6xPQB5cL6ObNl9hmh1jL84C2302DRUzD3UOli+gk6jmt3M4v4RulQKCguq6Xi6XyT6CSElViixJBkEDhug6iTWnwME3L5U0q5xV0rJeSkGG3uXKI3myoOUyFE8FEutXp2DnABd/8jAkk3LFVIfvbO/HuOiAVJONZJj4uXME6+gc331pmjbfk+WOOml4aV8qi+Rmbw8u3SONWebI4jBEVobB0/TV9dAOEarJjVEpT8TdP6N4/Lw9LETHSuXbzn8EVQohKITwbLlchlApKChIA8Z9h51lXnRvGmizOPJoRhzGZCaNiDxomYZ4T2s+EWCfL3VaJnMxlPZtGeAVPHjwdaZ56j4du4GWGB13fWlWldnw8KtKheJE53cp7do0atHGPm5vXVQJ6cvfMoxTf3TCfb59g4uybUDz1364UR/7jeeL1TCo//GNgxn3P/LGQSZx3E046hC+GhYnrh7gVWfdx5msgNB8Oz1JqEpH6IGLLPPuFdm3FosAutFrrXngOs7se172sOiVTqPhGvATKE5if9C+5PbmXd7xevgS4Wnsc5qvryZ7kFd3XjudOAdFsYZe+qfupuqXPeFfOP4f1cDPA4P/DgAwWJQLXj/G2gAAAABJRU5ErkJggg==");
tail j=7079 line= kib_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrC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");
tail j=7080 line= kiw_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
tail j=7081 line= koeye_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
tail j=7082 line= koeyew_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
tail j=7083 line= koeyeb_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrC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");
tail j=7084 line= kop1_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA7JJREFUeNrs2b9vG2Ucx/H39/zjHjvJ1aQJhlCI6khZUZYwds0IGZhYCl3ToQKBxYYUZHWAISsSHVnIf8AAIxM/guQmSFFU1NYiOGrOPt8P3z0Mjt2UpK7DQO7Q851Oz9c6+aXP8zz3+Cyai1aPmC8+CcqAD4UwmbZOtxMAi/+45OKO+CAcXiqAUEAgLi5yKQQA8hf7ePcBoJaBAwAdIZIjzmmdLHUuDXHBPJrA8gBAVIgAbSG5RL9+UOuAhQPpdzRZmD4AiEBjAUIshaT6sNZWCVS4zJrU0RwkEaGtwWoQgKWEP3LXOu3KZTMmdDRZPoBIW4igdSKSm7cRgrZS7QpcOmMyR3Phrwhtyc/Am/HOmorlvXuam1vOYypAMgsZcDSXf9fk5Kd12F5PNu98cE+DuFceMZuQDsZEG+XynuR3lmor7PN29+GH1m961b2ZU48qlQRI0sCYKI89kdo+wHXv/a9X+RH39rvvdPrDx+I8mXDsWlLbhyp9KPc1q9/d/iY+YgZ3cIM5MuHYzdX2oap8AN0Ni3J85Ycb398Y9tPBeKFj99f1fa7mFRzjeOU4Km+vXG/Ptof9q2TCcT8v1cEhtowHlI+Lw3XRz/fz/bQwXnBOvL+zUoXQ8cADKAN5jkb9a2lhjM9j75eVqvIVHmBDAGWOR0ffVDnGPT+OZaWqUF5sf+m6DRo2eI8d76SmpqbSwxjrmLGqCmK7cVifB7mFbduO5ziD47nnvZQexrh5pfEUnt2oA4dz/PnVrWeavEY2HN+uKWKEAMCdOxx8+xOG6FQxxs2rNUXckCCAQqczE8wAMiiQdKUxJo9ua9GzJYACLaocwXTnZEZp0SyQEYdOPFuCAi0UPkAxLIbFk6XBq2TEEeY8WxJaavCWalRFQKeP8TxHGBWQpKXYYGs06A8lr5ARx2efxkLyhA3YAnqUeqURpZhCxvmOyNqsB221AXdPD5cGjjfIiKNT2qwH7Y/grvJRvhqtkBLwMmTEEeQ360GhpXrqmWEfoJRSxllHYBMKQeEJPQXh6X3KZ5G01pnfH/183OBOJ1Q99VQBYRE/vYpz8og9XJFQ0eNpHkXSrfhnHl1Cz3FFgN5oOoGfcsTpPLp9cKfwHFeQEEUPUL5K9ao45Yg+5+O8tf0WMIWH4yJCCAp6Kd6fzjiaiw9Ilrzzeg7ZqX/x/6BxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxTFDW/4PB3wMA+/KA0gruu+gAAAAASUVORK5CYII=");
tail j=7085 line= kop2_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABARJREFUeNrs2b9vm0Ucx/H397nH9pPYjZ2koSnUzQ+IitRWRN0y8T+whAEhho6VqFRERqSqEnIFgoEFESSGLDDwH8DarVClQ7o4Vt02bUOaOLWb+LHv+TI8sZNKQXRB9aE7T36e8yO/9Lk73/csyv+iiXd4h3d4h3d4h3c43wJ8Hj4Pn4d3eId3eId3eId3eId3eId3+DrK5+Ed3uEd3uEd3uEd3uEdA+m4pzBhjrtVdMkRTua2Sw+LewCSvoQAgdY2kFd72qlxpRY2EEEECRBa6U1RGHbAcjg/qjNA56mICIHQQvqdlHz3tDvzfC9ifTq2DZFAaAlE6fV9QIkmXalrh7p71KDwgyYKfQZRFEUi7c3Hzqy7HTqPp5s5rDSPBpJGgubtpBsONkt0c82cFZqtdH5E+9H+wSSBvOaKTjhY/CnsRDeWrHwCFQRUDgyQB6yedsIBiytJ5saSleYVKkev5w88g7kIH7MvWVz58qOTOZImV6iQp9VTgEJC8qYj+6vFlb2/Tn29lNB86XLaM2EgIcfuEzdL8dCezVmBZu/79xCg6OBBjj0XnehG60OmbRQKBeRET5EEoAry0JF9+5Ptc7WpOM5h091JA0Ya0htdCskZR+qPtXNobEOwwO5IajkyUQYN8k/n7WeTXyVruhUMMNKg0QA0baAqdUfqwbUMsxoTf7sEPBujwuWXl66k7EIevNuhJtls9lq7ssVYZWuJQqFQPJrIfSccnJ3u1ITAmGvL7a3Ly22MMTvjSl8S7LhxzrAmdy8pZ8IYu1OyGDDZOOApoOnHhk46kAdf6IXbMvNAgsCUdp4bgG5A5i1VRQHVFy6MK36e0gu3a2fJEDCuxgAhmbrVE72hxc62E+dXL+6Hd+aDMkbjbJcwxmZe/HZpNL3ZDYFupuiAg/Z6mJiAsllnhgen9HG0P7w98Tvv93uYURccXP90M1mdD5jGUi/bjrJw/mZ3dPONw5+SMRccrGGU1XkCyvXR4ofLC9zi2effn+hvU2QwIP96vrv7yCTC6jxBEiQy+XyYhVtc/i6nw7vpA9DxwV6v0jbyi30n0Av2z9sk/LEx8Y05LwvLUZDthiMhoCpbLuQBrM1VBYusAhf17gftOPfxj8o+2zPsAqJh0QUHa8xVkV4xophkrn3zag4rzezB8Bp3wUGrzlwVBEvfAsx2uF/Kdkd2Xz/kVf/H2a8xRxWQtLQCUVFDMlXXUvD6E3n1/6NadTiwHIRijUWCOxfPPNIxCAvGCQfQehKTYmarqcYirL535yIBoyUwbjgAdgtyr//mbaCapqPBLAC1KeqUzfpsv1Nj47A4GxwHNAO+umpMFmqw8lmOKswB1gCsQxkwh899vnG0zPyPHH8PAM6XwR7zuxV1AAAAAElFTkSuQmCC");
tail j=7086 line= kop3_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/xJREFUeNrs2c9vG0UUwPHv2x3ba+IoKXXqCsVKFaQSCVqJU/8Fjpw5tCoSHHqKUPghlCMCCYnABd+olFvpgb+CSw9VL1wqIMk2UkPiTXBqQ3azOzMc1kmhpGlSiXoXzZzWI+9oPnrz3ozHYvlfNHEO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53CO/6Sp0sy0f1RnfQXa67O/lsDRl54RAAseNSRlbKCwAD++3Zj6gk+hVfB1FcUWz3iAAYtHTUjHBgpbhTMlyY/oT/EAsnzRGKxXQ1KLmgKkJPnRjT0fMoAsn6cFJB0LFJBVypHn3djzckTeMgV4NenwCUJmaqWoV929fEX9Y572XFQHFJmhVoa62981gsFDDdeVAjDnaCUxi9pgg3+94xWxRhksYAyglFIK4IMFooTOojb2alCG/TyKwTxZjxZgOZqMO4s741e/L8W5ZEOR5NvFkGLFygLL+MkSi599fDSjcI4NRVJLwHjmsO/DZcDf7cyP92tPYRTN8Wg/n0/yuKsJRK0krgZqUDsiw4uY5w/3yQSgdlhZm0SR30riTqBs1wtKcW5/KFDJ922osweTbLYgIa4G6sHM/bmnvlqkeGwNS5SIiEhMvU6PVpIk8VI1UHIco0jx2AoGh7U2Pz3lqyjuMB8o+eGN2UoZHJv6iU3jYNad+QAlhp/nyvC79ve9w8fGoAF8A9ygwzyBQsL2sYzC5MdO6is1PEkNIAhgnvfSKvNBQyFh+st0Ge4ZfpO/LakmZMT5c6AACY0kx4ajKPGogR22qanuMMmDQRCoSETCu1lyoQT3PrsasWIPIjLZZRKIzmf0poDw7iXTmC6+o/9H9eBxYndivY3XD1BRk0wJIe3QZK9WKL5j93GpYmK/uq1RtbOARULahCZrNp81RgHyY5t63iYmHjWr7++81WyeodfrhfIgpB2umNbtZzIKEI9tdXCdUNXj73zZ5Ap33r1l1gHaoVYmZY7iO3ra1z5Aff/rj67dvMIdorMv2fX2eptQq9RP504yzKgdvRzhV+k2jQW5/t3Sog1nIESr1NP2RIwRO/pa+0AdI9duIte/rQaV1Uz8e2/eu6xSD8lOyBhtnvc0PtQ3u1YPXtdfqVv9rbU1LejLckm0Lzo9KWOk8egB9T2/oj6/8fIKgBFQkOIhZFjmTjzWCB09wK+otfMbghEFkIKXH95Ppxiho4/2dQO75lujSPM/B/KTSYaFUylG5rgPrcZKJfONh6CHggy4sHpqw4t3rJICnmSA0hUgzT+g0uFXXpPnGvnF1iutPd/385lOz+wbs2/19E8++PbixdnZV25PT+8938h/DQAMRqY09QFaLwAAAABJRU5ErkJggg==");
tail j=7087 line= kop4_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/tJREFUeNrs2b1vHEUYwOHfzO5yu3c+nz/OCXEIkWMjuYA4pVuQoKCipKLgS8hSRGkKKwVCikxEYSG5cERFgcSfEDoqd7GRkSLZYCw5duy7893lvtbZnZ0Ud2efFIGdAnyDZqrd2ZV2nn3fmXm1KzT/Qnv095emgBj80x5F3d8bLV2H0EsWv2SQt1aZ3Xi5J4r/2DG1NUWM1wZsO4BCTsQubHVvGS+Nh25a9IPjHE1BJbvtsH7ztxmUhPZAJkFvAanXPDMcqBrKUdmd8X20QMlEghZdzSYwbYQDVVPg8KyiXy1oknaOAZ3YTLL5EpILdAAlIFen+uynuZE/gLYGBVIDk+eXXKyDigLIiVJrKFqeR8WHOqFjkWgmN88JkRfKYMgBqNZGrhaS36Mo+Gzo9WtX1hXr6xsbItHiT6kefW1APDq5BTgD8UEw1oDMhytLC9trt2CNGYW8sfnzHRMcXQjkYvERPzC7SnnwSAPotRmUSCZSJjgoCdDZ+kAdmX36xb0RZln95L5ygYJemyFJpo1wcKSczlLsFCaOP733/iqZUgo0goJem9HXfCMcHKnT41/fPvIkOvdK9HSwxKigoLVW00Y4KpF7elIee3Br3I3wj0mFfl1A4eHNsyD94eBINE5me5VBvFToEQFeTATFh2/qaRMcsAvdEjeLB9qDIuQj/zgC8eAMSN84Cs86wxHDZT2iwSMBWcwT+cdPyJ8BkX3CYCwtEAIhqCDLVD1YpFy6nySe0tfR7zlvVE2IB+zK09QCRiivwOduvDIvI5+6OIymjXDwWLZHJIbLAKzMgRcBy/My8utF/Q+QfnLwWJ4EpLMOe5EHRGRl5Nd/+cDp//kBcFULwHVdt83wPBQueF7trhMOvNswI6+APQkuPbv7ABTzxBBlld/Qg4Y42PdAOQoI/dAPAQJa5ImjrHT+umGKg33ZVvR0BUAGWlnpKM+E+QFwRSsIQyDoNrjNxw2C2l21e2xKPOCJIOxEgWa6CWm4DXyfaS3P7/14xxQHxUZX0ds7D98ORcsLtZwReQXkM34ANJvtAUopJZJFCNxg7pts1ZR4QHgQNF94yQlpMvESC62Ua4gDDkSzXaV0OzQkaTIxSyzsXHpBIvuTweVLQZL01o1CIJsUQyC6fNhsxGbEA+CgxWkJrIEkTct34tHI3xnFyZjigGLS7MmYBNItHyfWejiC0oQxDqDY0MhEQgKkaeE7xBqt0eSy5jiAStwIaO+HtPBxYjS6/eNn9Z2U/o6vjHCceHpP/E4dmd6GscKESQ4jvpdYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3V0mvx/MHg+AP4/vJxNJjIqAAAAAElFTkSuQmCC");
tail j=7088 line= kop12_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAApJykuLS8bGh0iISU8PD9MTE43ODqTmIWdoo9FSTdNUUBWWkhqblx0eGZ/g3GIjHuwtKKnq5hfYlEfIhAsLxs4Oyk/PzJ4eHNjY19CQkBISEfV1dS+vr0XFhCQj4pfXloJCAVZWFVwb2yBgH1RT0olIh5SUlL///8u2lfBAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABqpJREFUeNrs209MHNcdwPHvb3aX2Rl2vdiw65iNsaGyFCmJipAacU2q5t5TLlZkiUo9xdwsEalVVVd1zaESOfVQoirqpZHaa2/u1afILhywYhvbsCCz2Ga9uzO7O8z79bB/WGLjQKuWmYp3QDBvBumj937z3pv3fqIctdQJ+GLWtlKwmi8P60DpUn+1V6K4/8r/osjRHVrd6P0+DqyFAqAWxVKxVHQ5jnJEx8MWMB6WOg9DiLD0QwOaGMLleBBHdKwAY3sEgFCwDBOPJp673jEqjuJYaRsECLsSTWAK2xNN9WCE4yyHdbQVnY7UFgA/2OVxUb1s9bgZh3SsMFZCegYS4ajt41K30ScjcOyMwzlWxkpCiCwB7+vyx7bvXv5SSbBmiITicI6VsY0QWWIKvpm6eP3qz79UECsVEnpEg3Eox7cGWZoygKVnmoNM356+lW2lEtXOvxg+fgbWYQY+WU5NmnyeMyNzyR9Pc9t7t76e8msigkgkGIdoj/tmacpQQAGnpUzf+uy349+OCO0n5QyxcNw3KUNeyuTZGTUvlFNrmv/Hh73nosH4Xsf9u5PkkUyQMlgBZkO++ai//jSxcNxbniyAS8B2AQMpPBR2uvVjxMJxb3myUM67hMaikgUrZTaGdnrhr5FhvPl9dW/5J1ImEwamWikPNLEINkddEQEB6U4Wo94e3vpbkiHANKktMrswa1ez1pbd7LXH2/FwrBoZJzBNd6vA1uLcVgZavcomRIjxJseqKWQC/IU5oJxna3GmfX2gBQNAnng4/vpxJjDzc9QBvHwZ6N08EDHGmxzVTOAvzNWBTNkBPADX63CKxMNR1Wzgu3XIwPZIGRz8dngDGjXGwY4HE82mW8+wnYNKb8Do9q1RYuJo2M2mK2zn6DH6WiNyjIPGwcpGc96VIMhx5enTRqd0vy5I9BgHtMevLw+7SMAV5nXfXWlAzxETR5C8Pldv5K4wz/4ulW6k4S1i4tjJXZ+rN2Zh3vFxfAf6XlUXISaO3cT1uXomYMvZd9kH0IgyXnXsJqm41DPBU3H6BnAE8C9AXBwP3zbzXPWlIQ79dRJlxWscGphnItJA2GsPIdqK7zqquJt2S1y/6+iGRrQR/Y6qsiOITUsQoYEAju/EAQFI+Bs+N/VbHwCMbtq0EEHoDN6RfT+94liR4W0uNV5X5xKf8m/sD544ThwnjhPHieM/cdxT/g+GD5JnXTGVWx+gArJvOBdQ0umhWPWrg6ZXPmCb0RjFh67maU93hf3TXXx0YDQ+cb77JF8e7y0/9q0+8Bk4F2VH//erZNFhFTJ/dDQNfm85qKrqOK3Hm7F57zZJPBl/+eryXFTAR+1z8XDgWyQSL916JmCrHSAqKnufS9Kn7ej3K8D51IThqRuDtQrXrvm+Dw3Ex/d9QJXG841YOPiL82m4+4sbg+kKXAPfx/c7baGQTou1EYd+BfDJVzf3f94V7d6VBsUU4+Hgk69uXh6dn5MAuHKzezXdSAMokYS8dp7oW/r67Q9t/9Bi5OOjHe2JtYe27WltJFWBXA+h0g4TKcfDwbOwULUdb7BWS6dSKUZUVdNoZzxRba3Hw3H2nZLUUo73xSC1GiM1HMfxVFW1O1VZj0N8ALutv/dvn7c3nffuHaBxPh7rwRV7/3EGbsz0KSBikIPXtSt253jJwkyBGzOLzNJ3vqQJZiwWjp2B9YSMm9A0F2ZrLDIzDNUcvfM+KoOn4+BgRZYnhQuEmGq2id20ra1Cgk26JwIYPBPx9xUAF/S9O5p/7CVSVrbasrGhmNjwNKfaOQ5Qi057JH51YFVq6PnZf2YLBEnLOC8zooiQ0PROtnuSDOO50e9XsHs/eXdqmL7joqmXmgz77tC0GwMHwYPk3vFdXPNCJbumy3y4BxmOfHwAqa/PW8Edq7yVz+sLrTM46P5o6Jcf/bS8TWd0l2dxaA9YIaEsTRny5XyY/NniNLfxPvuD3VlbCehIHBxUNhNG6KQbXKw0B5m+jdefbhAJyPfmG+S+Ds9b+l5w545l8bcXhd/vvivTbph8mchm3fakazsO7cGB6Tgzf1q7QLtRXDcOjlfTo8w5+3ezLvVGTjvdKxb5UTQeddLVQr6TrpZottPV4pGvBq2HB6QPjj9upw/GJH8QGo/opXN2szlBLMOExXGncx5tX62xsS+9FoFQwLr7PnrpuXucW1hH3h+snKqVen+MA2tGhU66M8VSchhAyhO9m7wnvV/fiY4D6nvp5/DnqwMl4BLQnvs+aB98l8xeaK32PfzfkvxrALevHeCpERZIAAAAAElFTkSuQmCC");
tail j=7089 line= kop23_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAoJyglIyYrKi0uLTAhICQaGh0wMDM/P0Cdoo6IjHywtaJaXkxqblx0eGd+gnGnq5iSlYdMTz4nKhY5PCpAQzFFRztRU0ZdXlcfIRAwMiEJCQZiYl7V1dS+vr0XFg8zMSl4d3OBgHxvbmsjIR06OTlTUlJJSEgAAAA68G0oAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9SmnbfAAAfU0lEQVT///////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A2PfY2PH79vb29vb29vb29vb29vb29vbw9vb2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vb29vb29vb29vb29vb29vb29vb2+9jx2PfY+wD7gfr5/fys6enp6e7u4+Pv5OTl5ubh4eHo6Ojg4ODo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9uXh6Ojg4ODo6Ojo4eHm5uXk5O/j4+7u6enp6az8/fn6gdn7AP///////////u3t7enu4+Pv5OXl5uHh6Ojg4ODg4Ofn5+Dg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l4eDg4ODn5+fg4ODg6Ojh4ebl5eTv4+7u6e3t7f////////////8A//////////////////7+7uPv5OXm5uHo4ODg5+fn5+fn5+fn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Xo4ODn5+fn5+fn5+fn4ODg6OHm5uXk8+Pu/v7+/v///////////////wD//////////////////////e/v5OXm4ejo4ODn5+fi4uLi4uLn5+fn4P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn5+Li4uLi4uLn5+fn4Ojo4ebl8/P9/f3+/vn/////////////////AP/////////////////////+/fOBgfjm4ejg5+fi4uLi4uLi4uLi4uLn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn4uLi4uLi4uLi4uLi5+fg6OHm+PqB8/3+/vny//////////////////8A//////////////////////n//4H6+vn54ejg5+fn4uLi4uLi4uLi5+fn5+fg/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bo4ODn5+fn4uLi4uLi4uLi5+fn4Ojo+fn6gYH9/fny/////////////////////wD////////////////////////5/YH6+Pno6ODn5+fn5+fn5+fn4ufn5+Dg4ODg6P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Lh6ODg4ODn5+fn5+fn5+fn5+fn5+Dg6Oj5+PqB/fny////////////////////////AP/////////////////////////4/YH6+OFWVlbg5+Dn4Ofn5+fg4ODg4ODg6Ojo6P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l5ujo6ODg4ODg4ODn5+fn5+fg4ODgVlbo4fj6gf34//////////////////////////8A///////////////////////////6/YH6+PnoVlZW4ODg4ODg4ODg4ODg4Ojo6Ojh4eH/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eHh4eHo6Ojo4ODg4ODg4ODg4ODg4FZWVuH4+oH9+P///////////////////////////wD///////////////////////////+B/YGB+Pno6FZWVujo6Ojg4Ojg6Ojo6Ojh4eHm4eb//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Tm5uHh4eHo6Ojo6ODo4Ojg6OjoVlZWVuj5+vrz/YH/////////////////////////////AP////////////////////////////+B/vOB+vnh6OjoVujo6Ojo6Ojo6Ojh4eHh4eHm5ub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////k5ubm4eHh4eHo6Ojo6Ojo6Ojo6FboVujh+fqB8/6B//////////////////////////////8A///////////////////////////////z/e/z+vn54ejo6Ojh4eHh4eHh4eHh4eHm5ubm5eX/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5OXl5ubm5uHh4eHh4eHh4eHh4ejo6Oj5+fn68+/98////////////////////////////////wD////////////////////////////////8/e/z+vj5+fnh6Ojh4eHh4ebh5uHm5ubm5eXl5eX//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pl5eXl5ebm5ubh5uHm4eHh4eHo6OHh+fn4+vPv/fz/////////////////////////////////AP////////////////////////////////7f/e/z+vj4+fn5+eH55vnm5vjm5ubm5ubl5eTl5OT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j5OTk5eXl5ubm5ubm+Obm5vn5+eH5+fn4+Prz7/3f/v////////////////////////////////8A///////////////////////////////////+/e/zgfr4+Pj5+ebm+Pj45eXl5eXl5eXl5eTk5OT/////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+Tk5OTl5eXl5eXl5eXl+Pj45ub5+Pn4+PqB8+/9/v7//////////////////////////////////wD//////////////////////////////////6z+/f3zgfr6+Pj4+Pjl5eXl5frk5OTk5OTk5OTj5OP//////////////////////////////////////////////////////////////////////////////////////////////////////////////+7k4+Tk5OTk5OTk5OX65eX65fjl+Pj4+Pr6ge/v/f6s9v//////////////////////////////////AP///////////////////////////////////Pz+/f3v84H6+vr65fr6+oHk5OTk5OTk5OTk5OTj4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////p4+Pj7+Tk5OTk5OTk5OTkgeT6+vrl+vr6gfPv/f3+/PzX//////////////////////////////////8A/////////////////////////////////////N/+/f3v8/P65Pr6geT65PPz8/Pv7+/v7+Pj4+Pj4+P/////////////////////////////////////////////////////////////////////////////////////////////////////////7ePu4+Pj4+Pv7+/v7/Pz8/Pk+oH6+vqB+vPz/f39/t/81////////////////////////////////////wD////////////////////////////////////229/+/f397/PzgeTkgfOB8+/v7/3j4+Pj4+Pj4+7u7u7//////////////////////////////////////////////////////////////////////////////////////////////////////+zu7u7j4+Pj4+Pj4+Pj7+/v84HzgeTk8/Pz7/39/f7f2/b4////////////////////////////////////AP/////////////////////////////////////arN/+/f79/e/v7/Pz8/Pz7/394+7u7u7u7u7u7u7p6en////////////////////////////////////////////////////////////////////////////////////////////////////r6enp7u7u7u7u7u7u7v394+/v8/Pz7+/v7/397v3+36za1/////////////////////////////////////8A///////////////////////////////////////YrN/+/v7u/e/v7+/v7/Pv7/397v7+6enp6enp6enp6f///////////////////////////////////////////////////////////////////////////////////////////////////+3p6enp6enp6enp6f7+7v3v7/Pv7+/v7+/97v7+/t+s2Nf//////////////////////////////////////wD////////////////////////////////////////Y3t/+/v7+7u/v/f3v7+/v/e7+7e3t7e3t7e3s7ezt7P////////////////////////////////////////////////////////////////////////////////////////////////Hs7O3s7ezt7e3t7e3t7f7u/f3v7+/j/e/v7v7+/v7frNjX////////////////////////////////////////AP/////////////////////////////////////////ZrPzf3+3+/f397u794/3z/vys3/zs/Ozs7Ozs7Ozs7P/////////////////////////////////////////////////////////////////////////////////////////////26+zs7Ozs7Ozs/Oz8/N+s/P7z7+P97u79/f3+39/f/KzZ1/////////////////////////////////////////8A///////////////////////////////////////////c3vzf39/+/f3+/v7++Ofi5+jb8ffr6+vr6+vr6+vr6/////////////////////////////////////////////////////////////////////////////////////////////Hr6+vr6+vr6+vr6/f39+Hi4uf4/v7p/v79/t/f/Pzb2df//////////////////////////////////////////wD////////////////////////////////////////////Z297839/f/v7t7e369fT0K+dW3/vY9/fx8fHx8fHx6//////////////////////////////////////////////////////////////////////////////////////////q6/Hx8fHx8ff38dj731bnK/T09frt7d/+/v7f3/ys29ny////////////////////////////////////////////AP//////////////////////////////////////////////2t7e/N/f39/f/P5W9Csr9PTnVvz29vHq6urq6urq6v//////////////////////////////////////////////////////////////////////////////////////6vHq6urq6urq6vbd/Fbn9PQrK/RW/vzf39/f/Pze3tr71/////////////////////////////////////////////8A///////////////////////////////////////////////d2NrerPz83/zf/P344vT0K/Qr51bz8vLw8PDw8PDq6v////////////////////////////////////////////////////////////////////////////////////Dq6vDw8PDw8PLy8+jnK/Qr9PTi+P38/N/f/Pze3trY3dfz/////////////////////////////////////////////wD//////////////////////////////////////////////9f23Nja296s/Pz8rPz9gfhW9fT09PXo4fLy9vDw8PDw6v/////////////////////////////////////////////////////////////////////////////////w6vDw8PDw9vLy4ej19PT09Vb4gf38rPz8/Kze29rY3PbXgf//////////////////////////////////////////////AP///////////////////////////////////////////////9f23dzZ2NrbrKysrNvY3v7v8/pW9fT0Vujb8tfw8PDw6v/////////////////////////////////////////////////////////////////////////////28Orw8PDw8tfb6Fb09PVW+vPv/qzY26ysrKzb2tnZ3N321/r///////////////////////////////////////////////8A/////////////////////////////////////////////////9fX9t3d3NnY2trb3t7b2tnc2v7v8/P6+vjh6Pby8PDw8PD/////////////////////////////////////////////////////////////////////////8PDw8PDw8vbh6Pj6+vPz7/7a2dna29ve29ra2Nzc3N321////////////////////////////////////////////////////wD////////////////////////////////////////////////////X1/bd3d3c3NnY2tra29vb2Nnc3Nzc/fr63OH28Nfw8PD///////////////////////////////////////////////////////////////////////Dw8PDy9vbh3Pr6/dzc3NzZ2Nvb29ra2tjZ3Nzd3d3219f/////////////////////////////////////////////////////AP//////////////////////////////////////////////////////19f23d3d3N3c3NnZ2Nra2tra29vY3Nzb+Nz76Pbw8PD/////////////////////////////////////////////////////////////////9vbw8PDw9uj72fjb3NzY29ra2tra2NjY2dzc3N3d3d3219f///////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////9fX19f23d3d3dzd3dzc3NnZ2dna2tvc3tv52fvw8PD29v////////////////////////////////////////////////////////////b29vDw8Pvc+dve3Nva2tnZ2dnc3Nzc3d3d3d3d9tfX19f//////////////////////////////////////////////////////////wD//////////////////////////////////////////////////////////////tfX19fX9t3d3d3d3d3d3NzZ2tre3tze29rY+93w9vb////////////////////////////////////////////////////////d9vbw+9ja3t7c3t7a2tnc3Nzd3d3d3d3d9tfX19fX/u//////////////////////////////////////////////////////////////AP///////////////////////////////////////////////////////////////////f7X19fX19fX19fy8vLy8tnY2trb29vY+9323fbd9v/////y8tfX19fX19fX19fX19fX19fX19fX19fX19fy1/Ly8vb29t323fvY29vb2trY2fLy8vLy19fX19fX19fX/v3z+Pn1//////////////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////////////19fj4gfPv7/39/f7+/oH49t3/////////////////9t3w3fbX19fX19fX19fX19fX19fX19fX19fX19fX19fy8vLy8vb//////////////932+IH+/v79/f3v7/OB+Pj19Sv09Cv//////////////////////////////////////////////////////////////62tvpqb3Y+CAAAAAElFTkSuQmCC");
tail j=7090 line= kop34_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABrFJREFUeNrs201vG8cZwPH/DHep5ctKZCwZUhPKTQzDApK2QHUu0PYDBPCtBZq0gFFAMNBLUl4iJAVSpEAt5VjCtwIuCjQ+xB8ih16kAkZTIC5qJ6LUWJYoS/KulxRndqaHJSXasiPaRc3dwnNaragVf5wZztvzCMv/oHzxDb97BcD6RzduUlt+Hwx0kEu/xuH7q8x//nT/UTxnR6LgawDXOKDBzgBs9F9y3nStlPk0OIYoN2G6dFs61khirAQBKMACnI9K2XAQYKSh9GVtkzinsYAk0aCwwFwmHAQYQOrd+OWtmDivAQwCpOhZ5rLgAPaBXCz17jjVrwzS2DxoMEIiQA0vGa2DfQBy/y6Wx5apY4q3LMIBNEZIgbJDQuRIGUxINMTT1btbv/qHlO5PKq986+xql9UbN/7uWh07+ZtffJiB+gD2tQMgBbvlkgXx1h+XF8X1C7CG6JLT9toHWXCwr3GS5mWdzsJV5ldpVccErNdYE9o43TOFLDjY7zi9qxbnfvrxFPOsvv0Xuw5QWxNadufS3j+STuLopIxXXtv+c/z2Nqv8aSesVmdnWZezN6QbZKI+4K44vPzsTdiUWO8UYJBNaqwZNZcJR9Dutywqe5X1lQuiY/ACfJBNqF3/bjyXBQd3XRzt6L7Gx3QAjw5qAmiufMfMZcFBMgPulZl9nw5IA+Ahh4CkxrGlodirjQD/3ksdmcy38ADZXPmensuCg3uyN28HoAhyqb4HFTAeyKY9qBWz4OBrdxAB8KDBJWjUyYNsrrw+lwlHAtFHP7uNS8lFo248pOWfc5lwsKeOFG6/ZoCIxrt48tM3zmfDwV77UNBT3K9ggKhRN55EZMTBtsZV7lGtVPYqbE9hICoZb2NWZMTBtnbRjgaUq1wFUCZkChOVjCdkVhzcSWpDDdwqAwUIS8brFlI8332ozChAKaDcL7DAz9uUH3zc9T7MSn3AHYHq1ULgB4APC8CVQtio5z/6ICsOWu2e4qG7dVg+FTUWD4qZaFfAZMEtQxAk709KKSWSJSjvFC99NBZlpT4g2CsHxz9l41MwyywqXc6IAzbHAgkcjXy252CZRY5LZDoZTFfzxgwwEAIZsH0f6HbGSp0wG/UBsNlFHlIsYPBD11HjHkgOvKw4oJULBlqMwSd0cVQldCcG21zqHUCrbZFGggF8QlwHNR65RGUYz44DCA7aZXoDYoiLo6iELkSAM2nVZd7LhOPQ87ibhdvw6pevZcmRif2SF44XjheOF44TivN/MXrcyoAjyO0ki5Gj0Xw8wo0A/nrhrLrMezCd8nbValtAGjk4u6qEbsRDs6t0949HZ7v4oYujHI7NdtPcPza7SImworf6kMYHHDWOB4+sPtLr2OySbOcmH7vAAqHrNKjnJQfH1rXpbFePX52HnIoo5VGachb2fYL1sQBjAGstFmuTD7s8BY28amt1fL8khY7WgzK+DyahYDEY826d0NBYVHr3YpUMOFptFYbgA5ikYOr1JQqnouXFXX2x9kkW5iUDu7sQgB/4BHWuUDDLvP/bdy5+kon51R3B4bFHvyxwhXAqbNS9JzLS5nj86Uc41Tv9iFX1CX+Yrv6x7eI4gOsOMMJCjyGazpMY6XJsa6VUMjS7bsF1XXeKQmEKYy6XjLchrJeJ9UfvtLYfLZOc1oLpn9bezEYcwBNOzyMa1I0nP33jjJcFx6PRDIfn6ENEM6TIcf/g6LoogSXgEg3qGO+k6JL0OO7JqPhotM/SL4eN9kmNY0tTjA7faBJFBhhpkugrE+tvjodLyfeuBxFRFEVRNDExASCNCUOMF0gpm0bp32Rg3+euS8cbiE7cxwWilwaiE7/tpd8RtJ3+oKEn94KVH1UjPAh8kMEutTUdn8RIxbo2Err/jfvZm61Xf/ygbb0kJE42YcWYePIkRhr6xw42KdXq3g9zxZ/9YGryNEEQ+HKjSc3M69PXJk98yOjb1c5hv8gb/7HR7cMks4zcsd8PP85Z5xccZRus1+hlGwyVySJHz8ABmcvt7uWuXkW8Hv9+2mtC7fpaM1bCDscYcX0ERjtAbuNsuHAV8dYfSqb4lcrbv8G8tkgxdF7RSB297CirGVuGuineEsbmAY3JIbKS55Vkq20WZ37H4m0kz56tNlLHPiC1T3dLYfMaSAJjEsRTZQ+O0BFgpCmhN63JaSP4r7I5R+YYyK4VuteOkm2Slzee2vD8Hf8ygJBCAW4sAJMTCsDt9l5yXjzTk5/v+CFyuZyTS97p6ZlYxrHVpz93wInPnavVzlybnVXP9uT/DADjuRVfTGbbYQAAAABJRU5ErkJggg== ");
tail j=7091 line= kop14_png = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABtVJREFUeNrs2c1vG8cZx/Hv7Ctt0qRkhrIpW9zENhADKVqgBqpTb7mkJ6MnB0gLFL4rgIFGEODm4AoVnAICqrvRoscCLfwH5NZehCJB7fogJ7VdipaoWJUorkSK+/r0sKREN3EiSpQSFPs7kTvk7Hz4zA5nSSUMmjY6d2+F5EHBr6fj+qX+5t16caNcffXbLwAYp/YPPC1rd38FAi7G/DQRP1pk8tFgg1KDO2L1+KUx1UVDQXR5uVwv18ungG1WXslYuQAG1Mv1yhMdhFiVgf13vCltU4Wnj9UhjwGceu8pkcIg1iKJLy8XLU4duKenZfzsE80g1ggRHVTSkNTyzebIsTmWegRRCESAQiktqvz7UgsGUQC74EO2OrGsxyIIoNPTlKvA1WNxLOHUQZQQIRqAIjKQiefORt6HwqDzcxcfsNziU6emCHUBiEF1a1OuDiA5qKOrIBINFERKB96IWDZLfr18CAZAE9AM1oMK+jMgEh0EYqWjBpIczLGEU0ci0VA6kYgeX2ka2MRf2PkwhkMyEghoxro9ouERFv4lKIUeCbEBqlw9IEQ7EMOxVsMg1h49fPgg8vUrY+dev2Ep9d5mbbThx+AXDsmgYOFD7I82apvvKWXdeH187MqDKHrw8OEjiaNw1dpdCoZVjyVnNdSU/ul1uH9dzU7//PcCatsbxfAB/BJHSNO3AKyQhn1GQP3ij3dvy/3rcP+HkcTGePVPHw7H8TTQjE+vU5uoTajgxVkmFyc/fv+eEAPgcyQGNH2s7txQLXl7cXKRzTFTqDHBMmFs+hdzQ5lXkWVUrtVq1Ca0d8N3Jlncfqv0B106vu/7/pEZFLCTnjodvVV6a3uRyXfCdzWgVqtUDCu68nwY9fhM0ys1cGjAmUCY/Pj9uxefOPhJs/8aR866Sgpi4dcvP5/+3duLKHMb14EqE/d/EJfPHNnxRKvUwBEU4DcCU22PWTv77UNggOvvP87BC4U5arFeQlSVCZ7F8dUjzqvP/lGpkXcEtrZkxcxdLP3NyLZGVS9DYWDS629Umeba38cv5nZXxNwSxKFWe+Of2tLR6vHYUg6wpcjjAvnmSKO3t1KipMhw4gYoUdLdYjG6VcCFnXEXGQGqn3xPrh7B8fjRNQe2Ci4ARkie5gjre+1jDC2b4f7jElsFFyM5km+OHADytY7PH15zRAkuGABhntXsXmswVMd/YjD71rDVHAaEQJ5mQVU/+X509ZDXx6665gjito2FVnOeeXDd8VY3YJpDZPCabpr0Om+tujmMeeZbLcNouwXEuaYc75AOy3AEt23YzZmxezftmxiG4eZyuRxAq9UaZZgpSqu7YOVyuZxhGNy0GRuz522jDeIY1rPDzasITXCN+RlgvQRzN/tvqOAiQ84LH3Kt/ef3bo51z3wrzKNiPr96GMeffyq052eS7ccGQOkF+4vV0BnQaO+tWKjSOqX14kYR0JibIq/+8pNTh3GIuMb8TAyKDc52Kb1iJLfmw85ztXdHCFCETYqiBG3uVphXfU0Hdki14hp2jALWzm8UNzi72UWIkuNhJBDVo5zdhCKsnQdB88L8sqMGdkTKNexYwZqNB2AGZmB2i8E4x5Tn3TtmCMzADABsPM4jmhfmRR/UsXPaNWxhzQa8l3YQIMfHgJVk9vTfPNnAKCgvzLdzg627d7LtBVvWGjZTYHcDEASgjpHBBVHJWfZOa8MUP2usib3Qzt4ZqB53bs8yrRpMwQLQIdPJkFTGDMwyx5oVjaBbBTqZTqaTgSlgYVThnZ798OCOQJ+diVVjCj7qP5xJJBWOOathl9HpP/oB/PacNnc7sA/q8MzZmfiLX8JHtmd7fVdIBjjH8WdVaXuIZNQe8AEL3ishX+HwjdmZWDXo7L8+MLuWzEkwYLthd/YMex8vGUZFm7sdeme++Tr3sWZnUN0SBEkIwLZtnJNhcKYSZxJG0EtXpWDWyPrb3+gw4x3m4o01u2Mny8beJt0773BiKZ+z8PqX3yDA7rC2Ec/Qxsz9r+RL8yp2aSkV2HSwe/2YgHeCiG7q/v4QkjFk8EzJcxoUgfVqh7DVyrWUIrA7/dPzW0AkF7ze6R8FZDwTkcJWduSljVifQxoQmi1yLYUKsJP1wgaPbwnRW4SlNw7I4GEKkt3JEhhwdt8R/GZGDLn/Y8CkRa6FUiRXVefE1qevz24jtOn0vr9MRMjukCUA/npdhWruxiW15FQpn/7Sb8G+xWB/y5yE5yt/MnpSrjvVy4f4f/A7mdSROlJH6kgdqSN1pI7UkTpSR+pIHakjdaSO1JE6UkfqSB2pI3WkjtSROlJH6kgdqSN1pI7vWrT/Dwb/HQCWcg5gw1gsvgAAAABJRU5ErkJggg== ");
tail j=7092 line= btn_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAACT1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgID///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAABAgID///+AAAD/AP+lmdfcAAAAwHRSTlM8ODQwLCgkIBwYFBAMCAQAQERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+PxTzsGTAAAAAWJLR0TEFAwb4QAAARNJREFUeJxjOEwLwHD4ABzY29naWFtZWpibmZoYGxka6Ovp6mhraWqoq6mqKCspKsjLycpIS0lKiIuJiggLCQowMDIxs7CysXNwcnHz8PLxw8GoqaOmjpo6auqoqaOm0szUg3BQX1dbU11VWVFeVlpSXFRYkJ+Xm5OdlZmRnpaakpyUmBAfFxsTHRUZER4WGhIcFBjg7+fr4+3l6eHu5uri7OToAAejpo6aOmrqqKmjpo6aSjNTD8HB/n179+zetXPH9m1bt2zetHHD+nVr16xetXLF8mVLlyxetHDB/Hlz58yeNXPG9GlTp0yeNHFCf19vT3dXZ0d7W2tLc1NjAxyMmjpq6qipo6aOmjpqKs1MpQUAAIrvy8PKBZ9nAAAAAElFTkSuQmCC");
tail j=7093 line= btn_n_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0CRzonygAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6SgsCoMgp1Q3Iv75/UqMBh2QXplGAK7Ib0SDIXfIL0iDIM9kF4BhsNeSC8PI+B3SC8HI2EfpJeFUbAf0svAaDgA6V/AGPgD0kvDWDgI6aVgHByC9JLwLRyG9BLwHRyB9AL4Ho5CejX4AY5BenUYD8chvQZMgBOQXhMmwp+QXgsmwUlI/xImwylIrw1T4C9IrwNT4TSk14VpcAbS68GPcBbS68N0OAfpDWAGnIf0hjATLkB6I/gJLkJ6Y5gFlyC9CcyGy5DeFObAFUhvBnPhKqQ3h3lwDdJbwHz4G9JbwgK4DumtYCHcgPTWsAhuQnobWAy3IL0tLIHbkN4OfoY7kN4elsJdSO8Ay+AfSO8Iy+FfSO8EK+AepHeGX+A+pH8FK+E/SP8aVsEDSO8Cq+EhpHeFX+ERpHeDNfAY0rvDWvgf0nvAOngC6d/AengK6T1hAzyD9F6wEZ5Dem/YBC8gvQ9shpeQ3he2wCtI7wdb4TWk94dt8AbSB8B2eAvpA2EHvIP09/ABPkJxL+6f14vkEzs8y8O5aXg1AAAAAElFTkSuQmCC");
tail j=7094 line= btn_s_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0Us+6SmwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6Sg8D18gI9Q3Iv75/WBsAPeQfoA2A5vIb0/bIM3kN4PtsJrSO8LW+AVpPeBzfAS0nvDJngB6b1gIzyH9J6wAZ5B+jewHp5Ceg9YB08gvTushf8hvRusgceQ3hV+hUeQ3gVWw0NI/xpWwQNI/wpWwn+Q3hl+gfuQ3glWwD1I7wjL4V9I7wDL4B9Ibw9L4S6kt4Of4Q6kt4UlcBvS28BiuAXprWER3IT0VrAQbkB6S1gA1yG9BcyHvyG9OcyDa5DeDObCVUhvCnPgCqQ3gdlwGdIbwyy4BOmN4Ce4COkNYSZcgPQGMAPOQ3p9mA7nIL0e/AhnIb0uTIMzkF4HpsJpSK8NU+AvSP8SJsMpSK8Fk+AkpNeEifAnpNeACXAC0qvDeDgO6dXgBzgG6QXwPRyF9BLwHRyB9JLwLRyG9FIwDg5BemkYCwch/QsYA39AehkYDQcgvSyMgv2QXg5Gwj5ILw8j4HdIrwDDYS+kV4RhsAfSK8FQ+A3SK8MQ2A3pVWAw7IL0qjAIdkJxL+6f14vkE2w6y8NwNQP6AAAAAElFTkSuQmCC");
tail j=7095 line= btn_e_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwh/EZn+QAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8Bw+AAc2NvZ2lhbWVqYm5maGBsZGujr6epoa2lqqKupqigrKSrIy8nKSEtJSoiLiYoICwkKMDAyMbOwsrFzcHJx8/Dy8cPBqKmjpo6aOmrqqKmjptLM1INwUF9XW1NdVVlRXlZaUlxUWJCfl5uTnZWZkZ6WmpKclJgQHxcbEx0VGREeFhoSHBQY4O/n6+Pt5enh7ubq4uzk6AAHo6aOmjpq6qipo6aOmkozUw/Bwf59e/fs3rVzx/ZtW7ds3rRxw/p1a9esXrVyxfJlS5csXrRwwfx5c+fMnjVzxvRpU6dMnjRxQn9fb093V2dHe1trS3NTYwMcjJo6auqoqaOmjpo6airNTKUFAACK78vDr8GZlgAAAABJRU5ErkJggg==");
tail j=7096 line= btn_w_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwV3fKTTAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8BwmB8O+Hh5uLk4OdjZWFmYmRgZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTS1tHV09fQNDI2MTUzNzC0sraxtbO3sD8DBqKmjpo6aOmrqqKmjptLMVAc4cHRydnF1c/fw9PL28fXzDwgMCg4JDQuPiIyKjomNi09ITEpOSU1Lz8jMys7JzcsvKCwqLiktK6+orKquqa2rPwgHo6aOmjpq6qipo6aOmkozUxvgoLGpuaW1rb2js6u7p7evf8LESZOnTJ02fcbMWbPnzJ03f8HCRYuXLF22fMXKVavXrF23fsPGTZu3bN22fcfOXbv37N23/xAcjJo6auqoqaOmjpo6airNTKUFAACeeMvDg3itZwAAAABJRU5ErkJggg==");
tail j=7097 line= dragon_png = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV0AAAH+CAMAAAAI3i3FAAAAB3RJTUUH4wIIEhsKtTHtmQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFsCIdvScaqS0xtiwvyQ4SxCUgwDEbwjAu1QkO0hQR0B4S0hwezi0U1i0U0ioh0ist3gAI3ggI5wAI4wER3gwM5BUI4goU4xIX4SIL5ykI3ikQ5C4N3hwY4i0U5CQZ4Sco8wAE9wAI7wgI7xAI9wgI9xAI/wAA/wAI/wgI/xAI7wAQ7wgQ7wAY7wgY7xAQ7xAc7xgI9xgI/xgI7yEI7ykI9yUI7zUI9zkI7xwQ/yEI/y0I/zkI7xwY8SsQ7yMi6zEku0MezkUY2j8W2U8VxWEd0WQa3l4U2GwZ6jwQ60YQ6VIK7EoV61oI61QU614Q52wU9z0M+UQK904M/0oI/1II91IQ91oI/1oI814Q92MI92MQ/2MI72sI82cQ8XEQ/28InUY3mE5OsUktsUlCmGJJk2dXsGY0rGlKxUgsx0tA40oo3k0/yWQ7xnVE5Ggy330+jWtommpklntnkntzjH5+l358kIiKlJCStGlitH1rrYx6q5CP1Gdh035u0ZFr046KnJyUpZyUnJycoJygpaWcnKWlpZylpaWlrZ6OuZ2KraCcu6SUrZylramlt56evamcpaWtpa2traWttaWltampra2tra21rbW1uampva2lubWpu6+xtbW1tbW9tb29vbe3yqCE0KSG2qN52aSGxqSYz6GW26SP3LCUzKWj1qKi2qae46efyrKn0bao4bOi376jxq21xrW1vb29vcHGzre11rm1yMC9zsa53rKv27215bax67u42sex2sq96cay6867xr3GxsbGxsbOxs7OzsbGzsbOzs7Gzs7O1sbG1srK3sbGzs7W09DT1tbO1tbW1tbe3sbO3tDI4s7K6c7I4tbS597O4djY597W887I79bO99bO79bW797G897O797W99bW1t7e3t7e3t7n4uLi5+Li797e7+fW7+fe5+fn7+fn7+/n5+fv5+/v7+fv7+/v7+/37/f3997W997e997n9+fW9+fe9+fn9+/n9+/v9/fv9/f39/f/9/////f3///3/////ZWRgQAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAINoSURBVHja7Jz/a9v2uscTyUJ2BbGPFOxfzOz8qq3rP1Daf8U6wgzhXywU23Isozbh3NyO02yjS7fRrP0lGXG7Xu7SpqTJLzdbIKkJGScJaYOhLCSm9j0Hc+BC8dW9Yff5SP4i+Vv8ra7p3QMdi2M70kuP3s+Xz6PPyO9/2Luzkfd9AB+0/UH3XdofdN+lDR1dLf8yq73vg+iXDRtd7Wzn1mL2fR9Fv2zY6BbTS7Kc/lCcd9joZlMyr6zmPhC8w0Y3owpOYXG78L6Poz82ZHS1A8Vpd8bnTz4M5x0uulr+UYihKe7GbuF/3vex9MOGi24+nfSxE24uuvX3D8J5h4tuNqVcmZhgApFnH0ZcGy66ENM+Abq8dO/DEN7hovsq6WSBLiZ+u9dl1qAV85nMq1fHmXzx/H2fzdDRVSiD7p0uczItn15Wk4qSVNcOi+/7bIaUbkD868/N6Z5rxUZ+ibz2+GBNVQSn0ynISzv59302w0Z3Q7DrdMMt6J4XzvYb+WV+/zF4bch35ROWZUj+1tYfdK2mbYSY1nTPi9mDjUdqKmPxXng1c7COvJZCn5+gHbiceHBSKBTz+SxYpmLwQz6fLxQHFDOHia6WXwu5/Iiu9NfGuntezKSQf4ZSRybvPS8cptSS18LHJxgCEyOx25t7hy9W11KppSUVWTIJ/1lKpZ6u7vztZWEweIeJbvFQ9dETOt3bjeiCi6ZTitPDME51q5wQw4vHGz+A27qR1yLHZYhAcDIaTcwtL6EAByZUDP0EmFPps4HgHSa6b5YVD+LDcI3pFg9TyZAPVJXiEw/2jGoOeTP47TVw2xJcO86FAW4kLgtO37UrYJcvfwLGwr/L6Mdr13whdXUgqjxEdLWDJKoldN/9ereO7vnbA3BcXZdJOXF3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");
tail j=7098 line= koeye_handhither_gif = url("data:/img/png;base64,R0lGODlhyAB9APcAAAgHBQkIBhQSBRkWBhURDRYWDh4aDhoVEBoZGiEdCCocFR8hEColCigrFyQiHisjGzozEiAgIycmKCwrLzQrITEyIzsxJT4zKDs+LDMzMz89NTc3Ojw8PlQHBWAAAG0AAGwOC2oRDWoXEnEcFkY8Ikg8LmMtI2Q+MG1hHFJGJ05AMUVJN2FTLm5OPGFQPnBfOUNCQUhIR01NT1FPSk1RQFZaSFNSUllYVV9dWl9iUXVhS2NjX2puXGZmZm9ua3R4Znh3c4QAAJAAAJgAAIsTD4MfGLMAALkAAKUfGIwpH5UoH6wkHLEnHrM/MdIAANgICN4UD+AjI5FGNohQPspJOu9COZZkToFnUIJsU5ZuWJB3XL9nVZZ8YOtYRfVpWn+CcZyBZJ2EaYCAfYiMfKKGaLCTa7mbbKWMca6RcbKUc7eYdbCVeLSZe+CDbe2WfsanccOifZKVh5mZmZ2ijqarmLC1or6+vcuogsCnjtCuic+wj8uymdy8m++2m+C+n+i7ndW7oPiwsOPGqPTHq+rOse7QsszMzNXV1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEKAIgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAyAB9AAAI/gARCRxIsKDBgwgTFrRjBwiQHjtw3LBBUUYMGTuAFECgcCCCjwgKdBxJMIBJkyIVhnxoUQZFGzdw7OjhkKGhQ4cMkdzJs6fPnwUtJjxpUoKECUiRSnAA8mNKgSaBGgyACGWBjSAdHE06wShRhTBs4AAixo7Us2jTIpRRECvICAgiyN06IUOEDEqZLriq9udVBAu0IrWLt6sEuXDhNuVIUAaOvpAj93SLuHIEo0aR3p0gxoGDBaD3SvZ5tUBoBxHE1I2gFLPlxCCfjp49mzJizJm5HmYNJIKDOKZB0/YbHHSBOHKBTJjL1bBRy7GHSz+7MfHl3EmfI7bhw0eEMYAD/oSeDjT0AvHHI3S3URl79spOycvvWJ150sKHJ8C4sWNHdyBjACeeefP9ZB5oARwXBxDd9XcDDMvRhd9ucMlWoHz1bZXBhnhJkEEM/Pkghx04yRFHBlQdeCFQpjVAICITxCEHTnbI4cMON8SQwVEcTlghIj6sKF1cGmawwZFG2kDTiDgdYkccYqB0YANCSnWgcSYFSCKNcjxkwwZGIokfXIj0UOVoCGh4JAdsciADEHXgdJMhdMiBQwEDmtcAlWeWt+eVJu0gBx1z4lQHEDK0yYGYXXG0Q5+QDbYBmzDAwIEGMcxoyE2H1JlBSHuGKiqkUolqagNXbTConDfJEYMG/hxUyiaYeEVAalqsGclmDDFUWqkPW9IpBwcOVGDsschWcGupyTbrAAeDcmqHD77CwOustVK1rE93TRrrRRbFQMMMPtBRBx1xTFDBhhi0624F7m4rFbzt0utuBhhkUMEEY9RxLhAziAtur9jaKu9OHm7gawww2TDDwzHhIAOYGlRssQbuxnuwXxm7azEGFh85g0Q3PDwDTBb5CqYEG3fk4bcxPIwDDjXcEHHJD/u6ws4899wyUPD2LPTOlcYM08w2i4VDztfu+PNBL18U8wwx3ZDDzEg7zCsNXHft9QpPS7Wz12SLa3LEOOSgtkRaW8SB02ELVBcMMtR9dNo59Ncf/sk1PFxDDTQADrjXcf+EAdmCB9431TbPrPfabM9Q99sTxF2AfgzDFFN/PEA008xX31BDDqP/bbrghQO1QuCKm0466VY73l8Pne8tkUuJTlAAEE9PmvnmPvDQXefBP6728cibnrrYriOP/A55z+QD7cNDxLYNiW7QOwcM2yx9dz78AD7tPJRf/g485FA+8sufRQPy6/OAvvnlBw+++N1BZLPb2rf84dE9+I9DBviDAhaQfgg8XvvQ8j71IdB84itg+AY4wPyxTUeMOVj3pDdAMYjhC18goAF/AIQR0m+BaakB/UbIQhI6BIRiIItDpocjG/BKg2EJkUM86MExfBCE/iEEIhBNyAMUqkWFPBihEEEIBCGKYQw+9OAMa2gteXFALP4hyxMDFAcoevELYwDjEkdoxL7kgIVCDKMavQjFLkaRQTXkwLZwgEUf9DAOeHQjG/cYRhAasIyQOeMP0sjHPeYRSh68ER0fQ6odOCaAT8yjiQ5JyT0KEZCR4QEQDUlJSk6yi2KYnsQe1aceYIQmYsCjHFZ5yDnMIQ6vPKQlIyMACpTgBC5QgQosQIEHGOAAAHiaJsHoRUq+8piSXKWJxtAgGZipSj5Qkg8AJKNVuvKa2MSmLKHYFwq44AVXuIIOXtACF5xAl+hUwQUM8LMfsLGV2YznHJQ5Bgb1wAa8/luRGKT5RGXOgQ7//CcdBirPQ/ZFAC7QghaygAUsiPMFLjBnOtFpgQO0bJB5lOdANwpQgM7TRIm8Zz7ns88AkiVAAuUoR89FUG325QFYAAMXFsrQh0aUBRNNJwUIsLECoPSaKg3qRl2JxxhOzwZRIo8YBOKfaaYSlhv1l1SnqtI5QKYEYMiqTBfa0Cu8AKISzSk6KdCyL8AypeaaKlUJCspQ9uCeMkjqcGQQk7c2EaUDVate/QXQyLjgDGjQ6ky5atOwilWXD/jZF1yZ172u9ZVhtCeOLCLX0RwtiWDEI1r1ylGrRkYHakADGsogWK5i4avlPOdh0RlMxTK2sWrt/iwew/iDiEwkXEuFDK9mMDrMZhaoQiUobdDwBtGWgQxZnWkWavpVF+B0tboka9h+cNbgthSyfkxf33h1kbP0CgarC5zakjjINp71tS2VjgXgAIfiiha5Ml3uaZubS+jqkqeFcydjU6pNN37hgGob3Aoq1REH+GefGsgA2Xg7Xt8WU7NEnc8L2AuH0AY2uYQdZ0RVC13pLq8A7oRwLGfbxx+sj3SD61oGNHADt3oGERKoAGYcUJoa29jGe+HLirhAYfdeWLlXmG85nwvdEmByIDdOspK1YhQZO+DIBEADheFg3NIy9Ktgta8uj8zl0RCADFMu7nExzFAsjDO1Wu6y/poho4IpU3m0gpUvag27WgGs+c5o4XGPqxzfmmqYyKvFs6CBYoE3TDm0pN1qmenL4cMO+tE9wUKY+cwF+Wp4lxYowWGNDOlOd0QBUqYwojH8Apw+wM4DIYABKGCBdF7A00BxDo2VTOvSQIoFkz7uC1KgAIEI4AGt1qUFGJCAVD8gBRY4cq2XzeQYL+UjiDjwDRLMtfAy2IGDJGZGrznbkconC1MeLQsQQQALnKAF4CRnRHWJUxJAgAHkTmzqdsdFbucRitlNH+nIRoMVt/hGntkIQr4b3tGpr4DaPu9rsTmGH5AH1BQuQwoQAdNK+xmsjVYBC1CAarUMoAOz0S82/q8bS3wDeN80GDAM0FI37jLYwRC2rkfj4PDhWEDKaCABIijAhfg6FMvkLGdEh+7cjkulBVfwgAeMjhbqojevnS15dkkXMF6xpS9isPply6vZqHJ2qHP4wnBUAAYIIMICWc2CV4HOdqDfdJcWBUoL9LCFD3hgAGpZ7GZjC3aT84BtuJVMALJOV5mE77dedyxLXSn20UCg2GTXwkPbzvZxqtu5wmb6SNb7BybYHeRn0TtsFc/WyHruBpTVluAH75KmUhOqo+f7UOPQ+L4QGxGRV7vlKf9VHfh+zo2+gAV4qQDNE0QAYPCDF4zweamY9emkZyuUvtAg7EVJ9aOJg0lK/upUvAaVpVXl9hgsJBV4P4ALQOY90Hc/ZxegW+gnUO0F5G2QFuShD04YgtJD4JefAjeq5hJ+oGRPSGUScTAdcjAGg8dPYuBPARVU8XRI/6UWZhdTlWZm7IdulfcCvqcDXiVO4vR7LSB06MROBZEFd0AFRiAE++cTGLVt/zdUHvVRoHRUUTIGcjAfchAA0WRSAWJN8pRN2wRFNScVCZAAuedQOiB0Q6eBvQeC4RSFUjh5I1hfcEcQYAAHSjAEQaB0ItAT7vRgCheEHwVS9vQmAZCDF7KDptRUT2VN8DRiQwhCRTQS5TZ8eNhqJcACYGVOLPCHROd+TuiBUdhQhthV/r+HWoDWawIhWkQgBF3oAfQ3EsP0TsZ0VhnFSlByhj2QhlXCho+kRZLUSUP4RXSoEA+whxlnXyfAAkSngb4nhV3lUIYYTr6Hfi+gAo2WWAQAB2cwBUXQASEgAh7WEZVITAFiXqSoiT4kShjhiWeifYt0YB5UioU0RiZmEATAh1aoZTmFS0TXe4QYZIdYi0GGBnfABrmYU6uWB3CABVZYjAlBXoRUSGIYRaEUEWIRAAcIKWKAAFdkeDwUSXrERmJUYiOUAwRBAa7ojVr2iuIYToZYZuH0AlggZXwABycAAiaQcRegB4CQBfE4EoJkQEtkj27EQ3BERxyAALkFKXWA/gi9AhNZpEU99EN+tET/dUDlUwOqtYoO+Y2uGFGD6IHlGIUvkIV64AdpgARBEAIq0I0qcAeCoAXrqALyaBBIRF7ZJkRd+QVPNJBTNBFVpEEbZFI79EMi1EI82ZNB6ZCt2IRYFotHCU5XgAZ54AeD0Acr6AEm0I0nkJdgoANjpRBbyZVsOUAwJEUOoT82FAMb84//U1cCREEs9ED0ozY08JZaNpROOJcVCU4/J05q4Ad8UAhtsIIfIALrhk54AAhccJWTWBANhJnl00IUxCANckGf8pLy4jua8z3dgT/TY5sndjybyZmH5Zkc2IFfdQVgoAW55AJe5XuS5geB4AZP/qCaJjBkuuQCcLAHsVmCCNFADWabb3U/4NMdWRMDixI2wEmTwkk8ntMfzpM8f7MCyvmNRCmOlsdjenAGqqUDDnUF4KYHUQAF+deFKkCCKsAFeiCeLYBOcVcQK3A693k8eiM81GM/tkUR7tk/P6MRmOMwWDQ7tdMDWJMDNlM6p/M3gaOfYsUCWJBOGsiEgfhNFmlmLaAFcJCXVzACIxCVP6cFfIAGS3AEXOiX31Rf4MkHesAFE3pfBnGhgoNirlMzWIMDEEE+tjMRNgQhuxM3c8MwJ9M4arM3tlUzfmM6rOM1GJBTL8AFaCCSX9VQDJUFCnUF8PdNWMBQSwgGecAH/n7QBFwoAirgUC2QfGhgBUkAAiJgAlGZBRBFdnDgB3ggpRRaEIfTNYNzOhCjpTJhn1iDMymDF4VzgFFjETKDN1s6ETNAAwLDbym3M7oEjllQBqKlB1rwp1rQc2GQXFdghSegA3rKBVjQAmjAB3wQCFVgBF1oAss1p3qAB/CYTi9AWgxlaH4AB2AwpSpQoQIxNrQ6q2e6omuDM1KzKCyjhmEzBjA2KdYyNRJRMzfzMASnAUPDMxhQAdMZam+QB3oABmEgZWtgBmhABuOZTlegBVlllXfwB26gnaopAr+qA8nnB2HQjXc5WmXwo4KQB9+KTgQRNPu6AvpaNBCDNBMR/hP42jQs45ths1R3EStF0zAPczczgDEXgwEr0DHukhIHkAWGBgd6cLSAAAh6QGVnIJ0TpQM9l1x6MAiF0AVKyoIm0HNZAKGFgAfDWl8+WlxqYLSFMLAvcE7JJhAF4LNAezEVs2IjkzQ5OxHfBQMrgwgyGzdBwhreYi0ttzXlci7psi74ArTvQhAtULR+UAiF4AfuqAbRCa66NKdnkGhM+QROoJodQHYKewaLuwdnoAP1lYVTpgdlG5vnVKH2YrgbYixxEIA+UHUDYymLshxAYkQ9UAC54i28Al6/Eix1ogFa0SzIwicCUQJSlpd84I4VFp2Vik5zKlpggAZ+cAZS/sCFIACVKjBaYGa6Ayu6ugRm7QUHd2C6eKAFopu2iNAAx8K+ySIBDaAB0UIj1IKyvYstXcGDR8YaddG3MFAxmZITnBK8C4AApzIqA6EAWZgHd3AH7JWwYHCt6HQFa4AHgbWscMCnjSZaGNm1g1lfoUZhepCRaqcCA8G+B4wqCCC/dMAqh+AqsCIri1IYBnNkj5ImkuItbPImcZITJRIHO4AnV/InBEEAkjZpzptOOtCtb6CrhOq06YQGasCtXRsGw6pLIUy+epAHZ0CpcbcAf3IgCbIDr1soh3AoMgArswImSpFBXGYmRDIYYQImG6AkQDAi0uJDUnIlBXHEFJaw/uhLrEv7ZqeZwS2gWuBJYYTgwVe8vVPWwN6KBSdgZ2B8IHgSAFC0JU7SJfdEx4zSFWQiaBkixxvSFR9yAwHEJC8cBxVgEnoiGgJxAFncxBFshVggCA/8BqbrB2jgVed0BUV7B37Qrb3aAjiVSzrwseylsC1gAMURGlRRATLCJTeSIztSFxyiFHIREp1WH5dxH2MyASACEf8BRUKsIgKhAkX7wGBAqdDrZruMBqeVSxPGXsLsB2zQq6WmvmfXXMkGKD61IA3SAzkSIRryHttMfnjGSN58HXTRGpXBHT7gAON3Hi+CCC6wzoFllc91AlpwBiJcCIBQp+CLdiKsB2iA/qy52FoHYR7oMQYOsB7t8dAQDRsK/Wg3oLZvcRuY0RW6IRcTAARLARwXfQLERWXOy2EHoABFu5QorXa5RAFtNmXRmaxZORDmcRyeoRz2kR24gRhNcdOexkg6vdOWgRuagRSd8RmmoWMAcAXtpbBXQGSJRbpHy8X6rALsRLrsVdUqgF9t0daB4QCqYRetoR3woRjQBmskITFtsRgfwdODsRld8RkhwRHrhdQSvEuIANfk645V/QJpawExVQZlIJL87BEbERgaQtmIHReQzdhosQM2pBBE4R6VHRsfYbMLIwPJVmiiJlNijQhp8tWL8c0IrdtuTBCQKdtn0RAP8aEV0FE3NNEUNYwIsvEAMVwtmfMS3m0D2DcVAQDWih0SVLEYeGIX1SEBFLE5NAEEZuHc8pKFfgAGVsiIApGKKXDV8t3fBaHOUFpfJcDS/l3gO+ECS3kFumSCBt7gJJEFhZAFE+rgFD4SD9DOL4DfFb7hBiGuHP7hIB7iIj7iJF7iJn7iKJ7iKr7iLN7iLv7iMB7jMj7jNF7jNn7jOJ7jOr7jPN7jPv7jQB7kQj7kRF7kRn7kSJ7kSr7kTN7kTv7kUB7lUj7lVF7lVn7lWJ7lWu7fAQEAIfkEAQoAggAsAAAAAMgAfQCHCAcFCQgGFBIFGRYGFRENFhYOHhoOGhUQGhkaIR0IKhwVHyEQKCsXJCIeKyMbOjMSICAjJyYoLCsvNCshMTIjOzElPjMoOz4sMzMzPz01Nzc6PDw+VAcFYAAAbQAAbA4LahENahcSRjwiSDwuUjYqYy0jZD4wXlMgTkAxRUk3YVMubUU2bk48YVA+cF85cmIyQ0JBSEhHTU1PUU9KTVFAVlpIU1JSWVhVX11aX2JRdWFLY2Nfam5cZmZmb25rdHhmeHdzhAAAkAAAmAAAswAAuQAAjCkflSgfrCQcsSceiDkssz8x0gAA4wcH8QICiFA+1E4970I5lmROgWdQgmxTlm5YkHdcv2dVlnxg61hF0mBO5WNOf4JxnIFknYRpgIB9iIx8ooZopYxxrpFxt5h1sJV4tJl7xpZ94INt7ZZ+xqdxw6J9kpWHmZmZnaKOpquYsLWivr69xqWBy6iCwKeO0K6Jz7CP0rGNy7KZ2LiV77ab4L6f1bug48ao6s6x7tCyzMzM1dXUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP4ABQkcSLCgwYMIExaMEwcIkB47cNywQVFGDBk7gBRAoHAggo8ICnQcSTCASZMiFYZ8aFEGRRs3cOzo4ZAhoECBAJHcybOnz58FLSY8aTJCBAlIkUZoAPJjSoEmgRoMIAhlgY0gGxxNKsEoUYUwbOAA8iWO1LNo0yKUURArSAgIIMjdKgEDBAxKmS64qvbnVQQLtCK1i7drBLlw4TblSFAGjr6QI/d0i7gyBKNGkd6V8KVBgwWg90r2ebVA6AYQvtSFoBSz5cQgn46ePZsyYsyZuR5mDQRCAzamQdP2Gxx0ATZygUiYy9WwUcuxh0s/uzHx5dxJnyO24cMHBDCAA/6Eng409ALxxyF0t1EZe/bKTsnL71idedLChyXAuLFjR3cgYAAnnnnz/WQeaAEcxwYQ3fV3AwzL0YXfbnDJVqB89W2FwYZ4RYBBDPz50EYcOLXBBgZUHXghUKYxQKAgErDRBk5xtOHDDjfEgMFRHE5YoSA+rChdXBpioMGRRtpA04g4BRIHG1+gdCADQkp1oHEmBUgijW08ZIMGRiKJH1yC9FDlaAhoeOQGbG4gAxBw4HQTIG+0gUMBA5rHAJVnlrfnlSbt0MYbc+IEBxAytLmBmF1xtEOfkA2mAZswwLBBBjHMCMhNgdSJQUh7hioqpFKJaioDV2kwqJw3tRFDBv4bVMommHhBQGparBnJZgwxVFqpD1vS2cYGDVBg7LHIUnBrqck228AGg3Iahw++wsDrrLVStaxPd00a60UWxUDDDD68AccbbEhAwYYXtOsuBe5uKxW87dLrLgYXYECBBGDAcS4QM4gLbq/Y2irvTh5q4GsMMNkww8Mx4SADmBlUbHEG7sZ7sF8Zu2vxBRYfOYNENzw8A0wW+QpmBBt35OG3MTyMAw413BBxyQ/7msLOPPfcMlDw9iz0zpXGDNPMNouFQ87X7vjzQS9fFPMMMd2Qw8xIO8wrDVx37XUKT0u1s9dki2tyxDjkoLZEWlu0gdNhC1QXDDLUfXTaOfTXH/7JNTxcQw00AA6413H/dAHZggfeN9U2z6z32mzPUPfbEsRdgH4MwxRTfzxANNPMV99QQw6j/2264IUDlULgiptOOulWO95fD53vLZFLiUpQABBPT5r55j7w0F3nwT+u9vHIm5662K4jj/wOec/kA+3DQ8S2DYlq0PsGDNssfXc+/AA+7TyUX/4OPORQPvLLn0UD8uvzgL755QcPvvjdQWSz29q3/OHRPfiPQwb4gwIWkH4IPF770PI+9SHQfOIrYPgGOMD8sU1HjDlY96Q3wC98gQtcIKABfwCEEdJvgWmpAf1GyEISOgSEXyCLQ6aHIxvwSoNhCZFDPOhBMHwQhP4hBCIQTcgDFKpFhTwYoRBBCAQhfgEMPvTgDGtoLXltQCz+IcsTA8QGKHqRC2AA4xJHaMS+5ICFQgyjGr0IxS5GkUE13MC2cIBFH/SQDXh0Ixv3GEYQGrCMkDnjD9LIxz3mEUoevBEdH0OqHTgmgE/Mo4kOSck9CjEyBHCABVAwggo4wAAHEEDYeABEQ1KSkpPs4hemJ7FH9akHGKHJF/DYhloe0g1uYEMuD2lJtRCgAipggQ504AIWtEAFKEhmMi1QgQO0jJRg9CIlc0lNSdbSRGBokAzMVCUfKMkHAJJRLXFJznKWk5dQVAsKqmCFKlCBClNwQTFbYAJl2rMCBP7Y2A/YeEtz+tMN1wQDg3pgA96t6AvffOI13fAGhjL0DRD95yF9yYIuYKGd7pwCMY2JTHvacwIAONgg8/hPiJq0oQ0FqIkSSVCDzgehASRLgB560pOeK6LnVIsCqNCFnl7UnVQYpgtaQE+PetQBByvATMlZ06aaFJd4jOH0bBAl8nxBIP4B5yx1aVJ/efWrNXVDXyzQhTH01KI/hScxidpRoyoTqQfjgi5paq6vgjWiqlxlDwgqg6oORwYx2WsTZwpRuxrWXw2FTAvGwNgwnDWtQR1qUd1qz5BujAu4LOxh75rLMA4URxbx62iOlkQw4pGuhj2pWCMTBjIwdgyOtf5oO98pz6G2lbIogGvLMEvTw6oWj2H8QUQmEq6rQoZXMxhdaU3LVKdGdDYOWMMaXMvYs1phthqVLG7tKcqn/WCuzsVpZ/2Yvr7x6iJn6RUMVhc4tSVxkG2ca2afulrasEC6anhtbNMaz2Kq4LaUnUDq9plZmp7TjVw4oNoGl4JKdaQB/kFoBjBAtuS6d7nSPC1U52MF6U63sdYFam2PuV1lLrAA+9TwLoHbxx+sj3SD6xoGMnADvXpGEBGgAGYaUJoe+9jHe+HLisbg4TW89rGzdcFaW1DiZHZXKgPggGWr9OMqW1krRtFxAwApEAEQ2cOuja1Fq5BReRK1niXOp/5ULPCBDnCAy3A2iAuKbGTY+vS67pQnR5vsTINMILcGSEgFriAEN8f50AIhQBiKnF87j7kK8dSBMZlc4j4TBAVemEIISqBmg3QBCoV+M6IPrQI6h/nOIp4nmnHbaYEYoAx2UEIHOvCAg6DgDEUIwqwHMOpDd4HRR/5pnplcAQU4oAKbRIEKrNCCECRzygKxAh7ukOsOlOAgWNACEXTdAQX0Os4iUEORqdtTK0xBBSIItCAG8IAECAQABrAoCKyNgoK0YA17yMK2OwCCVgsCBWVYwhAKbehvw3nOHm40FtItkAFUQNlDfcELTnACF9jhDASvQEHEsIc0NGHfHVD3QP6qIAYkDIHbtUa0c3hs5ZaXBlIE+LWHzeptYLqAtmbuqAnIsIcoDGHWnB6IAfAdhY9zW9QD6enAPTBr3RbI5VDHco6X8hFBRPgGE+Yaey3swEFGk6TkBK5L5VMBMni4C4FGgRV+OoXsGrOeVLBDGpgwBKaDQLcWsIMenEB3lBekp0oIgt2dPprdcTHseYQiedNHOrLRYMY1vpFnNoIQ9bJ3dOor4NflO99yguEH8jGBuLHA6xbcGecjXmy+mSAEpndAwAIxQR7Q0IQitH7WsB+IWamAzBKQIPeRIXA5xbtLxSu48TRoMAzQUrfzWhjDGg5vStkAeuncXJQuMKu5a/7LfXnqQO58v7218SkIF+zhCkUY+KxBAHxBMNYKLlBm+9Hy3fl2VbXFJy/pAsYrtvTlC/1HWvB1Wl2VWvTFBbQhALw2ADrQBVZABd0XgVTQcbUnfiWQTA5QBX8gBUsHdO0XBnLQBVOAZhqnFrxlU3aFf8bHA2xTXJIRAAAIWDIRPsxVgJt1U7iEgJKRANjngJAWgd1XBefHBCBnbURVUX9ABUYgeNZGAiWYdHaQaR31hFJxgnV1gzjYRSHkOTcQWtrygjDoElkVTlylWb71WzrYF+5WAVhwUfBUTCzAAkBoBXlwBURwcrPWASRATNn3B13gAquGAhZgaYLQBXQggv7KRIU+IVf2d4UG2FBRxQUNgj1R8oWjwQYmAVNaRVhNdVNhFXZgYCEjcQAE8GQC4W5U4Ib9BYdx2H1d8AdP0IGzhgJTAE9jsAdjoAOUdk9qRgVzMAbnlkyKuBNKxXl0ZS7IiH+qNFBUZRJsMB1tAAYwmFBfsFAO1VT+dEgJNorHhgKByEwi8HAQ6F/HpALHdISt6AJhsAdTsISuRwK0aIt7sAZVsIse5UxxJwZTQGnDOBIjBXbNpVoppVKqNFVRAgZtMB9tEADeFFMBMk7/ZE7oBEXVl2gOMAHF9nAA1mT29F/meITyNAZ/gAUusAK+p0y1SAW3aAddoAO4NQG3CP6MJOgT+5RhxhiR1wQlA/UmAZCQF7KQsJRVWzVO/bRiEwlCRXQALcACgciRTfaRSxmSfTAGQ+VR8DQFXbAHdhAGVGBPJrBqVbAGfwCMHWUBPQFN/DRNc0VStqST07NNPVklQPlIWiRJpzSRX4SUD2iPTrldHWWO5iiH67gGVMCXtVUFeVAHIrhqRKVMRDaWU2BPPIGW0RQg8XWXbelDrIQRcXkmmLhIEeZBeFlIY+Ri8deX22UCU1AFgJhM/9WKWWkHWGCYGtUFdjAHiKhMS8lk92YHfSAGXZlMI7AT70VIhWSTUbRKESEWAfCMkPIFCHBFM8hDkaRHbCRGLTZCOf6AmrjVAmJgVvWom7WVlXkAnB7lAho1BonZBcGZTC1gW1SwBnawB/oofyQhSAa0RMfpRjwER3S0AQhgXJACB4LQKzCRRVrUQz/kR0uUYAdUPjXAnW4Vn/lVBW3VAsSkA4iZB2NABYHYdvG5ByHooeLJAsu2BnlAn5GZTCKXEEj0Xl4nRDHKBU9EnVM0EVWkQRsUUzv0QyLUQg8KoRLqUTIXhbuIoZFmB3bQobuoAvAUlntAB17Ae8pkZi3QYXuAi8GIAqZ4EC8Ko0A6QDAkRQ6hPzYUAxsDnf8TWAJEQSz0QPSjNjSwXS1ABV5wjiiAnm2nA+KGb2ZwpO6kA3GHi/7h6Z4PiAX4FoX7qExU4E5doAZzkKXAyGRmqRANBKfl00IUxCANckGfIqDy4jua8z3dgT/Tg6kvdjw0IFlE1ao6gAVeUAZ3OkyNel0yJ59rYE9Xam62uQdlwGxoZnpV0AV10AeKuotVMAZ9Wgd+oKIsgAItahANdGGYulf3Az7dkTUxsChhI6oHSqrE4zn94TzJ8zcpUAEjUKe1+J1moAZmwJJUsHaw+p1rIAdncAdmUEwrsAIugAUOeIvzCH9/2VNjYAd/YAfAyZTJdKvy+Qd5IIItMH8EkQKnQ67HozfCQz32M1wUsa398zMagTkOg0WzUzs9gDU5YDOlczp/E/44YDMQBLBY+KWkYiAGZSBd7Yqic7AFWpAER6AETnpWarAHf7AGf0hpizUGZGCweNChVakCfSpdBiubOmAC/jaxLbuyrlMzWIMDEEE+tjMRNgQhuxM3c8MwJ9M4arM3w1UzfmM6rOM1F1AQBxCW0pWleLAHeFAHayBuc4CwWACBz8pT9Eq0h6iLyXRf4mawhIq4OlBkc5AHfbAG8MelCHE4XTM4pwMxXCsT44o1OJMyeFE4zxg1FiEzeNO1EzEDNCAwjpd8O3MQj7sGkfoHxjoHdKYGDliY6/SdRNYHf0AHWDAFJooC8Sldxeqr5kZPN+thdpAHS1oFLnm1AjE2r/7rummLsmuDM1KzKCzjk2EDBjg2KdYyNRJRMzfzMJaXAUPDMxegLPa2uFrJt3RmtIELiIg6XbUbhRDIZB0mXZEavfvYAvOIvEpqtKxJeAIRNO2bAuxbNBCDNBMRE+rbNCwDqmFzVXcRK0XTMA9zNzOAMRdzASnQMe4iiihAZHWAu/VLBj1VBca0tx62B37Av4jLsEo6BlaAuHxgBwCMu2JAkt5mEAVAwiZ8MRUzYyOTNB88EeoFAysjCBgcN0HCGt5iLc23NeVyLumyLvhiwu9yEBPAsHRmVoH7lT7svPPoBdJronRGsztMT7QLZlxpuQdhL2C8IcbCBsjoA/w3MP6WsijLASRG1AMFkCvewivr9SvBUicZoBXNgix8UhDxVr/SpX0uYI4FbMBGa27GlMYAvAZisLwtkF9dwJomoMAEwQDHwsrJEgEMkAHRQiPU4sCKjC1dwZBwxhp1ccUwUDGZkhOc4sgLgACnMioGUQFfRmeOFbhXSgf0S7t1UAanDIgyG7VmXLVMBlIkwcrHjCoIIMtvwCqB4CqwIiuLUhgGA2ePkiaS4i1s8iZxkhMlwgY7gCdX8icHUWpl3MyOGgZqELVGxp7x1wJtp7BnVgHQRhIL8CcHkiA7wMeFEgiHIgOwMitgohQZFGdmQiSDESZgogFKAgQjIi0+JCVXsv7PURsG2IWe7xSvy6x9XRmtZ9HQB4InAQBFW+IkXUJQIc0oXUEmBpchH70hXfEhNxBATFLObEABJqEnolEQbDgFItARCtACVYAF7qQC/cgigCIIFCAjXHIjObIjdcEhSiEXIWFwBFEfl3EfYyIBIAIR/wFF+KwiGwMoxcipM5EjEaIh76HWovhtjOTW10EXrVEZ3OEDDRCK5/Ei22Ie6AEGDbAe7YHYiQ0bg83WgnADAmEbc4EZXaEbciEBQLAUwAHZpGIex+EZymEf2YEbiNEUm83ZA8FIn90Ur3HYW8HLnfEZpiFkZ3IVexEYDaAadtEa2gEfilF1tt0TEtMWi+XxEbehIZvRFZ8REhs9H9odGNbtI2rd3CDx3H2xAzakEEThHtgdGx/BwQvjfwhR24KQJrK9GG8d2Oy93QOBpuStFg3xEBxbEXVDE7rd1gVxztWSOS+x4DZgiVMRALMt3ngy37QdAHZRHRFAEZtDE0BgFv394SAe4iI+4iRe4iZ+4iie4iq+4ize4i7+4jAe4zI+4zRe4zZ+4zie4zq+4zze4z7+40Ae5EI+5ERe5EZ+5Eie5Eq+5Eze5E7+5FAe5VI+5VRe5VZ+5Vie5Vq+5Vze5V7+5WAe5mI+5mRe5mZ+5mhOEAEBACH5BAEKAJAALAAAAADIAH0AhwgHBQkIBhQSBRURDRYWDh4aDhoVEBoZGiEdCCocFR8hEColCigrFyQiHisjGzozEiAgIycmKCwrLzQrITEyIzsxJT4zKDs+LDMzMz89NTc3Ojw8PlQHBWAAAG0AAGwOC2oRDWoXEkA5EEg8LlI2KmMtI2Q+MFRKFm1hHFJGJ15TIE5AMUVJN2FTLm1FNm5OPGFQPnBfOXJiMkNCQUhIR01NT1FPSk1RQFZaSFNSUllYVV9dWl9iUXdkRHVhS2NjX2puXGZmZm9ua3R4Znh3c4QAAJAAAJgAAIsTD7MAALkAAKUfGIwpH7EnHog5LNIAANgICOMHB/ECAuAjI/U5MZFGNohQPrBKOpF/OcpJOu9COYt3Q4FnUIJsU5ZuWJB3XL9nVZZ8YOtYRdJgTvVpWu1+aH+CcZiBUaGMQ5yBZJ2EaYCAfYiMfKKGaLCTa6WMca6RcbeYdbCVeLSZe+CDbe2WfsanccOifZKVh5mZmZ2ijqarmLC1or6+vcuogsCnjtCuic+wj8uymdi3lNi4ldy8m++2m+C+n+i7ndW7oPiwsOPGqOrOse7QsszMzNXV1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj+ACEJHEiwoMGDCBMW7NOHCJEgP3boyEGxBo0aP4gQOKBw4IGPBwh0HEkwgEmTIhWGfGixBsUcOnb8COKQoaNHjxyR3Mmzp8+fBS0mPGkyQgQJSJFGaADyY0qBJoEaDAAJJYGNIBscTSrBKFGFM3LsILKmj9SzaNMirFEQK0gIByDI3SoBAwQMSpkquKr259UDCrQitYu3awS5cOE25Uiwxo6+kCP3dIu4MgSjRpHelbCmQQMFoPdK9nmVQOgGENbUhaAUs+XEIJ+Onj2bMmLMmbkeZk0EQgM8pkHT9hscNAE8colImMvVsFHLsYdLP7sx8eXcSZ8jziFECAQ2gAP+hJ4ONLQC8cchdM9RGXv2yk7Jy+9YnXnSwoclzNDx40d3ImwAJ5558/1kHmgBHIcHEd31p8MMy9GF325wyVagfPVthcGGeEWAAQ38CZFHHzjlgQcGVB14IVCmMUAgJBLgkQdOfeQhxA860IDBURxOWCEkQqwoXVwaYqDBkUbmQNOIOD3SBx5roHQgA0JKdaBxJgVIIo15PJSDBkYiiR9ckARR5WgHaHjkBmxuUAMRfOB0kyN75LEDAQOaxwCVZ5a355Um/ZDHHnPixAcRNbS5gZhdcfRDn5ANpgGbM8ywQQY0zOjITY/UiUFIe4YqKqRSiWoqA1dpMKicN+VBQwb+G1TKJph4QUBqWqwZySYNNFRaqRBb0pnHBg1QYOyxyFJwa6nJNtvABoNy2ocQvs7A66y1UrWsT3dNGutFFtFwgw1C7MHHHnhIQMGGF7TrLgXubisVvO3S6y4GF2BAgQRs8HEuETaIC26v2Noq704eauArDTDlYMPDMe1QA5gZVGxxBu7Ge7BfGbtr8QUWH2mDRDo8bANMFvkKZgQbd+ThtzQ8vMMOOOgQcckP+8rCzjz33DJQ8PYs9M6VxgzTzDaLtUPO1+7480EvXxSzDTHpwMPMSDvM6w1cd+01C09LtbPXZItrcsQ78KC2RFpbtIHTYQtU1ww11H102jz01x/+yTg8jAMONwAOuNdx/3QB2YIH3jfVNs+s99ps21D32xLETYB+DMMUU39AQDTTzFfrgAMPo/9tuuCFA8VC4IqbTjrpVjveXxCd7y2RS4lKQAART0+a+eZCANFd58E/rvbxyJueutiuI4/8D3nPJATtw0PEdg6JatD7BgzbLH13QgwBPu1AlF/+D0DwUD7yy591A/LrA4G++eUHD7743UFks9vat/zh0UH4j0MGOIQCFpB+CDxe+9DyPvUh0HziK2D4BjjA/LFNR4w5WPekN8A1rMEMZiCgAYdAhBHSb4FpwQH9RshCEjoEhGsgi0Omh6Mc8EqDYQmRQzzoQTZ8EIT+IQQiEE0IBBSqRYVAGKEQQUgEIa6BDT704AxraC15bUAs/iHLEwOEByh60QxsAOMSR2jEvvCAhUIMoxq9CMUuRpFBNdzAtnaARSH0EA94dCMb9xhGEBqwjJA54xDSyMc95hFKHrwRHR9Dqh84JoBPzKOJDknJPQoRkJEBAhANSUlKTrKLa5iexB7VpyBghCZrwGMeVnlIPegBD688pCVpIwAUahKMXqTkK3cpyVWaiA0NqoGZqiQEJQkBQDJapSuXyUxmyhKKkjFABVYAg2quwAIVmIADCjCAsA2Bja1spjj14Es2MCgIOeDditZgzCf6Ug97gCc890DPcR4yMhX+gIEPusAFH/jgBTBowQoGStAVOAAAPxtkHsdJz4bGM57kNFEi0anO+bAzgGQJ0Dwd6tBz1dOZkBEADL7gBS90gZ8+iAFABVrQgY4gAT8jgEaXydGaNtSVeIzh9HIQJfKsQSD+OWYqYdlQfxn1qBzVQ2QS0IU0pOELXzhpP1VqzZYSdAQF+JkZYLlRcx0VqfUEZSiDgM4a9HQ4NYgJWZuoUXp+9a3+iqdkLBAGp6YhDCU16VQBagKrFrQC3WyZGVzpVriC9ZVhPCeOLHLW0RwtiWDEY1ff6lClSgYGb4BDG5waBpLqNaUr9etfwzbYjcK1sngM4xAiMpFw/RQyvLL+weggG1ma2rSetPEBHHa7Wc6SVKpUZaloB2qAuA2Bq7f9KGL9mL6+8eoiZ+nVDFYXOLUlcZBt5Cphb2rZ4cDBDrvVrF2hqtcYxKCqw11BBZb3TcJu1JluNMMB1TY4FlSqIw3wDzszgAGyyda6tM2lZHE6nwrc4Q5xCO9mw9DZz1I1vQTNavsI8M0BxzK1fRzC+kg3uK5hIAM6GKtnIBEBCmCmAaVJsYpVvBe+rCgGB76Dgn3r4NBC2AIKqWXhVszjHmvFKCZuACYFEoYYg3e3vo0qP6kKAwgPNLAESYAXSNABDuSYAzoespYHAocYy1izvW3wkh8sWhKUgLgFGYD+U0HQARBkuSACCEGVt0xnAbTBywkWr1NLitLgWvUFXpAzCVYg4YHEIBB0MEIHOgDTg/RgCR7oAJ3pvAIvf7m3T1UyF8wb0JaaAA5piHQICE2QAtjhEFQ4wqIfcJAVgOEIkX7zpAFZZCPzlrN8nip6B9qFQoihCIsmQaEh0QVC1OEJqm7zQbzQBFjPedZDroAd8Izku/K5C6Dt9EA/bQgoKLoDJSiuQCYQh0ZoQQnfBoG4B7ICNyTh21aG9pC74OUjh/m3mwaoCgjKhUCUAd2LDsG6VwAIQ0gB3ZFmdEHSAIZ3LxoEs3YOintM8dL0KQFdjnF4abyFLcggBQ9AQAL+HlABOCCCCkoA9qIdMJAXHIIOUUiCyjvA8oE4AA5XcHgHQlClivv8xyVeykcgoV8d8Jdr1P2vAweJy4UuM7UVJQ8M6n3rM2xBBSJAgEAE4IDiOsAPdYj5zEswEB8cAgxKcHabay6QFdjBCkZQOdmlszsuPj2PUGRu+khHtht8OMQ38sxGECJd6o5OfQVsuna3y0w2DIE8X/Dybs8gAh1Lk5oAbTIMBPFvmS8a3APpwiGucAQjJDwEbIcEDODwBSuUoAQhIAFt2stM5cYy7/Pl+w3sOwO01O25/w3wgJMLUTw8njY3NzIaFgCJCryAC1LNtgm4UIgxpD3hoBfIFw7+4YS4J7wEjRYIDOyQhi70daAIhcxxt1vUyt6euaQLGK/Y0pc1zP+x2JVsUSnLXTPQZgVxcAd2gAZaZwIMhm8pdV4w4AWCUAXvhn3rJRBpEAhdwARIwAEgcGbhp3oy9gUxQFBQhhal1VFf5X64BwRs41qSEQD2l1YyET61tX+G5VGu5H+jMX5YUEsvsGdTZV4+GANpwH2ll3AgQAIHBQlvcAhhcF4FlXqVxnofiGYiuF0zaFRhlVieowOMpS0ryIIuEVTIRFSFdVqoZYOQcQIoAAAG4ANp4AWb9oMv8INp8AdWgARFkHCDpl4DAAeNAAc+IFwGRRBP6IERdhZbxX7+XkWG8ZRTZtAg2BMlXDgaeGASFyVUbVVTHpVUT8cGFiIVD4ACkFAAX4BX2PaDphgDcJAIrecCr5eHK9BXcLAId9AFTUZQE0AQDjBtX+ADhegXM2Vb7ZeJHwVK58RTJoEH05EHbMCC7bQG7yRPNSVOhyRfanECADAATUWKCXiK5hWLasCEBeWDcHAIhBAGL1BQt0gQbfAHS9iLPaFQTgeMNwVREQVKOxUlbJAH85EHAVBMGBUgyjROzfRMUHR8Z3ECqmdtS8ZP1RSHP8iHc+ADtUhQPsAFXBCEgZAGXNBSD6BjDnAHidCOA7WBJPFNArZ4AhlREnVObxIA+ngh/Gj+SkE1VMoUThdGkCBURCMxAA7gAAlQAAYwAALwACfgAA3WT13QBnAQBrUIAw6JiocgCF4wkQO1T1ywfXeQBlHYUizHBYDQCCK5Aum4E7cETrrEVQvFSlDCkkHgklUSk4+kRZLUSQT5RTmZEAUwASNwfn7VAtUEAybwAgEoCF9QUE/ZBodwCFrZUtDXBV8QCHcQli1VcoEAllsZgSRRlrgUINlFl2rpQ6KEEW55JpO4SPrlQXVZSGOkYVtXAAlweVTpZCtAb4AACD1QAufnlOaFkRrZUifVVJApmXz5AndwCI3wBec4UGPZEddFSIV0klEUShEhFgGAjJCyBgdwRS/+yEORpEdsJEYZNkI8oG2yKVpFFgiD0ARxd2Yt8AJxWGwZuZEE1QL8xAVwEJy8SFBV1QWnFghfMJEkiRCCZEBL9JxuxENwREcbcACvBSl8AAm9AhNZpEU99EN+tETydUDlgwPlmV5vEAh1QAZT8IC46ZRxCAgZ2QXCBQP1aQeFEJlbSU2AuQJpUJyA8J8gOBJIdF1MJ0Q9agZPxJ1TNBFVpEEbhFE79EMi1EIauqEdKlpzMAhaIAZQ8G5F8AEmoJtdEAiB0AbmN5/95AXFCaMFBQNMmAZ+cAiROZE6ukJMWkADBENS5BD6Y0M0sDHY+T9qJUAUxEIPRD9qcwNP2lL+U9cIiiAGT2CluOmDE9ilU0lQ03eVaQqjfGmmAJUGgCCL5jhQmIkQDfSn5dNCFMQgDXJBn9Kg8uI7mvM93YE/0wOqG3Y8gjqoVRkIf5AF51Z6RahP/gQHhRAIcPCoFHmRgKCmaeADw6lSulWZN/oCfZV6BtFAAAaqZHU/4NMdWUMDixI2qiqhrEo8ntMfzpM8f8MCtLoCPvAHgpAGVcAETHBm1FSRunUIhRCsVMlPE8gIWSmR/FaRcWAHlXkHhDgCCsECpzOux6M3wkM99sNaFKGt/fMzGoE5DoNFs1M7QYA1PGAzpXM6fxM45mpVLKoGmoeuFskFYsoIasCv+in+Vad2CHLQBTHAUiYQVRPYCFlJiwTlVP96BwGLnCsQoANhsILDYa5TM1izAxBBPrYzETYEIbsTN3PDMCfTOGqzN6xVM35jOqzjNRdgAn5ZTT4QBmogB2nAq12QV0XGCILQBQBFUDEAVV3gB4twCHPgBeAIAwx2s4RQfs76im0wbdNWCDgrsysgawNxOF0zOKcDMUgrE+KKNTiTMnhROMgYNRYhM3iTtBNhAzcgMH23ezsDaBapBt9lB3IQCGqQtnubWcXZCH/wBVzwt1xQV5jKCHbrgbW4g2lwn41wCG8gs03mAwF4YIFgnLN4jiFIEGMTuqBbtRq7NjgjNYvCMi/+GTZsQGKTYi1TIxE1czMPU3gZMDQ8cwHKAgkmUKMHhqJq8AZycGBzEIDGGQjBGwN9dZG96we/G5n/VJXfdQdfCbPY1mRFNm13UAiLUK9uuwLrNhBBQ74sML5FAzFIMxExEb5NwzKoGjY/dRexUjQN8zB3YwMYczEXwAId4y4pIQD0dmCJmQiHkAiQOW2HsAgp+ofomgZKeQeMALt+K1BeYMDFeQhwMMCVFmPHewh+UH4fKGsEcMIpfDEV82EjkzQiPBHSNQMrAwkbHDdBwhreYi2/tzXlci7psi74ksLvQhAwULzGyQiJAAgH5geEcAgZ6QX8ygWBawdpKoury6/+b+BlifkGeNtXf4DEdsx6tDhsAmEvarwhxoIH5rIHQiB/A2Mpi7IcQGJEQUAAueItvDJdvxIsdZIBWtEsyMInbfddgUAIgSDHc8ylWSm75/gFguuzhBCZeGymgSC4KFqvhVxpkAnAfhAHTxUDyykQDHAsy5wsEcAAGRAtNEItERzK2NIV/ThkrFEXYTwDFZMpOcEppawAB3AqozIQJQfAsIzEkPlUs2sCczDMuJyVeNwC6RpjKAoIitxkf6CmAmgHm+UD0AoJy2zOqHIA0bwHrPIIrgIrsrIohWEwQ/YoaSIp3sImbxInOVEiePADeHIlf1JqNeoHlnYHfgBqUXX+jofMznIQBoZrAvLsB3L8VDKLinIMXm3wn4wMCQrwJweSID8gyYXyCIdSA7AyK2CiFBmkZWZCJIMRJmCiAUpCBCMiLT4kJVdCEGpW0geG0hsJAzHNpXbg0h8I01RH07ULartcAYjL0y5iHngSAFC0JU7SJegU1YzSFWQibxny1BvSFR+iAwHEJAyNBxRgEnoiGgKBcQd2y+DlzjDABTIcY35w0p3FBWYayHZgBwnGxNYEWApRHKFBFRQgI1xyIzmyI3XBIUohFyEhbwRRH5dxH2MiASACEf8BRR+tIm1nZI0Nang1toFcb2/wVF5AXrs8Ag6wvB0BKDK1IA0SBDn+EiEa8h6u3YnQxkiyfR100RqVwR1C0ACceB4vonqb3dWZ9pt59QV25bYClU3M3RPmgR5s0ADr0R7d7d2wgd2wDQk6IBC2MReY0RW6IRcSQARLARzlXQFtCAMNPB9wjQeeoRz2kR24gRhNwd/9PRCMBOBN8RrcvRXb3BmfYRoudiZXsReB0QCqYRetoR3woRhDt+E9ITFtsRgfcRsashld8RkhsdTz8eOBseM+4toyDhI03hc/YEMKQRTu0eOx8REfvDD0hxAaDglpcuGLMdvWHeVAPhB3muRq0RAP4bAVUTc08eGxXRAOXS2Z8xJwngOROBUBgOFHjidYnuEBYBd+1REBFLE5NEEEZiHmhF7ohn7oiJ7oir7ojN7ojv7okB7pkj7plF7pln7pmJ7pmr7pnN7pnv7poB7qoj7qpF7qpn7qqJ7qqr7qrN7qrv7qsB7rsj7rtF7rtn7ruJ7rur7rvN7rvv7rwB7swj7sxF7sxn7syJ7syr7szN7sBBEQACH5BAEKAIsALAAAAADIAH0AhwgHBQkIBhQSBRkWBhURDRYWDh4aDhoVEBoZGiocFR8hEColCigrFyQiHisjGzozEiAgIycmKCwrLzQrITEyIzsxJT4zKDs+LDMzMz89NTc3Ojw8PlQHBWAAAG0AAGwOC2oRDWoXEkA5EEg8LlI2KmMtI2Q+MFRKFmldHFJGJ15TIE5AMUVJN2FTLm5OPHRHN2NUNGFQPnBfOXJiMkNCQUhIR01NT1FPSk1RQFZaSFNSUllYVV9dWl9iUXVhS2NjX2puXGZmZm9ua3R4Znh3c4QAAJAAAJgAALMAALkAAKUfGIwpH5UoH7EnHrM/MdIAAPECAuAjI/U5MZFGNohQPrBKOspJOu9COZZkTot3Q4FnUIJsU5ZuWIVwWZB3XL9nVZZ8YO1+aH+CcZyBZJ2EaYCAfYiMfKKGaLCTa7mbbKWMca6RcbKUc7eYdbCVeLSZe8aWfeCDbe2WfsanccOifZKVh5mZmZ2ijqarmLC1or6+vcalgcuogsCnjtCuic+wj8uymdi3lNi4ldy8m+C+n9W7oOPGqOrOse7QsszMzNXV1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj+ABcJHEiwoMGDCBMW1KOHCJEgP3js0EHRRg0bP4gUQKBwIIKPCAp0HEkwgEmTIhWGfGjRBkUdO3j8COKQYSJFihKR3Mmzp8+fBS0mPGkyQgQJSJFGaADyY0qBJoEaDLAIZYGNIBscTSrBKFGFNHTwIFJGj9SzaNMitFEQK0gICCDI3SoBAwQMSpkquKr251UECrQitYu3awS5cOE25UjQBo++kCP3dIu4MgSjRpHelVCmQQMFoPdK9nm1QOgGEMrUhaAUs+XEIJ+Onj2bMmLMmbkeZk0EQoM6pkHT9hscdIE6colImMvVsFHLsYdLP7sx8eXcSZ8j1iFECAQzgAP+hJ4ONLQC8cchdNdRGXv2yk7Jy+9YnXnSwocl0Njx40d3ImYAJ5558/1kHmgBHFcHEd31twMNy9GF325wyVagfPVthcGGeEWAQQ38CWGHHjjZUQcGVB14IVCmMUDgIhLUYQdOetghxA871IDBURxOWOEiQqwoXVwaYqDBkUbqQNOIOCmiRx1loHQgA0JKdaBxJgVIIo12PKSDBkYiiR9ciwRR5WgIaHjkBmxuYAMReeB0UyJ42MFDAQOaxwCVZ5a355Um/WAHHnPilAcRNrS5gZhdcfRDn5ANpgGbNNCwQQY1zJjITYrUiUFIe4YqKqRSiWoqA1dpMKicN9lRQwb+G1TKJph4QUBqWqwZyWYNNVRaqRBb0mnHBg1QYOyxyFJwa6nJNtvABoNyqocQvtLA66y1UrWsT3dNGutFFtWAww1C4JEHHnVIQMGGF7TrLgXubisVvO3S6y4GF2BAgQRm5HEuETeIC26v2Noq704eauBrDTDpcMPDMfFgA5gZVGxxBu7Ge7BfGbtr8QUWH3mDRDs8fANMFvkKZgQbd+ThtzU8zAMPOewQcckP+8rCzjz33DJQ8PYs9M6VxgzTzDaLxUPO1+7480EvXxTzDTHt0MPMSDvMKw5cd+01C09LtbPXZItrcsQ89KC2RFpbtIHTYQtUFw021H102j301x/+yTk8nEMOOAAOuNdx/3QB2YIH3jfVNs+s99ps31D32xLEXYB+DMMUU39AQDTTzFfvkEMPo/9tuuCFA8VC4IqbTjrpVjveXxCd7y2RS4lKUAART0+a+eZCANFd58E/rvbxyJueutiuI4/8D3nPJATtw0PEtg6JatD7BgzbLH13QgwBPu1AlF/+D0D0UD7yy5+FA/LrA4G++eUHD7743UFks9vat/zh0UH4j0MGOIQCFpB+CDxe+9DyPvUh0HziK2D4BjjA/LFNR4w5WPekN8AylEEMYiCgAYdAhBHSb4FpyQH9RshCEjoEhGUgi0OmhyMd8EqDYQmRQzzoQTN8EIT+IQQiEE0IBBSqRYVAGKEQQUgEIZbBDD704AxraC15bUAs/iHLEwNUByh6UQxmAOMSR2jEvvSAhUIMoxq9CMUuRpFBNdzAtniARSH0sA54dCMb9xhGEBqwjJA54xDSyMc95hFKHrwRHR9Dqh84JoBPzKOJDknJPQoRkJEBAhANSUlKTrKLZZiexB7VpyBghCZlwKMdVnnIO9yhDq88pCUxKRlNgtGLlHylLiW5ShOZoUE2MFOVhKAkIQBIRqt0pTKXuUxZQpGWoxkCG1vJzGreoZdmYFAQdMC7FZWhmE/s5R3wMM5x4uGc1jykdA4wAQcYgAALHGQerXnOepKTnNf+NFEit9nN+XwzgGQJkDntac9zobOZs3HACFrgAhm4IAYtWMEKRlCBCkzAAAAIWwEEqkyCerSersRjDKengyiRpwwC8Y8xUwnLevrrpTAl6B1GIwATbIELW9CCFmQggxjEwAQSDepEExA3McByoOaCaUzRCcpQBmGbNjDpcGwQk6c2UaDnVKpW/UXO2RhAC2Dwghe2kFMfOBSiQhVqBQ5QVFdmdatLfWUYtYkji0h1NEdLIhjxiFSt2nOms6mAF8YABjBwAac65elDgZrWoFYAnmETg1vfqtS/4jGMQ4jIRMKFUsjw6gaj0+teO/pRdEqnBWNILWG9cFidmvWhEW3+rFAdULghHLW0B5WrH9PXN15d5Cy9osHqAqe2JA6yjUed7EGnQwAtrGENalBtWBG7057GQLYSJQEJVsBWhAxgANuSplsH2kw3iuGAahscCyrVkQb455sZwADZQFtc0eKSryEt0Bba8Nw1nEG1rOVCYnsaW9l2oAMkqMBBCDCBAwvgYAWQJn5jedk+DmF9pBtc1zCQgR041TOLiAAFMNOA0pj4xCfeC1+EtIY59Pe/q2VtWc8q2xhQwQMdCAF3DeKDKhyYA6lDsZCHrBWjjLgB0KwAHejg4ufCeLozXmxjx+CEIhw4wQVRshJw3AFoetknMlgyHfjr39RCOadnLbD+RF0AByVYuQMlWIEBCMKFOCCBy0RNCAAy+uUve0HMTS7zahGr2OsKdQxfOMKbQbCCCQzEAXSwwhG4DOSEcKADD+4zLQWwBkC/2Mwy1sJrfxrUGERa0QdGsKMFogU5JGHSP+6uQSZghA5UWtOYHIOYmexkACN21AXmAh9e/WYEK1gga0BDEoxQbNoaJAFVOMKBcU1LC6Rh12no9aDRbN2gjuEMxE41lhdxgDR8AQnMPjAInF0QLDSh1pimNia3sOsmP1nGWxg1Y9XABXQXe9wToAMWjpDuDoBg1QSZwLnhfWsvO6fEQ454ac7kgE6LmcwAHqtP0yzRNXCB4EXg8rj+LSBwZr85BAgfiBaqgO4fV0niMC+yiJfykUW8dwfx5dpw6evAQd5ynsq8bD+nE2ZPC/rbWohzQx8q0TZ4YQnMFvmxV8AHL7igBFjX7rEHYoA2RJvh09kdF4OeRyjuNn2kIxsOOOzhG3lmIwgJ7nBHp74C/jy5k12mGYawTjXsmsz/pcMbSoDgFvQ0BRVYAR3GoIUXmADrEl11DP7AeENLdOsCWcEaplDwEtBGvMvMbSzNjt6042C9NEBL3XxLX/viF7f4rAPfZ7OCORh9DG34AxuM4AEONHogAV/DFlzA2MgLJAZ+8LgLhGqBgrTA41TIOgkkY1vlZvWvo98t6QL+xiu29KUM3c/rcfnqUr+C9A5imA0Xdt1fPgRCCkiwcghGkAKJtmDJXvCB5X+/CAv4oQ9eoAX7VxAx0AZjsAWWx2dpIVl9VVnnR3pAwDacJRkBAH5UJRPhM1rlB1cG5UrpFxkJYHG8lgZ/EAZREH8HtgIu8FAxMAd/QAbDp1YCYQAuWHlCBVnHRwdrkH9BJWtSwYCUxYFMNVeeswN2pS0UWIEuoVLH1FJB6IAgVQcf2BcrcG1MNgNr8H4nGHIIFgMEtgaE4AZbIAPMNxBkQAgwuH8+OAI66AVkKFFz9oO3tYHmR04iJQYNgj1RgoSjUQcm8U8rhVUeZVAyFXRmYCH+Z+ECczAHMLAIdCAHV3CCvJdjXriCZxCGMRhUIzAQMoCGAihUPhh8PChR7DYZHEVaLmUuhQhK2lRSJlEH02EHZlCB4FQG4lROHlVNh3RekJEFKrAIDsAHcQAFT4BqcOaFPOUFhiCGy5dWjjZ5aoCAoEgQBJAGaTAGPhBUpbgT8gR0qAhS+JRPoERSUWIGdjAfdhAAxARQAZJM1sRMzgRFs4cWKPAAiyBYhPAFT4AEsNaFPCUDWjAIdDCGslUBXAAIbqAFzQiHBaFrY/CGK7CNIyFN94V375hP+qRNbxIA53gh6WhKKsVSyURNFBaPIFREZ/EAIrAIE+AFl8gFSkD+cD+2AsgIkH/QBwQpVCbQAs9HCGugkLNFEF1XCNjIWJg3ErY0Tbl0VPPESlCikUHAkVXykY+kRZLUSfH4RSd5FiewCASwBWBwiWRABUzwASBQAttVk1wwCH+Qk/bHU1pABz4pjY6lgDLAB4cABtkoUc23E0l5SwGCXFjplD4kShghlWfih4v0Xh6UlYU0RhcmFV0ZA4RFBn+QBj2VVjU5BgKZifanU/RmCMK3f6QoEGAwCHmpBZrol3a3SYWklE0VShEhFgEAi5BSBghwRRjIQ5GkR2wkRhY2Qj3QEQZgAAdwAAQgAACwACdgAGMwVmPwB21JmjV5iXTABRC5Aib+oAVb8GeEEI2kGVQGsAZ/QAhgAJFHiRCCZEBL9JpuxENwREcbgACdBSl5sAi9AhNZpEU99EN+tETndUDlkwMLlngtUHxCxZMQtQV74JPZuQIMxVNgSAdWl1ZkFZ0+yQX7V3wuQAd/IAhgsJAphxBIZFw+J0QnKgZPxJtTNBFVpEEbBFA79EMi1EICOqBcB6HYhV2mZgh7cJ4FFgMNFWaEQKEPeqHlqXxChVYrEJeE8AdeYHl5lhAlaqI2OkAwJEUOoT82VAMbg5v/U1UCREEs9ED0ozY4UAEjsKNsugJvYAh/oAafKFE+1VB8UKR6WWAtgKQ+6YZLilZOCqWW54P+BtFAZlo+LURBDNIgF/Qp9SkvvqM539Md+DM9h4phx4MDbcqmanAIgEAGc0qTQqoF5bl4obqnYFWeb+CGxcdT1+WkP2p5mXYQDVRfh/pU9wM+3ZE1NbAoYROp+jmpxOM5/eE8yfM3LLCpNdYHh1AIP7mQLSCkW/AHhmCqloeqXvAHh2CklvdaLRCX1ToGhpaeA8ECp2Osx6M3wkM99qNZFNGr/fMzGoE5DoNFs1M7QYA1PWAzpXM6fxM4yaqsQuUDfYAIhPAGOxVb0eoCDIoILzh8jBUDOTWtiNAH52loMfBaMtBpcBqlDHkQ5io4GeY6NYM1PAAR5GM7E2FDELL+O3EzNwxzMo2jNnujWTXjN6bDOl5zAQIbVFzwBwb7BmOIsTzFBXtgsMInAxGrU1qwB4fwBxcrUTIwhjKga3TgsBXalwZxOF0zOKcDMSUrE8WKNTiTMnhROLAYNRYhM3hjshNxAzggMGp3ejvTsxIFBkBrCG/QBT7QjBnrA01rsGKYmSqoU7qGCESpfxIFltxpe0A7nfxnEGMzt3Irs/q6NjgjNYvCMh0ZNmYQYpNiLVMjETVzMw8jdxkwNDxzARTQWKoZVNHqU9GJCNXaBQgIVBmrU1ert3xraGQFBrZ3CGjYtxKlBallcYRQsVywfCO6CEGjuiyQukUDMUgzETH+cbpNwzKPGjYodRexUjQN8zB3cwMYczEXwAId4y4FEFQ+AAZq0AWx6wNktQWWSbt0AAZjGFExwJ2heQhu0Ls0KVad5gdIq7grULUWp62IILRkeJQFcL7pezEVw2EjkzTiOxHBRQMrswjbGzdBwhreYi2rtzXlci7psi74kr7vIqRdQAbP9Qd8e1Nd0AVeoAbliadDuwLy6wWdlrz/m5mUabVA65MKCVQyQAZilrzfOYYmcJT2osIbYix1oIpCwH0DYymLshxAYkRBUAC54i28Ily/Eix1kgFa0SzIwgBgIGYk2AddAAZjoAZq0GIe+gdvcICKuwVdYLXJu6o+EFv+YIC8DhuNmekCImgIPnqASluKDHAsjZwsEcAAGRAtNEIt0RvG2NIV6khLrFEXIUwDFZMpOcEpZawACHAqomICIlikb+ChfSBm0rkGY8C3EQWWndagymvAwEsHfoDIewCDxOsCreyhhkAIaTBWy0cQjYzKqIIAk4wHrKIIrgIrsrIohWEwtPQoaSIp3sImbxInOVEidfADeHIlf+IAVtvLh1DMfwDLfyDLOdm+naatRSpgSrsCa+yhhyCQY2DPJuADReqhAnkGARgD7KYAf3IgCfIDU1woinAoNgArswImSpFB0GQmRDIYYQImGqAkRDAi0uJDUnIlB/BnHkq7g7D+B2LmB++Mv29YtXTAB6j5B24wVoqLxAK9B27Qz0CpBYCwZH7AB7LshpsoEAh9IHgSAFC0JU7SJdvE0YzSFWRCbRmi0RvSFR+yAwHEJNJcBxRgEnqyFz7guH/gB+58mbP8ic5FBw1apGqAvwoZAwEtnTpoWJ9oAnTNZP+1BSYgEMURGlRBATLCJTeSIztSFxyiFHIREvI2EPVxGfcxJhIAIhDxH1BUzgdSgHzAB7tG19GFU8u3Ba+8B9KZBmRg1z7102ImyzwttW5g1vx1gHK2CICyUQvSIEGQIxGiIe+x2IiIa4z02NdBF61RGdwhBA1wiOdhHiOwBpy90px9BmH+FYOkumScLct2LVF90M50kG2pxQXZqAWD9V/YOdu0Ddh7YQYNsB7tQdzFDRu/3dg74NdvcRuY0RW6IRcSQARLARzmoXi7tmTQ9ZwxeIaeRlgCpoJ4K+CqZc8O1cQ4aNShcRyeoRz2kR24gRhNEd+NPRCMRN/1bRm4oRlI0RmfYRpXEeA6GF3ILANuENDdzdrgLbE87GKERZAVMKttgeKB0QCqYRetoR3woRg11+E9ITFtsRgfYd+DsRld8RkhgQCeBmMCNlhtYHs6CGNjRVaixrw6fhBRHhga4uRCHhdKbuR98QM2pBBE4R5PHhsf8b0LYwM+ALjzS4YWUAEcvgi6aZLhiwHZvQ3nFk0QXormatEQD+GuFVE3NNEU2LwIIvGVW5AC1FwtmfMSmK4DfDgVAaDhRB4SVLEYeGIX1REBFLE5NEEEZmHorN7qrv7qsB7rsj7rtF7rtn7ruJ7rur7rvN7rvv7rwB7swj7sxF7sxn7syJ7syr7szN7szv7s0B7t0j7t1F7t1n7t2J7t2r7t3N7t3v7t4B7u4j7u5F7u5n7u6J7u6r7u7N7u7v7u8B7v8j7v9F7vBBEQACH5BAEKAH8ALAAAAADIAH0AhggHBQkIBhQSBRkWBhURDRYWDh4aDhoVEBoZGiEdCCocFR8hEColCigrFyQiHisjGzozEiAgIycmKCwrLzQrITEyIzsxJT4zKDs+LDMzMz89NTc3Ojw8PlQHBWAAAG0AAGwOC2oRDWoXEnEcFkg8LmMtI2E6LWQ+MFRKFk5AMUVJN2FTLm5OPGFQPnBfOUNCQUhIR01NT1FPSk1RQFZaSFNSUllYVV9dWl9iUXVhS2NjX2puXGZmZm9ua3R4Znh3c4QAAJAAAJgAAIsTD4MfGLMAALkAAKUfGIwpH5UoH7EnHog5LLM/MdIAAN4UD5FGNohQPrBKOpZkToFnUIJsU5ZuWJB3XL9nVZZ8YO1+aPV1aH+CcZyBZJ2EaYCAfYiMfKKGaKWMca6RcbeYdbCVeLSZe+2WfsanccOifZKVh5mZmZ2ijqarmLC1or6+vcuogsCnjtCuic+wj8uymdi3lNi4ldy8m++2m+C+n9W7oOPGqOrOse7QsszMzNXV1AAAAAf+gH+Cg4SFhoeIiYVubj8/PDo3NjWUMTAxOj8FCIqDCJ8IBZ2jhAGmpqKKoY+WMZQ1Njc6PI6MfX5+faS7vL2+v4WWiaemEhITyMgSDqCfqYKmwIYBf6gFm6AOx8kTxsSKLzU3P15u0ufo6YgxhdigEQgR8tsTGREZyswL1+q/1wgLtCGzh6+bBHnw4DXjRCjGjX4QI/Zyh7BiBGPGkN2b4MWBgwUg90n0da1ASAcRvNSLoAyjxYSgno2cOZMiQowZuR1k+SOCgzQmQdL0FxRkgTTyfkyYx82gMYsxh0o9tynhxZzJniKs0aNHhC8AA4ScCizkArFHI3StURFr1or+zsjK7VSVabKCBye8sKFDR9cfX4CKNTv3l1mQAY6m+dG1r40XS+nh3QlPZmG5dbdl2IxPQgYYfHuocYNLTZoM1A5fBmayAeE/E9KoweVGTQ8dNmBkOMZ5cuU/PVZLjac5w4bjxmvQGo3Lj5s0XlAdbiBc2mGjpgKTpq3mUY0NxpHjhfeHR/WRCDQf58CeQ4wfbXDd6sNGzY0Cg802oH6+7P7rpuigBhvz4dLGDzG0x4F43XCiQ38QDbQBey+8wIEGMMzWxy1+1JdBKPuFKCKE0ohoYgPXbDCgfLeoAYMGHFTIHnj4REBiOiwZxx4MMFRYYQ/b0acGBw5UYOSRSFb+cGOJSTbpAAcDcuhGDz6+wOOMNVKzpC/3TBjjJZbAMIMMPbDRBhtpTFDBZhi06WYFbm4pDZxt0ulmBhhkUMEEX7Rx5g8yiAlmj1jaKOcunm3gIwyw1CDDo7HcEAN4GlRqqQZuxnmoP5m6aSkGlh4ngyQ2PCoDLJb4CJ4Em3bi2ZcwPHrDDTTYEGmpj/qowq689toqMHD2KuyuFcYKy6y2inNDrlfu9ushr14Sqwyx2IDDrMg6yuMM3HbrrQrPSrOrt+SKaWqkN+CgriTaWsKBs+EKUs8LMdR7bLo49NUXqTQ8SgMNMwAMsLfx/oIBuQIH3C+1ts6q77rsylDvuxP+xFuAXozCEktfO0Ayy6zX2kADDiP/a7LABQOjQsAKm0wyydY63BcPHe8riSsJTlDAD89OmPHGPezQVcdBP6zu0UibnLK4LiONtA75ztIDzUNDwm4NCW7QMweM2ip1Vz34ADbNO5Rdtg474FA20kufMwPSa++AttllBw222F1BYqu7Wrf62bE8/OXI4D4UXjjdiB/dNjpvq4242WIXHvbgg+fNrm4MHdq11IN74cUWWxBuuA8/jE734unQQPforJPuCOhekOPI1LjVwKPm4YTmiOeef/E56KEDD7zpO6Cujuo7jC486D8I78UXvns+e+1WysmBOH6R83xgaUDv/Rb+X4C//OjG94MD68KHr7730HcfPWO1c7DlDdj30Hsa+LvP/v7hg254+RA5nw/Sx7/95Q86nrsN/R5CIh04JHDPy59pDkjB/QkPgBHZAfAMSEEKTrB7XpiapB7UHx5gghZewJ8aVnjANawhDS88oAUxKBENgs97FHyhDiW4QtN8oTExME91eqCcHgBGNit0oRKXuEQZQo+GI/EB+1rIxCquoYdfYAwPasCz1XihiM/r4RrYMMYxsuGMVjwgFGkywPxZ8YxwJCMZr2iaBG6xi3P5YuDIERgzxjGOZ0JjE9c4lAL0UYl/TCQcXYi/2E2tBtEhixcE4RcjphCGcPSTJjf++cc1TIUAFCBBClJAAgtQQAEGIEAhBgCAX20Bhn400yY5iUYQhpAHW4xBJIcSg1jgsnl9POMsh+knMg5FABZYgQtyMAUXuKAFLVjBKKdpgQf8oQMe8EArXelCYRKTli8MnxZxY4ldjuRYyQMf/mI5zDh6cigGyIEVqlAFKkwhBy5gATSnyc8LDOEDHuhAIjrQgW2eZwvd9OYs3Ym/8PkgEpMI0yQhwiMZjCyd6kSkItFIFgtUgQtWmKc98fnMFpyAn6M8wRGAkE2DEmIAABUoiXwAy40KMpz+S1u/eHSJc/ToBSsLmLqSN8D2wTKhgpxLC7jAVCyIdKQs0Kc0URr+hSKwNKCHIEIQsimALUmxm35sovu2cDh1DUwFFeqEA/zyRQ1kgFwWHSpGcbhORl7mAFMQAxiYygWn1rMKU/CACPbJzxYwwarZ9MABCmEBJgQhppsqgBTrGsOG9s8HayPZwLqVAQ3Y4JYe+YMEKoARB5TktKhF7T74IRwKYEEMeuWrX6twhiVkswQrOOk0qeAEITz2toWYghF+q82Upfa4yNWGMUjrgDVa4QywjS1TQwoGOhQBoCFYwVRTsAIuKMG3APVACQwwCAVcoQhCCK9MCcneUYgBDdGVrlPRYIbrZtME250CGI4A3myKwAKDYMF505vNELT3wIkgARrQAF3+2O61r1zAgxbsK1h+VgEMT0BCCUogghCUIAUKEAQXpFCEIFw1BORFsIoH4YIFo2EMDn4wGu7gBAp3gJ9WAIMVptAClJJAEGKQwhCGAAJshsCaiRhAQVdcPi64uMHSlYMZmkBhD5hAt68FaQ56zM+uioELVGDBNE1AgUQAYAhYZTLq3rvgM8A4ylkwAoHvO1UsnEHHVODyNFWpVyzkmZqJWAKBXarmglHBxQyOLhfAIIfDEtcDKeDyFODrZz2PcrGw5UIVctDlQ5CACQQeQHudYlrkmrok1XkAmxf8ZjCIQQ5J6G82Iz3KFkAXzGLmJ3ntrOMtTzPEhpDCcCErnFP+G1u5o13GJ/7AVhu4lVtBjavjBnhDNyqxoXiUSoufHF88QMHE4RVBpKf63jD8Wdd/YAF8d6xnABeCBOf97XppsjPuXTt/0Mtp2khGrhl09rO38cgmEPHToI5MbYWr9lETusQv+GAoBwADohs8BjxYYQkjGIEIPhxpLmNBDua2dArIq2A0gFnPPy6EFaTQ3xCoMopfYOJNY5jvsvJ7Bmh9ATrqxdO4zrWuNp1jGh4+khNMHLZn4AMXnolSaEpzCnIgAxVcgNLFEkAMcOjCuUdpiCAngQghEOxiIUJTpArTnTTPKckCxSN29MMLbUdnUdeZyXYucg1bGAkWEA3jMfD+gQy+LmwKLHCBFkR96ih9ORUOT/Vpjl0QBhjDyaeZ4nQglJ0LvXvNd8AuiUokAHDvpSzCltG6fzOQLsw7RChwBm5XHA5VEDmS/2B4NCC+03/Awhyk3vhRVv4PD1j3FH5t+YSeXpO1FKfHbFBOLX0e9K6o5BExqVC7LzINqlfHpF0shorjYem6HSUJSLACFFQBD2W4/TS7+gcx4EEMWx85IQxwaypMs8zSeKXZT3996GyhMVgTHc43EmlgCnpkScGUSIHUSdf2BZYBDFfHbXjwfcPHT1EFTRGWfiInCBSABnsQBjzGT7MHZF9GBVPlbiRxSBqVSWbCgCCkRZBkCmn+MBVq8AWgB0ZeIEZllEhVdEBkpQ4X0HoMxgVykAdckAPblQLOBE1isAfwt4F/kAJowAddEILTNIJ/wAVnMHkpcAG/0EbWtoKLNEd0BEKPFB1foAZzoQYBQER7FBhJZEVM5ETQQ3ToYGsmxwBlYAdcUIHTtIS25oTxlwKCkAJvQIGWhoWTpnVclnK8IEV0tXBySEd1pEXvEQBqeBlsaEKVdElJREWVRYegUzzpQAVYMAAEgAZ8aH+F5Uw54IFPiFIUcAApUAd4AAZWOEpY6AJyEIujxH6kYENTlEOw5EYsBB2WyAOYWB2b+EDaI0EdRIffM4roQAAM0FUsIAdyAGb+4RdprigH7zeIo8SLe4CLiVgIESZ1evZ7iiCMNxQYRhWNx+g7IoQJy3geBbhAbOU50lhA44NZ55AAguACryYHjNiKLgB1txh7KHVSi7cHXDhKwCYIFnAGeqCBxDcKREVABRSJ0RNCkSAOATCDEOIFCHA9o8c7EaQ/7CM+lzU6OAAMAyBqKcAFBXmQ09QCzrR432cFvTdKK9ACPAkGJiiChNACU0gGuciOhyBAhrM8Hek+vAM/9MMBCDBRENIGf9AjsJA92tM7v+M/y0NWh1M2NPALDPAHB/BRYlAHIMeQObmTcfB+VpBr04RPVSAHekCUImcBYzcFb8AH5rhnnYD+PERFbcKDmFvwPCo5PZNQPZqzOXu0O78jOq1TlmbpC2m5VFbgfr0YfzrpAlVwiGJgBZa2AlMwBVQwlxHJT36JBXHAB2KAhNNUmKtzmYUzOLAjPY6gN7YDA5tikn/jS4JDOazzOHSjLjNwCALwAM5pAAZwAARgABCgACLlfnUgBrG3XcqUkHN5BnVZWFQwnmeAB7ZnaZb2aoLJaeKnCI2DnGXTOpTDGI1xOR+ClXLiMxrzNV2BN1MDn5l1NMs5CAZgASnQjSjFXTU5gaXJdLXWAizQYubpk/zkAuNJBe6HBnAZafo0Ta92i+w5eInQOHIFn7h0N2DTFdkCAwsSLvr+2ZX8STQe0xdOkzT/ogIKQGsJuqOjxAV1sAdogAUO2nERWp5jQKF3eaHuB556ppPRNEqM9n0hin+GoAInU6NHoy9CQzV2A1GUwKJ98yuagDGOgj0zUzM8gC04YCslczL/EjAqwKNymgJYUAd8AAdYEHgdp5NgYJ5Cul0X+lx48AamGZfPJE1ESIGOdwhWKjCa5TK1gi03AAlkYzOTYDuQsTPxMi+McioNoy77AlG14i8mwzLeggFzuqNQxwcGOXVTBU0QGmFxsHRTtQL1RAUSN6hCmpM5gE9MCI5HOEpeaAgH0y0DczKQEqmyQKPYgiupgg8FM4PRYgmygi+SOgn+MjADgtJvOLcrqZqghseq5uYCrwpNLjAGbkmru0We4DgGuzpN95RPTgaOYNB4E0kI48Kt2+qparouuCItC8IqmRguXyBaE2Il0yIJtXIrj1JwGjAsvIIBFfCtOTmFcxByKQVNLFAFaIAHBkmuScqxeokGVkCbo5QDVICyrcegXMaOwQKxKvCwxQIpyDIJsdCwzcIq+Bkuk3QPMVIsjfIo9yIDmHIpGKACneImBUCxKUAFgfl95xaUzsQFcwkHINikU7B3daAHQWqyTQtmEicHewByXHavBXC0SXspldJZo5IsQjsJP/UCq/IHOxsvwcESXmIlPLctZXImabImeJL+tG/CtGHggXiAseO4TK82togbaTnABYfItSWrZxgKBwtmp9sIsiNoJ4K7GUaSBi3YA2w3KBayIEsBHMbDAwWQI17CI0D1I0FSHxqgDU2CJA3AT/EXlC1ABnLAB3igjoZanqzKiFzWAlUgBnGwB3R5qKNEWwv2BnrABxoKslTaAEdivUkiAQ2gAVFCG1QSs66LJd3QhjTEEvWQty9QKRmSCxwiuwuAACciIpFGBWFgBXuqmlbQsXwwB/DnoEH5intwp1X4TCflAlgwBr1Ll1vGZVYwBpfru2cwdT0GbNYbvyiCANzLBiziBy4CIzKyIAVhKDT0IOkhIV7CHu8RH7n+UBppoAP4cR3/gQVhgHVTh7JVYAUfF8Ct6qA6ybEBjAYD/KRU0AVokMBikKdM1wIHvGB4wAfZKcEp0FUL8B+HkRg6ALoF4gcHEgMwMiPgoQyZA0XmQRwDER7gsQHK8QOjISW+Ix3XAV9xYHs4jAU22btcq3VbdlItkAMfxwcCLMHS1JlFzKpkgAXN1GNK3HpxEL1oMK4tAGBTfBj4EQDQsx3O0R1bdMYM0g3kgWCZUcab0Q2fYQOBwxwcnAYVYAr6sQ8dSwZiQAZwYLl2nHUp+6QtMAVd0LvSa245wAKIumB5wKpHDMUrYAVyUMQeSwZgRnVFERLUUAGywR23kRv+u1EPnKEM8hAKalYXF3EX4zEBoAEJfwE9L3wY4KgHc4AHczDIe0DLzTRVGKrLQAxYTEfE+mu1fuagVGCeRQgHpZlnAGJIi9EYPJAbkaEZb5HND3hgDMTNV0EPLVERXNEDDuCAZ2EWduq7cvAGs1y/7zxKVIDAfHDH9Nxj9jyBVmsFUBxpcKCNcrCFO2YWaPEFDrAWbQHREQ0TC71iNiAINjEPGNENOiEPE/ADywAUGO2xbzDIeODPKh14kya2eTDPh3wCZXDMtkgGXZDPesa7cfxlVWAWR+ERSmEXWYETCNEMO11oDOTTzfASD70N5tsRH2ES17DUyGye9WtPHof+zHNQBl1QT0znfnGgjV/mZ1boAkR8Bl3ABdewDwHhACphDy2hFXChEMtWaLsgKe2wEJ9wE5qxEd3wEaGAAMhsB42M2Fz2XuDYiyC10niQB3IQB42NBYDVYy5gBX1VBaUdEKHtG9mM2aCg2emgA7ajCMTgFqMdE5/ws4sSAylQkHVAaSq91n+QHmi9EN2c0MwdxoQAnMSNDo3wCF5aCfVCC29NCAWABkvN0R5cJRnzCvJdAwM4DQGQ1sKNH9et1gFgD1UhAZSwMbTwA+YQ3hByAGz2Bl9d21XgTHs320u9V7bNY6Kp28s8eC9n4GpmAe/1Bm8gebJ1w0wlBq0neSqLzXTSZAFMqeGarWomxwIPgErQqQAPYAA0TuMUgIUsvuPzh4I8/uNAHuRCPuREXuRGfuRInuRKvuRM3uRO/uRQHuVSPuVUXuVWfuVYnuVavuVc3uVe/uVgHuZiPuZkXuZmfuZonuZqvuZs3uZu/uZwHudyPud0Xud2fud4nud6vud83ud+/ueA3gmBAAAh+QQBCgB+ACwAAAAAyAB9AIYIBwUJCAYUEgUZFgYVEQ0WFg4eGg4aFRAaGRohHQgqHBUfIRAqJQooKxckIh4rIxs6MxIgICMnJigsKy80KyExMiM7MSU+Myg7PiwzMzM/PTU3Nzo8PD5UBwVgAABtAABsDgtqFxJxHBZAORBIPC5SNipjLSNkPjBUShZpXRxtYRxeUyBOQDFFSTdhUy5tRTZuTjx0RzdhUD5wXzlDQkFISEdNTU9RT0pNUUBWWkhTUlJZWFVfXVpfYlF1YUtjY19qblxmZmZvbmt0eGZ4d3OEAACQAACYAACLEw+QGROzAAC5AAClHxiMKR+IOSyzPzGRRjaIUD7KSTqWZE6BZ1CCbFOWbliFcFmQd1y/Z1WWfGB/gnGVhCecgWSdhGmAgH2IjHyihmiwk2u5m2yljHGukXG3mHWwlXi0mXvGp3HDon2SlYeZmZmdoo6mq5iwtaK+vr3LqILAp47QronPsI/LspncvJvgvp/Vu6DjxqjqzrHu0LLMzMzV1dQAAAAAAAAH/oB+goOEhYaHiImFcHBEREE/PDs6lDY1Nj9EBQiKgwifCAWdo4QBpqaiiqGPljaUOjs8P0GOjHx9fXyku7y9vr+FlomnphISE8jIEg6gn6mCpsCGAX6oBZugDsfJE8bEijQ6PERfcNLn6OmINoXYoBEIEfLbExkRGcrMC9fqv9cIC7Qhs4evmwR58OA140TIBo9+ECP2coewYgRjxpDdm/DFgYMFIPdJ9HWtQEgHEb7Ui6AMo8WEoJ6NnDmTIkKMGbkdZEkkgoM1JkHS9BcUZIE18ohMmMfNoDGLMYdKPbcp4cWcyZ4i1CFESAQwAAOEnAos5AKxRyN01VERa9aK/s7Iyu1UlWmyggcn0Njx40dXImCAijU795dZkAGOriHSte8OGkvp4d0JT2ZhuXW3ZdiMT0KGGnyFsIGDi82aDNQOXwZmsgFhPxPWsMEFh42QHztqZDjGeXJlP0JWS42nOcOG48Z10BqNqw+cNV9QHW4gXNpho6YCk6bN5pGODcaR44XnJ0j1kQg0H+fAnoMNIm9w3eLjhg2PAoPNNqB+vuz+66b8wIYb8+HyBhE2tMeBeN1w8kN/EA20AXs00MCBBjXMxsctfdSXQSj7hSgihNKIaGID12wwoHy3sFGDBhxUyB54+ERAYjosGcdeDTVUWKEQ29HHBgcOVGDkkUhW/nBjiUk26QAHA3IIhxA+0sDjjDVSs6Qv90wY4yWW1IDDDUK48YYba0xQwWYYtOlmBW5uKQ2cbdLpZgYYZFDBBGC8cSYRN4gJZo9Y2ijnLp5t4GMNsOhww6Ox8GADeBpUaqkGbsZ5qD+ZumkpBpYed4MkOzx6AyyW+AieBJt24tmXNTzKAw857BBpqY/62MKuvPbaKjBw9irsrhXGCsustorDQ65X7vbrIa9eEusNsezQw6zIOsojDtx2620Lz0qzq7fkimlqpDz0oK4k2lrCgbPhClIPDTbUe2y6PfTVF6k5PJpDDjgADLC38f6CAbkCB9wvtbbOqu+67N5Q77sT/sRbgF6MwhJLX0BAMsus1+6QQw8j/2uywAUD00LACptMMsnWOtxXEB3vK4krCU5QABHPTpjxxkIA0VXHQT+s7tFIm5yyuC4jjfQP+c4iBM1DQ8KuDglu0DMHjNoqdVdCDAE2zUCUXfYPQPRQNtJLn4MD0msDgbbZZQcNtthdQWKru1q3+tmxQfzlyOBDFF443Ygf3TY6b6uNuNliFx724IPnza5uDB3atdSDf/HFFlsQbvgQRIxO9+Lp5ED36KyT7gjoX5DjyNS46cCj5uGE5ojnnoPxOeihAw+86UCgro7qQIwuPOhECP8FGL57PnvtVsrJgTh+kfN8YGtA7/0W/mCAv/zoxvfTA+vCh6++99B3Hz1jtXOwJQ/YC9H7Gvi7z/7+4YNuePkQOd8Q0se//eUPOp67Df0eQqIfOCRwz8ufaQ5Iwf0JD4ARAQLwDEhBCk6we1+YmqQe1J8gYIIWX8AfG1Z4wDa0YQ0vPKAFMSgRDYLPexR8oQ4luELTgKExNjBPdYSgHCEARjYrdKESl7hEGUKvPwAAwKGGwL4WMvGKbeghGBgTBB3wbDVfKOLzetgGN5SxjG5IIxYPSKIOeKADU9xC/rCYxjqa0YxZNE0Cu/jFuYQxcOQIDBrtaMczqbGJJBrAET7gAQEkQoqrKYAglUjIStbRhfiL3dR0/hAdsnxBEH4xYgphWEc/mfKUhGzDXAbgSER8QAmMhOMhBvDG6sjRhYU8JSrVCMIQBqGLNujkUGwQi182T5Bp1KUy/WTGwrjRAwo4AAEKQQAmLNIDHhjAIYrASG3aEpdmWuYuXxg+LuLGEsIcybGSBz78DTKcu1SjXAxwARfAoAmMPMEJWMCCC1jAAgZ4wRKOUARsypIQA2BCQTsAyW8Ocpl2jGH4hhCJSYTpkxDh0Q1Gxs52UtKS8pQLCahgBStUwQoK9UAI9snPllphoEbAZi0J4QQlFDSbJBoCDN9ZSSV2z39p6xePLnGOHtFgZQFTV/IG2L6dgvOQhSGADLSg/oWSWiELNsUmS1vqgy4ogaAyLQEhDPAEJcQUm1uiIi4H2UT3beFw6hpYCyrUCQf4JYwayAC5NqrUjuLQnZgUjgKq0IUuYAELVuiCFK6pUhe0lAVa6AIUnGCCyoZArIOQQVmNwEhoHqoAVARsDPEHPaCmjWQD61YGNLADX3rEDxKoAEYcUJLa2ta2++DHeS6gBS8UVguIDcNAb+oBFmy1sFioggweewBBCKALm+2sCVJ22+paVxvGkK0DaJjZMJQhDIXtQmTFMFyZmuC4ZTAsFR77AEFYIA1TaIIILGuCVnL3vryAQRn2m97wliEL5cVmCRzLzy6YQbxUWC4/LSAI/hKk1wozUDALDKAIANgXv/ftQhr4C97ClsEKZj2rBwbcUiyooQxaUO5jHXmBDXcBwi2lgCLceFAMY9AAZlDDhvfb4Q8fwQjEJTE/ZXDiLqi4pQrwgwWKbAUfPDYR1WRkQ21cPheo4cpm4HFhDxwFEYggBCEwAQsIzM8yoMHIEu6nHwhQhjSEAQtUIDOFD9EEWDaSyhiswpV1zGPwHrgKMCDzmI8rByPP4LEsaK4VTpxiCTPYECR4wjVrjOfFdWHPJ9byhrEQ4ce6gMxWoEMZqnDox1KYyGowMgxaeoFDTGGgnb0wDZ1CW+vauiTVCQOms/zdS6vBC0fmpwsk7ANR/pMa0RQ+QBlOfOyWTtkPLPAqZ7GZ5Eje+tbYje0yPuGHu+4gr9xCKl8dN8AbztGn3evjUFiA6UyHIQxpmAMZAP3YE8iApVW4Axqa3dL2+iHUoy41P5tLiJImAQkgwKa/abIz7qGbtP0bwtpIRi4crLa1t/HIJhBhVKSOTG2FM7dTwblEMAxhKL6+8o7DYAY6ADvN9iYwFu5wBn7z099duMO8V93SOQ+isFbgOQsWHhG1LvGQmHQrXCmOg7nSAB31Gipf/QpYkB5yDSeXyHsxzd9l7/yxMpABgbuQh5oL/eZ+OIAa8kCGBD+22j9P75Ef3Q+dPjWZEZUoUEkWKB6x/qMfX/D7OpnqzlIqM+9bkIie97zjMsyh5gJnQdjvzYIy7GHUZ2dBkkmgBj10wQdpJrofuvBgBZOgH1u4++Ev2YbSSpxdF5VIAAJPTFmEzaOGF6chXZj4fihg2XvmLx0g72kYiJ3dl6dC5jc/Bz14we39LgQWDgxjfj7bF6lHo+5NyctyemwH6NSS7GfvilAekZTJFGcq19D7dMwA0zu2A/EfO4MY2FMNe+gC9HsObTo4H/TsVQhUoAZhUH2JJg239E66d0mZtAWNgTXRIX4jsQam8EeihEyVZEip5FNgYBm/QABewHVmQHOAtlUssAIjwAAoEAd7MG9pNmH914IA/hh9hMBuHyZwPscLkjRyPHUmGnh1vsNFnGQKazAVbAAGsydGX0BGZ9RTTHRAb5UOLJAGwZcGevB1puYHAGABdHAHaIZsMdh2oVcIFhAHasBpMeYLA2RFHxVReJRHILRJ0QEGbDAXbBAARARIgZFEWPSE+cM+WXcOV8B4+Id5iDZmMgADXfhyiNZcLEAHlzeDaEcIiogHaLhgvUBFf8WDfdhD0MFF7xEAdXgZd2hCoTRKScSGHaQ/oFM853AAIbhne2B2iAYDMwADxaZzVvCCScYCLOgFkjh0hdAFXWiAdDcKNlRFObRTc8RCnzg1QSSK1VGKD6Q9ErSKf2hBrYgO/hawbGNghbT4WLYIA1QwB3fwYS+YAAygAJ1XBvsHg4MAAGVwB3TAb8eoCMl4Q4HRVKvojL4jQpggjedBgQt0V57jRAVUWsJzOOgAA2OgAl2gB2pAb2AHA+QYB+eIBZn3TxBQBhIZbCwwTYOwZPQYbDKGjCG3QQm5idETQpEgDgFQhBDyBQhwPbbHOxGkP+wjPhE3Oj0gDQnABSowehIZdIgmAzOQlGqQkZnHUjmnBrv4ZIRwAmsnB8EmeocgQIazPAnpPrwDP/TDAQiAURDyBn7QI7CQPdrTO7/jP8vzVodTNjkADFyAAn7gYHdwhpmHlEmJBudolC3lWCfgAk8Z/pVI1lBElgcTSWZwhwjIs1TltpDO05KxAz+TUD2aszmAtDu/IzqtE5dy6QsMkAJ+QAGkl5eX2FK2mJRkkJeAOWQz4ANdZQdn+IIsQAHTRGR6MGpblYOG8JiQ+ZmDAzvS4wh6Yzs1sCk0+TfFJDiUwzqPQzfqggO9kAIMYABYcJpzoAVORn9JOQNPqZGP5QNUUJ5mYAd0oAUSNmwtZQEzgJGjtmKJ0DjRWTatQzmM0RiX8yFkKSc+ozFf0xV4MzX1OXFHQ52DcAAPYAEsQAL/RAEP8AAGoAIHMANVRYx2oAXr1VInYJFJqQV2IAdaEAMcSgVVQFhLSQdY0J38FGhc/gWfVdCe8wk3BfpLdwM2XZEtNbAg4fKfaRmgROMxfeE0SfMvLWABF3CISjpmn6aIdqB/WzVsiTgDZUAHdNAFZ+cDJ7psdzAHK1qRCkYFGGkGMcpPvjkILXAyRHo0+iI0VGM3FUUJO9o3v6IJGOMo2DMzNRME2NIDtlIyJ/MvAdMCS1qoY6YGeACMZCal5JiiXRB5M3CiLXcHZqAFkYeUk1cGY7qhLIAIaSowqOUytYItPAAJZGMzk2A7kLEz8TIvjHIqDaMu+1JRteIvJsMy3oIBhqqkRHaOcQZ2YacFGJlqVbBVMnBSatCFZ2CpYOcDt2hiXZgGVeBYrWYIB9Mt/gNzMpAyqrIwpNiCK6mCDwVThNFiCbKCL6Q6CTeAA4JScU23K7t6iFogB+c4rcAqA8SYl/q3qFVgYnbwlzNAZjJABc6aY//6YY51eoYwLu7arrDap+uCK9KyIKwyiuECBrA1IVYyLZJQK7fyKB2nAcPCKxhQAfHaUmTQhejoaTIQA2Xwr2rAnZQ3ZlSgBUtpBx9mfKppBVRgYhjpqwpWCMEysi0gssUCKcgyCbEAss3CKv0ZLp90DzFSLI3yKPdyA5hyKRjQAp3iJgVwsr1aB2RgmLBJpXdAczKrYC7QVRiJsxA2s1SKB8vmf3Qghvwkkn5QAFvbtZdSKas1Ksli/rWTYFQ0sCp+8LTxEhws4SVWEnXbUiZnkiZrgidd+yYnCwPmWLe7KLBJmQZni2I+oLOSVwVkEAd6gLOcNrNdtWd3sAeFNoP2ZSeVuxlGsgZm4gZC0HeDYiELshTAYTxBUAA54iU8clQ/EiT1oQHa0CRI0gCB+auqiYtdKAfAJrqI6AOdV3af12ksAANY4Hh7cI6WenwsQAW+Ngd7sAdosKLLVa1+0ABHAr9JIgENoAFRQhtUUrTFiyXdgIc0xBL1wLg0UCkZkgsckrwLgAAnIiIn4ANXUAZXYE9IeaJaQAd5IAdjG2FbBQNVwILqq3/c21VpAIkZGboEhqLJGr4f/gaA/ga/C4wiCGC/bsAifeAiMCIjC1IQhkJDD5IeEuIl7PEe8ZELpbEGP4Af1/EfXkAGZSAHV6ClV3AFkUW3EBxhBOYCFgqJe5BqVKDBLPDAKSy23KmzJ4DCrWtsANhcC/Afh5EYP2C7BdIHB2IDMDIj4KEMmcNd5kEcAxEe4LEBykEEoyElviMd16EGZ0AHThxZwrcHeLCsoUtsxJi+Z9bFCmZiiLoHYmzJ/LS6Xei6wAZ6p7fGh4EfAQA92+Ec3dFFf8wg3UAeeJYZfbwZ3fAZOxA4zFHDa1ABpqAf+7CUcoAGaCAHcpDCNAfCM1sFYQCJEmlox3cFxdy6GJxi/twLA3JgpWebahDmAkUREtRQAbLBHbeRG7tRD5yhDPIQCpU2CHVxEXcxHhMAGpDwF9CDxIfhf3pwtnQQBySMBsDGveVbpXugB2dWBSbMAosnzV5AzQomA63ZhaJWVTMAIDuYn7OQG5GhGW+Rzh5IZQzUzldBDy1REVwhBA7QgWdhFneQB3pQB3NgzNRr0AHbogKtb13wxC6abxjZzCkmiVVwunRAgClmFmgBBg6wFm0h0iMNEx29zjsgCDYxDxjRDTohDxNABMsAFGZhpXNghiRMvVfAySyAvSS8rE2W0/T4uYbVZBI2A9dcZFhgFkfhEUphF1mBEwjRDE29zoPA/kBQ3QwvEdLbAMAd8REmcQ1mCNNekFzcewVWqsln8GJi3Xl3gLPAxbMKBgNXwMTgdQ37EBAOoBL20BJaARcKwW183QuS0g4L8Qk3oRkb0Q0fEQoIkKynqwZk0NMKVgV4YMGWbVLcSwUs7XJVBdyjS1VWQNsBAdu+kc6nDQqp3Q8/YDuKQAxuIdsx8QlTuyg24AJaQI+0mV7Jtdd+kB54vRDuvNHZnceEkJzRrQ6N8AhxWgn1QguATQgFoAZebQc3XCUZ8woArgMSOA0BkNfPjR/lrdcBYA9VIQGUsDG0QATm8N43QgBd4NVBHV7AZdBdQAZqMAdBnV5VZdBayskWlEBwFJ7iD3BpczAHH3aiJD4D5Wmi4bWLJACheJviOl4IAgCeM3CSnXB9Oz7kRF7kRn7kSJ7kSr7kTN7kTv7kUB7lUj7lVF7lVn7lWJ7lWr7lXN7lXv7lYB7mYj7mZF7mZn7maJ7mar7mbN7mbv7mcB7ncj7ndF7ndn7neJ7ner7nfN7nfv7ngB7ogj7ohF7ohl7kgQAAIfkEAQoAfwAsAAAAAMgAfQCGCAcFCQgGFBIFGRYGFRENFhYOHhoOGhUQGhkaKhwVHyEQKiUKKCsXJCIeKyMbOjMSICAjJyYoLCsvNCshMTIjOzElPjMoOz4sMzMzPz01Nzc6PDw+VAcFYAAAbQAAbA4LahENahcSQDkQSDwuUjYqYy0jYTotZD4wVEoWaV0cUkYnXlMgTkAxRUk3YVMubUU2bk48YVA+cF85e2wqcmIyQ0JBSEhHTU1PUU9KTVFAVlpIU1JSWVhVX11aX2JRdWFLY2Nfam5cZmZmb25rdHhmeHdzhAAAkAAAmAAAixMPswAAuQAApR8YjCkfsScesz8xkUY2iFA+sEo6lmROgWdQgmxTlm5YhXBZkHdcv2dVlnxgf4JxlYQnnIFknYRpgIB9iIx8ooZouZtspYxxrpFxt5h1sJV4tJl7yqxtxqdxw6J9kpWHmZmZnaKOpquYsLWivr69y6iCwKeO0K6Jz7CPy7KZ2LiV3Lyb4L6f1bug48ao6s6x7tCyzMzM1dXUAAAAB/6Af4KDhIWGh4iJhXBwRUVCQD08O5Q3NjdARQUIioMInwgFnaOEAaamooqhj5Y3lDs8PUBCjox9fn59pLu8vb6/hZaJp6YRERLIyBENoJ+pgqbAhgF/qAWboA3HyRLGxIo1Oz1FX3DS5+jpiDeF2KAQCBDy2xIYEBjKzArX6r/XCAq0IbOHr1sEefDgNeNE6EaPfhAj9nKHsCIEY8aQ3ZPwpUEDBSD3SfR1rUDIBhC+1IOgDKPFhKCejZw5kyJCjBm5HWRZBEKDNSZB0vQXFGSBNfKKSJjHzaAxizGHSj23KeHFnMmeItwxZAgEMAADhJwKLKQCsUchdN1REWvWiv7OyMrtVJVpsoIHJdTgAQRI1yJggIo1O/eXWZABjq4p0rUvjxpL6eHdCU9mYbl1t2HYjC8CBht8h7CBg4vNGgzUDl8GZpIB4T8S1rDBBYfNECA8bGA4xnly5T9DVkuNpxmDhuPGd9AajcsPnDVfUB1mIFzaYaOmApOmzebRDg3GkeOF90dI9ZEINB/fwH7DjSJvcN3q44ZNjwKDzTKgfr7s/uumAMGGG/Ph8kYRN7S3gXjdcAJEfxANpAF7NdSwQQY2zNbHLX7Uh0Eo+4UoIoTSiGgiA9doMKB8t7BhQwYbVMgeePhAQGI6LBnHng02VFjhENvRx8YGDVBg5JFIUv5wY4lJNtnABgNyCMcQPtbA44w1UrOkL/dMGOMlltiQAw5DuPGGG2tIQMFmF7TpJgVubikNnG3S6SYGF2BAgQRgvHFmETiICWaPWNoo5y6eaeCjDbDsgMOjsfRwA3gZVGppBm7Geag/mbpp6QWWHoeDJDw8igMslvgIXgSbduLZlzY82kMPOvAQaamP+tjCrrz22iowcPYq7K4VxgrLrLaK00OuV+726yGvXhIrDrHw4MOsyDrKYw7cduttC89Ks6u35IppaqQ9+KCuJNpasoGz4QpSTw031Htsuj701RepOjyqgw45AAywt/H+cgG5AgfcL7W2zqrvuuziUO+7Ev7EW4BejMISS19BQDLLrNfyoIMPI/9rssAFA9NCwAqbTDLJ1jrclxAd7yuJKwlKUEARz06Y8cZDBNFVx0E/rO7RSJucsrguI400EPnOMgTNQ0PC7g4JatDzBozaKnVXQxABNs1BlF02EEH4UDbSS5+TA9JrB4G22WUHDbbYXUFiq7tat/rZsUL85cjgRBReON2IH902Om+rjbjZYhce9uCD582ubgwd2rXUg3/xxRZbEG44EUWMTvfi6ehA9+isk+4I6F+Q48jUuO3Ao+bhhOaI556D8TnooQMPvOlBoK6O6kGMLjzoRQj/BRi+ez577VbKuYE4fpHzfGBrQO/9Fv5ggL/86Mb34wPrwoevvvfQdx89Y7VvsGUP2A/R+xr4u8/+/uGDbnj5EDkfEdLHv/3lDzqeuw39HkIiIDgkcM/Ln2kOSMH9CQ+AEQkC8AxIQQpOsHtfmJqkHtQfIWCCFl/AHxtWeMA2tGENLzygBTEoEQ2Cz3sUfKEOJbhC04ChMTcwT3WGoJwhAEY2K3ShEpe4RBlCj4YjIQL7WsjEKrahh2BgjBB2wLPVfKGIz+thG9wwxjG64YxWPCCJAMABDhxqgPmz4hnnSEYyXtE0CdxiF+fyxcCRIzBmpCMdz4TGJt6IAx7ogBsRAQABrKYAgFSiICc5RxfiL3ZT20F0yP7yBUH4xYgphOEc/UTKUgqyDVtighE60AEAIIIDihTOFmAYSDOV0pRoBGEIhbDFG2xyKDeIBS+bB8gz3vKYfiKjXAgwgRGwgAUjqIADHGAAArjyDy9QJSsXWQgOHIGV11zNFlxoTGTi8oXh0yJuLPHLkRwreeDDXy2PSUdUSkUAFYiBDH5ABRnIAAYxOMEzB1qBCUhBCUZIZAcOAQUkJJKbsiRnOW9ZT/yFjwiRmESYOgkRHuFgZPCMpyQpiUa5GOAHWLBCFapAhR/8M6ADHegPnoCEb26zECygqULDWR0i0JKkhUSn/9LWLx5d4hw9qsHKAqau5A2wfbSUaCELU/4BLHQBCyldKQxAYIIYwDSmWnBCTRUagkJMYQkOvemNpEjOQDbRfVs4nLoG1oIKdaIBfvliBjBAro82NaQ4lKclhRODLhjWCilVaRNY+YIYuCCmMiCDWI9A1gMMogJZUMIRVqlInpKoAFIUbAwt2j8irI1kA+sWBjLAg1165A8RoABGGlCS2trWtvvgR3UOUAUyhMGwWtBCYpmQyBJ4NaZVCEMTkJBQVoYgAYOoghU0y1kOQNdit81udrVhDNk2AIp/cIAWyOBbw3ZBuFjILGdP8NiBVmEMVYiCQFlAAhJMYBBdsEJNq3vfRAiAA54FLw2xkAbyjuG3h+2CTp37Vf4WYIEMWqiCDGJaAfxqIQolyHCGK5yIhwr4w2RIQxnIW97zhgGtnO3ACebr4DSEAQtUiEFMB/FbK/xAxs+0QCJCQNxWfhiKFVCDGgpMXgSHIQsoZmUHSNBeFlRBDWSAMY6faQBBkDe/Ex6oIw2RACmkFaI/Np4MhDzkIhuWDNNlrpJJMOUYQLkLMaawILBQhvz+IKbXLQQMxOrhMANQC2QmcnnJMIX9Ktm4LCaDGrpQBRjElAWCgAGUpUxQQxjACkugLCu37GfUKZrMJDZsGazQhCR8AAQcCAGbWawFOnih0Y925AjUYAYtxPmZIzDED6ar6Q7kGYpOoa12h12S6v48OdChrnOjm8yC4z6zCnQgg4QfTYA/EEDRr3b0QA2hBStAoQQhCPev50LscnM3tsv4xB/yyoO9cmupfnXcAG8YRyVadI9DScCnhRxqKNt4ys2esgzoYIZpx9Syf6iCHOCr7WciHL9YHqgDpLIz7tk7f9AbatpIRq4crLa1t/HIJhCR1KWOTG2Fo3dUJbpEMBBhKGNGtm/TIAZGA9wFX61CHs5g8IEi3ArRhvVAq0yIK1ehvRyWCFuXGNQYZlyuHM9BXWuAjnoZ1a+AFSxQ7biGl0uEAGMgsxpGHGI1ZDumOMcxFvBQ8Cz73Mp4GMOtnznuLii7vTqGiE+lasx6Ov59qCQLFI/Y0Y8vDP6dT5XnKOlZyTZsQSIsEDuRy7BooT8zBgAVaBf00HZq/8EAadjDqwE+cUIQOL8N78c450nRxj89COzaqEQCYPhgyiJsIl28OQnpwsdDBNBkJnvlG97szLOADHuQNsBZ4Mggi37uLCj9IKighjBYoeGcBsbqJ7r7XKbTYzxgp5ZmT3tXfPKIouR+6yu5Bt+nowKfTgOR1QBft7PABTRIQQpWkAY+KP/RrjRreuAFNxZT0icIkYdmDUd0vzBLfNd9uQQdW9AYWBMd4zcSa2AKfQRKxTRJhHRK9gYGlgEM1AdqZUAHDPdoD7AAAxBkfABfy+dKLP5ABwNYgBJXCCcwB3JgBW53gLsASStXS2YyhH4HQlqkSaawBlPBBmBAe2D0BWJURpNURQcUV+lgAPtWBmkQd1QAAyzGAgRgABNQATQYBlWwfAhIB/5ng8/kg9BWB5aXdLsAR/U2UvVkR3cEQpkUHWDABnPBBgFARH4UGElkRUzkRNDjdefAAmIgZPL3fMTXbDKgT3QQd5b3TK7kAmoIgwZICAJABniAB9c3UP01h1MkWoboQj0EHVr0HgHgh5cBiCb0SaGURFQ0WogIOsWDDmNGc/3nBV34aDDwTz9QiREXUyIgACdAB3sAX8x2gBOgBnogB2dIirxgQ6fYQrQUR/4sxIpTE0SvWB2y+EDaI0EdhIjfo4vpgAVowAXIB2fLh3kwUAVzgAdRFokVoAIuMAd6YHMxxYB/cAJqwAdqUI1tuAvYeEOBAVXn2I2+I0KYEI7nkYELlFeeg44FND6mdQ4CwAVcsABhIHqXKIkyQI/2OIqPdn9qYIkAV22DMGYEaZAsAJCJ4FQEVECBpUshFAniEABKCCFfgADXc3u8E0H6wz7iU1qj4wPSwAUzgE/I938xpU8yQH1sZ2OPxl4xAIoFCXAT4JJ/QAVz4H9H93adIECGszw46T68Az/0swEIwFEQ8gZ/0COwkD3a0zu/4z/LE1eHUzY68AsPwAX4pP4FaaAHCiiM/vQDK1lrMsBiMfADksmVWLB8LFAB0PUD9YhmMZV9h4A8TjVvwiOaW/A8RTk9k1A9mrM5frQ7vyM6rfOXgHkIAGAACWAAB5B9M4ACExBcYoAHYoAFkUiVkWWPWmB/VUkFVMCVVtBmzGaS0jZQeZcIoBmasTk4sCM9jqA3tmMDmxKUfyNMgkM5rPM4dKMuOWABY2gBFeBMXwhNFVABNOAAMIAFvWWPWGB/xedPY4AHcnCcLEYFK2UFanAHdKAFDecCAOVem1kFN5gIjWOeZdM6lMMYjXE5HyKXcuIzGvM1XYE3UyOhp3U0OZCSJmqiV5AHaqAFP/CF8v4oA16AB3TQBY/5TC6wUu+1knNwnAN1Ai8lUFpQj2VABVoGoXAjorx0N2DTFdliAwsSLhx6lx5KNB7TF06TNP/SAie6pc9UjAfaoj3qVcNIBnkwozX6bCtVBvW4aHc2UPs0idRXiWIApnJYCC1wMld6NPoiNFRjNxlFCU7aN7+iCRjjKNgzMzUjBNjiA7ZSMifzLwGjpVxqojFAB3VAgC7qVU+GB3XQBT/QZD+wUmpAg2zaZG8aWQVqj1QgUHU6CHcqMKjlMrWCLT0ACWRjM5NgO5CxM/EyL4xyKg2jLvuSUbXiLybDMt5yAZOakjIgB3kgd012Al5VWPWIgnMXA/5VgAUriQdqgAVsWJIopQZxEIpkQAWP1ap/cDDdMjAnAymzKgtWii24kir4UDBKGC2WICv4QquTgAM5ICgdJ3W7sqyP5gVyYI8yuZ9kwIyudobt5QI/0AUrqQfByYZUcF6KpoauVoDTSQjjErAAC6yLui64Ii0LwiqwGC5gAFsTYiXTIgm1ciuPUnIZMCy8cgEUQLD3dwaViGYAp08/sIV8IAevNomX11sDiZ8/AAPtlaNChgdDS6MylmuEECw22wI1WyyQgiyTEAsz2yysoqHh0kn3ECPF0iiPci84gCmXcgEt0CluUgAxdQJEOlA4BwNWmQdmIJxT5gJVKY0ECf5nkyhQMvBgash23rqgLGAFEiuufECQ/wZNhFAAbgu3l1IpqzUqyZK2k5BUNbAqfyC28RIcLOElVmJ121ImZ5Ima4IncPsmNvoDWjAGV8ACwxiqVdBqeJAHUTa4lycDBPq4lXdjj3Wxo8oHxulSMuYCXfBph2sGkXuAdvK6m2EkazCEQyB4g2IhC7IUwGE8QlAAOeIlPKJUPxIk9ZEB2tAkSMIAVGBVY2AG1CigVXAFWuAFDEsGV7C0OBYDF6uGgVsF/OtkGcsH0WZrRltYn6YHBgxfBQiWDHAkEZwkEcAAGRAltEElWFu+WNINgUhDLFEPplsDlZIhucAh6asACP5wIiJCZjzbrcFlBmRgBmq4czBmtM2WXABsdgJstHR2vHIAYRImYzEwXmrAj0NbtC4wnRHMwiiCABfsBiziBy4CIzKyIAVhKDT0IOkhIV7CHu8RH7lQGmsABPhxHf8hdnsgB2egBnIgB8eLB2cQYf/0TCdgBQsrvK+mvCxgmCtpwEJcgDGABXQQB5Uox4z2mKWnAP9xGIkBBNdbIH5wIDcAIzMCHsqQOVBkHsQxEOEBHhqgHEUwGlLiO9JxHWRmB3uwB6FIB3HMwy7lXieIvJXXTzLmx3iwxmMQYQV4o3TwyzIqxBNWbYx8GPgRANCzHc7RHVsEygzSDeThZ5nhyf6b0Q2fwQOBwxxUvAYUYAr6sQ/imssyOgfHuwf0dwW2/Gyv7AVWkM5nIAdxkAdy7AW8jGMw4AV68MuLZp8xUAFFERLUQAGywR23kRu7UQ+coQzyEAqdNgh1cRF3MR4SABqQ8BfQc8aHMaq/HAdCdrjnLMA4Bmg0SAdnkF9DzAL9OQd0YAdkcF6R+0wx6sotnZ8sACBAaKGzkBuRoRlvsdAjGGYM9NBXQQ8tURFcMQQNIIJnYRajytEdHYr0Z59x5gIZK6NmcFUnzQKhaAcoeFXtvLwyAGhXFmEnYBZoAQYNsBZtQdRFDRM/3dA8IAg2MQ8Y0Q06IQ8SUATLABRM7f7URyyjZ0DPLIVjY/DLdhDEWG2DyGcHi4ZeDluSWmBY3hoDE2AWR+ERSmEXWYETCNEMb93Qg8BAct0MLzHU2xDCHfERJnENTm3Ic3AGu2yfE9asMirTWB1nhfvLM51V/ORPMTAC13UN+xAQDaAS9tASWgEXCqFuoN0LktIOC/EJN6EZG9ENHxEKCCCuMj0GLj2JgDbO9OfSMTaPVuAFM33SDuCZ2B0Q1O0bC73coNDc/QAEtqMIxOAW1h0Tn2C2i3IDZyZkYuAF54UFn/0H6cHZCwHRPa3fmkwI3inf6tAIj/CnlVAvtEDak9ub4qoGVlwlGfMKIL4DFzgNAdDZ8ImNHwbu2QFgD1URAZSwMbRQBOYA4XKCrWBI4zie4zq+4zze4z7+40Ae5EI+5ERe5EZ+5Eie5Eq+5Eze5E7+5FAe5VI+5VRe5VZ+5Vie5Vq+5Vze5V7+5WAe5mI+5mRe5mZ+5mie5mq+5mze5m7+5nAe53I+53Re53Z+53ie53q+53ze537+504eCAAh+QQBCgCNACwAAAAAyAB9AIcIBwUJCAYUEgUZFgYVEQ0WFg4eGg4aFRAaGRohHQgqHBUfIRAoKxckIh4rIxs6MxIgICMnJigsKy80KyExMiM7MSU+Myg7PiwzMzM/PTU3Nzo8PD5UBwVgAABtAABsDgtqEQ1qFxJIPC5SNipjLSNkPjBUShZtYRxeUyBOQDFFSTdhUy5uTjxhUD5wXzlDQkFISEdNTU9RT0pNUUBWWkhTUlJZWFVfXVpfYlF3ZER1YUtjY19qblxmZmZvbmt0eGZ4d3OEAACQAACYAACDHxiQGROzAAC5AAClHxiMKR+sJByIOSyzPzHSAADYCAjeFA/gIyORRjaIUD6wSjqRfznUTj3vQjmWZE6BZ1CCbFOWbliFcFmQd1y/Z1WWfGDrWEXSYE7lY07tfmh/gnGYgVGhjEOkjkucgWSdhGmAgH2IjHyihmiwk2u5m2yljHGukXG3mHWwlXi0mXvGln3gg23tln7Gp3HDon2SlYeZmZmdoo6mq5iwtaK+vr3LqILAp47QronPsI/LspncvJvgvp/ou53Vu6DjxqjqzrHu0LLx1bjMzMzV1dQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/gAbCRxIsKDBgwgTFuzTBwiQHjtu2KhBMQaMGDuAFECgcCCCjwgKdBxJMIBJkyIVhnxoMQbFGjZu7OjhkOEiRowWkdzJs6fPnwUtJjxpMkIECUiRRmgA8mNKgSaBGgzQCGWBjSAbHE0qwShRhS9q3ACSpo/Us2jTIoxRECtICAggyN0qAQMEDEqZLriq9udVBAu0IrWLt2sEuXDhNuVIMMaNvpAj93SLuDIEo0aR3pWQpkGDBaD3SvZ5tUDoBhDS1IWgFLPlxCCfjp49mzJizJm5HmYNBEIDPKZB0/YbHHQBPHKBSJjL1bBRy7GHSz+7MfHl3EmfI67hwwcENYAD/oSeDjT0AvHHIXSvURl79spOycvvWJ150sKHJbywsWNHdyBqACeeefP9ZB5oARyHBxDd9WfDC8vRhd9ucMlWoHz1bYXBhnhFgAEM/PmQRx845YEHBlQdeCFQpjFAYCMS4JEHTn3k4cMONsCAwVEcTlhhIz6sKF1cGmKgwZFG1kDTiDgx0gceaaB0IANCSnWgcSYFSCKNeTxUgwZGIokfXI30UOVoCGh45AZsbhADEHzgdNMie+RxQwEDmscAlWeWt+eVJu2Qxx5z4sQHEDG0uYGYXXG0Q5+QDaYBmy+8sEEGMMy4yE2M1IlBSHuGKiqkUolqKgNXaTConDflAUMG/htUyiaYeEFAalqsGckmDDBUWqkPW9KZxwYNUGDsschScGupyTbbwAaDctqHD76+wOustVK1rE93TRrrRRbBMIMMPuzBxx54SEDBhhe06y4F7m4rFbzt0usuBhdgQIEEavBxLhAyiAtur9jaKu9OHmrgKwww1SDDwzHdEAOYGVRscQbuxnuwXxm7a/EFFh8pg0Q2PCwDTBb5CmYEG3fk4bcwPHzDDTTYEHHJD/uqws4899wyUPD2LPTOlcYM08w2i3VDztfu+PNBL18Uswwx2YDDzEg7zOsMXHfttQpPS7Wz12SLa3LEN+CgtkRaW7SB02ELVNcLMdR9dNo49Ncf/sk0PEwDDTMADrjXcf90AdmCB9431TbPrPfabMtQ99sSxF2AfgzDFFN/PEA008xX20ADDqP/bbrghQOlQuCKm0466VY73l8Pne8tkUuJSlAAEE9PmvnmPvDQXefBP6728cibnrrYriOP/A55z+QD7cNDxHYNiWrQ+wYM2yx9dz78AD7tPJRf/g484FA+8sufNQPy6/OAvvnlBw+++N1BZLPb2rf84dE9+I9DBviDAhaQfgg8XvvQ8j71IdB84itg+AY4wPyxTUeMOVj3pDfANKRhDGMgoAF/AIQR0m+BaaEB/UbIQhI6BIRpIItDpoejGvBKg2EJkUM86EE1fBCE/iEEIhBNyAMUqkWFPBihEEEIBCGmQQ0+9OAMa2gteW1ALP4hyxMDhAcoenEMagDjEkdoxL7ggIVCDKMavQjFLkaRQTXcwLZugEUf9BAPeHQjG/cYRhAasIyQOeMP0sjHPeYRSh68ER0fQ6odOCaAT8yjiQ5JyT0KEZCR4QEQDUlJSk6yi2mYnsQe1aceYIQmacBjHlZ5SD3oAQ+vPKQlMSkZTYLRi5R8pS4luUoTqaFBMTBTlXygJB8ASEardKUyl7lMWUKRlqP5ARtbycxq6qGXamBQD2rAuxWloZhP7KUe9jDOce7hnNY8JG0MUIEUlCAFIpiAAxRgAAIUbpB5/rTmOfdJTnJe00SJ3GY35/PNAJIlQObkJz/Phc5mSuYAKWiBC7CgAxewoAUtSIFGN1oBBYStAAhVpkJHuk9X4jGG06tBlMiTBoH4x5iphOU+/UXTmipUD6OpQBa4oIUsZIGiFm3BOzfK0QOEbQywTKi5ampTdIIylD3YZgxWOpwYxCSqTUToOZnKVX+RczYt8IIXuMDTn1b0ohklKlErYM+njcGVW+1qU18ZRm3iyCJUHc3RkghGPCqVq/zE6WgMkIUzGHasPf2pC4I6VLVudAIdAcAAAHCmtya0q4HFYxh/EJGJhKulkOGVDEbH176KlKToHM4EvPCGNRj2DGTt/ilQL7oCx26UBB0IQUIEwIEOcABSP0gqahtKVz+mr2+8ushZevWC1QVObUkcZBuTCteSCnY4JWDDG9jAhteSoaxZyEFQ0+pYLHygAyAwqkEmcAYi+JaypJImXBPaTDeO4YBqG5wKKtWRBvjnmxnAANlGC93S4tKvJi3QGezwhu129wyIlW1FMWpbHbAhCB3oAAkOwoU5CCHDA5BXAaSJ4Fhqto8/WB/pBtc1DGTABlD1TCMiQAHMNKA0OM5xjvfClxUZAA53gMN23/BaL2hBwoslL1HfQIcP59YABalAIJqc4d/uNsSQ0rGWt6wVo9S4AdBswR3uwOAGPxixPxXv/kUbq1EXBEIMTu5ABQqihUJYwckeEABCBpBhPUPzzwLJwpjJbObDlhULWFisC2pL1DMU4glC8ECGR+BRgTjgDnU4QpwrbZAkfNjKgIbmGgZd5tYe9shmdQGFN9oCQNTBCHEOgQMGggVCVMEIGM6wbg2SAiZ8OtR/fsOgCc1dQyNZ1Y3NAiHCAOsMo3fWAjlDIJ4whFzn1iAC6IKm+wxsWrpg2HdoMJEhbOSfJhrZG+XCH6AwhDiDALLRjoMRqu3sDRekBF1odgcS0G1MEoANwy5zkVFNUbRu9AxtUEK7JZ1beDfiDW5ot7VHYBAuTAHXVe43JksQcHG7NsJARXcK/s7gBiQIIQgMl7VABGAHNBTh5M4WQZTfEAV6XzvUzrnxlndemj6RoePbNSxZfZpo2moU4i9HeYZJAG0F3AENOUgCCUJAghGkoCAtYMMSIq3rKvH8612m8VI+0oj/2iDAXHMugR04yFvmU5maHeh0KmCHYRf6DGTQAhYkWtFF1xYOccBCEogQAqqnAN5SlkMWlJwC+ArEBWvgQg40WvXp7I6LcM8jFI2bPtKRbQYuhvGNPLMRhDDXuaNTXwHdTt3qLlMNP5gOFoYt5AeTPAckSMEKTPCABCTgAXXXAgvYPOdGVMAPgeCCC9jcVoHoAA5nWPxGaSPfZRI3lpvHr+dn/rDfF6ClbsklsIERPFx/4iH2szkAwAdtZjYA4gwg0LDMCTBPAMBBEF5Q9VoFYoA7EAINe0dU6vV4d8AGyrdRftYXwVVdMxVY2GdcpBMwvMIWfZEGE7hX0uVXMwVY1jUGs5ECdTdmDWYGdjAIYFBtHDACJRBUKQAH/xeAGyVzAvEGiRAHWcACAkgQK1CAB6hRA4gWlrVQTOWA2ccDbPNZkhEAFmhVMhE+prWBcsVQruSBkoEFIWgHZUAGgVAHT4BxIZACQbUCb0AIiucCajUQZ1CDN0hUUDYQKRBukrdRbXgWQbhUUSiFXRRCnmMDeKUtSaiELvFSxyRTcYVZmUWF/n0hAF5AZmWQAGtACF/gBBjXASnAApaYdYjwB1pghkSFZSyACG6whnJIEApgB23gBTqwUZz2E0jFgHbIgeR0UmPQINgTJX44GnhgEgUFU1o1Ugx1U3CnBhZyFgbABlQQYphmBU5QbZJGAhK1WGSACHLQgzFYAQKQAoFggzg4igSxBn9wBpyYAqvIEyDVekplLujogKCkTSplEngwHXmgBkoITmkgTuU0UtV0SPfVFydwAgDgADowZU/QBDbnjIqmbHewibalU4FQhmxIEBNwB4YAjo/1E/j0dqcVWP70T6CUUlGiBnkwH3kQAMRkUAGSTNbETM4EReh3Fg9wAo2g/gBcIG1d0ATzxnAj8IwuEJDJF44atQIY5QaDYIM+CW0CgQWBgAioyFE+IU0HZo4p2UtQok1vEgAheSEjaUovFVPJRE0mtpIgVERncQICcACFdQaIcAXzlmsgEFEHOQiBoJAbtQI6UJd2QAjaSFQiMIdnMAhKGY7FtxO2NE25lFT5xEpTOT3BZJVVkpWPpEWS1Ekr+UVhOZaN4AJ4dwaEcAZSQAQfAAJV55aLxQWEcAfU6E6IJmiE8AbSp1YWQE9wMAiEwAXbeHg8MZi3FCDTJZmI6UOihBGMeSa5uEj/5UGTWUhjlGIJQX/tlAIWUAEVIE8OgAIOQHTS9gb6R1Q6/qmZpumTKeBTXOB/b6AFjLdRLOB/yVebRtkR0UVIhfSUURRKESEWAfCOkJIGCHBFTchDkaRHbCRGKDZCOCAQB2AAAqAAzWlbCpoFgfAHrclqLLBYbFCa+adWPuUFf7CaW1Cb7rRRWoCeXEBec6gQgmRAS/SebsRDcERHG4AAoAUpfNAIvQITWaRFPfRDfrRE93VA5UMDCvqjjsWgq7l82hmhLjCGd7CUROVT0kYIcCCXGrVqH0oIgBCiG9V8CYFE0dV2QsSlY/BE/DlFE1FFGrRBBrVDPyRCLcSjPQqkbhpR/ncH4EheGBWhdymnOqBkP9Wk0+iTEVpbqimn5DUS/lq6pWs6QDAkRQ6hPzYEAxuDn/9zVQJEQSz0QPSjNjPwpkB6B4cQCGiQp6zWAiygA3GKBg9aAojWpHKanWCIbIJ2CHdABmnlcAjRQJZaPi1EQQzSIBf0KS8qL76jOd/THfgzPbeqYseTqZrqWDuYiWjAqqLKAlmQoZ76oCvwU1wQCIkACKhIXosVoW8ACJlopSmApQbRQAV2q1F1P+DTHVkDA4sSNsFKo8NKPJ7TH86TPH+jAsuqVgGZCIHgBjrAAoz2jFsgroHAmhf1kzqABVkACAD7qWnVAkU3ahAblzgYmAehAqeTr8ejN8JDPfbTWRQBr/3zMxqBOQ6DRbNT/js9gDU4YDOlczp/Ezj82q8atQXaagismZ18pwUQi5ebOLE+BbQA6wZYsI06QAY6wAV1p62BIH3rWRAcKzgr5jo1gzU3ABHkYzsTYUMQsjtxMzcMczKNozZ701k14zemwzpecwG21QJbQKeX6AU7a4OgGlEOK2iJcAjTmLcucGRs4AeJ8ILbeJYhSAiJcAdrOLUDcThdMzinAzFZKxP4ijU4kzJ4UTjvGDUWITN4o7UTIQMzIDCfx307o1YU6wVx4AXPuLdZ8AaBoAhkuAUDq1HSugWvigimmbTvlAVksH6E8H9ZwIlacAZAdgfaurhJa5sb61yfZ7pmC7NrgzNS/rMoLHOVYaMGMzYp1jI1ElEzN/Mwp5cBQ8MzF0ABRUtybxAHmuiwZCVWslu401i8taUDW+AFZ+B/vOsFvtsChlV3foAIiECUGpUFbjBmfqC4m3mDJUCrAhE056sC5ls0EIM0ExET5Ns0LPOrYdNSdxErRdMwD3M3MoAxF3MBKtAx7lIAI0dqDSpWaBAHcvAGcAAIwysHXpAFoLpTyOt/i8sFzcsCZyBsyosIpVm876QDcTBm4tq/SjyijVAAKszCF1MxLjYySVPCE8FcL7AyjeDBcRMkrOEt1gJ+W1Mu55Iu64IvLPwuAtECRux/f3AHf9CggxYIDbnDoLoFRTxm/orbu2mFBgo8vAmrBbdLqmMmmwnLBTeosRH8xveiLxSAB+joAxI4MJayKMsBJEbUAwWQK97CK831K8FSJxmgFc2CLHwyAQl8xImAxIGQxwl7BrZ7wAt2BwscxK25iMo7vHKqd2a4BYagy3r8dIjcAlLMAMfCzMkSAQyQAdFCI9RCwaSMLV1BkrTEGnVhxi9QMZmSE5yCyguAAKcyKo1gAPt7B35JCLNMZncACIBAZMV7wEYcCMP7BzvMiXIwZoEAl0TWU2bIBYjgB34ACOF2BpsIycx8zqiCANK8B6zCCK4CK7KyKIVhMLT0KGkiKd7CJm8SJzlRIniwA3hyJX8i/hAEIGjKGwh+MGzyHNCcGJ7+7M6t+1MEW8fxPMsBvYYugAgITWaGlQVXRxAL8CcHkiA7YMmFwgiHEgOwMitgohQZBE1mQiSDESZgogFKAgQjIi0+JCVXMhAuYAcGDdMvTWSObIZogNDIN8tuUG7LJwh2Z1h6h1GzJ4KuRdRYetQHgicBAEVb4iRdsk1bzShdQSb9liFZvSFd8SE2EEBMQtF4QAEmoSei0QgtOGYhaNB24FqOnIp2S3sQdtcrcMdjJmR2naeF5QaupZA/WByhQRWVPCOEfSM5siN1wSFKIRchoXEDUR+XcR9jIgEgAhH/AUUnrSKNIGYvTdqljVH//lzXCr13WNDWhHZqPHy7bHUQgFKOuzoTORIhGvIevj2M3cZIwn0ddNEalcEdPtAAwngeL8LSnB1u3UUGxRu7tPdgeocFWkAGZ9BdxZtRE2Cu3j3be6EGDbAe7dHe7g0b6A3cNiAQtjEXmNEVuiEXEgAESwEcBEIA68x+D8ZThrUGQBZ0Cs3DyBZPjrcT5nEcnqEc9pEduIEYTTHhwD0QjGThTfEa7L0V3NwZn2EaV7HSY8YGOrACbGZ1USpRKSDFLGLkgdEAqmEXraEd8KEYZLfjPSExbbEYH3EbGrIZXfEZIYEAKQDJ05HmgVHmPuLbXA4SXt4XO2BDCkEU7nHmwLHxESK8MBSIEDreCGly44sx3Obd51VNEI5a52rREA9BshVRNzTx4wRhIRZdLZnzEpxeA7c4FQGA43OOJ4Se4wFgF9URARSxOTQBBGbh6LAe67I+67Re67Z+67ie67q+67ze677+68Ae7MI+7MRe7MZ+7Mie7Mq+7Mze7M7+7NAe7dI+7dRe7dZ+7die7dq+7dze7d7+7eAe7uI+7uRe7uZ+7uie7uq+7uze7u7+7vAe7/I+7/Re7/Z+7/ie7wQREAAh+QQBCgCNACwAAAAAyAB9AIcIBwUJCAYUEgUZFgYVEQ0WFg4eGg4aFRAaGRohHQgqHBUfIRAqJQooKxckIh4rIxs6MxIgICMnJigsKy80KyExMiM7MSU+Myg7PiwzMzM/PTU3Nzo8PD5UBwVgAABtAABqEQ1AORBGPCJIPC5SNipjLSNkPjBUShZYThZtYRxSRideUyBOQDFFSTdhUy5tRTZuTjxjVDRhUD5wXzlDQkFISEdNTU9RT0pNUUBWWkhTUlJZWFVfXVpfYlF1YUtjY19qblxmZmZvbmt0eGZ4d3OEAACQAACYAACQGROzAAC5AACMKR+xJx6IOSzSAADYCAjeFA/jBwfgIyP1OTGRRjaIUD6wSjqFdDKRfznvQjmWZE6BZ1CCbFOWbliFcFmQd1y/Z1WWfGDrWEXlY071aVrtfmj1dWh/gnGhjEOkjkucgWSdhGmAgH2IjHyihmiqjW2wk2uljHGukXG3mHWwlXi0mXvgg23tln7Gp3HDon2SlYeZmZmdoo6mq5iwtaK+vr3LqILAp47QronPsI/LspnYuJXvtpvgvp/jxqjqzrHu0LLMzMzV1dQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/gAbCRxIsKDBgwgTFvzzhwiRID947NBB0UYNGz+IFECgcCCCjwgKdBxJMIBJkyIVhnxo0QZFHTt4/AjikOEiRowWkdzJs6fPnwUtJjxpUoKECUiRSnAA8mNKgSaBGgzQCGWBjSAdHE06wShRhTR08CDC5o/Us2jTIrRRECvICAgiyN06IUOEDEqZLriq9udVBAu0IrWLt6sEuXDhNuVI0AaPvpAj93SLuHIEo0aR3p3AxoGDBaD3SvZ5tUBoBxHY1I2gFLPlxCCfjp49mzJizJm5HmZNJIIDPaZB0/YbHHQBPXKJTJjL1bBRy7GHSz+7MfHl3EmfI9YhREiENoAD/oSeDjT0AvHHI3TXURl79spOycvvWJ150sKHJ9DY8eNHdyJtACeeefP9ZB5oARynBxHd9bcDDcvRhd9ucMlWoHz1bZXBhnhJkEEN/Amxxx847aFHBlQdeCFQpjVAYCMT6LEHTn/sIcQPO9SQwVEcTlhhI0KsKF1cGmawwZFG6kDTiDgx8ocebKB0YANCSnWgcSYFSCKNezykwwZGIokfXI0EUeVoCGh4JAdscmADEX7gdNMifezBQwEDmtcAlWeWt+eVJv2wRx9z4uQHETa0yYGYXXH0Q5+QDbYBmzTQwIEGNcy4yE2M1JlBSHuGKiqkUolqagNXbTConDftUYMG/hxUyiaYeEVAalqsGclmDTVUWqkQW9K5BwcOVGDsschWcGupyTbrAAeDcvqHEL7SwOustVK1rE93TRrrRRbVgMMNQvThRx96TFDBhhi0624F7m4rFbzt0utuBhhkUMEEbfhxLhE3iAtur9jaKu9OHm7gaw0w6XDDwzHxYAOYGlRssQbuxnuwXxm7azEGFh95g0Q7PHwDTBb5CqYEG3fk4bc1PMwDDznsEHHJD/vaws4899wyUPD2LPTOlcYM08w2i8VDztfu+PNBL18U8w0x7dDDzEg7zCsOXHftdQtPS7Wz12SLa3LEPPSgtkRaW8SB02ELVBcNNtR9dNo99Ncf/sk5PJxDDjgADrjXcf+EAdmCB9431TbPrPfabN9Q99sTxF2AfgzDFFN/QEA008xX75BDD6P/bbrghQPVQuCKm0466VY73l8Qne8tkUuJTlAAEU9PmvnmQgDRXefBP6728cibnrrYriOP/A95zyQE7cNDxLYOiW7QOwcM2yx9d0IMAT7tQJRf/g9A9FA+8sufhQPy6wOBvvnlBw+++N1BZLPb2rf84dFB+I9DBjiEAhaQfgg8XvvQ8j71IdB84itg+AY4wPyxTUeMOVj3pDdANrDhDGcgoAGHQIQR0m+BackB/UbIQhI6BIRsIItDpocjHfBKg2EJkUM86ME2fBCE/iEEIhBNCAQUqkWFQBihEEFIBCGyoQ0+9OAMa2gteXFALP4hyxMDpAcoevEMbQDjEkdoxL70gIVCDKMavQjFLkaRQTXkwLZ4gEUh9FAPeHQjG/cYRhAasIyQOeMQ0sjHPeYRSh68ER0fQ6ofOCaAT8yjiQ5JyT0KEZCRAQIQDUlJSk6yi2yYnsQe1acgYIQmbMDjHlZ5SD7wQQ+vPKQlMSkZTYLRi5R8pS4luUoTtaFBNjBTlYSgJCEASEardKUyl7lMWUJxNgJ4gAUoYIADCGB5Q2BjK5nJTT70sg0MCoIOeLciNhTzib3kQx/Uqc4+uLObh5TMASzAAhnMYAYw/pCBC1jAzxFM0wBhG2Qeu+nOgq5znd40USLFSc75mDOAZAlQOw1q0HO9s5mRUcAMusAFLmxhC/iUgQxMwM+SsmAEAP1ZASSqTIq6tKCuxGMMp6eDKJGHDQLxjzFTCcuC+uunQKUoHyRjgS6E4Qsc9eg9RbpPk5bUAgd42hlgOVFzATWo7wRlKIMgThvYdDg2iAlXmyhRd171rP5a52hkoAY1hCEMXeDoR0MqA6c61QIEkKorzYpWrL4yjOHEkUW+OpqjJRGMeKzqWQ06VHluQQ5tdStSO7oFH8xApCS1a0lHEFW9ThStjMVjGIcQkYmEC6eQ4dUNRndYxLb0pe+k/g0F1CAHObghskdNqmXz2VTN8tMChRsCVWF70b/6MX1949VFztIrGqwucGpL4iDbSNW9wrSxwwkDHmrrhtuqoQuTVSpvfWvSlAa3DXudaDPdeIYDqm1wLahURxzgH3NqIANkW210W4vLxMZ0PgeQQx5qa9u25paylhUpeTeLwgJk07+xFG0fh7A+0g2uaxnQwA626plGSKACmHFAaUZMYhLvhS8rYkEe8rDd2rbVqJOt7GXrumB+KoCWAimxjnesFaOA2AE45sKK8zAHFxs4xrvVZ41PiuMmS0YNQ24xZL971I76wAf5pHGNnczltAhAwEMm8G1hLNeljnTJ1+yy/pp/IuQoczeySIZBPjO74Lyu+c47UQCYV1zkKRs1ruJVco3tjOdCKwQGQ17xmyVb5hkvmdCGjnRBCADlIff5tgfmQpJ769s0S5onzhHxjkddmj6ZINEDNjJcyzzeBdOS1LDu8YeX8pFG1HcH9+Xac/XrwEHecqDKFG1DyfOFRBfZu1/4QkevEAMVQCABDICACFRg1xEsb3dcDHYeoXjc9JGObDjI8IZv5JmNIKS5zx2d+gr46+pad5ltGMJ09Oxm26YBC1dYQQjSHE3zCiDaIhgBk9MygAHQJpvMLG4sue3eb+MgvjRAS92Uq1/++pe4CNWDvGkjg0TXFg0QGIgB/ixgAhlkmQX/9DQFgHsWA7jAAx7wtFqEa12fMnbhxyVdwHjFlr6wgeeGnW5ifbrY656BNl2IMhYY0IgRzKCjHk2woPl5Abw2orNAoTQYiuABg6vlDDW3KlYvynAgsO20kgnAz8Mqk/C5luh9tagrjy4ZSrMYCwlohAkka+V73jPLIlXwjc8yA0Aw4QMe6EBawN7OuP80q4D13A4Gq620q90lOj1mT/kK2tDSHTIKgMMVBAIDt3LB76hPvd9FOgJqypwkFshDGY6AeBCcZaphjztMZXqGBmEvSpUfjR5M8tCdltWlFhVqsNtgobOgIAWNEIAPwqBUv8NA9ajPclMt/pB3gjzgAJAeCADUAIgn0D7x4SfJSt1dVXO5/+agDGdNTaKH6eyhDWo/JxvSyU6XcvOQ7aUWEIACjUABXABXmoZ9qXdlf6dgVPcAD6AAD8AFXVBXWDcQI5AHYJAERgBzIJB+HSFQwPZajIVQCQVKNBUlbbAH87EHAUBMEBUgydRNzORMULRxZ3ECVxdXCGhZCnhPVxaEl+UCgcdUewcIalACJcByBNFxVnAEXOcBJfB6IahNEEaDrtRLUBJObxIALHghLmhKOsVTybRNEWaDIFREztcIM+BWcuWD16d6lhWEdOgDleWDaiAIh6AFH/ABJXCBbCgHTWAEUVgCPWFL/lbYSlQ1UKy0hdMTTF5YJWH4SFokSZ1kg1+UhlIBASfwAGoQXiCVT3ImZ353ZZX1UaiIilEHZYdgCFJAeyDAAg9AEFxQB13wAkpYAta2E4h4SwFCXZfYiD4kShgRiWcyfItUXx6EiYU0RhQ2EgJwANI4jSpAATIQaExVhCYHhHaYilXgA1BHWXIwCIdABk9gBIhHAixwAXb2BYWgBjNgUrzIbptUSIkYRaEUEWIRAPUHKWyAAFfUdjwUSXrERmI0YSPUAwkxT1NXYyZgAkQYeHE4A93IBd9FUuAIdVuAB4dwB2KgBOgohSUVVV9wCHSwBb1FEoJkQEtkj27EQ3BE/kccgACoBSl+0Ai9AhNZpEU99EN+tETtdUDlkwOTdgElx2lLVlIRKVJxeGVcIGBcoITXGI56OAZTAJKIVwImdQBdkAh1wAVaNhJIJF2+JkRleQZPNJBTNBFVpEEbBFE79EMi1EJCOZQD8QAgRWdJaVdLuY0z8FiDkAdL8AEdwAIZuQVfMAiAEAVOkARRqI6bxQWHEAdbkFm7mBBjSZZ0OUAwJEUOoT82VAMb84//I1YCREEs9ED0ozY4QAD1hJR76VQQGXh+R34diZUlcI2VFQaJ8AZKkATnF4ucxgWDIAco+VsK0UCqWT4tREEM0iAX9Ck1KS++oznf0x34Mz3L/llhx4MDsBmbshmRowgDclAIhjAGWOkBLPBRPqAGidAFSECIMFcCRGhSanAIxrl9CdFA+7WcXHU/4NMdWVMDixI21amT10k8ntMfzpM8f9MC4LlgLiCe+OQDedCRZMCBWWmKcpAIalAFS6CE6ohZ/DQDF+oGPqCfB9ECp9Ogx6M3wkM99lNaFEGg/fMzGoE5DoNFs1M7QYA1PWAzpXM6fxM4EBqhdjWb9uR3xHkHZpAFHMh1JfCXPuAGhzAHx1lS9nRmtrkGlYmcBsGigmNhrlMzWMMDEEE+tjMRNgQhuxM3c8MwJ9M4arM3pVUzfmM6rOM1GICkThWR3OgDiWkH/lDwm4/5l1twn3kQBpy2pURYnoegBlzwVAZxOF0zOKcDMWYqEwyKNTiTMnhROPUXNRYhM3hzphNxAzggMOD2cDvjpyzwkBRKkZXVlVrwm+dXmOx5nyY5A721pdd4oYfgBltAqQUxNq3KqnMKpGuDM1KzKCzzhWHTBh42KdYyNRJRMzfzMOimAUPDMxhQAX/qBXWlT93ogzNWhBRpZWqACF+wBPIJAuqoVF1wCIewqJfFT5pWV8Vmr5KaWbM4EEHzrS3grUUDMUgzETHBrU3DMtMZNjh1F7FSNA3zMHdzAxhzMRjQAh3jLgXATy5wgHKwBjLglHHlBeClbExVT08X/lc+EAeTCQMuAJn8xFFtSI558AXxyE9f8IlfIGD2Sqw0RmgFsLEdezEVk2EjkzQWOxHNRQMr0wgPGzdBwhreYi0TtzXlci7psi740rHvYk+0tV2BIKlGpQZrsAbdpQZZyk9bYFTUpwaFkAdty7PKhgfkaIsyy09qMAdzgAd4AAiJgJ9bUFcXQBD2ArYbYix64H5CsHMDYymLshxAYkRBUAC54i284ly/Eix1ogFa0SzI0gAWwAV/u2KDsAZxUAeBUAd14GI+4FSIGQaRZa9rAANOFVkX6pU621SVtmKCoAiH4KW4O3iN0ADHgrzJIgENoAHRQiPUUrCbiy1d8YK0/sQadXG1NFAxmZITnPK5C4AApzIqLABm5HgIiHAIgVlbX6BlJYq23nUIihAIYZCv9WRbAia8dKCzNOYGiSYIiUAIawCWTIi844sqCOC8fcAqjOAqsCIri1IYBkNLj5ImkuItbPImcZITJaIHP4AnV/InjeCJLCa/whuYeOAGOquXMxAGazBl8jsIcYBl/OQD2zUHgCC8tmi/e5YH5Ei/KZpmC/AnB5IgP9C4hcIIh2IDsDIrYKIUGYRjZkIkgxEmYLIBSkIEIyItPiQlVxJ9QgYIhTAIgrBieGB6p9dUMhAG3IW3ijAIkgoDGElkeBC8JtkFPlCueDBkgoCzXxC7/gDQCEN8IHgSAFC0JU7SJeJ0xYzSFWSyZhlSxRvSFR+yAwHEJA2sBxVgEnoiGjKAw4AACHxGYJKqZXEQCAN2oW8sB2nMAiaKuvqLx3XlBf8rCIIgB10wAyNQHKFBFRUgI1xyIzmyI3XBIUohFyFhaPVxGfcxJhMAIhDxH1AEwipiAT28XYCLy1pGB4qmyoHAyvm6BUN2vnHQBYXLAr+bB6I8B5LKAoCyfs85EzkSIRryHsjcfGrGSMt8HXTRGpXBHULgAMx3HgTiAqi2xz4cB7jLT2GQaPIbCGuQy3WVdMCrvnGgsjJQW0nVUTJgAQJgHujRBg6wHu3Rz/4MG/iM/mc7kGNvcRuY0RW6IRcTQARLARwEQtH/a5JatgZDBgj2CtGyjM6Jtr4qi3IgaB7H4RnKYR/ZgRuI0RQpHWmMxNItbRm4oRlI0RmfYRpX0cO2XAhy0Ftthrr3+l3n/JQ9nQdr8McmwIQEcRV7ERgOoBp20RraAR+KUWufNhIS0xaL8REuPRib0RWfERIIYMaDYAdlAAZUsARL8AIw8LMrBgiCwM4qC1wKkM6fWJnmJRCGHRgaMth3HRd/vddn8QM2pBBE4R6EHRsfMbELYwM39sqK9olR3Qhp4tSLwcz27NpRTBCiadpS0RAPQaMVUTc00RQT3AhPUWwPXC2Z8xLSsK0DwTcVAfDUeR0SVLEYeGIX1SEBFLE5NEEEZiHctyIAlXbGcDUDTMgCXeAGtlW/LACC5m3eB/BYtqWzbk0Q9F3f/j0QBPAAVPjfBF7gBn7gCJ7gCr7gDN7gDv7gEB7hEj7hFF7hFn7hGJ7hGr7hHN7hHv7hIB7iIj7iJF7iJn7iKJ7iKr7iLN7iLv7iMB7jMj7jNF7jNn7jOJ7jOr7jPN7jPv7jQB7kQj7kRF7kMR4QACH5BAEKAIoALAAAAADIAH0AhwgHBQkIBhQSBRkWBhURDRYWDh4aDhoVEBoZGiEdCCocFR8hECgrFyQiHisjGzozEiAgIycmKCwrLzQrITEyIzsxJT4zKDs+LDMzMz89NTc3Ojw8PlQHBWAAAG0AAGoRDUg8LlI2KmMtI2Q+MFRKFlhOFm1hHFJGJ15TIE5AMUVJN2FTLm5OPGFQPnBfOXJiMkNCQUhIR01NT1FPSk1RQFZaSFNSUllYVV9dWl9iUXVhS2NjX2puXGZmZm9ua3R4Znh3c4QAAJAAAJgAAIsTD4MfGJAZE7MAAKUfGIwpH6wkHLM/MdIAANgICOMHB/ECAvMMDPU5MZFGNoV0MspJOtROPe9COZZkTot3Q4FnUIJsU5ZuWJB3XJZ8YOtYReVjTvVpWu1+aH+CcZWEJ5iBUaGMQ5yBZJ2EaYCAfYiMfKKGaLCTa7mbbKWMca6RcbeYdbCVeLSZe+CDbcanccOifZKVh5mZmZ2ijqarmLC1or6+vcuogsCnjtCuic+wj8uymdi3lNy8m++2m+C+n+i7nePGqOrOse7QsszMzNXV1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj+ABUJHEiwoMGDCBMW1KMHCJAeO3DcsEFRRgwZO4AUQKBwIIKPCAp0HEkwgEmTIhWGfGhRBkUbN3Ds6OGQIaJEiRCR3Mmzp8+fBS0mPGkyQgQJSJFGaADyY0qBJoEaDKAIZYGNIBscTSrBKFGFMGzgAIJGj9SzaNMilFEQK0gICCDI3SoBAwQMSpkuuKr251UEC7QitYu3awS5cOE25UhQBo6+kCP3dIu4MgSjRpHelYCmQYMFoPdK9nm1QOgGENDUhaAUs+XEIJ+Onj2bMmLMmbkeZg0EQoM6pkHT9hscdIE6coFImMvVsFHLsYdLP7sx8eXcSZ8jtuHDB4Q0gAP+hJ4ONPQC8cchdLdRGXv2yk7Jy+9YnXnSwoclwLixY0d3IGkAJ5558/1kHmgBHFcHEN31dwMMy9GF325wyVagfPVthcGGeEWAQQz8+WCHHjjZUQcGVB14IVCmMUCgIhLUYQdOetjhww43xIDBURxOWKEiPqwoXVwaYqDBkUbaQNOIOCWiRx1ooHQgA0JKdaBxJgVIIo12PGSDBkYiiR9civRQ5WgIaHjkBmxuIAMQeeB0EyJ42IFDAQOaxwCVZ5a355Um7WAHHnPilAcQMrS5gZhdcbRDn5ANpgGbMMCwQQYxzIjITYnUiUFIe4YqKqRSiWoqA1dpMKicN9kRQwb+G1TKJph4QUBqWqwZyWYMMVRaqQ9b0mnHBg1QYOyxyFJwa6nJNtvABoNyqocPvsLA66y1UrWsT3dNGutFFsVAwww+4JEHHnVIQMGGF7TrLgXubisVvO3S6y4GF2BAgQRp5HEuEDOIC26v2Noq704eauBrDDDZMMPDMeEgA5gZVGxxBu7Ge7BfGbtr8QUWHzmDRDc8PANMFvkKZgQbd+ThtzE8jAMONdwQcckP+6rCzjz33DJQ8PYs9M6VxgzTzDaLhUPO1+7480EvXxTzDDHdkMPMSDvMKw1cd+21Ck9LtbPXZItrcsQ45KC2RFpbtIHTYQtUFwwy1H102jn01x/+yTU8XEMNNAAOuNdx/3QB2YIH3jfVNs+s99psz1D32xLEXYB+DMMUU388QDTTzFffUEMOo/9tuuCFA6VC4IqbTjrpVjveXw+d7y2RS4lKUAAQT0+a+eY+8NBd58E/rvbxyJueutiuI4/8DnnP5APtw0PEtg2JatD7BgzbLH13PvwAPu08lF/+DjzkUD7yy59FA/Lr84C++eUHD7743UFks9vat/zh0T34j0MG+IMCFpB+CDxe+9DyPvUh0HziK2D4BjjA/LFNR4w5WPekN0A0oEEMYiCgAX8AhBHSb4FpqQH9RshCEjoEhGggi0OmhyMb8EqDYQmRQzzowTR8EIT+IQQiEE3IAxSqRYU8GKEQQQgEIaIhDT704AxraC15bUAs/iHLEwNUByh6UQxpAOMSR2jEvuSAhUIMoxq9CMUuRpFBNdzAtnCARR/0sA54dCMb9xhGEBqwjJA54w/SyMc95hFKHrwRHR9Dqh04JoBPzKOJDknJPQoRkJHhARANSUlKTrKLaJiexB7Vpx5ghCZowKMdVnnIO9yhDq88pCUxKRlNgtGLlHylLiW5ShOloUEyMFOVfKAkHwBIRqt0pTKXuUxZQnE4AjDiD9jYSmZa8w69TAODemAD3q0IDcV8Yi/vgAdykhMP6LzmIWdjgAqkoAXwTIEFKjABBxiAAHH+G2Qer4nOfpaznNg0USK56c35gDOAZAnQOf3pz3Ols5mSsQALdKCFLOjABSyIZwo2ulEQKCBsBVCoMhlK0n66Eo8xnJ4NokQeNAjEP8ZMJSz76a+a2pShd5AMAVjQBS5sQQsVvahGOcpRCxggbGKA5ULNZdObphOUoewBN2XA0uHIICZSbaJC0dnUrvqrnKNxgBbM0FMuANWiGG3BCojK1gpE82licCVXverUV4ZxmziySFVHc7QkghGPS+2qP3M6GhCY4bBk9elZhdqCEbCVrROIW1wX6tXB4jGMP4jIRMLlUsjwagaj8+tfR1rSdA6HBW5wgxoQ69OfZiELLoD+p2MfS1QHFO4HSi3tQ+3qx/T1jVcXOUuvYLC6wKktiYNso1LlalLCDicLqVUtYnv6Uy0wdq20JWr7pinXhTbTjWI4oNoGp4JKdaQB/gFnBjBANtAeV7S4BOxJC+SGOUR3tWQlQ3VhG1vsZnejtl1gAaYp31heto8/WB/pBtc1DGTgBlH1jCIiQAHMNKA0GM5whvfClxVVgA50iO4aWLsF17ogti34L1HfSksNu/jFWjFKhRtAS0W4AMT2TS1+qVvRE2d0tiqObI2HHBkugJgOOR5xYvebViD/FwREjrJa3HDkEEv3sF0ocVD7q2KOSvnLUjFDlZOMZcXy98ddTgH+mNfcExBU2cpK5vFrm5xmNtuZJFsYs47LbOKMprjLdw50QibwhiPP4Q1uiLOZYStbFUNZ0D5xzoVfTOnS9EkHY16DdHnc44z6l7YVaHGlKx1jCi/lI4pI7w3Wy7XiuteBg7zlPpV52YJO5wBUPjKi8UsGM594BSg4wQmyG+rU7Y6LtM4jFHubPtKRjQYOhvCNPLMRhAy3uKNTXwFlvVzmLjMNP5jOCOZgaE1jmQxkwMILSPCAAQgkAQ94gLCHvdFiP427y9xtLJctXmfToLwwQEvdgOte+MpXtwCtQ7hpk+cjp3YNZZhCCR7w1gNMYJ4HYDG8H5ACex8Mt8yl6WD+991b0gWMV2zpCxpQ3tfkApamgm2uGNiZazq8YQ1TeKsC3smCE2uUnvcUyAECLK/JNrSpI+c3D9jGWckEYOVXlUn4RgtzujrUlTOXTAVyPYcpKEIALdCCls/c6BGYPQW2FQCLSWV0plr96l0MoeduoFdtOf3pLoHpMWc618paNuuQGTcbTPD1LJjBtRc9seIXn1a3KsLdkEpqyN0e83KiVAwNwl6U7D6aOpjkoDHdKkkdilNap8FCaClDCRRxgCyYlfGwX7yfUzABta+9QCHt9lLNxfuRg3KbKzVJHaZjhzQ8PZxoGKc5SWrNQ4a3L2MggSIUIHYtxP76GJ09CBz+cHv56HPWpB0sQAMKSpVGKQ12mI8dAkBMhAYomddkpjOhuPCzkED6E9iCYrGPfbVyFAQGcAAEAADeR00FFn+u1EtQsk1vEgDpdyHrZ0owJVPJVE0GNn8gVERnsXoVcFj7d306kHhz5nPwBE8rAGQVoAAESBu2ZICtpFT7xEoLOD3B5IBVEoGPpEWS1Enz90UZuIGKsAVm4Gv8d2KwZVEhqHiw5Wdn13HdlxYteEsBolw8KIM+JEoYYYNn4nmLlF4e1IOFNEYJBhT3lwKHx2QskIY9x3g68Fpu+IZuqHiexlFEpxbIRUiFFF9QFUoRIRYBMHyQggYIcEVSx0ORpEf+bCRGCDZCOfATJUAAWmBWZFeCLZCGi9eGbghUmnhWaOVjf9ZxChGA+NQRgmRAS5SHbsRDcERHG4AAnQUpeaAIvQITWaRFPfRDfrRE4XVA5VMDHUEABuAAE1ABFbBWI3CCG+VYK0CJ8LSGLtCGm5gFFRWNnYhR/uV4BsECZuACKXAACoFEyBVrQiSOYvBEhjhFE1FFGrRBCLVDPyRCLcSLvXgQBGABJehk/2V2lOiMLiCNr7WJ1FiNnyhPt3djfsACHcABCQGO4RiPAwRDUuQQ+mNDMbAxgvg/WCVAFMRCD0Q/akMDBQECKIaPaTYCJWiJRiiNAAmQbph4LPBpHpf+BXQwCIKgBEHQAQjRQB1ZPi1EQQzSIBf0Ka8oL76jOd/THfgzPTupYMcDkoowAc/YWGmWXSbZjEr4jyvJiXOWeFJJhwLBAnQQCIRgBUfgAThpEA30XjspVfcDPt2RNTGwKGFTlLR4lMTjOf3hPMnzNypgAVyQBSQ5lRx1jFZ5lSqpZVoJe/5HVPi0BXtwCF/gBEPQAR3gjQShAqejl8ejN8JDPfajWRQRl/3zMxqBOQ6DRbNTOz2ANTlgM6VzOn8TOCrAjYJJlctYmCl5mJoIh/14YkLlZB9lBocgB0/ABEKQkJYpEJgpOAvmOjWDNTgAEeRjOxNhQxCyO3EzNwz+czKNozZ7o1k14zemwzpecwG1SZVVWYmXiJXVVVFweIQXlVFENQEE8AaDQAVMUJYdIAIEcThdMzinAzHPKRN5iTU4kzJ4UTjDFzUWITN4A50TMQM0IDDP9m87c560RZgtEHuZuJuZ+J4+R1TEuAd+gARHcJwdEAKXWVzPRqHcyZprgzNSsygs84BhkwYTNinWMjUSUTM38zDXlgFDwzMXQAEYSlS36ZshmHjP2I/v+YbRmFZE1QKD4AZJIARmKQJCFjRDqgJCWjQQgzQTERNA2jQsM5Rh41J3EStF0zAPczczgDEXcwEq0DHuUgBHqqFr2IZLyoa8KYK7mVb+pQX+VQqYIgBgilAAdGqnF1MxDjYySfOmEzFcMLAyioCmcRMkrOEt1jJwW1Mu55Iu64IvdvouKkaJZqehhcmnsmeE0agDPXeYP+Vz/sUFfkAHgMlRH2UvpbohxlIHvOcDJzcwlrIoywEkRtQDBZAr3sIrxPUrwVInGaAVzYIsDEBUW3CSKumeJGiVKplWJdiPQNVn7ySN+tcFZsBoRNUFg+AHXOBfBsAAxyKvyRIBDJAB0UIj1OKlzootXcF+tMQadcGpMFAxmZITnCKtC4AApyIqKeACXeAGZyCu+scFXXCxXaAFjdYCFOVTGEVULCB2XDCyWcACs8UCW4CuiJUFA8n+Be26jRwlrw2LKgiAr3jAKongKrAiK4tSGAZDS4+SJpLiLWzyJnGSEyVSBzuAJ1fyJ24QB1R2BhZ7Bm0QXW2QrkA2AlmQsn9psoPpeiqrsRy1Ai5gsWaQWmYgthtlBi9LmwvwJweSIDsArIWSCIciA7AyK2CiFBlUY2ZCJIMRJmCiAUoCBCMiLT4kJVdyZH4AB3TAB39wq3DgBjBLVJHogS7waRB7BqvFBbQ5AmNFBjqgtVWbtilmkHRgBin2tgeCJwEARVviJF3CTYPLKF1BJmCWIYG7IV3xITcQQEySs3VAASahJ3tBB3swCIdwCIUQCH2QWlwwkCmgA+iqBmT+oLYbFXap1QYZ21hrQG5uILbQRbnWR2WDsAdmUByhQRUUICNcciM5siN1wSFKIRchcWf1cRn3MSYSACIQ8R9QxLQHQgd+YAjt2gd7MAdqwAUswFYucLYjpgUNTFQ6cAaTm7Y9B2J9MAhmwFEPZwZrgLyGQAeAkns/ORM5EiEa8h72i3pfxkj5ex100RqVwR0+0ACndx7mQcAIvAdIpgZbQJsc9cCTC8RCvFFacKuUywU6YGQkOghcwFFillog5geHYB7okQYNsB7tMcM0DBsuzGY3IBC2MReY0RW6IRcSAARLARzmUWi6NoQu4GRaELlLPMdEZQaFYHOrlQVq0Af+gRAIhnAFRkAEImBkVTYI5nEcnqEc9pEduIEYTRHGgcZIZNwUryHDWyGwnfEZpnEVcey5dFwIe6BaXcCylnurIXZ4czAIgBAGUdAEJ/oBYnZkV7EXgdEAqmEXraEd8KEYqAZpIyExbbEYH3EbGrIZXfEZIYEAP0wGsTWlgfDD3UtUNwZilEsGdGAIYAAFxXkEQTACcNzMgZHMPmK/wAwSwnwWO2BDCkEU7rHMsfERbLowMjAI2IzBKbCMlKwIaRLJi6G/LDzPfUsQFbnOUtEQDwGaFVE3NIHJBFEA12xfO1stmfMSGG0DnDcVASDJ6Ywn/jzJAWAX1REBFLE5NAH+BGaB0JCiBfmMve/UAlM8hG+AaNCcveRWaH1wCHSgA59oWykAxyB2eGrG0kYkAGewytlaW4ogk5Rbc2agA1J8ZMnrBxnr090oEBUwVmtABi1Qh0a9QC6tWp7L1C2AZG4Ax37wB1rAUdoMYlUNB3+ZYmENZphGBwt8xJH1YVTdB37gB0KMyHTg18+7BSz7aHUdZWBJB1Ir1V55AELtB37tB58okxrcB6n7Uy0gZIlNZBMAYm3guZ94VIoQwgTsB15QBXKwBEhQBCNAaHC9ykxsAZ39ZV2wypnLUULm0oM9CG9QBUuwBFIwAqGWAluQa6ulBYhd20Q21tXcUQLhZlXxTAddm2JE13oVlQKkzdxRZmTkO5BvxQLkhrxuYFZSnZzcfWdjfXgDmZwuMN6UG8Qfld6CdmMSuwUTvFHovdU9JdXbTd93lgJKfcRPCOAITQAXHMRAZuDMbQZvMISOrd8MntgEUF+N/dMTXtcKgM2n/ImcneEsndRwYLq6DeJhjWl+cAbY++EmLswfdqsr3uJG7QZr3QUYLuMInQUbfAafOIo4LswH0AaDYOP19uMsnQK3+mfobeSQ1gWHYOMex+RSPuVUXuVWfuVYnuVavuVc3uVe/uVgHuZiPuZkXuZmfuZonuZqvuZs3uZu/uZwHuYBAQA7
tail j=7099 line=");
tail j=7100 line= koeye_handhi_gif = url("data:/img/png;base64,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
tail j=7101 line=");
tail j=7102 line=
tail j=7103 line= return(img);
tail j=7104 line= }
tail j=7105 line= </script id="script_load_b64btn" >
tail j=7106 line=
tail j=7107 line= <script id="script_pdflist_show">
tail j=7108 line= function script_pdflist_show() {
tail j=7109 line= var z = 0; var pdfout=""; var len=pdflist.length;
tail j=7110 line= var pdfid = ""; var pdfurl = "";
tail j=7111 line= img_pdfid="/imgs/links/tn/tn_dragons_koo.png";
tail j=7112 line= tn_pdfid="/imgs/links/tn/tn_dragons_oko.png";
tail j=7113 line= for( z=0; z< pdflist.length; z++ ) {
tail j=7114 line= pdfid = pdflist[z].split(" " )[10];
tail j=7115 line=// alert( 'BUGS_1000 script_pdflist_show z="+z+" pdfid="+pdfid+" pdflist="+pdflist[z] );
tail j=7116 line= pdfid_code = pdflist[z].replace('.json','' );
tail j=7117 line=// img_pdfid = pdflist[z].replace('.json','.jpg' );
tail j=7118 line=// tn_pdfid = pdflist[z].replace('.json','.png' );
tail j=7119 line=// pdfout += "<h1><b>pdflist_"+z+"</b><h1>";
tail j=7120 line= pdfurl = pdfid;
tail j=7121 line=
tail j=7122 line=// http://ka12/kb/pdf/pdf_20190126/kou_20190125_2400_Understand
tail j=7123 line=// pdfout += "<a href='./index_vu.html?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
tail j=7124 line=// pdfout += "<a href='?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
tail j=7125 line= pdfout += '<a href='+pdfurl+' class="popover" target=_blank>';
tail j=7126 line= pdfout += " <img name='img_" + pdfid + "' height=100 src='"+tn_pdfid+"' border=0 height=100 >\n";
tail j=7127 line= pdfout += " <span><img name='img_" + pdfid + "' height=100 src='"+img_pdfid+"' border=0 height=100 ></span>\n";
tail j=7128 line= pdfout += " </a>";
tail j=7129 line=// alert( "bugs_196 pdfid=" + pdfid + " tn_pdfid=" + tn_pdfid );
tail j=7130 line= }
tail j=7131 line=// document.write( "bugs_198 pdfout=" + pdfout );
tail j=7132 line=
tail j=7133 line=// alert( "BUGS432_show pdflist("+len+")="+pdflist[z] + " len="+pdflist.length );
tail j=7134 line=// document.getElementById('div_tllist').innerHTML += pdfout;
tail j=7135 line= var parent = document.getElementById('div_pdflist');
tail j=7136 line= parent.insertAdjacentHTML('beforeend', pdfout);
tail j=7137 line= }
tail j=7138 line= </script id="script_pdflist_show">
tail j=7139 line=
tail j=7140 line= <div id="div_pdflist">
tail j=7141 line= <h1>div_pdflist</h1>
tail j=7142 line= </div id="div_pdflist">
tail j=7143 line=
tail j=7144 line= <hr color=yellow>
tail j=7145 line=
tail j=7146 line=
tail j=7147 line=
tail j=7148 line=
tail j=7149 line=
tail j=7150 line= <a href=# class="popover" alt="script_bugs">
tail j=7151 line= <img height=150 src="/imgs/links/tn/tn_dragon_b2.png" onclick="script_bugs('5400')">
tail j=7152 line= <span><img height=150 src="/imgs/links/tn/tn_dragon_w1.png" onclick="script_bugs('5400')"></span>
tail j=7153 line= </a>
tail j=7154 line=
tail j=7155 line= <script id="script_kob" >
tail j=7156 line= function script_kob(kobid) {
tail j=7157 line= alert( "BUGS_kob_6500 script_kob="+kobid );
tail j=7158 line= }
tail j=7159 line= </script id="script_kob" >
tail j=7160 line=
tail j=7161 line= <script id="script_kow" >
tail j=7162 line= function script_kow(kowid) {
tail j=7163 line= alert( "BUGS_kow_6500 script_kow="+kowid );
tail j=7164 line= }
tail j=7165 line= </script id="script_kow" >
tail j=7166 line=
tail j=7167 line=
tail j=7168 line= <button onclick="script_ajax2php">ajax2php</button>
tail j=7169 line= <button onclick="script_sllist">sllist</button>
tail j=7170 line= <button onclick="script_pdflist">pdflist</button>
tail j=7171 line=
tail j=7172 line= <button id="btn_sllist" onclick="script_sllist()">-= slflist =-</button>
tail j=7173 line= <a href=# class="popover" alt="script_slist()">
tail j=7174 line= <img height=100 src="/imgs/links/tn/tn_dragons_oko.png" onclick="script_sllist();" >
tail j=7175 line= <span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_sllist();" ></span>
tail j=7176 line= </a>
tail j=7177 line=
tail j=7178 line=
tail j=7179 line= <button id="btn_pdflist" onclick="script_pdflist()">-= pdflist =-</button>
tail j=7180 line= <a href=# class="popover" alt="script_pdflist()">
tail j=7181 line= <img height=100 src="imgs/links/tn/tn_dragons_oko.png" onclick="script_pdflist();" >
tail j=7182 line= <span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_pdflist();" ></span>
tail j=7183 line= </a>
tail j=7184 line=
tail j=7185 line= <script id="script_pdflist">
tail j=7186 line= function script_pdflist() {
tail j=7187 line= script_pdflist_load();
tail j=7188 line= script_pdflist_show();
tail j=7189 line= }
tail j=7190 line= </script id="script_pdflist">
tail j=7191 line=
tail j=7192 line= <script id="script_sllist">
tail j=7193 line= function script_sllist() {
tail j=7194 line= script_sllist_load();
tail j=7195 line= script_sllist_show();
tail j=7196 line= }
tail j=7197 line= </script id="script_sllist">
tail j=7198 line=
tail j=7199 line=
tail j=7200 line= <a href="/?js=script_shutdown" class="popover" alt="script_shutdown">
tail j=7201 line= <img height=150 src="/imgs/links/tn/tn_dragon_w2.png" onclick="script_shutdown('5600')">
tail j=7202 line= <span><img height=150 src="/imgs/links/tn/tn_dragon_b1.png" onclick="script_shutdown('5600')"></span>
tail j=7203 line= </a>
tail j=7204 line=
tail j=7205 line=
tail j=7206 line= <br><br><br><br><br><br><br>
tail j=7207 line= <div id="txtName"><h1>txtName</h1>
tail j=7208 line= </div id="txtName">
tail j=7209 line=
tail j=7210 line=
tail j=7211 line= <script id="script_ajaxdb3">
tail j=7212 line=// exit function if nothing has been typed in the textbox
tail j=7213 line= function showName(str){
tail j=7214 line= if (str.length == 0){
tail j=7215 line= document.getElementById("txtName").innerHTML=""; //clear previous results
tail j=7216 line= return;
tail j=7217 line= }
tail j=7218 line=
tail j=7219 line=// code for IE7+, Firefox, Chrome, Opera, Safari
tail j=7220 line=// code for IE6, IE5
tail j=7221 line= if (window.XMLHttpRequest) {
tail j=7222 line= xmlhttp=new XMLHttpRequest();
tail j=7223 line= }
tail j=7224 line= else {
tail j=7225 line= xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
tail j=7226 line= }
tail j=7227 line= xmlhttp.onreadystatechange=function() {
tail j=7228 line= if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
tail j=7229 line= document.getElementById("txtName").innerHTML=xmlhttp.responseText;
tail j=7230 line= }
tail j=7231 line= }
tail j=7232 line=// xmlhttp.open("POST","idx.php?name="+str,true);
tail j=7233 line= xmlhttp.open("GET","ajaxdb_page.php?name="+str,true);
tail j=7234 line= xmlhttp.send();
tail j=7235 line= </script id="script_ajaxdb3">
tail j=7236 line=
tail j=7237 line=
tail j=7238 line= <br><br><br><br><br>
tail j=7239 line= <div id="div_kogrids_b"></div>
tail j=7240 line=
tail j=7241 line=
tail j=7242 line= <script id="script_gethint_ajax">
tail j=7243 line= function showHint(str) {
tail j=7244 line= if (str.length == 0) {
tail j=7245 line= document.getElementById("txtHint").innerHTML = "";
tail j=7246 line= return;
tail j=7247 line= }
tail j=7248 line= else {
tail j=7249 line= var xmlhttp = new XMLHttpRequest();
tail j=7250 line= xmlhttp.onreadystatechange = function() {
tail j=7251 line= if (this.readyState == 4 && this.status == 200) {
tail j=7252 line= document.getElementById("txtHint").innerHTML = this.responseText;
tail j=7253 line= }
tail j=7254 line= };
tail j=7255 line= xmlhttp.open("GET", "gethint.php?q=" + str, true);
tail j=7256 line= xmlhttp.send();
tail j=7257 line= }
tail j=7258 line= }
tail j=7259 line= </script id="script_gethint_ajax">
tail j=7260 line=
tail j=7261 line= <script id="script_ajaxjs" >
tail j=7262 line=
tail j=7263 line=
tail j=7264 line=function js_ajax() {
tail j=7265 line= $(document).ready(function(){
tail j=7266 line= $.ajax({
tail j=7267 line= url: 'idx.php',
tail j=7268 line= type: 'get',
tail j=7269 line= dataType: 'JSON',
tail j=7270 line= success: function(response){
tail j=7271 line= var len = response.length;
tail j=7272 line= for(var i=0; i<len; i++){
tail j=7273 line= var id = response[i].id;
tail j=7274 line= var username = response[i].username;
tail j=7275 line= var name = response[i].name;
tail j=7276 line= var email = response[i].email;
tail j=7277 line=
tail j=7278 line= var tr_str = "<tr>" +
tail j=7279 line= "<td align='center'>" + (i+1) + "</td>" +
tail j=7280 line= "<td align='center'>" + username + "</td>" +
tail j=7281 line= "<td align='center'>" + name + "</td>" +
tail j=7282 line= "<td align='center'>" + email + "</td>" +
tail j=7283 line= "</tr>";
tail j=7284 line= $("#userTable tbody").append(tr_str);
tail j=7285 line= }
tail j=7286 line=
tail j=7287 line= }
tail j=7288 line= });
tail j=7289 line= });
tail j=7290 line= return( $ajaxjs );
tail j=7291 line= }
tail j=7292 line=
tail j=7293 line= </script id="script_ajaxjs" >
tail j=7294 line=
tail j=7295 line=
tail j=7296 line= <h1>gethint_ajax</h1>
tail j=7297 line= <script id="script_gethint_ajax">
tail j=7298 line= function showHint(str) {
tail j=7299 line= if (str.length == 0) {
tail j=7300 line= document.getElementById("txtHint").innerHTML = "";
tail j=7301 line= return;
tail j=7302 line= }
tail j=7303 line= else {
tail j=7304 line= var xmlhttp = new XMLHttpRequest();
tail j=7305 line= xmlhttp.onreadystatechange = function() {
tail j=7306 line= if (this.readyState == 4 && this.status == 200) {
tail j=7307 line= document.getElementById("txtHint").innerHTML = this.responseText;
tail j=7308 line= }
tail j=7309 line= };
tail j=7310 line= xmlhttp.open("POST", "idx.php?hint=" + str, true);
tail j=7311 line= xmlhttp.send();
tail j=7312 line= }
tail j=7313 line= }
tail j=7314 line= </script id="script_gethint_ajax">
tail j=7315 line=
tail j=7316 line= </body>
tail j=7317 line= </html>
tail j=7318 line=<!--
tail j=7319 line=elise legrow - who do you love:https://www.youtube.com/watch?v=4BYzRmiBwRE
tail j=7320 line= -->
ko 20190222_062304 MAIN 0-0 fildb3=ko.db3 sqltbl=ko fillogd=ko_20190222.log
MSG_7500 FINDDT: ifile=index.html findmath=style_input tailmatch=style_input ofile=style_input
MSG_400: ko 20190222_062304 -= findt =- 0-0 ifile=index.html findmatch=style_inputstyle_input ofile=style_input
EXIT_500 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ko 20190222_062304 -= findt =- 0-0 ___FOUND ifile=index.html findmatch=style_input ofile=style_input
match j=1269 line= <style id="style_input">
FIND j=1270 line= .fileContainer {
FIND j=1271 line= overflow: hidden;
FIND j=1272 line= position: relative;
FIND j=1273 line= }
FIND j=1274 line=
FIND j=1275 line= .fileContainer [type=file] {
FIND j=1276 line= cursor: inherit;
FIND j=1277 line= display: block;
FIND j=1278 line= font-size: 999px;
FIND j=1279 line= filter: alpha(opacity=0);
FIND j=1280 line= min-height: 100%;
FIND j=1281 line= min-width: 100%;
FIND j=1282 line= opacity: 0;
FIND j=1283 line= position: absolute;
FIND j=1284 line= right: 0;
FIND j=1285 line= text-align: right;`
FIND j=1286 line= top: 0;
FIND j=1287 line= }
TAIL j=1288 line= </style id="style_input">
tail j=1289 line=
tail j=1290 line=<!--
tail j=1291 line= <style id="style_input2">
tail j=1292 line= input[type=text] {
tail j=1293 line=// background-color: #BFBDBD;
tail j=1294 line= background-color: darkSlategrey;
tail j=1295 line=// color: #979797;
tail j=1296 line= border:solid 1px darkSlategrey;
tail j=1297 line= color: ivory;
tail j=1298 line= height: 28px;
tail j=1299 line= padding-left:10px;
tail j=1300 line= width: 191px;
tail j=1301 line= box-shadow: 2px 2px 0 #828181 inset;
tail j=1302 line= }
tail j=1303 line= input[type=button] {
tail j=1304 line=// background-color: #1E1E1E;
tail j=1305 line=// color: #979797;
tail j=1306 line= background-color: darkSlategrey;
tail j=1307 line= color: ivory;
tail j=1308 line= height: 24px;
tail j=1309 line= width: 103px;
tail j=1310 line= text-transform:uppercase;
tail j=1311 line= box-shadow:-1px 2px #6E6B6A inset;
tail j=1312 line= }
tail j=1313 line= input[type=button], input[type=text]
tail j=1314 line= {border-radius: 5px; font-family: Sansation;}
tail j=1315 line= {border-radius: 5px; font-family: yokkmokkOT;}
tail j=1316 line= </style>
tail j=1317 line=<!-- -->
tail j=1318 line=
tail j=1319 line=
tail j=1320 line=
tail j=1321 line=
tail j=1322 line=
tail j=1323 line= <style id="style_popover" >
tail j=1324 line= .popover {
tail j=1325 line= position: relative;
tail j=1326 line= float: left;
tail j=1327 line= padding: 5px;
tail j=1328 line=// /*z-ka1: 0;*/
tail j=1329 line=// width: 200px;'
tail j=1330 line=// height: 300px;
tail j=1331 line= }
tail j=1332 line= .popover:hover {
tail j=1333 line= background-color: darkSlategrey;
tail j=1334 line=// bigboxbug background-color: yellow;
tail j=1335 line=// background-color: #e9e9e2;
tail j=1336 line=// width: 200px;
tail j=1337 line=// height: 300px;
tail j=1338 line= /*z-ka1: 50;*/
tail j=1339 line=// color: white;
tail j=1340 line= color: ivory;
tail j=1341 line=// color: #335500;
tail j=1342 line= text-decoration: none;
tail j=1343 line= }
tail j=1344 line=/*CSS for enlarged image*/
tail j=1345 line= .popover span {
tail j=1346 line= position: absolute; // important
tail j=1347 line=// width: 200px;
tail j=1348 line=// height: 300px;
tail j=1349 line=// background-color: #e5e5e5;
tail j=1350 line=// left: -1000px;
tail j=1351 line=// border: 1px solid #666;
tail j=1352 line=
tail j=1353 line=// position: relative;
tail j=1354 line= background-color: darkSlategrey;
tail j=1355 line= padding: 5px;
tail j=1356 line= border: 0px solid #666;
tail j=1357 line= visibility: hidden;
tail j=1358 line= color: ivory;
tail j=1359 line= text-decoration: none;
tail j=1360 line= }
tail j=1361 line=/*CSS for enlarged image*/
tail j=1362 line= .popover span img {
tail j=1363 line=// border-width: 0px;
tail j=1364 line= border-width: 0px;
tail j=1365 line= /*padding: 2px;*/
tail j=1366 line= }
tail j=1367 line=
tail j=1368 line=/*CSS for enlarged image on hover*/
tail j=1369 line= .popover:hover span {
tail j=1370 line= visibility: visible;
tail j=1371 line=// width: 200px;
tail j=1372 line= top: 0px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
tail j=1373 line= left: 0px;/*position where enlarged image should offset horizontally */
tail j=1374 line= }
tail j=1375 line= <s/tyle id="style_popover" >
tail j=1376 line=
tail j=1377 line=
tail j=1378 line= <style id="style_thumbnail" >
tail j=1379 line= .thumbnail {
tail j=1380 line= position: relative;
tail j=1381 line= float: left;
tail j=1382 line= padding: 5px;
tail j=1383 line= /*z-ka1: 0;*/
tail j=1384 line= }
tail j=1385 line= .thumbnail:hover {
tail j=1386 line=// background-color: #e9e9e2;
tail j=1387 line=// color: #335500;
tail j=1388 line=// z-ka1: 50;
tail j=1389 line= background-color: darkslategrey;
tail j=1390 line= color: ivory;
tail j=1391 line= text-decoration: none;
tail j=1392 line= }
tail j=1393 line=/*CSS for enlarged image*/
tail j=1394 line= .thumbnail span {
tail j=1395 line=// background-color: #e5e5e5;
tail j=1396 line=// left: -1000px;
tail j=1397 line=// color: black;
tail j=1398 line=// position: relative;
tail j=1399 line= position: absolute;
tail j=1400 line= background-color: darkSlategrey;
tail j=1401 line= padding: 5px;
tail j=1402 line= border: 1px solid #666;
tail j=1403 line= visibility: hidden;
tail j=1404 line= color: ivory;
tail j=1405 line= text-decoration: none;
tail j=1406 line= }
tail j=1407 line=/*CSS for enlarged image*/
tail j=1408 line= .thumbnail span img {
tail j=1409 line= border-width: 0px;
tail j=1410 line= /*padding: 2px;*/
tail j=1411 line= }
tail j=1412 line=
tail j=1413 line=/*CSS for enlarged image on hover*/
tail j=1414 line= .thumbnail:hover span {
tail j=1415 line=// width: 100px;
tail j=1416 line=// top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
tail j=1417 line= visibility: visible;
tail j=1418 line= width: 50px;
tail j=1419 line= top: 100px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
tail j=1420 line= left: 100px;/*position where enlarged image should offset horizontally */
tail j=1421 line= }
tail j=1422 line=
tail j=1423 line= /*THUMBNAIL2 - thumbnail2 has border and border on hover*/
tail j=1424 line= .thumbnail2 {
tail j=1425 line= position: relative;
tail j=1426 line= float: left;
tail j=1427 line= padding: 5px;
tail j=1428 line= /*z-ka1: 0;*/
tail j=1429 line= }
tail j=1430 line= .thumbnail2:hover {
tail j=1431 line=// background-color: #e9e9e2;
tail j=1432 line=// color: #335500;
tail j=1433 line=// /*z-ka1: 50;*/
tail j=1434 line= background-color: darkSlategrey;
tail j=1435 line= color: ivory;
tail j=1436 line= text-decoration: none;
tail j=1437 line= }
tail j=1438 line= .thumbnail2 span { /*CSS for enlarged image*/
tail j=1439 line=// background-color: #e5e5e5;
tail j=1440 line= position: absolute;
tail j=1441 line=// /*left: -1000px;*/
tail j=1442 line=// color: black;
tail j=1443 line=// relative: absolute;
tail j=1444 line= background-color: darkSlategrey;
tail j=1445 line= padding: 5px;
tail j=1446 line= border: 1px solid #666;
tail j=1447 line= visibility: hidden;
tail j=1448 line= color: ivory;
tail j=1449 line= text-decoration: none;
tail j=1450 line= }
tail j=1451 line=
tail j=1452 line=/*CSS for enlarged image*/
tail j=1453 line= .thumbnail2 span img { border-width: 0px;}
tail j=1454 line=/*CSS for enlarged image on hover*/
tail j=1455 line= .thumbnail2:hover span {
tail j=1456 line= visibility: visible; width: 208px;
tail j=1457 line= top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
tail j=1458 line= left: 300px;/*position where enlarged image should offset horizontally */
tail j=1459 line= }
tail j=1460 line= a.thumbnail2 img { text-decoration:none; z-ka1: 50; }
tail j=1461 line=
tail j=1462 line=/*if same attribute for all 4 states, then declare here in a.thumbnail2*/
tail j=1463 line= a.thumbnail2 img:link { border: 2px solid #e9e9e2; background: transparent; }
tail j=1464 line= a.thumbnail2 img:visited { border: 2px solid #e9e9e2; background : transparent; }
tail j=1465 line= a.thumbnail2 img:hover { border: 2px solid #f00; background : transparent; }
tail j=1466 line= a.thumbnail2 img:active { border: 2px solid #e9e9e2; background : transparent; }
tail j=1467 line= a.thumbnail2 img { border: 2px solid #e9e9e2; }
tail j=1468 line= </style id="style_thumbnail" >
tail j=1469 line=
tail j=1470 line= <style id="style_buttons" >
tail j=1471 line=// body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }
tail j=1472 line= button {
tail j=1473 line=// visibility: hidden;
tail j=1474 line=// background: rgba(7, 99, 53, .1);
tail j=1475 line= background: transparent;
tail j=1476 line=// border: 3px solid rgba(7, 99, 53, 1);
tail j=1477 line= border: 3px solid darkSlategrey;
tail j=1478 line= border-radius: 5px;
tail j=1479 line=// color: rgba(7, 99, 53, 1);
tail j=1480 line=// color: ivory;
tail j=1481 line= color: darkSlategrey;
tail j=1482 line= cursor: pointer;
tail j=1483 line= line-height: 40px;
tail j=1484 line= font-size: 20px;
tail j=1485 line= outline: none;
tail j=1486 line= padding: 0 20px;
tail j=1487 line= transition: all .3s;
tail j=1488 line= }
tail j=1489 line= button:hover {
tail j=1490 line=// background: rgba(7, 99, 53, 1);
tail j=1491 line= background: darkSlategrey;
tail j=1492 line=// background: yellow;
tail j=1493 line=// background: white;
tail j=1494 line=// color: rgba(255,255,255,1);
tail j=1495 line= color: ivory;
tail j=1496 line= }
tail j=1497 line= p {font-size: 20px; font-weight: bold;
tail j=1498 line= </style id="style_buttons" >
tail j=1499 line=
tail j=1500 line= <style id="style_input" >
tail j=1501 line=// body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }
tail j=1502 line= input {
tail j=1503 line=// visibility: hidden;
tail j=1504 line=// background: rgba(7, 99, 53, .1);
tail j=1505 line= background: transparent;
tail j=1506 line=// border: 3px solid rgba(7, 99, 53, 1);
tail j=1507 line= border: 3px solid darkSlategrey;
tail j=1508 line= border-radius: 5px;
tail j=1509 line=// color: rgba(7, 99, 53, 1);
tail j=1510 line=// color: ivory;
tail j=1511 line= color: darkSlategrey;
tail j=1512 line= cursor: pointer;
tail j=1513 line= line-height: 40px;
tail j=1514 line= font-size: 10px;
tail j=1515 line= outline: none;
tail j=1516 line= padding: 0 20px;
tail j=1517 line= transition: all .3s;
tail j=1518 line= }
tail j=1519 line= button:hover {
tail j=1520 line=// background: rgba(7, 99, 53, 1);
tail j=1521 line= background: darkgreyslate;
tail j=1522 line=// background: yellow;
tail j=1523 line=// background: white;
tail j=1524 line=// color: rgba(255,255,255,1);
tail j=1525 line=// color: white;
tail j=1526 line= color: ivory;
tail j=1527 line= }
tail j=1528 line= p {font-size: 10px; font-weight: bold;
tail j=1529 line= <style id="style_input" >
tail j=1530 line=
tail j=1531 line=
tail j=1532 line= <style id="style_drop" type="text/css">
tail j=1533 line= #drop {
tail j=1534 line= width:800px;
tail j=1535 line= height:250px;
tail j=1536 line= margin:3px auto;
tail j=1537 line=// background:#eddaa8;
tail j=1538 line= background:ivory;
tail j=1539 line= font-size:16px;
tail j=1540 line= }
tail j=1541 line= #drop #sw { text-decoration:underline; cursor:pointer; }
tail j=1542 line= #drag {
tail j=1543 line=// width:450px;
tail j=1544 line=// height:180px;
tail j=1545 line= width:800;
tail j=1546 line= height:480px;
tail j=1547 line= margin:12px auto;
tail j=1548 line= border:1px solid silver;
tail j=1549 line= font-size:16px;
tail j=1550 line= }
tail j=1551 line= #drag .drg { margin:10px 12px; }
tail j=1552 line= #drag div.drg {
tail j=1553 line= width:150px;
tail j=1554 line= height:50px;
tail j=1555 line= background:#07da08;
tail j=1556 line= border:2px solid blue;
tail j=1557 line= }
tail j=1558 line= </style id="style_drop" type="text/css">
tail j=1559 line=
tail j=1560 line= <style id="style_div_csv type="text/css">
tail j=1561 line= body {
tail j=1562 line=// font-family: Arial;
tail j=1563 line= font-family: yokkmokkOT;
tail j=1564 line= font-family: arial;
tail j=1565 line= font-size: 8pt;
tail j=1566 line= }
tail j=1567 line= table {
tail j=1568 line= border: 1px solid #ccc;
tail j=1569 line= }
tail j=1570 line= table th {
tail j=1571 line=// background-color: #F7F7F7;
tail j=1572 line= background-color: darkSlategrey;
tail j=1573 line=// color: #333;
tail j=1574 line= color: ivory;
tail j=1575 line= font-weight: bold;
tail j=1576 line= }
tail j=1577 line= table th, table td {
tail j=1578 line= padding: 5px;
tail j=1579 line= border-color: #ccc;
tail j=1580 line= }
tail j=1581 line= </style id="style_div_csv type="text/css">
tail j=1582 line=
tail j=1583 line= <style id="style_thumb_3800">
tail j=1584 line= .thumb {
tail j=1585 line= height: 75px;
tail j=1586 line= border: 1px solid #000;
tail j=1587 line= margin: 10px 5px 0 0;
tail j=1588 line= }
tail j=1589 line= </style>
tail j=1590 line=
tail j=1591 line= <style id="style_byte_content" >
tail j=1592 line= #byte_content {
tail j=1593 line= margin: 5px 0;
tail j=1594 line= max-height: 100px;
tail j=1595 line= overflow-y: auto;
tail j=1596 line= overflow-x: hidden;
tail j=1597 line= }
tail j=1598 line= #byte_range { margin-top: 5px; }
tail j=1599 line= </style>
tail j=1600 line=
tail j=1601 line= <script id="load_vues" >
tail j=1602 line= function load_vues(args) {
tail j=1603 line=// alert( "BUG_1000 load_vues"+args );
tail j=1604 line= vues = "";
tail j=1605 line= vues += "old|\n";
tail j=1606 line= vues += "ko|\n";
tail j=1607 line= vues += "new|\n";
tail j=1608 line= vues += "work|\n";
tail j=1609 line= vues += "focus|\n";
tail j=1610 line= vues += "where|";
tail j=1611 line= vues += "courtreport|\n";
tail j=1612 line= vues += "jtfdc|\n";
tail j=1613 line= vues += "jtrdcr|\n";
tail j=1614 line= vues += "jtfinc|\n";
tail j=1615 line= vues += "byrdpuckers|\n";
tail j=1616 line=
tail j=1617 line= vues += "kassil|\n";
tail j=1618 line= vues += "konet|\n";
tail j=1619 line= vues += "iperms|\n";
tail j=1620 line=
tail j=1621 line= vues += "memes|\n";
tail j=1622 line= vues += "food|\n";
tail j=1623 line= vues += "kids|\n";
tail j=1624 line= vues += "dogs|\n";
tail j=1625 line=
tail j=1626 line= vues += "jkwii|\n";
tail j=1627 line= vues += "kou|\n";
tail j=1628 line= vues += "konabus|\n";
tail j=1629 line= vues += "go|\n";
tail j=1630 line= vues += "kt|\n";
tail j=1631 line= vues += "ka|\n";
tail j=1632 line= vues += "ko|\n";
tail j=1633 line=
tail j=1634 line= vues += "ko0|\n";
tail j=1635 line= vues += "ko1|\n";
tail j=1636 line= vues += "ko2|\n";
tail j=1637 line= vues += "ka1|\n";
tail j=1638 line= vues += "ka2|\n";
tail j=1639 line=
tail j=1640 line= vues += "ka11|\n";
tail j=1641 line= vues += "ka12|\n";
tail j=1642 line= vues += "ka21|\n";
tail j=1643 line= vues += "ka22|\n";
tail j=1644 line=
tail j=1645 line= vues += "av|\n";
tail j=1646 line= vues += "bb|\n";
tail j=1647 line= vues += "dd|\n";
tail j=1648 line= vues += "pn|\n";
tail j=1649 line= vues += "sl|\n";
tail j=1650 line= vues += "tm|\n";
tail j=1651 line= vues += "tl|\n";
tail j=1652 line= vues += "vu|\n";
tail j=1653 line= vues += "yt|\n";
tail j=1654 line= vues += "zm|\n";
tail j=1655 line=
tail j=1656 line= vues += "old|\n";
tail j=1657 line=
tail j=1658 line=// alert( "BUG_1100 end load_vues vues="+vues );
tail j=1659 line= return( vues );
tail j=1660 line= }
tail j=1661 line= </script>
tail j=1662 line=
tail j=1663 line= <script id="script_show_vues">
tail j=1664 line= function show_vues(args) {
tail j=1665 line= alert( "BUGS_1060 BEG show_vues args="+args );
tail j=1666 line=
tail j=1667 line= vues = load_vues('').split("|");
tail j=1668 line= vuelen = vues.length;
tail j=1669 line= alert( "BUGS_1070 show_vues AAA htmout="+vuelen );
tail j=1670 line=
tail j=1671 line= htmout="";
tail j=1672 line= htmout_script_vues="";
tail j=1673 line= htmout_button_vues="";
tail j=1674 line= htmout_div_vues="";
tail j=1675 line= htmout="";
tail j=1676 line= htmout="";
tail j=1677 line=
tail j=1678 line= z=0;
tail j=1679 line=
tail j=1680 line= for( z=0; z<vuelen; z++ ) {
tail j=1681 line= vue = vues[z];
tail j=1682 line= url = '/?vuid="'+vue+'"';
tail j=1683 line= tn = "/imgs/gif/ringd.gif"; img = "/imgs/gif/ringb.gif";
tail j=1684 line= tn = "/imgs/gif/ringsd.gif"; img = "/imgs/gif/ringsb.png";
tail j=1685 line=
tail j=1686 line= background="yellow";
tail j=1687 line= color="black";
tail j=1688 line= font="yokkmokkOT";
tail j=1689 line= fontsize="12pt";
tail j=1690 line= width="35%";
tail j=1691 line=
tail j=1692 line= alert( "BUGS_1090 show_vues z="+z+" vue="+vue );
tail j=1693 line=
tail j=1694 line= htmout += "<hr color=yellow";
tail j=1695 line= htmout += "<hr color=red";
tail j=1696 line= htmout += '<img src="/imgs/gif/rings.gif" >\n';
tail j=1697 line= htmout += '<a href="'+url+'" alt="'+vue+'" class="popover" id="drg" target=_blank>';
tail j=1698 line= htmout += ' <img class="drg" src="'+tn+'" border=0>';
tail j=1699 line= htmout += ' <span><img class="drg" src="'+img+'" border=0></span>';
tail j=1700 line= htmout += ' </a>';
tail j=1701 line= htmout += "<hr color=yellow";
tail j=1702 line= htmout += "<hr color=red";
tail j=1703 line=
tail j=1704 line=// htmout_script_vues += '<script id="'+z+'" >';
tail j=1705 line= htmout_script_vues += '<script id="vue_kov_'+vue+'" >';
tail j=1706 line= htmout_script_vues += ' var kov = new Vue({ el: "#kov'+kovid+'",';
tail j=1707 line= htmout_script_vues += 'data: {collapsed: false},';
tail j=1708 line=
tail j=1709 line= htmout_script_vues += 'methods: {\n';
tail j=1710 line= htmout_script_vues += ' showhide_kov: function() {\n';
tail j=1711 line= htmout_script_vues += ' if (!this.collapsed) this.collapsed = true;\n';
tail j=1712 line= htmout_script_vues += ' else this.collapsed = false;\n';
tail j=1713 line= htmout_script_vues += ' },\n';
tail j=1714 line= htmout_script_vues += 'document.body.style.background = "'+background+'"';
tail j=1715 line=
tail j=1716 line= htmout_script_vues += 'document.body.style.color = "'+color+'"';
tail j=1717 line= htmout_script_vues += 'document.body.style.fontfamily = "'+font+'"';
tail j=1718 line= htmout_script_vues += 'document.body.style.fontsize = "'+fontsize+'"';
tail j=1719 line= htmout_script_vues += ' },\n';
tail j=1720 line= htmout_script_vues += ' </script" >';
tail j=1721 line=
tail j=1722 line= htmout_style_vues = '<style id="style_kov_'+vue+'\n';
tail j=1723 line= htmout_style_vues += ' .detail_'+vue+' { \n';
tail j=1724 line= htmout_style_vues += ' background: '+background+';\n';
tail j=1725 line= htmout_style_vues += ' width: '+width+';\n';
tail j=1726 line= htmout_style_vues += ' padding: 20px;\n';
tail j=1727 line= htmout_style_vues += ' border: 1px solid black;\n';
tail j=1728 line= htmout_style_vues += ' font-family: '+font+';\n';
tail j=1729 line= htmout_style_vues += ' color: '+color+';\n';
tail j=1730 line= htmout_style_vues += ' }\n';
tail j=1731 line= htmout_style_vues += ' </style>\n';
tail j=1732 line=
tail j=1733 line=// alert( "BUGS_1092 show_vues VUEHTM vuelen="+vuelen+" htmout_style_vues=\n"+htmout_style_vues );
tail j=1734 line= alert( "BUGS_1733 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues=\n"+htmout_script_vues );
tail j=1735 line= }
tail j=1736 line=
tail j=1737 line=
tail j=1738 line=// alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout="+htmout );
tail j=1739 line=// alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues="+htmout_script_vues );
tail j=1740 line=
tail j=1741 line= div_style_vues = document.getElementById('div_style_vues');
tail j=1742 line= div_style_vues.insertAdjacentHTML('afterbegin', htmout_style_vues );
tail j=1743 line=
tail j=1744 line= div_script_vues = document.getElementById('div_script_vues');
tail j=1745 line= div_script_vues.insertAdjacentHTML('afterbegin', htmout_script_vues );
tail j=1746 line=
tail j=1747 line=
tail j=1748 line= div_show_vues = document.getElementById('div_show_vues');
tail j=1749 line= div_show_vues.insertAdjacentHTML('afterbegin', htmout);
tail j=1750 line=
tail j=1751 line=
tail j=1752 line=// div_show_vues.insertAdjacentHTML('beforebegin', htmout);
tail j=1753 line=
tail j=1754 line=// div_show_vues = getelementbyID('div_show_vues");
tail j=1755 line=// div_show_vues.innerHTML = htmout;
tail j=1756 line=
tail j=1757 line=// alert("BUGS_2892 vuelen=" + vues.length + "\nStatus: " + status);
tail j=1758 line=// document.write( htmout );
tail j=1759 line=
tail j=1760 line=// alert( "BUGS_1100 END show_vues htmout="+htmout );
tail j=1761 line= return(htmout);
tail j=1762 line= }
tail j=1763 line= </script id="script_show_vues">
tail j=1764 line=
tail j=1765 line=
tail j=1766 line= <div id="div_style_vues"></div>
tail j=1767 line=
tail j=1768 line= <div id="div_script_vues"></div>
tail j=1769 line=
tail j=1770 line= <script id="script_kovs_hideshow">
tail j=1771 line=
tail j=1772 line= function kovs_hideshow( todo, kovs ) {
tail j=1773 line= kovlist = "";
tail j=1774 line= kovlist += "ko|go|kt|old|new|";
tail j=1775 line= kovlist += "kassil|konet|iperms|konabus|courtreport|";
tail j=1776 line= kovlist += "jkwii|byrdpucker|kou|jtfdc|jtfinc|";
tail j=1777 line= kovlist += "where|work|memes|focus|food|";
tail j=1778 line= kovlist += "dogs|kids|preserve|protect";
tail j=1779 line= kovs = kovlist.split('|');
tail j=1780 line= kovs_len = kovs.length;
tail j=1781 line=// alert( "BUS_1340 kovs_hideshow todo="+todo+" kovlist="+kovlist+" kovs_len="+kovs_len );
tail j=1782 line= htmout = "";
tail j=1783 line= z=0;
tail j=1784 line= for( z=0; z<kovs_len; z++ ) {
tail j=1785 line= kov=kovs[z];
tail j=1786 line= kovid="kov_"+kov;
tail j=1787 line= if( todo == "hide" ) {
tail j=1788 line= document.getElementById(kovid).style.visibility = "hidden";
tail j=1789 line= }
tail j=1790 line= if( todo == "show" ) {
tail j=1791 line= document.getElementById(kovid).style.visibility = "visible";
tail j=1792 line= }
tail j=1793 line= htmout += "z="+z+" todo="+todo+ " kovid="+kovid+"<br>\n";
tail j=1794 line=// alert( "BUS_1350 kovs_hideshow todo="+todo+" z="+z+" kovid="+kovid );
tail j=1795 line= }
tail j=1796 line= alert( "BUGS_1371 htmout="+htmout );
tail j=1797 line=// alert( "BUS_1370 kovs_hideshow todo="+todo+" kovs="+kovs );
tail j=1798 line= }
tail j=1799 line= </script>
tail j=1800 line=
tail j=1801 line= <script id="script_vues_hideshow">
tail j=1802 line= function vues_hideshow(hideshow,kovs) {
tail j=1803 line= alert( "BUGS_1220 vues_hideshow kovs="+kovs );
tail j=1804 line= kovs = "";
tail j=1805 line= kovs += "ko new focus work where memes ";
tail j=1806 line= kovs += "jtfdc jtfdcr jtfinc byrdpucker courtreport ";
tail j=1807 line= kovs += "jkwii kou kids dogs ";
tail j=1808 line= kovs += "kassil konet iperms konabus ko go kt old";
tail j=1809 line= alert( "BUGS_1221 vues_hideshow kovs="+kovs );
tail j=1810 line= z=0;
tail j=1811 line= for( kov in kovs.split(" ") ) {
tail j=1812 line= z=z+1;
tail j=1813 line= alert( "BUGS vues_hideshow z="+z+" kov="+kov );
tail j=1814 line= }
tail j=1815 line= }
tail j=1816 line= function vues_hideshow1(hideshow,divid) {
tail j=1817 line= alert( "BUGS_1230 vues_hideshow args="+args );
tail j=1818 line= htmout_vues_all="";
tail j=1819 line= if( hideshow == 'hide' ) {
tail j=1820 line= if( divid == "" ) or ( divid == "all" ) {
tail j=1821 line= alert( "MGS_1261 vues_showhide HIDE" );
tail j=1822 line= document.getElementById("btn_vues_hide").style.visibility = "hidden";
tail j=1823 line= document.getElementById("btn_vues_show").style.visibility = "visible";
tail j=1824 line=
tail j=1825 line= document.getElementById("kov_ko").style.visibility = "hidden";
tail j=1826 line= document.getElementById("kov_new").style.visibility = "hidden";
tail j=1827 line= document.getElementById("kov_focus").style.visibility = "hidden";
tail j=1828 line= document.getElementById("kov_food").style.visibility = "hidden";
tail j=1829 line= document.getElementById("kov_courtreport").style.visibility = "hidden";
tail j=1830 line= document.getElementById("kov_where").style.visibility = "hidden";
tail j=1831 line= document.getElementById("kov_work").style.visibility = "hidden";
tail j=1832 line= document.getElementById("kov_memes").style.visibility = "hidden";
tail j=1833 line= document.getElementById("kov_kids").style.visibility = "hidden";
tail j=1834 line= document.getElementById("kov_dogs").style.visibility = "hidden";
tail j=1835 line= document.getElementById("kov_preserve").style.visibility = "hidden";
tail j=1836 line= document.getElementById("kov_protect").style.visibility = "hidden";
tail j=1837 line= document.getElementById("kov_jtfdc").style.visibility = "hidden";
tail j=1838 line= document.getElementById("kov_jtfinc").style.visibility = "hidden";
tail j=1839 line= document.getElementById("kov_byrdpucker").style.visibility = "hidden";
tail j=1840 line= document.getElementById("kov_jkwii").style.visibility = "hidden";
tail j=1841 line= document.getElementById("kov_kou").style.visibility = "hidden";
tail j=1842 line= document.getElementById("kov_kassil").style.visibility = "hidden";
tail j=1843 line= document.getElementById("kov_konet").style.visibility = "hidden";
tail j=1844 line= document.getElementById("kov_iperms").style.visibility = "hidden";
tail j=1845 line= document.getElementById("kov_konabus").style.visibility = "hidden";
tail j=1846 line= document.getElementById("kov_kt").style.visibility = "hidden";
tail j=1847 line= document.getElementById("kov_go").style.visibility = "hidden";
tail j=1848 line= document.getElementById("kov_old").style.visibility = "hidden";
tail j=1849 line= }
tail j=1850 line= else {
tail j=1851 line= document.getElementById(divid).style.visibility = "hiddtn";
tail j=1852 line= }
tail j=1853 line=
tail j=1854 line=// var div_vues_all = document.getElementById('div_vues_all');
tail j=1855 line=// htmout_vues= div_vues_all.innerHTML;
tail j=1856 line=// div_vues_all.innerHTML = '<div id="div_vues_all" hidden><h1>div_vues_all_hidden</h1>\n';
tail j=1857 line=// htmout_vues = document.getElementById('div_vues_all').innerHTML;
tail j=1858 line= alert( "BUGS_1291 vues_hideshow HIDE=");
tail j=1859 line=// div_vues.innerHTML = '<h1>div_vues</h1><div id="div_vues" hidden>\n";
tail j=1860 line= }
tail j=1861 line= if( args == 'show' ) {
tail j=1862 line= if( divid == "" ) or ( divid == "all" ) {
tail j=1863 line= alert( "MGS_1262 vues_showhide HIDE" );
tail j=1864 line= document.getElementById("btn_vues_hide").style.visibility = "visible";
tail j=1865 line= document.getElementById("btn_vues_show").style.visibility = "hidden";
tail j=1866 line=
tail j=1867 line=
tail j=1868 line=
tail j=1869 line= document.getElementById("kov_ko").style.visibility = "visible";
tail j=1870 line= document.getElementById("kov_new").style.visibility = "visible";
tail j=1871 line= document.getElementById("kov_focus").style.visibility = "visible";
tail j=1872 line= document.getElementById("kov_food").style.visibility = "visible";
tail j=1873 line= document.getElementById("kov_courtreport").style.visibility = "visible";
tail j=1874 line= document.getElementById("kov_where").style.visibility = "visible";
tail j=1875 line= document.getElementById("kov_work").style.visibility = "visible";
tail j=1876 line= document.getElementById("kov_memes").style.visibility = "visible";
tail j=1877 line= document.getElementById("kov_kids").style.visibility = "visible";
tail j=1878 line= document.getElementById("kov_dogs").style.visibility = "visible";
tail j=1879 line= document.getElementById("kov_preserve").style.visibility = "visible";
tail j=1880 line= document.getElementById("kov_protect").style.visibility = "visible";
tail j=1881 line= document.getElementById("kov_jtfdc").style.visibility = "visible";
tail j=1882 line= document.getElementById("kov_jtfinc").style.visibility = "visible";
tail j=1883 line= document.getElementById("kov_byrdpucker").style.visibility = "visible";
tail j=1884 line= document.getElementById("kov_jkwii").style.visibility = "visible";
tail j=1885 line= document.getElementById("kov_kou").style.visibility = "visible";
tail j=1886 line= document.getElementById("kov_kassil").style.visibility = "visible";
tail j=1887 line= document.getElementById("kov_konet").style.visibility = "visible";
tail j=1888 line= document.getElementById("kov_iperms").style.visibility = "visible";
tail j=1889 line= document.getElementById("kov_konabus").style.visibility = "visible";
tail j=1890 line= document.getElementById("kov_kt").style.visibility = "visible";
tail j=1891 line= document.getElementById("kov_go").style.visibility = "visible";
tail j=1892 line= document.getElementById("kov_old").style.visibility = "visible";
tail j=1893 line= }
tail j=1894 line= else {
tail j=1895 line= document.getElementById(divid).style.visibility = "visible";
tail j=1896 line= }
tail j=1897 line= alert( "BUGS_1292 vues_hideshow SHOW htmout_vues=");
tail j=1898 line= }
tail j=1899 line= }
tail j=1900 line= </script id="script_vues_hideshow">
tail j=1901 line=
tail j=1902 line= <script id="script_kb" >function script_kb(args) {
tail j=1903 line= alert( "script_kb args="+args );
tail j=1904 line= }
tail j=1905 line= <script id="script_kw" >function script_kw(args) {
tail j=1906 line= alert( "script_kw args="+args );
tail j=1907 line= }
tail j=1908 line= <script id="script_koeyeb_w" >function script_koeyeb_w(args) {
tail j=1909 line= alert( "script_koeyeb_w args="+args );
tail j=1910 line= }
tail j=1911 line= <script id="script_koeyew_b" >function script_koeyew_b(args) {
tail j=1912 line= alert( "script_koeyew_b args="+args );
tail j=1913 line= }
tail j=1914 line= <script id="script_koeye_b" >function script_koeye_b(args) {
tail j=1915 line= alert( "script_koeye_b args="+args );
tail j=1916 line= }
tail j=1917 line= <script id="script_koeye_w" >function script_koeye_w(args) {
tail j=1918 line= alert( "script_koeye_w args="+args );
tail j=1919 line= }
tail j=1920 line= <script id="script_bubble" >function script_bubble(args) {
tail j=1921 line= alert( "script_bubble args="+args );
tail j=1922 line= }
tail j=1923 line=
tail j=1924 line= <script id="script_shutdown" >
tail j=1925 line= function script_shutdown( msg ) {
tail j=1926 line= alert( "BUGS_6100 script_shutdown msg="+msg );
tail j=1927 line= }
tail j=1928 line= </script id="script_shutdown" >
tail j=1929 line=
tail j=1930 line=
tail j=1931 line=
tail j=1932 line= </head>
tail j=1933 line=
tail j=1934 line=
tail j=1935 line=
tail j=1936 line=<!-- <body onload="init_pano('canvas'); kogrids();"> -->
tail j=1937 line=
tail j=1938 line=
tail j=1939 line=<body onload="startup();">
tail j=1940 line=
tail j=1941 line=<br><br><br><br>
tail j=1942 line=<br><br><br><br>
tail j=1943 line=
tail j=1944 line= <div id="div_kogrids_w"></div>
tail j=1945 line=
tail j=1946 line=
tail j=1947 line=<br><br><br><br><br>
tail j=1948 line=<hr color=yellow>
tail j=1949 line= <button type="btn_kovs_hideshow" id="kovs_hideshow" onclick="kovs_hideshow()">kovs_hideshow</button>
tail j=1950 line= <a href=# onclick="kovs_hideshow("hide","all"); return false;" class="popover">
tail j=1951 line= <img height=200 src=/imgs/gif/ringb.gif onclick="kovs_hideshow('hide','all')">
tail j=1952 line= <span><img height=200 src=/imgs/gif/ringp.gif onclick="kovs_hideshow('hide','all')"></span>
tail j=1953 line= <a>
tail j=1954 line=
tail j=1955 line=<!-- <img src=/imgs/gif/rings.gif onclick="kovs_hideshow('show','all')"> -->
tail j=1956 line=
tail j=1957 line= <a href=# onclick="kovs_hideshow("show","all"); return false;" class="popover">
tail j=1958 line= <img height=200 src=/imgs/gif/ringd.gif onclick="kovs_hideshow('show','all')">
tail j=1959 line= <span><img height=200 src=/imgs/gif/ringq.gif onclick="kovs_hideshow('show','all')"></span>
tail j=1960 line= <a>
tail j=1961 line=
tail j=1962 line= <script id="script_bugs" >
tail j=1963 line= function bugs(h,d) {
tail j=1964 line= alert( "BUGS " );
tail j=1965 line= }
tail j=1966 line= </script>
tail j=1967 line=
tail j=1968 line= <button type="btn_kovs_hide" id="btn_kovs_hide" onclick="kovs_hideshow('hide','all')>
tail j=1969 line= -= kovs_hide_all =-
tail j=1970 line= </button>
tail j=1971 line= <button type="btn_kovs_show" id="btn_kovs_show" onclick="kovs_hideshow('show','all')>
tail j=1972 line= -= kovs_show_all =-
tail j=1973 line= </button>
tail j=1974 line=
tail j=1975 line=<hr color=yellow>
tail j=1976 line=<br><br><br><br><br>
tail j=1977 line=<br><br><br><br><br>
tail j=1978 line=<br><br><br><br><br>
tail j=1979 line=<br><br><br><br><br>
tail j=1980 line=
tail j=1981 line= <button type="show_vues" id="show_vues" onclick="show_vues('')">show_vues</button>
tail j=1982 line=<!--
tail j=1983 line= <a href=# class=popover id="drag" >
tail j=1984 line= <img height=400 width=600 src="/imgs/gif/ringsb.gif" onclick="show_vues('')" >
tail j=1985 line= <span><img height=400 width=600 src="/imgs/gif/ringsq.gif" onclick="show_vues('')" ></span>
tail j=1986 line= </a>
tail j=1987 line= -->
tail j=1988 line=
tail j=1989 line=<button type="show_vues" id="show_vues" onclick="show_vues('')">show_vuew</button>
tail j=1990 line= <div id="div_show_vues" ><h1>div_show_vues_w</h1></div>
tail j=1991 line=
tail j=1992 line=
tail j=1993 line=<button type="kov_links_main" id="kov_links_main" onclick="kov_links()">kov_links_main</button>
tail j=1994 line=<!-- <button type="clear_div_kov" id="clear_div_kov" onclick="clear_div_kov()">clear_div_kov</button> -->
tail j=1995 line=<!-- <button type="load_kov_links" id="load_kov_links" onclick="load_kov_links()">load_kov_links</button> -->
tail j=1996 line=<!-- <button type="show_kov_links" id="show_kov_links" onclick="show_kov_links()">show_kov_links</button> -->
tail j=1997 line=
tail j=1998 line=
tail j=1999 line= <div id="div_kov_links"></div>
tail j=2000 line=
tail j=2001 line= <div id="v_hoverdate">
tail j=2002 line= <span v-bind:title="message"><font style="font-family: times, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
tail j=2003 line= <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
tail j=2004 line= </div>
tail j=2005 line= <script id="script_hoverdate" >
tail j=2006 line= kotxt = "";
tail j=2007 line= kotxt += "-== kako =- preview embed vu emchat -= 20190218_0800 =-";
tail j=2008 line=// kotxt += new Date().toLocaleString();
tail j=2009 line=// message: 'hoverdate ' + kotxt;
tail j=2010 line= var app2 = new Vue({el: '#v_hoverdate',
tail j=2011 line= data: {
tail j=2012 line= message: 'hover_dttm ' + new Date().toLocaleString() + kotxt
tail j=2013 line= }
tail j=2014 line= })
tail j=2015 line= </script id="script_hoverdate" >
tail j=2016 line=
tail j=2017 line=
tail j=2018 line= <dic id="div_vues" ><h1>div_vues</h1></div>
tail j=2019 line=<!-- <button type="button" onclick="script_ajax()">loadlist</button> -->
tail j=2020 line=
tail j=2021 line=
tail j=2022 line= <hr color=yellow>
tail j=2023 line= <div id="dynDataField"></div>
tail j=2024 line= <hr color=yellow>
tail j=2025 line=
tail j=2026 line= <h1 id="ajaxdb3">ajaxdb3.</h1>
tail j=2027 line= <button type="button" onclick="script_ajaxdb3()">ajaxdb3</button>
tail j=2028 line=
tail j=2029 line= <script id="script_ajaxdb3">
tail j=2030 line= db3=indexx.db3;
tail j=2031 line= sql="select * from list limit 5";
tail j=2032 line= function script_ajaxdb3(db3,sql) {
tail j=2033 line= $("button").click(function(){
tail j=2034 line= $.post("indexx.php", {
tail j=2035 line= db3: db3,
tail j=2036 line= sql: "select * from list limit 10"
tail j=2037 line= },
tail j=2038 line= function(data, status){
tail j=2039 line= lines = data.split("\n");
tail j=2040 line= linelen=lines.length;
tail j=2041 line= htmout="";
tail j=2042 line= alert( "BUGS1240 linelen="+linelen );
tail j=2043 line= for( z=0; z<lines.length; z++ ) {
tail j=2044 line= line=lines[z];
tail j=2045 line= if( line.length < 3 ) continue;
tail j=2046 line= z=z+1;
tail j=2047 line= flds = line.split(" ");
tail j=2048 line= img = flds[8];
tail j=2049 line= dd = flds[7];
tail j=2050 line= mth = flds[5];
tail j=2051 line= yyyy = flds[6];
tail j=2052 line= size = flds[4];
tail j=2053 line=// htmout += line+"\n";
tail j=2054 line= htmout += "img="+img+" dd="+dd+" "+yyyy+" "+mth+"\n";
tail j=2055 line=// alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
tail j=2056 line= }
tail j=2057 line= alert( "BUGS_1400 ajaxdb3 z="+z+" htmout="+htmout );
tail j=2058 line= for( z=0; z<lines.length; z++ ) {
tail j=2059 line= line=lines[z];
tail j=2060 line= alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
tail j=2061 line= flds = lines.split(" ");
tail j=2062 line= fldlen = flds.length;
tail j=2063 line= alert( "BUGS_1260 ajaxdb3 z="+z+" fldlen="+fldlen );
tail j=2064 line= psv=parseline(line);
tail j=2065 line= alert( "BUGS_1251 ajaxdb3 psv="+psv );
tail j=2066 line=// (url,img,id,tn,grp,desc) = parseline(line);
tail j=2067 line=// url = line.split(" ")[0];
tail j=2068 line=// img = line.split(" ")[1];
tail j=2069 line=// alert( "BUGS_1251 ajaxdb3 url="+url+" img="+img );
tail j=2070 line=// id = line.split("|")[2];
tail j=2071 line=// tn = line.split("|")[3];
tail j=2072 line=// grp = line.split("|")[4];
tail j=2073 line=// desc = line.split("|")[5];
tail j=2074 line=
tail j=2075 line= htmout += '<div id="drag">\n';
tail j=2076 line= htmout += '<div class="drg" >\n';
tail j=2077 line= htmout += '<a href="+url+" class="thumbnail" target=_blank>\n';
tail j=2078 line= htmout += ' <img class="drg" src="+img+" border=0>\n';
tail j=2079 line= htmout += ' <span><img class="drg" src="+img+" border=0></span>\n';
tail j=2080 line= htmout += ' </a>\n';
tail j=2081 line= htmout += ' </div>\n';
tail j=2082 line= htmout += ' </div>\n';
tail j=2083 line=// alert( "BUGS_1248 ajaxdb3 htmout="+htmout );
tail j=2084 line= }
tail j=2085 line=
tail j=2086 line=// getelementbyID('div_ajaxdb3");
tail j=2087 line=// alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
tail j=2088 line=
tail j=2089 line= div_ajaxdb3 = document.getElementById('div_ajaxdb3');
tail j=2090 line= div_ajaxdb3.insertAdjacentHTML('afterbegin', htmout);
tail j=2091 line=// document.write( htmout );
tail j=2092 line= });
tail j=2093 line= });
tail j=2094 line= }
tail j=2095 line= </script id="script_ajaxdb3">
tail j=2096 line=
tail j=2097 line=
tail j=2098 line= <script id="script_parseline">
tail j=2099 line= function parseline(line) {
tail j=2100 line= alert( "BUGS_1280 line="+line );
tail j=2101 line= flds=line.split(" ");
tail j=2102 line=
tail j=2103 line= url="index.html";
tail j=2104 line= img="/imgs/gif/ringsb.gif";
tail j=2105 line= id="jkwii";
tail j=2106 line= tn="/imgs/btn/ringsd.gif";
tail j=2107 line= grp="group";
tail j=2108 line= desc="timejak jkwii";
tail j=2109 line= psv=url+"|"+img+"|"+id+"|"+tn+"|"+grp+"|"+desc
tail j=2110 line=
tail j=2111 line=// return(url,img,id,tn,grp,desc);
tail j=2112 line= return(psv);
tail j=2113 line= }
tail j=2114 line= </script id="script_parseline">
tail j=2115 line=
tail j=2116 line= <hr color=yellow>
tail j=2117 line= <div id="div_ajaxdb3"></div>
tail j=2118 line= <hr color=yellow>
tail j=2119 line=
tail j=2120 line=
tail j=2121 line=<!-- <div id="ajax_loadlist">xxx ajax_loadlist xxx</div> -->
tail j=2122 line= <hr color=yellow>
tail j=2123 line=
tail j=2124 line=
tail j=2125 line=
tail j=2126 line= <div id="div_vues" >
tail j=2127 line=
tail j=2128 line= <div id="app_jkwii">
tail j=2129 line= <div>
tail j=2130 line=
tail j=2131 line= <h1 v-on:click="showhide" >= = : : jkwii is me : : = =</h1>
tail j=2132 line= <h2 v-on:click="showhide" >:: -=ko0us=- preview 20190218_0800 us_med_rectin</h2>
tail j=2133 line= <h2>private tours available on request</h2>
tail j=2134 line=
tail j=2135 line=<a id="drag" class="popover" href="/ani.html" target=_blank>
tail j=2136 line= <img class="drg" height=450 width=800 src="/imgs/gif/firebubblesb.gif" alt="firebubbles" border=0>
tail j=2137 line= <span><img height=450 width=800 class="drg" src="/imgs/gif/firebubblesq.gif" border=0></span>
tail j=2138 line= </a>
tail j=2139 line=
tail j=2140 line= <iframe frameborder='0' height='200' width=800 marginheight='0' marginwidth='0' scrolling='no'
tail j=2141 line= src='/ani.html'
tail j=2142 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=2143 line= </iframe>
tail j=2144 line=
tail j=2145 line= <hr color=blue>
tail j=2146 line= <hr color=white>
tail j=2147 line= <hr color=red>
tail j=2148 line=
tail j=2149 line=<!--
tail j=2150 line= <iframe id="myframe" src="/svc/emchat/index.html" width="600" height="500"
tail j=2151 line= frameborder="0" scrolling="yes"></iframe>
tail j=2152 line= -->
tail j=2153 line=
tail j=2154 line=<!--
tail j=2155 line= <img height=50 src="/imgs/btn/kob.png">
tail j=2156 line= <img height=50 src="/imgs/btn/koeyeb.png">
tail j=2157 line= <img height=50 src="/imgs/btn/koeye.png">
tail j=2158 line= <img height=50 src="/imgs/btn/koeyew.png">
tail j=2159 line= <img height=50 src="/imgs/btn/kow.png">
tail j=2160 line= -->
tail j=2161 line=
tail j=2162 line= <a href=/svc/emchat/index.html class="thumbnail" target=_blank>
tail j=2163 line= <img class="drg" height=200 src=/imgs/links/tn/tn_chat.png border=0>
tail j=2164 line= <span><img class="drg" height=400 src=/imgs/links/tn/tn_chat.png border=0></span>
tail j=2165 line= </a>
tail j=2166 line=
tail j=2167 line= <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
tail j=2168 line= <img class="drg" height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=2169 line= <span><img class="drg" height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=2170 line= </a>
tail j=2171 line=
tail j=2172 line= <a class="thumbnail" href=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin target=_blank>
tail j=2173 line= <img class="drg" height=200 src=/tl/imgs/tn/tn_jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0>
tail j=2174 line= <span><img class="drg" height=800 src=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0></span>
tail j=2175 line= </a>
tail j=2176 line=
tail j=2177 line= <a href=# v-on:click="showhide" class=thumbnail >
tail j=2178 line= <img class="drg" v-on:click="showhide" height=200 src=/tl/imgs/construction_sawhorse.gif border=0>
tail j=2179 line= <span><img class="drg" v-on:click="showhide" height=400 src=/tl/imgs/construction_sawhorse.gif border=0></span>
tail j=2180 line= </a>
tail j=2181 line=
tail j=2182 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.jpg alt=jtf31_streetswing_sawhorse_n_speedbump=_blank>
tail j=2183 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0>
tail j=2184 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0></span>
tail j=2185 line= </a>
tail j=2186 line=
tail j=2187 line= <a class="thumbnail" v-on:click="showhide" href=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0>
tail j=2188 line= <img class="drg" v-on:click="showhide" height=200 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
tail j=2189 line= <span><img class="drg" v-on:click="showhide" height=400 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0></span>
tail j=2190 line= </a>
tail j=2191 line=
tail j=2192 line=
tail j=2193 line=
tail j=2194 line= <br><br>
tail j=2195 line= <hr color=red>
tail j=2196 line= <hr color=white>
tail j=2197 line= <hr color=blue>
tail j=2198 line= <h2 v-on:click="showhide" >== jtfdc OPEN BORDER problem ==</h2>
tail j=2199 line= !! NO wall !! NO sawhorse !! NO tape !! NO chalk !!
tail j=2200 line= <br>
tail j=2201 line= !! NO EAGLES - OUR NO EAGLES !!
tail j=2202 line=
tail j=2203 line= <h1>
tail j=2204 line= <a href=/imgs/links_201901/great_wall_of_china_1870.jpg class="thumbnail_not" target=_blank>
tail j=2205 line= <img src=/imgs/links_201901/tn/tn_great_wall_of_china_1870.png border=0>
tail j=2206 line= </a>
tail j=2207 line= <a href=https://www.youtube.com/watch?v=OfCS1yXg8gk class="thumbnail_not" target=_blank>
tail j=2208 line= <img src=/imgs/links_201901/tn/tn_youb_across_the_border.png border=0>
tail j=2209 line= </a>
tail j=2210 line=
tail j=2211 line= <a href=/imgs/links/Image332.png class="thumbnail_not" target=_blank>
tail j=2212 line= <img src=/imgs/links/tn/tn_Image332.png border=0>
tail j=2213 line=<!-- <span><img src=/imgs/links/Image332.png border=0></span> -- >
tail j=2214 line= </a>
tail j=2215 line=
tail j=2216 line=
tail j=2217 line=
tail j=2218 line=<!--
tail j=2219 line= <a href=https://https://www.youtube.com/watch?v=Gj3UdRmhgvM&start_radio=1&list=RDGj3UdRmhgvM class="thumbnail_not" target=_blank>
tail j=2220 line= <img src=/imgs/links_201901/tn/tn_youb_dark_end_ofthe_street.png border=0>
tail j=2221 line= </a>
tail j=2222 line= -->
tail j=2223 line=<!-- -->
tail j=2224 line= <br>
tail j=2225 line=
tail j=2226 line=
tail j=2227 line= <a href=https://en.wikipedia.org/wiki/Moat class="thumbnail_not" target=_blank>
tail j=2228 line= <img src=/imgs/links_201901/tn/tn_Vellorefort.png border=0>
tail j=2229 line= </a>
tail j=2230 line=
tail j=2231 line= - ?? moat ?? -
tail j=2232 line= <a href=https://upload.wikimedia.org/wikipedia/commons/0/00/Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.JPG class="thumbnail_not" target=_blank>
tail j=2233 line= <img src=/imgs/links_201901/tn/tn_Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.png border=0></span>
tail j=2234 line= </a>
tail j=2235 line= </h1>
tail j=2236 line= <br>
tail j=2237 line= <a href=https://en.wikipedia.org/wiki/American_Gothic class="thumbnail_not" target=_blank>
tail j=2238 line= <img src=/imgs/links_201901/tn/tn_Grant_Wood_-_American_Gothic_-_Google_Art_Project.png border=0>
tail j=2239 line= </a>
tail j=2240 line=
tail j=2241 line= <hr color=blue>
tail j=2242 line= <hr color=white>
tail j=2243 line= <hr color=red>
tail j=2244 line=
tail j=2245 line=
tail j=2246 line=
tail j=2247 line=
tail j=2248 line=
tail j=2249 line=
tail j=2250 line=
tail j=2251 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5320_jtfdc_eagle_n.JPG alt=jtfdc_eagle_n target=_blank>
tail j=2252 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0>
tail j=2253 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0></span>
tail j=2254 line= </a>
tail j=2255 line=
tail j=2256 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.jpg alt=jtfdc_original_notresspassing_willprosecuted target=_blank>
tail j=2257 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0>
tail j=2258 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0></span>
tail j=2259 line= </a>
tail j=2260 line=
tail j=2261 line= <a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5704_jtfdc_eagle_s.JPG alt=jtfdc_eagle_s target=_blank>
tail j=2262 line= <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0>
tail j=2263 line= <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0></span>
tail j=2264 line= </a>
tail j=2265 line=
tail j=2266 line= <a href=# class=thumbnail>
tail j=2267 line= <img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
tail j=2268 line= <span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
tail j=2269 line= </a>
tail j=2270 line=
tail j=2271 line= <a class="thumbnail" href="mailto:adminihe@ko0.us?subject=adminihe_what?">
tail j=2272 line= <img height=50 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0>
tail j=2273 line= <span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0></span>
tail j=2274 line= </a>
tail j=2275 line=
tail j=2276 line= <a href=# class=thumbnail>
tail j=2277 line= <img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" >
tail j=2278 line= <span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
tail j=2279 line= </a>
tail j=2280 line= <a class="thumbnail" href="mailto:adminishe@ko0.us?subject=adminishe_what?">
tail j=2281 line= <img class="drg" height=50 src="/imgs/links/email.gif" alt="adminiwii_what" border=0>
tail j=2282 line= <span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminiwii_what" border=0></span>
tail j=2283 line= </a>
tail j=2284 line=
tail j=2285 line=<br><br><br>
tail j=2286 line= <div id="drag">
tail j=2287 line= <div class="drg">
tail j=2288 line= <h3>us_med_rechtin</h3>
tail j=2289 line= <a class="thumbnail" href=/us/med/rechtin target=_blank>
tail j=2290 line= <img height=200 src=/imgs/us/tn/tn_med_rechtin.png border=0>
tail j=2291 line= <span><img height=400 src=/imgs/us/med_rechtin.png border=0></span>
tail j=2292 line= </a>
tail j=2293 line= </div>
tail j=2294 line= </div>
tail j=2295 line=<br><br><br>
tail j=2296 line=<br><br><br>
tail j=2297 line= <div id="drag" >
tail j=2298 line= <div class="drg" >
tail j=2299 line= <h3>jtfdc_defford_courtreport</h3>
tail j=2300 line= <a class="thumbnail" href=/imgs/links/jtfdc_defford_courtreport.jpg target=_blank>
tail j=2301 line= <img height=200 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0>
tail j=2302 line= <span><img height=400 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0></span>
tail j=2303 line= </a>
tail j=2304 line= </div>
tail j=2305 line= </div>
tail j=2306 line=
tail j=2307 line=
tail j=2308 line=
tail j=2309 line=
tail j=2310 line=
tail j=2311 line=
tail j=2312 line=
tail j=2313 line=
tail j=2314 line=
tail j=2315 line=<hr color=yellow>
tail j=2316 line=
tail j=2317 line= <a href="index_tl.html" class="thumbnail" target=_blank>
tail j=2318 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2319 line= <span><img src="/imgs/links/index_tl.png" alt="tl" width="300px" height="200px" border="0"></span>
tail j=2320 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="tl" width="200px" height="150px" border="0"></span> -->
tail j=2321 line= </a>
tail j=2322 line=
tail j=2323 line= <a class="thumbnail" href="index_sl.html" target=_blank>
tail j=2324 line= <img src="/imgs/btn/koeyeb.png" alt="sl" width="200px" height="100px" border="0">
tail j=2325 line= <span><img src="/imgs/links/index_sl.png" alt="sl" width="400px" height="300px" border="0"></span>
tail j=2326 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="sl" width="200px" height="150px" border="0"></span> -->
tail j=2327 line= </a>
tail j=2328 line=
tail j=2329 line= <a class="thumbnail" href="sl/index_slv.html" target=_blank>
tail j=2330 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2331 line= <span><img src="/imgs/links/index_slv.jpg" alt="slv" width="400px" height=300px" border="0"></span>
tail j=2332 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="slv" width="200px" height=150px" border="0"></span> -->
tail j=2333 line= </a>
tail j=2334 line=
tail j=2335 line= <a class="thumbnail" href="index_pn.html" target=_blank>
tail j=2336 line= <img src="/imgs/btn/koeyeb.png" alt="pn" width="200px" height="100px" border="0">
tail j=2337 line= <span><img src="/imgs/links/index_pn.jpg" alt="pn" width="400px" height="300px" border="0"></span>
tail j=2338 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="pn" width="200px" height="150px" border="0"></span> -->
tail j=2339 line= </a>
tail j=2340 line=
tail j=2341 line= <a class="thumbnail" href="index_zm.html" target=_blank>
tail j=2342 line= <img src="/imgs/btn/koeyew.png" alt="zm" width="200px" height="100px" border="0">
tail j=2343 line= <span><img src="/imgs/links/index_zm.png" alt="zm" width="400px" height="300px" border="0"></span>
tail j=2344 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="zm" width="200px" height="150px" border="0"></span> -->
tail j=2345 line= </a>
tail j=2346 line=
tail j=2347 line= <a class="thumbnail" href="index_dd.html" target=_blank>
tail j=2348 line= <img src="/imgs/btn/koeyeb.png" alt="dd" width="200px" height="100px" border="0">
tail j=2349 line= <span><img src="/imgs/links/index_dd.jpg" alt="dd" width="400px" height="300px" border="0"></span>
tail j=2350 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="dd" width="200px" height="150px" border="0"></span> -->
tail j=2351 line= </a>
tail j=2352 line=
tail j=2353 line= <a class="thumbnail" href="index_av.html" target=_blank>
tail j=2354 line= <img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0">
tail j=2355 line= <span><img src="/imgs/links/index_av.jpg" alt="av" width="400px" height="300px" border="0"></span>
tail j=2356 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="av" width="200px" height="150px" border="0"></span> -->
tail j=2357 line= </a>
tail j=2358 line=
tail j=2359 line=
tail j=2360 line= <a class="thumbnail" href="index_vu.html" target=_blank>
tail j=2361 line= <img src="/imgs/btn/koeyeb.png" alt="vu" width="200px" height="100px" border="0">
tail j=2362 line= <span><img src="/imgs/links/index_vu.jpg" alt="vu" width="400px" height="300px" border="0"></span>
tail j=2363 line=<!-- <span><img src="/imgs/btn/koeye_handhither.gif" alt="vu" width="200px" height="150px" border="0"></span> -->
tail j=2364 line= </a>
tail j=2365 line=
tail j=2366 line=
tail j=2367 line=
tail j=2368 line=
tail j=2369 line=
tail j=2370 line=
tail j=2371 line=
tail j=2372 line= <hr color=red>
tail j=2373 line= <hr color=white>
tail j=2374 line=
tail j=2375 line=
tail j=2376 line=
tail j=2377 line=
tail j=2378 line=
tail j=2379 line=
tail j=2380 line=
tail j=2381 line=<!--
tail j=2382 line=
tail j=2383 line= <img v-on:click="showhidr" src="/tl/imgs/jtfdc_private_court_since_1979_viewin.png">
tail j=2384 line= <img v-on:click="showhide" src="/heart/heart.gif" alt="koeye.png" border=0>
tail j=2385 line= <span><img v-on:click="showhide" src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
tail j=2386 line= <img v-on:click="showhide" src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
tail j=2387 line= <button v-on:click="showhide">showhide</button>
tail j=2388 line= <button v-on:click="showhide">yokkmokk</button>
tail j=2389 line= -->
tail j=2390 line=
tail j=2391 line=
tail j=2392 line= <hr>
tail j=2393 line= </div>
tail j=2394 line=
tail j=2395 line= <div v-show="collapsed" class="detail">
tail j=2396 line= jaokim kopernicus wundersteine ii
tail j=2397 line=
tail j=2398 line= <hr>
tail j=2399 line= <a class="thumbnail" href=https://meet.jit.si/ko target=_blank>
tail j=2400 line= <img src=/imgs/links/tn/tn_meet_jkwii.png border=0>
tail j=2401 line= <span><img src=/imgs/links/meet_jkwii.png border=0></span>
tail j=2402 line= </a>
tail j=2403 line= <a class="thumbnail" href=./?q=jkwii4trustee target=_blank>
tail j=2404 line= <img src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
tail j=2405 line= <span><img src=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0></span>
tail j=2406 line= </a>
tail j=2407 line=
tail j=2408 line= <a class="thumbnail" href="/?q=unclesam">
tail j=2409 line= <img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
tail j=2410 line= <span> <img height=400 width=220 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
tail j=2411 line= </a>
tail j=2412 line=
tail j=2413 line=
tail j=2414 line= <a class="thumbnail" href=/ko_jtf/zm/jtf_parcels/jtfdc_012.html target=_blank>
tail j=2415 line= <img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
tail j=2416 line= <span> <img height=400 width=220 src="/tn_snap_20170123_110294.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
tail j=2417 line= </a>
tail j=2418 line=<!-- -->
tail j=2419 line= <a class="thumbnail" href="/?q=columgia">
tail j=2420 line= <img src="/imgs/btn/koeyew.png" alt="koeyew.png" width="200px" height="80" border="0" >
tail j=2421 line= <span> <img height=400 width=220 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
tail j=2422 line= </a>
tail j=2423 line= <a class="popover" href=./?q=handhither target=_blank>
tail j=2424 line= <img src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
tail j=2425 line= <span><img src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
tail j=2426 line= </a>
tail j=2427 line=
tail j=2428 line=<!--
tail j=2429 line= <h1>link_kludge</h1>
tail j=2430 line= <div id="link_kludge" >
tail j=2431 line= <a class="thumbnail" href="/?q=tn1">
tail j=2432 line= <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0">
tail j=2433 line= <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
tail j=2434 line=
tail j=2435 line= <a class="thumbnail" href="/?q=tn2">
tail j=2436 line= <img src="/imgs/btn/koeyew.png" alt="ok" width="50px" height="25px" border="0">
tail j=2437 line= <span><img src="/imgs/globes/globedragon.png" alt="globedragon"></span></a>
tail j=2438 line=
tail j=2439 line= <a class="thumbnail" href="/?q=tn2">
tail j=2440 line= <img src="/imgs/btn/koeyeb.png" alt="ok" width="50px" height="25px" border="0">
tail j=2441 line= <span><img src="/imgs/globes/globewrap.png" alt="globewrap"></span></a>
tail j=2442 line=
tail j=2443 line= <h1>overview</h1>
tail j=2444 line= <a class="thumbnail" href="/?q=overview"> <img src="/tl/imgs/tn/tn_construction_lights.gif" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/construction_lights.gif" alt="construction_lights"></span></a>
tail j=2445 line= <a class="thumbnail" href="/?q=ein_hundes_leben"> <img src="/tl/imgs/tn/tn_index_book-ein_hundes_leben.png" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/index_book-ein_hundes_leben.gif" alt="construction_lights"></span></a>
tail j=2446 line= <a class="thumbnail" href="/?q=deffords_charm"> <img src="/tl/imgs/tn/tn_tl_jtf28_jd.jpg" alt="deffords_charm" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_jtf28_jd.png" alt="deffords_charm"></span></a>
tail j=2447 line= <a class="thumbnail" href="/?q=jtf29_jak3busstop"> <img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop"></span></a>
tail j=2448 line= <a class="thumbnail" href="/?q=jtf29_pre_jtf31"> <img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31"></span></a>
tail j=2449 line= <a class="thumbnail" href="/?q=jtf29_private_court_since_1979_viewin"> <img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin"></span></a>
tail j=2450 line= <a class="thumbnail" href="/?q=jtfinc"> <img src="/tl/imgs/jtfinc.png" alt="jtfinc" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtfinc.png" alt="jtfinc"></span></a>
tail j=2451 line= <a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
tail j=2452 line= <a class="thumbnail" href="/?q=tl_kassil_walter_mil"> <img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter_mil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter"></span></a>
tail j=2453 line= <a class="thumbnail" href="/?q=tl_kassil_walter"> <img src="/tl/imgs/tl_kassil_mil.png" alt="tl_kassil_walter" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter.png" alt="tl_kassil_walter"></span></a>
tail j=2454 line= <a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
tail j=2455 line= <a class="thumbnail" href="/?q=tl_konet_text"> <img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text"></span></a>
tail j=2456 line= <a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
tail j=2457 line= <a class="thumbnail" href="/?q=iperms_hub"> <img src="/tl/imgs/img575.png" alt="iperms_hub" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms_hub.png" alt="iperms_hub"></span></a>
tail j=2458 line= <a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
tail j=2459 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot"></span></a>
tail j=2460 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones"></span></a>
tail j=2461 line= <a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye"></span></a>
tail j=2462 line= <a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc"></span></a>
tail j=2463 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief"></span></a>
tail j=2464 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2465 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2466 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2467 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2468 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
tail j=2469 line= <a class="thumbnail" href="/?q=tn1"> <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0"> <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
tail j=2470 line= </div>
tail j=2471 line= -->
tail j=2472 line=
tail j=2473 line= </div>
tail j=2474 line= </div>
tail j=2475 line=
tail j=2476 line= <script id="script_new_vue">
tail j=2477 line= var app = new Vue({ el: "#app_jkwii",
tail j=2478 line= data: {
tail j=2479 line= collapsed: false
tail j=2480 line= },
tail j=2481 line= methods: {
tail j=2482 line= showhide: function() {
tail j=2483 line= if (!this.collapsed)
tail j=2484 line= this.collapsed = true;
tail j=2485 line= else
tail j=2486 line= this.collapsed = false;
tail j=2487 line= }
tail j=2488 line= }
tail j=2489 line= });
tail j=2490 line= </script id="script_new_vue">
tail j=2491 line=
tail j=2492 line=<!-- jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj -->
tail j=2493 line=
tail j=2494 line= <script id="script_resize" >
tail j=2495 line= document.body.style.fontfamily = "arial";
tail j=2496 line= function resizeText(multiplier) {
tail j=2497 line= if (document.body.style.fontSize == "") {
tail j=2498 line= document.body.style.fontSize = "1.0em";
tail j=2499 line= }
tail j=2500 line= document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
tail j=2501 line= }
tail j=2502 line= function refontText(multiplier) {
tail j=2503 line= if (document.body.style.fontSize == "") {
tail j=2504 line= document.body.style.fontSize = "2.0em";
tail j=2505 line= }
tail j=2506 line= document.body.style.font = "yokkmokkOT";
tail j=2507 line= }
tail j=2508 line= </script id="script_resize">
tail j=2509 line=<!--
tail j=2510 line= <img id="plustext" alt="Increase text size" height=50 src="/imgs/btn/kob.png" onclick="resizeText(1)" />
tail j=2511 line= < >
tail j=2512 line= <img id="minustext" alt="Decrease text size" height=50 src="/imgs/btn/kow.png" onclick="resizeText(-1)" />
tail j=2513 line= <img id="plusfont" alt="fontup" height=50 src="/imgs/btn/kob.png" onclick="refontText(1)" />
tail j=2514 line= < >
tail j=2515 line= <img id="minusfont" alt="fontdown" height=50 src="/imgs/btn/kow.png" onclick="refontText(-1)" />
tail j=2516 line= -->
tail j=2517 line= <hr>
tail j=2518 line= <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:48pt; font-style:italic" >
tail j=2519 line= abcdefghijklmnopqrstuvwxyz <br>
tail j=2520 line= ABCDEFGHIJKLMNOPQRSTUVWXYZ <br>
tail j=2521 line= 01234567890
tail j=2522 line= </font></span>
tail j=2523 line= <hr>
tail j=2524 line=
tail j=2525 line=<!-- <button type="kogrids" id="kogrids" onclick="kogrids('')">-= kogrids =-</button> -->
tail j=2526 line= <div id="div_kogrids"></div>
tail j=2527 line=
tail j=2528 line=
tail j=2529 line=<!--
tail j=2530 line= <div id="kov">
tail j=2531 line= <div>
tail j=2532 line= kov is it: kov
tail j=2533 line= </div>
tail j=2534 line= <button v-on:click="showhide_kov">showhide_kov</button>
tail j=2535 line= <img v-on:click="showhide_kov1" src="/imgs/btn/kob.png" >
tail j=2536 line= <img v-on:click="showhide_kov" src="/imgs/btn/koeye.png" >
tail j=2537 line= <img v-on:click="showhide_kov2" src="/imgs/btn/kow.png" >
tail j=2538 line=
tail j=2539 line= <div v-show="collapsed" class="detail">
tail j=2540 line= kov detail
tail j=2541 line= <hr>
tail j=2542 line= <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
tail j=2543 line= <img src=/imgs/links/tn/tn_meet.png border=0>
tail j=2544 line= <span><img src=/imgs/links/meet.png border=0></span>
tail j=2545 line= </a>
tail j=2546 line= <hr>
tail j=2547 line= </div>
tail j=2548 line= </div>
tail j=2549 line= <script id="script_new_vue_kov">
tail j=2550 line= var kov = new Vue({ el: "#kov",
tail j=2551 line= data: {collapsed: false},
tail j=2552 line= methods: {
tail j=2553 line= showhide_kov: function() {
tail j=2554 line= if (!this.collapsed) this.collapsed = true;
tail j=2555 line= else this.collapsed = false;
tail j=2556 line=// document.body.style.background = "darkslategrey";
tail j=2557 line=// document.body.style.color = "black";
tail j=2558 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2559 line=// document.body.style.fontsize = "24pt";
tail j=2560 line= },
tail j=2561 line= showhide_kov1: function() {
tail j=2562 line= if (!this.collapsed) this.collapsed = true;
tail j=2563 line= else this.collapsed = false;
tail j=2564 line= },
tail j=2565 line= showhide_kov2: function() {
tail j=2566 line= if (!this.collapsed) this.collapsed = true;
tail j=2567 line= else this.collapsed = false;
tail j=2568 line= }
tail j=2569 line= }
tail j=2570 line= });
tail j=2571 line= </script id="script_new_vue_kov">
tail j=2572 line=
tail j=2573 line= <hr>
tail j=2574 line=abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 01234567890
tail j=2575 line= <hr>
tail j=2576 line= -->
tail j=2577 line=
tail j=2578 line=
tail j=2579 line= <div id="kov_ko">
tail j=2580 line= <div>
tail j=2581 line= ko: kov_ko
tail j=2582 line= </div>
tail j=2583 line= <button v-on:click="showhide_kov_ko">showhide_kov_ko</button>
tail j=2584 line= <img v-on:click="showhide_kov_ko1" src="/imgs/btn/kob.png" >
tail j=2585 line= <img v-on:click="showhide_kov_ko" src="/imgs/btn/koeye.png" >
tail j=2586 line= <img v-on:click="showhide_kov_ko2" src="/imgs/btn/kow.png" >
tail j=2587 line=
tail j=2588 line= <div v-show="collapsed" class="detail_ko">
tail j=2589 line= ko
tail j=2590 line= <hr>
tail j=2591 line= <a href=kov_ko.html class="thumbnail" target=_blank>
tail j=2592 line= <img src=/imgs/kov/tn/tn_kov_ko.png border=0>
tail j=2593 line= <span><img src=/imgs/kov/tn/tn_kov_ko.png border=0></span>
tail j=2594 line= </a>
tail j=2595 line= <hr>
tail j=2596 line=
tail j=2597 line=
tail j=2598 line=
tail j=2599 line= <div id="drag" >
tail j=2600 line= <a class="popover" href="/?q=bigtn_drag1">
tail j=2601 line= <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
tail j=2602 line= <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
tail j=2603 line= </a>
tail j=2604 line= </div>
tail j=2605 line=
tail j=2606 line=
tail j=2607 line=
tail j=2608 line=<!--
tail j=2609 line= <div id="drop">
tail j=2610 line= <span id="sw"><h1>droptop</h2></span>
tail j=2611 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=2612 line= <img height=200 width=300
tail j=2613 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=2614 line= </a>
tail j=2615 line= </div>
tail j=2616 line= -->
tail j=2617 line=
tail j=2618 line=
tail j=2619 line=
tail j=2620 line= </div>
tail j=2621 line= </div>
tail j=2622 line=
tail j=2623 line=
tail j=2624 line=
tail j=2625 line= <div id="div_showhide" hidden>
tail j=2626 line= <button type="button" id="show">Show Content</button>
tail j=2627 line= <button type="button" id="hide">Hide Content</button>
tail j=2628 line= <button type="show_dd" id="show_dd">Show_dd</button>
tail j=2629 line= <button type="hide_dd" id="hide_dd">Hide_dd</button>
tail j=2630 line= <button type="show_bb" id="show_bb">Show_bb</button>
tail j=2631 line= <button type="hide_bb" id="hide_bb">Hide_bb</button>
tail j=2632 line= <button type="show_tl" id="show_tl">Show_tl</button>
tail j=2633 line= <button type="hide_tl" id="hide_tl">Hide_tl</button>
tail j=2634 line= <button type="show_colors" id="show_colors">Show_colors</button>
tail j=2635 line= <button type="hide_colors" id="hide_colors">Hide_colors</button>
tail j=2636 line= <button type="show_fonts" id="show_fonts">Show_fonts</button>
tail j=2637 line= <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
tail j=2638 line= <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
tail j=2639 line= <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
tail j=2640 line= </div>
tail j=2641 line=
tail j=2642 line= <div id="item" hidden>
tail j=2643 line= <hr><h1>div_showhide</h1><hr>
tail j=2644 line= </div>
tail j=2645 line=
tail j=2646 line= <script id="script_showhide">
tail j=2647 line= $( "#show" ).click(function() {$('#item').show(); });
tail j=2648 line= $( "#hide" ).click(function() {$('#item').hide();});
tail j=2649 line= $( "#show_dd" ).click(function() {$('#div_dd').show(); });
tail j=2650 line= $( "#hide_dd" ).click(function() {$('#div_dd').hide();});
tail j=2651 line= $( "#show_bb" ).click(function() {$('#div_bb').show(); });
tail j=2652 line= $( "#hide_bb" ).click(function() {$('#div_bb').hide();});
tail j=2653 line= $( "#show_tl" ).click(function() {$('#div_tl').show(); });
tail j=2654 line= $( "#hide_tl" ).click(function() {$('#div_tl').hide();});
tail j=2655 line= $( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
tail j=2656 line= $( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
tail j=2657 line= $( "#show_colors" ).click(function() {$('#div_colors').show(); });
tail j=2658 line= $( "#hide_colors" ).click(function() {$('#div_colors').hide();});
tail j=2659 line= $( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
tail j=2660 line= $( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
tail j=2661 line= $( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
tail j=2662 line= $( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
tail j=2663 line= </script id="script_showhide">
tail j=2664 line=
tail j=2665 line=
tail j=2666 line= </div>
tail j=2667 line= </div>
tail j=2668 line= </div>
tail j=2669 line=
tail j=2670 line= <script id="script_kov_ko" >
tail j=2671 line= var kov_ko = new Vue({ el: "#kov_ko",
tail j=2672 line= data: {collapsed: false},
tail j=2673 line= methods: {
tail j=2674 line= showhide_kov_ko: function() {
tail j=2675 line= if (!this.collapsed) this.collapsed = true;
tail j=2676 line= else this.collapsed = false;
tail j=2677 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=2678 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2679 line=
tail j=2680 line= },
tail j=2681 line= showhide_kov_ko1: function() {
tail j=2682 line= if (!this.collapsed) this.collapsed = true;
tail j=2683 line= else this.collapsed = false;
tail j=2684 line= },
tail j=2685 line= showhide_kov_ko2: function() {
tail j=2686 line= if (!this.collapsed) this.collapsed = true;
tail j=2687 line= else this.collapsed = false;
tail j=2688 line= }
tail j=2689 line= }
tail j=2690 line= });
tail j=2691 line= </script id="script_kov_ko" >
tail j=2692 line=
tail j=2693 line=
tail j=2694 line=
tail j=2695 line=
tail j=2696 line=
tail j=2697 line=
tail j=2698 line= <div id="kov_new">
tail j=2699 line= <div>
tail j=2700 line= new: kov_new
tail j=2701 line= </div>
tail j=2702 line= <button v-on:click="showhide_kov_new">showhide_kov_new</button>
tail j=2703 line= <img v-on:click="showhide_kov_new" src="/imgs/btn/koeye.png" >
tail j=2704 line= <img v-on:click="showhide_kov_new1" src="/imgs/btn/kob.png" >
tail j=2705 line= <img v-on:click="showhide_kov_new2" src="/imgs/btn/kow.png" >
tail j=2706 line=
tail j=2707 line= <div v-show="collapsed" class="detail_new">
tail j=2708 line= new
tail j=2709 line= <hr>
tail j=2710 line= <a href=https://meet.jit.si/new class="thumbnail" target=_blank>
tail j=2711 line= <img src=/imgs/links/tn/tn_meet_new.png border=0>
tail j=2712 line= <span><img src=/imgs/links/tn/tn_meet_new.png border=0></span>
tail j=2713 line= </a>
tail j=2714 line=
tail j=2715 line=
tail j=2716 line= <hr color=yellow>
tail j=2717 line= <h1>atwist_page</h1>
tail j=2718 line= <div id="container" class="">
tail j=2719 line= <div class="box"></div>
tail j=2720 line= <div class="box-back"></div>
tail j=2721 line= </div>
tail j=2722 line=
tail j=2723 line=
tail j=2724 line= <button id="animate" class="kogo">kogo</button>
tail j=2725 line= <script id="script_atwist_page">
tail j=2726 line= var goButton = document.getElementById("animate");
tail j=2727 line= var container = document.getElementById("container");
tail j=2728 line= goButton.addEventListener('click', function() {
tail j=2729 line= container.classList.toggle('active');
tail j=2730 line= });
tail j=2731 line= </script id="script_atwist_page">
tail j=2732 line=
tail j=2733 line= <hr color=yellow>
tail j=2734 line=
tail j=2735 line=
tail j=2736 line=
tail j=2737 line=
tail j=2738 line=
tail j=2739 line=<a id="drag" class="thumbnail" href="/index_zm.html?zmid=zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility" target=_blank>
tail j=2740 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility/TileGroup0/0-0-0.jpg" border=0>
tail j=2741 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_donovanlaw_containment_facility.png" border=0></span>
tail j=2742 line= </a>
tail j=2743 line=
tail j=2744 line=<a id="drag" class="thumbnail" href="/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus" target=_blank>
tail j=2745 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus/TileGroup0/0-0-0.jpg" border=0>
tail j=2746 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_byrdpuckers_dogpony_campus.png" border=0></span>
tail j=2747 line= </a>
tail j=2748 line=
tail j=2749 line=<a id="drag" class="popover" href=/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_kou_campus target=_blank>
tail j=2750 line= <img class="drg" src="/zm/jtfdc_plans/jtfdc_kou_campus/TileGroup0/0-0-0.jpg" border=0>
tail j=2751 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_kou_campus.png" border=0></span>
tail j=2752 line= </a>
tail j=2753 line=
tail j=2754 line=<img src="/imgs/links/eyes_023.gif">
tail j=2755 line=
tail j=2756 line=
tail j=2757 line=
tail j=2758 line=
tail j=2759 line=
tail j=2760 line= </div>
tail j=2761 line= </div>
tail j=2762 line=
tail j=2763 line= <script id="script_kov_new">
tail j=2764 line= var kov_new = new Vue({ el: "#kov_new",
tail j=2765 line= data: {collapsed: false},
tail j=2766 line= methods: {
tail j=2767 line= showhide_kov_new: function() {
tail j=2768 line= if (!this.collapsed) this.collapsed = true;
tail j=2769 line= else this.collapsed = false;
tail j=2770 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=2771 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2772 line=
tail j=2773 line=// document.body.style.background = "darkslategrey";
tail j=2774 line=// document.body.style.color = "black";
tail j=2775 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2776 line=// document.body.style.fontsize = "24pt";
tail j=2777 line= },
tail j=2778 line= showhide_kov_new1: function() {
tail j=2779 line= if (!this.collapsed) this.collapsed = true;
tail j=2780 line= else this.collapsed = false;
tail j=2781 line= },
tail j=2782 line= showhide_kov_new2: function() {
tail j=2783 line= if (!this.collapsed) this.collapsed = true;
tail j=2784 line= else this.collapsed = false;
tail j=2785 line= }
tail j=2786 line= }
tail j=2787 line= });
tail j=2788 line= </script id="script_kov_new">
tail j=2789 line=
tail j=2790 line=
tail j=2791 line= <div id="div_kov_focus">
tail j=2792 line= <div>
tail j=2793 line= focus: kov_focus
tail j=2794 line= </div>
tail j=2795 line= <button v-on:click="showhide_kov_focus">showhide_kov_focus</button>
tail j=2796 line= <img v-on:click="showhide_kov_focus" src="/imgs/btn/koeye.png" >
tail j=2797 line= <img v-on:click="showhide_kov_focus1" src="/imgs/btn/kob.png" >
tail j=2798 line= <img v-on:click="showhide_kov_focus2" src="/imgs/btn/kow.png" >
tail j=2799 line=
tail j=2800 line= <div v-show="collapsed" class="detail_focus">
tail j=2801 line= focus2
tail j=2802 line= <hr>
tail j=2803 line= <a href=https://meet.jit.si/focus class="thumbnail" target=_blank>
tail j=2804 line= <img height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=2805 line= <span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=2806 line= </a>
tail j=2807 line= <hr>
tail j=2808 line=
tail j=2809 line= <a href=/imgs/links/warning_light.gif id="drag" target=_blank>
tail j=2810 line= <img class="drg" height=200 src=/imgs/links/warning_light.gif border=0>
tail j=2811 line= </a>
tail j=2812 line=
tail j=2813 line= <div id="drag">
tail j=2814 line= <div class="drg">
tail j=2815 line= <h3>preview_deck_rocksoup</h3>
tail j=2816 line= <div id="div_deck_rocksoup">
tail j=2817 line= <a class="popover" href=http://ka12/index_dk.html#rocksoup alt=index_dk_rocksoup target=_blank>
tail j=2818 line= <img width=200 height=200 src=imgs/links/rocksoup_rock.png alt=rocksoup_rock border=0>
tail j=2819 line= <span><img width=200 height=200 src=/imgs/links/rocksoup_pot.png alt=rocksoup_pot border=0></span>
tail j=2820 line= </a>
tail j=2821 line= </div>
tail j=2822 line= </div>
tail j=2823 line= </div>
tail j=2824 line=
tail j=2825 line=
tail j=2826 line=
tail j=2827 line= <a id="drag" class="thumbnail" href="svc/emchat/index.html" target=_blank>
tail j=2828 line= <img class="drg" src="/imgs/links/links_emchat.png" border=0>
tail j=2829 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_emchat.png" border=0></span>
tail j=2830 line= </a>
tail j=2831 line=
tail j=2832 line= <a id="drag" class="thumbnail" href="svc/ol/ht/index.html" target=_blank>
tail j=2833 line= <img class="drg" src="/imgs/links/links_ol.png" border=0>
tail j=2834 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_ol.png" border=0></span>
tail j=2835 line= </a>
tail j=2836 line=
tail j=2837 line=<!--
tail j=2838 line= <button type="button" onclick="script_ajax()">ajax</button>
tail j=2839 line= <img src="/imgs/btn/koeye_handhi.gif" onclick="script_ajax()">
tail j=2840 line= <div id="div_ajaxdb"><h2>div_ajaxdb</h2></div>
tail j=2841 line= -->
tail j=2842 line=
tail j=2843 line= </div>
tail j=2844 line= </div id="div_kov_focus">
tail j=2845 line=
tail j=2846 line= <script id="script_kov_focus" >
tail j=2847 line= var kov_focus = new Vue({ el: "#kov_focus",
tail j=2848 line= data: {collapsed: false},
tail j=2849 line= methods: {
tail j=2850 line= showhide_kov_focus: function() {
tail j=2851 line= if (!this.collapsed) this.collapsed = true;
tail j=2852 line= else this.collapsed = false;
tail j=2853 line= document.getElementById("kov_focus").style.font = "italic bold 20px arial,serif";
tail j=2854 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2855 line=
tail j=2856 line=// document.body.style.background = "darkslategrey";
tail j=2857 line=// document.body.style.color = "black";
tail j=2858 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2859 line=// document.body.style.fontsize = "24pt";
tail j=2860 line= },
tail j=2861 line= showhide_kov_focus1: function() {
tail j=2862 line= if (!this.collapsed) this.collapsed = true;
tail j=2863 line= else this.collapsed = false;
tail j=2864 line= },
tail j=2865 line= showhide_kov_focus2: function() {
tail j=2866 line= if (!this.collapsed) this.collapsed = true;
tail j=2867 line= else this.collapsed = false;
tail j=2868 line= }
tail j=2869 line= }
tail j=2870 line= });
tail j=2871 line= </script id="script_kov_focus" >
tail j=2872 line=
tail j=2873 line=
tail j=2874 line=
tail j=2875 line=
tail j=2876 line=
tail j=2877 line= <div id="kov_food">
tail j=2878 line= <div>
tail j=2879 line= kov_food:
tail j=2880 line= </div>
tail j=2881 line= <button v-on:click="showhide_kov_food">showhide_kov_food</button>
tail j=2882 line= <img v-on:click="showhide_kov_food" src="/imgs/btn/koeye.png" >
tail j=2883 line= <img v-on:click="showhide_kov_food1" src="/imgs/btn/kob.png" >
tail j=2884 line= <img v-on:click="showhide_kov_food2" src="/imgs/btn/kow.png" >
tail j=2885 line=
tail j=2886 line= <div v-show="collapsed" class="detail_food">
tail j=2887 line= kov_food
tail j=2888 line= <div id="drag"> kov_food:<br />
tail j=2889 line= <a href=kov_food.html class="thumbnail" target=_blank>
tail j=2890 line= <img class="drg" src="/imgs/kov/tn/tn_kov_food.png" alt="kov_food" width="50" class="drg"/>
tail j=2891 line= <span><img class="drg" src="/imgs/kov/kov_food.png" alt="kov_food" width="50" class="drg"/></span>
tail j=2892 line= </a>
tail j=2893 line= </div>
tail j=2894 line=
tail j=2895 line=
tail j=2896 line= </div>
tail j=2897 line= </div>
tail j=2898 line=
tail j=2899 line= <script>var kov_food = new Vue({ el: "#kov_food",
tail j=2900 line= data: {collapsed: false},
tail j=2901 line= methods: {
tail j=2902 line= showhide_kov_food: function() {
tail j=2903 line= if (!this.collapsed) this.collapsed = true;
tail j=2904 line= else this.collapsed = false;
tail j=2905 line= document.getElementById("kov_food").style.font = "italic bold 20px arial,serif";
tail j=2906 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2907 line=
tail j=2908 line=// document.body.style.background = "darkslategrey";
tail j=2909 line=// document.body.style.color = "black";
tail j=2910 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2911 line=// document.body.style.fontsize = "24pt";
tail j=2912 line= },
tail j=2913 line= showhide_kov_food1: function() {
tail j=2914 line= if (!this.collapsed) this.collapsed = true;
tail j=2915 line= else this.collapsed = false;
tail j=2916 line= },
tail j=2917 line= showhide_kov_food2: function() {
tail j=2918 line= if (!this.collapsed) this.collapsed = true;
tail j=2919 line= else this.collapsed = false;
tail j=2920 line= }
tail j=2921 line= }
tail j=2922 line= });
tail j=2923 line= </script>
tail j=2924 line=
tail j=2925 line=
tail j=2926 line=
tail j=2927 line=
tail j=2928 line= <div id="kov_courtreport">
tail j=2929 line= <div>
tail j=2930 line= kov_courtreport:
tail j=2931 line= </div>
tail j=2932 line= <button v-on:click="showhide_kov_courtreport">showhide_kov_courtreport</button>
tail j=2933 line= <img v-on:click="showhide_kov_courtreport" src="/imgs/btn/koeye.png" >
tail j=2934 line= <img v-on:click="showhide_kov_courtreport1" src="/imgs/btn/kob.png" >
tail j=2935 line= <img v-on:click="showhide_kov_courtreport2" src="/imgs/btn/kow.png" >
tail j=2936 line=
tail j=2937 line= <div v-show="collapsed" class="detail_courtreport">
tail j=2938 line= kov_courtreport
tail j=2939 line= <div id="drag"> kov_courtreport:<br />
tail j=2940 line= <a href=kov_food.html class="thumbnail" target=_blank>
tail j=2941 line= <img class="drg" src="/imgs/kov/tn/tn_kov_courtreport.png" alt="kov_food" width="50" class="drg"/>
tail j=2942 line= <span><img class="drg" src="/imgs/kov/kov_courtreport.png" alt="kov_food" width="50" class="drg"/></span>
tail j=2943 line= </a>
tail j=2944 line= </div>
tail j=2945 line=
tail j=2946 line= </div>
tail j=2947 line= </div>
tail j=2948 line=
tail j=2949 line= <script>var kov_courtreport = new Vue({ el: "#kov_courtreport",
tail j=2950 line= data: {collapsed: false},
tail j=2951 line= methods: {
tail j=2952 line= showhide_kov_courtreport: function() {
tail j=2953 line= if (!this.collapsed) this.collapsed = true;
tail j=2954 line= else this.collapsed = false;
tail j=2955 line= document.getElementById("kov_courtreport").style.font = "italic bold 20px arial,serif";
tail j=2956 line=// font-style font-variant font-weight font-size line-height font-family
tail j=2957 line=
tail j=2958 line=// document.body.style.background = "darkslategrey";
tail j=2959 line=// document.body.style.color = "black";
tail j=2960 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=2961 line=// document.body.style.fontsize = "24pt";
tail j=2962 line= },
tail j=2963 line= showhide_kov_courtreport1: function() {
tail j=2964 line= if (!this.collapsed) this.collapsed = true;
tail j=2965 line= else this.collapsed = false;
tail j=2966 line= },
tail j=2967 line= showhide_kov_courtreport2: function() {
tail j=2968 line= if (!this.collapsed) this.collapsed = true;
tail j=2969 line= else this.collapsed = false;
tail j=2970 line= }
tail j=2971 line= }
tail j=2972 line= });
tail j=2973 line= </script>
tail j=2974 line=
tail j=2975 line=
tail j=2976 line=
tail j=2977 line=
tail j=2978 line= <div id="kov_where">
tail j=2979 line= <div>
tail j=2980 line= kov_where:
tail j=2981 line= </div>
tail j=2982 line= <button v-on:click="showhide_kov_where">showhide_kov_where</button>
tail j=2983 line= <img v-on:click="showhide_kov_where" src="/imgs/btn/koeye.png" >
tail j=2984 line= <img v-on:click="showhide_kov_where1" src="/imgs/btn/kob.png" >
tail j=2985 line= <img v-on:click="showhide_kov_where2" src="/imgs/btn/kow.png" >
tail j=2986 line=
tail j=2987 line= <div v-show="collapsed" class="detail_where">
tail j=2988 line=
tail j=2989 line= where
tail j=2990 line= <hr color=yellow>
tail j=2991 line=
tail j=2992 line= <a id="drag" class="thumbnail" href="/svc/ol/ht/index.html" target=_blank>
tail j=2993 line= <img class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0>
tail j=2994 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0></span>
tail j=2995 line= </a>
tail j=2996 line=
tail j=2997 line=
tail j=2998 line= <div id="div_gigapan" id="drag" >
tail j=2999 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
tail j=3000 line= <img class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
tail j=3001 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
tail j=3002 line= </a>
tail j=3003 line=
tail j=3004 line=
tail j=3005 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com" target=_blank>
tail j=3006 line= <img height=200 class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0>
tail j=3007 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0></span>
tail j=3008 line= </a>
tail j=3009 line= </div>
tail j=3010 line=
tail j=3011 line=
tail j=3012 line=
tail j=3013 line= <div id="drag"> where:<br />
tail j=3014 line=
tail j=3015 line=<!--
tail j=3016 line= <a href=https://meet.jit.si/where class="thumbnail" target=_blank>
tail j=3017 line= <img height=100 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=3018 line= <span><img height=200 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/></span>
tail j=3019 line= </a>
tail j=3020 line= -->
tail j=3021 line=
tail j=3022 line=<!--
tail j=3023 line= <div class="drg"><h1>konet llc </h1>
tail j=3024 line= <pre>timejask jkwii</pre>
tail j=3025 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=3026 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=3027 line= <pre>timesak where</pre>
tail j=3028 line= </div>
tail j=3029 line= -->
tail j=3030 line=
tail j=3031 line= <div class="drg"><h1>jitsimeet/where </h1>
tail j=3032 line= <a href="https://jit.si.meee/where" id="drag" targer=_blank class="thumbnail">
tail j=3033 line= <img height=200 src=/imgs/links/tn/tn_meet.png border=0>
tail j=3034 line= <span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
tail j=3035 line= </a>
tail j=3036 line= </div>
tail j=3037 line=
tail j=3038 line= <div id="drag"> where:<br />
tail j=3039 line= <a class="drg" href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
tail j=3040 line= <img height=200 src=/imgs/links/warning_light.gif border=0>
tail j=3041 line= <span><img src=/links/warning_light.gif border=0></span>
tail j=3042 line= </a>
tail j=3043 line= </div>
tail j=3044 line= </div>
tail j=3045 line= </div>
tail j=3046 line= <hr>
tail j=3047 line=
tail j=3048 line=
tail j=3049 line=
tail j=3050 line=
tail j=3051 line=
tail j=3052 line= </div>
tail j=3053 line= </div>
tail j=3054 line=
tail j=3055 line= <script>var kov_where = new Vue({ el: "#kov_where",
tail j=3056 line= data: {collapsed: false},
tail j=3057 line= methods: {
tail j=3058 line= showhide_kov_where: function() {
tail j=3059 line= if (!this.collapsed) this.collapsed = true;
tail j=3060 line= else this.collapsed = false;
tail j=3061 line= document.getElementById("kov_where").style.font = "italic bold 20px arial,serif";
tail j=3062 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3063 line=
tail j=3064 line=// document.body.style.background = "darkslategrey";
tail j=3065 line=// document.body.style.color = "black";
tail j=3066 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3067 line=// document.body.style.fontsize = "24pt";
tail j=3068 line= },
tail j=3069 line= showhide_kov_where1: function() {
tail j=3070 line= if (!this.collapsed) this.collapsed = true;
tail j=3071 line= else this.collapsed = false;
tail j=3072 line= },
tail j=3073 line= showhide_kov_where2: function() {
tail j=3074 line= if (!this.collapsed) this.collapsed = true;
tail j=3075 line= else this.collapsed = false;
tail j=3076 line= }
tail j=3077 line= }
tail j=3078 line= });
tail j=3079 line= </script>
tail j=3080 line=
tail j=3081 line=
tail j=3082 line=
tail j=3083 line=
tail j=3084 line=
tail j=3085 line=
tail j=3086 line=
tail j=3087 line=
tail j=3088 line=
tail j=3089 line=
tail j=3090 line=
tail j=3091 line=
tail j=3092 line=
tail j=3093 line=
tail j=3094 line=
tail j=3095 line=
tail j=3096 line=
tail j=3097 line= <div id="kov_work">
tail j=3098 line= <div>
tail j=3099 line= kov_work:
tail j=3100 line= </div>
tail j=3101 line= <button v-on:click="showhide_kov_work">showhide_kov_work</button>
tail j=3102 line= <img v-on:click="showhide_kov_work" src="/imgs/btn/koeye.png" >
tail j=3103 line= <img v-on:click="showhide_kov_work1" src="/imgs/btn/kob.png" >
tail j=3104 line= <img v-on:click="showhide_kov_work2" src="/imgs/btn/kow.png" >
tail j=3105 line=
tail j=3106 line= <div v-show="collapsed" class="detail_work">
tail j=3107 line= kov_work
tail j=3108 line= <div id="drag"> kov_work:<br />
tail j=3109 line= <a href=kov_work.html class="thumbnail" target=_blank>
tail j=3110 line= <img class="drg" src="/imgs/kov/tn/tn_kov_work.png" alt="kov_food" width="50" class="drg"/>
tail j=3111 line= <span><img class="drg" src="/imgs/kov/kov_work.png" alt="kov_food" width="50" class="drg"/></span>
tail j=3112 line= </a>
tail j=3113 line= </div>
tail j=3114 line=
tail j=3115 line=
tail j=3116 line= </div>
tail j=3117 line= </div>
tail j=3118 line=
tail j=3119 line= <script>var kov = new Vue({ el: "#kov_work",
tail j=3120 line= data: {collapsed: false},
tail j=3121 line= methods: {
tail j=3122 line= showhide_kov_work: function() {
tail j=3123 line= if (!this.collapsed) this.collapsed = true;
tail j=3124 line= else this.collapsed = false;
tail j=3125 line=// document.body.style.background = "darkslategrey";
tail j=3126 line=// document.body.style.color = "black";
tail j=3127 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3128 line=// document.body.style.fontsize = "24pt";
tail j=3129 line= },
tail j=3130 line= showhide_kov_work1: function() {
tail j=3131 line= if (!this.collapsed) this.collapsed = true;
tail j=3132 line= else this.collapsed = false;
tail j=3133 line= },
tail j=3134 line= showhide_kov_work2: function() {
tail j=3135 line= if (!this.collapsed) this.collapsed = true;
tail j=3136 line= else this.collapsed = false;
tail j=3137 line= }
tail j=3138 line= }
tail j=3139 line= });
tail j=3140 line= </script>
tail j=3141 line=
tail j=3142 line=
tail j=3143 line=
tail j=3144 line= <div id="kov_memes">
tail j=3145 line= <div>
tail j=3146 line= memes: kov_memes
tail j=3147 line= </div>
tail j=3148 line= <button v-on:click="showhide_kov_memes">showhide_kov_memes</button>
tail j=3149 line= <img v-on:click="showhide_kov_memes" src="/imgs/btn/koeye.png" >
tail j=3150 line= <img v-on:click="showhide_kov_memes1" src="/imgs/btn/kob.png" >
tail j=3151 line= <img v-on:click="showhide_kov_memes2" src="/imgs/btn/kow.png" >
tail j=3152 line=
tail j=3153 line= <div v-show="collapsed" class="detail_memes">
tail j=3154 line= kov_memes
tail j=3155 line= <div id="drag"> kov_memes:<br />
tail j=3156 line= <a href=kov_memes.html class="thumbnail" target=_blank>
tail j=3157 line= <img class="drg" src="/imgs/kov/tn/tn_kov_memes.png" alt="kov_food" width="50" class="drg"/>
tail j=3158 line= <span><img class="drg" src="/imgs/kov/kov_memes.png" alt="kov_food" width="50" class="drg"/></span>
tail j=3159 line= </a>
tail j=3160 line= </div>
tail j=3161 line=
tail j=3162 line= </div>
tail j=3163 line= </div>
tail j=3164 line=
tail j=3165 line= <script>var kov_memes = new Vue({ el: "#kov_memes",
tail j=3166 line= data: {collapsed: false},
tail j=3167 line= methods: {
tail j=3168 line= showhide_kov_memes: function() {
tail j=3169 line= if (!this.collapsed) this.collapsed = true;
tail j=3170 line= else this.collapsed = false;
tail j=3171 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3172 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3173 line=
tail j=3174 line=// document.body.style.background = "darkslategrey";
tail j=3175 line=// document.body.style.color = "black";
tail j=3176 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3177 line=// document.body.style.fontsize = "24pt";
tail j=3178 line= },
tail j=3179 line= showhide_kov_memes1: function() {
tail j=3180 line= if (!this.collapsed) this.collapsed = true;
tail j=3181 line= else this.collapsed = false;
tail j=3182 line= },
tail j=3183 line= showhide_kov_memes2: function() {
tail j=3184 line= if (!this.collapsed) this.collapsed = true;
tail j=3185 line= else this.collapsed = false;
tail j=3186 line= }
tail j=3187 line= }
tail j=3188 line= });
tail j=3189 line= </script>
tail j=3190 line=
tail j=3191 line=
tail j=3192 line= <div id="kov_kids">
tail j=3193 line= <div>
tail j=3194 line= kids: kov_kids
tail j=3195 line= </div>
tail j=3196 line= <button v-on:click="showhide_kov_kids">showhide_kov_kids</button>
tail j=3197 line= <img v-on:click="showhide_kov_kids" src="/imgs/btn/koeye.png" >
tail j=3198 line= <img v-on:click="showhide_kov_kids1" src="/imgs/btn/kob.png" >
tail j=3199 line= <img v-on:click="showhide_kov_kids2" src="/imgs/btn/kow.png" >
tail j=3200 line=
tail j=3201 line= <div v-show="collapsed" class="detail_kids">
tail j=3202 line= kov_kids
tail j=3203 line= <div id="drag"> kov_kids:<br />
tail j=3204 line= <a href=kov_kids.html class="thumbnail" target=_blank>
tail j=3205 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kids.png" alt="kov_food" width="200" class="drg"/>
tail j=3206 line= <span><img class="drg" src="/imgs/kov/kov_kids.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3207 line= </a>
tail j=3208 line=
tail j=3209 line=
tail j=3210 line= <a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
tail j=3211 line= <img class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
tail j=3212 line= <span><img height=400 class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
tail j=3213 line= </a>
tail j=3214 line=
tail j=3215 line=
tail j=3216 line= <a href=/ko/svc/js/stemkoskijs/Three.js/Voxel-Painter.html class="thumbnail" target=_blank>
tail j=3217 line= <img height =200 src="/imgs/links/tn/tn_voxelpainter.png">
tail j=3218 line= <span><img height=400 src="/imgs/links/tn/tn_voxelpainter.png"></span>
tail j=3219 line= </a>
tail j=3220 line=
tail j=3221 line= <a href=/ko/svc/js/stemkoskijs/Three.js/ class="thumbnail" target=_blank>
tail j=3222 line= <img height =200 src="/imgs/links/tn/tn_stemkoskijs.png">
tail j=3223 line= <span><img height=400 src="/imgs/links/tn/tn_stemkoskijs.png"></span>
tail j=3224 line= </a>
tail j=3225 line=
tail j=3226 line= <a href=ko/svc/js/stemkoskijs/Three.js/ target=_blank>
tail j=3227 line=
tail j=3228 line= </a>
tail j=3229 line=
tail j=3230 line=
tail j=3231 line= </div>
tail j=3232 line= </div>
tail j=3233 line=
tail j=3234 line=<!--
tail j=3235 line=harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
tail j=3236 line=morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
tail j=3237 line=morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
tail j=3238 line=harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
tail j=3239 line=georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
tail j=3240 line= -->
tail j=3241 line=
tail j=3242 line=
tail j=3243 line=
tail j=3244 line= </div>
tail j=3245 line=
tail j=3246 line= </a>
tail j=3247 line=
tail j=3248 line=
tail j=3249 line= </div>
tail j=3250 line= </div>
tail j=3251 line=
tail j=3252 line=<!--
tail j=3253 line=harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
tail j=3254 line=morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
tail j=3255 line=morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
tail j=3256 line=harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
tail j=3257 line=georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
tail j=3258 line= -->
tail j=3259 line=
tail j=3260 line=
tail j=3261 line=
tail j=3262 line= </div>
tail j=3263 line= </div>
tail j=3264 line=
tail j=3265 line= <script>var kov_kids = new Vue({ el: "#kov_kids",
tail j=3266 line= data: {collapsed: false},
tail j=3267 line= methods: {
tail j=3268 line= showhide_kov_kids: function() {
tail j=3269 line= if (!this.collapsed) this.collapsed = true;
tail j=3270 line= else this.collapsed = false;
tail j=3271 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3272 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3273 line=
tail j=3274 line=// document.body.style.background = "darkslategrey";
tail j=3275 line=// document.body.style.color = "black";
tail j=3276 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3277 line=// document.body.style.fontsize = "24pt";
tail j=3278 line= },
tail j=3279 line= showhide_kov_kids1: function() {
tail j=3280 line= if (!this.collapsed) this.collapsed = true;
tail j=3281 line= else this.collapsed = false;
tail j=3282 line= },
tail j=3283 line= showhide_kov_kids2: function() {
tail j=3284 line= if (!this.collapsed) this.collapsed = true;
tail j=3285 line= else this.collapsed = false;
tail j=3286 line= }
tail j=3287 line= }
tail j=3288 line= });
tail j=3289 line= </script>
tail j=3290 line=
tail j=3291 line=
tail j=3292 line=
tail j=3293 line=
tail j=3294 line=
tail j=3295 line=
tail j=3296 line= <div id="kov_dogs">
tail j=3297 line= <div>
tail j=3298 line= dogs: kov_dogs
tail j=3299 line= </div>
tail j=3300 line= <button v-on:click="showhide_kov_dogs">showhide_kov_dogs</button>
tail j=3301 line= <img v-on:click="showhide_kov_dogs" src="/imgs/btn/koeye.png" >
tail j=3302 line= <img v-on:click="showhide_kov_dogs1" src="/imgs/btn/kob.png" >
tail j=3303 line= <img v-on:click="showhide_kov_dogs2" src="/imgs/btn/kow.png" >
tail j=3304 line=
tail j=3305 line= <div v-show="collapsed" class="detail_dogs">
tail j=3306 line= kov_dogs
tail j=3307 line= <div id="drag"> kov_dogs:<br />
tail j=3308 line= <a href=kov_dogs.html class="thumbnail" target=_blank>
tail j=3309 line= <img class="drg" src="/imgs/kov/tn/tn_kov_dogs.png" alt="kov_food" width="200" class="drg"/>
tail j=3310 line= <span><img class="drg" src="/imgs/kov/kov_dogs.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3311 line= </a>
tail j=3312 line= </div>
tail j=3313 line=
tail j=3314 line= <a href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
tail j=3315 line= <img height=200 src=/imgs/links/warning_light.gif border=0>
tail j=3316 line= <span><img src=/links/warning_light.gif border=0></span>
tail j=3317 line= </a>
tail j=3318 line=
tail j=3319 line=<!-- kov_dogs_end -->
tail j=3320 line= </div>
tail j=3321 line= </div>
tail j=3322 line=
tail j=3323 line= <script>var kov_dogs = new Vue({ el: "#kov_dogs",
tail j=3324 line= data: {collapsed: false},
tail j=3325 line= methods: {
tail j=3326 line= showhide_kov_dogs: function() {
tail j=3327 line= if (!this.collapsed) this.collapsed = true;
tail j=3328 line= else this.collapsed = false;
tail j=3329 line= document.getElementById("kov_dogs").style.font = "italic bold 20px arial,serif";
tail j=3330 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3331 line=
tail j=3332 line=// document.body.style.background = "darkslategrey";
tail j=3333 line=// document.body.style.color = "black";
tail j=3334 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3335 line=// document.body.style.fontsize = "24pt";
tail j=3336 line= },
tail j=3337 line= showhide_kov_dogs1: function() {
tail j=3338 line= if (!this.collapsed) this.collapsed = true;
tail j=3339 line= else this.collapsed = false;
tail j=3340 line= },
tail j=3341 line= showhide_kov_dogs2: function() {
tail j=3342 line= if (!this.collapsed) this.collapsed = true;
tail j=3343 line= else this.collapsed = false;
tail j=3344 line= }
tail j=3345 line= }
tail j=3346 line= });
tail j=3347 line= </script>
tail j=3348 line=
tail j=3349 line=
tail j=3350 line= <div id="kov_preserve">
tail j=3351 line= <div>
tail j=3352 line= preserve: kov_preserve
tail j=3353 line= </div>
tail j=3354 line= <button v-on:click="showhide_kov_preserve">showhide_kov_preserve</button>
tail j=3355 line= <img v-on:click="showhide_kov_preserve" src="/imgs/btn/koeye.png" >
tail j=3356 line= <img v-on:click="showhide_kov_preserve1" src="/imgs/btn/kob.png" >
tail j=3357 line= <img v-on:click="showhide_kov_preserve2" src="/imgs/btn/kow.png" >
tail j=3358 line=
tail j=3359 line= <div v-show="collapsed" class="detail_preserve">
tail j=3360 line= <div id="drag"> kov_preserve:<br />
tail j=3361 line= <a href=kov_preserve.html class="thumbnail" target=_blank>
tail j=3362 line= <img class="drg" src="/imgs/kov/tn/tn_kov_preserve.png" alt="kov_food" width="200" class="drg"/>
tail j=3363 line= <span><img class="drg" src="/imgs/kov/kov_preserve.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3364 line= </a>
tail j=3365 line= </div>
tail j=3366 line=
tail j=3367 line=
tail j=3368 line= </div>
tail j=3369 line= </div>
tail j=3370 line=
tail j=3371 line= <script>var kov_preserve = new Vue({ el: "#kov_preserve",
tail j=3372 line= data: {collapsed: false},
tail j=3373 line= methods: {
tail j=3374 line= showhide_kov_preserve: function() {
tail j=3375 line= if (!this.collapsed) this.collapsed = true;
tail j=3376 line= else this.collapsed = false;
tail j=3377 line= document.getElementById("kov_preserve").style.font = "italic bold 20px arial,serif";
tail j=3378 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3379 line=
tail j=3380 line=// document.body.style.background = "darkslategrey";
tail j=3381 line=// document.body.style.color = "black";
tail j=3382 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3383 line=// document.body.style.fontsize = "24pt";
tail j=3384 line= },
tail j=3385 line= showhide_kov_preserve1: function() {
tail j=3386 line= if (!this.collapsed) this.collapsed = true;
tail j=3387 line= else this.collapsed = false;
tail j=3388 line= },
tail j=3389 line= showhide_kov_preserve2: function() {
tail j=3390 line= if (!this.collapsed) this.collapsed = true;
tail j=3391 line= else this.collapsed = false;
tail j=3392 line= }
tail j=3393 line= }
tail j=3394 line= });
tail j=3395 line= </script>
tail j=3396 line=
tail j=3397 line=
tail j=3398 line=
tail j=3399 line= <div id="kov_protect">
tail j=3400 line= <div>
tail j=3401 line= protect: kov_protect
tail j=3402 line= </div>
tail j=3403 line= <button v-on:click="showhide_kov_protect">showhide_kov_protect</button>
tail j=3404 line= <img v-on:click="showhide_kov_protect" src="/imgs/btn/koeye.png" >
tail j=3405 line= <img v-on:click="showhide_kov_protect1" src="/imgs/btn/kob.png" >
tail j=3406 line= <img v-on:click="showhide_kov_protect2" src="/imgs/btn/kow.png" >
tail j=3407 line=
tail j=3408 line= <div v-show="collapsed" class="detail_protect">
tail j=3409 line= <div id="drag"> kov_protect:<br />
tail j=3410 line= <a href=kov_protect.html class="thumbnail" target=_blank>
tail j=3411 line= <img class="drg" src="/imgs/kov/tn/tn_kov_protect.png" alt="kov_food" width="200" class="drg"/>
tail j=3412 line= <span><img class="drg" src="/imgs/kov/kov_protect.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3413 line= </a>
tail j=3414 line= </div>
tail j=3415 line=
tail j=3416 line=
tail j=3417 line= </div>
tail j=3418 line= </div>
tail j=3419 line=
tail j=3420 line=
tail j=3421 line= <script>var kov_protect = new Vue({ el: "#kov_protect",
tail j=3422 line= data: {collapsed: false},
tail j=3423 line= methods: {
tail j=3424 line= showhide_kov_protect: function() {
tail j=3425 line= if (!this.collapsed) this.collapsed = true;
tail j=3426 line= else this.collapsed = false;
tail j=3427 line= document.getElementById("kov_protect").style.font = "italic bold 20px arial,serif";
tail j=3428 line= },
tail j=3429 line= showhide_kov_protect1: function() {
tail j=3430 line= if (!this.collapsed) this.collapsed = true;
tail j=3431 line= else this.collapsed = false;
tail j=3432 line= },
tail j=3433 line= showhide_kov_protect2: function() {
tail j=3434 line= if (!this.collapsed) this.collapsed = true;
tail j=3435 line= else this.collapsed = false;
tail j=3436 line= }
tail j=3437 line= }
tail j=3438 line= });
tail j=3439 line= </script>
tail j=3440 line=
tail j=3441 line=
tail j=3442 line=
tail j=3443 line= <div id="kov_jtfdc">
tail j=3444 line= <div>
tail j=3445 line= jtfdc: kov_jtfdc
tail j=3446 line= </div>
tail j=3447 line= <button v-on:click="showhide_kov_jtfdc">showhide_kov_jtfdc</button>
tail j=3448 line= <img v-on:click="showhide_kov_jtfdc" src="/imgs/btn/koeye.png" >
tail j=3449 line= <img v-on:click="showhide_kov_jtfdc1" src="/imgs/btn/kob.png" >
tail j=3450 line= <img v-on:click="showhide_kov_jtfdc2" src="/imgs/btn/kow.png" >
tail j=3451 line=
tail j=3452 line= <div v-show="collapsed" class="detail_jtfdc">
tail j=3453 line= <div id="drag"> kov_jtfdc:<br />
tail j=3454 line= <a href=kov_jtfdc.html class="thumbnail" target=_blank>
tail j=3455 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jtfdc.png" alt="kov_food" width="200" class="drg"/>
tail j=3456 line= <span><img class="drg" src="/imgs/kov/kov_jtfdc.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3457 line= </a>
tail j=3458 line= </div>
tail j=3459 line=
tail j=3460 line=
tail j=3461 line= </div>
tail j=3462 line= </div>
tail j=3463 line=
tail j=3464 line=
tail j=3465 line= <script>var kov_jtfdc = new Vue({ el: "#kov_jtfdc",
tail j=3466 line= data: {collapsed: false},
tail j=3467 line= methods: {
tail j=3468 line= showhide_kov_jtfdc: function() {
tail j=3469 line= if (!this.collapsed) this.collapsed = true;
tail j=3470 line= else this.collapsed = false;
tail j=3471 line= },
tail j=3472 line= showhide_kov_jtfdc1: function() {
tail j=3473 line= if (!this.collapsed) this.collapsed = true;
tail j=3474 line= else this.collapsed = false;
tail j=3475 line= },
tail j=3476 line= showhide_kov_jtfdc2: function() {
tail j=3477 line= if (!this.collapsed) this.collapsed = true;
tail j=3478 line= else this.collapsed = false;
tail j=3479 line= }
tail j=3480 line= }
tail j=3481 line= });
tail j=3482 line= </script>
tail j=3483 line=
tail j=3484 line= <div id="kov_jtfinc">
tail j=3485 line= <div>
tail j=3486 line= jtfinc: kov_jtfinc
tail j=3487 line= </div>
tail j=3488 line= <button v-on:click="showhide_kov_jtfinc">showhide_kov_jtfinc</button>
tail j=3489 line= <img v-on:click="showhide_kov_jtfinc" src="/imgs/btn/koeye.png" >
tail j=3490 line= <img v-on:click="showhide_kov_jtfinc1" src="/imgs/btn/kob.png" >
tail j=3491 line= <img v-on:click="showhide_kov_jtfinc2" src="/imgs/btn/kow.png" >
tail j=3492 line=
tail j=3493 line= <div v-show="collapsed" class="detail_jtfinc">
tail j=3494 line= <div id="drag"> kov_jtfinc:<br />
tail j=3495 line= <a href=kov_jtfinc.html class="thumbnail" target=_blank>
tail j=3496 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jtfinc.png" alt="kov_food" width="200" class="drg"/>
tail j=3497 line= <span><img class="drg" src="/imgs/kov/kov_jtfinc.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3498 line= </a>
tail j=3499 line= </div>
tail j=3500 line=
tail j=3501 line=
tail j=3502 line= </div>
tail j=3503 line= </div>
tail j=3504 line=
tail j=3505 line=
tail j=3506 line= <script>var kov_jtfinc = new Vue({ el: "#kov_jtfinc",
tail j=3507 line= data: {collapsed: false},
tail j=3508 line= methods: {
tail j=3509 line= showhide_kov_jtfinc: function() {
tail j=3510 line= if (!this.collapsed) this.collapsed = true;
tail j=3511 line= else this.collapsed = false;
tail j=3512 line= },
tail j=3513 line= showhide_kov_jtfinc1: function() {
tail j=3514 line= if (!this.collapsed) this.collapsed = true;
tail j=3515 line= else this.collapsed = false;
tail j=3516 line= },
tail j=3517 line= showhide_kov_jtfinc2: function() {
tail j=3518 line= if (!this.collapsed) this.collapsed = true;
tail j=3519 line= else this.collapsed = false;
tail j=3520 line= }
tail j=3521 line= }
tail j=3522 line= });
tail j=3523 line= </script>
tail j=3524 line=
tail j=3525 line=
tail j=3526 line=
tail j=3527 line=
tail j=3528 line= <div id="kov_byrdpucker">
tail j=3529 line= <div>
tail j=3530 line= byrdpucker is dogs-n-ponies:
tail j=3531 line= </div>
tail j=3532 line= <button v-on:click="showhide_kov_byrdpucker">showhide_kov_byrdpucker</button>
tail j=3533 line= <img v-on:click="showhide_kov_byrdpucker" src="/imgs/btn/koeye.png" >
tail j=3534 line= <img v-on:click="showhide_kov_byrdpucker1" src="/imgs/btn/kob.png" >
tail j=3535 line= <img v-on:click="showhide_kov_byrdpucker2" src="/imgs/btn/kow.png" >
tail j=3536 line=
tail j=3537 line= <div v-show="collapsed" class="detail_byrdpucker">
tail j=3538 line= byrdpucker dog and pony club cyclers and donuts too
tail j=3539 line= <hr>
tail j=3540 line= <div id="drag"> kov_byrpucker:<br />
tail j=3541 line= <a href=kov_byrpucker.html class="thumbnail" target=_blank>
tail j=3542 line= <img class="drg" src="/imgs/kov/tn/tn_kov_byrpucker.png" alt="kov_food" width="200" class="drg"/>
tail j=3543 line= <span><img class="drg" src="/imgs/kov/kov_byrpucker.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3544 line= </a>
tail j=3545 line= </div>
tail j=3546 line=
tail j=3547 line=
tail j=3548 line= </div>
tail j=3549 line= </div>
tail j=3550 line=
tail j=3551 line= <script>var kov_byrdpucker = new Vue({ el: "#kov_byrdpucker",
tail j=3552 line= data: {collapsed: false},
tail j=3553 line= methods: {
tail j=3554 line= showhide_kov_byrdpucker: function() {
tail j=3555 line= if (!this.collapsed) this.collapsed = true;
tail j=3556 line= else this.collapsed = false;
tail j=3557 line=// document.body.style.background = "darkslategrey";
tail j=3558 line=// document.body.style.color = "black";
tail j=3559 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3560 line=// document.body.style.fontsize = "24pt";
tail j=3561 line= },
tail j=3562 line= showhide_kov_byrdpucker1: function() {
tail j=3563 line= if (!this.collapsed) this.collapsed = true;
tail j=3564 line= else this.collapsed = false;
tail j=3565 line= },
tail j=3566 line= showhide_kov_byrdpucker2: function() {
tail j=3567 line= if (!this.collapsed) this.collapsed = true;
tail j=3568 line= else this.collapsed = false;
tail j=3569 line= }
tail j=3570 line= }
tail j=3571 line= });
tail j=3572 line= </script>
tail j=3573 line=
tail j=3574 line=
tail j=3575 line=
tail j=3576 line= <div id="kov_jkwii">
tail j=3577 line= <div>
tail j=3578 line= jkwii is me: kov_jkwii
tail j=3579 line= </div>
tail j=3580 line= <button v-on:click="showhide_kov_jkwii">showhide_kov_jkwii</button>
tail j=3581 line= <img v-on:click="showhide_kov_jkwii" src="/imgs/btn/koeye.png" >
tail j=3582 line= <img v-on:click="showhide_kov_jkwii1" src="/imgs/btn/kob.png" >
tail j=3583 line= <img v-on:click="showhide_kov_jkwii2" src="/imgs/btn/kow.png" >
tail j=3584 line=
tail j=3585 line= <div v-show="collapsed" class="detail_jkwii">
tail j=3586 line= jookiim kopernicus wundersteine ii
tail j=3587 line= <hr>
tail j=3588 line= <div id="drag"> kov_jkwii:<br />
tail j=3589 line= <a href=kov_jkwii.html class="thumbnail" target=_blank>
tail j=3590 line= <img class="drg" src="/imgs/kov/tn/tn_kov_jkwii.png" alt="kov_food" width="200" class="drg"/>
tail j=3591 line= <span><img class="drg" src="/imgs/kov/kov_jkwii.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3592 line= </a>
tail j=3593 line= </div>
tail j=3594 line=
tail j=3595 line= <a href="mailto:jkwii@ko0.us?subject=jkwii?"><img src="/imgs/links/email.gif" alt="jkwii_what" border=0></a>
tail j=3596 line=
tail j=3597 line= <a href="mailto:skwii@ko0.us?subject=skwii?"><img src="/imgs/links/email.gif" alt="skwii_what" border=0></a>
tail j=3598 line= <hr>
tail j=3599 line=
tail j=3600 line= <a href=/imgs/links/eurodoor_Image429.png class="thumbnail" target=_blank>
tail j=3601 line= <img height=200 src=/imgs/links/tn/tn_eurodoor_Image429.png alt="eurodoor" border=0>
tail j=3602 line= <span><img src=/imgs/links/eurodoor_Image429.png alt="eurodoor" border=0></span>
tail j=3603 line= </a>
tail j=3604 line=
tail j=3605 line=
tail j=3606 line= </div>
tail j=3607 line= </div>
tail j=3608 line=
tail j=3609 line= <script>var kov_jkwii = new Vue({ el: "#kov_jkwii",
tail j=3610 line= data: {collapsed: false},
tail j=3611 line= methods: {
tail j=3612 line= showhide_kov_jkwii: function() {
tail j=3613 line= if (!this.collapsed) this.collapsed = true;
tail j=3614 line= else this.collapsed = false;
tail j=3615 line=// document.body.style.background = "darkslategrey";
tail j=3616 line=// document.body.style.color = "black";
tail j=3617 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3618 line=// document.body.style.fontsize = "24pt";
tail j=3619 line= },
tail j=3620 line= showhide_kov_jkwii1: function() {
tail j=3621 line= if (!this.collapsed) this.collapsed = true;
tail j=3622 line= else this.collapsed = false;
tail j=3623 line= },
tail j=3624 line= showhide_kov_jkwii2: function() {
tail j=3625 line= if (!this.collapsed) this.collapsed = true;
tail j=3626 line= else this.collapsed = false;
tail j=3627 line= }
tail j=3628 line= }
tail j=3629 line= });
tail j=3630 line= </script>
tail j=3631 line=
tail j=3632 line=
tail j=3633 line=
tail j=3634 line= <div id="kov_kou">
tail j=3635 line= <div>
tail j=3636 line= ko university digital ars technica:
tail j=3637 line= </div>
tail j=3638 line= <button v-on:click="showhide_kov_kou">showhide_kov_kou</button>
tail j=3639 line= <img v-on:click="showhide_kov_kou" src="/imgs/btn/koeye.png" >
tail j=3640 line= <img v-on:click="showhide_kov_kou1" src="/imgs/btn/kob.png" >
tail j=3641 line= <img v-on:click="showhide_kov_kou2" src="/imgs/btn/kow.png" >
tail j=3642 line=
tail j=3643 line= <div v-show="collapsed" class="detail_kou">
tail j=3644 line= kou digital ars technica
tail j=3645 line= <hr>
tail j=3646 line= <div id="drag"> kov_kou:<br />
tail j=3647 line= <a href=kov_kou.html class="thumbnail" target=_blank>
tail j=3648 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kou.png" alt="kov_food" width="200" class="drg"/>
tail j=3649 line= <span><img class="drg" src="/imgs/kov/kov_kou.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3650 line= </a>
tail j=3651 line= </div>
tail j=3652 line=
tail j=3653 line= </div>
tail j=3654 line= </div>
tail j=3655 line=
tail j=3656 line=
tail j=3657 line=
tail j=3658 line= <script>var kov_kou = new Vue({ el: "#kov_kou",
tail j=3659 line= data: {collapsed: false},
tail j=3660 line= methods: {
tail j=3661 line= showhide_kov_kou: function() {
tail j=3662 line= if (!this.collapsed) this.collapsed = true;
tail j=3663 line= else this.collapsed = false;
tail j=3664 line=// document.body.style.background = "darkslategrey";
tail j=3665 line=// document.body.style.color = "black";
tail j=3666 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3667 line=// document.body.style.fontsize = "24pt";
tail j=3668 line= },
tail j=3669 line= showhide_kov_kou1: function() {
tail j=3670 line= if (!this.collapsed) this.collapsed = true;
tail j=3671 line= else this.collapsed = false;
tail j=3672 line= },
tail j=3673 line= showhide_kov_kou2: function() {
tail j=3674 line= if (!this.collapsed) this.collapsed = true;
tail j=3675 line= else this.collapsed = false;
tail j=3676 line= }
tail j=3677 line= }
tail j=3678 line= });
tail j=3679 line= </script>
tail j=3680 line=
tail j=3681 line=
tail j=3682 line=
tail j=3683 line=
tail j=3684 line= <div id="kov_kassil">
tail j=3685 line= <div>
tail j=3686 line= kassil and others are us: kov_kassil
tail j=3687 line= </div>
tail j=3688 line= <button v-on:click="showhide_kov_kassil">showhide_kov_kassil</button>
tail j=3689 line= <img v-on:click="showhide_kov_kassil" src="/imgs/btn/koeye.png" >
tail j=3690 line= <img v-on:click="showhide_kov_kassil1" src="/imgs/btn/kob.png" >
tail j=3691 line= <img v-on:click="showhide_kov_kassil2" src="/imgs/btn/kow.png" >
tail j=3692 line=
tail j=3693 line= <div v-show="collapsed" class="detail_kassil">
tail j=3694 line= kassil & others
tail j=3695 line= <div id="drag"> kov_kassil:<br />
tail j=3696 line= <a href=kov_kassil.html class="thumbnail" target=_blank>
tail j=3697 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kassil.png" alt="kov_food" width="200" class="drg"/>
tail j=3698 line= <span><img class="drg" src="/imgs/kov/kov_kassil.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3699 line= </a>
tail j=3700 line= </div>
tail j=3701 line= <hr>
tail j=3702 line=
tail j=3703 line=
tail j=3704 line= </div>
tail j=3705 line= </div>
tail j=3706 line=
tail j=3707 line= <script>var kov_kassil = new Vue({ el: "#kov_kassil",
tail j=3708 line= data: {collapsed: false},
tail j=3709 line= methods: {
tail j=3710 line= showhide_kov_kassil: function() {
tail j=3711 line= if (!this.collapsed) this.collapsed = true;
tail j=3712 line= else this.collapsed = false;
tail j=3713 line=// document.body.style.background = "darkslategrey";
tail j=3714 line=// document.body.style.color = "black";
tail j=3715 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3716 line=// document.body.style.fontsize = "24pt";
tail j=3717 line= },
tail j=3718 line= showhide_kov_kassil1: function() {
tail j=3719 line= if (!this.collapsed) this.collapsed = true;
tail j=3720 line= else this.collapsed = false;
tail j=3721 line= },
tail j=3722 line= showhide_kov_kassil2: function() {
tail j=3723 line= if (!this.collapsed) this.collapsed = true;
tail j=3724 line= else this.collapsed = false;
tail j=3725 line= }
tail j=3726 line= }
tail j=3727 line= });
tail j=3728 line= </script>
tail j=3729 line=
tail j=3730 line=
tail j=3731 line=
tail j=3732 line=
tail j=3733 line= <div id="kov_konet">
tail j=3734 line= <div>
tail j=3735 line= konet is biz: kov_konet
tail j=3736 line= </div>
tail j=3737 line= <button v-on:click="showhide_kov_konet">showhide_kov_konet</button>
tail j=3738 line= <img v-on:click="showhide_kov_konet" src="/imgs/btn/koeye.png" >
tail j=3739 line= <img v-on:click="showhide_kov_konet1" src="/imgs/btn/kob.png" >
tail j=3740 line= <img v-on:click="showhide_kov_konet2" src="/imgs/btn/kow.png" >
tail j=3741 line=
tail j=3742 line= <div v-show="collapsed" class="detail_konet">
tail j=3743 line= konet is biz
tail j=3744 line= <hr>
tail j=3745 line= <div id="drag"> kov_konet:<br />
tail j=3746 line= <a href=kov_konet.html class="thumbnail" target=_blank>
tail j=3747 line= <img class="drg" src="/imgs/kov/tn/tn_kov_konet.png" alt="kov_food" width="200" class="drg"/>
tail j=3748 line= <span><img class="drg" src="/imgs/kov/kov_konet.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3749 line= </a>
tail j=3750 line= </div>
tail j=3751 line=
tail j=3752 line=
tail j=3753 line= </div>
tail j=3754 line= </div>
tail j=3755 line=
tail j=3756 line= <script>var kov_konet = new Vue({ el: "#kov_konet",
tail j=3757 line= data: {collapsed: false},
tail j=3758 line= methods: {
tail j=3759 line= showhide_kov_konet: function() {
tail j=3760 line= if (!this.collapsed) this.collapsed = true;
tail j=3761 line= else this.collapsed = false;
tail j=3762 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3763 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3764 line=
tail j=3765 line=// document.body.style.background = "darkslategrey";
tail j=3766 line=// document.body.style.color = "black";
tail j=3767 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3768 line=// document.body.style.fontsize = "24pt";
tail j=3769 line= },
tail j=3770 line= showhide_kov_konet1: function() {
tail j=3771 line= if (!this.collapsed) this.collapsed = true;
tail j=3772 line= else this.collapsed = false;
tail j=3773 line= },
tail j=3774 line= showhide_kov_konet2: function() {
tail j=3775 line= if (!this.collapsed) this.collapsed = true;
tail j=3776 line= else this.collapsed = false;
tail j=3777 line= }
tail j=3778 line= }
tail j=3779 line= });
tail j=3780 line= </script>
tail j=3781 line=
tail j=3782 line=
tail j=3783 line=
tail j=3784 line=
tail j=3785 line= <div id="kov_iperms">
tail j=3786 line= <div>
tail j=3787 line= iperms
tail j=3788 line=<!-- <h1 v-on:click="showhide_kov_iperms" >= = : : iperms : : = =</h1> -->
tail j=3789 line= </div>
tail j=3790 line= <button v-on:click="showhide_kov_iperms">showhide_kov_iperms</button>
tail j=3791 line= <img v-on:click="showhide_kov_iperms" src="/imgs/btn/koeye.png" >
tail j=3792 line= <img v-on:click="showhide_kov_iperms1" src="/imgs/btn/kob.png" >
tail j=3793 line= <img v-on:click="showhide_kov_iperms2" src="/imgs/btn/kow.png" >
tail j=3794 line=
tail j=3795 line= <div v-show="collapsed" class="detail_iperms">
tail j=3796 line= iperms
tail j=3797 line= <hr>
tail j=3798 line= <div id="drag"> kov_iperms:<br />
tail j=3799 line= <a href=kov_iperms.html class="thumbnail" target=_blank>
tail j=3800 line= <img class="drg" src="/imgs/kov/tn/tn_kov_iperms.png" alt="kov_food" width="200" class="drg"/>
tail j=3801 line= <span><img class="drg" src="/imgs/kov/kov_iperms.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3802 line= </a>
tail j=3803 line= </div>
tail j=3804 line=
tail j=3805 line=
tail j=3806 line= </div>
tail j=3807 line= </div>
tail j=3808 line=
tail j=3809 line= <script>var kov_iperms = new Vue({ el: "#kov_iperms",
tail j=3810 line= data: {collapsed: false},
tail j=3811 line= methods: {
tail j=3812 line= showhide_kov_iperms: function() {
tail j=3813 line= if (!this.collapsed) this.collapsed = true;
tail j=3814 line= else this.collapsed = false;
tail j=3815 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3816 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3817 line=
tail j=3818 line=// document.body.style.background = "darkslategrey";
tail j=3819 line=// document.body.style.color = "black";
tail j=3820 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3821 line=// document.body.style.fontsize = "24pt";
tail j=3822 line= },
tail j=3823 line= showhide_kov_iperms1: function() {
tail j=3824 line= if (!this.collapsed) this.collapsed = true;
tail j=3825 line= else this.collapsed = false;
tail j=3826 line= },
tail j=3827 line= showhide_kov_iperms2: function() {
tail j=3828 line= if (!this.collapsed) this.collapsed = true;
tail j=3829 line= else this.collapsed = false;
tail j=3830 line= }
tail j=3831 line= }
tail j=3832 line= });
tail j=3833 line= </script>
tail j=3834 line=
tail j=3835 line=
tail j=3836 line=
tail j=3837 line=
tail j=3838 line= <div id="kov_konabus">
tail j=3839 line= <div>
tail j=3840 line= konabus: kov_konabus
tail j=3841 line= </div>
tail j=3842 line= <button v-on:click="showhide_kov_konabus">showhide_kov_konabus</button>
tail j=3843 line= <img v-on:click="showhide_kov_konabus" src="/imgs/btn/koeye.png" >
tail j=3844 line= <img v-on:click="showhide_kov_konabus1" src="/imgs/btn/kob.png" >
tail j=3845 line= <img v-on:click="showhide_kov_konabus2" src="/imgs/btn/kow.png" >
tail j=3846 line=
tail j=3847 line= <div v-show="collapsed" class="detail_konabus">
tail j=3848 line= konabus
tail j=3849 line= <hr>
tail j=3850 line= <div id="drag"> kov_konabus:<br />
tail j=3851 line= <a href=kov_konabus.html class="thumbnail" target=_blank>
tail j=3852 line= <img class="drg" src="/imgs/kov/tn/tn_kov_konabus.png" alt="kov_food" width="200" class="drg"/>
tail j=3853 line= <span><img class="drg" src="/imgs/kov/kov_konabus.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3854 line= </a>
tail j=3855 line= </div>
tail j=3856 line=
tail j=3857 line= </div>
tail j=3858 line= </div>
tail j=3859 line=
tail j=3860 line= <script>var kov_konabus = new Vue({ el: "#kov_konabus",
tail j=3861 line= data: {collapsed: false},
tail j=3862 line= methods: {
tail j=3863 line= showhide_kov_konabus: function() {
tail j=3864 line= if (!this.collapsed) this.collapsed = true;
tail j=3865 line= else this.collapsed = false;
tail j=3866 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3867 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3868 line=
tail j=3869 line=// document.body.style.background = "darkslategrey";
tail j=3870 line=// document.body.style.color = "black";
tail j=3871 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3872 line=// document.body.style.fontsize = "24pt";
tail j=3873 line= },
tail j=3874 line= showhide_kov_konabus1: function() {
tail j=3875 line= if (!this.collapsed) this.collapsed = true;
tail j=3876 line= else this.collapsed = false;
tail j=3877 line= },
tail j=3878 line= showhide_kov_konabus2: function() {
tail j=3879 line= if (!this.collapsed) this.collapsed = true;
tail j=3880 line= else this.collapsed = false;
tail j=3881 line= }
tail j=3882 line= }
tail j=3883 line= });
tail j=3884 line= </script>
tail j=3885 line=
tail j=3886 line=
tail j=3887 line=
tail j=3888 line=
tail j=3889 line= <div id="kov_kt">
tail j=3890 line= <div>
tail j=3891 line= kt: kov_kt
tail j=3892 line= </div>
tail j=3893 line= <button v-on:click="showhide_kov_kt">showhide_kov_kt</button>
tail j=3894 line= <img v-on:click="showhide_kov_kt" src="/imgs/btn/koeye.png" >
tail j=3895 line= <img v-on:click="showhide_kov_kt1" src="/imgs/btn/kob.png" >
tail j=3896 line= <img v-on:click="showhide_kov_kt2" src="/imgs/btn/kow.png" >
tail j=3897 line=
tail j=3898 line= <div v-show="collapsed" class="detail_kt">
tail j=3899 line= kt
tail j=3900 line= <hr>
tail j=3901 line= <div id="drag"> kov_kt:<br />
tail j=3902 line= <a href=kov_kt.html class="thumbnail" target=_blank>
tail j=3903 line= <img class="drg" src="/imgs/kov/tn/tn_kov_kt.png" alt="kov_food" width="200" class="drg"/>
tail j=3904 line= <span><img class="drg" src="/imgs/kov/kov_kt.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3905 line= </a>
tail j=3906 line= </div>
tail j=3907 line=
tail j=3908 line=
tail j=3909 line= </div>
tail j=3910 line= </div>
tail j=3911 line=
tail j=3912 line= <script>var kov_kt = new Vue({ el: "#kov_kt",
tail j=3913 line= data: {collapsed: false},
tail j=3914 line= methods: {
tail j=3915 line= showhide_kov_kt: function() {
tail j=3916 line= if (!this.collapsed) this.collapsed = true;
tail j=3917 line= else this.collapsed = false;
tail j=3918 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3919 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3920 line=
tail j=3921 line=// document.body.style.background = "darkslategrey";
tail j=3922 line=// document.body.style.color = "black";
tail j=3923 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3924 line=// document.body.style.fontsize = "24pt";
tail j=3925 line= },
tail j=3926 line= showhide_kov_kt1: function() {
tail j=3927 line= if (!this.collapsed) this.collapsed = true;
tail j=3928 line= else this.collapsed = false;
tail j=3929 line= },
tail j=3930 line= showhide_kov_kt2: function() {
tail j=3931 line= if (!this.collapsed) this.collapsed = true;
tail j=3932 line= else this.collapsed = false;
tail j=3933 line= }
tail j=3934 line= }
tail j=3935 line= });
tail j=3936 line= </script>
tail j=3937 line=
tail j=3938 line=
tail j=3939 line=
tail j=3940 line= <div id="kov_go">
tail j=3941 line= <div>
tail j=3942 line= go: kov_go
tail j=3943 line= </div>
tail j=3944 line= <button v-on:click="showhide_kov_go">showhide_kov_go</button>
tail j=3945 line= <img v-on:click="showhide_kov_go" src="/imgs/btn/koeye.png" >
tail j=3946 line= <img v-on:click="showhide_kov_go1" src="/imgs/btn/kob.png" >
tail j=3947 line= <img v-on:click="showhide_kov_go2" src="/imgs/btn/kow.png" >
tail j=3948 line=
tail j=3949 line= <div v-show="collapsed" class="detail_go">
tail j=3950 line= go
tail j=3951 line= <hr>
tail j=3952 line= <div id="drag"> kov_go:<br />
tail j=3953 line= <a href=kov_go.html class="thumbnail" target=_blank>
tail j=3954 line= <img class="drg" src="/imgs/kov/tn/tn_kov_go.png" alt="kov_food" width="200" class="drg"/>
tail j=3955 line= <span><img class="drg" src="/imgs/kov/kov_go.png" alt="kov_food" width="400" class="drg"/></span>
tail j=3956 line= </a>
tail j=3957 line= </div>
tail j=3958 line=
tail j=3959 line=
tail j=3960 line= </div>
tail j=3961 line= </div>
tail j=3962 line=
tail j=3963 line= <script>var kov_go = new Vue({ el: "#kov_go",
tail j=3964 line= data: {collapsed: false},
tail j=3965 line= methods: {
tail j=3966 line= showhide_kov_go: function() {
tail j=3967 line= if (!this.collapsed) this.collapsed = true;
tail j=3968 line= else this.collapsed = false;
tail j=3969 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=3970 line=// font-style font-variant font-weight font-size line-height font-family
tail j=3971 line=
tail j=3972 line=// document.body.style.background = "darkslategrey";
tail j=3973 line=// document.body.style.color = "black";
tail j=3974 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=3975 line=// document.body.style.fontsize = "24pt";
tail j=3976 line= },
tail j=3977 line= showhide_kov_go1: function() {
tail j=3978 line= if (!this.collapsed) this.collapsed = true;
tail j=3979 line= else this.collapsed = false;
tail j=3980 line= },
tail j=3981 line= showhide_kov_go2: function() {
tail j=3982 line= if (!this.collapsed) this.collapsed = true;
tail j=3983 line= else this.collapsed = false;
tail j=3984 line= }
tail j=3985 line= }
tail j=3986 line= });
tail j=3987 line= </script>
tail j=3988 line=
tail j=3989 line=
tail j=3990 line=
tail j=3991 line= <div id="div_kov_old">
tail j=3992 line= <div>
tail j=3993 line= old: kov_old
tail j=3994 line= </div>
tail j=3995 line= <button v-on:click="showhide_kov_old">showhide_kov_old</button>
tail j=3996 line= <img v-on:click="showhide_kov_old" src="/imgs/btn/koeye.png" >
tail j=3997 line= <img v-on:click="showhide_kov_old1" src="/imgs/btn/kob.png" >
tail j=3998 line= <img v-on:click="showhide_kov_old2" src="/imgs/btn/kow.png" >
tail j=3999 line=
tail j=4000 line= <div v-show="collapsed" class="detail_old">
tail j=4001 line=
tail j=4002 line= old
tail j=4003 line= <hr>
tail j=4004 line= <div id="drag"> kov_old:<br />
tail j=4005 line= <a href=kov_old.html class="thumbnail" target=_blank>
tail j=4006 line= <img class="drg" src="/imgs/kov/tn/tn_kov_old.png" alt="kov_food" width="200" class="drg"/>
tail j=4007 line= <span><img class="drg" src="/imgs/kov/kov_old.png" alt="kov_food" width="400" class="drg"/></span>
tail j=4008 line= </a>
tail j=4009 line= </div>
tail j=4010 line=
tail j=4011 line=
tail j=4012 line= </div>
tail j=4013 line= </div id="div_kov_old">
tail j=4014 line=
tail j=4015 line= <script id="script_kov_old">
tail j=4016 line= var kov_old = new Vue({ el: "#kov_old",
tail j=4017 line= data: {collapsed: false},
tail j=4018 line= methods: {
tail j=4019 line= showhide_kov_old: function() {
tail j=4020 line= if (!this.collapsed) this.collapsed = true;
tail j=4021 line= else this.collapsed = false;
tail j=4022 line= document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif";
tail j=4023 line=// font-style font-variant font-weight font-size line-height font-family
tail j=4024 line=
tail j=4025 line=// document.body.style.background = "darkslategrey";
tail j=4026 line=// document.body.style.color = "black";
tail j=4027 line=// document.body.style.fontfamily = "yokkmokkOT";
tail j=4028 line=// document.body.style.fontsize = "24pt";
tail j=4029 line= },
tail j=4030 line= showhide_kov_old1: function() {
tail j=4031 line= if (!this.collapsed) this.collapsed = true;
tail j=4032 line= else this.collapsed = false;
tail j=4033 line= },
tail j=4034 line= showhide_kov_old2: function() {
tail j=4035 line= if (!this.collapsed) this.collapsed = true;
tail j=4036 line= else this.collapsed = false;
tail j=4037 line= }
tail j=4038 line= }
tail j=4039 line= });
tail j=4040 line= </script id="script_kov_old">
tail j=4041 line=
tail j=4042 line= </div id="div_vues_end" >
tail j=4043 line=
tail j=4044 line=<!-- kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk -->
tail j=4045 line=
tail j=4046 line=
tail j=4047 line=
tail j=4048 line=
tail j=4049 line=
tail j=4050 line=
tail j=4051 line=
tail j=4052 line=
tail j=4053 line=
tail j=4054 line=
tail j=4055 line=
tail j=4056 line= <ul id="kov_list">
tail j=4057 line= <li v-for="(item, index) in items">
tail j=4058 line= {{ parentMessage }} - {{ index }} - {{ item.message }}
tail j=4059 line= </li>
tail j=4060 line= </ul>
tail j=4061 line= <script id="script_kov_list" >
tail j=4062 line= var kov_list = new Vue({el: '#kov_list',
tail j=4063 line= data: {
tail j=4064 line= parentMessage: 'Parent',
tail j=4065 line= items: [
tail j=4066 line= { message: 'new' },
tail j=4067 line= { message: 'focus' },
tail j=4068 line= { message: 'work' },
tail j=4069 line= { message: 'memes' },
tail j=4070 line= { message: 'jtfdc' },
tail j=4071 line= { message: 'jtfinc' },
tail j=4072 line= { message: 'byrdpucker',
tail j=4073 line= { message: 'jkwii' },
tail j=4074 line= { message: 'kou' },
tail j=4075 line= { message: 'kassil' },
tail j=4076 line= { message: 'konet' },
tail j=4077 line= { message: 'iperms' },
tail j=4078 line= { message: 'konabus' },
tail j=4079 line= { message: 'kt' },
tail j=4080 line= { message: 'go' },
tail j=4081 line= { message: 'old' }
tail j=4082 line= ]
tail j=4083 line= }
tail j=4084 line= })
tail j=4085 line= </script id="script_kov_list" >
tail j=4086 line=
tail j=4087 line=
tail j=4088 line= <div id="div_url">
tail j=4089 line= <script id="script_url">
tail j=4090 line= var url = document.createElement("a");
tail j=4091 line= url.href=location.href;
tail j=4092 line= var output = "output";
tail j=4093 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
tail j=4094 line=
tail j=4095 line=// if( url.search != "" ) {
tail j=4096 line=// script_zm_view( url.search );
tail j=4097 line=// }
tail j=4098 line=
tail j=4099 line=// alert(location.href)
tail j=4100 line=// alert(url.protocol)
tail j=4101 line=// alert(url.hostname)
tail j=4102 line=// alert(url.pathname)
tail j=4103 line=// alert(url.search)
tail j=4104 line=// alert(url.hash)
tail j=4105 line=
tail j=4106 line=
tail j=4107 line=// document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
tail j=4108 line=// document.write( "pathname=" + url.pathname + " search=" + url.search );
tail j=4109 line= </script>
tail j=4110 line= </script id="script_url">
tail j=4111 line= </div id="div_url">
tail j=4112 line=
tail j=4113 line=
tail j=4114 line=
tail j=4115 line= <script id="script_document_ready" type="text/javascript">
tail j=4116 line= $(document).ready(function() {
tail j=4117 line=// sets the draggable
tail j=4118 line= $('#drag .drg').draggable({
tail j=4119 line= cursor: 'move', // sets the cursor apperance
tail j=4120 line= revert: 'valid'
tail j=4121 line= });
tail j=4122 line=
tail j=4123 line=// sets droppable
tail j=4124 line=// after the draggable is droped, hides it with a hide() effect
tail j=4125 line= $('#drop').droppable({
tail j=4126 line= drop: function(event, ui) {
tail j=4127 line= ui.draggable.hide(1000);
tail j=4128 line= }
tail j=4129 line= });
tail j=4130 line=
tail j=4131 line=// after the draggable is droped, hides it with a hide() effect
tail j=4132 line= $('#drop1').droppable({
tail j=4133 line= drop: function(event, ui) {
tail j=4134 line= ui.draggable.hide(1000);
tail j=4135 line= }
tail j=4136 line= });
tail j=4137 line=
tail j=4138 line=// after the draggable is droped, hides it with a hide() effect
tail j=4139 line= $('#drop2').droppable({
tail j=4140 line= drop: function(event, ui) {
tail j=4141 line= ui.draggable.hide(1000);
tail j=4142 line= }
tail j=4143 line= });
tail j=4144 line=
tail j=4145 line=// when the "#sw" element (inside the "#drop") is clicked
tail j=4146 line=// show the items with class "drg", contained in "#drag"
tail j=4147 line=// $('#drag .drg').slideDown(1000);
tail j=4148 line= $('#drop #sw').click(function(){
tail j=4149 line= var url = "/ko_center/ko_center.php?q=jqui/dragdrop1/"
tail j=4150 line= $(location).attr('href',url);
tail j=4151 line= });
tail j=4152 line= });
tail j=4153 line= </script id="script_document_ready" >
tail j=4154 line=
tail j=4155 line=
tail j=4156 line=
tail j=4157 line= <script id="script_load_liks" >
tail j=4158 line= var svc_links = new Array();
tail j=4159 line= var ko_links = new Array();
tail j=4160 line= var us_links = new Array();
tail j=4161 line= var u_links = new Array();
tail j=4162 line= var now_links = new Array();
tail j=4163 line= var srv_links = new Array();
tail j=4164 line= var kov_links = new Array();
tail j=4165 line= function load_svc_links() {
tail j=4166 line= var j=0;
tail j=4167 line= svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
tail j=4168 line= svc_links[j++]="/index_bb.html|/imgs/links/index_bb.png|index_bb|/imgs/btn/kob.png";
tail j=4169 line= svc_links[j++]="/index_bp.html|/imgs/links/index_bp.png|index_bb|/imgs/btn/kob.png";
tail j=4170 line= svc_links[j++]="/index_dd.html|/imgs/links/index_dd.png|index_dd|/imgs/btn/kob.png";
tail j=4171 line= svc_links[j++]="/index_dl.html|/imgs/links/index_dl.png|index_dl|/imgs/btn/kob.png";
tail j=4172 line= svc_links[j++]="/index_dp.html|/imgs/links/index_dp.png|index_dp|/imgs/btn/kob.png";
tail j=4173 line= svc_links[j++]="/index_fl.html|/imgs/links/index_fl.png|index_fl|/imgs/btn/kob.png";
tail j=4174 line= svc_links[j++]="/index_jg.html|/imgs/links/index_jg.png|index_jg|/imgs/btn/kob.png";
tail j=4175 line= svc_links[j++]="/index_pn.html|/imgs/links/index_pn.png|index_pn|/imgs/btn/kob.png";
tail j=4176 line= svc_links[j++]="/index_sc.html|/imgs/links/index_sc.png|index_sc|/imgs/btn/kob.png";
tail j=4177 line= svc_links[j++]="/index_sl.html|/imgs/links/index_sl.png|index_sl|/imgs/btn/kob.png";
tail j=4178 line= svc_links[j++]="/index_tl.html|/imgs/links/index_tl.png|index_tl|/imgs/btn/kob.png";
tail j=4179 line= svc_links[j++]="/index_tm.html|/imgs/links/index_tm.png|index_tm|/imgs/btn/kob.png";
tail j=4180 line= svc_links[j++]="/index_us.html|/imgs/links/index_us.png|index_us|/imgs/btn/kob.png";
tail j=4181 line= svc_links[j++]="/index_wc.html|/imgs/links/index_wc.png|index_wc|/imgs/btn/kob.png";
tail j=4182 line= svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
tail j=4183 line= svc_links[j++]="/index_zm.html|/imgs/links/index_zm.png|index_zm|/imgs/btn/kob.png";
tail j=4184 line= return( svc_links );
tail j=4185 line= }
tail j=4186 line=
tail j=4187 line= function load_srv_links() {
tail j=4188 line= srv_links[0]="ko0.us/index.html|/imgs/btn/koeyeb.png|ko0us|/imgs/btn/kob.png";
tail j=4189 line= srv_links[1]="ko1.us/index.html|/imgs/btn/koeye.png|ko1us|/imgs/btn/kop1234.png";
tail j=4190 line= srv_links[2]="ko2.us/index.html|/imgs/btn/koeyew.png|ko2us|/imgs/btn/kow.png";
tail j=4191 line= srv_links[3]="konet.org/index.html|/imgs/btn/ko.png|konet-org|/imgs/btn/kib.png";
tail j=4192 line= srv_links[4]="iperms.com/index.html|/imgs/links/iperms.png|iperms-com|/imgs/btn/kop34.png";
tail j=4193 line= srv_links[5]="kassil.com/index.html|/imgs/links/kassil.png|kassil-com|/imgs/btn/kop12.png";
tail j=4194 line= return( srv_links );
tail j=4195 line= }
tail j=4196 line=
tail j=4197 line= function load_ko_links() {
tail j=4198 line= var j=0;
tail j=4199 line= ko_links[j++]="/jkwii/blackboard.html|/imgs/links/blackboard.png|blackboard|/imgs/btn/koeye.png";
tail j=4200 line= ko_links[j++]="/jkwii/js/threejs/examples/index.html|/imgs/links/index_js3d.png|index_js3d|/imgs/btn/koeye.png";
tail j=4201 line= ko_links[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
tail j=4202 line= ko_links[j++]="/jkwii/js/gojs/index.html|/imgs/links/index_jsgo.png|index_jsgo|/imgs/btn/koeye.png";
tail j=4203 line= ko_links[j++]="/index_jsdk.html|/imgs/links/index_jsdk.png|index_jsdk|/imgs/btn/koeye.png";
tail j=4204 line= ko_links[j++]="/jkwii/koh5_globe/koh5_globe.html|/imgs/links/koh5_globe.png|koh5_globe|/imgs/btn/koeye.png";
tail j=4205 line= ko_links[j++]="/jkwii/aud/keybd/index.html|/imgs/links/index_jskb.png|index_jskb|/imgs/btn/koeye.png";
tail j=4206 line= ko_links[j++]="/svc/kokbdm/index.html|/imgs/links/index_jskb-dm.png|index_jskb-dm|/imgs/btn/koeye.png";
tail j=4207 line= ko_links[j++]="/svc/kokbdms/index.html|/imgs/links/index_jskb-dms.png|index_jskb-dms|/imgs/btn/koeye.png";
tail j=4208 line= ko_links[j++]="/piano.html|/imgs/links/index_piano.png|index_piano|/imgs/btn/koeye.png";
tail j=4209 line= ko_links[j++]="/jkwii/aud/piano_uri/koh5_piano_uri.html|/imgs/links/index_jskb-uri.png|index_jskb_uri|/imgs/btn/koeye.png";
tail j=4210 line= ko_links[j++]="/ko/svc/js/stemkoskijs/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
tail j=4211 line= ko_links[j++]="/ko/svc/aud/mrcoles/koh5_mrcoles.html|/imgs/links/mrcoles.png|mrcoles|/imgs/btn/koeye.png";
tail j=4212 line= ko_links[j++]="http://effectgames.com/demos/canvascycle/|/imgs/links/index_effectgames.png|index_effectgames|/imgs/btn/koeye.png";
tail j=4213 line= ko_links[j++]="https://www.leshylabs.com/apps/sfMaker/|/imgs/links/index_sfmaker.png|index_sfmaker|/imgs/btn/koeye.png";
tail j=4214 line= ko_links[j++]="https://dragongoserver.net/|/imgs/links/index_dgs.png|index_dgs|/imgs/btn/koeye.png";
tail j=4215 line= ko_links[j++]="/ko_center/ko_center.php|/imgs/links/ko_center.png|ko_center|/imgs/btn/kob.png";
tail j=4216 line= ko_links[j++]="/ko_saic/ko_saic.php|/imgs/links/ko_saic.png|ko_saic|/imgs/btn/kob.png";
tail j=4217 line= ko_links[j++]="/index_kt.html|/imgs/links/index_kt.png|index_kt|/imgs/btn/kob.png";
tail j=4218 line= ko_links[j++]="/index_jtf.html|/imgs/links/index_jtf.png|index_jtf|/imgs/btn/kob.png";
tail j=4219 line= ko_links[j++]="/index2big.html|/imgs/links/index2big.png|index2big|/imgs/btn/kob.png";
tail j=4220 line= ko_links[j++]="/index2big.htm|/imgs/links/index2big_noel.png|index2big_noel|/imgs/btn/kob.png";
tail j=4221 line= ko_links[j++]="/jkwii/whiteboard.html|/imgs/links/whiteboard.png|whiteboard|/imgs/btn/koeye.png";
tail j=4222 line= return( ko_links );
tail j=4223 line= }
tail j=4224 line=
tail j=4225 line=
tail j=4226 line=
tail j=4227 line= function load_us_links() {
tail j=4228 line= var j=0;
tail j=4229 line=// https://www.yelp.com/biz_photos/rechtin-family-and-cosmetic-dental-care-st-louis-2?adjust_creative=dWJMtmYxpd5N5yoyzSuhtA&utm_campaign=yelp_api&utm_medium=api_v2_business&utm_source=dWJMtmYxpd5N5yoyzSuhtA|
tail j=4230 line= us_links[j++]="/us/med/kov_rechtin.html|/imgs/us/med_rechtin.png|med_rechtin|/imgs/btn/koeye.png|med";
tail j=4231 line= us_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4232 line= us_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4233 line=
tail j=4234 line= us_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
tail j=4235 line= us_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
tail j=4236 line= us_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
tail j=4237 line= us_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
tail j=4238 line= us_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
tail j=4239 line= us_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
tail j=4240 line= us_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
tail j=4241 line= us_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
tail j=4242 line= us_links[j++]="http://www.fdazol.com/|/imgs/us/law_azol.png|law_azol_f|/imgs/btn/koeye.png|law";
tail j=4243 line=
tail j=4244 line= us_links[j++]="https://jmhalumni.com|/imgs/us/jmhalumni.png|ed_jmhalumni|/imgs/btn/koeye.png|edu";
tail j=4245 line= us_links[j++]="https://johnmarshallhighschool.com|/imgs/us/johnmarshallhighschool.png|ed_johnmarshallhighschool|/imgs/btn/koeye.png|edu";
tail j=4246 line= us_links[j++]="https://www.greatschools.org/kentucky/brandenburg/1993-Brandenburg-High-School/|/imgs/us/brandenburg_highschool.png|ed_brandenburg-highschool|/imgs/btn/koeye.png|edu";
tail j=4247 line= us_links[j++]="https://www.hazelwoodschools.org/Page/3143|/imgs/us/hazelwood_schools.png|ed_hazelwood_schools|/imgs/btn/koeye.png|edu";
tail j=4248 line= us_links[j++]="https://bw.edu|/imgs/us/bw.png|ed_bw|/imgs/btn/koeye.png|edu";
tail j=4249 line=
tail j=4250 line= us_links[j++]="http://oldtowndonuts.com|/imgs/us/oldtowndonuts.png|food_oldtowndonuts|/imgs/btn/koeye.png|food";
tail j=4251 line= us_links[j++]="http://farkaspastries.com|/imgs/us/farkaspastries.png|food_farkaspastries|/imgs/btn/koeye.png|food";
tail j=4252 line= us_links[j++]="https://www.facebook.com/HansaImportHouse|/imgs/us/hansaimporthouse.png|food_hansaimporthouse|/imgs/btn/koeye.png|food";
tail j=4253 line= us_links[j++]="http://havanagrillco.com|/imgs/us/havanagrillco.png|food_havanagrillco|/imgs/btn/koeye.png|food";
tail j=4254 line= us_links[j++]="http://spiros-restaurant.com|/imgs/us/spiros_restaurant.png|food_spiros_restaurant|/imgs/btn/koeye.png|food";
tail j=4255 line= us_links[j++]="https://www.opentable.com/jake-and-tellys-greek-taverna?page=1|/imgs/us/food_jake_tellys.png|food_jake_tellys|/imgs/btn/koeye.png|food";
tail j=4256 line= us_links[j++]="http://edelweissrest.com|/imgs/us/edelweissrest.png|food_edelweissrest|/imgs/btn/koeye.png|food";
tail j=4257 line= us_links[j++]="http://bierwerks.com|/imgs/us/food_bierwerks.png|food_bierwerks|/imgs/btn/koeye.png|food";
tail j=4258 line= us_links[j++]="http://www.savellispizzapastasubs.com/|/imgs/us/food_savellispizza.png|food_savellispizza|/imgs/bmtn/koeye.png|food";
tail j=4259 line= us_links[j++]="https://www.facebook.com/woohoogreekfood2/|/imgs/us/woohoogreekfood2.png|food_woohoogreekfood2|/imgs/btn/koeye.png|food";
tail j=4260 line=
tail j=4261 line= us_links[j++]="https://bdo.com/about/us-locations/bdo-st-louis|/imgs/us/bdo-stl.png|acct_bdo-stl|/imgs/btn/koeye.png|acct";
tail j=4262 line= us_links[j++]="https://bdo.com/about/us-locations/bdo-cleveland-office|/imgs/us/bdo-cle.png|acct_bdo-cle|/imgs/btn/koeye.png|acct";
tail j=4263 line= us_links[j++]="http://www.gatewayloan.com/|/imgs/us/gateway_mortgage.png|gateway_mortgage|/imgs/btn/koeye.png|acct";
tail j=4264 line= us_links[j++]="https://chesonsulting.com|/imgs/us/checonsulting.png|biz_checonsulting|/imgs/btn/koeye.png|biz";
tail j=4265 line= us_links[j++]="http://saic.com|/imgs/us/saic.png|saic|/imgs/btn/koeye.png|biz";
tail j=4266 line= us_links[j++]="http://leidos.com|/imgs/us/leidos.png|leidos|/imgs/btn/koeye.png|biz";
tail j=4267 line=
tail j=4268 line=
tail j=4269 line= us_links[j++]="http://ko2.us/index_focus.com|/imgs/us/focus_solutions.png|focus_solutions|/imgs/btn/koeye.png|biz";
tail j=4270 line= us_links[j++]="http://www.finduslocal.com/hardware-stores/kentucky/brandenburg/allens-s-t-hardware-inc|/imgs/us/biz_allens_hardware.png|biz_allens_hardware|/imgs/btn/koeye.png|biz";
tail j=4271 line= us_links[j++]="http://growwarehouse.com|/imgs/us/grow_warehouse.png|grow_warehouse|/imgs/btn/koeye.png|biz";
tail j=4272 line= us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
tail j=4273 line= us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
tail j=4274 line= us_links[j++]="http://www.savellidanceandmartialarts.com/?load=html|/imgs/us/savelli_dance_martialarts.png|savelli_dance_martialarts|/imgs/btn/koeye.png|phy";
tail j=4275 line= us_links[j++]="http://myfusiondance.com/?load=html|/imgs/us/fusion_dance.png|fusion_dance|/imgs/btn/koeye.png|phy";
tail j=4276 line= us_links[j++]="http://www.superseriesbaseball.com/|/imgs/us/super_series_baseball.png|super_series_baseball|/imgs/btn/koeye.png|phy";
tail j=4277 line=
tail j=4278 line= us_links[j++]="https://ftknox.afceachapters.org/|/imgs/us/afcea_knox.png|afcea_knox|/imgs/btn/koeye.png|org";
tail j=4279 line= us_links[j++]="https://scott.afceachapters.org/|/imgs/us/afcea_scott.png|afcea_scott|/imgs/btn/koeye.png|org";
tail j=4280 line= us_links[j++]="https://www.ble-t.org/|/imgs/us/ble.png|ble|/imgs/btn/koeye.png|org";
tail j=4281 line= us_links[j++]="http://www.doevalley.org/|/imgs/us/doe_valley.png|doe_valley|/imgs/btn/koeye.png|org";
tail j=4282 line=
tail j=4283 line= us_links[j++]="http://www.chapelofthecross.org/|/imgs/us/chapel_of_the_cross.png|chapel_of_the_cross|/imgs/btn/koeye.png|rel";
tail j=4284 line= us_links[j++]="https://www.lds.org/temples/details/st.-louis-missouri-temple|/imgs/us/lds_stl.png|lds_stl|/imgs/btn/koeye.png|rel";
tail j=4285 line= us_links[j++]="https://www.bethanyenglish.org/|/imgs/us/bethany_english_lutheran.png|bethany_english_lutheran|/imgs/btn/koeye.png|rel";
tail j=4286 line= us_links[j++]="https://www.meadecountymessenger.com/|/imgs/us/meade_county_messenger.png|meade_county_messenger|/imgs/btn/koeye.png|media";
tail j=4287 line= us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
tail j=4288 line= us_links[j++]="https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2088|/imgs/us/mars_jpl_nasa.png|mars_jpl_nasa|/imgs/btn/koeye.png|sci";
tail j=4289 line= us_links[j++]="https://mars.nasa.gov/mer/gallery/all/opportunity.html|/imgs/us/mars_nasa_gov.png|mars_nasa_gov|/imgs/btn/koeye.png|sci";
tail j=4290 line= us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
tail j=4291 line= return( us_links );
tail j=4292 line= }
tail j=4293 line=
tail j=4294 line=
tail j=4295 line=
tail j=4296 line= function load_u_links() {
tail j=4297 line= var j=0;
tail j=4298 line= u_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4299 line= u_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4300 line=
tail j=4301 line= u_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
tail j=4302 line= u_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
tail j=4303 line= u_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
tail j=4304 line= u_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
tail j=4305 line= u_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
tail j=4306 line= u_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
tail j=4307 line= u_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
tail j=4308 line= u_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
tail j=4309 line= return( u_links );
tail j=4310 line= }
tail j=4311 line=
tail j=4312 line=
tail j=4313 line=
tail j=4314 line= function load_now_links() {
tail j=4315 line= var j=0;
tail j=4316 line= now_links[j++]="http://index_party.html|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
tail j=4317 line= now_links[j++]="http://index_jtfdc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4318 line= now_links[j++]="http://index_jtfinc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4319 line= now_links[j++]="http://index_stlc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4320 line= now_links[j++]="http://index_jtfdcr.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4321 line= now_links[j++]="http://index_byrdpucker.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
tail j=4322 line= return( now_links );
tail j=4323 line= }
tail j=4324 line=
tail j=4325 line=
tail j=4326 line= function show_svc_links(mode) {
tail j=4327 line= svc_links = load_svc_links();
tail j=4328 line= htmout_svc_links = "";
tail j=4329 line= htmout_svc_linkz = "";
tail j=4330 line= for (i = 0; i < svc_links.length; i++) {
tail j=4331 line= my_btnimg = "/imgs/btn/kib.png";
tail j=4332 line= my_href = svc_links[i].split("|")[0];
tail j=4333 line= my_popimg = svc_links[i].split("|")[1];
tail j=4334 line= my_alt = svc_links[i].split("|")[2];
tail j=4335 line=
tail j=4336 line=// htmout_svc_linkz += '<div class="drag" name="'+my_alt+'" >\n';
tail j=4337 line= htmout_svc_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4338 line= htmout_svc_linkz += '<img id="drg" src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4339 line=// htmout_svc_linkz += '</div >';
tail j=4340 line=
tail j=4341 line=// htmout_svc_links += '<div class="drag" name="'+my_alt+'" >\n';
tail j=4342 line= htmout_svc_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4343 line= htmout_svc_links += '<img class="drag" id="drg" src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4344 line= htmout_svc_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4345 line=// htmout_svc_links += '</div >';
tail j=4346 line= }
tail j=4347 line= if( mode === 'pop' ) {
tail j=4348 line= htmout_svc_links += "<br><br>\n";
tail j=4349 line= var div_svc_links = document.getElementById('div_svc_links');
tail j=4350 line= div_svc_links.insertAdjacentHTML('beforeend', htmout_svc_links);
tail j=4351 line= return( htmout_svc_links );
tail j=4352 line= }
tail j=4353 line=
tail j=4354 line= htmout_svc_linkz += "<br><br>\n";
tail j=4355 line= var div_svc_linkz = document.getElementById('div_svc_linkz');
tail j=4356 line= div_svc_linkz.insertAdjacentHTML('beforeend', htmout_svc_linkz);
tail j=4357 line= return( htmout_svc_linkz );
tail j=4358 line= }
tail j=4359 line=
tail j=4360 line= function show_ko_links(mode) {
tail j=4361 line= ko_links = load_ko_links();
tail j=4362 line= htmout_ko_links = "";
tail j=4363 line= htmout_ko_linkz = "";
tail j=4364 line= for (i = 0; i < ko_links.length; i++) {
tail j=4365 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4366 line= my_href = ko_links[i].split("|")[0];
tail j=4367 line= my_popimg = ko_links[i].split("|")[1];
tail j=4368 line= my_alt = ko_links[i].split("|")[2];
tail j=4369 line=
tail j=4370 line= htmout_ko_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4371 line= htmout_ko_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4372 line=
tail j=4373 line= htmout_ko_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4374 line= htmout_ko_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4375 line= htmout_ko_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4376 line= }
tail j=4377 line=
tail j=4378 line= if( mode === 'pop' ) {
tail j=4379 line= htmout_ko_links += "<br><br>";
tail j=4380 line= var div_ko_links = document.getElementById('div_ko_links');
tail j=4381 line= div_ko_links.insertAdjacentHTML('beforeend', htmout_ko_links);
tail j=4382 line= return( htmout_ko_links );
tail j=4383 line= }
tail j=4384 line=
tail j=4385 line= htmout_ko_linkz += "<br><br>";
tail j=4386 line= var div_ko_linkz = document.getElementById('div_ko_linkz');
tail j=4387 line= div_ko_linkz.insertAdjacentHTML('beforeend', htmout_ko_linkz);
tail j=4388 line= return( htmout_ko_linkz );
tail j=4389 line= }
tail j=4390 line=
tail j=4391 line=
tail j=4392 line= function show_us_links(mode) {
tail j=4393 line= us_links = load_us_links();
tail j=4394 line= htmout_us_links = "";
tail j=4395 line= htmout_us_linkz = "";
tail j=4396 line= for (i = 0; i < us_links.length; i++) {
tail j=4397 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4398 line= my_href = us_links[i].split("|")[0];
tail j=4399 line= my_popimg = us_links[i].split("|")[1];
tail j=4400 line= my_alt = us_links[i].split("|")[2];
tail j=4401 line=
tail j=4402 line= htmout_us_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4403 line= htmout_us_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4404 line=
tail j=4405 line= htmout_us_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4406 line= htmout_us_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4407 line= htmout_us_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4408 line= }
tail j=4409 line=
tail j=4410 line= if( mode === 'pop' ) {
tail j=4411 line= htmout_us_links += "<br><br>";
tail j=4412 line= var div_us_links = document.getElementById('div_us_links');
tail j=4413 line= div_us_links.insertAdjacentHTML('beforeend', htmout_us_links);
tail j=4414 line= return( htmout_us_links );
tail j=4415 line= }
tail j=4416 line=
tail j=4417 line= htmout_us_linkz += "<br><br>";
tail j=4418 line= var div_us_linkz = document.getElementById('div_us_linkz');
tail j=4419 line= div_us_linkz.insertAdjacentHTML('beforeend', htmout_us_linkz);
tail j=4420 line= return( htmout_us_linkz );
tail j=4421 line= }
tail j=4422 line=
tail j=4423 line=
tail j=4424 line=
tail j=4425 line=
tail j=4426 line=
tail j=4427 line=
tail j=4428 line=
tail j=4429 line= function show_u_links(mode) {
tail j=4430 line= u_links = load_u_links();
tail j=4431 line= htmout_u_links = "";
tail j=4432 line= htmout_u_linkz = "";
tail j=4433 line= for (i = 0; i < u_links.length; i++) {
tail j=4434 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4435 line= my_href = u_links[i].split("|")[0];
tail j=4436 line= my_popimg = u_links[i].split("|")[1];
tail j=4437 line= my_alt = u_links[i].split("|")[2];
tail j=4438 line=
tail j=4439 line= htmout_u_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4440 line= htmout_u_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4441 line=
tail j=4442 line= htmout_u_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4443 line= htmout_u_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4444 line= htmout_u_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4445 line= }
tail j=4446 line=
tail j=4447 line= if( mode === 'pop' ) {
tail j=4448 line= htmout_u_links += "<br><br>";
tail j=4449 line= var div_u_links = document.getElementById('div_u_links');
tail j=4450 line= div_u_links.insertAdjacentHTML('beforeend', htmout_u_links);
tail j=4451 line= return( htmout_u_links );
tail j=4452 line= }
tail j=4453 line=
tail j=4454 line= htmout_u_linkz += "<br><br>";
tail j=4455 line= var div_u_linkz = document.getElementById('div_u_linkz');
tail j=4456 line= div_u_linkz.insertAdjacentHTML('beforeend', htmout_u_linkz);
tail j=4457 line= return( htmout_u_linkz );
tail j=4458 line= }
tail j=4459 line=
tail j=4460 line=
tail j=4461 line=
tail j=4462 line= function show_now_links(mode) {
tail j=4463 line= now_links = load_now_links();
tail j=4464 line= htmout_now_links = "";
tail j=4465 line= htmout_now_linkz = "";
tail j=4466 line= for (i = 0; i < now_links.length; i++) {
tail j=4467 line= my_btnimg = "/imgs/btn/koeye.png";
tail j=4468 line= my_href = now_links[i].split("|")[0];
tail j=4469 line= my_popimg = now_links[i].split("|")[1];
tail j=4470 line= my_alt = now_links[i].split("|")[2];
tail j=4471 line=
tail j=4472 line= htmout_now_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4473 line= htmout_now_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4474 line=
tail j=4475 line= htmout_now_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4476 line= htmout_now_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4477 line= htmout_now_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4478 line= }
tail j=4479 line=
tail j=4480 line= if( mode === 'pop' ) {
tail j=4481 line= htmout_now_links += "<br><br>";
tail j=4482 line= var div_now_links = document.getElementById('div_now_links');
tail j=4483 line= div_now_links.insertAdjacentHTML('beforeend', htmout_now_links);
tail j=4484 line= return( htmout_now_links );
tail j=4485 line= }
tail j=4486 line=
tail j=4487 line= htmout_now_linkz += "<br><br>";
tail j=4488 line= var div_now_linkz = document.getElementById('div_now_linkz');
tail j=4489 line= div_now_linkz.insertAdjacentHTML('beforeend', htmout_now_linkz);
tail j=4490 line= return( htmout_now_linkz );
tail j=4491 line= }
tail j=4492 line=
tail j=4493 line= function show_srv_links(mode) {
tail j=4494 line= srv_links = load_srv_links();
tail j=4495 line= htmout_srv_links = "";
tail j=4496 line= htmout_srv_linkz = "";
tail j=4497 line= for (i = 0; i < srv_links.length; i++) {
tail j=4498 line= my_btnimg = "/imgs/btn/kiw.png";
tail j=4499 line= my_href = srv_links[i].split("|")[0];
tail j=4500 line= my_popimg = srv_links[i].split("|")[1];
tail j=4501 line= my_alt = srv_links[i].split("|")[2];
tail j=4502 line=
tail j=4503 line= htmout_srv_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
tail j=4504 line= htmout_srv_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
tail j=4505 line=
tail j=4506 line= htmout_srv_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
tail j=4507 line= htmout_srv_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
tail j=4508 line= htmout_srv_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
tail j=4509 line= }
tail j=4510 line= if( mode === 'pop' ) {
tail j=4511 line= htmout_srv_links += "<br><br>\n"
tail j=4512 line= var div_srv_links = document.getElementById('div_srv_links');
tail j=4513 line= div_srv_links.insertAdjacentHTML('beforeend', htmout_srv_links);
tail j=4514 line= return( htmout_srv_links );
tail j=4515 line= }
tail j=4516 line=
tail j=4517 line= htmout_srv_linkz += "<br><br>\n"
tail j=4518 line= var div_srv_linkz = document.getElementById('div_srv_linkz');
tail j=4519 line= div_srv_linkz.insertAdjacentHTML('beforeend', htmout_srv_linkz);
tail j=4520 line= return( htmout_srv_linkz );
tail j=4521 line= }
tail j=4522 line=
tail j=4523 line=// document.write( htmout_svc_links );
tail j=4524 line=// document.write( htmout_ko_links );
tail j=4525 line=// document.write( htmout_srv_links );
tail j=4526 line=
tail j=4527 line=// var div_ko_links = document.getElementById("div_ko_links");
tail j=4528 line=// var div_ko_links_orig = div_ko_links.innerHTML;
tail j=4529 line=// alert( "BUGS_500 div_ko_links_orig="+div_ko_links_orig );
tail j=4530 line=
tail j=4531 line=// div_ko_links.innerHTML = "";
tail j=4532 line=// div_ko_links.appendChild( htmout_ko_links);
tail j=4533 line=
tail j=4534 line=
tail j=4535 line=// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
tail j=4536 line=//
tail j=4537 line=// getElementById("foo").insertAdjacentHTML
tail j=4538 line=// <!-- beforebegin / before -->
tail j=4539 line=// <p>
tail j=4540 line=// <!-- afterbegin / prepend -->
tail j=4541 line=// foo
tail j=4542 line=// <!-- beforeend / append -->
tail j=4543 line=// </p>
tail j=4544 line=// <!-- afterend / after-->
tail j=4545 line=//
tail j=4546 line=// document.getElementById('foo').insertAdjacentHTML("beforebegin", "<hr>")
tail j=4547 line=// $('#foo').before("<hr>")
tail j=4548 line=// document.getElementById('foo').insertAdjacentHTML("afterend", "<hr>")
tail j=4549 line=// $('#foo').append("<hr>")
tail j=4550 line=// document.getElementById('foo').insertAdjacentHTML("beforeend", "<hr>")
tail j=4551 line=// $('#foo').append("<hr>")
tail j=4552 line=// document.getElementById('foo').insertAdjacentHTML("afterbegin", "<hr>")
tail j=4553 line=// $('#foo').prepend("<hr>")
tail j=4554 line=//
tail j=4555 line=// var btn = document.getElementById('btn'); // The button itself with an ID of 'btn'
tail j=4556 line=// var newButton = '<button>New button</button>'; // New button to be inserted
tail j=4557 line=// btn.insertAdjacentHTML('afterend', newButton);
tail j=4558 line=//
tail j=4559 line=// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
tail j=4560 line= function show_all_links(mode) {
tail j=4561 line= show_svc_links(mode);
tail j=4562 line= show_ko_links(mode);
tail j=4563 line= show_us_links(mode);
tail j=4564 line= show_u_links(mode);
tail j=4565 line= show_now_links(mode);
tail j=4566 line= show_srv_links(mode);
tail j=4567 line= }
tail j=4568 line=
tail j=4569 line= </script id="script_load_liks" >
tail j=4570 line=
tail j=4571 line= <div id="div_links" >
tail j=4572 line= <hr color=red>
tail j=4573 line= <div id="div_svc_links" > </div>
tail j=4574 line= <hr color=red>
tail j=4575 line=
tail j=4576 line= <hr color=white>
tail j=4577 line= <div id="div_ko_links" > </div>
tail j=4578 line= <hr color=white>
tail j=4579 line=
tail j=4580 line= <hr color=white>
tail j=4581 line= <div id="div_us_links" > </div>
tail j=4582 line= <hr color=white>
tail j=4583 line=
tail j=4584 line= <hr color=white>
tail j=4585 line= <div id="div_u_links" > </div>
tail j=4586 line= <hr color=white>
tail j=4587 line=
tail j=4588 line= <hr color=white>
tail j=4589 line= <div id="div_now_links" > </div>
tail j=4590 line= <hr color=white>
tail j=4591 line=
tail j=4592 line= <hr color=blue>
tail j=4593 line= <div id="div_srv_links" > </div>
tail j=4594 line= <hr color=blue>
tail j=4595 line= </div id="div_links" >
tail j=4596 line=
tail j=4597 line= <div id="div_linkz" >
tail j=4598 line= <hr color=red>
tail j=4599 line= <div id="div_svc_linkz" > </div>
tail j=4600 line= <hr color=red>
tail j=4601 line=
tail j=4602 line= <hr color=black>
tail j=4603 line= <div id="div_ko_linkz" > </div>
tail j=4604 line= <hr color=black>
tail j=4605 line=
tail j=4606 line= <hr color=black>
tail j=4607 line= <div id="div_us_linkz" > </div>
tail j=4608 line= <hr color=black>
tail j=4609 line=
tail j=4610 line= <hr color=black>
tail j=4611 line= <div id="div_u_linkz" > </div>
tail j=4612 line= <hr color=black>
tail j=4613 line=
tail j=4614 line= <hr color=black>
tail j=4615 line= <div id="div_now_linkz" > </div>
tail j=4616 line= <hr color=black>
tail j=4617 line=
tail j=4618 line= <hr color=blue>
tail j=4619 line= <div id="div_srv_linkz" > </div>
tail j=4620 line= <hr color=blue>
tail j=4621 line= </div id="div_linkz" >
tail j=4622 line=
tail j=4623 line= <div id="div_cfaa" class=ko>
tail j=4624 line=<!-- -->
tail j=4625 line=
tail j=4626 line= <script id="script_cfaa">
tail j=4627 line= var text_cfaa =
tail j=4628 line=`
tail j=4629 line=pqpqpqpqpqpqpqpqpqpq Warning pqpqpqpqpqpqpqpqpqpq<br>
tail j=4630 line=<br>
tail j=4631 line=This site may be protected under the
tail j=4632 line=<br>
tail j=4633 line=<br>
tail j=4634 line=<b>CFAA</b>
tail j=4635 line=<br>
tail j=4636 line=Computer Fraud and Abuse Act
tail j=4637 line=<br>
tail j=4638 line=<br>
tail j=4639 line=your attemped access has been logged
tail j=4640 line=<br>
tail j=4641 line=repeated attemps by unauthorized guests will be reported
tail j=4642 line=<br>
tail j=4643 line=<br>
tail j=4644 line=By continuing You are acknowledging
tail j=4645 line=<br>
tail j=4646 line=you are fully authorized and
tail j=4647 line=<br>
tail j=4648 line=understand the responsibilites to access the content on the site
tail j=4649 line=<br>
tail j=4650 line=<br>
tail j=4651 line=This page must not be removed
tail j=4652 line=<br>
tail j=4653 line=bdbdbdbdbdbdbdbdbdbd Warning bdbdbdbdbdbdbdbdbdbd
tail j=4654 line=<br>
tail j=4655 line=<br>
tail j=4656 line=unauthoriced users should
tail j=4657 line=<br>
tail j=4658 line=consider browsing elsewhere:
tail j=4659 line=
tail j=4660 line=
tail j=4661 line=<hr color=black>
tail j=4662 line=<hr color=ivory>
tail j=4663 line=<hr color=red>
tail j=4664 line=<hr color=blue>
tail j=4665 line=<hr color=ebony>
tail j=4666 line=<hr color=white>
tail j=4667 line=
tail j=4668 line=<a href=duckduckgo.com > <img src="ok.png" alt="duckduckgo" height=10 border=0></a>
tail j=4669 line=     
tail j=4670 line=<a href=bing.com > <img src="ok.png" alt="bing" height=10 border=0></a>
tail j=4671 line=     
tail j=4672 line=<a href=google.com > <img src="ok.png" alt="google" height=10 border=0></a>
tail j=4673 line=     
tail j=4674 line=<a href=yahoo.com > <img src="ok.png" alt="yahoo" height=10 border=0></a>
tail j=4675 line=     
tail j=4676 line= <a href=https://mars.jpl.nasa.gov/msl/multimedia/raw target=_blank>
tail j=4677 line= <img src="ok.png" border=0 height=10>
tail j=4678 line= </a>
tail j=4679 line=     
tail j=4680 line= <a href=http://youtube.com target=_blank>
tail j=4681 line= <img src="ok.png" border=0 height=10>
tail j=4682 line= </a>
tail j=4683 line= </div id="div_cfaa" class=ko>
tail j=4684 line=
tail j=4685 line=<hr color=white>
tail j=4686 line=<hr color=ebony>
tail j=4687 line=<hr color=blue>
tail j=4688 line=<hr color=red>
tail j=4689 line=<hr color=ivory>
tail j=4690 line=<hr color=black>
tail j=4691 line=
tail j=4692 line= <div id="div_warn2" class=ko>
tail j=4693 line= <p id=p_warn2 class=ko>
tail j=4694 line= <hr color=black>
tail j=4695 line= <hr color=white>
tail j=4696 line= <hr color=red>
tail j=4697 line= If you are seeing this page
tail j=4698 line= <br>
tail j=4699 line= you are probably unauthorized
tail j=4700 line= <br>
tail j=4701 line= you should <b>NOT</b> continue
tail j=4702 line= <br>
tail j=4703 line= accessing site content here may be
tail j=4704 line= <br>
tail j=4705 line= protected under <b>CFAA</b>
tail j=4706 line= <hr color=red>
tail j=4707 line= <hr color=white>
tail j=4708 line= <hr color=black>
tail j=4709 line= </p>
tail j=4710 line=
tail j=4711 line= authorized sites are available from bluehost
tail j=4712 line=
tail j=4713 line= <a href="https://www.bluehost.com/?utm_source=%28direct%29&utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype" target=_blank>
tail j=4714 line= <img src=/imgs/bh/bh_anim.gif height=30 border=0 alt=bluehost.com affiliate></a>
tail j=4715 line= <div id=kobh_offer class=ko>
tail j=4716 line= bluehost offers
tail j=4717 line= 50 gb space
tail j=4718 line= 999 gb bandwidth
tail j=4719 line=
tail j=4720 line= 6 domains on 1 account
tail j=4721 line= and more for only $6.95/month
tail j=4722 line= </div>
tail j=4723 line= </div id="div_warn2" class=ko>
tail j=4724 line=
tail j=4725 line=
tail j=4726 line= <script id="script_url">
tail j=4727 line= var url = document.createElement("a");
tail j=4728 line= url.href=location.href
tail j=4729 line= var output = "output"
tail j=4730 line= url.pathname = url.pathname.replace(/(^\/?)/,"/");
tail j=4731 line=// alert(location.href)
tail j=4732 line=// alert(url.protocol)
tail j=4733 line=// alert(url.hostname)
tail j=4734 line=// alert(url.pathname)
tail j=4735 line=// alert(url.search)
tail j=4736 line=// alert(url.hash)
tail j=4737 line=
tail j=4738 line= if( url.search == "" ) {document.write( text_cfaa );}
tail j=4739 line= if( url.search == "?q=cfaa" ) {document.write( text_cfaa ); }
tail j=4740 line= </script id="script_url">
tail j=4741 line= </div>
tail j=4742 line=
tail j=4743 line=
tail j=4744 line=
tail j=4745 line=<!--
tail j=4746 line= <iframe id="myframe" src="/svc/kokbdm/index.html" width="1000" height="500"
tail j=4747 line= frameborder="0" scrolling="yes"></iframe>
tail j=4748 line= -->
tail j=4749 line=
tail j=4750 line= <hr color=red><hr color=black><hr color=white>
tail j=4751 line= <button type="button" onclick="show_all_links('pop')">show_all_links</button>
tail j=4752 line=<!-- <button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
tail j=4753 line= <hr color=red><hr color=white><hr color=blue>
tail j=4754 line= <button type="button" onclick="show_svc_links('pop')">show_svc_links</button>
tail j=4755 line= <button type="button" onclick="show_ko_links('pop')">show_ko_links</button>
tail j=4756 line= <button type="button" onclick="show_us_links('pop')">show_us_links</button>
tail j=4757 line= <button type="button" onclick="show_u_links('pop')">show_u_links</button>
tail j=4758 line= <button type="button" onclick="show_now_links('pop')">show_now_links</button>
tail j=4759 line= <button type="button" onclick="show_srv_links('pop')">show_srv_links</button>
tail j=4760 line= <hr color=blue><hr color=white><hr color=black>
tail j=4761 line=
tail j=4762 line=<!--
tail j=4763 line= <img src="/imgs/btn/kib.png" height="50" size="150" alt="koeye" onclick="show_svc_links()">
tail j=4764 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_ko_links()">
tail j=4765 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_us_links()">
tail j=4766 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_u_links()">
tail j=4767 line= <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_now_links()">
tail j=4768 line= <img src="/imgs/btn/kiw.png" height="50" size="150" alt="koeyew" onclick="show_srv_links()">
tail j=4769 line= -->
tail j=4770 line=
tail j=4771 line= <div id="div_kobuttons">
tail j=4772 line= <a href=# class="popover" onclick="show_svc_links();">
tail j=4773 line= <img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" >
tail j=4774 line= <span><img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" ></span>
tail j=4775 line= </a>
tail j=4776 line=
tail j=4777 line= <a href=# class="popover" onclick="show_ko_links();">
tail j=4778 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4779 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4780 line= </a>
tail j=4781 line=
tail j=4782 line= <a href=# class="popover" onclick="show_us_links();">
tail j=4783 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4784 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4785 line= </a>
tail j=4786 line=
tail j=4787 line= <a href=# class="popover" onclick="show_u_links();">
tail j=4788 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4789 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4790 line= </a>
tail j=4791 line=
tail j=4792 line= <a href=# class="popover" onclick="show_now_links();">
tail j=4793 line= <img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" >
tail j=4794 line= <span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
tail j=4795 line= </a>
tail j=4796 line=
tail j=4797 line= <a href=# class="popover" onclick="show_srv_links();">
tail j=4798 line= <img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" >
tail j=4799 line= <span><img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" ></span>
tail j=4800 line= </a>
tail j=4801 line= </div id="div_kobuttons">
tail j=4802 line=
tail j=4803 line= <hr color=blue><hr color=white><hr color=red>
tail j=4804 line=
tail j=4805 line=<!--
tail j=4806 line= <div id="div_drop">
tail j=4807 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=4808 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=4809 line= <img height=200 width=300
tail j=4810 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=4811 line= </a>
tail j=4812 line= <div id="div_drop">
tail j=4813 line= -->
tail j=4814 line= <hr color=red>
tail j=4815 line= <hr color=white>
tail j=4816 line= <hr color=blue>
tail j=4817 line=
tail j=4818 line= <div id="div_drag" >
tail j=4819 line= <a class="popover" href="/?q=bigtn_drag1">
tail j=4820 line= <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
tail j=4821 line= <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
tail j=4822 line= </a>
tail j=4823 line= </div id="div_drag" >
tail j=4824 line=
tail j=4825 line=
tail j=4826 line=
tail j=4827 line= <div id="div_drop_zm">
tail j=4828 line= <span id="sw"><h3>droptop</h3></span>
tail j=4829 line= <a class="thumbnail" href=/index_vu.html?zmid=/zm/komap target=_blank>
tail j=4830 line= <img height=200 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 >
tail j=4831 line= <span><img height=400 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 ></span>
tail j=4832 line= </a>
tail j=4833 line= </div id="div_drop_zm">
tail j=4834 line=
tail j=4835 line=
tail j=4836 line= <div id="div_drag_main"> drag:<br />
tail j=4837 line= <img class="drg" src="/images/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=4838 line=
tail j=4839 line= <div class="drg"><h1>konet llc </h1>
tail j=4840 line= <pre>timesak skwii</pre>
tail j=4841 line= <img class="drg" src="/imgs/links/keyeb.png" alt="keyeb.png" width="50" >
tail j=4842 line= <img class="drg" src="/imgs/links/keyw.png" alt="keyew.png" width="50" >
tail j=4843 line= <pre>timesak skwii</pre>
tail j=4844 line= </div>
tail j=4845 line=
tail j=4846 line= <div class="drg"><h3>jtf29 </h3>
tail j=4847 line= <a href=/ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=4848 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=4849 line= </a>
tail j=4850 line= </div>
tail j=4851 line=
tail j=4852 line=
tail j=4853 line= <div class="drg"><h3>dogheads</h3>
tail j=4854 line= <div id="div_jtf_vid5">
tail j=4855 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=4856 line= <source src="/ko_jtf/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4857 line= </video>
tail j=4858 line= </div>
tail j=4859 line= </div>
tail j=4860 line=
tail j=4861 line= <div class="drg"><h3>jtfdc night court lights action 3720</h3>
tail j=4862 line= <div id="div_vid">
tail j=4863 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=4864 line= <source src="index.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4865 line= <source src="index.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4866 line= </video>
tail j=4867 line= </div>
tail j=4868 line= </div>
tail j=4869 line=
tail j=4870 line= <div class="drg"><h3>vid1: </h3>
tail j=4871 line= <div id="div_vid1">
tail j=4872 line= <video controls="controls" defaultmuted="" muted="true" style="width:320;height:180;" poster="index1_mp4.png">
tail j=4873 line= <source src="index1.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4874 line= <source src="index1.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4875 line= </video>
tail j=4876 line= </div>
tail j=4877 line= </div>
tail j=4878 line=
tail j=4879 line= <div class="drg"><h3>vid2_avril</h3>
tail j=4880 line= <div id="div_vid2_avril">
tail j=4881 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index2_mp4.png">
tail j=4882 line= <source src="index2.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4883 line= <source src="index2.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4884 line= </video>
tail j=4885 line= </div>
tail j=4886 line= </div>
tail j=4887 line=
tail j=4888 line= <div class="drg"><h3>vid3_jtfinc_dogpatrol_tresspass</h3>
tail j=4889 line= <div id="div_vid3">
tail j=4890 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index3_mp4.png">
tail j=4891 line= <source src="index3.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=4892 line= <source src="index3.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=4893 line= </video>
tail j=4894 line= </div>
tail j=4895 line= </div>
tail j=4896 line=
tail j=4897 line=
tail j=4898 line= <div class="drg">konet llc
tail j=4899 line= <img src="/imgs/btn/kob.png" alt="ko.png" width="50" class="drg" />
tail j=4900 line=
tail j=4901 line= </div>
tail j=4902 line= </div id="div_drag_main">
tail j=4903 line=
tail j=4904 line=
tail j=4905 line= <hr color=yellow>
tail j=4906 line= <hr color=white>
tail j=4907 line= <hr color=yellow>
tail j=4908 line=
tail j=4909 line= <div id="div_neave_im" >
tail j=4910 line= <iframe frameborder='0' height='250' marginheight='0' marginwidth='0' scrolling='no'
tail j=4911 line= src='/index_neave_im.html'
tail j=4912 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=4913 line= </iframe>
tail j=4914 line= <a class="popover" href="/index_neave_im.html" target=_blank>
tail j=4915 line= <img height=50 width=1600 src="/imgs/links/index_neave_im.png" alt="index_neave_im" border=0>
tail j=4916 line= <span><img height=50 width=1600 src="/imgs/links/index_neave_im_pop.png" border=0></span>
tail j=4917 line= </a>
tail j=4918 line= </div id="div_neave_im" >
tail j=4919 line=
tail j=4920 line= <div id="div_iframe" height-"150" >
tail j=4921 line= </div id="div_ifram" >
tail j=4922 line=
tail j=4923 line= <div id="div_neave_wobble" >
tail j=4924 line=
tail j=4925 line= <a class="popover" href="/index_neave_wobble.html" target=_blank>
tail j=4926 line= <img height=50 width=1600 src="/imgs/links/index_neave_wobble.png" alt="index_neave_wobble" border=0>
tail j=4927 line= <span><img height=50 width=1600 src="/imgs/links/index_neave_wobble_pop.png" border=0></span>
tail j=4928 line= </a>
tail j=4929 line= <iframe frameborder='0' height='150' marginheight='0' marginwidth='0' scrolling='no'
tail j=4930 line= src='/index_neave_wobble.html'
tail j=4931 line= style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
tail j=4932 line= </iframe>
tail j=4933 line= </div id="div_neave_wobble" >
tail j=4934 line=
tail j=4935 line=
tail j=4936 line=
tail j=4937 line=
tail j=4938 line= <div id="div_files" >
tail j=4939 line= <output id="zonelist"></output>
tail j=4940 line= <div id="dropzone">
tail j=4941 line= dropzone
tail j=4942 line= <div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
tail j=4943 line= <canvas id="canvas_dropzone" style="z-index: 1;
tail j=4944 line= position:absolute;
tail j=4945 line= left:0px;
tail j=4946 line= top:0px;
tail j=4947 line= " height="100px" width="200" background-color="darkSlategrey" color="ivory">
tail j=4948 line= WARN_1387 unauthorized access has been logged
tail j=4949 line= </canvas>
tail j=4950 line= </div id="div_files" >
tail j=4951 line=
tail j=4952 line= <script id="scrip_fileselect" name="script_fileselect">
tail j=4953 line= function handleFileSelect(evt) {
tail j=4954 line= evt.stopPropagation();
tail j=4955 line= evt.preventDefault();
tail j=4956 line=
tail j=4957 line= var files = evt.dataTransfer.files; // FileList object.
tail j=4958 line=
tail j=4959 line=// files is a FileList of File objects. List some properties.
tail j=4960 line= var output = [];
tail j=4961 line= for (var i = 0, f; f = files[i]; i++) {
tail j=4962 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
tail j=4963 line= f.size, ' bytes, last modified: ',
tail j=4964 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
tail j=4965 line= '</li>');
tail j=4966 line= }
tail j=4967 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
tail j=4968 line= }
tail j=4969 line=
tail j=4970 line= function handleDragOver(evt) {
tail j=4971 line= evt.stopPropagation();
tail j=4972 line= evt.preventDefault();
tail j=4973 line= evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
tail j=4974 line= }
tail j=4975 line=
tail j=4976 line= // Setup the dnd listeners.
tail j=4977 line= var dropZone = document.getElementById('dropzone');
tail j=4978 line= dropZone.addEventListener('dragover', handleDragOver, false);
tail j=4979 line= dropZone.addEventListener('drop', handleFileSelect, false);
tail j=4980 line= </script id="scrip_fileselect" name="script_fileselect">
tail j=4981 line=
tail j=4982 line=<hr><hr><hr>
tail j=4983 line= <div id="div_zonelist">
tail j=4984 line= <label class="fileContainer">
tail j=4985 line= files
tail j=4986 line= <input id="files" name="files[]" multiple="" type="file">
tail j=4987 line= </label>
tail j=4988 line= <output id="zonelist"></output>
tail j=4989 line= <div id="div_zonelist">
tail j=4990 line=
tail j=4991 line= <script id="script_hfileselect" >
tail j=4992 line= function handleFileSelect(evt) {
tail j=4993 line= var files = evt.target.files; // FileList object
tail j=4994 line=
tail j=4995 line= // files is a FileList of File objects. List some properties.
tail j=4996 line= var output = [];
tail j=4997 line= for (var i = 0, f; f = files[i]; i++) {
tail j=4998 line= output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
tail j=4999 line= f.size, ' bytes, last modified: ',
tail j=5000 line= f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
tail j=5001 line= '</li>');
tail j=5002 line= }
tail j=5003 line= document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
tail j=5004 line= }
tail j=5005 line=
tail j=5006 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
tail j=5007 line= </script id="script_hfileselect" >
tail j=5008 line=
tail j=5009 line= <div id="div_files2" hidden >
tail j=5010 line= <label class="fileContainer">
tail j=5011 line= files2
tail j=5012 line= <input id="files" name="files[]" multiple="" type="file">
tail j=5013 line= </label>
tail j=5014 line= <output id="zonelist"></output>
tail j=5015 line= </div id="div_files2" hidden >
tail j=5016 line=
tail j=5017 line= <script id="script_hfileselect2" >
tail j=5018 line= function handleFileSelect(evt) {
tail j=5019 line= var files = evt.target.files; // FileList object
tail j=5020 line=
tail j=5021 line= // Loop through the FileList and render image files as thumbnails.
tail j=5022 line= for (var i = 0, f; f = files[i]; i++) {
tail j=5023 line=
tail j=5024 line=// Only process image files.
tail j=5025 line= if (!f.type.match('image.*')) { continue; }
tail j=5026 line=
tail j=5027 line= var reader = new FileReader();
tail j=5028 line=
tail j=5029 line= // Closure to capture the file information.
tail j=5030 line= reader.onload = (function(theFile) {
tail j=5031 line= return function(e) {
tail j=5032 line= // Render thumbnail.
tail j=5033 line= var span = document.createElement('span');
tail j=5034 line= span.innerHTML = ['<img class="thumb" src="', e.target.result,
tail j=5035 line= '" title="', escape(theFile.name), '"/>'].join('');
tail j=5036 line= document.getElementById('zonelist').insertBefore(span, null);
tail j=5037 line= };
tail j=5038 line= })(f);
tail j=5039 line=
tail j=5040 line= // Read in the image file as a data URL.
tail j=5041 line= reader.readAsDataURL(f);
tail j=5042 line= }
tail j=5043 line= }
tail j=5044 line=
tail j=5045 line= document.getElementById('files').addEventListener('change', handleFileSelect, false);
tail j=5046 line= </script id="script_hfileselect2" >
tail j=5047 line=
tail j=5048 line= <script id="script_previewfile">
tail j=5049 line= function previewfile(file) {
tail j=5050 line= if (tests.filereader === true && acceptedTypes[file.type] === true) {
tail j=5051 line= var reader = new FileReader();
tail j=5052 line= reader.onload = function (event) {
tail j=5053 line= var image = new Image();
tail j=5054 line= image.src = event.target.result;
tail j=5055 line= image.width = 250; // a fake resize
tail j=5056 line= holder.appendChild(image);
tail j=5057 line= };
tail j=5058 line=
tail j=5059 line= reader.readAsDataURL(file);
tail j=5060 line= }
tail j=5061 line= else {
tail j=5062 line= holder.innerHTML +=
tail j=5063 line= '<p>done: koupload'
tail j=5064 line= + file.name
tail j=5065 line= + ' '
tail j=5066 line= + (file.size ? (file.size/1024|0) + 'K' : '');
tail j=5067 line= console.log(file);
tail j=5068 line= }
tail j=5069 line= }
tail j=5070 line=
tail j=5071 line= function readfiles(files) {
tail j=5072 line= debugger;
tail j=5073 line= var formData = tests.formdata ? new FormData() : null;
tail j=5074 line= for (var i = 0; i < files.length; i++) {
tail j=5075 line= if (tests.formdata) formData.append('file', files[i]);
tail j=5076 line= previewfile(files[i]);
tail j=5077 line= }
tail j=5078 line=
tail j=5079 line=// now post a new XHR request
tail j=5080 line= if (tests.formdata) {
tail j=5081 line= var xhr = new XMLHttpRequest();
tail j=5082 line= xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
tail j=5083 line=// xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
tail j=5084 line= xhr.onload = function() {
tail j=5085 line= progress.value = progress.innerHTML = 100;
tail j=5086 line= };
tail j=5087 line=
tail j=5088 line= if (tests.progress) {
tail j=5089 line= xhr.upload.onprogress = function (event) {
tail j=5090 line= if (event.lengthComputable) {
tail j=5091 line= var complete = (event.loaded / event.total * 100 | 0);
tail j=5092 line= progress.value = progress.innerHTML = complete;
tail j=5093 line= }
tail j=5094 line= }
tail j=5095 line= }
tail j=5096 line=
tail j=5097 line= xhr.send(formData);
tail j=5098 line= }
tail j=5099 line= }
tail j=5100 line=
tail j=5101 line= if (tests.dnd) {
tail j=5102 line= holder.ondragover = function () { this.className = 'hover'; return false; };
tail j=5103 line= holder.ondragend = function () { this.className = ''; return false; };
tail j=5104 line= holder.ondrop = function (e) {
tail j=5105 line= this.className = '';
tail j=5106 line= e.preventDefault();
tail j=5107 line= readfiles(e.dataTransfer.files);
tail j=5108 line= }
tail j=5109 line= }
tail j=5110 line= else {
tail j=5111 line= fileupload.className = 'hidden';
tail j=5112 line= fileupload.querySelector('input').onchange = function () {
tail j=5113 line= readfiles(this.files);
tail j=5114 line= };
tail j=5115 line= }
tail j=5116 line= </script id="script_previewfile">
tail j=5117 line=
tail j=5118 line= <script id="script_myfilework>
tail j=5119 line= funtion myfilework( j, file ) {
tail j=5120 line=
tail j=5121 line= alert( j+" file="+file );
tail j=5122 line= }
tail j=5123 line=
tail j=5124 line= </script id="script_myfilework>
tail j=5125 line=
tail j=5126 line=
tail j=5127 line=
tail j=5128 line=
tail j=5129 line=
tail j=5130 line= <script id="script_upload_input">>
tail j=5131 line= var upload = document.getElementsByTagName('input')[0],
tail j=5132 line= holder2 = document.getElementById('holder2'),
tail j=5133 line= state = document.getElementById('status');
tail j=5134 line=
tail j=5135 line= if (typeof window.FileReader === 'undefined') {
tail j=5136 line= state.className = 'fail';
tail j=5137 line= }
tail j=5138 line= else {
tail j=5139 line= state.className = 'success';
tail j=5140 line= state.innerHTML = 'File API & FileReader available';
tail j=5141 line= }
tail j=5142 line=
tail j=5143 line= upload.onchange = function (e) {
tail j=5144 line= e.preventDefault();
tail j=5145 line=
tail j=5146 line= var file = upload.files[0],
tail j=5147 line= reader = new FileReader();
tail j=5148 line= reader.onload = function (event) {
tail j=5149 line= var img = new Image();
tail j=5150 line= img.src = event.target.result;
tail j=5151 line=// note: no onload required since we've got the dataurl...I think! :)
tail j=5152 line= if (img.width > 560) { // holder width
tail j=5153 line= img.width = 560;
tail j=5154 line= }
tail j=5155 line= holder2.innerHTML = '';
tail j=5156 line= holder.appendChild(img);
tail j=5157 line= };
tail j=5158 line= reader.readAsDataURL(file);
tail j=5159 line=
tail j=5160 line= return false;
tail j=5161 line= };
tail j=5162 line=
tail j=5163 line=// var formData = new FormData();
tail j=5164 line=// formData.append("part_num", "123ABC");
tail j=5165 line=// formData.append("part_price", 7.95);
tail j=5166 line=// formData.append("part_image", somefile)
tail j=5167 line=//
tail j=5168 line=// var xhr = new XMLHttpRequest();
tail j=5169 line=// xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");
tail j=5170 line=// xhr.send(formData);
tail j=5171 line= </script id="script_upload_input">>
tail j=5172 line=
tail j=5173 line= <canvas id="canvas_1" color="darkSlategrey" height="100" width="400">
tail j=5174 line= </canvas id="canvas_1" >
tail j=5175 line=
tail j=5176 line=
tail j=5177 line= <script id="script_canvas_1" >
tail j=5178 line= var canvas = document.getElementsByTagName('canvas_1')[0],
tail j=5179 line= ctx = null,
tail j=5180 line= grad = null,
tail j=5181 line= body = document.getElementsByTagName('body')[0],
tail j=5182 line= color = 255;
tail j=5183 line= color = lightblue;
tail j=5184 line=
tail j=5185 line=if (canvas.getContext('2d')) {
tail j=5186 line= ctx = canvas.getContext('2d');
tail j=5187 line= ctx.clearRect(0, 0, 600, 600);
tail j=5188 line= ctx.save();
tail j=5189 line=
tail j=5190 line=// Create radial gradient
tail j=5191 line=// grad = ctx.createRadialGradient(0,0,0,0,0,600);
tail j=5192 line=// grad.addColorStop(0, '#000');
tail j=5193 line=// grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');
tail j=5194 line=
tail j=5195 line= // assign gradients to fill
tail j=5196 line=// ctx.fillStyle = grad;
tail j=5197 line= ctx.fillstyle = "lightblue";
tail j=5198 line=
tail j=5199 line= // draw 600x600 fill
tail j=5200 line= ctx.fillRect(0,0,600,600);
tail j=5201 line= ctx.save();
tail j=5202 line=
tail j=5203 line= body.onmousemove = function (event) {
tail j=5204 line= var width = window.innerWidth,
tail j=5205 line= height = window.innerHeight,
tail j=5206 line= x = event.clientX,
tail j=5207 line= y = event.clientY,
tail j=5208 line= rx = 600 * x / width,
tail j=5209 line= ry = 600 * y / height;
tail j=5210 line=
tail j=5211 line= var xc = ~~(256 * x / width);
tail j=5212 line= var yc = ~~(256 * y / height);
tail j=5213 line=
tail j=5214 line= grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600);
tail j=5215 line= grad.addColorStop(0, '#000');
tail j=5216 line= grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
tail j=5217 line= // ctx.restore();
tail j=5218 line=// ctx.fillStyle = grad;
tail j=5219 line= ctx.fillstyle="lightblue";
tail j=5220 line= ctx.fillRect(0,0,600,600);
tail j=5221 line= // ctx.save();
tail j=5222 line= };
tail j=5223 line=}
tail j=5224 line= </script id="script_canvas_1" >
tail j=5225 line=
tail j=5226 line= <div id="div_csv"><h3></h3>
tail j=5227 line= </div id="div_csv">
tail j=5228 line=
tail j=5229 line= <script id="script_upload" type="text/javascript">
tail j=5230 line=// function upload_csv() {
tail j=5231 line= function Upload() {
tail j=5232 line=// var files = evt.dataTransfer.files; // FileList object.
tail j=5233 line=// var fileUpload = document.getElementById("upload_files");
tail j=5234 line= var fileUpload = document.getElementById("fileUpload");
tail j=5235 line= var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
tail j=5236 line=// if (regex.test(fileUpload.value.toLowerCase())) {
tail j=5237 line= if (regex.test(fileUpload.value.toLowerCase())) {
tail j=5238 line= if (typeof (FileReader) != "undefined") {
tail j=5239 line= var reader = new FileReader();
tail j=5240 line= reader.onload = function (e) {
tail j=5241 line= var table = document.createElement("table");
tail j=5242 line= var rows = e.target.result.split("\n");
tail j=5243 line= for (var i = 0; i < rows.length; i++) {
tail j=5244 line= var row = table.insertRow(-1);
tail j=5245 line=
tail j=5246 line=// var cells = rows[i].split("|");
tail j=5247 line= var cells = rows[i].split(",");
tail j=5248 line= for (var j = 0; j < cells.length; j++) {
tail j=5249 line= var cell = row.insertCell(-1);
tail j=5250 line= cell.innerHTML = cells[j];
tail j=5251 line= }
tail j=5252 line= }
tail j=5253 line= var csv2tbl = document.getElementById("csv2tbl");
tail j=5254 line= csv2tbl.innerHTML = "";
tail j=5255 line= csv2tbl.appendChild(table);
tail j=5256 line= }
tail j=5257 line= reader.readAsText(fileUpload.files[0]);
tail j=5258 line= file_csv=fileUpload.files[0];
tail j=5259 line= file_csvlen = fileUpload.files.length;
tail j=5260 line= alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
tail j=5261 line= load_file_csv(file_csv);
tail j=5262 line= }
tail j=5263 line= else {
tail j=5264 line= alert("csv2tbl warn: unauthorized access noted");
tail j=5265 line= }
tail j=5266 line= }
tail j=5267 line= else {
tail j=5268 line= alert("csv2tbl fail: unsuppoted format");
tail j=5269 line= }
tail j=5270 line= }
tail j=5271 line= </script id="script_upload" type="text/javascript">
tail j=5272 line=
tail j=5273 line= <script id="script_load_file_csv">
tail j=5274 line= function load_file_csv(file_csv) {
tail j=5275 line= alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
tail j=5276 line= file_psv=file_csv;
tail j=5277 line= return(file_psv);
tail j=5278 line= }
tail j=5279 line= </script id="script_load_file_csv">
tail j=5280 line=
tail j=5281 line= <div id="div_filecontainer" >
tail j=5282 line= <label class="fileContainer">
tail j=5283 line= files.csv.psv.txt
tail j=5284 line= <input id="fileUpload" type="file"></input>
tail j=5285 line= </label>
tail j=5286 line=
tail j=5287 line=      
tail j=5288 line= <label class="fileContainer">
tail j=5289 line= parse.csv.psv.txt
tail j=5290 line= <input id="upload" value="Upload" onclick="Upload()" type="button"></input>
tail j=5291 line= </label>
tail j=5292 line= </div id="div_filecontainer" >
tail j=5293 line=
tail j=5294 line=
tail j=5295 line=
tail j=5296 line= <div id="div_csv2tbl"><h3>csv2tbl</h3>
tail j=5297 line= </div id="div_csv2tbl" >
tail j=5298 line=
tail j=5299 line=<!--
tail j=5300 line= <button type="button" id="fileUpload" type="file" >select</button>
tail j=5301 line= <button type="button" id="upload" value="Upload" onclick="Upload()">upload</button>
tail j=5302 line= -->
tail j=5303 line=
tail j=5304 line=<!--
tail j=5305 line=
tail j=5306 line= <div id="div_showhide" hidden>
tail j=5307 line= <script id="script_showhide" >
tail j=5308 line= function show_files() {
tail j=5309 line= var div_files = document.getElementbyID("div_files");
tail j=5310 line= div_files.show();
tail j=5311 line= }
tail j=5312 line= function hide_files() {
tail j=5313 line= var div_files = document.getElementbyID("div_files");
tail j=5314 line= div_files.hide();
tail j=5315 line= }
tail j=5316 line= </script id="script_showhide" hidden>
tail j=5317 line=
tail j=5318 line= <button type="button" id="show">show</button>
tail j=5319 line= <button type="button" id="hide">hide</button>
tail j=5320 line= <button type="show_files" id="show_files" onclick="show_files()">Show_files</button>
tail j=5321 line= <button type="hide_files" id="hide_files" onclick="hide_files()">Hide_files</button>
tail j=5322 line= <button type="show_neave_wobble" id="show_neave_wobble">Show_neave_wobble</button>
tail j=5323 line= <button type="hide_neave_wobble" id="hide_neave_wobble">Hide_neave_wobble</button>
tail j=5324 line= -->
tail j=5325 line=<!--
tail j=5326 line= <button type="show_dd" id="show_dd">Show_dd</button>
tail j=5327 line= <button type="hide_dd" id="hide_dd">Hide_dd</button>
tail j=5328 line= <button type="show_bb" id="show_bb">Show_bb</button>
tail j=5329 line= <button type="hide_bb" id="hide_bb">Hide_bb</button>
tail j=5330 line= <button type="show_tl" id="show_tl">Show_tl</button>
tail j=5331 line= <button type="hide_tl" id="hide_tl">Hide_tl</button>
tail j=5332 line= <button type="show_colors" id="show_colors">Show_colors</button>
tail j=5333 line= <button type="hide_colors" id="hide_colors">Hide_colors</button>
tail j=5334 line= <button type="show_fonts" id="show_fonts">Show_fonts</button>
tail j=5335 line= <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
tail j=5336 line= <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
tail j=5337 line= <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
tail j=5338 line= -->
tail j=5339 line= </div id="dvi_showhide" >
tail j=5340 line=
tail j=5341 line=
tail j=5342 line= <div id="item" >div_item
tail j=5343 line= </div id="item">
tail j=5344 line=
tail j=5345 line=<!--
tail j=5346 line= <script id="script_showhide">
tail j=5347 line= $( "#show" ).click(function() {$('#item').show(); });
tail j=5348 line= $( "#hide" ).click(function() {$('#item').hide();});
tail j=5349 line= $( "#show_files" ).click(function() {$('#div_files').show(); });
tail j=5350 line= $( "#hide_files" ).click(function() {$('#div_files').hide();});
tail j=5351 line= $( "#show_neave_wobble" ).click(function() {$('#div_neave_wobble').show(); });
tail j=5352 line= $( "#hide_neave_wobble" ).click(function() {$('#div_neave_wobble').hide();});
tail j=5353 line=// $( "#show_dd" ).click(function() {$('#div_dd').show(); });
tail j=5354 line=// $( "#hide_dd" ).click(function() {$('#div_dd').hide();});
tail j=5355 line=// $( "#show_bb" ).click(function() {$('#div_bb').show(); });
tail j=5356 line=// $( "#hide_bb" ).click(function() {$('#div_bb').hide();});
tail j=5357 line=// $( "#show_tl" ).click(function() {$('#div_tl').show(); });
tail j=5358 line=// $( "#hide_tl" ).click(function() {$('#div_tl').hide();});
tail j=5359 line=// $( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
tail j=5360 line=// $( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
tail j=5361 line=// $( "#show_colors" ).click(function() {$('#div_colors').show(); });
tail j=5362 line=// $( "#hide_colors" ).click(function() {$('#div_colors').hide();});
tail j=5363 line=// $( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
tail j=5364 line=// $( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
tail j=5365 line=// $( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
tail j=5366 line=// $( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
tail j=5367 line= </script id="script_showhide" >
tail j=5368 line= -->
tail j=5369 line=
tail j=5370 line=
tail j=5371 line=<!--[if IE] -->
tail j=5372 line=<!--
tail j=5373 line= <script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
tail j=5374 line= -->
tail j=5375 line=<!-- <![endif]-->
tail j=5376 line=<!--
tail j=5377 line= <div class="la-anim-10" hidden></div>
tail j=5378 line= -->
tail j=5379 line=
tail j=5380 line=<!-- .corner-preloader -->
tail j=5381 line=<!--
tail j=5382 line= <div id="wrapper" hidden>
tail j=5383 line= <div id="upload-widget">
tail j=5384 line= <h1>
tail j=5385 line= <i class="fa fa-cloud-upload"></i> File Uploader
tail j=5386 line= </h1>
tail j=5387 line=
tail j=5388 line= <form id="file-upload-form">
tail j=5389 line= <div class="file-input-wrap">
tail j=5390 line= fups
tail j=5391 line= <input type="file" name="file" id="file" multiple>
tail j=5392 line= </div><!-- .file-input-wrap -->
tail j=5393 line= </form><!-- #file-upload-form -->
tail j=5394 line= </div><!-- #upload-widget -->
tail j=5395 line=
tail j=5396 line= <div id="upload-result">
tail j=5397 line= </div><!-- #upload-result -->
tail j=5398 line= </div><!-- #wrapper -->
tail j=5399 line=
tail j=5400 line= <div id="preloader">
tail j=5401 line= <img height=50 src="/imgs/btn/kob.png" alt="preloader_up" />
tail j=5402 line= </a>
tail j=5403 line= </div>
tail j=5404 line=
tail j=5405 line= <!-- SCRIPTS -->
tail j=5406 line=<!-- <script type="text/javascript" src="js/libraries/jquery-2.1.1.min.js"></script> -->
tail j=5407 line=<!-- <script type="text/javascript" src="/js/vue.js" > -->
tail j=5408 line= <script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIFZ1ZS5qcyB2Mi41LjE3CiAqIChjKSAyMDE0LTIwMTggRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDoKCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6CgkoZ2xvYmFsLlZ1ZSA9IGZhY3RvcnkoKSk7Cn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOwoKLyogICovCgp2YXIgZW1wdHlPYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTsKCi8vIHRoZXNlIGhlbHBlcnMgcHJvZHVjZXMgYmV0dGVyIHZtIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXIKLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZwpmdW5jdGlvbiBpc1VuZGVmICh2KSB7CiAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsCn0KCmZ1bmN0aW9uIGlzRGVmICh2KSB7CiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsCn0KCmZ1bmN0aW9uIGlzVHJ1ZSAodikgewogIHJldHVybiB2ID09PSB0cnVlCn0KCmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHsKICByZXR1cm4gdiA9PT0gZmFsc2UKfQoKLyoqCiAqIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZQogKi8KZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbHVlKSB7CiAgcmV0dXJuICgKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwKICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fAogICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicKICApCn0KCi8qKgogKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGwKICogT2JqZWN0cyBmcm9tIHByaW1pdGl2ZSB2YWx1ZXMgd2hlbiB3ZSBrbm93IHRoZSB2YWx1ZQogKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuCiAqLwpmdW5jdGlvbiBpc09iamVjdCAob2JqKSB7CiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jwp9CgovKioKICogR2V0IHRoZSByYXcgdHlwZSBzdHJpbmcgb2YgYSB2YWx1ZSBlLmcuIFtvYmplY3QgT2JqZWN0XQogKi8KdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpmdW5jdGlvbiB0b1Jhd1R5cGUgKHZhbHVlKSB7CiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSkKfQoKLyoqCiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWUKICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy4KICovCmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJwp9CgpmdW5jdGlvbiBpc1JlZ0V4cCAodikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXScKfQoKLyoqCiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LgogKi8KZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkgewogIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodmFsKSk7CiAgcmV0dXJuIG4gPj0gMCAmJiBNYXRoLmZsb29yKG4pID09PSBuICYmIGlzRmluaXRlKHZhbCkKfQoKLyoqCiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLgogKi8KZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkgewogIHJldHVybiB2YWwgPT0gbnVsbAogICAgPyAnJwogICAgOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JwogICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMikKICAgICAgOiBTdHJpbmcodmFsKQp9CgovKioKICogQ29udmVydCBhIGlucHV0IHZhbHVlIHRvIGEgbnVtYmVyIGZvciBwZXJzaXN0ZW5jZS4KICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuCiAqLwpmdW5jdGlvbiB0b051bWJlciAodmFsKSB7CiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7CiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbgp9CgovKioKICogTWFrZSBhIG1hcCBhbmQgcmV0dXJuIGEgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGEga2V5CiAqIGlzIGluIHRoYXQgbWFwLgogKi8KZnVuY3Rpb24gbWFrZU1hcCAoCiAgc3RyLAogIGV4cGVjdHNMb3dlckNhc2UKKSB7CiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7CiAgfQogIHJldHVybiBleHBlY3RzTG93ZXJDYXNlCiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH0KICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH0KfQoKLyoqCiAqIENoZWNrIGlmIGEgdGFnIGlzIGEgYnVpbHQtaW4gdGFnLgogKi8KdmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7CgovKioKICogQ2hlY2sgaWYgYSBhdHRyaWJ1dGUgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUuCiAqLwp2YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzJyk7CgovKioKICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheQogKi8KZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHsKICBpZiAoYXJyLmxlbmd0aCkgewogICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSkKICAgIH0KICB9Cn0KCi8qKgogKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS4KICovCnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHsKICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkKfQoKLyoqCiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi4KICovCmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHsKICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHJldHVybiAoZnVuY3Rpb24gY2FjaGVkRm4gKHN0cikgewogICAgdmFyIGhpdCA9IGNhY2hlW3N0cl07CiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSkKICB9KQp9CgovKioKICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy4KICovCnZhciBjYW1lbGl6ZVJFID0gLy0oXHcpL2c7CnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIGZ1bmN0aW9uIChfLCBjKSB7IHJldHVybiBjID8gYy50b1VwcGVyQ2FzZSgpIDogJyc7IH0pCn0pOwoKLyoqCiAqIENhcGl0YWxpemUgYSBzdHJpbmcuCiAqLwp2YXIgY2FwaXRhbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKQp9KTsKCi8qKgogKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLgogKi8KdmFyIGh5cGhlbmF0ZVJFID0gL1xCKFtBLVpdKS9nOwp2YXIgaHlwaGVuYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsICctJDEnKS50b0xvd2VyQ2FzZSgpCn0pOwoKLyoqCiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdC4uLiBlLmcuCiAqIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5IHdlIGRvbid0IG5lZWQgdGhpcyBhbnltb3JlIHNpbmNlIG5hdGl2ZSBiaW5kIGlzCiAqIG5vdyBtb3JlIHBlcmZvcm1hbnQgaW4gbW9zdCBicm93c2VycywgYnV0IHJlbW92aW5nIGl0IHdvdWxkIGJlIGJyZWFraW5nIGZvcgogKiBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluIFBoYW50b21KUyAxLngsIHNvIHRoaXMgbXVzdCBiZSBrZXB0IGZvcgogKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICovCgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBwb2x5ZmlsbEJpbmQgKGZuLCBjdHgpIHsKICBmdW5jdGlvbiBib3VuZEZuIChhKSB7CiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICByZXR1cm4gbAogICAgICA/IGwgPiAxCiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cykKICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKQogICAgICA6IGZuLmNhbGwoY3R4KQogIH0KCiAgYm91bmRGbi5fbGVuZ3RoID0gZm4ubGVuZ3RoOwogIHJldHVybiBib3VuZEZuCn0KCmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHsKICByZXR1cm4gZm4uYmluZChjdHgpCn0KCnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQKICA/IG5hdGl2ZUJpbmQKICA6IHBvbHlmaWxsQmluZDsKCi8qKgogKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS4KICovCmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7CiAgc3RhcnQgPSBzdGFydCB8fCAwOwogIHZhciBpID0gbGlzdC5sZW5ndGggLSBzdGFydDsKICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpOwogIHdoaWxlIChpLS0pIHsKICAgIHJldFtpXSA9IGxpc3RbaSArIHN0YXJ0XTsKICB9CiAgcmV0dXJuIHJldAp9CgovKioKICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LgogKi8KZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHsKICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHsKICAgIHRvW2tleV0gPSBfZnJvbVtrZXldOwogIH0KICByZXR1cm4gdG8KfQoKLyoqCiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuCiAqLwpmdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7CiAgdmFyIHJlcyA9IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoYXJyW2ldKSB7CiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyoqCiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLgogKiBTdHViYmluZyBhcmdzIHRvIG1ha2UgRmxvdyBoYXBweSB3aXRob3V0IGxlYXZpbmcgdXNlbGVzcyB0cmFuc3BpbGVkIGNvZGUKICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pCiAqLwpmdW5jdGlvbiBub29wIChhLCBiLCBjKSB7fQoKLyoqCiAqIEFsd2F5cyByZXR1cm4gZmFsc2UuCiAqLwp2YXIgbm8gPSBmdW5jdGlvbiAoYSwgYiwgYykgeyByZXR1cm4gZmFsc2U7IH07CgovKioKICogUmV0dXJuIHNhbWUgdmFsdWUKICovCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9OwoKLyoqCiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy4KICovCmZ1bmN0aW9uIGdlblN0YXRpY0tleXMgKG1vZHVsZXMpIHsKICByZXR1cm4gbW9kdWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGtleXMsIG0pIHsKICAgIHJldHVybiBrZXlzLmNvbmNhdChtLnN0YXRpY0tleXMgfHwgW10pCiAgfSwgW10pLmpvaW4oJywnKQp9CgovKioKICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsCiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT8KICovCmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHsKICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9CiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpOwogIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTsKICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0QikgewogICAgdHJ5IHsKICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTsKICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTsKICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7CiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKQogICAgICAgIH0pCiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5QikgewogICAgICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKGEpOwogICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpOwogICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChhW2tleV0sIGJba2V5XSkKICAgICAgICB9KQogICAgICB9IGVsc2UgewogICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHsKICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2UKICB9Cn0KCmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgaWYgKGxvb3NlRXF1YWwoYXJyW2ldLCB2YWwpKSB7IHJldHVybiBpIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qKgogKiBFbnN1cmUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlLgogKi8KZnVuY3Rpb24gb25jZSAoZm4pIHsKICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgIGlmICghY2FsbGVkKSB7CiAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfQp9Cgp2YXIgU1NSX0FUVFIgPSAnZGF0YS1zZXJ2ZXItcmVuZGVyZWQnOwoKdmFyIEFTU0VUX1RZUEVTID0gWwogICdjb21wb25lbnQnLAogICdkaXJlY3RpdmUnLAogICdmaWx0ZXInCl07Cgp2YXIgTElGRUNZQ0xFX0hPT0tTID0gWwogICdiZWZvcmVDcmVhdGUnLAogICdjcmVhdGVkJywKICAnYmVmb3JlTW91bnQnLAogICdtb3VudGVkJywKICAnYmVmb3JlVXBkYXRlJywKICAndXBkYXRlZCcsCiAgJ2JlZm9yZURlc3Ryb3knLAogICdkZXN0cm95ZWQnLAogICdhY3RpdmF0ZWQnLAogICdkZWFjdGl2YXRlZCcsCiAgJ2Vycm9yQ2FwdHVyZWQnCl07CgovKiAgKi8KCnZhciBjb25maWcgPSAoewogIC8qKgogICAqIE9wdGlvbiBtZXJnZSBzdHJhdGVnaWVzICh1c2VkIGluIGNvcmUvdXRpbC9vcHRpb25zKQogICAqLwogIC8vICRmbG93LWRpc2FibGUtbGluZQogIG9wdGlvbk1lcmdlU3RyYXRlZ2llczogT2JqZWN0LmNyZWF0ZShudWxsKSwKCiAgLyoqCiAgICogV2hldGhlciB0byBzdXBwcmVzcyB3YXJuaW5ncy4KICAgKi8KICBzaWxlbnQ6IGZhbHNlLAoKICAvKioKICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290PwogICAqLwogIHByb2R1Y3Rpb25UaXA6ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJywKCiAgLyoqCiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHMKICAgKi8KICBkZXZ0b29sczogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nLAoKICAvKioKICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmCiAgICovCiAgcGVyZm9ybWFuY2U6IGZhbHNlLAoKICAvKioKICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9ycwogICAqLwogIGVycm9ySGFuZGxlcjogbnVsbCwKCiAgLyoqCiAgICogV2FybiBoYW5kbGVyIGZvciB3YXRjaGVyIHdhcm5zCiAgICovCiAgd2FybkhhbmRsZXI6IG51bGwsCgogIC8qKgogICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50cwogICAqLwogIGlnbm9yZWRFbGVtZW50czogW10sCgogIC8qKgogICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uCiAgICovCiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCgogIC8qKgogICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYQogICAqIGNvbXBvbmVudC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi4KICAgKi8KICBpc1Jlc2VydmVkVGFnOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnQKICAgKiBwcm9wLiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLgogICAqLwogIGlzUmVzZXJ2ZWRBdHRyOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LgogICAqIFBsYXRmb3JtLWRlcGVuZGVudC4KICAgKi8KICBpc1Vua25vd25FbGVtZW50OiBubywKCiAgLyoqCiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudAogICAqLwogIGdldFRhZ05hbWVzcGFjZTogbm9vcCwKCiAgLyoqCiAgICogUGFyc2UgdGhlIHJlYWwgdGFnIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybS4KICAgKi8KICBwYXJzZVBsYXRmb3JtVGFnTmFtZTogaWRlbnRpdHksCgogIC8qKgogICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIGJvdW5kIHVzaW5nIHByb3BlcnR5LCBlLmcuIHZhbHVlCiAgICogUGxhdGZvcm0tZGVwZW5kZW50LgogICAqLwogIG11c3RVc2VQcm9wOiBubywKCiAgLyoqCiAgICogRXhwb3NlZCBmb3IgbGVnYWN5IHJlYXNvbnMKICAgKi8KICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LUwp9KQoKLyogICovCgovKioKICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfCiAqLwpmdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHsKICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTsKICByZXR1cm4gYyA9PT0gMHgyNCB8fCBjID09PSAweDVGCn0KCi8qKgogKiBEZWZpbmUgYSBwcm9wZXJ0eS4KICovCmZ1bmN0aW9uIGRlZiAob2JqLCBrZXksIHZhbCwgZW51bWVyYWJsZSkgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgdmFsdWU6IHZhbCwKICAgIGVudW1lcmFibGU6ICEhZW51bWVyYWJsZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7Cn0KCi8qKgogKiBQYXJzZSBzaW1wbGUgcGF0aC4KICovCnZhciBiYWlsUkUgPSAvW15cdy4kXS87CmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkgewogIGlmIChiYWlsUkUudGVzdChwYXRoKSkgewogICAgcmV0dXJuCiAgfQogIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy4nKTsKICByZXR1cm4gZnVuY3Rpb24gKG9iaikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIW9iaikgeyByZXR1cm4gfQogICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dOwogICAgfQogICAgcmV0dXJuIG9iagogIH0KfQoKLyogICovCgovLyBjYW4gd2UgdXNlIF9fcHJvdG9fXz8KdmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307CgovLyBCcm93c2VyIGVudmlyb25tZW50IHNuaWZmaW5nCnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJzsKdmFyIGluV2VleCA9IHR5cGVvZiBXWEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhIVdYRW52aXJvbm1lbnQucGxhdGZvcm07CnZhciB3ZWV4UGxhdGZvcm0gPSBpbldlZXggJiYgV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOwp2YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKdmFyIGlzSUUgPSBVQSAmJiAvbXNpZXx0cmlkZW50Ly50ZXN0KFVBKTsKdmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7CnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDsKdmFyIGlzQW5kcm9pZCA9IChVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwKSB8fCAod2VleFBsYXRmb3JtID09PSAnYW5kcm9pZCcpOwp2YXIgaXNJT1MgPSAoVUEgJiYgL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KFVBKSkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2lvcycpOwp2YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXC9cZCsvLnRlc3QoVUEpICYmICFpc0VkZ2U7CgovLyBGaXJlZm94IGhhcyBhICJ3YXRjaCIgZnVuY3Rpb24gb24gT2JqZWN0LnByb3RvdHlwZS4uLgp2YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoOwoKdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlOwppZiAoaW5Ccm93c2VyKSB7CiAgdHJ5IHsKICAgIHZhciBvcHRzID0ge307CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOwogICAgICB9CiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODUKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTsKICB9IGNhdGNoIChlKSB7fQp9CgovLyB0aGlzIG5lZWRzIHRvIGJlIGxhenktZXZhbGVkIGJlY2F1c2UgdnVlIG1heSBiZSByZXF1aXJlZCBiZWZvcmUKLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlYKdmFyIF9pc1NlcnZlcjsKdmFyIGlzU2VydmVyUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkgewogIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWluQnJvd3NlciAmJiAhaW5XZWV4ICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZAogICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzCiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJzsKICAgIH0gZWxzZSB7CiAgICAgIF9pc1NlcnZlciA9IGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gX2lzU2VydmVyCn07CgovLyBkZXRlY3QgZGV2dG9vbHMKdmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fOwoKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHsKICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSkKfQoKdmFyIGhhc1N5bWJvbCA9CiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJgogIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpOwoKdmFyIF9TZXQ7Ci8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLyAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHsKICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS4KICBfU2V0ID0gU2V0Owp9IGVsc2UgewogIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy4KICBfU2V0ID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFNldCAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWUKICAgIH07CiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoa2V5KSB7CiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlOwogICAgfTsKICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH07CgogICAgcmV0dXJuIFNldDsKICB9KCkpOwp9CgovKiAgKi8KCnZhciB3YXJuID0gbm9vcDsKdmFyIHRpcCA9IG5vb3A7CnZhciBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gKG5vb3ApOyAvLyB3b3JrIGFyb3VuZCBmbG93IGNoZWNrCnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApOwoKewogIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnOwogIHZhciBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXHcpL2c7CiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyCiAgICAucmVwbGFjZShjbGFzc2lmeVJFLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KQogICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9OwoKICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHsKICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJzsKCiAgICBpZiAoY29uZmlnLndhcm5IYW5kbGVyKSB7CiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTsKICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoKCJbVnVlIHdhcm5dOiAiICsgbXNnICsgdHJhY2UpKTsKICAgIH0KICB9OwoKICB0aXAgPSBmdW5jdGlvbiAobXNnLCB2bSkgewogICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkgewogICAgICBjb25zb2xlLndhcm4oIltWdWUgdGlwXTogIiArIG1zZyArICgKICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJycKICAgICAgKSk7CiAgICB9CiAgfTsKCiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHsKICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHsKICAgICAgcmV0dXJuICc8Um9vdD4nCiAgICB9CiAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiB2bSA9PT0gJ2Z1bmN0aW9uJyAmJiB2bS5jaWQgIT0gbnVsbAogICAgICA/IHZtLm9wdGlvbnMKICAgICAgOiB2bS5faXNWdWUKICAgICAgICA/IHZtLiRvcHRpb25zIHx8IHZtLmNvbnN0cnVjdG9yLm9wdGlvbnMKICAgICAgICA6IHZtIHx8IHt9OwogICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnOwogICAgdmFyIGZpbGUgPSBvcHRpb25zLl9fZmlsZTsKICAgIGlmICghbmFtZSAmJiBmaWxlKSB7CiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXF0rKVwudnVlJC8pOwogICAgICBuYW1lID0gbWF0Y2ggJiYgbWF0Y2hbMV07CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgKG5hbWUgPyAoIjwiICsgKGNsYXNzaWZ5KG5hbWUpKSArICI+IikgOiAiPEFub255bW91cz4iKSArCiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/ICgiIGF0ICIgKyBmaWxlKSA6ICcnKQogICAgKQogIH07CgogIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7CiAgICB2YXIgcmVzID0gJyc7CiAgICB3aGlsZSAobikgewogICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfQogICAgICBpZiAobiA+IDEpIHsgc3RyICs9IHN0cjsgfQogICAgICBuID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlcwogIH07CgogIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSBmdW5jdGlvbiAodm0pIHsKICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkgewogICAgICB2YXIgdHJlZSA9IFtdOwogICAgICB2YXIgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgd2hpbGUgKHZtKSB7CiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07CiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7CiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDsKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkgewogICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJlZS5wdXNoKHZtKTsKICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuICdcblxuZm91bmQgaW5cblxuJyArIHRyZWUKICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKCIiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSkKICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArICIuLi4gKCIgKyAodm1bMV0pICsgIiByZWN1cnNpdmUgY2FsbHMpIikKICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KQogICAgICAgIC5qb2luKCdcbicpCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gKCJcblxuKGZvdW5kIGluICIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgIikiKQogICAgfQogIH07Cn0KCi8qICAqLwoKCnZhciB1aWQgPSAwOwoKLyoqCiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZQogKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LgogKi8KdmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7CiAgdGhpcy5pZCA9IHVpZCsrOwogIHRoaXMuc3VicyA9IFtdOwp9OwoKRGVwLnByb3RvdHlwZS5hZGRTdWIgPSBmdW5jdGlvbiBhZGRTdWIgKHN1YikgewogIHRoaXMuc3Vicy5wdXNoKHN1Yik7Cn07CgpEZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7CiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTsKfTsKCkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHsKICBpZiAoRGVwLnRhcmdldCkgewogICAgRGVwLnRhcmdldC5hZGREZXAodGhpcyk7CiAgfQp9OwoKRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkgewogIC8vIHN0YWJpbGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0CiAgdmFyIHN1YnMgPSB0aGlzLnN1YnMuc2xpY2UoKTsKICBmb3IgKHZhciBpID0gMCwgbCA9IHN1YnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICBzdWJzW2ldLnVwZGF0ZSgpOwogIH0KfTsKCi8vIHRoZSBjdXJyZW50IHRhcmdldCB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZC4KLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZQovLyB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZCBhdCBhbnkgdGltZS4KRGVwLnRhcmdldCA9IG51bGw7CnZhciB0YXJnZXRTdGFjayA9IFtdOwoKZnVuY3Rpb24gcHVzaFRhcmdldCAoX3RhcmdldCkgewogIGlmIChEZXAudGFyZ2V0KSB7IHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldCk7IH0KICBEZXAudGFyZ2V0ID0gX3RhcmdldDsKfQoKZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHsKICBEZXAudGFyZ2V0ID0gdGFyZ2V0U3RhY2sucG9wKCk7Cn0KCi8qICAqLwoKdmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUgKAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIHRleHQsCiAgZWxtLAogIGNvbnRleHQsCiAgY29tcG9uZW50T3B0aW9ucywKICBhc3luY0ZhY3RvcnkKKSB7CiAgdGhpcy50YWcgPSB0YWc7CiAgdGhpcy5kYXRhID0gZGF0YTsKICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgdGhpcy50ZXh0ID0gdGV4dDsKICB0aGlzLmVsbSA9IGVsbTsKICB0aGlzLm5zID0gdW5kZWZpbmVkOwogIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7CiAgdGhpcy5mbk9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgdGhpcy5mblNjb3BlSWQgPSB1bmRlZmluZWQ7CiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5OwogIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7CiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDsKICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDsKICB0aGlzLnJhdyA9IGZhbHNlOwogIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTsKICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7CiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTsKICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7CiAgdGhpcy5pc09uY2UgPSBmYWxzZTsKICB0aGlzLmFzeW5jRmFjdG9yeSA9IGFzeW5jRmFjdG9yeTsKICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDsKICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlOwp9OwoKdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTsKCi8vIERFUFJFQ0FURUQ6IGFsaWFzIGZvciBjb21wb25lbnRJbnN0YW5jZSBmb3IgYmFja3dhcmRzIGNvbXBhdC4KLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KcHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZQp9OwoKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZOb2RlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7Cgp2YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgaWYgKCB0ZXh0ID09PSB2b2lkIDAgKSB0ZXh0ID0gJyc7CgogIHZhciBub2RlID0gbmV3IFZOb2RlKCk7CiAgbm9kZS50ZXh0ID0gdGV4dDsKICBub2RlLmlzQ29tbWVudCA9IHRydWU7CiAgcmV0dXJuIG5vZGUKfTsKCmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7CiAgcmV0dXJuIG5ldyBWTm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBTdHJpbmcodmFsKSkKfQoKLy8gb3B0aW1pemVkIHNoYWxsb3cgY2xvbmUKLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zcwovLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHkKLy8gb24gdGhlaXIgZWxtIHJlZmVyZW5jZS4KZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHsKICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKAogICAgdm5vZGUudGFnLAogICAgdm5vZGUuZGF0YSwKICAgIHZub2RlLmNoaWxkcmVuLAogICAgdm5vZGUudGV4dCwKICAgIHZub2RlLmVsbSwKICAgIHZub2RlLmNvbnRleHQsCiAgICB2bm9kZS5jb21wb25lbnRPcHRpb25zLAogICAgdm5vZGUuYXN5bmNGYWN0b3J5CiAgKTsKICBjbG9uZWQubnMgPSB2bm9kZS5uczsKICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYzsKICBjbG9uZWQua2V5ID0gdm5vZGUua2V5OwogIGNsb25lZC5pc0NvbW1lbnQgPSB2bm9kZS5pc0NvbW1lbnQ7CiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDsKICBjbG9uZWQuZm5PcHRpb25zID0gdm5vZGUuZm5PcHRpb25zOwogIGNsb25lZC5mblNjb3BlSWQgPSB2bm9kZS5mblNjb3BlSWQ7CiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTsKICByZXR1cm4gY2xvbmVkCn0KCi8qCiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aAogKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGUKICovCgp2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTsKdmFyIGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90byk7Cgp2YXIgbWV0aG9kc1RvUGF0Y2ggPSBbCiAgJ3B1c2gnLAogICdwb3AnLAogICdzaGlmdCcsCiAgJ3Vuc2hpZnQnLAogICdzcGxpY2UnLAogICdzb3J0JywKICAncmV2ZXJzZScKXTsKCi8qKgogKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHMKICovCm1ldGhvZHNUb1BhdGNoLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZAogIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTsKICBkZWYoYXJyYXlNZXRob2RzLCBtZXRob2QsIGZ1bmN0aW9uIG11dGF0b3IgKCkgewogICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07CgogICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgdmFyIG9iID0gdGhpcy5fX29iX187CiAgICB2YXIgaW5zZXJ0ZWQ7CiAgICBzd2l0Y2ggKG1ldGhvZCkgewogICAgICBjYXNlICdwdXNoJzoKICAgICAgY2FzZSAndW5zaGlmdCc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzOwogICAgICAgIGJyZWFrCiAgICAgIGNhc2UgJ3NwbGljZSc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpOwogICAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfQogICAgLy8gbm90aWZ5IGNoYW5nZQogICAgb2IuZGVwLm5vdGlmeSgpOwogICAgcmV0dXJuIHJlc3VsdAogIH0pOwp9KTsKCi8qICAqLwoKdmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7CgovKioKICogSW4gc29tZSBjYXNlcyB3ZSBtYXkgd2FudCB0byBkaXNhYmxlIG9ic2VydmF0aW9uIGluc2lkZSBhIGNvbXBvbmVudCdzCiAqIHVwZGF0ZSBjb21wdXRhdGlvbi4KICovCnZhciBzaG91bGRPYnNlcnZlID0gdHJ1ZTsKCmZ1bmN0aW9uIHRvZ2dsZU9ic2VydmluZyAodmFsdWUpIHsKICBzaG91bGRPYnNlcnZlID0gdmFsdWU7Cn0KCi8qKgogKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWQKICogb2JqZWN0LiBPbmNlIGF0dGFjaGVkLCB0aGUgb2JzZXJ2ZXIgY29udmVydHMgdGhlIHRhcmdldAogKiBvYmplY3QncyBwcm9wZXJ0eSBrZXlzIGludG8gZ2V0dGVyL3NldHRlcnMgdGhhdAogKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy4KICovCnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkgewogIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB0aGlzLmRlcCA9IG5ldyBEZXAoKTsKICB0aGlzLnZtQ291bnQgPSAwOwogIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpOwogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90bwogICAgICA/IHByb3RvQXVnbWVudAogICAgICA6IGNvcHlBdWdtZW50OwogICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpOwogICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpOwogIH0gZWxzZSB7CiAgICB0aGlzLndhbGsodmFsdWUpOwogIH0KfTsKCi8qKgogKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG8KICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCiAqIHZhbHVlIHR5cGUgaXMgT2JqZWN0LgogKi8KT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBkZWZpbmVSZWFjdGl2ZShvYmosIGtleXNbaV0pOwogIH0KfTsKCi8qKgogKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy4KICovCk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9ic2VydmUoaXRlbXNbaV0pOwogIH0KfTsKCi8vIGhlbHBlcnMKCi8qKgogKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nCiAqIHRoZSBwcm90b3R5cGUgY2hhaW4gdXNpbmcgX19wcm90b19fCiAqLwpmdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7CiAgLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi8KICB0YXJnZXQuX19wcm90b19fID0gc3JjOwogIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi8KfQoKLyoqCiAqIEF1Z21lbnQgYW4gdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZwogKiBoaWRkZW4gcHJvcGVydGllcy4KICovCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmZ1bmN0aW9uIGNvcHlBdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykgewogIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgZGVmKHRhcmdldCwga2V5LCBzcmNba2V5XSk7CiAgfQp9CgovKioKICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsCiAqIHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBpZiBzdWNjZXNzZnVsbHkgb2JzZXJ2ZWQsCiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLgogKi8KZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIGFzUm9vdERhdGEpIHsKICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIG9iOwogIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikgewogICAgb2IgPSB2YWx1ZS5fX29iX187CiAgfSBlbHNlIGlmICgKICAgIHNob3VsZE9ic2VydmUgJiYKICAgICFpc1NlcnZlclJlbmRlcmluZygpICYmCiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpICYmCiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJgogICAgIXZhbHVlLl9pc1Z1ZQogICkgewogICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpOwogIH0KICBpZiAoYXNSb290RGF0YSAmJiBvYikgewogICAgb2Iudm1Db3VudCsrOwogIH0KICByZXR1cm4gb2IKfQoKLyoqCiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC4KICovCmZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlICgKICBvYmosCiAga2V5LAogIHZhbCwKICBjdXN0b21TZXR0ZXIsCiAgc2hhbGxvdwopIHsKICB2YXIgZGVwID0gbmV3IERlcCgpOwoKICB2YXIgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTsKICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkgewogICAgcmV0dXJuCiAgfQoKICAvLyBjYXRlciBmb3IgcHJlLWRlZmluZWQgZ2V0dGVyL3NldHRlcnMKICB2YXIgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0OwogIGlmICghZ2V0dGVyICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgIHZhbCA9IG9ialtrZXldOwogIH0KICB2YXIgc2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuc2V0OwoKICB2YXIgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUodmFsKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHsKICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsKICAgICAgaWYgKERlcC50YXJnZXQpIHsKICAgICAgICBkZXAuZGVwZW5kKCk7CiAgICAgICAgaWYgKGNoaWxkT2IpIHsKICAgICAgICAgIGNoaWxkT2IuZGVwLmRlcGVuZCgpOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlCiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7CiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7CiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7CiAgICAgICAgY3VzdG9tU2V0dGVyKCk7CiAgICAgIH0KICAgICAgaWYgKHNldHRlcikgewogICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWwgPSBuZXdWYWw7CiAgICAgIH0KICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTsKICAgICAgZGVwLm5vdGlmeSgpOwogICAgfQogIH0pOwp9CgovKioKICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kCiAqIHRyaWdnZXJzIGNoYW5nZSBub3RpZmljYXRpb24gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QKICogYWxyZWFkeSBleGlzdC4KICovCmZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbCkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3Qgc2V0IHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5sZW5ndGggPSBNYXRoLm1heCh0YXJnZXQubGVuZ3RoLCBrZXkpOwogICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7CiAgICB0YXJnZXRba2V5XSA9IHZhbDsKICAgIHJldHVybiB2YWwKICB9CiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fOwogIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICdBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICsKICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLicKICAgICk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmICghb2IpIHsKICAgIHRhcmdldFtrZXldID0gdmFsOwogICAgcmV0dXJuIHZhbAogIH0KICBkZWZpbmVSZWFjdGl2ZShvYi52YWx1ZSwga2V5LCB2YWwpOwogIG9iLmRlcC5ub3RpZnkoKTsKICByZXR1cm4gdmFsCn0KCi8qKgogKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5LgogKi8KZnVuY3Rpb24gZGVsICh0YXJnZXQsIGtleSkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3QgZGVsZXRlIHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxKTsKICAgIHJldHVybgogIH0KICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187CiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArCiAgICAgICctIGp1c3Qgc2V0IGl0IHRvIG51bGwuJwogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIHsKICAgIHJldHVybgogIH0KICBkZWxldGUgdGFyZ2V0W2tleV07CiAgaWYgKCFvYikgewogICAgcmV0dXJuCiAgfQogIG9iLmRlcC5ub3RpZnkoKTsKfQoKLyoqCiAqIENvbGxlY3QgZGVwZW5kZW5jaWVzIG9uIGFycmF5IGVsZW1lbnRzIHdoZW4gdGhlIGFycmF5IGlzIHRvdWNoZWQsIHNpbmNlCiAqIHdlIGNhbm5vdCBpbnRlcmNlcHQgYXJyYXkgZWxlbWVudCBhY2Nlc3MgbGlrZSBwcm9wZXJ0eSBnZXR0ZXJzLgogKi8KZnVuY3Rpb24gZGVwZW5kQXJyYXkgKHZhbHVlKSB7CiAgZm9yICh2YXIgZSA9ICh2b2lkIDApLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZSA9IHZhbHVlW2ldOwogICAgZSAmJiBlLl9fb2JfXyAmJiBlLl9fb2JfXy5kZXAuZGVwZW5kKCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICBkZXBlbmRBcnJheShlKTsKICAgIH0KICB9Cn0KCi8qICAqLwoKLyoqCiAqIE9wdGlvbiBvdmVyd3JpdGluZyBzdHJhdGVnaWVzIGFyZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb24KICogdmFsdWUgaW50byB0aGUgZmluYWwgdmFsdWUuCiAqLwp2YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llczsKCi8qKgogKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zCiAqLwp7CiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7CiAgICBpZiAoIXZtKSB7CiAgICAgIHdhcm4oCiAgICAgICAgIm9wdGlvbiBcIiIgKyBrZXkgKyAiXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgIiArCiAgICAgICAgJ2NyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJwogICAgICApOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRTdHJhdChwYXJlbnQsIGNoaWxkKQogIH07Cn0KCi8qKgogKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci4KICovCmZ1bmN0aW9uIG1lcmdlRGF0YSAodG8sIGZyb20pIHsKICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH0KICB2YXIga2V5LCB0b1ZhbCwgZnJvbVZhbDsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyb20pOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAga2V5ID0ga2V5c1tpXTsKICAgIHRvVmFsID0gdG9ba2V5XTsKICAgIGZyb21WYWwgPSBmcm9tW2tleV07CiAgICBpZiAoIWhhc093bih0bywga2V5KSkgewogICAgICBzZXQodG8sIGtleSwgZnJvbVZhbCk7CiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodG9WYWwpICYmIGlzUGxhaW5PYmplY3QoZnJvbVZhbCkpIHsKICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTsKICAgIH0KICB9CiAgcmV0dXJuIHRvCn0KCi8qKgogKiBEYXRhCiAqLwpmdW5jdGlvbiBtZXJnZURhdGFPckZuICgKICBwYXJlbnRWYWwsCiAgY2hpbGRWYWwsCiAgdm0KKSB7CiAgaWYgKCF2bSkgewogICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnMKICAgIGlmICghY2hpbGRWYWwpIHsKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgaWYgKCFwYXJlbnRWYWwpIHsKICAgICAgcmV0dXJuIGNoaWxkVmFsCiAgICB9CiAgICAvLyB3aGVuIHBhcmVudFZhbCAmIGNoaWxkVmFsIGFyZSBib3RoIHByZXNlbnQsCiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0bwogICAgLy8gY2hlY2sgaWYgcGFyZW50VmFsIGlzIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlCiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy4KICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkgewogICAgICByZXR1cm4gbWVyZ2VEYXRhKAogICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCwKICAgICAgICB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nID8gcGFyZW50VmFsLmNhbGwodGhpcywgdGhpcykgOiBwYXJlbnRWYWwKICAgICAgKQogICAgfQogIH0gZWxzZSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkSW5zdGFuY2VEYXRhRm4gKCkgewogICAgICAvLyBpbnN0YW5jZSBtZXJnZQogICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBjaGlsZFZhbC5jYWxsKHZtLCB2bSkKICAgICAgICA6IGNoaWxkVmFsOwogICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSwgdm0pCiAgICAgICAgOiBwYXJlbnRWYWw7CiAgICAgIGlmIChpbnN0YW5jZURhdGEpIHsKICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRhCiAgICAgIH0KICAgIH0KICB9Cn0KCnN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bQopIHsKICBpZiAoIXZtKSB7CiAgICBpZiAoY2hpbGRWYWwgJiYgdHlwZW9mIGNoaWxkVmFsICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdUaGUgImRhdGEiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICsKICAgICAgICAndGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCAnICsKICAgICAgICAnZGVmaW5pdGlvbnMuJywKICAgICAgICB2bQogICAgICApOwoKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCkKICB9CgogIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKQp9OwoKLyoqCiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy4KICovCmZ1bmN0aW9uIG1lcmdlSG9vayAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsCikgewogIHJldHVybiBjaGlsZFZhbAogICAgPyBwYXJlbnRWYWwKICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKQogICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpCiAgICAgICAgPyBjaGlsZFZhbAogICAgICAgIDogW2NoaWxkVmFsXQogICAgOiBwYXJlbnRWYWwKfQoKTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHsKICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7Cn0pOwoKLyoqCiAqIEFzc2V0cwogKgogKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvCiAqIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gY29uc3RydWN0b3Igb3B0aW9ucywgaW5zdGFuY2UKICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuCiAqLwpmdW5jdGlvbiBtZXJnZUFzc2V0cyAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICB2YXIgcmVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCk7CiAgaWYgKGNoaWxkVmFsKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgICByZXR1cm4gZXh0ZW5kKHJlcywgY2hpbGRWYWwpCiAgfSBlbHNlIHsKICAgIHJldHVybiByZXMKICB9Cn0KCkFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0czsKfSk7CgovKioKICogV2F0Y2hlcnMuCiAqCiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmUKICogYW5vdGhlciwgc28gd2UgbWVyZ2UgdGhlbSBhcyBhcnJheXMuCiAqLwpzdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLgogIGlmIChwYXJlbnRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IHBhcmVudFZhbCA9IHVuZGVmaW5lZDsgfQogIGlmIChjaGlsZFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgY2hpbGRWYWwgPSB1bmRlZmluZWQ7IH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKSB9CiAgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IHt9OwogIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7CiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHsKICAgIHZhciBwYXJlbnQgPSByZXRba2V5JDFdOwogICAgdmFyIGNoaWxkID0gY2hpbGRWYWxba2V5JDFdOwogICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7CiAgICAgIHBhcmVudCA9IFtwYXJlbnRdOwogICAgfQogICAgcmV0W2tleSQxXSA9IHBhcmVudAogICAgICA/IHBhcmVudC5jb25jYXQoY2hpbGQpCiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07CiAgfQogIHJldHVybiByZXQKfTsKCi8qKgogKiBPdGhlciBvYmplY3QgaGFzaGVzLgogKi8Kc3RyYXRzLnByb3BzID0Kc3RyYXRzLm1ldGhvZHMgPQpzdHJhdHMuaW5qZWN0ID0Kc3RyYXRzLmNvbXB1dGVkID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bSwKICBrZXkKKSB7CiAgaWYgKGNoaWxkVmFsICYmICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTsKICBpZiAoY2hpbGRWYWwpIHsgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOyB9CiAgcmV0dXJuIHJldAp9OwpzdHJhdHMucHJvdmlkZSA9IG1lcmdlRGF0YU9yRm47CgovKioKICogRGVmYXVsdCBzdHJhdGVneS4KICovCnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkgewogIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkCiAgICA/IHBhcmVudFZhbAogICAgOiBjaGlsZFZhbAp9OwoKLyoqCiAqIFZhbGlkYXRlIGNvbXBvbmVudCBuYW1lcwogKi8KZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7CiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykgewogICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7CiAgfQp9CgpmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUgKG5hbWUpIHsKICBpZiAoIS9eW2EtekEtWl1bXHctXSokLy50ZXN0KG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogIicgKyBuYW1lICsgJyIuIENvbXBvbmVudCBuYW1lcyAnICsKICAgICAgJ2NhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHRoZSBoeXBoZW4sICcgKwogICAgICAnYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci4nCiAgICApOwogIH0KICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCAnICsKICAgICAgJ2lkOiAnICsgbmFtZQogICAgKTsKICB9Cn0KCi8qKgogKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGUKICogT2JqZWN0LWJhc2VkIGZvcm1hdC4KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkgewogIHZhciBwcm9wcyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKCFwcm9wcykgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICB2YXIgaSwgdmFsLCBuYW1lOwogIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgewogICAgaSA9IHByb3BzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdmFsID0gcHJvcHNbaV07CiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgICAgIG5hbWUgPSBjYW1lbGl6ZSh2YWwpOwogICAgICAgIHJlc1tuYW1lXSA9IHsgdHlwZTogbnVsbCB9OwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oJ3Byb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4nKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgICB2YWwgPSBwcm9wc1trZXldOwogICAgICBuYW1lID0gY2FtZWxpemUoa2V5KTsKICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpCiAgICAgICAgPyB2YWwKICAgICAgICA6IHsgdHlwZTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJwcm9wc1wiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsICIgKwogICAgICAiYnV0IGdvdCAiICsgKHRvUmF3VHlwZShwcm9wcykpICsgIi4iLAogICAgICB2bQogICAgKTsKICB9CiAgb3B0aW9ucy5wcm9wcyA9IHJlczsKfQoKLyoqCiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXQKICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdCAob3B0aW9ucywgdm0pIHsKICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7CiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH0KICB2YXIgbm9ybWFsaXplZCA9IG9wdGlvbnMuaW5qZWN0ID0ge307CiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHsKICAgICAgbm9ybWFsaXplZFtpbmplY3RbaV1dID0geyBmcm9tOiBpbmplY3RbaV0gfTsKICAgIH0KICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkgewogICAgZm9yICh2YXIga2V5IGluIGluamVjdCkgewogICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07CiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKQogICAgICAgID8gZXh0ZW5kKHsgZnJvbToga2V5IH0sIHZhbCkKICAgICAgICA6IHsgZnJvbTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJpbmplY3RcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUoaW5qZWN0KSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogIH0KfQoKLyoqCiAqIE5vcm1hbGl6ZSByYXcgZnVuY3Rpb24gZGlyZWN0aXZlcyBpbnRvIG9iamVjdCBmb3JtYXQuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7CiAgdmFyIGRpcnMgPSBvcHRpb25zLmRpcmVjdGl2ZXM7CiAgaWYgKGRpcnMpIHsKICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7CiAgICAgIHZhciBkZWYgPSBkaXJzW2tleV07CiAgICAgIGlmICh0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkgewogIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsgbmFtZSArICJcIjogZXhwZWN0ZWQgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUodmFsdWUpKSArICIuIiwKICAgICAgdm0KICAgICk7CiAgfQp9CgovKioKICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLgogKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLgogKi8KZnVuY3Rpb24gbWVyZ2VPcHRpb25zICgKICBwYXJlbnQsCiAgY2hpbGQsCiAgdm0KKSB7CiAgewogICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTsKICB9CgogIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHsKICAgIGNoaWxkID0gY2hpbGQub3B0aW9uczsKICB9CgogIG5vcm1hbGl6ZVByb3BzKGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7CiAgdmFyIGV4dGVuZHNGcm9tID0gY2hpbGQuZXh0ZW5kczsKICBpZiAoZXh0ZW5kc0Zyb20pIHsKICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGV4dGVuZHNGcm9tLCB2bSk7CiAgfQogIGlmIChjaGlsZC5taXhpbnMpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTsKICAgIH0KICB9CiAgdmFyIG9wdGlvbnMgPSB7fTsKICB2YXIga2V5OwogIGZvciAoa2V5IGluIHBhcmVudCkgewogICAgbWVyZ2VGaWVsZChrZXkpOwogIH0KICBmb3IgKGtleSBpbiBjaGlsZCkgewogICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7CiAgICAgIG1lcmdlRmllbGQoa2V5KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7CiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7CiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7CiAgfQogIHJldHVybiBvcHRpb25zCn0KCi8qKgogKiBSZXNvbHZlIGFuIGFzc2V0LgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3MKICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLgogKi8KZnVuY3Rpb24gcmVzb2x2ZUFzc2V0ICgKICBvcHRpb25zLAogIHR5cGUsCiAgaWQsCiAgd2Fybk1pc3NpbmcKKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHsKICAgIHJldHVybgogIH0KICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTsKICAvLyBjaGVjayBsb2NhbCByZWdpc3RyYXRpb24gdmFyaWF0aW9ucyBmaXJzdAogIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfQogIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTsKICBpZiAoaGFzT3duKGFzc2V0cywgY2FtZWxpemVkSWQpKSB7IHJldHVybiBhc3NldHNbY2FtZWxpemVkSWRdIH0KICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7CiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH0KICAvLyBmYWxsYmFjayB0byBwcm90b3R5cGUgY2hhaW4KICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykgewogICAgd2FybigKICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCwKICAgICAgb3B0aW9ucwogICAgKTsKICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIHZhbGlkYXRlUHJvcCAoCiAga2V5LAogIHByb3BPcHRpb25zLAogIHByb3BzRGF0YSwKICB2bQopIHsKICB2YXIgcHJvcCA9IHByb3BPcHRpb25zW2tleV07CiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpOwogIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldOwogIC8vIGJvb2xlYW4gY2FzdGluZwogIHZhciBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTsKICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHsKICAgIGlmIChhYnNlbnQgJiYgIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7CiAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHsKICAgICAgLy8gb25seSBjYXN0IGVtcHR5IHN0cmluZyAvIHNhbWUgbmFtZSB0byBib29sZWFuIGlmCiAgICAgIC8vIGJvb2xlYW4gaGFzIGhpZ2hlciBwcmlvcml0eQogICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpOwogICAgICBpZiAoc3RyaW5nSW5kZXggPCAwIHx8IGJvb2xlYW5JbmRleCA8IHN0cmluZ0luZGV4KSB7CiAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQogIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUKICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpOwogICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LAogICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuCiAgICB2YXIgcHJldlNob3VsZE9ic2VydmUgPSBzaG91bGRPYnNlcnZlOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogICAgb2JzZXJ2ZSh2YWx1ZSk7CiAgICB0b2dnbGVPYnNlcnZpbmcocHJldlNob3VsZE9ic2VydmUpOwogIH0KICB7CiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpOwogIH0KICByZXR1cm4gdmFsdWUKfQoKLyoqCiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuCiAqLwpmdW5jdGlvbiBnZXRQcm9wRGVmYXVsdFZhbHVlICh2bSwgcHJvcCwga2V5KSB7CiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZAogIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHsKICAgIHJldHVybiB1bmRlZmluZWQKICB9CiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDsKICAvLyB3YXJuIGFnYWluc3Qgbm9uLWZhY3RvcnkgZGVmYXVsdHMgZm9yIE9iamVjdCAmIEFycmF5CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wICInICsga2V5ICsgJyI6ICcgKwogICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArCiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJywKICAgICAgdm0KICAgICk7CiAgfQogIC8vIHRoZSByYXcgcHJvcCB2YWx1ZSB3YXMgYWxzbyB1bmRlZmluZWQgZnJvbSBwcmV2aW91cyByZW5kZXIsCiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyCiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJgogICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhW2tleV0gPT09IHVuZGVmaW5lZCAmJgogICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZAogICkgewogICAgcmV0dXJuIHZtLl9wcm9wc1trZXldCiAgfQogIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzCiAgLy8gYSB2YWx1ZSBpcyBGdW5jdGlvbiBpZiBpdHMgcHJvdG90eXBlIGlzIGZ1bmN0aW9uIGV2ZW4gYWNyb3NzIGRpZmZlcmVudCBleGVjdXRpb24gY29udGV4dAogIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJwogICAgPyBkZWYuY2FsbCh2bSkKICAgIDogZGVmCn0KCi8qKgogKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuCiAqLwpmdW5jdGlvbiBhc3NlcnRQcm9wICgKICBwcm9wLAogIG5hbWUsCiAgdmFsdWUsCiAgdm0sCiAgYWJzZW50CikgewogIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkgewogICAgd2FybigKICAgICAgJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogIicgKyBuYW1lICsgJyInLAogICAgICB2bQogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkgewogICAgcmV0dXJuCiAgfQogIHZhciB0eXBlID0gcHJvcC50eXBlOwogIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7CiAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTsKICBpZiAodHlwZSkgewogICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7CiAgICAgIHR5cGUgPSBbdHlwZV07CiAgICB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7CiAgICAgIHZhciBhc3NlcnRlZFR5cGUgPSBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlW2ldKTsKICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpOwogICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDsKICAgIH0KICB9CiAgaWYgKCF2YWxpZCkgewogICAgd2FybigKICAgICAgIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIiICsgbmFtZSArICJcIi4iICsKICAgICAgIiBFeHBlY3RlZCAiICsgKGV4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oJywgJykpICsKICAgICAgIiwgZ290ICIgKyAodG9SYXdUeXBlKHZhbHVlKSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjsKICBpZiAodmFsaWRhdG9yKSB7CiAgICBpZiAoIXZhbGlkYXRvcih2YWx1ZSkpIHsKICAgICAgd2FybigKICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJyArIG5hbWUgKyAnIi4nLAogICAgICAgIHZtCiAgICAgICk7CiAgICB9CiAgfQp9Cgp2YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87CgpmdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkgewogIHZhciB2YWxpZDsKICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTsKICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTsKICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzCiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlOwogICAgfQogIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0JykgewogICAgdmFsaWQgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTsKICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5JykgewogICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTsKICB9IGVsc2UgewogICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7CiAgfQogIHJldHVybiB7CiAgICB2YWxpZDogdmFsaWQsCiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZQogIH0KfQoKLyoqCiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcywKICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nCiAqIGFjcm9zcyBkaWZmZXJlbnQgdm1zIC8gaWZyYW1lcy4KICovCmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7CiAgdmFyIG1hdGNoID0gZm4gJiYgZm4udG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7CiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJwp9CgpmdW5jdGlvbiBpc1NhbWVUeXBlIChhLCBiKSB7CiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYikKfQoKZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7CiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMQogIH0KICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgaWYgKGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlc1tpXSwgdHlwZSkpIHsKICAgICAgcmV0dXJuIGkKICAgIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qICAqLwoKZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAodm0pIHsKICAgIHZhciBjdXIgPSB2bTsKICAgIHdoaWxlICgoY3VyID0gY3VyLiRwYXJlbnQpKSB7CiAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkOwogICAgICBpZiAoaG9va3MpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7CiAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7IHJldHVybiB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKQogICAgfSBjYXRjaCAoZSkgewogICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpOwogICAgfQogIH0KICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICB7CiAgICB3YXJuKCgiRXJyb3IgaW4gIiArIGluZm8gKyAiOiBcIiIgKyAoZXJyLnRvU3RyaW5nKCkpICsgIlwiIiksIHZtKTsKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAoKGluQnJvd3NlciB8fCBpbldlZXgpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgewogICAgY29uc29sZS5lcnJvcihlcnIpOwogIH0gZWxzZSB7CiAgICB0aHJvdyBlcnIKICB9Cn0KCi8qICAqLwovKiBnbG9iYWxzIE1lc3NhZ2VDaGFubmVsICovCgp2YXIgY2FsbGJhY2tzID0gW107CnZhciBwZW5kaW5nID0gZmFsc2U7CgpmdW5jdGlvbiBmbHVzaENhbGxiYWNrcyAoKSB7CiAgcGVuZGluZyA9IGZhbHNlOwogIHZhciBjb3BpZXMgPSBjYWxsYmFja3Muc2xpY2UoMCk7CiAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHsKICAgIGNvcGllc1tpXSgpOwogIH0KfQoKLy8gSGVyZSB3ZSBoYXZlIGFzeW5jIGRlZmVycmluZyB3cmFwcGVycyB1c2luZyBib3RoIG1pY3JvdGFza3MgYW5kIChtYWNybykgdGFza3MuCi8vIEluIDwgMi40IHdlIHVzZWQgbWljcm90YXNrcyBldmVyeXdoZXJlLCBidXQgdGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZXJlCi8vIG1pY3JvdGFza3MgaGF2ZSB0b28gaGlnaCBhIHByaW9yaXR5IGFuZCBmaXJlIGluIGJldHdlZW4gc3VwcG9zZWRseQovLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTApIG9yIGV2ZW4gYmV0d2VlbiBidWJibGluZyBvZiB0aGUgc2FtZQovLyBldmVudCAoIzY1NjYpLiBIb3dldmVyLCB1c2luZyAobWFjcm8pIHRhc2tzIGV2ZXJ5d2hlcmUgYWxzbyBoYXMgc3VidGxlIHByb2JsZW1zCi8vIHdoZW4gc3RhdGUgaXMgY2hhbmdlZCByaWdodCBiZWZvcmUgcmVwYWludCAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS4KLy8gSGVyZSB3ZSB1c2UgbWljcm90YXNrIGJ5IGRlZmF1bHQsIGJ1dCBleHBvc2UgYSB3YXkgdG8gZm9yY2UgKG1hY3JvKSB0YXNrIHdoZW4KLy8gbmVlZGVkIChlLmcuIGluIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIGJ5IHYtb24pLgp2YXIgbWljcm9UaW1lckZ1bmM7CnZhciBtYWNyb1RpbWVyRnVuYzsKdmFyIHVzZU1hY3JvVGFzayA9IGZhbHNlOwoKLy8gRGV0ZXJtaW5lIChtYWNybykgdGFzayBkZWZlciBpbXBsZW1lbnRhdGlvbi4KLy8gVGVjaG5pY2FsbHkgc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBidXQgaXQncyBvbmx5IGF2YWlsYWJsZQovLyBpbiBJRS4gVGhlIG9ubHkgcG9seWZpbGwgdGhhdCBjb25zaXN0ZW50bHkgcXVldWVzIHRoZSBjYWxsYmFjayBhZnRlciBhbGwgRE9NCi8vIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIHNhbWUgbG9vcCBpcyBieSB1c2luZyBNZXNzYWdlQ2hhbm5lbC4KLyogaXN0YW5idWwgaWdub3JlIGlmICovCmlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShzZXRJbW1lZGlhdGUpKSB7CiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpOwogIH07Cn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJyAmJiAoCiAgaXNOYXRpdmUoTWVzc2FnZUNoYW5uZWwpIHx8CiAgLy8gUGhhbnRvbUpTCiAgTWVzc2FnZUNoYW5uZWwudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgTWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvcl0nCikpIHsKICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjsKICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoQ2FsbGJhY2tzOwogIG1hY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcG9ydC5wb3N0TWVzc2FnZSgxKTsKICB9Owp9IGVsc2UgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRUaW1lb3V0KGZsdXNoQ2FsbGJhY2tzLCAwKTsKICB9Owp9CgovLyBEZXRlcm1pbmUgbWljcm90YXNrIGRlZmVyIGltcGxlbWVudGF0aW9uLgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovCmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHsKICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpOwogIG1pY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcC50aGVuKGZsdXNoQ2FsbGJhY2tzKTsKICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dAogICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlCiAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYnV0IHRoZSBxdWV1ZSBpc24ndCBiZWluZyBmbHVzaGVkLCB1bnRpbCB0aGUgYnJvd3NlcgogICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuCiAgICAvLyAiZm9yY2UiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuCiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfQogIH07Cn0gZWxzZSB7CiAgLy8gZmFsbGJhY2sgdG8gbWFjcm8KICBtaWNyb1RpbWVyRnVuYyA9IG1hY3JvVGltZXJGdW5jOwp9CgovKioKICogV3JhcCBhIGZ1bmN0aW9uIHNvIHRoYXQgaWYgYW55IGNvZGUgaW5zaWRlIHRyaWdnZXJzIHN0YXRlIGNoYW5nZSwKICogdGhlIGNoYW5nZXMgYXJlIHF1ZXVlZCB1c2luZyBhIChtYWNybykgdGFzayBpbnN0ZWFkIG9mIGEgbWljcm90YXNrLgogKi8KZnVuY3Rpb24gd2l0aE1hY3JvVGFzayAoZm4pIHsKICByZXR1cm4gZm4uX3dpdGhUYXNrIHx8IChmbi5fd2l0aFRhc2sgPSBmdW5jdGlvbiAoKSB7CiAgICB1c2VNYWNyb1Rhc2sgPSB0cnVlOwogICAgdmFyIHJlcyA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB1c2VNYWNyb1Rhc2sgPSBmYWxzZTsKICAgIHJldHVybiByZXMKICB9KQp9CgpmdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkgewogIHZhciBfcmVzb2x2ZTsKICBjYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7CiAgICBpZiAoY2IpIHsKICAgICAgdHJ5IHsKICAgICAgICBjYi5jYWxsKGN0eCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7CiAgICAgIF9yZXNvbHZlKGN0eCk7CiAgICB9CiAgfSk7CiAgaWYgKCFwZW5kaW5nKSB7CiAgICBwZW5kaW5nID0gdHJ1ZTsKICAgIGlmICh1c2VNYWNyb1Rhc2spIHsKICAgICAgbWFjcm9UaW1lckZ1bmMoKTsKICAgIH0gZWxzZSB7CiAgICAgIG1pY3JvVGltZXJGdW5jKCk7CiAgICB9CiAgfQogIC8vICRmbG93LWRpc2FibGUtbGluZQogIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgX3Jlc29sdmUgPSByZXNvbHZlOwogICAgfSkKICB9Cn0KCi8qICAqLwoKdmFyIG1hcms7CnZhciBtZWFzdXJlOwoKewogIHZhciBwZXJmID0gaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoCiAgICBwZXJmICYmCiAgICBwZXJmLm1hcmsgJiYKICAgIHBlcmYubWVhc3VyZSAmJgogICAgcGVyZi5jbGVhck1hcmtzICYmCiAgICBwZXJmLmNsZWFyTWVhc3VyZXMKICApIHsKICAgIG1hcmsgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiBwZXJmLm1hcmsodGFnKTsgfTsKICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykgewogICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpOwogICAgICBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSk7CiAgICB9OwogIH0KfQoKLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovCgp2YXIgaW5pdFByb3h5OwoKewogIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoCiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICsKICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICsKICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArCiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeQogICk7CgogIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgewogICAgd2FybigKICAgICAgIlByb3BlcnR5IG9yIG1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCAiICsKICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArCiAgICAgICdlaXRoZXIgaW4gdGhlIGRhdGEgb3B0aW9uLCBvciBmb3IgY2xhc3MtYmFzZWQgY29tcG9uZW50cywgYnkgJyArCiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICsKICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsCiAgICAgIHRhcmdldAogICAgKTsKICB9OwoKICB2YXIgaGFzUHJveHkgPQogICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7CgogIGlmIChoYXNQcm94eSkgewogICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpOwogICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2RlcywgewogICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7CiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHsKICAgICAgICAgIHdhcm4oKCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC4iICsga2V5KSk7CiAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZhciBoYXNIYW5kbGVyID0gewogICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7CiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0OwogICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fCBrZXkuY2hhckF0KDApID09PSAnXyc7CiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkCiAgICB9CiAgfTsKCiAgdmFyIGdldEhhbmRsZXIgPSB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHsKICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldFtrZXldCiAgICB9CiAgfTsKCiAgaW5pdFByb3h5ID0gZnVuY3Rpb24gaW5pdFByb3h5ICh2bSkgewogICAgaWYgKGhhc1Byb3h5KSB7CiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZQogICAgICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogICAgICB2YXIgaGFuZGxlcnMgPSBvcHRpb25zLnJlbmRlciAmJiBvcHRpb25zLnJlbmRlci5fd2l0aFN0cmlwcGVkCiAgICAgICAgPyBnZXRIYW5kbGVyCiAgICAgICAgOiBoYXNIYW5kbGVyOwogICAgICB2bS5fcmVuZGVyUHJveHkgPSBuZXcgUHJveHkodm0sIGhhbmRsZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtOwogICAgfQogIH07Cn0KCi8qICAqLwoKdmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTsKCi8qKgogKiBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZAogKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdAogKiBpcyBjb2xsZWN0ZWQgYXMgYSAiZGVlcCIgZGVwZW5kZW5jeS4KICovCmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHsKICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7CiAgc2Vlbk9iamVjdHMuY2xlYXIoKTsKfQoKZnVuY3Rpb24gX3RyYXZlcnNlICh2YWwsIHNlZW4pIHsKICB2YXIgaSwga2V5czsKICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpOwogIGlmICgoIWlzQSAmJiAhaXNPYmplY3QodmFsKSkgfHwgT2JqZWN0LmlzRnJvemVuKHZhbCkgfHwgdmFsIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybgogIH0KICBpZiAodmFsLl9fb2JfXykgewogICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7CiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7CiAgICAgIHJldHVybgogICAgfQogICAgc2Vlbi5hZGQoZGVwSWQpOwogIH0KICBpZiAoaXNBKSB7CiAgICBpID0gdmFsLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtpXSwgc2Vlbik7IH0KICB9IGVsc2UgewogICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7CiAgICBpID0ga2V5cy5sZW5ndGg7CiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9CiAgfQp9CgovKiAgKi8KCnZhciBub3JtYWxpemVFdmVudCA9IGNhY2hlZChmdW5jdGlvbiAobmFtZSkgewogIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJzsKICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lOwogIHZhciBvbmNlJCQxID0gbmFtZS5jaGFyQXQoMCkgPT09ICd+JzsgLy8gUHJlZml4ZWQgbGFzdCwgY2hlY2tlZCBmaXJzdAogIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnOwogIG5hbWUgPSBjYXB0dXJlID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgcmV0dXJuIHsKICAgIG5hbWU6IG5hbWUsCiAgICBvbmNlOiBvbmNlJCQxLAogICAgY2FwdHVyZTogY2FwdHVyZSwKICAgIHBhc3NpdmU6IHBhc3NpdmUKICB9Cn0pOwoKZnVuY3Rpb24gY3JlYXRlRm5JbnZva2VyIChmbnMpIHsKICBmdW5jdGlvbiBpbnZva2VyICgpIHsKICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50czsKCiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7CiAgICAgIHZhciBjbG9uZWQgPSBmbnMuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVycwogICAgICByZXR1cm4gZm5zLmFwcGx5KG51bGwsIGFyZ3VtZW50cykKICAgIH0KICB9CiAgaW52b2tlci5mbnMgPSBmbnM7CiAgcmV0dXJuIGludm9rZXIKfQoKZnVuY3Rpb24gdXBkYXRlTGlzdGVuZXJzICgKICBvbiwKICBvbGRPbiwKICBhZGQsCiAgcmVtb3ZlJCQxLAogIHZtCikgewogIHZhciBuYW1lLCBkZWYsIGN1ciwgb2xkLCBldmVudDsKICBmb3IgKG5hbWUgaW4gb24pIHsKICAgIGRlZiA9IGN1ciA9IG9uW25hbWVdOwogICAgb2xkID0gb2xkT25bbmFtZV07CiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNVbmRlZihjdXIpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50IFwiIiArIChldmVudC5uYW1lKSArICJcIjogZ290ICIgKyBTdHJpbmcoY3VyKSwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHsKICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHsKICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZUZuSW52b2tlcihjdXIpOwogICAgICB9CiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50Lm9uY2UsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7CiAgICAgIG9sZC5mbnMgPSBjdXI7CiAgICAgIG9uW25hbWVdID0gb2xkOwogICAgfQogIH0KICBmb3IgKG5hbWUgaW4gb2xkT24pIHsKICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkgewogICAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpOwogICAgfQogIH0KfQoKLyogICovCgpmdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7CiAgaWYgKGRlZiBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pOwogIH0KICB2YXIgaW52b2tlcjsKICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTsKCiAgZnVuY3Rpb24gd3JhcHBlZEhvb2sgKCkgewogICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgLy8gaW1wb3J0YW50OiByZW1vdmUgbWVyZ2VkIGhvb2sgdG8gZW5zdXJlIGl0J3MgY2FsbGVkIG9ubHkgb25jZQogICAgLy8gYW5kIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spOwogIH0KCiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHsKICAgIC8vIG5vIGV4aXN0aW5nIGhvb2sKICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW3dyYXBwZWRIb29rXSk7CiAgfSBlbHNlIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKGlzRGVmKG9sZEhvb2suZm5zKSAmJiBpc1RydWUob2xkSG9vay5tZXJnZWQpKSB7CiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlcgogICAgICBpbnZva2VyID0gb2xkSG9vazsKICAgICAgaW52b2tlci5mbnMucHVzaCh3cmFwcGVkSG9vayk7CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBwbGFpbiBob29rCiAgICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW29sZEhvb2ssIHdyYXBwZWRIb29rXSk7CiAgICB9CiAgfQoKICBpbnZva2VyLm1lcmdlZCA9IHRydWU7CiAgZGVmW2hvb2tLZXldID0gaW52b2tlcjsKfQoKLyogICovCgpmdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhICgKICBkYXRhLAogIEN0b3IsCiAgdGFnCikgewogIC8vIHdlIGFyZSBvbmx5IGV4dHJhY3RpbmcgcmF3IHZhbHVlcyBoZXJlLgogIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZAogIC8vIGNvbXBvbmVudCBpdHNlbGYuCiAgdmFyIHByb3BPcHRpb25zID0gQ3Rvci5vcHRpb25zLnByb3BzOwogIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkgewogICAgcmV0dXJuCiAgfQogIHZhciByZXMgPSB7fTsKICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzOwogIHZhciBwcm9wcyA9IGRhdGEucHJvcHM7CiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykgewogICAgICB2YXIgYWx0S2V5ID0gaHlwaGVuYXRlKGtleSk7CiAgICAgIHsKICAgICAgICB2YXIga2V5SW5Mb3dlckNhc2UgPSBrZXkudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoCiAgICAgICAgICBrZXkgIT09IGtleUluTG93ZXJDYXNlICYmCiAgICAgICAgICBhdHRycyAmJiBoYXNPd24oYXR0cnMsIGtleUluTG93ZXJDYXNlKQogICAgICAgICkgewogICAgICAgICAgdGlwKAogICAgICAgICAgICAiUHJvcCBcIiIgKyBrZXlJbkxvd2VyQ2FzZSArICJcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50ICIgKwogICAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh0YWcgfHwgQ3RvcikpICsgIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXMiICsKICAgICAgICAgICAgIiBcIiIgKyBrZXkgKyAiXCIuICIgKwogICAgICAgICAgICAiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCAiICsKICAgICAgICAgICAgInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gIiArCiAgICAgICAgICAgICJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFwiIiArIGFsdEtleSArICJcIiBpbnN0ZWFkIG9mIFwiIiArIGtleSArICJcIi4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGVja1Byb3AocmVzLCBwcm9wcywga2V5LCBhbHRLZXksIHRydWUpIHx8CiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrUHJvcCAoCiAgcmVzLAogIGhhc2gsCiAga2V5LAogIGFsdEtleSwKICBwcmVzZXJ2ZQopIHsKICBpZiAoaXNEZWYoaGFzaCkpIHsKICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkgewogICAgICByZXNba2V5XSA9IGhhc2hba2V5XTsKICAgICAgaWYgKCFwcmVzZXJ2ZSkgewogICAgICAgIGRlbGV0ZSBoYXNoW2tleV07CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWUKICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHsKICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07CiAgICAgIGlmICghcHJlc2VydmUpIHsKICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQogIHJldHVybiBmYWxzZQp9CgovKiAgKi8KCi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieQovLyBzdGF0aWNhbGx5IGFuYWx5emluZyB0aGUgdGVtcGxhdGUgYXQgY29tcGlsZSB0aW1lLgovLwovLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZQovLyBnZW5lcmF0ZWQgcmVuZGVyIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIEFycmF5PFZOb2RlPi4gVGhlcmUgYXJlCi8vIHR3byBjYXNlcyB3aGVyZSBleHRyYSBub3JtYWxpemF0aW9uIGlzIG5lZWRlZDoKCi8vIDEuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbXBvbmVudHMgLSBiZWNhdXNlIGEgZnVuY3Rpb25hbCBjb21wb25lbnQKLy8gbWF5IHJldHVybiBhbiBBcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJvb3QuIEluIHRoaXMgY2FzZSwganVzdCBhIHNpbXBsZQovLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGUKLy8gdGhpbmcgd2l0aCBBcnJheS5wcm90b3R5cGUuY29uY2F0LiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9ubHkgMS1sZXZlbCBkZWVwCi8vIGJlY2F1c2UgZnVuY3Rpb25hbCBjb21wb25lbnRzIGFscmVhZHkgbm9ybWFsaXplIHRoZWlyIG93biBjaGlsZHJlbi4KZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW5baV0pKSB7CiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbikKICAgIH0KICB9CiAgcmV0dXJuIGNoaWxkcmVuCn0KCi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsCi8vIGUuZy4gPHRlbXBsYXRlPiwgPHNsb3Q+LCB2LWZvciwgb3Igd2hlbiB0aGUgY2hpbGRyZW4gaXMgcHJvdmlkZWQgYnkgdXNlcgovLyB3aXRoIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zIC8gSlNYLiBJbiBzdWNoIGNhc2VzIGEgZnVsbCBub3JtYWxpemF0aW9uCi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLgpmdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbiAoY2hpbGRyZW4pIHsKICByZXR1cm4gaXNQcmltaXRpdmUoY2hpbGRyZW4pCiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXQogICAgOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKQogICAgICA/IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oY2hpbGRyZW4pCiAgICAgIDogdW5kZWZpbmVkCn0KCmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHsKICByZXR1cm4gaXNEZWYobm9kZSkgJiYgaXNEZWYobm9kZS50ZXh0KSAmJiBpc0ZhbHNlKG5vZGUuaXNDb21tZW50KQp9CgpmdW5jdGlvbiBub3JtYWxpemVBcnJheUNoaWxkcmVuIChjaGlsZHJlbiwgbmVzdGVkSW5kZXgpIHsKICB2YXIgcmVzID0gW107CiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDsKICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgIGMgPSBjaGlsZHJlbltpXTsKICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfQogICAgbGFzdEluZGV4ID0gcmVzLmxlbmd0aCAtIDE7CiAgICBsYXN0ID0gcmVzW2xhc3RJbmRleF07CiAgICAvLyAgbmVzdGVkCiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgewogICAgICBpZiAoYy5sZW5ndGggPiAwKSB7CiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyAiXyIgKyBpKSk7CiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcwogICAgICAgIGlmIChpc1RleHROb2RlKGNbMF0pICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIChjWzBdKS50ZXh0KTsKICAgICAgICAgIGMuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBjKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZShjKSkgewogICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkgewogICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMKICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgU1NSIGh5ZHJhdGlvbiBiZWNhdXNlIHRleHQgbm9kZXMgYXJlCiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7CiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHsKICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0byB2bm9kZQogICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBkZWZhdWx0IGtleSBmb3IgbmVzdGVkIGFycmF5IGNoaWxkcmVuIChsaWtlbHkgZ2VuZXJhdGVkIGJ5IHYtZm9yKQogICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmCiAgICAgICAgICBpc0RlZihjLnRhZykgJiYKICAgICAgICAgIGlzVW5kZWYoYy5rZXkpICYmCiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHsKICAgICAgICAgIGMua2V5ID0gIl9fdmxpc3QiICsgbmVzdGVkSW5kZXggKyAiXyIgKyBpICsgIl9fIjsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2goYyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIGVuc3VyZUN0b3IgKGNvbXAsIGJhc2UpIHsKICBpZiAoCiAgICBjb21wLl9fZXNNb2R1bGUgfHwKICAgIChoYXNTeW1ib2wgJiYgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJykKICApIHsKICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7CiAgfQogIHJldHVybiBpc09iamVjdChjb21wKQogICAgPyBiYXNlLmV4dGVuZChjb21wKQogICAgOiBjb21wCn0KCmZ1bmN0aW9uIGNyZWF0ZUFzeW5jUGxhY2Vob2xkZXIgKAogIGZhY3RvcnksCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7CiAgbm9kZS5hc3luY01ldGEgPSB7IGRhdGE6IGRhdGEsIGNvbnRleHQ6IGNvbnRleHQsIGNoaWxkcmVuOiBjaGlsZHJlbiwgdGFnOiB0YWcgfTsKICByZXR1cm4gbm9kZQp9CgpmdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKAogIGZhY3RvcnksCiAgYmFzZUN0b3IsCiAgY29udGV4dAopIHsKICBpZiAoaXNUcnVlKGZhY3RvcnkuZXJyb3IpICYmIGlzRGVmKGZhY3RvcnkuZXJyb3JDb21wKSkgewogICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHsKICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkCiAgfQoKICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHsKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5jb250ZXh0cykpIHsKICAgIC8vIGFscmVhZHkgcGVuZGluZwogICAgZmFjdG9yeS5jb250ZXh0cy5wdXNoKGNvbnRleHQpOwogIH0gZWxzZSB7CiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdOwogICAgdmFyIHN5bmMgPSB0cnVlOwoKICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb250ZXh0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBjb250ZXh0c1tpXS4kZm9yY2VVcGRhdGUoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykgewogICAgICAvLyBjYWNoZSByZXNvbHZlZAogICAgICBmYWN0b3J5LnJlc29sdmVkID0gZW5zdXJlQ3RvcihyZXMsIGJhc2VDdG9yKTsKICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZQogICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUikKICAgICAgaWYgKCFzeW5jKSB7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgYXN5bmMgY29tcG9uZW50OiAiICsgKFN0cmluZyhmYWN0b3J5KSkgKwogICAgICAgIChyZWFzb24gPyAoIlxuUmVhc29uOiAiICsgcmVhc29uKSA6ICcnKQogICAgICApOwogICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7CiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTsKCiAgICBpZiAoaXNPYmplY3QocmVzKSkgewogICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZQogICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7CiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc0RlZihyZXMuY29tcG9uZW50KSAmJiB0eXBlb2YgcmVzLmNvbXBvbmVudC50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7CgogICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7CiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7CiAgICAgICAgICBmYWN0b3J5LmxvYWRpbmdDb21wID0gZW5zdXJlQ3RvcihyZXMubG9hZGluZywgYmFzZUN0b3IpOwogICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkgewogICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCByZXMuZGVsYXkgfHwgMjAwKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc0RlZihyZXMudGltZW91dCkpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgICAgICAgIHJlamVjdCgKICAgICAgICAgICAgICAgICJ0aW1lb3V0ICgiICsgKHJlcy50aW1lb3V0KSArICJtcykiCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgcmVzLnRpbWVvdXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHN5bmMgPSBmYWxzZTsKICAgIC8vIHJldHVybiBpbiBjYXNlIHJlc29sdmVkIHN5bmNocm9ub3VzbHkKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmcKICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wCiAgICAgIDogZmFjdG9yeS5yZXNvbHZlZAogIH0KfQoKLyogICovCgpmdW5jdGlvbiBpc0FzeW5jUGxhY2Vob2xkZXIgKG5vZGUpIHsKICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3RvcnkKfQoKLyogICovCgpmdW5jdGlvbiBnZXRGaXJzdENvbXBvbmVudENoaWxkIChjaGlsZHJlbikgewogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkgewogICAgICAgIHJldHVybiBjCiAgICAgIH0KICAgIH0KICB9Cn0KCi8qICAqLwoKLyogICovCgpmdW5jdGlvbiBpbml0RXZlbnRzICh2bSkgewogIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTsKICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHMKICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczsKICBpZiAobGlzdGVuZXJzKSB7CiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycyk7CiAgfQp9Cgp2YXIgdGFyZ2V0OwoKZnVuY3Rpb24gYWRkIChldmVudCwgZm4sIG9uY2UpIHsKICBpZiAob25jZSkgewogICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7CiAgfSBlbHNlIHsKICAgIHRhcmdldC4kb24oZXZlbnQsIGZuKTsKICB9Cn0KCmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHsKICB0YXJnZXQuJG9mZihldmVudCwgZm4pOwp9CgpmdW5jdGlvbiB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnMgKAogIHZtLAogIGxpc3RlbmVycywKICBvbGRMaXN0ZW5lcnMKKSB7CiAgdGFyZ2V0ID0gdm07CiAgdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzIHx8IHt9LCBhZGQsIHJlbW92ZSQxLCB2bSk7CiAgdGFyZ2V0ID0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7CiAgdmFyIGhvb2tSRSA9IC9eaG9vazovOwogIFZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHRoaXMkMS4kb24oZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKHZtLl9ldmVudHNbZXZlbnRdIHx8ICh2bS5fZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChmbik7CiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uCiAgICAgIC8vIGluc3RlYWQgb2YgYSBoYXNoIGxvb2t1cAogICAgICBpZiAoaG9va1JFLnRlc3QoZXZlbnQpKSB7CiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07CgogIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgZnVuY3Rpb24gb24gKCkgewogICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7CiAgICAgIGZuLmFwcGx5KHZtLCBhcmd1bWVudHMpOwogICAgfQogICAgb24uZm4gPSBmbjsKICAgIHZtLiRvbihldmVudCwgb24pOwogICAgcmV0dXJuIHZtCiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kb2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIC8vIGFsbAogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIGFycmF5IG9mIGV2ZW50cwogICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgdGhpcyQxLiRvZmYoZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIHNwZWNpZmljIGV2ZW50CiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07CiAgICBpZiAoIWNicykgewogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmICghZm4pIHsKICAgICAgdm0uX2V2ZW50c1tldmVudF0gPSBudWxsOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmIChmbikgewogICAgICAvLyBzcGVjaWZpYyBoYW5kbGVyCiAgICAgIHZhciBjYjsKICAgICAgdmFyIGkkMSA9IGNicy5sZW5ndGg7CiAgICAgIHdoaWxlIChpJDEtLSkgewogICAgICAgIGNiID0gY2JzW2kkMV07CiAgICAgICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHsKICAgICAgICAgIGNicy5zcGxpY2UoaSQxLCAxKTsKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdm0KICB9OwoKICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgewogICAgICB2YXIgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7CiAgICAgICAgdGlwKAogICAgICAgICAgIkV2ZW50IFwiIiArIGxvd2VyQ2FzZUV2ZW50ICsgIlwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICIgKwogICAgICAgICAgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArICIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFwiIiArIGV2ZW50ICsgIlwiLiAiICsKICAgICAgICAgICJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSAiICsKICAgICAgICAgICJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gIiArCiAgICAgICAgICAiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIiICsgKGh5cGhlbmF0ZShldmVudCkpICsgIlwiIGluc3RlYWQgb2YgXCIiICsgZXZlbnQgKyAiXCIuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTsKICAgIGlmIChjYnMpIHsKICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7CiAgICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgY2JzW2ldLmFwcGx5KHZtLCBhcmdzKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKCJldmVudCBoYW5kbGVyIGZvciBcIiIgKyBldmVudCArICJcIiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07Cn0KCi8qICAqLwoKCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC4KICovCmZ1bmN0aW9uIHJlc29sdmVTbG90cyAoCiAgY2hpbGRyZW4sCiAgY29udGV4dAopIHsKICB2YXIgc2xvdHMgPSB7fTsKICBpZiAoIWNoaWxkcmVuKSB7CiAgICByZXR1cm4gc2xvdHMKICB9CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgdmFyIGRhdGEgPSBjaGlsZC5kYXRhOwogICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZQogICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHsKICAgICAgZGVsZXRlIGRhdGEuYXR0cnMuc2xvdDsKICAgIH0KICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZQogICAgLy8gc2FtZSBjb250ZXh0LgogICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiYKICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbAogICAgKSB7CiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90OwogICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpOwogICAgICBpZiAoY2hpbGQudGFnID09PSAndGVtcGxhdGUnKSB7CiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbG90LnB1c2goY2hpbGQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAoc2xvdHMuZGVmYXVsdCB8fCAoc2xvdHMuZGVmYXVsdCA9IFtdKSkucHVzaChjaGlsZCk7CiAgICB9CiAgfQogIC8vIGlnbm9yZSBzbG90cyB0aGF0IGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZQogIGZvciAodmFyIG5hbWUkMSBpbiBzbG90cykgewogICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkgewogICAgICBkZWxldGUgc2xvdHNbbmFtZSQxXTsKICAgIH0KICB9CiAgcmV0dXJuIHNsb3RzCn0KCmZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAobm9kZSkgewogIHJldHVybiAobm9kZS5pc0NvbW1lbnQgJiYgIW5vZGUuYXN5bmNGYWN0b3J5KSB8fCBub2RlLnRleHQgPT09ICcgJwp9CgpmdW5jdGlvbiByZXNvbHZlU2NvcGVkU2xvdHMgKAogIGZucywgLy8gc2VlIGZsb3cvdm5vZGUKICByZXMKKSB7CiAgcmVzID0gcmVzIHx8IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnNbaV0pKSB7CiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7CiAgICB9IGVsc2UgewogICAgICByZXNbZm5zW2ldLmtleV0gPSBmbnNbaV0uZm47CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsOwp2YXIgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7CgpmdW5jdGlvbiBpbml0TGlmZWN5Y2xlICh2bSkgewogIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7CgogIC8vIGxvY2F0ZSBmaXJzdCBub24tYWJzdHJhY3QgcGFyZW50CiAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7CiAgICB9CiAgICBwYXJlbnQuJGNoaWxkcmVuLnB1c2godm0pOwogIH0KCiAgdm0uJHBhcmVudCA9IHBhcmVudDsKICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtOwoKICB2bS4kY2hpbGRyZW4gPSBbXTsKICB2bS4kcmVmcyA9IHt9OwoKICB2bS5fd2F0Y2hlciA9IG51bGw7CiAgdm0uX2luYWN0aXZlID0gbnVsbDsKICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTsKICB2bS5faXNNb3VudGVkID0gZmFsc2U7CiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2U7CiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTsKfQoKZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkgewogIFZ1ZS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICh2bm9kZSwgaHlkcmF0aW5nKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKHZtLl9pc01vdW50ZWQpIHsKICAgICAgY2FsbEhvb2sodm0sICdiZWZvcmVVcGRhdGUnKTsKICAgIH0KICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7CiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlOwogICAgdmFyIHByZXZBY3RpdmVJbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlOwogICAgYWN0aXZlSW5zdGFuY2UgPSB2bTsKICAgIHZtLl92bm9kZSA9IHZub2RlOwogICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzCiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC4KICAgIGlmICghcHJldlZub2RlKSB7CiAgICAgIC8vIGluaXRpYWwgcmVuZGVyCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXygKICAgICAgICB2bS4kZWwsIHZub2RlLCBoeWRyYXRpbmcsIGZhbHNlIC8qIHJlbW92ZU9ubHkgKi8sCiAgICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSwKICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtCiAgICAgICk7CiAgICAgIC8vIG5vIG5lZWQgZm9yIHRoZSByZWYgbm9kZXMgYWZ0ZXIgaW5pdGlhbCBwYXRjaAogICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKQogICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtID0gdm0uJG9wdGlvbnMuX3JlZkVsbSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICAvLyB1cGRhdGVzCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhwcmV2Vm5vZGUsIHZub2RlKTsKICAgIH0KICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlOwogICAgLy8gdXBkYXRlIF9fdnVlX18gcmVmZXJlbmNlCiAgICBpZiAocHJldkVsKSB7CiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDsKICAgIH0KICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTsKICAgIH0KICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGwKICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7CiAgICAgIHZtLiRwYXJlbnQuJGVsID0gdm0uJGVsOwogICAgfQogICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZQogICAgLy8gdXBkYXRlZCBpbiBhIHBhcmVudCdzIHVwZGF0ZWQgaG9vay4KICB9OwoKICBWdWUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX2lzQmVpbmdEZXN0cm95ZWQpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZURlc3Ryb3knKTsKICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTsKICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50CiAgICB2YXIgcGFyZW50ID0gdm0uJHBhcmVudDsKICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHsKICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTsKICAgIH0KICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzCiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudGVhcmRvd24oKTsKICAgIH0KICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7CiAgICB9CiAgICAvLyByZW1vdmUgcmVmZXJlbmNlIGZyb20gZGF0YSBvYgogICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuCiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7CiAgICAgIHZtLl9kYXRhLl9fb2JfXy52bUNvdW50LS07CiAgICB9CiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi4KICAgIHZtLl9pc0Rlc3Ryb3llZCA9IHRydWU7CiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWUKICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpOwogICAgLy8gZmlyZSBkZXN0cm95ZWQgaG9vawogICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTsKICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuCiAgICB2bS4kb2ZmKCk7CiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2UKICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSBudWxsOwogICAgfQogICAgLy8gcmVsZWFzZSBjaXJjdWxhciByZWZlcmVuY2UgKCM2NzU5KQogICAgaWYgKHZtLiR2bm9kZSkgewogICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBtb3VudENvbXBvbmVudCAoCiAgdm0sCiAgZWwsCiAgaHlkcmF0aW5nCikgewogIHZtLiRlbCA9IGVsOwogIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7CiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlOwogICAgewogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHwKICAgICAgICB2bS4kb3B0aW9ucy5lbCB8fCBlbCkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArCiAgICAgICAgICAnY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIHByZS1jb21waWxlIHRoZSB0ZW1wbGF0ZXMgaW50byAnICsKICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgfQogIH0KICBjYWxsSG9vayh2bSwgJ2JlZm9yZU1vdW50Jyk7CgogIHZhciB1cGRhdGVDb21wb25lbnQ7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lOwogICAgICB2YXIgaWQgPSB2bS5fdWlkOwogICAgICB2YXIgc3RhcnRUYWcgPSAidnVlLXBlcmYtc3RhcnQ6IiArIGlkOwogICAgICB2YXIgZW5kVGFnID0gInZ1ZS1wZXJmLWVuZDoiICsgaWQ7CgogICAgICBtYXJrKHN0YXJ0VGFnKTsKICAgICAgdmFyIHZub2RlID0gdm0uX3JlbmRlcigpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHJlbmRlciIpLCBzdGFydFRhZywgZW5kVGFnKTsKCiAgICAgIG1hcmsoc3RhcnRUYWcpOwogICAgICB2bS5fdXBkYXRlKHZub2RlLCBoeWRyYXRpbmcpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHBhdGNoIiksIHN0YXJ0VGFnLCBlbmRUYWcpOwogICAgfTsKICB9IGVsc2UgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2bS5fdXBkYXRlKHZtLl9yZW5kZXIoKSwgaHlkcmF0aW5nKTsKICAgIH07CiAgfQoKICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvcgogIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkCiAgLy8gY29tcG9uZW50J3MgbW91bnRlZCBob29rKSwgd2hpY2ggcmVsaWVzIG9uIHZtLl93YXRjaGVyIGJlaW5nIGFscmVhZHkgZGVmaW5lZAogIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIG51bGwsIHRydWUgLyogaXNSZW5kZXJXYXRjaGVyICovKTsKICBoeWRyYXRpbmcgPSBmYWxzZTsKCiAgLy8gbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSwgY2FsbCBtb3VudGVkIG9uIHNlbGYKICAvLyBtb3VudGVkIGlzIGNhbGxlZCBmb3IgcmVuZGVyLWNyZWF0ZWQgY2hpbGQgY29tcG9uZW50cyBpbiBpdHMgaW5zZXJ0ZWQgaG9vawogIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkgewogICAgdm0uX2lzTW91bnRlZCA9IHRydWU7CiAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTsKICB9CiAgcmV0dXJuIHZtCn0KCmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50ICgKICB2bSwKICBwcm9wc0RhdGEsCiAgbGlzdGVuZXJzLAogIHBhcmVudFZub2RlLAogIHJlbmRlckNoaWxkcmVuCikgewogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7CiAgfQoKICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW4KICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG92ZXJ3cml0aW5nICRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbgogIHZhciBoYXNDaGlsZHJlbiA9ICEhKAogICAgcmVuZGVyQ2hpbGRyZW4gfHwgICAgICAgICAgICAgICAvLyBoYXMgbmV3IHN0YXRpYyBzbG90cwogICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90cwogICAgcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyB8fCAvLyBoYXMgbmV3IHNjb3BlZCBzbG90cwogICAgdm0uJHNjb3BlZFNsb3RzICE9PSBlbXB0eU9iamVjdCAvLyBoYXMgb2xkIHNjb3BlZCBzbG90cwogICk7CgogIHZtLiRvcHRpb25zLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlOwogIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyCgogIGlmICh2bS5fdm5vZGUpIHsgLy8gdXBkYXRlIGNoaWxkIHRyZWUncyBwYXJlbnQKICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTsKICB9CiAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW47CgogIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5lcnMgaGFzaAogIC8vIHRoZXNlIGFyZSBhbHNvIHJlYWN0aXZlIHNvIHRoZXkgbWF5IHRyaWdnZXIgY2hpbGQgdXBkYXRlIGlmIHRoZSBjaGlsZAogIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyCiAgdm0uJGF0dHJzID0gcGFyZW50Vm5vZGUuZGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdDsKICB2bS4kbGlzdGVuZXJzID0gbGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0OwoKICAvLyB1cGRhdGUgcHJvcHMKICBpZiAocHJvcHNEYXRhICYmIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgdmFyIHByb3BzID0gdm0uX3Byb3BzOwogICAgdmFyIHByb3BLZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07CiAgICAgIHZhciBwcm9wT3B0aW9ucyA9IHZtLiRvcHRpb25zLnByb3BzOyAvLyB3dGYgZmxvdz8KICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTsKICAgIH0KICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGEKICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YSA9IHByb3BzRGF0YTsKICB9CgogIC8vIHVwZGF0ZSBsaXN0ZW5lcnMKICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7CiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTsKCiAgLy8gcmVzb2x2ZSBzbG90cyArIGZvcmNlIHVwZGF0ZSBpZiBoYXMgY2hpbGRyZW4KICBpZiAoaGFzQ2hpbGRyZW4pIHsKICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7CiAgICB2bS4kZm9yY2VVcGRhdGUoKTsKICB9CgogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlOwogIH0KfQoKZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHsKICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHsKICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfQogIH0KICByZXR1cm4gZmFsc2UKfQoKZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlOwogICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7CiAgICAgIHJldHVybgogICAgfQogIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7CiAgICByZXR1cm4KICB9CiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHsKICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pOwogICAgfQogICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7CiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgfQogIGlmICghdm0uX2luYWN0aXZlKSB7CiAgICB2bS5faW5hY3RpdmUgPSB0cnVlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7CiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHsKICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzCiAgcHVzaFRhcmdldCgpOwogIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdOwogIGlmIChoYW5kbGVycykgewogICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgdHJ5IHsKICAgICAgICBoYW5kbGVyc1tpXS5jYWxsKHZtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoaG9vayArICIgaG9vayIpKTsKICAgICAgfQogICAgfQogIH0KICBpZiAodm0uX2hhc0hvb2tFdmVudCkgewogICAgdm0uJGVtaXQoJ2hvb2s6JyArIGhvb2spOwogIH0KICBwb3BUYXJnZXQoKTsKfQoKLyogICovCgoKdmFyIE1BWF9VUERBVEVfQ09VTlQgPSAxMDA7Cgp2YXIgcXVldWUgPSBbXTsKdmFyIGFjdGl2YXRlZENoaWxkcmVuID0gW107CnZhciBoYXMgPSB7fTsKdmFyIGNpcmN1bGFyID0ge307CnZhciB3YWl0aW5nID0gZmFsc2U7CnZhciBmbHVzaGluZyA9IGZhbHNlOwp2YXIgaW5kZXggPSAwOwoKLyoqCiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS4KICovCmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkgewogIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDsKICBoYXMgPSB7fTsKICB7CiAgICBjaXJjdWxhciA9IHt9OwogIH0KICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTsKfQoKLyoqCiAqIEZsdXNoIGJvdGggcXVldWVzIGFuZCBydW4gdGhlIHdhdGNoZXJzLgogKi8KZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7CiAgZmx1c2hpbmcgPSB0cnVlOwogIHZhciB3YXRjaGVyLCBpZDsKCiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guCiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6CiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5cwogIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZCkKICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlCiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKQogIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sCiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLgogIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTsKCiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkCiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzCiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7CiAgICB3YXRjaGVyID0gcXVldWVbaW5kZXhdOwogICAgaWQgPSB3YXRjaGVyLmlkOwogICAgaGFzW2lkXSA9IG51bGw7CiAgICB3YXRjaGVyLnJ1bigpOwogICAgLy8gaW4gZGV2IGJ1aWxkLCBjaGVjayBhbmQgc3RvcCBjaXJjdWxhciB1cGRhdGVzLgogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHsKICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7CiAgICAgIGlmIChjaXJjdWxhcltpZF0gPiBNQVhfVVBEQVRFX0NPVU5UKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArICgKICAgICAgICAgICAgd2F0Y2hlci51c2VyCiAgICAgICAgICAgICAgPyAoImluIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uIFwiIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgIlwiIikKICAgICAgICAgICAgICA6ICJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uIgogICAgICAgICAgKSwKICAgICAgICAgIHdhdGNoZXIudm0KICAgICAgICApOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICB9CgogIC8vIGtlZXAgY29waWVzIG9mIHBvc3QgcXVldWVzIGJlZm9yZSByZXNldHRpbmcgc3RhdGUKICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpOwogIHZhciB1cGRhdGVkUXVldWUgPSBxdWV1ZS5zbGljZSgpOwoKICByZXNldFNjaGVkdWxlclN0YXRlKCk7CgogIC8vIGNhbGwgY29tcG9uZW50IHVwZGF0ZWQgYW5kIGFjdGl2YXRlZCBob29rcwogIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7CiAgY2FsbFVwZGF0ZWRIb29rcyh1cGRhdGVkUXVldWUpOwoKICAvLyBkZXZ0b29sIGhvb2sKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoZGV2dG9vbHMgJiYgY29uZmlnLmRldnRvb2xzKSB7CiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpOwogIH0KfQoKZnVuY3Rpb24gY2FsbFVwZGF0ZWRIb29rcyAocXVldWUpIHsKICB2YXIgaSA9IHF1ZXVlLmxlbmd0aDsKICB3aGlsZSAoaS0tKSB7CiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2ldOwogICAgdmFyIHZtID0gd2F0Y2hlci52bTsKICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkKSB7CiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpOwogICAgfQogIH0KfQoKLyoqCiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC4KICogVGhlIHF1ZXVlIHdpbGwgYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSBlbnRpcmUgdHJlZSBoYXMgYmVlbiBwYXRjaGVkLgogKi8KZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7CiAgLy8gc2V0dGluZyBfaW5hY3RpdmUgdG8gZmFsc2UgaGVyZSBzbyB0aGF0IGEgcmVuZGVyIGZ1bmN0aW9uIGNhbgogIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpCiAgdm0uX2luYWN0aXZlID0gZmFsc2U7CiAgYWN0aXZhdGVkQ2hpbGRyZW4ucHVzaCh2bSk7Cn0KCmZ1bmN0aW9uIGNhbGxBY3RpdmF0ZWRIb29rcyAocXVldWUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlOwogICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChxdWV1ZVtpXSwgdHJ1ZSAvKiB0cnVlICovKTsKICB9Cn0KCi8qKgogKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLgogKiBKb2JzIHdpdGggZHVwbGljYXRlIElEcyB3aWxsIGJlIHNraXBwZWQgdW5sZXNzIGl0J3MKICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuCiAqLwpmdW5jdGlvbiBxdWV1ZVdhdGNoZXIgKHdhdGNoZXIpIHsKICB2YXIgaWQgPSB3YXRjaGVyLmlkOwogIGlmIChoYXNbaWRdID09IG51bGwpIHsKICAgIGhhc1tpZF0gPSB0cnVlOwogICAgaWYgKCFmbHVzaGluZykgewogICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZAogICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LgogICAgICB2YXIgaSA9IHF1ZXVlLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7CiAgICAgICAgaS0tOwogICAgICB9CiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7CiAgICB9CiAgICAvLyBxdWV1ZSB0aGUgZmx1c2gKICAgIGlmICghd2FpdGluZykgewogICAgICB3YWl0aW5nID0gdHJ1ZTsKICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciB1aWQkMSA9IDA7CgovKioKICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsCiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuCiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLgogKi8KdmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGNiLAogIG9wdGlvbnMsCiAgaXNSZW5kZXJXYXRjaGVyCikgewogIHRoaXMudm0gPSB2bTsKICBpZiAoaXNSZW5kZXJXYXRjaGVyKSB7CiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7CiAgfQogIHZtLl93YXRjaGVycy5wdXNoKHRoaXMpOwogIC8vIG9wdGlvbnMKICBpZiAob3B0aW9ucykgewogICAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7CiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjsKICAgIHRoaXMubGF6eSA9ICEhb3B0aW9ucy5sYXp5OwogICAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7CiAgfSBlbHNlIHsKICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlOwogIH0KICB0aGlzLmNiID0gY2I7CiAgdGhpcy5pZCA9ICsrdWlkJDE7IC8vIHVpZCBmb3IgYmF0Y2hpbmcKICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnMKICB0aGlzLmRlcHMgPSBbXTsKICB0aGlzLm5ld0RlcHMgPSBbXTsKICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7CiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpOwogIHRoaXMuZXhwcmVzc2lvbiA9IGV4cE9yRm4udG9TdHJpbmcoKTsKICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXIKICBpZiAodHlwZW9mIGV4cE9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjsKICB9IGVsc2UgewogICAgdGhpcy5nZXR0ZXIgPSBwYXJzZVBhdGgoZXhwT3JGbik7CiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7CiAgICAgIHRoaXMuZ2V0dGVyID0gZnVuY3Rpb24gKCkge307CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXCIiICsgZXhwT3JGbiArICJcIiAiICsKICAgICAgICAnV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuICcgKwogICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsCiAgICAgICAgdm0KICAgICAgKTsKICAgIH0KICB9CiAgdGhpcy52YWx1ZSA9IHRoaXMubGF6eQogICAgPyB1bmRlZmluZWQKICAgIDogdGhpcy5nZXQoKTsKfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkgewogIHB1c2hUYXJnZXQodGhpcyk7CiAgdmFyIHZhbHVlOwogIHZhciB2bSA9IHRoaXMudm07CiAgdHJ5IHsKICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIGlmICh0aGlzLnVzZXIpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICgiZ2V0dGVyIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZQogICAgfQogIH0gZmluYWxseSB7CiAgICAvLyAidG91Y2giIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzCiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmcKICAgIGlmICh0aGlzLmRlZXApIHsKICAgICAgdHJhdmVyc2UodmFsdWUpOwogICAgfQogICAgcG9wVGFyZ2V0KCk7CiAgICB0aGlzLmNsZWFudXBEZXBzKCk7CiAgfQogIHJldHVybiB2YWx1ZQp9OwoKLyoqCiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5hZGREZXAgPSBmdW5jdGlvbiBhZGREZXAgKGRlcCkgewogIHZhciBpZCA9IGRlcC5pZDsKICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHsKICAgIHRoaXMubmV3RGVwSWRzLmFkZChpZCk7CiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApOwogICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7CiAgICAgIGRlcC5hZGRTdWIodGhpcyk7CiAgICB9CiAgfQp9OwoKLyoqCiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGRlcCA9IHRoaXMkMS5kZXBzW2ldOwogICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7CiAgICAgIGRlcC5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICB9CiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzOwogIHRoaXMuZGVwSWRzID0gdGhpcy5uZXdEZXBJZHM7CiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7CiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTsKICB0bXAgPSB0aGlzLmRlcHM7CiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzOwogIHRoaXMubmV3RGVwcyA9IHRtcDsKICB0aGlzLm5ld0RlcHMubGVuZ3RoID0gMDsKfTsKCi8qKgogKiBTdWJzY3JpYmVyIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy4KICovCldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAodGhpcy5sYXp5KSB7CiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICB9IGVsc2UgaWYgKHRoaXMuc3luYykgewogICAgdGhpcy5ydW4oKTsKICB9IGVsc2UgewogICAgcXVldWVXYXRjaGVyKHRoaXMpOwogIH0KfTsKCi8qKgogKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci4KICovCldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7CiAgaWYgKHRoaXMuYWN0aXZlKSB7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpOwogICAgaWYgKAogICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fAogICAgICAvLyBEZWVwIHdhdGNoZXJzIGFuZCB3YXRjaGVycyBvbiBPYmplY3QvQXJyYXlzIHNob3VsZCBmaXJlIGV2ZW4KICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heQogICAgICAvLyBoYXZlIG11dGF0ZWQuCiAgICAgIGlzT2JqZWN0KHZhbHVlKSB8fAogICAgICB0aGlzLmRlZXAKICAgICkgewogICAgICAvLyBzZXQgbmV3IHZhbHVlCiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgaWYgKHRoaXMudXNlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoImNhbGxiYWNrIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgfQogICAgfQogIH0KfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuCiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy4KICovCldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkgewogIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpOwogIHRoaXMuZGlydHkgPSBmYWxzZTsKfTsKCi8qKgogKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci4KICovCldhdGNoZXIucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIHRoaXMkMS5kZXBzW2ldLmRlcGVuZCgpOwogIH0KfTsKCi8qKgogKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC4KICovCldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogIGlmICh0aGlzLmFjdGl2ZSkgewogICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdAogICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdAogICAgLy8gaWYgdGhlIHZtIGlzIGJlaW5nIGRlc3Ryb3llZC4KICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkgewogICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpOwogICAgfQogICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogICAgd2hpbGUgKGktLSkgewogICAgICB0aGlzJDEuZGVwc1tpXS5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgfQp9OwoKLyogICovCgp2YXIgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uID0gewogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGdldDogbm9vcCwKICBzZXQ6IG5vb3AKfTsKCmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHsKICAgIHJldHVybiB0aGlzW3NvdXJjZUtleV1ba2V5XQogIH07CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHsKICAgIHRoaXNbc291cmNlS2V5XVtrZXldID0gdmFsOwogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pOwp9CgpmdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7CiAgdm0uX3dhdGNoZXJzID0gW107CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9uczsKICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9CiAgaWYgKG9wdHMubWV0aG9kcykgeyBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKTsgfQogIGlmIChvcHRzLmRhdGEpIHsKICAgIGluaXREYXRhKHZtKTsKICB9IGVsc2UgewogICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pOwogIH0KICBpZiAob3B0cy5jb21wdXRlZCkgeyBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpOyB9CiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHsKICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7CiAgfQp9CgpmdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHsKICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9OwogIHZhciBwcm9wcyA9IHZtLl9wcm9wcyA9IHt9OwogIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5CiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uCiAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBbXTsKICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7CiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkCiAgaWYgKCFpc1Jvb3QpIHsKICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7CiAgfQogIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICBrZXlzLnB1c2goa2V5KTsKICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7CiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwogICAgewogICAgICB2YXIgaHlwaGVuYXRlZEtleSA9IGh5cGhlbmF0ZShrZXkpOwogICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShoeXBoZW5hdGVkS2V5KSB8fAogICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiXCIiICsgaHlwaGVuYXRlZEtleSArICJcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuIiksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgZGVmaW5lUmVhY3RpdmUocHJvcHMsIGtleSwgdmFsdWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodm0uJHBhcmVudCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlICIgKwogICAgICAgICAgICAib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgIiArCiAgICAgICAgICAgICJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcIiIgKyBrZXkgKyAiXCIiLAogICAgICAgICAgICB2bQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZQogICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXQKICAgIC8vIGluc3RhbnRpYXRpb24gaGVyZS4KICAgIGlmICghKGtleSBpbiB2bSkpIHsKICAgICAgcHJveHkodm0sICJfcHJvcHMiLCBrZXkpOwogICAgfQogIH07CgogIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApOwogIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKfQoKZnVuY3Rpb24gaW5pdERhdGEgKHZtKSB7CiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhOwogIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nCiAgICA/IGdldERhdGEoZGF0YSwgdm0pCiAgICA6IGRhdGEgfHwge307CiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7CiAgICBkYXRhID0ge307CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ2RhdGEgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0OlxuJyArCiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLAogICAgICB2bQogICAgKTsKICB9CiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgdmFyIG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzOwogIHZhciBpID0ga2V5cy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICB7CiAgICAgIGlmIChtZXRob2RzICYmIGhhc093bihtZXRob2RzLCBrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiTWV0aG9kIFwiIiArIGtleSArICJcIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBkYXRhIHByb3BlcnR5LiIpLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBpZiAocHJvcHMgJiYgaGFzT3duKHByb3BzLCBrZXkpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJUaGUgZGF0YSBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuICIgKwogICAgICAgICJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuIiwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgIHByb3h5KHZtLCAiX2RhdGEiLCBrZXkpOwogICAgfQogIH0KICAvLyBvYnNlcnZlIGRhdGEKICBvYnNlcnZlKGRhdGEsIHRydWUgLyogYXNSb290RGF0YSAqLyk7Cn0KCmZ1bmN0aW9uIGdldERhdGEgKGRhdGEsIHZtKSB7CiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVycwogIHB1c2hUYXJnZXQoKTsKICB0cnkgewogICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pCiAgfSBjYXRjaCAoZSkgewogICAgaGFuZGxlRXJyb3IoZSwgdm0sICJkYXRhKCkiKTsKICAgIHJldHVybiB7fQogIH0gZmluYWxseSB7CiAgICBwb3BUYXJnZXQoKTsKICB9Cn0KCnZhciBjb21wdXRlZFdhdGNoZXJPcHRpb25zID0geyBsYXp5OiB0cnVlIH07CgpmdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkgewogIC8vICRmbG93LWRpc2FibGUtbGluZQogIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUgogIHZhciBpc1NTUiA9IGlzU2VydmVyUmVuZGVyaW5nKCk7CgogIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkgewogICAgdmFyIHVzZXJEZWYgPSBjb21wdXRlZFtrZXldOwogICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0OwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBnZXR0ZXIgPT0gbnVsbCkgewogICAgICB3YXJuKAogICAgICAgICgiR2V0dGVyIGlzIG1pc3NpbmcgZm9yIGNvbXB1dGVkIHByb3BlcnR5IFwiIiArIGtleSArICJcIi4iKSwKICAgICAgICB2bQogICAgICApOwogICAgfQoKICAgIGlmICghaXNTU1IpIHsKICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKAogICAgICAgIHZtLAogICAgICAgIGdldHRlciB8fCBub29wLAogICAgICAgIG5vb3AsCiAgICAgICAgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucwogICAgICApOwogICAgfQoKICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGUKICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkCiAgICAvLyBhdCBpbnN0YW50aWF0aW9uIGhlcmUuCiAgICBpZiAoIShrZXkgaW4gdm0pKSB7CiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkgewogICAgICAgIHdhcm4oKCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLiIpLCB2bSk7CiAgICAgIH0gZWxzZSBpZiAodm0uJG9wdGlvbnMucHJvcHMgJiYga2V5IGluIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICAgICAgd2FybigoIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC4iKSwgdm0pOwogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBkZWZpbmVDb21wdXRlZCAoCiAgdGFyZ2V0LAogIGtleSwKICB1c2VyRGVmCikgewogIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpOwogIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlCiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KQogICAgICA6IHVzZXJEZWY7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDsKICB9IGVsc2UgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHVzZXJEZWYuZ2V0CiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2UKICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSkKICAgICAgICA6IHVzZXJEZWYuZ2V0CiAgICAgIDogbm9vcDsKICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldAogICAgICA/IHVzZXJEZWYuc2V0CiAgICAgIDogbm9vcDsKICB9CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICB3YXJuKAogICAgICAgICgiQ29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIHdhcyBhc3NpZ25lZCB0byBidXQgaXQgaGFzIG5vIHNldHRlci4iKSwKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbik7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXB1dGVkR2V0dGVyIChrZXkpIHsKICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkgewogICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTsKICAgIGlmICh3YXRjaGVyKSB7CiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7CiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpOwogICAgICB9CiAgICAgIGlmIChEZXAudGFyZ2V0KSB7CiAgICAgICAgd2F0Y2hlci5kZXBlbmQoKTsKICAgICAgfQogICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZQogICAgfQogIH0KfQoKZnVuY3Rpb24gaW5pdE1ldGhvZHMgKHZtLCBtZXRob2RzKSB7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHsKICAgIHsKICAgICAgaWYgKG1ldGhvZHNba2V5XSA9PSBudWxsKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiAiICsKICAgICAgICAgICJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAoIk1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgcHJvcC4iKSwKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuICIgKwogICAgICAgICAgIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pOwogIH0KfQoKZnVuY3Rpb24gaW5pdFdhdGNoICh2bSwgd2F0Y2gpIHsKICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHsKICAgIHZhciBoYW5kbGVyID0gd2F0Y2hba2V5XTsKICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykgewogICAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcltpXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcik7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGhhbmRsZXIsCiAgb3B0aW9ucwopIHsKICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkgewogICAgb3B0aW9ucyA9IGhhbmRsZXI7CiAgICBoYW5kbGVyID0gaGFuZGxlci5oYW5kbGVyOwogIH0KICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7CiAgICBoYW5kbGVyID0gdm1baGFuZGxlcl07CiAgfQogIHJldHVybiB2bS4kd2F0Y2goZXhwT3JGbiwgaGFuZGxlciwgb3B0aW9ucykKfQoKZnVuY3Rpb24gc3RhdGVNaXhpbiAoVnVlKSB7CiAgLy8gZmxvdyBzb21laG93IGhhcyBwcm9ibGVtcyB3aXRoIGRpcmVjdGx5IGRlY2xhcmVkIGRlZmluaXRpb24gb2JqZWN0CiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwCiAgLy8gdGhlIG9iamVjdCBoZXJlLgogIHZhciBkYXRhRGVmID0ge307CiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07CiAgdmFyIHByb3BzRGVmID0ge307CiAgcHJvcHNEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHJvcHMgfTsKICB7CiAgICBkYXRhRGVmLnNldCA9IGZ1bmN0aW9uIChuZXdEYXRhKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICsKICAgICAgICAnVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4nLAogICAgICAgIHRoaXMKICAgICAgKTsKICAgIH07CiAgICBwcm9wc0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHdhcm4oIiRwcm9wcyBpcyByZWFkb25seS4iLCB0aGlzKTsKICAgIH07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGRhdGEnLCBkYXRhRGVmKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTsKCiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0OwogIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDsKCiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoCiAgICBleHBPckZuLAogICAgY2IsCiAgICBvcHRpb25zCiAgKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKGlzUGxhaW5PYmplY3QoY2IpKSB7CiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucykKICAgIH0KICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy51c2VyID0gdHJ1ZTsKICAgIHZhciB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKTsKICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZSkgewogICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiB1bndhdGNoRm4gKCkgewogICAgICB3YXRjaGVyLnRlYXJkb3duKCk7CiAgICB9CiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0UHJvdmlkZSAodm0pIHsKICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7CiAgaWYgKHByb3ZpZGUpIHsKICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nCiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKQogICAgICA6IHByb3ZpZGU7CiAgfQp9CgpmdW5jdGlvbiBpbml0SW5qZWN0aW9ucyAodm0pIHsKICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTsKICBpZiAocmVzdWx0KSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgICAgewogICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSAiICsKICAgICAgICAgICAgIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXCIiICsga2V5ICsgIlwiIiwKICAgICAgICAgICAgdm0KICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkgewogIGlmIChpbmplY3QpIHsKICAgIC8vIGluamVjdCBpcyA6YW55IGJlY2F1c2UgZmxvdyBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgY2FjaGVkCiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBrZXlzID0gaGFzU3ltYm9sCiAgICAgID8gUmVmbGVjdC5vd25LZXlzKGluamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwogICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluamVjdCwga2V5KS5lbnVtZXJhYmxlCiAgICAgIH0pCiAgICAgIDogT2JqZWN0LmtleXMoaW5qZWN0KTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTsKICAgICAgdmFyIHNvdXJjZSA9IHZtOwogICAgICB3aGlsZSAoc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDsKICAgICAgfQogICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHsKICAgICAgICAgIHZhciBwcm92aWRlRGVmYXVsdCA9IGluamVjdFtrZXldLmRlZmF1bHQ7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pCiAgICAgICAgICAgIDogcHJvdmlkZURlZmF1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm4oKCJJbmplY3Rpb24gXCIiICsga2V5ICsgIlwiIG5vdCBmb3VuZCIpLCB2bSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLgogKi8KZnVuY3Rpb24gcmVuZGVyTGlzdCAoCiAgdmFsLAogIHJlbmRlcgopIHsKICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpOwogICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHsKICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpOwogICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBrZXkgPSBrZXlzW2ldOwogICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7CiAgICB9CiAgfQogIGlmIChpc0RlZihyZXQpKSB7CiAgICAocmV0KS5faXNWTGlzdCA9IHRydWU7CiAgfQogIHJldHVybiByZXQKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyA8c2xvdD4KICovCmZ1bmN0aW9uIHJlbmRlclNsb3QgKAogIG5hbWUsCiAgZmFsbGJhY2ssCiAgcHJvcHMsCiAgYmluZE9iamVjdAopIHsKICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07CiAgdmFyIG5vZGVzOwogIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3QKICAgIHByb3BzID0gcHJvcHMgfHwge307CiAgICBpZiAoYmluZE9iamVjdCkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc09iamVjdChiaW5kT2JqZWN0KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7CiAgICB9CiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7CiAgfSBlbHNlIHsKICAgIHZhciBzbG90Tm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXTsKICAgIC8vIHdhcm4gZHVwbGljYXRlIHNsb3QgdXNhZ2UKICAgIGlmIChzbG90Tm9kZXMpIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzbG90Tm9kZXMuX3JlbmRlcmVkKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcIiIgKyBuYW1lICsgIlwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlICIgKwogICAgICAgICAgIi0gdGhpcyB3aWxsIGxpa2VseSBjYXVzZSByZW5kZXIgZXJyb3JzLiIsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBzbG90Tm9kZXMuX3JlbmRlcmVkID0gdHJ1ZTsKICAgIH0KICAgIG5vZGVzID0gc2xvdE5vZGVzIHx8IGZhbGxiYWNrOwogIH0KCiAgdmFyIHRhcmdldCA9IHByb3BzICYmIHByb3BzLnNsb3Q7CiAgaWYgKHRhcmdldCkgewogICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpCiAgfSBlbHNlIHsKICAgIHJldHVybiBub2RlcwogIH0KfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzCiAqLwpmdW5jdGlvbiByZXNvbHZlRmlsdGVyIChpZCkgewogIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHkKfQoKLyogICovCgpmdW5jdGlvbiBpc0tleU5vdE1hdGNoIChleHBlY3QsIGFjdHVhbCkgewogIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHsKICAgIHJldHVybiBleHBlY3QuaW5kZXhPZihhY3R1YWwpID09PSAtMQogIH0gZWxzZSB7CiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWwKICB9Cn0KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgY2hlY2tpbmcga2V5Q29kZXMgZnJvbSBjb25maWcuCiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fawogKiBwYXNzaW5nIGluIGV2ZW50S2V5TmFtZSBhcyBsYXN0IGFyZ3VtZW50IHNlcGFyYXRlbHkgZm9yIGJhY2t3YXJkcyBjb21wYXQKICovCmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKAogIGV2ZW50S2V5Q29kZSwKICBrZXksCiAgYnVpbHRJbktleUNvZGUsCiAgZXZlbnRLZXlOYW1lLAogIGJ1aWx0SW5LZXlOYW1lCikgewogIHZhciBtYXBwZWRLZXlDb2RlID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbktleUNvZGU7CiAgaWYgKGJ1aWx0SW5LZXlOYW1lICYmIGV2ZW50S2V5TmFtZSAmJiAhY29uZmlnLmtleUNvZGVzW2tleV0pIHsKICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpCiAgfSBlbHNlIGlmIChtYXBwZWRLZXlDb2RlKSB7CiAgICByZXR1cm4gaXNLZXlOb3RNYXRjaChtYXBwZWRLZXlDb2RlLCBldmVudEtleUNvZGUpCiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHsKICAgIHJldHVybiBoeXBoZW5hdGUoZXZlbnRLZXlOYW1lKSAhPT0ga2V5CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgbWVyZ2luZyB2LWJpbmQ9Im9iamVjdCIgaW50byBhIFZOb2RlJ3MgZGF0YS4KICovCmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoCiAgZGF0YSwKICB0YWcsCiAgdmFsdWUsCiAgYXNQcm9wLAogIGlzU3luYwopIHsKICBpZiAodmFsdWUpIHsKICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICd2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCBvciBBcnJheSB2YWx1ZScsCiAgICAgICAgdGhpcwogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgdmFsdWUgPSB0b09iamVjdCh2YWx1ZSk7CiAgICAgIH0KICAgICAgdmFyIGhhc2g7CiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8CiAgICAgICAgICBrZXkgPT09ICdzdHlsZScgfHwKICAgICAgICAgIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUoa2V5KQogICAgICAgICkgewogICAgICAgICAgaGFzaCA9IGRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7CiAgICAgICAgICBoYXNoID0gYXNQcm9wIHx8IGNvbmZpZy5tdXN0VXNlUHJvcCh0YWcsIHR5cGUsIGtleSkKICAgICAgICAgICAgPyBkYXRhLmRvbVByb3BzIHx8IChkYXRhLmRvbVByb3BzID0ge30pCiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2V5IGluIGhhc2gpKSB7CiAgICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZVtrZXldOwoKICAgICAgICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgICAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICAgICAgICAgICAgb25bKCJ1cGRhdGU6IiArIGtleSldID0gZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuCiAqLwpmdW5jdGlvbiByZW5kZXJTdGF0aWMgKAogIGluZGV4LAogIGlzSW5Gb3IKKSB7CiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTsKICB2YXIgdHJlZSA9IGNhY2hlZFtpbmRleF07CiAgLy8gaWYgaGFzIGFscmVhZHktcmVuZGVyZWQgc3RhdGljIHRyZWUgYW5kIG5vdCBpbnNpZGUgdi1mb3IsCiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuCiAgaWYgKHRyZWUgJiYgIWlzSW5Gb3IpIHsKICAgIHJldHVybiB0cmVlCiAgfQogIC8vIG90aGVyd2lzZSwgcmVuZGVyIGEgZnJlc2ggdHJlZS4KICB0cmVlID0gY2FjaGVkW2luZGV4XSA9IHRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2luZGV4XS5jYWxsKAogICAgdGhpcy5fcmVuZGVyUHJveHksCiAgICBudWxsLAogICAgdGhpcyAvLyBmb3IgcmVuZGVyIGZucyBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9uYWwgY29tcG9uZW50IHRlbXBsYXRlcwogICk7CiAgbWFya1N0YXRpYyh0cmVlLCAoIl9fc3RhdGljX18iICsgaW5kZXgpLCBmYWxzZSk7CiAgcmV0dXJuIHRyZWUKfQoKLyoqCiAqIFJ1bnRpbWUgaGVscGVyIGZvciB2LW9uY2UuCiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LgogKi8KZnVuY3Rpb24gbWFya09uY2UgKAogIHRyZWUsCiAgaW5kZXgsCiAga2V5CikgewogIG1hcmtTdGF0aWModHJlZSwgKCJfX29uY2VfXyIgKyBpbmRleCArIChrZXkgPyAoIl8iICsga2V5KSA6ICIiKSksIHRydWUpOwogIHJldHVybiB0cmVlCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMgKAogIHRyZWUsCiAga2V5LAogIGlzT25jZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykgewogICAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWVbaV0sIChrZXkgKyAiXyIgKyBpKSwgaXNPbmNlKTsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBtYXJrU3RhdGljTm9kZSh0cmVlLCBrZXksIGlzT25jZSk7CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljTm9kZSAobm9kZSwga2V5LCBpc09uY2UpIHsKICBub2RlLmlzU3RhdGljID0gdHJ1ZTsKICBub2RlLmtleSA9IGtleTsKICBub2RlLmlzT25jZSA9IGlzT25jZTsKfQoKLyogICovCgpmdW5jdGlvbiBiaW5kT2JqZWN0TGlzdGVuZXJzIChkYXRhLCB2YWx1ZSkgewogIGlmICh2YWx1ZSkgewogICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJywKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICB2YXIgb24gPSBkYXRhLm9uID0gZGF0YS5vbiA/IGV4dGVuZCh7fSwgZGF0YS5vbikgOiB7fTsKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7CiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTsKICAgICAgICB2YXIgb3VycyA9IHZhbHVlW2tleV07CiAgICAgICAgb25ba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBvdXJzKSA6IG91cnM7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgpmdW5jdGlvbiBpbnN0YWxsUmVuZGVySGVscGVycyAodGFyZ2V0KSB7CiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7CiAgdGFyZ2V0Ll9uID0gdG9OdW1iZXI7CiAgdGFyZ2V0Ll9zID0gdG9TdHJpbmc7CiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDsKICB0YXJnZXQuX3QgPSByZW5kZXJTbG90OwogIHRhcmdldC5fcSA9IGxvb3NlRXF1YWw7CiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mOwogIHRhcmdldC5fbSA9IHJlbmRlclN0YXRpYzsKICB0YXJnZXQuX2YgPSByZXNvbHZlRmlsdGVyOwogIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7CiAgdGFyZ2V0Ll9iID0gYmluZE9iamVjdFByb3BzOwogIHRhcmdldC5fdiA9IGNyZWF0ZVRleHRWTm9kZTsKICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlOwogIHRhcmdldC5fdSA9IHJlc29sdmVTY29wZWRTbG90czsKICB0YXJnZXQuX2cgPSBiaW5kT2JqZWN0TGlzdGVuZXJzOwp9CgovKiAgKi8KCmZ1bmN0aW9uIEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0ICgKICBkYXRhLAogIHByb3BzLAogIGNoaWxkcmVuLAogIHBhcmVudCwKICBDdG9yCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIC8vIGVuc3VyZSB0aGUgY3JlYXRlRWxlbWVudCBmdW5jdGlvbiBpbiBmdW5jdGlvbmFsIGNvbXBvbmVudHMKICAvLyBnZXRzIGEgdW5pcXVlIGNvbnRleHQgLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBuYW1lZCBzbG90IGNoZWNrCiAgdmFyIGNvbnRleHRWbTsKICBpZiAoaGFzT3duKHBhcmVudCwgJ191aWQnKSkgewogICAgY29udGV4dFZtID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQpOwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBjb250ZXh0Vm0uX29yaWdpbmFsID0gcGFyZW50OwogIH0gZWxzZSB7CiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC4KICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYWJsZSB0byBnZXQgYSBob2xkIHRvIHRoZQogICAgLy8gcmVhbCBjb250ZXh0IGluc3RhbmNlLgogICAgY29udGV4dFZtID0gcGFyZW50OwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBwYXJlbnQgPSBwYXJlbnQuX29yaWdpbmFsOwogIH0KICB2YXIgaXNDb21waWxlZCA9IGlzVHJ1ZShvcHRpb25zLl9jb21waWxlZCk7CiAgdmFyIG5lZWROb3JtYWxpemF0aW9uID0gIWlzQ29tcGlsZWQ7CgogIHRoaXMuZGF0YSA9IGRhdGE7CiAgdGhpcy5wcm9wcyA9IHByb3BzOwogIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICB0aGlzLmxpc3RlbmVycyA9IGRhdGEub24gfHwgZW1wdHlPYmplY3Q7CiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTsKICB0aGlzLnNsb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpOyB9OwoKICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlCiAgaWYgKGlzQ29tcGlsZWQpIHsKICAgIC8vIGV4cG9zaW5nICRvcHRpb25zIGZvciByZW5kZXJTdGF0aWMoKQogICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAvLyBwcmUtcmVzb2x2ZSBzbG90cyBmb3IgcmVuZGVyU2xvdCgpCiAgICB0aGlzLiRzbG90cyA9IHRoaXMuc2xvdHMoKTsKICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gZGF0YS5zY29wZWRTbG90cyB8fCBlbXB0eU9iamVjdDsKICB9CgogIGlmIChvcHRpb25zLl9zY29wZUlkKSB7CiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsKICAgICAgdmFyIHZub2RlID0gY3JlYXRlRWxlbWVudChjb250ZXh0Vm0sIGEsIGIsIGMsIGQsIG5lZWROb3JtYWxpemF0aW9uKTsKICAgICAgaWYgKHZub2RlICYmICFBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7CiAgICAgICAgdm5vZGUuZm5Db250ZXh0ID0gcGFyZW50OwogICAgICB9CiAgICAgIHJldHVybiB2bm9kZQogICAgfTsKICB9IGVsc2UgewogICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9OwogIH0KfQoKaW5zdGFsbFJlbmRlckhlbHBlcnMoRnVuY3Rpb25hbFJlbmRlckNvbnRleHQucHJvdG90eXBlKTsKCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKAogIEN0b3IsCiAgcHJvcHNEYXRhLAogIGRhdGEsCiAgY29udGV4dFZtLAogIGNoaWxkcmVuCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIHZhciBwcm9wcyA9IHt9OwogIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKGlzRGVmKHByb3BPcHRpb25zKSkgewogICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7CiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YS5wcm9wcykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5wcm9wcyk7IH0KICB9CgogIHZhciByZW5kZXJDb250ZXh0ID0gbmV3IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0KAogICAgZGF0YSwKICAgIHByb3BzLAogICAgY2hpbGRyZW4sCiAgICBjb250ZXh0Vm0sCiAgICBDdG9yCiAgKTsKCiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTsKCiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucykKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICB2YXIgdm5vZGVzID0gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUpIHx8IFtdOwogICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc1tpXSA9IGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQodm5vZGVzW2ldLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucyk7CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0ICh2bm9kZSwgZGF0YSwgY29udGV4dFZtLCBvcHRpb25zKSB7CiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWQKICAvLyAoZS5nLiBpdCB3YXMgZnJvbSBhIGNhY2hlZCBub3JtYWwgc2xvdCkgdGhlIGZuQ29udGV4dCBjYXVzZXMgbmFtZWQgc2xvdHMKICAvLyB0aGF0IHNob3VsZCBub3QgYmUgbWF0Y2hlZCB0byBtYXRjaC4KICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTsKICBjbG9uZS5mbkNvbnRleHQgPSBjb250ZXh0Vm07CiAgY2xvbmUuZm5PcHRpb25zID0gb3B0aW9uczsKICBpZiAoZGF0YS5zbG90KSB7CiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDsKICB9CiAgcmV0dXJuIGNsb25lCn0KCmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRvLCBmcm9tKSB7CiAgZm9yICh2YXIga2V5IGluIGZyb20pIHsKICAgIHRvW2NhbWVsaXplKGtleSldID0gZnJvbVtrZXldOwogIH0KfQoKLyogICovCgoKCgovLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGhvb2sgdG8gd2VleCBuYXRpdmUgcmVuZGVyIGVuZ2luZS4KLy8gVGhlIGhvb2sgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgbmF0aXZlLCBub3QgamF2YXNjcmlwdC4KCgovLyBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHRvIHdlZXggbmF0aXZlIHJlbmRlciBlbmdpbmUuCgovKiAgKi8KCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYW5rczEwMTAwL3dlZXgtbmF0aXZlLWRpcmVjdGl2ZS90cmVlL21hc3Rlci9jb21wb25lbnQKCi8vIGxpc3RlbmluZyBvbiBuYXRpdmUgY2FsbGJhY2sKCi8qICAqLwoKLyogICovCgovLyBpbmxpbmUgaG9va3MgdG8gYmUgaW52b2tlZCBvbiBjb21wb25lbnQgVk5vZGVzIGR1cmluZyBwYXRjaAp2YXIgY29tcG9uZW50Vk5vZGVIb29rcyA9IHsKICBpbml0OiBmdW5jdGlvbiBpbml0ICgKICAgIHZub2RlLAogICAgaHlkcmF0aW5nLAogICAgcGFyZW50RWxtLAogICAgcmVmRWxtCiAgKSB7CiAgICBpZiAoCiAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmCiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiYKICAgICAgdm5vZGUuZGF0YS5rZWVwQWxpdmUKICAgICkgewogICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2gKICAgICAgdmFyIG1vdW50ZWROb2RlID0gdm5vZGU7IC8vIHdvcmsgYXJvdW5kIGZsb3cKICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKAogICAgICAgIHZub2RlLAogICAgICAgIGFjdGl2ZUluc3RhbmNlLAogICAgICAgIHBhcmVudEVsbSwKICAgICAgICByZWZFbG0KICAgICAgKTsKICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTsKICAgIH0KICB9LAoKICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkgewogICAgdmFyIG9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTsKICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KAogICAgICBjaGlsZCwKICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHMKICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzCiAgICAgIHZub2RlLCAvLyBuZXcgcGFyZW50IHZub2RlCiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuCiAgICApOwogIH0sCgogIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkgewogICAgdmFyIGNvbnRleHQgPSB2bm9kZS5jb250ZXh0OwogICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7CiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHsKICAgICAgY29tcG9uZW50SW5zdGFuY2UuX2lzTW91bnRlZCA9IHRydWU7CiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpOwogICAgfQogICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7CiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHsKICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTIKICAgICAgICAvLyBEdXJpbmcgdXBkYXRlcywgYSBrZXB0LWFsaXZlIGNvbXBvbmVudCdzIGNoaWxkIGNvbXBvbmVudHMgbWF5CiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzCiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbAogICAgICAgIC8vIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgd2hvbGUgcGF0Y2ggcHJvY2VzcyBlbmRlZC4KICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pOwogICAgICB9CiAgICB9CiAgfSwKCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHsKICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkgewogICAgICAgIGNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7CiAgICAgIH0KICAgIH0KICB9Cn07Cgp2YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7CgpmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKAogIEN0b3IsCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICBpZiAoaXNVbmRlZihDdG9yKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgYmFzZUN0b3IgPSBjb250ZXh0LiRvcHRpb25zLl9iYXNlOwoKICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3IKICBpZiAoaXNPYmplY3QoQ3RvcikpIHsKICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7CiAgfQoKICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksCiAgLy8gcmVqZWN0LgogIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJykgewogICAgewogICAgICB3YXJuKCgiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4KICB9CgogIC8vIGFzeW5jIGNvbXBvbmVudAogIHZhciBhc3luY0ZhY3Rvcnk7CiAgaWYgKGlzVW5kZWYoQ3Rvci5jaWQpKSB7CiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yOwogICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTsKICAgIGlmIChDdG9yID09PSB1bmRlZmluZWQpIHsKICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZAogICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS4KICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgYXN5bmMgc2VydmVyLXJlbmRlcmluZyBhbmQgaHlkcmF0aW9uLgogICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcigKICAgICAgICBhc3luY0ZhY3RvcnksCiAgICAgICAgZGF0YSwKICAgICAgICBjb250ZXh0LAogICAgICAgIGNoaWxkcmVuLAogICAgICAgIHRhZwogICAgICApCiAgICB9CiAgfQoKICBkYXRhID0gZGF0YSB8fCB7fTsKCiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlcgogIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvbgogIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvcik7CgogIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHMKICBpZiAoaXNEZWYoZGF0YS5tb2RlbCkpIHsKICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7CiAgfQoKICAvLyBleHRyYWN0IHByb3BzCiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTsKCiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnQKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkgewogICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoQ3RvciwgcHJvcHNEYXRhLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbikKICB9CgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzLCBzaW5jZSB0aGVzZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzCiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnMKICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjsKICAvLyByZXBsYWNlIHdpdGggbGlzdGVuZXJzIHdpdGggLm5hdGl2ZSBtb2RpZmllcgogIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLgogIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uOwoKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHsKICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmcKICAgIC8vIG90aGVyIHRoYW4gcHJvcHMgJiBsaXN0ZW5lcnMgJiBzbG90CgogICAgLy8gd29yayBhcm91bmQgZmxvdwogICAgdmFyIHNsb3QgPSBkYXRhLnNsb3Q7CiAgICBkYXRhID0ge307CiAgICBpZiAoc2xvdCkgewogICAgICBkYXRhLnNsb3QgPSBzbG90OwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlCiAgaW5zdGFsbENvbXBvbmVudEhvb2tzKGRhdGEpOwoKICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZQogIHZhciBuYW1lID0gQ3Rvci5vcHRpb25zLm5hbWUgfHwgdGFnOwogIHZhciB2bm9kZSA9IG5ldyBWTm9kZSgKICAgICgidnVlLWNvbXBvbmVudC0iICsgKEN0b3IuY2lkKSArIChuYW1lID8gKCItIiArIG5hbWUpIDogJycpKSwKICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHQsCiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LAogICAgYXN5bmNGYWN0b3J5CiAgKTsKCiAgLy8gV2VleCBzcGVjaWZpYzogaW52b2tlIHJlY3ljbGUtbGlzdCBvcHRpbWl6ZWQgQHJlbmRlciBmdW5jdGlvbiBmb3IKICAvLyBleHRyYWN0aW5nIGNlbGwtc2xvdCB0ZW1wbGF0ZS4KICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGFua3MxMDEwMC93ZWV4LW5hdGl2ZS1kaXJlY3RpdmUvdHJlZS9tYXN0ZXIvY29tcG9uZW50CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgcmV0dXJuIHZub2RlCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUgKAogIHZub2RlLCAvLyB3ZSBrbm93IGl0J3MgTW91bnRlZENvbXBvbmVudFZOb2RlIGJ1dCBmbG93IGRvZXNuJ3QKICBwYXJlbnQsIC8vIGFjdGl2ZUluc3RhbmNlIGluIGxpZmVjeWNsZSBzdGF0ZQogIHBhcmVudEVsbSwKICByZWZFbG0KKSB7CiAgdmFyIG9wdGlvbnMgPSB7CiAgICBfaXNDb21wb25lbnQ6IHRydWUsCiAgICBwYXJlbnQ6IHBhcmVudCwKICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsCiAgICBfcGFyZW50RWxtOiBwYXJlbnRFbG0gfHwgbnVsbCwKICAgIF9yZWZFbG06IHJlZkVsbSB8fCBudWxsCiAgfTsKICAvLyBjaGVjayBpbmxpbmUtdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9ucwogIHZhciBpbmxpbmVUZW1wbGF0ZSA9IHZub2RlLmRhdGEuaW5saW5lVGVtcGxhdGU7CiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkgewogICAgb3B0aW9ucy5yZW5kZXIgPSBpbmxpbmVUZW1wbGF0ZS5yZW5kZXI7CiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZuczsKICB9CiAgcmV0dXJuIG5ldyB2bm9kZS5jb21wb25lbnRPcHRpb25zLkN0b3Iob3B0aW9ucykKfQoKZnVuY3Rpb24gaW5zdGFsbENvbXBvbmVudEhvb2tzIChkYXRhKSB7CiAgdmFyIGhvb2tzID0gZGF0YS5ob29rIHx8IChkYXRhLmhvb2sgPSB7fSk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBob29rc1RvTWVyZ2VbaV07CiAgICBob29rc1trZXldID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldOwogIH0KfQoKLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50bwovLyBwcm9wIGFuZCBldmVudCBoYW5kbGVyIHJlc3BlY3RpdmVseS4KZnVuY3Rpb24gdHJhbnNmb3JtTW9kZWwgKG9wdGlvbnMsIGRhdGEpIHsKICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJzsKICB2YXIgZXZlbnQgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLmV2ZW50KSB8fCAnaW5wdXQnOyhkYXRhLnByb3BzIHx8IChkYXRhLnByb3BzID0ge30pKVtwcm9wXSA9IGRhdGEubW9kZWwudmFsdWU7CiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICBpZiAoaXNEZWYob25bZXZlbnRdKSkgewogICAgb25bZXZlbnRdID0gW2RhdGEubW9kZWwuY2FsbGJhY2tdLmNvbmNhdChvbltldmVudF0pOwogIH0gZWxzZSB7CiAgICBvbltldmVudF0gPSBkYXRhLm1vZGVsLmNhbGxiYWNrOwogIH0KfQoKLyogICovCgp2YXIgU0lNUExFX05PUk1BTElaRSA9IDE7CnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjsKCi8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHByb3ZpZGluZyBhIG1vcmUgZmxleGlibGUgaW50ZXJmYWNlCi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvdwpmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlLAogIGFsd2F5c05vcm1hbGl6ZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gZGF0YTsKICAgIGRhdGEgPSB1bmRlZmluZWQ7CiAgfQogIGlmIChpc1RydWUoYWx3YXlzTm9ybWFsaXplKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFOwogIH0KICByZXR1cm4gX2NyZWF0ZUVsZW1lbnQoY29udGV4dCwgdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUpCn0KCmZ1bmN0aW9uIF9jcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlCikgewogIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICJBdm9pZCB1c2luZyBvYnNlcnZlZCBkYXRhIG9iamVjdCBhcyB2bm9kZSBkYXRhOiAiICsgKEpTT04uc3RyaW5naWZ5KGRhdGEpKSArICJcbiIgKwogICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJywKICAgICAgY29udGV4dAogICAgKTsKICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKCkKICB9CiAgLy8gb2JqZWN0IHN5bnRheCBpbiB2LWJpbmQKICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHsKICAgIHRhZyA9IGRhdGEuaXM7CiAgfQogIGlmICghdGFnKSB7CiAgICAvLyBpbiBjYXNlIG9mIGNvbXBvbmVudCA6aXMgc2V0IHRvIGZhbHN5IHZhbHVlCiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQogIC8vIHdhcm4gYWdhaW5zdCBub24tcHJpbWl0aXZlIGtleQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIGlzRGVmKGRhdGEpICYmIGlzRGVmKGRhdGEua2V5KSAmJiAhaXNQcmltaXRpdmUoZGF0YS5rZXkpCiAgKSB7CiAgICB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCAnICsKICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLAogICAgICAgIGNvbnRleHQKICAgICAgKTsKICAgIH0KICB9CiAgLy8gc3VwcG9ydCBzaW5nbGUgZnVuY3Rpb24gY2hpbGRyZW4gYXMgZGVmYXVsdCBzY29wZWQgc2xvdAogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJgogICAgdHlwZW9mIGNoaWxkcmVuWzBdID09PSAnZnVuY3Rpb24nCiAgKSB7CiAgICBkYXRhID0gZGF0YSB8fCB7fTsKICAgIGRhdGEuc2NvcGVkU2xvdHMgPSB7IGRlZmF1bHQ6IGNoaWxkcmVuWzBdIH07CiAgICBjaGlsZHJlbi5sZW5ndGggPSAwOwogIH0KICBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IEFMV0FZU19OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gbm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0KICB2YXIgdm5vZGUsIG5zOwogIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJykgewogICAgdmFyIEN0b3I7CiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpOwogICAgaWYgKGNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHMKICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHRhZyksIGRhdGEsIGNoaWxkcmVuLAogICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0CiAgICAgICk7CiAgICB9IGVsc2UgaWYgKGlzRGVmKEN0b3IgPSByZXNvbHZlQXNzZXQoY29udGV4dC4kb3B0aW9ucywgJ2NvbXBvbmVudHMnLCB0YWcpKSkgewogICAgICAvLyBjb21wb25lbnQKICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7CiAgICB9IGVsc2UgewogICAgICAvLyB1bmtub3duIG9yIHVubGlzdGVkIG5hbWVzcGFjZWQgZWxlbWVudHMKICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHMKICAgICAgLy8gcGFyZW50IG5vcm1hbGl6ZXMgY2hpbGRyZW4KICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbiwKICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dAogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBkaXJlY3QgY29tcG9uZW50IG9wdGlvbnMgLyBjb25zdHJ1Y3RvcgogICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7CiAgfQogIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgcmV0dXJuIHZub2RlCiAgfSBlbHNlIGlmIChpc0RlZih2bm9kZSkpIHsKICAgIGlmIChpc0RlZihucykpIHsgYXBwbHlOUyh2bm9kZSwgbnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH0KICAgIHJldHVybiB2bm9kZQogIH0gZWxzZSB7CiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQp9CgpmdW5jdGlvbiBhcHBseU5TICh2bm9kZSwgbnMsIGZvcmNlKSB7CiAgdm5vZGUubnMgPSBuczsKICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHsKICAgIC8vIHVzZSBkZWZhdWx0IG5hbWVzcGFjZSBpbnNpZGUgZm9yZWlnbk9iamVjdAogICAgbnMgPSB1bmRlZmluZWQ7CiAgICBmb3JjZSA9IHRydWU7CiAgfQogIGlmIChpc0RlZih2bm9kZS5jaGlsZHJlbikpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoY2hpbGQudGFnKSAmJiAoCiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7CiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMsIGZvcmNlKTsKICAgICAgfQogICAgfQogIH0KfQoKLy8gcmVmICM1MzE4Ci8vIG5lY2Vzc2FyeSB0byBlbnN1cmUgcGFyZW50IHJlLXJlbmRlciB3aGVuIGRlZXAgYmluZGluZ3MgbGlrZSA6c3R5bGUgYW5kCi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzCmZ1bmN0aW9uIHJlZ2lzdGVyRGVlcEJpbmRpbmdzIChkYXRhKSB7CiAgaWYgKGlzT2JqZWN0KGRhdGEuc3R5bGUpKSB7CiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTsKICB9CiAgaWYgKGlzT2JqZWN0KGRhdGEuY2xhc3MpKSB7CiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHsKICB2bS5fdm5vZGUgPSBudWxsOyAvLyB0aGUgcm9vdCBvZiB0aGUgY2hpbGQgdHJlZQogIHZtLl9zdGF0aWNUcmVlcyA9IG51bGw7IC8vIHYtb25jZSBjYWNoZWQgdHJlZXMKICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogIHZhciBwYXJlbnRWbm9kZSA9IHZtLiR2bm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZQogIHZhciByZW5kZXJDb250ZXh0ID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuY29udGV4dDsKICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpOwogIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0OwogIC8vIGJpbmQgdGhlIGNyZWF0ZUVsZW1lbnQgZm4gdG8gdGhpcyBpbnN0YW5jZQogIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuCiAgLy8gYXJncyBvcmRlcjogdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUsIGFsd2F5c05vcm1hbGl6ZQogIC8vIGludGVybmFsIHZlcnNpb24gaXMgdXNlZCBieSByZW5kZXIgZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gdGVtcGxhdGVzCiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9OwogIC8vIG5vcm1hbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgZm9yIHRoZSBwdWJsaWMgdmVyc2lvbiwgdXNlZCBpbgogIC8vIHVzZXItd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zLgogIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9OwoKICAvLyAkYXR0cnMgJiAkbGlzdGVuZXJzIGFyZSBleHBvc2VkIGZvciBlYXNpZXIgSE9DIGNyZWF0aW9uLgogIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWQKICB2YXIgcGFyZW50RGF0YSA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmRhdGE7CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgewogICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkYXR0cnMgaXMgcmVhZG9ubHkuIiwgdm0pOwogICAgfSwgdHJ1ZSk7CiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LiIsIHZtKTsKICAgIH0sIHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVuZGVyTWl4aW4gKFZ1ZSkgewogIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzCiAgaW5zdGFsbFJlbmRlckhlbHBlcnMoVnVlLnByb3RvdHlwZSk7CgogIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpCiAgfTsKCiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHZtID0gdGhpczsKICAgIHZhciByZWYgPSB2bS4kb3B0aW9uczsKICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyOwogICAgdmFyIF9wYXJlbnRWbm9kZSA9IHJlZi5fcGFyZW50Vm5vZGU7CgogICAgLy8gcmVzZXQgX3JlbmRlcmVkIGZsYWcgb24gc2xvdHMgZm9yIGR1cGxpY2F0ZSBzbG90IGNoZWNrCiAgICB7CiAgICAgIGZvciAodmFyIGtleSBpbiB2bS4kc2xvdHMpIHsKICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgICB2bS4kc2xvdHNba2V5XS5fcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChfcGFyZW50Vm5vZGUpIHsKICAgICAgdm0uJHNjb3BlZFNsb3RzID0gX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMgfHwgZW1wdHlPYmplY3Q7CiAgICB9CgogICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2VzcwogICAgLy8gdG8gdGhlIGRhdGEgb24gdGhlIHBsYWNlaG9sZGVyIG5vZGUuCiAgICB2bS4kdm5vZGUgPSBfcGFyZW50Vm5vZGU7CiAgICAvLyByZW5kZXIgc2VsZgogICAgdmFyIHZub2RlOwogICAgdHJ5IHsKICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXIiKTsKICAgICAgLy8gcmV0dXJuIGVycm9yIHJlbmRlciByZXN1bHQsCiAgICAgIC8vIG9yIHByZXZpb3VzIHZub2RlIHRvIHByZXZlbnQgcmVuZGVyIGVycm9yIGNhdXNpbmcgYmxhbmsgY29tcG9uZW50CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgICAgIHsKICAgICAgICBpZiAodm0uJG9wdGlvbnMucmVuZGVyRXJyb3IpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXJFcnJvciIpOwogICAgICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGUgPSB2bS5fdm5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0CiAgICBpZiAoISh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdNdWx0aXBsZSByb290IG5vZGVzIHJldHVybmVkIGZyb20gcmVuZGVyIGZ1bmN0aW9uLiBSZW5kZXIgZnVuY3Rpb24gJyArCiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICB2bm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICAgIH0KICAgIC8vIHNldCBwYXJlbnQKICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTsKICAgIHJldHVybiB2bm9kZQogIH07Cn0KCi8qICAqLwoKdmFyIHVpZCQzID0gMDsKCmZ1bmN0aW9uIGluaXRNaXhpbiAoVnVlKSB7CiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgLy8gYSB1aWQKICAgIHZtLl91aWQgPSB1aWQkMysrOwoKICAgIHZhciBzdGFydFRhZywgZW5kVGFnOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgIHN0YXJ0VGFnID0gInZ1ZS1wZXJmLXN0YXJ0OiIgKyAodm0uX3VpZCk7CiAgICAgIGVuZFRhZyA9ICJ2dWUtcGVyZi1lbmQ6IiArICh2bS5fdWlkKTsKICAgICAgbWFyayhzdGFydFRhZyk7CiAgICB9CgogICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWQKICAgIHZtLl9pc1Z1ZSA9IHRydWU7CiAgICAvLyBtZXJnZSBvcHRpb25zCiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkgewogICAgICAvLyBvcHRpbWl6ZSBpbnRlcm5hbCBjb21wb25lbnQgaW5zdGFudGlhdGlvbgogICAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlCiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LgogICAgICBpbml0SW50ZXJuYWxDb21wb25lbnQodm0sIG9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyh2bS5jb25zdHJ1Y3RvciksCiAgICAgICAgb3B0aW9ucyB8fCB7fSwKICAgICAgICB2bQogICAgICApOwogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIHsKICAgICAgaW5pdFByb3h5KHZtKTsKICAgIH0KICAgIC8vIGV4cG9zZSByZWFsIHNlbGYKICAgIHZtLl9zZWxmID0gdm07CiAgICBpbml0TGlmZWN5Y2xlKHZtKTsKICAgIGluaXRFdmVudHModm0pOwogICAgaW5pdFJlbmRlcih2bSk7CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZUNyZWF0ZScpOwogICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHMKICAgIGluaXRTdGF0ZSh2bSk7CiAgICBpbml0UHJvdmlkZSh2bSk7IC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzCiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHsKICAgICAgdm0uX25hbWUgPSBmb3JtYXRDb21wb25lbnROYW1lKHZtLCBmYWxzZSk7CiAgICAgIG1hcmsoZW5kVGFnKTsKICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHZtLl9uYW1lKSArICIgaW5pdCIpLCBzdGFydFRhZywgZW5kVGFnKTsKICAgIH0KCiAgICBpZiAodm0uJG9wdGlvbnMuZWwpIHsKICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBpbml0SW50ZXJuYWxDb21wb25lbnQgKHZtLCBvcHRpb25zKSB7CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7CiAgLy8gZG9pbmcgdGhpcyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZHluYW1pYyBlbnVtZXJhdGlvbi4KICB2YXIgcGFyZW50Vm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsKICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIG9wdHMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7CiAgb3B0cy5fcGFyZW50RWxtID0gb3B0aW9ucy5fcGFyZW50RWxtOwogIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTsKCiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgb3B0cy5wcm9wc0RhdGEgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhOwogIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7CiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47CiAgb3B0cy5fY29tcG9uZW50VGFnID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZzsKCiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7CiAgICBvcHRzLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyOwogICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuczsKICB9Cn0KCmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHsKICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9uczsKICBpZiAoQ3Rvci5zdXBlcikgewogICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7CiAgICB2YXIgY2FjaGVkU3VwZXJPcHRpb25zID0gQ3Rvci5zdXBlck9wdGlvbnM7CiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHsKICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsCiAgICAgIC8vIG5lZWQgdG8gcmVzb2x2ZSBuZXcgb3B0aW9ucy4KICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7CiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NikKICAgICAgdmFyIG1vZGlmaWVkT3B0aW9ucyA9IHJlc29sdmVNb2RpZmllZE9wdGlvbnMoQ3Rvcik7CiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zCiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHsKICAgICAgICBleHRlbmQoQ3Rvci5leHRlbmRPcHRpb25zLCBtb2RpZmllZE9wdGlvbnMpOwogICAgICB9CiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpOwogICAgICBpZiAob3B0aW9ucy5uYW1lKSB7CiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBvcHRpb25zCn0KCmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHsKICB2YXIgbW9kaWZpZWQ7CiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9uczsKICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7CiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9uczsKICBmb3IgKHZhciBrZXkgaW4gbGF0ZXN0KSB7CiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7CiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfQogICAgICBtb2RpZmllZFtrZXldID0gZGVkdXBlKGxhdGVzdFtrZXldLCBleHRlbmRlZFtrZXldLCBzZWFsZWRba2V5XSk7CiAgICB9CiAgfQogIHJldHVybiBtb2RpZmllZAp9CgpmdW5jdGlvbiBkZWR1cGUgKGxhdGVzdCwgZXh0ZW5kZWQsIHNlYWxlZCkgewogIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkCiAgLy8gYmV0d2VlbiBtZXJnZXMKICBpZiAoQXJyYXkuaXNBcnJheShsYXRlc3QpKSB7CiAgICB2YXIgcmVzID0gW107CiAgICBzZWFsZWQgPSBBcnJheS5pc0FycmF5KHNlYWxlZCkgPyBzZWFsZWQgOiBbc2VhbGVkXTsKICAgIGV4dGVuZGVkID0gQXJyYXkuaXNBcnJheShleHRlbmRlZCkgPyBleHRlbmRlZCA6IFtleHRlbmRlZF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykgewogICAgICAvLyBwdXNoIG9yaWdpbmFsIG9wdGlvbnMgYW5kIG5vdCBzZWFsZWQgb3B0aW9ucyB0byBleGNsdWRlIGR1cGxpY2F0ZWQgb3B0aW9ucwogICAgICBpZiAoZXh0ZW5kZWQuaW5kZXhPZihsYXRlc3RbaV0pID49IDAgfHwgc2VhbGVkLmluZGV4T2YobGF0ZXN0W2ldKSA8IDApIHsKICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfSBlbHNlIHsKICAgIHJldHVybiBsYXRlc3QKICB9Cn0KCmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSkKICApIHsKICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTsKICB9CiAgdGhpcy5faW5pdChvcHRpb25zKTsKfQoKaW5pdE1peGluKFZ1ZSk7CnN0YXRlTWl4aW4oVnVlKTsKZXZlbnRzTWl4aW4oVnVlKTsKbGlmZWN5Y2xlTWl4aW4oVnVlKTsKcmVuZGVyTWl4aW4oVnVlKTsKCi8qICAqLwoKZnVuY3Rpb24gaW5pdFVzZSAoVnVlKSB7CiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHsKICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpOwogICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID4gLTEpIHsKICAgICAgcmV0dXJuIHRoaXMKICAgIH0KCiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgYXJncy51bnNoaWZ0KHRoaXMpOwogICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTsKICAgIH0KICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChwbHVnaW4pOwogICAgcmV0dXJuIHRoaXMKICB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHsKICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHsKICAgIHRoaXMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG1peGluKTsKICAgIHJldHVybiB0aGlzCiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHsKICAvKioKICAgKiBFYWNoIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgVnVlLCBoYXMgYSB1bmlxdWUKICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCAiY2hpbGQKICAgKiBjb25zdHJ1Y3RvcnMiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLgogICAqLwogIFZ1ZS5jaWQgPSAwOwogIHZhciBjaWQgPSAxOwoKICAvKioKICAgKiBDbGFzcyBpbmhlcml0YW5jZQogICAqLwogIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbiAoZXh0ZW5kT3B0aW9ucykgewogICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307CiAgICB2YXIgU3VwZXIgPSB0aGlzOwogICAgdmFyIFN1cGVySWQgPSBTdXBlci5jaWQ7CiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pOwogICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7CiAgICAgIHJldHVybiBjYWNoZWRDdG9yc1tTdXBlcklkXQogICAgfQoKICAgIHZhciBuYW1lID0gZXh0ZW5kT3B0aW9ucy5uYW1lIHx8IFN1cGVyLm9wdGlvbnMubmFtZTsKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkgewogICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSk7CiAgICB9CgogICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFZ1ZUNvbXBvbmVudCAob3B0aW9ucykgewogICAgICB0aGlzLl9pbml0KG9wdGlvbnMpOwogICAgfTsKICAgIFN1Yi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSk7CiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViOwogICAgU3ViLmNpZCA9IGNpZCsrOwogICAgU3ViLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgIFN1cGVyLm9wdGlvbnMsCiAgICAgIGV4dGVuZE9wdGlvbnMKICAgICk7CiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjsKCiAgICAvLyBGb3IgcHJvcHMgYW5kIGNvbXB1dGVkIHByb3BlcnRpZXMsIHdlIGRlZmluZSB0aGUgcHJveHkgZ2V0dGVycyBvbgogICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXMKICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC4KICAgIGlmIChTdWIub3B0aW9ucy5wcm9wcykgewogICAgICBpbml0UHJvcHMkMShTdWIpOwogICAgfQogICAgaWYgKFN1Yi5vcHRpb25zLmNvbXB1dGVkKSB7CiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7CiAgICB9CgogICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlCiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kOwogICAgU3ViLm1peGluID0gU3VwZXIubWl4aW47CiAgICBTdWIudXNlID0gU3VwZXIudXNlOwoKICAgIC8vIGNyZWF0ZSBhc3NldCByZWdpc3RlcnMsIHNvIGV4dGVuZGVkIGNsYXNzZXMKICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby4KICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgU3ViW3R5cGVdID0gU3VwZXJbdHlwZV07CiAgICB9KTsKICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXAKICAgIGlmIChuYW1lKSB7CiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7CiAgICB9CgogICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS4KICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlCiAgICAvLyBiZWVuIHVwZGF0ZWQuCiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9uczsKICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9uczsKICAgIFN1Yi5zZWFsZWRPcHRpb25zID0gZXh0ZW5kKHt9LCBTdWIub3B0aW9ucyk7CgogICAgLy8gY2FjaGUgY29uc3RydWN0b3IKICAgIGNhY2hlZEN0b3JzW1N1cGVySWRdID0gU3ViOwogICAgcmV0dXJuIFN1YgogIH07Cn0KCmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7CiAgdmFyIHByb3BzID0gQ29tcC5vcHRpb25zLnByb3BzOwogIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgcHJveHkoQ29tcC5wcm90b3R5cGUsICJfcHJvcHMiLCBrZXkpOwogIH0KfQoKZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHsKICB2YXIgY29tcHV0ZWQgPSBDb21wLm9wdGlvbnMuY29tcHV0ZWQ7CiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7CiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHsKICAvKioKICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuCiAgICovCiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKAogICAgICBpZCwKICAgICAgZGVmaW5pdGlvbgogICAgKSB7CiAgICAgIGlmICghZGVmaW5pdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50JykgewogICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHsKICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDsKICAgICAgICAgIGRlZmluaXRpb24gPSB0aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKGRlZmluaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGRlZmluaXRpb24gPSB7IGJpbmQ6IGRlZmluaXRpb24sIHVwZGF0ZTogZGVmaW5pdGlvbiB9OwogICAgICAgIH0KICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjsKICAgICAgICByZXR1cm4gZGVmaW5pdGlvbgogICAgICB9CiAgICB9OwogIH0pOwp9CgovKiAgKi8KCmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHsKICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZykKfQoKZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkgewogIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgcmV0dXJuIGZhbHNlCn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHsKICB2YXIgY2FjaGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5jYWNoZTsKICB2YXIga2V5cyA9IGtlZXBBbGl2ZUluc3RhbmNlLmtleXM7CiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTsKICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpIHsKICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTsKICAgIGlmIChjYWNoZWROb2RlKSB7CiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjYWNoZWROb2RlLmNvbXBvbmVudE9wdGlvbnMpOwogICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7CiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoCiAgY2FjaGUsCiAga2V5LAogIGtleXMsCiAgY3VycmVudAopIHsKICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTsKICBpZiAoY2FjaGVkJCQxICYmICghY3VycmVudCB8fCBjYWNoZWQkJDEudGFnICE9PSBjdXJyZW50LnRhZykpIHsKICAgIGNhY2hlZCQkMS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpOwogIH0KICBjYWNoZVtrZXldID0gbnVsbDsKICByZW1vdmUoa2V5cywga2V5KTsKfQoKdmFyIHBhdHRlcm5UeXBlcyA9IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldOwoKdmFyIEtlZXBBbGl2ZSA9IHsKICBuYW1lOiAna2VlcC1hbGl2ZScsCiAgYWJzdHJhY3Q6IHRydWUsCgogIHByb3BzOiB7CiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl0KICB9LAoKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHsKICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5rZXlzID0gW107CiAgfSwKCiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQgKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgZm9yICh2YXIga2V5IGluIHRoaXMkMS5jYWNoZSkgewogICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlLCBrZXksIHRoaXMkMS5rZXlzKTsKICAgIH0KICB9LAoKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7CiAgICB9KTsKICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICFtYXRjaGVzKHZhbCwgbmFtZSk7IH0pOwogICAgfSk7CiAgfSwKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkgewogICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0OwogICAgdmFyIHZub2RlID0gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChzbG90KTsKICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9uczsKICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7CiAgICAgIC8vIGNoZWNrIHBhdHRlcm4KICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpOwogICAgICB2YXIgcmVmID0gdGhpczsKICAgICAgdmFyIGluY2x1ZGUgPSByZWYuaW5jbHVkZTsKICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTsKICAgICAgaWYgKAogICAgICAgIC8vIG5vdCBpbmNsdWRlZAogICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8CiAgICAgICAgLy8gZXhjbHVkZWQKICAgICAgICAoZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpCiAgICAgICkgewogICAgICAgIHJldHVybiB2bm9kZQogICAgICB9CgogICAgICB2YXIgcmVmJDEgPSB0aGlzOwogICAgICB2YXIgY2FjaGUgPSByZWYkMS5jYWNoZTsKICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGwKICAgICAgICAvLyBzYW1lIGNvbnN0cnVjdG9yIG1heSBnZXQgcmVnaXN0ZXJlZCBhcyBkaWZmZXJlbnQgbG9jYWwgY29tcG9uZW50cwogICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSkKICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoIjo6IiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpCiAgICAgICAgOiB2bm9kZS5rZXk7CiAgICAgIGlmIChjYWNoZVtrZXldKSB7CiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlOwogICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3QKICAgICAgICByZW1vdmUoa2V5cywga2V5KTsKICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYWNoZVtrZXldID0gdm5vZGU7CiAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5CiAgICAgICAgaWYgKHRoaXMubWF4ICYmIGtleXMubGVuZ3RoID4gcGFyc2VJbnQodGhpcy5tYXgpKSB7CiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKQogIH0KfQoKdmFyIGJ1aWx0SW5Db21wb25lbnRzID0gewogIEtlZXBBbGl2ZTogS2VlcEFsaXZlCn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7CiAgLy8gY29uZmlnCiAgdmFyIGNvbmZpZ0RlZiA9IHt9OwogIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07CiAgewogICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgd2FybigKICAgICAgICAnRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4nCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTsKCiAgLy8gZXhwb3NlZCB1dGlsIG1ldGhvZHMuCiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uCiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay4KICBWdWUudXRpbCA9IHsKICAgIHdhcm46IHdhcm4sCiAgICBleHRlbmQ6IGV4dGVuZCwKICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLAogICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlCiAgfTsKCiAgVnVlLnNldCA9IHNldDsKICBWdWUuZGVsZXRlID0gZGVsOwogIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrOwoKICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0pOwoKICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlICJiYXNlIiBjb25zdHJ1Y3RvciB0byBleHRlbmQgYWxsIHBsYWluLW9iamVjdAogIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLgogIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlOwoKICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpOwoKICBpbml0VXNlKFZ1ZSk7CiAgaW5pdE1peGluJDEoVnVlKTsKICBpbml0RXh0ZW5kKFZ1ZSk7CiAgaW5pdEFzc2V0UmVnaXN0ZXJzKFZ1ZSk7Cn0KCmluaXRHbG9iYWxBUEkoVnVlKTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywgewogIGdldDogaXNTZXJ2ZXJSZW5kZXJpbmcKfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRzc3JDb250ZXh0JywgewogIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICByZXR1cm4gdGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dAogIH0KfSk7CgovLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb24KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0JywgewogIHZhbHVlOiBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dAp9KTsKClZ1ZS52ZXJzaW9uID0gJzIuNS4xNyc7CgovKiAgKi8KCi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheQovLyBkdXJpbmcgdGVtcGxhdGUgY29tcGlsYXRpb24KdmFyIGlzUmVzZXJ2ZWRBdHRyID0gbWFrZU1hcCgnc3R5bGUsY2xhc3MnKTsKCi8vIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgdXNpbmcgcHJvcHMgZm9yIGJpbmRpbmcKdmFyIGFjY2VwdFZhbHVlID0gbWFrZU1hcCgnaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcycpOwp2YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7CiAgcmV0dXJuICgKICAgIChhdHRyID09PSAndmFsdWUnICYmIGFjY2VwdFZhbHVlKHRhZykpICYmIHR5cGUgIT09ICdidXR0b24nIHx8CiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fAogICAgKGF0dHIgPT09ICdjaGVja2VkJyAmJiB0YWcgPT09ICdpbnB1dCcpIHx8CiAgICAoYXR0ciA9PT0gJ211dGVkJyAmJiB0YWcgPT09ICd2aWRlbycpCiAgKQp9OwoKdmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTsKCnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcCgKICAnYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSwnICsKICAnZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLCcgKwogICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgKwogICdtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LCcgKwogICdyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLCcgKwogICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJwopOwoKdmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7Cgp2YXIgaXNYbGluayA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJwp9OwoKdmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIGlzWGxpbmsobmFtZSkgPyBuYW1lLnNsaWNlKDYsIG5hbWUubGVuZ3RoKSA6ICcnCn07Cgp2YXIgaXNGYWxzeUF0dHJWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsKICByZXR1cm4gdmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZQp9OwoKLyogICovCgpmdW5jdGlvbiBnZW5DbGFzc0ZvclZub2RlICh2bm9kZSkgewogIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlOwogIHZhciBjaGlsZE5vZGUgPSB2bm9kZTsKICB3aGlsZSAoaXNEZWYoY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlKSkgewogICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEpIHsKICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGNoaWxkTm9kZS5kYXRhLCBkYXRhKTsKICAgIH0KICB9CiAgd2hpbGUgKGlzRGVmKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHsKICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkgewogICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoZGF0YSwgcGFyZW50Tm9kZS5kYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlbmRlckNsYXNzKGRhdGEuc3RhdGljQ2xhc3MsIGRhdGEuY2xhc3MpCn0KCmZ1bmN0aW9uIG1lcmdlQ2xhc3NEYXRhIChjaGlsZCwgcGFyZW50KSB7CiAgcmV0dXJuIHsKICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksCiAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpCiAgICAgID8gW2NoaWxkLmNsYXNzLCBwYXJlbnQuY2xhc3NdCiAgICAgIDogcGFyZW50LmNsYXNzCiAgfQp9CgpmdW5jdGlvbiByZW5kZXJDbGFzcyAoCiAgc3RhdGljQ2xhc3MsCiAgZHluYW1pY0NsYXNzCikgewogIGlmIChpc0RlZihzdGF0aWNDbGFzcykgfHwgaXNEZWYoZHluYW1pY0NsYXNzKSkgewogICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSkKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7CiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJykKfQoKZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpCiAgfQogIGlmIChpc09iamVjdCh2YWx1ZSkpIHsKICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpCiAgfQogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICByZXR1cm4gdmFsdWUKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIHZhciBzdHJpbmdpZmllZDsKICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgaWYgKHZhbHVlW2tleV0pIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBrZXk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgbmFtZXNwYWNlTWFwID0gewogIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywKICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcKfTsKCnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKAogICdodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSwnICsKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLCcgKwogICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICsKICAnYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LCcgKwogICdzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbywnICsKICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArCiAgJ2NhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLCcgKwogICdidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLCcgKwogICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgKwogICdkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksJyArCiAgJ2NvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QnCik7CgovLyB0aGlzIG1hcCBpcyBpbnRlbnRpb25hbGx5IHNlbGVjdGl2ZSwgb25seSBjb3ZlcmluZyBTVkcgZWxlbWVudHMgdGhhdCBtYXkKLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy4KdmFyIGlzU1ZHID0gbWFrZU1hcCgKICAnc3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLCcgKwogICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICsKICAncG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldycsCiAgdHJ1ZQopOwoKdmFyIGlzUHJlVGFnID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gdGFnID09PSAncHJlJzsgfTsKCnZhciBpc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKHRhZykgewogIHJldHVybiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWRyh0YWcpCn07CgpmdW5jdGlvbiBnZXRUYWdOYW1lc3BhY2UgKHRhZykgewogIGlmIChpc1NWRyh0YWcpKSB7CiAgICByZXR1cm4gJ3N2ZycKICB9CiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MCiAgLy8gbm90ZSBpdCBkb2Vzbid0IHN1cHBvcnQgb3RoZXIgTWF0aE1MIGVsZW1lbnRzIGJlaW5nIGNvbXBvbmVudCByb290cwogIGlmICh0YWcgPT09ICdtYXRoJykgewogICAgcmV0dXJuICdtYXRoJwogIH0KfQoKdmFyIHVua25vd25FbGVtZW50Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpmdW5jdGlvbiBpc1Vua25vd25FbGVtZW50ICh0YWcpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWluQnJvd3NlcikgewogICAgcmV0dXJuIHRydWUKICB9CiAgaWYgKGlzUmVzZXJ2ZWRUYWcodGFnKSkgewogICAgcmV0dXJuIGZhbHNlCiAgfQogIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkgewogICAgcmV0dXJuIHVua25vd25FbGVtZW50Q2FjaGVbdGFnXQogIH0KICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgaWYgKHRhZy5pbmRleE9mKCctJykgPiAtMSkgewogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjgyMTAzNjQvMTA3MDI0NAogICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoCiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTFVua25vd25FbGVtZW50IHx8CiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTEVsZW1lbnQKICAgICkpCiAgfSBlbHNlIHsKICAgIHJldHVybiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddID0gL0hUTUxVbmtub3duRWxlbWVudC8udGVzdChlbC50b1N0cmluZygpKSkKICB9Cn0KCnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpOwoKLyogICovCgovKioKICogUXVlcnkgYW4gZWxlbWVudCBzZWxlY3RvciBpZiBpdCdzIG5vdCBhbiBlbGVtZW50IGFscmVhZHkuCiAqLwpmdW5jdGlvbiBxdWVyeSAoZWwpIHsKICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgewogICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7CiAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdDYW5ub3QgZmluZCBlbGVtZW50OiAnICsgZWwKICAgICAgKTsKICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpCiAgICB9CiAgICByZXR1cm4gc2VsZWN0ZWQKICB9IGVsc2UgewogICAgcmV0dXJuIGVsCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQkMSAodGFnTmFtZSwgdm5vZGUpIHsKICB2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHsKICAgIHJldHVybiBlbG0KICB9CiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3QKICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMubXVsdGlwbGUgIT09IHVuZGVmaW5lZCkgewogICAgZWxtLnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnbXVsdGlwbGUnKTsKICB9CiAgcmV0dXJuIGVsbQp9CgpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkgewogIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlTWFwW25hbWVzcGFjZV0sIHRhZ05hbWUpCn0KCmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlICh0ZXh0KSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHsKICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KQp9CgpmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHsKICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTsKfQoKZnVuY3Rpb24gcmVtb3ZlQ2hpbGQgKG5vZGUsIGNoaWxkKSB7CiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Cn0KCmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkgewogIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwp9CgpmdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7CiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZQp9CgpmdW5jdGlvbiBuZXh0U2libGluZyAobm9kZSkgewogIHJldHVybiBub2RlLm5leHRTaWJsaW5nCn0KCmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHsKICByZXR1cm4gbm9kZS50YWdOYW1lCn0KCmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7CiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7Cn0KCmZ1bmN0aW9uIHNldFN0eWxlU2NvcGUgKG5vZGUsIHNjb3BlSWQpIHsKICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7Cn0KCgp2YXIgbm9kZU9wcyA9IE9iamVjdC5mcmVlemUoewoJY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCQxLAoJY3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsCgljcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsCgljcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LAoJaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsCglyZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsCglhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsCglwYXJlbnROb2RlOiBwYXJlbnROb2RlLAoJbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLAoJdGFnTmFtZTogdGFnTmFtZSwKCXNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCwKCXNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGUKfSk7CgovKiAgKi8KCnZhciByZWYgPSB7CiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7CiAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgICBpZiAob2xkVm5vZGUuZGF0YS5yZWYgIT09IHZub2RlLmRhdGEucmVmKSB7CiAgICAgIHJlZ2lzdGVyUmVmKG9sZFZub2RlLCB0cnVlKTsKICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpOwogICAgfQogIH0sCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHJlZ2lzdGVyUmVmKHZub2RlLCB0cnVlKTsKICB9Cn0KCmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7CiAgdmFyIGtleSA9IHZub2RlLmRhdGEucmVmOwogIGlmICghaXNEZWYoa2V5KSkgeyByZXR1cm4gfQoKICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0OwogIHZhciByZWYgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5lbG07CiAgdmFyIHJlZnMgPSB2bS4kcmVmczsKICBpZiAoaXNSZW1vdmFsKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7CiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7CiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7CiAgICAgIHJlZnNba2V5XSA9IHVuZGVmaW5lZDsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHZub2RlLmRhdGEucmVmSW5Gb3IpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsKICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsKICAgICAgfSBlbHNlIGlmIChyZWZzW2tleV0uaW5kZXhPZihyZWYpIDwgMCkgewogICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlZnNba2V5XSA9IHJlZjsKICAgIH0KICB9Cn0KCi8qKgogKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnkKICogU2ltb24gRnJpaXMgVmluZHVtIChAcGFsZGVwaW5kKQogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UKICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFCiAqCiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKQogKgogKiBOb3QgdHlwZS1jaGVja2luZyB0aGlzIGJlY2F1c2UgdGhpcyBmaWxlIGlzIHBlcmYtY3JpdGljYWwgYW5kIHRoZSBjb3N0CiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LgogKi8KCnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7Cgp2YXIgaG9va3MgPSBbJ2NyZWF0ZScsICdhY3RpdmF0ZScsICd1cGRhdGUnLCAncmVtb3ZlJywgJ2Rlc3Ryb3knXTsKCmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikgewogIHJldHVybiAoCiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKAogICAgICAoCiAgICAgICAgYS50YWcgPT09IGIudGFnICYmCiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmCiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJgogICAgICAgIHNhbWVJbnB1dFR5cGUoYSwgYikKICAgICAgKSB8fCAoCiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJgogICAgICAgIGEuYXN5bmNGYWN0b3J5ID09PSBiLmFzeW5jRmFjdG9yeSAmJgogICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpCiAgICAgICkKICAgICkKICApCn0KCmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHsKICBpZiAoYS50YWcgIT09ICdpbnB1dCcpIHsgcmV0dXJuIHRydWUgfQogIHZhciBpOwogIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7CiAgdmFyIHR5cGVCID0gaXNEZWYoaSA9IGIuZGF0YSkgJiYgaXNEZWYoaSA9IGkuYXR0cnMpICYmIGkudHlwZTsKICByZXR1cm4gdHlwZUEgPT09IHR5cGVCIHx8IGlzVGV4dElucHV0VHlwZSh0eXBlQSkgJiYgaXNUZXh0SW5wdXRUeXBlKHR5cGVCKQp9CgpmdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeCAoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHsKICB2YXIgaSwga2V5OwogIHZhciBtYXAgPSB7fTsKICBmb3IgKGkgPSBiZWdpbklkeDsgaSA8PSBlbmRJZHg7ICsraSkgewogICAga2V5ID0gY2hpbGRyZW5baV0ua2V5OwogICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9CiAgfQogIHJldHVybiBtYXAKfQoKZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkgewogIHZhciBpLCBqOwogIHZhciBjYnMgPSB7fTsKCiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7CiAgdmFyIG5vZGVPcHMgPSBiYWNrZW5kLm5vZGVPcHM7CgogIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkgewogICAgY2JzW2hvb2tzW2ldXSA9IFtdOwogICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHsKICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkgewogICAgICAgIGNic1tob29rc1tpXV0ucHVzaChtb2R1bGVzW2pdW2hvb2tzW2ldXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHsKICAgIHJldHVybiBuZXcgVk5vZGUobm9kZU9wcy50YWdOYW1lKGVsbSkudG9Mb3dlckNhc2UoKSwge30sIFtdLCB1bmRlZmluZWQsIGVsbSkKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZVJtQ2IgKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHsKICAgIGZ1bmN0aW9uIHJlbW92ZSAoKSB7CiAgICAgIGlmICgtLXJlbW92ZS5saXN0ZW5lcnMgPT09IDApIHsKICAgICAgICByZW1vdmVOb2RlKGNoaWxkRWxtKTsKICAgICAgfQogICAgfQogICAgcmVtb3ZlLmxpc3RlbmVycyA9IGxpc3RlbmVyczsKICAgIHJldHVybiByZW1vdmUKICB9CgogIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7CiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTsKICAgIC8vIGVsZW1lbnQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZHVlIHRvIHYtaHRtbCAvIHYtdGV4dAogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQkJDEgKHZub2RlLCBpblZQcmUpIHsKICAgIHJldHVybiAoCiAgICAgICFpblZQcmUgJiYKICAgICAgIXZub2RlLm5zICYmCiAgICAgICEoCiAgICAgICAgY29uZmlnLmlnbm9yZWRFbGVtZW50cy5sZW5ndGggJiYKICAgICAgICBjb25maWcuaWdub3JlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGlnbm9yZSkgewogICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSkKICAgICAgICAgICAgPyBpZ25vcmUudGVzdCh2bm9kZS50YWcpCiAgICAgICAgICAgIDogaWdub3JlID09PSB2bm9kZS50YWcKICAgICAgICB9KQogICAgICApICYmCiAgICAgIGNvbmZpZy5pc1Vua25vd25FbGVtZW50KHZub2RlLnRhZykKICAgICkKICB9CgogIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7CgogIGZ1bmN0aW9uIGNyZWF0ZUVsbSAoCiAgICB2bm9kZSwKICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgIHBhcmVudEVsbSwKICAgIHJlZkVsbSwKICAgIG5lc3RlZCwKICAgIG93bmVyQXJyYXksCiAgICBpbmRleAogICkgewogICAgaWYgKGlzRGVmKHZub2RlLmVsbSkgJiYgaXNEZWYob3duZXJBcnJheSkpIHsKICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciEKICAgICAgLy8gbm93IGl0J3MgdXNlZCBhcyBhIG5ldyBub2RlLCBvdmVyd3JpdGluZyBpdHMgZWxtIHdvdWxkIGNhdXNlCiAgICAgIC8vIHBvdGVudGlhbCBwYXRjaCBlcnJvcnMgZG93biB0aGUgcm9hZCB3aGVuIGl0J3MgdXNlZCBhcyBhbiBpbnNlcnRpb24KICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmcKICAgICAgLy8gYXNzb2NpYXRlZCBET00gZWxlbWVudCBmb3IgaXQuCiAgICAgIHZub2RlID0gb3duZXJBcnJheVtpbmRleF0gPSBjbG9uZVZOb2RlKHZub2RlKTsKICAgIH0KCiAgICB2bm9kZS5pc1Jvb3RJbnNlcnQgPSAhbmVzdGVkOyAvLyBmb3IgdHJhbnNpdGlvbiBlbnRlciBjaGVjawogICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47CiAgICB2YXIgdGFnID0gdm5vZGUudGFnOwogICAgaWYgKGlzRGVmKHRhZykpIHsKICAgICAgewogICAgICAgIGlmIChkYXRhICYmIGRhdGEucHJlKSB7CiAgICAgICAgICBjcmVhdGluZ0VsbUluVlByZSsrOwogICAgICAgIH0KICAgICAgICBpZiAoaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgY3JlYXRpbmdFbG1JblZQcmUpKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArCiAgICAgICAgICAgICdyZWdpc3RlciB0aGUgY29tcG9uZW50IGNvcnJlY3RseT8gRm9yIHJlY3Vyc2l2ZSBjb21wb25lbnRzLCAnICsKICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSAibmFtZSIgb3B0aW9uLicsCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2bm9kZS5lbG0gPSB2bm9kZS5ucwogICAgICAgID8gbm9kZU9wcy5jcmVhdGVFbGVtZW50TlModm5vZGUubnMsIHRhZykKICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTsKICAgICAgc2V0U2NvcGUodm5vZGUpOwoKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIHsKICAgICAgICBjcmVhdGVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9CiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgICB9CgogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRhdGEgJiYgZGF0YS5wcmUpIHsKICAgICAgICBjcmVhdGluZ0VsbUluVlByZS0tOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpKSB7CiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlQ29tbWVudCh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfSBlbHNlIHsKICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgdmFyIGkgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIHZhciBpc1JlYWN0aXZhdGVkID0gaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpICYmIGkua2VlcEFsaXZlOwogICAgICBpZiAoaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsKICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8sIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgICAgfQogICAgICAvLyBhZnRlciBjYWxsaW5nIHRoZSBpbml0IGhvb2ssIGlmIHRoZSB2bm9kZSBpcyBhIGNoaWxkIGNvbXBvbmVudAogICAgICAvLyBpdCBzaG91bGQndmUgY3JlYXRlZCBhIGNoaWxkIGluc3RhbmNlIGFuZCBtb3VudGVkIGl0LiB0aGUgY2hpbGQKICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uCiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGVsZW1lbnQgYW5kIGJlIGRvbmUuCiAgICAgIGlmIChpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHsKICAgICAgICAgIHJlYWN0aXZhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0Q29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkgewogICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaC5hcHBseShpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCk7CiAgICAgIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCA9IG51bGw7CiAgICB9CiAgICB2bm9kZS5lbG0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS4kZWw7CiAgICBpZiAoaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICBzZXRTY29wZSh2bm9kZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC4KICAgICAgLy8gc2tpcCBhbGwgZWxlbWVudC1yZWxhdGVkIG1vZHVsZXMgZXhjZXB0IGZvciByZWYgKCMzNDU1KQogICAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rCiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKHZub2RlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlYWN0aXZhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7CiAgICB2YXIgaTsKICAgIC8vIGhhY2sgZm9yICM0MzM5OiBhIHJlYWN0aXZhdGVkIGNvbXBvbmVudCB3aXRoIGlubmVyIHRyYW5zaXRpb24KICAgIC8vIGRvZXMgbm90IHRyaWdnZXIgYmVjYXVzZSB0aGUgaW5uZXIgbm9kZSdzIGNyZWF0ZWQgaG9va3MgYXJlIG5vdCBjYWxsZWQKICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dAogICAgLy8gdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyBpdC4KICAgIHZhciBpbm5lck5vZGUgPSB2bm9kZTsKICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgaW5uZXJOb2RlID0gaW5uZXJOb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgICAgaWYgKGlzRGVmKGkgPSBpbm5lck5vZGUuZGF0YSkgJiYgaXNEZWYoaSA9IGkudHJhbnNpdGlvbikpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBjYnMuYWN0aXZhdGVbaV0oZW1wdHlOb2RlLCBpbm5lck5vZGUpOwogICAgICAgIH0KICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICAgIC8vIHVubGlrZSBhIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50LAogICAgLy8gYSByZWFjdGl2YXRlZCBrZWVwLWFsaXZlIGNvbXBvbmVudCBkb2Vzbid0IGluc2VydCBpdHNlbGYKICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkgewogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgaWYgKGlzRGVmKHJlZiQkMSkpIHsKICAgICAgICBpZiAocmVmJCQxLnBhcmVudE5vZGUgPT09IHBhcmVudCkgewogICAgICAgICAgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50LCBlbG0sIHJlZiQkMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQocGFyZW50LCBlbG0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgICB7CiAgICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKGNoaWxkcmVuKTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSwgY2hpbGRyZW4sIGkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7CiAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQodm5vZGUuZWxtLCBub2RlT3BzLmNyZWF0ZVRleHROb2RlKFN0cmluZyh2bm9kZS50ZXh0KSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNQYXRjaGFibGUgKHZub2RlKSB7CiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7CiAgICB9CiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKQogIH0KCiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICBjYnMuY3JlYXRlW2kkMV0oZW1wdHlOb2RlLCB2bm9kZSk7CiAgICB9CiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZQogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH0KICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH0KICAgIH0KICB9CgogIC8vIHNldCBzY29wZSBpZCBhdHRyaWJ1dGUgZm9yIHNjb3BlZCBDU1MuCiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuCiAgZnVuY3Rpb24gc2V0U2NvcGUgKHZub2RlKSB7CiAgICB2YXIgaTsKICAgIGlmIChpc0RlZihpID0gdm5vZGUuZm5TY29wZUlkKSkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlOwogICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkgewogICAgICAgICAgbm9kZU9wcy5zZXRTdHlsZVNjb3BlKHZub2RlLmVsbSwgaSk7CiAgICAgICAgfQogICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50OwogICAgICB9CiAgICB9CiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuCiAgICBpZiAoaXNEZWYoaSA9IGFjdGl2ZUluc3RhbmNlKSAmJgogICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmCiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJgogICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkKICAgICkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7CiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnZva2VEZXN0cm95SG9vayAodm5vZGUpIHsKICAgIHZhciBpLCBqOwogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9CiAgICB9CiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkgewogICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHsKICAgICAgICBpbnZva2VEZXN0cm95SG9vayh2bm9kZS5jaGlsZHJlbltqXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHsKICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHsKICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTsKICAgICAgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihjaC50YWcpKSB7CiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTsKICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTsKICAgICAgICB9IGVsc2UgeyAvLyBUZXh0IG5vZGUKICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkgewogICAgaWYgKGlzRGVmKHJtKSB8fCBpc0RlZih2bm9kZS5kYXRhKSkgewogICAgICB2YXIgaTsKICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTsKICAgICAgaWYgKGlzRGVmKHJtKSkgewogICAgICAgIC8vIHdlIGhhdmUgYSByZWN1cnNpdmVseSBwYXNzZWQgZG93biBybSBjYWxsYmFjawogICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnQKICAgICAgICBybS5saXN0ZW5lcnMgKz0gbGlzdGVuZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nCiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTsKICAgICAgfQogICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpc0RlZihpID0gaS5fdm5vZGUpICYmIGlzRGVmKGkuZGF0YSkpIHsKICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGksIHJtKTsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkgewogICAgICAgIGNicy5yZW1vdmVbaV0odm5vZGUsIHJtKTsKICAgICAgfQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkgewogICAgICAgIGkodm5vZGUsIHJtKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBybSgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZW1vdmVOb2RlKHZub2RlLmVsbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbiAocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDsKICAgIHZhciBuZXdTdGFydElkeCA9IDA7CiAgICB2YXIgb2xkRW5kSWR4ID0gb2xkQ2gubGVuZ3RoIC0gMTsKICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07CiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdOwogICAgdmFyIG5ld0VuZElkeCA9IG5ld0NoLmxlbmd0aCAtIDE7CiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdOwogICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTsKICAgIHZhciBvbGRLZXlUb0lkeCwgaWR4SW5PbGQsIHZub2RlVG9Nb3ZlLCByZWZFbG07CgogICAgLy8gcmVtb3ZlT25seSBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgYnkgPHRyYW5zaXRpb24tZ3JvdXA+CiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zCiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9ucwogICAgdmFyIGNhbk1vdmUgPSAhcmVtb3ZlT25seTsKCiAgICB7CiAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhuZXdDaCk7CiAgICB9CgogICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHsKICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnQKICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkgewogICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07CiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7CiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07CiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07CiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCByaWdodAogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpOwogICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsKICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTsKICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnQKICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBvbGRFbmRWbm9kZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsKICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9CiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSkKICAgICAgICAgID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldCiAgICAgICAgICA6IGZpbmRJZHhJbk9sZChuZXdTdGFydFZub2RlLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7CiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50CiAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBmYWxzZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07CiAgICAgICAgICBpZiAoc2FtZVZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgICAgICBwYXRjaFZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCB2bm9kZVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnQKICAgICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsKICAgICAgfQogICAgfQogICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7CiAgICAgIHJlZkVsbSA9IGlzVW5kZWYobmV3Q2hbbmV3RW5kSWR4ICsgMV0pID8gbnVsbCA6IG5ld0NoW25ld0VuZElkeCArIDFdLmVsbTsKICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHsKICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgb2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVLZXlzIChjaGlsZHJlbikgewogICAgdmFyIHNlZW5LZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB2bm9kZSA9IGNoaWxkcmVuW2ldOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5OwogICAgICBpZiAoaXNEZWYoa2V5KSkgewogICAgICAgIGlmIChzZWVuS2V5c1trZXldKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAoIkR1cGxpY2F0ZSBrZXlzIGRldGVjdGVkOiAnIiArIGtleSArICInLiBUaGlzIG1heSBjYXVzZSBhbiB1cGRhdGUgZXJyb3IuIiksCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZW5LZXlzW2tleV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZElkeEluT2xkIChub2RlLCBvbGRDaCwgc3RhcnQsIGVuZCkgewogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGMgPSBvbGRDaFtpXTsKICAgICAgaWYgKGlzRGVmKGMpICYmIHNhbWVWbm9kZShub2RlLCBjKSkgeyByZXR1cm4gaSB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgaWYgKG9sZFZub2RlID09PSB2bm9kZSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtOwoKICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkgewogICAgICBpZiAoaXNEZWYodm5vZGUuYXN5bmNGYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgIGh5ZHJhdGUob2xkVm5vZGUuZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybgogICAgfQoKICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy4KICAgIC8vIG5vdGUgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgLQogICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuCiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc1N0YXRpYykgJiYKICAgICAgaXNUcnVlKG9sZFZub2RlLmlzU3RhdGljKSAmJgogICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJgogICAgICAoaXNUcnVlKHZub2RlLmlzQ2xvbmVkKSB8fCBpc1RydWUodm5vZGUuaXNPbmNlKSkKICAgICkgewogICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgaTsKICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHsKICAgICAgaShvbGRWbm9kZSwgdm5vZGUpOwogICAgfQoKICAgIHZhciBvbGRDaCA9IG9sZFZub2RlLmNoaWxkcmVuOwogICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47CiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKSB7IGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTsgfQogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICAgIGlmIChpc1VuZGVmKHZub2RlLnRleHQpKSB7CiAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7CiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfQogICAgICB9IGVsc2UgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9CiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkQ2gpKSB7CiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpOwogICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7CiAgICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sICcnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7CiAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCB2bm9kZS50ZXh0KTsKICAgIH0KICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucG9zdHBhdGNoKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkgewogICAgLy8gZGVsYXkgaW5zZXJ0IGhvb2tzIGZvciBjb21wb25lbnQgcm9vdCBub2RlcywgaW52b2tlIHRoZW0gYWZ0ZXIgdGhlCiAgICAvLyBlbGVtZW50IGlzIHJlYWxseSBpbnNlcnRlZAogICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7CiAgICAgIHZub2RlLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQgPSBxdWV1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHsKICAgICAgICBxdWV1ZVtpXS5kYXRhLmhvb2suaW5zZXJ0KHF1ZXVlW2ldKTsKICAgICAgfQogICAgfQogIH0KCiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlOwogIC8vIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBza2lwIGNyZWF0ZSBob29rIGR1cmluZyBoeWRyYXRpb24gYmVjYXVzZSB0aGV5CiAgLy8gYXJlIGFscmVhZHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCBvciBoYXMgbm8gbmVlZCBmb3IgaW5pdGlhbGl6YXRpb24KICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmUKICAvLyBkZWVwIHVwZGF0ZXMgKCM3MDYzKS4KICB2YXIgaXNSZW5kZXJlZE1vZHVsZSA9IG1ha2VNYXAoJ2F0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleScpOwoKICAvLyBOb3RlOiB0aGlzIGlzIGEgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uIHNvIHdlIGNhbiBhc3N1bWUgZWxtcyBhcmUgRE9NIG5vZGVzLgogIGZ1bmN0aW9uIGh5ZHJhdGUgKGVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSB7CiAgICB2YXIgaTsKICAgIHZhciB0YWcgPSB2bm9kZS50YWc7CiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjsKICAgIGluVlByZSA9IGluVlByZSB8fCAoZGF0YSAmJiBkYXRhLnByZSk7CiAgICB2bm9kZS5lbG0gPSBlbG07CgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpICYmIGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeSkpIHsKICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIC8vIGFzc2VydCBub2RlIG1hdGNoCiAgICB7CiAgICAgIGlmICghYXNzZXJ0Tm9kZU1hdGNoKGVsbSwgdm5vZGUsIGluVlByZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgfQogICAgfQogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH0KICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS4KICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0KICAgIGlmIChpc0RlZih0YWcpKSB7CiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHsKICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW4KICAgICAgICBpZiAoIWVsbS5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gdi1odG1sIGFuZCBkb21Qcm9wczogaW5uZXJIVE1MCiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7CiAgICAgICAgICAgIGlmIChpICE9PSBlbG0uaW5uZXJIVE1MKSB7CiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkCiAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NlcnZlciBpbm5lckhUTUw6ICcsIGkpOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdjbGllbnQgaW5uZXJIVE1MOiAnLCBlbG0uaW5uZXJIVE1MKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGNvbXBhcmUgY2hpbGRyZW4gbGlzdHMKICAgICAgICAgICAgdmFyIGNoaWxkcmVuTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHsKICAgICAgICAgICAgICBpZiAoIWNoaWxkTm9kZSB8fCAhaHlkcmF0ZShjaGlsZE5vZGUsIGNoaWxkcmVuW2kkMV0sIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSkgewogICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIGNoaWxkTm9kZSBpcyBub3QgbnVsbCwgaXQgbWVhbnMgdGhlIGFjdHVhbCBjaGlsZE5vZGVzIGxpc3QgaXMKICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC4KICAgICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoIHx8IGNoaWxkTm9kZSkgewogICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZAogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgaHlkcmF0aW9uQmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGVsbS5jaGlsZE5vZGVzLCBjaGlsZHJlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgIGlmICghaXNSZW5kZXJlZE1vZHVsZShrZXkpKSB7CiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlOwogICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICAgICAgYnJlYWsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFmdWxsSW52b2tlICYmIGRhdGFbJ2NsYXNzJ10pIHsKICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzCiAgICAgICAgICB0cmF2ZXJzZShkYXRhWydjbGFzcyddKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHsKICAgICAgZWxtLmRhdGEgPSB2bm9kZS50ZXh0OwogICAgfQogICAgcmV0dXJuIHRydWUKICB9CgogIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUsIGluVlByZSkgewogICAgaWYgKGlzRGVmKHZub2RlLnRhZykpIHsKICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKAogICAgICAgICFpc1Vua25vd25FbGVtZW50JCQxKHZub2RlLCBpblZQcmUpICYmCiAgICAgICAgdm5vZGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IChub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpCiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAodm5vZGUuaXNDb21tZW50ID8gOCA6IDMpCiAgICB9CiAgfQoKICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5LCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7CiAgICAgIGlmIChpc0RlZihvbGRWbm9kZSkpIHsgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOyB9CiAgICAgIHJldHVybgogICAgfQoKICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlOwogICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdOwoKICAgIGlmIChpc1VuZGVmKG9sZFZub2RlKSkgewogICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50CiAgICAgIGlzSW5pdGlhbFBhdGNoID0gdHJ1ZTsKICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpOwogICAgICBpZiAoIWlzUmVhbEVsZW1lbnQgJiYgc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHsKICAgICAgICAvLyBwYXRjaCBleGlzdGluZyByb290IG5vZGUKICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNSZWFsRWxlbWVudCkgewogICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnQKICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQgYW5kIGlmIHdlIGNhbiBwZXJmb3JtCiAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgaHlkcmF0aW9uLgogICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHsKICAgICAgICAgICAgb2xkVm5vZGUucmVtb3ZlQXR0cmlidXRlKFNTUl9BVFRSKTsKICAgICAgICAgICAgaHlkcmF0aW5nID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1RydWUoaHlkcmF0aW5nKSkgewogICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHsKICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpOwogICAgICAgICAgICAgIHJldHVybiBvbGRWbm9kZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgICAnVGhlIGNsaWVudC1zaWRlIHJlbmRlcmVkIHZpcnR1YWwgRE9NIHRyZWUgaXMgbm90IG1hdGNoaW5nICcgKwogICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgKwogICAgICAgICAgICAgICAgJ0hUTUwgbWFya3VwLCBmb3IgZXhhbXBsZSBuZXN0aW5nIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSAnICsKICAgICAgICAgICAgICAgICc8cD4sIG9yIG1pc3NpbmcgPHRib2R5Pi4gQmFpbGluZyBoeWRyYXRpb24gYW5kIHBlcmZvcm1pbmcgJyArCiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIGVpdGhlciBub3Qgc2VydmVyLXJlbmRlcmVkLCBvciBoeWRyYXRpb24gZmFpbGVkLgogICAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5vZGUgYW5kIHJlcGxhY2UgaXQKICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnQKICAgICAgICB2YXIgb2xkRWxtID0gb2xkVm5vZGUuZWxtOwogICAgICAgIHZhciBwYXJlbnRFbG0kMSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pOwoKICAgICAgICAvLyBjcmVhdGUgbmV3IG5vZGUKICAgICAgICBjcmVhdGVFbG0oCiAgICAgICAgICB2bm9kZSwKICAgICAgICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhCiAgICAgICAgICAvLyBsZWF2aW5nIHRyYW5zaXRpb24uIE9ubHkgaGFwcGVucyB3aGVuIGNvbWJpbmluZyB0cmFuc2l0aW9uICsKICAgICAgICAgIC8vIGtlZXAtYWxpdmUgKyBIT0NzLiAoIzQ1OTApCiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtJDEsCiAgICAgICAgICBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVsbSkKICAgICAgICApOwoKICAgICAgICAvLyB1cGRhdGUgcGFyZW50IHBsYWNlaG9sZGVyIG5vZGUgZWxlbWVudCwgcmVjdXJzaXZlbHkKICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkgewogICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50OwogICAgICAgICAgdmFyIHBhdGNoYWJsZSA9IGlzUGF0Y2hhYmxlKHZub2RlKTsKICAgICAgICAgIHdoaWxlIChhbmNlc3RvcikgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgY2JzLmRlc3Ryb3lbaV0oYW5jZXN0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFuY2VzdG9yLmVsbSA9IHZub2RlLmVsbTsKICAgICAgICAgICAgaWYgKHBhdGNoYWJsZSkgewogICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICAgICAgICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgYW5jZXN0b3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyAjNjUxMwogICAgICAgICAgICAgIC8vIGludm9rZSBpbnNlcnQgaG9va3MgdGhhdCBtYXkgaGF2ZSBiZWVuIG1lcmdlZCBieSBjcmVhdGUgaG9va3MuCiAgICAgICAgICAgICAgLy8gZS5nLiBmb3IgZGlyZWN0aXZlcyB0aGF0IHVzZXMgdGhlICJpbnNlcnRlZCIgaG9vay4KICAgICAgICAgICAgICB2YXIgaW5zZXJ0ID0gYW5jZXN0b3IuZGF0YS5ob29rLmluc2VydDsKICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkgewogICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgaW5kZXggMSB0byBhdm9pZCByZS1pbnZva2luZyBjb21wb25lbnQgbW91bnRlZCBob29rCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDIgPSAxOyBpJDIgPCBpbnNlcnQuZm5zLmxlbmd0aDsgaSQyKyspIHsKICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlZ2lzdGVyUmVmKGFuY2VzdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRlc3Ryb3kgb2xkIG5vZGUKICAgICAgICBpZiAoaXNEZWYocGFyZW50RWxtJDEpKSB7CiAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtJDEsIFtvbGRWbm9kZV0sIDAsIDApOwogICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkgewogICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpOwogICAgcmV0dXJuIHZub2RlLmVsbQogIH0KfQoKLyogICovCgp2YXIgZGlyZWN0aXZlcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsCiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLAogIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7CiAgICB1cGRhdGVEaXJlY3RpdmVzKHZub2RlLCBlbXB0eU5vZGUpOwogIH0KfQoKZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7CiAgaWYgKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcyB8fCB2bm9kZS5kYXRhLmRpcmVjdGl2ZXMpIHsKICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTsKICB9Cn0KCmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBpc0NyZWF0ZSA9IG9sZFZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTsKICB2YXIgbmV3RGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSh2bm9kZS5kYXRhLmRpcmVjdGl2ZXMsIHZub2RlLmNvbnRleHQpOwoKICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTsKICB2YXIgZGlyc1dpdGhQb3N0cGF0Y2ggPSBbXTsKCiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7CiAgZm9yIChrZXkgaW4gbmV3RGlycykgewogICAgb2xkRGlyID0gb2xkRGlyc1trZXldOwogICAgZGlyID0gbmV3RGlyc1trZXldOwogICAgaWYgKCFvbGREaXIpIHsKICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZAogICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmluc2VydGVkKSB7CiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZQogICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7CiAgICAgIGNhbGxIb29rJDEoZGlyLCAndXBkYXRlJywgdm5vZGUsIG9sZFZub2RlKTsKICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5jb21wb25lbnRVcGRhdGVkKSB7CiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZGlyc1dpdGhJbnNlcnQubGVuZ3RoKSB7CiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzV2l0aEluc2VydC5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhJbnNlcnRbaV0sICdpbnNlcnRlZCcsIHZub2RlLCBvbGRWbm9kZSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaXNDcmVhdGUpIHsKICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxJbnNlcnQoKTsKICAgIH0KICB9CgogIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHsKICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAncG9zdHBhdGNoJywgZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoUG9zdHBhdGNoLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICB9CiAgICB9KTsKICB9CgogIGlmICghaXNDcmVhdGUpIHsKICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHsKICAgICAgaWYgKCFuZXdEaXJzW2tleV0pIHsKICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kCiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CgpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKAogIGRpcnMsCiAgdm0KKSB7CiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFkaXJzKSB7CiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgIHJldHVybiByZXMKICB9CiAgdmFyIGksIGRpcjsKICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIGlmICghZGlyLm1vZGlmaWVycykgewogICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgZGlyLm1vZGlmaWVycyA9IGVtcHR5TW9kaWZpZXJzOwogICAgfQogICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7CiAgICBkaXIuZGVmID0gcmVzb2x2ZUFzc2V0KHZtLiRvcHRpb25zLCAnZGlyZWN0aXZlcycsIGRpci5uYW1lLCB0cnVlKTsKICB9CiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBnZXRSYXdEaXJOYW1lIChkaXIpIHsKICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyAiLiIgKyAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycyB8fCB7fSkuam9pbignLicpKSkKfQoKZnVuY3Rpb24gY2FsbEhvb2skMSAoZGlyLCBob29rLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSkgewogIHZhciBmbiA9IGRpci5kZWYgJiYgZGlyLmRlZltob29rXTsKICBpZiAoZm4pIHsKICAgIHRyeSB7CiAgICAgIGZuKHZub2RlLmVsbSwgZGlyLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGhhbmRsZUVycm9yKGUsIHZub2RlLmNvbnRleHQsICgiZGlyZWN0aXZlICIgKyAoZGlyLm5hbWUpICsgIiAiICsgaG9vayArICIgaG9vayIpKTsKICAgIH0KICB9Cn0KCnZhciBiYXNlTW9kdWxlcyA9IFsKICByZWYsCiAgZGlyZWN0aXZlcwpdCgovKiAgKi8KCmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHsKICB2YXIgb3B0cyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgaWYgKGlzRGVmKG9wdHMpICYmIG9wdHMuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRycyA9PT0gZmFsc2UpIHsKICAgIHJldHVybgogIH0KICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLmF0dHJzKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEuYXR0cnMpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIGtleSwgY3VyLCBvbGQ7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzIHx8IHt9OwogIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKGF0dHJzLl9fb2JfXykpIHsKICAgIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYXR0cnMpOwogIH0KCiAgZm9yIChrZXkgaW4gYXR0cnMpIHsKICAgIGN1ciA9IGF0dHJzW2tleV07CiAgICBvbGQgPSBvbGRBdHRyc1trZXldOwogICAgaWYgKG9sZCAhPT0gY3VyKSB7CiAgICAgIHNldEF0dHIoZWxtLCBrZXksIGN1cik7CiAgICB9CiAgfQogIC8vICM0MzkxOiBpbiBJRTksIHNldHRpbmcgdHlwZSBjYW4gcmVzZXQgdmFsdWUgZm9yIGlucHV0W3R5cGU9cmFkaW9dCiAgLy8gIzY2NjY6IElFL0VkZ2UgZm9yY2VzIHByb2dyZXNzIHZhbHVlIGRvd24gdG8gMSBiZWZvcmUgc2V0dGluZyBhIG1heAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICgoaXNJRSB8fCBpc0VkZ2UpICYmIGF0dHJzLnZhbHVlICE9PSBvbGRBdHRycy52YWx1ZSkgewogICAgc2V0QXR0cihlbG0sICd2YWx1ZScsIGF0dHJzLnZhbHVlKTsKICB9CiAgZm9yIChrZXkgaW4gb2xkQXR0cnMpIHsKICAgIGlmIChpc1VuZGVmKGF0dHJzW2tleV0pKSB7CiAgICAgIGlmIChpc1hsaW5rKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpOwogICAgICB9IGVsc2UgaWYgKCFpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7CiAgaWYgKGVsLnRhZ05hbWUuaW5kZXhPZignLScpID4gLTEpIHsKICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTsKICB9IGVsc2UgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkgewogICAgLy8gc2V0IGF0dHJpYnV0ZSBmb3IgYmxhbmsgdmFsdWUKICAgIC8vIGUuZy4gPG9wdGlvbiBkaXNhYmxlZD5TZWxlY3Qgb25lPC9vcHRpb24+CiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICB9IGVsc2UgewogICAgICAvLyB0ZWNobmljYWxseSBhbGxvd2Z1bGxzY3JlZW4gaXMgYSBib29sZWFuIGF0dHJpYnV0ZSBmb3IgPGlmcmFtZT4sCiAgICAgIC8vIGJ1dCBGbGFzaCBleHBlY3RzIGEgdmFsdWUgb2YgInRydWUiIHdoZW4gdXNlZCBvbiA8ZW1iZWQ+IHRhZwogICAgICB2YWx1ZSA9IGtleSA9PT0gJ2FsbG93ZnVsbHNjcmVlbicgJiYgZWwudGFnTmFtZSA9PT0gJ0VNQkVEJwogICAgICAgID8gJ3RydWUnCiAgICAgICAgOiBrZXk7CiAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzRW51bWVyYXRlZEF0dHIoa2V5KSkgewogICAgZWwuc2V0QXR0cmlidXRlKGtleSwgaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZScgPyAnZmFsc2UnIDogJ3RydWUnKTsKICB9IGVsc2UgaWYgKGlzWGxpbmsoa2V5KSkgewogICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpOwogICAgfQogIH0gZWxzZSB7CiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7CiAgfQp9CgpmdW5jdGlvbiBiYXNlU2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHsKICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpOwogIH0gZWxzZSB7CiAgICAvLyAjNzEzODogSUUxMCAmIDExIGZpcmVzIGlucHV0IGV2ZW50IHdoZW4gc2V0dGluZyBwbGFjZWhvbGRlciBvbgogICAgLy8gPHRleHRhcmVhPi4uLiBibG9jayB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYW5kIHJlbW92ZSB0aGUgYmxvY2tlcgogICAgLy8gaW1tZWRpYXRlbHkuCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgKICAgICAgaXNJRSAmJiAhaXNJRTkgJiYKICAgICAgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyAmJgogICAgICBrZXkgPT09ICdwbGFjZWhvbGRlcicgJiYgIWVsLl9faWVwaAogICAgKSB7CiAgICAgIHZhciBibG9ja2VyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIH07CiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICBlbC5fX2llcGggPSB0cnVlOyAvKiBJRSBwbGFjZWhvbGRlciBwYXRjaGVkICovCiAgICB9CiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CiAgfQp9Cgp2YXIgYXR0cnMgPSB7CiAgY3JlYXRlOiB1cGRhdGVBdHRycywKICB1cGRhdGU6IHVwZGF0ZUF0dHJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlQ2xhc3MgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBlbCA9IHZub2RlLmVsbTsKICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhOwogIGlmICgKICAgIGlzVW5kZWYoZGF0YS5zdGF0aWNDbGFzcykgJiYKICAgIGlzVW5kZWYoZGF0YS5jbGFzcykgJiYgKAogICAgICBpc1VuZGVmKG9sZERhdGEpIHx8ICgKICAgICAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljQ2xhc3MpICYmCiAgICAgICAgaXNVbmRlZihvbGREYXRhLmNsYXNzKQogICAgICApCiAgICApCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjbHMgPSBnZW5DbGFzc0ZvclZub2RlKHZub2RlKTsKCiAgLy8gaGFuZGxlIHRyYW5zaXRpb24gY2xhc3NlcwogIHZhciB0cmFuc2l0aW9uQ2xhc3MgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXM7CiAgaWYgKGlzRGVmKHRyYW5zaXRpb25DbGFzcykpIHsKICAgIGNscyA9IGNvbmNhdChjbHMsIHN0cmluZ2lmeUNsYXNzKHRyYW5zaXRpb25DbGFzcykpOwogIH0KCiAgLy8gc2V0IHRoZSBjbGFzcwogIGlmIChjbHMgIT09IGVsLl9wcmV2Q2xhc3MpIHsKICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbHMpOwogICAgZWwuX3ByZXZDbGFzcyA9IGNsczsKICB9Cn0KCnZhciBrbGFzcyA9IHsKICBjcmVhdGU6IHVwZGF0ZUNsYXNzLAogIHVwZGF0ZTogdXBkYXRlQ2xhc3MKfQoKLyogICovCgp2YXIgdmFsaWREaXZpc2lvbkNoYXJSRSA9IC9bXHcpLitcLV8kXF1dLzsKCmZ1bmN0aW9uIHBhcnNlRmlsdGVycyAoZXhwKSB7CiAgdmFyIGluU2luZ2xlID0gZmFsc2U7CiAgdmFyIGluRG91YmxlID0gZmFsc2U7CiAgdmFyIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsKICB2YXIgaW5SZWdleCA9IGZhbHNlOwogIHZhciBjdXJseSA9IDA7CiAgdmFyIHNxdWFyZSA9IDA7CiAgdmFyIHBhcmVuID0gMDsKICB2YXIgbGFzdEZpbHRlckluZGV4ID0gMDsKICB2YXIgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsKCiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykgewogICAgcHJldiA9IGM7CiAgICBjID0gZXhwLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoaW5TaW5nbGUpIHsKICAgICAgaWYgKGMgPT09IDB4MjcgJiYgcHJldiAhPT0gMHg1QykgeyBpblNpbmdsZSA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7CiAgICAgIGlmIChjID09PSAweDIyICYmIHByZXYgIT09IDB4NUMpIHsgaW5Eb3VibGUgPSBmYWxzZTsgfQogICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7CiAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NUMpIHsgaW5UZW1wbGF0ZVN0cmluZyA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHsKICAgICAgaWYgKGMgPT09IDB4MmYgJiYgcHJldiAhPT0gMHg1QykgeyBpblJlZ2V4ID0gZmFsc2U7IH0KICAgIH0gZWxzZSBpZiAoCiAgICAgIGMgPT09IDB4N0MgJiYgLy8gcGlwZQogICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYKICAgICAgZXhwLmNoYXJDb2RlQXQoaSAtIDEpICE9PSAweDdDICYmCiAgICAgICFjdXJseSAmJiAhc3F1YXJlICYmICFwYXJlbgogICAgKSB7CiAgICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBmaXJzdCBmaWx0ZXIsIGVuZCBvZiBleHByZXNzaW9uCiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaEZpbHRlcigpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlIDB4MjI6IGluRG91YmxlID0gdHJ1ZTsgYnJlYWsgICAgICAgICAvLyAiCiAgICAgICAgY2FzZSAweDI3OiBpblNpbmdsZSA9IHRydWU7IGJyZWFrICAgICAgICAgLy8gJwogICAgICAgIGNhc2UgMHg2MDogaW5UZW1wbGF0ZVN0cmluZyA9IHRydWU7IGJyZWFrIC8vIGAKICAgICAgICBjYXNlIDB4Mjg6IHBhcmVuKys7IGJyZWFrICAgICAgICAgICAgICAgICAvLyAoCiAgICAgICAgY2FzZSAweDI5OiBwYXJlbi0tOyBicmVhayAgICAgICAgICAgICAgICAgLy8gKQogICAgICAgIGNhc2UgMHg1Qjogc3F1YXJlKys7IGJyZWFrICAgICAgICAgICAgICAgIC8vIFsKICAgICAgICBjYXNlIDB4NUQ6IHNxdWFyZS0tOyBicmVhayAgICAgICAgICAgICAgICAvLyBdCiAgICAgICAgY2FzZSAweDdCOiBjdXJseSsrOyBicmVhayAgICAgICAgICAgICAgICAgLy8gewogICAgICAgIGNhc2UgMHg3RDogY3VybHktLTsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgfQogICAgICBpZiAoYyA9PT0gMHgyZikgeyAvLyAvCiAgICAgICAgdmFyIGogPSBpIC0gMTsKICAgICAgICB2YXIgcCA9ICh2b2lkIDApOwogICAgICAgIC8vIGZpbmQgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgcHJldiBjaGFyCiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICBwID0gZXhwLmNoYXJBdChqKTsKICAgICAgICAgIGlmIChwICE9PSAnICcpIHsgYnJlYWsgfQogICAgICAgIH0KICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkgewogICAgICAgICAgaW5SZWdleCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsKICB9IGVsc2UgaWYgKGxhc3RGaWx0ZXJJbmRleCAhPT0gMCkgewogICAgcHVzaEZpbHRlcigpOwogIH0KCiAgZnVuY3Rpb24gcHVzaEZpbHRlciAoKSB7CiAgICAoZmlsdGVycyB8fCAoZmlsdGVycyA9IFtdKSkucHVzaChleHAuc2xpY2UobGFzdEZpbHRlckluZGV4LCBpKS50cmltKCkpOwogICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgfQoKICBpZiAoZmlsdGVycykgewogICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSk7CiAgICB9CiAgfQoKICByZXR1cm4gZXhwcmVzc2lvbgp9CgpmdW5jdGlvbiB3cmFwRmlsdGVyIChleHAsIGZpbHRlcikgewogIHZhciBpID0gZmlsdGVyLmluZGV4T2YoJygnKTsKICBpZiAoaSA8IDApIHsKICAgIC8vIF9mOiByZXNvbHZlRmlsdGVyCiAgICByZXR1cm4gKCJfZihcIiIgKyBmaWx0ZXIgKyAiXCIpKCIgKyBleHAgKyAiKSIpCiAgfSBlbHNlIHsKICAgIHZhciBuYW1lID0gZmlsdGVyLnNsaWNlKDAsIGkpOwogICAgdmFyIGFyZ3MgPSBmaWx0ZXIuc2xpY2UoaSArIDEpOwogICAgcmV0dXJuICgiX2YoXCIiICsgbmFtZSArICJcIikoIiArIGV4cCArIChhcmdzICE9PSAnKScgPyAnLCcgKyBhcmdzIDogYXJncykpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGJhc2VXYXJuIChtc2cpIHsKICBjb25zb2xlLmVycm9yKCgiW1Z1ZSBjb21waWxlcl06ICIgKyBtc2cpKTsKfQoKZnVuY3Rpb24gcGx1Y2tNb2R1bGVGdW5jdGlvbiAoCiAgbW9kdWxlcywKICBrZXkKKSB7CiAgcmV0dXJuIG1vZHVsZXMKICAgID8gbW9kdWxlcy5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1ba2V5XTsgfSkuZmlsdGVyKGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9KQogICAgOiBbXQp9CgpmdW5jdGlvbiBhZGRQcm9wIChlbCwgbmFtZSwgdmFsdWUpIHsKICAoZWwucHJvcHMgfHwgKGVsLnByb3BzID0gW10pKS5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOwogIGVsLnBsYWluID0gZmFsc2U7Cn0KCmZ1bmN0aW9uIGFkZEF0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIChlbC5hdHRycyB8fCAoZWwuYXR0cnMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7CiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKLy8gYWRkIGEgcmF3IGF0dHIgKHVzZSB0aGlzIGluIHByZVRyYW5zZm9ybXMpCmZ1bmN0aW9uIGFkZFJhd0F0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIGVsLmF0dHJzTWFwW25hbWVdID0gdmFsdWU7CiAgZWwuYXR0cnNMaXN0LnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7Cn0KCmZ1bmN0aW9uIGFkZERpcmVjdGl2ZSAoCiAgZWwsCiAgbmFtZSwKICByYXdOYW1lLAogIHZhbHVlLAogIGFyZywKICBtb2RpZmllcnMKKSB7CiAgKGVsLmRpcmVjdGl2ZXMgfHwgKGVsLmRpcmVjdGl2ZXMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCByYXdOYW1lOiByYXdOYW1lLCB2YWx1ZTogdmFsdWUsIGFyZzogYXJnLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9KTsKICBlbC5wbGFpbiA9IGZhbHNlOwp9CgpmdW5jdGlvbiBhZGRIYW5kbGVyICgKICBlbCwKICBuYW1lLAogIHZhbHVlLAogIG1vZGlmaWVycywKICBpbXBvcnRhbnQsCiAgd2FybgopIHsKICBtb2RpZmllcnMgPSBtb2RpZmllcnMgfHwgZW1wdHlPYmplY3Q7CiAgLy8gd2FybiBwcmV2ZW50IGFuZCBwYXNzaXZlIG1vZGlmaWVyCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKAogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4gJiYKICAgIG1vZGlmaWVycy5wcmV2ZW50ICYmIG1vZGlmaWVycy5wYXNzaXZlCiAgKSB7CiAgICB3YXJuKAogICAgICAncGFzc2l2ZSBhbmQgcHJldmVudCBjYW5cJ3QgYmUgdXNlZCB0b2dldGhlci4gJyArCiAgICAgICdQYXNzaXZlIGhhbmRsZXIgY2FuXCd0IHByZXZlbnQgZGVmYXVsdCBldmVudC4nCiAgICApOwogIH0KCiAgLy8gY2hlY2sgY2FwdHVyZSBtb2RpZmllcgogIGlmIChtb2RpZmllcnMuY2FwdHVyZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5jYXB0dXJlOwogICAgbmFtZSA9ICchJyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIGNhcHR1cmVkCiAgfQogIGlmIChtb2RpZmllcnMub25jZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5vbmNlOwogICAgbmFtZSA9ICd+JyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIG9uY2UKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKG1vZGlmaWVycy5wYXNzaXZlKSB7CiAgICBkZWxldGUgbW9kaWZpZXJzLnBhc3NpdmU7CiAgICBuYW1lID0gJyYnICsgbmFtZTsgLy8gbWFyayB0aGUgZXZlbnQgYXMgcGFzc2l2ZQogIH0KCiAgLy8gbm9ybWFsaXplIGNsaWNrLnJpZ2h0IGFuZCBjbGljay5taWRkbGUgc2luY2UgdGhleSBkb24ndCBhY3R1YWxseSBmaXJlCiAgLy8gdGhpcyBpcyB0ZWNobmljYWxseSBicm93c2VyLXNwZWNpZmljLCBidXQgYXQgbGVhc3QgZm9yIG5vdyBicm93c2VycyBhcmUKICAvLyB0aGUgb25seSB0YXJnZXQgZW52cyB0aGF0IGhhdmUgcmlnaHQvbWlkZGxlIGNsaWNrcy4KICBpZiAobmFtZSA9PT0gJ2NsaWNrJykgewogICAgaWYgKG1vZGlmaWVycy5yaWdodCkgewogICAgICBuYW1lID0gJ2NvbnRleHRtZW51JzsKICAgICAgZGVsZXRlIG1vZGlmaWVycy5yaWdodDsKICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLm1pZGRsZSkgewogICAgICBuYW1lID0gJ21vdXNldXAnOwogICAgfQogIH0KCiAgdmFyIGV2ZW50czsKICBpZiAobW9kaWZpZXJzLm5hdGl2ZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5uYXRpdmU7CiAgICBldmVudHMgPSBlbC5uYXRpdmVFdmVudHMgfHwgKGVsLm5hdGl2ZUV2ZW50cyA9IHt9KTsKICB9IGVsc2UgewogICAgZXZlbnRzID0gZWwuZXZlbnRzIHx8IChlbC5ldmVudHMgPSB7fSk7CiAgfQoKICB2YXIgbmV3SGFuZGxlciA9IHsKICAgIHZhbHVlOiB2YWx1ZS50cmltKCkKICB9OwogIGlmIChtb2RpZmllcnMgIT09IGVtcHR5T2JqZWN0KSB7CiAgICBuZXdIYW5kbGVyLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKICB9CgogIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoQXJyYXkuaXNBcnJheShoYW5kbGVycykpIHsKICAgIGltcG9ydGFudCA/IGhhbmRsZXJzLnVuc2hpZnQobmV3SGFuZGxlcikgOiBoYW5kbGVycy5wdXNoKG5ld0hhbmRsZXIpOwogIH0gZWxzZSBpZiAoaGFuZGxlcnMpIHsKICAgIGV2ZW50c1tuYW1lXSA9IGltcG9ydGFudCA/IFtuZXdIYW5kbGVyLCBoYW5kbGVyc10gOiBbaGFuZGxlcnMsIG5ld0hhbmRsZXJdOwogIH0gZWxzZSB7CiAgICBldmVudHNbbmFtZV0gPSBuZXdIYW5kbGVyOwogIH0KCiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0QmluZGluZ0F0dHIgKAogIGVsLAogIG5hbWUsCiAgZ2V0U3RhdGljCikgewogIHZhciBkeW5hbWljVmFsdWUgPQogICAgZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJzonICsgbmFtZSkgfHwKICAgIGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWJpbmQ6JyArIG5hbWUpOwogIGlmIChkeW5hbWljVmFsdWUgIT0gbnVsbCkgewogICAgcmV0dXJuIHBhcnNlRmlsdGVycyhkeW5hbWljVmFsdWUpCiAgfSBlbHNlIGlmIChnZXRTdGF0aWMgIT09IGZhbHNlKSB7CiAgICB2YXIgc3RhdGljVmFsdWUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCBuYW1lKTsKICAgIGlmIChzdGF0aWNWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0aWNWYWx1ZSkKICAgIH0KICB9Cn0KCi8vIG5vdGU6IHRoaXMgb25seSByZW1vdmVzIHRoZSBhdHRyIGZyb20gdGhlIEFycmF5IChhdHRyc0xpc3QpIHNvIHRoYXQgaXQKLy8gZG9lc24ndCBnZXQgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NBdHRycy4KLy8gQnkgZGVmYXVsdCBpdCBkb2VzIE5PVCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwIChhdHRyc01hcCkgYmVjYXVzZSB0aGUgbWFwIGlzCi8vIG5lZWRlZCBkdXJpbmcgY29kZWdlbi4KZnVuY3Rpb24gZ2V0QW5kUmVtb3ZlQXR0ciAoCiAgZWwsCiAgbmFtZSwKICByZW1vdmVGcm9tTWFwCikgewogIHZhciB2YWw7CiAgaWYgKCh2YWwgPSBlbC5hdHRyc01hcFtuYW1lXSkgIT0gbnVsbCkgewogICAgdmFyIGxpc3QgPSBlbC5hdHRyc0xpc3Q7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICBsaXN0LnNwbGljZShpLCAxKTsKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQogIGlmIChyZW1vdmVGcm9tTWFwKSB7CiAgICBkZWxldGUgZWwuYXR0cnNNYXBbbmFtZV07CiAgfQogIHJldHVybiB2YWwKfQoKLyogICovCgovKioKICogQ3Jvc3MtcGxhdGZvcm0gY29kZSBnZW5lcmF0aW9uIGZvciBjb21wb25lbnQgdi1tb2RlbAogKi8KZnVuY3Rpb24gZ2VuQ29tcG9uZW50TW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgcmVmID0gbW9kaWZpZXJzIHx8IHt9OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CgogIHZhciBiYXNlVmFsdWVFeHByZXNzaW9uID0gJyQkdic7CiAgdmFyIHZhbHVlRXhwcmVzc2lvbiA9IGJhc2VWYWx1ZUV4cHJlc3Npb247CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9CiAgICAgICIodHlwZW9mICIgKyBiYXNlVmFsdWVFeHByZXNzaW9uICsgIiA9PT0gJ3N0cmluZyciICsKICAgICAgIj8gIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiLnRyaW0oKSIgKwogICAgICAiOiAiICsgYmFzZVZhbHVlRXhwcmVzc2lvbiArICIpIjsKICB9CiAgaWYgKG51bWJlcikgewogICAgdmFsdWVFeHByZXNzaW9uID0gIl9uKCIgKyB2YWx1ZUV4cHJlc3Npb24gKyAiKSI7CiAgfQogIHZhciBhc3NpZ25tZW50ID0gZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIHZhbHVlRXhwcmVzc2lvbik7CgogIGVsLm1vZGVsID0gewogICAgdmFsdWU6ICgiKCIgKyB2YWx1ZSArICIpIiksCiAgICBleHByZXNzaW9uOiAoIlwiIiArIHZhbHVlICsgIlwiIiksCiAgICBjYWxsYmFjazogKCJmdW5jdGlvbiAoIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiKSB7IiArIGFzc2lnbm1lbnQgKyAifSIpCiAgfTsKfQoKLyoqCiAqIENyb3NzLXBsYXRmb3JtIGNvZGVnZW4gaGVscGVyIGZvciBnZW5lcmF0aW5nIHYtbW9kZWwgdmFsdWUgYXNzaWdubWVudCBjb2RlLgogKi8KZnVuY3Rpb24gZ2VuQXNzaWdubWVudENvZGUgKAogIHZhbHVlLAogIGFzc2lnbm1lbnQKKSB7CiAgdmFyIHJlcyA9IHBhcnNlTW9kZWwodmFsdWUpOwogIGlmIChyZXMua2V5ID09PSBudWxsKSB7CiAgICByZXR1cm4gKHZhbHVlICsgIj0iICsgYXNzaWdubWVudCkKICB9IGVsc2UgewogICAgcmV0dXJuICgiJHNldCgiICsgKHJlcy5leHApICsgIiwgIiArIChyZXMua2V5KSArICIsICIgKyBhc3NpZ25tZW50ICsgIikiKQogIH0KfQoKLyoqCiAqIFBhcnNlIGEgdi1tb2RlbCBleHByZXNzaW9uIGludG8gYSBiYXNlIHBhdGggYW5kIGEgZmluYWwga2V5IHNlZ21lbnQuCiAqIEhhbmRsZXMgYm90aCBkb3QtcGF0aCBhbmQgcG9zc2libGUgc3F1YXJlIGJyYWNrZXRzLgogKgogKiBQb3NzaWJsZSBjYXNlczoKICoKICogLSB0ZXN0CiAqIC0gdGVzdFtrZXldCiAqIC0gdGVzdFt0ZXN0MVtrZXldXQogKiAtIHRlc3RbImEiXVtrZXldCiAqIC0geHh4LnRlc3RbYVthXS50ZXN0MVtrZXldXQogKiAtIHRlc3QueHh4LmFbImFzYSJdW3Rlc3QxW2tleV1dCiAqCiAqLwoKdmFyIGxlbjsKdmFyIHN0cjsKdmFyIGNocjsKdmFyIGluZGV4JDE7CnZhciBleHByZXNzaW9uUG9zOwp2YXIgZXhwcmVzc2lvbkVuZFBvczsKCgoKZnVuY3Rpb24gcGFyc2VNb2RlbCAodmFsKSB7CiAgLy8gRml4IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvcHVsbC83NzMwCiAgLy8gYWxsb3cgdi1tb2RlbD0ib2JqLnZhbCAiICh0cmFpbGluZyB3aGl0ZXNwYWNlKQogIHZhbCA9IHZhbC50cmltKCk7CiAgbGVuID0gdmFsLmxlbmd0aDsKCiAgaWYgKHZhbC5pbmRleE9mKCdbJykgPCAwIHx8IHZhbC5sYXN0SW5kZXhPZignXScpIDwgbGVuIC0gMSkgewogICAgaW5kZXgkMSA9IHZhbC5sYXN0SW5kZXhPZignLicpOwogICAgaWYgKGluZGV4JDEgPiAtMSkgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLnNsaWNlKDAsIGluZGV4JDEpLAogICAgICAgIGtleTogJyInICsgdmFsLnNsaWNlKGluZGV4JDEgKyAxKSArICciJwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLAogICAgICAgIGtleTogbnVsbAogICAgICB9CiAgICB9CiAgfQoKICBzdHIgPSB2YWw7CiAgaW5kZXgkMSA9IGV4cHJlc3Npb25Qb3MgPSBleHByZXNzaW9uRW5kUG9zID0gMDsKCiAgd2hpbGUgKCFlb2YoKSkgewogICAgY2hyID0gbmV4dCgpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QikgewogICAgICBwYXJzZUJyYWNrZXQoY2hyKTsKICAgIH0KICB9CgogIHJldHVybiB7CiAgICBleHA6IHZhbC5zbGljZSgwLCBleHByZXNzaW9uUG9zKSwKICAgIGtleTogdmFsLnNsaWNlKGV4cHJlc3Npb25Qb3MgKyAxLCBleHByZXNzaW9uRW5kUG9zKQogIH0KfQoKZnVuY3Rpb24gbmV4dCAoKSB7CiAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgkMSkKfQoKZnVuY3Rpb24gZW9mICgpIHsKICByZXR1cm4gaW5kZXgkMSA+PSBsZW4KfQoKZnVuY3Rpb24gaXNTdHJpbmdTdGFydCAoY2hyKSB7CiAgcmV0dXJuIGNociA9PT0gMHgyMiB8fCBjaHIgPT09IDB4MjcKfQoKZnVuY3Rpb24gcGFyc2VCcmFja2V0IChjaHIpIHsKICB2YXIgaW5CcmFja2V0ID0gMTsKICBleHByZXNzaW9uUG9zID0gaW5kZXgkMTsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAoY2hyID09PSAweDVCKSB7IGluQnJhY2tldCsrOyB9CiAgICBpZiAoY2hyID09PSAweDVEKSB7IGluQnJhY2tldC0tOyB9CiAgICBpZiAoaW5CcmFja2V0ID09PSAwKSB7CiAgICAgIGV4cHJlc3Npb25FbmRQb3MgPSBpbmRleCQxOwogICAgICBicmVhawogICAgfQogIH0KfQoKZnVuY3Rpb24gcGFyc2VTdHJpbmcgKGNocikgewogIHZhciBzdHJpbmdRdW90ZSA9IGNocjsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoY2hyID09PSBzdHJpbmdRdW90ZSkgewogICAgICBicmVhawogICAgfQogIH0KfQoKLyogICovCgp2YXIgd2FybiQxOwoKLy8gaW4gc29tZSBjYXNlcywgdGhlIGV2ZW50IHVzZWQgaGFzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZQovLyBzbyB3ZSB1c2VkIHNvbWUgcmVzZXJ2ZWQgdG9rZW5zIGR1cmluZyBjb21waWxlLgp2YXIgUkFOR0VfVE9LRU4gPSAnX19yJzsKdmFyIENIRUNLQk9YX1JBRElPX1RPS0VOID0gJ19fYyc7CgpmdW5jdGlvbiBtb2RlbCAoCiAgZWwsCiAgZGlyLAogIF93YXJuCikgewogIHdhcm4kMSA9IF93YXJuOwogIHZhciB2YWx1ZSA9IGRpci52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVyczsKICB2YXIgdGFnID0gZWwudGFnOwogIHZhciB0eXBlID0gZWwuYXR0cnNNYXAudHlwZTsKCiAgewogICAgLy8gaW5wdXRzIHdpdGggdHlwZT0iZmlsZSIgYXJlIHJlYWQgb25seSBhbmQgc2V0dGluZyB0aGUgaW5wdXQncwogICAgLy8gdmFsdWUgd2lsbCB0aHJvdyBhbiBlcnJvci4KICAgIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2ZpbGUnKSB7CiAgICAgIHdhcm4kMSgKICAgICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIiB0eXBlPVwiZmlsZVwiPjpcbiIgKwogICAgICAgICJGaWxlIGlucHV0cyBhcmUgcmVhZCBvbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLiIKICAgICAgKTsKICAgIH0KICB9CgogIGlmIChlbC5jb21wb25lbnQpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgIGdlblNlbGVjdChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2NoZWNrYm94JykgewogICAgZ2VuQ2hlY2tib3hNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ3JhZGlvJykgewogICAgZ2VuUmFkaW9Nb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7CiAgICBnZW5EZWZhdWx0TW9kZWwoZWwsIHZhbHVlLCBtb2RpZmllcnMpOwogIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgewogICAgd2FybiQxKAogICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIj46ICIgKwogICAgICAidi1tb2RlbCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZWxlbWVudCB0eXBlLiAiICsKICAgICAgJ0lmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbnRlbnRlZGl0YWJsZSwgaXRcJ3MgcmVjb21tZW5kZWQgdG8gJyArCiAgICAgICd3cmFwIGEgbGlicmFyeSBkZWRpY2F0ZWQgZm9yIHRoYXQgcHVycG9zZSBpbnNpZGUgYSBjdXN0b20gY29tcG9uZW50LicKICAgICk7CiAgfQoKICAvLyBlbnN1cmUgcnVudGltZSBkaXJlY3RpdmUgbWV0YWRhdGEKICByZXR1cm4gdHJ1ZQp9CgpmdW5jdGlvbiBnZW5DaGVja2JveE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciB2YWx1ZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3ZhbHVlJykgfHwgJ251bGwnOwogIHZhciB0cnVlVmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICd0cnVlLXZhbHVlJykgfHwgJ3RydWUnOwogIHZhciBmYWxzZVZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnZmFsc2UtdmFsdWUnKSB8fCAnZmFsc2UnOwogIGFkZFByb3AoZWwsICdjaGVja2VkJywKICAgICJBcnJheS5pc0FycmF5KCIgKyB2YWx1ZSArICIpIiArCiAgICAiP19pKCIgKyB2YWx1ZSArICIsIiArIHZhbHVlQmluZGluZyArICIpPi0xIiArICgKICAgICAgdHJ1ZVZhbHVlQmluZGluZyA9PT0gJ3RydWUnCiAgICAgICAgPyAoIjooIiArIHZhbHVlICsgIikiKQogICAgICAgIDogKCI6X3EoIiArIHZhbHVlICsgIiwiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpIikKICAgICkKICApOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLAogICAgInZhciAkJGE9IiArIHZhbHVlICsgIiwiICsKICAgICAgICAnJCRlbD0kZXZlbnQudGFyZ2V0LCcgKwogICAgICAgICIkJGM9JCRlbC5jaGVja2VkPygiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpOigiICsgZmFsc2VWYWx1ZUJpbmRpbmcgKyAiKTsiICsKICAgICdpZihBcnJheS5pc0FycmF5KCQkYSkpeycgKwogICAgICAidmFyICQkdj0iICsgKG51bWJlciA/ICdfbignICsgdmFsdWVCaW5kaW5nICsgJyknIDogdmFsdWVCaW5kaW5nKSArICIsIiArCiAgICAgICAgICAnJCRpPV9pKCQkYSwkJHYpOycgKwogICAgICAiaWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIgKyAoZ2VuQXNzaWdubWVudENvZGUodmFsdWUsICckJGEuY29uY2F0KFskJHZdKScpKSArICIpfSIgKwogICAgICAiZWxzZXskJGk+LTEmJigiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSknKSkgKyAiKX0iICsKICAgICJ9ZWxzZXsiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRjJykpICsgIn0iLAogICAgbnVsbCwgdHJ1ZQogICk7Cn0KCmZ1bmN0aW9uIGdlblJhZGlvTW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgbnVtYmVyID0gbW9kaWZpZXJzICYmIG1vZGlmaWVycy5udW1iZXI7CiAgdmFyIHZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKSB8fCAnbnVsbCc7CiAgdmFsdWVCaW5kaW5nID0gbnVtYmVyID8gKCJfbigiICsgdmFsdWVCaW5kaW5nICsgIikiKSA6IHZhbHVlQmluZGluZzsKICBhZGRQcm9wKGVsLCAnY2hlY2tlZCcsICgiX3EoIiArIHZhbHVlICsgIiwiICsgdmFsdWVCaW5kaW5nICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsIGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCB2YWx1ZUJpbmRpbmcpLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuU2VsZWN0ICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciBzZWxlY3RlZFZhbCA9ICJBcnJheS5wcm90b3R5cGUuZmlsdGVyIiArCiAgICAiLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLGZ1bmN0aW9uKG8pe3JldHVybiBvLnNlbGVjdGVkfSkiICsKICAgICIubWFwKGZ1bmN0aW9uKG8pe3ZhciB2YWwgPSBcIl92YWx1ZVwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7IiArCiAgICAicmV0dXJuICIgKyAobnVtYmVyID8gJ19uKHZhbCknIDogJ3ZhbCcpICsgIn0pIjsKCiAgdmFyIGFzc2lnbm1lbnQgPSAnJGV2ZW50LnRhcmdldC5tdWx0aXBsZSA/ICQkc2VsZWN0ZWRWYWwgOiAkJHNlbGVjdGVkVmFsWzBdJzsKICB2YXIgY29kZSA9ICJ2YXIgJCRzZWxlY3RlZFZhbCA9ICIgKyBzZWxlY3RlZFZhbCArICI7IjsKICBjb2RlID0gY29kZSArICIgIiArIChnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgYXNzaWdubWVudCkpOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLCBjb2RlLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuRGVmYXVsdE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIHR5cGUgPSBlbC5hdHRyc01hcC50eXBlOwoKICAvLyB3YXJuIGlmIHYtYmluZDp2YWx1ZSBjb25mbGljdHMgd2l0aCB2LW1vZGVsCiAgLy8gZXhjZXB0IGZvciBpbnB1dHMgd2l0aCB2LWJpbmQ6dHlwZQogIHsKICAgIHZhciB2YWx1ZSQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddIHx8IGVsLmF0dHJzTWFwWyc6dmFsdWUnXTsKICAgIHZhciB0eXBlQmluZGluZyA9IGVsLmF0dHJzTWFwWyd2LWJpbmQ6dHlwZSddIHx8IGVsLmF0dHJzTWFwWyc6dHlwZSddOwogICAgaWYgKHZhbHVlJDEgJiYgIXR5cGVCaW5kaW5nKSB7CiAgICAgIHZhciBiaW5kaW5nID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddID8gJ3YtYmluZDp2YWx1ZScgOiAnOnZhbHVlJzsKICAgICAgd2FybiQxKAogICAgICAgIGJpbmRpbmcgKyAiPVwiIiArIHZhbHVlJDEgKyAiXCIgY29uZmxpY3RzIHdpdGggdi1tb2RlbCBvbiB0aGUgc2FtZSBlbGVtZW50ICIgKwogICAgICAgICdiZWNhdXNlIHRoZSBsYXR0ZXIgYWxyZWFkeSBleHBhbmRzIHRvIGEgdmFsdWUgYmluZGluZyBpbnRlcm5hbGx5JwogICAgICApOwogICAgfQogIH0KCiAgdmFyIHJlZiA9IG1vZGlmaWVycyB8fCB7fTsKICB2YXIgbGF6eSA9IHJlZi5sYXp5OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CiAgdmFyIG5lZWRDb21wb3NpdGlvbkd1YXJkID0gIWxhenkgJiYgdHlwZSAhPT0gJ3JhbmdlJzsKICB2YXIgZXZlbnQgPSBsYXp5CiAgICA/ICdjaGFuZ2UnCiAgICA6IHR5cGUgPT09ICdyYW5nZScKICAgICAgPyBSQU5HRV9UT0tFTgogICAgICA6ICdpbnB1dCc7CgogIHZhciB2YWx1ZUV4cHJlc3Npb24gPSAnJGV2ZW50LnRhcmdldC52YWx1ZSc7CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKSI7CiAgfQogIGlmIChudW1iZXIpIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICJfbigiICsgdmFsdWVFeHByZXNzaW9uICsgIikiOwogIH0KCiAgdmFyIGNvZGUgPSBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgdmFsdWVFeHByZXNzaW9uKTsKICBpZiAobmVlZENvbXBvc2l0aW9uR3VhcmQpIHsKICAgIGNvZGUgPSAiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIgKyBjb2RlOwogIH0KCiAgYWRkUHJvcChlbCwgJ3ZhbHVlJywgKCIoIiArIHZhbHVlICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgZXZlbnQsIGNvZGUsIG51bGwsIHRydWUpOwogIGlmICh0cmltIHx8IG51bWJlcikgewogICAgYWRkSGFuZGxlcihlbCwgJ2JsdXInLCAnJGZvcmNlVXBkYXRlKCknKTsKICB9Cn0KCi8qICAqLwoKLy8gbm9ybWFsaXplIHYtbW9kZWwgZXZlbnQgdG9rZW5zIHRoYXQgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLgovLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlCi8vIHRoZSB3aG9sZSBwb2ludCBpcyBlbnN1cmluZyB0aGUgdi1tb2RlbCBjYWxsYmFjayBnZXRzIGNhbGxlZCBiZWZvcmUKLy8gdXNlci1hdHRhY2hlZCBoYW5kbGVycy4KZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltSQU5HRV9UT0tFTl0pKSB7CiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50CiAgICB2YXIgZXZlbnQgPSBpc0lFID8gJ2NoYW5nZScgOiAnaW5wdXQnOwogICAgb25bZXZlbnRdID0gW10uY29uY2F0KG9uW1JBTkdFX1RPS0VOXSwgb25bZXZlbnRdIHx8IFtdKTsKICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07CiAgfQogIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gZml4ICM0NTIxIGJ1dCBubyBsb25nZXIgbmVjZXNzYXJ5CiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltDSEVDS0JPWF9SQURJT19UT0tFTl0pKSB7CiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pOwogICAgZGVsZXRlIG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXTsKICB9Cn0KCnZhciB0YXJnZXQkMTsKCmZ1bmN0aW9uIGNyZWF0ZU9uY2VIYW5kbGVyIChoYW5kbGVyLCBldmVudCwgY2FwdHVyZSkgewogIHZhciBfdGFyZ2V0ID0gdGFyZ2V0JDE7IC8vIHNhdmUgY3VycmVudCB0YXJnZXQgZWxlbWVudCBpbiBjbG9zdXJlCiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHsKICAgIHZhciByZXMgPSBoYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzICE9PSBudWxsKSB7CiAgICAgIHJlbW92ZSQyKGV2ZW50LCBvbmNlSGFuZGxlciwgY2FwdHVyZSwgX3RhcmdldCk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBhZGQkMSAoCiAgZXZlbnQsCiAgaGFuZGxlciwKICBvbmNlJCQxLAogIGNhcHR1cmUsCiAgcGFzc2l2ZQopIHsKICBoYW5kbGVyID0gd2l0aE1hY3JvVGFzayhoYW5kbGVyKTsKICBpZiAob25jZSQkMSkgeyBoYW5kbGVyID0gY3JlYXRlT25jZUhhbmRsZXIoaGFuZGxlciwgZXZlbnQsIGNhcHR1cmUpOyB9CiAgdGFyZ2V0JDEuYWRkRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlciwKICAgIHN1cHBvcnRzUGFzc2l2ZQogICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9CiAgICAgIDogY2FwdHVyZQogICk7Cn0KCmZ1bmN0aW9uIHJlbW92ZSQyICgKICBldmVudCwKICBoYW5kbGVyLAogIGNhcHR1cmUsCiAgX3RhcmdldAopIHsKICAoX3RhcmdldCB8fCB0YXJnZXQkMSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlci5fd2l0aFRhc2sgfHwgaGFuZGxlciwKICAgIGNhcHR1cmUKICApOwp9CgpmdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEub24pICYmIGlzVW5kZWYodm5vZGUuZGF0YS5vbikpIHsKICAgIHJldHVybgogIH0KICB2YXIgb24gPSB2bm9kZS5kYXRhLm9uIHx8IHt9OwogIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307CiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07CiAgbm9ybWFsaXplRXZlbnRzKG9uKTsKICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpOwogIHRhcmdldCQxID0gdW5kZWZpbmVkOwp9Cgp2YXIgZXZlbnRzID0gewogIGNyZWF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzLAogIHVwZGF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlRE9NUHJvcHMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuZG9tUHJvcHMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5kb21Qcm9wcykpIHsKICAgIHJldHVybgogIH0KICB2YXIga2V5LCBjdXI7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkUHJvcHMgPSBvbGRWbm9kZS5kYXRhLmRvbVByb3BzIHx8IHt9OwogIHZhciBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKHByb3BzLl9fb2JfXykpIHsKICAgIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHMpOwogIH0KCiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHsKICAgIGlmIChpc1VuZGVmKHByb3BzW2tleV0pKSB7CiAgICAgIGVsbVtrZXldID0gJyc7CiAgICB9CiAgfQogIGZvciAoa2V5IGluIHByb3BzKSB7CiAgICBjdXIgPSBwcm9wc1trZXldOwogICAgLy8gaWdub3JlIGNoaWxkcmVuIGlmIHRoZSBub2RlIGhhcyB0ZXh0Q29udGVudCBvciBpbm5lckhUTUwsCiAgICAvLyBhcyB0aGVzZSB3aWxsIHRocm93IGF3YXkgZXhpc3RpbmcgRE9NIG5vZGVzIGFuZCBjYXVzZSByZW1vdmFsIGVycm9ycwogICAgLy8gb24gc3Vic2VxdWVudCBwYXRjaGVzICgjMzM2MCkKICAgIGlmIChrZXkgPT09ICd0ZXh0Q29udGVudCcgfHwga2V5ID09PSAnaW5uZXJIVE1MJykgewogICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHsgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID0gMDsgfQogICAgICBpZiAoY3VyID09PSBvbGRQcm9wc1trZXldKSB7IGNvbnRpbnVlIH0KICAgICAgLy8gIzY2MDEgd29yayBhcm91bmQgQ2hyb21lIHZlcnNpb24gPD0gNTUgYnVnIHdoZXJlIHNpbmdsZSB0ZXh0Tm9kZQogICAgICAvLyByZXBsYWNlZCBieSBpbm5lckhUTUwvdGV4dENvbnRlbnQgcmV0YWlucyBpdHMgcGFyZW50Tm9kZSBwcm9wZXJ0eQogICAgICBpZiAoZWxtLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5jaGlsZE5vZGVzWzBdKTsKICAgICAgfQogICAgfQoKICAgIGlmIChrZXkgPT09ICd2YWx1ZScpIHsKICAgICAgLy8gc3RvcmUgdmFsdWUgYXMgX3ZhbHVlIGFzIHdlbGwgc2luY2UKICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZAogICAgICBlbG0uX3ZhbHVlID0gY3VyOwogICAgICAvLyBhdm9pZCByZXNldHRpbmcgY3Vyc29yIHBvc2l0aW9uIHdoZW4gdmFsdWUgaXMgdGhlIHNhbWUKICAgICAgdmFyIHN0ckN1ciA9IGlzVW5kZWYoY3VyKSA/ICcnIDogU3RyaW5nKGN1cik7CiAgICAgIGlmIChzaG91bGRVcGRhdGVWYWx1ZShlbG0sIHN0ckN1cikpIHsKICAgICAgICBlbG0udmFsdWUgPSBzdHJDdXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVsbVtrZXldID0gY3VyOwogICAgfQogIH0KfQoKLy8gY2hlY2sgcGxhdGZvcm1zL3dlYi91dGlsL2F0dHJzLmpzIGFjY2VwdFZhbHVlCgoKZnVuY3Rpb24gc2hvdWxkVXBkYXRlVmFsdWUgKGVsbSwgY2hlY2tWYWwpIHsKICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmICgKICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fAogICAgaXNOb3RJbkZvY3VzQW5kRGlydHkoZWxtLCBjaGVja1ZhbCkgfHwKICAgIGlzRGlydHlXaXRoTW9kaWZpZXJzKGVsbSwgY2hlY2tWYWwpCiAgKSkKfQoKZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHsKICAvLyByZXR1cm4gdHJ1ZSB3aGVuIHRleHRib3ggKC5udW1iZXIgYW5kIC50cmltKSBsb3NlcyBmb2N1cyBhbmQgaXRzIHZhbHVlIGlzCiAgLy8gbm90IGVxdWFsIHRvIHRoZSB1cGRhdGVkIHZhbHVlCiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlOwogIC8vICM2MTU3CiAgLy8gd29yayBhcm91bmQgSUUgYnVnIHdoZW4gYWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW4gYW4gaWZyYW1lCiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge30KICByZXR1cm4gbm90SW5Gb2N1cyAmJiBlbG0udmFsdWUgIT09IGNoZWNrVmFsCn0KCmZ1bmN0aW9uIGlzRGlydHlXaXRoTW9kaWZpZXJzIChlbG0sIG5ld1ZhbCkgewogIHZhciB2YWx1ZSA9IGVsbS52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWUKICBpZiAoaXNEZWYobW9kaWZpZXJzKSkgewogICAgaWYgKG1vZGlmaWVycy5sYXp5KSB7CiAgICAgIC8vIGlucHV0cyB3aXRoIGxhenkgc2hvdWxkIG9ubHkgYmUgdXBkYXRlZCB3aGVuIG5vdCBpbiBmb2N1cwogICAgICByZXR1cm4gZmFsc2UKICAgIH0KICAgIGlmIChtb2RpZmllcnMubnVtYmVyKSB7CiAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgIT09IHRvTnVtYmVyKG5ld1ZhbCkKICAgIH0KICAgIGlmIChtb2RpZmllcnMudHJpbSkgewogICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSBuZXdWYWwudHJpbSgpCiAgICB9CiAgfQogIHJldHVybiB2YWx1ZSAhPT0gbmV3VmFsCn0KCnZhciBkb21Qcm9wcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLAogIHVwZGF0ZTogdXBkYXRlRE9NUHJvcHMKfQoKLyogICovCgp2YXIgcGFyc2VTdHlsZVRleHQgPSBjYWNoZWQoZnVuY3Rpb24gKGNzc1RleHQpIHsKICB2YXIgcmVzID0ge307CiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXCkpL2c7CiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLzsKICBjc3NUZXh0LnNwbGl0KGxpc3REZWxpbWl0ZXIpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmIChpdGVtKSB7CiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTsKICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJlc1t0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpOwogICAgfQogIH0pOwogIHJldHVybiByZXMKfSk7CgovLyBtZXJnZSBzdGF0aWMgYW5kIGR5bmFtaWMgc3R5bGUgZGF0YSBvbiB0aGUgc2FtZSB2bm9kZQpmdW5jdGlvbiBub3JtYWxpemVTdHlsZURhdGEgKGRhdGEpIHsKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZGF0YS5zdHlsZSk7CiAgLy8gc3RhdGljIHN0eWxlIGlzIHByZS1wcm9jZXNzZWQgaW50byBhbiBvYmplY3QgZHVyaW5nIGNvbXBpbGF0aW9uCiAgLy8gYW5kIGlzIGFsd2F5cyBhIGZyZXNoIG9iamVjdCwgc28gaXQncyBzYWZlIHRvIG1lcmdlIGludG8gaXQKICByZXR1cm4gZGF0YS5zdGF0aWNTdHlsZQogICAgPyBleHRlbmQoZGF0YS5zdGF0aWNTdHlsZSwgc3R5bGUpCiAgICA6IHN0eWxlCn0KCi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3QKZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHsKICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nU3R5bGUpKSB7CiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKQogIH0KICBpZiAodHlwZW9mIGJpbmRpbmdTdHlsZSA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpCiAgfQogIHJldHVybiBiaW5kaW5nU3R5bGUKfQoKLyoqCiAqIHBhcmVudCBjb21wb25lbnQgc3R5bGUgc2hvdWxkIGJlIGFmdGVyIGNoaWxkJ3MKICogc28gdGhhdCBwYXJlbnQgY29tcG9uZW50J3Mgc3R5bGUgY291bGQgb3ZlcnJpZGUgaXQKICovCmZ1bmN0aW9uIGdldFN0eWxlICh2bm9kZSwgY2hlY2tDaGlsZCkgewogIHZhciByZXMgPSB7fTsKICB2YXIgc3R5bGVEYXRhOwoKICBpZiAoY2hlY2tDaGlsZCkgewogICAgdmFyIGNoaWxkTm9kZSA9IHZub2RlOwogICAgd2hpbGUgKGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZSkgewogICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlOwogICAgICBpZiAoCiAgICAgICAgY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhICYmCiAgICAgICAgKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YShjaGlsZE5vZGUuZGF0YSkpCiAgICAgICkgewogICAgICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICgoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHZub2RlLmRhdGEpKSkgewogICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICB9CgogIHZhciBwYXJlbnROb2RlID0gdm5vZGU7CiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7CiAgICBpZiAocGFyZW50Tm9kZS5kYXRhICYmIChzdHlsZURhdGEgPSBub3JtYWxpemVTdHlsZURhdGEocGFyZW50Tm9kZS5kYXRhKSkpIHsKICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCnZhciBjc3NWYXJSRSA9IC9eLS0vOwp2YXIgaW1wb3J0YW50UkUgPSAvXHMqIWltcG9ydGFudCQvOwp2YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGNzc1ZhclJFLnRlc3QobmFtZSkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7CiAgfSBlbHNlIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCAnJyksICdpbXBvcnRhbnQnKTsKICB9IGVsc2UgewogICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplKG5hbWUpOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAvLyBTdXBwb3J0IHZhbHVlcyBhcnJheSBjcmVhdGVkIGJ5IGF1dG9wcmVmaXhlciwgZS5nLgogICAgICAvLyB7ZGlzcGxheTogWyItd2Via2l0LWJveCIsICItbXMtZmxleGJveCIsICJmbGV4Il19CiAgICAgIC8vIFNldCB0aGVtIG9uZSBieSBvbmUsIGFuZCB0aGUgYnJvd3NlciB3aWxsIG9ubHkgc2V0IHRob3NlIGl0IGNhbiByZWNvZ25pemUKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbC5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbFtpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsOwogICAgfQogIH0KfTsKCnZhciB2ZW5kb3JOYW1lcyA9IFsnV2Via2l0JywgJ01veicsICdtcyddOwoKdmFyIGVtcHR5U3R5bGU7CnZhciBub3JtYWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHByb3ApIHsKICBlbXB0eVN0eWxlID0gZW1wdHlTdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKICBwcm9wID0gY2FtZWxpemUocHJvcCk7CiAgaWYgKHByb3AgIT09ICdmaWx0ZXInICYmIChwcm9wIGluIGVtcHR5U3R5bGUpKSB7CiAgICByZXR1cm4gcHJvcAogIH0KICB2YXIgY2FwTmFtZSA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBuYW1lID0gdmVuZG9yTmFtZXNbaV0gKyBjYXBOYW1lOwogICAgaWYgKG5hbWUgaW4gZW1wdHlTdHlsZSkgewogICAgICByZXR1cm4gbmFtZQogICAgfQogIH0KfSk7CgpmdW5jdGlvbiB1cGRhdGVTdHlsZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTsKCiAgaWYgKGlzVW5kZWYoZGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihkYXRhLnN0eWxlKSAmJgogICAgaXNVbmRlZihvbGREYXRhLnN0YXRpY1N0eWxlKSAmJiBpc1VuZGVmKG9sZERhdGEuc3R5bGUpCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjdXIsIG5hbWU7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwogIHZhciBvbGRTdGF0aWNTdHlsZSA9IG9sZERhdGEuc3RhdGljU3R5bGU7CiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZERhdGEubm9ybWFsaXplZFN0eWxlIHx8IG9sZERhdGEuc3R5bGUgfHwge307CgogIC8vIGlmIHN0YXRpYyBzdHlsZSBleGlzdHMsIHN0eWxlYmluZGluZyBhbHJlYWR5IG1lcmdlZCBpbnRvIGl0IHdoZW4gZG9pbmcgbm9ybWFsaXplU3R5bGVEYXRhCiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nOwoKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcodm5vZGUuZGF0YS5zdHlsZSkgfHwge307CgogIC8vIHN0b3JlIG5vcm1hbGl6ZWQgc3R5bGUgdW5kZXIgYSBkaWZmZXJlbnQga2V5IGZvciBuZXh0IGRpZmYKICAvLyBtYWtlIHN1cmUgdG8gY2xvbmUgaXQgaWYgaXQncyByZWFjdGl2ZSwgc2luY2UgdGhlIHVzZXIgbGlrZWx5IHdhbnRzCiAgLy8gdG8gbXV0YXRlIGl0LgogIHZub2RlLmRhdGEubm9ybWFsaXplZFN0eWxlID0gaXNEZWYoc3R5bGUuX19vYl9fKQogICAgPyBleHRlbmQoe30sIHN0eWxlKQogICAgOiBzdHlsZTsKCiAgdmFyIG5ld1N0eWxlID0gZ2V0U3R5bGUodm5vZGUsIHRydWUpOwoKICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHsKICAgIGlmIChpc1VuZGVmKG5ld1N0eWxlW25hbWVdKSkgewogICAgICBzZXRQcm9wKGVsLCBuYW1lLCAnJyk7CiAgICB9CiAgfQogIGZvciAobmFtZSBpbiBuZXdTdHlsZSkgewogICAgY3VyID0gbmV3U3R5bGVbbmFtZV07CiAgICBpZiAoY3VyICE9PSBvbGRTdHlsZVtuYW1lXSkgewogICAgICAvLyBpZTkgc2V0dGluZyB0byBudWxsIGhhcyBubyBlZmZlY3QsIG11c3QgdXNlIGVtcHR5IHN0cmluZwogICAgICBzZXRQcm9wKGVsLCBuYW1lLCBjdXIgPT0gbnVsbCA/ICcnIDogY3VyKTsKICAgIH0KICB9Cn0KCnZhciBzdHlsZSA9IHsKICBjcmVhdGU6IHVwZGF0ZVN0eWxlLAogIHVwZGF0ZTogdXBkYXRlU3R5bGUKfQoKLyogICovCgovKioKICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gYWRkQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbHMpOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgY3VyID0gIiAiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAiICI7CiAgICBpZiAoY3VyLmluZGV4T2YoJyAnICsgY2xzICsgJyAnKSA8IDApIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIChjdXIgKyBjbHMpLnRyaW0oKSk7CiAgICB9CiAgfQp9CgovKioKICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gcmVtb3ZlQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbHMpOwogICAgfQogICAgaWYgKCFlbC5jbGFzc0xpc3QubGVuZ3RoKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgIH0KICB9IGVsc2UgewogICAgdmFyIGN1ciA9ICIgIiArIChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiOwogICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJzsKICAgIHdoaWxlIChjdXIuaW5kZXhPZih0YXIpID49IDApIHsKICAgICAgY3VyID0gY3VyLnJlcGxhY2UodGFyLCAnICcpOwogICAgfQogICAgY3VyID0gY3VyLnRyaW0oKTsKICAgIGlmIChjdXIpIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGN1cik7CiAgICB9IGVsc2UgewogICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uIChkZWYpIHsKICBpZiAoIWRlZikgewogICAgcmV0dXJuCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKHR5cGVvZiBkZWYgPT09ICdvYmplY3QnKSB7CiAgICB2YXIgcmVzID0ge307CiAgICBpZiAoZGVmLmNzcyAhPT0gZmFsc2UpIHsKICAgICAgZXh0ZW5kKHJlcywgYXV0b0Nzc1RyYW5zaXRpb24oZGVmLm5hbWUgfHwgJ3YnKSk7CiAgICB9CiAgICBleHRlbmQocmVzLCBkZWYpOwogICAgcmV0dXJuIHJlcwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZiA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYpCiAgfQp9Cgp2YXIgYXV0b0Nzc1RyYW5zaXRpb24gPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHsKICByZXR1cm4gewogICAgZW50ZXJDbGFzczogKG5hbWUgKyAiLWVudGVyIiksCiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgIi1lbnRlci10byIpLAogICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyAiLWVudGVyLWFjdGl2ZSIpLAogICAgbGVhdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlIiksCiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgIi1sZWF2ZS10byIpLAogICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlLWFjdGl2ZSIpCiAgfQp9KTsKCnZhciBoYXNUcmFuc2l0aW9uID0gaW5Ccm93c2VyICYmICFpc0lFOTsKdmFyIFRSQU5TSVRJT04gPSAndHJhbnNpdGlvbic7CnZhciBBTklNQVRJT04gPSAnYW5pbWF0aW9uJzsKCi8vIFRyYW5zaXRpb24gcHJvcGVydHkvZXZlbnQgc25pZmZpbmcKdmFyIHRyYW5zaXRpb25Qcm9wID0gJ3RyYW5zaXRpb24nOwp2YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3RyYW5zaXRpb25lbmQnOwp2YXIgYW5pbWF0aW9uUHJvcCA9ICdhbmltYXRpb24nOwp2YXIgYW5pbWF0aW9uRW5kRXZlbnQgPSAnYW5pbWF0aW9uZW5kJzsKaWYgKGhhc1RyYW5zaXRpb24pIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAod2luZG93Lm9udHJhbnNpdGlvbmVuZCA9PT0gdW5kZWZpbmVkICYmCiAgICB3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kICE9PSB1bmRlZmluZWQKICApIHsKICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nOwogICAgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnOwogIH0KICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiYKICAgIHdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCAhPT0gdW5kZWZpbmVkCiAgKSB7CiAgICBhbmltYXRpb25Qcm9wID0gJ1dlYmtpdEFuaW1hdGlvbic7CiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnOwogIH0KfQoKLy8gYmluZGluZyB0byB3aW5kb3cgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaG90IHJlbG9hZCB3b3JrIGluIElFIGluIHN0cmljdCBtb2RlCnZhciByYWYgPSBpbkJyb3dzZXIKICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUKICAgID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykKICAgIDogc2V0VGltZW91dAogIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9OwoKZnVuY3Rpb24gbmV4dEZyYW1lIChmbikgewogIHJhZihmdW5jdGlvbiAoKSB7CiAgICByYWYoZm4pOwogIH0pOwp9CgpmdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICB2YXIgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXMgfHwgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcyA9IFtdKTsKICBpZiAodHJhbnNpdGlvbkNsYXNzZXMuaW5kZXhPZihjbHMpIDwgMCkgewogICAgdHJhbnNpdGlvbkNsYXNzZXMucHVzaChjbHMpOwogICAgYWRkQ2xhc3MoZWwsIGNscyk7CiAgfQp9CgpmdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7CiAgICByZW1vdmUoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpOwogIH0KICByZW1vdmVDbGFzcyhlbCwgY2xzKTsKfQoKZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzICgKICBlbCwKICBleHBlY3RlZFR5cGUsCiAgY2IKKSB7CiAgdmFyIHJlZiA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpOwogIHZhciB0eXBlID0gcmVmLnR5cGU7CiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDsKICB2YXIgcHJvcENvdW50ID0gcmVmLnByb3BDb3VudDsKICBpZiAoIXR5cGUpIHsgcmV0dXJuIGNiKCkgfQogIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDsKICB2YXIgZW5kZWQgPSAwOwogIHZhciBlbmQgPSBmdW5jdGlvbiAoKSB7CiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7CiAgICBjYigpOwogIH07CiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHsKICAgIGlmIChlLnRhcmdldCA9PT0gZWwpIHsKICAgICAgaWYgKCsrZW5kZWQgPj0gcHJvcENvdW50KSB7CiAgICAgICAgZW5kKCk7CiAgICAgIH0KICAgIH0KICB9OwogIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7CiAgICAgIGVuZCgpOwogICAgfQogIH0sIHRpbWVvdXQgKyAxKTsKICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7Cn0KCnZhciB0cmFuc2Zvcm1SRSA9IC9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLzsKCmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvIChlbCwgZXhwZWN0ZWRUeXBlKSB7CiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTsKICB2YXIgdHJhbnNpdGlvbkRlbGF5cyA9IHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEZWxheSddLnNwbGl0KCcsICcpOwogIHZhciB0cmFuc2l0aW9uRHVyYXRpb25zID0gc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7CiAgdmFyIHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTsKICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uRHVyYXRpb25zID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRHVyYXRpb24nXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpOwoKICB2YXIgdHlwZTsKICB2YXIgdGltZW91dCA9IDA7CiAgdmFyIHByb3BDb3VudCA9IDA7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gVFJBTlNJVElPTikgewogICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkgewogICAgICB0eXBlID0gVFJBTlNJVElPTjsKICAgICAgdGltZW91dCA9IHRyYW5zaXRpb25UaW1lb3V0OwogICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDsKICAgIH0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gQU5JTUFUSU9OKSB7CiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHsKICAgICAgdHlwZSA9IEFOSU1BVElPTjsKICAgICAgdGltZW91dCA9IGFuaW1hdGlvblRpbWVvdXQ7CiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7CiAgICB9CiAgfSBlbHNlIHsKICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7CiAgICB0eXBlID0gdGltZW91dCA+IDAKICAgICAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQKICAgICAgICA/IFRSQU5TSVRJT04KICAgICAgICA6IEFOSU1BVElPTgogICAgICA6IG51bGw7CiAgICBwcm9wQ291bnQgPSB0eXBlCiAgICAgID8gdHlwZSA9PT0gVFJBTlNJVElPTgogICAgICAgID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgOiAwOwogIH0KICB2YXIgaGFzVHJhbnNmb3JtID0KICAgIHR5cGUgPT09IFRSQU5TSVRJT04gJiYKICAgIHRyYW5zZm9ybVJFLnRlc3Qoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ1Byb3BlcnR5J10pOwogIHJldHVybiB7CiAgICB0eXBlOiB0eXBlLAogICAgdGltZW91dDogdGltZW91dCwKICAgIHByb3BDb3VudDogcHJvcENvdW50LAogICAgaGFzVHJhbnNmb3JtOiBoYXNUcmFuc2Zvcm0KICB9Cn0KCmZ1bmN0aW9uIGdldFRpbWVvdXQgKGRlbGF5cywgZHVyYXRpb25zKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICB3aGlsZSAoZGVsYXlzLmxlbmd0aCA8IGR1cmF0aW9ucy5sZW5ndGgpIHsKICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTsKICB9CgogIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBkdXJhdGlvbnMubWFwKGZ1bmN0aW9uIChkLCBpKSB7CiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKQogIH0pKQp9CgpmdW5jdGlvbiB0b01zIChzKSB7CiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKSkgKiAxMDAwCn0KCi8qICAqLwoKZnVuY3Rpb24gZW50ZXIgKHZub2RlLCB0b2dnbGVEaXNwbGF5KSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHsKICAgIGVsLl9sZWF2ZUNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fbGVhdmVDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsKICAgIHJldHVybgogIH0KCiAgdmFyIGNzcyA9IGRhdGEuY3NzOwogIHZhciB0eXBlID0gZGF0YS50eXBlOwogIHZhciBlbnRlckNsYXNzID0gZGF0YS5lbnRlckNsYXNzOwogIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzczsKICB2YXIgZW50ZXJBY3RpdmVDbGFzcyA9IGRhdGEuZW50ZXJBY3RpdmVDbGFzczsKICB2YXIgYXBwZWFyQ2xhc3MgPSBkYXRhLmFwcGVhckNsYXNzOwogIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzOwogIHZhciBhcHBlYXJBY3RpdmVDbGFzcyA9IGRhdGEuYXBwZWFyQWN0aXZlQ2xhc3M7CiAgdmFyIGJlZm9yZUVudGVyID0gZGF0YS5iZWZvcmVFbnRlcjsKICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyOwogIHZhciBhZnRlckVudGVyID0gZGF0YS5hZnRlckVudGVyOwogIHZhciBlbnRlckNhbmNlbGxlZCA9IGRhdGEuZW50ZXJDYW5jZWxsZWQ7CiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyOwogIHZhciBhcHBlYXIgPSBkYXRhLmFwcGVhcjsKICB2YXIgYWZ0ZXJBcHBlYXIgPSBkYXRhLmFmdGVyQXBwZWFyOwogIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDsKICB2YXIgZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uOwoKICAvLyBhY3RpdmVJbnN0YW5jZSB3aWxsIGFsd2F5cyBiZSB0aGUgPHRyYW5zaXRpb24+IGNvbXBvbmVudCBtYW5hZ2luZyB0aGlzCiAgLy8gdHJhbnNpdGlvbi4gT25lIGVkZ2UgY2FzZSB0byBjaGVjayBpcyB3aGVuIHRoZSA8dHJhbnNpdGlvbj4gaXMgcGxhY2VkCiAgLy8gYXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNoaWxkIGNvbXBvbmVudC4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY2hlY2sKICAvLyA8dHJhbnNpdGlvbj4ncyBwYXJlbnQgZm9yIGFwcGVhciBjaGVjay4KICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlOwogIHZhciB0cmFuc2l0aW9uTm9kZSA9IGFjdGl2ZUluc3RhbmNlLiR2bm9kZTsKICB3aGlsZSAodHJhbnNpdGlvbk5vZGUgJiYgdHJhbnNpdGlvbk5vZGUucGFyZW50KSB7CiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDsKICAgIGNvbnRleHQgPSB0cmFuc2l0aW9uTm9kZS5jb250ZXh0OwogIH0KCiAgdmFyIGlzQXBwZWFyID0gIWNvbnRleHQuX2lzTW91bnRlZCB8fCAhdm5vZGUuaXNSb290SW5zZXJ0OwoKICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBzdGFydENsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyQ2xhc3MKICAgID8gYXBwZWFyQ2xhc3MKICAgIDogZW50ZXJDbGFzczsKICB2YXIgYWN0aXZlQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJBY3RpdmVDbGFzcwogICAgPyBhcHBlYXJBY3RpdmVDbGFzcwogICAgOiBlbnRlckFjdGl2ZUNsYXNzOwogIHZhciB0b0NsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyVG9DbGFzcwogICAgPyBhcHBlYXJUb0NsYXNzCiAgICA6IGVudGVyVG9DbGFzczsKCiAgdmFyIGJlZm9yZUVudGVySG9vayA9IGlzQXBwZWFyCiAgICA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpCiAgICA6IGJlZm9yZUVudGVyOwogIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAodHlwZW9mIGFwcGVhciA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGVhciA6IGVudGVyKQogICAgOiBlbnRlcjsKICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAoYWZ0ZXJBcHBlYXIgfHwgYWZ0ZXJFbnRlcikKICAgIDogYWZ0ZXJFbnRlcjsKICB2YXIgZW50ZXJDYW5jZWxsZWRIb29rID0gaXNBcHBlYXIKICAgID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkKICAgIDogZW50ZXJDYW5jZWxsZWQ7CgogIHZhciBleHBsaWNpdEVudGVyRHVyYXRpb24gPSB0b051bWJlcigKICAgIGlzT2JqZWN0KGR1cmF0aW9uKQogICAgICA/IGR1cmF0aW9uLmVudGVyCiAgICAgIDogZHVyYXRpb24KICApOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV4cGxpY2l0RW50ZXJEdXJhdGlvbiAhPSBudWxsKSB7CiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbiwgJ2VudGVyJywgdm5vZGUpOwogIH0KCiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTsKICB2YXIgdXNlcldhbnRzQ29udHJvbCA9IGdldEhvb2tBcmd1bWVudHNMZW5ndGgoZW50ZXJIb29rKTsKCiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHsKICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgdG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgfQogICAgaWYgKGNiLmNhbmNlbGxlZCkgewogICAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7CiAgICAgIH0KICAgICAgZW50ZXJDYW5jZWxsZWRIb29rICYmIGVudGVyQ2FuY2VsbGVkSG9vayhlbCk7CiAgICB9IGVsc2UgewogICAgICBhZnRlckVudGVySG9vayAmJiBhZnRlckVudGVySG9vayhlbCk7CiAgICB9CiAgICBlbC5fZW50ZXJDYiA9IG51bGw7CiAgfSk7CgogIGlmICghdm5vZGUuZGF0YS5zaG93KSB7CiAgICAvLyByZW1vdmUgcGVuZGluZyBsZWF2ZSBlbGVtZW50IG9uIGVudGVyIGJ5IGluamVjdGluZyBhbiBpbnNlcnQgaG9vawogICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlOwogICAgICB2YXIgcGVuZGluZ05vZGUgPSBwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nICYmIHBhcmVudC5fcGVuZGluZ1t2bm9kZS5rZXldOwogICAgICBpZiAocGVuZGluZ05vZGUgJiYKICAgICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJgogICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYgogICAgICApIHsKICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTsKICAgICAgfQogICAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgICB9KTsKICB9CgogIC8vIHN0YXJ0IGVudGVyIHRyYW5zaXRpb24KICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTsKICBpZiAoZXhwZWN0c0NTUykgewogICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHsKICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpOwogICAgICAgIGlmICghdXNlcldhbnRzQ29udHJvbCkgewogICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdEVudGVyRHVyYXRpb24pKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0RW50ZXJEdXJhdGlvbik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgaWYgKHZub2RlLmRhdGEuc2hvdykgewogICAgdG9nZ2xlRGlzcGxheSAmJiB0b2dnbGVEaXNwbGF5KCk7CiAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgfQoKICBpZiAoIWV4cGVjdHNDU1MgJiYgIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgIGNiKCk7CiAgfQp9CgpmdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikpIHsKICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fZW50ZXJDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7CiAgICByZXR1cm4gcm0oKQogIH0KCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGlzRGVmKGVsLl9sZWF2ZUNiKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgY3NzID0gZGF0YS5jc3M7CiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7CiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7CiAgdmFyIGxlYXZlVG9DbGFzcyA9IGRhdGEubGVhdmVUb0NsYXNzOwogIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzOwogIHZhciBiZWZvcmVMZWF2ZSA9IGRhdGEuYmVmb3JlTGVhdmU7CiAgdmFyIGxlYXZlID0gZGF0YS5sZWF2ZTsKICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTsKICB2YXIgbGVhdmVDYW5jZWxsZWQgPSBkYXRhLmxlYXZlQ2FuY2VsbGVkOwogIHZhciBkZWxheUxlYXZlID0gZGF0YS5kZWxheUxlYXZlOwogIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247CgogIHZhciBleHBlY3RzQ1NTID0gY3NzICE9PSBmYWxzZSAmJiAhaXNJRTk7CiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGxlYXZlKTsKCiAgdmFyIGV4cGxpY2l0TGVhdmVEdXJhdGlvbiA9IHRvTnVtYmVyKAogICAgaXNPYmplY3QoZHVyYXRpb24pCiAgICAgID8gZHVyYXRpb24ubGVhdmUKICAgICAgOiBkdXJhdGlvbgogICk7CgogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZXhwbGljaXRMZWF2ZUR1cmF0aW9uKSkgewogICAgY2hlY2tEdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24sICdsZWF2ZScsIHZub2RlKTsKICB9CgogIHZhciBjYiA9IGVsLl9sZWF2ZUNiID0gb25jZShmdW5jdGlvbiAoKSB7CiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7CiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7CiAgICB9CiAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7CiAgICB9CiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgfQogICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7CiAgICB9IGVsc2UgewogICAgICBybSgpOwogICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpOwogICAgfQogICAgZWwuX2xlYXZlQ2IgPSBudWxsOwogIH0pOwoKICBpZiAoZGVsYXlMZWF2ZSkgewogICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpOwogIH0gZWxzZSB7CiAgICBwZXJmb3JtTGVhdmUoKTsKICB9CgogIGZ1bmN0aW9uIHBlcmZvcm1MZWF2ZSAoKSB7CiAgICAvLyB0aGUgZGVsYXllZCBsZWF2ZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkCiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIHJldHVybgogICAgfQogICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudAogICAgaWYgKCF2bm9kZS5kYXRhLnNob3cpIHsKICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlOwogICAgfQogICAgYmVmb3JlTGVhdmUgJiYgYmVmb3JlTGVhdmUoZWwpOwogICAgaWYgKGV4cGVjdHNDU1MpIHsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTsKICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpOwogICAgICAgIGlmICghY2IuY2FuY2VsbGVkKSB7CiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgICAgICBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24pKSB7CiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpOwogICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7CiAgICAgIGNiKCk7CiAgICB9CiAgfQp9CgovLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGUKZnVuY3Rpb24gY2hlY2tEdXJhdGlvbiAodmFsLCBuYW1lLCB2bm9kZSkgewogIGlmICh0eXBlb2YgdmFsICE9PSAnbnVtYmVyJykgewogICAgd2FybigKICAgICAgIjx0cmFuc2l0aW9uPiBleHBsaWNpdCAiICsgbmFtZSArICIgZHVyYXRpb24gaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gIiArCiAgICAgICJnb3QgIiArIChKU09OLnN0cmluZ2lmeSh2YWwpKSArICIuIiwKICAgICAgdm5vZGUuY29udGV4dAogICAgKTsKICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHsKICAgIHdhcm4oCiAgICAgICI8dHJhbnNpdGlvbj4gZXhwbGljaXQgIiArIG5hbWUgKyAiIGR1cmF0aW9uIGlzIE5hTiAtICIgKwogICAgICAndGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LicsCiAgICAgIHZub2RlLmNvbnRleHQKICAgICk7CiAgfQp9CgpmdW5jdGlvbiBpc1ZhbGlkRHVyYXRpb24gKHZhbCkgewogIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKQp9CgovKioKICogTm9ybWFsaXplIGEgdHJhbnNpdGlvbiBob29rJ3MgYXJndW1lbnQgbGVuZ3RoLiBUaGUgaG9vayBtYXkgYmU6CiAqIC0gYSBtZXJnZWQgaG9vayAoaW52b2tlcikgd2l0aCB0aGUgb3JpZ2luYWwgaW4gLmZucwogKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aCkKICogLSBhIHBsYWluIGZ1bmN0aW9uICgubGVuZ3RoKQogKi8KZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHsKICBpZiAoaXNVbmRlZihmbikpIHsKICAgIHJldHVybiBmYWxzZQogIH0KICB2YXIgaW52b2tlckZucyA9IGZuLmZuczsKICBpZiAoaXNEZWYoaW52b2tlckZucykpIHsKICAgIC8vIGludm9rZXIKICAgIHJldHVybiBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKAogICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpCiAgICAgICAgPyBpbnZva2VyRm5zWzBdCiAgICAgICAgOiBpbnZva2VyRm5zCiAgICApCiAgfSBlbHNlIHsKICAgIHJldHVybiAoZm4uX2xlbmd0aCB8fCBmbi5sZW5ndGgpID4gMQogIH0KfQoKZnVuY3Rpb24gX2VudGVyIChfLCB2bm9kZSkgewogIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgIGVudGVyKHZub2RlKTsKICB9Cn0KCnZhciB0cmFuc2l0aW9uID0gaW5Ccm93c2VyID8gewogIGNyZWF0ZTogX2VudGVyLAogIGFjdGl2YXRlOiBfZW50ZXIsCiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUkJDEgKHZub2RlLCBybSkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgICAgbGVhdmUodm5vZGUsIHJtKTsKICAgIH0gZWxzZSB7CiAgICAgIHJtKCk7CiAgICB9CiAgfQp9IDoge30KCnZhciBwbGF0Zm9ybU1vZHVsZXMgPSBbCiAgYXR0cnMsCiAga2xhc3MsCiAgZXZlbnRzLAogIGRvbVByb3BzLAogIHN0eWxlLAogIHRyYW5zaXRpb24KXQoKLyogICovCgovLyB0aGUgZGlyZWN0aXZlIG1vZHVsZSBzaG91bGQgYmUgYXBwbGllZCBsYXN0LCBhZnRlciBhbGwKLy8gYnVpbHQtaW4gbW9kdWxlcyBoYXZlIGJlZW4gYXBwbGllZC4KdmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTsKCnZhciBwYXRjaCA9IGNyZWF0ZVBhdGNoRnVuY3Rpb24oeyBub2RlT3BzOiBub2RlT3BzLCBtb2R1bGVzOiBtb2R1bGVzIH0pOwoKLyoqCiAqIE5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBsaWtlIGF0dGFjaGluZwogKiBwcm9wZXJ0aWVzIHRvIEVsZW1lbnRzLgogKi8KCi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwppZiAoaXNJRTkpIHsKICAvLyBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L2ludGVybmV0LWV4cGxvcmVyLTktb25pbnB1dC8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgaWYgKGVsICYmIGVsLnZtb2RlbCkgewogICAgICB0cmlnZ2VyKGVsLCAnaW5wdXQnKTsKICAgIH0KICB9KTsKfQoKdmFyIGRpcmVjdGl2ZSA9IHsKICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVm5vZGUpIHsKICAgIGlmICh2bm9kZS50YWcgPT09ICdzZWxlY3QnKSB7CiAgICAgIC8vICM2OTAzCiAgICAgIGlmIChvbGRWbm9kZS5lbG0gJiYgIW9sZFZub2RlLmVsbS5fdk9wdGlvbnMpIHsKICAgICAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGRpcmVjdGl2ZS5jb21wb25lbnRVcGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICB9CiAgICAgIGVsLl92T3B0aW9ucyA9IFtdLm1hcC5jYWxsKGVsLm9wdGlvbnMsIGdldFZhbHVlKTsKICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGlzVGV4dElucHV0VHlwZShlbC50eXBlKSkgewogICAgICBlbC5fdk1vZGlmaWVycyA9IGJpbmRpbmcubW9kaWZpZXJzOwogICAgICBpZiAoIWJpbmRpbmcubW9kaWZpZXJzLmxhenkpIHsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpOwogICAgICAgIC8vIFNhZmFyaSA8IDEwLjIgJiBVSVdlYlZpZXcgZG9lc24ndCBmaXJlIGNvbXBvc2l0aW9uZW5kIHdoZW4KICAgICAgICAvLyBzd2l0Y2hpbmcgZm9jdXMgYmVmb3JlIGNvbmZpcm1pbmcgY29tcG9zaXRpb24gY2hvaWNlCiAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZQogICAgICAgIC8vIGZpcmVzICJjaGFuZ2UiIGluc3RlYWQgb2YgImlucHV0IiBvbiBhdXRvY29tcGxldGUuCiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKGlzSUU5KSB7CiAgICAgICAgICBlbC52bW9kZWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIGNvbXBvbmVudFVwZGF0ZWQ6IGZ1bmN0aW9uIGNvbXBvbmVudFVwZGF0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSkgewogICAgaWYgKHZub2RlLnRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICAvLyBpbiBjYXNlIHRoZSBvcHRpb25zIHJlbmRlcmVkIGJ5IHYtZm9yIGhhdmUgY2hhbmdlZCwKICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHRoZSB2YWx1ZSBpcyBvdXQtb2Ytc3luYyB3aXRoIHRoZSByZW5kZXJlZCBvcHRpb25zLgogICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmcKICAgICAgLy8gb3B0aW9uIGluIHRoZSBET00uCiAgICAgIHZhciBwcmV2T3B0aW9ucyA9IGVsLl92T3B0aW9uczsKICAgICAgdmFyIGN1ck9wdGlvbnMgPSBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7CiAgICAgIGlmIChjdXJPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG8sIGkpIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHByZXZPcHRpb25zW2ldKTsgfSkpIHsKICAgICAgICAvLyB0cmlnZ2VyIGNoYW5nZSBldmVudCBpZgogICAgICAgIC8vIG5vIG1hdGNoaW5nIG9wdGlvbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlCiAgICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlCiAgICAgICAgICA/IGJpbmRpbmcudmFsdWUuc29tZShmdW5jdGlvbiAodikgeyByZXR1cm4gaGFzTm9NYXRjaGluZ09wdGlvbih2LCBjdXJPcHRpb25zKTsgfSkKICAgICAgICAgIDogYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSAmJiBoYXNOb01hdGNoaW5nT3B0aW9uKGJpbmRpbmcudmFsdWUsIGN1ck9wdGlvbnMpOwogICAgICAgIGlmIChuZWVkUmVzZXQpIHsKICAgICAgICAgIHRyaWdnZXIoZWwsICdjaGFuZ2UnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgpmdW5jdGlvbiBzZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0lFIHx8IGlzRWRnZSkgewogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIGFjdHVhbGx5U2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZtKTsKICAgIH0sIDApOwogIH0KfQoKZnVuY3Rpb24gYWN0dWFsbHlTZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgdmFyIHZhbHVlID0gYmluZGluZy52YWx1ZTsKICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlOwogIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICI8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw9XCIiICsgKGJpbmRpbmcuZXhwcmVzc2lvbikgKyAiXCI+ICIgKwogICAgICAiZXhwZWN0cyBhbiBBcnJheSB2YWx1ZSBmb3IgaXRzIGJpbmRpbmcsIGJ1dCBnb3QgIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSksCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciBzZWxlY3RlZCwgb3B0aW9uOwogIGZvciAodmFyIGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07CiAgICBpZiAoaXNNdWx0aXBsZSkgewogICAgICBzZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgZ2V0VmFsdWUob3B0aW9uKSkgPiAtMTsKICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHsKICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7CiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIHsKICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgICAgfQogICAgfQogIH0KICBpZiAoIWlzTXVsdGlwbGUpIHsKICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTsKICB9Cn0KCmZ1bmN0aW9uIGhhc05vTWF0Y2hpbmdPcHRpb24gKHZhbHVlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG9wdGlvbnMuZXZlcnkoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHZhbHVlKTsgfSkKfQoKZnVuY3Rpb24gZ2V0VmFsdWUgKG9wdGlvbikgewogIHJldHVybiAnX3ZhbHVlJyBpbiBvcHRpb24KICAgID8gb3B0aW9uLl92YWx1ZQogICAgOiBvcHRpb24udmFsdWUKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0IChlKSB7CiAgZS50YXJnZXQuY29tcG9zaW5nID0gdHJ1ZTsKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZCAoZSkgewogIC8vIHByZXZlbnQgdHJpZ2dlcmluZyBhbiBpbnB1dCBldmVudCBmb3Igbm8gcmVhc29uCiAgaWYgKCFlLnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuIH0KICBlLnRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTsKICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTsKfQoKZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHsKICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7CiAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7CiAgZWwuZGlzcGF0Y2hFdmVudChlKTsKfQoKLyogICovCgovLyByZWN1cnNpdmVseSBzZWFyY2ggZm9yIHBvc3NpYmxlIHRyYW5zaXRpb24gZGVmaW5lZCBpbnNpZGUgdGhlIGNvbXBvbmVudCByb290CmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7CiAgcmV0dXJuIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmICghdm5vZGUuZGF0YSB8fCAhdm5vZGUuZGF0YS50cmFuc2l0aW9uKQogICAgPyBsb2NhdGVOb2RlKHZub2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkKICAgIDogdm5vZGUKfQoKdmFyIHNob3cgPSB7CiAgYmluZDogZnVuY3Rpb24gYmluZCAoZWwsIHJlZiwgdm5vZGUpIHsKICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTsKCiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPQogICAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7CiAgICBpZiAodmFsdWUgJiYgdHJhbnNpdGlvbiQkMSkgewogICAgICB2bm9kZS5kYXRhLnNob3cgPSB0cnVlOwogICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkgewogICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gb3JpZ2luYWxEaXNwbGF5IDogJ25vbmUnOwogICAgfQogIH0sCgogIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkgewogICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlOwogICAgdmFyIG9sZFZhbHVlID0gcmVmLm9sZFZhbHVlOwoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKSB7IHJldHVybiB9CiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIGlmICh0cmFuc2l0aW9uJCQxKSB7CiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGVudGVyKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgOiAnbm9uZSc7CiAgICB9CiAgfSwKCiAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQgKAogICAgZWwsCiAgICBiaW5kaW5nLAogICAgdm5vZGUsCiAgICBvbGRWbm9kZSwKICAgIGlzRGVzdHJveQogICkgewogICAgaWYgKCFpc0Rlc3Ryb3kpIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheTsKICAgIH0KICB9Cn0KCnZhciBwbGF0Zm9ybURpcmVjdGl2ZXMgPSB7CiAgbW9kZWw6IGRpcmVjdGl2ZSwKICBzaG93OiBzaG93Cn0KCi8qICAqLwoKLy8gUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBhIHNpbmdsZSBlbGVtZW50L2NvbXBvbmVudC4KLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpCgp2YXIgdHJhbnNpdGlvblByb3BzID0gewogIG5hbWU6IFN0cmluZywKICBhcHBlYXI6IEJvb2xlYW4sCiAgY3NzOiBCb29sZWFuLAogIG1vZGU6IFN0cmluZywKICB0eXBlOiBTdHJpbmcsCiAgZW50ZXJDbGFzczogU3RyaW5nLAogIGxlYXZlQ2xhc3M6IFN0cmluZywKICBlbnRlclRvQ2xhc3M6IFN0cmluZywKICBsZWF2ZVRvQ2xhc3M6IFN0cmluZywKICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsCiAgbGVhdmVBY3RpdmVDbGFzczogU3RyaW5nLAogIGFwcGVhckNsYXNzOiBTdHJpbmcsCiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZywKICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsCiAgZHVyYXRpb246IFtOdW1iZXIsIFN0cmluZywgT2JqZWN0XQp9OwoKLy8gaW4gY2FzZSB0aGUgY2hpbGQgaXMgYWxzbyBhbiBhYnN0cmFjdCBjb21wb25lbnQsIGUuZy4gPGtlZXAtYWxpdmU+Ci8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkCmZ1bmN0aW9uIGdldFJlYWxDaGlsZCAodm5vZGUpIHsKICB2YXIgY29tcE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHJldHVybiBnZXRSZWFsQ2hpbGQoZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChjb21wT3B0aW9ucy5jaGlsZHJlbikpCiAgfSBlbHNlIHsKICAgIHJldHVybiB2bm9kZQogIH0KfQoKZnVuY3Rpb24gZXh0cmFjdFRyYW5zaXRpb25EYXRhIChjb21wKSB7CiAgdmFyIGRhdGEgPSB7fTsKICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7CiAgLy8gcHJvcHMKICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5wcm9wc0RhdGEpIHsKICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTsKICB9CiAgLy8gZXZlbnRzLgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kcwogIHZhciBsaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgZm9yICh2YXIga2V5JDEgaW4gbGlzdGVuZXJzKSB7CiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdOwogIH0KICByZXR1cm4gZGF0YQp9CgpmdW5jdGlvbiBwbGFjZWhvbGRlciAoaCwgcmF3Q2hpbGQpIHsKICBpZiAoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHJhd0NoaWxkLnRhZykpIHsKICAgIHJldHVybiBoKCdrZWVwLWFsaXZlJywgewogICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEKICAgIH0pCiAgfQp9CgpmdW5jdGlvbiBoYXNQYXJlbnRUcmFuc2l0aW9uICh2bm9kZSkgewogIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7CiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBpc1NhbWVDaGlsZCAoY2hpbGQsIG9sZENoaWxkKSB7CiAgcmV0dXJuIG9sZENoaWxkLmtleSA9PT0gY2hpbGQua2V5ICYmIG9sZENoaWxkLnRhZyA9PT0gY2hpbGQudGFnCn0KCnZhciBUcmFuc2l0aW9uID0gewogIG5hbWU6ICd0cmFuc2l0aW9uJywKICBwcm9wczogdHJhbnNpdGlvblByb3BzLAogIGFic3RyYWN0OiB0cnVlLAoKICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdDsKICAgIGlmICghY2hpbGRyZW4pIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcykKICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH0pOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigKICAgICAgICAnPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudC4gVXNlICcgKwogICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsCiAgICAgICAgdGhpcy4kcGFyZW50CiAgICAgICk7CiAgICB9CgogICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7CgogICAgLy8gd2FybiBpbnZhbGlkIG1vZGUKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJwogICAgKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLAogICAgICAgIHRoaXMuJHBhcmVudAogICAgICApOwogICAgfQoKICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdOwoKICAgIC8vIGlmIHRoaXMgaXMgYSBjb21wb25lbnQgcm9vdCBub2RlIGFuZCB0aGUgY29tcG9uZW50J3MKICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLgogICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7CiAgICAgIHJldHVybiByYXdDaGlsZAogICAgfQoKICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gZGF0YSB0byBjaGlsZAogICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZQogICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCFjaGlsZCkgewogICAgICByZXR1cm4gcmF3Q2hpbGQKICAgIH0KCiAgICBpZiAodGhpcy5fbGVhdmluZykgewogICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICB9CgogICAgLy8gZW5zdXJlIGEga2V5IHRoYXQgaXMgdW5pcXVlIHRvIHRoZSB2bm9kZSB0eXBlIGFuZCB0byB0aGlzIHRyYW5zaXRpb24KICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXMKICAgIC8vIGR1cmluZyBlbnRlcmluZy4KICAgIHZhciBpZCA9ICJfX3RyYW5zaXRpb24tIiArICh0aGlzLl91aWQpICsgIi0iOwogICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGwKICAgICAgPyBjaGlsZC5pc0NvbW1lbnQKICAgICAgICA/IGlkICsgJ2NvbW1lbnQnCiAgICAgICAgOiBpZCArIGNoaWxkLnRhZwogICAgICA6IGlzUHJpbWl0aXZlKGNoaWxkLmtleSkKICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KQogICAgICAgIDogY2hpbGQua2V5OwoKICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7CiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTsKICAgIHZhciBvbGRDaGlsZCA9IGdldFJlYWxDaGlsZChvbGRSYXdDaGlsZCk7CgogICAgLy8gbWFyayB2LXNob3cKICAgIC8vIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gbW9kdWxlIGNhbiBoYW5kIG92ZXIgdGhlIGNvbnRyb2wgdG8gdGhlIGRpcmVjdGl2ZQogICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5uYW1lID09PSAnc2hvdyc7IH0pKSB7CiAgICAgIGNoaWxkLmRhdGEuc2hvdyA9IHRydWU7CiAgICB9CgogICAgaWYgKAogICAgICBvbGRDaGlsZCAmJgogICAgICBvbGRDaGlsZC5kYXRhICYmCiAgICAgICFpc1NhbWVDaGlsZChjaGlsZCwgb2xkQ2hpbGQpICYmCiAgICAgICFpc0FzeW5jUGxhY2Vob2xkZXIob2xkQ2hpbGQpICYmCiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlCiAgICAgICEob2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UgJiYgb2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkKICAgICkgewogICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmUKICAgICAgLy8gaW1wb3J0YW50IGZvciBkeW5hbWljIHRyYW5zaXRpb25zIQogICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkLmRhdGEudHJhbnNpdGlvbiA9IGV4dGVuZCh7fSwgZGF0YSk7CiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGUKICAgICAgaWYgKG1vZGUgPT09ICdvdXQtaW4nKSB7CiAgICAgICAgLy8gcmV0dXJuIHBsYWNlaG9sZGVyIG5vZGUgYW5kIHF1ZXVlIHVwZGF0ZSB3aGVuIGxlYXZlIGZpbmlzaGVzCiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2FmdGVyTGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aGlzJDEuX2xlYXZpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHsKICAgICAgICBpZiAoaXNBc3luY1BsYWNlaG9sZGVyKGNoaWxkKSkgewogICAgICAgICAgcmV0dXJuIG9sZFJhd0NoaWxkCiAgICAgICAgfQogICAgICAgIHZhciBkZWxheWVkTGVhdmU7CiAgICAgICAgdmFyIHBlcmZvcm1MZWF2ZSA9IGZ1bmN0aW9uICgpIHsgZGVsYXllZExlYXZlKCk7IH07CiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpOwogICAgICAgIG1lcmdlVk5vZGVIb29rKGRhdGEsICdlbnRlckNhbmNlbGxlZCcsIHBlcmZvcm1MZWF2ZSk7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2RlbGF5TGVhdmUnLCBmdW5jdGlvbiAobGVhdmUpIHsgZGVsYXllZExlYXZlID0gbGVhdmU7IH0pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJhd0NoaWxkCiAgfQp9CgovKiAgKi8KCi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgbGlzdCBpdGVtcy4KLy8gc3VwcG9ydHMgbW92ZSB0cmFuc2l0aW9ucyB1c2luZyB0aGUgRkxJUCB0ZWNobmlxdWUuCgovLyBCZWNhdXNlIHRoZSB2ZG9tJ3MgY2hpbGRyZW4gdXBkYXRlIGFsZ29yaXRobSBpcyAidW5zdGFibGUiIC0gaS5lLgovLyBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcmVtb3ZlZCBlbGVtZW50cywKLy8gd2UgZm9yY2UgdHJhbnNpdGlvbi1ncm91cCB0byB1cGRhdGUgaXRzIGNoaWxkcmVuIGludG8gdHdvIHBhc3NlczoKLy8gaW4gdGhlIGZpcnN0IHBhc3MsIHdlIHJlbW92ZSBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQsCi8vIHRyaWdnZXJpbmcgdGhlaXIgbGVhdmluZyB0cmFuc2l0aW9uOyBpbiB0aGUgc2Vjb25kIHBhc3MsIHdlIGluc2VydC9tb3ZlCi8vIGludG8gdGhlIGZpbmFsIGRlc2lyZWQgc3RhdGUuIFRoaXMgd2F5IGluIHRoZSBzZWNvbmQgcGFzcyByZW1vdmVkCi8vIG5vZGVzIHdpbGwgcmVtYWluIHdoZXJlIHRoZXkgc2hvdWxkIGJlLgoKdmFyIHByb3BzID0gZXh0ZW5kKHsKICB0YWc6IFN0cmluZywKICBtb3ZlQ2xhc3M6IFN0cmluZwp9LCB0cmFuc2l0aW9uUHJvcHMpOwoKZGVsZXRlIHByb3BzLm1vZGU7Cgp2YXIgVHJhbnNpdGlvbkdyb3VwID0gewogIHByb3BzOiBwcm9wcywKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHsKICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7CiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdOwogICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTsKICAgICAgaWYgKGMudGFnKSB7CiAgICAgICAgaWYgKGMua2V5ICE9IG51bGwgJiYgU3RyaW5nKGMua2V5KS5pbmRleE9mKCdfX3ZsaXN0JykgIT09IDApIHsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7CiAgICAgICAgICBtYXBbYy5rZXldID0gYwogICAgICAgICAgOyhjLmRhdGEgfHwgKGMuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25EYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgb3B0cyA9IGMuY29tcG9uZW50T3B0aW9uczsKICAgICAgICAgIHZhciBuYW1lID0gb3B0cyA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnIHx8ICcnKSA6IGMudGFnOwogICAgICAgICAgd2FybigoIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8IiArIG5hbWUgKyAiPiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJldkNoaWxkcmVuKSB7CiAgICAgIHZhciBrZXB0ID0gW107CiAgICAgIHZhciByZW1vdmVkID0gW107CiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7CiAgICAgICAgdmFyIGMkMSA9IHByZXZDaGlsZHJlbltpJDFdOwogICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTsKICAgICAgICBjJDEuZGF0YS5wb3MgPSBjJDEuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmIChtYXBbYyQxLmtleV0pIHsKICAgICAgICAgIGtlcHQucHVzaChjJDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZW1vdmVkLnB1c2goYyQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5rZXB0ID0gaCh0YWcsIG51bGwsIGtlcHQpOwogICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkOwogICAgfQoKICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pCiAgfSwKCiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkgewogICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzcwogICAgdGhpcy5fX3BhdGNoX18oCiAgICAgIHRoaXMuX3Zub2RlLAogICAgICB0aGlzLmtlcHQsCiAgICAgIGZhbHNlLCAvLyBoeWRyYXRpbmcKICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpCiAgICApOwogICAgdGhpcy5fdm5vZGUgPSB0aGlzLmtlcHQ7CiAgfSwKCiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCAoKSB7CiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjsKICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7CiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5oYXNNb3ZlKGNoaWxkcmVuWzBdLmVsbSwgbW92ZUNsYXNzKSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3ZSBkaXZpZGUgdGhlIHdvcmsgaW50byB0aHJlZSBsb29wcyB0byBhdm9pZCBtaXhpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMKICAgIC8vIGluIGVhY2ggaXRlcmF0aW9uIC0gd2hpY2ggaGVscHMgcHJldmVudCBsYXlvdXQgdGhyYXNoaW5nLgogICAgY2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7CiAgICBjaGlsZHJlbi5mb3JFYWNoKHJlY29yZFBvc2l0aW9uKTsKICAgIGNoaWxkcmVuLmZvckVhY2goYXBwbHlUcmFuc2xhdGlvbik7CgogICAgLy8gZm9yY2UgcmVmbG93IHRvIHB1dCBldmVyeXRoaW5nIGluIHBvc2l0aW9uCiAgICAvLyBhc3NpZ24gdG8gdGhpcyB0byBhdm9pZCBiZWluZyByZW1vdmVkIGluIHRyZWUtc2hha2luZwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICB0aGlzLl9yZWZsb3cgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDsKCiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmRhdGEubW92ZWQpIHsKICAgICAgICB2YXIgZWwgPSBjLmVsbTsKICAgICAgICB2YXIgcyA9IGVsLnN0eWxlOwogICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTsKICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJzsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmRFdmVudCwgZWwuX21vdmVDYiA9IGZ1bmN0aW9uIGNiIChlKSB7CiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7CiAgICAgICAgICAgIGVsLl9tb3ZlQ2IgPSBudWxsOwogICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0sCgogIG1ldGhvZHM6IHsKICAgIGhhc01vdmU6IGZ1bmN0aW9uIGhhc01vdmUgKGVsLCBtb3ZlQ2xhc3MpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikgewogICAgICAgIHJldHVybiBmYWxzZQogICAgICB9CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAodGhpcy5faGFzTW92ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNNb3ZlCiAgICAgIH0KICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBtb3ZlIGNsYXNzIGFwcGxpZWQgaGFzCiAgICAgIC8vIENTUyB0cmFuc2l0aW9ucy4gU2luY2UgdGhlIGVsZW1lbnQgbWF5IGJlIGluc2lkZSBhbiBlbnRlcmluZwogICAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlCiAgICAgIC8vIGFsbCBvdGhlciB0cmFuc2l0aW9uIGNsYXNzZXMgYXBwbGllZCB0byBlbnN1cmUgb25seSB0aGUgbW92ZSBjbGFzcwogICAgICAvLyBpcyBhcHBsaWVkLgogICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTsKICAgICAgaWYgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcykgewogICAgICAgIGVsLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHsgcmVtb3ZlQ2xhc3MoY2xvbmUsIGNscyk7IH0pOwogICAgICB9CiAgICAgIGFkZENsYXNzKGNsb25lLCBtb3ZlQ2xhc3MpOwogICAgICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB0aGlzLiRlbC5hcHBlbmRDaGlsZChjbG9uZSk7CiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpOwogICAgICB0aGlzLiRlbC5yZW1vdmVDaGlsZChjbG9uZSk7CiAgICAgIHJldHVybiAodGhpcy5faGFzTW92ZSA9IGluZm8uaGFzVHJhbnNmb3JtKQogICAgfQogIH0KfQoKZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMgKGMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX21vdmVDYikgewogICAgYy5lbG0uX21vdmVDYigpOwogIH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX2VudGVyQ2IpIHsKICAgIGMuZWxtLl9lbnRlckNiKCk7CiAgfQp9CgpmdW5jdGlvbiByZWNvcmRQb3NpdGlvbiAoYykgewogIGMuZGF0YS5uZXdQb3MgPSBjLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKfQoKZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbiAoYykgewogIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zOwogIHZhciBuZXdQb3MgPSBjLmRhdGEubmV3UG9zOwogIHZhciBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7CiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7CiAgaWYgKGR4IHx8IGR5KSB7CiAgICBjLmRhdGEubW92ZWQgPSB0cnVlOwogICAgdmFyIHMgPSBjLmVsbS5zdHlsZTsKICAgIHMudHJhbnNmb3JtID0gcy5XZWJraXRUcmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBkeCArICJweCwiICsgZHkgKyAicHgpIjsKICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJzsKICB9Cn0KCnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7CiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbiwKICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cAp9CgovKiAgKi8KCi8vIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMgdXRpbHMKVnVlLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyID0gaXNSZXNlcnZlZEF0dHI7ClZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZ2V0VGFnTmFtZXNwYWNlOwpWdWUuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50OwoKLy8gaW5zdGFsbCBwbGF0Zm9ybSBydW50aW1lIGRpcmVjdGl2ZXMgJiBjb21wb25lbnRzCmV4dGVuZChWdWUub3B0aW9ucy5kaXJlY3RpdmVzLCBwbGF0Zm9ybURpcmVjdGl2ZXMpOwpleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgcGxhdGZvcm1Db21wb25lbnRzKTsKCi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb24KVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gPSBpbkJyb3dzZXIgPyBwYXRjaCA6IG5vb3A7CgovLyBwdWJsaWMgbW91bnQgbWV0aG9kClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDsKICByZXR1cm4gbW91bnRDb21wb25lbnQodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8vIGRldnRvb2xzIGdsb2JhbCBob29rCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmlmIChpbkJyb3dzZXIpIHsKICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIGlmIChjb25maWcuZGV2dG9vbHMpIHsKICAgICAgaWYgKGRldnRvb2xzKSB7CiAgICAgICAgZGV2dG9vbHMuZW1pdCgnaW5pdCcsIFZ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgICAgaXNDaHJvbWUKICAgICAgKSB7CiAgICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oCiAgICAgICAgICAnRG93bmxvYWQgdGhlIFZ1ZSBEZXZ0b29scyBleHRlbnNpb24gZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6XG4nICsKICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWRldnRvb2xzJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgIGNvbmZpZy5wcm9kdWN0aW9uVGlwICE9PSBmYWxzZSAmJgogICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcKICAgICkgewogICAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/ICdpbmZvJyA6ICdsb2cnXSgKICAgICAgICAiWW91IGFyZSBydW5uaW5nIFZ1ZSBpbiBkZXZlbG9wbWVudCBtb2RlLlxuIiArCiAgICAgICAgIk1ha2Ugc3VyZSB0byB0dXJuIG9uIHByb2R1Y3Rpb24gbW9kZSB3aGVuIGRlcGxveWluZyBmb3IgcHJvZHVjdGlvbi5cbiIgKwogICAgICAgICJTZWUgbW9yZSB0aXBzIGF0IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2RlcGxveW1lbnQuaHRtbCIKICAgICAgKTsKICAgIH0KICB9LCAwKTsKfQoKLyogICovCgp2YXIgZGVmYXVsdFRhZ1JFID0gL1x7XHsoKD86LnxcbikrPylcfVx9L2c7CnZhciByZWdleEVzY2FwZVJFID0gL1stLiorP14ke30oKXxbXF1cL1xcXS9nOwoKdmFyIGJ1aWxkUmVnZXggPSBjYWNoZWQoZnVuY3Rpb24gKGRlbGltaXRlcnMpIHsKICB2YXIgb3BlbiA9IGRlbGltaXRlcnNbMF0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHZhciBjbG9zZSA9IGRlbGltaXRlcnNbMV0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHJldHVybiBuZXcgUmVnRXhwKG9wZW4gKyAnKCg/Oi58XFxuKSs/KScgKyBjbG9zZSwgJ2cnKQp9KTsKCgoKZnVuY3Rpb24gcGFyc2VUZXh0ICgKICB0ZXh0LAogIGRlbGltaXRlcnMKKSB7CiAgdmFyIHRhZ1JFID0gZGVsaW1pdGVycyA/IGJ1aWxkUmVnZXgoZGVsaW1pdGVycykgOiBkZWZhdWx0VGFnUkU7CiAgaWYgKCF0YWdSRS50ZXN0KHRleHQpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIHRva2VucyA9IFtdOwogIHZhciByYXdUb2tlbnMgPSBbXTsKICB2YXIgbGFzdEluZGV4ID0gdGFnUkUubGFzdEluZGV4ID0gMDsKICB2YXIgbWF0Y2gsIGluZGV4LCB0b2tlblZhbHVlOwogIHdoaWxlICgobWF0Y2ggPSB0YWdSRS5leGVjKHRleHQpKSkgewogICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgIC8vIHB1c2ggdGV4dCB0b2tlbgogICAgaWYgKGluZGV4ID4gbGFzdEluZGV4KSB7CiAgICAgIHJhd1Rva2Vucy5wdXNoKHRva2VuVmFsdWUgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTsKICAgICAgdG9rZW5zLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW5WYWx1ZSkpOwogICAgfQogICAgLy8gdGFnIHRva2VuCiAgICB2YXIgZXhwID0gcGFyc2VGaWx0ZXJzKG1hdGNoWzFdLnRyaW0oKSk7CiAgICB0b2tlbnMucHVzaCgoIl9zKCIgKyBleHAgKyAiKSIpKTsKICAgIHJhd1Rva2Vucy5wdXNoKHsgJ0BiaW5kaW5nJzogZXhwIH0pOwogICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CiAgfQogIGlmIChsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgcmF3VG9rZW5zLnB1c2godG9rZW5WYWx1ZSA9IHRleHQuc2xpY2UobGFzdEluZGV4KSk7CiAgICB0b2tlbnMucHVzaChKU09OLnN0cmluZ2lmeSh0b2tlblZhbHVlKSk7CiAgfQogIHJldHVybiB7CiAgICBleHByZXNzaW9uOiB0b2tlbnMuam9pbignKycpLAogICAgdG9rZW5zOiByYXdUb2tlbnMKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gdHJhbnNmb3JtTm9kZSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljQ2xhc3MgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnY2xhc3MnKTsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHN0YXRpY0NsYXNzKSB7CiAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY0NsYXNzLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgaWYgKHJlcykgewogICAgICB3YXJuKAogICAgICAgICJjbGFzcz1cIiIgKyBzdGF0aWNDbGFzcyArICJcIjogIiArCiAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArCiAgICAgICAgJ1VzZSB2LWJpbmQgb3IgdGhlIGNvbG9uIHNob3J0aGFuZCBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgJyArCiAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBjbGFzcz0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpjbGFzcz0idmFsIj4uJwogICAgICApOwogICAgfQogIH0KICBpZiAoc3RhdGljQ2xhc3MpIHsKICAgIGVsLnN0YXRpY0NsYXNzID0gSlNPTi5zdHJpbmdpZnkoc3RhdGljQ2xhc3MpOwogIH0KICB2YXIgY2xhc3NCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdjbGFzcycsIGZhbHNlIC8qIGdldFN0YXRpYyAqLyk7CiAgaWYgKGNsYXNzQmluZGluZykgewogICAgZWwuY2xhc3NCaW5kaW5nID0gY2xhc3NCaW5kaW5nOwogIH0KfQoKZnVuY3Rpb24gZ2VuRGF0YSAoZWwpIHsKICB2YXIgZGF0YSA9ICcnOwogIGlmIChlbC5zdGF0aWNDbGFzcykgewogICAgZGF0YSArPSAic3RhdGljQ2xhc3M6IiArIChlbC5zdGF0aWNDbGFzcykgKyAiLCI7CiAgfQogIGlmIChlbC5jbGFzc0JpbmRpbmcpIHsKICAgIGRhdGEgKz0gImNsYXNzOiIgKyAoZWwuY2xhc3NCaW5kaW5nKSArICIsIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIGtsYXNzJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNDbGFzcyddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUsCiAgZ2VuRGF0YTogZ2VuRGF0YQp9CgovKiAgKi8KCmZ1bmN0aW9uIHRyYW5zZm9ybU5vZGUkMSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljU3R5bGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc3R5bGUnKTsKICBpZiAoc3RhdGljU3R5bGUpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY1N0eWxlLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgICBpZiAocmVzKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJzdHlsZT1cIiIgKyBzdGF0aWNTdHlsZSArICJcIjogIiArCiAgICAgICAgICAnSW50ZXJwb2xhdGlvbiBpbnNpZGUgYXR0cmlidXRlcyBoYXMgYmVlbiByZW1vdmVkLiAnICsKICAgICAgICAgICdVc2Ugdi1iaW5kIG9yIHRoZSBjb2xvbiBzaG9ydGhhbmQgaW5zdGVhZC4gRm9yIGV4YW1wbGUsICcgKwogICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBzdHlsZT0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpzdHlsZT0idmFsIj4uJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGVsLnN0YXRpY1N0eWxlID0gSlNPTi5zdHJpbmdpZnkocGFyc2VTdHlsZVRleHQoc3RhdGljU3R5bGUpKTsKICB9CgogIHZhciBzdHlsZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3N0eWxlJywgZmFsc2UgLyogZ2V0U3RhdGljICovKTsKICBpZiAoc3R5bGVCaW5kaW5nKSB7CiAgICBlbC5zdHlsZUJpbmRpbmcgPSBzdHlsZUJpbmRpbmc7CiAgfQp9CgpmdW5jdGlvbiBnZW5EYXRhJDEgKGVsKSB7CiAgdmFyIGRhdGEgPSAnJzsKICBpZiAoZWwuc3RhdGljU3R5bGUpIHsKICAgIGRhdGEgKz0gInN0YXRpY1N0eWxlOiIgKyAoZWwuc3RhdGljU3R5bGUpICsgIiwiOwogIH0KICBpZiAoZWwuc3R5bGVCaW5kaW5nKSB7CiAgICBkYXRhICs9ICJzdHlsZTooIiArIChlbC5zdHlsZUJpbmRpbmcpICsgIiksIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIHN0eWxlJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNTdHlsZSddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUkMSwKICBnZW5EYXRhOiBnZW5EYXRhJDEKfQoKLyogICovCgp2YXIgZGVjb2RlcjsKCnZhciBoZSA9IHsKICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZSAoaHRtbCkgewogICAgZGVjb2RlciA9IGRlY29kZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkZWNvZGVyLmlubmVySFRNTCA9IGh0bWw7CiAgICByZXR1cm4gZGVjb2Rlci50ZXh0Q29udGVudAogIH0KfQoKLyogICovCgp2YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoCiAgJ2FyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLCcgKwogICdsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicKKTsKCi8vIEVsZW1lbnRzIHRoYXQgeW91IGNhbiwgaW50ZW50aW9uYWxseSwgbGVhdmUgb3BlbgovLyAoYW5kIHdoaWNoIGNsb3NlIHRoZW1zZWx2ZXMpCnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcCgKICAnY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZScKKTsKCi8vIEhUTUw1IHRhZ3MgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sI2VsZW1lbnRzLTMKLy8gUGhyYXNpbmcgQ29udGVudCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNwaHJhc2luZy1jb250ZW50CnZhciBpc05vblBocmFzaW5nVGFnID0gbWFrZU1hcCgKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLCcgKwogICdkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sJyArCiAgJ2gxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLCcgKwogICdvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsJyArCiAgJ3RpdGxlLHRyLHRyYWNrJwopOwoKLyoqCiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGl0J3MgbW9zdGx5IHZlbmRvciBjb2RlLgogKi8KCi8qIQogKiBIVE1MIFBhcnNlciBCeSBKb2huIFJlc2lnIChlam9obi5vcmcpCiAqIE1vZGlmaWVkIGJ5IEp1cml5ICJrYW5nYXgiIFpheXRzZXYKICogT3JpZ2luYWwgY29kZSBieSBFcmlrIEFydmlkc3NvbiwgTW96aWxsYSBQdWJsaWMgTGljZW5zZQogKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qcwogKi8KCi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlcwp2YXIgYXR0cmlidXRlID0gL15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vOwovLyBjb3VsZCB1c2UgaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhtbC1uYW1lcy0xOTk5MDExNC8jTlQtUU5hbWUKLy8gYnV0IGZvciBWdWUgdGVtcGxhdGVzIHdlIGNhbiBlbmZvcmNlIGEgc2ltcGxlIGNoYXJzZXQKdmFyIG5jbmFtZSA9ICdbYS16QS1aX11bXFx3XFwtXFwuXSonOwp2YXIgcW5hbWVDYXB0dXJlID0gIigoPzoiICsgbmNuYW1lICsgIlxcOik/IiArIG5jbmFtZSArICIpIjsKdmFyIHN0YXJ0VGFnT3BlbiA9IG5ldyBSZWdFeHAoKCJePCIgKyBxbmFtZUNhcHR1cmUpKTsKdmFyIHN0YXJ0VGFnQ2xvc2UgPSAvXlxzKihcLz8pPi87CnZhciBlbmRUYWcgPSBuZXcgUmVnRXhwKCgiXjxcXC8iICsgcW5hbWVDYXB0dXJlICsgIltePl0qPiIpKTsKdmFyIGRvY3R5cGUgPSAvXjwhRE9DVFlQRSBbXj5dKz4vaTsKLy8gIzcyOTg6IGVzY2FwZSAtIHRvIGF2b2lkIGJlaW5nIHBhc2VkIGFzIEhUTUwgY29tbWVudCB3aGVuIGlubGluZWQgaW4gcGFnZQp2YXIgY29tbWVudCA9IC9ePCFcLS0vOwp2YXIgY29uZGl0aW9uYWxDb21tZW50ID0gL148IVxbLzsKCnZhciBJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOID0gZmFsc2U7Cid4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobSwgZykgewogIElTX1JFR0VYX0NBUFRVUklOR19CUk9LRU4gPSBnID09PSAnJzsKfSk7CgovLyBTcGVjaWFsIEVsZW1lbnRzIChjYW4gY29udGFpbiBhbnl0aGluZykKdmFyIGlzUGxhaW5UZXh0RWxlbWVudCA9IG1ha2VNYXAoJ3NjcmlwdCxzdHlsZSx0ZXh0YXJlYScsIHRydWUpOwp2YXIgcmVDYWNoZSA9IHt9OwoKdmFyIGRlY29kaW5nTWFwID0gewogICcmbHQ7JzogJzwnLAogICcmZ3Q7JzogJz4nLAogICcmcXVvdDsnOiAnIicsCiAgJyZhbXA7JzogJyYnLAogICcmIzEwOyc6ICdcbicsCiAgJyYjOTsnOiAnXHQnCn07CnZhciBlbmNvZGVkQXR0ciA9IC8mKD86bHR8Z3R8cXVvdHxhbXApOy9nOwp2YXIgZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgPSAvJig/Omx0fGd0fHF1b3R8YW1wfCMxMHwjOSk7L2c7CgovLyAjNTk5Mgp2YXIgaXNJZ25vcmVOZXdsaW5lVGFnID0gbWFrZU1hcCgncHJlLHRleHRhcmVhJywgdHJ1ZSk7CnZhciBzaG91bGRJZ25vcmVGaXJzdE5ld2xpbmUgPSBmdW5jdGlvbiAodGFnLCBodG1sKSB7IHJldHVybiB0YWcgJiYgaXNJZ25vcmVOZXdsaW5lVGFnKHRhZykgJiYgaHRtbFswXSA9PT0gJ1xuJzsgfTsKCmZ1bmN0aW9uIGRlY29kZUF0dHIgKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykgewogIHZhciByZSA9IHNob3VsZERlY29kZU5ld2xpbmVzID8gZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgOiBlbmNvZGVkQXR0cjsKICByZXR1cm4gdmFsdWUucmVwbGFjZShyZSwgZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBkZWNvZGluZ01hcFttYXRjaF07IH0pCn0KCmZ1bmN0aW9uIHBhcnNlSFRNTCAoaHRtbCwgb3B0aW9ucykgewogIHZhciBzdGFjayA9IFtdOwogIHZhciBleHBlY3RIVE1MID0gb3B0aW9ucy5leHBlY3RIVE1MOwogIHZhciBpc1VuYXJ5VGFnJCQxID0gb3B0aW9ucy5pc1VuYXJ5VGFnIHx8IG5vOwogIHZhciBjYW5CZUxlZnRPcGVuVGFnJCQxID0gb3B0aW9ucy5jYW5CZUxlZnRPcGVuVGFnIHx8IG5vOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxhc3QsIGxhc3RUYWc7CiAgd2hpbGUgKGh0bWwpIHsKICAgIGxhc3QgPSBodG1sOwogICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBpbiBhIHBsYWludGV4dCBjb250ZW50IGVsZW1lbnQgbGlrZSBzY3JpcHQvc3R5bGUKICAgIGlmICghbGFzdFRhZyB8fCAhaXNQbGFpblRleHRFbGVtZW50KGxhc3RUYWcpKSB7CiAgICAgIHZhciB0ZXh0RW5kID0gaHRtbC5pbmRleE9mKCc8Jyk7CiAgICAgIGlmICh0ZXh0RW5kID09PSAwKSB7CiAgICAgICAgLy8gQ29tbWVudDoKICAgICAgICBpZiAoY29tbWVudC50ZXN0KGh0bWwpKSB7CiAgICAgICAgICB2YXIgY29tbWVudEVuZCA9IGh0bWwuaW5kZXhPZignLS0+Jyk7CgogICAgICAgICAgaWYgKGNvbW1lbnRFbmQgPj0gMCkgewogICAgICAgICAgICBpZiAob3B0aW9ucy5zaG91bGRLZWVwQ29tbWVudCkgewogICAgICAgICAgICAgIG9wdGlvbnMuY29tbWVudChodG1sLnN1YnN0cmluZyg0LCBjb21tZW50RW5kKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZShjb21tZW50RW5kICsgMyk7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmRpdGlvbmFsX2NvbW1lbnQjRG93bmxldmVsLXJldmVhbGVkX2NvbmRpdGlvbmFsX2NvbW1lbnQKICAgICAgICBpZiAoY29uZGl0aW9uYWxDb21tZW50LnRlc3QoaHRtbCkpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25hbEVuZCA9IGh0bWwuaW5kZXhPZignXT4nKTsKCiAgICAgICAgICBpZiAoY29uZGl0aW9uYWxFbmQgPj0gMCkgewogICAgICAgICAgICBhZHZhbmNlKGNvbmRpdGlvbmFsRW5kICsgMik7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEb2N0eXBlOgogICAgICAgIHZhciBkb2N0eXBlTWF0Y2ggPSBodG1sLm1hdGNoKGRvY3R5cGUpOwogICAgICAgIGlmIChkb2N0eXBlTWF0Y2gpIHsKICAgICAgICAgIGFkdmFuY2UoZG9jdHlwZU1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgLy8gRW5kIHRhZzoKICAgICAgICB2YXIgZW5kVGFnTWF0Y2ggPSBodG1sLm1hdGNoKGVuZFRhZyk7CiAgICAgICAgaWYgKGVuZFRhZ01hdGNoKSB7CiAgICAgICAgICB2YXIgY3VySW5kZXggPSBpbmRleDsKICAgICAgICAgIGFkdmFuY2UoZW5kVGFnTWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgIHBhcnNlRW5kVGFnKGVuZFRhZ01hdGNoWzFdLCBjdXJJbmRleCwgaW5kZXgpOwogICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIC8vIFN0YXJ0IHRhZzoKICAgICAgICB2YXIgc3RhcnRUYWdNYXRjaCA9IHBhcnNlU3RhcnRUYWcoKTsKICAgICAgICBpZiAoc3RhcnRUYWdNYXRjaCkgewogICAgICAgICAgaGFuZGxlU3RhcnRUYWcoc3RhcnRUYWdNYXRjaCk7CiAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKGxhc3RUYWcsIGh0bWwpKSB7CiAgICAgICAgICAgIGFkdmFuY2UoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHRleHQgPSAodm9pZCAwKSwgcmVzdCA9ICh2b2lkIDApLCBuZXh0ID0gKHZvaWQgMCk7CiAgICAgIGlmICh0ZXh0RW5kID49IDApIHsKICAgICAgICByZXN0ID0gaHRtbC5zbGljZSh0ZXh0RW5kKTsKICAgICAgICB3aGlsZSAoCiAgICAgICAgICAhZW5kVGFnLnRlc3QocmVzdCkgJiYKICAgICAgICAgICFzdGFydFRhZ09wZW4udGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbW1lbnQudGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbmRpdGlvbmFsQ29tbWVudC50ZXN0KHJlc3QpCiAgICAgICAgKSB7CiAgICAgICAgICAvLyA8IGluIHBsYWluIHRleHQsIGJlIGZvcmdpdmluZyBhbmQgdHJlYXQgaXQgYXMgdGV4dAogICAgICAgICAgbmV4dCA9IHJlc3QuaW5kZXhPZignPCcsIDEpOwogICAgICAgICAgaWYgKG5leHQgPCAwKSB7IGJyZWFrIH0KICAgICAgICAgIHRleHRFbmQgKz0gbmV4dDsKICAgICAgICAgIHJlc3QgPSBodG1sLnNsaWNlKHRleHRFbmQpOwogICAgICAgIH0KICAgICAgICB0ZXh0ID0gaHRtbC5zdWJzdHJpbmcoMCwgdGV4dEVuZCk7CiAgICAgICAgYWR2YW5jZSh0ZXh0RW5kKTsKICAgICAgfQoKICAgICAgaWYgKHRleHRFbmQgPCAwKSB7CiAgICAgICAgdGV4dCA9IGh0bWw7CiAgICAgICAgaHRtbCA9ICcnOwogICAgICB9CgogICAgICBpZiAob3B0aW9ucy5jaGFycyAmJiB0ZXh0KSB7CiAgICAgICAgb3B0aW9ucy5jaGFycyh0ZXh0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGVuZFRhZ0xlbmd0aCA9IDA7CiAgICAgIHZhciBzdGFja2VkVGFnID0gbGFzdFRhZy50b0xvd2VyQ2FzZSgpOwogICAgICB2YXIgcmVTdGFja2VkVGFnID0gcmVDYWNoZVtzdGFja2VkVGFnXSB8fCAocmVDYWNoZVtzdGFja2VkVGFnXSA9IG5ldyBSZWdFeHAoJyhbXFxzXFxTXSo/KSg8LycgKyBzdGFja2VkVGFnICsgJ1tePl0qPiknLCAnaScpKTsKICAgICAgdmFyIHJlc3QkMSA9IGh0bWwucmVwbGFjZShyZVN0YWNrZWRUYWcsIGZ1bmN0aW9uIChhbGwsIHRleHQsIGVuZFRhZykgewogICAgICAgIGVuZFRhZ0xlbmd0aCA9IGVuZFRhZy5sZW5ndGg7CiAgICAgICAgaWYgKCFpc1BsYWluVGV4dEVsZW1lbnQoc3RhY2tlZFRhZykgJiYgc3RhY2tlZFRhZyAhPT0gJ25vc2NyaXB0JykgewogICAgICAgICAgdGV4dCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCAnJDEnKSAvLyAjNzI5OAogICAgICAgICAgICAucmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csICckMScpOwogICAgICAgIH0KICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKHN0YWNrZWRUYWcsIHRleHQpKSB7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnMpIHsKICAgICAgICAgIG9wdGlvbnMuY2hhcnModGV4dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJwogICAgICB9KTsKICAgICAgaW5kZXggKz0gaHRtbC5sZW5ndGggLSByZXN0JDEubGVuZ3RoOwogICAgICBodG1sID0gcmVzdCQxOwogICAgICBwYXJzZUVuZFRhZyhzdGFja2VkVGFnLCBpbmRleCAtIGVuZFRhZ0xlbmd0aCwgaW5kZXgpOwogICAgfQoKICAgIGlmIChodG1sID09PSBsYXN0KSB7CiAgICAgIG9wdGlvbnMuY2hhcnMgJiYgb3B0aW9ucy5jaGFycyhodG1sKTsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiAhc3RhY2subGVuZ3RoICYmIG9wdGlvbnMud2FybikgewogICAgICAgIG9wdGlvbnMud2FybigoIk1hbC1mb3JtYXR0ZWQgdGFnIGF0IGVuZCBvZiB0ZW1wbGF0ZTogXCIiICsgaHRtbCArICJcIiIpKTsKICAgICAgfQogICAgICBicmVhawogICAgfQogIH0KCiAgLy8gQ2xlYW4gdXAgYW55IHJlbWFpbmluZyB0YWdzCiAgcGFyc2VFbmRUYWcoKTsKCiAgZnVuY3Rpb24gYWR2YW5jZSAobikgewogICAgaW5kZXggKz0gbjsKICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhuKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3RhcnRUYWcgKCkgewogICAgdmFyIHN0YXJ0ID0gaHRtbC5tYXRjaChzdGFydFRhZ09wZW4pOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIHZhciBtYXRjaCA9IHsKICAgICAgICB0YWdOYW1lOiBzdGFydFsxXSwKICAgICAgICBhdHRyczogW10sCiAgICAgICAgc3RhcnQ6IGluZGV4CiAgICAgIH07CiAgICAgIGFkdmFuY2Uoc3RhcnRbMF0ubGVuZ3RoKTsKICAgICAgdmFyIGVuZCwgYXR0cjsKICAgICAgd2hpbGUgKCEoZW5kID0gaHRtbC5tYXRjaChzdGFydFRhZ0Nsb3NlKSkgJiYgKGF0dHIgPSBodG1sLm1hdGNoKGF0dHJpYnV0ZSkpKSB7CiAgICAgICAgYWR2YW5jZShhdHRyWzBdLmxlbmd0aCk7CiAgICAgICAgbWF0Y2guYXR0cnMucHVzaChhdHRyKTsKICAgICAgfQogICAgICBpZiAoZW5kKSB7CiAgICAgICAgbWF0Y2gudW5hcnlTbGFzaCA9IGVuZFsxXTsKICAgICAgICBhZHZhbmNlKGVuZFswXS5sZW5ndGgpOwogICAgICAgIG1hdGNoLmVuZCA9IGluZGV4OwogICAgICAgIHJldHVybiBtYXRjaAogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVTdGFydFRhZyAobWF0Y2gpIHsKICAgIHZhciB0YWdOYW1lID0gbWF0Y2gudGFnTmFtZTsKICAgIHZhciB1bmFyeVNsYXNoID0gbWF0Y2gudW5hcnlTbGFzaDsKCiAgICBpZiAoZXhwZWN0SFRNTCkgewogICAgICBpZiAobGFzdFRhZyA9PT0gJ3AnICYmIGlzTm9uUGhyYXNpbmdUYWcodGFnTmFtZSkpIHsKICAgICAgICBwYXJzZUVuZFRhZyhsYXN0VGFnKTsKICAgICAgfQogICAgICBpZiAoY2FuQmVMZWZ0T3BlblRhZyQkMSh0YWdOYW1lKSAmJiBsYXN0VGFnID09PSB0YWdOYW1lKSB7CiAgICAgICAgcGFyc2VFbmRUYWcodGFnTmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdW5hcnkgPSBpc1VuYXJ5VGFnJCQxKHRhZ05hbWUpIHx8ICEhdW5hcnlTbGFzaDsKCiAgICB2YXIgbCA9IG1hdGNoLmF0dHJzLmxlbmd0aDsKICAgIHZhciBhdHRycyA9IG5ldyBBcnJheShsKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBhcmdzID0gbWF0Y2guYXR0cnNbaV07CiAgICAgIC8vIGhhY2tpc2ggd29yayBhcm91bmQgRkYgYnVnIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTM2OTc3OAogICAgICBpZiAoSVNfUkVHRVhfQ0FQVFVSSU5HX0JST0tFTiAmJiBhcmdzWzBdLmluZGV4T2YoJyIiJykgPT09IC0xKSB7CiAgICAgICAgaWYgKGFyZ3NbM10gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzNdOyB9CiAgICAgICAgaWYgKGFyZ3NbNF0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzRdOyB9CiAgICAgICAgaWYgKGFyZ3NbNV0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzVdOyB9CiAgICAgIH0KICAgICAgdmFyIHZhbHVlID0gYXJnc1szXSB8fCBhcmdzWzRdIHx8IGFyZ3NbNV0gfHwgJyc7CiAgICAgIHZhciBzaG91bGREZWNvZGVOZXdsaW5lcyA9IHRhZ05hbWUgPT09ICdhJyAmJiBhcmdzWzFdID09PSAnaHJlZicKICAgICAgICA/IG9wdGlvbnMuc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmCiAgICAgICAgOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzOwogICAgICBhdHRyc1tpXSA9IHsKICAgICAgICBuYW1lOiBhcmdzWzFdLAogICAgICAgIHZhbHVlOiBkZWNvZGVBdHRyKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykKICAgICAgfTsKICAgIH0KCiAgICBpZiAoIXVuYXJ5KSB7CiAgICAgIHN0YWNrLnB1c2goeyB0YWc6IHRhZ05hbWUsIGxvd2VyQ2FzZWRUYWc6IHRhZ05hbWUudG9Mb3dlckNhc2UoKSwgYXR0cnM6IGF0dHJzIH0pOwogICAgICBsYXN0VGFnID0gdGFnTmFtZTsKICAgIH0KCiAgICBpZiAob3B0aW9ucy5zdGFydCkgewogICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIGF0dHJzLCB1bmFyeSwgbWF0Y2guc3RhcnQsIG1hdGNoLmVuZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZUVuZFRhZyAodGFnTmFtZSwgc3RhcnQsIGVuZCkgewogICAgdmFyIHBvcywgbG93ZXJDYXNlZFRhZ05hbWU7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgeyBzdGFydCA9IGluZGV4OyB9CiAgICBpZiAoZW5kID09IG51bGwpIHsgZW5kID0gaW5kZXg7IH0KCiAgICBpZiAodGFnTmFtZSkgewogICAgICBsb3dlckNhc2VkVGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIH0KCiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG9wZW5lZCB0YWcgb2YgdGhlIHNhbWUgdHlwZQogICAgaWYgKHRhZ05hbWUpIHsKICAgICAgZm9yIChwb3MgPSBzdGFjay5sZW5ndGggLSAxOyBwb3MgPj0gMDsgcG9zLS0pIHsKICAgICAgICBpZiAoc3RhY2tbcG9zXS5sb3dlckNhc2VkVGFnID09PSBsb3dlckNhc2VkVGFnTmFtZSkgewogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIG5vIHRhZyBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhbiBzaG9wCiAgICAgIHBvcyA9IDA7CiAgICB9CgogICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrCiAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IHBvczsgaS0tKSB7CiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgKGkgPiBwb3MgfHwgIXRhZ05hbWUpICYmCiAgICAgICAgICBvcHRpb25zLndhcm4KICAgICAgICApIHsKICAgICAgICAgIG9wdGlvbnMud2FybigKICAgICAgICAgICAgKCJ0YWcgPCIgKyAoc3RhY2tbaV0udGFnKSArICI+IGhhcyBubyBtYXRjaGluZyBlbmQgdGFnLiIpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy5lbmQpIHsKICAgICAgICAgIG9wdGlvbnMuZW5kKHN0YWNrW2ldLnRhZywgc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZW1vdmUgdGhlIG9wZW4gZWxlbWVudHMgZnJvbSB0aGUgc3RhY2sKICAgICAgc3RhY2subGVuZ3RoID0gcG9zOwogICAgICBsYXN0VGFnID0gcG9zICYmIHN0YWNrW3BvcyAtIDFdLnRhZzsKICAgIH0gZWxzZSBpZiAobG93ZXJDYXNlZFRhZ05hbWUgPT09ICdicicpIHsKICAgICAgaWYgKG9wdGlvbnMuc3RhcnQpIHsKICAgICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIFtdLCB0cnVlLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChsb3dlckNhc2VkVGFnTmFtZSA9PT0gJ3AnKSB7CiAgICAgIGlmIChvcHRpb25zLnN0YXJ0KSB7CiAgICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBbXSwgZmFsc2UsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmVuZCkgewogICAgICAgIG9wdGlvbnMuZW5kKHRhZ05hbWUsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciBvblJFID0gL15AfF52LW9uOi87CnZhciBkaXJSRSA9IC9edi18XkB8XjovOwp2YXIgZm9yQWxpYXNSRSA9IC8oW15dKj8pXHMrKD86aW58b2YpXHMrKFteXSopLzsKdmFyIGZvckl0ZXJhdG9yUkUgPSAvLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLzsKdmFyIHN0cmlwUGFyZW5zUkUgPSAvXlwofFwpJC9nOwoKdmFyIGFyZ1JFID0gLzooLiopJC87CnZhciBiaW5kUkUgPSAvXjp8XnYtYmluZDovOwp2YXIgbW9kaWZpZXJSRSA9IC9cLlteLl0rL2c7Cgp2YXIgZGVjb2RlSFRNTENhY2hlZCA9IGNhY2hlZChoZS5kZWNvZGUpOwoKLy8gY29uZmlndXJhYmxlIHN0YXRlCnZhciB3YXJuJDI7CnZhciBkZWxpbWl0ZXJzOwp2YXIgdHJhbnNmb3JtczsKdmFyIHByZVRyYW5zZm9ybXM7CnZhciBwb3N0VHJhbnNmb3JtczsKdmFyIHBsYXRmb3JtSXNQcmVUYWc7CnZhciBwbGF0Zm9ybU11c3RVc2VQcm9wOwp2YXIgcGxhdGZvcm1HZXRUYWdOYW1lc3BhY2U7CgoKCmZ1bmN0aW9uIGNyZWF0ZUFTVEVsZW1lbnQgKAogIHRhZywKICBhdHRycywKICBwYXJlbnQKKSB7CiAgcmV0dXJuIHsKICAgIHR5cGU6IDEsCiAgICB0YWc6IHRhZywKICAgIGF0dHJzTGlzdDogYXR0cnMsCiAgICBhdHRyc01hcDogbWFrZUF0dHJzTWFwKGF0dHJzKSwKICAgIHBhcmVudDogcGFyZW50LAogICAgY2hpbGRyZW46IFtdCiAgfQp9CgovKioKICogQ29udmVydCBIVE1MIHN0cmluZyB0byBBU1QuCiAqLwpmdW5jdGlvbiBwYXJzZSAoCiAgdGVtcGxhdGUsCiAgb3B0aW9ucwopIHsKICB3YXJuJDIgPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CgogIHBsYXRmb3JtSXNQcmVUYWcgPSBvcHRpb25zLmlzUHJlVGFnIHx8IG5vOwogIHBsYXRmb3JtTXVzdFVzZVByb3AgPSBvcHRpb25zLm11c3RVc2VQcm9wIHx8IG5vOwogIHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlID0gb3B0aW9ucy5nZXRUYWdOYW1lc3BhY2UgfHwgbm87CgogIHRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3RyYW5zZm9ybU5vZGUnKTsKICBwcmVUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwcmVUcmFuc2Zvcm1Ob2RlJyk7CiAgcG9zdFRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3Bvc3RUcmFuc2Zvcm1Ob2RlJyk7CgogIGRlbGltaXRlcnMgPSBvcHRpb25zLmRlbGltaXRlcnM7CgogIHZhciBzdGFjayA9IFtdOwogIHZhciBwcmVzZXJ2ZVdoaXRlc3BhY2UgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSAhPT0gZmFsc2U7CiAgdmFyIHJvb3Q7CiAgdmFyIGN1cnJlbnRQYXJlbnQ7CiAgdmFyIGluVlByZSA9IGZhbHNlOwogIHZhciBpblByZSA9IGZhbHNlOwogIHZhciB3YXJuZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gd2Fybk9uY2UgKG1zZykgewogICAgaWYgKCF3YXJuZWQpIHsKICAgICAgd2FybmVkID0gdHJ1ZTsKICAgICAgd2FybiQyKG1zZyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbG9zZUVsZW1lbnQgKGVsZW1lbnQpIHsKICAgIC8vIGNoZWNrIHByZSBzdGF0ZQogICAgaWYgKGVsZW1lbnQucHJlKSB7CiAgICAgIGluVlByZSA9IGZhbHNlOwogICAgfQogICAgaWYgKHBsYXRmb3JtSXNQcmVUYWcoZWxlbWVudC50YWcpKSB7CiAgICAgIGluUHJlID0gZmFsc2U7CiAgICB9CiAgICAvLyBhcHBseSBwb3N0LXRyYW5zZm9ybXMKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zdFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgcG9zdFRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucyk7CiAgICB9CiAgfQoKICBwYXJzZUhUTUwodGVtcGxhdGUsIHsKICAgIHdhcm46IHdhcm4kMiwKICAgIGV4cGVjdEhUTUw6IG9wdGlvbnMuZXhwZWN0SFRNTCwKICAgIGlzVW5hcnlUYWc6IG9wdGlvbnMuaXNVbmFyeVRhZywKICAgIGNhbkJlTGVmdE9wZW5UYWc6IG9wdGlvbnMuY2FuQmVMZWZ0T3BlblRhZywKICAgIHNob3VsZERlY29kZU5ld2xpbmVzOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzLAogICAgc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiwKICAgIHNob3VsZEtlZXBDb21tZW50OiBvcHRpb25zLmNvbW1lbnRzLAogICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0ICh0YWcsIGF0dHJzLCB1bmFyeSkgewogICAgICAvLyBjaGVjayBuYW1lc3BhY2UuCiAgICAgIC8vIGluaGVyaXQgcGFyZW50IG5zIGlmIHRoZXJlIGlzIG9uZQogICAgICB2YXIgbnMgPSAoY3VycmVudFBhcmVudCAmJiBjdXJyZW50UGFyZW50Lm5zKSB8fCBwbGF0Zm9ybUdldFRhZ05hbWVzcGFjZSh0YWcpOwoKICAgICAgLy8gaGFuZGxlIElFIHN2ZyBidWcKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmIChpc0lFICYmIG5zID09PSAnc3ZnJykgewogICAgICAgIGF0dHJzID0gZ3VhcmRJRVNWR0J1ZyhhdHRycyk7CiAgICAgIH0KCiAgICAgIHZhciBlbGVtZW50ID0gY3JlYXRlQVNURWxlbWVudCh0YWcsIGF0dHJzLCBjdXJyZW50UGFyZW50KTsKICAgICAgaWYgKG5zKSB7CiAgICAgICAgZWxlbWVudC5ucyA9IG5zOwogICAgICB9CgogICAgICBpZiAoaXNGb3JiaWRkZW5UYWcoZWxlbWVudCkgJiYgIWlzU2VydmVyUmVuZGVyaW5nKCkpIHsKICAgICAgICBlbGVtZW50LmZvcmJpZGRlbiA9IHRydWU7CiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4kMigKICAgICAgICAgICdUZW1wbGF0ZXMgc2hvdWxkIG9ubHkgYmUgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgdGhlIHN0YXRlIHRvIHRoZSAnICsKICAgICAgICAgICdVSS4gQXZvaWQgcGxhY2luZyB0YWdzIHdpdGggc2lkZS1lZmZlY3RzIGluIHlvdXIgdGVtcGxhdGVzLCBzdWNoIGFzICcgKwogICAgICAgICAgIjwiICsgdGFnICsgIj4iICsgJywgYXMgdGhleSB3aWxsIG5vdCBiZSBwYXJzZWQuJwogICAgICAgICk7CiAgICAgIH0KCiAgICAgIC8vIGFwcGx5IHByZS10cmFuc2Zvcm1zCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlVHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGVsZW1lbnQgPSBwcmVUcmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgICAgIH0KCiAgICAgIGlmICghaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1ByZShlbGVtZW50KTsKICAgICAgICBpZiAoZWxlbWVudC5wcmUpIHsKICAgICAgICAgIGluVlByZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwbGF0Zm9ybUlzUHJlVGFnKGVsZW1lbnQudGFnKSkgewogICAgICAgIGluUHJlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1Jhd0F0dHJzKGVsZW1lbnQpOwogICAgICB9IGVsc2UgaWYgKCFlbGVtZW50LnByb2Nlc3NlZCkgewogICAgICAgIC8vIHN0cnVjdHVyYWwgZGlyZWN0aXZlcwogICAgICAgIHByb2Nlc3NGb3IoZWxlbWVudCk7CiAgICAgICAgcHJvY2Vzc0lmKGVsZW1lbnQpOwogICAgICAgIHByb2Nlc3NPbmNlKGVsZW1lbnQpOwogICAgICAgIC8vIGVsZW1lbnQtc2NvcGUgc3R1ZmYKICAgICAgICBwcm9jZXNzRWxlbWVudChlbGVtZW50LCBvcHRpb25zKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2hlY2tSb290Q29uc3RyYWludHMgKGVsKSB7CiAgICAgICAgewogICAgICAgICAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnIHx8IGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8IiArIChlbC50YWcpICsgIj4gYXMgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlIGl0IG1heSAiICsKICAgICAgICAgICAgICAnY29udGFpbiBtdWx0aXBsZSBub2Rlcy4nCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZWwuYXR0cnNNYXAuaGFzT3duUHJvcGVydHkoJ3YtZm9yJykpIHsKICAgICAgICAgICAgd2Fybk9uY2UoCiAgICAgICAgICAgICAgJ0Nhbm5vdCB1c2Ugdi1mb3Igb24gc3RhdGVmdWwgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlICcgKwogICAgICAgICAgICAgICdpdCByZW5kZXJzIG11bHRpcGxlIGVsZW1lbnRzLicKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIHRyZWUgbWFuYWdlbWVudAogICAgICBpZiAoIXJvb3QpIHsKICAgICAgICByb290ID0gZWxlbWVudDsKICAgICAgICBjaGVja1Jvb3RDb25zdHJhaW50cyhyb290KTsKICAgICAgfSBlbHNlIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgLy8gYWxsb3cgcm9vdCBlbGVtZW50cyB3aXRoIHYtaWYsIHYtZWxzZS1pZiBhbmQgdi1lbHNlCiAgICAgICAgaWYgKHJvb3QuaWYgJiYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkpIHsKICAgICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKGVsZW1lbnQpOwogICAgICAgICAgYWRkSWZDb25kaXRpb24ocm9vdCwgewogICAgICAgICAgICBleHA6IGVsZW1lbnQuZWxzZWlmLAogICAgICAgICAgICBibG9jazogZWxlbWVudAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm5PbmNlKAogICAgICAgICAgICAiQ29tcG9uZW50IHRlbXBsYXRlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gIiArCiAgICAgICAgICAgICJJZiB5b3UgYXJlIHVzaW5nIHYtaWYgb24gbXVsdGlwbGUgZWxlbWVudHMsICIgKwogICAgICAgICAgICAidXNlIHYtZWxzZS1pZiB0byBjaGFpbiB0aGVtIGluc3RlYWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgJiYgIWVsZW1lbnQuZm9yYmlkZGVuKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkgewogICAgICAgICAgcHJvY2Vzc0lmQ29uZGl0aW9ucyhlbGVtZW50LCBjdXJyZW50UGFyZW50KTsKICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc2xvdFNjb3BlKSB7IC8vIHNjb3BlZCBzbG90CiAgICAgICAgICBjdXJyZW50UGFyZW50LnBsYWluID0gZmFsc2U7CiAgICAgICAgICB2YXIgbmFtZSA9IGVsZW1lbnQuc2xvdFRhcmdldCB8fCAnImRlZmF1bHQiJzsoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyB8fCAoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyA9IHt9KSlbbmFtZV0gPSBlbGVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goZWxlbWVudCk7CiAgICAgICAgICBlbGVtZW50LnBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdW5hcnkpIHsKICAgICAgICBjdXJyZW50UGFyZW50ID0gZWxlbWVudDsKICAgICAgICBzdGFjay5wdXNoKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgICAgfQogICAgfSwKCiAgICBlbmQ6IGZ1bmN0aW9uIGVuZCAoKSB7CiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgIHZhciBlbGVtZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIHZhciBsYXN0Tm9kZSA9IGVsZW1lbnQuY2hpbGRyZW5bZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDMgJiYgbGFzdE5vZGUudGV4dCA9PT0gJyAnICYmICFpblByZSkgewogICAgICAgIGVsZW1lbnQuY2hpbGRyZW4ucG9wKCk7CiAgICAgIH0KICAgICAgLy8gcG9wIHN0YWNrCiAgICAgIHN0YWNrLmxlbmd0aCAtPSAxOwogICAgICBjdXJyZW50UGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgIH0sCgogICAgY2hhcnM6IGZ1bmN0aW9uIGNoYXJzICh0ZXh0KSB7CiAgICAgIGlmICghY3VycmVudFBhcmVudCkgewogICAgICAgIHsKICAgICAgICAgIGlmICh0ZXh0ID09PSB0ZW1wbGF0ZSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAnQ29tcG9uZW50IHRlbXBsYXRlIHJlcXVpcmVzIGEgcm9vdCBlbGVtZW50LCByYXRoZXIgdGhhbiBqdXN0IHRleHQuJwogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIGlmICgodGV4dCA9IHRleHQudHJpbSgpKSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAoInRleHQgXCIiICsgdGV4dCArICJcIiBvdXRzaWRlIHJvb3QgZWxlbWVudCB3aWxsIGJlIGlnbm9yZWQuIikKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgLy8gSUUgdGV4dGFyZWEgcGxhY2Vob2xkZXIgYnVnCiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoaXNJRSAmJgogICAgICAgIGN1cnJlbnRQYXJlbnQudGFnID09PSAndGV4dGFyZWEnICYmCiAgICAgICAgY3VycmVudFBhcmVudC5hdHRyc01hcC5wbGFjZWhvbGRlciA9PT0gdGV4dAogICAgICApIHsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50UGFyZW50LmNoaWxkcmVuOwogICAgICB0ZXh0ID0gaW5QcmUgfHwgdGV4dC50cmltKCkKICAgICAgICA/IGlzVGV4dFRhZyhjdXJyZW50UGFyZW50KSA/IHRleHQgOiBkZWNvZGVIVE1MQ2FjaGVkKHRleHQpCiAgICAgICAgLy8gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGlmIGl0cyBub3QgcmlnaHQgYWZ0ZXIgYSBzdGFydGluZyB0YWcKICAgICAgICA6IHByZXNlcnZlV2hpdGVzcGFjZSAmJiBjaGlsZHJlbi5sZW5ndGggPyAnICcgOiAnJzsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIGlmICghaW5WUHJlICYmIHRleHQgIT09ICcgJyAmJiAocmVzID0gcGFyc2VUZXh0KHRleHQsIGRlbGltaXRlcnMpKSkgewogICAgICAgICAgY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHR5cGU6IDIsCiAgICAgICAgICAgIGV4cHJlc3Npb246IHJlcy5leHByZXNzaW9uLAogICAgICAgICAgICB0b2tlbnM6IHJlcy50b2tlbnMsCiAgICAgICAgICAgIHRleHQ6IHRleHQKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAodGV4dCAhPT0gJyAnIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dCAhPT0gJyAnKSB7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgdHlwZTogMywKICAgICAgICAgICAgdGV4dDogdGV4dAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY29tbWVudDogZnVuY3Rpb24gY29tbWVudCAodGV4dCkgewogICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goewogICAgICAgIHR5cGU6IDMsCiAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICBpc0NvbW1lbnQ6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJvb3QKfQoKZnVuY3Rpb24gcHJvY2Vzc1ByZSAoZWwpIHsKICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtcHJlJykgIT0gbnVsbCkgewogICAgZWwucHJlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSYXdBdHRycyAoZWwpIHsKICB2YXIgbCA9IGVsLmF0dHJzTGlzdC5sZW5ndGg7CiAgaWYgKGwpIHsKICAgIHZhciBhdHRycyA9IGVsLmF0dHJzID0gbmV3IEFycmF5KGwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgYXR0cnNbaV0gPSB7CiAgICAgICAgbmFtZTogZWwuYXR0cnNMaXN0W2ldLm5hbWUsCiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVsLmF0dHJzTGlzdFtpXS52YWx1ZSkKICAgICAgfTsKICAgIH0KICB9IGVsc2UgaWYgKCFlbC5wcmUpIHsKICAgIC8vIG5vbiByb290IG5vZGUgaW4gcHJlIGJsb2NrcyB3aXRoIG5vIGF0dHJpYnV0ZXMKICAgIGVsLnBsYWluID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50IChlbGVtZW50LCBvcHRpb25zKSB7CiAgcHJvY2Vzc0tleShlbGVtZW50KTsKCiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgYWZ0ZXIKICAvLyByZW1vdmluZyBzdHJ1Y3R1cmFsIGF0dHJpYnV0ZXMKICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFlbGVtZW50LmF0dHJzTGlzdC5sZW5ndGg7CgogIHByb2Nlc3NSZWYoZWxlbWVudCk7CiAgcHJvY2Vzc1Nsb3QoZWxlbWVudCk7CiAgcHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgIGVsZW1lbnQgPSB0cmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgfQogIHByb2Nlc3NBdHRycyhlbGVtZW50KTsKfQoKZnVuY3Rpb24gcHJvY2Vzc0tleSAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QmluZGluZ0F0dHIoZWwsICdrZXknKTsKICBpZiAoZXhwKSB7CiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICB3YXJuJDIoIjx0ZW1wbGF0ZT4gY2Fubm90IGJlIGtleWVkLiBQbGFjZSB0aGUga2V5IG9uIHJlYWwgZWxlbWVudHMgaW5zdGVhZC4iKTsKICAgIH0KICAgIGVsLmtleSA9IGV4cDsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSZWYgKGVsKSB7CiAgdmFyIHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAncmVmJyk7CiAgaWYgKHJlZikgewogICAgZWwucmVmID0gcmVmOwogICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NGb3IgKGVsKSB7CiAgdmFyIGV4cDsKICBpZiAoKGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWZvcicpKSkgewogICAgdmFyIHJlcyA9IHBhcnNlRm9yKGV4cCk7CiAgICBpZiAocmVzKSB7CiAgICAgIGV4dGVuZChlbCwgcmVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdhcm4kMigKICAgICAgICAoIkludmFsaWQgdi1mb3IgZXhwcmVzc2lvbjogIiArIGV4cCkKICAgICAgKTsKICAgIH0KICB9Cn0KCgoKZnVuY3Rpb24gcGFyc2VGb3IgKGV4cCkgewogIHZhciBpbk1hdGNoID0gZXhwLm1hdGNoKGZvckFsaWFzUkUpOwogIGlmICghaW5NYXRjaCkgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICByZXMuZm9yID0gaW5NYXRjaFsyXS50cmltKCk7CiAgdmFyIGFsaWFzID0gaW5NYXRjaFsxXS50cmltKCkucmVwbGFjZShzdHJpcFBhcmVuc1JFLCAnJyk7CiAgdmFyIGl0ZXJhdG9yTWF0Y2ggPSBhbGlhcy5tYXRjaChmb3JJdGVyYXRvclJFKTsKICBpZiAoaXRlcmF0b3JNYXRjaCkgewogICAgcmVzLmFsaWFzID0gYWxpYXMucmVwbGFjZShmb3JJdGVyYXRvclJFLCAnJyk7CiAgICByZXMuaXRlcmF0b3IxID0gaXRlcmF0b3JNYXRjaFsxXS50cmltKCk7CiAgICBpZiAoaXRlcmF0b3JNYXRjaFsyXSkgewogICAgICByZXMuaXRlcmF0b3IyID0gaXRlcmF0b3JNYXRjaFsyXS50cmltKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJlcy5hbGlhcyA9IGFsaWFzOwogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIHByb2Nlc3NJZiAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtaWYnKTsKICBpZiAoZXhwKSB7CiAgICBlbC5pZiA9IGV4cDsKICAgIGFkZElmQ29uZGl0aW9uKGVsLCB7CiAgICAgIGV4cDogZXhwLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScpICE9IG51bGwpIHsKICAgICAgZWwuZWxzZSA9IHRydWU7CiAgICB9CiAgICB2YXIgZWxzZWlmID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZS1pZicpOwogICAgaWYgKGVsc2VpZikgewogICAgICBlbC5lbHNlaWYgPSBlbHNlaWY7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBwcm9jZXNzSWZDb25kaXRpb25zIChlbCwgcGFyZW50KSB7CiAgdmFyIHByZXYgPSBmaW5kUHJldkVsZW1lbnQocGFyZW50LmNoaWxkcmVuKTsKICBpZiAocHJldiAmJiBwcmV2LmlmKSB7CiAgICBhZGRJZkNvbmRpdGlvbihwcmV2LCB7CiAgICAgIGV4cDogZWwuZWxzZWlmLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICB3YXJuJDIoCiAgICAgICJ2LSIgKyAoZWwuZWxzZWlmID8gKCdlbHNlLWlmPSInICsgZWwuZWxzZWlmICsgJyInKSA6ICdlbHNlJykgKyAiICIgKwogICAgICAidXNlZCBvbiBlbGVtZW50IDwiICsgKGVsLnRhZykgKyAiPiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdi1pZi4iCiAgICApOwogIH0KfQoKZnVuY3Rpb24gZmluZFByZXZFbGVtZW50IChjaGlsZHJlbikgewogIHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIGlmIChjaGlsZHJlbltpXS50eXBlID09PSAxKSB7CiAgICAgIHJldHVybiBjaGlsZHJlbltpXQogICAgfSBlbHNlIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGlsZHJlbltpXS50ZXh0ICE9PSAnICcpIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAidGV4dCBcIiIgKyAoY2hpbGRyZW5baV0udGV4dC50cmltKCkpICsgIlwiIGJldHdlZW4gdi1pZiBhbmQgdi1lbHNlKC1pZikgIiArCiAgICAgICAgICAid2lsbCBiZSBpZ25vcmVkLiIKICAgICAgICApOwogICAgICB9CiAgICAgIGNoaWxkcmVuLnBvcCgpOwogICAgfQogIH0KfQoKZnVuY3Rpb24gYWRkSWZDb25kaXRpb24gKGVsLCBjb25kaXRpb24pIHsKICBpZiAoIWVsLmlmQ29uZGl0aW9ucykgewogICAgZWwuaWZDb25kaXRpb25zID0gW107CiAgfQogIGVsLmlmQ29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NPbmNlIChlbCkgewogIHZhciBvbmNlJCQxID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Ytb25jZScpOwogIGlmIChvbmNlJCQxICE9IG51bGwpIHsKICAgIGVsLm9uY2UgPSB0cnVlOwogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc1Nsb3QgKGVsKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnKSB7CiAgICBlbC5zbG90TmFtZSA9IGdldEJpbmRpbmdBdHRyKGVsLCAnbmFtZScpOwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBlbC5rZXkpIHsKICAgICAgd2FybiQyKAogICAgICAgICJga2V5YCBkb2VzIG5vdCB3b3JrIG9uIDxzbG90PiBiZWNhdXNlIHNsb3RzIGFyZSBhYnN0cmFjdCBvdXRsZXRzICIgKwogICAgICAgICJhbmQgY2FuIHBvc3NpYmx5IGV4cGFuZCBpbnRvIG11bHRpcGxlIGVsZW1lbnRzLiAiICsKICAgICAgICAiVXNlIHRoZSBrZXkgb24gYSB3cmFwcGluZyBlbGVtZW50IGluc3RlYWQuIgogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgc2xvdFNjb3BlOwogICAgaWYgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICBzbG90U2NvcGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2NvcGUnKTsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgc2xvdFNjb3BlKSB7CiAgICAgICAgd2FybiQyKAogICAgICAgICAgInRoZSBcInNjb3BlXCIgYXR0cmlidXRlIGZvciBzY29wZWQgc2xvdHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kICIgKwogICAgICAgICAgInJlcGxhY2VkIGJ5IFwic2xvdC1zY29wZVwiIHNpbmNlIDIuNS4gVGhlIG5ldyBcInNsb3Qtc2NvcGVcIiBhdHRyaWJ1dGUgIiArCiAgICAgICAgICAiY2FuIGFsc28gYmUgdXNlZCBvbiBwbGFpbiBlbGVtZW50cyBpbiBhZGRpdGlvbiB0byA8dGVtcGxhdGU+IHRvICIgKwogICAgICAgICAgImRlbm90ZSBzY29wZWQgc2xvdHMuIiwKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICB9CiAgICAgIGVsLnNsb3RTY29wZSA9IHNsb3RTY29wZSB8fCBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2xvdC1zY29wZScpOwogICAgfSBlbHNlIGlmICgoc2xvdFNjb3BlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Nsb3Qtc2NvcGUnKSkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgZWwuYXR0cnNNYXBbJ3YtZm9yJ10pIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAiQW1iaWd1b3VzIGNvbWJpbmVkIHVzYWdlIG9mIHNsb3Qtc2NvcGUgYW5kIHYtZm9yIG9uIDwiICsgKGVsLnRhZykgKyAiPiAiICsKICAgICAgICAgICIodi1mb3IgdGFrZXMgaGlnaGVyIHByaW9yaXR5KS4gVXNlIGEgd3JhcHBlciA8dGVtcGxhdGU+IGZvciB0aGUgIiArCiAgICAgICAgICAic2NvcGVkIHNsb3QgdG8gbWFrZSBpdCBjbGVhcmVyLiIsCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgfQogICAgICBlbC5zbG90U2NvcGUgPSBzbG90U2NvcGU7CiAgICB9CiAgICB2YXIgc2xvdFRhcmdldCA9IGdldEJpbmRpbmdBdHRyKGVsLCAnc2xvdCcpOwogICAgaWYgKHNsb3RUYXJnZXQpIHsKICAgICAgZWwuc2xvdFRhcmdldCA9IHNsb3RUYXJnZXQgPT09ICciIicgPyAnImRlZmF1bHQiJyA6IHNsb3RUYXJnZXQ7CiAgICAgIC8vIHByZXNlcnZlIHNsb3QgYXMgYW4gYXR0cmlidXRlIGZvciBuYXRpdmUgc2hhZG93IERPTSBjb21wYXQKICAgICAgLy8gb25seSBmb3Igbm9uLXNjb3BlZCBzbG90cy4KICAgICAgaWYgKGVsLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICAgICAgYWRkQXR0cihlbCwgJ3Nsb3QnLCBzbG90VGFyZ2V0KTsKICAgICAgfQogICAgfQogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc0NvbXBvbmVudCAoZWwpIHsKICB2YXIgYmluZGluZzsKICBpZiAoKGJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2lzJykpKSB7CiAgICBlbC5jb21wb25lbnQgPSBiaW5kaW5nOwogIH0KICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ2lubGluZS10ZW1wbGF0ZScpICE9IG51bGwpIHsKICAgIGVsLmlubGluZVRlbXBsYXRlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NBdHRycyAoZWwpIHsKICB2YXIgbGlzdCA9IGVsLmF0dHJzTGlzdDsKICB2YXIgaSwgbCwgbmFtZSwgcmF3TmFtZSwgdmFsdWUsIG1vZGlmaWVycywgaXNQcm9wOwogIGZvciAoaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgbmFtZSA9IHJhd05hbWUgPSBsaXN0W2ldLm5hbWU7CiAgICB2YWx1ZSA9IGxpc3RbaV0udmFsdWU7CiAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAvLyBtYXJrIGVsZW1lbnQgYXMgZHluYW1pYwogICAgICBlbC5oYXNCaW5kaW5ncyA9IHRydWU7CiAgICAgIC8vIG1vZGlmaWVycwogICAgICBtb2RpZmllcnMgPSBwYXJzZU1vZGlmaWVycyhuYW1lKTsKICAgICAgaWYgKG1vZGlmaWVycykgewogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UobW9kaWZpZXJSRSwgJycpOwogICAgICB9CiAgICAgIGlmIChiaW5kUkUudGVzdChuYW1lKSkgeyAvLyB2LWJpbmQKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGJpbmRSRSwgJycpOwogICAgICAgIHZhbHVlID0gcGFyc2VGaWx0ZXJzKHZhbHVlKTsKICAgICAgICBpc1Byb3AgPSBmYWxzZTsKICAgICAgICBpZiAobW9kaWZpZXJzKSB7CiAgICAgICAgICBpZiAobW9kaWZpZXJzLnByb3ApIHsKICAgICAgICAgICAgaXNQcm9wID0gdHJ1ZTsKICAgICAgICAgICAgbmFtZSA9IGNhbWVsaXplKG5hbWUpOwogICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2lubmVySHRtbCcpIHsgbmFtZSA9ICdpbm5lckhUTUwnOyB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobW9kaWZpZXJzLmNhbWVsKSB7CiAgICAgICAgICAgIG5hbWUgPSBjYW1lbGl6ZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb2RpZmllcnMuc3luYykgewogICAgICAgICAgICBhZGRIYW5kbGVyKAogICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICgidXBkYXRlOiIgKyAoY2FtZWxpemUobmFtZSkpKSwKICAgICAgICAgICAgICBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgIiRldmVudCIpCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1Byb3AgfHwgKAogICAgICAgICAgIWVsLmNvbXBvbmVudCAmJiBwbGF0Zm9ybU11c3RVc2VQcm9wKGVsLnRhZywgZWwuYXR0cnNNYXAudHlwZSwgbmFtZSkKICAgICAgICApKSB7CiAgICAgICAgICBhZGRQcm9wKGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZEF0dHIoZWwsIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob25SRS50ZXN0KG5hbWUpKSB7IC8vIHYtb24KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9uUkUsICcnKTsKICAgICAgICBhZGRIYW5kbGVyKGVsLCBuYW1lLCB2YWx1ZSwgbW9kaWZpZXJzLCBmYWxzZSwgd2FybiQyKTsKICAgICAgfSBlbHNlIHsgLy8gbm9ybWFsIGRpcmVjdGl2ZXMKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGRpclJFLCAnJyk7CiAgICAgICAgLy8gcGFyc2UgYXJnCiAgICAgICAgdmFyIGFyZ01hdGNoID0gbmFtZS5tYXRjaChhcmdSRSk7CiAgICAgICAgdmFyIGFyZyA9IGFyZ01hdGNoICYmIGFyZ01hdGNoWzFdOwogICAgICAgIGlmIChhcmcpIHsKICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC0oYXJnLmxlbmd0aCArIDEpKTsKICAgICAgICB9CiAgICAgICAgYWRkRGlyZWN0aXZlKGVsLCBuYW1lLCByYXdOYW1lLCB2YWx1ZSwgYXJnLCBtb2RpZmllcnMpOwogICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSA9PT0gJ21vZGVsJykgewogICAgICAgICAgY2hlY2tGb3JBbGlhc01vZGVsKGVsLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBsaXRlcmFsIGF0dHJpYnV0ZQogICAgICB7CiAgICAgICAgdmFyIHJlcyA9IHBhcnNlVGV4dCh2YWx1ZSwgZGVsaW1pdGVycyk7CiAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgd2FybiQyKAogICAgICAgICAgICBuYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIjogIiArCiAgICAgICAgICAgICdJbnRlcnBvbGF0aW9uIGluc2lkZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIHJlbW92ZWQuICcgKwogICAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICsKICAgICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBpZD0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDppZD0idmFsIj4uJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkQXR0cihlbCwgbmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgICAgLy8gIzY4ODcgZmlyZWZveCBkb2Vzbid0IHVwZGF0ZSBtdXRlZCBzdGF0ZSBpZiBzZXQgdmlhIGF0dHJpYnV0ZQogICAgICAvLyBldmVuIGltbWVkaWF0ZWx5IGFmdGVyIGVsZW1lbnQgY3JlYXRpb24KICAgICAgaWYgKCFlbC5jb21wb25lbnQgJiYKICAgICAgICAgIG5hbWUgPT09ICdtdXRlZCcgJiYKICAgICAgICAgIHBsYXRmb3JtTXVzdFVzZVByb3AoZWwudGFnLCBlbC5hdHRyc01hcC50eXBlLCBuYW1lKSkgewogICAgICAgIGFkZFByb3AoZWwsIG5hbWUsICd0cnVlJyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrSW5Gb3IgKGVsKSB7CiAgdmFyIHBhcmVudCA9IGVsOwogIHdoaWxlIChwYXJlbnQpIHsKICAgIGlmIChwYXJlbnQuZm9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgfQogIHJldHVybiBmYWxzZQp9CgpmdW5jdGlvbiBwYXJzZU1vZGlmaWVycyAobmFtZSkgewogIHZhciBtYXRjaCA9IG5hbWUubWF0Y2gobW9kaWZpZXJSRSk7CiAgaWYgKG1hdGNoKSB7CiAgICB2YXIgcmV0ID0ge307CiAgICBtYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7IHJldFttLnNsaWNlKDEpXSA9IHRydWU7IH0pOwogICAgcmV0dXJuIHJldAogIH0KfQoKZnVuY3Rpb24gbWFrZUF0dHJzTWFwIChhdHRycykgewogIHZhciBtYXAgPSB7fTsKICBmb3IgKHZhciBpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKAogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbWFwW2F0dHJzW2ldLm5hbWVdICYmICFpc0lFICYmICFpc0VkZ2UKICAgICkgewogICAgICB3YXJuJDIoJ2R1cGxpY2F0ZSBhdHRyaWJ1dGU6ICcgKyBhdHRyc1tpXS5uYW1lKTsKICAgIH0KICAgIG1hcFthdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlOwogIH0KICByZXR1cm4gbWFwCn0KCi8vIGZvciBzY3JpcHQgKGUuZy4gdHlwZT0ieC90ZW1wbGF0ZSIpIG9yIHN0eWxlLCBkbyBub3QgZGVjb2RlIGNvbnRlbnQKZnVuY3Rpb24gaXNUZXh0VGFnIChlbCkgewogIHJldHVybiBlbC50YWcgPT09ICdzY3JpcHQnIHx8IGVsLnRhZyA9PT0gJ3N0eWxlJwp9CgpmdW5jdGlvbiBpc0ZvcmJpZGRlblRhZyAoZWwpIHsKICByZXR1cm4gKAogICAgZWwudGFnID09PSAnc3R5bGUnIHx8CiAgICAoZWwudGFnID09PSAnc2NyaXB0JyAmJiAoCiAgICAgICFlbC5hdHRyc01hcC50eXBlIHx8CiAgICAgIGVsLmF0dHJzTWFwLnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnCiAgICApKQogICkKfQoKdmFyIGllTlNCdWcgPSAvXnhtbG5zOk5TXGQrLzsKdmFyIGllTlNQcmVmaXggPSAvXk5TXGQrOi87CgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBndWFyZElFU1ZHQnVnIChhdHRycykgewogIHZhciByZXMgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldOwogICAgaWYgKCFpZU5TQnVnLnRlc3QoYXR0ci5uYW1lKSkgewogICAgICBhdHRyLm5hbWUgPSBhdHRyLm5hbWUucmVwbGFjZShpZU5TUHJlZml4LCAnJyk7CiAgICAgIHJlcy5wdXNoKGF0dHIpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrRm9yQWxpYXNNb2RlbCAoZWwsIHZhbHVlKSB7CiAgdmFyIF9lbCA9IGVsOwogIHdoaWxlIChfZWwpIHsKICAgIGlmIChfZWwuZm9yICYmIF9lbC5hbGlhcyA9PT0gdmFsdWUpIHsKICAgICAgd2FybiQyKAogICAgICAgICI8IiArIChlbC50YWcpICsgIiB2LW1vZGVsPVwiIiArIHZhbHVlICsgIlwiPjogIiArCiAgICAgICAgIllvdSBhcmUgYmluZGluZyB2LW1vZGVsIGRpcmVjdGx5IHRvIGEgdi1mb3IgaXRlcmF0aW9uIGFsaWFzLiAiICsKICAgICAgICAiVGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgdi1mb3Igc291cmNlIGFycmF5IGJlY2F1c2UgIiArCiAgICAgICAgIndyaXRpbmcgdG8gdGhlIGFsaWFzIGlzIGxpa2UgbW9kaWZ5aW5nIGEgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGUuICIgKwogICAgICAgICJDb25zaWRlciB1c2luZyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCB1c2Ugdi1tb2RlbCBvbiBhbiBvYmplY3QgcHJvcGVydHkgaW5zdGVhZC4iCiAgICAgICk7CiAgICB9CiAgICBfZWwgPSBfZWwucGFyZW50OwogIH0KfQoKLyogICovCgovKioKICogRXhwYW5kIGlucHV0W3YtbW9kZWxdIHdpdGggZHlhbm1pYyB0eXBlIGJpbmRpbmdzIGludG8gdi1pZi1lbHNlIGNoYWlucwogKiBUdXJuIHRoaXM6CiAqICAgPGlucHV0IHYtbW9kZWw9ImRhdGFbdHlwZV0iIDp0eXBlPSJ0eXBlIj4KICogaW50byB0aGlzOgogKiAgIDxpbnB1dCB2LWlmPSJ0eXBlID09PSAnY2hlY2tib3gnIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iZGF0YVt0eXBlXSI+CiAqICAgPGlucHV0IHYtZWxzZS1pZj0idHlwZSA9PT0gJ3JhZGlvJyIgdHlwZT0icmFkaW8iIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKiAgIDxpbnB1dCB2LWVsc2UgOnR5cGU9InR5cGUiIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKi8KCmZ1bmN0aW9uIHByZVRyYW5zZm9ybU5vZGUgKGVsLCBvcHRpb25zKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ2lucHV0JykgewogICAgdmFyIG1hcCA9IGVsLmF0dHJzTWFwOwogICAgaWYgKCFtYXBbJ3YtbW9kZWwnXSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgdHlwZUJpbmRpbmc7CiAgICBpZiAobWFwWyc6dHlwZSddIHx8IG1hcFsndi1iaW5kOnR5cGUnXSkgewogICAgICB0eXBlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndHlwZScpOwogICAgfQogICAgaWYgKCFtYXAudHlwZSAmJiAhdHlwZUJpbmRpbmcgJiYgbWFwWyd2LWJpbmQnXSkgewogICAgICB0eXBlQmluZGluZyA9ICIoIiArIChtYXBbJ3YtYmluZCddKSArICIpLnR5cGUiOwogICAgfQoKICAgIGlmICh0eXBlQmluZGluZykgewogICAgICB2YXIgaWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1pZicsIHRydWUpOwogICAgICB2YXIgaWZDb25kaXRpb25FeHRyYSA9IGlmQ29uZGl0aW9uID8gKCImJigiICsgaWZDb25kaXRpb24gKyAiKSIpIDogIiI7CiAgICAgIHZhciBoYXNFbHNlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScsIHRydWUpICE9IG51bGw7CiAgICAgIHZhciBlbHNlSWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1lbHNlLWlmJywgdHJ1ZSk7CiAgICAgIC8vIDEuIGNoZWNrYm94CiAgICAgIHZhciBicmFuY2gwID0gY2xvbmVBU1RFbGVtZW50KGVsKTsKICAgICAgLy8gcHJvY2VzcyBmb3Igb24gdGhlIG1haW4gbm9kZQogICAgICBwcm9jZXNzRm9yKGJyYW5jaDApOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDAsICd0eXBlJywgJ2NoZWNrYm94Jyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDAsIG9wdGlvbnMpOwogICAgICBicmFuY2gwLnByb2Nlc3NlZCA9IHRydWU7IC8vIHByZXZlbnQgaXQgZnJvbSBkb3VibGUtcHJvY2Vzc2VkCiAgICAgIGJyYW5jaDAuaWYgPSAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J2NoZWNrYm94JyIgKyBpZkNvbmRpdGlvbkV4dHJhOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiBicmFuY2gwLmlmLAogICAgICAgIGJsb2NrOiBicmFuY2gwCiAgICAgIH0pOwogICAgICAvLyAyLiBhZGQgcmFkaW8gZWxzZS1pZiBjb25kaXRpb24KICAgICAgdmFyIGJyYW5jaDEgPSBjbG9uZUFTVEVsZW1lbnQoZWwpOwogICAgICBnZXRBbmRSZW1vdmVBdHRyKGJyYW5jaDEsICd2LWZvcicsIHRydWUpOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDEsICd0eXBlJywgJ3JhZGlvJyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDEsIG9wdGlvbnMpOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J3JhZGlvJyIgKyBpZkNvbmRpdGlvbkV4dHJhLAogICAgICAgIGJsb2NrOiBicmFuY2gxCiAgICAgIH0pOwogICAgICAvLyAzLiBvdGhlcgogICAgICB2YXIgYnJhbmNoMiA9IGNsb25lQVNURWxlbWVudChlbCk7CiAgICAgIGdldEFuZFJlbW92ZUF0dHIoYnJhbmNoMiwgJ3YtZm9yJywgdHJ1ZSk7CiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMiwgJzp0eXBlJywgdHlwZUJpbmRpbmcpOwogICAgICBwcm9jZXNzRWxlbWVudChicmFuY2gyLCBvcHRpb25zKTsKICAgICAgYWRkSWZDb25kaXRpb24oYnJhbmNoMCwgewogICAgICAgIGV4cDogaWZDb25kaXRpb24sCiAgICAgICAgYmxvY2s6IGJyYW5jaDIKICAgICAgfSk7CgogICAgICBpZiAoaGFzRWxzZSkgewogICAgICAgIGJyYW5jaDAuZWxzZSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoZWxzZUlmQ29uZGl0aW9uKSB7CiAgICAgICAgYnJhbmNoMC5lbHNlaWYgPSBlbHNlSWZDb25kaXRpb247CiAgICAgIH0KCiAgICAgIHJldHVybiBicmFuY2gwCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFTVEVsZW1lbnQgKGVsKSB7CiAgcmV0dXJuIGNyZWF0ZUFTVEVsZW1lbnQoZWwudGFnLCBlbC5hdHRyc0xpc3Quc2xpY2UoKSwgZWwucGFyZW50KQp9Cgp2YXIgbW9kZWwkMiA9IHsKICBwcmVUcmFuc2Zvcm1Ob2RlOiBwcmVUcmFuc2Zvcm1Ob2RlCn0KCnZhciBtb2R1bGVzJDEgPSBbCiAga2xhc3MkMSwKICBzdHlsZSQxLAogIG1vZGVsJDIKXQoKLyogICovCgpmdW5jdGlvbiB0ZXh0IChlbCwgZGlyKSB7CiAgaWYgKGRpci52YWx1ZSkgewogICAgYWRkUHJvcChlbCwgJ3RleHRDb250ZW50JywgKCJfcygiICsgKGRpci52YWx1ZSkgKyAiKSIpKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaHRtbCAoZWwsIGRpcikgewogIGlmIChkaXIudmFsdWUpIHsKICAgIGFkZFByb3AoZWwsICdpbm5lckhUTUwnLCAoIl9zKCIgKyAoZGlyLnZhbHVlKSArICIpIikpOwogIH0KfQoKdmFyIGRpcmVjdGl2ZXMkMSA9IHsKICBtb2RlbDogbW9kZWwsCiAgdGV4dDogdGV4dCwKICBodG1sOiBodG1sCn0KCi8qICAqLwoKdmFyIGJhc2VPcHRpb25zID0gewogIGV4cGVjdEhUTUw6IHRydWUsCiAgbW9kdWxlczogbW9kdWxlcyQxLAogIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXMkMSwKICBpc1ByZVRhZzogaXNQcmVUYWcsCiAgaXNVbmFyeVRhZzogaXNVbmFyeVRhZywKICBtdXN0VXNlUHJvcDogbXVzdFVzZVByb3AsCiAgY2FuQmVMZWZ0T3BlblRhZzogY2FuQmVMZWZ0T3BlblRhZywKICBpc1Jlc2VydmVkVGFnOiBpc1Jlc2VydmVkVGFnLAogIGdldFRhZ05hbWVzcGFjZTogZ2V0VGFnTmFtZXNwYWNlLAogIHN0YXRpY0tleXM6IGdlblN0YXRpY0tleXMobW9kdWxlcyQxKQp9OwoKLyogICovCgp2YXIgaXNTdGF0aWNLZXk7CnZhciBpc1BsYXRmb3JtUmVzZXJ2ZWRUYWc7Cgp2YXIgZ2VuU3RhdGljS2V5c0NhY2hlZCA9IGNhY2hlZChnZW5TdGF0aWNLZXlzJDEpOwoKLyoqCiAqIEdvYWwgb2YgdGhlIG9wdGltaXplcjogd2FsayB0aGUgZ2VuZXJhdGVkIHRlbXBsYXRlIEFTVCB0cmVlCiAqIGFuZCBkZXRlY3Qgc3ViLXRyZWVzIHRoYXQgYXJlIHB1cmVseSBzdGF0aWMsIGkuZS4gcGFydHMgb2YKICogdGhlIERPTSB0aGF0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZS4KICoKICogT25jZSB3ZSBkZXRlY3QgdGhlc2Ugc3ViLXRyZWVzLCB3ZSBjYW46CiAqCiAqIDEuIEhvaXN0IHRoZW0gaW50byBjb25zdGFudHMsIHNvIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8KICogICAgY3JlYXRlIGZyZXNoIG5vZGVzIGZvciB0aGVtIG9uIGVhY2ggcmUtcmVuZGVyOwogKiAyLiBDb21wbGV0ZWx5IHNraXAgdGhlbSBpbiB0aGUgcGF0Y2hpbmcgcHJvY2Vzcy4KICovCmZ1bmN0aW9uIG9wdGltaXplIChyb290LCBvcHRpb25zKSB7CiAgaWYgKCFyb290KSB7IHJldHVybiB9CiAgaXNTdGF0aWNLZXkgPSBnZW5TdGF0aWNLZXlzQ2FjaGVkKG9wdGlvbnMuc3RhdGljS2V5cyB8fCAnJyk7CiAgaXNQbGF0Zm9ybVJlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIC8vIGZpcnN0IHBhc3M6IG1hcmsgYWxsIG5vbi1zdGF0aWMgbm9kZXMuCiAgbWFya1N0YXRpYyQxKHJvb3QpOwogIC8vIHNlY29uZCBwYXNzOiBtYXJrIHN0YXRpYyByb290cy4KICBtYXJrU3RhdGljUm9vdHMocm9vdCwgZmFsc2UpOwp9CgpmdW5jdGlvbiBnZW5TdGF0aWNLZXlzJDEgKGtleXMpIHsKICByZXR1cm4gbWFrZU1hcCgKICAgICd0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzJyArCiAgICAoa2V5cyA/ICcsJyArIGtleXMgOiAnJykKICApCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMkMSAobm9kZSkgewogIG5vZGUuc3RhdGljID0gaXNTdGF0aWMobm9kZSk7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgLy8gZG8gbm90IG1ha2UgY29tcG9uZW50IHNsb3QgY29udGVudCBzdGF0aWMuIHRoaXMgYXZvaWRzCiAgICAvLyAxLiBjb21wb25lbnRzIG5vdCBhYmxlIHRvIG11dGF0ZSBzbG90IG5vZGVzCiAgICAvLyAyLiBzdGF0aWMgc2xvdCBjb250ZW50IGZhaWxzIGZvciBob3QtcmVsb2FkaW5nCiAgICBpZiAoCiAgICAgICFpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcobm9kZS50YWcpICYmCiAgICAgIG5vZGUudGFnICE9PSAnc2xvdCcgJiYKICAgICAgbm9kZS5hdHRyc01hcFsnaW5saW5lLXRlbXBsYXRlJ10gPT0gbnVsbAogICAgKSB7CiAgICAgIHJldHVybgogICAgfQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldOwogICAgICBtYXJrU3RhdGljJDEoY2hpbGQpOwogICAgICBpZiAoIWNoaWxkLnN0YXRpYykgewogICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICB2YXIgYmxvY2sgPSBub2RlLmlmQ29uZGl0aW9uc1tpJDFdLmJsb2NrOwogICAgICAgIG1hcmtTdGF0aWMkMShibG9jayk7CiAgICAgICAgaWYgKCFibG9jay5zdGF0aWMpIHsKICAgICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljUm9vdHMgKG5vZGUsIGlzSW5Gb3IpIHsKICBpZiAobm9kZS50eXBlID09PSAxKSB7CiAgICBpZiAobm9kZS5zdGF0aWMgfHwgbm9kZS5vbmNlKSB7CiAgICAgIG5vZGUuc3RhdGljSW5Gb3IgPSBpc0luRm9yOwogICAgfQogICAgLy8gRm9yIGEgbm9kZSB0byBxdWFsaWZ5IGFzIGEgc3RhdGljIHJvb3QsIGl0IHNob3VsZCBoYXZlIGNoaWxkcmVuIHRoYXQKICAgIC8vIGFyZSBub3QganVzdCBzdGF0aWMgdGV4dC4gT3RoZXJ3aXNlIHRoZSBjb3N0IG9mIGhvaXN0aW5nIG91dCB3aWxsCiAgICAvLyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgYW5kIGl0J3MgYmV0dGVyIG9mZiB0byBqdXN0IGFsd2F5cyByZW5kZXIgaXQgZnJlc2guCiAgICBpZiAobm9kZS5zdGF0aWMgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgISgKICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYKICAgICAgbm9kZS5jaGlsZHJlblswXS50eXBlID09PSAzCiAgICApKSB7CiAgICAgIG5vZGUuc3RhdGljUm9vdCA9IHRydWU7CiAgICAgIHJldHVybgogICAgfSBlbHNlIHsKICAgICAgbm9kZS5zdGF0aWNSb290ID0gZmFsc2U7CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgbWFya1N0YXRpY1Jvb3RzKG5vZGUuY2hpbGRyZW5baV0sIGlzSW5Gb3IgfHwgISFub2RlLmZvcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICBtYXJrU3RhdGljUm9vdHMobm9kZS5pZkNvbmRpdGlvbnNbaSQxXS5ibG9jaywgaXNJbkZvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGlzU3RhdGljIChub2RlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMikgeyAvLyBleHByZXNzaW9uCiAgICByZXR1cm4gZmFsc2UKICB9CiAgaWYgKG5vZGUudHlwZSA9PT0gMykgeyAvLyB0ZXh0CiAgICByZXR1cm4gdHJ1ZQogIH0KICByZXR1cm4gISEobm9kZS5wcmUgfHwgKAogICAgIW5vZGUuaGFzQmluZGluZ3MgJiYgLy8gbm8gZHluYW1pYyBiaW5kaW5ncwogICAgIW5vZGUuaWYgJiYgIW5vZGUuZm9yICYmIC8vIG5vdCB2LWlmIG9yIHYtZm9yIG9yIHYtZWxzZQogICAgIWlzQnVpbHRJblRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgYnVpbHQtaW4KICAgIGlzUGxhdGZvcm1SZXNlcnZlZFRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgY29tcG9uZW50CiAgICAhaXNEaXJlY3RDaGlsZE9mVGVtcGxhdGVGb3Iobm9kZSkgJiYKICAgIE9iamVjdC5rZXlzKG5vZGUpLmV2ZXJ5KGlzU3RhdGljS2V5KQogICkpCn0KCmZ1bmN0aW9uIGlzRGlyZWN0Q2hpbGRPZlRlbXBsYXRlRm9yIChub2RlKSB7CiAgd2hpbGUgKG5vZGUucGFyZW50KSB7CiAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICBpZiAobm9kZS50YWcgIT09ICd0ZW1wbGF0ZScpIHsKICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgICBpZiAobm9kZS5mb3IpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlCn0KCi8qICAqLwoKdmFyIGZuRXhwUkUgPSAvXihbXHckX10rfFwoW14pXSo/XCkpXHMqPT58XmZ1bmN0aW9uXHMqXCgvOwp2YXIgc2ltcGxlUGF0aFJFID0gL15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLzsKCi8vIEtleWJvYXJkRXZlbnQua2V5Q29kZSBhbGlhc2VzCnZhciBrZXlDb2RlcyA9IHsKICBlc2M6IDI3LAogIHRhYjogOSwKICBlbnRlcjogMTMsCiAgc3BhY2U6IDMyLAogIHVwOiAzOCwKICBsZWZ0OiAzNywKICByaWdodDogMzksCiAgZG93bjogNDAsCiAgJ2RlbGV0ZSc6IFs4LCA0Nl0KfTsKCi8vIEtleWJvYXJkRXZlbnQua2V5IGFsaWFzZXMKdmFyIGtleU5hbWVzID0gewogIGVzYzogJ0VzY2FwZScsCiAgdGFiOiAnVGFiJywKICBlbnRlcjogJ0VudGVyJywKICBzcGFjZTogJyAnLAogIC8vICM3ODA2OiBJRTExIHVzZXMga2V5IG5hbWVzIHdpdGhvdXQgYEFycm93YCBwcmVmaXggZm9yIGFycm93IGtleXMuCiAgdXA6IFsnVXAnLCAnQXJyb3dVcCddLAogIGxlZnQ6IFsnTGVmdCcsICdBcnJvd0xlZnQnXSwKICByaWdodDogWydSaWdodCcsICdBcnJvd1JpZ2h0J10sCiAgZG93bjogWydEb3duJywgJ0Fycm93RG93biddLAogICdkZWxldGUnOiBbJ0JhY2tzcGFjZScsICdEZWxldGUnXQp9OwoKLy8gIzQ4Njg6IG1vZGlmaWVycyB0aGF0IHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbGlzdGVuZXIKLy8gbmVlZCB0byBleHBsaWNpdGx5IHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIHRvIHJlbW92ZQovLyB0aGUgbGlzdGVuZXIgZm9yIC5vbmNlCnZhciBnZW5HdWFyZCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHsgcmV0dXJuICgiaWYoIiArIGNvbmRpdGlvbiArICIpcmV0dXJuIG51bGw7Iik7IH07Cgp2YXIgbW9kaWZpZXJDb2RlID0gewogIHN0b3A6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JywKICBwcmV2ZW50OiAnJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JywKICBzZWxmOiBnZW5HdWFyZCgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSwKICBjdHJsOiBnZW5HdWFyZCgiISRldmVudC5jdHJsS2V5IiksCiAgc2hpZnQ6IGdlbkd1YXJkKCIhJGV2ZW50LnNoaWZ0S2V5IiksCiAgYWx0OiBnZW5HdWFyZCgiISRldmVudC5hbHRLZXkiKSwKICBtZXRhOiBnZW5HdWFyZCgiISRldmVudC5tZXRhS2V5IiksCiAgbGVmdDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAwIiksCiAgbWlkZGxlOiBnZW5HdWFyZCgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSwKICByaWdodDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyIikKfTsKCmZ1bmN0aW9uIGdlbkhhbmRsZXJzICgKICBldmVudHMsCiAgaXNOYXRpdmUsCiAgd2FybgopIHsKICB2YXIgcmVzID0gaXNOYXRpdmUgPyAnbmF0aXZlT246eycgOiAnb246eyc7CiAgZm9yICh2YXIgbmFtZSBpbiBldmVudHMpIHsKICAgIHJlcyArPSAiXCIiICsgbmFtZSArICJcIjoiICsgKGdlbkhhbmRsZXIobmFtZSwgZXZlbnRzW25hbWVdKSkgKyAiLCI7CiAgfQogIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ30nCn0KCmZ1bmN0aW9uIGdlbkhhbmRsZXIgKAogIG5hbWUsCiAgaGFuZGxlcgopIHsKICBpZiAoIWhhbmRsZXIpIHsKICAgIHJldHVybiAnZnVuY3Rpb24oKXt9JwogIH0KCiAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHsKICAgIHJldHVybiAoIlsiICsgKGhhbmRsZXIubWFwKGZ1bmN0aW9uIChoYW5kbGVyKSB7IHJldHVybiBnZW5IYW5kbGVyKG5hbWUsIGhhbmRsZXIpOyB9KS5qb2luKCcsJykpICsgIl0iKQogIH0KCiAgdmFyIGlzTWV0aG9kUGF0aCA9IHNpbXBsZVBhdGhSRS50ZXN0KGhhbmRsZXIudmFsdWUpOwogIHZhciBpc0Z1bmN0aW9uRXhwcmVzc2lvbiA9IGZuRXhwUkUudGVzdChoYW5kbGVyLnZhbHVlKTsKCiAgaWYgKCFoYW5kbGVyLm1vZGlmaWVycykgewogICAgaWYgKGlzTWV0aG9kUGF0aCB8fCBpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gaGFuZGxlci52YWx1ZQogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICByZXR1cm4gKCJmdW5jdGlvbigkZXZlbnQpeyIgKyAoaGFuZGxlci52YWx1ZSkgKyAifSIpIC8vIGlubGluZSBzdGF0ZW1lbnQKICB9IGVsc2UgewogICAgdmFyIGNvZGUgPSAnJzsKICAgIHZhciBnZW5Nb2RpZmllckNvZGUgPSAnJzsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gaGFuZGxlci5tb2RpZmllcnMpIHsKICAgICAgaWYgKG1vZGlmaWVyQ29kZVtrZXldKSB7CiAgICAgICAgZ2VuTW9kaWZpZXJDb2RlICs9IG1vZGlmaWVyQ29kZVtrZXldOwogICAgICAgIC8vIGxlZnQvcmlnaHQKICAgICAgICBpZiAoa2V5Q29kZXNba2V5XSkgewogICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4YWN0JykgewogICAgICAgIHZhciBtb2RpZmllcnMgPSAoaGFuZGxlci5tb2RpZmllcnMpOwogICAgICAgIGdlbk1vZGlmaWVyQ29kZSArPSBnZW5HdWFyZCgKICAgICAgICAgIFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnbWV0YSddCiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleU1vZGlmaWVyKSB7IHJldHVybiAhbW9kaWZpZXJzW2tleU1vZGlmaWVyXTsgfSkKICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5TW9kaWZpZXIpIHsgcmV0dXJuICgiJGV2ZW50LiIgKyBrZXlNb2RpZmllciArICJLZXkiKTsgfSkKICAgICAgICAgICAgLmpvaW4oJ3x8JykKICAgICAgICApOwogICAgICB9IGVsc2UgewogICAgICAgIGtleXMucHVzaChrZXkpOwogICAgICB9CiAgICB9CiAgICBpZiAoa2V5cy5sZW5ndGgpIHsKICAgICAgY29kZSArPSBnZW5LZXlGaWx0ZXIoa2V5cyk7CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgbW9kaWZpZXJzIGxpa2UgcHJldmVudCBhbmQgc3RvcCBnZXQgZXhlY3V0ZWQgYWZ0ZXIga2V5IGZpbHRlcmluZwogICAgaWYgKGdlbk1vZGlmaWVyQ29kZSkgewogICAgICBjb2RlICs9IGdlbk1vZGlmaWVyQ29kZTsKICAgIH0KICAgIHZhciBoYW5kbGVyQ29kZSA9IGlzTWV0aG9kUGF0aAogICAgICA/ICgicmV0dXJuICIgKyAoaGFuZGxlci52YWx1ZSkgKyAiKCRldmVudCkiKQogICAgICA6IGlzRnVuY3Rpb25FeHByZXNzaW9uCiAgICAgICAgPyAoInJldHVybiAoIiArIChoYW5kbGVyLnZhbHVlKSArICIpKCRldmVudCkiKQogICAgICAgIDogaGFuZGxlci52YWx1ZTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgcmV0dXJuICgiZnVuY3Rpb24oJGV2ZW50KXsiICsgY29kZSArIGhhbmRsZXJDb2RlICsgIn0iKQogIH0KfQoKZnVuY3Rpb24gZ2VuS2V5RmlsdGVyIChrZXlzKSB7CiAgcmV0dXJuICgiaWYoISgnYnV0dG9uJyBpbiAkZXZlbnQpJiYiICsgKGtleXMubWFwKGdlbkZpbHRlckNvZGUpLmpvaW4oJyYmJykpICsgIilyZXR1cm4gbnVsbDsiKQp9CgpmdW5jdGlvbiBnZW5GaWx0ZXJDb2RlIChrZXkpIHsKICB2YXIga2V5VmFsID0gcGFyc2VJbnQoa2V5LCAxMCk7CiAgaWYgKGtleVZhbCkgewogICAgcmV0dXJuICgiJGV2ZW50LmtleUNvZGUhPT0iICsga2V5VmFsKQogIH0KICB2YXIga2V5Q29kZSA9IGtleUNvZGVzW2tleV07CiAgdmFyIGtleU5hbWUgPSBrZXlOYW1lc1trZXldOwogIHJldHVybiAoCiAgICAiX2soJGV2ZW50LmtleUNvZGUsIiArCiAgICAoSlNPTi5zdHJpbmdpZnkoa2V5KSkgKyAiLCIgKwogICAgKEpTT04uc3RyaW5naWZ5KGtleUNvZGUpKSArICIsIiArCiAgICAiJGV2ZW50LmtleSwiICsKICAgICIiICsgKEpTT04uc3RyaW5naWZ5KGtleU5hbWUpKSArCiAgICAiKSIKICApCn0KCi8qICAqLwoKZnVuY3Rpb24gb24gKGVsLCBkaXIpIHsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRpci5tb2RpZmllcnMpIHsKICAgIHdhcm4oInYtb24gd2l0aG91dCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IG1vZGlmaWVycy4iKTsKICB9CiAgZWwud3JhcExpc3RlbmVycyA9IGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiAoIl9nKCIgKyBjb2RlICsgIiwiICsgKGRpci52YWx1ZSkgKyAiKSIpOyB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGJpbmQkMSAoZWwsIGRpcikgewogIGVsLndyYXBEYXRhID0gZnVuY3Rpb24gKGNvZGUpIHsKICAgIHJldHVybiAoIl9iKCIgKyBjb2RlICsgIiwnIiArIChlbC50YWcpICsgIicsIiArIChkaXIudmFsdWUpICsgIiwiICsgKGRpci5tb2RpZmllcnMgJiYgZGlyLm1vZGlmaWVycy5wcm9wID8gJ3RydWUnIDogJ2ZhbHNlJykgKyAoZGlyLm1vZGlmaWVycyAmJiBkaXIubW9kaWZpZXJzLnN5bmMgPyAnLHRydWUnIDogJycpICsgIikiKQogIH07Cn0KCi8qICAqLwoKdmFyIGJhc2VEaXJlY3RpdmVzID0gewogIG9uOiBvbiwKICBiaW5kOiBiaW5kJDEsCiAgY2xvYWs6IG5vb3AKfQoKLyogICovCgp2YXIgQ29kZWdlblN0YXRlID0gZnVuY3Rpb24gQ29kZWdlblN0YXRlIChvcHRpb25zKSB7CiAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICB0aGlzLndhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CiAgdGhpcy50cmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICd0cmFuc2Zvcm1Db2RlJyk7CiAgdGhpcy5kYXRhR2VuRm5zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdnZW5EYXRhJyk7CiAgdGhpcy5kaXJlY3RpdmVzID0gZXh0ZW5kKGV4dGVuZCh7fSwgYmFzZURpcmVjdGl2ZXMpLCBvcHRpb25zLmRpcmVjdGl2ZXMpOwogIHZhciBpc1Jlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIHRoaXMubWF5YmVDb21wb25lbnQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICFpc1Jlc2VydmVkVGFnKGVsLnRhZyk7IH07CiAgdGhpcy5vbmNlSWQgPSAwOwogIHRoaXMuc3RhdGljUmVuZGVyRm5zID0gW107Cn07CgoKCmZ1bmN0aW9uIGdlbmVyYXRlICgKICBhc3QsCiAgb3B0aW9ucwopIHsKICB2YXIgc3RhdGUgPSBuZXcgQ29kZWdlblN0YXRlKG9wdGlvbnMpOwogIHZhciBjb2RlID0gYXN0ID8gZ2VuRWxlbWVudChhc3QsIHN0YXRlKSA6ICdfYygiZGl2IiknOwogIHJldHVybiB7CiAgICByZW5kZXI6ICgid2l0aCh0aGlzKXtyZXR1cm4gIiArIGNvZGUgKyAifSIpLAogICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMKICB9Cn0KCmZ1bmN0aW9uIGdlbkVsZW1lbnQgKGVsLCBzdGF0ZSkgewogIGlmIChlbC5zdGF0aWNSb290ICYmICFlbC5zdGF0aWNQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5TdGF0aWMoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwub25jZSAmJiAhZWwub25jZVByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbk9uY2UoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuZm9yICYmICFlbC5mb3JQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5Gb3IoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuaWYgJiYgIWVsLmlmUHJvY2Vzc2VkKSB7CiAgICByZXR1cm4gZ2VuSWYoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwudGFnID09PSAndGVtcGxhdGUnICYmICFlbC5zbG90VGFyZ2V0KSB7CiAgICByZXR1cm4gZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlKSB8fCAndm9pZCAwJwogIH0gZWxzZSBpZiAoZWwudGFnID09PSAnc2xvdCcpIHsKICAgIHJldHVybiBnZW5TbG90KGVsLCBzdGF0ZSkKICB9IGVsc2UgewogICAgLy8gY29tcG9uZW50IG9yIGVsZW1lbnQKICAgIHZhciBjb2RlOwogICAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgICBjb2RlID0gZ2VuQ29tcG9uZW50KGVsLmNvbXBvbmVudCwgZWwsIHN0YXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBkYXRhID0gZWwucGxhaW4gPyB1bmRlZmluZWQgOiBnZW5EYXRhJDIoZWwsIHN0YXRlKTsKCiAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmlubGluZVRlbXBsYXRlID8gbnVsbCA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSwgdHJ1ZSk7CiAgICAgIGNvZGUgPSAiX2MoJyIgKyAoZWwudGFnKSArICInIiArIChkYXRhID8gKCIsIiArIGRhdGEpIDogJycpICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKSArICIpIjsKICAgIH0KICAgIC8vIG1vZHVsZSB0cmFuc2Zvcm1zCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLnRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29kZSA9IHN0YXRlLnRyYW5zZm9ybXNbaV0oZWwsIGNvZGUpOwogICAgfQogICAgcmV0dXJuIGNvZGUKICB9Cn0KCi8vIGhvaXN0IHN0YXRpYyBzdWItdHJlZXMgb3V0CmZ1bmN0aW9uIGdlblN0YXRpYyAoZWwsIHN0YXRlKSB7CiAgZWwuc3RhdGljUHJvY2Vzc2VkID0gdHJ1ZTsKICBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMucHVzaCgoIndpdGgodGhpcyl7cmV0dXJuICIgKyAoZ2VuRWxlbWVudChlbCwgc3RhdGUpKSArICJ9IikpOwogIHJldHVybiAoIl9tKCIgKyAoc3RhdGUuc3RhdGljUmVuZGVyRm5zLmxlbmd0aCAtIDEpICsgKGVsLnN0YXRpY0luRm9yID8gJyx0cnVlJyA6ICcnKSArICIpIikKfQoKLy8gdi1vbmNlCmZ1bmN0aW9uIGdlbk9uY2UgKGVsLCBzdGF0ZSkgewogIGVsLm9uY2VQcm9jZXNzZWQgPSB0cnVlOwogIGlmIChlbC5pZiAmJiAhZWwuaWZQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5JZihlbCwgc3RhdGUpCiAgfSBlbHNlIGlmIChlbC5zdGF0aWNJbkZvcikgewogICAgdmFyIGtleSA9ICcnOwogICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgaWYgKHBhcmVudC5mb3IpIHsKICAgICAgICBrZXkgPSBwYXJlbnQua2V5OwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGlmICgha2V5KSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzdGF0ZS53YXJuKAogICAgICAgICJ2LW9uY2UgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgdi1mb3IgdGhhdCBpcyBrZXllZC4gIgogICAgICApOwogICAgICByZXR1cm4gZ2VuRWxlbWVudChlbCwgc3RhdGUpCiAgICB9CiAgICByZXR1cm4gKCJfbygiICsgKGdlbkVsZW1lbnQoZWwsIHN0YXRlKSkgKyAiLCIgKyAoc3RhdGUub25jZUlkKyspICsgIiwiICsga2V5ICsgIikiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuU3RhdGljKGVsLCBzdGF0ZSkKICB9Cn0KCmZ1bmN0aW9uIGdlbklmICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0RW1wdHkKKSB7CiAgZWwuaWZQcm9jZXNzZWQgPSB0cnVlOyAvLyBhdm9pZCByZWN1cnNpb24KICByZXR1cm4gZ2VuSWZDb25kaXRpb25zKGVsLmlmQ29uZGl0aW9ucy5zbGljZSgpLCBzdGF0ZSwgYWx0R2VuLCBhbHRFbXB0eSkKfQoKZnVuY3Rpb24gZ2VuSWZDb25kaXRpb25zICgKICBjb25kaXRpb25zLAogIHN0YXRlLAogIGFsdEdlbiwKICBhbHRFbXB0eQopIHsKICBpZiAoIWNvbmRpdGlvbnMubGVuZ3RoKSB7CiAgICByZXR1cm4gYWx0RW1wdHkgfHwgJ19lKCknCiAgfQoKICB2YXIgY29uZGl0aW9uID0gY29uZGl0aW9ucy5zaGlmdCgpOwogIGlmIChjb25kaXRpb24uZXhwKSB7CiAgICByZXR1cm4gKCIoIiArIChjb25kaXRpb24uZXhwKSArICIpPyIgKyAoZ2VuVGVybmFyeUV4cChjb25kaXRpb24uYmxvY2spKSArICI6IiArIChnZW5JZkNvbmRpdGlvbnMoY29uZGl0aW9ucywgc3RhdGUsIGFsdEdlbiwgYWx0RW1wdHkpKSkKICB9IGVsc2UgewogICAgcmV0dXJuICgiIiArIChnZW5UZXJuYXJ5RXhwKGNvbmRpdGlvbi5ibG9jaykpKQogIH0KCiAgLy8gdi1pZiB3aXRoIHYtb25jZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBsaWtlIChhKT9fbSgwKTpfbSgxKQogIGZ1bmN0aW9uIGdlblRlcm5hcnlFeHAgKGVsKSB7CiAgICByZXR1cm4gYWx0R2VuCiAgICAgID8gYWx0R2VuKGVsLCBzdGF0ZSkKICAgICAgOiBlbC5vbmNlCiAgICAgICAgPyBnZW5PbmNlKGVsLCBzdGF0ZSkKICAgICAgICA6IGdlbkVsZW1lbnQoZWwsIHN0YXRlKQogIH0KfQoKZnVuY3Rpb24gZ2VuRm9yICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0SGVscGVyCikgewogIHZhciBleHAgPSBlbC5mb3I7CiAgdmFyIGFsaWFzID0gZWwuYWxpYXM7CiAgdmFyIGl0ZXJhdG9yMSA9IGVsLml0ZXJhdG9yMSA/ICgiLCIgKyAoZWwuaXRlcmF0b3IxKSkgOiAnJzsKICB2YXIgaXRlcmF0b3IyID0gZWwuaXRlcmF0b3IyID8gKCIsIiArIChlbC5pdGVyYXRvcjIpKSA6ICcnOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICBzdGF0ZS5tYXliZUNvbXBvbmVudChlbCkgJiYKICAgIGVsLnRhZyAhPT0gJ3Nsb3QnICYmCiAgICBlbC50YWcgIT09ICd0ZW1wbGF0ZScgJiYKICAgICFlbC5rZXkKICApIHsKICAgIHN0YXRlLndhcm4oCiAgICAgICI8IiArIChlbC50YWcpICsgIiB2LWZvcj1cIiIgKyBhbGlhcyArICIgaW4gIiArIGV4cCArICJcIj46IGNvbXBvbmVudCBsaXN0cyByZW5kZXJlZCB3aXRoICIgKwogICAgICAidi1mb3Igc2hvdWxkIGhhdmUgZXhwbGljaXQga2V5cy4gIiArCiAgICAgICJTZWUgaHR0cHM6Ly92dWVqcy5vcmcvZ3VpZGUvbGlzdC5odG1sI2tleSBmb3IgbW9yZSBpbmZvLiIsCiAgICAgIHRydWUgLyogdGlwICovCiAgICApOwogIH0KCiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuIChhbHRIZWxwZXIgfHwgJ19sJykgKyAiKCgiICsgZXhwICsgIiksIiArCiAgICAiZnVuY3Rpb24oIiArIGFsaWFzICsgaXRlcmF0b3IxICsgaXRlcmF0b3IyICsgIil7IiArCiAgICAgICJyZXR1cm4gIiArICgoYWx0R2VuIHx8IGdlbkVsZW1lbnQpKGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuRGF0YSQyIChlbCwgc3RhdGUpIHsKICB2YXIgZGF0YSA9ICd7JzsKCiAgLy8gZGlyZWN0aXZlcyBmaXJzdC4KICAvLyBkaXJlY3RpdmVzIG1heSBtdXRhdGUgdGhlIGVsJ3Mgb3RoZXIgcHJvcGVydGllcyBiZWZvcmUgdGhleSBhcmUgZ2VuZXJhdGVkLgogIHZhciBkaXJzID0gZ2VuRGlyZWN0aXZlcyhlbCwgc3RhdGUpOwogIGlmIChkaXJzKSB7IGRhdGEgKz0gZGlycyArICcsJzsgfQoKICAvLyBrZXkKICBpZiAoZWwua2V5KSB7CiAgICBkYXRhICs9ICJrZXk6IiArIChlbC5rZXkpICsgIiwiOwogIH0KICAvLyByZWYKICBpZiAoZWwucmVmKSB7CiAgICBkYXRhICs9ICJyZWY6IiArIChlbC5yZWYpICsgIiwiOwogIH0KICBpZiAoZWwucmVmSW5Gb3IpIHsKICAgIGRhdGEgKz0gInJlZkluRm9yOnRydWUsIjsKICB9CiAgLy8gcHJlCiAgaWYgKGVsLnByZSkgewogICAgZGF0YSArPSAicHJlOnRydWUsIjsKICB9CiAgLy8gcmVjb3JkIG9yaWdpbmFsIHRhZyBuYW1lIGZvciBjb21wb25lbnRzIHVzaW5nICJpcyIgYXR0cmlidXRlCiAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgZGF0YSArPSAidGFnOlwiIiArIChlbC50YWcpICsgIlwiLCI7CiAgfQogIC8vIG1vZHVsZSBkYXRhIGdlbmVyYXRpb24gZnVuY3Rpb25zCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5kYXRhR2VuRm5zLmxlbmd0aDsgaSsrKSB7CiAgICBkYXRhICs9IHN0YXRlLmRhdGFHZW5GbnNbaV0oZWwpOwogIH0KICAvLyBhdHRyaWJ1dGVzCiAgaWYgKGVsLmF0dHJzKSB7CiAgICBkYXRhICs9ICJhdHRyczp7IiArIChnZW5Qcm9wcyhlbC5hdHRycykpICsgIn0sIjsKICB9CiAgLy8gRE9NIHByb3BzCiAgaWYgKGVsLnByb3BzKSB7CiAgICBkYXRhICs9ICJkb21Qcm9wczp7IiArIChnZW5Qcm9wcyhlbC5wcm9wcykpICsgIn0sIjsKICB9CiAgLy8gZXZlbnQgaGFuZGxlcnMKICBpZiAoZWwuZXZlbnRzKSB7CiAgICBkYXRhICs9IChnZW5IYW5kbGVycyhlbC5ldmVudHMsIGZhbHNlLCBzdGF0ZS53YXJuKSkgKyAiLCI7CiAgfQogIGlmIChlbC5uYXRpdmVFdmVudHMpIHsKICAgIGRhdGEgKz0gKGdlbkhhbmRsZXJzKGVsLm5hdGl2ZUV2ZW50cywgdHJ1ZSwgc3RhdGUud2FybikpICsgIiwiOwogIH0KICAvLyBzbG90IHRhcmdldAogIC8vIG9ubHkgZm9yIG5vbi1zY29wZWQgc2xvdHMKICBpZiAoZWwuc2xvdFRhcmdldCAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICBkYXRhICs9ICJzbG90OiIgKyAoZWwuc2xvdFRhcmdldCkgKyAiLCI7CiAgfQogIC8vIHNjb3BlZCBzbG90cwogIGlmIChlbC5zY29wZWRTbG90cykgewogICAgZGF0YSArPSAoZ2VuU2NvcGVkU2xvdHMoZWwuc2NvcGVkU2xvdHMsIHN0YXRlKSkgKyAiLCI7CiAgfQogIC8vIGNvbXBvbmVudCB2LW1vZGVsCiAgaWYgKGVsLm1vZGVsKSB7CiAgICBkYXRhICs9ICJtb2RlbDp7dmFsdWU6IiArIChlbC5tb2RlbC52YWx1ZSkgKyAiLGNhbGxiYWNrOiIgKyAoZWwubW9kZWwuY2FsbGJhY2spICsgIixleHByZXNzaW9uOiIgKyAoZWwubW9kZWwuZXhwcmVzc2lvbikgKyAifSwiOwogIH0KICAvLyBpbmxpbmUtdGVtcGxhdGUKICBpZiAoZWwuaW5saW5lVGVtcGxhdGUpIHsKICAgIHZhciBpbmxpbmVUZW1wbGF0ZSA9IGdlbklubGluZVRlbXBsYXRlKGVsLCBzdGF0ZSk7CiAgICBpZiAoaW5saW5lVGVtcGxhdGUpIHsKICAgICAgZGF0YSArPSBpbmxpbmVUZW1wbGF0ZSArICIsIjsKICAgIH0KICB9CiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLCQvLCAnJykgKyAnfSc7CiAgLy8gdi1iaW5kIGRhdGEgd3JhcAogIGlmIChlbC53cmFwRGF0YSkgewogICAgZGF0YSA9IGVsLndyYXBEYXRhKGRhdGEpOwogIH0KICAvLyB2LW9uIGRhdGEgd3JhcAogIGlmIChlbC53cmFwTGlzdGVuZXJzKSB7CiAgICBkYXRhID0gZWwud3JhcExpc3RlbmVycyhkYXRhKTsKICB9CiAgcmV0dXJuIGRhdGEKfQoKZnVuY3Rpb24gZ2VuRGlyZWN0aXZlcyAoZWwsIHN0YXRlKSB7CiAgdmFyIGRpcnMgPSBlbC5kaXJlY3RpdmVzOwogIGlmICghZGlycykgeyByZXR1cm4gfQogIHZhciByZXMgPSAnZGlyZWN0aXZlczpbJzsKICB2YXIgaGFzUnVudGltZSA9IGZhbHNlOwogIHZhciBpLCBsLCBkaXIsIG5lZWRSdW50aW1lOwogIGZvciAoaSA9IDAsIGwgPSBkaXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIG5lZWRSdW50aW1lID0gdHJ1ZTsKICAgIHZhciBnZW4gPSBzdGF0ZS5kaXJlY3RpdmVzW2Rpci5uYW1lXTsKICAgIGlmIChnZW4pIHsKICAgICAgLy8gY29tcGlsZS10aW1lIGRpcmVjdGl2ZSB0aGF0IG1hbmlwdWxhdGVzIEFTVC4KICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IGFsc28gbmVlZHMgYSBydW50aW1lIGNvdW50ZXJwYXJ0LgogICAgICBuZWVkUnVudGltZSA9ICEhZ2VuKGVsLCBkaXIsIHN0YXRlLndhcm4pOwogICAgfQogICAgaWYgKG5lZWRSdW50aW1lKSB7CiAgICAgIGhhc1J1bnRpbWUgPSB0cnVlOwogICAgICByZXMgKz0gIntuYW1lOlwiIiArIChkaXIubmFtZSkgKyAiXCIscmF3TmFtZTpcIiIgKyAoZGlyLnJhd05hbWUpICsgIlwiIiArIChkaXIudmFsdWUgPyAoIix2YWx1ZTooIiArIChkaXIudmFsdWUpICsgIiksZXhwcmVzc2lvbjoiICsgKEpTT04uc3RyaW5naWZ5KGRpci52YWx1ZSkpKSA6ICcnKSArIChkaXIuYXJnID8gKCIsYXJnOlwiIiArIChkaXIuYXJnKSArICJcIiIpIDogJycpICsgKGRpci5tb2RpZmllcnMgPyAoIixtb2RpZmllcnM6IiArIChKU09OLnN0cmluZ2lmeShkaXIubW9kaWZpZXJzKSkpIDogJycpICsgIn0sIjsKICAgIH0KICB9CiAgaWYgKGhhc1J1bnRpbWUpIHsKICAgIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ10nCiAgfQp9CgpmdW5jdGlvbiBnZW5JbmxpbmVUZW1wbGF0ZSAoZWwsIHN0YXRlKSB7CiAgdmFyIGFzdCA9IGVsLmNoaWxkcmVuWzBdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgKAogICAgZWwuY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGFzdC50eXBlICE9PSAxCiAgKSkgewogICAgc3RhdGUud2FybignSW5saW5lLXRlbXBsYXRlIGNvbXBvbmVudHMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGVsZW1lbnQuJyk7CiAgfQogIGlmIChhc3QudHlwZSA9PT0gMSkgewogICAgdmFyIGlubGluZVJlbmRlckZucyA9IGdlbmVyYXRlKGFzdCwgc3RhdGUub3B0aW9ucyk7CiAgICByZXR1cm4gKCJpbmxpbmVUZW1wbGF0ZTp7cmVuZGVyOmZ1bmN0aW9uKCl7IiArIChpbmxpbmVSZW5kZXJGbnMucmVuZGVyKSArICJ9LHN0YXRpY1JlbmRlckZuczpbIiArIChpbmxpbmVSZW5kZXJGbnMuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gKCJmdW5jdGlvbigpeyIgKyBjb2RlICsgIn0iKTsgfSkuam9pbignLCcpKSArICJdfSIpCiAgfQp9CgpmdW5jdGlvbiBnZW5TY29wZWRTbG90cyAoCiAgc2xvdHMsCiAgc3RhdGUKKSB7CiAgcmV0dXJuICgic2NvcGVkU2xvdHM6X3UoWyIgKyAoT2JqZWN0LmtleXMoc2xvdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7CiAgICAgIHJldHVybiBnZW5TY29wZWRTbG90KGtleSwgc2xvdHNba2V5XSwgc3RhdGUpCiAgICB9KS5qb2luKCcsJykpICsgIl0pIikKfQoKZnVuY3Rpb24gZ2VuU2NvcGVkU2xvdCAoCiAga2V5LAogIGVsLAogIHN0YXRlCikgewogIGlmIChlbC5mb3IgJiYgIWVsLmZvclByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbkZvclNjb3BlZFNsb3Qoa2V5LCBlbCwgc3RhdGUpCiAgfQogIHZhciBmbiA9ICJmdW5jdGlvbigiICsgKFN0cmluZyhlbC5zbG90U2NvcGUpKSArICIpeyIgKwogICAgInJldHVybiAiICsgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJwogICAgICA/IGVsLmlmCiAgICAgICAgPyAoKGVsLmlmKSArICI/IiArIChnZW5DaGlsZHJlbihlbCwgc3RhdGUpIHx8ICd1bmRlZmluZWQnKSArICI6dW5kZWZpbmVkIikKICAgICAgICA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSkgfHwgJ3VuZGVmaW5lZCcKICAgICAgOiBnZW5FbGVtZW50KGVsLCBzdGF0ZSkpICsgIn0iOwogIHJldHVybiAoIntrZXk6IiArIGtleSArICIsZm46IiArIGZuICsgIn0iKQp9CgpmdW5jdGlvbiBnZW5Gb3JTY29wZWRTbG90ICgKICBrZXksCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGV4cCA9IGVsLmZvcjsKICB2YXIgYWxpYXMgPSBlbC5hbGlhczsKICB2YXIgaXRlcmF0b3IxID0gZWwuaXRlcmF0b3IxID8gKCIsIiArIChlbC5pdGVyYXRvcjEpKSA6ICcnOwogIHZhciBpdGVyYXRvcjIgPSBlbC5pdGVyYXRvcjIgPyAoIiwiICsgKGVsLml0ZXJhdG9yMikpIDogJyc7CiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuICJfbCgoIiArIGV4cCArICIpLCIgKwogICAgImZ1bmN0aW9uKCIgKyBhbGlhcyArIGl0ZXJhdG9yMSArIGl0ZXJhdG9yMiArICIpeyIgKwogICAgICAicmV0dXJuICIgKyAoZ2VuU2NvcGVkU2xvdChrZXksIGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuQ2hpbGRyZW4gKAogIGVsLAogIHN0YXRlLAogIGNoZWNrU2tpcCwKICBhbHRHZW5FbGVtZW50LAogIGFsdEdlbk5vZGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47CiAgaWYgKGNoaWxkcmVuLmxlbmd0aCkgewogICAgdmFyIGVsJDEgPSBjaGlsZHJlblswXTsKICAgIC8vIG9wdGltaXplIHNpbmdsZSB2LWZvcgogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJgogICAgICBlbCQxLmZvciAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3Nsb3QnCiAgICApIHsKICAgICAgcmV0dXJuIChhbHRHZW5FbGVtZW50IHx8IGdlbkVsZW1lbnQpKGVsJDEsIHN0YXRlKQogICAgfQogICAgdmFyIG5vcm1hbGl6YXRpb25UeXBlID0gY2hlY2tTa2lwCiAgICAgID8gZ2V0Tm9ybWFsaXphdGlvblR5cGUoY2hpbGRyZW4sIHN0YXRlLm1heWJlQ29tcG9uZW50KQogICAgICA6IDA7CiAgICB2YXIgZ2VuID0gYWx0R2VuTm9kZSB8fCBnZW5Ob2RlOwogICAgcmV0dXJuICgiWyIgKyAoY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBnZW4oYywgc3RhdGUpOyB9KS5qb2luKCcsJykpICsgIl0iICsgKG5vcm1hbGl6YXRpb25UeXBlID8gKCIsIiArIG5vcm1hbGl6YXRpb25UeXBlKSA6ICcnKSkKICB9Cn0KCi8vIGRldGVybWluZSB0aGUgbm9ybWFsaXphdGlvbiBuZWVkZWQgZm9yIHRoZSBjaGlsZHJlbiBhcnJheS4KLy8gMDogbm8gbm9ybWFsaXphdGlvbiBuZWVkZWQKLy8gMTogc2ltcGxlIG5vcm1hbGl6YXRpb24gbmVlZGVkIChwb3NzaWJsZSAxLWxldmVsIGRlZXAgbmVzdGVkIGFycmF5KQovLyAyOiBmdWxsIG5vcm1hbGl6YXRpb24gbmVlZGVkCmZ1bmN0aW9uIGdldE5vcm1hbGl6YXRpb25UeXBlICgKICBjaGlsZHJlbiwKICBtYXliZUNvbXBvbmVudAopIHsKICB2YXIgcmVzID0gMDsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZWwgPSBjaGlsZHJlbltpXTsKICAgIGlmIChlbC50eXBlICE9PSAxKSB7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAobmVlZHNOb3JtYWxpemF0aW9uKGVsKSB8fAogICAgICAgIChlbC5pZkNvbmRpdGlvbnMgJiYgZWwuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIG5lZWRzTm9ybWFsaXphdGlvbihjLmJsb2NrKTsgfSkpKSB7CiAgICAgIHJlcyA9IDI7CiAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAobWF5YmVDb21wb25lbnQoZWwpIHx8CiAgICAgICAgKGVsLmlmQ29uZGl0aW9ucyAmJiBlbC5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gbWF5YmVDb21wb25lbnQoYy5ibG9jayk7IH0pKSkgewogICAgICByZXMgPSAxOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIG5lZWRzTm9ybWFsaXphdGlvbiAoZWwpIHsKICByZXR1cm4gZWwuZm9yICE9PSB1bmRlZmluZWQgfHwgZWwudGFnID09PSAndGVtcGxhdGUnIHx8IGVsLnRhZyA9PT0gJ3Nsb3QnCn0KCmZ1bmN0aW9uIGdlbk5vZGUgKG5vZGUsIHN0YXRlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgcmV0dXJuIGdlbkVsZW1lbnQobm9kZSwgc3RhdGUpCiAgfSBpZiAobm9kZS50eXBlID09PSAzICYmIG5vZGUuaXNDb21tZW50KSB7CiAgICByZXR1cm4gZ2VuQ29tbWVudChub2RlKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuVGV4dChub2RlKQogIH0KfQoKZnVuY3Rpb24gZ2VuVGV4dCAodGV4dCkgewogIHJldHVybiAoIl92KCIgKyAodGV4dC50eXBlID09PSAyCiAgICA/IHRleHQuZXhwcmVzc2lvbiAvLyBubyBuZWVkIGZvciAoKSBiZWNhdXNlIGFscmVhZHkgd3JhcHBlZCBpbiBfcygpCiAgICA6IHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyhKU09OLnN0cmluZ2lmeSh0ZXh0LnRleHQpKSkgKyAiKSIpCn0KCmZ1bmN0aW9uIGdlbkNvbW1lbnQgKGNvbW1lbnQpIHsKICByZXR1cm4gKCJfZSgiICsgKEpTT04uc3RyaW5naWZ5KGNvbW1lbnQudGV4dCkpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5TbG90IChlbCwgc3RhdGUpIHsKICB2YXIgc2xvdE5hbWUgPSBlbC5zbG90TmFtZSB8fCAnImRlZmF1bHQiJzsKICB2YXIgY2hpbGRyZW4gPSBnZW5DaGlsZHJlbihlbCwgc3RhdGUpOwogIHZhciByZXMgPSAiX3QoIiArIHNsb3ROYW1lICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKTsKICB2YXIgYXR0cnMgPSBlbC5hdHRycyAmJiAoInsiICsgKGVsLmF0dHJzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChjYW1lbGl6ZShhLm5hbWUpKSArICI6IiArIChhLnZhbHVlKSk7IH0pLmpvaW4oJywnKSkgKyAifSIpOwogIHZhciBiaW5kJCQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZCddOwogIGlmICgoYXR0cnMgfHwgYmluZCQkMSkgJiYgIWNoaWxkcmVuKSB7CiAgICByZXMgKz0gIixudWxsIjsKICB9CiAgaWYgKGF0dHJzKSB7CiAgICByZXMgKz0gIiwiICsgYXR0cnM7CiAgfQogIGlmIChiaW5kJCQxKSB7CiAgICByZXMgKz0gKGF0dHJzID8gJycgOiAnLG51bGwnKSArICIsIiArIGJpbmQkJDE7CiAgfQogIHJldHVybiByZXMgKyAnKScKfQoKLy8gY29tcG9uZW50TmFtZSBpcyBlbC5jb21wb25lbnQsIHRha2UgaXQgYXMgYXJndW1lbnQgdG8gc2h1biBmbG93J3MgcGVzc2ltaXN0aWMgcmVmaW5lbWVudApmdW5jdGlvbiBnZW5Db21wb25lbnQgKAogIGNvbXBvbmVudE5hbWUsCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuaW5saW5lVGVtcGxhdGUgPyBudWxsIDogZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlLCB0cnVlKTsKICByZXR1cm4gKCJfYygiICsgY29tcG9uZW50TmFtZSArICIsIiArIChnZW5EYXRhJDIoZWwsIHN0YXRlKSkgKyAoY2hpbGRyZW4gPyAoIiwiICsgY2hpbGRyZW4pIDogJycpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5Qcm9wcyAocHJvcHMpIHsKICB2YXIgcmVzID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgdmFyIHByb3AgPSBwcm9wc1tpXTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICByZXMgKz0gIlwiIiArIChwcm9wLm5hbWUpICsgIlwiOiIgKyAodHJhbnNmb3JtU3BlY2lhbE5ld2xpbmVzKHByb3AudmFsdWUpKSArICIsIjsKICAgIH0KICB9CiAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkKfQoKLy8gIzM4OTUsICM0MjY4CmZ1bmN0aW9uIHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyAodGV4dCkgewogIHJldHVybiB0ZXh0CiAgICAucmVwbGFjZSgvXHUyMDI4L2csICdcXHUyMDI4JykKICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKQp9CgovKiAgKi8KCi8vIHRoZXNlIGtleXdvcmRzIHNob3VsZCBub3QgYXBwZWFyIGluc2lkZSBleHByZXNzaW9ucywgYnV0IG9wZXJhdG9ycyBsaWtlCi8vIHR5cGVvZiwgaW5zdGFuY2VvZiBhbmQgaW4gYXJlIGFsbG93ZWQKdmFyIHByb2hpYml0ZWRLZXl3b3JkUkUgPSBuZXcgUmVnRXhwKCdcXGInICsgKAogICdkbyxpZixmb3IsbGV0LG5ldyx0cnksdmFyLGNhc2UsZWxzZSx3aXRoLGF3YWl0LGJyZWFrLGNhdGNoLGNsYXNzLGNvbnN0LCcgKwogICdzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsJyArCiAgJ2V4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMnCikuc3BsaXQoJywnKS5qb2luKCdcXGJ8XFxiJykgKyAnXFxiJyk7CgovLyB0aGVzZSB1bmFyeSBvcGVyYXRvcnMgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHByb3BlcnR5L21ldGhvZCBuYW1lcwp2YXIgdW5hcnlPcGVyYXRvcnNSRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyAoCiAgJ2RlbGV0ZSx0eXBlb2Ysdm9pZCcKKS5zcGxpdCgnLCcpLmpvaW4oJ1xccypcXChbXlxcKV0qXFwpfFxcYicpICsgJ1xccypcXChbXlxcKV0qXFwpJyk7CgovLyBzdHJpcCBzdHJpbmdzIGluIGV4cHJlc3Npb25zCnZhciBzdHJpcFN0cmluZ1JFID0gLycoPzpbXidcXF18XFwuKSonfCIoPzpbXiJcXF18XFwuKSoifGAoPzpbXmBcXF18XFwuKSpcJFx7fFx9KD86W15gXFxdfFxcLikqYHxgKD86W15gXFxdfFxcLikqYC9nOwoKLy8gZGV0ZWN0IHByb2JsZW1hdGljIGV4cHJlc3Npb25zIGluIGEgdGVtcGxhdGUKZnVuY3Rpb24gZGV0ZWN0RXJyb3JzIChhc3QpIHsKICB2YXIgZXJyb3JzID0gW107CiAgaWYgKGFzdCkgewogICAgY2hlY2tOb2RlKGFzdCwgZXJyb3JzKTsKICB9CiAgcmV0dXJuIGVycm9ycwp9CgpmdW5jdGlvbiBjaGVja05vZGUgKG5vZGUsIGVycm9ycykgewogIGlmIChub2RlLnR5cGUgPT09IDEpIHsKICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZS5hdHRyc01hcCkgewogICAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuYXR0cnNNYXBbbmFtZV07CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAobmFtZSA9PT0gJ3YtZm9yJykgewogICAgICAgICAgICBjaGVja0Zvcihub2RlLCAoInYtZm9yPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9IGVsc2UgaWYgKG9uUkUudGVzdChuYW1lKSkgewogICAgICAgICAgICBjaGVja0V2ZW50KHZhbHVlLCAobmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIiKSwgZXJyb3JzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoZWNrRXhwcmVzc2lvbih2YWx1ZSwgKG5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGVja05vZGUobm9kZS5jaGlsZHJlbltpXSwgZXJyb3JzKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAyKSB7CiAgICBjaGVja0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBub2RlLnRleHQsIGVycm9ycyk7CiAgfQp9CgpmdW5jdGlvbiBjaGVja0V2ZW50IChleHAsIHRleHQsIGVycm9ycykgewogIHZhciBzdGlwcGVkID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpOwogIHZhciBrZXl3b3JkTWF0Y2ggPSBzdGlwcGVkLm1hdGNoKHVuYXJ5T3BlcmF0b3JzUkUpOwogIGlmIChrZXl3b3JkTWF0Y2ggJiYgc3RpcHBlZC5jaGFyQXQoa2V5d29yZE1hdGNoLmluZGV4IC0gMSkgIT09ICckJykgewogICAgZXJyb3JzLnB1c2goCiAgICAgICJhdm9pZCB1c2luZyBKYXZhU2NyaXB0IHVuYXJ5IG9wZXJhdG9yIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAiXCIiICsgKGtleXdvcmRNYXRjaFswXSkgKyAiXCIgaW4gZXhwcmVzc2lvbiAiICsgKHRleHQudHJpbSgpKQogICAgKTsKICB9CiAgY2hlY2tFeHByZXNzaW9uKGV4cCwgdGV4dCwgZXJyb3JzKTsKfQoKZnVuY3Rpb24gY2hlY2tGb3IgKG5vZGUsIHRleHQsIGVycm9ycykgewogIGNoZWNrRXhwcmVzc2lvbihub2RlLmZvciB8fCAnJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5hbGlhcywgJ3YtZm9yIGFsaWFzJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5pdGVyYXRvcjEsICd2LWZvciBpdGVyYXRvcicsIHRleHQsIGVycm9ycyk7CiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuaXRlcmF0b3IyLCAndi1mb3IgaXRlcmF0b3InLCB0ZXh0LCBlcnJvcnMpOwp9CgpmdW5jdGlvbiBjaGVja0lkZW50aWZpZXIgKAogIGlkZW50LAogIHR5cGUsCiAgdGV4dCwKICBlcnJvcnMKKSB7CiAgaWYgKHR5cGVvZiBpZGVudCA9PT0gJ3N0cmluZycpIHsKICAgIHRyeSB7CiAgICAgIG5ldyBGdW5jdGlvbigoInZhciAiICsgaWRlbnQgKyAiPV8iKSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGVycm9ycy5wdXNoKCgiaW52YWxpZCAiICsgdHlwZSArICIgXCIiICsgaWRlbnQgKyAiXCIgaW4gZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkpKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrRXhwcmVzc2lvbiAoZXhwLCB0ZXh0LCBlcnJvcnMpIHsKICB0cnkgewogICAgbmV3IEZ1bmN0aW9uKCgicmV0dXJuICIgKyBleHApKTsKICB9IGNhdGNoIChlKSB7CiAgICB2YXIga2V5d29yZE1hdGNoID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpLm1hdGNoKHByb2hpYml0ZWRLZXl3b3JkUkUpOwogICAgaWYgKGtleXdvcmRNYXRjaCkgewogICAgICBlcnJvcnMucHVzaCgKICAgICAgICAiYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAgICJcIiIgKyAoa2V5d29yZE1hdGNoWzBdKSArICJcIlxuICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9ycy5wdXNoKAogICAgICAgICJpbnZhbGlkIGV4cHJlc3Npb246ICIgKyAoZS5tZXNzYWdlKSArICIgaW5cblxuIiArCiAgICAgICAgIiAgICAiICsgZXhwICsgIlxuXG4iICsKICAgICAgICAiICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkgKyAiXG4iCiAgICAgICk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uIChjb2RlLCBlcnJvcnMpIHsKICB0cnkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlKQogIH0gY2F0Y2ggKGVycikgewogICAgZXJyb3JzLnB1c2goeyBlcnI6IGVyciwgY29kZTogY29kZSB9KTsKICAgIHJldHVybiBub29wCiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuIChjb21waWxlKSB7CiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBpbGVUb0Z1bmN0aW9ucyAoCiAgICB0ZW1wbGF0ZSwKICAgIG9wdGlvbnMsCiAgICB2bQogICkgewogICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICB2YXIgd2FybiQkMSA9IG9wdGlvbnMud2FybiB8fCB3YXJuOwogICAgZGVsZXRlIG9wdGlvbnMud2FybjsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIHsKICAgICAgLy8gZGV0ZWN0IHBvc3NpYmxlIENTUCByZXN0cmljdGlvbgogICAgICB0cnkgewogICAgICAgIG5ldyBGdW5jdGlvbigncmV0dXJuIDEnKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLnRvU3RyaW5nKCkubWF0Y2goL3Vuc2FmZS1ldmFsfENTUC8pKSB7CiAgICAgICAgICB3YXJuJCQxKAogICAgICAgICAgICAnSXQgc2VlbXMgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhbG9uZSBidWlsZCBvZiBWdWUuanMgaW4gYW4gJyArCiAgICAgICAgICAgICdlbnZpcm9ubWVudCB3aXRoIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IHRoYXQgcHJvaGliaXRzIHVuc2FmZS1ldmFsLiAnICsKICAgICAgICAgICAgJ1RoZSB0ZW1wbGF0ZSBjb21waWxlciBjYW5ub3Qgd29yayBpbiB0aGlzIGVudmlyb25tZW50LiBDb25zaWRlciAnICsKICAgICAgICAgICAgJ3JlbGF4aW5nIHRoZSBwb2xpY3kgdG8gYWxsb3cgdW5zYWZlLWV2YWwgb3IgcHJlLWNvbXBpbGluZyB5b3VyICcgKwogICAgICAgICAgICAndGVtcGxhdGVzIGludG8gcmVuZGVyIGZ1bmN0aW9ucy4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIGNoZWNrIGNhY2hlCiAgICB2YXIga2V5ID0gb3B0aW9ucy5kZWxpbWl0ZXJzCiAgICAgID8gU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVycykgKyB0ZW1wbGF0ZQogICAgICA6IHRlbXBsYXRlOwogICAgaWYgKGNhY2hlW2tleV0pIHsKICAgICAgcmV0dXJuIGNhY2hlW2tleV0KICAgIH0KCiAgICAvLyBjb21waWxlCiAgICB2YXIgY29tcGlsZWQgPSBjb21waWxlKHRlbXBsYXRlLCBvcHRpb25zKTsKCiAgICAvLyBjaGVjayBjb21waWxhdGlvbiBlcnJvcnMvdGlwcwogICAgewogICAgICBpZiAoY29tcGlsZWQuZXJyb3JzICYmIGNvbXBpbGVkLmVycm9ycy5sZW5ndGgpIHsKICAgICAgICB3YXJuJCQxKAogICAgICAgICAgIkVycm9yIGNvbXBpbGluZyB0ZW1wbGF0ZTpcblxuIiArIHRlbXBsYXRlICsgIlxuXG4iICsKICAgICAgICAgIGNvbXBpbGVkLmVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuICgiLSAiICsgZSk7IH0pLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChjb21waWxlZC50aXBzICYmIGNvbXBpbGVkLnRpcHMubGVuZ3RoKSB7CiAgICAgICAgY29tcGlsZWQudGlwcy5mb3JFYWNoKGZ1bmN0aW9uIChtc2cpIHsgcmV0dXJuIHRpcChtc2csIHZtKTsgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyB0dXJuIGNvZGUgaW50byBmdW5jdGlvbnMKICAgIHZhciByZXMgPSB7fTsKICAgIHZhciBmbkdlbkVycm9ycyA9IFtdOwogICAgcmVzLnJlbmRlciA9IGNyZWF0ZUZ1bmN0aW9uKGNvbXBpbGVkLnJlbmRlciwgZm5HZW5FcnJvcnMpOwogICAgcmVzLnN0YXRpY1JlbmRlckZucyA9IGNvbXBpbGVkLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKGNvZGUsIGZuR2VuRXJyb3JzKQogICAgfSk7CgogICAgLy8gY2hlY2sgZnVuY3Rpb24gZ2VuZXJhdGlvbiBlcnJvcnMuCiAgICAvLyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29tcGlsZXIgaXRzZWxmLgogICAgLy8gbW9zdGx5IGZvciBjb2RlZ2VuIGRldmVsb3BtZW50IHVzZQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICB7CiAgICAgIGlmICgoIWNvbXBpbGVkLmVycm9ycyB8fCAhY29tcGlsZWQuZXJyb3JzLmxlbmd0aCkgJiYgZm5HZW5FcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgd2FybiQkMSgKICAgICAgICAgICJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVuZGVyIGZ1bmN0aW9uOlxuXG4iICsKICAgICAgICAgIGZuR2VuRXJyb3JzLm1hcChmdW5jdGlvbiAocmVmKSB7CiAgICAgICAgICAgIHZhciBlcnIgPSByZWYuZXJyOwogICAgICAgICAgICB2YXIgY29kZSA9IHJlZi5jb2RlOwoKICAgICAgICAgICAgcmV0dXJuICgoZXJyLnRvU3RyaW5nKCkpICsgIiBpblxuXG4iICsgY29kZSArICJcbiIpOwogICAgICAgIH0pLmpvaW4oJ1xuJyksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKGNhY2hlW2tleV0gPSByZXMpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBpbGVyQ3JlYXRvciAoYmFzZUNvbXBpbGUpIHsKICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQ29tcGlsZXIgKGJhc2VPcHRpb25zKSB7CiAgICBmdW5jdGlvbiBjb21waWxlICgKICAgICAgdGVtcGxhdGUsCiAgICAgIG9wdGlvbnMKICAgICkgewogICAgICB2YXIgZmluYWxPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShiYXNlT3B0aW9ucyk7CiAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgdmFyIHRpcHMgPSBbXTsKICAgICAgZmluYWxPcHRpb25zLndhcm4gPSBmdW5jdGlvbiAobXNnLCB0aXApIHsKICAgICAgICAodGlwID8gdGlwcyA6IGVycm9ycykucHVzaChtc2cpOwogICAgICB9OwoKICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAvLyBtZXJnZSBjdXN0b20gbW9kdWxlcwogICAgICAgIGlmIChvcHRpb25zLm1vZHVsZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5tb2R1bGVzID0KICAgICAgICAgICAgKGJhc2VPcHRpb25zLm1vZHVsZXMgfHwgW10pLmNvbmNhdChvcHRpb25zLm1vZHVsZXMpOwogICAgICAgIH0KICAgICAgICAvLyBtZXJnZSBjdXN0b20gZGlyZWN0aXZlcwogICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5kaXJlY3RpdmVzID0gZXh0ZW5kKAogICAgICAgICAgICBPYmplY3QuY3JlYXRlKGJhc2VPcHRpb25zLmRpcmVjdGl2ZXMgfHwgbnVsbCksCiAgICAgICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlcwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy8gY29weSBvdGhlciBvcHRpb25zCiAgICAgICAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgICAgICAgIGlmIChrZXkgIT09ICdtb2R1bGVzJyAmJiBrZXkgIT09ICdkaXJlY3RpdmVzJykgewogICAgICAgICAgICBmaW5hbE9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBjb21waWxlZCA9IGJhc2VDb21waWxlKHRlbXBsYXRlLCBmaW5hbE9wdGlvbnMpOwogICAgICB7CiAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBkZXRlY3RFcnJvcnMoY29tcGlsZWQuYXN0KSk7CiAgICAgIH0KICAgICAgY29tcGlsZWQuZXJyb3JzID0gZXJyb3JzOwogICAgICBjb21waWxlZC50aXBzID0gdGlwczsKICAgICAgcmV0dXJuIGNvbXBpbGVkCiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgY29tcGlsZTogY29tcGlsZSwKICAgICAgY29tcGlsZVRvRnVuY3Rpb25zOiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuKGNvbXBpbGUpCiAgICB9CiAgfQp9CgovKiAgKi8KCi8vIGBjcmVhdGVDb21waWxlckNyZWF0b3JgIGFsbG93cyBjcmVhdGluZyBjb21waWxlcnMgdGhhdCB1c2UgYWx0ZXJuYXRpdmUKLy8gcGFyc2VyL29wdGltaXplci9jb2RlZ2VuLCBlLmcgdGhlIFNTUiBvcHRpbWl6aW5nIGNvbXBpbGVyLgovLyBIZXJlIHdlIGp1c3QgZXhwb3J0IGEgZGVmYXVsdCBjb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCBwYXJ0cy4KdmFyIGNyZWF0ZUNvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXJDcmVhdG9yKGZ1bmN0aW9uIGJhc2VDb21waWxlICgKICB0ZW1wbGF0ZSwKICBvcHRpb25zCikgewogIHZhciBhc3QgPSBwYXJzZSh0ZW1wbGF0ZS50cmltKCksIG9wdGlvbnMpOwogIGlmIChvcHRpb25zLm9wdGltaXplICE9PSBmYWxzZSkgewogICAgb3B0aW1pemUoYXN0LCBvcHRpb25zKTsKICB9CiAgdmFyIGNvZGUgPSBnZW5lcmF0ZShhc3QsIG9wdGlvbnMpOwogIHJldHVybiB7CiAgICBhc3Q6IGFzdCwKICAgIHJlbmRlcjogY29kZS5yZW5kZXIsCiAgICBzdGF0aWNSZW5kZXJGbnM6IGNvZGUuc3RhdGljUmVuZGVyRm5zCiAgfQp9KTsKCi8qICAqLwoKdmFyIHJlZiQxID0gY3JlYXRlQ29tcGlsZXIoYmFzZU9wdGlvbnMpOwp2YXIgY29tcGlsZVRvRnVuY3Rpb25zID0gcmVmJDEuY29tcGlsZVRvRnVuY3Rpb25zOwoKLyogICovCgovLyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgYnJvd3NlciBlbmNvZGVzIGEgY2hhciBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcwp2YXIgZGl2OwpmdW5jdGlvbiBnZXRTaG91bGREZWNvZGUgKGhyZWYpIHsKICBkaXYgPSBkaXYgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGl2LmlubmVySFRNTCA9IGhyZWYgPyAiPGEgaHJlZj1cIlxuXCIvPiIgOiAiPGRpdiBhPVwiXG5cIi8+IjsKICByZXR1cm4gZGl2LmlubmVySFRNTC5pbmRleE9mKCcmIzEwOycpID4gMAp9CgovLyAjMzY2MzogSUUgZW5jb2RlcyBuZXdsaW5lcyBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcyB3aGlsZSBvdGhlciBicm93c2VycyBkb24ndAp2YXIgc2hvdWxkRGVjb2RlTmV3bGluZXMgPSBpbkJyb3dzZXIgPyBnZXRTaG91bGREZWNvZGUoZmFsc2UpIDogZmFsc2U7Ci8vICM2ODI4OiBjaHJvbWUgZW5jb2RlcyBjb250ZW50IGluIGFbaHJlZl0KdmFyIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiA9IGluQnJvd3NlciA/IGdldFNob3VsZERlY29kZSh0cnVlKSA6IGZhbHNlOwoKLyogICovCgp2YXIgaWRUb1RlbXBsYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChpZCkgewogIHZhciBlbCA9IHF1ZXJ5KGlkKTsKICByZXR1cm4gZWwgJiYgZWwuaW5uZXJIVE1MCn0pOwoKdmFyIG1vdW50ID0gVnVlLnByb3RvdHlwZS4kbW91bnQ7ClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIHF1ZXJ5KGVsKTsKCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5IHx8IGVsID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAiRG8gbm90IG1vdW50IFZ1ZSB0byA8aHRtbD4gb3IgPGJvZHk+IC0gbW91bnQgdG8gbm9ybWFsIGVsZW1lbnRzIGluc3RlYWQuIgogICAgKTsKICAgIHJldHVybiB0aGlzCiAgfQoKICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7CiAgLy8gcmVzb2x2ZSB0ZW1wbGF0ZS9lbCBhbmQgY29udmVydCB0byByZW5kZXIgZnVuY3Rpb24KICBpZiAoIW9wdGlvbnMucmVuZGVyKSB7CiAgICB2YXIgdGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlOwogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdCgwKSA9PT0gJyMnKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IGlkVG9UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgKCJUZW1wbGF0ZSBlbGVtZW50IG5vdCBmb3VuZCBvciBpcyBlbXB0eTogIiArIChvcHRpb25zLnRlbXBsYXRlKSksCiAgICAgICAgICAgICAgdGhpcwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkgewogICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuaW5uZXJIVE1MOwogICAgICB9IGVsc2UgewogICAgICAgIHsKICAgICAgICAgIHdhcm4oJ2ludmFsaWQgdGVtcGxhdGUgb3B0aW9uOicgKyB0ZW1wbGF0ZSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWwpIHsKICAgICAgdGVtcGxhdGUgPSBnZXRPdXRlckhUTUwoZWwpOwogICAgfQogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgICAgbWFyaygnY29tcGlsZScpOwogICAgICB9CgogICAgICB2YXIgcmVmID0gY29tcGlsZVRvRnVuY3Rpb25zKHRlbXBsYXRlLCB7CiAgICAgICAgc2hvdWxkRGVjb2RlTmV3bGluZXM6IHNob3VsZERlY29kZU5ld2xpbmVzLAogICAgICAgIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjogc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmLAogICAgICAgIGRlbGltaXRlcnM6IG9wdGlvbnMuZGVsaW1pdGVycywKICAgICAgICBjb21tZW50czogb3B0aW9ucy5jb21tZW50cwogICAgICB9LCB0aGlzKTsKICAgICAgdmFyIHJlbmRlciA9IHJlZi5yZW5kZXI7CiAgICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zOwogICAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlcjsKICAgICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnM7CgogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgICAgIG1hcmsoJ2NvbXBpbGUgZW5kJyk7CiAgICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHRoaXMuX25hbWUpICsgIiBjb21waWxlIiksICdjb21waWxlJywgJ2NvbXBpbGUgZW5kJyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG1vdW50LmNhbGwodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8qKgogKiBHZXQgb3V0ZXJIVE1MIG9mIGVsZW1lbnRzLCB0YWtpbmcgY2FyZQogKiBvZiBTVkcgZWxlbWVudHMgaW4gSUUgYXMgd2VsbC4KICovCmZ1bmN0aW9uIGdldE91dGVySFRNTCAoZWwpIHsKICBpZiAoZWwub3V0ZXJIVE1MKSB7CiAgICByZXR1cm4gZWwub3V0ZXJIVE1MCiAgfSBlbHNlIHsKICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbC5jbG9uZU5vZGUodHJ1ZSkpOwogICAgcmV0dXJuIGNvbnRhaW5lci5pbm5lckhUTUwKICB9Cn0KClZ1ZS5jb21waWxlID0gY29tcGlsZVRvRnVuY3Rpb25zOwoKcmV0dXJuIFZ1ZTsKCn0pKSk7Cg==" >
tail j=5409 line=
tail j=5410 line=<!-- <script type="text/javascript" src="/jquery-3.3.1.js" > -->
tail j=5411 line= <script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkgewoKCSJ1c2Ugc3RyaWN0IjsKCglpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2AKCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgoJCS8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgCgkJLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuCgkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uCgkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPwoJCQlmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6CgkJCWZ1bmN0aW9uKCB3ICkgewoJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50IiApOwoJCQkJfQoJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKCQkJfTsKCX0gZWxzZSB7CgkJZmFjdG9yeSggZ2xvYmFsICk7Cgl9CgovLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAp9ICkoIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CgovLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjEKLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlCi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uCi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLgoidXNlIHN0cmljdCI7Cgp2YXIgYXJyID0gW107Cgp2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cgp2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7Cgp2YXIgc2xpY2UgPSBhcnIuc2xpY2U7Cgp2YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKCnZhciBwdXNoID0gYXJyLnB1c2g7Cgp2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOwoKdmFyIGNsYXNzMnR5cGUgPSB7fTsKCnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7Cgp2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKCnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nOwoKdmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTsKCnZhciBzdXBwb3J0ID0ge307Cgp2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHsKCiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTIKICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgImZ1bmN0aW9uIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50cwogICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib2JqZWN0IiApID09PSAiZnVuY3Rpb24iYCkuCiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi4KICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gIm51bWJlciI7CiAgfTsKCgp2YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Cgl9OwoKCgoKCXZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0gewoJCXR5cGU6IHRydWUsCgkJc3JjOiB0cnVlLAoJCW5vTW9kdWxlOiB0cnVlCgl9OwoKCWZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYywgbm9kZSApIHsKCQlkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7CgoJCXZhciBpLAoJCQlzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsKCgkJc2NyaXB0LnRleHQgPSBjb2RlOwoJCWlmICggbm9kZSApIHsKCQkJZm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkgewoJCQkJaWYgKCBub2RlWyBpIF0gKSB7CgkJCQkJc2NyaXB0WyBpIF0gPSBub2RlWyBpIF07CgkJCQl9CgkJCX0KCQl9CgkJZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJfQoKCmZ1bmN0aW9uIHRvVHlwZSggb2JqICkgewoJaWYgKCBvYmogPT0gbnVsbCApIHsKCQlyZXR1cm4gb2JqICsgIiI7Cgl9CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApCglyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CgkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CgkJdHlwZW9mIG9iajsKfQovKiBnbG9iYWwgU3ltYm9sICovCi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsCi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlCgoKCnZhcgoJdmVyc2lvbiA9ICIzLjMuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfSwKCgkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHkKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAoJcnRyaW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogdmVyc2lvbiwKCgljb25zdHJ1Y3RvcjogalF1ZXJ5LAoKCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVuZ3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgoJCS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKCQlpZiAoIG51bSA9PSBudWxsICkgewoJCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApOwoJCX0KCgkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAoJCXJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoKCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAoJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSApICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpOwoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KCXB1c2g6IHB1c2gsCglzb3J0OiBhcnIuc29ydCwKCXNwbGljZTogYXJyLnNwbGljZQp9OwoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKCQl0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSwKCQlpID0gMSwKCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAoJCWRlZXAgPSBmYWxzZTsKCgkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKCQlkZWVwID0gdGFyZ2V0OwoKCQkvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CgkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CgkJaSsrOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGkgPT09IGxlbmd0aCApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCWktLTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgewoKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHwKCQkJCQkoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHsKCgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCWV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAoKCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCglpc1JlYWR5OiB0cnVlLAoKCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewoJCXRocm93IG5ldyBFcnJvciggbXNnICk7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgcHJvdG8sIEN0b3I7CgoJCS8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlcwoJCS8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0cwoJCWlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gIltvYmplY3QgT2JqZWN0XSIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXByb3RvID0gZ2V0UHJvdG8oIG9iaiApOwoKCQkvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluCgkJaWYgKCAhcHJvdG8gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb24KCQlDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCAiY29uc3RydWN0b3IiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7CgkJcmV0dXJuIHR5cGVvZiBDdG9yID09PSAiZnVuY3Rpb24iICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZzsKCX0sCgoJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCgkJLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KCQkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjUKCQl2YXIgbmFtZTsKCgkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHsKCQlET01FdmFsKCBjb2RlICk7Cgl9LAoKCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkgewoJCXZhciBsZW5ndGgsIGkgPSAwOwoKCQlpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHsKCQkJbGVuZ3RoID0gb2JqLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvciAoIGkgaW4gb2JqICkgewoJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seQoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CgkJCSIiIDoKCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCX0sCgoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIGFyciAhPSBudWxsICkgewoJCQlpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKCQlyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seQoJLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdAoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJCXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNoZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKCQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2YXIgbGVuZ3RoLCB2YWx1ZSwKCQkJaSA9IDAsCgkJCXJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwoJCWlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7CgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBpIGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldC5wdXNoKCB2YWx1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCgkvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgoJc3VwcG9ydDogc3VwcG9ydAp9ICk7CgppZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CglqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTsKfQoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCAiICIgKSwKZnVuY3Rpb24oIGksIG5hbWUgKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9ICk7CgpmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkgewoKCS8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcikKCS8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSkKCS8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwoJLy8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRQoJdmFyIGxlbmd0aCA9ICEhb2JqICYmICJsZW5ndGgiIGluIG9iaiAmJiBvYmoubGVuZ3RoLAoJCXR5cGUgPSB0b1R5cGUoIG9iaiApOwoKCWlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKCQl0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKfQp2YXIgU2l6emxlID0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNi0wOC0wOAogKi8KKGZ1bmN0aW9uKCB3aW5kb3cgKSB7Cgp2YXIgaSwKCXN1cHBvcnQsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJdG9rZW5pemUsCgljb21waWxlLAoJc2VsZWN0LAoJb3V0ZXJtb3N0Q29udGV4dCwKCXNvcnRJbnB1dCwKCWhhc0R1cGxpY2F0ZSwKCgkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCglzZXREb2N1bWVudCwKCWRvY3VtZW50LAoJZG9jRWxlbSwKCWRvY3VtZW50SXNIVE1MLAoJcmJ1Z2d5UVNBLAoJcmJ1Z2d5TWF0Y2hlcywKCW1hdGNoZXMsCgljb250YWlucywKCgkvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCglleHBhbmRvID0gInNpenpsZSIgKyAxICogbmV3IERhdGUoKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMgPSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVybiAwOwoJfSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNlLAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlCgkvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81CglpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7CgkJdmFyIGkgPSAwLAoJCQlsZW4gPSBsaXN0Lmxlbmd0aDsKCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfSwKCglib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCgoJLy8gUmVndWxhciBleHByZXNzaW9ucwoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRpZmllciA9ICIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsCgoJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGlkZW50aWZpZXIgKyAiKSg/OiIgKyB3aGl0ZXNwYWNlICsKCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQoJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKwoJCS8vICJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdIgoJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCgkJIipcXF0iLAoKCXBzZXVkb3MgPSAiOigiICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKwoJCS8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgoJcndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgIisiLCAiZyIgKSwKCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAoKCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAoJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAoKCXJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCAiPSIgKyB3aGl0ZXNwYWNlICsgIiooW15cXF0nXCJdKj8pIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsICJnIiApLAoKCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCglyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoICJeIiArIGlkZW50aWZpZXIgKyAiJCIgKSwKCgltYXRjaEV4cHIgPSB7CgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBpZGVudGlmaWVyICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50aWZpZXIgKyAiKSIgKSwKCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGlkZW50aWZpZXIgKyAifFsqXSkiICksCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCgkJIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwKCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKCQkvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgCgkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCgkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQoJfSwKCglyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJoZWFkZXIgPSAvXmhcZCQvaSwKCglybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCgoJcnNpYmxpbmcgPSAvWyt+XS8sCgoJLy8gQ1NTIGVzY2FwZXMKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKCXJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJcXFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIpfC4pIiwgImlnIiApLAoJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgewoJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwoJCS8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CgkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAoJCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKCQlyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/CgkJCWVzY2FwZWQgOgoJCQloaWdoIDwgMCA/CgkJCQkvLyBCTVAgY29kZXBvaW50CgkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQoJCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Cgl9LAoKCS8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uCgkvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXMKCXJjc3Nlc2NhcGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywKCWZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkgewoJCWlmICggYXNDb2RlUG9pbnQgKSB7CgoJCQkvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIKCQkJaWYgKCBjaCA9PT0gIlwwIiApIHsKCQkJCXJldHVybiAiXHVGRkZEIjsKCQkJfQoKCQkJLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHMKCQkJcmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgIlxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArICIgIjsKCQl9CgoJCS8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWQKCQlyZXR1cm4gIlxcIiArIGNoOwoJfSwKCgkvLyBVc2VkIGZvciBpZnJhbWVzCgkvLyBTZWUgc2V0RG9jdW1lbnQoKQoJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgoJLy8gZXJyb3IgaW4gSUUKCXVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKCQlzZXREb2N1bWVudCgpOwoJfSwKCglkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcigKCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgKCJmb3JtIiBpbiBlbGVtIHx8ICJsYWJlbCIgaW4gZWxlbSk7CgkJfSwKCQl7IGRpcjogInBhcmVudE5vZGUiLCBuZXh0OiAibGVnZW5kIiB9CgkpOwoKLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKdHJ5IHsKCXB1c2guYXBwbHkoCgkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAoJCXByZWZlcnJlZERvYy5jaGlsZE5vZGVzCgkpOwoJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKCS8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHkKCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cn0gY2F0Y2ggKCBlICkgewoJcHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggPwoKCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQoJCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CgkJfSA6CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5CgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCgkJCQlpID0gMDsKCQkJLy8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoCgkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Cgl2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3RvciwKCQluZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsCgoJCS8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnQKCQlub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTsKCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCgkvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dAoJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciIHx8ICFzZWxlY3RvciB8fAoJCW5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHsKCgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgoJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50cwoJaWYgKCAhc2VlZCApIHsKCgkJaWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHsKCQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CgoJCQkvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgImdldCpCeSoiIERPTSBtZXRob2QKCQkJLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQoJCQlpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewoKCQkJCS8vIElEIHNlbGVjdG9yCgkJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgewoKCQkJCQkvLyBEb2N1bWVudCBjb250ZXh0CgkJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJCS8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zCgkJCQkJCQkvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoKCQkJCQkvLyBFbGVtZW50IGNvbnRleHQKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJLy8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnMKCQkJCQkJLy8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCgkJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmCgkJCQkJCQllbGVtLmlkID09PSBtICkgewoKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9CgoJCQkJLy8gVHlwZSBzZWxlY3RvcgoJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwoJCQkJCXJldHVybiByZXN1bHRzOwoKCQkJCS8vIENsYXNzIHNlbGVjdG9yCgkJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYKCQkJCQljb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CgoJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CgkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQl9CgkJCX0KCgkJCS8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGwKCQkJaWYgKCBzdXBwb3J0LnFzYSAmJgoJCQkJIWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF0gJiYKCQkJCSghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgoJCQkJaWYgKCBub2RlVHlwZSAhPT0gMSApIHsKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IHNlbGVjdG9yOwoKCQkJCS8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudAoJCQkJLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKCQkJCS8vIFN1cHBvcnQ6IElFIDw9OAoJCQkJLy8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHMKCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgoJCQkJCS8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CgkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIChuaWQgPSBleHBhbmRvKSApOwoJCQkJCX0KCgkJCQkJLy8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7CgkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCWdyb3Vwc1tpXSA9ICIjIiArIG5pZCArICIgIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwoJCQkJCX0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCAiLCIgKTsKCgkJCQkJLy8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzCgkJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8CgkJCQkJCWNvbnRleHQ7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAoJCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCgkJCQkJCSk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0gY2F0Y2ggKCBxc2FFcnJvciApIHsKCQkJCQl9IGZpbmFsbHkgewoJCQkJCQlpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQWxsIG90aGVycwoJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwp9CgovKioKICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGgKICoJcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQogKi8KZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7Cgl2YXIga2V5cyA9IFtdOwoKCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgewoJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQoJCWlmICgga2V5cy5wdXNoKCBrZXkgKyAiICIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwoJCX0KCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsKCX0KCXJldHVybiBjYWNoZTsKfQoKLyoqCiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCiAqLwpmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewoJZm5bIGV4cGFuZG8gXSA9IHRydWU7CglyZXR1cm4gZm47Cn0KCi8qKgogKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkgewoJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTsKCgl0cnkgewoJCXJldHVybiAhIWZuKCBlbCApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVybiBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CgkJaWYgKCBlbC5wYXJlbnROb2RlICkgewoJCQllbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApOwoJCX0KCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCWVsID0gbnVsbDsKCX0KfQoKLyoqCiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQKICovCmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Cgl2YXIgYXJyID0gYXR0cnMuc3BsaXQoInwiKSwKCQlpID0gYXJyLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBhCiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBiICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkCiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWQKICovCmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHsKCgkvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGUKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWQKCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkCgkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWQKCQlpZiAoICJmb3JtIiBpbiBlbGVtICkgewoKCQkJLy8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOgoJCQkvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldAoJCQkvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkCgkJCS8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkCgkJCS8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkCgkJCS8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSAiZm9ybSIgcHJvcGVydHkuCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkgewoKCQkJCS8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50CgkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbSApIHsKCQkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQlyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFN1cHBvcnQ6IElFIDYgLSAxMQoJCQkJLy8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnMKCQkJCXJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8CgoJCQkJCS8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5CgkJCQkJLyoganNoaW50IC1XMDE4ICovCgkJCQkJZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiYKCQkJCQkJZGlzYWJsZWRBbmNlc3RvciggZWxlbSApID09PSBkaXNhYmxlZDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkOwoKCQkvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuCgkJLy8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0CgkJLy8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuCgkJfSBlbHNlIGlmICggImxhYmVsIiBpbiBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJfQoKCQkvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZAoJCXJldHVybiBmYWxzZTsKCX07Cn0KCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCiAqLwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAogKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dAogKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKICovCmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkgewoJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1MIG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LAoJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKCgkvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZAoJaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgoJLy8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXMKCWRvY3VtZW50ID0gZG9jOwoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCWRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApOwoKCS8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2UKCS8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpCglpZiAoIHByZWZlcnJlZERvYyAhPT0gZG9jdW1lbnQgJiYKCQkoc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHsKCgkJLy8gU3VwcG9ydDogSUUgMTEsIEVkZ2UKCQlpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJCQlzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5CgkJfSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkgewoJCQlzdWJXaW5kb3cuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIHVubG9hZEhhbmRsZXIgKTsKCQl9Cgl9CgoJLyogQXR0cmlidXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFN1cHBvcnQ6IElFPDgKCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcwoJLy8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCglzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Cgl9KTsKCgkvKiBnZXRFbGVtZW50KHMpQnkqCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCXN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Cgl9KTsKCgkvLyBTdXBwb3J0OiBJRTw5CglzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsKCgkvLyBTdXBwb3J0OiBJRTwxMAoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lCgkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcywKCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAoJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbzsKCQlyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKCX0pOwoKCS8vIElEIGZpbHRlciBhbmQgZmluZAoJaWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7CgkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJCUV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCQl2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJCQlyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107CgkJCX0KCQl9OwoJfSBlbHNlIHsKCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCQkJZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOwoJCQl9OwoJCX07CgoJCS8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHkKCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CgkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBub2RlLCBpLCBlbGVtcywKCQkJCQllbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCgkJCQlpZiAoIGVsZW0gKSB7CgoJCQkJCS8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlCgkJCQkJbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7CgkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQl9CgoJCQkJCS8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZQoJCQkJCWVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTsKCQkJCQlpID0gMDsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7CgkJCQkJCW5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgkJCQkJCWlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHsKCQkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gW107CgkJCX0KCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROCgkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgewoJCQkJcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CgkJCX0KCQl9IDoKCgkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJdmFyIGVsZW0sCgkJCQl0bXAgPSBbXSwKCQkJCWkgPSAwLAoJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbwoJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdG1wOwoJCQl9CgkJCXJldHVybiByZXN1bHRzOwoJCX07CgoJLy8gQ2xhc3MKCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCX0KCX07CgoJLyogUVNBL21hdGNoZXNTZWxlY3RvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKCgkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJcmJ1Z2d5TWF0Y2hlcyA9IFtdOwoKCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCgkvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3IKCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKCS8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCgkvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CglyYnVnZ3lRU0EgPSBbXTsKCglpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHsKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQoJCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCgkJCQkiPHNlbGVjdCBpZD0nIiArIGV4cGFuZG8gKyAiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPiIgKwoJCQkJIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKCgkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQoJCQkvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCAic2FmZSIgZm9yIFdpblJUCgkJCS8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IElFOAoJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44KwoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgifj0iKTsKCQkJfQoKCQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKCQkJaWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MQoJCQkvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzCgkJCWlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCIuIy4rWyt+XSIpOwoJCQl9CgkJfSk7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCWVsLmlubmVySFRNTCA9ICI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPiIgKwoJCQkJIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iOwoKCQkJLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzCgkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAoJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKCQkJZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiApOwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJuYW1lIiArIHdoaXRlc3BhY2UgKyAiKlsqXiR8IX5dPz0iICk7CgkJCX0KCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggIT09IDIgKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogSUU5LTExKwoJCQkvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHMKCQkJZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7CgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoICE9PSAyICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CgkJCX0KCgkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCgkJCWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQoJCQlzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgIioiICk7CgoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBlbCwgIltzIT0nJ106eCIgKTsKCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CgkJfSk7Cgl9CgoJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CglyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCJ8IikgKTsKCgkvKiBDb250YWlucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwoKCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgoJLy8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlCgkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8KCQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBiICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYgKCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJaWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKCQkJcmV0dXJuIHNvcnRJbnB1dCA/CgkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVudE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJYnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsKCQkJcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgoJCQkJYiA9PT0gZG9jdW1lbnQgPyAxIDoKCQkJCWF1cCA/IC0xIDoKCQkJCWJ1cCA/IDEgOgoJCQkJc29ydElucHV0ID8KCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJCX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2N1bWVudDsKfTsKClNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKfTsKClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCglleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOwoKCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkhY29tcGlsZXJDYWNoZVsgZXhwciArICIgIiBdICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoIChlKSB7fQoJfQoKCXJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cn07CgpTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7Cgl9CglyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxlbSApOwoJfQoKCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCgkJLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCgkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwoJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgoJCQl1bmRlZmluZWQ7CgoJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KCQl2YWwgOgoJCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwoJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CgkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKfTsKClNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkgewoJcmV0dXJuIChzZWwgKyAiIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8qKgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRlcyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKCWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJbnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hFeHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwKCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHktY29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJCX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJCXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKCQkJCX0pOwoJCX0sCgoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CgoJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CgkJCQl9CgkJCQlpZiAoICFvcGVyYXRvciApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCgkJCQlyZXN1bHQgKz0gIiI7CgoJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgoJCQkJCW9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJCQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAoJCQkJCQlkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIsCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCXVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLAoJCQkJCQlkaWZmID0gZmFsc2U7CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJCXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZUeXBlID8KCQkJCQkJCQkJCW5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CgkJCQkJCQkJCQlub2RlLm5vZGVUeXBlID09PSAxICkgewoKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewoKCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAoKCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCW5vZGUgPSBwYXJlbnQ7CgkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUgPDkgb25seQoJCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCShvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQkJY2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdOwoJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOwoJCQkJCQkJbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CgoJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKCgkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKCgkJCQkJCQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CgkJCQkJCQkJCXVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCgkJCQkJCQlpZiAoIHVzZUNhY2hlICkgewoJCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCQlub2RlID0gZWxlbTsKCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQljYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJCWRpZmYgPSBub2RlSW5kZXg7CgkJCQkJCQl9CgoJCQkJCQkJLy8geG1sIDpudGgtY2hpbGQoLi4uKQoJCQkJCQkJLy8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQoJCQkJCQkJaWYgKCBkaWZmID09PSBmYWxzZSApIHsKCQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CgkJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewoKCQkJCQkJCQkJaWYgKCAoIG9mVHlwZSA/CgkJCQkJCQkJCQlub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOgoJCQkJCQkJCQkJbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmCgkJCQkJCQkJCQkrK2RpZmYgKSB7CgoJCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAoJCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKCQkJCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQoJCQkJCQlkaWZmIC09IGxhc3Q7CgkJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJCX07CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwoJCQkvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCgkJCXZhciBhcmdzLAoJCQkJZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOwoKCQkJLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCgkJCWlmICggZm5bIGV4cGFuZG8gXSApIHsKCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKCQkJfQoKCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKCQkJCWFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKCQkJCQkJdmFyIGlkeCwKCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOwoJCQkJCQl9CgkJCQkJfSkgOgoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKCQkJCQl9OwoJCQl9CgoJCQlyZXR1cm4gZm47CgkJfQoJfSwKCglwc2V1ZG9zOiB7CgkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwoJCQl2YXIgaW5wdXQgPSBbXSwKCQkJCXJlc3VsdHMgPSBbXSwKCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CgoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsKCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pIDoKCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCQkJaW5wdXRbMF0gPSBlbGVtOwoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKCQkJCQkvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQoJCQkJCWlucHV0WzBdID0gbnVsbDsKCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7CgkJCQl9OwoJCX0pLAoKCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwoJCQl9OwoJCX0pLAoKCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CgkJCX07CgkJfSksCgoJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCgkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKCQkvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAoJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgoJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoJCS8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgoJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CgkJCS8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7CgkJCX0KCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgZWxlbUxhbmc7CgkJCQlkbyB7CgkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/CgkJCQkJCWVsZW0ubGFuZyA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgewoKCQkJCQkJZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwoJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOwoJCQkJCX0KCQkJCX0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJCX0pLAoKCQkvLyBNaXNjZWxsYW5lb3VzCgkJInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwoJCX0sCgoJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBkb2NFbGVtOwoJCX0sCgoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOwoJCX0sCgoJCS8vIEJvb2xlYW4gcHJvcGVydGllcwoJCSJlbmFibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksCgkJImRpc2FibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSwKCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwoJCX0sCgoJCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCgkJLy8gQ29udGVudHMKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAoJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQoJCQkvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwoJCX0sCgoJCS8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGF0dHI7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCgoJCQkJLy8gU3VwcG9ydDogSUU8OAoJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgoJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKCQl9LAoKCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CgkJfSksCgoJCSJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwoJCX0pLAoKCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDA7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CgkJCXZhciBpID0gMTsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwoJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CgkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KQoJfQp9OwoKRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKCi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwp9CmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CglFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwp9CgovLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOwpFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwoKdG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAoJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKCglpZiAoIGNhY2hlZCApIHsKCQlyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwoJfQoKCXNvRmFyID0gc2VsZWN0b3I7Cglncm91cHMgPSBbXTsKCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKCgl3aGlsZSAoIHNvRmFyICkgewoKCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CgkJCWlmICggbWF0Y2ggKSB7CgkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CgkJCX0KCQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKCQl9CgoJCW1hdGNoZWQgPSBmYWxzZTsKCgkJLy8gQ29tYmluYXRvcnMKCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKCQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCXRva2Vucy5wdXNoKHsKCQkJCXZhbHVlOiBtYXRjaGVkLAoJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCgkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKCQkJfSk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJfQoKCQkvLyBGaWx0ZXJzCgkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CgkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKCQkJCXRva2Vucy5wdXNoKHsKCQkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCW1hdGNoZXM6IG1hdGNoCgkJCQl9KTsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJCX0KCQl9CgoJCWlmICggIW1hdGNoZWQgKSB7CgkJCWJyZWFrOwoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCglyZXR1cm4gcGFyc2VPbmx5ID8KCQlzb0Zhci5sZW5ndGggOgoJCXNvRmFyID8KCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKCQkJLy8gQ2FjaGUgdGhlIHRva2VucwoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKfTsKCmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKCXZhciBpID0gMCwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCXNlbGVjdG9yID0gIiI7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7Cgl9CglyZXR1cm4gc2VsZWN0b3I7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJc2tpcCA9IGNvbWJpbmF0b3IubmV4dCwKCQlrZXkgPSBza2lwIHx8IGRpciwKCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewoJCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSA6CgoJCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsCgkJCQluZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTsKCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZwoJCQlpZiAoIHhtbCApIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKCgkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCXVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQlpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoJCQkJCQkJZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07CgkJCQkJCX0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiYKCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CgoJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKCQkJCQkJCXJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cwoJCQkJCQkJdW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7CgoJCQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Owp9CgpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IDoKCQltYXRjaGVyc1swXTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Cgl9CglyZXR1cm4gcmVzdWx0czsKfQoKZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsKCXZhciBlbGVtLAoJCW5ld1VubWF0Y2hlZCA9IFtdLAoJCWkgPSAwLAoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCgkJbWFwcGVkID0gbWFwICE9IG51bGw7CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCWlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCWlmICggbWFwcGVkICkgewoJCQkJCW1hcC5wdXNoKCBpICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG5ld1VubWF0Y2hlZDsKfQoKZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgewoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKCX0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKCX0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKCQl2YXIgdGVtcCwgaSwgZWxlbSwKCQkJcHJlTWFwID0gW10sCgkJCXBvc3RNYXAgPSBbXSwKCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0CgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCgoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CgkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6CgkJCQllbGVtcywKCgkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CgoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQoJCQkJCVtdIDoKCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5CgkJCQkJcmVzdWx0cyA6CgkJCQltYXRjaGVySW47CgoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCgkJaWYgKCBtYXRjaGVyICkgewoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwoJCX0KCgkJLy8gQXBwbHkgcG9zdEZpbHRlcgoJCWlmICggcG9zdEZpbHRlciApIHsKCQkJdGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKCgkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KCQkJaSA9IHRlbXAubGVuZ3RoOwoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggc2VlZCApIHsKCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKCQkJCWlmICggcG9zdEZpbmRlciApIHsKCQkJCQkvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHMKCQkJCQl0ZW1wID0gW107CgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAoJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CgkJCQl9CgoJCQkJLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCXdoaWxlICggaS0tICkgewoJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCQkvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSkKCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKCQkJcmV0dXJuIHJldDsKCQl9IF07CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKCQl9IGVsc2UgewoJCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7CgoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgoJCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZwoJCQkJaiA9ICsraTsKCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoCgkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCgkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmAKCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCgkJCQkJbWF0Y2hlciwKCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCgkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7CgkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAoJCQkJbWF0Y2hlZENvdW50ID0gMCwKCQkJCWkgPSAiMCIsCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAoJCQkJc2V0TWF0Y2hlZCA9IFtdLAoJCQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJtb3N0ICksCgkJCQkvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCgkJCQlsZW4gPSBlbGVtcy5sZW5ndGg7CgoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDsKCQkJfQoKCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCgkJCS8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlqID0gMDsKCQkJCQlpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7CgkJCQkJCXNldERvY3VtZW50KCBlbGVtICk7CgkJCQkJCXhtbCA9ICFkb2N1bWVudElzSFRNTDsKCQkJCQl9CgkJCQkJd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKCQkJCWlmICggYnlTZXQgKSB7CgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKCQkJCQkJbWF0Y2hlZENvdW50LS07CgkJCQkJfQoKCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CgkJCQkJaWYgKCBzZWVkICkgewoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YAoJCQkvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLgoJCQltYXRjaGVkQ291bnQgKz0gaTsKCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQkvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgCgkJCS8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQoJCQkvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLgoJCQkvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyAiMCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdAoJCQkvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvCgkJCS8vIG51bWVyaWNhbGx5IHplcm8uCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNlZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJCQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJaWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsKCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9ucwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKCS8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dCkKCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgoJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewoKCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbAoJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7CgkJCX0KCgkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOwoJCX0KCgkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJdG9rZW4gPSB0b2tlbnNbaV07CgoJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKCQkJCS8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycwoJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAoJCQkJCXJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKCQkJCSkpICkgewoKCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CgkJCQkJc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKCQkJCQlpZiAoICFzZWxlY3RvciApIHsKCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZAoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAoJCXNlZWQsCgkJY29udGV4dCwKCQkhZG9jdW1lbnRJc0hUTUwsCgkJcmVzdWx0cywKCQkhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CgkpOwoJcmV0dXJuIHJlc3VsdHM7Cn07CgovLyBPbmUtdGltZSBhc3NpZ25tZW50cwoKLy8gU29ydCBzdGFiaWxpdHkKc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CgovLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24Kc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7CgovLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKc2V0RG9jdW1lbnQoKTsKCi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgpzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKCXJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgovLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAppZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cn0pICkgewoJYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CgkJfQoJfSk7Cn0KCi8vIFN1cHBvcnQ6IElFPDkKLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKCWVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCXJldHVybiBlbC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKfSkgKSB7CglhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJdmFyIHZhbDsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CgkJCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KCQkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKCQl9Cgl9KTsKfQoKcmV0dXJuIFNpenpsZTsKCn0pKCB3aW5kb3cgKTsKCgoKalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKCi8vIERlcHJlY2F0ZWQKalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwpqUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlOwoKCgoKdmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJdmFyIG1hdGNoZWQgPSBbXSwKCQl0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CgoJd2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQlpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJbWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJfQoJfQoJcmV0dXJuIG1hdGNoZWQ7Cn07CgoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7Cgl2YXIgbWF0Y2hlZCA9IFtdOwoKCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CgkJCW1hdGNoZWQucHVzaCggbiApOwoJCX0KCX0KCglyZXR1cm4gbWF0Y2hlZDsKfTsKCgp2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKCgoKZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7CgogIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKfTsKdmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pICk7CgoKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewoJaWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwoJCX0gKTsKCX0KCgkvLyBTaW5nbGUgZWxlbWVudAoJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7CgkJfSApOwoJfQoKCS8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KQoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDsKCQl9ICk7Cgl9CgoJLy8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9ycwoJcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJfQoKCWlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJcmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTsKCX0KCglyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCX0gKSApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCByZXQsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfSApICk7CgkJfQoKCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTsKCgkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJcmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7Cgl9LAoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKCX0sCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5ndGg7Cgl9Cn0gKTsKCgovLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAoKCi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQp2YXIgcm9vdGpRdWVyeSwKCgkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCgkvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkCglycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLywKCglpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7CgkJdmFyIG1hdGNoLCBlbGVtOwoKCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCgkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CgkJLy8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKQoJCXJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCgkJCQlzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYKCQkJCXNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewoKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsgMSBdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDsKCgkJCQkJLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWyAxIF0sCgkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCgkJCQkJCXRydWUKCQkJCQkpICk7CgoJCQkJCS8vIEhBTkRMRTogJChodG1sLCBwcm9wcykKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCWZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7CgoJCQkJCQkJLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZQoJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CgkJCQkJCQkJdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOwoKCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQoJCQkJfSBlbHNlIHsKCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTsKCgkJCQkJaWYgKCBlbGVtICkgewoKCQkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpc1sgMCBdID0gZWxlbTsKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKCQkJdGhpc1sgMCBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID8KCQkJCXJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgoKCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKCQkJCXNlbGVjdG9yKCBqUXVlcnkgKTsKCQl9CgoJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwoJfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgovLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CgoKdmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoKCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWwgPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSAwOwoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CgkJdmFyIGN1ciwKCQkJaSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJbWF0Y2hlZCA9IFtdLAoJCQl0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTsKCgkJLy8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dAoJCWlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgoJCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID8KCQkJCQkJdGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6CgoJCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKCQkJCQkJY3VyLm5vZGVUeXBlID09PSAxICYmCgkJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKCgkJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBJbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLAoKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQoJCSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZVNvcnQoCgkJCQlqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCgkJCSkKCQkpOwoJfSwKCglhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Cn0gKTsKCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJd2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goIHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewogICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDsKICAgICAgICB9CgogICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seQogICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdAogICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgInRlbXBsYXRlIiApICkgewogICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CgoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcwoJCQlpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCQltYXRjaGVkLnJldmVyc2UoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7Cgl9Owp9ICk7CnZhciBybm90aHRtbHdoaXRlID0gKCAvW15ceDIwXHRcclxuXGZdKy9nICk7CgoKCi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0ge307CglqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9ICk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoKICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCWNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZwoJCWZpcmluZywKCgkJLy8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMKCQltZW1vcnksCgoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCgkJZmlyZWQsCgoJCS8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmcKCQlsb2NrZWQsCgoJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoKCQkvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXF1ZXVlID0gW10sCgoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKQoJCWZpcmluZ0luZGV4ID0gLTEsCgoJCS8vIEZpcmUgY2FsbGJhY2tzCgkJZmlyZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nCgkJCWxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7CgoJCQkvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucywKCQkJLy8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlcwoJCQlmaXJlZCA9IGZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkgewoJCQkJbWVtb3J5ID0gcXVldWUuc2hpZnQoKTsKCQkJCXdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgewoKCQkJCQkvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvbgoJCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmCgkJCQkJCW9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgoJCQkJCQkvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCgkJCQkJCWZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7CgkJCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdAoJCQlpZiAoICFvcHRpb25zLm1lbW9yeSApIHsKCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQl9CgoJCQlmaXJpbmcgPSBmYWxzZTsKCgkJCS8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kCgkJCWlmICggbG9ja2VkICkgewoKCQkJCS8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHMKCQkJCWlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCgkJCQkvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50CgkJCQl9IGVsc2UgewoJCQkJCWxpc3QgPSAiIjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCgkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCgkJCQkJLy8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmcKCQkJCQlpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewoJCQkJCQlmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTsKCQkJCQkJcXVldWUucHVzaCggbWVtb3J5ICk7CgkJCQkJfQoKCQkJCQkoIGZ1bmN0aW9uIGFkZCggYXJncyApIHsKCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCQlpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gInN0cmluZyIgKSB7CgoJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKCQkJCQkJCQlhZGQoIGFyZyApOwoJCQkJCQkJfQoJCQkJCQl9ICk7CgkJCQkJfSApKCBhcmd1bWVudHMgKTsKCgkJCQkJaWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHsKCQkJCQkJZmlyZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJCQl2YXIgaW5kZXg7CgkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7CgkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoKCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQlmaXJpbmdJbmRleC0tOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CgkJCQlyZXR1cm4gZm4gPwoJCQkJCWpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOgoJCQkJCWxpc3QubGVuZ3RoID4gMDsKCQkJfSwKCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZAoJCQkvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnMKCQkJLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbG9ja2VkID0gcXVldWUgPSBbXTsKCQkJCWxpc3QgPSBtZW1vcnkgPSAiIjsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgoJCQkvLyBEaXNhYmxlIC5maXJlCgkJCS8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpCgkJCS8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlsb2NrZWQgPSBxdWV1ZSA9IFtdOwoJCQkJaWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7CgkJCQkJbGlzdCA9IG1lbW9yeSA9ICIiOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFsb2NrZWQ7CgkJCX0sCgoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWlmICggIWxvY2tlZCApIHsKCQkJCQlhcmdzID0gYXJncyB8fCBbXTsKCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOwoJCQkJCXF1ZXVlLnB1c2goIGFyZ3MgKTsKCQkJCQlpZiAoICFmaXJpbmcgKSB7CgkJCQkJCWZpcmUoKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CgoKZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7CglyZXR1cm4gdjsKfQpmdW5jdGlvbiBUaHJvd2VyKCBleCApIHsKCXRocm93IGV4Owp9CgpmdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkgewoJdmFyIG1ldGhvZDsKCgl0cnkgewoKCQkvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yCgkJaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkgewoJCQltZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7CgoJCS8vIE90aGVyIHRoZW5hYmxlcwoJCX0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7CgkJCW1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7CgoJCS8vIE90aGVyIG5vbi10aGVuYWJsZXMKCQl9IGVsc2UgewoKCQkJLy8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOgoJCQkvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApCgkJCS8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpCgkJCXJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTsKCQl9CgoJLy8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zCgkvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluCgkvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLgoJfSBjYXRjaCAoIHZhbHVlICkgewoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5CgkJLy8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dAoJCXJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCggewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoKCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsCgkJCQkvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJtZW1vcnkiICksIDIgXSwKCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKCQkJCQlqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIDAsICJyZXNvbHZlZCIgXSwKCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwgMSwgInJlamVjdGVkIiBdCgkJCV0sCgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJCSJjYXRjaCI6IGZ1bmN0aW9uKCBmbiApIHsKCQkJCQlyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApOwoJCQkJfSwKCgkJCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJCQlwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CgkJCQkJdmFyIGZucyA9IGFyZ3VtZW50czsKCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgoJCQkJCQkJLy8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpCgkJCQkJCQl2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdOwoKCQkJCQkJCS8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KQoJCQkJCQkJLy8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pCgkJCQkJCQkvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KQoJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKAoJCQkJCQkJCQkJdGhpcywKCQkJCQkJCQkJCWZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzCgkJCQkJCQkJCSk7CgkJCQkJCQkJfQoJCQkJCQkJfSApOwoJCQkJCQl9ICk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSApLnByb21pc2UoKTsKCQkJCX0sCgkJCQl0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7CgkJCQkJdmFyIG1heERlcHRoID0gMDsKCQkJCQlmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7CgkJCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkJCXZhciB0aGF0ID0gdGhpcywKCQkJCQkJCQlhcmdzID0gYXJndW1lbnRzLAoJCQkJCQkJCW1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyIHJldHVybmVkLCB0aGVuOwoKCQkJCQkJCQkJLy8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjMKCQkJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTkKCQkJCQkJCQkJLy8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzCgkJCQkJCQkJCWlmICggZGVwdGggPCBtYXhEZXB0aCApIHsKCQkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7CgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xCgkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4CgkJCQkJCQkJCWlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHsKCQkJCQkJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iICk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNQoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NAoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NQoJCQkJCQkJCQkvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlCgkJCQkJCQkJCXRoZW4gPSByZXR1cm5lZCAmJgoKCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjQKCQkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0CgkJCQkJCQkJCQkvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHkKCQkJCQkJCQkJCSggdHlwZW9mIHJldHVybmVkID09PSAib2JqZWN0IiB8fAoJCQkJCQkJCQkJCXR5cGVvZiByZXR1cm5lZCA9PT0gImZ1bmN0aW9uIiApICYmCgkJCQkJCQkJCQlyZXR1cm5lZC50aGVuOwoKCQkJCQkJCQkJLy8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGUKCQkJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7CgoJCQkJCQkJCQkJLy8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvbgoJCQkJCQkJCQkJaWYgKCBzcGVjaWFsICkgewoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICkKCQkJCQkJCQkJCQkpOwoKCQkJCQkJCQkJCS8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzcwoJCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkJLy8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlcwoJCQkJCQkJCQkJCW1heERlcHRoKys7CgoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksCgkJCQkJCQkJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoICkKCQkJCQkJCQkJCQkpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXMKCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0CgkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCWlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7CgkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQlhcmdzID0gWyByZXR1cm5lZCBdOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpCgkJCQkJCQkJCQkvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZQoJCQkJCQkJCQkJKCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0sCgoJCQkJCQkJCS8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9ucwoJCQkJCQkJCXByb2Nlc3MgPSBzcGVjaWFsID8KCQkJCQkJCQkJbWlnaHRUaHJvdyA6CgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJCQltaWdodFRocm93KCk7CgkJCQkJCQkJCQl9IGNhdGNoICggZSApIHsKCgkJCQkJCQkJCQkJaWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHsKCQkJCQkJCQkJCQkJalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsCgkJCQkJCQkJCQkJCQlwcm9jZXNzLnN0YWNrVHJhY2UgKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjEKCQkJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MQoJCQkJCQkJCQkJCS8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9ucwoJCQkJCQkJCQkJCWlmICggZGVwdGggKyAxID49IG1heERlcHRoICkgewoKCQkJCQkJCQkJCQkJLy8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dAoJCQkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCQkJaWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkgewoJCQkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQkJCWFyZ3MgPSBbIGUgXTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJfTsKCgkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMQoJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTcKCQkJCQkJCS8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb20KCQkJCQkJCS8vIHN1YnNlcXVlbnQgZXJyb3JzCgkJCQkJCQlpZiAoIGRlcHRoICkgewoJCQkJCQkJCXByb2Nlc3MoKTsKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCS8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvbgoJCQkJCQkJCS8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luYwoJCQkJCQkJCWlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHsKCQkJCQkJCQkJcHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpOwoJCQkJCQkJCX0KCQkJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApOwoJCQkJCQkJfQoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoKCQkJCQkJLy8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKQoJCQkJCQl0dXBsZXNbIDAgXVsgMyBdLmFkZCgKCQkJCQkJCXJlc29sdmUoCgkJCQkJCQkJMCwKCQkJCQkJCQluZXdEZWZlciwKCQkJCQkJCQlpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgPwoJCQkJCQkJCQlvblByb2dyZXNzIDoKCQkJCQkJCQkJSWRlbnRpdHksCgkJCQkJCQkJbmV3RGVmZXIubm90aWZ5V2l0aAoJCQkJCQkJKQoJCQkJCQkpOwoKCQkJCQkJLy8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAxIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/CgkJCQkJCQkJCW9uRnVsZmlsbGVkIDoKCQkJCQkJCQkJSWRlbnRpdHkKCQkJCQkJCSkKCQkJCQkJKTsKCgkJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAyIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25SZWplY3RlZCApID8KCQkJCQkJCQkJb25SZWplY3RlZCA6CgkJCQkJCQkJCVRocm93ZXIKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQl9ICkucHJvbWlzZSgpOwoJCQkJfSwKCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwKCQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdOwoKCQkJLy8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkCgkJCXByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVTdHJpbmcgKSB7CgkJCQlsaXN0LmFkZCgKCQkJCQlmdW5jdGlvbigpIHsKCgkJCQkJCS8vIHN0YXRlID0gInJlc29sdmVkIiAoaS5lLiwgZnVsZmlsbGVkKQoJCQkJCQkvLyBzdGF0ZSA9ICJyZWplY3RlZCIKCQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKCQkJCQl9LAoKCQkJCQkvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCS8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsCgoJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGUKCQkJCQkvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsCgoJCQkJCS8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDIgXS5sb2NrLAoKCQkJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDMgXS5sb2NrCgkJCQkpOwoJCQl9CgoJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlCgkJCS8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlCgkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmUKCQkJbGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApOwoKCQkJLy8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfQoJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7CgkJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgoJCQkvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aAoJCQkvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJLy8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSApOwoKCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CgoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoKCQkvLyBBbGwgZG9uZSEKCQlyZXR1cm4gZGVmZXJyZWQ7Cgl9LAoKCS8vIERlZmVycmVkIGhlbHBlcgoJd2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkgewoJCXZhcgoKCQkJLy8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCgkJCXJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsCgoJCQkvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHMKCQkJaSA9IHJlbWFpbmluZywKCgkJCS8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGEKCQkJcmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSwKCQkJcmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoKCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZAoJCQltYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCgkJCS8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3RvcnkKCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwoJCQkJCWlmICggISggLS1yZW1haW5pbmcgKSApIHsKCQkJCQkJbWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoKCQkvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmUKCQlpZiAoIHJlbWFpbmluZyA8PSAxICkgewoJCQlhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsCgkJCQkhcmVtYWluaW5nICk7CgoJCQkvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApCgkJCWlmICggbWFzdGVyLnN0YXRlKCkgPT09ICJwZW5kaW5nIiB8fAoJCQkJaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7CgoJCQkJcmV0dXJuIG1hc3Rlci50aGVuKCk7CgkJCX0KCQl9CgoJCS8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzCgkJd2hpbGUgKCBpLS0gKSB7CgkJCWFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7CgkJfQoKCQlyZXR1cm4gbWFzdGVyLnByb21pc2UoKTsKCX0KfSApOwoKCi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LAovLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC4KdmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87CgpqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7CgoJLy8gU3VwcG9ydDogSUUgOCAtIDkgb25seQoJLy8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKCWlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7CgkJd2luZG93LmNvbnNvbGUud2FybiggImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTsKCX0KfTsKCgoKCmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQl0aHJvdyBlcnJvcjsKCX0gKTsKfTsKCgoKCi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQp2YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgoJcmVhZHlMaXN0CgkJLnRoZW4oIGZuICkKCgkJLy8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXAKCQkvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2sKCQkvLyByZWdpc3RyYXRpb24uCgkJLmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7CgkJCWpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTsKCQl9ICk7CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KCWlzUmVhZHk6IGZhbHNlLAoKCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCglyZWFkeVdhaXQ6IDEsCgoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewoKCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CgkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCX0KfSApOwoKalF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjsKCi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHsKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKCWpRdWVyeS5yZWFkeSgpOwp9CgovLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZAovLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seQovLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyAiaW50ZXJhY3RpdmUiIHRvbyBzb29uCmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fAoJKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkgewoKCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwoKfSBlbHNlIHsKCgkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCApOwoKCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKfQoKCgoKLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgp2YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGVsZW1zLmxlbmd0aCwKCQlidWxrID0ga2V5ID09IG51bGw7CgoJLy8gU2V0cyBtYW55IHZhbHVlcwoJaWYgKCB0b1R5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKCQljaGFpbmFibGUgPSB0cnVlOwoJCWZvciAoIGkgaW4ga2V5ICkgewoJCQlhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8gU2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmF3ID0gdHJ1ZTsKCQl9CgoJCWlmICggYnVsayApIHsKCgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0KCQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQkJZm4oCgkJCQkJZWxlbXNbIGkgXSwga2V5LCByYXcgPwoJCQkJCXZhbHVlIDoKCQkJCQl2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQoJCQkJKTsKCQkJfQoJCX0KCX0KCglpZiAoIGNoYWluYWJsZSApIHsKCQlyZXR1cm4gZWxlbXM7Cgl9CgoJLy8gR2V0cwoJaWYgKCBidWxrICkgewoJCXJldHVybiBmbi5jYWxsKCBlbGVtcyApOwoJfQoKCXJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDsKfTsKCgovLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKdmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7CgovLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7CglyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Cn0KCi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQovLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkgewoJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwp9CnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgewoKCS8vIEFjY2VwdHMgb25seToKCS8vICAtIE5vZGUKCS8vICAgIC0gTm9kZS5FTEVNRU5UX05PREUKCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCgkvLyAgLSBPYmplY3QKCS8vICAgIC0gQW55CglyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cn07CgoKCgpmdW5jdGlvbiBEYXRhKCkgewoJdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwp9CgpEYXRhLnVpZCA9IDE7CgpEYXRhLnByb3RvdHlwZSA9IHsKCgljYWNoZTogZnVuY3Rpb24oIG93bmVyICkgewoKCQkvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUKCQl2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCS8vIElmIG5vdCwgY3JlYXRlIG9uZQoJCWlmICggIXZhbHVlICkgewoJCQl2YWx1ZSA9IHt9OwoKCQkJLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCgkJCS8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCgkJCS8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LgoJCQlpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CgoJCQkJLy8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlcgoJCQkJLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQKCQkJCWlmICggb3duZXIubm9kZVR5cGUgKSB7CgkJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7CgoJCQkJLy8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5CgkJCQkvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQoJCQkJLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoJCQkJfSBlbHNlIHsKCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHsKCQkJCQkJdmFsdWU6IHZhbHVlLAoJCQkJCQljb25maWd1cmFibGU6IHRydWUKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB2YWx1ZTsKCX0sCglzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CgkJdmFyIHByb3AsCgkJCWNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJncwoJCS8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1NykKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJY2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKCQl9IGVsc2UgewoKCQkJLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKCQkJZm9yICggcHJvcCBpbiBkYXRhICkgewoJCQkJY2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07CgkJCX0KCQl9CgkJcmV0dXJuIGNhY2hlOwoJfSwKCWdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcy5jYWNoZSggb3duZXIgKSA6CgoJCQkvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpCgkJCW93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTsKCX0sCglhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHsKCgkJLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAoJCS8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAoJCS8vCgkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQoJCS8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKCQkvLwoJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKCQkvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5CgkJLy8KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CgkJCQkoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7CgkJfQoKCQkvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQoJCS8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwoJCS8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCgkJLy8KCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKCgkJLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cwoJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQoJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7Cgl9LAoJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKCQl2YXIgaSwKCQkJY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCWlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzCgkJCWlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7CgoJCQkJLy8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KCQkJCS8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LgoJCQkJa2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7CgkJCX0gZWxzZSB7CgkJCQlrZXkgPSBjYW1lbENhc2UoIGtleSApOwoKCQkJCS8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC4KCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCgkJCQlrZXkgPSBrZXkgaW4gY2FjaGUgPwoJCQkJCVsga2V5IF0gOgoJCQkJCSgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTsKCQkJfQoKCQkJaSA9IGtleS5sZW5ndGg7CgoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKCgkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUKCQkJLy8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKCQkJLy8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZAoJCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKQoJCQlpZiAoIG93bmVyLm5vZGVUeXBlICkgewoJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKCQkJfQoJCX0KCX0sCgloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CgkJdmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdOwoJCXJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTsKCX0KfTsKdmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTsKCnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7CgoKCi8vCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKLy8KLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAovLwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLy8JCXBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS4KLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgovLwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQovLwk1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcykKLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0Cgp2YXIgcmJyYWNlID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvW0EtWl0vZzsKCmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7CglpZiAoIGRhdGEgPT09ICJ0cnVlIiApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGRhdGEgPT09ICJmYWxzZSIgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggZGF0YSA9PT0gIm51bGwiICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCglpZiAoIGRhdGEgPT09ICtkYXRhICsgIiIgKSB7CgkJcmV0dXJuICtkYXRhOwoJfQoKCWlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHsKCQlyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApOwoJfQoKCXJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewoJdmFyIG5hbWU7CgoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNhc2UoKTsKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0gZ2V0RGF0YSggZGF0YSApOwoJCQl9IGNhdGNoICggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCXJldHVybiBkYXRhOwp9CgpqUXVlcnkuZXh0ZW5kKCB7CgloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTsKCX0sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWQKCS8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKCX0sCgoJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaSwgbmFtZSwgZGF0YSwKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJYXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgImhhc0RhdGFBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUgMTEgb25seQoJCQkJCQkvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NCkKCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgewoJCQkJCQkJbmFtZSA9IGF0dHJzWyBpIF0ubmFtZTsKCQkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CgkJCQkJCQkJbmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTsKCQkJfSApOwoJCX0KCgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZGF0YTsKCgkJCS8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CgkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCgkJCS8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0CgkJCS8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KCQkJaWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZQoJCQkJLy8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGEKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gQXR0ZW1wdCB0byAiZGlzY292ZXIiIHRoZSBkYXRhIGluCgkJCQkvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCgkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRhdGEuLi4KCQkJdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCgkJCQkvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5CgkJCQlkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApOwoJCX0gKTsKCX0KfSApOwoKCmpRdWVyeS5leHRlbmQoIHsKCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKCQl2YXIgcXVldWU7CgoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwoJCQlxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApOwoKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJcXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWV1ZS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOwoJCX0KCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCgkJCW5leHQgPSBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CgkJCX07CgoJCS8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkJc3RhcnRMZW5ndGgtLTsKCQl9CgoJCWlmICggZm4gKSB7CgoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CgkJCX0KCgkJCS8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CgkJfQoKCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCX0KCX0sCgoJLy8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmUKCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKCQlyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwgewoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLmFkZCggZnVuY3Rpb24oKSB7CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1ZSIsIGtleSBdICk7CgkJCX0gKQoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWyAwIF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9ICk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSApOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoKCS8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsKCQl2YXIgdG1wLAoJCQljb3VudCA9IDEsCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IHRoaXMubGVuZ3RoLAoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwoJCQkJfQoJCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJb2JqID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJd2hpbGUgKCBpLS0gKSB7CgkJCXRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0gKTsKdmFyIHBudW0gPSAoIC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8gKS5zb3VyY2U7Cgp2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CgoKdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKCnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgoJCS8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwoJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAoJCWVsZW0gPSBlbCB8fCBlbGVtOwoKCQkvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbAoJCXJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fAoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmCgoJCQkvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlCgkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1CgkJCS8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpcwoJCQkvLyBpbiB0aGUgZG9jdW1lbnQuCgkJCWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiYKCgkJCWpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSI7Cgl9OwoKdmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Cgl2YXIgcmV0LCBuYW1lLAoJCW9sZCA9IHt9OwoKCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCX0KCglyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwoKCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQoKCXJldHVybiByZXQ7Cn07CgoKCgpmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgewoJdmFyIGFkanVzdGVkLCBzY2FsZSwKCQltYXhJdGVyYXRpb25zID0gMjAsCgkJY3VycmVudFZhbHVlID0gdHdlZW4gPwoJCQlmdW5jdGlvbigpIHsKCQkJCXJldHVybiB0d2Vlbi5jdXIoKTsKCQkJfSA6CgkJCWZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsICIiICk7CgkJCX0sCgkJaW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLAoJCXVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAoKCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCWluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKCQkJcmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTsKCglpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgewoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTQKCQkvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpCgkJaW5pdGlhbCA9IGluaXRpYWwgLyAyOwoKCQkvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzCgkJdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdOwoKCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCWluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxOwoKCQl3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHsKCgkJCS8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuCgkJCS8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS4KCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApOwoJCQlpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHsKCQkJCW1heEl0ZXJhdGlvbnMgPSAwOwoJCQl9CgkJCWluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CgoJCX0KCgkJaW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyOwoJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTsKCgkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCXZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdOwoJfQoKCWlmICggdmFsdWVQYXJ0cyApIHsKCQlpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDsKCgkJLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkCgkJYWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gPwoJCQlpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOgoJCQkrdmFsdWVQYXJ0c1sgMiBdOwoJCWlmICggdHdlZW4gKSB7CgkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQl0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7CgkJCXR3ZWVuLmVuZCA9IGFkanVzdGVkOwoJCX0KCX0KCXJldHVybiBhZGp1c3RlZDsKfQoKCnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9OwoKZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7Cgl2YXIgdGVtcCwKCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCgkJbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLAoJCWRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTsKCglpZiAoIGRpc3BsYXkgKSB7CgkJcmV0dXJuIGRpc3BsYXk7Cgl9CgoJdGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApOwoJZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsICJkaXNwbGF5IiApOwoKCXRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApOwoKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCWRpc3BsYXkgPSAiYmxvY2siOwoJfQoJZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZGlzcGxheSwgZWxlbSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCS8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZQoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoKCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwoJCWlmICggc2hvdyApIHsKCgkJCS8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdykKCQkJLy8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyCgkJCS8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZCkKCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJkaXNwbGF5IiApIHx8IG51bGw7CgkJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CgkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQl9CgkJCX0KCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gIm5vbmUiOwoKCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmcKCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvdwoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkgewoJCQllbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgewoJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CgkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0gKTsKCX0KfSApOwp2YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7Cgp2YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pICk7Cgp2YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApOwoKCgovLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKQp2YXIgd3JhcE1hcCA9IHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCgkvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZQoJLy8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlbgoJLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgoJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgljb2w6IFsgMiwgIjx0YWJsZT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAoKCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCn07CgovLyBTdXBwb3J0OiBJRSA8PTkgb25seQp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Cgp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5CgkvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpCgl2YXIgcmV0OwoKCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgewoJCXJldCA9IFtdOwoJfQoKCWlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHsKCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKCi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZApmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Cgl2YXIgaSA9IDAsCgkJbCA9IGVsZW1zLmxlbmd0aDsKCglmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJZGF0YVByaXYuc2V0KAoJCQllbGVtc1sgaSBdLAoJCQkiZ2xvYmFsRXZhbCIsCgkJCSFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCgkJKTsKCX0KfQoKCnZhciByaHRtbCA9IC88fCYjP1x3KzsvOwoKZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKCXZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlub2RlcyA9IFtdLAoJCWkgPSAwLAoJCWwgPSBlbGVtcy5sZW5ndGg7CgoJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1sgaSBdOwoKCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKCgkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQoJCQlpZiAoIHRvVHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQoJCQl9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CgoJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKCQkJfSBlbHNlIHsKCQkJCXRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CgoJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgoJCQkJdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwoJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07CgoJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CgkJCQlqID0gd3JhcFsgMCBdOwoJCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQkJdG1wID0gdG1wLmxhc3RDaGlsZDsKCQkJCX0KCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CgoJCQkJLy8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIKCQkJCXRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQkJLy8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKQoJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9Cgl9CgoJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAoJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKCglpID0gMDsKCXdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CgoJCS8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpCgkJaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7CgkJCWlmICggaWdub3JlZCApIHsKCQkJCWlnbm9yZWQucHVzaCggZWxlbSApOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCgkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKCQl0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlpZiAoIGNvbnRhaW5zICkgewoJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKCQl9CgoJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKCQlpZiAoIHNjcmlwdHMgKSB7CgkJCWogPSAwOwoJCQl3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHsKCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGZyYWdtZW50Owp9CgoKKCBmdW5jdGlvbigpIHsKCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApLAoJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHkKCS8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpCgkvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCgkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAicmFkaW8iICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seQoJLy8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZAoJZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOwp9ICkoKTsKdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgoKdmFyCglya2V5RXZlbnQgPSAvXmtleS8sCglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkvOwoKZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKCXJldHVybiBmYWxzZTsKfQoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvCmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewoJdHJ5IHsKCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCX0gY2F0Y2ggKCBlcnIgKSB7IH0KfQoKZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHsKCXZhciBvcmlnRm4sIHR5cGU7CgoJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCglpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCW9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJfQoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgoJCS8vICggdHlwZXMsIGZuICkKCQlmbiA9IHNlbGVjdG9yOwoJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0gZWxzZSB7CgoJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9Cgl9CglpZiAoIGZuID09PSBmYWxzZSApIHsKCQlmbiA9IHJldHVybkZhbHNlOwoJfSBlbHNlIGlmICggIWZuICkgewoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggb25lID09PSAxICkgewoJCW9yaWdGbiA9IGZuOwoJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCgkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKCX0KCXJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkgewoJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCX0gKTsKfQoKLyoKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCWdsb2JhbDoge30sCgoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewoKCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCgkJCWV2ZW50cywgdCwgaGFuZGxlT2JqLAoJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCgkJCWVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZQoJCS8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KQoJCWlmICggc2VsZWN0b3IgKSB7CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAoJCWlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7CgkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OwoJCX0KCQlpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7CgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPwoJCQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCgkJCWlmICggIXR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCgkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9yaWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oICIuIiApCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQlpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fAoJCQkJCXNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CgoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2UgewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJfSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCgkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCWlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwoJCQl0bXAgPSB0bXBbIDIgXSAmJgoJCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOwoJCQl3aGlsZSAoIGotLSApIHsKCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CgoJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgoJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCgkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgoJCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwKCQkJCQkJc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CgkJCQkJfQoJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwKCQkJCQlzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCgkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CgkJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgImhhbmRsZSBldmVudHMiICk7CgkJfQoJfSwKCglkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkgewoKCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKCQl2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApOwoKCQl2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSwKCQkJYXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLAoJCQloYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJCS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1sgMCBdID0gZXZlbnQ7CgoJCWZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewoJCQlhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTsKCQl9CgoJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJd2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CgoJCQlqID0gMDsKCQkJd2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiYKCQkJCSFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoKCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2UocykKCQkJCS8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgoJCQkJaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKCgkJCQkJcmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fAoJCQkJCQloYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycywKCQkJaGFuZGxlclF1ZXVlID0gW10sCgkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAoJCQljdXIgPSBldmVudC50YXJnZXQ7CgoJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OQoJCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MCkKCQkJY3VyLm5vZGVUeXBlICYmCgoJCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDIKCQkJLy8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKQoJCQkvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrCgkJCS8vIFN1cHBvcnQ6IElFIDExIG9ubHkKCQkJLy8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgImNsaWNrcyIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0MykKCQkJISggZXZlbnQudHlwZSA9PT0gImNsaWNrIiAmJiBldmVudC5idXR0b24gPj0gMSApICkgewoKCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CgoJCQkJLy8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpCgkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09ICJjbGljayIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7CgkJCQkJbWF0Y2hlZEhhbmRsZXJzID0gW107CgkJCQkJbWF0Y2hlZFNlbGVjdG9ycyA9IHt9OwoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgewoJCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwoKCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwoKCQkJCQkJaWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7CgkJCQkJCQltYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycwoJCWN1ciA9IHRoaXM7CgkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewoJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTsKCQl9CgoJCXJldHVybiBoYW5kbGVyUXVldWU7Cgl9LAoKCWFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkgewoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwgewoJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQljb25maWd1cmFibGU6IHRydWUsCgoJCQlnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/CgkJCQlmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHsKCQkJCQkJCXJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTsKCQkJCQl9CgkJCQl9IDoKCQkJCWZ1bmN0aW9uKCkgewoJCQkJCWlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkgewoJCQkJCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdOwoJCQkJCX0KCQkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwgewoJCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCQkJCXdyaXRhYmxlOiB0cnVlLAoJCQkJCXZhbHVlOiB2YWx1ZQoJCQkJfSApOwoJCQl9CgkJfSApOwoJfSwKCglmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkgewoJCXJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KCQkJb3JpZ2luYWxFdmVudCA6CgkJCW5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCgkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKCQkJbm9CdWJibGU6IHRydWUKCQl9LAoJCWZvY3VzOiB7CgoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgoJCX0sCgkJYmx1cjogewoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKCQl9LAoJCWNsaWNrOiB7CgoJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKCQkJCQl0aGlzLmNsaWNrKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoKCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCgkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlyZXR1cm4gbm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCgkvLyBUaGlzICJpZiIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzCglpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApOwoJfQp9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKCQkJCXNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiYKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkKCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7CgoJCS8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllcwoJCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHkKCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCXRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/CgkJCXNyYy50YXJnZXQucGFyZW50Tm9kZSA6CgkJCXNyYy50YXJnZXQ7CgoJCXRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0OwoJCXRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0OwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwovLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzU2ltdWxhdGVkOiBmYWxzZSwKCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJfQoKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfQp9OwoKLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHMKalF1ZXJ5LmVhY2goIHsKCWFsdEtleTogdHJ1ZSwKCWJ1YmJsZXM6IHRydWUsCgljYW5jZWxhYmxlOiB0cnVlLAoJY2hhbmdlZFRvdWNoZXM6IHRydWUsCgljdHJsS2V5OiB0cnVlLAoJZGV0YWlsOiB0cnVlLAoJZXZlbnRQaGFzZTogdHJ1ZSwKCW1ldGFLZXk6IHRydWUsCglwYWdlWDogdHJ1ZSwKCXBhZ2VZOiB0cnVlLAoJc2hpZnRLZXk6IHRydWUsCgl2aWV3OiB0cnVlLAoJImNoYXIiOiB0cnVlLAoJY2hhckNvZGU6IHRydWUsCglrZXk6IHRydWUsCglrZXlDb2RlOiB0cnVlLAoJYnV0dG9uOiB0cnVlLAoJYnV0dG9uczogdHJ1ZSwKCWNsaWVudFg6IHRydWUsCgljbGllbnRZOiB0cnVlLAoJb2Zmc2V0WDogdHJ1ZSwKCW9mZnNldFk6IHRydWUsCglwb2ludGVySWQ6IHRydWUsCglwb2ludGVyVHlwZTogdHJ1ZSwKCXNjcmVlblg6IHRydWUsCglzY3JlZW5ZOiB0cnVlLAoJdGFyZ2V0VG91Y2hlczogdHJ1ZSwKCXRvRWxlbWVudDogdHJ1ZSwKCXRvdWNoZXM6IHRydWUsCgoJd2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uOwoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJcmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkgewoJCQlpZiAoIGJ1dHRvbiAmIDEgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCBidXR0b24gJiAyICkgewoJCQkJcmV0dXJuIDM7CgkJCX0KCgkJCWlmICggYnV0dG9uICYgNCApIHsKCQkJCXJldHVybiAyOwoJCQl9CgoJCQlyZXR1cm4gMDsKCQl9CgoJCXJldHVybiBldmVudC53aGljaDsKCX0KfSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwovLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LgovLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dAovLwovLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5Ci8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNTgKLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4KalF1ZXJ5LmVhY2goIHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKCXBvaW50ZXJlbnRlcjogInBvaW50ZXJvdmVyIiwKCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCWRlbGVnYXRlVHlwZTogZml4LAoJCWJpbmRUeXBlOiBmaXgsCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcmV0LAoJCQkJdGFyZ2V0ID0gdGhpcywKCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAoJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwoKCQkJLy8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewoJCXJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8KCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDoKCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9ICk7Cgl9Cn0gKTsKCgp2YXIKCgkvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgoJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5CglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksCgoJLyogZXNsaW50LWVuYWJsZSAqLwoKCS8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHkKCS8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuCgkvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLwoJcm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksCgoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKCi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93cwpmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglpZiAoIG5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgKSB7CgoJCXJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggInRib2R5IiApWyAwIF0gfHwgZWxlbTsKCX0KCglyZXR1cm4gZWxlbTsKfQoKLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgpmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgewoJZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICkgIT09IG51bGwgKSArICIvIiArIGVsZW0udHlwZTsKCXJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CglpZiAoICggZWxlbS50eXBlIHx8ICIiICkuc2xpY2UoIDAsIDUgKSA9PT0gInRydWUvIiApIHsKCQllbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTsKCX0gZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoICJ0eXBlIiApOwoJfQoKCXJldHVybiBlbGVtOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoJdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgoJaWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKCQlwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7CgkJcGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CgkJZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CgoJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyAyLiBDb3B5IHVzZXIgZGF0YQoJaWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHsKCQl1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7CgkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKCgkJZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOwoJfQp9CgovLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoJfQp9CgpmdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7CgoJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJYXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgl2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsCgkJaSA9IDAsCgkJbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAoJCWlOb0Nsb25lID0gbCAtIDEsCgkJdmFsdWUgPSBhcmdzWyAwIF0sCgkJdmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCWlmICggdmFsdWVJc0Z1bmN0aW9uIHx8CgkJCSggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJgoJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQl2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7CgkJCWlmICggdmFsdWVJc0Z1bmN0aW9uICkgewoJCQkJYXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7CgkJCX0KCQkJZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CgkJfSApOwoJfQoKCWlmICggbCApIHsKCQlmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApOwoJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQl9CgoJCS8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjawoJCWlmICggZmlyc3QgfHwgaWdub3JlZCApIHsKCQkJc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOwoKCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbQoJCQkvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJbm9kZSA9IGZyYWdtZW50OwoKCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CgkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwoKCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJCQkJaWYgKCBoYXNTY3JpcHRzICkgewoKCQkJCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJCQl9CgkJCQl9CgoJCQkJY2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7CgkJCX0KCgkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CgoJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwoJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOwoKCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewoJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07CgkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgoJCQkJCQkhZGF0YVByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgoJCQkJCQlqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJaWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCAiIiApLnRvTG93ZXJDYXNlKCkgICE9PSAibW9kdWxlIiApIHsKCgkJCQkJCQkvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudAoJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CgkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICksIGRvYywgbm9kZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBjb2xsZWN0aW9uOwp9CgpmdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCXZhciBub2RlLAoJCW5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSwKCQlpID0gMDsKCglmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7CgkJaWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKCQl9CgoJCWlmICggbm9kZS5wYXJlbnROb2RlICkgewoJCQlpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7CgkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJfQoJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTsKCQl9Cgl9CgoJcmV0dXJuIGVsZW07Cn0KCmpRdWVyeS5leHRlbmQoIHsKCWh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAoJCQlpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCgkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgoJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJCX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKCQkJaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCQlpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkgewoJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CgkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CgoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJaWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgkJfQoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOwoJfSwKCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwoJCQkJCX0KCQkJCX0gKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0gKTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKCQkJCXRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0gKTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwoKCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7CgkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOwoKCQlyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0gKTsKCX0sCgoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CgoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2ggKCBlICkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgaWdub3JlZCA9IFtdOwoKCQkvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnQKCQlyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQlpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkgewoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKCQkJCWlmICggcGFyZW50ICkgewoJCQkJCXBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJCX0KCQkJfQoKCQkvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uCgkJfSwgaWdub3JlZCApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAoJCQlpID0gMDsKCgkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKCQkJalF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0gKTsKdmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApOwoKdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApCgkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCgkJLy8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoICJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlIgoJCXZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQlpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHsKCQkJdmlldyA9IHdpbmRvdzsKCQl9CgoJCXJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTsKCX07Cgp2YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oICJ8IiApLCAiaSIgKTsKCgoKKCBmdW5jdGlvbigpIHsKCgkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQKCS8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uCglmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHsKCgkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZQoJCWlmICggIWRpdiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4OyIgKwoJCQkibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIjsKCQlkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7IiArCgkJCSJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4OyIgKwoJCQkid2lkdGg6NjAlO3RvcDoxJSI7CgkJZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTsKCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0CgkJcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjMKCQkvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3QKCQlkaXYuc3R5bGUucmlnaHQgPSAiNjAlIjsKCQlwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkJLy8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50cwoJCWJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjsKCgkJLy8gU3VwcG9ydDogSUUgOSBvbmx5CgkJLy8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KQoJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgImFic29sdXRlIjsKCgkJZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCgkJLy8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZAoJCS8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQKCQlkaXYgPSBudWxsOwoJfQoKCWZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHsKCQlyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7Cgl9CgoJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCwKCQlyZWxpYWJsZU1hcmdpbkxlZnRWYWwsCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFkaXYuc3R5bGUgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCS8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CglkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOwoKCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKCQl9LAoJCXBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsOwoJCX0sCgkJcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgkJcmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKCQl9LAoJCXNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkgewoJCQljb21wdXRlU3R5bGVUZXN0cygpOwoJCQlyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDsKCQl9Cgl9ICk7Cn0gKSgpOwoKCmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7Cgl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDUxKwoJCS8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3cKCQkvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzCgkJLy8gb24gZGV0YWNoZWQgZWxlbWVudHMKCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6CgkvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNykKCS8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KQoJaWYgKCBjb21wdXRlZCApIHsKCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKCgkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQl9CgoJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJLy8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsCgkJLy8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy4KCQkvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQlpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CgkJfQoJfQoKCXJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CgoJCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCQkvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgoJCXJldCArICIiIDoKCQlyZXQ7Cn0KCgpmdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgoJLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KCXJldHVybiB7CgkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJaWYgKCBjb25kaXRpb25GbigpICkgewoKCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZQoJCQkJLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCQkJcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfTsKfQoKCnZhcgoKCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUKCS8vIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglyY3VzdG9tUHJvcCA9IC9eLS0vLAoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogIjAiLAoJCWZvbnRXZWlnaHQ6ICI0MDAiCgl9LAoKCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk1veiIsICJtcyIgXSwKCWVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLnN0eWxlOwoKLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHsKCgkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAoJaWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHsKCQkJcmV0dXJuIG5hbWU7CgkJfQoJfQp9CgovLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG8KLy8gYSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkuCmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7Cgl2YXIgcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF07CglpZiAoICFyZXQgKSB7CgkJcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7Cgl9CglyZXR1cm4gcmV0Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoKCS8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4KCS8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludAoJdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CglyZXR1cm4gbWF0Y2hlcyA/CgoJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcwoJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgInB4IiApIDoKCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7Cgl2YXIgaSA9IGRpbWVuc2lvbiA9PT0gIndpZHRoIiA/IDEgOiAwLAoJCWV4dHJhID0gMCwKCQlkZWx0YSA9IDA7CgoJLy8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeQoJaWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApICkgewoJCXJldHVybiAwOwoJfQoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCgkJLy8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luCgkJaWYgKCBib3ggPT09ICJtYXJnaW4iICkgewoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgkJfQoKCQkvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgInBhZGRpbmciIG9yICJib3JkZXIiIG9yICJtYXJnaW4iCgkJaWYgKCAhaXNCb3JkZXJCb3ggKSB7CgoJCQkvLyBBZGQgcGFkZGluZwoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgoJCQkvLyBGb3IgImJvcmRlciIgb3IgIm1hcmdpbiIsIGFkZCBib3JkZXIKCQkJaWYgKCBib3ggIT09ICJwYWRkaW5nIiApIHsKCQkJCWRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKCgkJCS8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZQoJCQl9IGVsc2UgewoJCQkJZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgoJCS8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgImNvbnRlbnQiIG9yCgkJLy8gInBhZGRpbmciIG9yICJtYXJnaW4iCgkJfSBlbHNlIHsKCgkJCS8vIEZvciAiY29udGVudCIsIHN1YnRyYWN0IHBhZGRpbmcKCQkJaWYgKCBib3ggPT09ICJjb250ZW50IiApIHsKCQkJCWRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQkJfQoKCQkJLy8gRm9yICJjb250ZW50IiBvciAicGFkZGluZyIsIHN1YnRyYWN0IGJvcmRlcgoJCQlpZiAoIGJveCAhPT0gIm1hcmdpbiIgKSB7CgkJCQlkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CgkJCX0KCQl9Cgl9CgoJLy8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWwKCWlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7CgoJCS8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXIKCQkvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duCgkJZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbCgKCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCWNvbXB1dGVkVmFsIC0KCQkJZGVsdGEgLQoJCQlleHRyYSAtCgkJCTAuNQoJCSkgKTsKCX0KCglyZXR1cm4gZGVsdGE7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7CgoJLy8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZQoJdmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAoJCXZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7CgoJLy8gU3VwcG9ydDogRmlyZWZveCA8PTU0CgkvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS4KCWlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkgewoJCWlmICggIWV4dHJhICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCQl2YWwgPSAiYXV0byI7Cgl9CgoJLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKCXZhbHVlSXNCb3JkZXJCb3ggPSB2YWx1ZUlzQm9yZGVyQm94ICYmCgkJKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSApOwoKCS8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyAiYXV0byIKCS8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSkKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seQoJLy8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMikKCWlmICggdmFsID09PSAiYXV0byIgfHwKCQkhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiLCBmYWxzZSwgc3R5bGVzICkgPT09ICJpbmxpbmUiICkgewoKCQl2YWwgPSBlbGVtWyAib2Zmc2V0IiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdOwoKCQkvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlcwoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlOwoJfQoKCS8vIE5vcm1hbGl6ZSAiIiBhbmQgYXV0bwoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsCglyZXR1cm4gKCB2YWwgKwoJCWJveE1vZGVsQWRqdXN0bWVudCgKCQkJZWxlbSwKCQkJZGltZW5zaW9uLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveCwKCQkJc3R5bGVzLAoKCQkJLy8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSkKCQkJdmFsCgkJKQoJKSArICJweCI7Cn0KCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCgljc3NOdW1iZXI6IHsKCQkiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAoJCSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHt9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndAoJCS8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eQoJCS8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC4KCQlpZiAoICFpc0N1c3RvbVByb3AgKSB7CgkJCW5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApOwoJCX0KCgkJLy8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOwoKCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsKCQkJCXZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTsKCgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNikKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gIiIgOiAicHgiICk7CgkJCX0KCgkJCS8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXMKCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CgkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISggInNldCIgaW4gaG9va3MgKSB8fAoJCQkJKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggaXNDdXN0b21Qcm9wICkgewoJCQkJCXN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJfSBlbHNlIHsKCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKCQl2YXIgdmFsLCBudW0sIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3QKCQkvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5CgkJLy8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLgoJCWlmICggIWlzQ3VzdG9tUHJvcCApIHsKCQkJbmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7CgkJfQoKCQkvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwoJCX0KCgkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwoJCX0KCgkJLy8gQ29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQoJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CgkJfQoKCQkvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgoJCXJldHVybiB2YWw7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBkaW1lbnNpb24gKSB7CglqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0CgkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKCgkJCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrCgkJCQkJLy8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm8KCQkJCQkvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQoJCQkJCS8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGUKCQkJCQkvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuCgkJCQkJKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID8KCQkJCQkJc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApOwoJCQkJCQl9ICkgOgoJCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXZhciBtYXRjaGVzLAoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCgkJCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQkJCXN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KAoJCQkJCWVsZW0sCgkJCQkJZGltZW5zaW9uLAoJCQkJCWV4dHJhLAoJCQkJCWlzQm9yZGVyQm94LAoJCQkJCXN0eWxlcwoJCQkJKTsKCgkJCS8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZAoJCQkvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KQoJCQlpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7CgkJCQlzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoCgkJCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCQkJcGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC0KCQkJCQlib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgImJvcmRlciIsIGZhbHNlLCBzdHlsZXMgKSAtCgkJCQkJMC41CgkJCQkpOwoJCQl9CgoJCQkvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZAoJCQlpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmCgkJCQkoIG1hdGNoZXNbIDMgXSB8fCAicHgiICkgIT09ICJweCIgKSB7CgoJCQkJZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTsKCQkJCXZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7CgkJCX0KCgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CgkJfQoJfTsKfSApOwoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LAoJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCWlmICggY29tcHV0ZWQgKSB7CgkJCXJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgIm1hcmdpbkxlZnQiICkgKSB8fAoJCQkJZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KCQkJCQlzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CgkJCQkJfSApCgkJCQkpICsgInB4IjsKCQl9Cgl9Cik7CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKCB7CgltYXJnaW46ICIiLAoJcGFkZGluZzogIiIsCglib3JkZXI6ICJXaWR0aCIKfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKCQlleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGkgPSAwLAoJCQkJZXhwYW5kZWQgPSB7fSwKCgkJCQkvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCAiICIgKSA6IFsgdmFsdWUgXTsKCgkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggcHJlZml4ICE9PSAibWFyZ2luIiApIHsKCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZXMsIGxlbiwKCQkJCW1hcCA9IHt9LAoJCQkJaSA9IDA7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApOwoJCQkJbGVuID0gbmFtZS5sZW5ndGg7CgoJCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwoJCQkJfQoKCQkJCXJldHVybiBtYXA7CgkJCX0KCgkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CgkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9Cn0gKTsKCgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJLy8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCwKCQkJLy8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy4KCQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgoJCQkvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7CgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOwoKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCgkJCS8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LgoJCQkvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuCgkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7CgkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKCQkJCSggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8CgkJCQkJalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwoJCQl9IGVsc2UgewoJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCQl9CgkJfQoJfQp9OwoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKCX0sCglfZGVmYXVsdDogInN3aW5nIgp9OwoKalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CgovLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKCgoKdmFyCglmeE5vdywgaW5Qcm9ncmVzcywKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC87CgpmdW5jdGlvbiBzY2hlZHVsZSgpIHsKCWlmICggaW5Qcm9ncmVzcyApIHsKCQlpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApOwoJCX0KCgkJalF1ZXJ5LmZ4LnRpY2soKTsKCX0KfQoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0gKTsKCXJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApOwp9CgovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNoLAoJCWkgPSAwLAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKCgkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCgkvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7Cglmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJaWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHsKCgkJCS8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCXJldHVybiB0d2VlbjsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewoJdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LAoJCWlzQm94ID0gIndpZHRoIiBpbiBwcm9wcyB8fCAiaGVpZ2h0IiBpbiBwcm9wcywKCQlhbmltID0gdGhpcywKCQlvcmlnID0ge30sCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCWhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksCgkJZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzCglpZiAoICFvcHRzLnF1ZXVlICkgewoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7CgkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewoJCQlob29rcy51bnF1ZXVlZCA9IDA7CgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwoJCQlob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKCQkJCQlvbGRmaXJlKCk7CgkJCQl9CgkJCX07CgkJfQoJCWhvb2tzLnVucXVldWVkKys7CgoJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9ICk7CgkJfSApOwoJfQoKCS8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CgkJaWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCgkJCQkvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgInNob3ciIGFuZAoJCQkJLy8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGUKCQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsKCgkJCQkvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhCgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgkJfQoJfQoKCS8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpCglwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7CglpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKCQlyZXR1cm47Cgl9CgoJLy8gUmVzdHJpY3QgIm92ZXJmbG93IiBhbmQgImRpc3BsYXkiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnMKCWlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZAoJCS8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9ycwoJCS8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZQoJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTsKCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCAiZGlzcGxheSIgKTsKCQl9CgkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ICkgewoJCQkJZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQl9IGVsc2UgewoKCQkJCS8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHkKCQkJCXNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApOwoJCQkJcmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7CgkJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0gKTsKCQkJfQoJCX0KCgkJLy8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrCgkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkgewoJCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoKCQkJCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zCgkJCQlpZiAoICFwcm9wVHdlZW4gKSB7CgkJCQkJYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKCQkJCQkJc3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQkJCX0gKTsKCQkJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCQkJCWRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5OwoJCQkJCQlyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/ICIiIDogZGlzcGxheTsKCQkJCQl9CgkJCQl9CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJYW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOwoJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJfSApOwoJfQoKCS8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJcHJvcFR3ZWVuID0gZmFsc2U7Cglmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgoJCS8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uCgkJaWYgKCAhcHJvcFR3ZWVuICkgewoJCQlpZiAoIGRhdGFTaG93ICkgewoJCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApOwoJCQl9CgoJCQkvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCAicmV2ZXJzZXMiCgkJCWlmICggdG9nZ2xlICkgewoJCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKCQkJfQoKCQkJLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW0KCQkJaWYgKCBoaWRkZW4gKSB7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTsKCQkJfQoKCQkJLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovCgoJCQlhbmltLmRvbmUoIGZ1bmN0aW9uKCkgewoKCQkJLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi8KCgkJCQkvLyBUaGUgZmluYWwgc3RlcCBvZiBhICJoaWRlIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50CgkJCQlpZiAoICFoaWRkZW4gKSB7CgkJCQkJc2hvd0hpZGUoIFsgZWxlbSBdICk7CgkJCQl9CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CgkJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gUGVyLXByb3BlcnR5IHNldHVwCgkJcHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CgkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCWRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7CgkJCWlmICggaGlkZGVuICkgewoJCQkJcHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDsKCQkJCXByb3BUd2Vlbi5zdGFydCA9IDA7CgkJCX0KCQl9Cgl9Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7CgkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCgkJCS8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAoJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0gKSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoKCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHkKCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJCWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApOwoKCQkJLy8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZAoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvbgoJCQlpZiAoICFsZW5ndGggKSB7CgkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7CgkJCX0KCgkJCS8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uCgkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsKCQkJCXNwZWNpYWxFYXNpbmc6IHt9LAoJCQkJZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CgkJCX0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4gdHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJdmFyIGluZGV4ID0gMCwKCgkJCQkJLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCQkJCWlmICggc3RvcHBlZCApIHsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJCXN0b3BwZWQgPSB0cnVlOwoJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOwoJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSApLAoJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOwoKCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwoJCWlmICggcmVzdWx0ICkgewoJCQlpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7CgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQoJCQkJCXJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApOwoJCQl9CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfQoKCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CgoJaWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwoJfQoKCS8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglhbmltYXRpb24KCQkucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQllbGVtOiBlbGVtLAoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQoJCX0gKQoJKTsKCglyZXR1cm4gYW5pbWF0aW9uOwp9CgpqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CgoJdHdlZW5lcnM6IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApOwoJCQlhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTsKCQkJcmV0dXJuIHR3ZWVuOwoJCX0gXQoJfSwKCgl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewoJCWlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0KCX0sCgoJcHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCUFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CgkJfQoJfQp9ICk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJZHVyYXRpb246IHNwZWVkLAoJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCS8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZgoJaWYgKCBqUXVlcnkuZngub2ZmICkgewoJCW9wdC5kdXJhdGlvbiA9IDA7CgoJfSBlbHNlIHsKCQlpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09ICJudW1iZXIiICkgewoJCQlpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07CgoJCQl9IGVsc2UgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCQkJfQoJCX0KCX0KCgkvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCglpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKCQlvcHQucXVldWUgPSAiZngiOwoJfQoKCS8vIFF1ZXVlaW5nCglvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoKCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoKCQkvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CgkJCQl2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CgoJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CgkJCQlpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJgoJCQkJCSggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgewoKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuCgkJCS8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSApOwoJfSwKCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CgkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0cnVlOwoKCQkJLy8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7CgkJfSApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCggewoJc2xpZGVEb3duOiBnZW5GeCggInNob3ciICksCglzbGlkZVVwOiBnZW5GeCggImhpZGUiICksCglzbGlkZVRvZ2dsZTogZ2VuRngoICJ0b2dnbGUiICksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCWkgPSAwLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJZnhOb3cgPSBEYXRlLm5vdygpOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoKCQkvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWpRdWVyeS5meC5zdGFydCgpOwp9OwoKalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewoJaWYgKCBpblByb2dyZXNzICkgewoJCXJldHVybjsKCX0KCglpblByb2dyZXNzID0gdHJ1ZTsKCXNjaGVkdWxlKCk7Cn07CgpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgewoJaW5Qcm9ncmVzcyA9IG51bGw7Cn07CgpqUXVlcnkuZnguc3BlZWRzID0gewoJc2xvdzogNjAwLAoJZmFzdDogMjAwLAoKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKCQl2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CgkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsKCX0gKTsKfTsKCgooIGZ1bmN0aW9uKCkgewoJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAoJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCgkJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib3B0aW9uIiApICk7CgoJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5CgkvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSAib24iCglzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdAoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKCgkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHkKCS8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQudHlwZSA9ICJyYWRpbyI7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwp9ICkoKTsKCgp2YXIgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOwoJCX0KCgkJLy8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgoJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CgkJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTsKCgkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQlyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKCQkJCQlub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLAoJCQlpID0gMCwKCgkJCS8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKCQkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7CgoJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCXdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJfQoJCX0KCX0KfSApOwoKLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCXZhciByZXQsIGhhbmRsZSwKCQkJbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCgkJaWYgKCAhaXNYTUwgKSB7CgoJCQkvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCgkJCWhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTsKCQkJYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0OwoJCQlyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CgkJCQlsb3dlcmNhc2VOYW1lIDoKCQkJCW51bGw7CgkJCWF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gKTsKCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYKCQkJCSggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seQoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCgkJCQkvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKCgkJCQlpZiAoIHRhYmluZGV4ICkgewoJCQkJCXJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7CgkJCQl9CgoJCQkJaWYgKAoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CgkJCQkJcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYKCQkJCQllbGVtLmhyZWYKCQkJCSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCX0sCgoJcHJvcEZpeDogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNsYXNzIjogImNsYXNzTmFtZSIKCX0KfSApOwoKLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5Ci8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eQovLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCi8vIG9uIHRoZSBvcHRpb24KLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWQKLy8gd2hlbiBpbiBhbiBvcHRncm91cAovLyBlc2xpbnQgcnVsZSAibm8tdW51c2VkLWV4cHJlc3Npb25zIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlCi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcAppZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJLyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogIm9mZiIgKi8KCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJCWlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiAib2ZmIiAqLwoKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgpqUXVlcnkuZWFjaCggWwoJInRhYkluZGV4IiwKCSJyZWFkT25seSIsCgkibWF4TGVuZ3RoIiwKCSJjZWxsU3BhY2luZyIsCgkiY2VsbFBhZGRpbmciLAoJInJvd1NwYW4iLAoJImNvbFNwYW4iLAoJInVzZU1hcCIsCgkiZnJhbWVCb3JkZXIiLAoJImNvbnRlbnRFZGl0YWJsZSIKXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOwp9ICk7CgoKCgoJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlYwoJLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlCglmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHsKCQl2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTsKCQlyZXR1cm4gdG9rZW5zLmpvaW4oICIgIiApOwoJfQoKCmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgewoJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCAiY2xhc3MiICkgfHwgIiI7Cn0KCmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHsKCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CglpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107Cgl9CglyZXR1cm4gW107Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJY2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApOwoKCQlpZiAoIGNsYXNzZXMubGVuZ3RoICkgewoJCQl3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7CgkJCQljdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgewoJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgoJCQkJCWZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTsKCQkJCQlpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggImNsYXNzIiwgZmluYWxWYWx1ZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuYXR0ciggImNsYXNzIiwgIiIgKTsKCQl9CgoJCWNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJaWYgKCBjbGFzc2VzLmxlbmd0aCApIHsKCQkJd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgewoJCQkJY3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApOwoKCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgoJCQkJCQkvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPiAtMSApIHsKCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApOwoJCQkJCWlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7CgkJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09ICJzdHJpbmciIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7CgoJCWlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgaXNWYWxpZFZhbHVlICkgewoJCQlyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcygKCQkJCQl2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLAoJCQkJCXN0YXRlVmFsCgkJCQkpOwoJCQl9ICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJdmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lczsKCgkJCWlmICggaXNWYWxpZFZhbHVlICkgewoKCQkJCS8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCQlpID0gMDsKCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJCQl3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHsKCgkJCQkJLy8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQljbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApOwoJCQkJaWYgKCBjbGFzc05hbWUgKSB7CgoJCQkJCS8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlkYXRhUHJpdi5zZXQoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKCQkJCS8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCgkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAoJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgoJCQkJaWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHsKCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSggImNsYXNzIiwKCQkJCQkJY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CgkJCQkJCSIiIDoKCQkJCQkJZGF0YVByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIgoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSwgZWxlbSwKCQkJaSA9IDA7CgoJCWNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiOwoJCXdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCgkJCQkoICIgIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArICIgIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KfSApOwoKCgoKdmFyIHJyZXR1cm4gPSAvXHIvZzsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sCgkJCWVsZW0gPSB0aGlzWyAwIF07CgoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fAoJCQkJCWpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJgoJCQkJCSJnZXQiIGluIGhvb2tzICYmCgkJCQkJKCByZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSApICE9PSB1bmRlZmluZWQKCQkJCSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJcmV0ID0gZWxlbS52YWx1ZTsKCgkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCgkJCQlpZiAoIHR5cGVvZiByZXQgPT09ICJzdHJpbmciICkgewoJCQkJCXJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgIiIgKTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCXJldHVybiByZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQl2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewoJCQkJdmFsICs9ICIiOwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKCQkJCX0gKTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7CgkJCX0KCQl9ICk7Cgl9Cn0gKTsKCmpRdWVyeS5leHRlbmQoIHsKCXZhbEhvb2tzOiB7CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CgkJCQkJdmFsIDoKCgkJCQkJLy8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHkKCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCgkJCQkJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UKCQkJCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZQoJCQkJCXN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKCQkJfQoJCX0sCgkJc2VsZWN0OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgdmFsdWUsIG9wdGlvbiwgaSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsKCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlpID0gbWF4OwoKCQkJCX0gZWxzZSB7CgkJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAoJCQkJCQkJIW9wdGlvbi5kaXNhYmxlZCAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwKCQkJCQkJCQkhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxlbmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovCgoJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkID0KCQkJCQkJalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMQoJCQkJCSkgewoJCQkJCQlvcHRpb25TZXQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqLwoJCQkJfQoKCQkJCS8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CgkJCQlpZiAoICFvcHRpb25TZXQgKSB7CgkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9CgkJfQoJfQp9ICk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVlcnkuZWFjaCggWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7CgkJCX0KCQl9Cgl9OwoJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgewoJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwoJCX07Cgl9Cn0gKTsKCgoKCi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KCgpzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CgoKdmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAoJc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwgewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoKCQl2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCwKCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCgkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAoJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOwoKCQljdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewoKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggIi4iICk7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoICI6IiApIDwgMCAmJiAib24iICsgdHlwZTsKCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CgkJCWV2ZW50IDoKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwoKCQkvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCgkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKCQlldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID8KCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoKCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsKCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCQl9CgkJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKCQkJCXRtcCA9IGN1cjsKCQkJfQoKCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCgkJCWlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkgewoJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwoJCQl9CgkJfQoKCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCgkJaSA9IDA7CgkJd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbGFzdEVsZW1lbnQgPSBjdXI7CgkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CgkJCQlidWJibGVUeXBlIDoKCQkJCXNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKCgkJCS8vIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmCgkJCQlkYXRhUHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBOYXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgewoJCQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9CgkJfQoJCWV2ZW50LnR5cGUgPSB0eXBlOwoKCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCgkJCWlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAoJCQkJc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiYKCQkJCWFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJaWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKCgkJCQkJaWYgKCB0bXAgKSB7CgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQl9CgoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgoJCQkJCWlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQkJbGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTsKCQkJCQl9CgoJCQkJCWVsZW1bIHR5cGUgXSgpOwoKCQkJCQlpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCWxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7CgkJCQkJfQoKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoKCQkJCQlpZiAoIHRtcCApIHsKCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUKCS8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCglzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkgewoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVudCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlCgkJCX0KCQkpOwoKCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJfQoKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0gKTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIGVsZW0gPSB0aGlzWyAwIF07CgkJaWYgKCBlbGVtICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKCQl9Cgl9Cn0gKTsKCgovLyBTdXBwb3J0OiBGaXJlZm94IDw9NDQKLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50cwovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4NwovLwovLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjEKLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlcgovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1NwppZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7CglqUXVlcnkuZWFjaCggeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsKCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCQlkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7CgoJCQkJfSBlbHNlIHsKCQkJCQlkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOwoJCQkJfQoJCQl9CgkJfTsKCX0gKTsKfQp2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247Cgp2YXIgbm9uY2UgPSBEYXRlLm5vdygpOwoKdmFyIHJxdWVyeSA9ICggL1w/LyApOwoKCgovLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkgewoJdmFyIHhtbDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC4KCXRyeSB7CgkJeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7Cgl9IGNhdGNoICggZSApIHsKCQl4bWwgPSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKCX0KCXJldHVybiB4bWw7Cn07CgoKdmFyCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLAoJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwoKZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgewoJdmFyIG5hbWU7CgoJaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHsKCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCgkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CgkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CgoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcygKCQkJCQlwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKCQkJCQl2LAoJCQkJCXRyYWRpdGlvbmFsLAoJCQkJCWFkZAoJCQkJKTsKCQkJfQoJCX0gKTsKCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7CgoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlCgkJCXZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID8KCQkJCXZhbHVlT3JGdW5jdGlvbigpIDoKCQkJCXZhbHVlT3JGdW5jdGlvbjsKCgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsKCQkJCWVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQl9OwoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9ICk7CgoJfSBlbHNlIHsKCgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKCX0sCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0gKQoJCS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQl2YXIgdHlwZSA9IHRoaXMudHlwZTsKCgkJCS8vIFVzZSAuaXMoICI6ZGlzYWJsZWQiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTsKCQl9ICkKCQkubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJcmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQl9ICk7CgkJCX0KCgkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9ICkuZ2V0KCk7Cgl9Cn0gKTsKCgp2YXIKCXIyMCA9IC8lMjAvZywKCXJoYXNoID0gLyMuKiQvLAoJcmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCglybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKCXJwcm90b2NvbCA9IC9eXC9cLy8sCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKCgkvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW4KCW9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJb3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsCgkJCWkgPSAwLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdOwoKCQlpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJd2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkgewoKCQkJCS8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCgkJCQlpZiAoIGRhdGFUeXBlWyAwIF0gPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgIioiOwoJCQkJCSggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApOwoKCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKCQkJCX0gZWxzZSB7CgkJCQkJKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKCgl2YXIgaW5zcGVjdGVkID0ge30sCgkJc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7CgoJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CgkJdmFyIHNlbGVjdGVkOwoJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKCQkJdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkJaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYKCQkJCSFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9ICk7CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCglmb3IgKCBrZXkgaW4gc3JjICkgewoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgewoJCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCgkJY29udGVudHMgPSBzLmNvbnRlbnRzLAoJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCiAqLwpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7Cgl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKCQljb252ZXJ0ZXJzID0ge30sCgoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOwoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCgl3aGlsZSAoIGN1cnJlbnQgKSB7CgoJCWlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewoJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKCQl9CgoJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCgkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCQl9CgoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkJaWYgKCBjdXJyZW50ICkgewoKCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCQlpZiAoIGN1cnJlbnQgPT09ICIqIiApIHsKCgkJCQljdXJyZW50ID0gcHJldjsKCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7CgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CgoJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0CgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKCQkJCQkJCWlmICggY29udiApIHsKCgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzLnRocm93cyApIHsKCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJcmV0dXJuIHsKCQkJCQkJCQlzdGF0ZTogInBhcnNlcmVycm9yIiwKCQkJCQkJCQllcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudAoJCQkJCQkJfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQl0eXBlOiAiR0VUIiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLAoJCWdsb2JhbDogdHJ1ZSwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czogZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAvXGJ4bWxcYi8sCgkJCWh0bWw6IC9cYmh0bWwvLAoJCQlqc29uOiAvXGJqc29uXGIvCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKCQkJanNvbjogInJlc3BvbnNlSlNPTiIKCQl9LAoKCQkvLyBEYXRhIGNvbnZlcnRlcnMKCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0IjogU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogSlNPTi5wYXJzZSwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJdXJsOiB0cnVlLAoJCQljb250ZXh0OiB0cnVlCgkJfQoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJcmV0dXJuIHNldHRpbmdzID8KCgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKCgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIHRyYW5zcG9ydCwKCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KCQkJY2FjaGVVUkwsCgoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVXJsIGNsZWFudXAgdmFyCgkJCXVybEFuY2hvciwKCgkJCS8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbikKCQkJY29tcGxldGVkLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoKCQkJLy8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsCgkJCXVuY2FjaGVkLAoKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CgkJCQkJalF1ZXJ5LmV2ZW50LAoKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoKCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKCQkJcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAoKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID0KCQkJCQkJCXJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJCXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIGNvbXBsZXRlZCApIHsKCgkJCQkJCQkvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzCgkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CgkJCQkJfQoJCQkJCWRvbmUoIDAsIGZpbmFsVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCgkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgIiIgKQoJCQkucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKTsKCgkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CgkJcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAoJCXMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQl1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTUKCQkJLy8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCwKCQkJLy8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4LwoJCQl0cnkgewoJCQkJdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKCgkJCQkvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5CgkJCQkvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQoJCQkJdXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjsKCQkJCXMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyAiLy8iICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09CgkJCQkJdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiArIHVybEFuY2hvci5ob3N0OwoJCQl9IGNhdGNoICggZSApIHsKCgkJCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbiwKCQkJCS8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWQKCQkJCXMuY3Jvc3NEb21haW4gPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggY29tcGxldGVkICkgewoJCQlyZXR1cm4ganFYSFI7CgkJfQoKCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwoJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCgkJZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCgkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCgkJLy8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvbgoJCWNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrCgkJCXVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApOwoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgKSApIHsKCQkJCWNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgkJCQljYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsICIkMSIgKTsKCQkJCXVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7CgkJCX0KCgkJCS8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMikKCQkJcy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkOwoKCQkvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OCkKCQl9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJgoJCQkoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiApID09PSAwICkgewoJCQlzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCAiKyIgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAoJCQkiQWNjZXB0IiwKCQkJcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArCgkJCQkJKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CgkJCQlzLmFjY2VwdHNbICIqIiBdCgkJKTsKCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCgkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CgkJfQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYKCQkJKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHsKCgkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKCQl9CgoJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJY29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTsKCQlqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTsKCQlqcVhIUi5mYWlsKCBzLmVycm9yICk7CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCgkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50CgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CgkJCX0KCgkJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuIGpxWEhSOwoJCQl9CgoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJY29tcGxldGVkID0gZmFsc2U7CgkJCQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJLy8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9ucwoJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCgkJCQkvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHMKCQkJCWRvbmUoIC0xLCBlICk7CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb21wbGV0ZWQgPSB0cnVlOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImV0YWciICk7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaWYgbm8gY29udGVudAoJCQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7CgoJCQkJLy8gaWYgbm90IG1vZGlmaWVkCgkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKCQkJCX0gZWxzZSB7CgkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwoJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoKCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKCQkJCWlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOwoJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKCQkJCQkJc3RhdHVzID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0CgkJCWpxWEhSLnN0YXR1cyA9IHN0YXR1czsKCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKCgkJCS8vIFN1Y2Nlc3MvRXJyb3IKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKCQkJfSBlbHNlIHsKCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7CgkJCXN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBDb21wbGV0ZQoJCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CgoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCgkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKCQlpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKQoJCXJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCggewoJCQl1cmw6IHVybCwKCQkJdHlwZTogbWV0aG9kLAoJCQlkYXRhVHlwZTogdHlwZSwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2sKCQl9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTsKCX07Cn0gKTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KCB7CgkJdXJsOiB1cmwsCgoJCS8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KQoJCXR5cGU6ICJHRVQiLAoJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQljYWNoZTogdHJ1ZSwKCQlhc3luYzogZmFsc2UsCgkJZ2xvYmFsOiBmYWxzZSwKCQkidGhyb3dzIjogdHJ1ZQoJfSApOwp9OwoKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciB3cmFwOwoKCQlpZiAoIHRoaXNbIDAgXSApIHsKCQkJaWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCQlodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTsKCQkJfQoKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CgoJCQlpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOwoJCQl9CgoJCQl3cmFwLm1hcCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9ICkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7CgkJCX0gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSApOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApOwoJCX0gKTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCAiYm9keSIgKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCX0gKTsKCQlyZXR1cm4gdGhpczsKCX0KfSApOwoKCmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApOwp9OwpqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCXJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7Cn07CgoKCgpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoIGUgKSB7fQp9OwoKdmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7CgoJCS8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCgkJMDogMjAwLAoKCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCS8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCTEyMjM6IDIwNAoJfSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7CgpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwpzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKCmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHsKCXZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKCgkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CglpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoJCQkJdmFyIGksCgkJCQkJeGhyID0gb3B0aW9ucy54aHIoKTsKCgkJCQl4aHIub3BlbigKCQkJCQlvcHRpb25zLnR5cGUsCgkJCQkJb3B0aW9ucy51cmwsCgkJCQkJb3B0aW9ucy5hc3luYywKCQkJCQlvcHRpb25zLnVzZXJuYW1lLAoJCQkJCW9wdGlvbnMucGFzc3dvcmQKCQkJCSk7CgoJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKCQkJCQlmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgewoJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOwoJCQkJfQoKCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCgkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdICkgewoJCQkJCWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCX0KCgkJCQkvLyBTZXQgaGVhZGVycwoJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCX0KCgkJCQkvLyBDYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQljYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID0KCQkJCQkJCQl4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsKCQkJCQkJCQl4aHIuYWJvcnQoKTsKCQkJCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJCQkJLy8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzCgkJCQkJCQkJLy8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZQoJCQkJCQkJCWlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgewoJCQkJCQkJCQljb21wbGV0ZSggMCwgImVycm9yIiApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWNvbXBsZXRlKAoKCQkJCQkJCQkJCS8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CgkJCQkJCQkJCQl4aHIuc3RhdHVzLAoJCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKCQkJCQkJCQkJKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWNvbXBsZXRlKAoJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCQkJCQkJCQkvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpCgkJCQkJCQkJCS8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpCgkJCQkJCQkJCSggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRleHQiICB8fAoJCQkJCQkJCQl0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gInN0cmluZyIgPwoJCQkJCQkJCQkJeyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDoKCQkJCQkJCQkJCXsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAoJCQkJCQkJCQl4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX07CgoJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cwoJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CgkJCQllcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soICJlcnJvciIgKTsKCgkJCQkvLyBTdXBwb3J0OiBJRSA5IG9ubHkKCQkJCS8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CgkJCQkvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzCgkJCQlpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJeGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrOwoJCQkJfSBlbHNlIHsKCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgoJCQkJCQkvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXMKCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCgkJCQkJCQkvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCwKCQkJCQkJCS8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydAoJCQkJCQkJLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKCQkJCQkJCS8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZAoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQkJCWVycm9yQ2FsbGJhY2soKTsKCQkJCQkJCQl9CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoKCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIgKTsKCgkJCQl0cnkgewoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pCgkJCQkJeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwoJCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJdGhyb3cgZTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9ICk7CgoKCgovLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKQpqUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTsKCX0KfSApOwoKLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCggewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgIiArCgkJCSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSApOwoKLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpbgpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJfQp9ICk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJdmFyIHNjcmlwdCwgY2FsbGJhY2s7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewoJCQkJc2NyaXB0ID0galF1ZXJ5KCAiPHNjcmlwdD4iICkucHJvcCggewoJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKCQkJCQlzcmM6IHMudXJsCgkJCQl9ICkub24oCgkJCQkJImxvYWQgZXJyb3IiLAoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKCQkJCQkJc2NyaXB0LnJlbW92ZSgpOwoJCQkJCQljYWxsYmFjayA9IG51bGw7CgkJCQkJCWlmICggZXZ0ICkgewoJCQkJCQkJY29tcGxldGUoIGV2dC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwLCBldnQudHlwZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJKTsKCgkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CgkJCX0sCgkJCWFib3J0OiBmdW5jdGlvbigpIHsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0KCQkJfQoJCX07Cgl9Cn0gKTsKCgoKCnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoIHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwoJCXRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOwoJCXJldHVybiBjYWxsYmFjazsKCX0KfSApOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KCQkJInVybCIgOgoJCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJgoJCQkJKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkKCQkJCQkuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgoJCQkJcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgoJCSk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KCQkJcy5qc29ucENhbGxiYWNrKCkgOgoJCQlzLmpzb25wQ2FsbGJhY2s7CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIGpzb25Qcm9wICkgewoJCQlzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBGb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7CgoJCQkvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXQKCQkJaWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkgewoJCQkJalF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKCgkJCS8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCgkJCX0gZWxzZSB7CgkJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgkJCX0KCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCgkJCWlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgewoJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoKCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDsKCQl9ICk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSApOwoKCgoKLy8gU3VwcG9ydDogU2FmYXJpIDggb25seQovLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50Ci8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLgovLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzcKc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkgewoJdmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICkuYm9keTsKCWJvZHkuaW5uZXJIVE1MID0gIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IjsKCXJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwp9ICkoKTsKCgovLyBBcmd1bWVudCAiZGF0YSIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sCi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwKLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnQKLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwpqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkgewoJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIFtdOwoJfQoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9CgoJdmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0czsKCglpZiAoICFjb250ZXh0ICkgewoKCQkvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKCQkvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbgoJCWlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICk7CgoJCQkvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnQKCQkJLy8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHMKCQkJLy8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSkKCQkJYmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggImJhc2UiICk7CgkJCWJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CgkJCWNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApOwoJCX0gZWxzZSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudDsKCQl9Cgl9CgoJcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7CglzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwoKCS8vIFNpbmdsZSB0YWcKCWlmICggcGFyc2VkICkgewoJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdOwoJfQoKCXBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwp9OwoKCi8qKgogKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCiAqLwpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7Cgl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAoJCXNlbGYgPSB0aGlzLAoJCW9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCglpZiAoIG9mZiA+IC0xICkgewoJCXNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoKCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCWNhbGxiYWNrID0gcGFyYW1zOwoJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJdHlwZSA9ICJQT1NUIjsKCX0KCgkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAoJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CgkJalF1ZXJ5LmFqYXgoIHsKCQkJdXJsOiB1cmwsCgoJCQkvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCgkJCS8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZQoJCQkvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2QKCQkJdHlwZTogdHlwZSB8fCAiR0VUIiwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CgoJCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKCQkJCS8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwoJCQkJalF1ZXJ5KCAiPGRpdj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQgKTsKCgkJLy8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyAiZGF0YSIsICJzdGF0dXMiLCAianFYSFIiCgkJLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLgoJCS8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgImpxWEhSIiwgInN0YXR1cyIsICJlcnJvciIKCQl9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJc2VsZi5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJCX0gKTsKCQl9ICk7Cgl9CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWwoJImFqYXhTdGFydCIsCgkiYWpheFN0b3AiLAoJImFqYXhDb21wbGV0ZSIsCgkiYWpheEVycm9yIiwKCSJhamF4U3VjY2VzcyIsCgkiYWpheFNlbmQiCl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cgl9Owp9ICk7CgoKCgpqUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKCX0gKS5sZW5ndGg7Cn07CgoKCgpqUXVlcnkub2Zmc2V0ID0gewoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOwoKCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlcgoJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7CgkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwoJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0OwoKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCgkJCS8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KQoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoKCQl9IGVsc2UgewoJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKCQl9Cgl9Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJLy8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luCglvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQkvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KCQkJCXRoaXMgOgoJCQkJdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSApOwoJCX0KCgkJdmFyIHJlY3QsIHdpbiwKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApCgkJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkJLy8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYQoJCS8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvcgoJCWlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJLy8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUgoJCXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsKCQlyZXR1cm4gewoJCQl0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LAoJCQlsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQKCQl9OwoJfSwKCgkvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveAoJLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1sgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYywKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJLy8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKCgkJCS8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3QKCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJfSBlbHNlIHsKCQkJb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCgkJCS8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50CgkJCS8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYKCQkJCSggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJgoJCQkJalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlOwoJCQl9CgkJCWlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luCgkJCQlwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpOwoJCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUgKTsKCQkJfQoJCX0KCgkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwoJCXJldHVybiB7CgkJCXRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKCQl9OwoJfSwKCgkvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKCS8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KCS8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvdwoJLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAoJLy8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZgoJLy8KCS8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcwoJLy8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuCgkvLwoJLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OwoKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoKCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CgkJfSApOwoJfQp9ICk7CgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gInBhZ2VZT2Zmc2V0IiA9PT0gcHJvcDsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CgoJCQkvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3MKCQkJdmFyIHdpbjsKCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoJCQkJd2luID0gZWxlbTsKCQkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7CgkJCX0KCgkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCwKCQkJCQl0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXQKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApOwoJfTsKfSApOwoKLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OQovLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgovLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDcKLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUKalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCgkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCgkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7CgkJCX0KCQl9CgkpOwp9ICk7CgoKLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LAoJCWZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgewoKCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKCQkJCXZhciBkb2M7CgoJCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KQoJCQkJCXJldHVybiBmdW5jTmFtZS5pbmRleE9mKCAib3V0ZXIiICkgPT09IDAgPwoJCQkJCQllbGVtWyAiaW5uZXIiICsgbmFtZSBdIDoKCQkJCQkJZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAoJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoKCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApOwoJCX07Cgl9ICk7Cn0gKTsKCgpqUXVlcnkuZWFjaCggKCAiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIgKS5zcGxpdCggIiAiICksCglmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewoJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwoJfQp9ICk7CgoKCgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPwoJCQl0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6CgkJCXRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0KfSApOwoKLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55Ci8vIGFyZ3VtZW50cy4KLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKQovLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb24KalF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJdmFyIHRtcCwgYXJncywgcHJveHk7CgoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJdG1wID0gZm5bIGNvbnRleHQgXTsKCQljb250ZXh0ID0gZm47CgkJZm4gPSB0bXA7Cgl9CgoJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCglpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkgewoJCXJldHVybiB1bmRlZmluZWQ7Cgl9CgoJLy8gU2ltdWxhdGVkIGJpbmQKCWFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Cgl9OwoKCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJcmV0dXJuIHByb3h5Owp9OwoKalF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkgewoJaWYgKCBob2xkICkgewoJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCX0gZWxzZSB7CgkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7Cgl9Cn07CmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKalF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7CmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lOwpqUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93OwpqUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlOwpqUXVlcnkudHlwZSA9IHRvVHlwZTsKCmpRdWVyeS5ub3cgPSBEYXRlLm5vdzsKCmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkgewoKCS8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvCgkvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpCgkvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKQoJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CglyZXR1cm4gKCB0eXBlID09PSAibnVtYmVyIiB8fCB0eXBlID09PSAic3RyaW5nIiApICYmCgoJCS8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzICgiIikKCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQoJCS8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgoJCSFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTsKfTsKCgoKCi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgovLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAovLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQovLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoKLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhbgovLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQovLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCgppZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5OwoJfSApOwp9CgoKCgp2YXIKCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoKCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfJCA9IHdpbmRvdy4kOwoKalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cuJCA9IF8kOwoJfQoKCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CgkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Cgl9CgoJcmV0dXJuIGpRdWVyeTsKfTsKCi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1ECi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQppZiAoICFub0dsb2JhbCApIHsKCXdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKfQoKCgoKcmV0dXJuIGpRdWVyeTsKfSApOwo=" >
tail j=5412 line=
tail j=5413 line= </script>
tail j=5414 line=
tail j=5415 line=<!-- <script type="text/javascript" src="js/custom.js"></script> -->
tail j=5416 line=<!-- <script type="text/javascript" src="js/custom.js"></script> -->
tail j=5417 line=
tail j=5418 line=
tail j=5419 line= <script id="script_file" type="text/javascript">
tail j=5420 line= $(function() {
tail j=5421 line=// grab the file input and bind a change event onto it
tail j=5422 line= $('#file').bind("change", function() {
tail j=5423 line=// new html5 formdata object.
tail j=5424 line= var formData = new FormData();
tail j=5425 line=// for each entry, add to formdata to later access via $_FILES["file" + i]
tail j=5426 line= for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
tail j=5427 line= formData.append("file" + i, document.getElementById('file').files[i]);
tail j=5428 line= }
tail j=5429 line=
tail j=5430 line=//send formdata to server-side
tail j=5431 line= $.ajax({
tail j=5432 line=// url: "file-upload.php", // our php file
tail j=5433 line=// url: "ka1_fileupload.php", // our php file
tail j=5434 line=// nurl: "http://ka1/ka1.php?q=up", // our php file
tail j=5435 line=// url: "/kup.php", // our php file
tail j=5436 line=// url: "/ka1_up.php", // our php file
tail j=5437 line=// url: "/ka1.php?q=kup", // our php file
tail j=5438 line=// url: "/ko0.php?q=kup", // our php file
tail j=5439 line=// url: "/ko1.php?q=kup", // our php file
tail j=5440 line= url: "/ko2.php?q=kup", // our php file
tail j=5441 line=// bugs url: "10.0.0.112:/ka1.php?q=up", // our php file
tail j=5442 line= type: 'post',
tail j=5443 line= data: formData,
tail j=5444 line= dataType: 'html', // we return html from our php file
tail j=5445 line= async: true,
tail j=5446 line= processData: false, // tell jQuery not to process the data
tail j=5447 line= contentType: false, // tell jQuery not to set contentType
tail j=5448 line= success : function(data) {
tail j=5449 line= $('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
tail j=5450 line= $('#upload-result .alert').append(data);
tail j=5451 line= },
tail j=5452 line= error : function(request) {
tail j=5453 line= console.log(request.responseText);
tail j=5454 line= }
tail j=5455 line= });
tail j=5456 line= });
tail j=5457 line= });
tail j=5458 line= </script id="script_file" >
tail j=5459 line=
tail j=5460 line= <hr color=white>
tail j=5461 line= <hr color=black>
tail j=5462 line= <div id='editableDiv' contenteditable='true'>paste
tail j=5463 line= </div id="editableDiv" >
tail j=5464 line= <hr color=black>
tail j=5465 line= <hr color=white>
tail j=5466 line= <hr color=black>
tail j=5467 line= <div id="div_ffpaste" contenteditable='true'>ffpaste
tail j=5468 line= </div id="div_ffpaste">
tail j=5469 line= <hr color=black>
tail j=5470 line= <hr color=white>
tail j=5471 line=
tail j=5472 line= <script id="script_clipboard" >
tail j=5473 line= function handlePaste (e) {
tail j=5474 line= var clipboardData, pastedData;
tail j=5475 line=
tail j=5476 line=// Stop data actually being pasted into div
tail j=5477 line= e.stopPropagation();
tail j=5478 line= e.preventDefault();
tail j=5479 line=
tail j=5480 line=// Get pasted data via clipboard API
tail j=5481 line= clipboardData = e.clipboardData || window.clipboardData;
tail j=5482 line= pastedData = clipboardData.getData('Text');
tail j=5483 line=
tail j=5484 line=// Do whatever with pasteddata
tail j=5485 line= alert(pastedData);
tail j=5486 line= }
tail j=5487 line=
tail j=5488 line= document.getElementById('editableDiv').addEventListener('paste', handlePaste);
tail j=5489 line= </script id="script_clipboard" >
tail j=5490 line=
tail j=5491 line=
tail j=5492 line= <script id="script_clipboard_ff" >
tail j=5493 line= function handlepaste_ff (e) {
tail j=5494 line= var types, pastedData, savedContent;
tail j=5495 line=
tail j=5496 line=// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
tail j=5497 line= if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {
tail j=5498 line=
tail j=5499 line=// Check for 'text/html' in types list. See abligh's answer below for deatils on
tail j=5500 line=// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
tail j=5501 line=// Safari/Edge don't advertise HTML data even if it is available
tail j=5502 line= types = e.clipboardData.types;
tail j=5503 line= if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {
tail j=5504 line=
tail j=5505 line=// Extract data and pass it to callback
tail j=5506 line= pastedData = e.clipboardData.getData('text/html');
tail j=5507 line=// processPaste(editableDiv, pastedData);
tail j=5508 line= processPaste_ff(editableDiv, pastedData);
tail j=5509 line=
tail j=5510 line=// Stop the data from actually being pasted
tail j=5511 line= e.stopPropagation();
tail j=5512 line= e.preventDefault();
tail j=5513 line= return false;
tail j=5514 line= }
tail j=5515 line= }
tail j=5516 line=
tail j=5517 line=// Everything else: Move existing element contents to a DocumentFragment for safekeeping
tail j=5518 line= savedContent = document.createDocumentFragment();
tail j=5519 line= while(editableDiv.childNodes.length > 0) {
tail j=5520 line= savedContent.appendChild(editableDiv.childNodes[0]);
tail j=5521 line= }
tail j=5522 line=
tail j=5523 line=// Then wait for browser to paste content into it and cleanup
tail j=5524 line= waitForPastedData(editableDiv, savedContent);
tail j=5525 line= return true;
tail j=5526 line= }
tail j=5527 line=
tail j=5528 line= function waitForPastedData (elem, savedContent) {
tail j=5529 line=
tail j=5530 line=// If data has been processes by browser, process it
tail j=5531 line= if (elem.childNodes && elem.childNodes.length > 0) {
tail j=5532 line=
tail j=5533 line=// Retrieve pasted content via innerHTML
tail j=5534 line=// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
tail j=5535 line= var pastedData = elem.innerHTML;
tail j=5536 line=
tail j=5537 line=// Restore saved content
tail j=5538 line= elem.innerHTML = "";
tail j=5539 line= elem.appendChild(savedContent);
tail j=5540 line=
tail j=5541 line=// Call callback
tail j=5542 line= processPaste_ff(elem, pastedData);
tail j=5543 line= }
tail j=5544 line=
tail j=5545 line=// Else wait 20ms and try again
tail j=5546 line= else {
tail j=5547 line= setTimeout(function () {
tail j=5548 line= waitForPastedData(elem, savedContent)
tail j=5549 line= }, 20);
tail j=5550 line= }
tail j=5551 line= }
tail j=5552 line=
tail j=5553 line= function processPaste_ff (elem, pastedData) {
tail j=5554 line=// Do whatever with gathered data;
tail j=5555 line= alert(pastedData);
tail j=5556 line= elem.focus();
tail j=5557 line= }
tail j=5558 line=
tail j=5559 line=// Modern browsers. Note: 3rd argument is required for Firefox <= 6
tail j=5560 line= if (editableDiv.addEventListener) {
tail j=5561 line= editableDiv.addEventListener('paste', handlepaste, false);
tail j=5562 line= }
tail j=5563 line=// IE <= 8
tail j=5564 line= else {
tail j=5565 line= editableDiv.attachEvent('onpaste', handlepaste);
tail j=5566 line= }
tail j=5567 line=
tail j=5568 line= $(document).on('paste','[contenteditable]',function(e) {
tail j=5569 line= e.preventDefault();
tail j=5570 line= var text = (e.originalEvent || e).clipboardData.getData('text/plain');
tail j=5571 line= window.document.execCommand('insertText', false, text);
tail j=5572 line= });
tail j=5573 line= </script id="script_clipboard_ff" >
tail j=5574 line=
tail j=5575 line= <script id="script_clipboard_jskit" >
tail j=5576 line= function getSelectionText(){
tail j=5577 line= var selectedText = ""
tail j=5578 line= if (window.getSelection){ // all modern browsers and IE9+
tail j=5579 line= selectedText = window.getSelection().toString()
tail j=5580 line= }
tail j=5581 line= return selectedText
tail j=5582 line= }
tail j=5583 line=
tail j=5584 line=
tail j=5585 line= document.addEventListener('mouseup', function(){
tail j=5586 line= var thetext = getSelectionText()
tail j=5587 line= if (thetext.length > 0){ // check there's some text selected
tail j=5588 line= console.log(thetext) // logs whatever textual content the user has selected on the page
tail j=5589 line= }
tail j=5590 line= }, false)
tail j=5591 line=
tail j=5592 line= function copySelectionText(){
tail j=5593 line= var copysuccess // var to check whether execCommand successfully executed
tail j=5594 line= try{
tail j=5595 line= copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
tail j=5596 line= }
tail j=5597 line= catch(e){
tail j=5598 line= copysuccess = false
tail j=5599 line= }
tail j=5600 line= return copysuccess
tail j=5601 line= }
tail j=5602 line=
tail j=5603 line= </script id="script_clipboard_jskit" >
tail j=5604 line=
tail j=5605 line=<!--
tail j=5606 line= <div name="div_dd" id="div_dd" hidden>
tail j=5607 line= <div id="drop">
tail j=5608 line= <span id="sw"><h1>drop jtfinc</h2></span>
tail j=5609 line= <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
tail j=5610 line= <img height=200 width=300
tail j=5611 line= src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
tail j=5612 line= </a>
tail j=5613 line= </div>
tail j=5614 line=
tail j=5615 line= <div id="drag"> jtfdc:<br />
tail j=5616 line= <img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
tail j=5617 line=
tail j=5618 line= <div class="drg"><h1>konet llc </h1>
tail j=5619 line= <pre>timejask jkwii</pre>
tail j=5620 line= <img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
tail j=5621 line= <img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
tail j=5622 line= <pre>timesak skwii</pre>
tail j=5623 line= </div>
tail j=5624 line=
tail j=5625 line= <div class="drg"><h1>jtf29 </h1>
tail j=5626 line= <a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
tail j=5627 line= <img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
tail j=5628 line= </a>
tail j=5629 line= </div>
tail j=5630 line=
tail j=5631 line=
tail j=5632 line= <div class="drg"><h1>dogheads</h1>
tail j=5633 line= <div id="div_jtf_vid5">
tail j=5634 line= <video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
tail j=5635 line= <source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5636 line= </video>
tail j=5637 line= </div>
tail j=5638 line= </div>
tail j=5639 line=
tail j=5640 line= <div class="drg"><h1>jtfdc night court lights action 3720</h1>
tail j=5641 line= <div id="div_vid">
tail j=5642 line= <video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
tail j=5643 line= <source src="index_avril.mp4" type="video/mp4;codecs="avc1.42E01E, mp4a.40.2"">
tail j=5644 line= <source src="index_avril.webm" type="video/webm;codecs="vp8, vorbis"">
tail j=5645 line= </video>
tail j=5646 line= </div>
tail j=5647 line= </div>
tail j=5648 line= </div>
tail j=5649 line= </div>
tail j=5650 line= -->
tail j=5651 line=
tail j=5652 line= <script id="script_ytlist_load" >
tail j=5653 line= function ytlist_load() {
tail j=5654 line= j=0;;
tail j=5655 line=
tail j=5656 line= ytlist[j++] = 'ko0|ko0|ko0.us|';
tail j=5657 line= ytlist[j++] = 'ko2|ko2|ko2.us|';
tail j=5658 line= ytlist[j++] = '|duckduck_go|https://duckduckgo.com/';
tail j=5659 line= ytlist[j++] = '|jpl_curiosity|https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2287';
tail j=5660 line= ytlist[j++] = '|jpl_insight|https://mars.nasa.gov/insight/';
tail j=5661 line= ytlist[j++] = '|jpl_bennu|http://pluto.jhuapl.edu/';
tail j=5662 line= ytlist[j++] = '|jpl_osirisrex_thule|https://www.asteroidmission.org/';
tail j=5663 line= ytlist[j++] = '|whatsitmean|http://whatdoesitmean.com/|';
tail j=5664 line= ytlist[j++] = '|dailymail|https://www.dailymail.co.uk/ushome/index.html';
tail j=5665 line= ytlist[j++] = '|zerohedge|http://zerohedge.com/';
tail j=5666 line= ytlist[j++] = 'bluehost|http://bluehost.com/track/konet/ko2.us|';
tail j=5667 line= ytlist[j++] = '|webb|webb_george|https://www.youtube.com/results?search_query=webb_george';
tail j=5668 line= ytlist[j++] = '|preppy|preppy_kitty|https://www.youtube.com/results?search_query=prepper+kitty';
tail j=5669 line= ytlist[j++] = '|quinn|quinn_micheals||https://www.youtube.com/user/quinnmichaels';
tail j=5670 line= ytlist[j++] = '|kennedy|kennedy|https://www.youtube.com/channel/UCl609oqTRx-zBZ4vPfN2mqA';
tail j=5671 line= ytlist[j++] = '|stropyme|stroppy_me|https://www.youtube.com/results?search_query=stroppy+me|';
tail j=5672 line= ytlist[j++] = '|outerlite|outer_light|https://www.youtube.com/results?search_query=outer+light|';
tail j=5673 line= ytlist[j++] = '|munder|munder|https://www.youtube.com/user/1Munder1|';
tail j=5674 line= ytlist[j++] = '|dahboo77|dahboo77|https://www.youtube.com/results?search_query=dahboo77';
tail j=5675 line= ytlist[j++] = '|secureteam|secureteam10|https://www.youtube.com/results?search_query=secureteam10';
tail j=5676 line= ytlist[j++] = '|vlad96|vlad9t|https://www.youtube.com/results?search_query=vlad9t';
tail j=5677 line= ytlist[j++] = '|newearth|newearth|https://www.youtube.com/results?search_query=new+earth';
tail j=5678 line= ytlist[j++] = '|forester|forester_brian|https://www.youtube.com/results?search_query=brian+forrester';
tail j=5679 line= ytlist[j++] = '|hoagland|hoagland|https://www.youtube.com/results?search_query=hoagland+richard';
tail j=5680 line= ytlist[j++] = '|levenda||levenda|https://www.youtube.com/results?search_query=levenda+peter|';
tail j=5681 line= ytlist[j++] = 'borealus|borealus_forum|https://www.youtube.com/results?search_query=borealis+forum';
tail j=5682 line= ytlist[j++] = '|earthfiles|howe_linda_moultan|https://www.youtube.com/results?search_query=howe+linda';
tail j=5683 line= ytlist[j++] = '|newsbud|https://www.youtube.com/results?search_query=newsbud|';
tail j=5684 line= ytlist[j++] = '|lional|lional_nation|https://www.youtube.com/results?search_query=lionel+nation|';
tail j=5685 line= ytlist[j++] = '|gooman|jason_goodman|https://www.youtube.com/channel/UC8Cl9QaRtuW9CNjP7pP4BBQ|';
tail j=5686 line= ytlist[j++] = '|cernovich|cernovich|https://www.youtube.com/results?search_query=cernovich|';
tail j=5687 line= ytlist[j++] = '|conte|conte_marcus|https://www.youtube.com/results?search_query=conte+marcus|';
tail j=5688 line= ytlist[j++] = '|fulford|fulford_benjamin|https://www.youtube.com/results?search_query=fulford+benjamin';
tail j=5689 line= ytlist[j++] = '||Julijana Sarac I Put A Spell On You|https://www.youtube.com/watch?v=jGhA2_ZcRVY&list=RDjGhA2_ZcRVY&start_radio=1';
tail j=5690 line=
tail j=5691 line= ytlist[j++] = 'redding|dreams_to_remeber|pn://www.youtube.com/watch?v=8UOf6kngJGw&list=RD8UOf6kngJGw&start_radio=1';
tail j=5692 line=
tail j=5693 line= ytlist[j++] = '|haggard|A place to fall apart Merle Haggard Janie Fricke|https://www.youtube.com/watch?v=iXPdB1ykWHE&list=RDiXPdB1ykWHE&start_radio=1|';
tail j=5694 line=
tail j=5695 line= ytlist[j++] = '|dreamers|Freddie & The Dreamers ~ I Understand/Auld Lang Syne|http://www.youtube.com/watch?v=Hy0AGS13dqc';
tail j=5696 line=
tail j=5697 line= ytlist[j++] = '|dreamers|telln_you_now_dreamers|https://www.youtube.com/watch?v=Qu3Yk_0oRy0&start_radio=1&list=RDQu3Yk_0oRy0';
tail j=5698 line=
tail j=5699 line= ytlist[j++] = '|drezmers|hog4u|https://www.youtube.com/watch?v=911rMO4l0sA';
tail j=5700 line=
tail j=5701 line= ytlist[j++] = '|cher|sony_cher-gotubabe|https://www.youtube.com/watch?v=Vp2Du8j2_L0';
tail j=5702 line=
tail j=5703 line= ytlist[j++] = '|remR|Everybody Hurts (Live at Glastonbury 2003) HQ|http://www.youtube.com/watch?v=NLlOeGeVih4';
tail j=5704 line=
tail j=5705 line= ytlist[j++] = '|once|once_upontime_west|https://www.youtube.com/watch?v=kOy6M_X2MO8';
tail j=5706 line=
tail j=5707 line= ytlist[j++] = '|pale|procol_harme_litershade_denmark|https://www.youtube.com/watch?v=St6jyEFe5WM';
tail j=5708 line=
tail j=5709 line= ytlist[j++] = '|pale|Procol Harum Whiter Shade of Pale 2verses|http://www.youtube.com/watch?v=vIWCSrG1d-Y';
tail j=5710 line=
tail j=5711 line= ytlist[j++] = 'deadsouth| - In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY|';
tail j=5712 line= ytlist[j++] = '|pale|shadofpale_ships|https://www.youtube.com/watch?v=PYBqv3NIqho';
tail j=5713 line=
tail j=5714 line= ytlist[j++] = '|caro| nightlikethis|https://www.youtube.com/watch?v=Fc6izYdLhNE';
tail j=5715 line=
tail j=5716 line= ytlist[j++] = '|waits|time_cover_guitar|http://www.youtube.com/watch?v=uja4SHnfogo';
tail j=5717 line=
tail j=5718 line= ytlist[j++] = 'morrison|4seasons_back_on_top|https://www.youtube.com/watch?v=7fjTY_ABMj0&list=PL5A2209DE63BA79B8';
tail j=5719 line=
tail j=5720 line= ytlist[j++] = 'gurumal|delta_Delta Bayini|https://www.youtube.com/watch?v=oi6zbPjtO6I';
tail j=5721 line=
tail j=5722 line= ytlist[j++] = '|cohen|youb_you_got_me_singin|https://www.youtube.com/watch?v=3sFsT9vT6Fo';
tail j=5723 line=
tail j=5724 line= ytlist[j++] = 'dreamers|iunderst|https://www.youtube.com/watch?v=yo-1Des8i5M&list=PL9DF20D3DD3895F1C&index=4';
tail j=5725 line=
tail j=5726 line= ytlist[j++] = 'sledge|dark_end_of_the_street|https://www.youtube.com/watch?v=Gj3UdRmhgvM';
tail j=5727 line=
tail j=5728 line= ytlist[j++] = 'oesch|bavaria_yodl| https://www.youtube.com/watch?v=hVjNxV7qM90';
tail j=5729 line=
tail j=5730 line= ytlist[j++] = 'hagardlife_isgone2hellhttps://www.youtube.com/watch?v=iXPdB1ykWHE&start_radio=1&list=RDMMiXPdB1ykWHE';
tail j=5731 line=
tail j=5732 line= ytlist[j++] = 'claypton|xmas| https://www.youtube.com/watch?v=R7iKUCWTNWc&list=RDR7iKUCWTNWc&start_radio=1';
tail j=5733 line=
tail j=5734 line= ytlist[j++] = 'Guadalupe Pineda|Historia De Un Amor|https://www.youtube.com/watch?v=HzjE33U_gy8';
tail j=5735 line=
tail j=5736 line= ytlist[j++] = 'deadsouth|In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY';
tail j=5737 line=
tail j=5738 line= ytlist[j++] = 'morisson|4seasons|https://www.youtube.com/watch?v=zbxUXAMUeGk&list=PLFCFB9B1A93E89756&index=10';
tail j=5739 line=
tail j=5740 line= ytlist[j++] = 'morisan|playhousedown|https://www.youtube.com/watch?v=b0jqe40gmH4&list=PLFCFB9B1A93E89756&index=5';
tail j=5741 line=
tail j=5742 line= ytlist[j++] = '|van_morison|end_ofthe_land|https://www.youtube.com/watch?v=dui7_N0g_VY&index=6&list=PLFCFB9B1A93E89756';
tail j=5743 line=
tail j=5744 line= ytlist[j++] = '|vanloss|stariway|https://www.youtube.com/watch?v=gCE0MapWKJ8&index=7&list=PLFCFB9B1A93E89756';
tail j=5745 line=
tail j=5746 line= ytlist[j++] = 'fureys|last lovesong| https://www.youtube.com/watch?v=yNFiD1ZQZLU';
tail j=5747 line=
tail j=5748 line= ytlist[j++] = '|rush|cirlce_game|https://www.youtube.com/watch?v=q_C_rOOdXxs';
tail j=5749 line=
tail j=5750 line= ytlist[j++] = '|rush|circlgam2|https://www.youtube.com/watch?v=9yN-6PbqAPM';
tail j=5751 line=
tail j=5752 line= ytlist[j++] = 'rush|remberbergame| https://www.youtube.com/watch?v=xMFtm02rgF0';
tail j=5753 line=
tail j=5754 line= ytlist[j++] = 'lucinda_williams|broken_butterflies|https://www.youtube.com/watch?v=gLQ23LLtKJk';
tail j=5755 line=
tail j=5756 line=
tail j=5757 line= ytlist[j++] = 'kou|python|https://www.youtube.com/watch?v=rfscVS0vtbw';
tail j=5758 line=
tail j=5759 line= ytlist[j++] = 'kou|blender28|https://www.youtube.com/watch?v=jBqYTgaFDxU';
tail j=5760 line=
tail j=5761 line= ytlist[j++] = 'kou|html|https://www.youtube.com/watch?v=pQN-pnXPaVg';
tail j=5762 line=
tail j=5763 line= ytlist[j++] = 'kou|sqlite3|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5764 line=
tail j=5765 line=
tail j=5766 line= ytlist[j++] = 'kou|visual_studio|https://www.youtube.com/watch?v=fnPhJHN0jTE';
tail j=5767 line=
tail j=5768 line= ytlist[j++] = 'kou|visual_studio_py|https://www.youtube.com/watch?v=72Alzsz8RyI';
tail j=5769 line=
tail j=5770 line=
tail j=5771 line= ytlist[j++] = 'kou|php|https://www.youtube.com/watch?v=OK_JCtrrv-c';
tail j=5772 line=
tail j=5773 line= ytlist[j++] = 'kou|tensor|https://www.youtube.com/watch?v=tYYVSEHq-io';
tail j=5774 line=
tail j=5775 line= ytlist[j++] = 'kou|go|https://www.youtube.com/watch?v=5PTXdR8hLlQ';
tail j=5776 line=
tail j=5777 line= ytlist[j++] = 'kou|vi|https://www.youtube.com/watch?v=HMpB28l1sLc';
tail j=5778 line=
tail j=5779 line= ytlist[j++] = 'kou|tech_ingredients_speakers|https://www.youtube.com/watch?v=zdkyGDqU7xA';
tail j=5780 line=
tail j=5781 line= ytlist[j++] = 'kou|tech_ingredients_labshop|https://www.youtube.com/watch?v=nZefdoHmtJo';
tail j=5782 line=
tail j=5783 line= ytlist[j++] = 'kou|tech_ingredients_magnetics|https://www.youtube.com/watch?v=LS3GQk9ETRU';
tail j=5784 line=
tail j=5785 line= ytlist[j++] = 'kou|3dprint|https://www.youtube.com/watch?v=3LBTkLsjHGQ';
tail j=5786 line=
tail j=5787 line= ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5788 line=
tail j=5789 line= ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
tail j=5790 line=
tail j=5791 line= alert( "BUGS_4715 ytlist len="+j );
tail j=5792 line= }
tail j=5793 line=
tail j=5794 line= </script id="script_ytlist_load" >
tail j=5795 line=
tail j=5796 line=
tail j=5797 line=<!---
tail j=5798 line= <script id="script_dragable" type="text/javascript">
tail j=57
//
koh5_pano
Drag mouse to navigate.
Navigation
- Left/Right Mouse drag: Changes camera heading.
- Up/Sown Mouse drag: Changes camera pitch.
- Scroll wheel: Changes camera field of view.
- I-Key: Displays Info panel with canvas size, image size and FPS.
17.Aug.2010, Martin Wengenmayer