����JFIFXX�����    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222����"��4�� ���,�PG"Z_�4�˷����kjز�Z�,F+��_z�,�© �����zh6�٨�ic�fu���#ډb���_�N�?��wQ���5-�~�I���8����TK<5o�Iv-�����k�_U_�����~b�M��d����Ӝ�U�Hh��?]��E�w��Q���k�{��_}qFW7HTՑ��Y��F�?_�'ϔ��_�Ջt��=||I ��6�έ"�����D���/[�k�9���Y�8ds|\���Ҿp6�Ҵ���]��.����6�z<�v��@]�i%��$j��~�g��J>��no����pM[me�i$[����s�o�ᘨ�˸ nɜG-�ĨU�ycP�3.DB�li�;��hj���x7Z^�N�h������N3u{�:j�x�힞��#M&��jL P@_���� P��&��o8������9�����@Sz6�t7#O�ߋ �s}Yf�T���lmr����Z)'N��k�۞p����w\�Tȯ?�8`�O��i{wﭹW�[�r�� ��Q4F�׊���3m&L�=��h3����z~��#�\�l :�F,j@�� ʱ�wQT����8�"kJO���6�֚l����}���R�>ډK���]��y����&����p�}b��;N�1�m�r$�|��7�>e�@B�TM*-iH��g�D�)� E�m�|�ؘbҗ�a��Ҿ����t4���o���G��*oCN�rP���Q��@z,|?W[0�����:�n,jWiE��W��$~/�hp\��?��{(�0���+�Y8rΟ�+����>S-S����VN;�}�s?.����� w�9��˟<���Mq4�Wv'��{)0�1mB��V����W[�����8�/<� �%���wT^�5���b��)iM� pg�N�&ݝ��VO~�q���u���9� ����!��J27����$O-���! �:�%H��� ـ����y�ΠM=t{!S�� oK8������t<����è:a������[�����ա�H���~��w��Qz`�po�^ ����Q��n� �,uu�C�$ ^���,������8�#��:�6��e�|~���!�3�3.�\0��q��o�4`.|� ����y�Q�`~;�d�ׯ,��O�Zw�������`73�v�܋�<���Ȏ�� ـ4k��5�K�a�u�=9Yd��$>x�A�&�� j0� ���vF��� Y�|�y��� ~�6�@c��1vOp�Ig����4��l�OD���L����� R���c���j�_�uX6��3?nk��Wy�f;^*B� ��@�~a�`��Eu������+���6�L��.ü>��}y���}_�O�6�͐�:�YrG�X��kG�����l^w���~㒶sy��Iu�!� W ��X��N�7BV��O��!X�2����wvG�R�f�T#�����t�/?���%8�^�W�aT��G�cL�M���I��(J����1~�8�?aT ���]����AS�E��(��*E}� 2��#I/�׍qz��^t�̔���b�Yz4x���t�){ OH��+(E��A&�N�������XT��o��"�XC��'���)}�J�z�p� ��~5�}�^����+�6����w��c��Q�|Lp�d�H��}�(�.|����k��c4^�"�����Z?ȕ ��a<�L�!039C� �Eu�C�F�Ew�ç ;�n?�*o���B�8�bʝ���'#Rqf���M}7����]����s2tcS{�\icTx;�\��7K���P���ʇ Z O-��~��c>"��?�������P��E��O�8��@�8��G��Q�g�a�Վ���󁶠�䧘��_%#r�>�1�z�a��eb��qcPѵ��n���#L��� =��׀t� L�7�`��V���A{�C:�g���e@�w1 Xp3�c3�ġ����p��M"'-�@n4���fG��B3�DJ�8[Jo�ߐ���gK)ƛ��$���� ���8�3�����+���� �����6�ʻ���� ���S�kI�*KZlT _`���?��K����QK�d����B`�s}�>���`��*�>��,*@J�d�oF*����弝��O}�k��s��]��y�ߘ��c1G�V���<=�7��7����6�q�PT��tXԀ�!9*4�4Tހ3XΛex�46���Y��D ����� �BdemDa����\�_l,��G�/���֌7���Y�](�xTt^%�GE�����4�}bT���ڹ�����;Y)���B�Q��u��>J/J �⮶.�XԄ��j�ݳ�+E��d ��r�5�_D�1 ��o�� �B�x�΢�#���<��W�����8���R6�@g�M�.��� dr�D��>(otU��@x=��~v���2� ӣ�d�oBd��3�eO�6�㣷�����ݜ6��6Y��Qz`��S��{���\P�~z m5{J/L��1������<�e�ͅPu�b�]�ϔ���'������f�b� Zpw��c`"��i���BD@:)ִ�:�]��hv�E�w���T�l��P���"Ju�}��وV J��G6��. J/�Qgl߭�e�����@�z�Zev2u�)]կ�����7x���s�M�-<ɯ�c��r�v�����@��$�ޮ}lk���a���'����>x��O\�ZFu>�����ck#��&:��`�$�ai�>2Δ����l���oF[h��lE�ܺ�Πk:)���`�� $[6�����9�����kOw�\|���8}������ބ:��񶐕��I�A1/�=�2[�,�!��.}gN#�u����b��� ~��݊��}34q����d�E��Lc��$��"�[q�U�硬g^��%B �z���r�pJ�ru%v\h1Y�ne`ǥ:g���pQM~�^�Xi� ��`S�:V29.�P���V�?B�k�� AEvw%�_�9C�Q����wKekPؠ�\�;Io d�{ ߞo�c1eP����\� `����E=���@K<�Y���eڼ�J���w����{av�F�'�M�@/J��+9p���|]�����Iw &`��8���&M�hg��[�{��Xj��%��Ӓ�$��(����ʹN���<>�I���RY���K2�NPlL�ɀ)��&e����B+ь����( � �JTx���_?EZ� }@ 6�U���뙢ط�z��dWI�n` D����噥�[��uV��"�G&Ú����2g�}&m��?ċ�"����Om#��������� ��{�ON��"S�X��Ne��ysQ���@Fn��Vg���dX�~nj�]J�<�K]:��FW��b�������62�=��5f����JKw��bf�X�55��~J �%^����:�-�QIE��P��v�nZum� z � ~ə ���� ���ة����;�f��\v���g�8�1��f24;�V���ǔ�)����9���1\��c��v�/'Ƞ�w�������$�4�R-��t���� e�6�/�ġ �̕Ecy�J���u�B���<�W�ַ~�w[B1L۲�-JS΂�{���΃������A��20�c#��@ 0!1@AP"#2Q`$3V�%45a6�FRUq��� ����^7ׅ,$n�������+��F�`��2X'��0vM��p�L=������5��8������u�p~���.�`r�����\���O��,ư�0oS ��_�M�����l���4�kv\JSd���x���SW�<��Ae�IX����������$I���w�:S���y���›R��9�Q[���,�5�;�@]�%���u�@ *ro�lbI �� ��+���%m:�͇ZV�����u�̉����θau<�fc�.����{�4Ա� �Q����*�Sm��8\ujqs]{kN���)qO�y�_*dJ�b�7���yQqI&9�ԌK!�M}�R�;������S�T���1���i[U�ɵz�]��U)V�S6���3$K{�ߊ<�(� E]Զ[ǼENg�����'�\?#)Dkf��J���o��v���'�%ƞ�&K�u�!��b�35LX�Ϸ��63$K�a�;�9>,R��W��3�3� d�JeTYE.Mϧ��-�o�j3+y��y^�c�������VO�9NV\nd�1 ��!͕_)a�v;����թ�M�lWR1��)El��P;��yوÏ�u 3�k�5Pr6<�⒲l�!˞*��u־�n�!�l:����UNW ��%��Chx8vL'��X�@��*��)���̮��ˍ��� ���D-M�+J�U�kvK����+�x8��cY������?�Ԡ��~3mo��|�u@[XeY�C�\Kp�x8�oC�C�&����N�~3-H���� ��MX�s�u<`���~"WL��$8ξ��3���a�)|:@�m�\���^�`�@ҷ)�5p+��6���p�%i)P M���ngc�����#0Aruz���RL+xSS?���ʮ}()#�t��mˇ!��0}}y����<�e� �-ή�Ԩ��X������ MF���ԙ~l L.3���}�V뽺�v�����멬��Nl�)�2����^�Iq��a��M��qG��T�����c3#������3U�Ǎ���}��לS�|qa��ڃ�+���-��2�f����/��bz��ڐ�� �ݼ[2�ç����k�X�2�* �Z�d���J�G����M*9W���s{��w���T��x��y,�in�O�v��]���n����P�$�JB@=4�OTI�n��e�22a\����q�d���%�$��(���:���: /*�K[PR�fr\nڙdN���F�n�$�4�[�� U�zƶ����� �mʋ���,�ao�u 3�z� �x��Kn����\[��VFmbE;�_U��&V�Gg�]L�۪&#n%�$ɯ�dG���D�TI=�%+AB�Ru#��b4�1�»x�cs�YzڙJG��f��Il��d�eF'T� iA��T���uC�$����Y��H?����[!G`}���ͪ� �纤Hv\������j�Ex�K���!���OiƸ�Yj�+u-<���'q����uN�*�r\��+�]���<�wOZ.fp�ێ��,-*)V?j-kÊ#�`�r��dV����(�ݽBk�����G�ƛk�QmUڗe��Z���f}|����8�8��a���i��3'J�����~G_�^���d�8w������ R�`(�~�.��u���l�s+g�bv���W���lGc}��u���afE~1�Ue������Z�0�8�=e�� f@/�jqEKQQ�J��oN��J���W5~M>$6�Lt�;$ʳ{���^��6�{����v6���ķܰg�V�cnn �~z�x�«�,2�u�?cE+Ș�H؎�%�Za�)���X>uW�Tz�Nyo����s���FQƤ��$��*�&�LLXL)�1�" L��eO��ɟ�9=���:t��Z���c��Ž���Y?�ӭV�wv�~,Y��r�ۗ�|�y��GaF�����C�����.�+� ���v1���fήJ�����]�S��T��B��n5sW}y�$��~z�'�c ��8 ��� ,! �p��VN�S��N�N�q��y8z˱�A��4��*��'������2n<�s���^ǧ˭P�Jޮɏ�U�G�L�J�*#��<�V��t7�8����TĜ>��i}K%,���)[��z�21z ?�N�i�n1?T�I�R#��m-�����������������1����lA�`��fT5+��ܐ�c�q՝��ʐ��,���3�f2U�եmab��#ŠdQ�y>\��)�SLY����w#��.���ʑ�f��� ,"+�w�~�N�'�c�O�3F�������N<���)j��&��,-� �љ���֊�_�zS���TǦ����w�>��?�������n��U仆�V���e�����0���$�C�d���rP �m�׈e�Xm�Vu� �L��.�bֹ��� �[Դaզ���*��\y�8�Է:�Ez\�0�Kq�C b��̘��cө���Q��=0Y��s�N��S.���3.���O�o:���#���v7�[#߫ ��5�܎�L���Er4���9n��COWlG�^��0k�%<���ZB���aB_���������'=��{i�v�l�$�uC���mƎҝ{�c㱼�y]���W�i ��ߧc��m�H� m�"�"�����;Y�ߝ�Z�Ǔ�����:S#��|}�y�,/k�Ld� TA�(�AI$+I3��;Y*���Z��}|��ӧO��d�v��..#:n��f>�>���ȶI�TX��� 8��y����"d�R�|�)0���=���n4��6ⲑ�+��r<�O�܂~zh�z����7ܓ�HH�Ga롏���nCo�>������a ���~]���R���̲c?�6(�q�;5%� |�uj�~z8R=X��I�V=�|{v�Gj\gc��q����z�؋%M�ߍ����1y��#��@f^���^�>N�����#x#۹��6�Y~�?�dfPO��{��P�4��V��u1E1J �*|���%���JN��`eWu�zk M6���q t[�� ��g�G���v��WIG��u_ft����5�j�"�Y�:T��ɐ���*�;� e5���4����q$C��2d�}���� _S�L#m�Yp��O�.�C�;��c����Hi#֩%+) �Ӎ��ƲV���SYź��g |���tj��3�8���r|���V��1#;.SQ�A[���S������#���`n�+���$��$I �P\[�@�s��(�ED�z���P��])8�G#��0B��[ى��X�II�q<��9�~[Z멜�Z�⊔IWU&A>�P~�#��dp<�?����7���c��'~���5 ��+$���lx@�M�dm��n<=e�dyX��?{�|Aef ,|n3�<~z�ƃ�uۧ�����P��Y,�ӥQ�*g�#먙R�\���;T��i,��[9Qi歉����c>]9�� ��"�c��P�� �Md?٥��If�ت�u��k��/����F��9�c*9��Ǎ:�ØF���z�n*�@|I�ށ9����N3{'��[�'ͬ�Ҳ4��#}��!�V� Fu��,�,mTIk���v C�7v���B�6k�T9��1�*l� '~��ƞF��lU��'�M ����][ΩũJ_�{�i�I�n��$���L�� j��O�dx�����kza۪��#�E��Cl����x˘�o�����V���ɞ�ljr��)�/,�߬h�L��#��^��L�ф�,íMƁe�̩�NB�L�����iL����q�}��(��q��6IçJ$�W�E$��:������=#����(�K�B����zђ <��K(�N�۫K�w��^O{!����)�H���>x�������lx�?>Պ�+�>�W���,Ly!_�D���Ō�l���Q�!�[ �S����J��1��Ɛ�Y}��b,+�Lo�x�ɓ)����=�y�oh�@�꥟/��I��ѭ=��P�y9��� �ۍYӘ�e+�p�Jnϱ?V\SO%�(�t� ���=?MR�[Ș�����d�/ ��n�l��B�7j� ��!�;ӥ�/�[-���A�>�dN�sLj ��,ɪv��=1c�.SQ�O3�U���ƀ�ܽ�E����������̻��9G�ϷD�7(�}��Ävӌ\�y�_0[w ���<΍>����a_��[0+�L��F.�޺��f�>oN�T����q;���y\��bՃ��y�jH�<|q-eɏ�_?_9+P���Hp$�����[ux�K w�Mw��N�ی'$Y2�=��q���KB��P��~������Yul:�[<����F1�2�O���5=d����]Y�sw:���Ϯ���E��j,_Q��X��z`H1,#II ��d�wr��P˂@�ZJV����y$�\y�{}��^~���[:N����ߌ�U�������O��d�����ؾe��${p>G��3c���Ė�lʌ�� ת��[��`ϱ�-W����dg�I��ig2��� ��}s ��ؤ(%#sS@���~���3�X�nRG�~\jc3�v��ӍL��M[JB�T��s3}��j�Nʖ��W����;7��ç?=X�F=-�=����q�ߚ���#���='�c��7���ڑW�I(O+=:uxq�������������e2�zi+�kuG�R��������0�&e�n���iT^J����~\jy���p'dtG��s����O��3����9* �b#Ɋ�� p������[Bws�T�>d4�ۧs���nv�n���U���_�~,�v����ƜJ1��s�� �QIz��)�(lv8M���U=�;����56��G���s#�K���MP�=��LvyGd��}�VwWBF�'�à �?MH�U�g2�� ����!�p�7Q��j��ڴ����=��j�u��� Jn�A s���uM������e��Ɔ�Ҕ�!)'��8Ϣ�ٔ��ޝ(��Vp���צ֖d=�IC�J�Ǡ{q������kԭ�߸���i��@K����u�|�p=..�*+����x�����z[Aqġ#s2a�Ɗ���RR�)*HRsi�~�a &f��M��P����-K�L@��Z��Xy�'x�{}��Zm+���:�)�) IJ�-i�u���� ���ܒH��'�L(7�y�GӜq���� j��� 6ߌg1�g�o���,kر���tY�?W,���p���e���f�OQS��!K�۟cҒA�|ս�j�>��=⬒��˧L[�� �߿2JaB~R��u�:��Q�] �0H~���]�7��Ƽ�I���(}��cq '�ήET���q�?f�ab���ӥvr� �)o��-Q��_'����ᴎo��K������;��V���o��%���~OK ����*��b�f:���-ťIR��`B�5!RB@���ï�� �u �̯e\�_U�_������� g�ES��3�������QT��a����x����U<~�c?�*�#]�MW,[8O�a�x��]�1bC|踤�P��lw5V%�)�{t�<��d��5���0i�XSU��m:��Z�┵�i�"��1�^B�-��P�hJ��&)O��*�D��c�W��vM��)����}���P��ܗ-q����\mmζZ-l@�}��a��E�6��F�@��&Sg@���ݚ�M����� ȹ 4����#p�\H����dYDo�H���"��\��..R�B�H�z_�/5˘����6��KhJR��P�mƶi�m���3�,#c�co��q�a)*Pt����R�m�k�7x�D�E�\Y�閣_X�<���~�)���c[[�BP����6�Yq���S��0����%_����;��Àv�~�| VS؇ ��'O0��F0��\���U�-�d@�����7�SJ*z��3n��y��P����O���������m�~�P�3|Y��ʉr#�C�<�G~�.,! ���bqx���h~0=��!ǫ�jy����l�O,�[B��~��|9��ٱ����Xly�#�i�B��g%�S��������tˋ���e���ې��\[d�t)��.+u�|1 ������#�~Oj����hS�%��i.�~X���I�H�m��0n���c�1uE�q��cF�RF�o���7� �O�ꮧ� ���ۛ{��ʛi5�rw?׌#Qn�TW��~?y$��m\�\o����%W� ?=>S�N@�� �Ʈ���R����N�)�r"C�:��:����� �����#��qb��Y�. �6[��2K����2u�Ǧ�HYR��Q�MV��� �G�$��Q+.>�����nNH��q�^��� ����q��mM��V��D�+�-�#*�U�̒ ���p욳��u:�������IB���m���PV@O���r[b= �� ��1U�E��_Nm�yKbN�O���U�}�the�`�|6֮P>�\2�P�V���I�D�i�P�O;�9�r�mAHG�W�S]��J*�_�G��+kP�2����Ka�Z���H�'K�x�W�MZ%�O�YD�Rc+o��?�q��Ghm��d�S�oh�\�D�|:W������UA�Qc yT�q������~^�H��/��#p�CZ���T�I�1�ӏT����4��"�ČZ�����}��`w�#�*,ʹ�� ��0�i��課�Om�*�da��^gJ݅{���l�e9uF#T�ֲ��̲�ٞC"�q���ߍ ոޑ�o#�XZTp����@ o�8��(jd��xw�]�,f���`~�|,s��^����f�1���t��|��m�򸄭/ctr��5s��7�9Q�4�H1꠲BB@l9@���C�����+�wp�xu�£Yc�9��?`@#�o�mH�s2��)�=��2�.�l����jg�9$�Y�S�%*L������R�Y������7Z���,*=�䷘$�������arm�o�ϰ���UW.|�r�uf����IGw�t����Zwo��~5 ��YյhO+=8fF�)�W�7�L9lM�̘·Y���֘YLf�큹�pRF���99.A �"wz��=E\Z���'a� 2��Ǚ�#;�'}�G���*��l��^"q��+2FQ� hj��kŦ��${���ޮ-�T�٭cf�|�3#~�RJ����t��$b�(R��(����r���dx� >U b�&9,>���%E\� Ά�e�$��'�q't��*�א���ެ�b��-|d���SB�O�O��$�R+�H�)�܎�K��1m`;�J�2�Y~9��O�g8=vqD`K[�F)k�[���1m޼c��n���]s�k�z$@��)!I �x՝"v��9=�ZA=`Ɠi �:�E��)`7��vI��}d�YI�_ �o�:ob���o ���3Q��&D&�2=�� �Ά��;>�h����y.*ⅥS������Ӭ�+q&����j|UƧ����}���J0��WW< ۋS�)jQR�j���Ư��rN)�Gű�4Ѷ(�S)Ǣ�8��i��W52���No˓� ۍ%�5brOn�L�;�n��\G����=�^U�dI���8$�&���h��'���+�(������cȁ߫k�l��S^���cƗjԌE�ꭔ��gF���Ȓ��@���}O���*;e�v�WV���YJ\�]X'5��ղ�k�F��b 6R�o՜m��i N�i����>J����?��lPm�U��}>_Z&�KK��q�r��I�D�Չ~�q�3fL�:S�e>���E���-G���{L�6p�e,8��������QI��h��a�Xa��U�A'���ʂ���s�+טIjP�-��y�8ۈZ?J$��W�P� ��R�s�]��|�l(�ԓ��sƊi��o(��S0��Y� 8�T97.�����WiL��c�~�dxc�E|�2!�X�K�Ƙਫ਼�$((�6�~|d9u+�qd�^3�89��Y�6L�.I�����?���iI�q���9�)O/뚅����O���X��X�V��ZF[�یgQ�L��K1���RҖr@v�#��X�l��F���Нy�S�8�7�kF!A��sM���^rkp�jP�DyS$N���q��nxҍ!U�f�!eh�i�2�m���`�Y�I�9r�6� �TF���C}/�y�^���Η���5d�'��9A-��J��>{�_l+�`��A���[�'��յ�ϛ#w:݅�%��X�}�&�PSt�Q�"�-��\縵�/����$Ɨh�Xb�*�y��BS����;W�ջ_mc�����vt?2}1�;qS�d�d~u:2k5�2�R�~�z+|HE!)�Ǟl��7`��0�<�,�2*���Hl-��x�^����'_TV�gZA�'j� ^�2Ϊ��N7t�����?w�� �x1��f��Iz�C-Ȗ��K�^q�;���-W�DvT�7��8�Z�������� hK�(P:��Q- �8�n�Z���܃e貾�<�1�YT<�,�����"�6{/ �?�͟��|1�:�#g��W�>$����d��J��d�B��=��jf[��%rE^��il:��B���x���Sּ�1հ��,�=��*�7 fcG��#q� �eh?��2�7�����,�!7x��6�n�LC�4x��},Geǝ�tC.��vS �F�43��zz\��;QYC,6����~;RYS/6���|2���5���v��T��i����������mlv��������&� �nRh^ejR�LG�f���? �ۉҬܦƩ��|��Ȱ����>3����!v��i�ʯ�>�v��オ�X3e���_1z�Kȗ\<������!�8���V��]��?b�k41�Re��T�q��mz��TiOʦ�Z��Xq���L������q"+���2ۨ��8}�&N7XU7Ap�d�X��~�׿��&4e�o�F��� �H����O���č�c�� 懴�6���͉��+)��v;j��ݷ�� �UV�� i��� j���Y9GdÒJ1��詞�����V?h��l����l�cGs�ځ�������y�Ac�����\V3�? �� ܙg�>qH�S,�E�W�[�㺨�uch�⍸�O�}���a��>�q�6�n6����N6�q������N ! 1AQaq�0@����"2BRb�#Pr���3C`��Scst���$4D���%Td�� ?���N����a��3��m���C���w��������xA�m�q�m���m������$����4n淿t'��C"w��zU=D�\R+w�p+Y�T�&�պ@��ƃ��3ޯ?�Aﶂ��aŘ���@-�����Q�=���9D��ռ�ѻ@��M�V��P��܅�G5�f�Y<�u=,EC)�<�Fy'�"�&�չ�X~f��l�KԆV��?�� �W�N����=(� �;���{�r����ٌ�Y���h{�١������jW����P���Tc�����X�K�r��}���w�R��%��?���E��m�� �Y�q|����\lEE4���r���}�lsI�Y������f�$�=�d�yO����p�����yBj8jU�o�/�S��?�U��*������ˍ�0������u�q�m [�?f����a�� )Q�>����6#������� ?����0UQ����,IX���(6ڵ[�DI�MNލ�c&���υ�j\��X�R|,4��� j������T�hA�e��^���d���b<����n�� �즇�=!���3�^�`j�h�ȓr��jẕ�c�,ٞX����-����a�ﶔ���#�$��]w�O��Ӫ�1y%��L�Y<�wg#�ǝ�̗`�x�xa�t�w��»1���o7o5��>�m뭛C���Uƃߜ}�C���y1Xνm�F8�jI���]����H���ۺиE@I�i;r�8ӭ����V�F�Շ| ��&?�3|x�B�MuS�Ge�=Ӕ�#BE5G�����Y!z��_e��q�р/W>|-�Ci߇�t�1ޯќd�R3�u��g�=0 5��[?�#͏��q�cf���H��{ ?u�=?�?ǯ���}Z��z���hmΔ�BFTW�����<�q�(v� ��!��z���iW]*�J�V�z��gX֧A�q�&��/w���u�gYӘa���; �i=����g:��?2�dž6�ى�k�4�>�Pxs����}������G�9��3 ���)gG�R<>r h�$��'nc�h�P��Bj��J�ҧH� -��N1���N��?��~��}-q!=��_2hc�M��l�vY%UE�@|�v����M2�.Y[|y�"Eï��K�ZF,�ɯ?,q�?v�M 80jx�"�;�9vk�����+ ֧�� �ȺU��?�%�vcV��mA�6��Qg^M����A}�3�nl� QRN�l8�kkn�'�����(��M�7m9و�q���%ޟ���*h$Zk"��$�9��: �?U8�Sl��,,|ɒ��xH(ѷ����Gn�/Q�4�P��G�%��Ա8�N��!� �&�7�;���eKM7�4��9R/%����l�c>�x;������>��C�:�����t��h?aKX�bhe�ᜋ^�$�Iհ �hr7%F$�E��Fd���t��5���+�(M6�t����Ü�UU|zW�=a�Ts�Tg������dqP�Q����b'�m���1{|Y����X�N��b �P~��F^F:����k6�"�j!�� �I�r�`��1&�-$�Bevk:y���#yw��I0��x��=D�4��tU���P�ZH��ڠ底taP��6����b>�xa����Q�#� WeF��ŮNj�p�J* mQ�N����*I�-*�ȩ�F�g�3 �5��V�ʊ�ɮ�a��5F���O@{���NX��?����H�]3��1�Ri_u��������ѕ�� ����0��� F��~��:60�p�͈�S��qX#a�5>���`�o&+�<2�D����: �������ڝ�$�nP���*)�N�|y�Ej�F�5ټ�e���ihy�Z �>���k�bH�a�v��h�-#���!�Po=@k̆IEN��@��}Ll?j�O������߭�ʞ���Q|A07x���wt!xf���I2?Z��<ץ�T���cU�j��]��陎Ltl �}5�ϓ��$�,��O�mˊ�;�@O��jE��j(�ا,��LX���LO���Ц�90�O �.����a��nA���7������j4 ��W��_ٓ���zW�jcB������y՗+EM�)d���N�g6�y1_x��p�$Lv:��9�"z��p���ʙ$��^��JԼ*�ϭ����o���=x�Lj�6�J��u82�A�H�3$�ٕ@�=Vv�]�'�qEz�;I˼��)��=��ɯ���x �/�W(V���p�����$ �m�������u�����񶤑Oqˎ�T����r��㠚x�sr�GC��byp�G��1ߠ�w e�8�$⿄����/�M{*}��W�]˷.�CK\�ުx���/$�WPw���r� |i���&�}�{�X� �>��$-��l���?-z���g����lΆ���(F���h�vS*���b���߲ڡn,|)mrH[���a�3�ר�[1��3o_�U�3�TC�$��(�=�)0�kgP���� ��u�^=��4 �WYCҸ:��vQ�ר�X�à��tk�m,�t*��^�,�}D*� �"(�I��9R����>`�`��[~Q]�#af��i6l��8���6�:,s�s�N6�j"�A4���IuQ��6E,�GnH��zS�HO�uk�5$�I�4��ؤ�Q9�@��C����wp�BGv[]�u�Ov���0I4���\��y�����Q�Ѹ��~>Z��8�T��a��q�ޣ;z��a���/��S��I:�ܫ_�|������>=Z����8:�S��U�I�J��"IY���8%b8���H��:�QO�6�;7�I�S��J��ҌAά3��>c���E+&jf$eC+�z�;��V����� �r���ʺ������my�e���aQ�f&��6�ND��.:��NT�vm�<- u���ǝ\MvZY�N�NT��-A�>jr!S��n�O 1�3�Ns�%�3D@���`������ܟ 1�^c<���� �a�ɽ�̲�Xë#�w�|y�cW�=�9I*H8�p�^(4���՗�k��arOcW�tO�\�ƍR��8����'�K���I�Q�����?5�>[�}��yU�ײ -h��=��% q�ThG�2�)���"ו3]�!kB��*p�FDl�A���,�eEi�H�f�Ps�����5�H:�Փ~�H�0Dت�D�I����h�F3�������c��2���E��9�H��5�zԑ�ʚ�i�X�=:m�xg�hd(�v����׊�9iS��O��d@0ڽ���:�p�5�h-��t�&���X�q�ӕ,��ie�|���7A�2���O%P��E��htj��Y1��w�Ѓ!����  ���� ࢽ��My�7�\�a�@�ţ�J �4�Ȼ�F�@o�̒?4�wx��)��]�P��~�����u�����5�����7X ��9��^ܩ�U;Iꭆ 5 �������eK2�7(�{|��Y׎ �V��\"���Z�1� Z�����}��(�Ǝ"�1S���_�vE30>���p;� ΝD��%x�W�?W?v����o�^V�i�d��r[��/&>�~`�9Wh��y�;���R��� ;;ɮT��?����r$�g1�K����A��C��c��K��l:�'��3 c�ﳯ*"t8�~l��)���m��+U,z��`(�>yJ�?����h>��]��v��ЍG*�{`��;y]��I�T� ;c��NU�fo¾h���/$���|NS���1�S�"�H��V���T���4��uhǜ�]�v;���5�͠x��'C\�SBpl���h}�N����� A�Bx���%��ޭ�l��/����T��w�ʽ]D�=����K���ž�r㻠l4�S�O?=�k �M:� ��c�C�a�#ha���)�ѐxc�s���gP�iG��{+���x���Q���I= �� z��ԫ+ �8"�k�ñ�j=|����c ��y��CF��/��*9ж�h{ �?4�o� ��k�m�Q�N�x��;�Y��4膚�a�w?�6�>e]�����Q�r�:����g�,i"�����ԩA�*M�<�G��b�if��l^M��5� �Ҩ�{����6J��ZJ�����P�*�����Y���ݛu�_4�9�I8�7���������,^ToR���m4�H��?�N�S�ѕw��/S��甍�@�9H�S�T��t�ƻ���ʒU��*{Xs�@����f�����֒Li�K{H�w^���������Ϥm�tq���s� ���ք��f:��o~s��g�r��ט� �S�ѱC�e]�x���a��) ���(b-$(�j>�7q�B?ӕ�F��hV25r[7 Y� }L�R��}����*sg+��x�r�2�U=�*'WS��ZDW]�WǞ�<��叓���{�$�9Ou4��y�90-�1�'*D`�c�^o?(�9��u���ݐ��'PI&� f�Jݮ�������:wS����jfP1F:X �H�9dԯ���˝[�_54 �}*;@�ܨ�� ð�yn�T���?�ןd�#���4rG�ͨ��H�1�|-#���Mr�S3��G�3�����)�.᧏3v�z֑��r����$G"�`j �1t��x0<Ɔ�Wh6�y�6��,œ�Ga��gA����y��b��)��h�D��ß�_�m��ü �gG;��e�v��ݝ�nQ� ��C����-�*��o���y�a��M��I�>�<���]obD��"�:���G�A��-\%LT�8���c�)��+y76���o�Q�#*{�(F�⽕�y����=���rW�\p���۩�c���A���^e6��K������ʐ�cVf5$�'->���ՉN"���F�"�UQ@�f��Gb~��#�&�M=��8�ט�JNu9��D��[̤�s�o�~������ G��9T�tW^g5y$b��Y'��س�Ǵ�=��U-2 #�MC�t(�i� �lj�@Q 5�̣i�*�O����s�x�K�f��}\��M{E�V�{�υ��Ƈ�����);�H����I��fe�Lȣr�2��>��W�I�Ȃ6������i��k�� �5�YOxȺ����>��Y�f5'��|��H+��98pj�n�.O�y�������jY��~��i�w'������l�;�s�2��Y��:'lg�ꥴ)o#'Sa�a�K��Z� �m��}�`169�n���"���x��I ��*+� }F<��cГ���F�P�������ֹ*�PqX�x۩��,� ��N�� �4<-����%����:��7����W���u�`����� $�?�I��&����o��o��`v�>��P��"��l���4��5'�Z�gE���8���?��[�X�7(��.Q�-��*���ތL@̲����v��.5���[��=�t\+�CNܛ��,g�SQnH����}*F�G16���&:�t��4ُ"A��̣��$�b �|����#rs��a�����T�� ]�<�j��BS�('$�ɻ� �wP;�/�n��?�ݜ��x�F��yUn�~mL*-�������Xf�wd^�a�}��f�,=t�׵i�.2/wpN�Ep8�OР���•��R�FJ� 55TZ��T �ɭ�<��]��/�0�r�@�f��V��V����Nz�G��^���7hZi����k��3�,kN�e|�vg�1{9]_i��X5y7� 8e]�U����'�-2,���e"����]ot�I��Y_��n�(JҼ��1�O ]bXc���Nu�No��pS���Q_���_�?i�~�x h5d'�(qw52] ��'ޤ�q��o1�R!���`ywy�A4u���h<קy���\[~�4�\ X�Wt/� 6�����n�F�a8��f���z �3$�t(���q��q�x��^�XWeN'p<-v�!�{�(>ӽDP7��ո0�y)�e$ٕv�Ih'Q�EA�m*�H��RI��=:��� ���4牢) �%_iN�ݧ�l]� �Nt���G��H�L��� ɱ�g<���1V�,�J~�ٹ�"K��Q�� 9�HS�9�?@��k����r�;we݁�]I�!{ �@�G�[�"��`���J:�n]�{�cA�E����V��ʆ���#��U9�6����j�#Y�m\��q�e4h�B�7��C�������d<�?J����1g:ٳ���=Y���D�p�ц� ׈ǔ��1�]26؜oS�'��9�V�FVu�P�h�9�xc�oq�X��p�o�5��Ա5$�9W�V(�[Ak�aY錎qf;�'�[�|���b�6�Ck��)��#a#a˙��8���=äh�4��2��C��4tm^ �n'c���]GQ$[Wҿ��i���vN�{Fu ��1�gx��1┷���N�m��{j-,��x�� Ūm�ЧS�[�s���Gna���䑴�� x�p 8<������97�Q���ϴ�v�aϚG��Rt�Һ׈�f^\r��WH�JU�7Z���y)�vg=����n��4�_)y��D'y�6�]�c�5̪�\� �PF�k����&�c;��cq�$~T�7j ���nç]�<�g ":�to�t}�159�<�/�8������m�b�K#g'I'.W�����6��I/��>v��\�MN��g���m�A�yQL�4u�Lj�j9��#44�t��l^�}L����n��R��!��t��±]��r��h6ٍ>�yҏ�N��fU�� ���� Fm@�8}�/u��jb9������he:A�y�ծw��GpΧh�5����l}�3p468��)U��d��c����;Us/�֔�YX�1�O2��uq�s��`hwg�r~�{ R��mhN��؎*q 42�*th��>�#���E����#��Hv�O����q�}�����6�e��\�,Wk�#���X��b>��p}�դ��3���T5��†��6��[��@�P�y*n��|'f�֧>�lư΂�̺����SU�'*�q�p�_S�����M�� '��c�6�����m�� ySʨ;M��r���Ƌ�m�Kxo,���Gm�P��A�G�:��i��w�9�}M(�^�V��$ǒ�ѽ�9���|���� �a����J�SQ�a���r�B;����}���ٻ֢�2�%U���c�#�g���N�a�ݕ�'�v�[�OY'��3L�3�;,p�]@�S��{ls��X�'���c�jw�k'a�.��}�}&�� �dP�*�bK=ɍ!����;3n�gΊU�ߴmt�'*{,=SzfD� A��ko~�G�aoq�_mi}#�m�������P�Xhύ����mxǍ�΂���巿zf��Q���c���|kc�����?���W��Y�$���_Lv����l߶��c���`?����l�j�ݲˏ!V��6����U�Ђ(A���4y)H���p�Z_�x��>���e��R��$�/�`^'3qˏ�-&Q�=?��CFVR �D�fV�9��{�8g�������n�h�(P"��6�[�D���< E�����~0<@�`�G�6����Hг�cc�� �c�K.5��D��d�B���`?�XQ��2��ٿyqo&+�1^� DW�0�ꊩ���G�#��Q�nL3��c���������/��x ��1�1[y�x�პCW��C�c�UĨ80�m�e�4.{�m��u���I=��f�����0QRls9���f���������9���~f�����Ǩ��a�"@�8���ȁ�Q����#c�ic������G��$���G���r/$W�(��W���V�"��m�7�[m�A�m����bo��D� j����۳� l���^�k�h׽����� ��#� iXn�v��eT�k�a�^Y�4�BN��ĕ��0 !01@Q"2AaPq3BR������?���@4�Q�����T3,���㺠�W�[=JK�Ϟ���2�r^7��vc�:�9 �E�ߴ�w�S#d���Ix��u��:��Hp��9E!�� V 2;73|F��9Y���*ʬ�F��D����u&���y؟��^EA��A��(ɩ���^��GV:ݜDy�`��Jr29ܾ�㝉��[���E;Fzx��YG��U�e�Y�C���� ����v-tx����I�sם�Ę�q��Eb�+P\ :>�i�C'�;�����k|z�رn�y]�#ǿb��Q��������w�����(�r|ӹs��[�D��2v-%��@;�8<a���[\o[ϧw��I!��*0�krs)�[�J9^��ʜ��p1)� "��/_>��o��<1����A�E�y^�C��`�x1'ܣn�p��s`l���fQ��):�l����b>�Me�jH^?�kl3(�z:���1ŠK&?Q�~�{�ٺ�h�y���/�[��V�|6��}�KbX����mn[-��7�5q�94�������dm���c^���h� X��5��<�eޘ>G���-�}�دB�ޟ� ��|�rt�M��V+�]�c?�-#ڛ��^ǂ}���Lkr���O��u�>�-D�ry� D?:ޞ�U��ǜ�7�V��?瓮�"�#���r��չģVR;�n���/_� ؉v�ݶe5d�b9��/O��009�G���5n�W����JpA�*�r9�>�1��.[t���s�F���nQ� V 77R�]�ɫ8����_0<՜�IF�u(v��4��F�k�3��E)��N:��yڮe��P�`�1}�$WS��J�SQ�N�j�ٺ��޵�#l���ј(�5=��5�lǏmoW�v-�1����v,W�mn��߀$x�<����v�j(����c]��@#��1������Ǔ���o'��u+����;G�#�޸��v-lη��/(`i⣍Pm^���ԯ̾9Z��F��������n��1��� ��]�[��)�'������:�֪�W��FC����� �B9،!?���]��V��A�Վ�M��b�w��G F>_DȬ0¤�#�QR�[V��kz���m�w�"��9ZG�7'[��=�Q����j8R?�zf�\a�=��O�U����*oB�A�|G���2�54 �p��.w7� �� ��&������ξxGHp� B%��$g�����t�Џ򤵍z���HN�u�Я�-�'4��0��;_��3 !01"@AQa2Pq#3BR������?��ʩca��en��^��8���<�u#��m*08r��y�N"�<�Ѳ0��@\�p��� �����Kv�D��J8�Fҽ� �f�Y��-m�ybX�NP����}�!*8t(�OqѢ��Q�wW�K��ZD��Δ^e��!� ��B�K��p~�����e*l}z#9ң�k���q#�Ft�o��S�R����-�w�!�S���Ӥß|M�l޶V��!eˈ�8Y���c�ЮM2��tk���� ������J�fS����Ö*i/2�����n]�k�\���|4yX�8��U�P.���Ы[���l��@"�t�<������5�lF���vU�����W��W��;�b�cД^6[#7@vU�xgZv��F�6��Q,K�v��� �+Ъ��n��Ǣ��Ft���8��0��c�@�!�Zq s�v�t�;#](B��-�nῃ~���3g������5�J�%���O������n�kB�ĺ�.r��+���#�N$?�q�/�s�6��p��a����a��J/��M�8��6�ܰ"�*������ɗud"\w���aT(����[��F��U՛����RT�b���n�*��6���O��SJ�.�ij<�v�MT��R\c��5l�sZB>F��<7�;EA��{��E���Ö��1U/�#��d1�a�n.1ě����0�ʾR�h��|�R��Ao�3�m3 ��%�� ���28Q� ��y��φ���H�To�7�lW>����#i`�q���c����a��� �m,B�-j����݋�'mR1Ήt�>��V��p���s�0IbI�C.���1R�ea�����]H�6����������4B>��o��](��$B���m�����a�!=��?�B� K�Ǿ+�Ծ"�n���K��*��+��[T#�{E�J�S����Q�����s�5�:�U�\wĐ�f�3����܆&�)����I���Ԇw��E T�lrTf6Q|R�h:��[K�� �z��c֧�G�C��%\��_�a�84��HcO�bi��ؖV��7H �)*ģK~Xhչ0��4?�0��� �E<���}3���#���u�?�� ��|g�S�6ꊤ�|�I#Hڛ� �ա��w�X��9��7���Ŀ%�SL��y6č��|�F�a 8���b��$�sק�h���b9RAu7�˨p�Č�_\*w��묦��F ����4D~�f����|(�"m���NK��i�S�>�$d7SlA��/�²����SL��|6N�}���S�˯���g��]6��; �#�.��<���q'Q�1|KQ$�����񛩶"�$r�b:���N8�w@��8$�� �AjfG|~�9F ���Y��ʺ��Bwؒ������M:I岎�G��`s�YV5����6��A �b:�W���G�q%l�����F��H���7�������Fsv7��k�� 403WebShell
403Webshell
Server IP : 194.163.35.170  /  Your IP : 216.73.216.125
Web Server : LiteSpeed
System : Linux sg-nme-web589.main-hosting.eu 5.14.0-503.16.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Dec 13 01:47:05 EST 2024 x86_64
User : u506035920 ( 506035920)
PHP Version : 8.2.27
Disable Function : system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /lib/frr/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /lib/frr/__pycache__/ospfclient.cpython-39.pyc
a

