Radix cross Linux Build System

Cross-platform build system is designed to build distributions of different operating systems for a set of target devices

51 Commits   3 Branches   2 Tags
     5         kx <!DOCTYPE html>
     5         kx <html>
     5         kx  <head>
     5         kx   <meta charset="utf-8">
     5         kx   <meta name="viewport" content="width=device-width, initial-scale=1.0">
     5         kx   <meta name="owner" content="Andrey V.Kosteltsev">
     5         kx   <meta name="author" content="Andrey V.Kosteltsev">
     5         kx   <meta http-equiv="content-type" content="text/html; charset=UTF-8">
     5         kx   <meta http-equiv="Content-script-type" content="text/javascript">
     5         kx   <meta http-equiv="Content-Style-Type" content="text/css">
     5         kx 
     5         kx   <link href="data:image/x-icon;base64,AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAAAABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrKysrKyuPKysr2SsrK/grKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr+CsrK9krKyuPKysrKwAAAAAAAAAAAAAAAAAAAAArKysDKysrWSsrK9krKyv+Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv+Kysr2SsrK1krKysDAAAAAAAAAAArKytZKysr7isrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK+4rKytZAAAAACsrKywrKyvYKysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyvYKysrLCsrK48rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/KysrjysrK9grKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr2CsrK/crKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Ly8v/zIzM/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr9ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ykpKf8oKCj/KCgo/ykpKf8rKyv/cnh4/1NWVv8mJib/KCgo/ykpKf8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kioq/ygoKP8oKCj/KSgo/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/LS0t/05QUf9YW1v/WFtc/0VHSP9UV1f/ho2O/0hKSv9YW1z/V1tb/1FUVP8vLy//Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/PT8//1daW/9XW1v/VFdX/zMzM/8rKyr/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8pKCj/W15f/9Lf4f/g7e//2ebo/3h+f/+LkpP/RUdH/1NWV//N2dv/4e7w/9nm6P9xdnf/KSkp/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv8zNDT/p7Cy/+Hu8P/h7/H/p7Cx/zQ0NP8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv85Ojr/t8HD/+r4+v/q+Pr/pa6v/3uBgv9qb2//KSkp/ysrK/98goP/5PHz/+r4+v/P3N3/UVRU/ykpKf8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ykpKf94fn//5PLz/+n4+v/U4eP/U1dX/ykpKf8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/+GjI3/5vT2/+n3+f/M2Nr/cHV2/4aNjv8yMjL/Kioq/yoqKv8xMjL/n6ip/+n3+f/p+Pr/tL7A/zo7O/8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/KSkp/0xOT//O2tz/6ff5/+b09v+BiIn/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/KSgo/1ZZWf/W4uT/6ff5/+Px8/+BiIj/iZCR/0pNTf8pKSn/Kysr/ysrK/8pKSn/QUND/7/Ky//q+Pr/5/X3/5GZmv8tLi7/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/MjIy/6avsP/p9/n/6fj6/7K8vv83ODj/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/Njc3/7G7vf/p+Pr/6fj6/6mytP94fn//bnN0/ykpKf8rKyv/Kysr/ysrK/8rKyv/KSgo/1teX//W4+T/6ff5/9/s7v9scXL/KSkp/ysrK/8rKyv/Kysr/ysrK/8pKSn/dHl6/+Pw8v/p9/n/1uPl/1ZaWv8pKCj/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/f4aG/+Xz9f/p9/n/z9vd/3B1dv+Ij5D/NDQ0/yoqKv8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv98goP/4/Hz/+n4+v/M2Nr/TVBQ/ykpKf8rKyv/Kysr/ykpKf9JS0z/zNjZ/+n3+f/m9Pb/hoyN/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ykpKf9RVFT/0t/h/+n3+f/k8vT/hIuM/4iPkP9OUVH/KSkp/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv8xMjL/n6ip/+n3+f/p+Pr/sLq7/zg5Of8qKir/Kioq/zExMf+iq6z/6ff5/+n4+v+2wML/OTo6/yoqKv8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kioq/zQ0Nf+stbb/6fj6/+n4+v+tt7j/dnt8/3F3d/8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8pKSn/QUND/7/KzP/q+Pr/5/T2/4yUlf8tLS3/KSgo/3B1dv/h7/H/6ff5/9jl5/9aXV7/KSgo/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/KSkp/3l/gP/k8vT/6ff5/9Lf4P9wdXb/ipGS/0JERP8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/KSgo/1tfX//W4+X/6fj6/93q7P9mamv/REZH/8nV1v/p9/n/5/X3/4qRkv8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8pKSn/TE9P/8/b3f/p9/n/5fP1/4eOj/+Ei4z/b3R1/7G7vP9obW7/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv98goP/5PHz/+b09v9+hYX/nKSm/+n3+f/p+Pr/usTG/zs8PP8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv8zNDT/qLGy/+v6/P/r+fv/sbu9/3N4ef97gYL/n6ip/+v5+//V4eP/XmJj/ykpKf8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv8yMjL/oaqr/6q0tf92fH3/3+3v/+n3+f/a5+n/XWFi/ykoKP8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ykpKf9dYWL/w87Q/8nV1/++ycv/b3R1/4qRkv99hIX/4O3v/+j2+P/q+Pr/ws3P/0BCQv8qKSn/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKSn/PD09/1tfX//E0NL/6ff5/+j2+P+OlZb/LCws/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/80NTX/PD09/zs8PP88PT3/hIuM/2BkZP+zvb7/6vn7/+f19//n9ff/6Pb4/4mQkf8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/LS0t/5mhov/p9/n/6fj6/7vGyP86Ozv/Jycn/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/Kioq/ygnJ/9iZmf/e4GC/ysrK/9iZmf/2OTm/+j2+P/n9ff/6ff5/8jU1f8+QED/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8pKCj/aGxt/9/s7v/p9/n/2+jq/32Dg/9yd3j/VVhZ/ywsLP8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kikp/0BCQv+OlZb/Ozw8/yoqKv8qKir/j5eY/+j2+P/n9ff/5/X3/+Pw8v9kaGn/KCgo/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ykpKf9BQ0P/w87Q/+n3+v/n9ff/oqqs/7vGyP/p9/n/0t7g/1JUVf8pKSn/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/LS0t/4GHiP9bX1//KSgo/ysrK/8pKCj/UVRV/9rn6f/o9vj/5/X3/+n3+f+GjY7/KCgo/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/y0uLv+Wnp//6Pb4/+n4+v++ycv/XmFi/9fk5v/q+Pr/5/X3/2lub/8nJyf/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8pKCj/XmJj/3+Fhv8sLS3/Kysr/ysrK/8qKir/Ojs7/8fS1P/p9/n/5/X3/+r4+v+ZoqP/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/KSgo/2Roaf/d6uz/6ff5/93r7f9kaWn/Ly8v/5ObnP/T3+H/s72//4qRkv9eYmP/KSkp/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv89Pz//jpWW/z4/QP8qKir/Kysr/ysrK/8qKir/Nzg4/8LOz//p9/n/5/X3/+r4+/+dpab/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKSn/P0BA/8DLzP/p+Pr/6Pb4/5aen/8uLi7/Kioq/y8wMP9NUFD/o6yt/+Px8//I09X/SEpK/ykpKf8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ywsLP9+hIX/X2Nk/ykoKP8rKyv/Kysr/ysrK/8pKSn/REZG/9He3//o9vn/5/X3/+r4+v+Ql5n/KSkp/ysrK/8rKyv/Kysr/ysrK/8tLS3/kZma/+j2+P/p9/n/w8/Q/0FDQ/8pKSn/Kysr/yoqKv8yMzP/qLKz/+r4+v/p9/n/qrO0/zU2Nv8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/KSgo/1pdXv+CiIn/Li4u/ysrK/8rKyv/Kysr/ysrK/8oKCj/cHV2/+Ty9P/n9ff/5/X3/+f19/9zeXn/KCgo/ysrK/8rKyv/Kysr/ykoKP9gZGX/2+nr/+n3+f/f7O7/aW1u/ykoKP8rKyv/Kysr/ysrK/8pKSn/R0lK/8bS1P/p+Pr/5vP1/4eOj/8sLCz/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/Ojs8/46Vlv9BQ0P/Kikp/ysrK/8rKyv/Kysr/ykpKf8+QED/vsjK/+n3+f/n9ff/6Pb4/9fj5f9NT0//KSkp/ysrK/8rKyv/Kioq/zw+Pv+8x8n/6fj6/+n3+f+ao6T/Li8v/ysrK/8rKyv/Kysr/ysrK/8rKyv/KSkp/2Roaf/b6Or/6ff5/9vo6v9kaWn/KSkp/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/eoCB/2Roaf8pKSn/Kysr/yoqKv8pKSn/KCgo/z9AQP+mr7H/5/X4/+f19//n9ff/6vj6/6ewsf8vLzD/Kysr/ysrK/8rKyv/LCws/42Vlv/n9ff/6ff5/8bS1P9ERkb/KSkp/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ywsLP+Hjo//5vP1/+n4+v/H09T/SEpK/ykpKf8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ykpKf9WWVn/hYyM/y8vL/8qKir/Li4u/zk6Ov9GSEn/cnh5/7/Ky//o9vj/5/X3/+f19//o9vj/2ufp/1peXv8pKCj/Kysr/ysrK/8pKSn/XWFi/9rn6f/p9/r/4O7w/2xxcv8pKSn/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv81Njb/qrS1/+n3+f/p9/n/qrO0/zU2Nv8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kioq/zg5Of+NlJX/RUdH/ykpKf8pKSn/TVBQ/77Jy//U4OL/5fP1/+n3+f/n9ff/5/X3/+j2+P/m9Pb/iZCR/ywsLP8rKyv/Kysr/yoqKv84OTn/r7m6/9/t7//f7O7/nKSm/zAwMP8rKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8pKSn/SUtL/8jT1f/p+Pr/5vP1/4eOj/8sLCz/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kioq/3Z8ff9obW7/KSkp/ysrK/8oKCj/VVhZ/+Dt7//p9/n/5/X3/+f19//n9ff/6Pb4/+b09v+aoqT/NDU1/yoqKv8rKyv/Kysr/yoqKv80NDX/UlVV/1RXV/9TVlf/OTo6/yoqKv8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/KSkp/2Zqa//c6ev/6ff5/9vo6v9kaWn/KSkp/ysrK/8rKyv/Kysr/ysrK/8pKSn/UVRV/4eOj/8xMTH/Kyoq/ysrK/8oKCj/VVhY/97r7f/o9vj/5/X3/+j2+P/q+Pr/2ufp/4mQkf80NTX/Kioq/ysrK/8rKyv/Kysr/ysrK/8qKir/KSko/ykoKP8pKCj/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ywsLP+JkJH/5vT2/+n4+v/H09T/SEpK/ykpKf8rKyv/Kysr/yoqKv83ODj/jJSV/0hLS/8pKSn/Kysr/ysrK/8oKCj/VVlZ/+Hu8P/q+fv/5/X3/9fk5f+nsLL/Wl5e/ywsLP8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv82Nzf/rLa3/+v6/P/s+/3/rbe4/zg5Of8qKir/Kysr/ykpKf9JTEz/XmJj/yoqKv8rKyv/Kysr/ysrK/8pKSn/REZG/5Wcnv+QmJn/dHl6/01PUP8vMDD/KSgo/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8pKSn/SEpL/5Wdnv+bpKX/mKCh/09SUv8pKSn/Kysr/ysrK/8rKyv/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv8pKSn/KCgo/ykpKf8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kioq/yoqKv8qKir/Kioq/ywsLP8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/krKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr+SsrK9wrKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr3CsrK5crKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/KysrlysrKzQrKyveKysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyveKysrNAAAAAArKytmKysr9CsrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/QrKytmAAAAAAAAAAArKysFKysraCsrK+QrKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr5CsrK2grKysFAAAAAAAAAAAAAAAAKysrAisrKzorKyulKysr6ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK+srKyulKysrOisrKwIAAAAAAAAAAPAAAAAADwAA4AAAAAAHAADAAAAAAAMAAIAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAEAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKysrEisrK30rKyvcKysr/CsrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv8Kysr3CsrK30rKysSAAAAACsrKxIrKyueKysr+ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr+ysrK54rKysSKysrfisrK/orKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr+isrK34rKyvbKysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kioq/yoqKv8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr2ysrK/srKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8pKSn/KSkp/ykpKf87PDz/Nzg4/ygoKP8pKSn/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/KSkp/ykpKf8rKyv/Kysr/ysrK/8rKyv7Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Li4u/0lMTP9QU1P/QUJD/21ycv9TVlb/UFNT/0JERP8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kioq/zY3N/9PUlL/TE5P/zAwMP8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ygoKP9hZWb/1ODi/8jU1f+Ahof/U1ZW/2NoaP/U4eP/xM/R/0pNTf8pKSn/Kysr/ysrK/8rKyv/Kysr/ysrK/8uLi7/lJyd/9/s7v+fp6n/MTIy/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/PT4+/73Iyv/o9vj/nKSl/2xxcf8uLi7/Li4u/5OanP/q+Pr/rLa3/zY3N/8qKir/Kysr/ysrK/8rKyv/KSgo/2Vqav/f7e//09/h/1BTU/8pKSn/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ywsLP+NlZb/6vj6/7rFxv96gIH/PkBA/yoqKv8qKir/Ojs7/7S+wP/o9/n/iI+Q/ywsLP8rKyv/Kysr/ykpKf8/QUH/wczO/+f19/99g4T/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8oKCj/XGBg/9vo6v/X5Ob/h46P/1daW/8pKSn/Kysr/ysrK/8pKSn/UFNT/9Dc3v/d6uz/ZGhp/ykoKP8rKyv/LS0t/5ObnP/r+fv/r7i6/zU2Nv8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kioq/zk7O/+4w8T/6Pb4/52mp/9tcnL/LzAw/ysrK/8rKyv/Kysr/ysrK/8pKSn/b3R1/+Lv8f/H09X/R0lK/ycmJv9hZmb/3uvt/9Xh4/9TVlb/KSgo/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/h46P/+n3+f+9yMn/fIKD/0pMTP8pKCj/Kysr/ysrK/8rKyv/Kysr/ysrK/8uLi7/kpqb/+r4+v+nsLH/RkhI/73Iyv/o9vj/gYeI/yoqKv8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/KSkp/1hcXP/Z5uj/2ufp/4aNjv+DiYr/q7W2/05QUf8pKSn/Kysr/ysrK/8rKyv/Kysr/yoqKv86Ozv/tsDC/7nExf+bo6T/6fj6/7K8vv83ODj/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8xMTH/mKCh/87a3P+ZoaL/fIKD/7bBwv/s+vz/tsDB/zo7O/8qKir/Kysr/ysrK/8rKyv/Kysr/ykpKf9JS0z/g4mK/9rn6f/W4+X/VVhZ/ykoKP8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/y0uLv88PT3/P0FB/21yc/9obG3/09/h/+n3+f/n9ff/eoCB/ykpKf8rKyv/Kysr/ysrK/8rKyv/Kioq/zo7O/+5xMX/6Pb4/4yUlf80NTX/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ygoKP9RVFX/X2Nj/yoqKv+Ei4z/5/T2/+r4+v+2wML/MjMz/ysqKv8rKyv/Kysr/ysrK/8rKyv/ipGT/+n3+f/Czc//sbu9/7K8vf9CQ0T/KSkp/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/Ojs7/290df8zMzT/KCgo/0dKSv/U4eL/6vj6/9Hd3/9DRUX/KSkp/ysrK/8rKyv/KSgo/1peXv/a5+n/2OXm/290df/K1tj/3Onr/2JmZ/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ywsLP9obG3/SEpL/ykpKf8qKir/Ojw8/8jU1f/q+Pr/1+Tm/0pMTf8pKSn/Kysr/yoqKv85Ojr/t8HD/+r4+v+JkJH/LCws/1ZZWv+bo6T/xM/R/2BkZf8pKCj/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8pKSn/T1JT/2JmZ/8qKir/Kysr/ykpKf9JS0z/1eLk/+r4+v/Q3N7/QkRE/yopKf8rKyv/Kysr/4aNjv/p9/n/usTG/zo8PP8qKir/Jycn/3B2dv/l8/X/xM/R/0RGR/8pKSn/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kioq/zc4Of9wdXX/NTU2/yoqKv8qKir/Kioq/4mQkf/n9ff/6vj6/7O9v/8yMjL/Kysr/ykoKP9XWlr/1+Tm/9vo6v9dYWH/KCgo/ysrK/8rKir/MDAw/5mhov/q+Pr/pa6v/zM0NP8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Zmpr/0tOTv8pKSn/Kysr/zY3N/97gYL/2+jq/+j2+P/m8/X/dnt8/ykoKP8qKir/ODk5/7S+wP/q+fv/jpWW/ywsLP8rKyv/Kysr/ysrK/8pKSn/Pj8//7vFx//n9ff/gYiJ/ysrK/8rKyv/Kysr/ysrK/8rKyv/KSkp/0xPT/9laWr/Kioq/z9BQf+Wnp//vsnK/+Px8v/o9vj/6vj6/7C6u/83ODj/Kioq/yoqKv93fX3/2ufp/7fBw/89Pj7/Kioq/ysrK/8rKyv/Kysr/ysrK/8pKCj/Vlla/9Th4//a5+n/YGNk/ykoKP8rKyv/Kysr/yoqKv81Njb/cHV1/zc4OP8oKCj/TlFR/93q7P/q+fv/6ff5/+n3+f+4wsT/R0lK/ykpKf8rKyv/LCws/0RFRv9OUVH/PkBA/yoqKv8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/d3x9/+Ty9P/Ez9H/RUZH/ykpKf8rKyv/Kysr/2JnZ/9OUVH/KSkp/ykpKf9OUVH/2+jq/+Ty9P/O2tz/jpaX/z5AQP8pKSn/Kysr/ysrK/8rKyv/Kikp/ykpKf8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv8wMDD/m6Ok/+r4+v+mr7H/NTU1/yoqKv8wMDD/SkxN/y0tLf8rKyv/Kioq/zo7O/9yd3j/ZWpq/0NFRf8rKyv/Kioq/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yopKf89Pj7/dXp7/3Z7fP89Pj7/Kioq/ysrK/8qKir/Kysr/ysrK/8rKyv/Kioq/ygoKP8oKCj/KSkp/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/yoqKv8oKCj/KCgo/yoqKv8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv8Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/CsrK94rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyveKysrhSsrK/wrKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/CsrK4UrKysWKysrqCsrK/0rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/0rKyuoKysrFgAAAAArKysXKysriysrK+grKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyvoKysriysrKxcAAAAA4AAAB4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAcAAAAMoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAKysrTCsrK9QrKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyvUKysrTCsrK9QrKyv/Kysr/ysrK/8rKyv/KSkp/yoqKv8qKir/Kioq/ysrK/8rKyv/Kysr/ysqKv8pKSn/Kysr/ysrK9QrKyv9Kysr/ysrK/8rKyv/Li4u/0NFRf9GSUn/SkxM/zY3N/8qKir/Kysr/yoqKv8yMjL/REVG/y4uLv8rKyv9Kysr/ysrK/8rKyv/KSgo/2lubv+0v8D/Wl5e/3l+f/+epqf/MzQ0/yoqKv8qKir/g4qL/5aeoP8vLzD/Kysr/ysrK/8rKyv/KSkp/0FDQ/+7xsf/iI+Q/zIzM/81Njb/pa6w/4GIif8oKCj/Vlla/73Iyf9OUVH/KSkp/ysrK/8rKyv/Kysr/y4uLv+Wnp//sLq7/0pNTf8pKSn/KSkp/0hKSv+1wMH/Z2xt/6u1tv97gYL/KSkp/ysrK/8rKyv/Kysr/ykpKf9UV1j/sry+/5ykpf+ZoqP/NTY2/yoqKv8pKSn/XWFh/7G7vP+kra//MzQ0/yoqKv8rKyv/Kysr/ysrK/8rKyv/Njc3/1hbW/+Bh4j/4O7w/2ltbv8oKCj/KSgo/1FUVf/G0dP/j5eY/zM0NP8qKir/Kysr/ysrK/8rKyv/Kioq/0BBQf9CRET/QUND/9Tg4v+NlZb/KCgn/zQ1Nf+qs7X/i5KT/5mio/9zeHn/Kysr/ysrK/8rKyv/Kioq/zM0NP9NUFD/KSkp/1ZaWv/c6ev/gIaH/ycnJ/9+hIX/rLW3/zM0NP9FR0f/tsDC/11hYf8pKCj/Kysr/ywsLP9KTE3/QUND/3B1df/Ez9H/z9vd/0hLS/9FR0f/sLq8/1RXV/8pKCj/KSkp/2htbf+0v8D/QkRE/ykpKf8/QUH/REZG/0VHSP/N2dv/ws7P/2FlZf8qKir/NTY2/0FDQ/8sLCz/Kysr/ysrK/8sLCz/ipGS/5igof8yMjL/NTY2/y4uLv8yMzP/UFNU/zo7O/8pKSn/Kysr/yoqKv8qKin/Kysr/ysrK/8rKyv/Kioq/zQ1Nf9SVVb/MzM0/yoqKv4rKyv/Kysr/ykpKf8qKir/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8qKir/KSkp/ysrK/4rKyvXKysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyvXKysrUSsrK9orKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyvaKysrUYABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAAA=" rel="icon" type="image/x-icon" />
     5         kx 
     5         kx   <title>@ROOT@ &#8211; Requires Tree</title>
     5         kx 
     5         kx   <style>
     5         kx    @import url(https://fonts.googleapis.com/css?family=Roboto:400,700italic,700,500italic,500,400italic&subset=cyrillic-ext,latin);
     5         kx    @import url(https://fonts.googleapis.com/css?family=Cousine:400,400italic,700,700italic&subset=cyrillic-ext,latin);
     5         kx   </style>
     5         kx 
     5         kx   <style>
     5         kx    body, html {
     5         kx      margin: 0 0 0 0;
     5         kx    }
     5         kx 
     5         kx    #front_wrapper {
     5         kx      margin: 0 auto;
     5         kx      height: 100vh;
     5         kx      position: relative;
     5         kx      overflow: auto;
     5         kx      background-color: #ececec;
     5         kx    }
     5         kx 
     5         kx    #spinner {
     5         kx      margin: 0 auto;
     5         kx      min-height: 256px;
     5         kx      text-align: center;
     5         kx      display: flex;
     5         kx      align-items: center;
     5         kx    }
     5         kx 
     5         kx    #tree_view {
     5         kx      margin: 0 auto;
     5         kx      min-height: 256px;
     5         kx      width: 2720px;
     5         kx      border: 0px solid #e7e7e7;
     5         kx    }
     5         kx 
     5         kx    .header-wrapper {
     5         kx      height: 160px;
     5         kx      width: 100%;
     5         kx      margin: 0 auto;
     5         kx      position: relative;
     5         kx      background: transparent;
     5         kx    }
     5         kx 
     5         kx    .content-wrapper {
     5         kx      background-color: #ffffff;
     5         kx    }
     5         kx 
     5         kx    .footer-wrapper {
     5         kx      background: #ececec;
     5         kx    }
     5         kx 
     5         kx    .content {
     5         kx      width: 1018px;
     5         kx      min-height: 256px;
     5         kx      padding: 18px 3px 12px 3px;
     5         kx      margin: 0 auto;
     5         kx      background-color: #fdfdfd;
     5         kx      position: relative;
     5         kx      overflow: hidden;
     5         kx      align: center;
     5         kx      border: 1px solid #e7e7e7;
     5         kx    }
     5         kx 
     5         kx    .footer {
     5         kx      width: 1022px;
     5         kx      height: 48px;
     5         kx      margin: 0 auto;
     5         kx 
     5         kx      -moz-border-radius-topleft: 0px;
     5         kx      -moz-border-radius-topright: 0px;
     5         kx      -moz-border-radius-bottomright: 4px;
     5         kx      -moz-border-radius-bottomleft: 4px;
     5         kx 
     5         kx      -webkit-border-top-left-radius: 0px;
     5         kx      -webkit-border-top-right-radius: 0px;
     5         kx      -webkit-border-bottom-left-radius: 4px;
     5         kx      -webkit-border-bottom-right-radius: 4px;
     5         kx 
     5         kx      border-top-left-radius: 0px;
     5         kx      border-top-right-radius: 0px;
     5         kx      border-bottom-left-radius: 4px;
     5         kx      border-bottom-right-radius: 4px;
     5         kx 
     5         kx      border: 1px solid #545454;
     5         kx      background-color: #4c4c4c;
     5         kx      background: linear-gradient(288deg, rgb(84, 84, 84), rgb(76, 76, 76));
     5         kx    }
     5         kx 
     5         kx    .footer-top {
     5         kx      margin: 2px auto 1px auto;
     5         kx      color: #ffffff;
     5         kx      text-align: center;
     5         kx    }
     5         kx 
     5         kx    .footer-bottom {
     5         kx      margin: 0 8px 0 8px;
     5         kx      min-height: 20px;
     5         kx      color: #ffffff;
     5         kx      font-size: 10px;
     5         kx    }
     5         kx 
     5         kx    .logo {
     5         kx      width: 1024px;
     5         kx      height: 80px;
     5         kx      margin: 0 auto;
     5         kx      background-color: transparent;
     5         kx    }
     5         kx 
     5         kx    .navigator {
     5         kx      width: 1024px;
     5         kx      height: 79px;
     5         kx      margin: 0 auto;
     5         kx      padding: 1px 0 0;
     5         kx 
     5         kx      -moz-border-radius-topleft: 4px;
     5         kx      -moz-border-radius-topright: 4px;
     5         kx      -moz-border-radius-bottomright: 0px;
     5         kx      -moz-border-radius-bottomleft: 0px;
     5         kx 
     5         kx      -webkit-border-top-left-radius: 4px;
     5         kx      -webkit-border-top-right-radius: 4px;
     5         kx      -webkit-border-bottom-left-radius: 0px;
     5         kx      -webkit-border-bottom-right-radius: 0px;
     5         kx 
     5         kx      border-top-left-radius: 4px;
     5         kx      border-top-right-radius: 4px;
     5         kx      border-bottom-left-radius: 0px;
     5         kx      border-bottom-right-radius: 0px;
     5         kx 
     5         kx      border: 1px solid #545454;
     5         kx      background-color: #4c4c4c;
     5         kx      background: linear-gradient(288deg, rgb(84, 84, 84), rgb(76, 76, 76));
     5         kx    }
     5         kx 
     5         kx    .copyright {
     5         kx      color: #f0f0ea;
     5         kx      text-decoration: none;
     5         kx      font-family: 'Roboto', helvetica, arial, sans-serif;
     5         kx      font-weight: bold;
     5         kx      font-style: normal;
     5         kx      font-size: 12px;
     5         kx    }
     5         kx 
     5         kx    .copyright:hover {
     5         kx      text-decoration: underline;
     5         kx    }
     5         kx 
     5         kx 
     5         kx    .date-title {
     5         kx      height: 16px;
     5         kx      font: 12px 'Roboto', sans-serif;
     5         kx      font-weight: bold;
     5         kx      padding-top: 6px;
     5         kx      margin-bottom: -10px;
     5         kx      padding-left: 16px;
     5         kx      color: #c0c0c0;
     5         kx    }
     5         kx    .time-title {
     5         kx      color: #82946f;
     5         kx    }
     5         kx    .hardware-title {
     5         kx      height: 20px;
     5         kx      float: right;
     5         kx      text-align: right;
     5         kx      padding-right: 16px;
     5         kx      width: 512px; font: 14px 'Roboto', sans-serif;
     5         kx      font-weight: bold;
     5         kx      color: #f0f0ea;
     5         kx    }
     5         kx    .hw-title {
     5         kx      font: 10px 'Roboto', sans-serif;
     5         kx      font-weight: bold;
     5         kx      color: #cadaba;
     5         kx    }
     5         kx    .tree-title {
     5         kx      height: 42px;
     5         kx      padding-left: 16px;
     5         kx      font: 28px 'Roboto', sans-serif;
     5         kx      font-weight: bold;
     5         kx      color: #f0f0ea;
     5         kx    }
     5         kx    .tree-hw-title {
     5         kx      color: #cadaba;
     5         kx    }
     5         kx 
     5         kx    /* SVG spinner icon animation */
     5         kx    .spinner {
     5         kx      -webkit-animation: rotate 2s linear infinite;
     5         kx              animation: rotate 2s linear infinite;
     5         kx      z-index: 2;
     5         kx      position: relative;
     5         kx      top: 50%;
     5         kx      left: 50%;
     5         kx      margin: -25px 0 0 -25px;
     5         kx      width: 50px;
     5         kx      height: 50px;
     5         kx    }
     5         kx    .spinner-text {
     5         kx      z-index: 2;
     5         kx      position: absolute;
     5         kx      top: 0;
     5         kx      left: 0;
     5         kx      margin: 36px;
     5         kx      font: 28px 'Roboto', sans-serif;
     5         kx      color: #c0c0c0;
     5         kx    }
     5         kx    .spinner .path {
     5         kx      stroke: #cccccc;
     5         kx      stroke-linecap: round;
     5         kx      -webkit-animation: dash 1.5s ease-in-out infinite;
     5         kx              animation: dash 1.5s ease-in-out infinite;
     5         kx    }
     5         kx 
     5         kx    @-webkit-keyframes rotate {
     5         kx      100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); }
     5         kx    }
     5         kx    @keyframes rotate {
     5         kx      100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); }
     5         kx    }
     5         kx    @-webkit-keyframes dash {
     5         kx        0% { stroke-dasharray:  1, 150; stroke-dashoffset:    0; }
     5         kx       50% { stroke-dasharray: 90, 150; stroke-dashoffset:  -35; }
     5         kx      100% { stroke-dasharray: 90, 150; stroke-dashoffset: -124; }
     5         kx    }
     5         kx    @keyframes dash {
     5         kx        0% { stroke-dasharray:  1, 150; stroke-dashoffset:    0; }
     5         kx       50% { stroke-dasharray: 90, 150; stroke-dashoffset:  -35; }
     5         kx      100% { stroke-dasharray: 90, 150; stroke-dashoffset: -124; }
     5         kx    }
     5         kx 
     5         kx 
     5         kx    .node {
     5         kx      cursor: pointer;
     5         kx    }
     5         kx    .node text {
     5         kx      font: 14px 'Cousine', monospace;
     5         kx    }
     5         kx 
     5         kx    .tree-tooltip {
     5         kx      position: absolute;
     5         kx      text-align: left;
     5         kx      padding: 16px 16px 8px;
     5         kx      background-color: #fafafa;
     5         kx      border: 1px solid #71ad93;
     5         kx      border-radius: 8px;
     5         kx      pointer-events: none;
     5         kx      color: #343434;
     5         kx      -webkit-box-shadow: 0 0 5px #aaa;
     5         kx      box-shadow: 0 0 5px #aaa;
     5         kx    }
     5         kx    .tooltip-header {
     5         kx      font: 14px Roboto, sans-serif;
     5         kx      font-weight: bold;
     5         kx      color: DarkRed;
     5         kx 
     5         kx      white-space: nowrap;
     5         kx      text-align: left;
     5         kx    }
     5         kx    .tooltip-header-not-packaged {
     5         kx      font: 11px Cousine,monospace;
     5         kx      font-weight: bold;
     5         kx      color: DarkRed;
     5         kx 
     5         kx      white-space: nowrap;
     5         kx 
     5         kx      padding-left: 8px;
     5         kx      padding-right: 8px;
     5         kx      padding-bottom: 8px;
     5         kx      text-align: left;
     5         kx    }
     5         kx    .tooltip-description {
     5         kx      font: 14px Roboto, sans-serif;
     5         kx      font-style: italic;
     5         kx      font-weight: bold;
     5         kx      color: #343434;
     5         kx 
     5         kx      white-space: nowrap;
     5         kx      text-align: left;
     5         kx      padding-left: 1.5em;
     5         kx      padding-top: .5em;
     5         kx      font-style: italic;
     5         kx    }
     5         kx    .tooltip-content {
     5         kx      font: 11px 'Cousine', monospace;
     5         kx      font-weight: bold;
     5         kx 
     5         kx      white-space: pre;
     5         kx      margin: 12px 0 8px;
     5         kx    }
     5         kx    .flavour {
     5         kx      color: DarkBlue;
     5         kx    }
     5         kx 
     5         kx 
     5         kx    @media (min-width: 1200px) {
     5         kx      .navigator { width: 1140px; }
     5         kx      .logo      { width: 1140px; }
     5         kx      .footer    { width: 1140px; }
     5         kx      .content   { width: 1134px; }
     5         kx    }
     5         kx    @media (min-width: 992px) and (max-width: 1199px) {
     5         kx      .navigator { width: 960px; }
     5         kx      .logo      { width: 960px; }
     5         kx      .footer    { width: 960px; }
     5         kx      .content   { width: 954px; }
     5         kx    }
     5         kx    @media (min-width: 768px) and (max-width: 991px) {
     5         kx      .navigator { width: 720px; }
     5         kx      .logo      { width: 720px; }
     5         kx      .footer    { width: 720px; }
     5         kx      .content   { width: 714px; }
     5         kx    }
     5         kx    @media (min-width: 576px) and (max-width: 767px) {
     5         kx      .navigator { width: 540px; }
     5         kx      .logo      { width: 540px; }
     5         kx      .footer    { width: 540px; }
     5         kx      .content   { width: 534px; }
     5         kx 
     5         kx      .node text { font-size: 12px; }
     5         kx 
     5         kx      .tooltip-header      { font-size: 12px; }
     5         kx      .tooltip-description { font-size: 12px; }
     5         kx      .tooltip-content     { font-size: 10px; }
     5         kx    }
     5         kx    @media (max-width: 575px) {
     5         kx      .navigator { width: 480px; }
     5         kx      .logo      { width: 480px; }
     5         kx      .footer    { width: 480px; }
     5         kx      .content   { width: 474px; }
     5         kx 
     5         kx      .node text { font-size: 12px; }
     5         kx 
     5         kx      .tooltip-header      { font-size: 12px; }
     5         kx      .tooltip-description { font-size: 12px; }
     5         kx      .tooltip-content     { font-size: 10px; }
     5         kx    }
     5         kx   </style>
     5         kx 
     5         kx   <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
     5         kx   <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
     5         kx   <script src="https://d3js.org/d3.v5.min.js"></script>
     5         kx   <script>
     5         kx    !function(o){function t(o,t){if(!(o.originalEvent.touches.length>1)){o.preventDefault();var e=o.originalEvent.changedTouches[0],n=document.createEvent("MouseEvents");n.initMouseEvent(t,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,!1,!1,!1,!1,0,null),o.target.dispatchEvent(n)}}if(o.support.touch="ontouchend"in document,o.support.touch){var e,n,u=o.ui.mouse.prototype,c=u._mouseInit,i=u._mouseDestroy;u._touchStart=function(o){var u=this;!n&&u._mouseCapture(o.originalEvent.changedTouches[0])&&(n=!0,u._touchMoved=!1,e=o,t(o,"mouseover"),t(o,"mousemove"),t(o,"mousedown"))},u._touchMove=function(o){if(n){var u=e.originalEvent.touches[0].screenX,c=e.originalEvent.touches[0].screenY,i=o.originalEvent.touches[0].screenX,r=o.originalEvent.touches[0].screenY;if(u===i&&c===r)return void(this._touchMoved=!1);this._touchMoved=!0,t(o,"mousemove")}},u._touchEnd=function(o){n&&(t(o,"mouseup"),t(o,"mouseout"),this._touchMoved||t(o,"click"),n=!1)},u._mouseInit=function(){var t=this;t.element.bind({touchstart:o.proxy(t,"_touchStart"),touchmove:o.proxy(t,"_touchMove"),touchend:o.proxy(t,"_touchEnd")}),c.call(t)},u._mouseDestroy=function(){var t=this;t.element.unbind({touchstart:o.proxy(t,"_touchStart"),touchmove:o.proxy(t,"_touchMove"),touchend:o.proxy(t,"_touchEnd")}),i.call(t)}}}(jQuery);
     5         kx    $(function() {
     5         kx      $( "#tree_view" ).draggable();
     5         kx    });
     5         kx   </script>
     5         kx   <script>
     5         kx    function load_json( url, callback ) {
     5         kx      var xobj = new XMLHttpRequest();
     5         kx      xobj.overrideMimeType("application/json");
     5         kx      xobj.open('GET', url, true);
     5         kx      xobj.onreadystatechange = function () {
     5         kx        if (xobj.readyState == 4 && xobj.status == "200") {
     5         kx          callback(xobj.responseText);
     5         kx        }
     5         kx      };
     5         kx      xobj.send(null);
     5         kx    }
     5         kx 
     5         kx    var pkgs;
     5         kx 
     5         kx    $(document).ready(function() {
     5         kx      load_json( '@JSON_PKGS_FILE@', function(response) {
     5         kx        pkgs = JSON.parse(response);
     5         kx      });
     5         kx 
     5         kx      $('#tree_view')
     5         kx        .mousedown(function() { $(this).css( 'cursor', 'grab' ); })
     5         kx        .mouseup(  function() { $(this).css( 'cursor', 'auto' ); });
     5         kx    });
     5         kx   </script>
     5         kx  </head>
     5         kx  <body>
     5         kx   <div id="front_wrapper">
     5         kx    <div class="header-wrapper">
     5         kx     <div class="logo"></div>
     5         kx     <div class="navigator">
     5         kx      <div style="height: 36px;">
     5         kx        <div class="date-title">@YEAR@-@MONTH@-@DAY@&nbsp;&nbsp;<span class="time-title">@HOUR@:@MINUTE@:@SECOND@</span></div>
     5         kx        <div class="hardware-title">
     5         kx         <span class="hw-title">HARDWARE:</span> @HARDWARE@
     5         kx        </div>
     5         kx      </div>
     5         kx      <div class="tree-title">
     5         kx       <span class="tree-hw-title">@ROOT@</span> &#8211; Requires Tree
     5         kx      </div>
     5         kx     </div> <!-- "navigator" -->
     5         kx    </div> <!-- "header_wrapper" -->
     5         kx 
     5         kx    <div class="content-wrapper">
     5         kx     <div class="content">
     5         kx      <div id="spinner">
     5         kx       <svg class="spinner" viewBox="0 0 50 50"><circle class="path" cx="25" cy="25" r="20" fill="none" stroke-width="5"></circle></svg>
     5         kx       <div class="spinner-text">Loading ...</div>
     5         kx      </div>
     5         kx      <div id="tree_view" class="ui-widget-content">
     5         kx      </div>
     5         kx     </div> <!-- "content" -->
     5         kx    </div> <!-- "content_wrapper" -->
     5         kx 
     5         kx    <div class="footer-wrapper">
     5         kx     <div class="footer">
     5         kx      <div class="footer-top">
     5         kx       <a class="copyright" target="_blank" href="@BUG_URL@">&#169; @COPYING@</a>
     5         kx      </div>
     5         kx      <div class="footer-bottom">
     5         kx      </div>
     5         kx     </div> <!-- "footer" -->
     5         kx    </div> <!-- "footer_wrapper" -->
     5         kx   </div> <!-- "front_wrapper" -->
     5         kx 
     5         kx   <script>
     5         kx    var margin = {top: 20, right: 120, bottom: 20, left: 220},
     5         kx        width = @SVG_WIDTH@ - margin.right - margin.left,
     5         kx        height = @SVG_HEIGHT@ - margin.top - margin.bottom;
     5         kx 
     5         kx    var i = 0,
     5         kx        duration = 750,
     5         kx        root = 0;
     5         kx 
     5         kx    var treemap = d3.tree()
     5         kx        .size([height, width]);
     5         kx 
     5         kx    var svg = d3.select(document.getElementById( 'tree_view' )).append("svg")
     5         kx        .attr("width", width + margin.right + margin.left)
     5         kx        .attr("height", height + margin.top + margin.bottom)
     5         kx        .append("g")
     5         kx        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
     5         kx 
     5         kx    var div = d3.select(document.getElementById( 'front_wrapper' )).append("div")
     5         kx        .attr("class", "tree-tooltip")
     5         kx        .style("display", "none")
     5         kx        .style("opacity", 0);
     5         kx 
     5         kx 
     5         kx    load_json( '@JSON_TREE_FILE@', function(response) {
     5         kx      var treeData = JSON.parse(response);
     5         kx 
     5         kx      /* Assigns parent, children, height, depth: */
     5         kx      root = d3.hierarchy(treeData, function(d) { return d.children; });
     5         kx 
     5         kx      root.x0 = height / 2;
     5         kx      root.y0 = 0;
     5         kx 
     5         kx      function collapse(d) {
     5         kx        if( d.children ) {
     5         kx          d._children = d.children;
     5         kx          d._children.forEach(collapse);
     5         kx          d.children = null;
     5         kx        }
     5         kx      }
     5         kx 
     5         kx      document.getElementById('spinner').remove();
     5         kx      root.children.forEach(collapse);
     5         kx      update(root);
     5         kx    });
     5         kx 
     5         kx 
     5         kx    function update(source) {
     5         kx 
     5         kx      var tree = treemap( root );
     5         kx 
     5         kx      /* Compute the new tree layout. */
     5         kx      var nodes = tree.descendants(),
     5         kx          links = tree.descendants().slice(1);
     5         kx 
     5         kx      /* Normalize for fixed-depth. */
     5         kx      nodes.forEach(function(d) { d.y = d.depth * 220; });
     5         kx 
     5         kx      /* Update the nodes . . . */
     5         kx      var node = svg.selectAll("g.node")
     5         kx        .data(nodes, function(d) { return d.id || (d.id = ++i); });
     5         kx 
     5         kx      /* Enter any new nodes at the parent's previous position. */
     5         kx      var nodeEnter = node.enter().append("g")
     5         kx        .attr("class", "node")
     5         kx        .attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; })
     5         kx        .on("click", click)
     5         kx        .on("mouseover", function(d) {
     5         kx          div.transition()
     5         kx            .duration(200)
     5         kx            .style("opacity", .92);
     5         kx          {
     5         kx            var content = '<div class="tooltip-header-not-packaged">' + 'void' + '</div>';
     5         kx 
     5         kx            if( d.name === "void" ) {
     5         kx              /* draw div.tree-tooltip to get actual size */
     5         kx              div.html( content )
     5         kx                .style("left", (d3.event.pageX + document.getElementById( 'front_wrapper' ).scrollLeft + 12) + "px")
     5         kx                .style("top",  (d3.event.pageY + document.getElementById( 'front_wrapper' ).scrollTop  + 12) + "px");
     5         kx            }
     5         kx            else
     5         kx            {
     5         kx              /* find package in the pkgs array: */
     5         kx              var pkg = pkgs.find(obj => { return obj.id === d.data.name; });
     5         kx 
     5         kx              if( pkg === undefined )
     5         kx              {
     5         kx                content = '<div class="tooltip-header-not-packaged">' + 'not packaged collection' + '</div>';
     5         kx                /* draw div.tree-tooltip to get actual size */
     5         kx                div.html( content )
     5         kx                  .style("left", (d3.event.pageX + document.getElementById( 'front_wrapper' ).scrollLeft + 12) + "px")
     5         kx                  .style("top",  (d3.event.pageY + document.getElementById( 'front_wrapper' ).scrollTop  + 12) + "px");
     5         kx              }
     5         kx              else
     5         kx              {
     5         kx                content  = '<div class="tooltip-header">' + pkg.name + '</div>' +
     5         kx                            '<div class="tooltip-description">' + pkg.description + '</div>' +
     5         kx                             '<div class="tooltip-content">' +
     5         kx                             '               group: ' + pkg.group + '\n' +
     5         kx                             '        architecture: ' + pkg.arch + '\n' +
     5         kx                             '            hardware: ' + pkg.hardware + '\n';
     5         kx                if( pkg.flavour !== undefined )
     5         kx                {
     5         kx                  content += '             <span class="flavour">edition</span>: ' + pkg.flavour + '\n';
     5         kx                }
     5         kx                  content += '             license: ' + pkg.license + '\n' +
     5         kx                             '      bug report url: ' + root.data.distro[2] + '\n' +
     5         kx                             '        distribution: ' + root.data.distro[0] + '-' + root.data.distro[1] + '\n' +
     5         kx                             '     package tarball: ' + pkg.name + '-' + pkg.version + '-' + pkg.arch + '-' + root.data.distro[0] + '-' + root.data.distro[1] + '.' + '@TARBALL_SUFFIX@' + '\n' +
     5         kx                             '   uncompressed size: ' + pkg.uncompressed_size + '\n' +
     5         kx                             '     number of files: ' + pkg.total_files + '\n' +
     5         kx                             '</div>' +
     5         kx                            '</div>' +
     5         kx                           '</div>';
     5         kx 
     5         kx                /* draw div.tree-tooltip to get actual size */
     5         kx                div.html( content )
     5         kx                  .style("left", (d3.event.pageX + document.getElementById( 'front_wrapper' ).scrollLeft + 12) + "px")
     5         kx                  .style("top",  (d3.event.pageY + document.getElementById( 'front_wrapper' ).scrollTop  + 12) + "px");
     5         kx              }
     5         kx            }
     5         kx 
     5         kx            /* draw div.tree-tooltip at actual position */
     5         kx 
     5         kx            var cW = $( window ).width();
     5         kx            var cH = $( window ).height();
     5         kx            var cX = d3.event.pageX;
     5         kx            var cY = d3.event.pageY;
     5         kx            var tW = $('div.tree-tooltip').width();
     5         kx            var tH = $('div.tree-tooltip').height();
     5         kx            var oX;
     5         kx            var oY;
     5         kx            var dX = ( cW - cX ) - ( tW + 12 );
     5         kx            var dY = ( cH - cY ) - ( tH + 12 );
     5         kx 
     5         kx            /* shift left to according to width=16 of browser vertical scroll bar */
     5         kx            if( dX <= 24 ) { dX = 24 - dX; }
     5         kx            else           { dX = 0;       }
     5         kx 
     5         kx            /* shift top to according to width=16 of browser horizontal scroll bar */
     5         kx            if( dY <= 24 ) { dY = 24 - dY; }
     5         kx            else           { dY = 0;       }
     5         kx 
     5         kx            if( ( cW - cX ) < ( tW + 12 ) ) { oX = - 12 - tW; } else { oX = 12 - dX; }
     5         kx            if( ( cH - cY ) < ( tH + 12 ) ) { oY = - 12 - tH; } else { oY = 12 - dY; }
     5         kx 
     5         kx            if( (( cW - cX ) < ( tW + 12 )) && (cX < ( tW + 12 )) )
     5         kx            {
     5         kx              /* in this case we have to center tooltip */
     5         kx              oX = - (tW + 12) / 2 + (cW/2 - cX);
     5         kx            }
     5         kx 
     5         kx            div.html( content )
     5         kx              .style("left", (d3.event.pageX + document.getElementById( 'front_wrapper' ).scrollLeft + oX) + "px")
     5         kx              .style("top",  (d3.event.pageY + document.getElementById( 'front_wrapper' ).scrollTop +  oY) + "px")
     5         kx              .style("display","block");
     5         kx          }
     5         kx        })
     5         kx        .on("mouseout", function(d) {
     5         kx          div.transition()
     5         kx            .duration(500)
     5         kx            .style("opacity", 0);
     5         kx        });
     5         kx 
     5         kx      nodeEnter.append("circle")
     5         kx        .attr('class', 'node')
     5         kx      /* Additional attributes (see the 'style' section) */
     5         kx        .attr("stroke", "#5d5d5d")
     5         kx        .attr("stroke-width", "1.0")
     5         kx      /* End of additional attributes */
     5         kx        .attr("r", 1e-6)
     5         kx        .style("fill", function(d) { return d._children ? "#abd8d4" : "#fff"; });
     5         kx 
     5         kx      nodeEnter.append("text")
     5         kx        .attr("x", function(d) { return d.children || d._children ? -10 : 10; })
     5         kx        .attr("dy", "-.35em")
     5         kx        .attr("text-anchor", function(d) { return d.children || d._children ? "end" : "start"; })
     5         kx        .text(function(d) { return (d.data.name.indexOf(":",0) > 0 ) ? d.data.name.substr(d.data.name.indexOf(":",0) + 1) : d.data.name; })
     5         kx        .style("fill-opacity", 1);
     5         kx 
     5         kx      /* Update */
     5         kx      var nodeUpdate = nodeEnter.merge(node);
     5         kx 
     5         kx      /* Transition nodes to their new position. */
     5         kx      nodeUpdate.transition()
     5         kx        .duration(duration)
     5         kx        .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; });
     5         kx 
     5         kx      nodeUpdate.select("circle.node")
     5         kx        .attr("r", 4.5)
     5         kx        .style("fill", function(d) {
     5         kx          if( d._children )
     5         kx          {
     5         kx            return "#abd8d4";
     5         kx          }
     5         kx          else
     5         kx          {
     5         kx            if( d.children == undefined )
     5         kx            {
     5         kx              if( d.name == "void" )
     5         kx              {
     5         kx                return "#c9c9c9";
     5         kx              }
     5         kx              else
     5         kx              {
     5         kx                return "#fff";
     5         kx              }
     5         kx            }
     5         kx            else
     5         kx            {
     5         kx              return "#d2ebd8";
     5         kx            }
     5         kx          }
     5         kx        })
     5         kx        .attr('cursor', 'pointer');
     5         kx 
     5         kx      /* Transition exiting nodes to the parent's new position. */
     5         kx      var nodeExit = node.exit().transition()
     5         kx        .duration(duration)
     5         kx        .attr("transform", function(d) { return "translate(" + source.y + "," + source.x + ")"; })
     5         kx        .remove();
     5         kx 
     5         kx      nodeExit.select("circle")
     5         kx        .attr("r", 1e-6);
     5         kx 
     5         kx      nodeExit.select("text")
     5         kx        .style("fill-opacity", 1e-6);
     5         kx 
     5         kx      /* Update the links . . . */
     5         kx      var link = svg.selectAll('path.link')
     5         kx        .data(links, function(d) { return d.id; });
     5         kx 
     5         kx      /* Enter any new links at the parent's previous position. */
     5         kx      var linkEnter = link.enter().insert('path', 'g')
     5         kx        .attr("class", "link")
     5         kx        .attr("d", function(d) {
     5         kx          var o = {x: source.x0, y: source.y0};
     5         kx          return diagonal(o, o);
     5         kx        });
     5         kx 
     5         kx      /* Update */
     5         kx      var linkUpdate = linkEnter.merge(link);
     5         kx 
     5         kx      /* Transition links to their new position. */
     5         kx      linkUpdate.transition()
     5         kx        .duration(duration)
     5         kx      /* Additional attributes (see the 'style' section) */
     5         kx        .style("fill", "none")
     5         kx        .attr("stroke", "DarkGray")
     5         kx        .attr("stroke-width", "1.5")
     5         kx      /* End of additional attributes */
     5         kx        .attr("d", function(d){ return diagonal(d, d.parent) });
     5         kx 
     5         kx      /* Transition exiting nodes to the parent's new position. */
     5         kx      var linkExit = link.exit().transition()
     5         kx        .duration(duration)
     5         kx        .attr("d", function(d) {
     5         kx          var o = {x: source.x, y: source.y};
     5         kx          return diagonal(o, o);
     5         kx        })
     5         kx        .remove();
     5         kx 
     5         kx      /* Stash the old positions for transition. */
     5         kx      nodes.forEach(function(d) {
     5         kx        d.x0 = d.x;
     5         kx        d.y0 = d.y;
     5         kx      });
     5         kx 
     5         kx      /* Creates a curved (diagonal) path from parent to the child nodes. */
     5         kx      function diagonal(s, d) {
     5         kx        path = `M ${s.y} ${s.x}
     5         kx                C ${(s.y + d.y) / 2} ${s.x},
     5         kx                  ${(s.y + d.y) / 2} ${d.x},
     5         kx                  ${d.y} ${d.x}`;
     5         kx        return path;
     5         kx      }
     5         kx 
     5         kx      /* Toggle children on click. */
     5         kx      function click(d) {
     5         kx        if (d.children) {
     5         kx          d._children = d.children;
     5         kx          d.children = null;
     5         kx        } else {
     5         kx          d.children = d._children;
     5         kx          d._children = null;
     5         kx        }
     5         kx        update(d);
     5         kx      }
     5         kx    }
     5         kx   </script>
     5         kx  </body>
     5         kx </html>