{"id":2416,"date":"2025-10-16T12:08:03","date_gmt":"2025-10-16T10:08:03","guid":{"rendered":"https:\/\/numpex.org\/lia-au-service-de-la-science\/"},"modified":"2026-09-10T22:38:22","modified_gmt":"2026-09-10T20:38:22","slug":"lia-au-service-de-la-science","status":"publish","type":"page","link":"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/","title":{"rendered":"L&rsquo;IA au service de la science"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><p>[vc_row row_height_percent=\u00a0\u00bb0&Prime; overlay_alpha=\u00a0\u00bb50&Prime; gutter_size=\u00a0\u00bb3&Prime; column_width_percent=\u00a0\u00bb100&Prime; shift_y=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; sticky=\u00a0\u00bbyes\u00a0\u00bb content_parallax=\u00a0\u00bb0&Prime; uncode_shortcode_id=\u00a0\u00bb165842&Prime; css=\u00a0\u00bb.vc_custom_1785924495010{margin-top: 1% !important;}\u00a0\u00bb][vc_column width=\u00a0\u00bb1\/1&Prime;][vc_raw_html]PCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBOdW1QRXgg4oCUIE1lbnUgZGUgc2VjdGlvbnMgc3RpY2t5IOKAlCB2LjYuNAogIE5hb3MgQWdlbmN5IMK3IDIwMjYtMDktMTAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKPHN0eWxlPgogIDpyb290eyAtLW5weC10b3A6IDYwcHg7IH0gLyogaGF1dGV1ciBkdSBoZWFkZXIgVW5jb2RlIHN0aWNreSAqLwogIC5ucHgtc3VibmF2ewogICAgYmFja2dyb3VuZDogI0UwOTkwMDsgLyogb3JhbmdlIGQnYWNjZW50dWF0aW9uIE51bVBFeCAqLwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA4KTsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHotaW5kZXg6IDQwOwogIH0KICAubnB4LXN1Ym5hdltoaWRkZW5deyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KICAubnB4LXN1Ym5hdi5ucHgtc3R1Y2t7IGJvcmRlci1yYWRpdXM6IDAgMCAxMnB4IDEycHg7IH0KICAubnB4LXN1Ym5hdi5ucHgtc3R1Y2t7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IHZhcigtLW5weC10b3ApOwogICAgbGVmdDogMDsgcmlnaHQ6IDA7CiAgfQogIC5ucHgtc3VibmF2X19pbm5lcnsKICAgIC8qIHYuNi40IDogbWV0cmlxdWVzIHBpbG90ZWVzIHBhciB2YXJpYWJsZXMuIExlcyB2YWxldXJzIGRlIHJlcGxpCiAgICAgICBTT05UIGNlbGxlcyBkZSBsYSB2LjYuMiA6IHNhbnMgSlMsIHJlbmR1IGlkZW50aXF1ZS4gKi8KICAgIG1heC13aWR0aDogMTE0MHB4OwogICAgbWFyZ2luOiAwIGF1dG87CiAgICBwYWRkaW5nOiAwIDI0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDAgdmFyKC0tbnB4LWdhcCwgMTBweCk7CiAgICBtaW4taGVpZ2h0OiA0NnB4OwogICAgcGFkZGluZy10b3A6IDZweDsKICAgIHBhZGRpbmctYm90dG9tOiA2cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZm9udC1zaXplOiB2YXIoLS1ucHgtZnMsIDExcHgpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiB2YXIoLS1ucHgtbHMsIC4xMmVtKTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwogICAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOwogICAgLyogZm9udC1mYW1pbHk6ICdQb3BwaW5zJywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmOyAqLwogIH0KICAubnB4LXN1Ym5hdl9faW5uZXI6Oi13ZWJraXQtc2Nyb2xsYmFyeyBkaXNwbGF5OiBub25lOyB9CiAgLyogU3DDqWNpZmljaXTDqSByZW5mb3Jjw6llICsgIWltcG9ydGFudCA6IG5ldXRyYWxpc2UgbGVzIGNvdWxldXJzIGRlIGxpZW5zIGR1IHRow6htZSBVbmNvZGUgKG9yYW5nZSBhdSBzdXJ2b2wvY2xpYykgKi8KICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYSwKICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYTp2aXNpdGVkewogICAgY29sb3I6IHJnYmEoMjU1LDI1MCwyNDMsLjg4KSAhaW1wb3J0YW50OyAvKiBibGFuYyBjYXNzw6kgKi8KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogOHB4IHZhcigtLW5weC1weCwgMTRweCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIHRyYW5zaXRpb246IGNvbG9yIC4xOHMsIGJhY2tncm91bmQtY29sb3IgLjE4czsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7ICAvKiB2LjYuNCA6IHVuIGxpYmVsbGUgbmUgc2UgY291cGUgamFtYWlzICovCiAgICBmbGV4OiAwIDAgYXV0bzsgICAgICAgLyogdi42LjQgOiBsZXMgcGFzdGlsbGVzIG5lIHNlIGNvbXByaW1lbnQgcGFzICovCiAgfQogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmhvdmVyLAogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmZvY3VzLAogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmFjdGl2ZXsKICAgIGNvbG9yOiAjRkZGRkZGICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4xMik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKICB9CiAgbmF2Lm5weC1zdWJuYXYgLm5weC1zdWJuYXZfX2lubmVyIGEubnB4LWFjdGl2ZSwKICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYS5ucHgtYWN0aXZlOmhvdmVyewogICAgY29sb3I6ICNGRkZGRkYgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6ICNBODZGMDA7IC8qIG9yYW5nZSBmb25jw6ksIGFwbGF0IHNpbXBsZSAqLwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICB9Cjwvc3R5bGU+Cgo8bmF2IGNsYXNzPSJucHgtc3VibmF2IiBhcmlhLWxhYmVsPSJQYWdlIHNlY3Rpb25zIiBoaWRkZW4+CiAgPGRpdiBjbGFzcz0ibnB4LXN1Ym5hdl9faW5uZXIiPjwvZGl2Pgo8L25hdj4KCjxzY3JpcHQ+CihmdW5jdGlvbigpewogICd1c2Ugc3RyaWN0JzsKCiAgLyogPT09PT09PT09PT09PT09PT09PT0gQ09ORklHIFNJVEUgPT09PT09PT09PT09PT09PT09PT0KICAgICBTZXVsZSB6b25lIMOgIGFkYXB0ZXIgcG91ciByw6l1dGlsaXNlciBsZSBibG9jIGFpbGxldXJzLiAqLwogIHZhciBQUkVGSVggPSAnbmF2LSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByw6lmaXhlIGRlcyBSb3cgSUQgw6AgZMOpdGVjdGVyICovCiAgdmFyIFNUUklQICA9IFsvLShlbnxmcikkL2ksIC8tZXhhLVthLXowLTldKyQvaV07ICAgLyogc3VmZml4ZXMgZCd1bmljaXTDqSDDoCBpZ25vcmVyICAqLwoKICAvKiBSZXBsaSBwb3VyIGxlcyBwYWdlcyBQQVMgRU5DT1JFIE1JR1LDiUVTIHZlcnMgbGUgcHLDqWZpeGUgbmF2LQogICAgICh0eXBpcXVlbWVudCBsZXMgdHJhZHVjdGlvbnMgV1BNTCBkb250IGxlcyBSb3cgSUQgbidvbnQgcGFzIMOpdMOpCiAgICAgcmVub21tw6lzKS4gVXRpbGlzw6kgVU5JUVVFTUVOVCBzaSBsYSBwYWdlIG5lIGNvbnRpZW50IGF1Y3VuZSByb3cKICAgICDCqyBuYXYtIMK7LiBSZXByZW5kIGxlcyBjbMOpcyBkZSBsYSB2LjUgOiB1bmUgcm93IG5vbW3DqWUKICAgICDCqyBjb25zb3J0aXVtLWV4YS1tYS1lbiDCuyBvdSBzaW1wbGVtZW50IMKrIGNvbnNvcnRpdW0gwrsgZXN0CiAgICAgcmV0cm91dsOpZS4gTGlzdGUgZmVybcOpZSA9IGF1Y3VuIHJpc3F1ZSBkZSBmYXV4IHBvc2l0aWYuICovCiAgdmFyIExFR0FDWV9LRVlTID0gWwogICAgJ292ZXJ2aWV3JywgJ2NvbnNvcnRpdW0nLCAncmVzdWx0cycsICdtZXRyaWNzJywgJ3NvZnR3YXJlJywKICAgICduZXdzJywgJ2V2ZW50cycsICdhZ2VuZGEnLCAndGVhbScsICdjb250YWN0JwogIF07CgogIHZhciBMQUJFTFMgPSB7CiAgICAvKiBMaWJlbGzDqXMgcHLDqWbDqXLDqXMgcGFyIGNsw6kuIFRvdXRlIGNsw6kgYWJzZW50ZSBlc3QgYWZmaWNow6llCiAgICAgICBjYXBpdGFsaXPDqWUgdGVsbGUgcXVlbGxlIChuYXYtam9pbi11cyAtPiDCqyBKb2luIFVzIMK7KS4gKi8KICAgIGVuOiB7CiAgICAgICdjb25zb3J0aXVtJzogJ0NvbnNvcnRpdW0gJiBXb3JrcGFja2FnZXMnLAogICAgICAncmVzdWx0cyc6ICAgICdSZXN1bHRzICYgSW1wYWN0JywKICAgICAgJ21ldHJpY3MnOiAgICAnUHJvamVjdCBNZXRyaWNzJywKICAgICAgJ3RlYW0nOiAgICAgICAnVGhlIFRlYW0nCiAgICB9LAogICAgZnI6IHsKICAgICAgJ292ZXJ2aWV3JzogICAnUHLDqXNlbnRhdGlvbicsCiAgICAgICdjb25zb3J0aXVtJzogJ0NvbnNvcnRpdW0gZXQgbG90cyBkZSB0cmF2YWlsJywKICAgICAgJ3Jlc3VsdHMnOiAgICAnUsOpc3VsdGF0cyBldCBpbXBhY3QnLAogICAgICAnbWV0cmljcyc6ICAgICdDaGlmZnJlcyBjbMOpcycsCiAgICAgICdzb2Z0d2FyZSc6ICAgJ0xvZ2ljaWVscycsCiAgICAgICduZXdzJzogICAgICAgJ0FjdHVhbGl0w6lzJywKICAgICAgJ2V2ZW50cyc6ICAgICAnw4l2w6huZW1lbnRzJywKICAgICAgJ3RlYW0nOiAgICAgICAnTOKAmcOpcXVpcGUnCiAgICB9CiAgfTsKICB2YXIgU1RJQ0tfTU9ERSA9ICd1bmNvZGUnOyAvKiAndW5jb2RlJyA9IGxhIHJvdyBnw6hyZSBsZSBzdGlja3kgwrcgJ2pzJyA9IGxlIHNjcmlwdCBjb2xsZSBsdWktbcOqbWUgKi8KICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKICB2YXIgREVCVUcgPSAvWz8mXW5weGRlYnVnPTEvLnRlc3Qod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgZnVuY3Rpb24gbG9nKCl7CiAgICBpZighREVCVUcgfHwgIXdpbmRvdy5jb25zb2xlIHx8ICFjb25zb2xlLmxvZykgcmV0dXJuOwogICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgWydbbnB4LXN1Ym5hdl0nXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgfQoKICAvKiAtLS0tIExhbmd1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgPGh0bWwgbGFuZz4gcG9zw6kgcGFyIFdQTUwuIFJlcGxpcyBzdWNjZXNzaWZzIHNpIGwnYXR0cmlidXQgbWFucXVlIDoKICAgICB1biBhbmPDqnRyZSBwb3J0ZXVyIGRlIGxhbmcsIHB1aXMgbGVzIGNsYXNzZXMgZHUgYm9keS4gKi8KICBmdW5jdGlvbiBkZXRlY3RMYW5nKGVsKXsKICAgIHZhciB0YWcgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdsYW5nJykgfHwgJyc7CiAgICBpZighdGFnICYmIGVsICYmIGVsLmNsb3Nlc3QpewogICAgICB2YXIgaG9zdCA9IGVsLmNsb3Nlc3QoJ1tsYW5nXScpOwogICAgICBpZihob3N0KXsgdGFnID0gaG9zdC5nZXRBdHRyaWJ1dGUoJ2xhbmcnKSB8fCAnJzsgfQogICAgfQogICAgaWYoIXRhZyl7CiAgICAgIHZhciBjbHMgPSAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSkgfHwgJyc7CiAgICAgIGlmKC8oPzpsYW5nfGxhbmd1YWdlKS1mclxifGZyW18tXUZSL2kudGVzdChjbHMpKXsgdGFnID0gJ2ZyJzsgfQogICAgfQogICAgcmV0dXJuIC9eZnIvaS50ZXN0KHRhZykgPyAnZnInIDogJ2VuJzsKICB9CgogIGZ1bmN0aW9uIGtleU9mKGlkKXsKICAgIHZhciBrID0gaWQuc2xpY2UoUFJFRklYLmxlbmd0aCkudG9Mb3dlckNhc2UoKTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBTVFJJUC5sZW5ndGg7IGkrKyl7IGsgPSBrLnJlcGxhY2UoU1RSSVBbaV0sICcnKTsgfQogICAgcmV0dXJuIGs7CiAgfQogIGZ1bmN0aW9uIHRpdGxlQ2FzZShrZXkpewogICAgcmV0dXJuIGtleS5zcGxpdCgnLScpLm1hcChmdW5jdGlvbih3KXsKICAgICAgcmV0dXJuIHcgPyB3LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdy5zbGljZSgxKSA6IHc7CiAgICB9KS5qb2luKCcgJyk7CiAgfQoKICAvKiBEb3VibGUgc8OpY3VyaXTDqSA6IMOpY2FydGUgbGVzIG1lbnVzIGfDqW7DqXLDqXMgcGFyIFdvcmRQcmVzcyBldCB0b3V0IGNlCiAgICAgcXVpIHZpdCBkYW5zIGxhIG5hdmlnYXRpb24gb3UgbGUgaGVhZGVyIOKAlCBpbmNoYW5nw6kgZGVwdWlzIGxhIHYuNi4xLiAqLwogIGZ1bmN0aW9uIGlzU2VjdGlvbkNhbmRpZGF0ZShlbCl7CiAgICB2YXIgdGFnID0gZWwudGFnTmFtZTsKICAgIGlmKHRhZyA9PT0gJ1VMJyB8fCB0YWcgPT09ICdMSScgfHwgdGFnID09PSAnQScgfHwgdGFnID09PSAnTkFWJyl7IHJldHVybiBmYWxzZTsgfQogICAgaWYoZWwuY2xvc2VzdCAmJiBlbC5jbG9zZXN0KCduYXYsIGhlYWRlciwgLm5weC1zdWJuYXYnKSl7IHJldHVybiBmYWxzZTsgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBpbkRvY3VtZW50T3JkZXIoYSwgYil7CiAgICB2YXIgcG9zID0gYS5zZWN0aW9uLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIuc2VjdGlvbik7CiAgICByZXR1cm4gKHBvcyAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSA\/IC0xIDogMTsKICB9CgogIC8qIC0tLS0gRMOpY291dmVydGUgZGVzIHNlY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgMSkgTW9kZSBub21pbmFsIDogdG91dGVzIGxlcyByb3dzIGRvbnQgbCdpZCBjb21tZW5jZSBwYXIgwqsgbmF2LSDCuy4KICAgICAyKSBSZXBsaSA6IHNpIGV0IHNldWxlbWVudCBzaSBsZSBtb2RlIDEgbmUgZG9ubmUgUklFTiwgb24gY2hlcmNoZQogICAgICAgIGxlcyBjbMOpcyBow6lyaXTDqWVzIGRlIGxhIHYuNSwgYXZlYyBvdSBzYW5zIHN1ZmZpeGUuCiAgICAgUmVudm9pZSB7IGVudHJpZXM6IFsuLi5dLCBtb2RlOiAncHJlZml4JyB8ICdsZWdhY3knIHwgJ25vbmUnIH0uICovCiAgZnVuY3Rpb24gZGlzY292ZXIoZGljdCl7CiAgICB2YXIgc2VlbiA9IE9iamVjdC5jcmVhdGUobnVsbCksIGVudHJpZXMgPSBbXTsKCiAgICBmdW5jdGlvbiBwdXNoKGVsLCBrZXkpewogICAgICBpZighZWwgfHwgIWtleSB8fCBzZWVuW2tleV0peyByZXR1cm47IH0KICAgICAgc2VlbltrZXldID0gdHJ1ZTsKICAgICAgZW50cmllcy5wdXNoKHsgc2VjdGlvbjogZWwsIGtleToga2V5LCBsYWJlbDogZGljdFtrZXldIHx8IHRpdGxlQ2FzZShrZXkpIH0pOwogICAgfQoKICAgIHZhciBmb3VuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49IicgKyBQUkVGSVggKyAnIl0nKTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBmb3VuZC5sZW5ndGg7IGkrKyl7CiAgICAgIGlmKCFpc1NlY3Rpb25DYW5kaWRhdGUoZm91bmRbaV0pKXsgY29udGludWU7IH0KICAgICAgcHVzaChmb3VuZFtpXSwga2V5T2YoZm91bmRbaV0uaWQpKTsKICAgIH0KICAgIGlmKGVudHJpZXMubGVuZ3RoKXsKICAgICAgd2FybklmUGFydGlhbGx5TWlncmF0ZWQoc2Vlbik7CiAgICAgIHJldHVybiB7IGVudHJpZXM6IGVudHJpZXMsIG1vZGU6ICdwcmVmaXgnIH07CiAgICB9CgogICAgZm9yKHZhciBqID0gMDsgaiA8IExFR0FDWV9LRVlTLmxlbmd0aDsgaisrKXsKICAgICAgdmFyIGsgID0gTEVHQUNZX0tFWVNbal07CiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGspIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tpZF49IicgKyBrICsgJy0iXScpOwogICAgICBpZihlbCAmJiBpc1NlY3Rpb25DYW5kaWRhdGUoZWwpKXsgcHVzaChlbCwgayk7IH0KICAgIH0KICAgIGlmKGVudHJpZXMubGVuZ3RoKXsKICAgICAgZW50cmllcy5zb3J0KGluRG9jdW1lbnRPcmRlcik7IC8qIGxhIGxpc3RlIGRlcyBjbMOpcyBuZSBzdWl0IHBhcyBsJ29yZHJlIGRlIGxhIHBhZ2UgKi8KICAgICAgcmV0dXJuIHsgZW50cmllczogZW50cmllcywgbW9kZTogJ2xlZ2FjeScgfTsKICAgIH0KCiAgICByZXR1cm4geyBlbnRyaWVzOiBlbnRyaWVzLCBtb2RlOiAnbm9uZScgfTsKICB9CgogIC8qIC0tLS0gTWlncmF0aW9uIHBhcnRpZWxsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIENhcyBwacOoZ2UgOiBzdXIgdW5lIG3Dqm1lIHBhZ2UgY2VydGFpbmVzIHJvd3Mgb250IMOpdMOpIHJlbm9tbcOpZXMgZW4KICAgICBuYXYt4oCmIGV0IGQnYXV0cmVzIG5vbi4gTGUgbW9kZSBub21pbmFsIGwnZW1wb3J0ZSBldCBsZXMgcm93cyBub24KICAgICByZW5vbW3DqWVzIGRpc3BhcmFpc3NlbnQgU0lMRU5DSUVVU0VNRU5UIGR1IG1lbnUuIE9uIGxlIHNpZ25hbGUuICovCiAgZnVuY3Rpb24gd2FybklmUGFydGlhbGx5TWlncmF0ZWQoc2Vlbil7CiAgICBpZighd2luZG93LmNvbnNvbGUgfHwgIWNvbnNvbGUud2Fybil7IHJldHVybjsgfQogICAgdmFyIHN0cmFnZ2xlcnMgPSBbXTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBMRUdBQ1lfS0VZUy5sZW5ndGg7IGkrKyl7CiAgICAgIHZhciBrID0gTEVHQUNZX0tFWVNbaV07CiAgICAgIGlmKHNlZW5ba10peyBjb250aW51ZTsgfSAvKiBkw6lqw6AgcHLDqXNlbnQgdmlhIHVuZSByb3cgbmF2LSAqLwogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChrKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaWRePSInICsgayArICctIl0nKTsKICAgICAgaWYoZWwgJiYgaXNTZWN0aW9uQ2FuZGlkYXRlKGVsKSl7IHN0cmFnZ2xlcnMucHVzaChrICsgJyAoIycgKyBlbC5pZCArICcpJyk7IH0KICAgIH0KICAgIGlmKCFzdHJhZ2dsZXJzLmxlbmd0aCl7IHJldHVybjsgfQogICAgY29uc29sZS53YXJuKAogICAgICAnW25weC1zdWJuYXZdIE1pZ3JhdGlvbiBpbmNvbXBsZXRlIHN1ciBjZXR0ZSBwYWdlIDogJyArIHN0cmFnZ2xlcnMubGVuZ3RoICsKICAgICAgJyByb3cocykgcG9ydGVudCBlbmNvcmUgdW4gYW5jaWVuIFJvdyBJRCBldCBzb250IEFCU0VOVEVTIGR1IG1lbnUgLT4gJyArCiAgICAgIHN0cmFnZ2xlcnMuam9pbignLCAnKSArICdcbicgKwogICAgICAnTGVzIHJlbm9tbWVyIGF2ZWMgbGUgcHJlZml4ZSAiJyArIFBSRUZJWCArICciIChleC4gJyArIFBSRUZJWCArIExFR0FDWV9LRVlTWzBdICsgJykuJwogICAgKTsKICB9CgogIC8qIC0tLS0gTWVzc2FnZSBkZSBkaWFnbm9zdGljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIEludmlzaWJsZSBwb3VyIGxlcyB2aXNpdGV1cnMsIGTDqWNpc2lmIHBvdXIgbGEgcGVyc29ubmUgcXVpIHJlcHJlbmQKICAgICBsZSBkb3NzaWVyIDogb24gZGl0IGNlIHF1aSBhIMOpdMOpIGNoZXJjaMOpIGV0IGNlIHF1aSBhIMOpdMOpIHRyb3V2w6kuICovCiAgZnVuY3Rpb24gd2Fybk5vdGhpbmdGb3VuZCgpewogICAgaWYoIXdpbmRvdy5jb25zb2xlIHx8ICFjb25zb2xlLndhcm4peyByZXR1cm47IH0KICAgIHZhciB3aXRoSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyk7CiAgICBjb25zb2xlLndhcm4oCiAgICAgICdbbnB4LXN1Ym5hdl0gQXVjdW5lIHNlY3Rpb24gdHJvdXbDqWUgOiBsYSBiYXJyZSByZXN0ZSBtYXNxdcOpZS5cbicgKwogICAgICAnLSBSZWNoZXJjaMOpIGVuIHByaW9yaXTDqSA6IGRlcyBSb3cgSUQgY29tbWVuw6dhbnQgcGFyICInICsgUFJFRklYICsgJyIgKGV4LiBuYXYtb3ZlcnZpZXcpLlxuJyArCiAgICAgICctIFB1aXMsIGVuIHJlcGxpLCBsZXMgY2xlcyBoZXJpdGVlcyA6ICcgKyBMRUdBQ1lfS0VZUy5qb2luKCcsICcpICsgJy5cbicgKwogICAgICAnLSBQYWdlIGxhbmc9IicgKyAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnbGFuZycpIHx8ICcoYWJzZW50KScpICsgJyIsICcgKwogICAgICB3aXRoSWQubGVuZ3RoICsgJyBlbGVtZW50KHMpIHBvcnRlbnQgdW4gaWQuXG4nICsKICAgICAgJy0gQ2F1c2UgbGEgcGx1cyBmcmVxdWVudGUgOiBsZXMgUm93IElEIGRlIENFVFRFIHBhZ2UgbmUgc29udCBwYXMgbm9tbWVzLiAnICsKICAgICAgJ1NvdXMgV1BNTCB1bmUgdHJhZHVjdGlvbiBlc3QgdW4gcG9zdCBkaXN0aW5jdCDigJQgcmVub21tZXIgbGVzIFJvdyBJRCBkZSBsYSBwYWdlICcgKwogICAgICAnc291cmNlIG5lIHJlbm9tbWUgcGFzIGNldXggZGUgbGEgdHJhZHVjdGlvbiA6IGlsIGZhdXQgbGVzIHNhaXNpciBzdXIgY2hhcXVlIGxhbmd1ZS5cbicgKwogICAgICAnLSBQb3VyIGxhIGxpc3RlIGRlcyBpZHMgcHJlc2VudHMsIHJlY2hhcmdlciBsYSBwYWdlIGF2ZWMgP25weGRlYnVnPTEnCiAgICApOwogICAgaWYoREVCVUcpewogICAgICB2YXIgaWRzID0gW107CiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB3aXRoSWQubGVuZ3RoOyBpKyspeyBpZHMucHVzaCh3aXRoSWRbaV0uaWQpOyB9CiAgICAgIGNvbnNvbGUud2FybignW25weC1zdWJuYXZdIGlkcyBwcmVzZW50cyBzdXIgbGEgcGFnZSA6JywgaWRzKTsKICAgIH0KICB9CgogIC8qIC0tLS0gSW5pdGlhbGlzYXRpb24gZCd1bmUgaW5zdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBSZW52b2llIHRydWUgc2kgbGEgYmFycmUgYSDDqXTDqSBjb25zdHJ1aXRlLCBmYWxzZSBzJ2lsIG4neSBhdmFpdAogICAgIGF1Y3VuZSBzZWN0aW9uIChsJ2luc3RhbmNlIHJlc3RlIGFsb3JzIMOpbGlnaWJsZSDDoCB1bmUgbm91dmVsbGUKICAgICB0ZW50YXRpdmUgOiBkYXRhLW5weC1yZWFkeSBuJ2VzdCBwb3PDqSBxdSdlbiBjYXMgZGUgc3VjY8OocykuICovCiAgZnVuY3Rpb24gaW5pdChuYXYpewogICAgdmFyIGlubmVyID0gbmF2LnF1ZXJ5U2VsZWN0b3IoJy5ucHgtc3VibmF2X19pbm5lcicpOwogICAgaWYoIWlubmVyKXsKICAgICAgbmF2LnNldEF0dHJpYnV0ZSgnZGF0YS1ucHgtcmVhZHknLCAnMScpOyAvKiBiYWxpc2FnZSBpbmF0dGVuZHUgOiBuZSBwYXMgYm91Y2xlciBkZXNzdXMgKi8KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgdmFyIGxhbmcgID0gZGV0ZWN0TGFuZyhuYXYpOwogICAgdmFyIGRpY3QgID0gTEFCRUxTW2xhbmddIHx8IHt9OwogICAgdmFyIGZvdW5kID0gZGlzY292ZXIoZGljdCk7CiAgICB2YXIgZW50cmllcyA9IGZvdW5kLmVudHJpZXM7CgogICAgaWYoIWVudHJpZXMubGVuZ3RoKXsgcmV0dXJuIGZhbHNlOyB9CgogICAgbmF2LnNldEF0dHJpYnV0ZSgnZGF0YS1ucHgtcmVhZHknLCAnMScpOwogICAgbG9nKCdtb2RlID0nLCBmb3VuZC5tb2RlLCAnfCBsYW5nID0nLCBsYW5nLCAnfCBlbnRyZWVzID0nLCBlbnRyaWVzLm1hcChmdW5jdGlvbihlKXsKICAgICAgcmV0dXJuIGUua2V5ICsgJyAtPiAnICsgZS5sYWJlbCArICcgKCMnICsgZS5zZWN0aW9uLmlkICsgJyknOwogICAgfSkpOwoKICAgIGlubmVyLmlubmVySFRNTCA9ICcnOwogICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGUpewogICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgYS5ocmVmID0gJyMnICsgZS5zZWN0aW9uLmlkOwogICAgICBhLnRleHRDb250ZW50ID0gZS5sYWJlbDsKICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQoYSk7CiAgICAgIGUubGluayA9IGE7CiAgICB9KTsKICAgIG5hdi5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpOwoKICAgIC8qIC0tLS0gdi42LjQgOiBsYSBiYXJyZSB0aWVudCBzdXIgdW5lIGxpZ25lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgZmxleC13cmFwOm5vd3JhcCBzdXBwcmltZSBsYSAyZSBsaWduZS4gT24gbWVzdXJlIGV0IG9uIHJldGllbnQgbGUKICAgICAgIFBSRU1JRVIgcGFsaWVyIHF1aSByZW50cmUuIExlIHBhbGllciAwIGVzdCBsZSByZW5kdSB2LjYuMiA6IHVuZQogICAgICAgYmFycmUgcXVpIHJlbnRyYWl0IGRlamEgbmUgYm91Z2UgcGFzIGQndW4gcGl4ZWwuIFNpIG1lbWUgbGUKICAgICAgIHBsYW5jaGVyIGRlYm9yZGUgKHRlbGVwaG9uZSksIGxhIGJhcnJlIGRlZmlsZSBob3Jpem9udGFsZW1lbnQuCiAgICAgICBUb3V0IGVzdCBlbnZlbG9wcGUgOiBlbiBjYXMgZCdlcnJldXIgb24gcmV2aWVudCBhdSBwYWxpZXIgMC4gKi8KICAgIHZhciBTVEVQUyA9IFsKICAgICAgeyBmczogJzExcHgnLCAgIGxzOiAnLjEyZW0nLCBweDogJzE0cHgnLCBnYXA6ICcxMHB4JyB9LCAvKiByZW5kdSB2LjYuMiAqLwogICAgICB7IGZzOiAnMTFweCcsICAgbHM6ICcuMDllbScsIHB4OiAnMTNweCcsIGdhcDogJzlweCcgIH0sCiAgICAgIHsgZnM6ICcxMC41cHgnLCBsczogJy4wN2VtJywgcHg6ICcxMnB4JywgZ2FwOiAnOHB4JyAgfSwKICAgICAgeyBmczogJzEwcHgnLCAgIGxzOiAnLjA2ZW0nLCBweDogJzExcHgnLCBnYXA6ICc3cHgnICB9LAogICAgICB7IGZzOiAnOS41cHgnLCAgbHM6ICcuMDVlbScsIHB4OiAnMTBweCcsIGdhcDogJzZweCcgIH0sCiAgICAgIHsgZnM6ICc5cHgnLCAgICBsczogJy4wNGVtJywgcHg6ICc5cHgnLCAgZ2FwOiAnNXB4JyAgfSAgLyogcGxhbmNoZXIgKi8KICAgIF07CiAgICBmdW5jdGlvbiBhcHBseVN0ZXAocyl7CiAgICAgIHZhciBzdCA9IGlubmVyLnN0eWxlOwogICAgICBzdC5zZXRQcm9wZXJ0eSgnLS1ucHgtZnMnLCAgcy5mcyk7CiAgICAgIHN0LnNldFByb3BlcnR5KCctLW5weC1scycsICBzLmxzKTsKICAgICAgc3Quc2V0UHJvcGVydHkoJy0tbnB4LXB4JywgIHMucHgpOwogICAgICBzdC5zZXRQcm9wZXJ0eSgnLS1ucHgtZ2FwJywgcy5nYXApOwogICAgfQogICAgZnVuY3Rpb24gb3ZlcmZsb3dpbmcoKXsgcmV0dXJuIGlubmVyLnNjcm9sbFdpZHRoID4gaW5uZXIuY2xpZW50V2lkdGggKyAxOyB9CgogICAgdmFyIGZpdHRpbmcgPSBmYWxzZSwgbGFzdFcgPSAtMTsKICAgIGZ1bmN0aW9uIGZpdCgpewogICAgICBpZihmaXR0aW5nKXsgcmV0dXJuOyB9CiAgICAgIGZpdHRpbmcgPSB0cnVlOwogICAgICB0cnl7CiAgICAgICAgLyogQmFycmUgbm9uIG1lc3VyYWJsZSAobWFzcXVlZSwgb25nbGV0IHJlcGxpZSkgOiBuZSByaWVuIGNvbmNsdXJlLiAqLwogICAgICAgIGlmKGlubmVyLmNsaWVudFdpZHRoID4gNDApewogICAgICAgICAgdmFyIGksIGNob3NlbiA9IFNURVBTLmxlbmd0aCAtIDE7CiAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBTVEVQUy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIGFwcGx5U3RlcChTVEVQU1tpXSk7CiAgICAgICAgICAgIGlmKCFvdmVyZmxvd2luZygpKXsgY2hvc2VuID0gaTsgYnJlYWs7IH0KICAgICAgICAgIH0KICAgICAgICAgIGlmKGNob3NlbiAhPT0gaSl7IGFwcGx5U3RlcChTVEVQU1tjaG9zZW5dKTsgfQogICAgICAgICAgbGFzdFcgPSBuYXYuY2xpZW50V2lkdGg7CiAgICAgICAgfQogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBhcHBseVN0ZXAoU1RFUFNbMF0pOyAgLyogamFtYWlzIGRlIGJhcnJlIGNhc3NlZSAqLwogICAgICB9CiAgICAgIGZpdHRpbmcgPSBmYWxzZTsKICAgIH0KICAgIGZpdCgpOwoKICAgIC8qIExhIHBvbGljZSBkdSB0aGVtZSBhcnJpdmUgZW4gYXN5bmNocm9uZSA6IHJlbWVzdXJlciBhIHNvbiBhcnJpdmVlLiAqLwogICAgaWYoZG9jdW1lbnQuZm9udHMgJiYgZG9jdW1lbnQuZm9udHMucmVhZHkgJiYgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbil7CiAgICAgIHRyeXsgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbihmaXQsIGZpdCk7IH1jYXRjaChlcnIpe30KICAgIH0KICAgIHNldFRpbWVvdXQoZml0LCA2MDApOwogICAgc2V0VGltZW91dChmaXQsIDIwMDApOwoKICAgIC8qIExlIHBhc3NhZ2UgZW4gc3RpY2t5IGNoYW5nZSBsYSBsYXJnZXVyIHNhbnMgZXZlbmVtZW50IHJlc2l6ZS4gKi8KICAgIGlmKHdpbmRvdy5SZXNpemVPYnNlcnZlcil7CiAgICAgIHRyeXsKICAgICAgICBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24oKXsKICAgICAgICAgIGlmKG5hdi5jbGllbnRXaWR0aCAhPT0gbGFzdFcpeyBmaXQoKTsgfQogICAgICAgIH0pLm9ic2VydmUobmF2KTsKICAgICAgfWNhdGNoKGVycil7fQogICAgfQoKICAgIC8qIEVuIG1vZGUgZGVmaWxlbWVudCwgZ2FyZGVyIGxhIHBhc3RpbGxlIGFjdGl2ZSB2aXNpYmxlLiAqLwogICAgZnVuY3Rpb24gcmV2ZWFsKGxpbmspewogICAgICBpZighbGluayB8fCAhb3ZlcmZsb3dpbmcoKSl7IHJldHVybjsgfQogICAgICB2YXIgbCA9IGxpbmsub2Zmc2V0TGVmdCwgciA9IGwgKyBsaW5rLm9mZnNldFdpZHRoOwogICAgICB2YXIgdnMgPSBpbm5lci5zY3JvbGxMZWZ0LCB2ZSA9IHZzICsgaW5uZXIuY2xpZW50V2lkdGg7CiAgICAgIGlmKGwgPCB2cyl7IGlubmVyLnNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCBsIC0gMTIpOyB9CiAgICAgIGVsc2UgaWYociA+IHZlKXsgaW5uZXIuc2Nyb2xsTGVmdCA9IHIgLSBpbm5lci5jbGllbnRXaWR0aCArIDEyOyB9CiAgICB9CgogICAgZnVuY3Rpb24gdG9wT2Zmc2V0KCl7CiAgICAgIHZhciB2ID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJy0tbnB4LXRvcCcpOwogICAgICByZXR1cm4gcGFyc2VJbnQodiwgMTApIHx8IDA7CiAgICB9CiAgICAvKiBEw6lmaWxlbWVudCBhdmVjIGNvbXBlbnNhdGlvbiBkZXMgZGV1eCBtZW51cy4gKi8KICAgIGZ1bmN0aW9uIHRvdGFsT2Zmc2V0KCl7IHJldHVybiB0b3BPZmZzZXQoKSArIG5hdi5vZmZzZXRIZWlnaHQgKyA4OyB9CgogICAgLyogLS0tLSBDb2xsYWdlIDogZml4ZWQgKyBwbGFjZWhvbGRlciBhbnRpLXNhdXQgKG1vZGUgJ2pzJykgLS0tLSAqLwogICAgdmFyIHBoID0gbnVsbDsKICAgIGlmKFNUSUNLX01PREUgPT09ICdqcycpewogICAgICBwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBwaC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBuYXYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocGgsIG5hdik7CiAgICB9CiAgICBmdW5jdGlvbiBzdGljaygpewogICAgICBpZighcGgpeyByZXR1cm47IH0KICAgICAgdmFyIGFuY2hvciA9IChwaC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpID8gbmF2IDogcGg7CiAgICAgIHZhciBzaG91bGQgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIDw9IHRvcE9mZnNldCgpOwogICAgICBpZihzaG91bGQgJiYgIW5hdi5jbGFzc0xpc3QuY29udGFpbnMoJ25weC1zdHVjaycpKXsKICAgICAgICBwaC5zdHlsZS5oZWlnaHQgID0gbmF2Lm9mZnNldEhlaWdodCArICdweCc7CiAgICAgICAgcGguc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgbmF2LmNsYXNzTGlzdC5hZGQoJ25weC1zdHVjaycpOwogICAgICB9ZWxzZSBpZighc2hvdWxkICYmIG5hdi5jbGFzc0xpc3QuY29udGFpbnMoJ25weC1zdHVjaycpKXsKICAgICAgICBuYXYuY2xhc3NMaXN0LnJlbW92ZSgnbnB4LXN0dWNrJyk7CiAgICAgICAgcGguc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgfQogICAgfQoKICAgIC8qIC0tLS0gU2VjdGlvbiBhY3RpdmUgLS0tLSAqLwogICAgdmFyIGxhc3RDdXJyZW50ID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhpZ2hsaWdodCgpewogICAgICB2YXIgbGltaXQgPSB0b3RhbE9mZnNldCgpICsgNDsKICAgICAgdmFyIGN1cnJlbnQgPSBudWxsOwogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoZS5zZWN0aW9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA8PSBsaW1pdCl7IGN1cnJlbnQgPSBlOyB9CiAgICAgIH0pOwogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgICAgZS5saW5rLmNsYXNzTGlzdC50b2dnbGUoJ25weC1hY3RpdmUnLCBlID09PSBjdXJyZW50KTsKICAgICAgfSk7CiAgICAgIGlmKGN1cnJlbnQgIT09IGxhc3RDdXJyZW50KXsKICAgICAgICBsYXN0Q3VycmVudCA9IGN1cnJlbnQ7CiAgICAgICAgaWYoY3VycmVudCl7IHJldmVhbChjdXJyZW50LmxpbmspOyB9CiAgICAgIH0KICAgIH0KCiAgICAvKiAtLS0tIENsaWMgc3VyIHVuZSBlbnRyw6llIC0tLS0gKi8KICAgIHZhciBzbW9vdGggPSAhd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlczsKICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlKXsKICAgICAgZS5saW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZXYpewogICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdmFyIHkgPSBlLnNlY3Rpb24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0IC0gdG90YWxPZmZzZXQoKTsKICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IHksIGJlaGF2aW9yOiBzbW9vdGggPyAnc21vb3RoJyA6ICdhdXRvJyB9KTsKICAgICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgJyMnICsgZS5zZWN0aW9uLmlkKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBvblNjcm9sbCgpeyBzdGljaygpOyBoaWdobGlnaHQoKTsgfQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24oKXsgZml0KCk7IG9uU2Nyb2xsKCk7IH0pOwogICAgb25TY3JvbGwoKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLyogLS0tLSBBbW9yw6dhZ2UgOiB0b3V0ZXMgbGVzIGluc3RhbmNlcywgYXZlYyBxdWVscXVlcyByZWxhbmNlcyAtLS0tLS0KICAgICBMZXMgcm93cyBVbmNvZGUgcGV1dmVudCDDqnRyZSBpbmplY3TDqWVzIGFwcsOocyBsZSBET01Db250ZW50TG9hZGVkCiAgICAgKGxhenkgLyBBSkFYKSA6IG9uIHJldGVudGUgcGVuZGFudCB+Miw1IHMgYXZhbnQgZGUgY29uY2x1cmUuICovCiAgZnVuY3Rpb24gYm9vdCgpewogICAgdmFyIG5hdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubnB4LXN1Ym5hdjpub3QoW2RhdGEtbnB4LXJlYWR5XSknKTsKICAgIHZhciBwZW5kaW5nID0gMDsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuYXZzLmxlbmd0aDsgaSsrKXsKICAgICAgaWYoIWluaXQobmF2c1tpXSkpeyBwZW5kaW5nKys7IH0KICAgIH0KICAgIHJldHVybiBwZW5kaW5nOwogIH0KCiAgZnVuY3Rpb24gcnVuKCl7CiAgICBpZihib290KCkgPT09IDApeyByZXR1cm47IH0KICAgIHZhciB0cmllcyA9IDA7CiAgICB2YXIgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewogICAgICB0cmllcysrOwogICAgICB2YXIgbGFzdCA9IHRyaWVzID49IDY7IC8qIDYgeCA0MDAgbXMgKi8KICAgICAgaWYoYm9vdCgpID09PSAwIHx8IGxhc3QpewogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgIGlmKGxhc3QgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5weC1zdWJuYXY6bm90KFtkYXRhLW5weC1yZWFkeV0pJykpewogICAgICAgICAgd2Fybk5vdGhpbmdGb3VuZCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgNDAwKTsKICB9CgogIGlmKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyl7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcnVuKTsKICB9ZWxzZXsKICAgIHJ1bigpOwogIH0KfSkoKTsKPC9zY3JpcHQ+[\/vc_raw_html][\/vc_column][\/vc_row][vc_row unlock_row_content=\u00a0\u00bbyes\u00a0\u00bb row_height_percent=\u00a0\u00bb0&Prime; override_padding=\u00a0\u00bbyes\u00a0\u00bb h_padding=\u00a0\u00bb5&Prime; top_padding=\u00a0\u00bb5&Prime; bottom_padding=\u00a0\u00bb5&Prime; back_color=\u00a0\u00bbcolor-xsdn\u00a0\u00bb overlay_alpha=\u00a0\u00bb50&Prime; gutter_size=\u00a0\u00bb4&Prime; column_width_percent=\u00a0\u00bb100&Prime; shift_y=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; top_divider=\u00a0\u00bbgradient\u00a0\u00bb bottom_divider=\u00a0\u00bbgradient\u00a0\u00bb inverted_device_order=\u00a0\u00bbyes\u00a0\u00bb uncode_shortcode_id=\u00a0\u00bb304953&Prime; back_color_type=\u00a0\u00bbuncode-palette\u00a0\u00bb el_id=\u00a0\u00bbnotre-EDI-engagement-fr\u00a0\u00bb][vc_column column_width_percent=\u00a0\u00bb100&Prime; gutter_size=\u00a0\u00bb3&Prime; style=\u00a0\u00bbdark\u00a0\u00bb overlay_alpha=\u00a0\u00bb50&Prime; shift_x=\u00a0\u00bb0&Prime; shift_y=\u00a0\u00bb0&Prime; shift_y_down=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; medium_width=\u00a0\u00bb0&Prime; mobile_width=\u00a0\u00bb0&Prime; css_animation=\u00a0\u00bbalpha-anim\u00a0\u00bb animation_speed=\u00a0\u00bb1000&Prime; sticky=\u00a0\u00bbyes\u00a0\u00bb width=\u00a0\u00bb1\/4&Prime; uncode_shortcode_id=\u00a0\u00bb202619&Prime;][vc_single_image media=\u00a0\u00bb2084&Prime; media_width_percent=\u00a0\u00bb65&Prime; alignment=\u00a0\u00bbcenter\u00a0\u00bb uncode_shortcode_id=\u00a0\u00bb196096&Prime;][vc_row_inner row_inner_height_percent=\u00a0\u00bb0&Prime; overlay_alpha=\u00a0\u00bb50&Prime; gutter_size=\u00a0\u00bb4&Prime; shift_y=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; limit_content=\u00a0\u00bb\u00a0\u00bb][vc_column_inner column_width_percent=\u00a0\u00bb100&Prime; gutter_size=\u00a0\u00bb3&Prime; style=\u00a0\u00bbdark\u00a0\u00bb back_color=\u00a0\u00bbcolor-583231&Prime; overlay_alpha=\u00a0\u00bb50&Prime; radius=\u00a0\u00bbstd\u00a0\u00bb shadow=\u00a0\u00bbstd\u00a0\u00bb shift_x=\u00a0\u00bb0&Prime; shift_y=\u00a0\u00bb0&Prime; shift_y_down=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; medium_width=\u00a0\u00bb4&Prime; mobile_width=\u00a0\u00bb0&Prime; width=\u00a0\u00bb1\/1&Prime; uncode_shortcode_id=\u00a0\u00bb185916&Prime; back_color_type=\u00a0\u00bbuncode-palette\u00a0\u00bb][vc_custom_heading uncode_shortcode_id=\u00a0\u00bb141022&Prime; subheading=\u00a0\u00bbGroupe de travail sur l&apos;acc\u00e9l\u00e9rateur\u00a0\u00bb]Actions transversales[\/vc_custom_heading][\/vc_column_inner][\/vc_row_inner][\/vc_column][vc_column column_width_percent=\u00a0\u00bb100&Prime; position_vertical=\u00a0\u00bbmiddle\u00a0\u00bb gutter_size=\u00a0\u00bb3&Prime; font_family=\u00a0\u00bbfont-613363&Prime; overlay_alpha=\u00a0\u00bb50&Prime; shift_x=\u00a0\u00bb0&Prime; shift_y=\u00a0\u00bb0&Prime; shift_y_down=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; medium_width=\u00a0\u00bb0&Prime; mobile_width=\u00a0\u00bb0&Prime; css_animation=\u00a0\u00bbalpha-anim\u00a0\u00bb animation_speed=\u00a0\u00bb1000&Prime; width=\u00a0\u00bb3\/4&Prime; uncode_shortcode_id=\u00a0\u00bb484410&Prime;][vc_empty_space empty_h=\u00a0\u00bb0&Prime; el_id=\u00a0\u00bbnav-welcome\u00a0\u00bb][vc_custom_heading heading_semantic=\u00a0\u00bbh1&Prime; text_size=\u00a0\u00bbh3&Prime; uncode_shortcode_id=\u00a0\u00bb191166&Prime; el_id=\u00a0\u00bbintro-exa-atow-en\u00a0\u00bb]Bienvenue dans notre groupe de travail sur l&rsquo;IA[\/vc_custom_heading][vc_column_text text_lead=\u00a0\u00bbyes\u00a0\u00bb uncode_shortcode_id=\u00a0\u00bb803044&Prime;]<strong>Le calcul \u00e0 haute performance (HPC) est un \u00e9cosyst\u00e8me qui relie de nombreuses communaut\u00e9s scientifiques, des math\u00e9matiques et de l&rsquo;ing\u00e9nierie aux sciences exp\u00e9rimentales et \u00e0 l&rsquo;informatique. Il fournit les outils et les environnements n\u00e9cessaires pour aborder les nouvelles architectures informatiques hybrides et acc\u00e9l\u00e9r\u00e9es qui alimenteront la recherche future. Les progr\u00e8s r\u00e9cents de l&rsquo;IA changent la donne pour la science, en offrant de nouvelles fa\u00e7ons d&rsquo;analyser les donn\u00e9es et d&rsquo;am\u00e9liorer les simulations gr\u00e2ce \u00e0 une int\u00e9gration pouss\u00e9e de l&rsquo;IA et du calcul intensif. Dans ce contexte, notre programme de recherche NumPEx vise \u00e0 r\u00e9unir l&rsquo;IA et le HPC \u00e0 grande \u00e9chelle en d\u00e9veloppant des logiciels pr\u00eats pour Exascale, des m\u00e9thodes d&rsquo;analyse de donn\u00e9es bas\u00e9es sur l&rsquo;IA et des capacit\u00e9s d&rsquo;entra\u00eenement de grands mod\u00e8les. Ce faisant, NumPEx acc\u00e9l\u00e9rera l&rsquo;utilisation de l&rsquo;IA pour la science et renforcera les collaborations entre les communaut\u00e9s de recherche nationales et internationales.    <\/strong><\/p>\n<p>[\/vc_column_text][vc_column_text text_lead=\u00a0\u00bbyes\u00a0\u00bb uncode_shortcode_id=\u00a0\u00bb131918&Prime;]Le calcul de haute performance (HPC) est un \u00e9cosyst\u00e8me \u00e0 l&rsquo;intersection de vastes communaut\u00e9s. Il rel\u00e8ve les d\u00e9fis m\u00e9thodologiques, algorithmiques, logiciels et de portabilit\u00e9 pour exploiter efficacement les nouvelles architectures de calcul hybrides, h\u00e9t\u00e9rog\u00e8nes et hautement acc\u00e9l\u00e9r\u00e9es, qui seront les architectures de demain dans les centres r\u00e9gionaux et nationaux. Le calcul haute performance vise \u00e0 fournir un environnement informatique qui acc\u00e9l\u00e8re la recherche dans de nombreuses communaut\u00e9s de sciences appliqu\u00e9es et industrielles, dans des domaines tels que l&rsquo;astrophysique, la physique des hautes \u00e9nergies, le climat et l&rsquo;environnement, la biologie et la sant\u00e9 num\u00e9rique, la neuroimagerie, la chimie physique, les sciences humaines et sociales, l&rsquo;a\u00e9ronautique, la production\/transition d&rsquo;\u00e9nergie, pour n&rsquo;en citer que quelques-uns. Dans la plupart de ces domaines, le d\u00e9veloppement r\u00e9cent de l&rsquo;IA est consid\u00e9r\u00e9 comme un facteur de changement pour mieux int\u00e9grer et analyser les donn\u00e9es exp\u00e9rimentales ainsi que pour am\u00e9liorer consid\u00e9rablement les simulations num\u00e9riques gr\u00e2ce \u00e0 l&rsquo;hybridation profonde IA\/HPC, repoussant ainsi de nouvelles fronti\u00e8res afin d&rsquo;acc\u00e9l\u00e9rer la recherche. Cependant, l&rsquo;utilisation de l&rsquo;IA dans ces domaines reste souvent au niveau de la preuve du concept et n\u00e9cessite donc un bond en avant avec une mise en \u0153uvre \u00e0 l&rsquo;\u00e9chelle et une validation scientifique compl\u00e8te.    <\/p>\n<p>Les r\u00e9centes avanc\u00e9es dans le domaine de l&rsquo;IA ont montr\u00e9 que les grands ensembles de donn\u00e9es disponibles et l&rsquo;\u00e9norme puissance de calcul sont les \u00e9l\u00e9ments essentiels n\u00e9cessaires au d\u00e9veloppement de mod\u00e8les puissants et flexibles pour le traitement du langage naturel et des images. Le positionnement du calcul intensif au carrefour de divers domaines scientifiques et l&rsquo;expertise de la communaut\u00e9 dans la gestion de grandes infrastructures de calcul et de donn\u00e9es en font le terrain id\u00e9al pour d\u00e9velopper l&rsquo;utilisation novatrice de l&rsquo;IA pour la science. En effet, l&rsquo;\u00e9cosyst\u00e8me HPC rassemble des donn\u00e9es exp\u00e9rimentales et d&rsquo;observation massives, de grandes ressources de calcul et des praticiens experts, qui sont essentiels \u00e0 l&rsquo;av\u00e8nement de mod\u00e8les d&rsquo;IA puissants pour aborder des questions scientifiques complexes. De plus, l&rsquo;expertise de la communaut\u00e9 HPC dans l&rsquo;exploitation efficace de grandes infrastructures de calcul offre \u00e9galement la possibilit\u00e9 d&rsquo;am\u00e9liorer les pratiques d&rsquo;IA pour former de grands mod\u00e8les.[\/vc_column_text][vc_row_inner row_inner_height_percent=\u00a0\u00bb0&Prime; overlay_alpha=\u00a0\u00bb50&Prime; gutter_size=\u00a0\u00bb3&Prime; shift_y=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; limit_content=\u00a0\u00bb\u00a0\u00bb uncode_shortcode_id=\u00a0\u00bb144338&Prime; el_id=\u00a0\u00bbour-code-of-conduct-en\u00a0\u00bb][vc_column_inner width=\u00a0\u00bb1\/1&Prime;][vc_empty_space empty_h=\u00a0\u00bb2&Prime;][vc_separator sep_color=\u00a0\u00bbcolor-nhtu\u00a0\u00bb uncode_shortcode_id=\u00a0\u00bb794634&Prime; sep_color_type=\u00a0\u00bbuncode-palette\u00a0\u00bb][vc_empty_space empty_h=\u00a0\u00bb2&Prime; el_id=\u00a0\u00bbnav-our-actions\u00a0\u00bb][vc_custom_heading heading_semantic=\u00a0\u00bbh1&Prime; text_size=\u00a0\u00bbh3&Prime; uncode_shortcode_id=\u00a0\u00bb157537&Prime;]Nos actions[\/vc_custom_heading][\/vc_column_inner][\/vc_row_inner][vc_column_text uncode_shortcode_id=\u00a0\u00bb172883&Prime;]Dans ce contexte, l&rsquo;initiative NumPEx vise \u00e0 faire progresser l&rsquo;utilisation conjointe de l&rsquo;IA et du calcul intensif dans plusieurs directions :[\/vc_column_text][vc_accordion gutter_simple=\u00a0\u00bb0&Prime; uncode_shortcode_id=\u00a0\u00bb810290&Prime;][vc_accordion_tab gutter_size=\u00a0\u00bb2&Prime; column_padding=\u00a0\u00bb2&Prime; title=\u00a0\u00bbHybridation du calcul intensif et de l&apos;intelligence artificielle\u00a0\u00bb tab_id=\u00a0\u00bb1763469889-1-21&Prime;][vc_column_text uncode_shortcode_id=\u00a0\u00bb184117&Prime;]Avec la fin de la loi de Moore, une direction de recherche \u00e9mergente vise \u00e0 d\u00e9velopper des approches hybrides bas\u00e9es sur l&rsquo;IA pour acc\u00e9l\u00e9rer certaines parties des applications de calcul scientifique. Cette hybridation peut prendre plusieurs formes, du d\u00e9veloppement de codes de simulation incluant des mod\u00e8les d&rsquo;IA inform\u00e9s par la physique, \u00e0 l&rsquo;optimisation des temps d&rsquo;ex\u00e9cution bas\u00e9s sur des mod\u00e8les inform\u00e9s par les logs, ou \u00e0 la r\u00e9duction des donn\u00e9es d&rsquo;observation et des simulations num\u00e9riques \u00e0 l&rsquo;\u0153uvre dans les mod\u00e8les r\u00e9duits et les jumeaux num\u00e9riques. \u00c0 cette fin, NumPEx vise \u00e0 faire progresser une pile logicielle pr\u00eate pour Exascale, int\u00e9grant des solutions d&rsquo;IA qui r\u00e9pondent aux besoins des communaut\u00e9s d&rsquo;application.  <\/p>\n<h4><\/h4>\n<p>[\/vc_column_text][\/vc_accordion_tab][vc_accordion_tab gutter_size=\u00a0\u00bb2&Prime; column_padding=\u00a0\u00bb2&Prime; title=\u00a0\u00bbAnalyse des donn\u00e9es HPC\u00a0\u00bb tab_id=\u00a0\u00bb1763469889-2-44&Prime;][vc_column_text uncode_shortcode_id=\u00a0\u00bb134043&Prime;]Les donn\u00e9es massives produites par le calcul scientifique avec HPC soul\u00e8vent \u00e9galement des d\u00e9fis particuliers pour l&rsquo;application de mod\u00e8les d&rsquo;IA, car elles ne peuvent souvent pas \u00eatre stock\u00e9es et collect\u00e9es sur le syst\u00e8me de calcul. Cela n\u00e9cessite des m\u00e9thodologies d&rsquo;IA sp\u00e9cifiques, capables d&rsquo;analyser ou d&rsquo;assimiler des donn\u00e9es massives \u00e0 l&rsquo;\u00e9chelle, qu&rsquo;elles proviennent de solutions num\u00e9riques ou de donn\u00e9es d&rsquo;observation, avec des solutions bas\u00e9es sur l&rsquo;IA pour l&rsquo;analyse de donn\u00e9es in-stream et in-situ, l&rsquo;am\u00e9lioration de l&rsquo;IO, ou le checkpointing, pour n&rsquo;en citer que quelques-unes. Dans le cadre de NumPEx, les flux de travail assist\u00e9s par l&rsquo;IA seront \u00e9tudi\u00e9s pour la gestion des donn\u00e9es distribu\u00e9es et le calcul distribu\u00e9.[\/vc_column_text][\/vc_accordion_tab][vc_accordion_tab gutter_size=\u00a0\u00bb2&Prime; column_padding=\u00a0\u00bb2&Prime; title=\u00a0\u00bbL&apos;IA \u00e0 grande \u00e9chelle \u00e0 l&apos;\u00e8re Exascale et post-Exascale\u00a0\u00bb tab_id=\u00a0\u00bb1763470057815-2-8&Prime;][vc_column_text uncode_shortcode_id=\u00a0\u00bb185067&Prime;]Ces derni\u00e8res ann\u00e9es ont \u00e9t\u00e9 marqu\u00e9es par la (r)\u00e9volution tr\u00e8s rapide de mod\u00e8les extr\u00eamement volumineux, notamment de grands mod\u00e8les linguistiques ou, plus g\u00e9n\u00e9ralement, de mod\u00e8les fondamentaux tels que les mod\u00e8les de diffusion, les mod\u00e8les g\u00e9n\u00e9ratifs multimodaux, etc. Ces mod\u00e8les n\u00e9cessitent l&rsquo;utilisation intensive de superordinateurs<br \/>\net d&rsquo;\u00e9normes infrastructures de stockage de donn\u00e9es pour apprendre des mod\u00e8les comportant des milliards ou des trillions de param\u00e8tres \u00e0 partir de p\u00e9taoctets de donn\u00e9es. Cela pose des d\u00e9fis en mati\u00e8re de gestion des donn\u00e9es et de calcul sur des syst\u00e8mes de niveau Exascale, avec une utilisation massive d&rsquo;architectures acc\u00e9l\u00e9r\u00e9es h\u00e9t\u00e9rog\u00e8nes. \u00c0 cet \u00e9gard, les contributions de NumPEx \u00e0 la pile logicielle Exascale couvriront davantage les biblioth\u00e8ques de composants bas\u00e9s sur l&rsquo;IA, l&rsquo;interface entre les biblioth\u00e8ques HPC traditionnelles et les cadres standards d&rsquo;IA et d&rsquo;apprentissage automatique (par exemple PyTorch, Tensorflow, Scikit-Learn, etc.). NumPEx est la pierre angulaire de l&rsquo;\u00e9cosyst\u00e8me Exascale, entre les communaut\u00e9s d&rsquo;application, les fournisseurs HPC et la communaut\u00e9 de recherche en math\u00e9matiques appliqu\u00e9es et en informatique.[\/vc_column_text][\/vc_accordion_tab][\/vc_accordion][vc_column_text uncode_shortcode_id=\u00a0\u00bb310370&Prime;]\u00c0 cet \u00e9gard, NumPEx contribuera \u00e0 :<\/p>\n<h3><span style=\"color: #d99220;\"><strong>Acc\u00e9l\u00e9rer l&rsquo;IA pour la science<\/strong><\/span><\/h3>\n<p>NumPEx vise \u00e0 acc\u00e9l\u00e9rer la diffusion et l&rsquo;application de l&rsquo;IA \u00e0 tous les stades, en mettant fortement l&rsquo;accent sur l&rsquo;IA pour les applications scientifiques et d&rsquo;ing\u00e9nierie. \u00c0 cette fin, il aidera les communaut\u00e9s scientifiques et techniques \u00e0 acc\u00e9l\u00e9rer l&rsquo;int\u00e9gration de l&rsquo;IA \u00e0 grande \u00e9chelle gr\u00e2ce \u00e0 la co-conception centr\u00e9e sur l&rsquo;IA. Au sein des communaut\u00e9s d&rsquo;utilisateurs scientifiques et d&rsquo;ing\u00e9nierie Exascale, les utilisations de l&rsquo;IA couvrent un spectre tr\u00e8s large, allant des applications proches de la production \u00e0 faible maturit\u00e9 \u00e0 la preuve de concept \u00e0 faible maturit\u00e9, voire pas d&rsquo;utilisation du tout mais une int\u00e9gration planifi\u00e9e. Par cons\u00e9quent, NumPEx aidera davantage les communaut\u00e9s d&rsquo;utilisateurs \u00e0 int\u00e9grer des solutions bas\u00e9es sur l&rsquo;IA et \u00e0 les d\u00e9ployer sur des plateformes Exascale. \u00c0 cette fin, NumPEx s&rsquo;appuiera sur une activit\u00e9 de co-conception centr\u00e9e sur l&rsquo;IA, en se concentrant sur des cas d&rsquo;utilisation d&rsquo;applications flexibles partag\u00e9es. Comprenant des donn\u00e9es et des mesures bien d\u00e9finies d\u00e9pendant de l&rsquo;application, ces cas d&rsquo;utilisation constitueront le banc d&rsquo;essai n\u00e9cessaire pour tester et \u00e9valuer les solutions bas\u00e9es sur l&rsquo;IA d\u00e9velopp\u00e9es dans le cadre de NumPEx. Dans ce contexte, le NumPEx s&rsquo;engagera fortement dans le d\u00e9veloppement de la science ouverte (source et donn\u00e9es).      <\/p>\n<h3><span style=\"color: #d99220;\"><strong>Combler le foss\u00e9 entre les communaut\u00e9s des applications et de l&rsquo;intelligence artificielle de base<\/strong><\/span><\/h3>\n<p>L&rsquo;objectif de NumPEx est de jeter des ponts entre la communaut\u00e9 traditionnelle du calcul intensif et de l&rsquo;informatique et les principales communaut\u00e9s de l&rsquo;IA, des math\u00e9matiques appliqu\u00e9es \u00e0 la vision par ordinateur ou au traitement des signaux. \u00c0 cette fin, le NumPEx participera et organisera des \u00e9v\u00e9nements scientifiques interdisciplinaires ax\u00e9s sur l&rsquo;IA pour la science (par exemple, des programmes th\u00e9matiques \u00e0 long terme, des \u00e9coles). Le succ\u00e8s de l&rsquo;IA repose en grande partie sur les d\u00e9fis ouverts massifs 1, qui exposent les besoins des communaut\u00e9s d&rsquo;application \u00e0 un public beaucoup plus large, ce qui permet une d\u00e9couverte plus rapide. En s&rsquo;appuyant sur l&rsquo;activit\u00e9 de co-conception, NumPEx encourage les d\u00e9fis ouverts, en se concentrant sur des cas d&rsquo;utilisation d&rsquo;applications cl\u00e9s.   <\/p>\n<h3><span style=\"color: #d99220;\"><strong>Favoriser les collaborations et les initiatives au niveau national et international<\/strong><\/span><\/h3>\n<p>L&rsquo;IA est un \u00e9cosyst\u00e8me complexe et en \u00e9volution tr\u00e8s rapide, qui n\u00e9cessite des collaborations interdisciplinaires et internationales. NumPEx, \u00e0 travers son initiative internationale <a href=\"https:\/\/inpex.science\/\" target=\"_blank\" rel=\"noopener\">InPEx<\/a>, est parfaitement connect\u00e9 \u00e0 la communaut\u00e9 Exascale internationale, et plusieurs<br \/>\ndes organismes pilotes sont membres de TPC. Dans ce contexte, le NumPEx participera activement \u00e0 des projets nationaux et europ\u00e9ens centr\u00e9s sur l&rsquo;IA, en mettant l&rsquo;accent sur le d\u00e9veloppement de grands mod\u00e8les fondamentaux \u00e0 l&rsquo;\u00e9chelle pour la science. NumPEx d\u00e9veloppera et renforcera les collaborations internationales en participant \u00e0 des initiatives transnationales telles que le Trillion Parameter Consortium (TPC).[\/vc_column_text][vc_row_inner row_inner_height_percent=\u00a0\u00bb0&Prime; overlay_alpha=\u00a0\u00bb50&Prime; gutter_size=\u00a0\u00bb3&Prime; shift_y=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; limit_content=\u00a0\u00bb\u00a0\u00bb uncode_shortcode_id=\u00a0\u00bb144338&Prime; el_id=\u00a0\u00bbour-code-of-conduct-en\u00a0\u00bb][vc_column_inner width=\u00a0\u00bb1\/1&Prime;][vc_empty_space empty_h=\u00a0\u00bb2&Prime;][vc_separator sep_color=\u00a0\u00bbcolor-nhtu\u00a0\u00bb uncode_shortcode_id=\u00a0\u00bb794634&Prime; sep_color_type=\u00a0\u00bbuncode-palette\u00a0\u00bb][vc_empty_space empty_h=\u00a0\u00bb2&Prime; el_id=\u00a0\u00bbnav-contact\u00a0\u00bb][vc_custom_heading heading_semantic=\u00a0\u00bbh1&Prime; text_size=\u00a0\u00bbh3&Prime; uncode_shortcode_id=\u00a0\u00bb486342&Prime;]Contacts[\/vc_custom_heading][\/vc_column_inner][\/vc_row_inner][vc_column_text uncode_shortcode_id=\u00a0\u00bb202726&Prime;]Pour plus d&rsquo;informations sur le groupe de travail \u00ab\u00a0AI for science\u00a0\u00bb et ses activit\u00e9s, veuillez contacter <a href=\"mailto:jerome.bobin@cea.fr\">J\u00e9r\u00f4me Bobin<\/a>, <a href=\"mailto:thomas.moreau@inria.fr\">Thomas Moreau<\/a> et <a href=\"emmanuel.franck@math.unistra.fr\">Emmanuel Franck<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p>[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>[vc_row row_height_percent=\u00a0\u00bb0&Prime; overlay_alpha=\u00a0\u00bb50&Prime; gutter_size=\u00a0\u00bb3&Prime; column_width_percent=\u00a0\u00bb100&Prime; shift_y=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; sticky=\u00a0\u00bbyes\u00a0\u00bb content_parallax=\u00a0\u00bb0&Prime; uncode_shortcode_id=\u00a0\u00bb165842&Prime; css=\u00a0\u00bb.vc_custom_1785924495010{margin-top: 1% !important;}\u00a0\u00bb][vc_column width=\u00a0\u00bb1\/1&Prime;][vc_raw_html]PCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBOdW1QRXgg4oCUIE1lbnUgZGUgc2VjdGlvbnMgc3RpY2t5IOKAlCB2LjYuNAogIE5hb3MgQWdlbmN5IMK3IDIwMjYtMDktMTAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKPHN0eWxlPgogIDpyb290eyAtLW5weC10b3A6IDYwcHg7IH0gLyogaGF1dGV1ciBkdSBoZWFkZXIgVW5jb2RlIHN0aWNreSAqLwogIC5ucHgtc3VibmF2ewogICAgYmFja2dyb3VuZDogI0UwOTkwMDsgLyogb3JhbmdlIGQnYWNjZW50dWF0aW9uIE51bVBFeCAqLwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA4KTsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHotaW5kZXg6IDQwOwogIH0KICAubnB4LXN1Ym5hdltoaWRkZW5deyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KICAubnB4LXN1Ym5hdi5ucHgtc3R1Y2t7IGJvcmRlci1yYWRpdXM6IDAgMCAxMnB4IDEycHg7IH0KICAubnB4LXN1Ym5hdi5ucHgtc3R1Y2t7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IHZhcigtLW5weC10b3ApOwogICAgbGVmdDogMDsgcmlnaHQ6IDA7CiAgfQogIC5ucHgtc3VibmF2X19pbm5lcnsKICAgIC8qIHYuNi40IDogbWV0cmlxdWVzIHBpbG90ZWVzIHBhciB2YXJpYWJsZXMuIExlcyB2YWxldXJzIGRlIHJlcGxpCiAgICAgICBTT05UIGNlbGxlcyBkZSBsYSB2LjYuMiA6IHNhbnMgSlMsIHJlbmR1IGlkZW50aXF1ZS4gKi8KICAgIG1heC13aWR0aDogMTE0MHB4OwogICAgbWFyZ2luOiAwIGF1dG87CiAgICBwYWRkaW5nOiAwIDI0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDAgdmFyKC0tbnB4LWdhcCwgMTBweCk7CiAgICBtaW4taGVpZ2h0OiA0NnB4OwogICAgcGFkZGluZy10b3A6IDZweDsKICAgIHBhZGRpbmctYm90dG9tOiA2cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZm9udC1zaXplOiB2YXIoLS1ucHgtZnMsIDExcHgpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiB2YXIoLS1ucHgtbHMsIC4xMmVtKTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwogICAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOwogICAgLyogZm9udC1mYW1pbHk6ICdQb3BwaW5zJywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmOyAqLwogIH0KICAubnB4LXN1Ym5hdl9faW5uZXI6Oi13ZWJraXQtc2Nyb2xsYmFyeyBkaXNwbGF5OiBub25lOyB9CiAgLyogU3DDqWNpZmljaXTDqSByZW5mb3Jjw6llICsgIWltcG9ydGFudCA6IG5ldXRyYWxpc2UgbGVzIGNvdWxldXJzIGRlIGxpZW5zIGR1IHRow6htZSBVbmNvZGUgKG9yYW5nZSBhdSBzdXJ2b2wvY2xpYykgKi8KICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYSwKICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYTp2aXNpdGVkewogICAgY29sb3I6IHJnYmEoMjU1LDI1MCwyNDMsLjg4KSAhaW1wb3J0YW50OyAvKiBibGFuYyBjYXNzw6kgKi8KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogOHB4IHZhcigtLW5weC1weCwgMTRweCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIHRyYW5zaXRpb246IGNvbG9yIC4xOHMsIGJhY2tncm91bmQtY29sb3IgLjE4czsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7ICAvKiB2LjYuNCA6IHVuIGxpYmVsbGUgbmUgc2UgY291cGUgamFtYWlzICovCiAgICBmbGV4OiAwIDAgYXV0bzsgICAgICAgLyogdi42LjQgOiBsZXMgcGFzdGlsbGVzIG5lIHNlIGNvbXByaW1lbnQgcGFzICovCiAgfQogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmhvdmVyLAogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmZvY3VzLAogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmFjdGl2ZXsKICAgIGNvbG9yOiAjRkZGRkZGICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4xMik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKICB9CiAgbmF2Lm5weC1zdWJuYXYgLm5weC1zdWJuYXZfX2lubmVyIGEubnB4LWFjdGl2ZSwKICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYS5ucHgtYWN0aXZlOmhvdmVyewogICAgY29sb3I6ICNGRkZGRkYgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6ICNBODZGMDA7IC8qIG9yYW5nZSBmb25jw6ksIGFwbGF0IHNpbXBsZSAqLwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICB9Cjwvc3R5bGU+Cgo8bmF2IGNsYXNzPSJucHgtc3VibmF2IiBhcmlhLWxhYmVsPSJQYWdlIHNlY3Rpb25zIiBoaWRkZW4+CiAgPGRpdiBjbGFzcz0ibnB4LXN1Ym5hdl9faW5uZXIiPjwvZGl2Pgo8L25hdj4KCjxzY3JpcHQ+CihmdW5jdGlvbigpewogICd1c2Ugc3RyaWN0JzsKCiAgLyogPT09PT09PT09PT09PT09PT09PT0gQ09ORklHIFNJVEUgPT09PT09PT09PT09PT09PT09PT0KICAgICBTZXVsZSB6b25lIMOgIGFkYXB0ZXIgcG91ciByw6l1dGlsaXNlciBsZSBibG9jIGFpbGxldXJzLiAqLwogIHZhciBQUkVGSVggPSAnbmF2LSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByw6lmaXhlIGRlcyBSb3cgSUQgw6AgZMOpdGVjdGVyICovCiAgdmFyIFNUUklQICA9IFsvLShlbnxmcikkL2ksIC8tZXhhLVthLXowLTldKyQvaV07ICAgLyogc3VmZml4ZXMgZCd1bmljaXTDqSDDoCBpZ25vcmVyICAqLwoKICAvKiBSZXBsaSBwb3VyIGxlcyBwYWdlcyBQQVMgRU5DT1JFIE1JR1LDiUVTIHZlcnMgbGUgcHLDqWZpeGUgbmF2LQogICAgICh0eXBpcXVlbWVudCBsZXMgdHJhZHVjdGlvbnMgV1BNTCBkb250IGxlcyBSb3cgSUQgbidvbnQgcGFzIMOpdMOpCiAgICAgcmVub21tw6lzKS4gVXRpbGlzw6kgVU5JUVVFTUVOVCBzaSBsYSBwYWdlIG5lIGNvbnRpZW50IGF1Y3VuZSByb3cKICAgICDCqyBuYXYtIMK7LiBSZXByZW5kIGxlcyBjbMOpcyBkZSBsYSB2LjUgOiB1bmUgcm93IG5vbW3DqWUKICAgICDCqyBjb25zb3J0aXVtLWV4YS1tYS1lbiDCuyBvdSBzaW1wbGVtZW50IMKrIGNvbnNvcnRpdW0gwrsgZXN0CiAgICAgcmV0cm91dsOpZS4gTGlzdGUgZmVybcOpZSA9IGF1Y3VuIHJpc3F1ZSBkZSBmYXV4IHBvc2l0aWYuICovCiAgdmFyIExFR0FDWV9LRVlTID0gWwogICAgJ292ZXJ2aWV3JywgJ2NvbnNvcnRpdW0nLCAncmVzdWx0cycsICdtZXRyaWNzJywgJ3NvZnR3YXJlJywKICAgICduZXdzJywgJ2V2ZW50cycsICdhZ2VuZGEnLCAndGVhbScsICdjb250YWN0JwogIF07CgogIHZhciBMQUJFTFMgPSB7CiAgICAvKiBMaWJlbGzDqXMgcHLDqWbDqXLDqXMgcGFyIGNsw6kuIFRvdXRlIGNsw6kgYWJzZW50ZSBlc3QgYWZmaWNow6llCiAgICAgICBjYXBpdGFsaXPDqWUgdGVsbGUgcXVlbGxlIChuYXYtam9pbi11cyAtPiDCqyBKb2luIFVzIMK7KS4gKi8KICAgIGVuOiB7CiAgICAgICdjb25zb3J0aXVtJzogJ0NvbnNvcnRpdW0gJiBXb3JrcGFja2FnZXMnLAogICAgICAncmVzdWx0cyc6ICAgICdSZXN1bHRzICYgSW1wYWN0JywKICAgICAgJ21ldHJpY3MnOiAgICAnUHJvamVjdCBNZXRyaWNzJywKICAgICAgJ3RlYW0nOiAgICAgICAnVGhlIFRlYW0nCiAgICB9LAogICAgZnI6IHsKICAgICAgJ292ZXJ2aWV3JzogICAnUHLDqXNlbnRhdGlvbicsCiAgICAgICdjb25zb3J0aXVtJzogJ0NvbnNvcnRpdW0gZXQgbG90cyBkZSB0cmF2YWlsJywKICAgICAgJ3Jlc3VsdHMnOiAgICAnUsOpc3VsdGF0cyBldCBpbXBhY3QnLAogICAgICAnbWV0cmljcyc6ICAgICdDaGlmZnJlcyBjbMOpcycsCiAgICAgICdzb2Z0d2FyZSc6ICAgJ0xvZ2ljaWVscycsCiAgICAgICduZXdzJzogICAgICAgJ0FjdHVhbGl0w6lzJywKICAgICAgJ2V2ZW50cyc6ICAgICAnw4l2w6huZW1lbnRzJywKICAgICAgJ3RlYW0nOiAgICAgICAnTOKAmcOpcXVpcGUnCiAgICB9CiAgfTsKICB2YXIgU1RJQ0tfTU9ERSA9ICd1bmNvZGUnOyAvKiAndW5jb2RlJyA9IGxhIHJvdyBnw6hyZSBsZSBzdGlja3kgwrcgJ2pzJyA9IGxlIHNjcmlwdCBjb2xsZSBsdWktbcOqbWUgKi8KICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKICB2YXIgREVCVUcgPSAvWz8mXW5weGRlYnVnPTEvLnRlc3Qod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgZnVuY3Rpb24gbG9nKCl7CiAgICBpZighREVCVUcgfHwgIXdpbmRvdy5jb25zb2xlIHx8ICFjb25zb2xlLmxvZykgcmV0dXJuOwogICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgWydbbnB4LXN1Ym5hdl0nXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgfQoKICAvKiAtLS0tIExhbmd1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgPGh0bWwgbGFuZz4gcG9zw6kgcGFyIFdQTUwuIFJlcGxpcyBzdWNjZXNzaWZzIHNpIGwnYXR0cmlidXQgbWFucXVlIDoKICAgICB1biBhbmPDqnRyZSBwb3J0ZXVyIGRlIGxhbmcsIHB1aXMgbGVzIGNsYXNzZXMgZHUgYm9keS4gKi8KICBmdW5jdGlvbiBkZXRlY3RMYW5nKGVsKXsKICAgIHZhciB0YWcgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdsYW5nJykgfHwgJyc7CiAgICBpZighdGFnICYmIGVsICYmIGVsLmNsb3Nlc3QpewogICAgICB2YXIgaG9zdCA9IGVsLmNsb3Nlc3QoJ1tsYW5nXScpOwogICAgICBpZihob3N0KXsgdGFnID0gaG9zdC5nZXRBdHRyaWJ1dGUoJ2xhbmcnKSB8fCAnJzsgfQogICAgfQogICAgaWYoIXRhZyl7CiAgICAgIHZhciBjbHMgPSAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSkgfHwgJyc7CiAgICAgIGlmKC8oPzpsYW5nfGxhbmd1YWdlKS1mclxifGZyW18tXUZSL2kudGVzdChjbHMpKXsgdGFnID0gJ2ZyJzsgfQogICAgfQogICAgcmV0dXJuIC9eZnIvaS50ZXN0KHRhZykgPyAnZnInIDogJ2VuJzsKICB9CgogIGZ1bmN0aW9uIGtleU9mKGlkKXsKICAgIHZhciBrID0gaWQuc2xpY2UoUFJFRklYLmxlbmd0aCkudG9Mb3dlckNhc2UoKTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBTVFJJUC5sZW5ndGg7IGkrKyl7IGsgPSBrLnJlcGxhY2UoU1RSSVBbaV0sICcnKTsgfQogICAgcmV0dXJuIGs7CiAgfQogIGZ1bmN0aW9uIHRpdGxlQ2FzZShrZXkpewogICAgcmV0dXJuIGtleS5zcGxpdCgnLScpLm1hcChmdW5jdGlvbih3KXsKICAgICAgcmV0dXJuIHcgPyB3LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdy5zbGljZSgxKSA6IHc7CiAgICB9KS5qb2luKCcgJyk7CiAgfQoKICAvKiBEb3VibGUgc8OpY3VyaXTDqSA6IMOpY2FydGUgbGVzIG1lbnVzIGfDqW7DqXLDqXMgcGFyIFdvcmRQcmVzcyBldCB0b3V0IGNlCiAgICAgcXVpIHZpdCBkYW5zIGxhIG5hdmlnYXRpb24gb3UgbGUgaGVhZGVyIOKAlCBpbmNoYW5nw6kgZGVwdWlzIGxhIHYuNi4xLiAqLwogIGZ1bmN0aW9uIGlzU2VjdGlvbkNhbmRpZGF0ZShlbCl7CiAgICB2YXIgdGFnID0gZWwudGFnTmFtZTsKICAgIGlmKHRhZyA9PT0gJ1VMJyB8fCB0YWcgPT09ICdMSScgfHwgdGFnID09PSAnQScgfHwgdGFnID09PSAnTkFWJyl7IHJldHVybiBmYWxzZTsgfQogICAgaWYoZWwuY2xvc2VzdCAmJiBlbC5jbG9zZXN0KCduYXYsIGhlYWRlciwgLm5weC1zdWJuYXYnKSl7IHJldHVybiBmYWxzZTsgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBpbkRvY3VtZW50T3JkZXIoYSwgYil7CiAgICB2YXIgcG9zID0gYS5zZWN0aW9uLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIuc2VjdGlvbik7CiAgICByZXR1cm4gKHBvcyAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSA\/IC0xIDogMTsKICB9CgogIC8qIC0tLS0gRMOpY291dmVydGUgZGVzIHNlY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgMSkgTW9kZSBub21pbmFsIDogdG91dGVzIGxlcyByb3dzIGRvbnQgbCdpZCBjb21tZW5jZSBwYXIgwqsgbmF2LSDCuy4KICAgICAyKSBSZXBsaSA6IHNpIGV0IHNldWxlbWVudCBzaSBsZSBtb2RlIDEgbmUgZG9ubmUgUklFTiwgb24gY2hlcmNoZQogICAgICAgIGxlcyBjbMOpcyBow6lyaXTDqWVzIGRlIGxhIHYuNSwgYXZlYyBvdSBzYW5zIHN1ZmZpeGUuCiAgICAgUmVudm9pZSB7IGVudHJpZXM6IFsuLi5dLCBtb2RlOiAncHJlZml4JyB8ICdsZWdhY3knIHwgJ25vbmUnIH0uICovCiAgZnVuY3Rpb24gZGlzY292ZXIoZGljdCl7CiAgICB2YXIgc2VlbiA9IE9iamVjdC5jcmVhdGUobnVsbCksIGVudHJpZXMgPSBbXTsKCiAgICBmdW5jdGlvbiBwdXNoKGVsLCBrZXkpewogICAgICBpZighZWwgfHwgIWtleSB8fCBzZWVuW2tleV0peyByZXR1cm47IH0KICAgICAgc2VlbltrZXldID0gdHJ1ZTsKICAgICAgZW50cmllcy5wdXNoKHsgc2VjdGlvbjogZWwsIGtleToga2V5LCBsYWJlbDogZGljdFtrZXldIHx8IHRpdGxlQ2FzZShrZXkpIH0pOwogICAgfQoKICAgIHZhciBmb3VuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49IicgKyBQUkVGSVggKyAnIl0nKTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBmb3VuZC5sZW5ndGg7IGkrKyl7CiAgICAgIGlmKCFpc1NlY3Rpb25DYW5kaWRhdGUoZm91bmRbaV0pKXsgY29udGludWU7IH0KICAgICAgcHVzaChmb3VuZFtpXSwga2V5T2YoZm91bmRbaV0uaWQpKTsKICAgIH0KICAgIGlmKGVudHJpZXMubGVuZ3RoKXsKICAgICAgd2FybklmUGFydGlhbGx5TWlncmF0ZWQoc2Vlbik7CiAgICAgIHJldHVybiB7IGVudHJpZXM6IGVudHJpZXMsIG1vZGU6ICdwcmVmaXgnIH07CiAgICB9CgogICAgZm9yKHZhciBqID0gMDsgaiA8IExFR0FDWV9LRVlTLmxlbmd0aDsgaisrKXsKICAgICAgdmFyIGsgID0gTEVHQUNZX0tFWVNbal07CiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGspIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tpZF49IicgKyBrICsgJy0iXScpOwogICAgICBpZihlbCAmJiBpc1NlY3Rpb25DYW5kaWRhdGUoZWwpKXsgcHVzaChlbCwgayk7IH0KICAgIH0KICAgIGlmKGVudHJpZXMubGVuZ3RoKXsKICAgICAgZW50cmllcy5zb3J0KGluRG9jdW1lbnRPcmRlcik7IC8qIGxhIGxpc3RlIGRlcyBjbMOpcyBuZSBzdWl0IHBhcyBsJ29yZHJlIGRlIGxhIHBhZ2UgKi8KICAgICAgcmV0dXJuIHsgZW50cmllczogZW50cmllcywgbW9kZTogJ2xlZ2FjeScgfTsKICAgIH0KCiAgICByZXR1cm4geyBlbnRyaWVzOiBlbnRyaWVzLCBtb2RlOiAnbm9uZScgfTsKICB9CgogIC8qIC0tLS0gTWlncmF0aW9uIHBhcnRpZWxsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIENhcyBwacOoZ2UgOiBzdXIgdW5lIG3Dqm1lIHBhZ2UgY2VydGFpbmVzIHJvd3Mgb250IMOpdMOpIHJlbm9tbcOpZXMgZW4KICAgICBuYXYt4oCmIGV0IGQnYXV0cmVzIG5vbi4gTGUgbW9kZSBub21pbmFsIGwnZW1wb3J0ZSBldCBsZXMgcm93cyBub24KICAgICByZW5vbW3DqWVzIGRpc3BhcmFpc3NlbnQgU0lMRU5DSUVVU0VNRU5UIGR1IG1lbnUuIE9uIGxlIHNpZ25hbGUuICovCiAgZnVuY3Rpb24gd2FybklmUGFydGlhbGx5TWlncmF0ZWQoc2Vlbil7CiAgICBpZighd2luZG93LmNvbnNvbGUgfHwgIWNvbnNvbGUud2Fybil7IHJldHVybjsgfQogICAgdmFyIHN0cmFnZ2xlcnMgPSBbXTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBMRUdBQ1lfS0VZUy5sZW5ndGg7IGkrKyl7CiAgICAgIHZhciBrID0gTEVHQUNZX0tFWVNbaV07CiAgICAgIGlmKHNlZW5ba10peyBjb250aW51ZTsgfSAvKiBkw6lqw6AgcHLDqXNlbnQgdmlhIHVuZSByb3cgbmF2LSAqLwogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChrKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaWRePSInICsgayArICctIl0nKTsKICAgICAgaWYoZWwgJiYgaXNTZWN0aW9uQ2FuZGlkYXRlKGVsKSl7IHN0cmFnZ2xlcnMucHVzaChrICsgJyAoIycgKyBlbC5pZCArICcpJyk7IH0KICAgIH0KICAgIGlmKCFzdHJhZ2dsZXJzLmxlbmd0aCl7IHJldHVybjsgfQogICAgY29uc29sZS53YXJuKAogICAgICAnW25weC1zdWJuYXZdIE1pZ3JhdGlvbiBpbmNvbXBsZXRlIHN1ciBjZXR0ZSBwYWdlIDogJyArIHN0cmFnZ2xlcnMubGVuZ3RoICsKICAgICAgJyByb3cocykgcG9ydGVudCBlbmNvcmUgdW4gYW5jaWVuIFJvdyBJRCBldCBzb250IEFCU0VOVEVTIGR1IG1lbnUgLT4gJyArCiAgICAgIHN0cmFnZ2xlcnMuam9pbignLCAnKSArICdcbicgKwogICAgICAnTGVzIHJlbm9tbWVyIGF2ZWMgbGUgcHJlZml4ZSAiJyArIFBSRUZJWCArICciIChleC4gJyArIFBSRUZJWCArIExFR0FDWV9LRVlTWzBdICsgJykuJwogICAgKTsKICB9CgogIC8qIC0tLS0gTWVzc2FnZSBkZSBkaWFnbm9zdGljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIEludmlzaWJsZSBwb3VyIGxlcyB2aXNpdGV1cnMsIGTDqWNpc2lmIHBvdXIgbGEgcGVyc29ubmUgcXVpIHJlcHJlbmQKICAgICBsZSBkb3NzaWVyIDogb24gZGl0IGNlIHF1aSBhIMOpdMOpIGNoZXJjaMOpIGV0IGNlIHF1aSBhIMOpdMOpIHRyb3V2w6kuICovCiAgZnVuY3Rpb24gd2Fybk5vdGhpbmdGb3VuZCgpewogICAgaWYoIXdpbmRvdy5jb25zb2xlIHx8ICFjb25zb2xlLndhcm4peyByZXR1cm47IH0KICAgIHZhciB3aXRoSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyk7CiAgICBjb25zb2xlLndhcm4oCiAgICAgICdbbnB4LXN1Ym5hdl0gQXVjdW5lIHNlY3Rpb24gdHJvdXbDqWUgOiBsYSBiYXJyZSByZXN0ZSBtYXNxdcOpZS5cbicgKwogICAgICAnLSBSZWNoZXJjaMOpIGVuIHByaW9yaXTDqSA6IGRlcyBSb3cgSUQgY29tbWVuw6dhbnQgcGFyICInICsgUFJFRklYICsgJyIgKGV4LiBuYXYtb3ZlcnZpZXcpLlxuJyArCiAgICAgICctIFB1aXMsIGVuIHJlcGxpLCBsZXMgY2xlcyBoZXJpdGVlcyA6ICcgKyBMRUdBQ1lfS0VZUy5qb2luKCcsICcpICsgJy5cbicgKwogICAgICAnLSBQYWdlIGxhbmc9IicgKyAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnbGFuZycpIHx8ICcoYWJzZW50KScpICsgJyIsICcgKwogICAgICB3aXRoSWQubGVuZ3RoICsgJyBlbGVtZW50KHMpIHBvcnRlbnQgdW4gaWQuXG4nICsKICAgICAgJy0gQ2F1c2UgbGEgcGx1cyBmcmVxdWVudGUgOiBsZXMgUm93IElEIGRlIENFVFRFIHBhZ2UgbmUgc29udCBwYXMgbm9tbWVzLiAnICsKICAgICAgJ1NvdXMgV1BNTCB1bmUgdHJhZHVjdGlvbiBlc3QgdW4gcG9zdCBkaXN0aW5jdCDigJQgcmVub21tZXIgbGVzIFJvdyBJRCBkZSBsYSBwYWdlICcgKwogICAgICAnc291cmNlIG5lIHJlbm9tbWUgcGFzIGNldXggZGUgbGEgdHJhZHVjdGlvbiA6IGlsIGZhdXQgbGVzIHNhaXNpciBzdXIgY2hhcXVlIGxhbmd1ZS5cbicgKwogICAgICAnLSBQb3VyIGxhIGxpc3RlIGRlcyBpZHMgcHJlc2VudHMsIHJlY2hhcmdlciBsYSBwYWdlIGF2ZWMgP25weGRlYnVnPTEnCiAgICApOwogICAgaWYoREVCVUcpewogICAgICB2YXIgaWRzID0gW107CiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB3aXRoSWQubGVuZ3RoOyBpKyspeyBpZHMucHVzaCh3aXRoSWRbaV0uaWQpOyB9CiAgICAgIGNvbnNvbGUud2FybignW25weC1zdWJuYXZdIGlkcyBwcmVzZW50cyBzdXIgbGEgcGFnZSA6JywgaWRzKTsKICAgIH0KICB9CgogIC8qIC0tLS0gSW5pdGlhbGlzYXRpb24gZCd1bmUgaW5zdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBSZW52b2llIHRydWUgc2kgbGEgYmFycmUgYSDDqXTDqSBjb25zdHJ1aXRlLCBmYWxzZSBzJ2lsIG4neSBhdmFpdAogICAgIGF1Y3VuZSBzZWN0aW9uIChsJ2luc3RhbmNlIHJlc3RlIGFsb3JzIMOpbGlnaWJsZSDDoCB1bmUgbm91dmVsbGUKICAgICB0ZW50YXRpdmUgOiBkYXRhLW5weC1yZWFkeSBuJ2VzdCBwb3PDqSBxdSdlbiBjYXMgZGUgc3VjY8OocykuICovCiAgZnVuY3Rpb24gaW5pdChuYXYpewogICAgdmFyIGlubmVyID0gbmF2LnF1ZXJ5U2VsZWN0b3IoJy5ucHgtc3VibmF2X19pbm5lcicpOwogICAgaWYoIWlubmVyKXsKICAgICAgbmF2LnNldEF0dHJpYnV0ZSgnZGF0YS1ucHgtcmVhZHknLCAnMScpOyAvKiBiYWxpc2FnZSBpbmF0dGVuZHUgOiBuZSBwYXMgYm91Y2xlciBkZXNzdXMgKi8KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgdmFyIGxhbmcgID0gZGV0ZWN0TGFuZyhuYXYpOwogICAgdmFyIGRpY3QgID0gTEFCRUxTW2xhbmddIHx8IHt9OwogICAgdmFyIGZvdW5kID0gZGlzY292ZXIoZGljdCk7CiAgICB2YXIgZW50cmllcyA9IGZvdW5kLmVudHJpZXM7CgogICAgaWYoIWVudHJpZXMubGVuZ3RoKXsgcmV0dXJuIGZhbHNlOyB9CgogICAgbmF2LnNldEF0dHJpYnV0ZSgnZGF0YS1ucHgtcmVhZHknLCAnMScpOwogICAgbG9nKCdtb2RlID0nLCBmb3VuZC5tb2RlLCAnfCBsYW5nID0nLCBsYW5nLCAnfCBlbnRyZWVzID0nLCBlbnRyaWVzLm1hcChmdW5jdGlvbihlKXsKICAgICAgcmV0dXJuIGUua2V5ICsgJyAtPiAnICsgZS5sYWJlbCArICcgKCMnICsgZS5zZWN0aW9uLmlkICsgJyknOwogICAgfSkpOwoKICAgIGlubmVyLmlubmVySFRNTCA9ICcnOwogICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGUpewogICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgYS5ocmVmID0gJyMnICsgZS5zZWN0aW9uLmlkOwogICAgICBhLnRleHRDb250ZW50ID0gZS5sYWJlbDsKICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQoYSk7CiAgICAgIGUubGluayA9IGE7CiAgICB9KTsKICAgIG5hdi5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpOwoKICAgIC8qIC0tLS0gdi42LjQgOiBsYSBiYXJyZSB0aWVudCBzdXIgdW5lIGxpZ25lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgZmxleC13cmFwOm5vd3JhcCBzdXBwcmltZSBsYSAyZSBsaWduZS4gT24gbWVzdXJlIGV0IG9uIHJldGllbnQgbGUKICAgICAgIFBSRU1JRVIgcGFsaWVyIHF1aSByZW50cmUuIExlIHBhbGllciAwIGVzdCBsZSByZW5kdSB2LjYuMiA6IHVuZQogICAgICAgYmFycmUgcXVpIHJlbnRyYWl0IGRlamEgbmUgYm91Z2UgcGFzIGQndW4gcGl4ZWwuIFNpIG1lbWUgbGUKICAgICAgIHBsYW5jaGVyIGRlYm9yZGUgKHRlbGVwaG9uZSksIGxhIGJhcnJlIGRlZmlsZSBob3Jpem9udGFsZW1lbnQuCiAgICAgICBUb3V0IGVzdCBlbnZlbG9wcGUgOiBlbiBjYXMgZCdlcnJldXIgb24gcmV2aWVudCBhdSBwYWxpZXIgMC4gKi8KICAgIHZhciBTVEVQUyA9IFsKICAgICAgeyBmczogJzExcHgnLCAgIGxzOiAnLjEyZW0nLCBweDogJzE0cHgnLCBnYXA6ICcxMHB4JyB9LCAvKiByZW5kdSB2LjYuMiAqLwogICAgICB7IGZzOiAnMTFweCcsICAgbHM6ICcuMDllbScsIHB4OiAnMTNweCcsIGdhcDogJzlweCcgIH0sCiAgICAgIHsgZnM6ICcxMC41cHgnLCBsczogJy4wN2VtJywgcHg6ICcxMnB4JywgZ2FwOiAnOHB4JyAgfSwKICAgICAgeyBmczogJzEwcHgnLCAgIGxzOiAnLjA2ZW0nLCBweDogJzExcHgnLCBnYXA6ICc3cHgnICB9LAogICAgICB7IGZzOiAnOS41cHgnLCAgbHM6ICcuMDVlbScsIHB4OiAnMTBweCcsIGdhcDogJzZweCcgIH0sCiAgICAgIHsgZnM6ICc5cHgnLCAgICBsczogJy4wNGVtJywgcHg6ICc5cHgnLCAgZ2FwOiAnNXB4JyAgfSAgLyogcGxhbmNoZXIgKi8KICAgIF07CiAgICBmdW5jdGlvbiBhcHBseVN0ZXAocyl7CiAgICAgIHZhciBzdCA9IGlubmVyLnN0eWxlOwogICAgICBzdC5zZXRQcm9wZXJ0eSgnLS1ucHgtZnMnLCAgcy5mcyk7CiAgICAgIHN0LnNldFByb3BlcnR5KCctLW5weC1scycsICBzLmxzKTsKICAgICAgc3Quc2V0UHJvcGVydHkoJy0tbnB4LXB4JywgIHMucHgpOwogICAgICBzdC5zZXRQcm9wZXJ0eSgnLS1ucHgtZ2FwJywgcy5nYXApOwogICAgfQogICAgZnVuY3Rpb24gb3ZlcmZsb3dpbmcoKXsgcmV0dXJuIGlubmVyLnNjcm9sbFdpZHRoID4gaW5uZXIuY2xpZW50V2lkdGggKyAxOyB9CgogICAgdmFyIGZpdHRpbmcgPSBmYWxzZSwgbGFzdFcgPSAtMTsKICAgIGZ1bmN0aW9uIGZpdCgpewogICAgICBpZihmaXR0aW5nKXsgcmV0dXJuOyB9CiAgICAgIGZpdHRpbmcgPSB0cnVlOwogICAgICB0cnl7CiAgICAgICAgLyogQmFycmUgbm9uIG1lc3VyYWJsZSAobWFzcXVlZSwgb25nbGV0IHJlcGxpZSkgOiBuZSByaWVuIGNvbmNsdXJlLiAqLwogICAgICAgIGlmKGlubmVyLmNsaWVudFdpZHRoID4gNDApewogICAgICAgICAgdmFyIGksIGNob3NlbiA9IFNURVBTLmxlbmd0aCAtIDE7CiAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBTVEVQUy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIGFwcGx5U3RlcChTVEVQU1tpXSk7CiAgICAgICAgICAgIGlmKCFvdmVyZmxvd2luZygpKXsgY2hvc2VuID0gaTsgYnJlYWs7IH0KICAgICAgICAgIH0KICAgICAgICAgIGlmKGNob3NlbiAhPT0gaSl7IGFwcGx5U3RlcChTVEVQU1tjaG9zZW5dKTsgfQogICAgICAgICAgbGFzdFcgPSBuYXYuY2xpZW50V2lkdGg7CiAgICAgICAgfQogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBhcHBseVN0ZXAoU1RFUFNbMF0pOyAgLyogamFtYWlzIGRlIGJhcnJlIGNhc3NlZSAqLwogICAgICB9CiAgICAgIGZpdHRpbmcgPSBmYWxzZTsKICAgIH0KICAgIGZpdCgpOwoKICAgIC8qIExhIHBvbGljZSBkdSB0aGVtZSBhcnJpdmUgZW4gYXN5bmNocm9uZSA6IHJlbWVzdXJlciBhIHNvbiBhcnJpdmVlLiAqLwogICAgaWYoZG9jdW1lbnQuZm9udHMgJiYgZG9jdW1lbnQuZm9udHMucmVhZHkgJiYgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbil7CiAgICAgIHRyeXsgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbihmaXQsIGZpdCk7IH1jYXRjaChlcnIpe30KICAgIH0KICAgIHNldFRpbWVvdXQoZml0LCA2MDApOwogICAgc2V0VGltZW91dChmaXQsIDIwMDApOwoKICAgIC8qIExlIHBhc3NhZ2UgZW4gc3RpY2t5IGNoYW5nZSBsYSBsYXJnZXVyIHNhbnMgZXZlbmVtZW50IHJlc2l6ZS4gKi8KICAgIGlmKHdpbmRvdy5SZXNpemVPYnNlcnZlcil7CiAgICAgIHRyeXsKICAgICAgICBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24oKXsKICAgICAgICAgIGlmKG5hdi5jbGllbnRXaWR0aCAhPT0gbGFzdFcpeyBmaXQoKTsgfQogICAgICAgIH0pLm9ic2VydmUobmF2KTsKICAgICAgfWNhdGNoKGVycil7fQogICAgfQoKICAgIC8qIEVuIG1vZGUgZGVmaWxlbWVudCwgZ2FyZGVyIGxhIHBhc3RpbGxlIGFjdGl2ZSB2aXNpYmxlLiAqLwogICAgZnVuY3Rpb24gcmV2ZWFsKGxpbmspewogICAgICBpZighbGluayB8fCAhb3ZlcmZsb3dpbmcoKSl7IHJldHVybjsgfQogICAgICB2YXIgbCA9IGxpbmsub2Zmc2V0TGVmdCwgciA9IGwgKyBsaW5rLm9mZnNldFdpZHRoOwogICAgICB2YXIgdnMgPSBpbm5lci5zY3JvbGxMZWZ0LCB2ZSA9IHZzICsgaW5uZXIuY2xpZW50V2lkdGg7CiAgICAgIGlmKGwgPCB2cyl7IGlubmVyLnNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCBsIC0gMTIpOyB9CiAgICAgIGVsc2UgaWYociA+IHZlKXsgaW5uZXIuc2Nyb2xsTGVmdCA9IHIgLSBpbm5lci5jbGllbnRXaWR0aCArIDEyOyB9CiAgICB9CgogICAgZnVuY3Rpb24gdG9wT2Zmc2V0KCl7CiAgICAgIHZhciB2ID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJy0tbnB4LXRvcCcpOwogICAgICByZXR1cm4gcGFyc2VJbnQodiwgMTApIHx8IDA7CiAgICB9CiAgICAvKiBEw6lmaWxlbWVudCBhdmVjIGNvbXBlbnNhdGlvbiBkZXMgZGV1eCBtZW51cy4gKi8KICAgIGZ1bmN0aW9uIHRvdGFsT2Zmc2V0KCl7IHJldHVybiB0b3BPZmZzZXQoKSArIG5hdi5vZmZzZXRIZWlnaHQgKyA4OyB9CgogICAgLyogLS0tLSBDb2xsYWdlIDogZml4ZWQgKyBwbGFjZWhvbGRlciBhbnRpLXNhdXQgKG1vZGUgJ2pzJykgLS0tLSAqLwogICAgdmFyIHBoID0gbnVsbDsKICAgIGlmKFNUSUNLX01PREUgPT09ICdqcycpewogICAgICBwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBwaC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBuYXYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocGgsIG5hdik7CiAgICB9CiAgICBmdW5jdGlvbiBzdGljaygpewogICAgICBpZighcGgpeyByZXR1cm47IH0KICAgICAgdmFyIGFuY2hvciA9IChwaC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpID8gbmF2IDogcGg7CiAgICAgIHZhciBzaG91bGQgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIDw9IHRvcE9mZnNldCgpOwogICAgICBpZihzaG91bGQgJiYgIW5hdi5jbGFzc0xpc3QuY29udGFpbnMoJ25weC1zdHVjaycpKXsKICAgICAgICBwaC5zdHlsZS5oZWlnaHQgID0gbmF2Lm9mZnNldEhlaWdodCArICdweCc7CiAgICAgICAgcGguc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgbmF2LmNsYXNzTGlzdC5hZGQoJ25weC1zdHVjaycpOwogICAgICB9ZWxzZSBpZighc2hvdWxkICYmIG5hdi5jbGFzc0xpc3QuY29udGFpbnMoJ25weC1zdHVjaycpKXsKICAgICAgICBuYXYuY2xhc3NMaXN0LnJlbW92ZSgnbnB4LXN0dWNrJyk7CiAgICAgICAgcGguc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgfQogICAgfQoKICAgIC8qIC0tLS0gU2VjdGlvbiBhY3RpdmUgLS0tLSAqLwogICAgdmFyIGxhc3RDdXJyZW50ID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhpZ2hsaWdodCgpewogICAgICB2YXIgbGltaXQgPSB0b3RhbE9mZnNldCgpICsgNDsKICAgICAgdmFyIGN1cnJlbnQgPSBudWxsOwogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoZS5zZWN0aW9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA8PSBsaW1pdCl7IGN1cnJlbnQgPSBlOyB9CiAgICAgIH0pOwogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgICAgZS5saW5rLmNsYXNzTGlzdC50b2dnbGUoJ25weC1hY3RpdmUnLCBlID09PSBjdXJyZW50KTsKICAgICAgfSk7CiAgICAgIGlmKGN1cnJlbnQgIT09IGxhc3RDdXJyZW50KXsKICAgICAgICBsYXN0Q3VycmVudCA9IGN1cnJlbnQ7CiAgICAgICAgaWYoY3VycmVudCl7IHJldmVhbChjdXJyZW50LmxpbmspOyB9CiAgICAgIH0KICAgIH0KCiAgICAvKiAtLS0tIENsaWMgc3VyIHVuZSBlbnRyw6llIC0tLS0gKi8KICAgIHZhciBzbW9vdGggPSAhd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlczsKICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlKXsKICAgICAgZS5saW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZXYpewogICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdmFyIHkgPSBlLnNlY3Rpb24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0IC0gdG90YWxPZmZzZXQoKTsKICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IHksIGJlaGF2aW9yOiBzbW9vdGggPyAnc21vb3RoJyA6ICdhdXRvJyB9KTsKICAgICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgJyMnICsgZS5zZWN0aW9uLmlkKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBvblNjcm9sbCgpeyBzdGljaygpOyBoaWdobGlnaHQoKTsgfQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24oKXsgZml0KCk7IG9uU2Nyb2xsKCk7IH0pOwogICAgb25TY3JvbGwoKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLyogLS0tLSBBbW9yw6dhZ2UgOiB0b3V0ZXMgbGVzIGluc3RhbmNlcywgYXZlYyBxdWVscXVlcyByZWxhbmNlcyAtLS0tLS0KICAgICBMZXMgcm93cyBVbmNvZGUgcGV1dmVudCDDqnRyZSBpbmplY3TDqWVzIGFwcsOocyBsZSBET01Db250ZW50TG9hZGVkCiAgICAgKGxhenkgLyBBSkFYKSA6IG9uIHJldGVudGUgcGVuZGFudCB+Miw1IHMgYXZhbnQgZGUgY29uY2x1cmUuICovCiAgZnVuY3Rpb24gYm9vdCgpewogICAgdmFyIG5hdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubnB4LXN1Ym5hdjpub3QoW2RhdGEtbnB4LXJlYWR5XSknKTsKICAgIHZhciBwZW5kaW5nID0gMDsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuYXZzLmxlbmd0aDsgaSsrKXsKICAgICAgaWYoIWluaXQobmF2c1tpXSkpeyBwZW5kaW5nKys7IH0KICAgIH0KICAgIHJldHVybiBwZW5kaW5nOwogIH0KCiAgZnVuY3Rpb24gcnVuKCl7CiAgICBpZihib290KCkgPT09IDApeyByZXR1cm47IH0KICAgIHZhciB0cmllcyA9IDA7CiAgICB2YXIgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewogICAgICB0cmllcysrOwogICAgICB2YXIgbGFzdCA9IHRyaWVzID49IDY7IC8qIDYgeCA0MDAgbXMgKi8KICAgICAgaWYoYm9vdCgpID09PSAwIHx8IGxhc3QpewogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgIGlmKGxhc3QgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5weC1zdWJuYXY6bm90KFtkYXRhLW5weC1yZWFkeV0pJykpewogICAgICAgICAgd2Fybk5vdGhpbmdGb3VuZCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgNDAwKTsKICB9CgogIGlmKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyl7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcnVuKTsKICB9ZWxzZXsKICAgIHJ1bigpOwogIH0KfSkoKTsKPC9zY3JpcHQ+[\/vc_raw_html][\/vc_column][\/vc_row][vc_row unlock_row_content=\u00a0\u00bbyes\u00a0\u00bb row_height_percent=\u00a0\u00bb0&Prime; override_padding=\u00a0\u00bbyes\u00a0\u00bb h_padding=\u00a0\u00bb5&Prime; top_padding=\u00a0\u00bb5&Prime; bottom_padding=\u00a0\u00bb5&Prime; [&hellip;]<\/p>\n","protected":false},"author":14,"featured_media":205,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"iawp_total_views":38,"footnotes":"","_members_access_role":[],"_members_access_error":""},"class_list":["post-2416","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>L&#039;IA au service de la science - NumPEx<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"L&#039;IA au service de la science - NumPEx\" \/>\n<meta property=\"og:description\" content=\"[vc_row row_height_percent=\u00a0\u00bb0&Prime; overlay_alpha=\u00a0\u00bb50&Prime; gutter_size=\u00a0\u00bb3&Prime; column_width_percent=\u00a0\u00bb100&Prime; shift_y=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; sticky=\u00a0\u00bbyes\u00a0\u00bb content_parallax=\u00a0\u00bb0&Prime; uncode_shortcode_id=\u00a0\u00bb165842&Prime; css=\u00a0\u00bb.vc_custom_1785924495010{margin-top: 1% !important;}\u00a0\u00bb][vc_column width=\u00a0\u00bb1\/1&Prime;][vc_raw_html]PCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBOdW1QRXgg4oCUIE1lbnUgZGUgc2VjdGlvbnMgc3RpY2t5IOKAlCB2LjYuNAogIE5hb3MgQWdlbmN5IMK3IDIwMjYtMDktMTAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKPHN0eWxlPgogIDpyb290eyAtLW5weC10b3A6IDYwcHg7IH0gLyogaGF1dGV1ciBkdSBoZWFkZXIgVW5jb2RlIHN0aWNreSAqLwogIC5ucHgtc3VibmF2ewogICAgYmFja2dyb3VuZDogI0UwOTkwMDsgLyogb3JhbmdlIGQnYWNjZW50dWF0aW9uIE51bVBFeCAqLwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA4KTsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHotaW5kZXg6IDQwOwogIH0KICAubnB4LXN1Ym5hdltoaWRkZW5deyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KICAubnB4LXN1Ym5hdi5ucHgtc3R1Y2t7IGJvcmRlci1yYWRpdXM6IDAgMCAxMnB4IDEycHg7IH0KICAubnB4LXN1Ym5hdi5ucHgtc3R1Y2t7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IHZhcigtLW5weC10b3ApOwogICAgbGVmdDogMDsgcmlnaHQ6IDA7CiAgfQogIC5ucHgtc3VibmF2X19pbm5lcnsKICAgIC8qIHYuNi40IDogbWV0cmlxdWVzIHBpbG90ZWVzIHBhciB2YXJpYWJsZXMuIExlcyB2YWxldXJzIGRlIHJlcGxpCiAgICAgICBTT05UIGNlbGxlcyBkZSBsYSB2LjYuMiA6IHNhbnMgSlMsIHJlbmR1IGlkZW50aXF1ZS4gKi8KICAgIG1heC13aWR0aDogMTE0MHB4OwogICAgbWFyZ2luOiAwIGF1dG87CiAgICBwYWRkaW5nOiAwIDI0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDAgdmFyKC0tbnB4LWdhcCwgMTBweCk7CiAgICBtaW4taGVpZ2h0OiA0NnB4OwogICAgcGFkZGluZy10b3A6IDZweDsKICAgIHBhZGRpbmctYm90dG9tOiA2cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZm9udC1zaXplOiB2YXIoLS1ucHgtZnMsIDExcHgpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiB2YXIoLS1ucHgtbHMsIC4xMmVtKTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwogICAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOwogICAgLyogZm9udC1mYW1pbHk6ICdQb3BwaW5zJywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmOyAqLwogIH0KICAubnB4LXN1Ym5hdl9faW5uZXI6Oi13ZWJraXQtc2Nyb2xsYmFyeyBkaXNwbGF5OiBub25lOyB9CiAgLyogU3DDqWNpZmljaXTDqSByZW5mb3Jjw6llICsgIWltcG9ydGFudCA6IG5ldXRyYWxpc2UgbGVzIGNvdWxldXJzIGRlIGxpZW5zIGR1IHRow6htZSBVbmNvZGUgKG9yYW5nZSBhdSBzdXJ2b2wvY2xpYykgKi8KICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYSwKICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYTp2aXNpdGVkewogICAgY29sb3I6IHJnYmEoMjU1LDI1MCwyNDMsLjg4KSAhaW1wb3J0YW50OyAvKiBibGFuYyBjYXNzw6kgKi8KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogOHB4IHZhcigtLW5weC1weCwgMTRweCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIHRyYW5zaXRpb246IGNvbG9yIC4xOHMsIGJhY2tncm91bmQtY29sb3IgLjE4czsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7ICAvKiB2LjYuNCA6IHVuIGxpYmVsbGUgbmUgc2UgY291cGUgamFtYWlzICovCiAgICBmbGV4OiAwIDAgYXV0bzsgICAgICAgLyogdi42LjQgOiBsZXMgcGFzdGlsbGVzIG5lIHNlIGNvbXByaW1lbnQgcGFzICovCiAgfQogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmhvdmVyLAogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmZvY3VzLAogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmFjdGl2ZXsKICAgIGNvbG9yOiAjRkZGRkZGICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4xMik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKICB9CiAgbmF2Lm5weC1zdWJuYXYgLm5weC1zdWJuYXZfX2lubmVyIGEubnB4LWFjdGl2ZSwKICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYS5ucHgtYWN0aXZlOmhvdmVyewogICAgY29sb3I6ICNGRkZGRkYgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6ICNBODZGMDA7IC8qIG9yYW5nZSBmb25jw6ksIGFwbGF0IHNpbXBsZSAqLwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICB9Cjwvc3R5bGU+Cgo8bmF2IGNsYXNzPSJucHgtc3VibmF2IiBhcmlhLWxhYmVsPSJQYWdlIHNlY3Rpb25zIiBoaWRkZW4+CiAgPGRpdiBjbGFzcz0ibnB4LXN1Ym5hdl9faW5uZXIiPjwvZGl2Pgo8L25hdj4KCjxzY3JpcHQ+CihmdW5jdGlvbigpewogICd1c2Ugc3RyaWN0JzsKCiAgLyogPT09PT09PT09PT09PT09PT09PT0gQ09ORklHIFNJVEUgPT09PT09PT09PT09PT09PT09PT0KICAgICBTZXVsZSB6b25lIMOgIGFkYXB0ZXIgcG91ciByw6l1dGlsaXNlciBsZSBibG9jIGFpbGxldXJzLiAqLwogIHZhciBQUkVGSVggPSAnbmF2LSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByw6lmaXhlIGRlcyBSb3cgSUQgw6AgZMOpdGVjdGVyICovCiAgdmFyIFNUUklQICA9IFsvLShlbnxmcikkL2ksIC8tZXhhLVthLXowLTldKyQvaV07ICAgLyogc3VmZml4ZXMgZCd1bmljaXTDqSDDoCBpZ25vcmVyICAqLwoKICAvKiBSZXBsaSBwb3VyIGxlcyBwYWdlcyBQQVMgRU5DT1JFIE1JR1LDiUVTIHZlcnMgbGUgcHLDqWZpeGUgbmF2LQogICAgICh0eXBpcXVlbWVudCBsZXMgdHJhZHVjdGlvbnMgV1BNTCBkb250IGxlcyBSb3cgSUQgbidvbnQgcGFzIMOpdMOpCiAgICAgcmVub21tw6lzKS4gVXRpbGlzw6kgVU5JUVVFTUVOVCBzaSBsYSBwYWdlIG5lIGNvbnRpZW50IGF1Y3VuZSByb3cKICAgICDCqyBuYXYtIMK7LiBSZXByZW5kIGxlcyBjbMOpcyBkZSBsYSB2LjUgOiB1bmUgcm93IG5vbW3DqWUKICAgICDCqyBjb25zb3J0aXVtLWV4YS1tYS1lbiDCuyBvdSBzaW1wbGVtZW50IMKrIGNvbnNvcnRpdW0gwrsgZXN0CiAgICAgcmV0cm91dsOpZS4gTGlzdGUgZmVybcOpZSA9IGF1Y3VuIHJpc3F1ZSBkZSBmYXV4IHBvc2l0aWYuICovCiAgdmFyIExFR0FDWV9LRVlTID0gWwogICAgJ292ZXJ2aWV3JywgJ2NvbnNvcnRpdW0nLCAncmVzdWx0cycsICdtZXRyaWNzJywgJ3NvZnR3YXJlJywKICAgICduZXdzJywgJ2V2ZW50cycsICdhZ2VuZGEnLCAndGVhbScsICdjb250YWN0JwogIF07CgogIHZhciBMQUJFTFMgPSB7CiAgICAvKiBMaWJlbGzDqXMgcHLDqWbDqXLDqXMgcGFyIGNsw6kuIFRvdXRlIGNsw6kgYWJzZW50ZSBlc3QgYWZmaWNow6llCiAgICAgICBjYXBpdGFsaXPDqWUgdGVsbGUgcXVlbGxlIChuYXYtam9pbi11cyAtPiDCqyBKb2luIFVzIMK7KS4gKi8KICAgIGVuOiB7CiAgICAgICdjb25zb3J0aXVtJzogJ0NvbnNvcnRpdW0gJiBXb3JrcGFja2FnZXMnLAogICAgICAncmVzdWx0cyc6ICAgICdSZXN1bHRzICYgSW1wYWN0JywKICAgICAgJ21ldHJpY3MnOiAgICAnUHJvamVjdCBNZXRyaWNzJywKICAgICAgJ3RlYW0nOiAgICAgICAnVGhlIFRlYW0nCiAgICB9LAogICAgZnI6IHsKICAgICAgJ292ZXJ2aWV3JzogICAnUHLDqXNlbnRhdGlvbicsCiAgICAgICdjb25zb3J0aXVtJzogJ0NvbnNvcnRpdW0gZXQgbG90cyBkZSB0cmF2YWlsJywKICAgICAgJ3Jlc3VsdHMnOiAgICAnUsOpc3VsdGF0cyBldCBpbXBhY3QnLAogICAgICAnbWV0cmljcyc6ICAgICdDaGlmZnJlcyBjbMOpcycsCiAgICAgICdzb2Z0d2FyZSc6ICAgJ0xvZ2ljaWVscycsCiAgICAgICduZXdzJzogICAgICAgJ0FjdHVhbGl0w6lzJywKICAgICAgJ2V2ZW50cyc6ICAgICAnw4l2w6huZW1lbnRzJywKICAgICAgJ3RlYW0nOiAgICAgICAnTOKAmcOpcXVpcGUnCiAgICB9CiAgfTsKICB2YXIgU1RJQ0tfTU9ERSA9ICd1bmNvZGUnOyAvKiAndW5jb2RlJyA9IGxhIHJvdyBnw6hyZSBsZSBzdGlja3kgwrcgJ2pzJyA9IGxlIHNjcmlwdCBjb2xsZSBsdWktbcOqbWUgKi8KICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKICB2YXIgREVCVUcgPSAvWz8mXW5weGRlYnVnPTEvLnRlc3Qod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgZnVuY3Rpb24gbG9nKCl7CiAgICBpZighREVCVUcgfHwgIXdpbmRvdy5jb25zb2xlIHx8ICFjb25zb2xlLmxvZykgcmV0dXJuOwogICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgWydbbnB4LXN1Ym5hdl0nXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgfQoKICAvKiAtLS0tIExhbmd1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgPGh0bWwgbGFuZz4gcG9zw6kgcGFyIFdQTUwuIFJlcGxpcyBzdWNjZXNzaWZzIHNpIGwnYXR0cmlidXQgbWFucXVlIDoKICAgICB1biBhbmPDqnRyZSBwb3J0ZXVyIGRlIGxhbmcsIHB1aXMgbGVzIGNsYXNzZXMgZHUgYm9keS4gKi8KICBmdW5jdGlvbiBkZXRlY3RMYW5nKGVsKXsKICAgIHZhciB0YWcgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdsYW5nJykgfHwgJyc7CiAgICBpZighdGFnICYmIGVsICYmIGVsLmNsb3Nlc3QpewogICAgICB2YXIgaG9zdCA9IGVsLmNsb3Nlc3QoJ1tsYW5nXScpOwogICAgICBpZihob3N0KXsgdGFnID0gaG9zdC5nZXRBdHRyaWJ1dGUoJ2xhbmcnKSB8fCAnJzsgfQogICAgfQogICAgaWYoIXRhZyl7CiAgICAgIHZhciBjbHMgPSAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSkgfHwgJyc7CiAgICAgIGlmKC8oPzpsYW5nfGxhbmd1YWdlKS1mclxifGZyW18tXUZSL2kudGVzdChjbHMpKXsgdGFnID0gJ2ZyJzsgfQogICAgfQogICAgcmV0dXJuIC9eZnIvaS50ZXN0KHRhZykgPyAnZnInIDogJ2VuJzsKICB9CgogIGZ1bmN0aW9uIGtleU9mKGlkKXsKICAgIHZhciBrID0gaWQuc2xpY2UoUFJFRklYLmxlbmd0aCkudG9Mb3dlckNhc2UoKTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBTVFJJUC5sZW5ndGg7IGkrKyl7IGsgPSBrLnJlcGxhY2UoU1RSSVBbaV0sICcnKTsgfQogICAgcmV0dXJuIGs7CiAgfQogIGZ1bmN0aW9uIHRpdGxlQ2FzZShrZXkpewogICAgcmV0dXJuIGtleS5zcGxpdCgnLScpLm1hcChmdW5jdGlvbih3KXsKICAgICAgcmV0dXJuIHcgPyB3LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdy5zbGljZSgxKSA6IHc7CiAgICB9KS5qb2luKCcgJyk7CiAgfQoKICAvKiBEb3VibGUgc8OpY3VyaXTDqSA6IMOpY2FydGUgbGVzIG1lbnVzIGfDqW7DqXLDqXMgcGFyIFdvcmRQcmVzcyBldCB0b3V0IGNlCiAgICAgcXVpIHZpdCBkYW5zIGxhIG5hdmlnYXRpb24gb3UgbGUgaGVhZGVyIOKAlCBpbmNoYW5nw6kgZGVwdWlzIGxhIHYuNi4xLiAqLwogIGZ1bmN0aW9uIGlzU2VjdGlvbkNhbmRpZGF0ZShlbCl7CiAgICB2YXIgdGFnID0gZWwudGFnTmFtZTsKICAgIGlmKHRhZyA9PT0gJ1VMJyB8fCB0YWcgPT09ICdMSScgfHwgdGFnID09PSAnQScgfHwgdGFnID09PSAnTkFWJyl7IHJldHVybiBmYWxzZTsgfQogICAgaWYoZWwuY2xvc2VzdCAmJiBlbC5jbG9zZXN0KCduYXYsIGhlYWRlciwgLm5weC1zdWJuYXYnKSl7IHJldHVybiBmYWxzZTsgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBpbkRvY3VtZW50T3JkZXIoYSwgYil7CiAgICB2YXIgcG9zID0gYS5zZWN0aW9uLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIuc2VjdGlvbik7CiAgICByZXR1cm4gKHBvcyAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSA\/IC0xIDogMTsKICB9CgogIC8qIC0tLS0gRMOpY291dmVydGUgZGVzIHNlY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgMSkgTW9kZSBub21pbmFsIDogdG91dGVzIGxlcyByb3dzIGRvbnQgbCdpZCBjb21tZW5jZSBwYXIgwqsgbmF2LSDCuy4KICAgICAyKSBSZXBsaSA6IHNpIGV0IHNldWxlbWVudCBzaSBsZSBtb2RlIDEgbmUgZG9ubmUgUklFTiwgb24gY2hlcmNoZQogICAgICAgIGxlcyBjbMOpcyBow6lyaXTDqWVzIGRlIGxhIHYuNSwgYXZlYyBvdSBzYW5zIHN1ZmZpeGUuCiAgICAgUmVudm9pZSB7IGVudHJpZXM6IFsuLi5dLCBtb2RlOiAncHJlZml4JyB8ICdsZWdhY3knIHwgJ25vbmUnIH0uICovCiAgZnVuY3Rpb24gZGlzY292ZXIoZGljdCl7CiAgICB2YXIgc2VlbiA9IE9iamVjdC5jcmVhdGUobnVsbCksIGVudHJpZXMgPSBbXTsKCiAgICBmdW5jdGlvbiBwdXNoKGVsLCBrZXkpewogICAgICBpZighZWwgfHwgIWtleSB8fCBzZWVuW2tleV0peyByZXR1cm47IH0KICAgICAgc2VlbltrZXldID0gdHJ1ZTsKICAgICAgZW50cmllcy5wdXNoKHsgc2VjdGlvbjogZWwsIGtleToga2V5LCBsYWJlbDogZGljdFtrZXldIHx8IHRpdGxlQ2FzZShrZXkpIH0pOwogICAgfQoKICAgIHZhciBmb3VuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49IicgKyBQUkVGSVggKyAnIl0nKTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBmb3VuZC5sZW5ndGg7IGkrKyl7CiAgICAgIGlmKCFpc1NlY3Rpb25DYW5kaWRhdGUoZm91bmRbaV0pKXsgY29udGludWU7IH0KICAgICAgcHVzaChmb3VuZFtpXSwga2V5T2YoZm91bmRbaV0uaWQpKTsKICAgIH0KICAgIGlmKGVudHJpZXMubGVuZ3RoKXsKICAgICAgd2FybklmUGFydGlhbGx5TWlncmF0ZWQoc2Vlbik7CiAgICAgIHJldHVybiB7IGVudHJpZXM6IGVudHJpZXMsIG1vZGU6ICdwcmVmaXgnIH07CiAgICB9CgogICAgZm9yKHZhciBqID0gMDsgaiA8IExFR0FDWV9LRVlTLmxlbmd0aDsgaisrKXsKICAgICAgdmFyIGsgID0gTEVHQUNZX0tFWVNbal07CiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGspIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tpZF49IicgKyBrICsgJy0iXScpOwogICAgICBpZihlbCAmJiBpc1NlY3Rpb25DYW5kaWRhdGUoZWwpKXsgcHVzaChlbCwgayk7IH0KICAgIH0KICAgIGlmKGVudHJpZXMubGVuZ3RoKXsKICAgICAgZW50cmllcy5zb3J0KGluRG9jdW1lbnRPcmRlcik7IC8qIGxhIGxpc3RlIGRlcyBjbMOpcyBuZSBzdWl0IHBhcyBsJ29yZHJlIGRlIGxhIHBhZ2UgKi8KICAgICAgcmV0dXJuIHsgZW50cmllczogZW50cmllcywgbW9kZTogJ2xlZ2FjeScgfTsKICAgIH0KCiAgICByZXR1cm4geyBlbnRyaWVzOiBlbnRyaWVzLCBtb2RlOiAnbm9uZScgfTsKICB9CgogIC8qIC0tLS0gTWlncmF0aW9uIHBhcnRpZWxsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIENhcyBwacOoZ2UgOiBzdXIgdW5lIG3Dqm1lIHBhZ2UgY2VydGFpbmVzIHJvd3Mgb250IMOpdMOpIHJlbm9tbcOpZXMgZW4KICAgICBuYXYt4oCmIGV0IGQnYXV0cmVzIG5vbi4gTGUgbW9kZSBub21pbmFsIGwnZW1wb3J0ZSBldCBsZXMgcm93cyBub24KICAgICByZW5vbW3DqWVzIGRpc3BhcmFpc3NlbnQgU0lMRU5DSUVVU0VNRU5UIGR1IG1lbnUuIE9uIGxlIHNpZ25hbGUuICovCiAgZnVuY3Rpb24gd2FybklmUGFydGlhbGx5TWlncmF0ZWQoc2Vlbil7CiAgICBpZighd2luZG93LmNvbnNvbGUgfHwgIWNvbnNvbGUud2Fybil7IHJldHVybjsgfQogICAgdmFyIHN0cmFnZ2xlcnMgPSBbXTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBMRUdBQ1lfS0VZUy5sZW5ndGg7IGkrKyl7CiAgICAgIHZhciBrID0gTEVHQUNZX0tFWVNbaV07CiAgICAgIGlmKHNlZW5ba10peyBjb250aW51ZTsgfSAvKiBkw6lqw6AgcHLDqXNlbnQgdmlhIHVuZSByb3cgbmF2LSAqLwogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChrKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaWRePSInICsgayArICctIl0nKTsKICAgICAgaWYoZWwgJiYgaXNTZWN0aW9uQ2FuZGlkYXRlKGVsKSl7IHN0cmFnZ2xlcnMucHVzaChrICsgJyAoIycgKyBlbC5pZCArICcpJyk7IH0KICAgIH0KICAgIGlmKCFzdHJhZ2dsZXJzLmxlbmd0aCl7IHJldHVybjsgfQogICAgY29uc29sZS53YXJuKAogICAgICAnW25weC1zdWJuYXZdIE1pZ3JhdGlvbiBpbmNvbXBsZXRlIHN1ciBjZXR0ZSBwYWdlIDogJyArIHN0cmFnZ2xlcnMubGVuZ3RoICsKICAgICAgJyByb3cocykgcG9ydGVudCBlbmNvcmUgdW4gYW5jaWVuIFJvdyBJRCBldCBzb250IEFCU0VOVEVTIGR1IG1lbnUgLT4gJyArCiAgICAgIHN0cmFnZ2xlcnMuam9pbignLCAnKSArICdcbicgKwogICAgICAnTGVzIHJlbm9tbWVyIGF2ZWMgbGUgcHJlZml4ZSAiJyArIFBSRUZJWCArICciIChleC4gJyArIFBSRUZJWCArIExFR0FDWV9LRVlTWzBdICsgJykuJwogICAgKTsKICB9CgogIC8qIC0tLS0gTWVzc2FnZSBkZSBkaWFnbm9zdGljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIEludmlzaWJsZSBwb3VyIGxlcyB2aXNpdGV1cnMsIGTDqWNpc2lmIHBvdXIgbGEgcGVyc29ubmUgcXVpIHJlcHJlbmQKICAgICBsZSBkb3NzaWVyIDogb24gZGl0IGNlIHF1aSBhIMOpdMOpIGNoZXJjaMOpIGV0IGNlIHF1aSBhIMOpdMOpIHRyb3V2w6kuICovCiAgZnVuY3Rpb24gd2Fybk5vdGhpbmdGb3VuZCgpewogICAgaWYoIXdpbmRvdy5jb25zb2xlIHx8ICFjb25zb2xlLndhcm4peyByZXR1cm47IH0KICAgIHZhciB3aXRoSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyk7CiAgICBjb25zb2xlLndhcm4oCiAgICAgICdbbnB4LXN1Ym5hdl0gQXVjdW5lIHNlY3Rpb24gdHJvdXbDqWUgOiBsYSBiYXJyZSByZXN0ZSBtYXNxdcOpZS5cbicgKwogICAgICAnLSBSZWNoZXJjaMOpIGVuIHByaW9yaXTDqSA6IGRlcyBSb3cgSUQgY29tbWVuw6dhbnQgcGFyICInICsgUFJFRklYICsgJyIgKGV4LiBuYXYtb3ZlcnZpZXcpLlxuJyArCiAgICAgICctIFB1aXMsIGVuIHJlcGxpLCBsZXMgY2xlcyBoZXJpdGVlcyA6ICcgKyBMRUdBQ1lfS0VZUy5qb2luKCcsICcpICsgJy5cbicgKwogICAgICAnLSBQYWdlIGxhbmc9IicgKyAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnbGFuZycpIHx8ICcoYWJzZW50KScpICsgJyIsICcgKwogICAgICB3aXRoSWQubGVuZ3RoICsgJyBlbGVtZW50KHMpIHBvcnRlbnQgdW4gaWQuXG4nICsKICAgICAgJy0gQ2F1c2UgbGEgcGx1cyBmcmVxdWVudGUgOiBsZXMgUm93IElEIGRlIENFVFRFIHBhZ2UgbmUgc29udCBwYXMgbm9tbWVzLiAnICsKICAgICAgJ1NvdXMgV1BNTCB1bmUgdHJhZHVjdGlvbiBlc3QgdW4gcG9zdCBkaXN0aW5jdCDigJQgcmVub21tZXIgbGVzIFJvdyBJRCBkZSBsYSBwYWdlICcgKwogICAgICAnc291cmNlIG5lIHJlbm9tbWUgcGFzIGNldXggZGUgbGEgdHJhZHVjdGlvbiA6IGlsIGZhdXQgbGVzIHNhaXNpciBzdXIgY2hhcXVlIGxhbmd1ZS5cbicgKwogICAgICAnLSBQb3VyIGxhIGxpc3RlIGRlcyBpZHMgcHJlc2VudHMsIHJlY2hhcmdlciBsYSBwYWdlIGF2ZWMgP25weGRlYnVnPTEnCiAgICApOwogICAgaWYoREVCVUcpewogICAgICB2YXIgaWRzID0gW107CiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB3aXRoSWQubGVuZ3RoOyBpKyspeyBpZHMucHVzaCh3aXRoSWRbaV0uaWQpOyB9CiAgICAgIGNvbnNvbGUud2FybignW25weC1zdWJuYXZdIGlkcyBwcmVzZW50cyBzdXIgbGEgcGFnZSA6JywgaWRzKTsKICAgIH0KICB9CgogIC8qIC0tLS0gSW5pdGlhbGlzYXRpb24gZCd1bmUgaW5zdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBSZW52b2llIHRydWUgc2kgbGEgYmFycmUgYSDDqXTDqSBjb25zdHJ1aXRlLCBmYWxzZSBzJ2lsIG4neSBhdmFpdAogICAgIGF1Y3VuZSBzZWN0aW9uIChsJ2luc3RhbmNlIHJlc3RlIGFsb3JzIMOpbGlnaWJsZSDDoCB1bmUgbm91dmVsbGUKICAgICB0ZW50YXRpdmUgOiBkYXRhLW5weC1yZWFkeSBuJ2VzdCBwb3PDqSBxdSdlbiBjYXMgZGUgc3VjY8OocykuICovCiAgZnVuY3Rpb24gaW5pdChuYXYpewogICAgdmFyIGlubmVyID0gbmF2LnF1ZXJ5U2VsZWN0b3IoJy5ucHgtc3VibmF2X19pbm5lcicpOwogICAgaWYoIWlubmVyKXsKICAgICAgbmF2LnNldEF0dHJpYnV0ZSgnZGF0YS1ucHgtcmVhZHknLCAnMScpOyAvKiBiYWxpc2FnZSBpbmF0dGVuZHUgOiBuZSBwYXMgYm91Y2xlciBkZXNzdXMgKi8KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgdmFyIGxhbmcgID0gZGV0ZWN0TGFuZyhuYXYpOwogICAgdmFyIGRpY3QgID0gTEFCRUxTW2xhbmddIHx8IHt9OwogICAgdmFyIGZvdW5kID0gZGlzY292ZXIoZGljdCk7CiAgICB2YXIgZW50cmllcyA9IGZvdW5kLmVudHJpZXM7CgogICAgaWYoIWVudHJpZXMubGVuZ3RoKXsgcmV0dXJuIGZhbHNlOyB9CgogICAgbmF2LnNldEF0dHJpYnV0ZSgnZGF0YS1ucHgtcmVhZHknLCAnMScpOwogICAgbG9nKCdtb2RlID0nLCBmb3VuZC5tb2RlLCAnfCBsYW5nID0nLCBsYW5nLCAnfCBlbnRyZWVzID0nLCBlbnRyaWVzLm1hcChmdW5jdGlvbihlKXsKICAgICAgcmV0dXJuIGUua2V5ICsgJyAtPiAnICsgZS5sYWJlbCArICcgKCMnICsgZS5zZWN0aW9uLmlkICsgJyknOwogICAgfSkpOwoKICAgIGlubmVyLmlubmVySFRNTCA9ICcnOwogICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGUpewogICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgYS5ocmVmID0gJyMnICsgZS5zZWN0aW9uLmlkOwogICAgICBhLnRleHRDb250ZW50ID0gZS5sYWJlbDsKICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQoYSk7CiAgICAgIGUubGluayA9IGE7CiAgICB9KTsKICAgIG5hdi5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpOwoKICAgIC8qIC0tLS0gdi42LjQgOiBsYSBiYXJyZSB0aWVudCBzdXIgdW5lIGxpZ25lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgZmxleC13cmFwOm5vd3JhcCBzdXBwcmltZSBsYSAyZSBsaWduZS4gT24gbWVzdXJlIGV0IG9uIHJldGllbnQgbGUKICAgICAgIFBSRU1JRVIgcGFsaWVyIHF1aSByZW50cmUuIExlIHBhbGllciAwIGVzdCBsZSByZW5kdSB2LjYuMiA6IHVuZQogICAgICAgYmFycmUgcXVpIHJlbnRyYWl0IGRlamEgbmUgYm91Z2UgcGFzIGQndW4gcGl4ZWwuIFNpIG1lbWUgbGUKICAgICAgIHBsYW5jaGVyIGRlYm9yZGUgKHRlbGVwaG9uZSksIGxhIGJhcnJlIGRlZmlsZSBob3Jpem9udGFsZW1lbnQuCiAgICAgICBUb3V0IGVzdCBlbnZlbG9wcGUgOiBlbiBjYXMgZCdlcnJldXIgb24gcmV2aWVudCBhdSBwYWxpZXIgMC4gKi8KICAgIHZhciBTVEVQUyA9IFsKICAgICAgeyBmczogJzExcHgnLCAgIGxzOiAnLjEyZW0nLCBweDogJzE0cHgnLCBnYXA6ICcxMHB4JyB9LCAvKiByZW5kdSB2LjYuMiAqLwogICAgICB7IGZzOiAnMTFweCcsICAgbHM6ICcuMDllbScsIHB4OiAnMTNweCcsIGdhcDogJzlweCcgIH0sCiAgICAgIHsgZnM6ICcxMC41cHgnLCBsczogJy4wN2VtJywgcHg6ICcxMnB4JywgZ2FwOiAnOHB4JyAgfSwKICAgICAgeyBmczogJzEwcHgnLCAgIGxzOiAnLjA2ZW0nLCBweDogJzExcHgnLCBnYXA6ICc3cHgnICB9LAogICAgICB7IGZzOiAnOS41cHgnLCAgbHM6ICcuMDVlbScsIHB4OiAnMTBweCcsIGdhcDogJzZweCcgIH0sCiAgICAgIHsgZnM6ICc5cHgnLCAgICBsczogJy4wNGVtJywgcHg6ICc5cHgnLCAgZ2FwOiAnNXB4JyAgfSAgLyogcGxhbmNoZXIgKi8KICAgIF07CiAgICBmdW5jdGlvbiBhcHBseVN0ZXAocyl7CiAgICAgIHZhciBzdCA9IGlubmVyLnN0eWxlOwogICAgICBzdC5zZXRQcm9wZXJ0eSgnLS1ucHgtZnMnLCAgcy5mcyk7CiAgICAgIHN0LnNldFByb3BlcnR5KCctLW5weC1scycsICBzLmxzKTsKICAgICAgc3Quc2V0UHJvcGVydHkoJy0tbnB4LXB4JywgIHMucHgpOwogICAgICBzdC5zZXRQcm9wZXJ0eSgnLS1ucHgtZ2FwJywgcy5nYXApOwogICAgfQogICAgZnVuY3Rpb24gb3ZlcmZsb3dpbmcoKXsgcmV0dXJuIGlubmVyLnNjcm9sbFdpZHRoID4gaW5uZXIuY2xpZW50V2lkdGggKyAxOyB9CgogICAgdmFyIGZpdHRpbmcgPSBmYWxzZSwgbGFzdFcgPSAtMTsKICAgIGZ1bmN0aW9uIGZpdCgpewogICAgICBpZihmaXR0aW5nKXsgcmV0dXJuOyB9CiAgICAgIGZpdHRpbmcgPSB0cnVlOwogICAgICB0cnl7CiAgICAgICAgLyogQmFycmUgbm9uIG1lc3VyYWJsZSAobWFzcXVlZSwgb25nbGV0IHJlcGxpZSkgOiBuZSByaWVuIGNvbmNsdXJlLiAqLwogICAgICAgIGlmKGlubmVyLmNsaWVudFdpZHRoID4gNDApewogICAgICAgICAgdmFyIGksIGNob3NlbiA9IFNURVBTLmxlbmd0aCAtIDE7CiAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBTVEVQUy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIGFwcGx5U3RlcChTVEVQU1tpXSk7CiAgICAgICAgICAgIGlmKCFvdmVyZmxvd2luZygpKXsgY2hvc2VuID0gaTsgYnJlYWs7IH0KICAgICAgICAgIH0KICAgICAgICAgIGlmKGNob3NlbiAhPT0gaSl7IGFwcGx5U3RlcChTVEVQU1tjaG9zZW5dKTsgfQogICAgICAgICAgbGFzdFcgPSBuYXYuY2xpZW50V2lkdGg7CiAgICAgICAgfQogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBhcHBseVN0ZXAoU1RFUFNbMF0pOyAgLyogamFtYWlzIGRlIGJhcnJlIGNhc3NlZSAqLwogICAgICB9CiAgICAgIGZpdHRpbmcgPSBmYWxzZTsKICAgIH0KICAgIGZpdCgpOwoKICAgIC8qIExhIHBvbGljZSBkdSB0aGVtZSBhcnJpdmUgZW4gYXN5bmNocm9uZSA6IHJlbWVzdXJlciBhIHNvbiBhcnJpdmVlLiAqLwogICAgaWYoZG9jdW1lbnQuZm9udHMgJiYgZG9jdW1lbnQuZm9udHMucmVhZHkgJiYgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbil7CiAgICAgIHRyeXsgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbihmaXQsIGZpdCk7IH1jYXRjaChlcnIpe30KICAgIH0KICAgIHNldFRpbWVvdXQoZml0LCA2MDApOwogICAgc2V0VGltZW91dChmaXQsIDIwMDApOwoKICAgIC8qIExlIHBhc3NhZ2UgZW4gc3RpY2t5IGNoYW5nZSBsYSBsYXJnZXVyIHNhbnMgZXZlbmVtZW50IHJlc2l6ZS4gKi8KICAgIGlmKHdpbmRvdy5SZXNpemVPYnNlcnZlcil7CiAgICAgIHRyeXsKICAgICAgICBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24oKXsKICAgICAgICAgIGlmKG5hdi5jbGllbnRXaWR0aCAhPT0gbGFzdFcpeyBmaXQoKTsgfQogICAgICAgIH0pLm9ic2VydmUobmF2KTsKICAgICAgfWNhdGNoKGVycil7fQogICAgfQoKICAgIC8qIEVuIG1vZGUgZGVmaWxlbWVudCwgZ2FyZGVyIGxhIHBhc3RpbGxlIGFjdGl2ZSB2aXNpYmxlLiAqLwogICAgZnVuY3Rpb24gcmV2ZWFsKGxpbmspewogICAgICBpZighbGluayB8fCAhb3ZlcmZsb3dpbmcoKSl7IHJldHVybjsgfQogICAgICB2YXIgbCA9IGxpbmsub2Zmc2V0TGVmdCwgciA9IGwgKyBsaW5rLm9mZnNldFdpZHRoOwogICAgICB2YXIgdnMgPSBpbm5lci5zY3JvbGxMZWZ0LCB2ZSA9IHZzICsgaW5uZXIuY2xpZW50V2lkdGg7CiAgICAgIGlmKGwgPCB2cyl7IGlubmVyLnNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCBsIC0gMTIpOyB9CiAgICAgIGVsc2UgaWYociA+IHZlKXsgaW5uZXIuc2Nyb2xsTGVmdCA9IHIgLSBpbm5lci5jbGllbnRXaWR0aCArIDEyOyB9CiAgICB9CgogICAgZnVuY3Rpb24gdG9wT2Zmc2V0KCl7CiAgICAgIHZhciB2ID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJy0tbnB4LXRvcCcpOwogICAgICByZXR1cm4gcGFyc2VJbnQodiwgMTApIHx8IDA7CiAgICB9CiAgICAvKiBEw6lmaWxlbWVudCBhdmVjIGNvbXBlbnNhdGlvbiBkZXMgZGV1eCBtZW51cy4gKi8KICAgIGZ1bmN0aW9uIHRvdGFsT2Zmc2V0KCl7IHJldHVybiB0b3BPZmZzZXQoKSArIG5hdi5vZmZzZXRIZWlnaHQgKyA4OyB9CgogICAgLyogLS0tLSBDb2xsYWdlIDogZml4ZWQgKyBwbGFjZWhvbGRlciBhbnRpLXNhdXQgKG1vZGUgJ2pzJykgLS0tLSAqLwogICAgdmFyIHBoID0gbnVsbDsKICAgIGlmKFNUSUNLX01PREUgPT09ICdqcycpewogICAgICBwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBwaC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBuYXYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocGgsIG5hdik7CiAgICB9CiAgICBmdW5jdGlvbiBzdGljaygpewogICAgICBpZighcGgpeyByZXR1cm47IH0KICAgICAgdmFyIGFuY2hvciA9IChwaC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpID8gbmF2IDogcGg7CiAgICAgIHZhciBzaG91bGQgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIDw9IHRvcE9mZnNldCgpOwogICAgICBpZihzaG91bGQgJiYgIW5hdi5jbGFzc0xpc3QuY29udGFpbnMoJ25weC1zdHVjaycpKXsKICAgICAgICBwaC5zdHlsZS5oZWlnaHQgID0gbmF2Lm9mZnNldEhlaWdodCArICdweCc7CiAgICAgICAgcGguc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgbmF2LmNsYXNzTGlzdC5hZGQoJ25weC1zdHVjaycpOwogICAgICB9ZWxzZSBpZighc2hvdWxkICYmIG5hdi5jbGFzc0xpc3QuY29udGFpbnMoJ25weC1zdHVjaycpKXsKICAgICAgICBuYXYuY2xhc3NMaXN0LnJlbW92ZSgnbnB4LXN0dWNrJyk7CiAgICAgICAgcGguc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgfQogICAgfQoKICAgIC8qIC0tLS0gU2VjdGlvbiBhY3RpdmUgLS0tLSAqLwogICAgdmFyIGxhc3RDdXJyZW50ID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhpZ2hsaWdodCgpewogICAgICB2YXIgbGltaXQgPSB0b3RhbE9mZnNldCgpICsgNDsKICAgICAgdmFyIGN1cnJlbnQgPSBudWxsOwogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoZS5zZWN0aW9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA8PSBsaW1pdCl7IGN1cnJlbnQgPSBlOyB9CiAgICAgIH0pOwogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgICAgZS5saW5rLmNsYXNzTGlzdC50b2dnbGUoJ25weC1hY3RpdmUnLCBlID09PSBjdXJyZW50KTsKICAgICAgfSk7CiAgICAgIGlmKGN1cnJlbnQgIT09IGxhc3RDdXJyZW50KXsKICAgICAgICBsYXN0Q3VycmVudCA9IGN1cnJlbnQ7CiAgICAgICAgaWYoY3VycmVudCl7IHJldmVhbChjdXJyZW50LmxpbmspOyB9CiAgICAgIH0KICAgIH0KCiAgICAvKiAtLS0tIENsaWMgc3VyIHVuZSBlbnRyw6llIC0tLS0gKi8KICAgIHZhciBzbW9vdGggPSAhd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlczsKICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlKXsKICAgICAgZS5saW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZXYpewogICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdmFyIHkgPSBlLnNlY3Rpb24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0IC0gdG90YWxPZmZzZXQoKTsKICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IHksIGJlaGF2aW9yOiBzbW9vdGggPyAnc21vb3RoJyA6ICdhdXRvJyB9KTsKICAgICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgJyMnICsgZS5zZWN0aW9uLmlkKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBvblNjcm9sbCgpeyBzdGljaygpOyBoaWdobGlnaHQoKTsgfQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24oKXsgZml0KCk7IG9uU2Nyb2xsKCk7IH0pOwogICAgb25TY3JvbGwoKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLyogLS0tLSBBbW9yw6dhZ2UgOiB0b3V0ZXMgbGVzIGluc3RhbmNlcywgYXZlYyBxdWVscXVlcyByZWxhbmNlcyAtLS0tLS0KICAgICBMZXMgcm93cyBVbmNvZGUgcGV1dmVudCDDqnRyZSBpbmplY3TDqWVzIGFwcsOocyBsZSBET01Db250ZW50TG9hZGVkCiAgICAgKGxhenkgLyBBSkFYKSA6IG9uIHJldGVudGUgcGVuZGFudCB+Miw1IHMgYXZhbnQgZGUgY29uY2x1cmUuICovCiAgZnVuY3Rpb24gYm9vdCgpewogICAgdmFyIG5hdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubnB4LXN1Ym5hdjpub3QoW2RhdGEtbnB4LXJlYWR5XSknKTsKICAgIHZhciBwZW5kaW5nID0gMDsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuYXZzLmxlbmd0aDsgaSsrKXsKICAgICAgaWYoIWluaXQobmF2c1tpXSkpeyBwZW5kaW5nKys7IH0KICAgIH0KICAgIHJldHVybiBwZW5kaW5nOwogIH0KCiAgZnVuY3Rpb24gcnVuKCl7CiAgICBpZihib290KCkgPT09IDApeyByZXR1cm47IH0KICAgIHZhciB0cmllcyA9IDA7CiAgICB2YXIgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewogICAgICB0cmllcysrOwogICAgICB2YXIgbGFzdCA9IHRyaWVzID49IDY7IC8qIDYgeCA0MDAgbXMgKi8KICAgICAgaWYoYm9vdCgpID09PSAwIHx8IGxhc3QpewogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgIGlmKGxhc3QgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5weC1zdWJuYXY6bm90KFtkYXRhLW5weC1yZWFkeV0pJykpewogICAgICAgICAgd2Fybk5vdGhpbmdGb3VuZCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgNDAwKTsKICB9CgogIGlmKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyl7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcnVuKTsKICB9ZWxzZXsKICAgIHJ1bigpOwogIH0KfSkoKTsKPC9zY3JpcHQ+[\/vc_raw_html][\/vc_column][\/vc_row][vc_row unlock_row_content=\u00a0\u00bbyes\u00a0\u00bb row_height_percent=\u00a0\u00bb0&Prime; override_padding=\u00a0\u00bbyes\u00a0\u00bb h_padding=\u00a0\u00bb5&Prime; top_padding=\u00a0\u00bb5&Prime; bottom_padding=\u00a0\u00bb5&Prime; [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/\" \/>\n<meta property=\"og:site_name\" content=\"NumPEx\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-10T20:38:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/numpex.org\/wp-content\/uploads\/sites\/6\/2023\/06\/Illustration_for_hiring_scientist_on_the_exascale-02-NO-PEOPLE-1920px-low.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1076\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/numpex.org\\\/fr\\\/lia-au-service-de-la-science\\\/\",\"url\":\"https:\\\/\\\/numpex.org\\\/fr\\\/lia-au-service-de-la-science\\\/\",\"name\":\"L'IA au service de la science - NumPEx\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/numpex.org\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/numpex.org\\\/fr\\\/lia-au-service-de-la-science\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/numpex.org\\\/fr\\\/lia-au-service-de-la-science\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/numpex.org\\\/wp-content\\\/uploads\\\/sites\\\/6\\\/2023\\\/06\\\/Illustration_for_hiring_scientist_on_the_exascale-02-NO-PEOPLE-1920px-low.jpg\",\"datePublished\":\"2025-10-16T10:08:03+00:00\",\"dateModified\":\"2026-09-10T20:38:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/numpex.org\\\/fr\\\/lia-au-service-de-la-science\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/numpex.org\\\/fr\\\/lia-au-service-de-la-science\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/numpex.org\\\/fr\\\/lia-au-service-de-la-science\\\/#primaryimage\",\"url\":\"https:\\\/\\\/numpex.org\\\/wp-content\\\/uploads\\\/sites\\\/6\\\/2023\\\/06\\\/Illustration_for_hiring_scientist_on_the_exascale-02-NO-PEOPLE-1920px-low.jpg\",\"contentUrl\":\"https:\\\/\\\/numpex.org\\\/wp-content\\\/uploads\\\/sites\\\/6\\\/2023\\\/06\\\/Illustration_for_hiring_scientist_on_the_exascale-02-NO-PEOPLE-1920px-low.jpg\",\"width\":1920,\"height\":1076},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/numpex.org\\\/fr\\\/lia-au-service-de-la-science\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/numpex.org\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"L&rsquo;IA au service de la science\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/numpex.org\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/numpex.org\\\/fr\\\/\",\"name\":\"NumPEx\",\"description\":\"Digital for Exascale\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/numpex.org\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"L'IA au service de la science - NumPEx","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/","og_locale":"fr_FR","og_type":"article","og_title":"L'IA au service de la science - NumPEx","og_description":"[vc_row row_height_percent=\u00a0\u00bb0&Prime; overlay_alpha=\u00a0\u00bb50&Prime; gutter_size=\u00a0\u00bb3&Prime; column_width_percent=\u00a0\u00bb100&Prime; shift_y=\u00a0\u00bb0&Prime; z_index=\u00a0\u00bb0&Prime; sticky=\u00a0\u00bbyes\u00a0\u00bb content_parallax=\u00a0\u00bb0&Prime; uncode_shortcode_id=\u00a0\u00bb165842&Prime; css=\u00a0\u00bb.vc_custom_1785924495010{margin-top: 1% !important;}\u00a0\u00bb][vc_column width=\u00a0\u00bb1\/1&Prime;][vc_raw_html]PCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBOdW1QRXgg4oCUIE1lbnUgZGUgc2VjdGlvbnMgc3RpY2t5IOKAlCB2LjYuNAogIE5hb3MgQWdlbmN5IMK3IDIwMjYtMDktMTAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKPHN0eWxlPgogIDpyb290eyAtLW5weC10b3A6IDYwcHg7IH0gLyogaGF1dGV1ciBkdSBoZWFkZXIgVW5jb2RlIHN0aWNreSAqLwogIC5ucHgtc3VibmF2ewogICAgYmFja2dyb3VuZDogI0UwOTkwMDsgLyogb3JhbmdlIGQnYWNjZW50dWF0aW9uIE51bVBFeCAqLwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA4KTsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHotaW5kZXg6IDQwOwogIH0KICAubnB4LXN1Ym5hdltoaWRkZW5deyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KICAubnB4LXN1Ym5hdi5ucHgtc3R1Y2t7IGJvcmRlci1yYWRpdXM6IDAgMCAxMnB4IDEycHg7IH0KICAubnB4LXN1Ym5hdi5ucHgtc3R1Y2t7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IHZhcigtLW5weC10b3ApOwogICAgbGVmdDogMDsgcmlnaHQ6IDA7CiAgfQogIC5ucHgtc3VibmF2X19pbm5lcnsKICAgIC8qIHYuNi40IDogbWV0cmlxdWVzIHBpbG90ZWVzIHBhciB2YXJpYWJsZXMuIExlcyB2YWxldXJzIGRlIHJlcGxpCiAgICAgICBTT05UIGNlbGxlcyBkZSBsYSB2LjYuMiA6IHNhbnMgSlMsIHJlbmR1IGlkZW50aXF1ZS4gKi8KICAgIG1heC13aWR0aDogMTE0MHB4OwogICAgbWFyZ2luOiAwIGF1dG87CiAgICBwYWRkaW5nOiAwIDI0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDAgdmFyKC0tbnB4LWdhcCwgMTBweCk7CiAgICBtaW4taGVpZ2h0OiA0NnB4OwogICAgcGFkZGluZy10b3A6IDZweDsKICAgIHBhZGRpbmctYm90dG9tOiA2cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZm9udC1zaXplOiB2YXIoLS1ucHgtZnMsIDExcHgpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiB2YXIoLS1ucHgtbHMsIC4xMmVtKTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwogICAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOwogICAgLyogZm9udC1mYW1pbHk6ICdQb3BwaW5zJywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmOyAqLwogIH0KICAubnB4LXN1Ym5hdl9faW5uZXI6Oi13ZWJraXQtc2Nyb2xsYmFyeyBkaXNwbGF5OiBub25lOyB9CiAgLyogU3DDqWNpZmljaXTDqSByZW5mb3Jjw6llICsgIWltcG9ydGFudCA6IG5ldXRyYWxpc2UgbGVzIGNvdWxldXJzIGRlIGxpZW5zIGR1IHRow6htZSBVbmNvZGUgKG9yYW5nZSBhdSBzdXJ2b2wvY2xpYykgKi8KICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYSwKICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYTp2aXNpdGVkewogICAgY29sb3I6IHJnYmEoMjU1LDI1MCwyNDMsLjg4KSAhaW1wb3J0YW50OyAvKiBibGFuYyBjYXNzw6kgKi8KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogOHB4IHZhcigtLW5weC1weCwgMTRweCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIHRyYW5zaXRpb246IGNvbG9yIC4xOHMsIGJhY2tncm91bmQtY29sb3IgLjE4czsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7ICAvKiB2LjYuNCA6IHVuIGxpYmVsbGUgbmUgc2UgY291cGUgamFtYWlzICovCiAgICBmbGV4OiAwIDAgYXV0bzsgICAgICAgLyogdi42LjQgOiBsZXMgcGFzdGlsbGVzIG5lIHNlIGNvbXByaW1lbnQgcGFzICovCiAgfQogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmhvdmVyLAogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmZvY3VzLAogIG5hdi5ucHgtc3VibmF2IC5ucHgtc3VibmF2X19pbm5lciBhOmFjdGl2ZXsKICAgIGNvbG9yOiAjRkZGRkZGICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4xMik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKICB9CiAgbmF2Lm5weC1zdWJuYXYgLm5weC1zdWJuYXZfX2lubmVyIGEubnB4LWFjdGl2ZSwKICBuYXYubnB4LXN1Ym5hdiAubnB4LXN1Ym5hdl9faW5uZXIgYS5ucHgtYWN0aXZlOmhvdmVyewogICAgY29sb3I6ICNGRkZGRkYgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6ICNBODZGMDA7IC8qIG9yYW5nZSBmb25jw6ksIGFwbGF0IHNpbXBsZSAqLwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICB9Cjwvc3R5bGU+Cgo8bmF2IGNsYXNzPSJucHgtc3VibmF2IiBhcmlhLWxhYmVsPSJQYWdlIHNlY3Rpb25zIiBoaWRkZW4+CiAgPGRpdiBjbGFzcz0ibnB4LXN1Ym5hdl9faW5uZXIiPjwvZGl2Pgo8L25hdj4KCjxzY3JpcHQ+CihmdW5jdGlvbigpewogICd1c2Ugc3RyaWN0JzsKCiAgLyogPT09PT09PT09PT09PT09PT09PT0gQ09ORklHIFNJVEUgPT09PT09PT09PT09PT09PT09PT0KICAgICBTZXVsZSB6b25lIMOgIGFkYXB0ZXIgcG91ciByw6l1dGlsaXNlciBsZSBibG9jIGFpbGxldXJzLiAqLwogIHZhciBQUkVGSVggPSAnbmF2LSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByw6lmaXhlIGRlcyBSb3cgSUQgw6AgZMOpdGVjdGVyICovCiAgdmFyIFNUUklQICA9IFsvLShlbnxmcikkL2ksIC8tZXhhLVthLXowLTldKyQvaV07ICAgLyogc3VmZml4ZXMgZCd1bmljaXTDqSDDoCBpZ25vcmVyICAqLwoKICAvKiBSZXBsaSBwb3VyIGxlcyBwYWdlcyBQQVMgRU5DT1JFIE1JR1LDiUVTIHZlcnMgbGUgcHLDqWZpeGUgbmF2LQogICAgICh0eXBpcXVlbWVudCBsZXMgdHJhZHVjdGlvbnMgV1BNTCBkb250IGxlcyBSb3cgSUQgbidvbnQgcGFzIMOpdMOpCiAgICAgcmVub21tw6lzKS4gVXRpbGlzw6kgVU5JUVVFTUVOVCBzaSBsYSBwYWdlIG5lIGNvbnRpZW50IGF1Y3VuZSByb3cKICAgICDCqyBuYXYtIMK7LiBSZXByZW5kIGxlcyBjbMOpcyBkZSBsYSB2LjUgOiB1bmUgcm93IG5vbW3DqWUKICAgICDCqyBjb25zb3J0aXVtLWV4YS1tYS1lbiDCuyBvdSBzaW1wbGVtZW50IMKrIGNvbnNvcnRpdW0gwrsgZXN0CiAgICAgcmV0cm91dsOpZS4gTGlzdGUgZmVybcOpZSA9IGF1Y3VuIHJpc3F1ZSBkZSBmYXV4IHBvc2l0aWYuICovCiAgdmFyIExFR0FDWV9LRVlTID0gWwogICAgJ292ZXJ2aWV3JywgJ2NvbnNvcnRpdW0nLCAncmVzdWx0cycsICdtZXRyaWNzJywgJ3NvZnR3YXJlJywKICAgICduZXdzJywgJ2V2ZW50cycsICdhZ2VuZGEnLCAndGVhbScsICdjb250YWN0JwogIF07CgogIHZhciBMQUJFTFMgPSB7CiAgICAvKiBMaWJlbGzDqXMgcHLDqWbDqXLDqXMgcGFyIGNsw6kuIFRvdXRlIGNsw6kgYWJzZW50ZSBlc3QgYWZmaWNow6llCiAgICAgICBjYXBpdGFsaXPDqWUgdGVsbGUgcXVlbGxlIChuYXYtam9pbi11cyAtPiDCqyBKb2luIFVzIMK7KS4gKi8KICAgIGVuOiB7CiAgICAgICdjb25zb3J0aXVtJzogJ0NvbnNvcnRpdW0gJiBXb3JrcGFja2FnZXMnLAogICAgICAncmVzdWx0cyc6ICAgICdSZXN1bHRzICYgSW1wYWN0JywKICAgICAgJ21ldHJpY3MnOiAgICAnUHJvamVjdCBNZXRyaWNzJywKICAgICAgJ3RlYW0nOiAgICAgICAnVGhlIFRlYW0nCiAgICB9LAogICAgZnI6IHsKICAgICAgJ292ZXJ2aWV3JzogICAnUHLDqXNlbnRhdGlvbicsCiAgICAgICdjb25zb3J0aXVtJzogJ0NvbnNvcnRpdW0gZXQgbG90cyBkZSB0cmF2YWlsJywKICAgICAgJ3Jlc3VsdHMnOiAgICAnUsOpc3VsdGF0cyBldCBpbXBhY3QnLAogICAgICAnbWV0cmljcyc6ICAgICdDaGlmZnJlcyBjbMOpcycsCiAgICAgICdzb2Z0d2FyZSc6ICAgJ0xvZ2ljaWVscycsCiAgICAgICduZXdzJzogICAgICAgJ0FjdHVhbGl0w6lzJywKICAgICAgJ2V2ZW50cyc6ICAgICAnw4l2w6huZW1lbnRzJywKICAgICAgJ3RlYW0nOiAgICAgICAnTOKAmcOpcXVpcGUnCiAgICB9CiAgfTsKICB2YXIgU1RJQ0tfTU9ERSA9ICd1bmNvZGUnOyAvKiAndW5jb2RlJyA9IGxhIHJvdyBnw6hyZSBsZSBzdGlja3kgwrcgJ2pzJyA9IGxlIHNjcmlwdCBjb2xsZSBsdWktbcOqbWUgKi8KICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKICB2YXIgREVCVUcgPSAvWz8mXW5weGRlYnVnPTEvLnRlc3Qod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgZnVuY3Rpb24gbG9nKCl7CiAgICBpZighREVCVUcgfHwgIXdpbmRvdy5jb25zb2xlIHx8ICFjb25zb2xlLmxvZykgcmV0dXJuOwogICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgWydbbnB4LXN1Ym5hdl0nXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgfQoKICAvKiAtLS0tIExhbmd1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgPGh0bWwgbGFuZz4gcG9zw6kgcGFyIFdQTUwuIFJlcGxpcyBzdWNjZXNzaWZzIHNpIGwnYXR0cmlidXQgbWFucXVlIDoKICAgICB1biBhbmPDqnRyZSBwb3J0ZXVyIGRlIGxhbmcsIHB1aXMgbGVzIGNsYXNzZXMgZHUgYm9keS4gKi8KICBmdW5jdGlvbiBkZXRlY3RMYW5nKGVsKXsKICAgIHZhciB0YWcgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdsYW5nJykgfHwgJyc7CiAgICBpZighdGFnICYmIGVsICYmIGVsLmNsb3Nlc3QpewogICAgICB2YXIgaG9zdCA9IGVsLmNsb3Nlc3QoJ1tsYW5nXScpOwogICAgICBpZihob3N0KXsgdGFnID0gaG9zdC5nZXRBdHRyaWJ1dGUoJ2xhbmcnKSB8fCAnJzsgfQogICAgfQogICAgaWYoIXRhZyl7CiAgICAgIHZhciBjbHMgPSAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSkgfHwgJyc7CiAgICAgIGlmKC8oPzpsYW5nfGxhbmd1YWdlKS1mclxifGZyW18tXUZSL2kudGVzdChjbHMpKXsgdGFnID0gJ2ZyJzsgfQogICAgfQogICAgcmV0dXJuIC9eZnIvaS50ZXN0KHRhZykgPyAnZnInIDogJ2VuJzsKICB9CgogIGZ1bmN0aW9uIGtleU9mKGlkKXsKICAgIHZhciBrID0gaWQuc2xpY2UoUFJFRklYLmxlbmd0aCkudG9Mb3dlckNhc2UoKTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBTVFJJUC5sZW5ndGg7IGkrKyl7IGsgPSBrLnJlcGxhY2UoU1RSSVBbaV0sICcnKTsgfQogICAgcmV0dXJuIGs7CiAgfQogIGZ1bmN0aW9uIHRpdGxlQ2FzZShrZXkpewogICAgcmV0dXJuIGtleS5zcGxpdCgnLScpLm1hcChmdW5jdGlvbih3KXsKICAgICAgcmV0dXJuIHcgPyB3LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdy5zbGljZSgxKSA6IHc7CiAgICB9KS5qb2luKCcgJyk7CiAgfQoKICAvKiBEb3VibGUgc8OpY3VyaXTDqSA6IMOpY2FydGUgbGVzIG1lbnVzIGfDqW7DqXLDqXMgcGFyIFdvcmRQcmVzcyBldCB0b3V0IGNlCiAgICAgcXVpIHZpdCBkYW5zIGxhIG5hdmlnYXRpb24gb3UgbGUgaGVhZGVyIOKAlCBpbmNoYW5nw6kgZGVwdWlzIGxhIHYuNi4xLiAqLwogIGZ1bmN0aW9uIGlzU2VjdGlvbkNhbmRpZGF0ZShlbCl7CiAgICB2YXIgdGFnID0gZWwudGFnTmFtZTsKICAgIGlmKHRhZyA9PT0gJ1VMJyB8fCB0YWcgPT09ICdMSScgfHwgdGFnID09PSAnQScgfHwgdGFnID09PSAnTkFWJyl7IHJldHVybiBmYWxzZTsgfQogICAgaWYoZWwuY2xvc2VzdCAmJiBlbC5jbG9zZXN0KCduYXYsIGhlYWRlciwgLm5weC1zdWJuYXYnKSl7IHJldHVybiBmYWxzZTsgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBpbkRvY3VtZW50T3JkZXIoYSwgYil7CiAgICB2YXIgcG9zID0gYS5zZWN0aW9uLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIuc2VjdGlvbik7CiAgICByZXR1cm4gKHBvcyAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSA\/IC0xIDogMTsKICB9CgogIC8qIC0tLS0gRMOpY291dmVydGUgZGVzIHNlY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgMSkgTW9kZSBub21pbmFsIDogdG91dGVzIGxlcyByb3dzIGRvbnQgbCdpZCBjb21tZW5jZSBwYXIgwqsgbmF2LSDCuy4KICAgICAyKSBSZXBsaSA6IHNpIGV0IHNldWxlbWVudCBzaSBsZSBtb2RlIDEgbmUgZG9ubmUgUklFTiwgb24gY2hlcmNoZQogICAgICAgIGxlcyBjbMOpcyBow6lyaXTDqWVzIGRlIGxhIHYuNSwgYXZlYyBvdSBzYW5zIHN1ZmZpeGUuCiAgICAgUmVudm9pZSB7IGVudHJpZXM6IFsuLi5dLCBtb2RlOiAncHJlZml4JyB8ICdsZWdhY3knIHwgJ25vbmUnIH0uICovCiAgZnVuY3Rpb24gZGlzY292ZXIoZGljdCl7CiAgICB2YXIgc2VlbiA9IE9iamVjdC5jcmVhdGUobnVsbCksIGVudHJpZXMgPSBbXTsKCiAgICBmdW5jdGlvbiBwdXNoKGVsLCBrZXkpewogICAgICBpZighZWwgfHwgIWtleSB8fCBzZWVuW2tleV0peyByZXR1cm47IH0KICAgICAgc2VlbltrZXldID0gdHJ1ZTsKICAgICAgZW50cmllcy5wdXNoKHsgc2VjdGlvbjogZWwsIGtleToga2V5LCBsYWJlbDogZGljdFtrZXldIHx8IHRpdGxlQ2FzZShrZXkpIH0pOwogICAgfQoKICAgIHZhciBmb3VuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF49IicgKyBQUkVGSVggKyAnIl0nKTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBmb3VuZC5sZW5ndGg7IGkrKyl7CiAgICAgIGlmKCFpc1NlY3Rpb25DYW5kaWRhdGUoZm91bmRbaV0pKXsgY29udGludWU7IH0KICAgICAgcHVzaChmb3VuZFtpXSwga2V5T2YoZm91bmRbaV0uaWQpKTsKICAgIH0KICAgIGlmKGVudHJpZXMubGVuZ3RoKXsKICAgICAgd2FybklmUGFydGlhbGx5TWlncmF0ZWQoc2Vlbik7CiAgICAgIHJldHVybiB7IGVudHJpZXM6IGVudHJpZXMsIG1vZGU6ICdwcmVmaXgnIH07CiAgICB9CgogICAgZm9yKHZhciBqID0gMDsgaiA8IExFR0FDWV9LRVlTLmxlbmd0aDsgaisrKXsKICAgICAgdmFyIGsgID0gTEVHQUNZX0tFWVNbal07CiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGspIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tpZF49IicgKyBrICsgJy0iXScpOwogICAgICBpZihlbCAmJiBpc1NlY3Rpb25DYW5kaWRhdGUoZWwpKXsgcHVzaChlbCwgayk7IH0KICAgIH0KICAgIGlmKGVudHJpZXMubGVuZ3RoKXsKICAgICAgZW50cmllcy5zb3J0KGluRG9jdW1lbnRPcmRlcik7IC8qIGxhIGxpc3RlIGRlcyBjbMOpcyBuZSBzdWl0IHBhcyBsJ29yZHJlIGRlIGxhIHBhZ2UgKi8KICAgICAgcmV0dXJuIHsgZW50cmllczogZW50cmllcywgbW9kZTogJ2xlZ2FjeScgfTsKICAgIH0KCiAgICByZXR1cm4geyBlbnRyaWVzOiBlbnRyaWVzLCBtb2RlOiAnbm9uZScgfTsKICB9CgogIC8qIC0tLS0gTWlncmF0aW9uIHBhcnRpZWxsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIENhcyBwacOoZ2UgOiBzdXIgdW5lIG3Dqm1lIHBhZ2UgY2VydGFpbmVzIHJvd3Mgb250IMOpdMOpIHJlbm9tbcOpZXMgZW4KICAgICBuYXYt4oCmIGV0IGQnYXV0cmVzIG5vbi4gTGUgbW9kZSBub21pbmFsIGwnZW1wb3J0ZSBldCBsZXMgcm93cyBub24KICAgICByZW5vbW3DqWVzIGRpc3BhcmFpc3NlbnQgU0lMRU5DSUVVU0VNRU5UIGR1IG1lbnUuIE9uIGxlIHNpZ25hbGUuICovCiAgZnVuY3Rpb24gd2FybklmUGFydGlhbGx5TWlncmF0ZWQoc2Vlbil7CiAgICBpZighd2luZG93LmNvbnNvbGUgfHwgIWNvbnNvbGUud2Fybil7IHJldHVybjsgfQogICAgdmFyIHN0cmFnZ2xlcnMgPSBbXTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBMRUdBQ1lfS0VZUy5sZW5ndGg7IGkrKyl7CiAgICAgIHZhciBrID0gTEVHQUNZX0tFWVNbaV07CiAgICAgIGlmKHNlZW5ba10peyBjb250aW51ZTsgfSAvKiBkw6lqw6AgcHLDqXNlbnQgdmlhIHVuZSByb3cgbmF2LSAqLwogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChrKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaWRePSInICsgayArICctIl0nKTsKICAgICAgaWYoZWwgJiYgaXNTZWN0aW9uQ2FuZGlkYXRlKGVsKSl7IHN0cmFnZ2xlcnMucHVzaChrICsgJyAoIycgKyBlbC5pZCArICcpJyk7IH0KICAgIH0KICAgIGlmKCFzdHJhZ2dsZXJzLmxlbmd0aCl7IHJldHVybjsgfQogICAgY29uc29sZS53YXJuKAogICAgICAnW25weC1zdWJuYXZdIE1pZ3JhdGlvbiBpbmNvbXBsZXRlIHN1ciBjZXR0ZSBwYWdlIDogJyArIHN0cmFnZ2xlcnMubGVuZ3RoICsKICAgICAgJyByb3cocykgcG9ydGVudCBlbmNvcmUgdW4gYW5jaWVuIFJvdyBJRCBldCBzb250IEFCU0VOVEVTIGR1IG1lbnUgLT4gJyArCiAgICAgIHN0cmFnZ2xlcnMuam9pbignLCAnKSArICdcbicgKwogICAgICAnTGVzIHJlbm9tbWVyIGF2ZWMgbGUgcHJlZml4ZSAiJyArIFBSRUZJWCArICciIChleC4gJyArIFBSRUZJWCArIExFR0FDWV9LRVlTWzBdICsgJykuJwogICAgKTsKICB9CgogIC8qIC0tLS0gTWVzc2FnZSBkZSBkaWFnbm9zdGljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIEludmlzaWJsZSBwb3VyIGxlcyB2aXNpdGV1cnMsIGTDqWNpc2lmIHBvdXIgbGEgcGVyc29ubmUgcXVpIHJlcHJlbmQKICAgICBsZSBkb3NzaWVyIDogb24gZGl0IGNlIHF1aSBhIMOpdMOpIGNoZXJjaMOpIGV0IGNlIHF1aSBhIMOpdMOpIHRyb3V2w6kuICovCiAgZnVuY3Rpb24gd2Fybk5vdGhpbmdGb3VuZCgpewogICAgaWYoIXdpbmRvdy5jb25zb2xlIHx8ICFjb25zb2xlLndhcm4peyByZXR1cm47IH0KICAgIHZhciB3aXRoSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyk7CiAgICBjb25zb2xlLndhcm4oCiAgICAgICdbbnB4LXN1Ym5hdl0gQXVjdW5lIHNlY3Rpb24gdHJvdXbDqWUgOiBsYSBiYXJyZSByZXN0ZSBtYXNxdcOpZS5cbicgKwogICAgICAnLSBSZWNoZXJjaMOpIGVuIHByaW9yaXTDqSA6IGRlcyBSb3cgSUQgY29tbWVuw6dhbnQgcGFyICInICsgUFJFRklYICsgJyIgKGV4LiBuYXYtb3ZlcnZpZXcpLlxuJyArCiAgICAgICctIFB1aXMsIGVuIHJlcGxpLCBsZXMgY2xlcyBoZXJpdGVlcyA6ICcgKyBMRUdBQ1lfS0VZUy5qb2luKCcsICcpICsgJy5cbicgKwogICAgICAnLSBQYWdlIGxhbmc9IicgKyAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnbGFuZycpIHx8ICcoYWJzZW50KScpICsgJyIsICcgKwogICAgICB3aXRoSWQubGVuZ3RoICsgJyBlbGVtZW50KHMpIHBvcnRlbnQgdW4gaWQuXG4nICsKICAgICAgJy0gQ2F1c2UgbGEgcGx1cyBmcmVxdWVudGUgOiBsZXMgUm93IElEIGRlIENFVFRFIHBhZ2UgbmUgc29udCBwYXMgbm9tbWVzLiAnICsKICAgICAgJ1NvdXMgV1BNTCB1bmUgdHJhZHVjdGlvbiBlc3QgdW4gcG9zdCBkaXN0aW5jdCDigJQgcmVub21tZXIgbGVzIFJvdyBJRCBkZSBsYSBwYWdlICcgKwogICAgICAnc291cmNlIG5lIHJlbm9tbWUgcGFzIGNldXggZGUgbGEgdHJhZHVjdGlvbiA6IGlsIGZhdXQgbGVzIHNhaXNpciBzdXIgY2hhcXVlIGxhbmd1ZS5cbicgKwogICAgICAnLSBQb3VyIGxhIGxpc3RlIGRlcyBpZHMgcHJlc2VudHMsIHJlY2hhcmdlciBsYSBwYWdlIGF2ZWMgP25weGRlYnVnPTEnCiAgICApOwogICAgaWYoREVCVUcpewogICAgICB2YXIgaWRzID0gW107CiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB3aXRoSWQubGVuZ3RoOyBpKyspeyBpZHMucHVzaCh3aXRoSWRbaV0uaWQpOyB9CiAgICAgIGNvbnNvbGUud2FybignW25weC1zdWJuYXZdIGlkcyBwcmVzZW50cyBzdXIgbGEgcGFnZSA6JywgaWRzKTsKICAgIH0KICB9CgogIC8qIC0tLS0gSW5pdGlhbGlzYXRpb24gZCd1bmUgaW5zdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBSZW52b2llIHRydWUgc2kgbGEgYmFycmUgYSDDqXTDqSBjb25zdHJ1aXRlLCBmYWxzZSBzJ2lsIG4neSBhdmFpdAogICAgIGF1Y3VuZSBzZWN0aW9uIChsJ2luc3RhbmNlIHJlc3RlIGFsb3JzIMOpbGlnaWJsZSDDoCB1bmUgbm91dmVsbGUKICAgICB0ZW50YXRpdmUgOiBkYXRhLW5weC1yZWFkeSBuJ2VzdCBwb3PDqSBxdSdlbiBjYXMgZGUgc3VjY8OocykuICovCiAgZnVuY3Rpb24gaW5pdChuYXYpewogICAgdmFyIGlubmVyID0gbmF2LnF1ZXJ5U2VsZWN0b3IoJy5ucHgtc3VibmF2X19pbm5lcicpOwogICAgaWYoIWlubmVyKXsKICAgICAgbmF2LnNldEF0dHJpYnV0ZSgnZGF0YS1ucHgtcmVhZHknLCAnMScpOyAvKiBiYWxpc2FnZSBpbmF0dGVuZHUgOiBuZSBwYXMgYm91Y2xlciBkZXNzdXMgKi8KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgdmFyIGxhbmcgID0gZGV0ZWN0TGFuZyhuYXYpOwogICAgdmFyIGRpY3QgID0gTEFCRUxTW2xhbmddIHx8IHt9OwogICAgdmFyIGZvdW5kID0gZGlzY292ZXIoZGljdCk7CiAgICB2YXIgZW50cmllcyA9IGZvdW5kLmVudHJpZXM7CgogICAgaWYoIWVudHJpZXMubGVuZ3RoKXsgcmV0dXJuIGZhbHNlOyB9CgogICAgbmF2LnNldEF0dHJpYnV0ZSgnZGF0YS1ucHgtcmVhZHknLCAnMScpOwogICAgbG9nKCdtb2RlID0nLCBmb3VuZC5tb2RlLCAnfCBsYW5nID0nLCBsYW5nLCAnfCBlbnRyZWVzID0nLCBlbnRyaWVzLm1hcChmdW5jdGlvbihlKXsKICAgICAgcmV0dXJuIGUua2V5ICsgJyAtPiAnICsgZS5sYWJlbCArICcgKCMnICsgZS5zZWN0aW9uLmlkICsgJyknOwogICAgfSkpOwoKICAgIGlubmVyLmlubmVySFRNTCA9ICcnOwogICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGUpewogICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgYS5ocmVmID0gJyMnICsgZS5zZWN0aW9uLmlkOwogICAgICBhLnRleHRDb250ZW50ID0gZS5sYWJlbDsKICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQoYSk7CiAgICAgIGUubGluayA9IGE7CiAgICB9KTsKICAgIG5hdi5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpOwoKICAgIC8qIC0tLS0gdi42LjQgOiBsYSBiYXJyZSB0aWVudCBzdXIgdW5lIGxpZ25lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgZmxleC13cmFwOm5vd3JhcCBzdXBwcmltZSBsYSAyZSBsaWduZS4gT24gbWVzdXJlIGV0IG9uIHJldGllbnQgbGUKICAgICAgIFBSRU1JRVIgcGFsaWVyIHF1aSByZW50cmUuIExlIHBhbGllciAwIGVzdCBsZSByZW5kdSB2LjYuMiA6IHVuZQogICAgICAgYmFycmUgcXVpIHJlbnRyYWl0IGRlamEgbmUgYm91Z2UgcGFzIGQndW4gcGl4ZWwuIFNpIG1lbWUgbGUKICAgICAgIHBsYW5jaGVyIGRlYm9yZGUgKHRlbGVwaG9uZSksIGxhIGJhcnJlIGRlZmlsZSBob3Jpem9udGFsZW1lbnQuCiAgICAgICBUb3V0IGVzdCBlbnZlbG9wcGUgOiBlbiBjYXMgZCdlcnJldXIgb24gcmV2aWVudCBhdSBwYWxpZXIgMC4gKi8KICAgIHZhciBTVEVQUyA9IFsKICAgICAgeyBmczogJzExcHgnLCAgIGxzOiAnLjEyZW0nLCBweDogJzE0cHgnLCBnYXA6ICcxMHB4JyB9LCAvKiByZW5kdSB2LjYuMiAqLwogICAgICB7IGZzOiAnMTFweCcsICAgbHM6ICcuMDllbScsIHB4OiAnMTNweCcsIGdhcDogJzlweCcgIH0sCiAgICAgIHsgZnM6ICcxMC41cHgnLCBsczogJy4wN2VtJywgcHg6ICcxMnB4JywgZ2FwOiAnOHB4JyAgfSwKICAgICAgeyBmczogJzEwcHgnLCAgIGxzOiAnLjA2ZW0nLCBweDogJzExcHgnLCBnYXA6ICc3cHgnICB9LAogICAgICB7IGZzOiAnOS41cHgnLCAgbHM6ICcuMDVlbScsIHB4OiAnMTBweCcsIGdhcDogJzZweCcgIH0sCiAgICAgIHsgZnM6ICc5cHgnLCAgICBsczogJy4wNGVtJywgcHg6ICc5cHgnLCAgZ2FwOiAnNXB4JyAgfSAgLyogcGxhbmNoZXIgKi8KICAgIF07CiAgICBmdW5jdGlvbiBhcHBseVN0ZXAocyl7CiAgICAgIHZhciBzdCA9IGlubmVyLnN0eWxlOwogICAgICBzdC5zZXRQcm9wZXJ0eSgnLS1ucHgtZnMnLCAgcy5mcyk7CiAgICAgIHN0LnNldFByb3BlcnR5KCctLW5weC1scycsICBzLmxzKTsKICAgICAgc3Quc2V0UHJvcGVydHkoJy0tbnB4LXB4JywgIHMucHgpOwogICAgICBzdC5zZXRQcm9wZXJ0eSgnLS1ucHgtZ2FwJywgcy5nYXApOwogICAgfQogICAgZnVuY3Rpb24gb3ZlcmZsb3dpbmcoKXsgcmV0dXJuIGlubmVyLnNjcm9sbFdpZHRoID4gaW5uZXIuY2xpZW50V2lkdGggKyAxOyB9CgogICAgdmFyIGZpdHRpbmcgPSBmYWxzZSwgbGFzdFcgPSAtMTsKICAgIGZ1bmN0aW9uIGZpdCgpewogICAgICBpZihmaXR0aW5nKXsgcmV0dXJuOyB9CiAgICAgIGZpdHRpbmcgPSB0cnVlOwogICAgICB0cnl7CiAgICAgICAgLyogQmFycmUgbm9uIG1lc3VyYWJsZSAobWFzcXVlZSwgb25nbGV0IHJlcGxpZSkgOiBuZSByaWVuIGNvbmNsdXJlLiAqLwogICAgICAgIGlmKGlubmVyLmNsaWVudFdpZHRoID4gNDApewogICAgICAgICAgdmFyIGksIGNob3NlbiA9IFNURVBTLmxlbmd0aCAtIDE7CiAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBTVEVQUy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIGFwcGx5U3RlcChTVEVQU1tpXSk7CiAgICAgICAgICAgIGlmKCFvdmVyZmxvd2luZygpKXsgY2hvc2VuID0gaTsgYnJlYWs7IH0KICAgICAgICAgIH0KICAgICAgICAgIGlmKGNob3NlbiAhPT0gaSl7IGFwcGx5U3RlcChTVEVQU1tjaG9zZW5dKTsgfQogICAgICAgICAgbGFzdFcgPSBuYXYuY2xpZW50V2lkdGg7CiAgICAgICAgfQogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBhcHBseVN0ZXAoU1RFUFNbMF0pOyAgLyogamFtYWlzIGRlIGJhcnJlIGNhc3NlZSAqLwogICAgICB9CiAgICAgIGZpdHRpbmcgPSBmYWxzZTsKICAgIH0KICAgIGZpdCgpOwoKICAgIC8qIExhIHBvbGljZSBkdSB0aGVtZSBhcnJpdmUgZW4gYXN5bmNocm9uZSA6IHJlbWVzdXJlciBhIHNvbiBhcnJpdmVlLiAqLwogICAgaWYoZG9jdW1lbnQuZm9udHMgJiYgZG9jdW1lbnQuZm9udHMucmVhZHkgJiYgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbil7CiAgICAgIHRyeXsgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbihmaXQsIGZpdCk7IH1jYXRjaChlcnIpe30KICAgIH0KICAgIHNldFRpbWVvdXQoZml0LCA2MDApOwogICAgc2V0VGltZW91dChmaXQsIDIwMDApOwoKICAgIC8qIExlIHBhc3NhZ2UgZW4gc3RpY2t5IGNoYW5nZSBsYSBsYXJnZXVyIHNhbnMgZXZlbmVtZW50IHJlc2l6ZS4gKi8KICAgIGlmKHdpbmRvdy5SZXNpemVPYnNlcnZlcil7CiAgICAgIHRyeXsKICAgICAgICBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24oKXsKICAgICAgICAgIGlmKG5hdi5jbGllbnRXaWR0aCAhPT0gbGFzdFcpeyBmaXQoKTsgfQogICAgICAgIH0pLm9ic2VydmUobmF2KTsKICAgICAgfWNhdGNoKGVycil7fQogICAgfQoKICAgIC8qIEVuIG1vZGUgZGVmaWxlbWVudCwgZ2FyZGVyIGxhIHBhc3RpbGxlIGFjdGl2ZSB2aXNpYmxlLiAqLwogICAgZnVuY3Rpb24gcmV2ZWFsKGxpbmspewogICAgICBpZighbGluayB8fCAhb3ZlcmZsb3dpbmcoKSl7IHJldHVybjsgfQogICAgICB2YXIgbCA9IGxpbmsub2Zmc2V0TGVmdCwgciA9IGwgKyBsaW5rLm9mZnNldFdpZHRoOwogICAgICB2YXIgdnMgPSBpbm5lci5zY3JvbGxMZWZ0LCB2ZSA9IHZzICsgaW5uZXIuY2xpZW50V2lkdGg7CiAgICAgIGlmKGwgPCB2cyl7IGlubmVyLnNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCBsIC0gMTIpOyB9CiAgICAgIGVsc2UgaWYociA+IHZlKXsgaW5uZXIuc2Nyb2xsTGVmdCA9IHIgLSBpbm5lci5jbGllbnRXaWR0aCArIDEyOyB9CiAgICB9CgogICAgZnVuY3Rpb24gdG9wT2Zmc2V0KCl7CiAgICAgIHZhciB2ID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJy0tbnB4LXRvcCcpOwogICAgICByZXR1cm4gcGFyc2VJbnQodiwgMTApIHx8IDA7CiAgICB9CiAgICAvKiBEw6lmaWxlbWVudCBhdmVjIGNvbXBlbnNhdGlvbiBkZXMgZGV1eCBtZW51cy4gKi8KICAgIGZ1bmN0aW9uIHRvdGFsT2Zmc2V0KCl7IHJldHVybiB0b3BPZmZzZXQoKSArIG5hdi5vZmZzZXRIZWlnaHQgKyA4OyB9CgogICAgLyogLS0tLSBDb2xsYWdlIDogZml4ZWQgKyBwbGFjZWhvbGRlciBhbnRpLXNhdXQgKG1vZGUgJ2pzJykgLS0tLSAqLwogICAgdmFyIHBoID0gbnVsbDsKICAgIGlmKFNUSUNLX01PREUgPT09ICdqcycpewogICAgICBwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBwaC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBuYXYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocGgsIG5hdik7CiAgICB9CiAgICBmdW5jdGlvbiBzdGljaygpewogICAgICBpZighcGgpeyByZXR1cm47IH0KICAgICAgdmFyIGFuY2hvciA9IChwaC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpID8gbmF2IDogcGg7CiAgICAgIHZhciBzaG91bGQgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIDw9IHRvcE9mZnNldCgpOwogICAgICBpZihzaG91bGQgJiYgIW5hdi5jbGFzc0xpc3QuY29udGFpbnMoJ25weC1zdHVjaycpKXsKICAgICAgICBwaC5zdHlsZS5oZWlnaHQgID0gbmF2Lm9mZnNldEhlaWdodCArICdweCc7CiAgICAgICAgcGguc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgbmF2LmNsYXNzTGlzdC5hZGQoJ25weC1zdHVjaycpOwogICAgICB9ZWxzZSBpZighc2hvdWxkICYmIG5hdi5jbGFzc0xpc3QuY29udGFpbnMoJ25weC1zdHVjaycpKXsKICAgICAgICBuYXYuY2xhc3NMaXN0LnJlbW92ZSgnbnB4LXN0dWNrJyk7CiAgICAgICAgcGguc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgfQogICAgfQoKICAgIC8qIC0tLS0gU2VjdGlvbiBhY3RpdmUgLS0tLSAqLwogICAgdmFyIGxhc3RDdXJyZW50ID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhpZ2hsaWdodCgpewogICAgICB2YXIgbGltaXQgPSB0b3RhbE9mZnNldCgpICsgNDsKICAgICAgdmFyIGN1cnJlbnQgPSBudWxsOwogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoZS5zZWN0aW9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA8PSBsaW1pdCl7IGN1cnJlbnQgPSBlOyB9CiAgICAgIH0pOwogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgICAgZS5saW5rLmNsYXNzTGlzdC50b2dnbGUoJ25weC1hY3RpdmUnLCBlID09PSBjdXJyZW50KTsKICAgICAgfSk7CiAgICAgIGlmKGN1cnJlbnQgIT09IGxhc3RDdXJyZW50KXsKICAgICAgICBsYXN0Q3VycmVudCA9IGN1cnJlbnQ7CiAgICAgICAgaWYoY3VycmVudCl7IHJldmVhbChjdXJyZW50LmxpbmspOyB9CiAgICAgIH0KICAgIH0KCiAgICAvKiAtLS0tIENsaWMgc3VyIHVuZSBlbnRyw6llIC0tLS0gKi8KICAgIHZhciBzbW9vdGggPSAhd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlczsKICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlKXsKICAgICAgZS5saW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZXYpewogICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdmFyIHkgPSBlLnNlY3Rpb24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0IC0gdG90YWxPZmZzZXQoKTsKICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IHksIGJlaGF2aW9yOiBzbW9vdGggPyAnc21vb3RoJyA6ICdhdXRvJyB9KTsKICAgICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgJyMnICsgZS5zZWN0aW9uLmlkKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBvblNjcm9sbCgpeyBzdGljaygpOyBoaWdobGlnaHQoKTsgfQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24oKXsgZml0KCk7IG9uU2Nyb2xsKCk7IH0pOwogICAgb25TY3JvbGwoKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLyogLS0tLSBBbW9yw6dhZ2UgOiB0b3V0ZXMgbGVzIGluc3RhbmNlcywgYXZlYyBxdWVscXVlcyByZWxhbmNlcyAtLS0tLS0KICAgICBMZXMgcm93cyBVbmNvZGUgcGV1dmVudCDDqnRyZSBpbmplY3TDqWVzIGFwcsOocyBsZSBET01Db250ZW50TG9hZGVkCiAgICAgKGxhenkgLyBBSkFYKSA6IG9uIHJldGVudGUgcGVuZGFudCB+Miw1IHMgYXZhbnQgZGUgY29uY2x1cmUuICovCiAgZnVuY3Rpb24gYm9vdCgpewogICAgdmFyIG5hdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubnB4LXN1Ym5hdjpub3QoW2RhdGEtbnB4LXJlYWR5XSknKTsKICAgIHZhciBwZW5kaW5nID0gMDsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuYXZzLmxlbmd0aDsgaSsrKXsKICAgICAgaWYoIWluaXQobmF2c1tpXSkpeyBwZW5kaW5nKys7IH0KICAgIH0KICAgIHJldHVybiBwZW5kaW5nOwogIH0KCiAgZnVuY3Rpb24gcnVuKCl7CiAgICBpZihib290KCkgPT09IDApeyByZXR1cm47IH0KICAgIHZhciB0cmllcyA9IDA7CiAgICB2YXIgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewogICAgICB0cmllcysrOwogICAgICB2YXIgbGFzdCA9IHRyaWVzID49IDY7IC8qIDYgeCA0MDAgbXMgKi8KICAgICAgaWYoYm9vdCgpID09PSAwIHx8IGxhc3QpewogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgIGlmKGxhc3QgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5weC1zdWJuYXY6bm90KFtkYXRhLW5weC1yZWFkeV0pJykpewogICAgICAgICAgd2Fybk5vdGhpbmdGb3VuZCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgNDAwKTsKICB9CgogIGlmKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyl7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcnVuKTsKICB9ZWxzZXsKICAgIHJ1bigpOwogIH0KfSkoKTsKPC9zY3JpcHQ+[\/vc_raw_html][\/vc_column][\/vc_row][vc_row unlock_row_content=\u00a0\u00bbyes\u00a0\u00bb row_height_percent=\u00a0\u00bb0&Prime; override_padding=\u00a0\u00bbyes\u00a0\u00bb h_padding=\u00a0\u00bb5&Prime; top_padding=\u00a0\u00bb5&Prime; bottom_padding=\u00a0\u00bb5&Prime; [&hellip;]","og_url":"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/","og_site_name":"NumPEx","article_modified_time":"2026-09-10T20:38:22+00:00","og_image":[{"width":1920,"height":1076,"url":"https:\/\/numpex.org\/wp-content\/uploads\/sites\/6\/2023\/06\/Illustration_for_hiring_scientist_on_the_exascale-02-NO-PEOPLE-1920px-low.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/","url":"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/","name":"L'IA au service de la science - NumPEx","isPartOf":{"@id":"https:\/\/numpex.org\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/#primaryimage"},"image":{"@id":"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/#primaryimage"},"thumbnailUrl":"https:\/\/numpex.org\/wp-content\/uploads\/sites\/6\/2023\/06\/Illustration_for_hiring_scientist_on_the_exascale-02-NO-PEOPLE-1920px-low.jpg","datePublished":"2025-10-16T10:08:03+00:00","dateModified":"2026-09-10T20:38:22+00:00","breadcrumb":{"@id":"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/#primaryimage","url":"https:\/\/numpex.org\/wp-content\/uploads\/sites\/6\/2023\/06\/Illustration_for_hiring_scientist_on_the_exascale-02-NO-PEOPLE-1920px-low.jpg","contentUrl":"https:\/\/numpex.org\/wp-content\/uploads\/sites\/6\/2023\/06\/Illustration_for_hiring_scientist_on_the_exascale-02-NO-PEOPLE-1920px-low.jpg","width":1920,"height":1076},{"@type":"BreadcrumbList","@id":"https:\/\/numpex.org\/fr\/lia-au-service-de-la-science\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/numpex.org\/fr\/"},{"@type":"ListItem","position":2,"name":"L&rsquo;IA au service de la science"}]},{"@type":"WebSite","@id":"https:\/\/numpex.org\/fr\/#website","url":"https:\/\/numpex.org\/fr\/","name":"NumPEx","description":"Digital for Exascale","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/numpex.org\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/numpex.org\/fr\/wp-json\/wp\/v2\/pages\/2416","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numpex.org\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/numpex.org\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/numpex.org\/fr\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/numpex.org\/fr\/wp-json\/wp\/v2\/comments?post=2416"}],"version-history":[{"count":16,"href":"https:\/\/numpex.org\/fr\/wp-json\/wp\/v2\/pages\/2416\/revisions"}],"predecessor-version":[{"id":4097,"href":"https:\/\/numpex.org\/fr\/wp-json\/wp\/v2\/pages\/2416\/revisions\/4097"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/numpex.org\/fr\/wp-json\/wp\/v2\/media\/205"}],"wp:attachment":[{"href":"https:\/\/numpex.org\/fr\/wp-json\/wp\/v2\/media?parent=2416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}