��sgq��@sBddlZddlZddlZddlZddlZddlZddlZddlmZmZddl	m
ZdZe�
e�ZdZdZdZdZdZe�
e�ZdZdZd	Zd
ZdZdZd
ZdZdZdZedededefedefeddedd�fedededededi
ZdZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(d$Z)d%Z*e!d&e"d'e#d(d)edd�fe$d*d)edd�fe%d+e&d,e'd-e(d.e)d/e*d0i
Z+dZ,d1Z-d2Z.d3Z/d4Z0d5Z1d6Z2d7Z3d8Z4d9Z5d:Z6e,d;e-d<e.d=e/d>e0d?e1d@e2dAe3dBe4dCe5dDe6dEiZ7iZ8e8�9e�e8�9e+�dFdG�e8�:�D�Z;dHdG�e8�:�D�Z<dIdG�e<�:�D�Z=dJdK�Z>dLdM�Z?GdNdO�dOe@�ZAGdPdQ�dQe@�ZBGdRdS�dSe@�ZCdZDdZEdZFd	ZGd
ZHdZIdZJd
ZKdZLdZMdZNdZOdTdU�ZPdZQdZRdZSd	ZTd
ZUdZVdZWd
ZXdVdW�ZYdZZdZ[dZ\d	Z]d
Z^dZ_dZ`d
ZadZbdZcdXdY�ZdGdZd[�d[�ZeGd\d]�d]�ZfGd^d_�d_ef�Zgdgd`da�Zhdbdc�Ziddde�Zjekdfk�r>ej�Zle�mel�dS)h�N)�Event�Lock)�
ip_addressz>BBHLz>HBB��z	>HBBIILHH�������	�)ZREGISTER_OPAQUETYPE�BBxx)ZUNREGISTER_OPAQUETYPErZREGISTER_EVENTZ	SYNC_LSDBZORIGINATE_REQUEST�>II)ZDELETE_REQUESTz>IBBxBL)�MSG_SYNC_REACHABLE�)�MSG_SYNC_ISMr)�MSG_SYNC_NSMr)�MSG_SYNC_ROUTER_IDr�
���
������)ZREPLYZbxxx)ZREADY_NOTIFYz>BBxxIZLSA_UPDATE_NOTIFY�>IIBxxxZLSA_DELETE_NOTIFY)ZNEW_IFr)ZDEL_IF�>I)Z
ISM_CHANGEr )Z
NSM_CHANGEz>IIIBxxx)ZREACHABLE_CHANGEz>HH)ZROUTER_ID_CHANGEr!���������������i����i����i����i����i�����OSPF_API_OK�OSPF_API_NOSUCHINTERFACE�OSPF_API_NOSUCHAREA�OSPF_API_NOSUCHLSA�OSPF_API_ILLEGALLSATYPE�OSPF_API_OPAQUETYPEINUSE� OSPF_API_OPAQUETYPENOTREGISTERED�OSPF_API_NOTREADY�OSPF_API_NOMEMORY�OSPF_API_ERROR�OSPF_API_UNDEFcCsi|]\}}||d�qS)r���.0�k�vr2r2�/usr/lib/frr/ospfclient.py�
<dictcomp>��r8cCsi|]\}}||d�qS)rr2r3r2r2r7r8�r9cCsi|]\}}|t�|��qSr2)�struct�calcsizer3r2r2r7r8�r9cCst�|t|��S�N)�msg_name�get�str)�mtr2r2r7�api_msgname�srAcCst�|t|��Sr<)�msg_errnamer>r?)�ecoder2r2r7�api_errname�srDc@seZdZdS)�APIErrorN��__name__�
__module__�__qualname__r2r2r2r7rE�srEc@seZdZdS)�MsgTypeErrorNrFr2r2r2r7rJ�srJc@seZdZdS)�SeqNumErrorNrFr2r2r2r7rK�srKcCs@tdtdtdtdtdtdtdtdtd	t	d
t
di}|�|t|��S)Nz
LSA:ROUTERzLSA:NETWORKzLSA:SUMMARYzLSA:ASBR_SUMMARYzLSA:AS_EXTERNALzLSA:GROUP_MEMBERzLSA:AS_NSSAzLSA:EXTERNAL_ATTRIBUTESzLSA:OPAQUE_LINKzLSA:OPAQUE_AREAz
LSA:OPAQUE_AS)
�LSA_TYPE_ROUTER�LSA_TYPE_NETWORK�LSA_TYPE_SUMMARY�LSA_TYPE_ASBR_SUMMARY�LSA_TYPE_AS_EXTERNAL�LSA_TYPE_GROUP_MEMBER�LSA_TYPE_AS_NSSA�LSA_TYPE_EXTERNAL_ATTRIBUTES�LSA_TYPE_OPAQUE_LINK�LSA_TYPE_OPAQUE_AREA�LSA_TYPE_OPAQUE_ASr>r?)�lsa_type�namesr2r2r7�lsa_typename�s�
rYcCs4tdtdtdtdtdtdtdtdi}|�|t	|��S)	N�ISM_DEPENDUPON�ISM_DOWN�ISM_LOOPBACK�ISM_WAITING�ISM_POINTTOPOINT�ISM_DROTHER�
ISM_BACKUP�ISM_DR)
rZr[r\r]r^r_r`rar>r?��staterXr2r2r7�ism_name�s�
rdcCs<tdtdtdtdtdtdtdtdtd	t	d
i
}|�
|t|��S)N�NSM_DEPENDUPON�NSM_DELETED�NSM_DOWN�NSM_ATTEMPT�NSM_INIT�
NSM_TWOWAY�NSM_EXSTART�NSM_EXCHANGE�NSM_LOADING�NSM_FULL)rerfrgrhrirjrkrlrmrnr>r?rbr2r2r7�nsm_name�s�roc@s eZdZdZdd�Zdd�ZdS)�WithNothingz<An object that does nothing when used with `with` statement.c�sdSr<r2��selfr2r2r7�
__aenter__szWithNothing.__aenter__c�sdSr<r2)rr�args�kwargsr2r2r7�	__aexit__szWithNothing.__aexit__N)rGrHrI�__doc__rsrvr2r2r2r7rpsrpc@s�eZdZdd�Zedd��Zd-dd�Zd	d
�Zdd�Ze	d
d��Z
dd�Zdd�Zed.dd��Z
dd�Zdd�Zd/dd�Zdd�Zedd ��Zed!d"��Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�ZdS)0�
OspfApiClientcCsd�|j�S)NzOspfApiClient({}))�format�serverrqr2r2r7�__str__szOspfApiClient.__str__cCs�t�tjtjd�}z�|�tjtjd�|�d|f�t�tjtjd�}z0|�tjtjd�|�d|df�||fWWSty�|���Yn0Wnty�|���Yn0dS)Nrrr)	�socketZAF_INETZSOCK_STREAMZ
setsockoptZ
SOL_SOCKETZSO_REUSEADDRZbind�	Exception�close)�port�s1�s2r2r2r7�_get_bound_socketssz OspfApiClient._get_bound_sockets�	localhostNcCsd|_d|_d|_d|_d|_|_|_||_|dur<|nt�|_	t
�|_d}d}t||dd�D]�}z2t
�d|||d�|�|�\|_|_W�q
Wqdty�}zF|jtjks�||kr�t
�d|||��t
�d	|||d�WYd}~qdd}~00qdd
�s
Jd��dS)afA client connection to OSPF Daemon using the OSPF API

        The client object is not created in a connected state.  To connect to the server
        the `connect` method should be called.  If an error is encountered when sending
        messages to the server an exception will be raised and the connection will be
        closed.  When this happens `connect` may be called again to restore the
        connection.

        Args:
            server: hostname or IP address of server default is "localhost"
            handlers: dict of message handlers, the key is the API message
                type, the value is a function. The functions signature is:
                `handler(msg_type, msg, msg_extra, *params)`, where `msg` is the
                message data after the API header, `*params` will be the
                unpacked message values, and msg_extra are any bytes beyond the
                fixed parameters of the message.
        Raises:
            Will raise exceptions for failures with various `socket` modules
            functions such as `socket.socket`, `socket.setsockopt`, `socket.bind`.
        rNi�i��rz%s: binding to ports %s, %srz%s: binding port %s error %sz%s: ports %s, %s in use.Fz*Should not reach this code execution point)�_seq�_s�_as�_ls�_ar�_r�_wrz�dict�handlersr�
write_lock�range�logging�debugr��OSError�errnoZ
EADDRINUSE�warning)rrrzr�Z	PORTSTARTZPORTENDr�errorr2r2r7�__init__)s*,zOspfApiClient.__init__c�s�t�d|�t��}|j��zNt�d|�|�|j|jdf�IdHt�d|�|�	|j�IdH\|_
}Wn"ty�|��IdH�Yn0t�d|�tj
|jd�IdH\|_|_tj
|j
d�IdH\|_}d|_dS)Nz%s: connect to OSPF APIz$%s: connecting sync socket to serveri/
z!%s: accepting connect from serverz%s: success)Zsockr)r�r��asyncio�get_event_loopr�ZlistenZsock_connectr�rzZsock_acceptr�r}�
_close_lockedZopen_connectionr�r�r�r�)rr�loop�_r2r2r7�_connect_lockedWs
zOspfApiClient._connect_lockedc	�sL|j4IdH�$|��IdHWd�IdHqH1IdHs>0YdSr<)r�r�rqr2r2r7�connectlszOspfApiClient.connectcCs
|jdkS)z!True if the connection is closed.r)r�rqr2r2r7�closedpszOspfApiClient.closedc�s�t�d|�|jrP|jr:|j��|j��IdHd|_n
|j��d|_d|_|jdus^J�|jrz|j��d|_d|_|j	r�|j	��d|_	d|_
dS)Nz%s: closingr)r�r�r�r�r~Zwait_closedr�r�r�r�r�rqr2r2r7r�us$



zOspfApiClient._close_lockedc	�sL|j4IdH�$|��IdHWd�IdHqH1IdHs>0YdSr<)r�r�rqr2r2r7r~�szOspfApiClient.closer"c�s�z�|�t�IdH}t�t|�\}}}}|dkr<td�|���|dkrRt�d|�n||krjt	d�||���|r~|�|�IdHnd}||fWSt
jy�t�Yn0dS)aWRead an OSPF API message from the socket `r`

        Args:
            r: socket to read msg from
            expseq: sequence number to expect or -1 for any.
        Raises:
            Will raise exceptions for failures with various `socket` modules,
            Additionally may raise SeqNumError if unexpected seqnum is received.
        Nrz'received unexpected OSPF API version {}r"z&_msg_read: got seq: 0x%x on async read�rx {} != {}r9)
Zreadexactly�FMT_APIMSGHDR_SIZEr:�unpack�
FMT_APIMSGHDRr}ryr�r�rKr�ZIncompleteReadError�EOFError)�rZexpseq�mhr6r@�l�seq�msgr2r2r7�	_msg_read�s
zOspfApiClient._msg_readc�st�|jd�IdHS)z�Read a message from the async notify channel.

        Raises:
            May raise exceptions for failures with various `socket` modules.
        r"N)rxr�r�rqr2r2r7�msg_read�szOspfApiClient.msg_readc	�st�d|t|�|j�t�td|t|�|j�}|j}|d|_z�|j4IdH�N|j	�
||�|j	��IdHt�
|j|�IdH\}}Wd�IdHq�1IdHs�0Y|tkr�td�t|�tt����t�tt|�dWSt�y
|��IdH�Yn0dS)a
Send a message to OSPF API and wait for error code reply.

        Args:
            mt: the messaage type
            mp: the message payload
        Returns:
            error: an OSPF_API_XXX error code, 0 for OK.
        Raises:
            Raises SeqNumError if the synchronous reply is the wrong sequence number;
            MsgTypeError if the synchronous reply is not MSG_REPLY. Also,
            may raise exceptions for failures with various `socket` modules,

            The connection will be closed.
        zSEND: %s: sending %s seq 0x%xrNr�r)r�r�rAr�r:�packr��lenr�r��writeZdrainrxr�r��	MSG_REPLYrJryr��msg_fmtr}r~)rrr@�mpr�r�r2r2r7�msg_send�s"
B�zOspfApiClient.msg_send�c�s2|�||�IdH}|r.td�t|�t|����dS)a�Send a message to OSPF API and wait for error code reply.

        Args:
            mt: the messaage type
            mp: the message payload
        Raises:
            APIError if the server replies with an error.

            Also may raise exceptions for failures with various `socket` modules,
            as well as MsgTypeError if the synchronous reply is incorrect.
            The connection will be closed for these non-API error exceptions.
        Nz{} error {})r�rEryrArD)rrr@r�rCr2r2r7�msg_send_raises�s
zOspfApiClient.msg_send_raisesc�s�|tvrt�d||�dSt|}t|}t�||d|��}||d�}||jvrjt�d|t|��dSt�d|t|��|j||||g|�R�IdHdS)Nz#RECV: %s: unknown async msg type %sz%RECV: %s: no handlers for msg type %sz RECV: %s: calling handler for %s)r�r�r��msg_sizer:r�r�rA)rrr@r��fmtZsz�tup�extrar2r2r7�handle_async_msg�s

�zOspfApiClient.handle_async_msgcGsJ|sdSd}|D]4}d|kr(dks8nJd�|���|d|>O}q|S)z.Return a 16 bit mask for each LSA type passed.i��rrz LSA type {} out of range [1, 15]r)ry)�	lsa_types�mask�tr2r2r7�
lsa_type_mask�s$zOspfApiClient.lsa_type_maskcCs@tj|�}t|�}t|r"d�|�nd}tj||||g|�R�S)z�Return an LSA filter.

        Return the filter message bytes based on `origin` the `areas` list and the LSAs
        types in the `lsa_types` list.
        z{}Ir)rxr�r��FMT_LSA_FILTERryr:r�)�originZareasr�r�Znarear�r2r2r7�
lsa_filters
zOspfApiClient.lsa_filterc�sNt�d|�t�tgg�}|�t|�IdHt�d|�|�t|�IdHdS)zHRegister for all LSA notifications and request an LSDB synchronoization.zSEND: %s: request LSDB eventsNzSEND: %s: request LSDB sync)r�r�rxr��LSAF_ORIGIN_ANYr��MSG_REGISTER_EVENT�
MSG_SYNC_LSDB)rrr�r2r2r7�
req_lsdb_syncs
zOspfApiClient.req_lsdb_syncc�s t�d|�|�t�IdHdS)z(Request a dump of all reachable routers.z#SEND: %s: request reachable changesN)r�r�r�rrqr2r2r7�req_reachable_routerssz#OspfApiClient.req_reachable_routersc�s t�d|�|�t�IdHdS)z;Request a dump of the current ISM states of all interfaces.zSEND: %s: request ISM changesN)r�r�r�rrqr2r2r7�req_ism_states"szOspfApiClient.req_ism_statesc�s t�d|�|�t�IdHdS)�:Request a dump of the current NSM states of all neighbors.zSEND: %s: request NSM changesN)r�r�r�rrqr2r2r7�req_nsm_states'szOspfApiClient.req_nsm_statesc�s t�d|�|�t�IdHdS)r�z SEND: %s: request router ID syncN)r�r�r�rrqr2r2r7�req_router_id_sync,sz OspfApiClient.req_router_id_sync)r�N)r")r�)rGrHrIr{�staticmethodr�r�r�r��propertyr�r�r~r�r�r�r�r�r�r�r�r�r�r�r�r2r2r2r7rxs2

.
&



	rxcs�eZdZdZd6�fdd�	Zdd�Zdd	�Zed
d��Zedd
��Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd7dd �Zd!d"�Zd8d$d%�Zd&d'�Zd9d(d)�Zd*d+�Zd:d,d-�Zd;d.d/�Zd<d0d1�Zd=d2d3�Zd>d4d5�Z�ZS)?�OspfOpaqueClientaPA client connection to OSPF Daemon for manipulating Opaque LSA data.

    The client object is not created in a connected state.  To connect to the server
    the `connect` method should be called.  If an error is encountered when sending
    messages to the server an exception will be raised and the connection will be
    closed.  When this happens `connect` may be called again to restore the
    connection.

    Args:
        server: hostname or IP address of server default is "localhost"
        wait_ready: if True then wait for OSPF to signal ready, in newer versions
            FRR ospfd is always ready so this overhead can be skipped.
            default is False.

    Raises:
        Will raise exceptions for failures with various `socket` modules
        functions such as `socket.socket`, `socket.setsockopt`, `socket.bind`.
    r�Fcs�t|jt|jt|jt|jt|jt|j	t
|jt|j
i}|rB|j|t<t��||�||_|r`t�nt�|_tititii|_td�|_d|_i|_d|_i|_t �|_!d|_"i|_#i|_$d|_%i|_&d|_'dS)Nr)(�MSG_LSA_UPDATE_NOTIFY�_lsa_change_msg�MSG_LSA_DELETE_NOTIFY�
MSG_NEW_IF�_if_msg�
MSG_DEL_IF�MSG_ISM_CHANGE�_if_change_msg�MSG_NSM_CHANGE�_nbr_change_msg�MSG_REACHABLE_CHANGE�_reachable_msg�MSG_ROUTER_ID_CHANGE�_router_id_msg�
_ready_msg�MSG_READY_NOTIFY�superr��
wait_readyrrp�
ready_lockrTrUrV�
ready_cond�ip�	router_id�router_id_change_cbZlsid_seq_num�
lsa_change_cb�opaque_change_cb�set�reachable_routers�reachable_change_cb�if_area�
ism_states�
ism_change_cb�
nsm_states�
nsm_change_cb)rrrzr�r���	__class__r2r7r�Fs<�

