#!/system/bin/sh
# Kernel Core - Device Identity Manager

G="\033[1;32m"; R="\033[1;31m"; C="\033[1;36m"; D="\033[2m"; N="\033[0m"
AUTH_HASH="ad9cdbefb70da610b07dcc613934052a0996f5c0da58a2d9632ec966361de506"

verify_auth() {
    local input="$1" hash
    if command -v sha256sum >/dev/null 2>&1; then
        hash=$(echo -n "$input" | sha256sum | cut -d' ' -f1)
    elif command -v md5sum >/dev/null 2>&1; then
        hash=$(echo -n "$input" | md5sum | cut -d' ' -f1)
    else
        hash=$(echo -n "$input" | cksum | awk '{print $1}')
    fi
    [ "$hash" = "$AUTH_HASH" ]
}

if [ -n "$1" ] && verify_auth "$1"; then
    shift
elif [ -t 0 ]; then
    try=0
    while [ $try -lt 3 ]; do
        printf "  Kernel Core - Password: "
        read -r pass
        verify_auth "$pass" && break
        try=$((try+1))
        printf "  X Error (remaining %d)\n" $((3-try))
    done
    [ $try -ge 3 ] && { echo -e "  X Locked"; exit 1; }
else
    echo "  Usage: sh $0 <password> [args...]"
    exit 1
fi