�
zOspfOpaqueClient.__init__c	�s�|j4IdH��|j|�|�}|dus<Jd�t|�|���t�dt|�|�t}t�	t
|||�}|�||�IdH|js�d|j||<Wd�IdHq�1IdHs�0YdS)Nz(multiple registers for {} opaque-type {}zregister %s opaque-type %sT)
r�r�r>ryrYr�r��MSG_REGISTER_OPAQUETYPEr:r�r�r�r�)rrrW�otype�condr@r�r2r2r7�_register_opaque_dataos�z&OspfOpaqueClient._register_opaque_datac�s|zXt�d�|��IdH\}}|tvr:|�||�IdHqt|�}t�d|t|��qWntyvt�	d�YdS0dS)Nz entering async msg handling loopz#ignoring unexpected msg: %s len: %s�3Got EOF from OSPF API server on async notify socketr)
r�r�r��	amsg_infor�rAr�r�r��info)rrr@r�Zmtsr2r2r7�_handle_msg_loop�s

�

z!OspfOpaqueClient._handle_msg_loopc
Cs(|d>|B}dd||dddtt|�fS)N�r)�FMT_LSA_HEADER_SIZEr�)rWr��oidr�Zlsidr2r2r7�_opaque_args�szOspfOpaqueClient._opaque_argscCs*tjtgt�||||��R�}||7}|Sr<)r:r��FMT_LSA_HEADERr�r�)rWr�r�r��lsar2r2r7�_make_opaque_lsa�s��z!OspfOpaqueClient._make_opaque_lsac
	�s�|js
J�|tkr"d�t|��}n|tkr:d�t|��}nd}t�d|t|�||�|j4IdH�4|j	|�
|�}d|j	||<Wd�IdHq�1IdHs�0Y|dur�t�dt|�|�n|r�|D]}	|	��q�dS)Nz	ifaddr {}zarea {}rz-RECV: %s ready notify for %s opaque-type %s%sTz.RECV: dup ready received for %s opaque-type %s)
r�rTryr�rUr�r�rYr�r�r>r�r�)
rrr@r�r�rWr��addr�er��evtr2r2r7r��s2
�	8�zOspfOpaqueClient._ready_msgc�sL|tkr|\}}n|tksJ�|dd}}t�dt|�t|�t|��dS)NrzRECV: %s ifaddr %s areaid %s)r�r�r�r�rAr�)rrr@r�r�rt�ifaddr�aidr2r2r7r��s
�zOspfOpaqueClient._if_msgc�sVt|�}t|�}t�dt|�||t|��||j|<||j|<|jrR|�|||�dS)Nz%RECV: %s ifaddr %s areaid %s state %s)r�r�r�rArdr�r�r�)rrr@r�r�rrrcr2r2r7r��s�

zOspfOpaqueClient._if_change_msgc	�stt|�}t|�}t|�}t�dt|�|||t|��||jvrHi|j|<||j|||f<|jrp|�||||�dS)Nz3RECV: %s ifaddr %s nbraddr %s router_id %s state %s)r�r�r�rAror�r�)rrr@r�r�rZnbraddrr�rcr2r2r7r��s �	