TMPFILE="/data/adb/.kc_exec.sh"
echo 'IyEvc3lzdGVtL2Jpbi9zaAojIEtlcm5lbCBDb3JlIHYyLjIgLSDorr7lpIfmoIfor4bnrqHnkIYKIyBVc2FnZTogc3UgLWMgInNoIGtlcm5lbC1jb3JlLnNoIiAgICAgICAgICAgIOKGkiDkuqTkupLoj5zljZUKIyAgICAgICAgc3UgLWMgInNoIGtlcm5lbC1jb3JlLnNoIHF1aWNrIiAgICAgICDihpIg5LiA6ZSu6YeN572uCiMgICAgICAgIHN1IC1jICJzaCBrZXJuZWwtY29yZS5zaCBzdGF0dXMiICAgICAg4oaSIOafpeeci+eKtuaAgQojICAgICAgICBzdSAtYyAic2gga2VybmVsLWNvcmUuc2ggcmVzdG9yZSIgICAgIOKGkiDov5jljp/lpIfku70KIyAgICAgICAgc3UgLWMgInNoIGtlcm5lbC1jb3JlLnNoIGRyeXJ1biIgICAgICDihpIg6aKE6KeICiMgICAgICAgIHN1IC1jICJzaCBrZXJuZWwtY29yZS5zaCBleHBvcnQiICAgICAg4oaSIOWvvOWHuumFjee9rgojICAgICAgICBzdSAtYyAic2gga2VybmVsLWNvcmUuc2ggaW1wb3J0IiAgICAgIOKGkiDlr7zlhaXphY3nva4KIyAgICAgICAgc3UgLWMgInNoIGtlcm5lbC1jb3JlLnNoIGhpc3RvcnkiICAgICDihpIg5pON5L2c6K6w5b2VCiMgICAgICAgIHN1IC1jICJzaCBrZXJuZWwtY29yZS5zaCBoZWxwIiAgICAgICAg4oaSIOW4ruWKqQoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb25zdGFudHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKVkVSU0lPTj0iMi4yIgpXPTQ0ICAjIEJveCB3aWR0aCAoaW5uZXIpCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFVJIENvbG9ycyAmIEhlbHBlcnMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKRz0iXDAzM1sxOzMybSI7IFk9IlwwMzNbMTszM20iOyBSPSJcMDMzWzE7MzFtIjsgQz0iXDAzM1sxOzM2bSI7IEI9IlwwMzNbMTszNG0iOyBEPSJcMDMzWzJtIjsgTj0iXDAzM1swbSIKb2soKSAgIHsgZWNobyAtZSAiICAke0d94pyTJHtOfSAkMSI7IH0KaW5mbygpIHsgZWNobyAtZSAiICAke1l94pePJHtOfSAkMSI7IH0KZXJyKCkgIHsgZWNobyAtZSAiICAke1J94pyXJHtOfSAkMSI7IH0Kd2FybigpIHsgZWNobyAtZSAiICAke1l9ISR7Tn0gJDEiOyB9CgojIEJveCBoZWxwZXJzICh1bmlmaWVkIHdpZHRoIFc9NDQpCmJveF9kYmwoKSAgeyBlY2hvIC1lICIgICR7Q33ilZQkKHByaW50ZiAn4pWQJS4wcycgJChzZXEgMSAkVykp4pWXJHtOfSI7IH0KYm94X3RvcCgpICB7IGVjaG8gLWUgIiAgJHtDfeKUjCQocHJpbnRmICfilIAlLjBzJyAkKHNlcSAxICRXKSnilJAke059IjsgfQpib3hfbWlkKCkgIHsgZWNobyAtZSAiICAke0N94pScJChwcmludGYgJ+KUgCUuMHMnICQoc2VxIDEgJFcpKeKUpCR7Tn0iOyB9CmJveF9ib3QoKSAgeyBlY2hvIC1lICIgICR7Q33ilJQkKHByaW50ZiAn4pSAJS4wcycgJChzZXEgMSAkVykp4pSYJHtOfSI7IH0KYm94X2VuZCgpICB7IGVjaG8gLWUgIiAgJHtDfeKVmiQocHJpbnRmICfilZAlLjBzJyAkKHNlcSAxICRXKSnilZ0ke059IjsgfQpib3hfcm93KCkgIHsgcHJpbnRmICIgICR7Q33ilIIke059ICUtJHtXfXMgJHtDfeKUgiR7Tn1cbiIgIiQxIjsgfQpib3hfcm93MigpIHsgcHJpbnRmICIgICR7Q33ilIIke059ICAlLTIwcyAlLTIwcyAke0N94pSCJHtOfVxuIiAiJDEiICIkMiI7IH0KYm94X2hkcigpICB7IGVjaG8gLWUgIiAgJHtDfeKVkSR7Tn0gICR7Qn0kMSR7Tn0kKHByaW50ZiAnICUuMHMnICQoc2VxIDEgJCgoVyAtICR7IzF9IC0gMikpKSkke0N94pWRJHtOfSI7IH0KCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgUGF0aHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKU0NSSVBUX1BBVEg9JChyZWFkbGluayAtZiAiJDAiIDI+L2Rldi9udWxsIHx8IGVjaG8gIiQwIikKQ09ORklHPSIvZGF0YS9hZGIvLmtjX2NvbmZpZy5kYXQiCkJBQ0tVUD0iL2RhdGEvYWRiLy5rY19iYWNrdXAuZGF0IgpMT0dGSUxFPSIvZGF0YS9hZGIvLmtjLmxvZyIKUEtHX0NBQ0hFPSIiCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFJvb3QgY2hlY2sKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKWyAiJChpZCAtdSkiIC1uZSAwIF0gJiYgeyBlcnIgIumcgOimgXJvb3TmnYPpmZAiOyBleGl0IDE7IH0KSEFTX1JFU0VUUFJPUD1mYWxzZQpjb21tYW5kIC12IHJlc2V0cHJvcCA+L2Rldi9udWxsIDI+JjEgJiYgSEFTX1JFU0VUUFJPUD10cnVlCnNhZmVfcmVzZXRwcm9wKCkgewogICAgWyAtbiAiJDIiIF0gJiYgWyAiJDIiICE9ICJudWxsIiBdICYmIFsgIiQyIiAhPSAidW5rbm93biIgXSB8fCByZXR1cm4KICAgIGlmICRIQVNfUkVTRVRQUk9QOyB0aGVuCiAgICAgICAgcmVzZXRwcm9wICIkMSIgIiQyIiAyPi9kZXYvbnVsbAogICAgZWxzZQogICAgICAgIHNldHByb3AgIiQxIiAiJDIiIDI+L2Rldi9udWxsCiAgICBmaQp9CgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEhlbHBlcnMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKcmFuZF9oZXgoKSB7IGhlYWQgLWMgIiQxIiAvZGV2L3VyYW5kb20gfCBvZCAtQW4gLXR4MSB8IHRyIC1kICcgXG4nIHwgaGVhZCAtYyAiJDEiOyB9CnJhbmRfZGlnaXRzKCkgeyBsb2NhbCByPSIiIGk7IGZvciBpIGluICQoc2VxIDEgIiQxIik7IGRvIHI9IiRyJCgoUkFORE9NJTEwKSkiOyBkb25lOyBlY2hvICIkciI7IH0KZ2VuX2ltZWkoKSB7CiAgICBsb2NhbCBiYXNlPSI4NiQocmFuZF9kaWdpdHMgMTMpIiBzdW09MCBpIGQgYwogICAgaT0wOyB3aGlsZSBbICRpIC1sdCAkeyNiYXNlfSBdOyBkbwogICAgICAgIGQ9JHtiYXNlOiRpOjF9OyBbICQoKGklMikpIC1lcSAwIF0gJiYgeyBkPSQoKGQqMikpOyBbICRkIC1ndCA5IF0gJiYgZD0kKChkLTkpKTsgfQogICAgICAgIHN1bT0kKChzdW0rZCkpOyBpPSQoKGkrMSkpCiAgICBkb25lOyBjPSQoKCAoMTAtKHN1bSUxMCkpJTEwICkpOyBlY2hvICIke2Jhc2V9JHtjfSIKfQpnZW5fbWFjKCkgeyBwcmludGYgIjAyOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIgJCgoUkFORE9NJTI1NikpICQoKFJBTkRPTSUyNTYpKSAkKChSQU5ET00lMjU2KSkgJCgoUkFORE9NJTI1NikpICQoKFJBTkRPTSUyNTYpKTsgfQpnZW5fc2VyaWFsKCkgewogICAgbG9jYWwgY3M9IkFCQ0RFRkdISktNTlBRUlNUVVZXWFlaMjM0NTY3ODkiIHI9IiIgaSBuPSQoKFJBTkRPTSUzKzEyKSkKICAgIGZvciBpIGluICQoc2VxIDEgJG4pOyBkbyByPSIke3J9JHtjczokKChSQU5ET00lJHsjY3N9KSk6MX0iOyBkb25lOyBlY2hvICIkciIKfQpnZXRfd2lmaV9pZmFjZSgpIHsgbG9jYWwgaT0kKGxzIC9zeXMvY2xhc3MvbmV0LyB8IGdyZXAgLUUgJ153bGFufF5zd2xhbicgfCBoZWFkIC0xKTsgZWNobyAiJHtpOi13bGFuMH0iOyB9Cgpsb2dfYWN0aW9uKCkgeyBlY2hvICJbJChkYXRlICcrJW0tJWQgJUg6JU0nKV0gJDEiID4+ICIkTE9HRklMRSIgMj4vZGV2L251bGw7IH0KCiMgQ2FjaGUgcGFja2FnZSBsaXN0IG9uY2UKY2FjaGVfcGtnKCkgeyBQS0dfQ0FDSEU9JChwbSBsaXN0IHBhY2thZ2VzIDI+L2Rldi9udWxsIHwgc2VkICdzL3BhY2thZ2U6Ly8nKTsgfQpwa2dfaGFzKCkgeyBlY2hvICIkUEtHX0NBQ0hFIiB8IGdyZXAgLXFpICIkMSI7IH0KCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ29uZmlnIChzYWZlIHBhcnNpbmcsIG5vIHNvdXJjZSkKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKVEFSR0VUX0FQUFM9IiIKRVhDTFVERV9BUFBTPSIiCk1PREVfQ0FDSEU9IiIKCmxvYWRfY29uZmlnKCkgewogICAgaWYgWyAtZiAiJENPTkZJRyIgXTsgdGhlbgogICAgICAgIFRBUkdFVF9BUFBTPSQoZ3JlcCAnXlRBUkdFVF9BUFBTPScgIiRDT05GSUciIDI+L2Rldi9udWxsIHwgY3V0IC1kPSAtZjIpCiAgICAgICAgRVhDTFVERV9BUFBTPSQoZ3JlcCAnXkVYQ0xVREVfQVBQUz0nICIkQ09ORklHIiAyPi9kZXYvbnVsbCB8IGN1dCAtZD0gLWYyKQogICAgZmkKICAgIFsgLXogIiRUQVJHRVRfQVBQUyIgXSAmJiBUQVJHRVRfQVBQUz0iQUxMX0dBTUVTIgogICAgTU9ERV9DQUNIRT0iIiAgIyBJbnZhbGlkYXRlIGNhY2hlCn0Kc2F2ZV9jb25maWcoKSB7CiAgICBjYXQgPiAiJENPTkZJRyIgPDwgRU9GClRBUkdFVF9BUFBTPSR7VEFSR0VUX0FQUFN9CkVYQ0xVREVfQVBQUz0ke0VYQ0xVREVfQVBQU30KRU9GCiAgICBjaG1vZCA2MDAgIiRDT05GSUciCiAgICBNT0RFX0NBQ0hFPSIiICAjIEludmFsaWRhdGUgY2FjaGUKfQoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBCYWNrdXAgJiBSZXN0b3JlCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCmJhY2t1cCgpIHsKICAgIG1rZGlyIC1wIC9kYXRhL2FkYjsgY2htb2QgNzUwIC9kYXRhL2FkYiAyPi9kZXYvbnVsbAogICAgWyAtZiAiJEJBQ0tVUCIgXSAmJiByZXR1cm4gMAogICAgaW5mbyAi6aaW5qyh5aSH5Lu95Y6f5aeL5qCH6K+GLi4uIgogICAgbG9jYWwgaWZhY2U9JChnZXRfd2lmaV9pZmFjZSkKICAgIGNhdCA+ICIkQkFDS1VQIiA8PCBFT0YKU049JChnZXRwcm9wIHJvLnNlcmlhbG5vIDI+L2Rldi9udWxsKQpBTkRST0lEX0lEPSQoc2V0dGluZ3MgZ2V0IHNlY3VyZSBhbmRyb2lkX2lkIDI+L2Rldi9udWxsKQpJTUVJMT0kKGdldHByb3AgZ3NtLmltZWkgMj4vZGV2L251bGwpCklNRUkyPSQoZ2V0cHJvcCBnc20uaW1laTIgMj4vZGV2L251bGwpCldJRklfTUFDPSQoaXAgbGluayBzaG93ICIkaWZhY2UiIDI+L2Rldi9udWxsIHwgYXdrICcvbGluay8ge3ByaW50ICQyfScpCkJUX01BQz0kKGdldHByb3AgbmV0LmJsdWV0b290aC5tYWMgMj4vZGV2L251bGwpCldJRklfSUZBQ0U9JGlmYWNlCkVPRgogICAgY2htb2QgNjAwICIkQkFDS1VQIjsgb2sgIuWOn+Wni+agh+ivhuW3suWkh+S7vSI7IHJldHVybiAwCn0KCmZpbmRfYmFja3VwKCkgeyBscyAtdCAvZGF0YS9hZGIvLmtjX2JhY2t1cC5kYXQgL2RhdGEvYWRiLy52ZHJfKi5kYXQgMj4vZGV2L251bGwgfCBoZWFkIC0xOyB9Cgpkb19yZXN0b3JlKCkgewogICAgbG9jYWwgZj0kKGZpbmRfYmFja3VwKQogICAgWyAteiAiJGYiIF0gJiYgeyBlcnIgIuaXoOWkh+S7veaWh+S7tiI7IHJldHVybiAxOyB9CiAgICBpbmZvICLov5jljp/oh6o6ICR7RH0kZiR7Tn0iCiAgICBsb2NhbCBTTj0kKGdyZXAgJ15TTj0nICIkZiIgfCBjdXQgLWQ9IC1mMiB8IHRyIC1jZCAnYS16QS1aMC05Xy0nKQogICAgbG9jYWwgQUlEPSQoZ3JlcCAnXkFORFJPSURfSUQ9JyAiJGYiIHwgY3V0IC1kPSAtZjIgfCB0ciAtY2QgJ2EtZjAtOScpCiAgICBsb2NhbCBJTTE9JChncmVwICdeSU1FSTE9JyAiJGYiIHwgY3V0IC1kPSAtZjIgfCB0ciAtY2QgJzAtOScpCiAgICBsb2NhbCBJTTI9JChncmVwICdeSU1FSTI9JyAiJGYiIHwgY3V0IC1kPSAtZjIgfCB0ciAtY2QgJzAtOScpCiAgICBsb2NhbCBXTT0kKGdyZXAgJ15XSUZJX01BQz0nICIkZiIgfCBjdXQgLWQ9IC1mMiB8IHRyIC1jZCAnYS1mMC05OicpCiAgICBsb2NhbCBCTT0kKGdyZXAgJ15CVF9NQUM9JyAiJGYiIHwgY3V0IC1kPSAtZjIgfCB0ciAtY2QgJ2EtZjAtOTonKQogICAgbG9jYWwgSUY9JChncmVwICdeV0lGSV9JRkFDRT0nICIkZiIgfCBjdXQgLWQ9IC1mMiB8IHRyIC1jZCAnYS16MC05JykKICAgIFsgLXogIiRJRiIgXSAmJiBJRj0kKGdldF93aWZpX2lmYWNlKQogICAgWyAkeyNBSUR9IC1uZSAxNiBdICYmIEFJRD0iIjsgWyAkeyNJTTF9IC1uZSAxNSBdICYmIElNMT0iIgoKICAgIFsgLW4gIiRTTiIgXSAmJiB7IHNhZmVfcmVzZXRwcm9wIHJvLnNlcmlhbG5vICIkU04iOyBzYWZlX3Jlc2V0cHJvcCBwZXJzaXN0LnN5cy5zZXJpYWxubyAiJFNOIjsgc2FmZV9yZXNldHByb3Agcm8uYm9vdC5zZXJpYWxubyAiJFNOIjsgb2sgIlNOOiAkU04iOyB9CiAgICBbIC1uICIkQUlEIiBdICYmIHsgc2V0dGluZ3MgcHV0IHNlY3VyZSBhbmRyb2lkX2lkICIkQUlEIjsgb2sgIkFuZHJvaWQ6ICRBSUQiOyB9CiAgICBbIC1uICIkSU0xIiBdICYmIHsgc2FmZV9yZXNldHByb3AgcGVyc2lzdC5yYWRpby5pbWVpICIkSU0xIjsgc2FmZV9yZXNldHByb3AgcGVyc2lzdC5yYWRpby5pbWVpMiAiJElNMiI7IHNhZmVfcmVzZXRwcm9wIGdzbS5pbWVpICIkSU0xIjsgc2FmZV9yZXNldHByb3AgZ3NtLmltZWkyICIkSU0yIjsgb2sgIklNRUk6ICRJTTEiOyB9CiAgICBbIC1uICIkV00iIF0gJiYgeyBpcCBsaW5rIHNldCAiJElGIiBkb3duIDI+L2Rldi9udWxsOyBpcCBsaW5rIHNldCAiJElGIiBhZGRyZXNzICIkV00iIDI+L2Rldi9udWxsOyBpcCBsaW5rIHNldCAiJElGIiB1cCAyPi9kZXYvbnVsbDsgc2FmZV9yZXNldHByb3AgcGVyc2lzdC53bGFuLm1hYyAiJFdNIjsgb2sgIldpRmk6ICRXTSI7IH0KICAgIFsgLW4gIiRCTSIgXSAmJiB7IHNhZmVfcmVzZXRwcm9wIHBlcnNpc3Quc2VydmljZS5ibHVldG9vdGgubWFjICIkQk0iOyBzYWZlX3Jlc2V0cHJvcCBuZXQuYmx1ZXRvb3RoLm1hYyAiJEJNIjsgb2sgIkJUOiAkQk0iOyB9CiAgICBsb2dfYWN0aW9uICJSRVNUT1JFIGZyb20gJGYiCiAgICBpbmZvICLph43lkK/nlJ/mlYgiCn0KCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgR2FtZSBEZXRlY3Rpb24KIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKZGV0ZWN0X2dhbWVzKCkgewogICAgbG9jYWwgZ2FtZXM9JChwbSBsaXN0IHBhY2thZ2VzIC0tY2F0ZWdvcnkgZ2FtZSAyPi9kZXYvbnVsbCB8IHNlZCAncy9wYWNrYWdlOi8vJyB8IGdyZXAgLUUgJ15bYS16QS1aXVthLXpBLVowLTkuX10rJCcpCiAgICBpZiBbIC16ICIkZ2FtZXMiIF07IHRoZW4KICAgICAgICAjIEZhbGxiYWNrIHdpdGggdGltZW91dDogc2NhbiBjYXRlZ29yaWVzCiAgICAgICAgbG9jYWwgY250PTAKICAgICAgICBmb3IgcGtnIGluICQocG0gbGlzdCBwYWNrYWdlcyAtMyB8IHNlZCAncy9wYWNrYWdlOi8vJyk7IGRvCiAgICAgICAgICAgIGNudD0kKChjbnQrMSkpCiAgICAgICAgICAgIFsgJGNudCAtZ3QgMjAwIF0gJiYgYnJlYWsgICMgU2FmZXR5IGxpbWl0CiAgICAgICAgICAgIGxvY2FsIGM9JChkdW1wc3lzIHBhY2thZ2UgIiRwa2ciIDI+L2Rldi9udWxsIHwgZ3JlcCAiY2F0ZWdvcnk9IiB8IGhlYWQgLTEgfCBzZWQgJ3MvLipjYXRlZ29yeT0vLycpCiAgICAgICAgICAgIFsgIiRjIiA9ICIwIiBdIHx8IFsgIiRjIiA9ICI0IiBdICYmIGNhc2UgIiRwa2ciIGluIFthLXpBLVpdKikgZ2FtZXM9IiRnYW1lcyAkcGtnIiA7OyBlc2FjCiAgICAgICAgZG9uZQogICAgZmkKICAgIGVjaG8gIiRnYW1lcyIgfCB0ciAnICcgJ1xuJyB8IHNvcnQgLXUgfCBncmVwIC12ICdeJCcKfQoKIyBHZXQgYXBwIGRpc3BsYXkgbmFtZQpnZXRfYXBwX25hbWUoKSB7CiAgICBsb2NhbCBuYW1lPSQocG0gZHVtcCAiJDEiIDI+L2Rldi9udWxsIHwgZ3JlcCAtbTEgJ2FwcGxpY2F0aW9uLWxhYmVsJyB8IHNlZCAncy8uKmFwcGxpY2F0aW9uLWxhYmVsLS4qOi8vO3MvIi8vZycgfCB0ciAtZCAnICcpCiAgICBlY2hvICIke25hbWU6LSQxfSIKfQoKZ2V0X3RhcmdldF9hcHBzKCkgewogICAgbG9jYWwgYXBwcz0iIgogICAgY2FzZSAiJFRBUkdFVF9BUFBTIiBpbgogICAgICAgIEFMTF9HQU1FUykgYXBwcz0kKGRldGVjdF9nYW1lcykgOzsKICAgICAgICBBTExfVEhJUkRfUEFSVFkpIGFwcHM9JChwbSBsaXN0IHBhY2thZ2VzIC0zIHwgc2VkICdzL3BhY2thZ2U6Ly8nKSA7OwogICAgICAgICopIGFwcHM9JChlY2hvICIkVEFSR0VUX0FQUFMiIHwgdHIgJywnICdcbicpIDs7CiAgICBlc2FjCiAgICBpZiBbIC1uICIkRVhDTFVERV9BUFBTIiBdOyB0aGVuCiAgICAgICAgbG9jYWwgZXhjbD0kKGVjaG8gIiRFWENMVURFX0FQUFMiIHwgdHIgJywnICd8JykKICAgICAgICBhcHBzPSQoZWNobyAiJGFwcHMiIHwgZ3JlcCAtdkUgIl4oJGV4Y2wpJCIpCiAgICBmaQogICAgZWNobyAiJGFwcHMiIHwgZ3JlcCAtdiAnXiQnCn0KCiMgU2hvdyBjdXJyZW50IG1vZGUgKGNhY2hlZCkKc2hvd19tb2RlKCkgewogICAgWyAtbiAiJE1PREVfQ0FDSEUiIF0gJiYgeyBlY2hvICIkTU9ERV9DQUNIRSI7IHJldHVybjsgfQogICAgY2FzZSAiJFRBUkdFVF9BUFBTIiBpbgogICAgICAgIEFMTF9HQU1FUykgTU9ERV9DQUNIRT0i5omA5pyJ5ri45oiPIiA7OwogICAgICAgIEFMTF9USElSRF9QQVJUWSkgTU9ERV9DQUNIRT0i5omA5pyJ56ys5LiJ5pa5IiA7OwogICAgICAgICopCiAgICAgICAgICAgIGxvY2FsIG5hbWVzPSIiIGNudD0wCiAgICAgICAgICAgIGZvciBwa2cgaW4gJChlY2hvICIkVEFSR0VUX0FQUFMiIHwgdHIgJywnICdcbicpOyBkbwogICAgICAgICAgICAgICAgY250PSQoKGNudCsxKSkKICAgICAgICAgICAgICAgIFsgJGNudCAtZ3QgNSBdICYmIHsgbmFtZXM9IiRuYW1lcy4uLiI7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBsb2NhbCBuPSQoZ2V0X2FwcF9uYW1lICIkcGtnIikKICAgICAgICAgICAgICAgIFsgLW4gIiRuYW1lcyIgXSAmJiBuYW1lcz0iJG5hbWVzLCAiCiAgICAgICAgICAgICAgICBuYW1lcz0iJG5hbWVzJG4iCiAgICAgICAgICAgIGRvbmUKICAgICAgICAgICAgTU9ERV9DQUNIRT0iJG5hbWVzIgogICAgICAgICAgICA7OwogICAgZXNhYwogICAgZWNobyAiJE1PREVfQ0FDSEUiCn0KCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQXBwIFRyYWNlIENsZWFuaW5nCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCmNsZWFuX2FwcF90cmFjZXMoKSB7CiAgICBsb2NhbCBwa2c9IiQxIiBkPSIvZGF0YS9kYXRhLyRwa2ciCiAgICBbIC1kICIkZCIgXSB8fCByZXR1cm4KCiAgICAjIFNoYXJlZFByZWZzOiBjbGVhciBkZXZpY2UgdmFsdWVzCiAgICBbIC1kICIkZC9zaGFyZWRfcHJlZnMiIF0gJiYgZmluZCAiJGQvc2hhcmVkX3ByZWZzIiAtbmFtZSAiKi54bWwiIC1tYXhkZXB0aCAxIDI+L2Rldi9udWxsIHwgd2hpbGUgcmVhZCAtciBmOyBkbwogICAgICAgIGdyZXAgLXFsICduYW1lPSJkZXZpY2VfaWQiXHxuYW1lPSJhbmRyb2lkX2lkIlx8bmFtZT0iaW1laSJcfG5hbWU9ImdhaWQiXHxuYW1lPSJvYWlkIlx8bmFtZT0iYWR2ZXJ0aXNpbmdfaWQiXHxuYW1lPSJpbnN0YWxsX2lkIlx8bmFtZT0iZGV2aWNlX3Rva2VuIlx8bmFtZT0iZGV2aWNlX2ZpbmdlcnByaW50Ilx8bmFtZT0iYW5kcm9pZElkIlx8bmFtZT0iZGV2aWNlSWQiJyAiJGYiIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgICAgICAgbG9jYWwgdD0iJHtmfS50bXAiOyBjcCAiJGYiICIkdCIgMj4vZGV2L251bGwgfHwgY29udGludWUKICAgICAgICBzZWQgLWkgLWUgJ3MvXChuYW1lPSJkZXZpY2VfaWQiXCk+W148XSovXDE+L2cnIFwKICAgICAgICAgICAgICAgLWUgJ3MvXChuYW1lPSJhbmRyb2lkX2lkIlwpPltePF0qL1wxPi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzL1wobmFtZT0iaW1laSJcKT5bXjxdKi9cMT4vZycgXAogICAgICAgICAgICAgICAtZSAncy9cKG5hbWU9ImdhaWQiXCk+W148XSovXDE+L2cnIFwKICAgICAgICAgICAgICAgLWUgJ3MvXChuYW1lPSJvYWlkIlwpPltePF0qL1wxPi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzL1wobmFtZT0iYWR2ZXJ0aXNpbmdfaWQiXCk+W148XSovXDE+L2cnIFwKICAgICAgICAgICAgICAgLWUgJ3MvXChuYW1lPSJpbnN0YWxsX2lkIlwpPltePF0qL1wxPi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzL1wobmFtZT0iZGV2aWNlX3Rva2VuIlwpPltePF0qL1wxPi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzL1wobmFtZT0iZGV2aWNlX2ZpbmdlcnByaW50IlwpPltePF0qL1wxPi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzL1wobmFtZT0iYW5kcm9pZElkIlwpPltePF0qL1wxPi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzL1wobmFtZT0iZGV2aWNlSWQiXCk+W148XSovXDE+L2cnICIkdCIgMj4vZGV2L251bGwKICAgICAgICBncmVwIC1xICc8L21hcD4nICIkdCIgMj4vZGV2L251bGwgJiYgbXYgIiR0IiAiJGYiICYmIGNobW9kIDYwMCAiJGYiIHx8IHJtIC1mICIkdCIKICAgIGRvbmUKCiAgICAjIEpTT046IGNsZWFyIGRldmljZSB2YWx1ZXMKICAgIFsgLWQgIiRkL2ZpbGVzIiBdICYmIGZpbmQgIiRkL2ZpbGVzIiAtbWF4ZGVwdGggMyAtbmFtZSAiKi5qc29uIiAtdHlwZSBmIDI+L2Rldi9udWxsIHwgd2hpbGUgcmVhZCAtciBmOyBkbwogICAgICAgIGdyZXAgLXFsICciZGV2aWNlX2lkIlx8ImFuZHJvaWRfaWQiXHwiaW1laSJcfCJnYWlkIlx8Im9haWQiXHwiYWR2ZXJ0aXNpbmdfaWQiXHwiaW5zdGFsbF9pZCJcfCJkZXZpY2VfdG9rZW4iXHwiZmluZ2VycHJpbnQiJyAiJGYiIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgICAgICAgbG9jYWwgdD0iJHtmfS50bXAiOyBjcCAiJGYiICIkdCIgMj4vZGV2L251bGwgfHwgY29udGludWUKICAgICAgICBzZWQgLWkgLWUgJ3MvImRldmljZV9pZCI6IlteIl0qIi8iZGV2aWNlX2lkIjoiIi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzLyJhbmRyb2lkX2lkIjoiW14iXSoiLyJhbmRyb2lkX2lkIjoiIi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzLyJpbWVpIjoiW14iXSoiLyJpbWVpIjoiIi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzLyJnYWlkIjoiW14iXSoiLyJnYWlkIjoiIi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzLyJvYWlkIjoiW14iXSoiLyJvYWlkIjoiIi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzLyJhZHZlcnRpc2luZ19pZCI6IlteIl0qIi8iYWR2ZXJ0aXNpbmdfaWQiOiIiL2cnIFwKICAgICAgICAgICAgICAgLWUgJ3MvImluc3RhbGxfaWQiOiJbXiJdKiIvImluc3RhbGxfaWQiOiIiL2cnIFwKICAgICAgICAgICAgICAgLWUgJ3MvImRldmljZV90b2tlbiI6IlteIl0qIi8iZGV2aWNlX3Rva2VuIjoiIi9nJyBcCiAgICAgICAgICAgICAgIC1lICdzLyJmaW5nZXJwcmludCI6IlteIl0qIi8iZmluZ2VycHJpbnQiOiIiL2cnICIkdCIgMj4vZGV2L251bGwKICAgICAgICBtdiAiJHQiICIkZiIgMj4vZGV2L251bGwgJiYgY2htb2QgNjAwICIkZiIKICAgIGRvbmUKfQoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDaGVhdCBEZXRlY3Rpb24gKDcgZGltZW5zaW9ucykKIyBQVUJHIE1vYmlsZSAo5ZKM5bmz57K+6IuxKSBEZWVwIENsZWFuCiMgQ2FsbGVkIGZyb20gZG9fcmVzZXQgd2l0aCBzaGFyZWQgSURzCnB1YmdfZGVlcF9jbGVhbigpIHsKICAgIGxvY2FsIEFJRD0iJDEiIElNRUk9IiQyIiBTTj0iJDMiIFdJRkk9IiQ0IiBCVD0iJDUiCiAgICBsb2NhbCBQS0c9ImNvbS50ZW5jZW50LnRtZ3AucHViZ21oZCIKICAgIGxvY2FsIERBVEE9Ii9kYXRhL2RhdGEvJFBLRyIKICAgIGxvY2FsIEVYVD0iL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvJFBLRyIKICAgIFsgLWQgIiREQVRBIiBdIHx8IHJldHVybgoKICAgIGxvY2FsIEdBSUQ9IiQocmFuZF9oZXggOCktJChyYW5kX2hleCA0KS0kKHJhbmRfaGV4IDQpLSQocmFuZF9oZXggNCktJChyYW5kX2hleCAxMikiCiAgICBsb2NhbCBPQUlEPSIkKHJhbmRfaGV4IDgpLSQocmFuZF9oZXggNCktJChyYW5kX2hleCA0KS0kKHJhbmRfaGV4IDQpLSQocmFuZF9oZXggMTIpIgogICAgbG9jYWwgSU5TVF9JRD0iJChyYW5kX2hleCA4KS0kKHJhbmRfaGV4IDQpLSQocmFuZF9oZXggNCktJChyYW5kX2hleCA0KS0kKHJhbmRfaGV4IDEyKSIKICAgIGxvY2FsIERFVl9UT0tFTj0idGVuY2VudF8kKHJhbmRfaGV4IDE2KSIKICAgIGxvY2FsIFBVU0hfVE9LRU49JChyYW5kX2hleCA0MCkKCiAgICAjIDEuIFNoYXJlZFByZWZlcmVuY2VzCiAgICBsb2NhbCBTUD0iJERBVEEvc2hhcmVkX3ByZWZzIgogICAgWyAtZCAiJFNQIiBdICYmIHsKICAgICAgICBmb3IgeG1sIGluICIkU1AvZGV2aWNlaW5mby54bWwiICIkU1AvZGV2aWNlX2ZpbmdlcnByaW50LnhtbCIgIiRTUC9kZXZpY2VfY29uZmlnLnhtbCI7IGRvCiAgICAgICAgICAgIFsgLWYgIiR4bWwiIF0gfHwgY29udGludWUKICAgICAgICAgICAgY2F0ID4gIiR4bWwiIDw8IFhNTEVPRgo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgc3RhbmRhbG9uZT0ibm8iID8+CjxtYXA+CiAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9pZCI+JEFJRDwvc3RyaW5nPgogICAgPHN0cmluZyBuYW1lPSJhbmRyb2lkX2lkIj4kQUlEPC9zdHJpbmc+CiAgICA8c3RyaW5nIG5hbWU9ImltZWkiPiRJTUVJPC9zdHJpbmc+CiAgICA8c3RyaW5nIG5hbWU9InNlcmlhbCI+JFNOPC9zdHJpbmc+CiAgICA8c3RyaW5nIG5hbWU9Im1hY19hZGRyZXNzIj4kV0lGSTwvc3RyaW5nPgogICAgPHN0cmluZyBuYW1lPSJkZXZpY2VfbW9kZWwiPlBpeGVsIDc8L3N0cmluZz4KICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX2JyYW5kIj5Hb29nbGU8L3N0cmluZz4KICAgIDxzdHJpbmcgbmFtZT0ib3NfdmVyc2lvbiI+MTM8L3N0cmluZz4KICAgIDxzdHJpbmcgbmFtZT0ic2RrX3ZlcnNpb24iPjMzPC9zdHJpbmc+CiAgICA8c3RyaW5nIG5hbWU9ImdhaWQiPiRHQUlEPC9zdHJpbmc+CiAgICA8c3RyaW5nIG5hbWU9Im9haWQiPiRPQUlEPC9zdHJpbmc+CjwvbWFwPgpYTUxFT0YKICAgICAgICBkb25lCiAgICAgICAgZm9yIHhtbCBpbiAiJFNQIi9iZWFjb25fY29uZmlnLnhtbCAiJFNQIi9idWdseV9jb21tb24ueG1sICIkU1AiL210cF9jb25maWcueG1sICIkU1AiL3RwX2NvbmZpZy54bWw7IGRvCiAgICAgICAgICAgIFsgLWYgIiR4bWwiIF0gfHwgY29udGludWUKICAgICAgICAgICAgc2VkIC1pIC1lICJzL1wobmFtZT1cImRldmljZV9pZFwiXCk+W148XSovXDE+JEFJRC8iIC1lICJzL1wobmFtZT1cImltZWlcIlwpPltePF0qL1wxPiRJTUVJLyIgLWUgInMvXChuYW1lPVwiZGV2aWNlX2ZpbmdlcnByaW50XCJcKT5bXjxdKi9cMT4kQUlELyIgLWUgInMvXChuYW1lPVwiaW5zdGFsbF9pZFwiXCk+W148XSovXDE+JElOU1RfSUQvIiAiJHhtbCIgMj4vZGV2L251bGwKICAgICAgICBkb25lCiAgICAgICAgZm9yIHhtbCBpbiAiJFNQIi94Z18qLnhtbCAiJFNQIi9taXB1c2hfKi54bWwgIiRTUCIvaHdwdXNoXyoueG1sOyBkbwogICAgICAgICAgICBbIC1mICIkeG1sIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIHNlZCAtaSAtZSAicy9cKG5hbWU9XCJ0b2tlblwiXCk+W148XSovXDE+JFBVU0hfVE9LRU4vIiAtZSAicy9cKG5hbWU9XCJ4Z190b2tlblwiXCk+W148XSovXDE+JFBVU0hfVE9LRU4vIiAtZSAicy9cKG5hbWU9XCJyZWdfaWRcIlwpPltePF0qL1wxPiRQVVNIX1RPS0VOLyIgIiR4bWwiIDI+L2Rldi9udWxsCiAgICAgICAgZG9uZQogICAgICAgIGZvciB4bWwgaW4gIiRTUCIvKi54bWw7IGRvCiAgICAgICAgICAgIFsgLWYgIiR4bWwiIF0gfHwgY29udGludWUKICAgICAgICAgICAgZ3JlcCAtcWwgJ25hbWU9ImRldmljZV9pZCJcfG5hbWU9ImFuZHJvaWRfaWQiXHxuYW1lPSJpbWVpIlx8bmFtZT0iZ2FpZCJcfG5hbWU9Im9haWQiXHxuYW1lPSJkZXZpY2VfdG9rZW4iXHxuYW1lPSJhbmRyb2lkSWQiXHxuYW1lPSJkZXZpY2VJZCInICIkeG1sIiAyPi9kZXYvbnVsbCB8fCBjb250aW51ZQogICAgICAgICAgICBzZWQgLWkgLWUgInMvXChuYW1lPVwiZGV2aWNlX2lkXCJcKT5bXjxdKi9cMT4kQUlELyIgLWUgInMvXChuYW1lPVwiYW5kcm9pZF9pZFwiXCk+W148XSovXDE+JEFJRC8iIC1lICJzL1wobmFtZT1cImltZWlcIlwpPltePF0qL1wxPiRJTUVJLyIgLWUgInMvXChuYW1lPVwiZ2FpZFwiXCk+W148XSovXDE+JEdBSUQvIiAtZSAicy9cKG5hbWU9XCJvYWlkXCJcKT5bXjxdKi9cMT4kT0FJRC8iIC1lICJzL1wobmFtZT1cImRldmljZV90b2tlblwiXCk+W148XSovXDE+JERFVl9UT0tFTi8iIC1lICJzL1wobmFtZT1cImFuZHJvaWRJZFwiXCk+W148XSovXDE+JEFJRC8iIC1lICJzL1wobmFtZT1cImRldmljZUlkXCJcKT5bXjxdKi9cMT4kQUlELyIgIiR4bWwiIDI+L2Rldi9udWxsCiAgICAgICAgZG9uZQogICAgfQoKICAgICMgMi4gRGF0YWJhc2VzCiAgICBsb2NhbCBEQj0iJERBVEEvZGF0YWJhc2VzIgogICAgWyAtZCAiJERCIiBdICYmIHsKICAgICAgICBmb3IgZGIgaW4gIiREQiIvKi5kYiAiJERCIi8qLnNxbGl0ZSAiJERCIi8qLnNxbGl0ZTM7IGRvCiAgICAgICAgICAgIFsgLWYgIiRkYiIgXSB8fCBjb250aW51ZQogICAgICAgICAgICBmb3IgdGFibGUgaW4gZGV2aWNlX2luZm8gZGV2aWNlX2NvbmZpZyBkZXZpY2VfY2FjaGUgYXBwX2NvbmZpZyBhbmFseXRpY3NfY29uZmlnIHB1c2hfY29uZmlnIGluc3RhbGxfY29uZmlnIHRyYWNraW5nX2NvbmZpZyBkZXZpY2VfZmluZ2VycHJpbnQ7IGRvCiAgICAgICAgICAgICAgICBsb2NhbCBleD0kKHNxbGl0ZTMgIiRkYiIgIlNFTEVDVCBjb3VudCgqKSBGUk9NIHNxbGl0ZV9tYXN0ZXIgV0hFUkUgdHlwZT0ndGFibGUnIEFORCBuYW1lPSckdGFibGUnOyIgMj4vZGV2L251bGwpCiAgICAgICAgICAgICAgICBbICIkZXgiID0gIjEiIF0gfHwgY29udGludWUKICAgICAgICAgICAgICAgIHNxbGl0ZTMgIiRkYiIgIlVQREFURSAkdGFibGUgU0VUIHZhbHVlPSckQUlEJyBXSEVSRSBrZXk9J2RldmljZV9pZCcgT1Iga2V5PSdhbmRyb2lkX2lkJyBPUiBrZXk9J2FuZHJvaWRJZCcgT1Iga2V5PSdkZXZpY2VJZCc7IiAyPi9kZXYvbnVsbAogICAgICAgICAgICAgICAgc3FsaXRlMyAiJGRiIiAiVVBEQVRFICR0YWJsZSBTRVQgdmFsdWU9JyRJTUVJJyBXSEVSRSBrZXk9J2ltZWknIE9SIGtleT0nSU1FSSc7IiAyPi9kZXYvbnVsbAogICAgICAgICAgICAgICAgc3FsaXRlMyAiJGRiIiAiVVBEQVRFICR0YWJsZSBTRVQgdmFsdWU9JyRTTicgV0hFUkUga2V5PSdzZXJpYWwnIE9SIGtleT0nc2VyaWFsX25vJzsiIDI+L2Rldi9udWxsCiAgICAgICAgICAgICAgICBzcWxpdGUzICIkZGIiICJVUERBVEUgJHRhYmxlIFNFVCB2YWx1ZT0nJFdJRkknIFdIRVJFIGtleT0nbWFjX2FkZHJlc3MnIE9SIGtleT0nd2lmaV9tYWMnOyIgMj4vZGV2L251bGwKICAgICAgICAgICAgICAgIHNxbGl0ZTMgIiRkYiIgIlVQREFURSAkdGFibGUgU0VUIHZhbHVlPSckR0FJRCcgV0hFUkUga2V5PSdnYWlkJyBPUiBrZXk9J2FkdmVydGlzaW5nX2lkJzsiIDI+L2Rldi9udWxsCiAgICAgICAgICAgICAgICBzcWxpdGUzICIkZGIiICJVUERBVEUgJHRhYmxlIFNFVCB2YWx1ZT0nJE9BSUQnIFdIRVJFIGtleT0nb2FpZCc7IiAyPi9kZXYvbnVsbAogICAgICAgICAgICAgICAgc3FsaXRlMyAiJGRiIiAiVVBEQVRFICR0YWJsZSBTRVQgdmFsdWU9JyRJTlNUX0lEJyBXSEVSRSBrZXk9J2luc3RhbGxfaWQnOyIgMj4vZGV2L251bGwKICAgICAgICAgICAgICAgIHNxbGl0ZTMgIiRkYiIgIlVQREFURSAkdGFibGUgU0VUIHZhbHVlPSckREVWX1RPS0VOJyBXSEVSRSBrZXk9J2RldmljZV90b2tlbic7IiAyPi9kZXYvbnVsbAogICAgICAgICAgICBkb25lCiAgICAgICAgZG9uZQogICAgfQoKICAgICMgMy4gRmlsZXMKICAgIGxvY2FsIEZJTEVTPSIkREFUQS9maWxlcyIKICAgIFsgLWQgIiRGSUxFUyIgXSAmJiB7CiAgICAgICAgZm9yIGRpciBpbiAiJEZJTEVTL210cCIgIiRGSUxFUy90cCI7IGRvCiAgICAgICAgICAgIFsgLWQgIiRkaXIiIF0gfHwgY29udGludWUKICAgICAgICAgICAgZmluZCAiJGRpciIgLXR5cGUgZiB8IHdoaWxlIHJlYWQgLXIgZjsgZG8KICAgICAgICAgICAgICAgIGxvY2FsIHN6PSQod2MgLWMgPCAiJGYiIDI+L2Rldi9udWxsKQogICAgICAgICAgICAgICAgWyAiJHN6IiAtZ3QgMCBdICYmIGRkIGlmPS9kZXYvdXJhbmRvbSBvZj0iJGYiIGJzPTEgY291bnQ9IiRzeiIgMj4vZGV2L251bGwKICAgICAgICAgICAgZG9uZQogICAgICAgIGRvbmUKICAgICAgICBmb3IgZGlyIGluICIkRklMRVMvYmVhY29uIiAiJEZJTEVTL2J1Z2x5IjsgZG8KICAgICAgICAgICAgWyAtZCAiJGRpciIgXSB8fCBjb250aW51ZQogICAgICAgICAgICBmaW5kICIkZGlyIiAtdHlwZSBmIC1uYW1lICJkZXZpY2UqIiB8IHdoaWxlIHJlYWQgLXIgZjsgZG8KICAgICAgICAgICAgICAgIGxvY2FsIHN6PSQod2MgLWMgPCAiJGYiIDI+L2Rldi9udWxsKQogICAgICAgICAgICAgICAgWyAiJHN6IiAtZ3QgMCBdICYmIHsgZWNobyAiZGV2aWNlX2lkPSRBSUQiID4gIiRmIjsgZGQgaWY9L2Rldi96ZXJvIGJzPTEgY291bnQ9JCgoc3ogLSA1MCkpIDI+L2Rldi9udWxsID4+ICIkZiI7IH0KICAgICAgICAgICAgZG9uZQogICAgICAgIGRvbmUKICAgICAgICBmaW5kICIkRklMRVMvdGVuY2VudCIgLXR5cGUgZiAtbmFtZSAiKi5qc29uIiAyPi9kZXYvbnVsbCB8IHdoaWxlIHJlYWQgLXIgZjsgZG8KICAgICAgICAgICAgZ3JlcCAtcWwgJyJkZXZpY2VfaWQiXHwiYW5kcm9pZF9pZCJcfCJpbWVpIlx8ImdhaWQiXHwib2FpZCInICIkZiIgMj4vZGV2L251bGwgfHwgY29udGludWUKICAgICAgICAgICAgc2VkIC1pIC1lICJzL1wiZGV2aWNlX2lkXCI6XCJbXlwiXSpcIi9cImRldmljZV9pZFwiOlwiJEFJRFwiL2ciIC1lICJzL1wiYW5kcm9pZF9pZFwiOlwiW15cIl0qXCIvXCJhbmRyb2lkX2lkXCI6XCIkQUlEXCIvZyIgLWUgInMvXCJpbWVpXCI6XCJbXlwiXSpcIi9cImltZWlcIjpcIiRJTUVJXCIvZyIgLWUgInMvXCJnYWlkXCI6XCJbXlwiXSpcIi9cImdhaWRcIjpcIiRHQUlEXCIvZyIgLWUgInMvXCJvYWlkXCI6XCJbXlwiXSpcIi9cIm9haWRcIjpcIiRPQUlEXCIvZyIgIiRmIiAyPi9kZXYvbnVsbAogICAgICAgIGRvbmUKICAgICAgICBsb2NhbCBVRTQ9IiRGSUxFUy9VRTRHYW1lL1NoYWRvd1RyYWNrZXJFeHRyYS9TYXZlZCIKICAgICAgICBbIC1kICIkVUU0L0NvbmZpZyIgXSAmJiBmaW5kICIkVUU0L0NvbmZpZyIgLXR5cGUgZiB8IHdoaWxlIHJlYWQgLXIgZjsgZG8KICAgICAgICAgICAgZ3JlcCAtcWwgJ0RldmljZUlkXHxEZXZpY2VNb2RlbFx8QW5kcm9pZElkXHxJTUVJXHxNYWNBZGRyZXNzJyAiJGYiIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIHNlZCAtaSAtZSAicy9cKERldmljZUlkPVwpLiovXDEkQUlELyIgLWUgInMvXChEZXZpY2VNb2RlbD1cKS4qL1wxUGl4ZWwgNy8iIC1lICJzL1woQW5kcm9pZElkPVwpLiovXDEkQUlELyIgLWUgInMvXChJTUVJPVwpLiovXDEkSU1FSS8iIC1lICJzL1woTWFjQWRkcmVzcz1cKS4qL1wxJFdJRkkvIiAiJGYiIDI+L2Rldi9udWxsCiAgICAgICAgZG9uZQogICAgICAgIFsgLWQgIiRVRTQvTG9ncyIgXSAmJiBmaW5kICIkVUU0L0xvZ3MiIC1uYW1lICIqLmxvZyIgfCB3aGlsZSByZWFkIC1yIGY7IGRvCiAgICAgICAgICAgIHNlZCAtaSAtZSAicy9EZXZpY2VJZD1bQS1aYS16MC05LV0qL0RldmljZUlkPSRBSUQvZyIgLWUgInMvQW5kcm9pZElkPVtBLVphLXowLTldKi9BbmRyb2lkSWQ9JEFJRC9nIiAiJGYiIDI+L2Rldi9udWxsCiAgICAgICAgZG9uZQogICAgfQoKICAgICMgNC4gRXh0ZXJuYWwgc3RvcmFnZQogICAgWyAtZCAiJEVYVCIgXSAmJiB7CiAgICAgICAgbG9jYWwgRVhUX1VFND0iJEVYVC9maWxlcy9VRTRHYW1lL1NoYWRvd1RyYWNrZXJFeHRyYS9TaGFkb3dUcmFja2VyRXh0cmEvU2F2ZWQiCiAgICAgICAgWyAtZCAiJEVYVF9VRTQvQ29uZmlnIiBdICYmIGZpbmQgIiRFWFRfVUU0L0NvbmZpZyIgLXR5cGUgZiB8IHdoaWxlIHJlYWQgLXIgZjsgZG8KICAgICAgICAgICAgZ3JlcCAtcWwgJ0RldmljZUlkXHxBbmRyb2lkSWRcfElNRUlcfE1hY0FkZHJlc3MnICIkZiIgMj4vZGV2L251bGwgfHwgY29udGludWUKICAgICAgICAgICAgc2VkIC1pIC1lICJzL1woRGV2aWNlSWQ9XCkuKi9cMSRBSUQvIiAtZSAicy9cKEFuZHJvaWRJZD1cKS4qL1wxJEFJRC8iIC1lICJzL1woSU1FST1cKS4qL1wxJElNRUkvIiAtZSAicy9cKE1hY0FkZHJlc3M9XCkuKi9cMSRXSUZJLyIgIiRmIiAyPi9kZXYvbnVsbAogICAgICAgIGRvbmUKICAgIH0KCiAgICBsb2dfYWN0aW9uICJQVUJHIGRlZXAgY2xlYW4gYWlkPSRBSUQiCn0KIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKY2hlY2tfcG9ydCgpIHsgYXdrICd7cHJpbnQgJDJ9JyAvcHJvYy9uZXQvdGNwIDI+L2Rldi9udWxsIHwgZ3JlcCAtcWkgIjokKHByaW50ZiAnJTA0WCcgIiQxIikiOyB9CgpkZXRlY3RfZnJpZGEoKSB7CiAgICBsb2NhbCBzPTAgZD0iIgogICAgY2hlY2tfcG9ydCAyNzA0MiAmJiBzPSQoKHMrNDApKSAmJiBkPSJwb3J0OyIKICAgIHBzIC1BIDI+L2Rldi9udWxsIHwgZ3JlcCAtcWkgJ2ZyaWRhJyAmJiBzPSQoKHMrNDApKSAmJiBkPSIke2R9cHJvYzsiCiAgICBncmVwIC1xbCAnZnJpZGEnIC9wcm9jL3NlbGYvbWFwcyAyPi9kZXYvbnVsbCAmJiBzPSQoKHMrMzApKSAmJiBkPSIke2R9bWVtOyIKICAgIFsgLWYgIi9kYXRhL2xvY2FsL3RtcC9mcmlkYS1zZXJ2ZXIiIF0gJiYgcz0kKChzKzMwKSkgJiYgZD0iJHtkfWZpbGU7IgogICAgWyAtZiAiL2RhdGEvbG9jYWwvdG1wL3JlLmZyaWRhLnNlcnZlciIgXSAmJiBzPSQoKHMrMzApKSAmJiBkPSIke2R9ZmlsZTI7IgogICAgcGtnX2hhcyAnZnJpZGEnICYmIHM9JCgocysyMCkpICYmIGQ9IiR7ZH1wa2c7IgogICAgWyAkcyAtZ2UgMzAgXSAmJiBlY2hvICJbZnJpZGFdJHtkfSjpo47pmak6JHMpIgp9CgpkZXRlY3RfeHBvc2VkKCkgewogICAgbG9jYWwgcz0wIGQ9IiIKICAgIFsgLWQgIi9kYXRhL2FkYi9sc3BkIiBdICYmIHM9JCgocys0MCkpICYmIGQ9ImxzcGQ7IgogICAgWyAtZiAiL2RhdGEvYWRiL2xzcGQvY29uZmlnL21hbmFnZXJfcGFja2FnZSIgXSAmJiBzPSQoKHMrMzApKSAmJiBkPSIke2R9bWdyOyIKICAgIFsgLWQgIi9kYXRhL2FkYi9yaXJ1IiBdICYmIHM9JCgocyszMCkpICYmIGQ9IiR7ZH1yaXJ1OyIKICAgIFsgLWQgIi9kYXRhL21pc2MvcmlydS9tb2R1bGVzL2VkeHBvc2VkIiBdICYmIHM9JCgocys0MCkpICYmIGQ9IiR7ZH1lZHhwb3NlZDsiCiAgICBwa2dfaGFzICd4cG9zZWRcfGxzcG9zZWQnICYmIHM9JCgocysyNSkpICYmIGQ9IiR7ZH1wa2c7IgogICAgZ3JlcCAtcWwgJ3hwb3NlZFx8bHNwb3NlZFx8ZWR4cG9zZWQnIC9wcm9jL3NlbGYvbWFwcyAyPi9kZXYvbnVsbCAmJiBzPSQoKHMrMzApKSAmJiBkPSIke2R9bWVtOyIKICAgIGZvciBkaXIgaW4gL2RhdGEvYWRiL21vZHVsZXMgL2RhdGEvYWRiL2tzdS9tb2R1bGVzOyBkbwogICAgICAgIFsgLWQgIiRkaXIvbHNwb3NlZCIgXSAmJiBzPSQoKHMrMzApKSAmJiBkPSIke2R9bW9kLWxzcG9zZWQ7IgogICAgICAgIFsgLWQgIiRkaXIvZWR4cG9zZWQiIF0gJiYgcz0kKChzKzMwKSkgJiYgZD0iJHtkfW1vZC1lZHhwb3NlZDsiCiAgICBkb25lCiAgICBbICRzIC1nZSAzMCBdICYmIGVjaG8gIltmcmFtZXdvcmtdWHBvc2VkL0xTUG9zZWQgJHtkfSjpo47pmak6JHMpIgp9CgpkZXRlY3RfZ2FtZV9tb2RpZmllcnMoKSB7CiAgICBsb2NhbCBzPTAgZD0iIgogICAgbG9jYWwgaGl0cz0kKGVjaG8gIiRQS0dfQ0FDSEUiIHwgZ3JlcCAtaUUgImdhbWVndWFyZGlhbnxnYW1la2lsbGVyfHNiZ2FtZWhhY2tlcnxjaGVhdGVuZ2luZXxnYW1lY2hlYXR8Z2FtZWhhY2t8c3BlZWRoYWNrfG1lbW9yeWhhY2siKQogICAgaWYgWyAtbiAiJGhpdHMiIF07IHRoZW4KICAgICAgICBsb2NhbCBuPSQoZWNobyAiJGhpdHMiIHwgd2MgLWwgfCB0ciAtZCAnICcpCiAgICAgICAgcz0kKChuICogMzUpKTsgZD0icGtnOiRuOyIKICAgIGZpCiAgICBmb3IgcCBpbiBjb20uZ2FtZWd1YXJkaWFuIGNvbS5jaWguZ2FtZV9jaWggY29tLnZhbG1vZHMuZ2FtZWtpbGxlciBjb20uYWFib3Iuc2JnYW1laGFja2VyIGNvbS5jaGVhdGVuZ2luZS5jZTsgZG8KICAgICAgICBlY2hvICIkUEtHX0NBQ0hFIiB8IGdyZXAgLXEgIiRwIiAmJiBzPSQoKHMrNDApKSAmJiBkPSIke2R9a25vd246JHtwIyMqLn07IgogICAgZG9uZQogICAgWyAkcyAtZ2UgMzAgXSAmJiBlY2hvICJbbW9kaWZpZXJd5ri45oiP5L+u5pS55ZmoICR7ZH0o6aOO6ZmpOiRzKSIKfQoKZGV0ZWN0X3Byb3h5KCkgewogICAgbG9jYWwgcz0wIGQ9IiIKICAgIGxvY2FsIHZwbj0kKHNldHRpbmdzIGdldCBnbG9iYWwgYWx3YXlzX29uX3Zwbl9hcHAgMj4vZGV2L251bGwpCiAgICBpZiBbIC1uICIkdnBuIiBdICYmIFsgIiR2cG4iICE9ICJudWxsIiBdOyB0aGVuCiAgICAgICAgY2FzZSAiJHZwbiIgaW4gKmh0dHBjYW5hcnkqfCpwY2FwKnwqbWl0bXByb3h5KnwqY2hhcmxlcyp8KmZpZGRsZXIqKSBzPSQoKHMrNDApKTsgZD0idnBuOiR2cG47IiA7OyBlc2FjCiAgICBmaQogICAgbG9jYWwgaHA9JChzZXR0aW5ncyBnZXQgZ2xvYmFsIGh0dHBfcHJveHkgMj4vZGV2L251bGwpCiAgICBbIC1uICIkaHAiIF0gJiYgWyAiJGhwIiAhPSAibnVsbCIgXSAmJiBzPSQoKHMrMjApKSAmJiBkPSIke2R9cHJveHk7IgogICAgZm9yIHAgaW4gY29tLmd1b3NoaS5odHRwY2FuYXkgY29tLm5ldHdvcmsuaHR0cGNhbmFyeSBjb20ubWluaHVpLm5ldHdvcmtjYXB0dXJlOyBkbwogICAgICAgIGVjaG8gIiRQS0dfQ0FDSEUiIHwgZ3JlcCAtcSAiJHAiICYmIHM9JCgocyszNSkpICYmIGQ9IiR7ZH1hcHA7IgogICAgZG9uZQogICAgWyAkcyAtZ2UgMzAgXSAmJiBlY2hvICJbcHJveHld5oqT5YyF5bel5YW3ICR7ZH0o6aOO6ZmpOiRzKSIKfQoKZGV0ZWN0X2hpZGUoKSB7CiAgICBsb2NhbCBzPTAgZD0iIgogICAgWyAtZCAiL2RhdGEvYWRiL21vZHVsZXMvenlnaXNrX3NoYW1pa28iIF0gJiYgcz0kKChzKzIwKSkgJiYgZD0ic2hhbWlrbzsiCiAgICBbIC1kICIvZGF0YS9hZGIvbW9kdWxlcy96eWdpc2tfYXNzaXN0YW50IiBdICYmIHM9JCgocysyMCkpICYmIGQ9IiR7ZH16eWdpc2tfYXN0OyIKICAgIFsgLWQgIi9kYXRhL2FkYi9tb2R1bGVzL25vaGVsbG8iIF0gJiYgcz0kKChzKzIwKSkgJiYgZD0iJHtkfW5vaGVsbG87IgogICAgWyAtZCAiL2RhdGEvYWRiL21vZHVsZXMvdHJpY2t5X3N0b3JlIiBdICYmIHM9JCgocysxNSkpICYmIGQ9IiR7ZH10cmlja3lzdG9yZTsiCiAgICBbICRzIC1nZSAzMCBdICYmIGVjaG8gIltoaWRlXemakOiXj+W3peWFtyAke2R9KOmjjumZqTokcykiCn0KCmRldGVjdF9tb2R1bGVzX2t3KCkgewogICAgbG9jYWwga3c9ImdhbWVndWFyZGlhbnxnYW1la2lsbGVyfHNiZ2FtZWhhY2tlcnxjaGVhdGVuZ2luZXxmcmlkYXxuZXRpbmplY3R8aHR0cGNhbmFyeXxwY2FwbWl0bSIKICAgIGZvciBkaXIgaW4gL2RhdGEvYWRiL21vZHVsZXMgL2RhdGEvYWRiL2tzdS9tb2R1bGVzIC9kYXRhL2FkYi9hcGQvbW9kdWxlczsgZG8KICAgICAgICBbIC1kICIkZGlyIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgZm9yIG1vZCBpbiAiJGRpciIvKi87IGRvCiAgICAgICAgICAgIFsgLWQgIiRtb2QiIF0gfHwgY29udGludWUKICAgICAgICAgICAgYmFzZW5hbWUgIiRtb2QiIHwgZ3JlcCAtcWlFICIka3ciICYmIGVjaG8gIlttb2R1bGVdJChiYXNlbmFtZSAiJG1vZCIpIgogICAgICAgIGRvbmUKICAgIGRvbmUKfQoKZGV0ZWN0X3RtcCgpIHsKICAgIGxvY2FsIGt3PSJmcmlkYXxnYW1lZ3VhcmRpYW58Z2FtZWtpbGxlcnxjaGVhdGVuZ2luZXxzYmdhbWVoYWNrZXIiCiAgICBmb3IgZiBpbiAvZGF0YS9sb2NhbC90bXAvKjsgZG8KICAgICAgICBbIC1mICIkZiIgXSB8fCBjb250aW51ZQogICAgICAgIGJhc2VuYW1lICIkZiIgfCBncmVwIC1xaUUgIiRrdyIgJiYgZWNobyAiW3RtcF0kKGJhc2VuYW1lICIkZiIpIgogICAgZG9uZQp9CgpkZXRlY3RfY2hlYXRfbW9kdWxlcygpIHsKICAgIGNhY2hlX3BrZwogICAgbG9jYWwgcj0iIiBvdXQ9IiIKICAgIHI9JChkZXRlY3RfZnJpZGEpOyAgICAgICAgICBbIC1uICIkciIgXSAmJiBvdXQ9IiR7b3V0fSR7cn1cbiIKICAgIHI9JChkZXRlY3RfeHBvc2VkKTsgICAgICAgICBbIC1uICIkciIgXSAmJiBvdXQ9IiR7b3V0fSR7cn1cbiIKICAgIHI9JChkZXRlY3RfZ2FtZV9tb2RpZmllcnMpOyBbIC1uICIkciIgXSAmJiBvdXQ9IiR7b3V0fSR7cn1cbiIKICAgIHI9JChkZXRlY3RfcHJveHkpOyAgICAgICAgICBbIC1uICIkciIgXSAmJiBvdXQ9IiR7b3V0fSR7cn1cbiIKICAgIHI9JChkZXRlY3RfaGlkZSk7ICAgICAgICAgICBbIC1uICIkciIgXSAmJiBvdXQ9IiR7b3V0fSR7cn1cbiIKICAgIHI9JChkZXRlY3RfbW9kdWxlc19rdyk7ICAgICBbIC1uICIkciIgXSAmJiBvdXQ9IiR7b3V0fSR7cn1cbiIKICAgIHI9JChkZXRlY3RfdG1wKTsgICAgICAgICAgICBbIC1uICIkciIgXSAmJiBvdXQ9IiR7b3V0fSR7cn1cbiIKICAgIGVjaG8gLWUgIiRvdXQiIHwgZ3JlcCAtdiAnXiQnIHwgc29ydCAtdQp9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBEZXZpY2UgRGV0ZWN0aW9uCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCmRldGVjdF9kZXZpY2UoKSB7CiAgICBCUkFORD0kKGdldHByb3Agcm8ucHJvZHVjdC5icmFuZCAyPi9kZXYvbnVsbCB8IHRyICdBLVonICdhLXonKQogICAgTUFOVUZBQ1RVUkVSPSQoZ2V0cHJvcCByby5wcm9kdWN0Lm1hbnVmYWN0dXJlciAyPi9kZXYvbnVsbCB8IHRyICdBLVonICdhLXonKQogICAgTU9ERUw9JChnZXRwcm9wIHJvLnByb2R1Y3QubW9kZWwgMj4vZGV2L251bGwpCiAgICBERVZJQ0U9JChnZXRwcm9wIHJvLnByb2R1Y3QuZGV2aWNlIDI+L2Rldi9udWxsKQoKICAgIGNhc2UgIiRCUkFORCIgaW4KICAgICAgICBzYW1zdW5nKikgIERFVklDRV9UWVBFPSJzYW1zdW5nIiA7OwogICAgICAgIHhpYW9taSp8cmVkbWkqfHBvY28qKSBERVZJQ0VfVFlQRT0ieGlhb21pIiA7OwogICAgICAgIGh1YXdlaSp8aG9ub3IqKSBERVZJQ0VfVFlQRT0iaHVhd2VpIiA7OwogICAgICAgIG9uZXBsdXMqKSAgREVWSUNFX1RZUEU9Im9uZXBsdXMiIDs7CiAgICAgICAgb3Bwbyp8cmVhbG1lKikgREVWSUNFX1RZUEU9Im9wcG8iIDs7CiAgICAgICAgdml2byopICAgICBERVZJQ0VfVFlQRT0idml2byIgOzsKICAgICAgICBnb29nbGUqKSAgIERFVklDRV9UWVBFPSJnb29nbGUiIDs7CiAgICAgICAgbW90b3JvbGEqfG1vdG8qKSBERVZJQ0VfVFlQRT0ibW90b3JvbGEiIDs7CiAgICAgICAgbnViaWEqfHJlZG1hZ2ljKikgREVWSUNFX1RZUEU9Im51YmlhIiA7OwogICAgICAgIHNvbnkqKSAgICAgREVWSUNFX1RZUEU9InNvbnkiIDs7CiAgICAgICAgYXN1cyopICAgICBERVZJQ0VfVFlQRT0iYXN1cyIgOzsKICAgICAgICAqKSAgICAgICAgIERFVklDRV9UWVBFPSJnZW5lcmljIiA7OwogICAgZXNhYwp9CgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEJMIFN0YXR1cyBTcG9vZmluZwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApzcG9vZl9ibF9zdGF0dXMoKSB7CiAgICBsb2NhbCBzaWxlbnQ9JHsxOi0wfQogICAgZGV0ZWN0X2RldmljZQogICAgWyAkc2lsZW50IC1lcSAwIF0gJiYgaW5mbyAi5Lyq6KOFQkzplIHlrprnirbmgIEuLi4iCiAgICBbICRzaWxlbnQgLWVxIDAgXSAmJiBpbmZvICLorr7lpIc6ICRERVZJQ0VfVFlQRSAoJEJSQU5EICRNT0RFTCkiCgogICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC52ZXJpZmllZGJvb3RzdGF0ZSAiZ3JlZW4iCiAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LnZibWV0YS5kZXZpY2Vfc3RhdGUgImxvY2tlZCIKICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QudmJtZXRhLmF2Yl92ZXJzaW9uICIxLjEiCiAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LnZibWV0YS5oYXNoX2FsZyAic2hhMjU2IgogICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC5mbGFzaC5sb2NrZWQgIjEiCiAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LndhcnJhbnR5X2JpdCAiMCIKICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QubW9kZSAibm9ybWFsIgogICAgc2FmZV9yZXNldHByb3Agcm8uZGVidWdnYWJsZSAiMCIKICAgIHNhZmVfcmVzZXRwcm9wIHJvLnNlY3VyZSAiMSIKICAgIHNhZmVfcmVzZXRwcm9wIHJvLmFkYi5zZWN1cmUgIjEiCiAgICBzYWZlX3Jlc2V0cHJvcCByby5idWlsZC50eXBlICJ1c2VyIgogICAgc2FmZV9yZXNldHByb3Agcm8uYnVpbGQudGFncyAicmVsZWFzZS1rZXlzIgogICAgc2FmZV9yZXNldHByb3Agcm8uYnVpbGQuc2VsaW51eCAiMSIKICAgIHNldHRpbmdzIHB1dCBnbG9iYWwgb2VtX3VubG9ja19lbmFibGVkIDAgMj4vZGV2L251bGwKICAgIHNldGVuZm9yY2UgMSAyPi9kZXYvbnVsbAogICAgc2FmZV9yZXNldHByb3Agcm8ubWFnaXNrLnZlcnNpb24gIiIKICAgIHNhZmVfcmVzZXRwcm9wIHBlcnNpc3QubWFnaXNrLmhpZGUgIjEiCiAgICBzYWZlX3Jlc2V0cHJvcCByby5rZXJuZWxzdS52ZXJzaW9uICIiCiAgICBzYWZlX3Jlc2V0cHJvcCByby5hcGF0Y2gudmVyc2lvbiAiIgogICAgc2FmZV9yZXNldHByb3Agc2VydmljZS5ib290YW5pbS5leGl0ICIxIgoKICAgIGNhc2UgIiRERVZJQ0VfVFlQRSIgaW4KICAgICAgICBzYW1zdW5nKQogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LndhcnJhbnR5X2JpdCAiMCIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC5rbm94IFdhcnJhbnR5ICIwIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5rbm94LmVuaGFuY2Uuenlnb3RlLmFzbHIgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QuZm1wX2NvbmZpZyAiMSIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC5mbGFzaC5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHBlcnNpc3Quc3lzLmtub3guZW5yb2xsbWVudCAiMCIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agc3lzLmtub3guc3RvcmUgIjAiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3Qua25veCAiMCIKICAgICAgICAgICAgWyAkc2lsZW50IC1lcSAwIF0gJiYgb2sgIlNhbXN1bmcgS25veOWxnuaAp+W3suiuvue9riIKICAgICAgICAgICAgOzsKICAgICAgICB4aWFvbWkpCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QuZmxhc2gubG9ja2VkICIxIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LnZlcmlmaWVkYm9vdHN0YXRlICJncmVlbiIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC53YXJyYW50eV9iaXQgIjAiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLm1pdWkuYnVpbGQucmVnaW9uICJDTiIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8ubWl1aS51aS52ZXJzaW9uLm5hbWUgIlYxNCIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3AgcGVyc2lzdC5zeXMubWl1aV9vcHRpbWl6YXRpb24gIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QuaHdfbG9ja2VkX3N0YXR1cyAibG9ja2VkIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCBzeXMub2VtX3VubG9ja19hbGxvd2VkICIwIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LmFudGkgIjEiCiAgICAgICAgICAgIFsgJHNpbGVudCAtZXEgMCBdICYmIG9rICLlsI/nsbMv57qi57Gz5bGe5oCn5bey6K6+572uIgogICAgICAgICAgICA7OwogICAgICAgIGh1YXdlaSkKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC5mbGFzaC5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QuaHdfbG9ja2VkX3N0YXR1cyAibG9ja2VkIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LnZlcmlmaWVkYm9vdHN0YXRlICJncmVlbiIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdGxvYWRlci5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLnNlY3VyZWJvb3QubG9ja2VkICIxIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCBwZXJzaXN0LnN5cy5vZW1fdW5sb2NrICIwIgogICAgICAgICAgICBbICRzaWxlbnQgLWVxIDAgXSAmJiBvayAi5Y2O5Li6L+iNo+iAgOWxnuaAp+W3suiuvue9riIKICAgICAgICAgICAgOzsKICAgICAgICBvbmVwbHVzKQogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LmZsYXNoLmxvY2tlZCAiMSIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC52ZXJpZmllZGJvb3RzdGF0ZSAiZ3JlZW4iCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3Qud2FycmFudHlfYml0ICIwIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5pc191bmxvY2tlZCAiMCIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3AgcGVyc2lzdC5zeXMub2VtX3VubG9jayAiMCIKICAgICAgICAgICAgWyAkc2lsZW50IC1lcSAwIF0gJiYgb2sgIk9uZVBsdXPlsZ7mgKflt7Lorr7nva4iCiAgICAgICAgICAgIDs7CiAgICAgICAgb3BwbykKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC5mbGFzaC5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QudmVyaWZpZWRib290c3RhdGUgImdyZWVuIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5vcHBvLmRldmljZS5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLm9wcG8udW5sb2NrICIwIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCBwZXJzaXN0LnN5cy5vZW1fdW5sb2NrICIwIgogICAgICAgICAgICBbICRzaWxlbnQgLWVxIDAgXSAmJiBvayAiT1BQTy9SZWFsbWXlsZ7mgKflt7Lorr7nva4iCiAgICAgICAgICAgIDs7CiAgICAgICAgdml2bykKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC5mbGFzaC5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QudmVyaWZpZWRib290c3RhdGUgImdyZWVuIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby52aXZvLmRldmljZS5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHBlcnNpc3Quc3lzLm9lbV91bmxvY2sgIjAiCiAgICAgICAgICAgIFsgJHNpbGVudCAtZXEgMCBdICYmIG9rICJWaXZv5bGe5oCn5bey6K6+572uIgogICAgICAgICAgICA7OwogICAgICAgIGdvb2dsZSkKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC5mbGFzaC5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QudmVyaWZpZWRib290c3RhdGUgImdyZWVuIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LnZibWV0YS5kZXZpY2Vfc3RhdGUgImxvY2tlZCIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC53YXJyYW50eV9iaXQgIjAiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsICIzMyIKICAgICAgICAgICAgWyAkc2lsZW50IC1lcSAwIF0gJiYgb2sgIkdvb2dsZSBQaXhlbOWxnuaAp+W3suiuvue9riIKICAgICAgICAgICAgOzsKICAgICAgICBudWJpYSkKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC5mbGFzaC5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QudmVyaWZpZWRib290c3RhdGUgImdyZWVuIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LndhcnJhbnR5X2JpdCAiMCIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8ubnViaWEuZGV2aWNlLmxvY2tlZCAiMSIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3AgcGVyc2lzdC5zeXMub2VtX3VubG9jayAiMCIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYnVpbGQudHlwZSAidXNlciIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8ubnViaWEuYnVpbGQucmVnaW9uICJDTiIKICAgICAgICAgICAgWyAkc2lsZW50IC1lcSAwIF0gJiYgb2sgIue6oumtlC/liqrmr5TkuprlsZ7mgKflt7Lorr7nva4iCiAgICAgICAgICAgIDs7CiAgICAgICAgbW90b3JvbGEpCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QuZmxhc2gubG9ja2VkICIxIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LnZlcmlmaWVkYm9vdHN0YXRlICJncmVlbiIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC53YXJyYW50eV9iaXQgIjAiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHBlcnNpc3Quc3lzLm9lbV91bmxvY2sgIjAiCiAgICAgICAgICAgIFsgJHNpbGVudCAtZXEgMCBdICYmIG9rICJNb3Rvcm9sYeWxnuaAp+W3suiuvue9riIKICAgICAgICAgICAgOzsKICAgICAgICBzb255KQogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5ib290LmZsYXNoLmxvY2tlZCAiMSIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC52ZXJpZmllZGJvb3RzdGF0ZSAiZ3JlZW4iCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLnNvbnkuYnVpbGQudHlwZSAidXNlciIKICAgICAgICAgICAgc2FmZV9yZXNldHByb3AgcGVyc2lzdC5zeXMub2VtX3VubG9jayAiMCIKICAgICAgICAgICAgWyAkc2lsZW50IC1lcSAwIF0gJiYgb2sgIlNvbnnlsZ7mgKflt7Lorr7nva4iCiAgICAgICAgICAgIDs7CiAgICAgICAgYXN1cykKICAgICAgICAgICAgc2FmZV9yZXNldHByb3Agcm8uYm9vdC5mbGFzaC5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHJvLmJvb3QudmVyaWZpZWRib290c3RhdGUgImdyZWVuIgogICAgICAgICAgICBzYWZlX3Jlc2V0cHJvcCByby5hc3VzLmRldmljZS5sb2NrZWQgIjEiCiAgICAgICAgICAgIHNhZmVfcmVzZXRwcm9wIHBlcnNpc3Quc3lzLm9lbV91bmxvY2sgIjAiCiAgICAgICAgICAgIFsgJHNpbGVudCAtZXEgMCBdICYmIG9rICJBU1VT5bGe5oCn5bey6K6+572uIgogICAgICAgICAgICA7OwogICAgICAgICopCiAgICAgICAgICAgIFsgJHNpbGVudCAtZXEgMCBdICYmIG9rICLpgJrnlKjlsZ7mgKflt7Lorr7nva4iCiAgICAgICAgICAgIDs7CiAgICBlc2FjCiAgICBbICRzaWxlbnQgLWVxIDAgXSAmJiB7CiAgICAgICAgZWNobyAiIgogICAgICAgIG9rICJCTOeKtuaAgeW3suS8quijhTogbG9ja2VkIChncmVlbikiCiAgICAgICAgaW5mbyAi5ZOB54mMOiAkREVWSUNFX1RZUEUgfCDlnovlj7c6ICRNT0RFTCIKICAgICAgICBsb2dfYWN0aW9uICJCTCBzcG9vZjogYnJhbmQ9JERFVklDRV9UWVBFIG1vZGVsPSRNT0RFTCIKICAgIH0KfQoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBCTCBTdGF0dXMgQ2hlY2sKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKY2hlY2tfYmxfc3RhdHVzKCkgewogICAgZGV0ZWN0X2RldmljZQogICAgZWNobyAiIgogICAgYm94X3RvcAogICAgYm94X3JvdyAiQkwgLyBWZXJpZmllZCBCb290IOeKtuaAgSIKICAgIGJveF9taWQKICAgIGJveF9yb3cyICLorr7lpIc6IiAiJERFVklDRV9UWVBFICgkQlJBTkQpIgogICAgYm94X3JvdzIgIuWei+WPtzoiICIkTU9ERUwiCiAgICBib3hfbWlkCiAgICBsb2NhbCB2Yj0kKGdldHByb3Agcm8uYm9vdC52ZXJpZmllZGJvb3RzdGF0ZSAyPi9kZXYvbnVsbCkKICAgIGxvY2FsIGZsPSQoZ2V0cHJvcCByby5ib290LmZsYXNoLmxvY2tlZCAyPi9kZXYvbnVsbCkKICAgIGxvY2FsIHZtPSQoZ2V0cHJvcCByby5ib290LnZibWV0YS5kZXZpY2Vfc3RhdGUgMj4vZGV2L251bGwpCiAgICBsb2NhbCB3cj0kKGdldHByb3Agcm8uYm9vdC53YXJyYW50eV9iaXQgMj4vZGV2L251bGwpCiAgICBsb2NhbCBkYj0kKGdldHByb3Agcm8uZGVidWdnYWJsZSAyPi9kZXYvbnVsbCkKICAgIGxvY2FsIGJ0PSQoZ2V0cHJvcCByby5idWlsZC50eXBlIDI+L2Rldi9udWxsKQogICAgbG9jYWwgc2U9JChnZXRlbmZvcmNlIDI+L2Rldi9udWxsKQogICAgbG9jYWwgdmJkPSLmnKrnn6UiCiAgICBjYXNlICIkdmIiIGluCiAgICAgICAgZ3JlZW4pIHZiZD0i5bey6ZSB5a6aIChncmVlbikiIDs7CiAgICAgICAgeWVsbG93KSB2YmQ9IuacqumUgeWumiAoeWVsbG93KSIgOzsKICAgICAgICBvcmFuZ2UpIHZiZD0i5bey6Kej6ZSBIChvcmFuZ2UpIiA7OwogICAgICAgIHJlZCkgdmJkPSLpqozor4HlpLHotKUgKHJlZCkiIDs7CiAgICBlc2FjCiAgICBsb2NhbCBmbGQ9IuacquefpSIKICAgIGNhc2UgIiRmbCIgaW4KICAgICAgICAxKSBmbGQ9IuW3sumUgeWumiIgOzsKICAgICAgICAwKSBmbGQ9IuacqumUgeWumiIgOzsKICAgIGVzYWMKICAgIGJveF9yb3cyICJWZXJpZmllZCBCb290OiIgIiR2YmQiCiAgICBib3hfcm93MiAiRmxhc2ggTG9jazoiICIkZmxkIgogICAgYm94X3JvdzIgIlZCTWV0YSBTdGF0ZToiICIke3ZtOi3mnKrnn6V9IgogICAgYm94X3JvdzIgIldhcnJhbnR5IEJpdDoiICIke3dyOi3mnKrnn6V9IgogICAgYm94X3JvdzIgIkRlYnVnZ2FibGU6IiAiJHtkYjot5pyq55+lfSIKICAgIGJveF9yb3cyICJCdWlsZCBUeXBlOiIgIiR7YnQ6LeacquefpX0iCiAgICBib3hfcm93MiAiU0VMaW51eDoiICIke3NlOi3mnKrnn6V9IgogICAgY2FzZSAiJERFVklDRV9UWVBFIiBpbgogICAgICAgIHNhbXN1bmcpIGJveF9taWQ7IGJveF9yb3cyICJLbm94OiIgIiQoZ2V0cHJvcCByby5ib290Lmtub3ggMj4vZGV2L251bGwpIiA7OwogICAgICAgIHhpYW9taSkgYm94X21pZDsgYm94X3JvdzIgIkFudGktUm9sbGJhY2s6IiAiJChnZXRwcm9wIHJvLmJvb3QuYW50aSAyPi9kZXYvbnVsbCkiOyBib3hfcm93MiAiTUlVSSBSZWdpb246IiAiJChnZXRwcm9wIHJvLm1pdWkuYnVpbGQucmVnaW9uIDI+L2Rldi9udWxsKSIgOzsKICAgICAgICBodWF3ZWkpIGJveF9taWQ7IGJveF9yb3cyICJIVyBMb2NrZWQ6IiAiJChnZXRwcm9wIHJvLmJvb3QuaHdfbG9ja2VkX3N0YXR1cyAyPi9kZXYvbnVsbCkiOyBib3hfcm93MiAiQm9vdGxvYWRlcjoiICIkKGdldHByb3Agcm8uYm9vdGxvYWRlci5sb2NrZWQgMj4vZGV2L251bGwpIiA7OwogICAgICAgIG51YmlhKSBib3hfbWlkOyBib3hfcm93MiAiQnVpbGQgUmVnaW9uOiIgIiQoZ2V0cHJvcCByby5udWJpYS5idWlsZC5yZWdpb24gMj4vZGV2L251bGwpIiA7OwogICAgZXNhYwogICAgYm94X2JvdAogICAgZWNobyAiIgp9CgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ29yZTogUmVzZXQgSURzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCmRvX3Jlc2V0KCkgewogICAgbG9jYWwgc2lsZW50PSR7MTotMH0KICAgIGxvYWRfY29uZmlnOyBiYWNrdXAKCiAgICBsb2NhbCBTTj0kKGdlbl9zZXJpYWwpIEFJRD0kKHJhbmRfaGV4IDE2KSBJTTE9JChnZW5faW1laSkgSU0yPSQoZ2VuX2ltZWkpCiAgICBsb2NhbCBXTT0kKGdlbl9tYWMpIEJNPSQoZ2VuX21hYykgSUY9JChnZXRfd2lmaV9pZmFjZSkKCiAgICBbICRzaWxlbnQgLWVxIDAgXSAmJiBpbmZvICLlupTnlKjmlrDmoIfor4YuLi4iCgogICAgc2FmZV9yZXNldHByb3Agcm8uc2VyaWFsbm8gIiRTTiI7IHNhZmVfcmVzZXRwcm9wIHBlcnNpc3Quc3lzLnNlcmlhbG5vICIkU04iOyBzYWZlX3Jlc2V0cHJvcCByby5ib290LnNlcmlhbG5vICIkU04iCiAgICBzZXR0aW5ncyBwdXQgc2VjdXJlIGFuZHJvaWRfaWQgIiRBSUQiIDI+L2Rldi9udWxsCiAgICBzYWZlX3Jlc2V0cHJvcCBwZXJzaXN0LnJhZGlvLmltZWkgIiRJTTEiOyBzYWZlX3Jlc2V0cHJvcCBwZXJzaXN0LnJhZGlvLmltZWkyICIkSU0yIgogICAgc2FmZV9yZXNldHByb3AgZ3NtLmltZWkgIiRJTTEiOyBzYWZlX3Jlc2V0cHJvcCBnc20uaW1laTIgIiRJTTIiCiAgICBpcCBsaW5rIHNob3cgIiRJRiIgPi9kZXYvbnVsbCAyPiYxICYmIHsgaXAgbGluayBzZXQgIiRJRiIgZG93biAyPi9kZXYvbnVsbDsgaXAgbGluayBzZXQgIiRJRiIgYWRkcmVzcyAiJFdNIiAyPi9kZXYvbnVsbDsgaXAgbGluayBzZXQgIiRJRiIgdXAgMj4vZGV2L251bGw7IHNhZmVfcmVzZXRwcm9wIHBlcnNpc3Qud2xhbi5tYWMgIiRXTSI7IH0KICAgIHNhZmVfcmVzZXRwcm9wIHBlcnNpc3Quc2VydmljZS5ibHVldG9vdGgubWFjICIkQk0iOyBzYWZlX3Jlc2V0cHJvcCBuZXQuYmx1ZXRvb3RoLm1hYyAiJEJNIgoKICAgIFsgJHNpbGVudCAtZXEgMCBdICYmIGluZm8gIua4heeQhuW6lOeUqOeXlei/uS4uLiIKICAgIGxvY2FsIGNudD0wCiAgICB3aGlsZSBJRlM9IHJlYWQgLXIgcGtnOyBkbwogICAgICAgIFsgLXogIiRwa2ciIF0gJiYgY29udGludWUKICAgICAgICBjbGVhbl9hcHBfdHJhY2VzICIkcGtnIgogICAgICAgIFsgJHNpbGVudCAtZXEgMCBdICYmIG9rICIkcGtnIgogICAgICAgIGNudD0kKChjbnQrMSkpCiAgICBkb25lIDw8IEVPRgokKGdldF90YXJnZXRfYXBwcykKRU9GCgogICAgcm0gLWYgL2RhdGEvbG9jYWwvdG1wL2tjXyogL2RhdGEvbG9jYWwvdG1wL2tlcm5lbC1jb3JlKiAyPi9kZXYvbnVsbAoKICAgIGVjaG8gIiIKICAgIGJveF90b3AKICAgIGJveF9yb3cgIiAgICAgICAgICDinJMg6K6+5aSH5qCH6K+G6YeN572u5a6M5oiQIgogICAgYm94X21pZAogICAgYm94X3JvdzIgIlNOOiIgIiRTTiIKICAgIGJveF9yb3cyICJBbmRyb2lkOiIgIiRBSUQiCiAgICBib3hfcm93MiAiSU1FSToiICIkSU0xIgogICAgYm94X3JvdzIgIldpRmk6IiAiJFdNIgogICAgYm94X3JvdzIgIkJUOiIgIiRCTSIKICAgIGJveF9yb3cyICLmuIXnkIY6IiAiJGNudCDkuKrlupTnlKgiCiAgICBib3hfYm90CiAgICBlY2hvICIiCiAgICBpbmZvICLljp/lp4vmoIfor4blt7LlpIfku706ICR7RH0kQkFDS1VQJHtOfSIKCiAgICAjIFBVQkcgZGVlcCBjbGVhbiBpZiBpbnN0YWxsZWQKICAgIGlmIFsgLWQgIi9kYXRhL2RhdGEvY29tLnRlbmNlbnQudG1ncC5wdWJnbWhkIiBdOyB0aGVuCiAgICAgICAgaW5mbyAi5ZKM5bmz57K+6Iux5rex5bqm5riF55CGLi4uIgogICAgICAgIHB1YmdfZGVlcF9jbGVhbiAiJEFJRCIgIiRJTTEiICIkU04iICIkV00iICIkQk0iCiAgICAgICAgb2sgIuWSjOW5s+eyvuiLseiuvuWkh+S/oeaBr+W3suimhuebliIKICAgIGZpCgogICAgbG9nX2FjdGlvbiAiUkVTRVQgc249JFNOIGFpZD0kQUlEIGltZWk9JElNMSBhcHBzPSRjbnQiCn0KCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgU3ViIE1lbnVzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpzaG93X2N1cnJlbnQoKSB7CiAgICBlY2hvICIiCiAgICBib3hfdG9wCiAgICBib3hfcm93ICLlvZPliY3orr7lpIfmoIfor4YiCiAgICBib3hfbWlkCiAgICBib3hfcm93MiAiU046IiAiJChnZXRwcm9wIHJvLnNlcmlhbG5vIDI+L2Rldi9udWxsKSIKICAgIGJveF9yb3cyICJBbmRyb2lkOiIgIiQoc2V0dGluZ3MgZ2V0IHNlY3VyZSBhbmRyb2lkX2lkIDI+L2Rldi9udWxsKSIKICAgIGJveF9yb3cyICJJTUVJMToiICIkKGdldHByb3AgZ3NtLmltZWkgMj4vZGV2L251bGwpIgogICAgYm94X3JvdzIgIklNRUkyOiIgIiQoZ2V0cHJvcCBnc20uaW1laTIgMj4vZGV2L251bGwpIgogICAgYm94X3JvdzIgIldpRmk6IiAiJChpcCBsaW5rIHNob3cgJChnZXRfd2lmaV9pZmFjZSkgMj4vZGV2L251bGwgfCBhd2sgJy9saW5rLyB7cHJpbnQgJDJ9JykiCiAgICBib3hfcm93MiAiQlQ6IiAiJChnZXRwcm9wIG5ldC5ibHVldG9vdGgubWFjIDI+L2Rldi9udWxsKSIKICAgIGJveF9ib3QKICAgIGVjaG8gIiIKfQoKc2hvd19iYWNrdXAoKSB7CiAgICBsb2NhbCBmPSQoZmluZF9iYWNrdXApCiAgICBbIC16ICIkZiIgXSAmJiB7IGVyciAi5peg5aSH5Lu9IjsgcmV0dXJuOyB9CiAgICBlY2hvICIiCiAgICBib3hfdG9wCiAgICBib3hfcm93ICLlpIfku73ljp/lp4vmoIfor4YiCiAgICBib3hfbWlkCiAgICBib3hfcm93ICIke0R9JHtmfSR7Tn0iCiAgICBib3hfbWlkCiAgICB3aGlsZSBJRlM9IHJlYWQgLXIgbDsgZG8KICAgICAgICBjYXNlICIkbCIgaW4KICAgICAgICAgICAgU049KikgYm94X3JvdzIgIuW6j+WIl+WPtzoiICIke2wjU049fSIgOzsKICAgICAgICAgICAgQU5EUk9JRF9JRD0qKSBib3hfcm93MiAiQW5kcm9pZDoiICIke2wjQU5EUk9JRF9JRD19IiA7OwogICAgICAgICAgICBJTUVJMT0qKSBib3hfcm93MiAiSU1FSTE6IiAiJHtsI0lNRUkxPX0iIDs7CiAgICAgICAgICAgIElNRUkyPSopIGJveF9yb3cyICJJTUVJMjoiICIke2wjSU1FSTI9fSIgOzsKICAgICAgICAgICAgV0lGSV9NQUM9KikgYm94X3JvdzIgIldpRmk6IiAiJHtsI1dJRklfTUFDPX0iIDs7CiAgICAgICAgICAgIEJUX01BQz0qKSBib3hfcm93MiAiQlQ6IiAiJHtsI0JUX01BQz19IiA7OwogICAgICAgIGVzYWMKICAgIGRvbmUgPCAiJGYiCiAgICBib3hfYm90CiAgICBlY2hvICIiCn0KCnNldHRpbmdzX21lbnUoKSB7CiAgICBsb2FkX2NvbmZpZzsgY2xlYXIKICAgIGJveF9kYmwKICAgIGJveF9oZHIgIua4heeQhuiuvue9riIKICAgIGJveF9lbmQKICAgIGVjaG8gIiIKICAgIGVjaG8gLWUgIiAg5b2T5YmN5qih5byPOiAke0d9JChzaG93X21vZGUpJHtOfSIKICAgIFsgLW4gIiRFWENMVURFX0FQUFMiIF0gJiYgZWNobyAtZSAiICDmjpLpmaTlupTnlKg6ICR7WX0kRVhDTFVERV9BUFBTJHtOfSIKCiAgICAjIFNob3cgc2VsZWN0ZWQgYXBwcyBpZiBjdXN0b20gbW9kZQogICAgY2FzZSAiJFRBUkdFVF9BUFBTIiBpbgogICAgICAgIEFMTF9HQU1FU3xBTExfVEhJUkRfUEFSVFkpIDs7CiAgICAgICAgKikKICAgICAgICAgICAgZWNobyAiIgogICAgICAgICAgICBlY2hvIC1lICIgICR7RH3lt7LpgInlupTnlKg6JHtOfSIKICAgICAgICAgICAgZm9yIHBrZyBpbiAkKGVjaG8gIiRUQVJHRVRfQVBQUyIgfCB0ciAnLCcgJ1xuJyk7IGRvCiAgICAgICAgICAgICAgICBlY2hvIC1lICIgICAgJHtHfeKckyR7Tn0gJChnZXRfYXBwX25hbWUgIiRwa2ciKSAke0R9KCRwa2cpJHtOfSIKICAgICAgICAgICAgZG9uZQogICAgICAgICAgICA7OwogICAgZXNhYwoKICAgIGVjaG8gIiIKICAgIGVjaG8gLWUgIiAgJHtHfTEke059IOKWuCDmiYDmnInmuLjmiI8gKOm7mOiupCkiCiAgICBlY2hvIC1lICIgICR7R30yJHtOfSDilrgg5omA5pyJ56ys5LiJ5pa55bqU55SoIgogICAgZWNobyAtZSAiICAke0d9MyR7Tn0g4pa4IOmAieaLqea4uOaIjyIKICAgIGVjaG8gLWUgIiAgJHtHfTQke059IOKWuCDorr7nva7mjpLpmaTliJfooagiCiAgICBlY2hvIC1lICIgICR7RH0wJHtOfSDilrgg6L+U5ZueIgogICAgZWNobyAiIgogICAgZWNobyAtbiAiICDor7fpgInmi6k6ICI7IHJlYWQgLXIgY2gKICAgIGNhc2UgIiRjaCIgaW4KICAgICAgICAxKSBUQVJHRVRfQVBQUz0iQUxMX0dBTUVTIjsgRVhDTFVERV9BUFBTPSIiOyBzYXZlX2NvbmZpZzsgb2sgIuW3suiuvuS4ujog5omA5pyJ5ri45oiPIjsgc2xlZXAgMSA7OwogICAgICAgIDIpIFRBUkdFVF9BUFBTPSJBTExfVEhJUkRfUEFSVFkiOyBFWENMVURFX0FQUFM9IiI7IHNhdmVfY29uZmlnOyBvayAi5bey6K6+5Li6OiDmiYDmnInnrKzkuInmlrkiOyBzbGVlcCAxIDs7CiAgICAgICAgMykgc2VsZWN0X2dhbWVzX21lbnUgOzsKICAgICAgICA0KSBlY2hvICIiOyBlY2hvICIgIOaOkumZpOWMheWQjSAo6YCX5Y+35YiG6ZqUKToiOyBlY2hvIC1uICIgID4gIjsgcmVhZCAtciBlOyBFWENMVURFX0FQUFM9IiRlIjsgc2F2ZV9jb25maWc7IG9rICLlt7Lorr7nva4iOyBzbGVlcCAxIDs7CiAgICAgICAgYnxCKQogICAgICAgICAgICAgICAgZWNobyAiIgogICAgICAgICAgICAgICAgZWNobyAtZSAiICAke1l956Gu6K6k5Lyq6KOFQkzplIHlrprnirbmgIHvvJ8ke059IgogICAgICAgICAgICAgICAgZWNobyAtZSAiICAke0R95L+u5pS5IHZlcmlmaWVkYm9vdC9mbGFzaC5sb2NrZWQvZGVidWdnYWJsZSDnrYkke059IgogICAgICAgICAgICAgICAgZWNobyAtbiAiICDovpPlhaUgeSDnoa7orqQ6ICI7IHJlYWQgLXIgeW4KICAgICAgICAgICAgICAgIFsgIiR5biIgPSAieSIgXSB8fCBbICIkeW4iID0gIlkiIF0gJiYgeyBlY2hvICIiOyBzcG9vZl9ibF9zdGF0dXMgMDsgfSB8fCB7IGVjaG8gIiI7IGluZm8gIuW3suWPlua2iCI7IH0KICAgICAgICAgICAgICAgIGVjaG8gIiAg5oyJ5Zue6L2m6L+U5ZueIjsgcmVhZCAtcgogICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgaHxIKSBzaG93X2hlbHA7IGVjaG8gIiAg5oyJ5Zue6L2m6L+U5ZueIjsgcmVhZCAtciA7OwogICAgICAgICAgICAwKSByZXR1cm4gOzsKICAgIGVzYWMKfQoKc2VsZWN0X2dhbWVzX21lbnUoKSB7CiAgICBlY2hvICIiOyBpbmZvICLmo4DmtYvmuLjmiI8uLi4iCiAgICBsb2NhbCB0bXA9Ii9kYXRhL2FkYi8ua2NfZ2wudG1wIgogICAgZGV0ZWN0X2dhbWVzID4gIiR0bXAiIDI+L2Rldi9udWxsCiAgICBsb2NhbCBjbnQ9JCh3YyAtbCA8ICIkdG1wIiB8IHRyIC1kICcgJykKICAgIFsgIiRjbnQiIC1lcSAwIF0gfHwgWyAhIC1zICIkdG1wIiBdICYmIHsgZXJyICLmnKrmo4DmtYvliLDmuLjmiI8iOyBybSAtZiAiJHRtcCI7IHNsZWVwIDE7IHJldHVybjsgfQoKICAgIGVjaG8gIiIKICAgIGxvY2FsIGlkeD0wCiAgICB3aGlsZSBJRlM9IHJlYWQgLXIgcGtnOyBkbwogICAgICAgIGlkeD0kKChpZHgrMSkpCiAgICAgICAgcHJpbnRmICIgICR7R30lMmQke059IOKWuCAlLTMwcyAke0R9JXMke059XG4iICIkaWR4IiAiJChnZXRfYXBwX25hbWUgIiRwa2ciKSIgIiRwa2ciCiAgICBkb25lIDwgIiR0bXAiCgogICAgZWNobyAiIgogICAgZWNobyAiICDovpPlhaXnvJblj7cgKOepuuagvOWIhumalCkgfCAke0d9YSR7Tn095YWo6YOoIHwgJHtEfXEke059Pei/lOWbniIKICAgIGVjaG8gLW4gIiAgPiAiOyByZWFkIC1yIHNlbAogICAgY2FzZSAiJHNlbCIgaW4KICAgICAgICBxfFEpIHJtIC1mICIkdG1wIjsgcmV0dXJuIDs7CiAgICAgICAgYXxBKSBUQVJHRVRfQVBQUz0iQUxMX0dBTUVTIjsgRVhDTFVERV9BUFBTPSIiOyBzYXZlX2NvbmZpZzsgcm0gLWYgIiR0bXAiOyBvayAi5YWo6YOoICgkY250IOS4qikiOyBzbGVlcCAxOyByZXR1cm4gOzsKICAgIGVzYWMKCiAgICBsb2NhbCBzZWxfbGlzdD0iIiBzZWxfbj0wCiAgICBmb3IgbnVtIGluICRzZWw7IGRvCiAgICAgICAgWyAiJG51bSIgLWdlIDEgXSAmJiBbICIkbnVtIiAtbGUgIiRjbnQiIF0gMj4vZGV2L251bGwgfHwgY29udGludWUKICAgICAgICBsb2NhbCBwPSQoc2VkIC1uICIke251bX1wIiAiJHRtcCIpCiAgICAgICAgWyAtbiAiJHAiIF0gJiYgeyBbIC1uICIkc2VsX2xpc3QiIF0gJiYgc2VsX2xpc3Q9IiRzZWxfbGlzdCwiOyBzZWxfbGlzdD0iJHtzZWxfbGlzdH0ke3B9Ijsgc2VsX249JCgoc2VsX24rMSkpOyBvayAiJChnZXRfYXBwX25hbWUgIiRwIikiOyB9CiAgICBkb25lCiAgICBybSAtZiAiJHRtcCIKICAgIFsgLW4gIiRzZWxfbGlzdCIgXSAmJiB7IFRBUkdFVF9BUFBTPSIkc2VsX2xpc3QiOyBzYXZlX2NvbmZpZzsgZWNobyAiIjsgb2sgIuW3sumAiSAkc2VsX24g5LiqIjsgbG9nX2FjdGlvbiAiU0VMRUNUICRzZWxfbGlzdCI7IHNsZWVwIDE7IH0KfQoKY2xlYW5fY2hlYXRfbW9kdWxlcygpIHsKICAgIGNsZWFyCiAgICBib3hfZGJsCiAgICBib3hfaGRyICLmuIXnkIbpnZ7ms5XmqKHlnZciCiAgICBib3hfZW5kCiAgICBlY2hvICIiCiAgICBpbmZvICI3IOe7tOW6puaJq+aPj+S4rS4uLiIKCiAgICBsb2NhbCBmb3VuZD0kKGRldGVjdF9jaGVhdF9tb2R1bGVzKQogICAgaWYgWyAteiAiJGZvdW5kIiBdOyB0aGVuCiAgICAgICAgZWNobyAiIgogICAgICAgIGJveF90b3AKICAgICAgICBib3hfcm93ICIgICAgICAgICAg4pyTIOacquajgOa1i+WIsOWPr+eWkemhueebriIKICAgICAgICBib3hfYm90CiAgICAgICAgZWNobyAiIjsgZWNobyAiICDmjInlm57ovabov5Tlm54iOyByZWFkIC1yOyByZXR1cm4KICAgIGZpCgogICAgZWNobyAiIgogICAgbG9jYWwgY291bnQ9MAogICAgd2hpbGUgSUZTPSByZWFkIC1yIGl0ZW07IGRvCiAgICAgICAgWyAteiAiJGl0ZW0iIF0gJiYgY29udGludWUKICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKICAgICAgICBsb2NhbCByaXNrPSQoZWNobyAiJGl0ZW0iIHwgZ3JlcCAtbyAn6aOO6ZmpOlswLTldKicgfCBjdXQgLWQ6IC1mMikKICAgICAgICBsb2NhbCBsdj0i5L2OIiBjb2w9IiRZIgogICAgICAgIFsgLW4gIiRyaXNrIiBdICYmIFsgIiRyaXNrIiAtZ2UgNjAgXSAmJiBsdj0i6auYIiBjb2w9IiRSIgogICAgICAgIFsgLW4gIiRyaXNrIiBdICYmIFsgIiRyaXNrIiAtZ2UgMzAgXSAmJiBbICIkcmlzayIgLWx0IDYwIF0gJiYgbHY9IuS4rSIKCiAgICAgICAgY2FzZSAiJGl0ZW0iIGluCiAgICAgICAgICAgIFxbZnJpZGFcXSopICAgICBwcmludGYgIiAgJHtjb2x9JTJkLiR7Tn0gJS0zMHMgJHtSfVtGcmlkYV0ke059ICAgIOmjjumZqTolc1xuIiAiJGNvdW50IiAiRnJpZGHms6jlhaUiICIkbHYiIDs7CiAgICAgICAgICAgIFxbZnJhbWV3b3JrXF0qKSBwcmludGYgIiAgJHtjb2x9JTJkLiR7Tn0gJS0zMHMgJHtSfVtIb29rXSR7Tn0gICAgIOmjjumZqTolc1xuIiAiJGNvdW50IiAiWHBvc2VkL0xTUG9zZWQiICIkbHYiIDs7CiAgICAgICAgICAgIFxbbW9kaWZpZXJcXSopICBwcmludGYgIiAgJHtjb2x9JTJkLiR7Tn0gJS0zMHMgJHtSfVvkv67mlLnlmahdJHtOfSAgIOmjjumZqTolc1xuIiAiJGNvdW50IiAi5ri45oiP5L+u5pS55ZmoIiAiJGx2IiA7OwogICAgICAgICAgICBcW3Byb3h5XF0qKSAgICAgcHJpbnRmICIgICR7Y29sfSUyZC4ke059ICUtMzBzICR7WX1b5oqT5YyFXSR7Tn0gICAgIOmjjumZqTolc1xuIiAiJGNvdW50IiAi572R57uc5oqT5YyFIiAiJGx2IiA7OwogICAgICAgICAgICBcW2hpZGVcXSopICAgICAgcHJpbnRmICIgICR7Y29sfSUyZC4ke059ICUtMzBzICR7WX1b6ZqQ6JePXSR7Tn0gICAgIOmjjumZqTolc1xuIiAiJGNvdW50IiAiUm9vdOmakOiXjyIgIiRsdiIgOzsKICAgICAgICAgICAgXFttb2R1bGVcXSopICAgIHByaW50ZiAiICAlMmQuICUtMzBzICR7WX1b5qih5Z2XXSR7Tn0gICAgIOWFs+mUruivjVxuIiAiJGNvdW50IiAiJHtpdGVtI1xbbW9kdWxlXF19IiA7OwogICAgICAgICAgICBcW3RtcFxdKikgICAgICAgcHJpbnRmICIgICUyZC4gJS0zMHMgJHtZfVvkuLTml7ZdJHtOfVxuIiAiJGNvdW50IiAiJHtpdGVtI1xbdG1wXF19IiA7OwogICAgICAgIGVzYWMKICAgIGRvbmUgPDwgRU9GCiRmb3VuZApFT0YKCiAgICBlY2hvICIiCiAgICBlY2hvICIgIOe8luWPt+WIoOmZpCAo56m65qC85YiG6ZqUKSB8ICR7Un1kJHtOfT3lhajpg6ggfCAke0R9cSR7Tn096L+U5ZueIgogICAgZWNobyAtbiAiICA+ICI7IHJlYWQgLXIgc2VsCgogICAgY2FzZSAiJHNlbCIgaW4KICAgICAgICBxfFEpIHJldHVybiA7OwogICAgICAgIGR8RCkKICAgICAgICAgICAgZWNobyAiIgogICAgICAgICAgICB3aGlsZSBJRlM9IHJlYWQgLXIgaXRlbTsgZG8KICAgICAgICAgICAgICAgIFsgLXogIiRpdGVtIiBdICYmIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBjYXNlICIkaXRlbSIgaW4KICAgICAgICAgICAgICAgICAgICBcW21vZHVsZVxdKikgcm0gLXJmICIvZGF0YS9hZGIvbW9kdWxlcy8ke2l0ZW0jXFttb2R1bGVcXX0iICIvZGF0YS9hZGIva3N1L21vZHVsZXMvJHtpdGVtI1xbbW9kdWxlXF19IiAyPi9kZXYvbnVsbDsgb2sgIuWIoDogJHtpdGVtI1xbbW9kdWxlXF19IiA7OwogICAgICAgICAgICAgICAgICAgIFxbZnJhbWV3b3JrXF0qKSB3YXJuICLpnIDmiYvliqjljbjovb06ICR7aXRlbSNcW2ZyYW1ld29ya1xdfSIgOzsKICAgICAgICAgICAgICAgICAgICBcW3RtcFxdKikgcm0gLWYgIi9kYXRhL2xvY2FsL3RtcC8ke2l0ZW0jXFt0bXBcXX0iIDI+L2Rldi9udWxsOyBvayAi5YigOiAke2l0ZW0jXFt0bXBcXX0iIDs7CiAgICAgICAgICAgICAgICAgICAgKikgaW5mbyAi6Lez6L+HOiAkaXRlbSIgOzsKICAgICAgICAgICAgICAgIGVzYWMKICAgICAgICAgICAgZG9uZSA8PCBFT0YKJGZvdW5kCkVPRgogICAgICAgICAgICBsb2dfYWN0aW9uICJDTEVBTl9BTEwiCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgZm9yIG51bSBpbiAkc2VsOyBkbwogICAgICAgICAgICAgICAgWyAiJG51bSIgLWdlIDEgXSAmJiBbICIkbnVtIiAtbGUgIiRjb3VudCIgXSAyPi9kZXYvbnVsbCB8fCBjb250aW51ZQogICAgICAgICAgICAgICAgbG9jYWwgaXRlbT0kKGVjaG8gIiRmb3VuZCIgfCBzZWQgLW4gIiR7bnVtfXAiKQogICAgICAgICAgICAgICAgWyAteiAiJGl0ZW0iIF0gJiYgY29udGludWUKICAgICAgICAgICAgICAgIGNhc2UgIiRpdGVtIiBpbgogICAgICAgICAgICAgICAgICAgIFxbbW9kdWxlXF0qKSBybSAtcmYgIi9kYXRhL2FkYi9tb2R1bGVzLyR7aXRlbSNcW21vZHVsZVxdfSIgIi9kYXRhL2FkYi9rc3UvbW9kdWxlcy8ke2l0ZW0jXFttb2R1bGVcXX0iIDI+L2Rldi9udWxsOyBvayAi5YigOiAke2l0ZW0jXFttb2R1bGVcXX0iIDs7CiAgICAgICAgICAgICAgICAgICAgXFtmcmFtZXdvcmtcXSopIHdhcm4gIumcgOaJi+WKqOWNuOi9vTogJHtpdGVtI1xbZnJhbWV3b3JrXF19IiA7OwogICAgICAgICAgICAgICAgICAgIFxbdG1wXF0qKSBybSAtZiAiL2RhdGEvbG9jYWwvdG1wLyR7aXRlbSNcW3RtcFxdfSIgMj4vZGV2L251bGw7IG9rICLliKA6ICR7aXRlbSNcW3RtcFxdfSIgOzsKICAgICAgICAgICAgICAgIGVzYWMKICAgICAgICAgICAgICAgIGxvZ19hY3Rpb24gIkNMRUFOICRpdGVtIgogICAgICAgICAgICBkb25lCiAgICAgICAgICAgIDs7CiAgICBlc2FjCiAgICBlY2hvICIiOyBvayAi5a6M5oiQIjsgZWNobyAiICDmjInlm57ovabov5Tlm54iOyByZWFkIC1yCn0KCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRXhwb3J0IC8gSW1wb3J0IENvbmZpZwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApleHBvcnRfY29uZmlnKCkgewogICAgbG9jYWwgZXhwZmlsZT0iL3NkY2FyZC9rZXJuZWwtY29yZS1jb25maWcua2MiCiAgICBsb2FkX2NvbmZpZwogICAgY2F0ID4gIiRleHBmaWxlIiA8PCBFT0YKIyBLZXJuZWwgQ29yZSBDb25maWcgRXhwb3J0CiMgJChkYXRlKQpUQVJHRVRfQVBQUz0ke1RBUkdFVF9BUFBTfQpFWENMVURFX0FQUFM9JHtFWENMVURFX0FQUFN9CkVPRgogICAgY2htb2QgNjQ0ICIkZXhwZmlsZSIKICAgIGVjaG8gIiIKICAgIG9rICLphY3nva7lt7Llr7zlh7o6ICRleHBmaWxlIgogICAgIyBBbHNvIGV4cG9ydCBiYWNrdXAgaWYgZXhpc3RzCiAgICBpZiBbIC1mICIkQkFDS1VQIiBdOyB0aGVuCiAgICAgICAgY3AgIiRCQUNLVVAiICIvc2RjYXJkL2tlcm5lbC1jb3JlLWJhY2t1cC5kYXQiIDI+L2Rldi9udWxsCiAgICAgICAgb2sgIuWkh+S7veW3suWvvOWHujogL3NkY2FyZC9rZXJuZWwtY29yZS1iYWNrdXAuZGF0IgogICAgZmkKICAgIGVjaG8gIiIKfQoKaW1wb3J0X2NvbmZpZygpIHsKICAgIGxvY2FsIGltcGZpbGU9Ii9zZGNhcmQva2VybmVsLWNvcmUtY29uZmlnLmtjIgogICAgaWYgWyAhIC1mICIkaW1wZmlsZSIgXTsgdGhlbgogICAgICAgIGVyciAi5pyq5om+5YiwOiAkaW1wZmlsZSIKICAgICAgICByZXR1cm4gMQogICAgZmkKICAgIGxvY2FsIG5ld190YXJnZXQ9JChncmVwICdeVEFSR0VUX0FQUFM9JyAiJGltcGZpbGUiIDI+L2Rldi9udWxsIHwgY3V0IC1kPSAtZjIpCiAgICBsb2NhbCBuZXdfZXhjbHVkZT0kKGdyZXAgJ15FWENMVURFX0FQUFM9JyAiJGltcGZpbGUiIDI+L2Rldi9udWxsIHwgY3V0IC1kPSAtZjIpCiAgICBbIC16ICIkbmV3X3RhcmdldCIgXSAmJiB7IGVyciAi6YWN572u5paH5Lu25peg5pWIIjsgcmV0dXJuIDE7IH0KICAgIFRBUkdFVF9BUFBTPSIkbmV3X3RhcmdldCIKICAgIEVYQ0xVREVfQVBQUz0iJG5ld19leGNsdWRlIgogICAgc2F2ZV9jb25maWcKICAgICMgSW1wb3J0IGJhY2t1cCBpZiBleGlzdHMKICAgIGlmIFsgLWYgIi9zZGNhcmQva2VybmVsLWNvcmUtYmFja3VwLmRhdCIgXSAmJiBbICEgLWYgIiRCQUNLVVAiIF07IHRoZW4KICAgICAgICBjcCAiL3NkY2FyZC9rZXJuZWwtY29yZS1iYWNrdXAuZGF0IiAiJEJBQ0tVUCIgMj4vZGV2L251bGwKICAgICAgICBjaG1vZCA2MDAgIiRCQUNLVVAiCiAgICAgICAgb2sgIuWkh+S7veW3suWvvOWFpSIKICAgIGZpCiAgICBlY2hvICIiCiAgICBvayAi6YWN572u5bey5a+85YWlOiAkKHNob3dfbW9kZSkiCiAgICBlY2hvICIiCn0KCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgSGlzdG9yeSBWaWV3ZXIKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKc2hvd19oaXN0b3J5KCkgewogICAgZWNobyAiIgogICAgYm94X3RvcAogICAgYm94X3JvdyAi5pON5L2c6K6w5b2VIgogICAgYm94X21pZAogICAgaWYgWyAtZiAiJExPR0ZJTEUiIF0gJiYgWyAtcyAiJExPR0ZJTEUiIF07IHRoZW4KICAgICAgICB0YWlsIC0yMCAiJExPR0ZJTEUiIHwgd2hpbGUgSUZTPSByZWFkIC1yIGxpbmU7IGRvCiAgICAgICAgICAgIGJveF9yb3cgIiRsaW5lIgogICAgICAgIGRvbmUKICAgIGVsc2UKICAgICAgICBib3hfcm93ICLmmoLml6DorrDlvZUiCiAgICBmaQogICAgYm94X2JvdAogICAgZWNobyAiIgp9CgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIE9uLWJvb3QgQXV0byBSZXNldAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApzZXR1cF9hdXRvc3RhcnQoKSB7CiAgICBsb2NhbCBzdmNfZGlyPSIvZGF0YS9hZGIvc2VydmljZS5kIgogICAgbG9jYWwgc3ZjX2ZpbGU9IiRzdmNfZGlyL2tjLWF1dG9zdGFydC5zaCIKICAgIGxvY2FsIGlzX2VuYWJsZWQ9IuWQpiIKICAgIFsgLWYgIiRzdmNfZmlsZSIgXSAmJiBpc19lbmFibGVkPSLmmK8iCgogICAgZWNobyAiIgogICAgYm94X3RvcAogICAgYm94X3JvdyAi5byA5py66Ieq5Yqo6YeN572uIgogICAgYm94X21pZAogICAgYm94X3JvdzIgIueKtuaAgToiICIkaXNfZW5hYmxlZCIKICAgIGJveF9yb3cyICLohJrmnKw6IiAiJFNDUklQVF9QQVRIIgogICAgYm94X2JvdAogICAgZWNobyAiIgogICAgZWNobyAtZSAiICAke0d9MSR7Tn0g4pa4IOWQr+eUqOW8gOacuuiHquWKqOmHjee9riIKICAgIGVjaG8gLWUgIiAgJHtSfTIke059IOKWuCDnpoHnlKjlvIDmnLroh6rliqjph43nva4iCiAgICBlY2hvIC1lICIgICR7RH0wJHtOfSDilrgg6L+U5ZueIgogICAgZWNobyAiIgogICAgZWNobyAtbiAiICDor7fpgInmi6k6ICI7IHJlYWQgLXIgY2gKCiAgICBjYXNlICIkY2giIGluCiAgICAgICAgMSkKICAgICAgICAgICAgbWtkaXIgLXAgIiRzdmNfZGlyIiAyPi9kZXYvbnVsbAogICAgICAgICAgICBjYXQgPiAiJHN2Y19maWxlIiA8PCBTVkMKIyEvc3lzdGVtL2Jpbi9zaAojIEtlcm5lbCBDb3JlIC0gQXV0byByZXNldCBvbiBib290CndoaWxlIFsgIlwkKGdldHByb3Agc3lzLmJvb3RfY29tcGxldGVkKSIgIT0gIjEiIF07IGRvIHNsZWVwIDE7IGRvbmUKc2xlZXAgMTAKc2ggIiR7U0NSSVBUX1BBVEh9IiBxdWljayA+PiAvZGF0YS9hZGIvLmtjLWF1dG9zdGFydC5sb2cgMj4mMQpTVkMKICAgICAgICAgICAgY2htb2QgNzU1ICIkc3ZjX2ZpbGUiCiAgICAgICAgICAgIG9rICLlt7LlkK/nlKg6ICRzdmNfZmlsZSIKICAgICAgICAgICAgaW5mbyAi5q+P5qyh5byA5py65bCG6Ieq5Yqo6YeN572u6K6+5aSH5qCH6K+GIgogICAgICAgICAgICBsb2dfYWN0aW9uICJBVVRPU1RBUlQgZW5hYmxlZCIKICAgICAgICAgICAgOzsKICAgICAgICAyKQogICAgICAgICAgICBybSAtZiAiJHN2Y19maWxlIiAyPi9kZXYvbnVsbAogICAgICAgICAgICBvayAi5bey56aB55So5byA5py66Ieq5Yqo6YeN572uIgogICAgICAgICAgICBsb2dfYWN0aW9uICJBVVRPU1RBUlQgZGlzYWJsZWQiCiAgICAgICAgICAgIDs7CiAgICAgICAgYnxCKQogICAgICAgICAgICAgICAgZWNobyAiIgogICAgICAgICAgICAgICAgZWNobyAtZSAiICAke1l956Gu6K6k5Lyq6KOFQkzplIHlrprnirbmgIHvvJ8ke059IgogICAgICAgICAgICAgICAgZWNobyAtZSAiICAke0R95L+u5pS5IHZlcmlmaWVkYm9vdC9mbGFzaC5sb2NrZWQvZGVidWdnYWJsZSDnrYkke059IgogICAgICAgICAgICAgICAgZWNobyAtbiAiICDovpPlhaUgeSDnoa7orqQ6ICI7IHJlYWQgLXIgeW4KICAgICAgICAgICAgICAgIFsgIiR5biIgPSAieSIgXSB8fCBbICIkeW4iID0gIlkiIF0gJiYgeyBlY2hvICIiOyBzcG9vZl9ibF9zdGF0dXMgMDsgfSB8fCB7IGVjaG8gIiI7IGluZm8gIuW3suWPlua2iCI7IH0KICAgICAgICAgICAgICAgIGVjaG8gIiAg5oyJ5Zue6L2m6L+U5ZueIjsgcmVhZCAtcgogICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgaHxIKSBzaG93X2hlbHA7IGVjaG8gIiAg5oyJ5Zue6L2m6L+U5ZueIjsgcmVhZCAtciA7OwogICAgICAgICAgICAwKSByZXR1cm4gOzsKICAgIGVzYWMKICAgIGVjaG8gIiIKfQoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBEcnkgUnVuCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCmRvX2RyeXJ1bigpIHsKICAgIGxvYWRfY29uZmlnCiAgICBlY2hvICIiCiAgICBib3hfdG9wCiAgICBib3hfcm93ICLpooTop4jmqKHlvI8gKOS4jeS8muS/ruaUueS7u+S9leWGheWuuSkiCiAgICBib3hfYm90CiAgICBlY2hvICIiCgogICAgbG9jYWwgU049JChnZW5fc2VyaWFsKSBBSUQ9JChyYW5kX2hleCAxNikgSU0xPSQoZ2VuX2ltZWkpIElNMj0kKGdlbl9pbWVpKQogICAgbG9jYWwgV009JChnZW5fbWFjKSBCTT0kKGdlbl9tYWMpCgogICAgZWNobyAiICDlsIbkvJrnlJ/miJA6IgogICAgYm94X3RvcAogICAgYm94X3JvdzIgIlNOOiIgIiRTTiIKICAgIGJveF9yb3cyICJBbmRyb2lkOiIgIiRBSUQiCiAgICBib3hfcm93MiAiSU1FSTE6IiAiJElNMSIKICAgIGJveF9yb3cyICJJTUVJMjoiICIkSU0yIgogICAgYm94X3JvdzIgIldpRmk6IiAiJFdNIgogICAgYm94X3JvdzIgIkJUOiIgIiRCTSIKICAgIGJveF9ib3QKICAgIGVjaG8gIiIKCiAgICBlY2hvICIgIOWwhuS8mua4heeQhjoiCiAgICBsb2NhbCBjbnQ9MAogICAgd2hpbGUgSUZTPSByZWFkIC1yIHBrZzsgZG8KICAgICAgICBbIC16ICIkcGtnIiBdICYmIGNvbnRpbnVlCiAgICAgICAgY250PSQoKGNudCsxKSkKICAgICAgICBlY2hvIC1lICIgICAgJHtHfeKckyR7Tn0gJChnZXRfYXBwX25hbWUgIiRwa2ciKSAke0R9KCRwa2cpJHtOfSIKICAgIGRvbmUgPDwgRU9GCiQoZ2V0X3RhcmdldF9hcHBzKQpFT0YKICAgIFsgJGNudCAtZXEgMCBdICYmIGVjaG8gLWUgIiAgICAke0R9KOaXoOWMuemFjeW6lOeUqCkke059IgogICAgZWNobyAiIgogICAgZWNobyAiICDlhbEgJHtHfSRjbnQke059IOS4quW6lOeUqOS8muiiq+a4heeQhiIKICAgIGVjaG8gIiIKfQoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBIZWxwCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCnNob3dfaGVscCgpIHsKICAgIGNsZWFyCiAgICBib3hfZGJsCiAgICBib3hfaGRyICJLZXJuZWwgQ29yZSB2JHtWRVJTSU9OfSAtIOW4ruWKqSIKICAgIGJveF9lbmQKICAgIGVjaG8gIiIKICAgIGVjaG8gIiAg5ZG95Luk6KGM55So5rOVOiIKICAgIGVjaG8gLWUgIiAgICAke0d9c2gga2VybmVsLWNvcmUuc2gke059ICAgICAgICAgICAgICDkuqTkupLoj5zljZUiCiAgICBlY2hvIC1lICIgICAgJHtHfXNoIGtlcm5lbC1jb3JlLnNoIHF1aWNrJHtOfSAgICAgICAg5LiA6ZSu6YeN572uIgogICAgZWNobyAtZSAiICAgICR7R31zaCBrZXJuZWwtY29yZS5zaCBzdGF0dXMke059ICAgICAgIOafpeeci+eKtuaAgSIKICAgIGVjaG8gLWUgIiAgICAke0d9c2gga2VybmVsLWNvcmUuc2ggcmVzdG9yZSR7Tn0gICAgICDov5jljp/lpIfku70iCiAgICBlY2hvIC1lICIgICAgJHtHfXNoIGtlcm5lbC1jb3JlLnNoIGRyeXJ1biR7Tn0gICAgICAg6aKE6KeIICjkuI3kv67mlLkpIgogICAgZWNobyAtZSAiICAgICR7R31zaCBrZXJuZWwtY29yZS5zaCBleHBvcnQke059ICAgICAgIOWvvOWHuumFjee9riIKICAgIGVjaG8gLWUgIiAgICAke0d9c2gga2VybmVsLWNvcmUuc2ggaW1wb3J0JHtOfSAgICAgICDlr7zlhaXphY3nva4iCiAgICBlY2hvIC1lICIgICAgJHtHfXNoIGtlcm5lbC1jb3JlLnNoIGhpc3Rvcnkke059ICAgICAg5pON5L2c6K6w5b2VIgogICAgZWNobyAtZSAiICAgICR7R31zaCBrZXJuZWwtY29yZS5zaCBibCR7Tn0gICAgICAgICAgIOS8quijhUJM6ZSB5a6aIgogICAgZWNobyAtZSAiICAgICR7R31zaCBrZXJuZWwtY29yZS5zaCBibGNoZWNrJHtOfSAgICAgIOajgOafpUJM54q25oCBIgogICAgZWNobyAtZSAiICAgICR7R31zaCBrZXJuZWwtY29yZS5zaCBoZWxwJHtOfSAgICAgICAgIOacrOW4ruWKqSIKICAgIGVjaG8gIiIKICAgIGVjaG8gIiIKICAgIGVjaG8gIiAg5Yqf6IO96K+05piOOiIKICAgIGVjaG8gIiAgICDph43nva46IFNOL0FuZHJvaWQgSUQvSU1FSS9NQUMg5YWo6YOo6ZqP5py655Sf5oiQIgogICAgZWNobyAiICAgIOWkh+S7vTog6aaW5qyh6L+Q6KGM6Ieq5Yqo5aSH5Lu95Y6f5aeL5qCH6K+GIgogICAgZWNobyAiICAgIOi/mOWOnzog5oGi5aSN5Yiw5aSH5Lu95pe255qE5Y6f5aeL5qCH6K+GIgogICAgZWNobyAiICAgIOa4heeQhjog5riF6Zmk5bqU55So5YaF57yT5a2Y55qE6K6+5aSH5L+h5oGvIgogICAgZWNobyAiICAgIOaJq+aPjzogN+e7tOW6puajgOa1iyBGcmlkYS9YcG9zZWQv5L+u5pS55Zmo562JIgogICAgZWNobyAiIgogICAgZWNobyAiICDmlofku7bkvY3nva46IgogICAgZWNobyAtZSAiICAgIOmFjee9rjogJHtEfSRDT05GSUcke059IgogICAgZWNobyAtZSAiICAgIOWkh+S7vTogJHtEfSRCQUNLVVAke059IgogICAgZWNobyAtZSAiICAgIOaXpeW/lzogJHtEfSRMT0dGSUxFJHtOfSIKICAgIGVjaG8gIiIKICAgIGVjaG8gIiAg5rOo5oSP5LqL6aG5OiIKICAgIGVjaG8gIiAgICAtIOmcgOimgSBSb290IOadg+mZkCAoTWFnaXNrL0tlcm5lbFNVKSIKICAgIGVjaG8gIiAgICAtIOmcgOimgSByZXNldHByb3Ag5ZG95LukIgogICAgZWNobyAiICAgIC0g6YeN572u5ZCO5bu66K6u6YeN5ZCv55Sf5pWIIgogICAgZWNobyAiICAgIC0gSU1FSSDpgJrov4cgcmVzZXRwcm9wIOS/ruaUuSwiCiAgICBlY2hvICIgICAgICBUZWxlcGhvbnlNYW5hZ2VyIEFQSSDlj6/og73ku43or7vnnJ/lrp7lgLwiCiAgICBlY2hvICIiCn0KCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgVG9vbGJveCBNZW51CiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCnRvb2xib3hfbWVudSgpIHsKICAgIHdoaWxlIHRydWU7IGRvCiAgICAgICAgY2xlYXIKICAgICAgICBib3hfZGJsCiAgICAgICAgYm94X2hkciAi5bel5YW3566xIgogICAgICAgIGJveF9lbmQKICAgICAgICBlY2hvICIiCiAgICAgICAgZWNobyAtZSAiICAke0d9MSR7Tn0g4pa4IOa4heeQhuiuvue9riAo5b2T5YmNOiAkKHNob3dfbW9kZSkpIgogICAgICAgIGVjaG8gLWUgIiAgJHtHfTIke059IOKWuCDpooTop4ggKOS4jeS/ruaUuSkiCiAgICAgICAgZWNobyAtZSAiICAke0d9MyR7Tn0g4pa4IOWvvOWHui/lr7zlhaXphY3nva4iCiAgICAgICAgZWNobyAtZSAiICAke0d9NCR7Tn0g4pa4IOW8gOacuuiHquWKqOmHjee9riIKICAgICAgICBlY2hvIC1lICIgICR7R301JHtOfSDilrgg5pON5L2c6K6w5b2VIgogICAgICAgIGVjaG8gLWUgIiAgJHtHfTYke059IOKWuCDmn6XnnIvlvZPliY3moIfor4YiCiAgICAgICAgZWNobyAtZSAiICAke0d9NyR7Tn0g4pa4IOafpeeci+Wkh+S7vSIKICAgICAgICBlY2hvIC1lICIgICR7WX04JHtOfSDilrgg5Yig6Zmk5aSH5Lu9IgogICAgICAgIGVjaG8gLWUgIiAgJHtSfTkke059IOKWuCBCTC9Cb290IOeKtuaAgeajgOafpSIKICAgICAgICBlY2hvIC1lICIgICR7Q31CJHtOfSDilrgg5Lyq6KOFQkzplIHlrprnirbmgIEiCiAgICAgICAgZWNobyAtZSAiICAke0J9OSR7Tn0g4pa4IOW4ruWKqSIKICAgICAgICBlY2hvIC1lICIgICR7RH0wJHtOfSDilrgg6L+U5ZueIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvIC1uICIgIOivt+mAieaLqTogIjsgcmVhZCAtciB0YwogICAgICAgIGNhc2UgIiR0YyIgaW4KICAgICAgICAgICAgMSkgc2V0dGluZ3NfbWVudSA7OwogICAgICAgICAgICAyKSBkb19kcnlydW47IGVjaG8gIiAg5oyJ5Zue6L2m6L+U5ZueIjsgcmVhZCAtciA7OwogICAgICAgICAgICAzKQogICAgICAgICAgICAgICAgZWNobyAiIgogICAgICAgICAgICAgICAgZWNobyAtZSAiICAke0d9MSR7Tn0g4pa4IOWvvOWHuuWIsCAvc2RjYXJkIgogICAgICAgICAgICAgICAgZWNobyAtZSAiICAke0d9MiR7Tn0g4pa4IOS7jiAvc2RjYXJkIOWvvOWFpSIKICAgICAgICAgICAgICAgIGVjaG8gLW4gIiAg6YCJ5oupOiAiOyByZWFkIC1yIGVjCiAgICAgICAgICAgICAgICBbICIkZWMiID0gIjEiIF0gJiYgZXhwb3J0X2NvbmZpZyB8fCBpbXBvcnRfY29uZmlnCiAgICAgICAgICAgICAgICBlY2hvICIgIOaMieWbnui9pui/lOWbniI7IHJlYWQgLXIKICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgIDQpIHNldHVwX2F1dG9zdGFydCA7OwogICAgICAgICAgICA1KSBzaG93X2hpc3Rvcnk7IGVjaG8gIiAg5oyJ5Zue6L2m6L+U5ZueIjsgcmVhZCAtciA7OwogICAgICAgICAgICA2KSBzaG93X2N1cnJlbnQ7IGVjaG8gIiAg5oyJ5Zue6L2m6L+U5ZueIjsgcmVhZCAtciA7OwogICAgICAgICAgICA3KSBzaG93X2JhY2t1cDsgZWNobyAiICDmjInlm57ovabov5Tlm54iOyByZWFkIC1yIDs7CiAgICAgICAgICAgIDgpCiAgICAgICAgICAgICAgICBlY2hvICIiCiAgICAgICAgICAgICAgICBlY2hvIC1lICIgICR7WX3noa7orqTliKDpmaTlpIfku73vvJ8ke059IgogICAgICAgICAgICAgICAgZWNobyAtbiAiICDovpPlhaUgeSDnoa7orqQ6ICI7IHJlYWQgLXIgeW4KICAgICAgICAgICAgICAgIFsgIiR5biIgPSAieSIgXSB8fCBbICIkeW4iID0gIlkiIF0gJiYgeyBybSAtZiAvZGF0YS9hZGIvLmtjX2JhY2t1cC5kYXQgL2RhdGEvYWRiLy52ZHJfKi5kYXQgMj4vZGV2L251bGw7IG9rICLlpIfku73lt7LliKDpmaQiOyBsb2dfYWN0aW9uICJERUxFVEVfQkFDS1VQIjsgfSB8fCBpbmZvICLlt7Llj5bmtogiCiAgICAgICAgICAgICAgICBlY2hvICIgIOaMieWbnui9pui/lOWbniI7IHJlYWQgLXIKICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgIDkpIGNoZWNrX2JsX3N0YXR1czsgZWNobyAiICDmjInlm57ovabov5Tlm54iOyByZWFkIC1yIDs7CiAgICAgICAgICAgIGJ8QikKICAgICAgICAgICAgICAgIGVjaG8gIiIKICAgICAgICAgICAgICAgIGVjaG8gLWUgIiAgJHtZfeehruiupOS8quijhUJM6ZSB5a6a54q25oCB77yfJHtOfSIKICAgICAgICAgICAgICAgIGVjaG8gLWUgIiAgJHtEfeS/ruaUuSB2ZXJpZmllZGJvb3QvZmxhc2gubG9ja2VkL2RlYnVnZ2FibGUg562JJHtOfSIKICAgICAgICAgICAgICAgIGVjaG8gLW4gIiAg6L6T5YWlIHkg56Gu6K6kOiAiOyByZWFkIC1yIHluCiAgICAgICAgICAgICAgICBbICIkeW4iID0gInkiIF0gfHwgWyAiJHluIiA9ICJZIiBdICYmIHsgZWNobyAiIjsgc3Bvb2ZfYmxfc3RhdHVzIDA7IH0gfHwgeyBlY2hvICIiOyBpbmZvICLlt7Llj5bmtogiOyB9CiAgICAgICAgICAgICAgICBlY2hvICIgIOaMieWbnui9pui/lOWbniI7IHJlYWQgLXIKICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgIGh8SCkgc2hvd19oZWxwOyBlY2hvICIgIOaMieWbnui9pui/lOWbniI7IHJlYWQgLXIgOzsKICAgICAgICAgICAgMCkgcmV0dXJuIDs7CiAgICAgICAgZXNhYwogICAgZG9uZQp9CgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIENvbW1hbmQgbGluZSBzaG9ydGN1dHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmNhc2UgIiQxIiBpbgogICAgcXVpY2spICAgZWNobyAiIjsgZWNobyAtZSAiICAke0N9S2VybmVsIENvcmUke059IHYke1ZFUlNJT059IC0g5b+r6YCf6YeN572uIjsgZWNobyAiIjsgZG9fcmVzZXQgMTsgZWNobyAiIjsgZXhpdCAwIDs7CiAgICBzdGF0dXMpICBzaG93X2N1cnJlbnQ7IGV4aXQgMCA7OwogICAgcmVzdG9yZSkgZWNobyAiIjsgZG9fcmVzdG9yZTsgZWNobyAiIjsgZXhpdCAwIDs7CiAgICBkcnlydW4pICBkb19kcnlydW47IGV4aXQgMCA7OwogICAgZXhwb3J0KSAgZXhwb3J0X2NvbmZpZzsgZXhpdCAwIDs7CiAgICBpbXBvcnQpICBpbXBvcnRfY29uZmlnOyBleGl0IDAgOzsKICAgIGhpc3RvcnkpIHNob3dfaGlzdG9yeTsgZXhpdCAwIDs7CiAgICBibCkgc3Bvb2ZfYmxfc3RhdHVzIDA7IGV4aXQgMCA7OwogICAgYmxjaGVjaykgY2hlY2tfYmxfc3RhdHVzOyBleGl0IDAgOzsKICAgIGhlbHB8LWh8LS1oZWxwKSBzaG93X2hlbHA7IGV4aXQgMCA7Owplc2FjCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIE1haW4gTWVudSAobG9vcCkKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKbG9hZF9jb25maWcKCndoaWxlIHRydWU7IGRvCmNsZWFyCgojIERhc2hib2FyZApDVVJfU049JChnZXRwcm9wIHJvLnNlcmlhbG5vIDI+L2Rldi9udWxsKQpDVVJfQUlEPSQoc2V0dGluZ3MgZ2V0IHNlY3VyZSBhbmRyb2lkX2lkIDI+L2Rldi9udWxsKQpDVVJfSU1FST0kKGdldHByb3AgZ3NtLmltZWkgMj4vZGV2L251bGwpCkNVUl9XSUZJPSQoaXAgbGluayBzaG93ICQoZ2V0X3dpZmlfaWZhY2UpIDI+L2Rldi9udWxsIHwgYXdrICcvbGluay8ge3ByaW50ICQyfScpCkJBQ0tVUF9PSz0i5ZCmIjsgWyAtZiAiJEJBQ0tVUCIgXSAmJiBCQUNLVVBfT0s9IuaYryIKTU9ERV9OQU1FPSQoc2hvd19tb2RlKQoKZWNobyAiIgpib3hfZGJsCmJveF9oZHIgIktlcm5lbCBDb3JlIHYke1ZFUlNJT059IC0g6K6+5aSH5qCH6K+G566h55CGIgpib3hfZW5kCmVjaG8gIiIKYm94X3RvcApib3hfcm93ICLlvZPliY3nirbmgIEiCmJveF9taWQKYm94X3JvdzIgIlNOOiIgIiR7Q1VSX1NOOi3mnKrnn6V9Igpib3hfcm93MiAiQW5kcm9pZDoiICIke0NVUl9BSUQ6LeacquefpX0iCmJveF9yb3cyICJJTUVJOiIgIiR7Q1VSX0lNRUk6LeacquefpX0iCmJveF9yb3cyICJXaUZpOiIgIiR7Q1VSX1dJRkk6LeacquefpX0iCmJveF9yb3cyICLlpIfku706IiAiJEJBQ0tVUF9PSyIKYm94X3JvdzIgIuaooeW8jzoiICIkTU9ERV9OQU1FIgpib3hfYm90CmVjaG8gIiIKZWNobyAtZSAiICAke0d9MSR7Tn0g4pa4IOmHjee9ruiuvuWkh+agh+ivhiIKZWNobyAtZSAiICAke0d9MiR7Tn0g4pa4IOi/mOWOn+iuvuWkh+agh+ivhiIKZWNobyAtZSAiICAke0d9MyR7Tn0g4pa4IOS8quijhUJM6ZSB5a6aIgplY2hvIC1lICIgICR7Un00JHtOfSDilrgg5omr5o+P6Z2e5rOV5qih5Z2XIgplY2hvIC1lICIgICR7R301JHtOfSDilrgg5bel5YW3566xIgplY2hvIC1lICIgICR7RH0wJHtOfSDilrgg6YCA5Ye6IgplY2hvICIiCmVjaG8gLW4gIiAg6K+36YCJ5oupOiAiOyByZWFkIC1yIGNob2ljZQpjYXNlICIkY2hvaWNlIiBpbgogICAgMSkKICAgICAgICBlY2hvICIiCiAgICAgICAgZWNobyAtZSAiICAke1l956Gu6K6k6YeN572u6K6+5aSH5qCH6K+G77yfJHtOfSIKICAgICAgICBlY2hvIC1lICIgICR7RH3kv67mlLkgU04vQW5kcm9pZCBJRC9JTUVJL01BQyArIOa4uOaIj+iuvuWkh+e8k+WtmCR7Tn0iCiAgICAgICAgZWNobyAtbiAiICDovpPlhaUgeSDnoa7orqQ6ICI7IHJlYWQgLXIgeW4KICAgICAgICBbICIkeW4iID0gInkiIF0gfHwgWyAiJHluIiA9ICJZIiBdICYmIHsgZWNobyAiIjsgZG9fcmVzZXQgMDsgfSB8fCB7IGVjaG8gIiI7IGluZm8gIuW3suWPlua2iCI7IH0KICAgICAgICBlY2hvICIgIOaMieWbnui9pui/lOWbniI7IHJlYWQgLXIKICAgICAgICA7OwogICAgMikgZWNobyAiIjsgZG9fcmVzdG9yZTsgZWNobyAiICDmjInlm57ovabov5Tlm54iOyByZWFkIC1yIDs7CiAgICAzKQogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvIC1lICIgICR7WX3noa7orqTkvKroo4VCTOmUgeWumueKtuaAge+8nyR7Tn0iCiAgICAgICAgZWNobyAtZSAiICAke0R95L+u5pS5IHZlcmlmaWVkYm9vdC9mbGFzaC5sb2NrZWQvZGVidWdnYWJsZSDnrYkke059IgogICAgICAgIGVjaG8gLW4gIiAg6L6T5YWlIHkg56Gu6K6kOiAiOyByZWFkIC1yIHluCiAgICAgICAgWyAiJHluIiA9ICJ5IiBdIHx8IFsgIiR5biIgPSAiWSIgXSAmJiB7IGVjaG8gIiI7IHNwb29mX2JsX3N0YXR1cyAwOyB9IHx8IHsgZWNobyAiIjsgaW5mbyAi5bey5Y+W5raIIjsgfQogICAgICAgIGVjaG8gIiAg5oyJ5Zue6L2m6L+U5ZueIjsgcmVhZCAtcgogICAgICAgIDs7CiAgICA0KSBjbGVhbl9jaGVhdF9tb2R1bGVzIDs7CiAgICA1KSB0b29sYm94X21lbnUgOzsKICAgIDB8cXxRKSBlY2hvICIiOyBvayAi5bey6YCA5Ye6IjsgZXhpdCAwIDs7CiAgICAqKSBlcnIgIuaXoOaViOmAiemhuSI7IHNsZWVwIDEgOzsKZXNhYwpkb25lCg==' | base64 -d > "$TMPFILE" 2>/dev/null
chmod 700 "$TMPFILE"
sh "$TMPFILE" "$@"
RET=$?
rm -f "$TMPFILE"
exit $RET