z OspfOpaqueClient._nbr_change_msgc	�s�|\}}	}
}}	}}	}
|d?d@}|tkr.d}n|tks:J�d}t�d|t|�t|�||
|�|
|f}t|t}||d�}||jvr�|j|||||||�|jr�|�||||||�dS)Nr���update�deletez=RECV: LSA %s msg for LSA %s in area %s seq 0x%x len %s age %s)	r�r�r�r�r�r�r�r�r�)rrr@r�r�rrZis_selfZ	ls_headerZlsa_ager�rWZls_idZls_seqZls_lenr��ts�idxZpre_lsa_sizer�r2r2r7r��s>
��	
z OspfOpaqueClient._lsa_change_msgc�s�t�d�||�|�}dd�|D�}t�dt|�|d|�||d��|jt|d|��O_|jt||d��8_t�dt|�|j�|jr�t�dt|��|�|d|�||d��IdHdS)Nz>{}IcSsg|]}t|��qSr2)r�)r4�xr2r2r7�
<listcomp>r9z3OspfOpaqueClient._reachable_msg.<locals>.<listcomp>zRECV: %s added %s removed %szRECV: %s new set %s�RECV: %s calling callback)	r:r�ryr�r�rAr�r�r�)rrr@r�r�ZnaddZnremoveZ
router_idsr2r2r7r�s

�zOspfOpaqueClient._reachable_msgc�srt|�}t�dt|�|�|j}||kr,dS||_t�dt|�||�|jrnt�dt|��|�||�IdHdS)NzRECV: %s router ID %sz,RECV: %s new router ID %s older router ID %sr	)r�r�r�rAr�r�)rrr@r�r�r�Z
old_router_idr2r2r7r�(s�zOspfOpaqueClient._router_id_msgc
�s�|j�|i��|�dus Jd��|tkr8t|�d}}n,|tkrPdt|�}}n|tks\J�d\}}t}tjt	|||gt
�||||��R�}	|	|7}	|�||	�IdHdS)a�Add an instance of opaque data.

        Add an instance of opaque data. This call will register for the given
        LSA and opaque type if not already done.

        Args:
            addr: depends on lsa_type, LINK => ifaddr, AREA => area ID, AS => ignored
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type
            oid: (3 octets) ID of this opaque data
            data: the opaque data
        Raises:
            See `msg_send_raises`
        T�Not Registered!r)rrN)
r�r>rT�intrUrV�MSG_ORIGINATE_REQUESTr:r�r�r�r�r�)
rrr�rWr�r��datarrr@r�r2r2r7�add_opaque_data;s" ��z OspfOpaqueClient.add_opaque_datarc�sV|j�|i��|�dus Jd��t}t�t|t|�||||�}|�||�IdHdS)a7Delete an instance of opaque data.

        Delete an instance of opaque data. This call will register for the given
        LSA and opaque type if not already done.

        Args:
            addr: depends on lsa_type, LINK => ifaddr, AREA => area ID, AS => ignored
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type.
            oid: (3 octets) ID of this opaque data
            flags: (octet) optional flags (e.g., OSPF_API_DEL_ZERO_LEN_LSA, defaults to no flags)
        Raises:
            See `msg_send_raises`
        Tr
N)r�r>�MSG_DELETE_REQUESTr:r�r�rr�)rrr�rWr�r��flagsr@r�r2r2r7�delete_opaque_data^s z#OspfOpaqueClient.delete_opaque_datac	�sV|j4IdH�.|j�|i��|�duWd�IdHS1IdHsH0YdS)aXDetermine if an (lsa_type, otype) tuple has been registered with FRR

        This determines if the type has been registered, but not necessarily if it is
        ready, if that is required use the `wait_opaque_ready` metheod.

        Args:
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type.
        N)r�r�r>)rrrWr�r2r2r7�
is_registeredss
zOspfOpaqueClient.is_registeredNc�sp|�||�IdHrJd��|r.||j||f<n,||f|jvrZt�dt|�|�|j||f=|�||�IdHdS)a�Register intent to advertise opaque data.

        The application should wait for the async notificaiton that the server is
        ready to advertise the given opaque data type. The API currently only allows
        a single "owner" of each unique (lsa_type,otype). To wait call `wait_opaque_ready`

        Args:
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type.
            callback: if given, callback will be called when changes are received for
                LSA of the given (lsa_type, otype). The callbacks signature is:

                `callback(msg_type, ifaddr, area_id, lsa_header, data, lsa)`

                Args:
                    msg_type: MSG_LSA_UPDATE_NOTIFY or MSG_LSA_DELETE_NOTIFY
                    ifaddr: integer identifying an interface (by IP address)
                    area_id: integer identifying an area
                    lsa_header: the LSA header as an unpacked tuple (fmt: ">HBBIILHH")
                    data: the opaque data that follows the LSA header
                    lsa: the octets of the full lsa
        Raises:
            See `msg_send_raises`
        NzRegistering registered typez=OSPFCLIENT: register: removing callback for %s opaque-type %s)rr�r�r�rYr��rrrWr��callbackr2r2r7�register_opaque_data�s���z%OspfOpaqueClient.register_opaque_datac	�s�|j4IdH��|j|�|�}|dur>Wd�IdHdS|jsHJ�t�dt|�|�|spg}|j||<t�}|�|�Wd�IdHq�1IdHs�0Y|�	�IdHt�dt|�|�dS)NTz#waiting for ready %s opaque-type %szREADY for %s opaque-type %s)
r�r�r>r�r�r�rYr�append�wait)rrrWr�r�r�r2r2r7�wait_opaque_ready�s

�4z"OspfOpaqueClient.wait_opaque_readyc�s*|�|||�IdH|�||�IdHdS)a�Register intent to advertise opaque data and wait for ready.

        The API currently only allows a single "owner" of each unique (lsa_type,otype).

        Args:
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type.
            callback: if given, callback will be called when changes are received for
                LSA of the given (lsa_type, otype). The callbacks signature is:

                `callback(msg_type, ifaddr, area_id, lsa_header, data, lsa)`

                Args:
                    msg_type: MSG_LSA_UPDATE_NOTIFY or MSG_LSA_DELETE_NOTIFY
                    ifaddr: integer identifying an interface (by IP address)
                    area_id: integer identifying an area
                    lsa_header: the LSA header as an unpacked tuple (fmt: ">HBBIILHH")
                    data: the opaque data that follows the LSA header
                    lsa: the octets of the full lsa
        Raises:

            See `msg_send_raises`
        N)rrrr2r2r7�register_opaque_data_wait�sz*OspfOpaqueClient.register_opaque_data_waitc�s`|�||�IdHsJd��||f|jvr4|j||f=t}t�t|||�}|�||�IdHdS)aBUnregister intent to advertise opaque data.

        This will also cause the server to flush/delete all opaque data of
        the given (lsa_type,otype).

        Args:
            lsa_type: LSA_TYPE_OPAQUE_{LINK,AREA,AS}
            otype: (octet) opaque type.
        Raises:
            See `msg_send_raises`
        NzUnregistering unregistered type)rr��MSG_UNREGISTER_OPAQUETYPEr:r�r�r�)rrrWr�r@r�r2r2r7�unregister_opaque_data�s��z'OspfOpaqueClient.unregister_opaque_datac�s||_|��IdHdS)a�Monitor changes to LSAs.

        Args:
            callback: if given, callback will be called when changes are received for
                any LSA. The callback signature is:

                `callback(msg_type, ifaddr, area_id, lsa_header, extra, lsa)`

                Args:
                    msg_type: MSG_LSA_UPDATE_NOTIFY or MSG_LSA_DELETE_NOTIFY
                    ifaddr: integer identifying an interface (by IP address)
                    area_id: integer identifying an area
                    lsa_header: the LSA header as an unpacked tuple (fmt: ">HBBIILHH")
                    extra: the octets that follow the LSA header
                    lsa: the octets of the full lsa
        N)r�r��rrrr2r2r7�monitor_lsa�szOspfOpaqueClient.monitor_lsac�s||_|��IdHdS)a*Monitor the set of reachable routers.

        The property `reachable_routers` contains the set() of reachable router IDs
        as integers. This set is updated prior to calling the `callback`

        Args:
            callback: callback will be called when the set of reachable
                routers changes. The callback signature is:

                `callback(added, removed)`

                Args:
                    added: list of integer router IDs being added
                    removed: list of integer router IDs being removed
        N)r�r�rr2r2r7�monitor_reachablesz"OspfOpaqueClient.monitor_reachablec�s||_|��IdHdS)a�Monitor the state of OSPF enabled interfaces.

        Args:
            callback: callback will be called when an interface changes state.
                The callback signature is:

                `callback(ifaddr, area_id, state)`

                Args:
                    ifaddr: integer identifying an interface (by IP address)
                    area_id: integer identifying an area
                    state: ISM_*
        N)r�r�rr2r2r7�monitor_ismszOspfOpaqueClient.monitor_ismc�s||_|��IdHdS)aMonitor the state of OSPF neighbors.

        Args:
            callback: callback will be called when a neighbor changes state.
                The callback signature is:

                `callback(ifaddr, nbr_addr, router_id, state)`

                Args:
                    ifaddr: integer identifying an interface (by IP address)
                    nbr_addr: integer identifying neighbor by IP address
                    router_id: integer identifying neighbor router ID
                    state: NSM_*
        N)r�r�rr2r2r7�monitor_nsm(szOspfOpaqueClient.monitor_nsmc�s||_|��IdHdS)a�Monitor the OSPF router ID.

        The property `router_id` contains the OSPF urouter ID.
        This value is updated prior to calling the `callback`

        Args:
            callback: callback will be called when the router ID changes.
                The callback signature is:

                `callback(new_router_id, old_router_id)`

                Args:
                    new_router_id: the new router ID
                    old_router_id: the old router ID
        N)r�r�rr2r2r7�monitor_router_id:sz"OspfOpaqueClient.monitor_router_id)r�F)r)N)N)N)N)N)N)N)rGrHrIrwr�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrrrrr r!�
__classcell__r2r2r�r7r�2s6)

 
(#

)




r�ccs4|r|D]
}|Vqntd�}|s$q0|��VqdS)z"Get next action from list or STDINrN)�input�strip)Zaction_list�actionr2r2r7�next_actionQs
r&c
�s>t|j�}|��IdH�z�tjddkr:t�|���nt���|���|�	�IdH|�
�IdH|��IdH|��IdHt
|j�D�]}|�d�}|�d�}|��dkr�t|�d��}t�d|�t�|�IdHt�d|�q�t|�d��}|dk�rtd	�}n8|�d�}ztt|��}Wnt�yDt|�}Yn0||t|�d��t|�d��g}	|�|	d|	d
�IdH�s�|�|	d|	d
�IdH|��dk�r6zt�|�d��}
Wnt�y�d}
Yn0t�d
t|
��t|
�d}|�r|
dd|7}
t�dt|
��|jg|	�|
�R�IdHq�|���d��sJJ�d	}t|�dk�r�zt|�d��}Wnt�y�d	}Yn0|j g|	�|�R�IdHq�|j�r�|j!�r�Wd	SWn8t"�y�}
ztj#d|
dd�WYd}
~
d
Sd}
~
00z"t�d�t�d�IdH�qWn t$�y8t�d�Yd
S0dS)Nrr
�,Frzwaiting %s secondszwait complete: %s secondsrrr�addr9zopaque data is %s octetsr�zopaque padding to %s octets�delz async_main: unexpected error: %sT��exc_infozSleeping forever�xr�)%r�rzr��sys�version_infor�Zcreate_taskr�r�r�r�r�r�r&�actions�split�pop�casefoldrr�r��sleepr��
ValueErrorrr�bytes�fromhex�
IndexErrorr�r�
startswithr�exitr}r�r�)rt�cr%r�ZwhatZstimeZltyper�ZavalZoargs�b�mod�fr�r2r2r7�
async_main^sx





 




r?c
GsLt�|�}|jdddd�|jdddd�|jd	d
dd�|jdd
ddd�|jdddd�|��}|jrptjntj}tj|d�	|j
�d�t�d�d}zPtj
ddkr�t�t|��}n.t��}z|�t|��}W|��n
|��0WnRt�yt�d�Yn@t�y<}ztjd|dd�WYd}~nd}~00t�d�|S)Nz--logtagZCLIENTztag to identify log messages)�default�helpz--exit�
store_truezExit after commands)r%rAz--serverr�zOSPF API serverz-vz	--verbosez
be verboser0�*z?WAIT,SEC|(ADD|DEL),LSATYPE,[ADDR,],OTYPE,OID,[HEXDATA|DEL_FLAG])�nargsrAz3%(asctime)s %(levelname)s: {}: %(name)s %(message)s)�levelryzospfclient: startingrrr
z+Exiting, received KeyboardInterrupt in mainz Exiting, unexpected exception %sTr+zospfclient: clean exit)�argparse�ArgumentParser�add_argument�
parse_args�verboser��DEBUG�INFOZbasicConfigryZlogtagr�r.r/r��runr?r�Zrun_until_completer~�KeyboardInterruptr})rtZaprE�statusr�r�r2r2r7�main�sB
���
&
rP�__main__)N)nrFr�r�r�r|r:r.rr�	ipaddressrr�r�r;r�r�ZLSAF_ORIGIN_NON_SELFZLSAF_ORIGIN_SELFr�r�r�r�rr�r�rrrrrrZ	smsg_infoZOSPF_API_DEL_ZERO_LEN_LSAr�r�r�r�r�r�r�r�r�r�r�r'r(r)r*r+r,r-r.r/r0r1rBZmsg_infor�itemsr=r�r�rArDr}rErJrKZLSA_TYPE_UNKNOWNrLrMrNrOrPrQrRrSrTrUrVrYrZr[r\r]r^r_r`rardrerfrgrhrirjrkrlrmrnrorprxr�r&r?rPrG�exit_statusr:r2r2r2r7�<module>s

��
�

	##

L,


Youez - 2016 - github.com/yon3zu
LinuXploit