# apply_manual_pricing_v3.py
from __future__ import annotations

import base64
import hashlib
import shutil
import sys
from datetime import datetime
from pathlib import Path

ROOT = Path(__file__).resolve().parent

FILES = {'main.py': 'IyBtYWluLnB5Cgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYXN5bmNpbwppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3lzCmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCmZyb20gYWlvZ3JhbSBpbXBvcnQgQm90LCBEaXNwYXRjaGVyCmZyb20gYWlvZ3JhbS5jbGllbnQuZGVmYXVsdCBpbXBvcnQgRGVmYXVsdEJvdFByb3BlcnRpZXMKZnJvbSBhaW9ncmFtLmVudW1zIGltcG9ydCBQYXJzZU1vZGUKCmZyb20gY29yZS5jb25maWcgaW1wb3J0IHNldHRpbmdzCmZyb20gY29yZS5kYXRhYmFzZSBpbXBvcnQgRGF0YWJhc2VNYW5hZ2VyCgpmcm9tIG1pZGRsZXdhcmVzLmF1dGhfY2hlY2sgaW1wb3J0IEF1dGhDaGVja01pZGRsZXdhcmUKZnJvbSBtaWRkbGV3YXJlcy50aHJvdHRsaW5nIGltcG9ydCBUaHJvdHRsaW5nTWlkZGxld2FyZQoKZnJvbSBzZXJ2aWNlcy5vcmRlcl9zZXJ2aWNlIGltcG9ydCBPcmRlclNlcnZpY2UKZnJvbSBzZXJ2aWNlcy5wcm9kdWN0X3ByaWNpbmdfc2VydmljZSBpbXBvcnQgUHJvZHVjdFByaWNpbmdTZXJ2aWNlCmZyb20gc2VydmljZXMudGFiZGVhbF9yYXRlX3NlcnZpY2UgaW1wb3J0IFRhYmRlYWxSYXRlU2VydmljZQpmcm9tIHNlcnZpY2VzLnRvbl93YXRjaGVyIGltcG9ydCBUb25XYXRjaGVyU2VydmljZQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTG9nZ2luZwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbG9nZ2luZy5iYXNpY0NvbmZpZygKICAgIGxldmVsPSgKICAgICAgICBsb2dnaW5nLkRFQlVHCiAgICAgICAgaWYgYm9vbCgKICAgICAgICAgICAgZ2V0YXR0cigKICAgICAgICAgICAgICAgIHNldHRpbmdzLAogICAgICAgICAgICAgICAgIkRFQlVHX01PREUiLAogICAgICAgICAgICAgICAgRmFsc2UsCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgZWxzZSBsb2dnaW5nLklORk8KICAgICksCiAgICBmb3JtYXQ9KAogICAgICAgICIlKGFzY3RpbWUpcyAtICUobGV2ZWxuYW1lKXMgLSAiCiAgICAgICAgIlslKGZpbGVuYW1lKXM6JShsaW5lbm8pZF0gLSAlKG1lc3NhZ2UpcyIKICAgICksCiAgICBoYW5kbGVycz1bCiAgICAgICAgbG9nZ2luZy5TdHJlYW1IYW5kbGVyKAogICAgICAgICAgICBzeXMuc3Rkb3V0CiAgICAgICAgKSwKICAgICAgICBsb2dnaW5nLkZpbGVIYW5kbGVyKAogICAgICAgICAgICAibWF0cml4X2JvdC5sb2ciLAogICAgICAgICAgICBlbmNvZGluZz0idXRmLTgiLAogICAgICAgICksCiAgICBdLAopCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigKICAgIF9fbmFtZV9fCikKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJvdXRlcnMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmZyb20gaGFuZGxlcnMudXNlci5zdGFydCBpbXBvcnQgKAogICAgcm91dGVyIGFzIHVzZXJfc3RhcnRfcm91dGVyLAopCmZyb20gaGFuZGxlcnMudXNlci53YWxsZXQgaW1wb3J0ICgKICAgIHJvdXRlciBhcyB1c2VyX3dhbGxldF9yb3V0ZXIsCikKZnJvbSBoYW5kbGVycy51c2VyLmt5YyBpbXBvcnQgKAogICAgcm91dGVyIGFzIHVzZXJfa3ljX3JvdXRlciwKKQpmcm9tIGhhbmRsZXJzLnVzZXIuc2hvcCBpbXBvcnQgKAogICAgcm91dGVyIGFzIHVzZXJfc2hvcF9yb3V0ZXIsCikKZnJvbSBoYW5kbGVycy51c2VyLnJlZmVycmFsIGltcG9ydCAoCiAgICByb3V0ZXIgYXMgdXNlcl9yZWZlcnJhbF9yb3V0ZXIsCikKCiMgQWRtaW4gcGFuZWwgKyB1bmlmaWVkIGFkbWluIGFjdGlvbnMuCiMKIyBBbGwgdmlzaWJsZSBhZG1pbiBidXR0b25zIGFyZSBoYW5kbGVkIGJ5IHRoZXNlIHR3byByb3V0ZXJzLgojIFdlIGludGVudGlvbmFsbHkgZG8gTk9UIHJlZ2lzdGVyIHRoZSBvbGQgc2NhdHRlcmVkIGZpbmFuY2UvS1lDIHJvdXRlcnMKIyBoZXJlLCBiZWNhdXNlIHRoZXkgY29udGFpbmVkIG92ZXJsYXBwaW5nIGNhbGxiYWNrcyBhbmQgYnJvYWQgbWVzc2FnZQojIGhhbmRsZXJzIHRoYXQgY291bGQgc3dhbGxvdyBsYXRlciBhZG1pbiBGU00gbWVzc2FnZXMuCmZyb20gaGFuZGxlcnMuYWRtaW4ucGFuZWwgaW1wb3J0ICgKICAgIHJvdXRlciBhcyBhZG1pbl9wYW5lbF9yb3V0ZXIsCikKZnJvbSBoYW5kbGVycy5hZG1pbi5hY3Rpb25zIGltcG9ydCAoCiAgICByb3V0ZXIgYXMgYWRtaW5fYWN0aW9uc19yb3V0ZXIsCikKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEhlbHBlcnMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfc2V0dGluZygKICAgIG5hbWU6IHN0ciwKICAgIGRlZmF1bHQ6IEFueSA9IE5vbmUsCik6CiAgICAiIiIKICAgINiu2YjYp9mG2K/ZhiDYp9mF2YYg2KrZhti424zZhdin2KogUHlkYW50aWMgU2V0dGluZ3MuCiAgICAiIiIKICAgIHZhbHVlID0gZ2V0YXR0cigKICAgICAgICBzZXR0aW5ncywKICAgICAgICBuYW1lLAogICAgICAgIGRlZmF1bHQsCiAgICApCgogICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICByZXR1cm4gZGVmYXVsdAoKICAgIGlmIGlzaW5zdGFuY2UoCiAgICAgICAgdmFsdWUsCiAgICAgICAgc3RyLAogICAgKToKICAgICAgICB2YWx1ZSA9IHZhbHVlLnN0cmlwKCkKCiAgICByZXR1cm4gdmFsdWUKCgpkZWYgZ2V0X2RhdGFiYXNlX3BhdGgoKSAtPiBzdHI6CiAgICAiIiIKICAgINiq2YbYuNuM2YXYp9iqINmB2LnZhNuMINm+2LHZiNqY2Ycg2KfYsiBEQl9QQVRIINin2LPYqtmB2KfYr9mHINmF24zigIzaqdmG2K8uCgogICAgREFUQUJBU0VfUEFUSCDZgdmC2Lcg2KjYsdin24wg2LPYp9iy2q/Yp9ix24wg2KjYpyDZhtiz2K7Zh+KAjNmH2KfbjCDZgtiv24zZhduMCiAgICDYqNmHINi52YbZiNin2YYgZmFsbGJhY2sg2Ybar9mHINiv2KfYtNiq2Ycg2LTYr9mHINin2LPYqi4KICAgICIiIgogICAgdmFsdWUgPSAoCiAgICAgICAgZ2V0X3NldHRpbmcoCiAgICAgICAgICAgICJEQl9QQVRIIiwKICAgICAgICAgICAgTm9uZSwKICAgICAgICApCiAgICAgICAgb3IgZ2V0X3NldHRpbmcoCiAgICAgICAgICAgICJEQVRBQkFTRV9QQVRIIiwKICAgICAgICAgICAgTm9uZSwKICAgICAgICApCiAgICAgICAgb3IgIm1hdHJpeF9ib3QuZGIiCiAgICApCgogICAgcmV0dXJuIHN0cih2YWx1ZSkKCgphc3luYyBkZWYgY2xvc2Vfc2VydmljZSgKICAgIHNlcnZpY2U6IEFueSwKICAgIHNlcnZpY2VfbmFtZTogc3RyLAopIC0+IE5vbmU6CiAgICAiIiIKICAgINio2LPYqtmGINin2YXZhiDYs9ix2YjbjNiz4oCM2YfYp9uMIHN5bmMvYXN5bmMuCiAgICAiIiIKICAgIGlmIHNlcnZpY2UgaXMgTm9uZToKICAgICAgICByZXR1cm4KCiAgICBjbG9zZV9tZXRob2QgPSBnZXRhdHRyKAogICAgICAgIHNlcnZpY2UsCiAgICAgICAgImNsb3NlIiwKICAgICAgICBOb25lLAogICAgKQoKICAgIGlmIG5vdCBjYWxsYWJsZSgKICAgICAgICBjbG9zZV9tZXRob2QKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIHJlc3VsdCA9IGNsb3NlX21ldGhvZCgpCgogICAgICAgIGlmIGFzeW5jaW8uaXNjb3JvdXRpbmUoCiAgICAgICAgICAgIHJlc3VsdAogICAgICAgICk6CiAgICAgICAgICAgIGF3YWl0IHJlc3VsdAoKICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgIiVzIGNsb3NlZCBzdWNjZXNzZnVsbHkuIiwKICAgICAgICAgICAgc2VydmljZV9uYW1lLAogICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgJXMuIiwKICAgICAgICAgICAgc2VydmljZV9uYW1lLAogICAgICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFN0YXJ0dXAKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmFzeW5jIGRlZiBvbl9zdGFydHVwKAogICAgYm90OiBCb3QsCiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLAopIC0+IE5vbmU6CiAgICAiIiIKICAgINii2YXYp9iv2YfigIzYs9in2LLbjCDYs9ix2YjbjNiz4oCM2YfYpyDZgtio2YQg2KfYsiDYtNix2YjYuSDaqdin2LEg2LHYqNin2KouCgogICAg2KrYsdiq24zYqDoKICAgIDEpIEJvdCBpZGVudGl0eQogICAgMikgTWFpbiBkYXRhYmFzZQogICAgMykgT3JkZXIgc2NoZW1hCiAgICA0KSBQcm9kdWN0IHByaWNpbmcgc3RhdHVzCiAgICA1KSBUT04gd2F0Y2hlcgogICAgIiIiCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBCb3QKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBib3RfaW5mbyA9IGF3YWl0IGJvdC5nZXRfbWUoKQoKICAgIGxvZ2dlci5pbmZvKAogICAgICAgICJCb3QgYXV0aG9yaXplZCBzdWNjZXNzZnVsbHk6IEAlcyB8IElEOiAlcyIsCiAgICAgICAgYm90X2luZm8udXNlcm5hbWUsCiAgICAgICAgYm90X2luZm8uaWQsCiAgICApCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBNYWluIERhdGFiYXNlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZGI6IERhdGFiYXNlTWFuYWdlciA9IGRpc3BhdGNoZXJbCiAgICAgICAgImRiIgogICAgXQoKICAgIGF3YWl0IGRiLmluaXQoKQoKICAgIGxvZ2dlci5pbmZvKAogICAgICAgICJEYXRhYmFzZSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkgfCBwYXRoPSVzIiwKICAgICAgICBnZXRfZGF0YWJhc2VfcGF0aCgpLAogICAgKQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgT3JkZXIgU2VydmljZSAvIG1pZ3JhdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIG9yZGVyX3NlcnZpY2U6IE9yZGVyU2VydmljZSA9IGRpc3BhdGNoZXJbCiAgICAgICAgIm9yZGVyX3NlcnZpY2UiCiAgICBdCgogICAgYXdhaXQgb3JkZXJfc2VydmljZS5lbnN1cmVfc2NoZW1hKCkKCiAgICBsb2dnZXIuaW5mbygKICAgICAgICAiT3JkZXIgc2VydmljZSBzY2hlbWEgdmVyaWZpZWQgc3VjY2Vzc2Z1bGx5LiIKICAgICkKCiAgICBwcm9kdWN0X3ByaWNpbmc6IFByb2R1Y3RQcmljaW5nU2VydmljZSA9IGRpc3BhdGNoZXJbCiAgICAgICAgInByb2R1Y3RfcHJpY2luZyIKICAgIF0KCiAgICBhd2FpdCBwcm9kdWN0X3ByaWNpbmcuZW5zdXJlX3NjaGVtYSgpCgogICAgbG9nZ2VyLmluZm8oCiAgICAgICAgIlByb2R1Y3QgcHJpY2luZyBzY2hlbWEgdmVyaWZpZWQgc3VjY2Vzc2Z1bGx5LiIKICAgICkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEZ1bGZpbGxtZW50IG1vZGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBsb2dnZXIuaW5mbygKICAgICAgICAiUHJvZHVjdCBwcmljaW5nIG1vZGU6IGFkbWluIFVTRFQgYmFzZSBwcmljZXMgKyAiCiAgICAgICAgImxpdmUgSXJhbmlhbiBVU0RUL1RvbWFuIGZhbGxiYWNrLiIKICAgICkKCiAgICBsb2dnZXIuaW5mbygKICAgICAgICAiRGVsaXZlcnkgbW9kZTogb3duZXIgbWFudWFsIGZ1bGZpbGxtZW50LiIKICAgICkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFRPTiBXYXRjaGVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgdG9uX3dhdGNoZXIgPSBkaXNwYXRjaGVyLmdldCgKICAgICAgICAidG9uX3dhdGNoZXIiCiAgICApCgogICAgaWYgdG9uX3dhdGNoZXI6CiAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICJUT04gV2F0Y2hlciBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuIgogICAgICAgICkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEFkbWluIC8gT3duZXIgYXBwcm92YWwgY29uZmlndXJhdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGdldF9hZG1pbl9saXN0ID0gZ2V0YXR0cigKICAgICAgICBzZXR0aW5ncywKICAgICAgICAiZ2V0X2FkbWluX2xpc3QiLAogICAgICAgIE5vbmUsCiAgICApCgogICAgYWRtaW5faWRzOiBsaXN0W2ludF0gPSBbXQoKICAgIGlmIGNhbGxhYmxlKAogICAgICAgIGdldF9hZG1pbl9saXN0CiAgICApOgogICAgICAgIHRyeToKICAgICAgICAgICAgYWRtaW5faWRzID0gbGlzdCgKICAgICAgICAgICAgICAgIGdldF9hZG1pbl9saXN0KCkKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhcnNlIEFETUlOX0lEUy4iCiAgICAgICAgICAgICkKCiAgICBpZiBub3QgYWRtaW5faWRzOgogICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAiQURNSU5fSURTIGlzIGVtcHR5LiAiCiAgICAgICAgICAgICJPd25lci1hcHByb3ZhbCBwdXJjaGFzZSByZXF1ZXN0cyBjYW5ub3QgYmUgYXBwcm92ZWQuIgogICAgICAgICkKICAgIGVsc2U6CiAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICJPd25lciBhcHByb3ZhbCBlbmFibGVkIHwgYWRtaW5zPSVzIiwKICAgICAgICAgICAgbGVuKGFkbWluX2lkcyksCiAgICAgICAgKQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgUmVhZHkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBsb2dnZXIuaW5mbygKICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgKQogICAgbG9nZ2VyLmluZm8oCiAgICAgICAgIk1hdHJpeCBUZWxlZ3JhbSBCb3QgaXMgcmVhZHkuIgogICAgKQogICAgbG9nZ2VyLmluZm8oCiAgICAgICAgIlB1cmNoYXNlIGZsb3c6IFVzZXIgLT4gT3duZXIgQXBwcm92YWwgLT4gTWFudWFsIEZ1bGZpbGxtZW50IgogICAgKQogICAgbG9nZ2VyLmluZm8oCiAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNodXRkb3duCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgphc3luYyBkZWYgb25fc2h1dGRvd24oCiAgICBib3Q6IEJvdCwKICAgIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsCikgLT4gTm9uZToKICAgICIiIgogICAg2KjYs9iq2YYg2KfZhdmGINmF2YbYp9io2LkuCiAgICAiIiIKCiAgICBsb2dnZXIuaW5mbygKICAgICAgICAiU3RhcnRpbmcgZ3JhY2VmdWwgc2h1dGRvd24uLi4iCiAgICApCgogICAgYXdhaXQgY2xvc2Vfc2VydmljZSgKICAgICAgICBkaXNwYXRjaGVyLmdldCgKICAgICAgICAgICAgInRhYmRlYWxfcmF0ZXMiCiAgICAgICAgKSwKICAgICAgICAiVGFiZGVhbCByYXRlIHNlcnZpY2UiLAogICAgKQoKICAgIGF3YWl0IGNsb3NlX3NlcnZpY2UoCiAgICAgICAgZGlzcGF0Y2hlci5nZXQoCiAgICAgICAgICAgICJ0b25fd2F0Y2hlciIKICAgICAgICApLAogICAgICAgICJUT04gd2F0Y2hlciIsCiAgICApCgogICAgYXdhaXQgY2xvc2Vfc2VydmljZSgKICAgICAgICBkaXNwYXRjaGVyLmdldCgKICAgICAgICAgICAgImRiIgogICAgICAgICksCiAgICAgICAgIkRhdGFiYXNlIG1hbmFnZXIiLAogICAgKQoKICAgICMgT3JkZXJTZXJ2aWNlINin2LIgc3FsaXRlIGNvbm5lY3Rpb24g2K/Yp9im2YXbjCDYp9iz2KrZgdin2K/ZhyDZhtmF24zigIzaqdmG2K8KICAgICMg2Ygg2YbbjNin2LIg2KjZhyBjbG9zZSDZhtiv2KfYsdivLgoKICAgIGxvZ2dlci5pbmZvKAogICAgICAgICJHcmFjZWZ1bCBzaHV0ZG93biBjb21wbGV0ZWQuIgogICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTWFpbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKYXN5bmMgZGVmIG1haW4oKSAtPiBOb25lOgogICAgbG9nZ2VyLmluZm8oCiAgICAgICAgIlN0YXJ0aW5nIE1hdHJpeCBUZWxlZ3JhbSBCb3QuLi4iCiAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBWYWxpZGF0ZSBCb3QgVG9rZW4KICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBib3RfdG9rZW4gPSBnZXRfc2V0dGluZygKICAgICAgICAiQk9UX1RPS0VOIiwKICAgICAgICAiIiwKICAgICkKCiAgICBpZiBub3QgYm90X3Rva2VuOgogICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgIkJPVF9UT0tFTiBpcyBtaXNzaW5nLiIKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgcGxhY2Vob2xkZXJfdG9rZW5zID0gewogICAgICAgICJZT1VSX0JPVF9UT0tFTl9IRVJFIiwKICAgICAgICAiUEFTVEVfWU9VUl9ORVdfQk9UX1RPS0VOX0hFUkUiLAogICAgfQoKICAgIGlmIGJvdF90b2tlbiBpbiBwbGFjZWhvbGRlcl90b2tlbnM6CiAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAiQk9UX1RPS0VOIHN0aWxsIGNvbnRhaW5zIGEgcGxhY2Vob2xkZXIgdmFsdWUuIgogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEJvdCAvIERpc3BhdGNoZXIKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBib3QgPSBCb3QoCiAgICAgICAgdG9rZW49Ym90X3Rva2VuLAogICAgICAgIGRlZmF1bHQ9RGVmYXVsdEJvdFByb3BlcnRpZXMoCiAgICAgICAgICAgIHBhcnNlX21vZGU9UGFyc2VNb2RlLkhUTUwsCiAgICAgICAgKSwKICAgICkKCiAgICBkcCA9IERpc3BhdGNoZXIoKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgRGF0YWJhc2UKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkYl9wYXRoID0gZ2V0X2RhdGFiYXNlX3BhdGgoKQoKICAgIGRiX21hbmFnZXIgPSBEYXRhYmFzZU1hbmFnZXIoCiAgICAgICAgZGJfcGF0aD1kYl9wYXRoCiAgICApCgogICAgZHBbImRiIl0gPSBkYl9tYW5hZ2VyCgogICAgbG9nZ2VyLmluZm8oCiAgICAgICAgIkRhdGFiYXNlIG1hbmFnZXIgcmVnaXN0ZXJlZCB8IHBhdGg9JXMiLAogICAgICAgIGRiX3BhdGgsCiAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBPcmRlciBTZXJ2aWNlCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgb3JkZXJfc2VydmljZSA9IE9yZGVyU2VydmljZSgKICAgICAgICBkYl9wYXRoPWRiX3BhdGgKICAgICkKCiAgICBkcFsib3JkZXJfc2VydmljZSJdID0gb3JkZXJfc2VydmljZQoKICAgIGxvZ2dlci5pbmZvKAogICAgICAgICJPcmRlciBzZXJ2aWNlIHJlZ2lzdGVyZWQuIgogICAgKQoKICAgIHByb2R1Y3RfcHJpY2luZyA9IFByb2R1Y3RQcmljaW5nU2VydmljZSgKICAgICAgICBkYl9wYXRoPWRiX3BhdGgKICAgICkKCiAgICBkcFsicHJvZHVjdF9wcmljaW5nIl0gPSBwcm9kdWN0X3ByaWNpbmcKCiAgICBsb2dnZXIuaW5mbygKICAgICAgICAiUHJvZHVjdCBwcmljaW5nIHNlcnZpY2UgcmVnaXN0ZXJlZC4iCiAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBUYWJkZWFsIExpdmUgUmF0ZXMKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAjIFB1YmxpYyBtYXJrZXQtZGF0YSBlbmRwb2ludHMgYXJlIHVzZWQgaGVyZS4KICAgICMgTm8gQVBJIGtleS9zZWNyZXQgaXMgc3RvcmVkIGluIHRoZSBib3QgZm9yIHJhdGUgcmVhZHMuCiAgICB0YWJkZWFsX3JhdGVzID0gVGFiZGVhbFJhdGVTZXJ2aWNlKAogICAgICAgIHRpbWVvdXQ9MTAuMCwKICAgICAgICBjYWNoZV90dGw9MTAuMCwKICAgICAgICByZXRyaWVzPTMsCiAgICApCgogICAgZHBbInRhYmRlYWxfcmF0ZXMiXSA9IHRhYmRlYWxfcmF0ZXMKCiAgICBsb2dnZXIuaW5mbygKICAgICAgICAiVGFiZGVhbCBsaXZlLXJhdGUgc2VydmljZSByZWdpc3RlcmVkLiIKICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFByb2R1Y3QgcHJpY2luZyAvIGZ1bGZpbGxtZW50CiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgbG9nZ2VyLmluZm8oCiAgICAgICAgIlByb2R1Y3QgcHJpY2luZyBtb2RlIGVuYWJsZWQgfCAiCiAgICAgICAgImFkbWluIFVTRFQgYmFzZSBwcmljZXMgKyBtYW51YWwgZnVsZmlsbG1lbnQuIgogICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgVE9OIFdhdGNoZXIKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICB0b25fYXBpX2Jhc2VfdXJsID0gZ2V0X3NldHRpbmcoCiAgICAgICAgIlRPTl9BUElfQkFTRV9VUkwiLAogICAgICAgICJodHRwczovL3RvbmNlbnRlci5jb20vYXBpL3YyIiwKICAgICkKCiAgICB0b25fYXBpX2tleSA9IGdldF9zZXR0aW5nKAogICAgICAgICJUT05fQVBJX0tFWSIsCiAgICAgICAgIiIsCiAgICApCgogICAgdHJ5OgogICAgICAgIHRvbl93YXRjaGVyID0gVG9uV2F0Y2hlclNlcnZpY2UoCiAgICAgICAgICAgIGFwaV9iYXNlX3VybD10b25fYXBpX2Jhc2VfdXJsLAogICAgICAgICAgICBhcGlfa2V5PXRvbl9hcGlfa2V5LAogICAgICAgICkKCiAgICAgICAgZHBbInRvbl93YXRjaGVyIl0gPSB0b25fd2F0Y2hlcgoKICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgIlRPTiBXYXRjaGVyIHNlcnZpY2UgcmVnaXN0ZXJlZC4iCiAgICAgICAgKQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgIkNvdWxkIG5vdCBpbml0aWFsaXplIFRPTiBXYXRjaGVyLiIKICAgICAgICApCgogICAgICAgIHRvbl93YXRjaGVyID0gTm9uZQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgTWlkZGxld2FyZXMKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICB0cnk6CiAgICAgICAgYXV0aF9taWRkbGV3YXJlID0gQXV0aENoZWNrTWlkZGxld2FyZSgpCgogICAgICAgIGRwLm1lc3NhZ2UubWlkZGxld2FyZSgKICAgICAgICAgICAgYXV0aF9taWRkbGV3YXJlCiAgICAgICAgKQoKICAgICAgICBkcC5jYWxsYmFja19xdWVyeS5taWRkbGV3YXJlKAogICAgICAgICAgICBBdXRoQ2hlY2tNaWRkbGV3YXJlKCkKICAgICAgICApCgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAiQXV0aENoZWNrTWlkZGxld2FyZSByZWdpc3RlcmVkLiIKICAgICAgICApCgogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAiQ291bGQgbm90IHJlZ2lzdGVyIEF1dGhDaGVja01pZGRsZXdhcmUuIgogICAgICAgICkKCiAgICAgICAgYXdhaXQgY2xvc2Vfc2VydmljZSgKICAgICAgICAgICAgbWFya2V0X2NsaWVudCwKICAgICAgICAgICAgIk1hbnVhbCBmdWxmaWxsbWVudCIsCiAgICAgICAgKQoKICAgICAgICBhd2FpdCBjbG9zZV9zZXJ2aWNlKAogICAgICAgICAgICB0b25fd2F0Y2hlciwKICAgICAgICAgICAgIlRPTiB3YXRjaGVyIiwKICAgICAgICApCgogICAgICAgIHRyeToKICAgICAgICAgICAgYXdhaXQgYm90LnNlc3Npb24uY2xvc2UoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgcmFpc2UKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFRocm90dGxpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICByYXRlX2xpbWl0ID0gZ2V0X3NldHRpbmcoCiAgICAgICAgIlJBVEVfTElNSVRfREVGQVVMVCIsCiAgICAgICAgMS4wLAogICAgKQoKICAgIHRyeToKICAgICAgICByYXRlX2xpbWl0ID0gZmxvYXQoCiAgICAgICAgICAgIHJhdGVfbGltaXQKICAgICAgICApCgogICAgICAgIGlmIHJhdGVfbGltaXQgPD0gMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgoKICAgIGV4Y2VwdCAoCiAgICAgICAgVHlwZUVycm9yLAogICAgICAgIFZhbHVlRXJyb3IsCiAgICApOgogICAgICAgIHJhdGVfbGltaXQgPSAxLjAKCiAgICBkcC5tZXNzYWdlLm1pZGRsZXdhcmUoCiAgICAgICAgVGhyb3R0bGluZ01pZGRsZXdhcmUoCiAgICAgICAgICAgIHJhdGVfbGltaXQ9cmF0ZV9saW1pdCwKICAgICAgICApCiAgICApCgogICAgZHAuY2FsbGJhY2tfcXVlcnkubWlkZGxld2FyZSgKICAgICAgICBUaHJvdHRsaW5nTWlkZGxld2FyZSgKICAgICAgICAgICAgcmF0ZV9saW1pdD1yYXRlX2xpbWl0LAogICAgICAgICkKICAgICkKCiAgICBsb2dnZXIuaW5mbygKICAgICAgICAiVGhyb3R0bGluZ01pZGRsZXdhcmUgcmVnaXN0ZXJlZCB8IHJhdGU9JS4yZnMiLAogICAgICAgIHJhdGVfbGltaXQsCiAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBSb3V0ZXJzCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgIyDYqtix2KrbjNioIFJvdXRlctmH2Kcg2LnZhdiv2KfZiyDZhdi02K7YtSDYp9iz2KouCiAgICAjIHNob3Agcm91dGVyINi02KfZhdmEIGNhbGxiYWNr2YfYp9uMINmF2KfZhNqpOgogICAgIyBvd25lcl9hcHByb3ZlX29yZGVyXyoKICAgICMgb3duZXJfcmVqZWN0X29yZGVyXyoKICAgICMg2KfYs9iqINmIINmG24zYp9iyINio2YcgUm91dGVyINis2K/Yp9qv2KfZhtmHINmG2K/Yp9ix2K8uCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBBZG1pbiBSb3V0ZXJzIEZJUlNUCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZHAuaW5jbHVkZV9yb3V0ZXIoCiAgICAgICAgYWRtaW5fcGFuZWxfcm91dGVyCiAgICApCgogICAgZHAuaW5jbHVkZV9yb3V0ZXIoCiAgICAgICAgYWRtaW5fYWN0aW9uc19yb3V0ZXIKICAgICkKCiAgICBsb2dnZXIuaW5mbygKICAgICAgICAiQWRtaW4gcm91dGVycyByZWdpc3RlcmVkIHwgcGFuZWwgKyB1bmlmaWVkIGFjdGlvbnMuIgogICAgKQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgVXNlciBSb3V0ZXJzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZHAuaW5jbHVkZV9yb3V0ZXIoCiAgICAgICAgdXNlcl9zdGFydF9yb3V0ZXIKICAgICkKICAgIGRwLmluY2x1ZGVfcm91dGVyKAogICAgICAgIHVzZXJfd2FsbGV0X3JvdXRlcgogICAgKQogICAgZHAuaW5jbHVkZV9yb3V0ZXIoCiAgICAgICAgdXNlcl9yZWZlcnJhbF9yb3V0ZXIKICAgICkKICAgIGRwLmluY2x1ZGVfcm91dGVyKAogICAgICAgIHVzZXJfa3ljX3JvdXRlcgogICAgKQogICAgZHAuaW5jbHVkZV9yb3V0ZXIoCiAgICAgICAgdXNlcl9zaG9wX3JvdXRlcgogICAgKQoKICAgIGxvZ2dlci5pbmZvKAogICAgICAgICJBbGwgcm91dGVycyByZWdpc3RlcmVkLiIKICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFN0YXJ0dXAgLyBTaHV0ZG93bgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRwLnN0YXJ0dXAucmVnaXN0ZXIoCiAgICAgICAgb25fc3RhcnR1cAogICAgKQoKICAgIGRwLnNodXRkb3duLnJlZ2lzdGVyKAogICAgICAgIG9uX3NodXRkb3duCiAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBQb2xsaW5nCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgdHJ5OgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAiUmVtb3Zpbmcgd2ViaG9vayBhbmQgcGVuZGluZyB1cGRhdGVzLi4uIgogICAgICAgICkKCiAgICAgICAgYXdhaXQgYm90LmRlbGV0ZV93ZWJob29rKAogICAgICAgICAgICBkcm9wX3BlbmRpbmdfdXBkYXRlcz1UcnVlCiAgICAgICAgKQoKICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgIkJvdCBpcyBzdGFydGluZyBwb2xsaW5nLi4uIgogICAgICAgICkKCiAgICAgICAgYXdhaXQgZHAuc3RhcnRfcG9sbGluZygKICAgICAgICAgICAgYm90LAogICAgICAgICAgICBhbGxvd2VkX3VwZGF0ZXM9KAogICAgICAgICAgICAgICAgZHAucmVzb2x2ZV91c2VkX3VwZGF0ZV90eXBlcygpCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGV4Y2VwdCBhc3luY2lvLkNhbmNlbGxlZEVycm9yOgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAiUG9sbGluZyBjYW5jZWxsZWQuIgogICAgICAgICkKICAgICAgICByYWlzZQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgIkNyaXRpY2FsIGVycm9yIGR1cmluZyBwb2xsaW5nLiIKICAgICAgICApCgogICAgZmluYWxseToKICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgIkNsb3NpbmcgVGVsZWdyYW0gYm90IHNlc3Npb24uLi4iCiAgICAgICAgKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGF3YWl0IGJvdC5zZXNzaW9uLmNsb3NlKCkKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJFcnJvciBjbG9zaW5nIFRlbGVncmFtIGJvdCBzZXNzaW9uLiIKICAgICAgICAgICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgRW50cnkgUG9pbnQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0cnk6CiAgICAgICAgYXN5bmNpby5ydW4oCiAgICAgICAgICAgIG1haW4oKQogICAgICAgICkKCiAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICJCb3Qgc3RvcHBlZCBtYW51YWxseS4iCiAgICAgICAgKQoKICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAiQm90IGV4aXRlZC4iCiAgICAgICAgKQo=', 'core/config.py': 'ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwsIEludmFsaWRPcGVyYXRpb24KZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsCgpmcm9tIHB5ZGFudGljIGltcG9ydCBGaWVsZCwgZmllbGRfdmFsaWRhdG9yCmZyb20gcHlkYW50aWNfc2V0dGluZ3MgaW1wb3J0IEJhc2VTZXR0aW5ncywgU2V0dGluZ3NDb25maWdEaWN0CgoKZGVmIF9sb2FkX2RvdGVudl9maWxlKAogICAgcGF0aDogc3RyIHwgUGF0aCA9ICIuZW52IiwKKSAtPiBOb25lOgogICAgIiIiCiAgICBNaW5pbWFsIC5lbnYgbG9hZGVyIHVzaW5nIG9ubHkgdGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5LgoKICAgIEV4aXN0aW5nIE9TIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbHdheXMgd2luLgogICAgU2VjcmV0cyBhcmUgbmV2ZXIgbG9nZ2VkLgogICAgIiIiCiAgICBlbnZfcGF0aCA9IFBhdGgocGF0aCkKCiAgICBpZiBub3QgZW52X3BhdGguaXNfZmlsZSgpOgogICAgICAgIHJldHVybgoKICAgIHRyeToKICAgICAgICBsaW5lcyA9IGVudl9wYXRoLnJlYWRfdGV4dCgKICAgICAgICAgICAgZW5jb2Rpbmc9InV0Zi04IiwKICAgICAgICApLnNwbGl0bGluZXMoKQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcmV0dXJuCgogICAgZm9yIHJhd19saW5lIGluIGxpbmVzOgogICAgICAgIGxpbmUgPSByYXdfbGluZS5zdHJpcCgpCgogICAgICAgIGlmICgKICAgICAgICAgICAgbm90IGxpbmUKICAgICAgICAgICAgb3IgbGluZS5zdGFydHN3aXRoKCIjIikKICAgICAgICAgICAgb3IgIj0iIG5vdCBpbiBsaW5lCiAgICAgICAgKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAga2V5LCB2YWx1ZSA9IGxpbmUuc3BsaXQoCiAgICAgICAgICAgICI9IiwKICAgICAgICAgICAgMSwKICAgICAgICApCgogICAgICAgIGtleSA9IGtleS5zdHJpcCgpCiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdHJpcCgpCgogICAgICAgIGlmIG5vdCBrZXk6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmICgKICAgICAgICAgICAgbGVuKHZhbHVlKSA+PSAyCiAgICAgICAgICAgIGFuZCB2YWx1ZVswXSA9PSB2YWx1ZVstMV0KICAgICAgICAgICAgYW5kIHZhbHVlWzBdIGluIHsiJyIsICciJ30KICAgICAgICApOgogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzE6LTFdCgogICAgICAgIG9zLmVudmlyb24uc2V0ZGVmYXVsdCgKICAgICAgICAgICAga2V5LAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICApCgoKX2xvYWRfZG90ZW52X2ZpbGUoKQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFNldHRpbmdzKEJhc2VTZXR0aW5ncyk6CiAgICAiIiIKICAgINiq2YbYuNuM2YXYp9iqINin2LXZhNuMINix2KjYp9iqLgoKICAgIFNlY3JldHMgYXJlIGxvYWRlZCBmcm9tIE9TIGVudmlyb25tZW50IG9yIHByb2plY3QgLmVudi4KICAgIERvIG5vdCBoYXJkY29kZSBCT1RfVE9LRU4gb3Igb3RoZXIgc2VjcmV0cyBoZXJlLgogICAgIiIiCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgVGVsZWdyYW0gQm90CiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIEJPVF9UT0tFTjogc3RyID0gRmllbGQoCiAgICAgICAgZGVmYXVsdD0iIiwKICAgICAgICBkZXNjcmlwdGlvbj0iVGVsZWdyYW0gQm90IFRva2VuIiwKICAgICkKCiAgICBBRE1JTl9JRFM6IHN0ciA9IEZpZWxkKAogICAgICAgIGRlZmF1bHQ9IiIsCiAgICAgICAgZGVzY3JpcHRpb249IkNvbW1hLXNlcGFyYXRlZCBUZWxlZ3JhbSBhZG1pbiBJRHMiLAogICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIERhdGFiYXNlCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIERCX1BBVEg6IHN0ciA9ICJtYXRyaXhfYm90LmRiIgoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIE1hcmtldEFwcAogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBNQVJLRVRfQVBQX0JBU0VfVVJMOiBzdHIgPSAoCiAgICAgICAgImh0dHBzOi8vYXBpLm1hcmtldGFwcC5vcmcvdjEiCiAgICApCgogICAgTUFSS0VUX0FQUF9UT0tFTjogc3RyID0gIiIKCiAgICBNQVJLRVRfQVBQX1RJTUVPVVQ6IGZsb2F0ID0gMzAuMAogICAgTUFSS0VUX0FQUF9DT05ORUNUX1RJTUVPVVQ6IGZsb2F0ID0gMTAuMAoKICAgIE1BUktFVF9BUFBfTUFYX0NPTk5FQ1RJT05TOiBpbnQgPSAxMDAKICAgIE1BUktFVF9BUFBfUkVUUklFUzogaW50ID0gMwoKICAgIE1BUktFVF9BUFBfUkVUUllfREVMQVk6IGZsb2F0ID0gMS41CiAgICBNQVJLRVRfQVBQX01BWF9SRVRSWV9ERUxBWTogZmxvYXQgPSAxNS4wCgogICAgTUFSS0VUX0FQUF9SQVRFX0xJTUlUX0NBTExTOiBpbnQgPSAxMAogICAgTUFSS0VUX0FQUF9SQVRFX0xJTUlUX1BFUklPRDogZmxvYXQgPSAxLjAKCiAgICBNQVJLRVRfQVBQX1BST1hZOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgTUFSS0VUX0FQUF9WRVJJRllfU1NMOiBib29sID0gVHJ1ZQoKICAgIE1BUktFVF9BUFBfVVNFUl9BR0VOVDogc3RyID0gKAogICAgICAgICJNYXRyaXhCb3QvTWFya2V0QXBwQ2xpZW50LzYuMCIKICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBUT04gLyBVU0RUCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIFRPTl9VU0RUX1JBVEVfVVJMOiBzdHIgPSAoCiAgICAgICAgImh0dHBzOi8vYXBpLmJpbmFuY2UuY29tL2FwaS92My90aWNrZXIvcHJpY2UiCiAgICApCgogICAgVE9OX1VTRFRfQ0FDSEVfVFRMOiBpbnQgPSA1CgogICAgVVNEVF9ERUNJTUFMUzogaW50ID0gOAoKICAgIE1JTl9VU0RUX1BSSUNFOiBEZWNpbWFsID0gRGVjaW1hbCgKICAgICAgICAiMC4wMDAwMDAwMSIKICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBQcmljaW5nCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIFBSSUNJTkdfTUFSS1VQX1BFUkNFTlQ6IERlY2ltYWwgPSBEZWNpbWFsKCIxMCIpCgogICAgTUlOX09SREVSX1BSSUNFX1RPTUFOOiBpbnQgPSAxMDAwCgogICAgUFJJQ0VfUk9VTkRfVE9fVE9NQU46IGludCA9IDEwMDAKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBTdGFycwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBNSU5fU1RBUlM6IGludCA9IDUwCiAgICBNQVhfU1RBUlM6IGludCA9IDEwXzAwMAoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFByZW1pdW0KICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgUFJFTUlVTV9NT05USFM6IHR1cGxlW2ludCwgLi4uXSA9ICgKICAgICAgICAxLAogICAgICAgIDMsCiAgICAgICAgNiwKICAgICAgICAxMiwKICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBUT04gQVBJCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIFRPTl9BUElfQkFTRV9VUkw6IHN0ciA9ICgKICAgICAgICAiaHR0cHM6Ly90b25jZW50ZXIuY29tL2FwaS92MiIKICAgICkKCiAgICBUT05fQVBJX0tFWTogT3B0aW9uYWxbc3RyXSA9IE5vbmUKCiAgICBNRVJDSEFOVF9XQUxMRVRfQUREUkVTUzogc3RyID0gIiIKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBGcmFnbWVudAogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBGUkFHTUVOVF9BUElfQkFTRV9VUkw6IHN0ciA9ICgKICAgICAgICAiaHR0cHM6Ly9mcmFnbWVudC5jb20vYXBpIgogICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFJ1bnRpbWUKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgREVCVUdfTU9ERTogYm9vbCA9IEZhbHNlCgogICAgUkFURV9MSU1JVF9ERUZBVUxUOiBmbG9hdCA9IDEuMAoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEFwcGxpY2F0aW9uCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIFNVUFBPUlRfVVNFUk5BTUU6IHN0ciA9ICJAU3VwcG9ydF9BZG1pbiIKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBTZXR0aW5ncwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBtb2RlbF9jb25maWcgPSBTZXR0aW5nc0NvbmZpZ0RpY3QoCiAgICAgICAgZXh0cmE9Imlnbm9yZSIsCiAgICAgICAgY2FzZV9zZW5zaXRpdmU9VHJ1ZSwKICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBWYWxpZGF0b3JzCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIEBmaWVsZF92YWxpZGF0b3IoCiAgICAgICAgIk1BUktFVF9BUFBfVElNRU9VVCIsCiAgICAgICAgIk1BUktFVF9BUFBfQ09OTkVDVF9USU1FT1VUIiwKICAgICAgICAiTUFSS0VUX0FQUF9SRVRSWV9ERUxBWSIsCiAgICAgICAgIk1BUktFVF9BUFBfTUFYX1JFVFJZX0RFTEFZIiwKICAgICAgICAiTUFSS0VUX0FQUF9SQVRFX0xJTUlUX1BFUklPRCIsCiAgICAgICAgIlJBVEVfTElNSVRfREVGQVVMVCIsCiAgICApCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiB2YWxpZGF0ZV9wb3NpdGl2ZV9mbG9hdChjbHMsIHZhbHVlKToKICAgICAgICBpZiBmbG9hdCh2YWx1ZSkgPD0gMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJWYWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIEBmaWVsZF92YWxpZGF0b3IoCiAgICAgICAgIk1BUktFVF9BUFBfTUFYX0NPTk5FQ1RJT05TIiwKICAgICAgICAiTUFSS0VUX0FQUF9SRVRSSUVTIiwKICAgICAgICAiTUFSS0VUX0FQUF9SQVRFX0xJTUlUX0NBTExTIiwKICAgICAgICAiTUlOX1NUQVJTIiwKICAgICAgICAiTUFYX1NUQVJTIiwKICAgICkKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHZhbGlkYXRlX3Bvc2l0aXZlX2ludChjbHMsIHZhbHVlKToKICAgICAgICBpZiBpbnQodmFsdWUpIDw9IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBAZmllbGRfdmFsaWRhdG9yKCJVU0RUX0RFQ0lNQUxTIikKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHZhbGlkYXRlX3VzZHRfZGVjaW1hbHMoY2xzLCB2YWx1ZSk6CiAgICAgICAgaWYgbm90IDAgPD0gaW50KHZhbHVlKSA8PSAxODoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJVU0RUX0RFQ0lNQUxTIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxOC4iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBAZmllbGRfdmFsaWRhdG9yKCJQUklDRV9ST1VORF9UT19UT01BTiIpCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiB2YWxpZGF0ZV9wcmljZV9yb3VuZChjbHMsIHZhbHVlKToKICAgICAgICBpZiBpbnQodmFsdWUpIDwgMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJQUklDRV9ST1VORF9UT19UT01BTiBjYW5ub3QgYmUgbmVnYXRpdmUuIgogICAgICAgICAgICApCgogICAgICAgIHJldHVybiB2YWx1ZQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgQGZpZWxkX3ZhbGlkYXRvcigKICAgICAgICAiUFJJQ0lOR19NQVJLVVBfUEVSQ0VOVCIsCiAgICAgICAgbW9kZT0iYmVmb3JlIiwKICAgICkKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHZhbGlkYXRlX21hcmt1cChjbHMsIHZhbHVlKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZhbHVlID0gRGVjaW1hbChzdHIodmFsdWUpKQoKICAgICAgICBleGNlcHQgKAogICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uLAogICAgICAgICAgICBWYWx1ZUVycm9yLAogICAgICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgKSBhcyBleGM6CgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkludmFsaWQgUFJJQ0lOR19NQVJLVVBfUEVSQ0VOVC4iCiAgICAgICAgICAgICkgZnJvbSBleGMKCiAgICAgICAgaWYgdmFsdWUgPCAwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIlBSSUNJTkdfTUFSS1VQX1BFUkNFTlQgY2Fubm90IGJlIG5lZ2F0aXZlLiIKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBBZG1pbiBJRHMKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZGVmIGdldF9hZG1pbl9saXN0KHNlbGYpIC0+IGxpc3RbaW50XToKICAgICAgICBpZiBub3Qgc2VsZi5BRE1JTl9JRFM6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXN1bHQ6IGxpc3RbaW50XSA9IFtdCgogICAgICAgIGZvciByYXdfaWQgaW4gc2VsZi5BRE1JTl9JRFMuc3BsaXQoIiwiKToKCiAgICAgICAgICAgIHJhd19pZCA9IHJhd19pZC5zdHJpcCgpCgogICAgICAgICAgICBpZiBub3QgcmF3X2lkOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW50KHJhd19pZCkpCgogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBhZG1pbiBJRCBpZ25vcmVkOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgcmF3X2lkLAogICAgICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgSGVscGVycwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgZ2V0X3VzZHRfcXVhbnRpemUoc2VsZikgLT4gRGVjaW1hbDoKICAgICAgICByZXR1cm4gRGVjaW1hbCgKICAgICAgICAgICAgIjEuIgogICAgICAgICAgICArICgKICAgICAgICAgICAgICAgICIwIiAqIHNlbGYuVVNEVF9ERUNJTUFMUwogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFJ1bnRpbWUgdmFsaWRhdGlvbgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgdmFsaWRhdGVfcnVudGltZShzZWxmKSAtPiBOb25lOgoKICAgICAgICBpZiAoCiAgICAgICAgICAgIG5vdCBzZWxmLkJPVF9UT0tFTi5zdHJpcCgpCiAgICAgICAgICAgIG9yIHNlbGYuQk9UX1RPS0VOCiAgICAgICAgICAgID09ICJQQVNURV9ZT1VSX05FV19CT1RfVE9LRU5fSEVSRSIKICAgICAgICApOgoKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAgIkJPVF9UT0tFTiBpcyBub3QgY29uZmlndXJlZC4gIgogICAgICAgICAgICAgICAgIlNldCBpdCBpbiAuZW52IG9yIHRoZSBPUyBlbnZpcm9ubWVudC4iCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgIjoiIG5vdCBpbiBzZWxmLkJPVF9UT0tFTjoKCiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICJCT1RfVE9LRU4gZm9ybWF0IGFwcGVhcnMgdG8gYmUgaW52YWxpZC4iCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5NSU5fU1RBUlMgPiBzZWxmLk1BWF9TVEFSUzoKCiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICJNSU5fU1RBUlMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBNQVhfU1RBUlMuIgogICAgICAgICAgICApCgogICAgICAgIGlmIHNlbGYuUFJJQ0VfUk9VTkRfVE9fVE9NQU4gPCAwOgoKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAgIlBSSUNFX1JPVU5EX1RPX1RPTUFOIGNhbm5vdCBiZSBuZWdhdGl2ZS4iCiAgICAgICAgICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBHbG9iYWwgU2V0dGluZ3MKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzZXR0aW5ncyA9IFNldHRpbmdzKCkKCnNldHRpbmdzLnZhbGlkYXRlX3J1bnRpbWUoKQoKbG9nZ2VyLmluZm8oCiAgICAiTWF0cml4IGNvbmZpZ3VyYXRpb24gbG9hZGVkIHN1Y2Nlc3NmdWxseS4iCik=', 'core/database.py': 'IyBjb3JlL2RhdGFiYXNlLnB5Cgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYXN5bmNpbwppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3FsaXRlMwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgT3B0aW9uYWwKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIERhdGFiYXNlIE1hbmFnZXIKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmNsYXNzIERhdGFiYXNlTWFuYWdlcjoKICAgICIiIgogICAgQXN5bmMtZnJpZW5kbHkgU1FMaXRlIGRhdGFiYXNlIG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IHByb2plY3Qgc2NoZW1hLgoKICAgIENhbm9uaWNhbCB1c2VyIHByaW1hcnkga2V5OgogICAgICAgIHVzZXJzLnVzZXJfaWQKCiAgICBJbXBvcnRhbnQ6CiAgICAgICAgLSBBbGwgU1FMaXRlIHdvcmsgaXMgc3luY2hyb25vdXMgaW50ZXJuYWxseSBhbmQgcnVucyB0aHJvdWdoCiAgICAgICAgICBhc3luY2lvLnRvX3RocmVhZCgpIGZyb20gYXN5bmMgbWV0aG9kcy4KICAgICAgICAtIE5vIGFpb3NxbGl0ZSBjb25uZWN0aW9uIGlzIGF3YWl0ZWQgdHdpY2UuCiAgICAgICAgLSBFeGlzdGluZyBkYXRhYmFzZXMgYXJlIG1pZ3JhdGVkIG5vbi1kZXN0cnVjdGl2ZWx5IHdoZXJlIHBvc3NpYmxlLgogICAgICAgIC0gQnJva2VuIGhpc3RvcmljYWwgZm9yZWlnbiBrZXlzIHRvIHVzZXJzKGlkKSBhcmUgcmVwYWlyZWQuCiAgICAiIiIKCiAgICBWQUxJRF9PUkRFUl9TVEFUVVNFUyA9IHsKICAgICAgICAjIE93bmVyIGFwcHJvdmFsIHdvcmtmbG93CiAgICAgICAgInBlbmRpbmdfb3duZXJfYXBwcm92YWwiLAogICAgICAgICJvd25lcl9wcm9jZXNzaW5nIiwKICAgICAgICAicmVqZWN0ZWRfYnlfb3duZXIiLAogICAgICAgICJjYW5jZWxsZWRfYnlfdXNlciIsCiAgICAgICAgInByaWNlX2NoYW5nZWQiLAogICAgICAgICJpbnN1ZmZpY2llbnRfYmFsYW5jZSIsCiAgICAgICAgInByb3ZpZGVyX3Byb2Nlc3NpbmciLAogICAgICAgICJwcm92aWRlcl9zdGF0dXNfdW5rbm93biIsCiAgICAgICAgImNvbXBsZXRlZCIsCiAgICAgICAgImZhaWxlZF9yZWZ1bmRlZCIsCiAgICAgICAgImZhaWxlZF9yZWZ1bmRfcmVxdWlyZWQiLAoKICAgICAgICAjIExlZ2FjeSBjb21wYXRpYmlsaXR5CiAgICAgICAgInBlbmRpbmciLAogICAgICAgICJwcm9jZXNzaW5nIiwKICAgICAgICAicGFpZCIsCiAgICAgICAgImZhaWxlZCIsCiAgICAgICAgImNhbmNlbGxlZCIsCiAgICAgICAgInJlZnVuZGVkIiwKICAgICAgICAiY3JlYXRlZCIsCiAgICB9CgogICAgZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgZGJfcGF0aDogc3RyID0gIm1hdHJpeF9ib3QuZGIiLAogICAgKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGJfcGF0aCA9IHN0cigKICAgICAgICAgICAgUGF0aChkYl9wYXRoKQogICAgICAgICkKCiAgICAgICAgIyBDb21wYXRpYmlsaXR5IGF0dHJpYnV0ZSB1c2VkIGJ5IHNvbWUgaGFuZGxlcnMuCiAgICAgICAgc2VsZi5kYXRhYmFzZV9wYXRoID0gKAogICAgICAgICAgICBzZWxmLmRiX3BhdGgKICAgICAgICApCgogICAgICAgIHNlbGYuX2luaXRpYWxpemVkID0gRmFsc2UKICAgICAgICBzZWxmLl9pbml0X2xvY2sgPSBhc3luY2lvLkxvY2soKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgQ29ubmVjdGlvbiAvIEludHJvc3BlY3Rpb24KICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgX2Nvbm5lY3QoCiAgICAgICAgc2VsZiwKICAgICAgICAqLAogICAgICAgIGZvcmVpZ25fa2V5czogYm9vbCA9IFRydWUsCiAgICApIC0+IHNxbGl0ZTMuQ29ubmVjdGlvbjoKICAgICAgICBjb25uID0gc3FsaXRlMy5jb25uZWN0KAogICAgICAgICAgICBzZWxmLmRiX3BhdGgsCiAgICAgICAgICAgIHRpbWVvdXQ9MzAsCiAgICAgICAgICAgIGNoZWNrX3NhbWVfdGhyZWFkPUZhbHNlLAogICAgICAgICkKCiAgICAgICAgY29ubi5yb3dfZmFjdG9yeSA9ICgKICAgICAgICAgICAgc3FsaXRlMy5Sb3cKICAgICAgICApCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUwiCiAgICAgICAgKQoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJQUkFHTUEgc3luY2hyb25vdXMgPSBOT1JNQUwiCiAgICAgICAgKQoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJQUkFHTUEgYnVzeV90aW1lb3V0ID0gMzAwMDAiCiAgICAgICAgKQoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICJQUkFHTUEgZm9yZWlnbl9rZXlzID0gT04iCiAgICAgICAgICAgICAgICBpZiBmb3JlaWduX2tleXMKICAgICAgICAgICAgICAgIGVsc2UgIlBSQUdNQSBmb3JlaWduX2tleXMgPSBPRkYiCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIHJldHVybiBjb25uCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF90YWJsZV9leGlzdHMoCiAgICAgICAgY29ubjogc3FsaXRlMy5Db25uZWN0aW9uLAogICAgICAgIHRhYmxlX25hbWU6IHN0ciwKICAgICkgLT4gYm9vbDoKICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBTRUxFQ1QgMQogICAgICAgICAgICBGUk9NIHNxbGl0ZV9tYXN0ZXIKICAgICAgICAgICAgV0hFUkUgdHlwZSA9ICd0YWJsZScKICAgICAgICAgICAgICBBTkQgbmFtZSA9ID8KICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIHRhYmxlX25hbWUsCiAgICAgICAgICAgICksCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIHJldHVybiByb3cgaXMgbm90IE5vbmUKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfY29sdW1uX25hbWVzKAogICAgICAgIGNscywKICAgICAgICBjb25uOiBzcWxpdGUzLkNvbm5lY3Rpb24sCiAgICAgICAgdGFibGVfbmFtZTogc3RyLAogICAgKSAtPiBzZXRbc3RyXToKICAgICAgICBpZiBub3QgY2xzLl90YWJsZV9leGlzdHMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgIHRhYmxlX25hbWUsCiAgICAgICAgKToKICAgICAgICAgICAgcmV0dXJuIHNldCgpCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHN0cigKICAgICAgICAgICAgICAgIHJvd1sibmFtZSJdCiAgICAgICAgICAgICkKICAgICAgICAgICAgZm9yIHJvdwogICAgICAgICAgICBpbiBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICBmIlBSQUdNQSB0YWJsZV9pbmZvKHt0YWJsZV9uYW1lfSkiCiAgICAgICAgICAgICkuZmV0Y2hhbGwoKQogICAgICAgIH0KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZm9yZWlnbl9rZXlzKAogICAgICAgIGNscywKICAgICAgICBjb25uOiBzcWxpdGUzLkNvbm5lY3Rpb24sCiAgICAgICAgdGFibGVfbmFtZTogc3RyLAogICAgKSAtPiBsaXN0W3NxbGl0ZTMuUm93XToKICAgICAgICBpZiBub3QgY2xzLl90YWJsZV9leGlzdHMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgIHRhYmxlX25hbWUsCiAgICAgICAgKToKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBsaXN0KAogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICBmIlBSQUdNQSBmb3JlaWduX2tleV9saXN0KHt0YWJsZV9uYW1lfSkiCiAgICAgICAgICAgICkuZmV0Y2hhbGwoKQogICAgICAgICkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfaGFzX3VzZXJfaWRfZmsoCiAgICAgICAgY2xzLAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICAgICB0YWJsZV9uYW1lOiBzdHIsCiAgICAgICAgZnJvbV9jb2x1bW46IHN0ciA9ICJ1c2VyX2lkIiwKICAgICkgLT4gYm9vbDoKICAgICAgICByZXR1cm4gYW55KAogICAgICAgICAgICBzdHIocm93WyJ0YWJsZSJdKSA9PSAidXNlcnMiCiAgICAgICAgICAgIGFuZCBzdHIocm93WyJmcm9tIl0pID09IGZyb21fY29sdW1uCiAgICAgICAgICAgIGFuZCBzdHIocm93WyJ0byJdKSA9PSAidXNlcl9pZCIKICAgICAgICAgICAgZm9yIHJvdwogICAgICAgICAgICBpbiBjbHMuX2ZvcmVpZ25fa2V5cygKICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICB0YWJsZV9uYW1lLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgSW5pdGlhbGl6YXRpb24KICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgaW5pdCgKICAgICAgICBzZWxmLAogICAgKSAtPiBOb25lOgogICAgICAgIGlmIHNlbGYuX2luaXRpYWxpemVkOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYXN5bmMgd2l0aCBzZWxmLl9pbml0X2xvY2s6CiAgICAgICAgICAgIGlmIHNlbGYuX2luaXRpYWxpemVkOgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV90YWJsZXMKICAgICAgICAgICAgKQoKICAgICAgICAgICAgc2VsZi5faW5pdGlhbGl6ZWQgPSBUcnVlCgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJEYXRhYmFzZSBpbml0aWFsaXplZDogJXMiLAogICAgICAgICAgICAgICAgc2VsZi5kYl9wYXRoLAogICAgICAgICAgICApCgogICAgYXN5bmMgZGVmIGNyZWF0ZV90YWJsZXMoCiAgICAgICAgc2VsZiwKICAgICkgLT4gTm9uZToKICAgICAgICBhd2FpdCBzZWxmLmluaXQoKQoKICAgIGFzeW5jIGRlZiBfZW5zdXJlX2luaXRpYWxpemVkKAogICAgICAgIHNlbGYsCiAgICApIC0+IE5vbmU6CiAgICAgICAgaWYgbm90IHNlbGYuX2luaXRpYWxpemVkOgogICAgICAgICAgICBhd2FpdCBzZWxmLmluaXQoKQoKICAgIGRlZiBfY3JlYXRlX3RhYmxlcygKICAgICAgICBzZWxmLAogICAgKSAtPiBOb25lOgogICAgICAgICIiIgogICAgICAgIE1haW4gc2NoZW1hIG1pZ3JhdGlvbi4KCiAgICAgICAgZm9yZWlnbl9rZXlzIGlzIGRpc2FibGVkIG9ubHkgZm9yIHRoZSBtaWdyYXRpb24gY29ubmVjdGlvbiBiZWNhdXNlCiAgICAgICAgaGlzdG9yaWNhbCBkYXRhYmFzZXMgY2FuIGNvbnRhaW46CiAgICAgICAgICAgIG9yZGVycy51c2VyX2lkIC0+IHVzZXJzLmlkCiAgICAgICAgICAgIHdhbGxldF90cmFuc2FjdGlvbnMudXNlcl9pZCAtPiB1c2Vycy5pZAoKICAgICAgICBBZnRlciBtaWdyYXRpb24sIG5vcm1hbCBjb25uZWN0aW9ucyBhbHdheXMgZW5hYmxlIGZvcmVpZ24ga2V5cy4KICAgICAgICAiIiIKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgKICAgICAgICAgICAgZm9yZWlnbl9rZXlzPUZhbHNlCiAgICAgICAgKQoKICAgICAgICBsZWdhY3lfdXNlcnNfdGFibGU6IE9wdGlvbmFsWwogICAgICAgICAgICBzdHIKICAgICAgICBdID0gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJCRUdJTiBJTU1FRElBVEUiCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGxlZ2FjeV91c2Vyc190YWJsZSA9ICgKICAgICAgICAgICAgICAgIHNlbGYuX2Vuc3VyZV91c2Vyc19zY2hlbWEoCiAgICAgICAgICAgICAgICAgICAgY29ubgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgICAgICBzZWxmLl9lbnN1cmVfb3JkZXJzX3NjaGVtYSgKICAgICAgICAgICAgICAgIGNvbm4KICAgICAgICAgICAgKQoKICAgICAgICAgICAgc2VsZi5fZW5zdXJlX3dhbGxldF90cmFuc2FjdGlvbnNfc2NoZW1hKAogICAgICAgICAgICAgICAgY29ubgogICAgICAgICAgICApCgogICAgICAgICAgICBzZWxmLl9lbnN1cmVfcmVmZXJyYWxzX3NjaGVtYSgKICAgICAgICAgICAgICAgIGNvbm4KICAgICAgICAgICAgKQoKICAgICAgICAgICAgc2VsZi5fZW5zdXJlX2t5Y19zY2hlbWEoCiAgICAgICAgICAgICAgICBjb25uCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHNlbGYuX2Vuc3VyZV9hdWRpdF9zY2hlbWEoCiAgICAgICAgICAgICAgICBjb25uCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHNlbGYuX2Vuc3VyZV9maW5hbmNlX3NjaGVtYSgKICAgICAgICAgICAgICAgIGNvbm4KICAgICAgICAgICAgKQoKICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2luZGV4ZXMoCiAgICAgICAgICAgICAgICBjb25uCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGxlZ2FjeV91c2Vyc190YWJsZQogICAgICAgICAgICAgICAgYW5kIHNlbGYuX3RhYmxlX2V4aXN0cygKICAgICAgICAgICAgICAgICAgICBjb25uLAogICAgICAgICAgICAgICAgICAgIGxlZ2FjeV91c2Vyc190YWJsZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICBmIkRST1AgVEFCTEUge2xlZ2FjeV91c2Vyc190YWJsZX0iCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZS9taWdyYXRlIGRhdGFiYXNlIHNjaGVtYS4iCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgVXNlcnMgU2NoZW1hCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jcmVhdGVfY2Fub25pY2FsX3VzZXJzKAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICAgICB0YWJsZV9uYW1lOiBzdHIgPSAidXNlcnMiLAogICAgKSAtPiBOb25lOgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgZiIiIgogICAgICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB7dGFibGVfbmFtZX0gKAogICAgICAgICAgICAgICAgdXNlcl9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLAoKICAgICAgICAgICAgICAgIHVzZXJuYW1lIFRFWFQsCiAgICAgICAgICAgICAgICBmdWxsX25hbWUgVEVYVCwKCiAgICAgICAgICAgICAgICBpc19iYW5uZWQgSU5URUdFUiBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgMCwKCiAgICAgICAgICAgICAgICBpc19hZG1pbiBJTlRFR0VSIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCAwLAoKICAgICAgICAgICAgICAgIHVzZXJfdGllciBURVhUIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCAnc3RhbmRhcmQnLAoKICAgICAgICAgICAgICAgIGlzX2t5Y192ZXJpZmllZCBJTlRFR0VSIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCAwLAoKICAgICAgICAgICAgICAgIGJhbGFuY2VfdG9tYW4gSU5URUdFUiBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgMCwKCiAgICAgICAgICAgICAgICBiYWxhbmNlX3RvbiBSRUFMIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCAwLAoKICAgICAgICAgICAgICAgIGJhbGFuY2VfdXNkdCBSRUFMIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCAwLAoKICAgICAgICAgICAgICAgIGludml0ZWRfYnkgSU5URUdFUiwKCiAgICAgICAgICAgICAgICBjcmVhdGVkX2F0IFRJTUVTVEFNUCBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsCgogICAgICAgICAgICAgICAgdXBkYXRlZF9hdCBUSU1FU1RBTVAgTk9UIE5VTEwKICAgICAgICAgICAgICAgICAgICBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICkKICAgICAgICAgICAgIiIiCiAgICAgICAgKQoKICAgIGRlZiBfZW5zdXJlX3VzZXJzX3NjaGVtYSgKICAgICAgICBzZWxmLAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICkgLT4gT3B0aW9uYWxbc3RyXToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSB0ZW1wb3JhcnkgbGVnYWN5IHVzZXJzIHRhYmxlIG5hbWUgaWYgdXNlcnMoaWQpIGhhZCB0byBiZQogICAgICAgIG1pZ3JhdGVkLiBJdCBpcyBkcm9wcGVkIG9ubHkgYWZ0ZXIgZGVwZW5kZW50IHRhYmxlcyBhcmUgcmVidWlsdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5fdGFibGVfZXhpc3RzKAogICAgICAgICAgICBjb25uLAogICAgICAgICAgICAidXNlcnMiLAogICAgICAgICk6CiAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9jYW5vbmljYWxfdXNlcnMoCiAgICAgICAgICAgICAgICBjb25uCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGNvbHVtbnMgPSBzZWxmLl9jb2x1bW5fbmFtZXMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICJ1c2VycyIsCiAgICAgICAgKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjIEN1cnJlbnQgc2NoZW1hOiB1c2Vycy51c2VyX2lkCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgIGlmICJ1c2VyX2lkIiBpbiBjb2x1bW5zOgogICAgICAgICAgICBhZGRpdGlvbnMgPSB7CiAgICAgICAgICAgICAgICAidXNlcm5hbWUiOgogICAgICAgICAgICAgICAgICAgICJURVhUIiwKCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjoKICAgICAgICAgICAgICAgICAgICAiVEVYVCIsCgogICAgICAgICAgICAgICAgImlzX2Jhbm5lZCI6CiAgICAgICAgICAgICAgICAgICAgIklOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwIiwKCiAgICAgICAgICAgICAgICAiaXNfYWRtaW4iOgogICAgICAgICAgICAgICAgICAgICJJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCIsCgogICAgICAgICAgICAgICAgInVzZXJfdGllciI6CiAgICAgICAgICAgICAgICAgICAgIlRFWFQgTk9UIE5VTEwgREVGQVVMVCAnc3RhbmRhcmQnIiwKCiAgICAgICAgICAgICAgICAiaXNfa3ljX3ZlcmlmaWVkIjoKICAgICAgICAgICAgICAgICAgICAiSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAiLAoKICAgICAgICAgICAgICAgICJiYWxhbmNlX3RvbWFuIjoKICAgICAgICAgICAgICAgICAgICAiSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAiLAoKICAgICAgICAgICAgICAgICJiYWxhbmNlX3RvbiI6CiAgICAgICAgICAgICAgICAgICAgIlJFQUwgTk9UIE5VTEwgREVGQVVMVCAwIiwKCiAgICAgICAgICAgICAgICAiYmFsYW5jZV91c2R0IjoKICAgICAgICAgICAgICAgICAgICAiUkVBTCBOT1QgTlVMTCBERUZBVUxUIDAiLAoKICAgICAgICAgICAgICAgICJpbnZpdGVkX2J5IjoKICAgICAgICAgICAgICAgICAgICAiSU5URUdFUiIsCgogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOgogICAgICAgICAgICAgICAgICAgICJUSU1FU1RBTVAiLAoKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjoKICAgICAgICAgICAgICAgICAgICAiVElNRVNUQU1QIiwKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICgKICAgICAgICAgICAgICAgIGNvbHVtbiwKICAgICAgICAgICAgICAgIGRlZmluaXRpb24sCiAgICAgICAgICAgICkgaW4gYWRkaXRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBjb2x1bW4gbm90IGluIGNvbHVtbnM6CiAgICAgICAgICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgdXNlcnMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiJBREQgQ09MVU1OIHtjb2x1bW59IHtkZWZpbml0aW9ufSIKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgQ29tcGF0aWJpbGl0eSBtaWdyYXRpb24gZnJvbSBsZWdhY3kgY29sdW1ucyB0aGF0IG1heSBjb2V4aXN0LgogICAgICAgICAgICByZWZyZXNoZWQgPSBzZWxmLl9jb2x1bW5fbmFtZXMoCiAgICAgICAgICAgICAgICBjb25uLAogICAgICAgICAgICAgICAgInVzZXJzIiwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgInJvbGUiIGluIHJlZnJlc2hlZAogICAgICAgICAgICAgICAgYW5kICJpc19hZG1pbiIgaW4gcmVmcmVzaGVkCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIHVzZXJzCiAgICAgICAgICAgICAgICAgICAgU0VUIGlzX2FkbWluID0gMQogICAgICAgICAgICAgICAgICAgIFdIRVJFIExPV0VSKAogICAgICAgICAgICAgICAgICAgICAgICBDT0FMRVNDRShyb2xlLCAnJykKICAgICAgICAgICAgICAgICAgICApIElOICgKICAgICAgICAgICAgICAgICAgICAgICAgJ2FkbWluJywKICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2FkbWluaXN0cmF0b3InCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgImt5Y19zdGF0dXMiIGluIHJlZnJlc2hlZAogICAgICAgICAgICAgICAgYW5kICJpc19reWNfdmVyaWZpZWQiIGluIHJlZnJlc2hlZAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgICAgIFVQREFURSB1c2VycwogICAgICAgICAgICAgICAgICAgIFNFVCBpc19reWNfdmVyaWZpZWQgPSAxCiAgICAgICAgICAgICAgICAgICAgV0hFUkUgTE9XRVIoCiAgICAgICAgICAgICAgICAgICAgICAgIENPQUxFU0NFKGt5Y19zdGF0dXMsICcnKQogICAgICAgICAgICAgICAgICAgICkgSU4gKAogICAgICAgICAgICAgICAgICAgICAgICAnYXBwcm92ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAndmVyaWZpZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAnYWNjZXB0ZWQnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBIaXN0b3JpY2FsIHNjaGVtYTogdXNlcnMuaWQKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgaWYgImlkIiBub3QgaW4gY29sdW1uczoKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAgInVzZXJzIHRhYmxlIGhhcyBuZWl0aGVyIHVzZXJfaWQgbm9yIGlkLiIKICAgICAgICAgICAgKQoKICAgICAgICBsZWdhY3lfbmFtZSA9ICgKICAgICAgICAgICAgInVzZXJzX2xlZ2FjeV9kYXRhYmFzZV9tYW5hZ2VyIgogICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5fdGFibGVfZXhpc3RzKAogICAgICAgICAgICBjb25uLAogICAgICAgICAgICBsZWdhY3lfbmFtZSwKICAgICAgICApOgogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICBmIntsZWdhY3lfbmFtZX0gYWxyZWFkeSBleGlzdHMuICIKICAgICAgICAgICAgICAgICJJbnNwZWN0IHRoZSBkYXRhYmFzZSBiZWZvcmUgcmV0cnlpbmcgbWlncmF0aW9uLiIKICAgICAgICAgICAgKQoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICJBTFRFUiBUQUJMRSB1c2VycyAiCiAgICAgICAgICAgICAgICBmIlJFTkFNRSBUTyB7bGVnYWN5X25hbWV9IgogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICAgICBzZWxmLl9jcmVhdGVfY2Fub25pY2FsX3VzZXJzKAogICAgICAgICAgICBjb25uCiAgICAgICAgKQoKICAgICAgICBvbGRfY29sdW1ucyA9IHNlbGYuX2NvbHVtbl9uYW1lcygKICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgbGVnYWN5X25hbWUsCiAgICAgICAgKQoKICAgICAgICBpZF9leHByID0gImlkIgoKICAgICAgICB1c2VybmFtZV9leHByID0gKAogICAgICAgICAgICAidXNlcm5hbWUiCiAgICAgICAgICAgIGlmICJ1c2VybmFtZSIgaW4gb2xkX2NvbHVtbnMKICAgICAgICAgICAgZWxzZSAiTlVMTCIKICAgICAgICApCgogICAgICAgIGlmICJmdWxsX25hbWUiIGluIG9sZF9jb2x1bW5zOgogICAgICAgICAgICBmdWxsX25hbWVfZXhwciA9ICgKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiCiAgICAgICAgICAgICkKCiAgICAgICAgZWxpZiAoCiAgICAgICAgICAgICJmaXJzdF9uYW1lIiBpbiBvbGRfY29sdW1ucwogICAgICAgICAgICBvciAibGFzdF9uYW1lIiBpbiBvbGRfY29sdW1ucwogICAgICAgICk6CiAgICAgICAgICAgIGZpcnN0ID0gKAogICAgICAgICAgICAgICAgIkNPQUxFU0NFKGZpcnN0X25hbWUsICcnKSIKICAgICAgICAgICAgICAgIGlmICJmaXJzdF9uYW1lIiBpbiBvbGRfY29sdW1ucwogICAgICAgICAgICAgICAgZWxzZSAiJyciCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGxhc3QgPSAoCiAgICAgICAgICAgICAgICAiQ09BTEVTQ0UobGFzdF9uYW1lLCAnJykiCiAgICAgICAgICAgICAgICBpZiAibGFzdF9uYW1lIiBpbiBvbGRfY29sdW1ucwogICAgICAgICAgICAgICAgZWxzZSAiJyciCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGZ1bGxfbmFtZV9leHByID0gKAogICAgICAgICAgICAgICAgIlRSSU0oIgogICAgICAgICAgICAgICAgKyBmaXJzdAogICAgICAgICAgICAgICAgKyAiIHx8ICcgJyB8fCAiCiAgICAgICAgICAgICAgICArIGxhc3QKICAgICAgICAgICAgICAgICsgIikiCiAgICAgICAgICAgICkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZnVsbF9uYW1lX2V4cHIgPSAiTlVMTCIKCiAgICAgICAgaXNfYmFubmVkX2V4cHIgPSAoCiAgICAgICAgICAgICJDT0FMRVNDRShpc19iYW5uZWQsIDApIgogICAgICAgICAgICBpZiAiaXNfYmFubmVkIiBpbiBvbGRfY29sdW1ucwogICAgICAgICAgICBlbHNlICgKICAgICAgICAgICAgICAgICJDT0FMRVNDRShpc19ibG9ja2VkLCAwKSIKICAgICAgICAgICAgICAgIGlmICJpc19ibG9ja2VkIiBpbiBvbGRfY29sdW1ucwogICAgICAgICAgICAgICAgZWxzZSAiMCIKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAgICAgaWYgImlzX2FkbWluIiBpbiBvbGRfY29sdW1uczoKICAgICAgICAgICAgaXNfYWRtaW5fZXhwciA9ICgKICAgICAgICAgICAgICAgICJDT0FMRVNDRShpc19hZG1pbiwgMCkiCiAgICAgICAgICAgICkKCiAgICAgICAgZWxpZiAicm9sZSIgaW4gb2xkX2NvbHVtbnM6CiAgICAgICAgICAgIGlzX2FkbWluX2V4cHIgPSAoCiAgICAgICAgICAgICAgICAiQ0FTRSAiCiAgICAgICAgICAgICAgICAiV0hFTiBMT1dFUihDT0FMRVNDRShyb2xlLCAnJykpICIKICAgICAgICAgICAgICAgICJJTiAoJ2FkbWluJywgJ293bmVyJywgJ2FkbWluaXN0cmF0b3InKSAiCiAgICAgICAgICAgICAgICAiVEhFTiAxIEVMU0UgMCBFTkQiCiAgICAgICAgICAgICkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaXNfYWRtaW5fZXhwciA9ICIwIgoKICAgICAgICB1c2VyX3RpZXJfZXhwciA9ICgKICAgICAgICAgICAgIkNPQUxFU0NFKHVzZXJfdGllciwgJ3N0YW5kYXJkJykiCiAgICAgICAgICAgIGlmICJ1c2VyX3RpZXIiIGluIG9sZF9jb2x1bW5zCiAgICAgICAgICAgIGVsc2UgKAogICAgICAgICAgICAgICAgIkNPQUxFU0NFKHRpZXIsICdzdGFuZGFyZCcpIgogICAgICAgICAgICAgICAgaWYgInRpZXIiIGluIG9sZF9jb2x1bW5zCiAgICAgICAgICAgICAgICBlbHNlICInc3RhbmRhcmQnIgogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICAgICBpZiAiaXNfa3ljX3ZlcmlmaWVkIiBpbiBvbGRfY29sdW1uczoKICAgICAgICAgICAga3ljX2V4cHIgPSAoCiAgICAgICAgICAgICAgICAiQ09BTEVTQ0UoaXNfa3ljX3ZlcmlmaWVkLCAwKSIKICAgICAgICAgICAgKQoKICAgICAgICBlbGlmICJreWNfc3RhdHVzIiBpbiBvbGRfY29sdW1uczoKICAgICAgICAgICAga3ljX2V4cHIgPSAoCiAgICAgICAgICAgICAgICAiQ0FTRSAiCiAgICAgICAgICAgICAgICAiV0hFTiBMT1dFUihDT0FMRVNDRShreWNfc3RhdHVzLCAnJykpICIKICAgICAgICAgICAgICAgICJJTiAoJ2FwcHJvdmVkJywgJ3ZlcmlmaWVkJywgJ2FjY2VwdGVkJykgIgogICAgICAgICAgICAgICAgIlRIRU4gMSBFTFNFIDAgRU5EIgogICAgICAgICAgICApCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGt5Y19leHByID0gIjAiCgogICAgICAgIGJhbGFuY2VfdG9tYW5fZXhwciA9ICgKICAgICAgICAgICAgIkNPQUxFU0NFKGJhbGFuY2VfdG9tYW4sIDApIgogICAgICAgICAgICBpZiAiYmFsYW5jZV90b21hbiIgaW4gb2xkX2NvbHVtbnMKICAgICAgICAgICAgZWxzZSAoCiAgICAgICAgICAgICAgICAiQ09BTEVTQ0UoYmFsYW5jZSwgMCkiCiAgICAgICAgICAgICAgICBpZiAiYmFsYW5jZSIgaW4gb2xkX2NvbHVtbnMKICAgICAgICAgICAgICAgIGVsc2UgIjAiCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIGJhbGFuY2VfdG9uX2V4cHIgPSAoCiAgICAgICAgICAgICJDT0FMRVNDRShiYWxhbmNlX3RvbiwgMCkiCiAgICAgICAgICAgIGlmICJiYWxhbmNlX3RvbiIgaW4gb2xkX2NvbHVtbnMKICAgICAgICAgICAgZWxzZSAiMCIKICAgICAgICApCgogICAgICAgIGJhbGFuY2VfdXNkdF9leHByID0gKAogICAgICAgICAgICAiQ09BTEVTQ0UoYmFsYW5jZV91c2R0LCAwKSIKICAgICAgICAgICAgaWYgImJhbGFuY2VfdXNkdCIgaW4gb2xkX2NvbHVtbnMKICAgICAgICAgICAgZWxzZSAiMCIKICAgICAgICApCgogICAgICAgIGludml0ZWRfYnlfZXhwciA9ICgKICAgICAgICAgICAgImludml0ZWRfYnkiCiAgICAgICAgICAgIGlmICJpbnZpdGVkX2J5IiBpbiBvbGRfY29sdW1ucwogICAgICAgICAgICBlbHNlICJOVUxMIgogICAgICAgICkKCiAgICAgICAgY3JlYXRlZF9hdF9leHByID0gKAogICAgICAgICAgICAiY3JlYXRlZF9hdCIKICAgICAgICAgICAgaWYgImNyZWF0ZWRfYXQiIGluIG9sZF9jb2x1bW5zCiAgICAgICAgICAgIGVsc2UgIkNVUlJFTlRfVElNRVNUQU1QIgogICAgICAgICkKCiAgICAgICAgdXBkYXRlZF9hdF9leHByID0gKAogICAgICAgICAgICAidXBkYXRlZF9hdCIKICAgICAgICAgICAgaWYgInVwZGF0ZWRfYXQiIGluIG9sZF9jb2x1bW5zCiAgICAgICAgICAgIGVsc2UgIkNVUlJFTlRfVElNRVNUQU1QIgogICAgICAgICkKCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICBmIiIiCiAgICAgICAgICAgIElOU0VSVCBPUiBJR05PUkUgSU5UTyB1c2VycyAoCiAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgdXNlcm5hbWUsCiAgICAgICAgICAgICAgICBmdWxsX25hbWUsCiAgICAgICAgICAgICAgICBpc19iYW5uZWQsCiAgICAgICAgICAgICAgICBpc19hZG1pbiwKICAgICAgICAgICAgICAgIHVzZXJfdGllciwKICAgICAgICAgICAgICAgIGlzX2t5Y192ZXJpZmllZCwKICAgICAgICAgICAgICAgIGJhbGFuY2VfdG9tYW4sCiAgICAgICAgICAgICAgICBiYWxhbmNlX3RvbiwKICAgICAgICAgICAgICAgIGJhbGFuY2VfdXNkdCwKICAgICAgICAgICAgICAgIGludml0ZWRfYnksCiAgICAgICAgICAgICAgICBjcmVhdGVkX2F0LAogICAgICAgICAgICAgICAgdXBkYXRlZF9hdAogICAgICAgICAgICApCiAgICAgICAgICAgIFNFTEVDVAogICAgICAgICAgICAgICAge2lkX2V4cHJ9LAogICAgICAgICAgICAgICAge3VzZXJuYW1lX2V4cHJ9LAogICAgICAgICAgICAgICAge2Z1bGxfbmFtZV9leHByfSwKICAgICAgICAgICAgICAgIHtpc19iYW5uZWRfZXhwcn0sCiAgICAgICAgICAgICAgICB7aXNfYWRtaW5fZXhwcn0sCiAgICAgICAgICAgICAgICB7dXNlcl90aWVyX2V4cHJ9LAogICAgICAgICAgICAgICAge2t5Y19leHByfSwKICAgICAgICAgICAgICAgIHtiYWxhbmNlX3RvbWFuX2V4cHJ9LAogICAgICAgICAgICAgICAge2JhbGFuY2VfdG9uX2V4cHJ9LAogICAgICAgICAgICAgICAge2JhbGFuY2VfdXNkdF9leHByfSwKICAgICAgICAgICAgICAgIHtpbnZpdGVkX2J5X2V4cHJ9LAogICAgICAgICAgICAgICAge2NyZWF0ZWRfYXRfZXhwcn0sCiAgICAgICAgICAgICAgICB7dXBkYXRlZF9hdF9leHByfQogICAgICAgICAgICBGUk9NIHtsZWdhY3lfbmFtZX0KICAgICAgICAgICAgIiIiCiAgICAgICAgKQoKICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgIk1pZ3JhdGVkIGxlZ2FjeSB1c2Vycy5pZCBzY2hlbWEgIgogICAgICAgICAgICAidG8gdXNlcnMudXNlcl9pZC4iCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gbGVnYWN5X25hbWUKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIE9yZGVycyBTY2hlbWEKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NyZWF0ZV9jYW5vbmljYWxfb3JkZXJzKAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICkgLT4gTm9uZToKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBvcmRlcnMgKAogICAgICAgICAgICAgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAoKICAgICAgICAgICAgICAgIHVzZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwKCiAgICAgICAgICAgICAgICBwcm9kdWN0X2lkIFRFWFQgTk9UIE5VTEwsCgogICAgICAgICAgICAgICAgdGFyZ2V0IFRFWFQsCgogICAgICAgICAgICAgICAgcHJpY2UgSU5URUdFUiBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgMCwKCiAgICAgICAgICAgICAgICBzdGF0dXMgVEVYVCBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgJ3BlbmRpbmdfb3duZXJfYXBwcm92YWwnLAoKICAgICAgICAgICAgICAgIGdhdGV3YXkgVEVYVCBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgJ3dhbGxldCcsCgogICAgICAgICAgICAgICAgbWFya2V0X29yZGVyX2lkIFRFWFQsCgogICAgICAgICAgICAgICAgb3duZXJfaWQgSU5URUdFUiwKCiAgICAgICAgICAgICAgICBwcm92aWRlcl9yZXF1aXJlZF9wcmljZSBJTlRFR0VSLAoKICAgICAgICAgICAgICAgIHByb3ZpZGVyX2Vycm9yIFRFWFQsCgogICAgICAgICAgICAgICAgcHJvdmlkZXJfc3RhcnRlZF9hdCBUSU1FU1RBTVAsCgogICAgICAgICAgICAgICAgY29tcGxldGVkX2F0IFRJTUVTVEFNUCwKCiAgICAgICAgICAgICAgICByZWZ1bmRlZF9hdCBUSU1FU1RBTVAsCgogICAgICAgICAgICAgICAgY3JlYXRlZF9hdCBUSU1FU1RBTVAgTk9UIE5VTEwKICAgICAgICAgICAgICAgICAgICBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QLAoKICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgVElNRVNUQU1QIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwKCiAgICAgICAgICAgICAgICBGT1JFSUdOIEtFWSAodXNlcl9pZCkKICAgICAgICAgICAgICAgICAgICBSRUZFUkVOQ0VTIHVzZXJzKHVzZXJfaWQpCiAgICAgICAgICAgICAgICAgICAgT04gREVMRVRFIENBU0NBREUKICAgICAgICAgICAgKQogICAgICAgICAgICAiIiIKICAgICAgICApCgogICAgZGVmIF9lbnN1cmVfb3JkZXJzX3NjaGVtYSgKICAgICAgICBzZWxmLAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICkgLT4gTm9uZToKICAgICAgICBpZiBub3Qgc2VsZi5fdGFibGVfZXhpc3RzKAogICAgICAgICAgICBjb25uLAogICAgICAgICAgICAib3JkZXJzIiwKICAgICAgICApOgogICAgICAgICAgICBzZWxmLl9jcmVhdGVfY2Fub25pY2FsX29yZGVycygKICAgICAgICAgICAgICAgIGNvbm4KICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGNvbHVtbnMgPSBzZWxmLl9jb2x1bW5fbmFtZXMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICJvcmRlcnMiLAogICAgICAgICkKCiAgICAgICAgcmVxdWlyZWRfYmFzZSA9IHsKICAgICAgICAgICAgImlkIiwKICAgICAgICAgICAgInVzZXJfaWQiLAogICAgICAgICAgICAicHJvZHVjdF9pZCIsCiAgICAgICAgICAgICJ0YXJnZXQiLAogICAgICAgICAgICAicHJpY2UiLAogICAgICAgICAgICAic3RhdHVzIiwKICAgICAgICAgICAgImdhdGV3YXkiLAogICAgICAgICAgICAibWFya2V0X29yZGVyX2lkIiwKICAgICAgICAgICAgImNyZWF0ZWRfYXQiLAogICAgICAgICAgICAidXBkYXRlZF9hdCIsCiAgICAgICAgfQoKICAgICAgICBjb3JyZWN0X2ZrID0gKAogICAgICAgICAgICBzZWxmLl9oYXNfdXNlcl9pZF9maygKICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICAib3JkZXJzIiwKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAgICAgaWYgKAogICAgICAgICAgICByZXF1aXJlZF9iYXNlLmlzc3Vic2V0KAogICAgICAgICAgICAgICAgY29sdW1ucwogICAgICAgICAgICApCiAgICAgICAgICAgIGFuZCBjb3JyZWN0X2ZrCiAgICAgICAgKToKICAgICAgICAgICAgYWRkaXRpb25zID0gewogICAgICAgICAgICAgICAgIm93bmVyX2lkIjoKICAgICAgICAgICAgICAgICAgICAiSU5URUdFUiIsCgogICAgICAgICAgICAgICAgInByb3ZpZGVyX3JlcXVpcmVkX3ByaWNlIjoKICAgICAgICAgICAgICAgICAgICAiSU5URUdFUiIsCgogICAgICAgICAgICAgICAgInByb3ZpZGVyX2Vycm9yIjoKICAgICAgICAgICAgICAgICAgICAiVEVYVCIsCgogICAgICAgICAgICAgICAgInByb3ZpZGVyX3N0YXJ0ZWRfYXQiOgogICAgICAgICAgICAgICAgICAgICJUSU1FU1RBTVAiLAoKICAgICAgICAgICAgICAgICJjb21wbGV0ZWRfYXQiOgogICAgICAgICAgICAgICAgICAgICJUSU1FU1RBTVAiLAoKICAgICAgICAgICAgICAgICJyZWZ1bmRlZF9hdCI6CiAgICAgICAgICAgICAgICAgICAgIlRJTUVTVEFNUCIsCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoCiAgICAgICAgICAgICAgICBjb2x1bW4sCiAgICAgICAgICAgICAgICBkZWZpbml0aW9uLAogICAgICAgICAgICApIGluIGFkZGl0aW9ucy5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgY29sdW1uIG5vdCBpbiBjb2x1bW5zOgogICAgICAgICAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFIG9yZGVycyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmIkFERCBDT0xVTU4ge2NvbHVtbn0ge2RlZmluaXRpb259IgogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGxlZ2FjeSA9ICgKICAgICAgICAgICAgIm9yZGVyc19sZWdhY3lfZGF0YWJhc2VfbWFuYWdlciIKICAgICAgICApCgogICAgICAgIGlmIHNlbGYuX3RhYmxlX2V4aXN0cygKICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgbGVnYWN5LAogICAgICAgICk6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgIGYie2xlZ2FjeX0gYWxyZWFkeSBleGlzdHMuIgogICAgICAgICAgICApCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFIG9yZGVycyAiCiAgICAgICAgICAgICAgICBmIlJFTkFNRSBUTyB7bGVnYWN5fSIKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAgICAgc2VsZi5fY3JlYXRlX2Nhbm9uaWNhbF9vcmRlcnMoCiAgICAgICAgICAgIGNvbm4KICAgICAgICApCgogICAgICAgIG9sZF9jb2x1bW5zID0gc2VsZi5fY29sdW1uX25hbWVzKAogICAgICAgICAgICBjb25uLAogICAgICAgICAgICBsZWdhY3ksCiAgICAgICAgKQoKICAgICAgICBuZXdfY29sdW1ucyA9IHNlbGYuX2NvbHVtbl9uYW1lcygKICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgIm9yZGVycyIsCiAgICAgICAgKQoKICAgICAgICBjb3B5X2NvbHVtbnMgPSBbCiAgICAgICAgICAgIGNvbHVtbgogICAgICAgICAgICBmb3IgY29sdW1uCiAgICAgICAgICAgIGluICgKICAgICAgICAgICAgICAgICJpZCIsCiAgICAgICAgICAgICAgICAidXNlcl9pZCIsCiAgICAgICAgICAgICAgICAicHJvZHVjdF9pZCIsCiAgICAgICAgICAgICAgICAidGFyZ2V0IiwKICAgICAgICAgICAgICAgICJwcmljZSIsCiAgICAgICAgICAgICAgICAic3RhdHVzIiwKICAgICAgICAgICAgICAgICJnYXRld2F5IiwKICAgICAgICAgICAgICAgICJtYXJrZXRfb3JkZXJfaWQiLAogICAgICAgICAgICAgICAgIm93bmVyX2lkIiwKICAgICAgICAgICAgICAgICJwcm92aWRlcl9yZXF1aXJlZF9wcmljZSIsCiAgICAgICAgICAgICAgICAicHJvdmlkZXJfZXJyb3IiLAogICAgICAgICAgICAgICAgInByb3ZpZGVyX3N0YXJ0ZWRfYXQiLAogICAgICAgICAgICAgICAgImNvbXBsZXRlZF9hdCIsCiAgICAgICAgICAgICAgICAicmVmdW5kZWRfYXQiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiLAogICAgICAgICAgICApCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGNvbHVtbiBpbiBvbGRfY29sdW1ucwogICAgICAgICAgICAgICAgYW5kIGNvbHVtbiBpbiBuZXdfY29sdW1ucwogICAgICAgICAgICApCiAgICAgICAgXQoKICAgICAgICBpZiBjb3B5X2NvbHVtbnM6CiAgICAgICAgICAgIG5hbWVzID0gIiwgIi5qb2luKAogICAgICAgICAgICAgICAgY29weV9jb2x1bW5zCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgIGYiIiIKICAgICAgICAgICAgICAgIElOU0VSVCBPUiBJR05PUkUgSU5UTyBvcmRlcnMgKAogICAgICAgICAgICAgICAgICAgIHtuYW1lc30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIFNFTEVDVAogICAgICAgICAgICAgICAgICAgIHtuYW1lc30KICAgICAgICAgICAgICAgIEZST00ge2xlZ2FjeX0KICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICApCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgZiJEUk9QIFRBQkxFIHtsZWdhY3l9IgogICAgICAgICkKCiAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICJSZXBhaXJlZCBvcmRlcnMgZm9yZWlnbiBrZXkgIgogICAgICAgICAgICAidG8gdXNlcnModXNlcl9pZCkuIgogICAgICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFdhbGxldCBUcmFuc2FjdGlvbnMgU2NoZW1hCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jcmVhdGVfY2Fub25pY2FsX3dhbGxldF90cmFuc2FjdGlvbnMoCiAgICAgICAgY29ubjogc3FsaXRlMy5Db25uZWN0aW9uLAogICAgKSAtPiBOb25lOgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHdhbGxldF90cmFuc2FjdGlvbnMgKAogICAgICAgICAgICAgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAoKICAgICAgICAgICAgICAgIHVzZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwKCiAgICAgICAgICAgICAgICB0eXBlIFRFWFQgTk9UIE5VTEwsCgogICAgICAgICAgICAgICAgYW1vdW50IElOVEVHRVIgTk9UIE5VTEwsCgogICAgICAgICAgICAgICAgYmFsYW5jZV9iZWZvcmUgSU5URUdFUiBOT1QgTlVMTCwKCiAgICAgICAgICAgICAgICBiYWxhbmNlX2FmdGVyIElOVEVHRVIgTk9UIE5VTEwsCgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gVEVYVCwKCiAgICAgICAgICAgICAgICByZWZlcmVuY2VfaWQgVEVYVCwKCiAgICAgICAgICAgICAgICBjcmVhdGVkX2F0IFRJTUVTVEFNUCBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsCgogICAgICAgICAgICAgICAgRk9SRUlHTiBLRVkgKHVzZXJfaWQpCiAgICAgICAgICAgICAgICAgICAgUkVGRVJFTkNFUyB1c2Vycyh1c2VyX2lkKQogICAgICAgICAgICAgICAgICAgIE9OIERFTEVURSBDQVNDQURFCiAgICAgICAgICAgICkKICAgICAgICAgICAgIiIiCiAgICAgICAgKQoKICAgIGRlZiBfZW5zdXJlX3dhbGxldF90cmFuc2FjdGlvbnNfc2NoZW1hKAogICAgICAgIHNlbGYsCiAgICAgICAgY29ubjogc3FsaXRlMy5Db25uZWN0aW9uLAogICAgKSAtPiBOb25lOgogICAgICAgIGlmIG5vdCBzZWxmLl90YWJsZV9leGlzdHMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICJ3YWxsZXRfdHJhbnNhY3Rpb25zIiwKICAgICAgICApOgogICAgICAgICAgICBzZWxmLl9jcmVhdGVfY2Fub25pY2FsX3dhbGxldF90cmFuc2FjdGlvbnMoCiAgICAgICAgICAgICAgICBjb25uCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBjb2x1bW5zID0gc2VsZi5fY29sdW1uX25hbWVzKAogICAgICAgICAgICBjb25uLAogICAgICAgICAgICAid2FsbGV0X3RyYW5zYWN0aW9ucyIsCiAgICAgICAgKQoKICAgICAgICByZXF1aXJlZCA9IHsKICAgICAgICAgICAgImlkIiwKICAgICAgICAgICAgInVzZXJfaWQiLAogICAgICAgICAgICAidHlwZSIsCiAgICAgICAgICAgICJhbW91bnQiLAogICAgICAgICAgICAiYmFsYW5jZV9iZWZvcmUiLAogICAgICAgICAgICAiYmFsYW5jZV9hZnRlciIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICJyZWZlcmVuY2VfaWQiLAogICAgICAgICAgICAiY3JlYXRlZF9hdCIsCiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgIHJlcXVpcmVkLmlzc3Vic2V0KAogICAgICAgICAgICAgICAgY29sdW1ucwogICAgICAgICAgICApCiAgICAgICAgICAgIGFuZCBzZWxmLl9oYXNfdXNlcl9pZF9maygKICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICAid2FsbGV0X3RyYW5zYWN0aW9ucyIsCiAgICAgICAgICAgICkKICAgICAgICApOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbGVnYWN5ID0gKAogICAgICAgICAgICAid2FsbGV0X3RyYW5zYWN0aW9uc19sZWdhY3lfZGF0YWJhc2VfbWFuYWdlciIKICAgICAgICApCgogICAgICAgIGlmIHNlbGYuX3RhYmxlX2V4aXN0cygKICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgbGVnYWN5LAogICAgICAgICk6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgIGYie2xlZ2FjeX0gYWxyZWFkeSBleGlzdHMuIgogICAgICAgICAgICApCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFIHdhbGxldF90cmFuc2FjdGlvbnMgIgogICAgICAgICAgICAgICAgZiJSRU5BTUUgVE8ge2xlZ2FjeX0iCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIHNlbGYuX2NyZWF0ZV9jYW5vbmljYWxfd2FsbGV0X3RyYW5zYWN0aW9ucygKICAgICAgICAgICAgY29ubgogICAgICAgICkKCiAgICAgICAgb2xkX2NvbHVtbnMgPSBzZWxmLl9jb2x1bW5fbmFtZXMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgIGxlZ2FjeSwKICAgICAgICApCgogICAgICAgIG5ld19jb2x1bW5zID0gc2VsZi5fY29sdW1uX25hbWVzKAogICAgICAgICAgICBjb25uLAogICAgICAgICAgICAid2FsbGV0X3RyYW5zYWN0aW9ucyIsCiAgICAgICAgKQoKICAgICAgICBjb3B5X2NvbHVtbnMgPSBbCiAgICAgICAgICAgIGNvbHVtbgogICAgICAgICAgICBmb3IgY29sdW1uCiAgICAgICAgICAgIGluICgKICAgICAgICAgICAgICAgICJpZCIsCiAgICAgICAgICAgICAgICAidXNlcl9pZCIsCiAgICAgICAgICAgICAgICAidHlwZSIsCiAgICAgICAgICAgICAgICAiYW1vdW50IiwKICAgICAgICAgICAgICAgICJiYWxhbmNlX2JlZm9yZSIsCiAgICAgICAgICAgICAgICAiYmFsYW5jZV9hZnRlciIsCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZV9pZCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgY29sdW1uIGluIG9sZF9jb2x1bW5zCiAgICAgICAgICAgICAgICBhbmQgY29sdW1uIGluIG5ld19jb2x1bW5zCiAgICAgICAgICAgICkKICAgICAgICBdCgogICAgICAgIGlmIGNvcHlfY29sdW1uczoKICAgICAgICAgICAgbmFtZXMgPSAiLCAiLmpvaW4oCiAgICAgICAgICAgICAgICBjb3B5X2NvbHVtbnMKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgZiIiIgogICAgICAgICAgICAgICAgSU5TRVJUIE9SIElHTk9SRSBJTlRPIHdhbGxldF90cmFuc2FjdGlvbnMgKAogICAgICAgICAgICAgICAgICAgIHtuYW1lc30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIFNFTEVDVAogICAgICAgICAgICAgICAgICAgIHtuYW1lc30KICAgICAgICAgICAgICAgIEZST00ge2xlZ2FjeX0KICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICApCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgZiJEUk9QIFRBQkxFIHtsZWdhY3l9IgogICAgICAgICkKCiAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICJSZXBhaXJlZCB3YWxsZXRfdHJhbnNhY3Rpb25zIGZvcmVpZ24ga2V5ICIKICAgICAgICAgICAgInRvIHVzZXJzKHVzZXJfaWQpLiIKICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBSZWZlcnJhbHMgU2NoZW1hCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jcmVhdGVfY2Fub25pY2FsX3JlZmVycmFscygKICAgICAgICBjb25uOiBzcWxpdGUzLkNvbm5lY3Rpb24sCiAgICApIC0+IE5vbmU6CiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAiIiIKICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgcmVmZXJyYWxzICgKICAgICAgICAgICAgICAgIGlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKCiAgICAgICAgICAgICAgICByZWZlcnJlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLAoKICAgICAgICAgICAgICAgIHJlZmVycmVkX2lkIElOVEVHRVIgTk9UIE5VTEwsCgogICAgICAgICAgICAgICAgcmV3YXJkX2Vhcm5lZCBJTlRFR0VSIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCAwLAoKICAgICAgICAgICAgICAgIGNyZWF0ZWRfYXQgVElNRVNUQU1QIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwKCiAgICAgICAgICAgICAgICBGT1JFSUdOIEtFWSAocmVmZXJyZXJfaWQpCiAgICAgICAgICAgICAgICAgICAgUkVGRVJFTkNFUyB1c2Vycyh1c2VyX2lkKQogICAgICAgICAgICAgICAgICAgIE9OIERFTEVURSBDQVNDQURFLAoKICAgICAgICAgICAgICAgIEZPUkVJR04gS0VZIChyZWZlcnJlZF9pZCkKICAgICAgICAgICAgICAgICAgICBSRUZFUkVOQ0VTIHVzZXJzKHVzZXJfaWQpCiAgICAgICAgICAgICAgICAgICAgT04gREVMRVRFIENBU0NBREUKICAgICAgICAgICAgKQogICAgICAgICAgICAiIiIKICAgICAgICApCgogICAgZGVmIF9lbnN1cmVfcmVmZXJyYWxzX3NjaGVtYSgKICAgICAgICBzZWxmLAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICkgLT4gTm9uZToKICAgICAgICBpZiBub3Qgc2VsZi5fdGFibGVfZXhpc3RzKAogICAgICAgICAgICBjb25uLAogICAgICAgICAgICAicmVmZXJyYWxzIiwKICAgICAgICApOgogICAgICAgICAgICBzZWxmLl9jcmVhdGVfY2Fub25pY2FsX3JlZmVycmFscygKICAgICAgICAgICAgICAgIGNvbm4KICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGNvbHVtbnMgPSBzZWxmLl9jb2x1bW5fbmFtZXMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICJyZWZlcnJhbHMiLAogICAgICAgICkKCiAgICAgICAgcmVxdWlyZWQgPSB7CiAgICAgICAgICAgICJpZCIsCiAgICAgICAgICAgICJyZWZlcnJlcl9pZCIsCiAgICAgICAgICAgICJyZWZlcnJlZF9pZCIsCiAgICAgICAgICAgICJyZXdhcmRfZWFybmVkIiwKICAgICAgICAgICAgImNyZWF0ZWRfYXQiLAogICAgICAgIH0KCiAgICAgICAgZmtzID0gc2VsZi5fZm9yZWlnbl9rZXlzKAogICAgICAgICAgICBjb25uLAogICAgICAgICAgICAicmVmZXJyYWxzIiwKICAgICAgICApCgogICAgICAgIGNvcnJlY3RfcmVmZXJyZXIgPSBhbnkoCiAgICAgICAgICAgIHN0cihyb3dbInRhYmxlIl0pID09ICJ1c2VycyIKICAgICAgICAgICAgYW5kIHN0cihyb3dbImZyb20iXSkgPT0gInJlZmVycmVyX2lkIgogICAgICAgICAgICBhbmQgc3RyKHJvd1sidG8iXSkgPT0gInVzZXJfaWQiCiAgICAgICAgICAgIGZvciByb3cgaW4gZmtzCiAgICAgICAgKQoKICAgICAgICBjb3JyZWN0X3JlZmVycmVkID0gYW55KAogICAgICAgICAgICBzdHIocm93WyJ0YWJsZSJdKSA9PSAidXNlcnMiCiAgICAgICAgICAgIGFuZCBzdHIocm93WyJmcm9tIl0pID09ICJyZWZlcnJlZF9pZCIKICAgICAgICAgICAgYW5kIHN0cihyb3dbInRvIl0pID09ICJ1c2VyX2lkIgogICAgICAgICAgICBmb3Igcm93IGluIGZrcwogICAgICAgICkKCiAgICAgICAgaWYgKAogICAgICAgICAgICByZXF1aXJlZC5pc3N1YnNldCgKICAgICAgICAgICAgICAgIGNvbHVtbnMKICAgICAgICAgICAgKQogICAgICAgICAgICBhbmQgY29ycmVjdF9yZWZlcnJlcgogICAgICAgICAgICBhbmQgY29ycmVjdF9yZWZlcnJlZAogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBsZWdhY3kgPSAoCiAgICAgICAgICAgICJyZWZlcnJhbHNfbGVnYWN5X2RhdGFiYXNlX21hbmFnZXIiCiAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLl90YWJsZV9leGlzdHMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgIGxlZ2FjeSwKICAgICAgICApOgogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICBmIntsZWdhY3l9IGFscmVhZHkgZXhpc3RzLiIKICAgICAgICAgICAgKQoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICJBTFRFUiBUQUJMRSByZWZlcnJhbHMgIgogICAgICAgICAgICAgICAgZiJSRU5BTUUgVE8ge2xlZ2FjeX0iCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIHNlbGYuX2NyZWF0ZV9jYW5vbmljYWxfcmVmZXJyYWxzKAogICAgICAgICAgICBjb25uCiAgICAgICAgKQoKICAgICAgICBvbGRfY29sdW1ucyA9IHNlbGYuX2NvbHVtbl9uYW1lcygKICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgbGVnYWN5LAogICAgICAgICkKCiAgICAgICAgY29weV9jb2x1bW5zID0gWwogICAgICAgICAgICBjb2x1bW4KICAgICAgICAgICAgZm9yIGNvbHVtbgogICAgICAgICAgICBpbiAoCiAgICAgICAgICAgICAgICAiaWQiLAogICAgICAgICAgICAgICAgInJlZmVycmVyX2lkIiwKICAgICAgICAgICAgICAgICJyZWZlcnJlZF9pZCIsCiAgICAgICAgICAgICAgICAicmV3YXJkX2Vhcm5lZCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgY29sdW1uIGluIG9sZF9jb2x1bW5zCiAgICAgICAgXQoKICAgICAgICBpZiBjb3B5X2NvbHVtbnM6CiAgICAgICAgICAgIG5hbWVzID0gIiwgIi5qb2luKAogICAgICAgICAgICAgICAgY29weV9jb2x1bW5zCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgIGYiIiIKICAgICAgICAgICAgICAgIElOU0VSVCBPUiBJR05PUkUgSU5UTyByZWZlcnJhbHMgKAogICAgICAgICAgICAgICAgICAgIHtuYW1lc30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIFNFTEVDVAogICAgICAgICAgICAgICAgICAgIHtuYW1lc30KICAgICAgICAgICAgICAgIEZST00ge2xlZ2FjeX0KICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICApCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgZiJEUk9QIFRBQkxFIHtsZWdhY3l9IgogICAgICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEtZQyAvIEF1ZGl0IC8gRmluYW5jZSBTY2hlbWEKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2Vuc3VyZV9reWNfc2NoZW1hKAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICkgLT4gTm9uZToKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBreWNfcmVxdWVzdHMgKAogICAgICAgICAgICAgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAoKICAgICAgICAgICAgICAgIHVzZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwKCiAgICAgICAgICAgICAgICBmaWxlX2lkIFRFWFQgTk9UIE5VTEwsCgogICAgICAgICAgICAgICAgc3RhdHVzIFRFWFQgTk9UIE5VTEwKICAgICAgICAgICAgICAgICAgICBERUZBVUxUICdwZW5kaW5nJywKCiAgICAgICAgICAgICAgICByZXZpZXdlZF9ieSBJTlRFR0VSLAoKICAgICAgICAgICAgICAgIHJlamVjdGlvbl9yZWFzb24gVEVYVCwKCiAgICAgICAgICAgICAgICB3YXJuaW5nX3RleHQgVEVYVCwKCiAgICAgICAgICAgICAgICBjcmVhdGVkX2F0IFRJTUVTVEFNUCBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsCgogICAgICAgICAgICAgICAgcmV2aWV3ZWRfYXQgVElNRVNUQU1QLAoKICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgVElNRVNUQU1QIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwKCiAgICAgICAgICAgICAgICBGT1JFSUdOIEtFWSAodXNlcl9pZCkKICAgICAgICAgICAgICAgICAgICBSRUZFUkVOQ0VTIHVzZXJzKHVzZXJfaWQpCiAgICAgICAgICAgICAgICAgICAgT04gREVMRVRFIENBU0NBREUKICAgICAgICAgICAgKQogICAgICAgICAgICAiIiIKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9lbnN1cmVfYXVkaXRfc2NoZW1hKAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICkgLT4gTm9uZToKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBhdWRpdF9sb2dzICgKICAgICAgICAgICAgICAgIGxvZ19pZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCgogICAgICAgICAgICAgICAgdXNlcl9pZCBJTlRFR0VSLAoKICAgICAgICAgICAgICAgIGFjdGlvbiBURVhUIE5PVCBOVUxMLAoKICAgICAgICAgICAgICAgIGRldGFpbHMgVEVYVCwKCiAgICAgICAgICAgICAgICBpcF9hZGRyZXNzIFRFWFQsCgogICAgICAgICAgICAgICAgY3JlYXRlZF9hdCBUSU1FU1RBTVAgTk9UIE5VTEwKICAgICAgICAgICAgICAgICAgICBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICkKICAgICAgICAgICAgIiIiCiAgICAgICAgKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZW5zdXJlX2ZpbmFuY2Vfc2NoZW1hKAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICkgLT4gTm9uZToKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBib3RfZmluYW5jZV9yYXRlcyAoCiAgICAgICAgICAgICAgICByYXRlX2tleSBURVhUIFBSSU1BUlkgS0VZLAoKICAgICAgICAgICAgICAgIHJhdGVfdmFsdWUgVEVYVCBOT1QgTlVMTCwKCiAgICAgICAgICAgICAgICBzb3VyY2UgVEVYVCBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgJ2FkbWluJywKCiAgICAgICAgICAgICAgICB1cGRhdGVkX2F0IFRJTUVTVEFNUCBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgKQogICAgICAgICAgICAiIiIKICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBJbmRleGVzCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jcmVhdGVfaW5kZXhlcygKICAgICAgICBjb25uOiBzcWxpdGUzLkNvbm5lY3Rpb24sCiAgICApIC0+IE5vbmU6CiAgICAgICAgc3RhdGVtZW50cyA9IFsKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTCiAgICAgICAgICAgIGlkeF91c2Vyc191c2VybmFtZQogICAgICAgICAgICBPTiB1c2Vycyh1c2VybmFtZSkKICAgICAgICAgICAgIiIiLAoKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTCiAgICAgICAgICAgIGlkeF91c2Vyc19pbnZpdGVkX2J5CiAgICAgICAgICAgIE9OIHVzZXJzKGludml0ZWRfYnkpCiAgICAgICAgICAgICIiIiwKCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUwogICAgICAgICAgICBpZHhfb3JkZXJzX3VzZXJfaWQKICAgICAgICAgICAgT04gb3JkZXJzKHVzZXJfaWQpCiAgICAgICAgICAgICIiIiwKCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUwogICAgICAgICAgICBpZHhfb3JkZXJzX3N0YXR1cwogICAgICAgICAgICBPTiBvcmRlcnMoc3RhdHVzKQogICAgICAgICAgICAiIiIsCgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMKICAgICAgICAgICAgaWR4X29yZGVyc191c2VyX3N0YXR1cwogICAgICAgICAgICBPTiBvcmRlcnModXNlcl9pZCwgc3RhdHVzKQogICAgICAgICAgICAiIiIsCgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMKICAgICAgICAgICAgaWR4X29yZGVyc19jcmVhdGVkX2F0CiAgICAgICAgICAgIE9OIG9yZGVycyhjcmVhdGVkX2F0KQogICAgICAgICAgICAiIiIsCgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMKICAgICAgICAgICAgaWR4X29yZGVyc19tYXJrZXRfb3JkZXJfaWQKICAgICAgICAgICAgT04gb3JkZXJzKG1hcmtldF9vcmRlcl9pZCkKICAgICAgICAgICAgIiIiLAoKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTCiAgICAgICAgICAgIGlkeF93YWxsZXRfdHJhbnNhY3Rpb25zX3VzZXJfaWQKICAgICAgICAgICAgT04gd2FsbGV0X3RyYW5zYWN0aW9ucyh1c2VyX2lkKQogICAgICAgICAgICAiIiIsCgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMKICAgICAgICAgICAgaWR4X3dhbGxldF90cmFuc2FjdGlvbnNfcmVmZXJlbmNlCiAgICAgICAgICAgIE9OIHdhbGxldF90cmFuc2FjdGlvbnMocmVmZXJlbmNlX2lkKQogICAgICAgICAgICAiIiIsCgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMKICAgICAgICAgICAgaWR4X3JlZmVycmFsc19yZWZlcnJlcgogICAgICAgICAgICBPTiByZWZlcnJhbHMocmVmZXJyZXJfaWQpCiAgICAgICAgICAgICIiIiwKCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUwogICAgICAgICAgICBpZHhfcmVmZXJyYWxzX3JlZmVycmVkCiAgICAgICAgICAgIE9OIHJlZmVycmFscyhyZWZlcnJlZF9pZCkKICAgICAgICAgICAgIiIiLAoKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTCiAgICAgICAgICAgIGlkeF9reWNfcmVxdWVzdHNfdXNlcl9zdGF0dXMKICAgICAgICAgICAgT04ga3ljX3JlcXVlc3RzKHVzZXJfaWQsIHN0YXR1cykKICAgICAgICAgICAgIiIiLAoKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTCiAgICAgICAgICAgIGlkeF9reWNfcmVxdWVzdHNfc3RhdHVzCiAgICAgICAgICAgIE9OIGt5Y19yZXF1ZXN0cyhzdGF0dXMpCiAgICAgICAgICAgICIiIiwKICAgICAgICBdCgogICAgICAgIGZvciBzdGF0ZW1lbnQgaW4gc3RhdGVtZW50czoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgc3RhdGVtZW50CiAgICAgICAgICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFVzZXIgSGVscGVycwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY2xlYW5fdXNlcm5hbWUoCiAgICAgICAgdXNlcm5hbWU6IE9wdGlvbmFsW3N0cl0sCiAgICApIC0+IE9wdGlvbmFsW3N0cl06CiAgICAgICAgaWYgdXNlcm5hbWUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgdmFsdWUgPSBzdHIoCiAgICAgICAgICAgIHVzZXJuYW1lCiAgICAgICAgKS5zdHJpcCgpCgogICAgICAgIGlmIHZhbHVlIGluIHsKICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICLZhtiv2KfYsdivIiwKICAgICAgICAgICAgIm5vbmUiLAogICAgICAgICAgICAiTm9uZSIsCiAgICAgICAgfToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgaWYgdmFsdWUuc3RhcnRzd2l0aCgiQCIpOgogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzE6XQoKICAgICAgICByZXR1cm4gdmFsdWUgb3IgTm9uZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY2xlYW5fZnVsbF9uYW1lKAogICAgICAgIGZ1bGxfbmFtZTogT3B0aW9uYWxbc3RyXSwKICAgICkgLT4gT3B0aW9uYWxbc3RyXToKICAgICAgICBpZiBmdWxsX25hbWUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgdmFsdWUgPSBzdHIoCiAgICAgICAgICAgIGZ1bGxfbmFtZQogICAgICAgICkuc3RyaXAoKQoKICAgICAgICBpZiB2YWx1ZSBpbiB7CiAgICAgICAgICAgICIiLAogICAgICAgICAgICAi2KjYr9mI2YYg2YbYp9mFIiwKICAgICAgICB9OgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICByZXR1cm4gdmFsdWUgb3IgTm9uZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdXNlcl9yb3dfdG9fZGljdCgKICAgICAgICByb3c6IHNxbGl0ZTMuUm93LAogICAgKSAtPiBkaWN0W3N0ciwgQW55XToKICAgICAgICBkYXRhID0gZGljdCgKICAgICAgICAgICAgcm93CiAgICAgICAgKQoKICAgICAgICB1c2VyX2lkID0gaW50KAogICAgICAgICAgICBkYXRhLmdldCgKICAgICAgICAgICAgICAgICJ1c2VyX2lkIiwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICkKICAgICAgICAgICAgb3IgMAogICAgICAgICkKCiAgICAgICAgaXNfYWRtaW4gPSBib29sKAogICAgICAgICAgICBpbnQoCiAgICAgICAgICAgICAgICBkYXRhLmdldCgKICAgICAgICAgICAgICAgICAgICAiaXNfYWRtaW4iLAogICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIGlzX2Jhbm5lZCA9IGJvb2woCiAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KAogICAgICAgICAgICAgICAgICAgICJpc19iYW5uZWQiLAogICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIGlzX2t5Y192ZXJpZmllZCA9IGJvb2woCiAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KAogICAgICAgICAgICAgICAgICAgICJpc19reWNfdmVyaWZpZWQiLAogICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgICMgQ29tcGF0aWJpbGl0eSBhbGlhc2VzIGZvciBvbGRlciBoYW5kbGVycy9taWRkbGV3YXJlLgogICAgICAgIGRhdGFbImlkIl0gPSB1c2VyX2lkCiAgICAgICAgZGF0YVsidXNlcl9pZCJdID0gdXNlcl9pZAoKICAgICAgICBkYXRhWyJpc19hZG1pbiJdID0gaXNfYWRtaW4KICAgICAgICBkYXRhWyJpc19iYW5uZWQiXSA9IGlzX2Jhbm5lZAogICAgICAgIGRhdGFbImlzX2Jsb2NrZWQiXSA9IGlzX2Jhbm5lZAoKICAgICAgICBkYXRhWyJpc19hY3RpdmUiXSA9ICgKICAgICAgICAgICAgbm90IGlzX2Jhbm5lZAogICAgICAgICkKCiAgICAgICAgZGF0YVsicm9sZSJdID0gKAogICAgICAgICAgICAiYWRtaW4iCiAgICAgICAgICAgIGlmIGlzX2FkbWluCiAgICAgICAgICAgIGVsc2UgInVzZXIiCiAgICAgICAgKQoKICAgICAgICBkYXRhWyJ0aWVyIl0gPSBzdHIoCiAgICAgICAgICAgIGRhdGEuZ2V0KAogICAgICAgICAgICAgICAgInVzZXJfdGllciIsCiAgICAgICAgICAgICAgICAic3RhbmRhcmQiLAogICAgICAgICAgICApCiAgICAgICAgICAgIG9yICJzdGFuZGFyZCIKICAgICAgICApCgogICAgICAgIGRhdGFbImt5Y19zdGF0dXMiXSA9ICgKICAgICAgICAgICAgImFwcHJvdmVkIgogICAgICAgICAgICBpZiBpc19reWNfdmVyaWZpZWQKICAgICAgICAgICAgZWxzZSAibm9uZSIKICAgICAgICApCgogICAgICAgIHJldHVybiBkYXRhCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBDcmVhdGUgLyBVcHNlcnQgVXNlcgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGRlZiBjcmVhdGVfdXNlcigKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICB1c2VybmFtZTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICAgICAgZmlyc3RfbmFtZTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICAgICAgbGFzdF9uYW1lOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgICkgLT4gYm9vbDoKICAgICAgICBhd2FpdCBzZWxmLl9lbnN1cmVfaW5pdGlhbGl6ZWQoKQoKICAgICAgICBmdWxsX25hbWUgPSAiICIuam9pbigKICAgICAgICAgICAgcGFydAogICAgICAgICAgICBmb3IgcGFydAogICAgICAgICAgICBpbiAoCiAgICAgICAgICAgICAgICBzdHIoZmlyc3RfbmFtZSBvciAiIikuc3RyaXAoKSwKICAgICAgICAgICAgICAgIHN0cihsYXN0X25hbWUgb3IgIiIpLnN0cmlwKCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgcGFydAogICAgICAgICkgb3IgTm9uZQoKICAgICAgICByZXR1cm4gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV91c2VyX3N5bmMsCiAgICAgICAgICAgIGludCh1c2VyX2lkKSwKICAgICAgICAgICAgc2VsZi5fY2xlYW5fdXNlcm5hbWUoCiAgICAgICAgICAgICAgICB1c2VybmFtZQogICAgICAgICAgICApLAogICAgICAgICAgICBmdWxsX25hbWUsCiAgICAgICAgKQoKICAgIGRlZiBfY3JlYXRlX3VzZXJfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICB1c2VybmFtZTogT3B0aW9uYWxbc3RyXSwKICAgICAgICBmdWxsX25hbWU6IE9wdGlvbmFsW3N0cl0sCiAgICApIC0+IGJvb2w6CiAgICAgICAgaWYgdXNlcl9pZCA8PSAwOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gdXNlcnMgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZnVsbF9uYW1lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBWQUxVRVMgKD8sID8sID8pCgogICAgICAgICAgICAgICAgT04gQ09ORkxJQ1QodXNlcl9pZCkKICAgICAgICAgICAgICAgIERPIFVQREFURSBTRVQKICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSA9IGV4Y2x1ZGVkLnVzZXJuYW1lLAogICAgICAgICAgICAgICAgICAgIGZ1bGxfbmFtZSA9IGV4Y2x1ZGVkLmZ1bGxfbmFtZSwKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkX2F0ID0gQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lLAogICAgICAgICAgICAgICAgICAgIGZ1bGxfbmFtZSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlL3VwZGF0ZSB1c2VyICVzIiwKICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBhc3luYyBkZWYgdXBzZXJ0X3VzZXJfYWN0aXZpdHkoCiAgICAgICAgc2VsZiwKICAgICAgICAqLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICB1c2VybmFtZTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICAgICAgZnVsbF9uYW1lOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgICAgICByZWZlcnJlcl9pZDogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICApIC0+IGJvb2w6CiAgICAgICAgIiIiCiAgICAgICAgQmFja3dhcmQtY29tcGF0aWJsZSAvc3RhcnQgdXBzZXJ0LgoKICAgICAgICBSZWZlcnJhbCBydWxlczoKICAgICAgICAgICAgLSBvbmx5IHdoZW4gdGhlIHVzZXIgaXMgZmlyc3QgY3JlYXRlZDsKICAgICAgICAgICAgLSBzZWxmLXJlZmVycmFsIGlzIHJlamVjdGVkOwogICAgICAgICAgICAtIHJlZmVycmVyIG11c3QgYWxyZWFkeSBleGlzdDsKICAgICAgICAgICAgLSBpbnZpdGVyIGNhbiBuZXZlciBiZSByZXBsYWNlZCBsYXRlcjsKICAgICAgICAgICAgLSB1c2Vycy5pbnZpdGVkX2J5IGFuZCByZWZlcnJhbHMgYXJlIHdyaXR0ZW4gYXRvbWljYWxseS4KICAgICAgICAiIiIKICAgICAgICBhd2FpdCBzZWxmLl9lbnN1cmVfaW5pdGlhbGl6ZWQoKQoKICAgICAgICByZXR1cm4gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgICAgIHNlbGYuX3Vwc2VydF91c2VyX2FjdGl2aXR5X3N5bmMsCiAgICAgICAgICAgIGludCh1c2VyX2lkKSwKICAgICAgICAgICAgc2VsZi5fY2xlYW5fdXNlcm5hbWUoCiAgICAgICAgICAgICAgICB1c2VybmFtZQogICAgICAgICAgICApLAogICAgICAgICAgICBzZWxmLl9jbGVhbl9mdWxsX25hbWUoCiAgICAgICAgICAgICAgICBmdWxsX25hbWUKICAgICAgICAgICAgKSwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaW50KHJlZmVycmVyX2lkKQogICAgICAgICAgICAgICAgaWYgcmVmZXJyZXJfaWQgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgIGVsc2UgTm9uZQogICAgICAgICAgICApLAogICAgICAgICkKCiAgICBkZWYgX3Vwc2VydF91c2VyX2FjdGl2aXR5X3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgdXNlcm5hbWU6IE9wdGlvbmFsW3N0cl0sCiAgICAgICAgZnVsbF9uYW1lOiBPcHRpb25hbFtzdHJdLAogICAgICAgIHJlZmVycmVyX2lkOiBPcHRpb25hbFtpbnRdLAogICAgKSAtPiBib29sOgogICAgICAgIGlmIHVzZXJfaWQgPD0gMDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiQkVHSU4gSU1NRURJQVRFIgogICAgICAgICAgICApCgogICAgICAgICAgICBleGlzdGluZyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICAgICBpbnZpdGVkX2J5CiAgICAgICAgICAgICAgICBGUk9NIHVzZXJzCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgIGlmIGV4aXN0aW5nOgogICAgICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgICAgIFVQREFURSB1c2VycwogICAgICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfbmFtZSA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPSBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAgICAgdmFsaWRfcmVmZXJyZXI6IE9wdGlvbmFsWwogICAgICAgICAgICAgICAgaW50CiAgICAgICAgICAgIF0gPSBOb25lCgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICByZWZlcnJlcl9pZCBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgYW5kIHJlZmVycmVyX2lkID4gMAogICAgICAgICAgICAgICAgYW5kIHJlZmVycmVyX2lkICE9IHVzZXJfaWQKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHJlZmVycmVyID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgICAgIFNFTEVDVAogICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgICAgICBpc19iYW5uZWQKICAgICAgICAgICAgICAgICAgICBGUk9NIHVzZXJzCiAgICAgICAgICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgICAgICBMSU1JVCAxCiAgICAgICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWZlcnJlcgogICAgICAgICAgICAgICAgICAgIGFuZCBpbnQoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVycmVyWyJpc19iYW5uZWQiXQogICAgICAgICAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICAgICAgICAgKSA9PSAwCiAgICAgICAgICAgICAgICApOgogICAgICAgICAgICAgICAgICAgIHZhbGlkX3JlZmVycmVyID0gKAogICAgICAgICAgICAgICAgICAgICAgICByZWZlcnJlcl9pZAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gdXNlcnMgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZnVsbF9uYW1lLAogICAgICAgICAgICAgICAgICAgIGludml0ZWRfYnkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPywgPykKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lLAogICAgICAgICAgICAgICAgICAgIGZ1bGxfbmFtZSwKICAgICAgICAgICAgICAgICAgICB2YWxpZF9yZWZlcnJlciwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIHZhbGlkX3JlZmVycmVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVmZXJyYWwgPSAoCiAgICAgICAgICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIDEKICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSByZWZlcnJhbHMKICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgcmVmZXJyZWRfaWQgPSA/CiAgICAgICAgICAgICAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGlmIG5vdCBleGlzdGluZ19yZWZlcnJhbDoKICAgICAgICAgICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyByZWZlcnJhbHMgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcnJlZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld2FyZF9lYXJuZWQKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBWQUxVRVMgKD8sID8sIDApCiAgICAgICAgICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfcmVmZXJyZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgdXBzZXJ0IHVzZXIgYWN0aXZpdHkgfCAiCiAgICAgICAgICAgICAgICAidXNlcj0lcyByZWZlcnJlcj0lcyIsCiAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgcmVmZXJyZXJfaWQsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEdldCBVc2VyIC8gQXV0aCBDb250ZXh0CiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYXN5bmMgZGVmIGdldF91c2VyKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgKSAtPiBPcHRpb25hbFtkaWN0W3N0ciwgQW55XV06CiAgICAgICAgYXdhaXQgc2VsZi5fZW5zdXJlX2luaXRpYWxpemVkKCkKCiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBzZWxmLl9nZXRfdXNlcl9zeW5jLAogICAgICAgICAgICBpbnQodXNlcl9pZCksCiAgICAgICAgKQoKICAgIGRlZiBfZ2V0X3VzZXJfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICkgLT4gT3B0aW9uYWxbZGljdFtzdHIsIEFueV1dOgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFNFTEVDVCAqCiAgICAgICAgICAgICAgICBGUk9NIHVzZXJzCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgIGlmIG5vdCByb3c6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3VzZXJfcm93X3RvX2RpY3QoCiAgICAgICAgICAgICAgICByb3cKICAgICAgICAgICAgKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBhc3luYyBkZWYgZ2V0X3VzZXJfYXV0aF9jb250ZXh0KAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgKSAtPiBPcHRpb25hbFtkaWN0W3N0ciwgQW55XV06CiAgICAgICAgdXNlciA9IGF3YWl0IHNlbGYuZ2V0X3VzZXIoCiAgICAgICAgICAgIHVzZXJfaWQKICAgICAgICApCgogICAgICAgIGlmIHVzZXIgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAga3ljX3N0YXR1cyA9ICgKICAgICAgICAgICAgYXdhaXQgc2VsZi5nZXRfdXNlcl9reWNfc3RhdHVzKAogICAgICAgICAgICAgICAgdXNlcl9pZAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICAgICB1c2VyWwogICAgICAgICAgICAia3ljX3N0YXR1cyIKICAgICAgICBdID0ga3ljX3N0YXR1cwoKICAgICAgICByZXR1cm4gdXNlcgoKICAgIGFzeW5jIGRlZiBnZXRfdXNlcl9yb2xlKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgKSAtPiBPcHRpb25hbFtkaWN0W3N0ciwgQW55XV06CiAgICAgICAgIiIiCiAgICAgICAgSGlzdG9yaWNhbCBtZXRob2QgbmFtZSByZXRhaW5lZC4KCiAgICAgICAgSXQgcmV0dXJucyB0aGUgcmljaCB1c2VyIGRpY3QgZXhwZWN0ZWQgYnkgb2xkZXIgd2FsbGV0IGhhbmRsZXJzLAogICAgICAgIG5vdCBtZXJlbHkgYSBzdHJpbmcuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuZ2V0X3VzZXIoCiAgICAgICAgICAgIHVzZXJfaWQKICAgICAgICApCgogICAgYXN5bmMgZGVmIHNldF91c2VyX3JvbGUoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgcm9sZTogc3RyLAogICAgKSAtPiBib29sOgogICAgICAgIGF3YWl0IHNlbGYuX2Vuc3VyZV9pbml0aWFsaXplZCgpCgogICAgICAgIHJvbGUgPSBzdHIoCiAgICAgICAgICAgIHJvbGUKICAgICAgICAgICAgb3IgIiIKICAgICAgICApLnN0cmlwKCkubG93ZXIoKQoKICAgICAgICBpZiByb2xlIG5vdCBpbiB7CiAgICAgICAgICAgICJ1c2VyIiwKICAgICAgICAgICAgIm1lbWJlciIsCiAgICAgICAgICAgICJhZG1pbiIsCiAgICAgICAgICAgICJhZG1pbmlzdHJhdG9yIiwKICAgICAgICAgICAgIm93bmVyIiwKICAgICAgICB9OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgaXNfYWRtaW4gPSAoCiAgICAgICAgICAgIDEKICAgICAgICAgICAgaWYgcm9sZSBpbiB7CiAgICAgICAgICAgICAgICAiYWRtaW4iLAogICAgICAgICAgICAgICAgImFkbWluaXN0cmF0b3IiLAogICAgICAgICAgICAgICAgIm93bmVyIiwKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIDAKICAgICAgICApCgogICAgICAgIHJldHVybiBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgc2VsZi5fc2V0X3VzZXJfYWRtaW5fc3luYywKICAgICAgICAgICAgaW50KHVzZXJfaWQpLAogICAgICAgICAgICBpc19hZG1pbiwKICAgICAgICApCgogICAgZGVmIF9zZXRfdXNlcl9hZG1pbl9zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgICAgIGlzX2FkbWluOiBpbnQsCiAgICApIC0+IGJvb2w6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1cnNvciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgVVBEQVRFIHVzZXJzCiAgICAgICAgICAgICAgICBTRVQKICAgICAgICAgICAgICAgICAgICBpc19hZG1pbiA9ID8sCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2FkbWluCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgY3Vyc29yLnJvd2NvdW50ID09IDEKICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKCiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBhZG1pbiByb2xlIHwgdXNlcj0lcyIsCiAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICApCgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgYXN5bmMgZGVmIGdldF91c2VyX3RpZXIoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICApIC0+IHN0cjoKICAgICAgICB1c2VyID0gYXdhaXQgc2VsZi5nZXRfdXNlcigKICAgICAgICAgICAgdXNlcl9pZAogICAgICAgICkKCiAgICAgICAgaWYgbm90IHVzZXI6CiAgICAgICAgICAgIHJldHVybiAic3RhbmRhcmQiCgogICAgICAgIHJldHVybiBzdHIoCiAgICAgICAgICAgIHVzZXIuZ2V0KAogICAgICAgICAgICAgICAgInVzZXJfdGllciIsCiAgICAgICAgICAgICAgICAic3RhbmRhcmQiLAogICAgICAgICAgICApCiAgICAgICAgICAgIG9yICJzdGFuZGFyZCIKICAgICAgICApCgogICAgYXN5bmMgZGVmIHNldF91c2VyX3RpZXIoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgdGllcjogc3RyLAogICAgKSAtPiBib29sOgogICAgICAgIGF3YWl0IHNlbGYuX2Vuc3VyZV9pbml0aWFsaXplZCgpCgogICAgICAgIHRpZXIgPSBzdHIoCiAgICAgICAgICAgIHRpZXIKICAgICAgICAgICAgb3IgIiIKICAgICAgICApLnN0cmlwKCkubG93ZXIoKQoKICAgICAgICBpZiBub3QgdGllcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgc2VsZi5fc2V0X3VzZXJfdGllcl9zeW5jLAogICAgICAgICAgICBpbnQodXNlcl9pZCksCiAgICAgICAgICAgIHRpZXIsCiAgICAgICAgKQoKICAgIGRlZiBfc2V0X3VzZXJfdGllcl9zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgICAgIHRpZXI6IHN0ciwKICAgICkgLT4gYm9vbDoKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgY3Vyc29yID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBVUERBVEUgdXNlcnMKICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgIHVzZXJfdGllciA9ID8sCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHRpZXIsCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBjdXJzb3Iucm93Y291bnQgPT0gMQogICAgICAgICAgICApCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGFzeW5jIGRlZiBjaGVja191c2VyX2Jhbl9zdGF0dXMoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICApIC0+IHR1cGxlW2Jvb2wsIE9wdGlvbmFsW3N0cl1dOgogICAgICAgIHVzZXIgPSBhd2FpdCBzZWxmLmdldF91c2VyKAogICAgICAgICAgICB1c2VyX2lkCiAgICAgICAgKQoKICAgICAgICBpZiBub3QgdXNlcjoKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIEZhbHNlLAogICAgICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBib29sKAogICAgICAgICAgICAgICAgdXNlci5nZXQoCiAgICAgICAgICAgICAgICAgICAgImlzX2Jhbm5lZCIsCiAgICAgICAgICAgICAgICAgICAgRmFsc2UsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgICAgIE5vbmUsCiAgICAgICAgKQoKICAgIGFzeW5jIGRlZiBzZXRfdXNlcl9iYW5fc3RhdHVzKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgICAgIGlzX2Jhbm5lZDogYm9vbCwKICAgICkgLT4gYm9vbDoKICAgICAgICBhd2FpdCBzZWxmLl9lbnN1cmVfaW5pdGlhbGl6ZWQoKQoKICAgICAgICByZXR1cm4gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgICAgIHNlbGYuX3NldF91c2VyX2Jhbl9zeW5jLAogICAgICAgICAgICBpbnQodXNlcl9pZCksCiAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgIGJvb2woCiAgICAgICAgICAgICAgICAgICAgaXNfYmFubmVkCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGRlZiBfc2V0X3VzZXJfYmFuX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgaXNfYmFubmVkOiBpbnQsCiAgICApIC0+IGJvb2w6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1cnNvciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgVVBEQVRFIHVzZXJzCiAgICAgICAgICAgICAgICBTRVQKICAgICAgICAgICAgICAgICAgICBpc19iYW5uZWQgPSA/LAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPSBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBpc19iYW5uZWQsCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBjdXJzb3Iucm93Y291bnQgPT0gMQogICAgICAgICAgICApCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgS1lDCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYXN5bmMgZGVmIGdldF91c2VyX2t5Y19zdGF0dXMoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICApIC0+IHN0cjoKICAgICAgICBhd2FpdCBzZWxmLl9lbnN1cmVfaW5pdGlhbGl6ZWQoKQoKICAgICAgICByZXR1cm4gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgICAgIHNlbGYuX2dldF91c2VyX2t5Y19zdGF0dXNfc3luYywKICAgICAgICAgICAgaW50KHVzZXJfaWQpLAogICAgICAgICkKCiAgICBhc3luYyBkZWYgZ2V0X2t5Y19zdGF0dXMoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICApIC0+IHN0cjoKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5nZXRfdXNlcl9reWNfc3RhdHVzKAogICAgICAgICAgICB1c2VyX2lkCiAgICAgICAgKQoKICAgIGRlZiBfZ2V0X3VzZXJfa3ljX3N0YXR1c19zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgKSAtPiBzdHI6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVzZXIgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFNFTEVDVCBpc19reWNfdmVyaWZpZWQKICAgICAgICAgICAgICAgIEZST00gdXNlcnMKICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICBMSU1JVCAxCiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgdXNlcgogICAgICAgICAgICAgICAgYW5kIGludCgKICAgICAgICAgICAgICAgICAgICB1c2VyWwogICAgICAgICAgICAgICAgICAgICAgICAiaXNfa3ljX3ZlcmlmaWVkIgogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICAgICApID09IDEKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHJldHVybiAiYXBwcm92ZWQiCgogICAgICAgICAgICByZXF1ZXN0ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1Qgc3RhdHVzCiAgICAgICAgICAgICAgICBGUk9NIGt5Y19yZXF1ZXN0cwogICAgICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgIE9SREVSIEJZIGlkIERFU0MKICAgICAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgICAgICBpZiBub3QgcmVxdWVzdDoKICAgICAgICAgICAgICAgIHJldHVybiAibm9uZSIKCiAgICAgICAgICAgIHN0YXR1cyA9IHN0cigKICAgICAgICAgICAgICAgIHJlcXVlc3RbCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIG9yICJub25lIgogICAgICAgICAgICApLnN0cmlwKCkubG93ZXIoKQoKICAgICAgICAgICAgYWxpYXNlcyA9IHsKICAgICAgICAgICAgICAgICJ2ZXJpZmllZCI6CiAgICAgICAgICAgICAgICAgICAgImFwcHJvdmVkIiwKCiAgICAgICAgICAgICAgICAiYWNjZXB0ZWQiOgogICAgICAgICAgICAgICAgICAgICJhcHByb3ZlZCIsCgogICAgICAgICAgICAgICAgImRlY2xpbmVkIjoKICAgICAgICAgICAgICAgICAgICAicmVqZWN0ZWQiLAoKICAgICAgICAgICAgICAgICJ3YWl0aW5nIjoKICAgICAgICAgICAgICAgICAgICAicGVuZGluZyIsCgogICAgICAgICAgICAgICAgInVuZGVyX3JldmlldyI6CiAgICAgICAgICAgICAgICAgICAgInBlbmRpbmciLAogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWxpYXNlcy5nZXQoCiAgICAgICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgICkKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgYXN5bmMgZGVmIHNhdmVfa3ljX3JlcXVlc3QoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgZmlsZV9pZDogc3RyLAogICAgICAgIHN0YXR1czogc3RyID0gInBlbmRpbmciLAogICAgKSAtPiBPcHRpb25hbFtpbnRdOgogICAgICAgIGF3YWl0IHNlbGYuX2Vuc3VyZV9pbml0aWFsaXplZCgpCgogICAgICAgIHJldHVybiBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgc2VsZi5fc2F2ZV9reWNfcmVxdWVzdF9zeW5jLAogICAgICAgICAgICBpbnQodXNlcl9pZCksCiAgICAgICAgICAgIHN0cigKICAgICAgICAgICAgICAgIGZpbGVfaWQKICAgICAgICAgICAgICAgIG9yICIiCiAgICAgICAgICAgICkuc3RyaXAoKSwKICAgICAgICAgICAgc3RyKAogICAgICAgICAgICAgICAgc3RhdHVzCiAgICAgICAgICAgICAgICBvciAicGVuZGluZyIKICAgICAgICAgICAgKS5zdHJpcCgpLmxvd2VyKCksCiAgICAgICAgKQoKICAgIGRlZiBfc2F2ZV9reWNfcmVxdWVzdF9zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgICAgIGZpbGVfaWQ6IHN0ciwKICAgICAgICBzdGF0dXM6IHN0ciwKICAgICkgLT4gT3B0aW9uYWxbaW50XToKICAgICAgICBpZiAoCiAgICAgICAgICAgIHVzZXJfaWQgPD0gMAogICAgICAgICAgICBvciBub3QgZmlsZV9pZAogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGlmIHN0YXR1cyBub3QgaW4gewogICAgICAgICAgICAicGVuZGluZyIsCiAgICAgICAgICAgICJhcHByb3ZlZCIsCiAgICAgICAgICAgICJyZWplY3RlZCIsCiAgICAgICAgfToKICAgICAgICAgICAgc3RhdHVzID0gInBlbmRpbmciCgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiQkVHSU4gSU1NRURJQVRFIgogICAgICAgICAgICApCgogICAgICAgICAgICB1c2VyID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QgdXNlcl9pZAogICAgICAgICAgICAgICAgRlJPTSB1c2VycwogICAgICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgICAgICBpZiBub3QgdXNlcjoKICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIGlmIHN0YXR1cyA9PSAicGVuZGluZyI6CiAgICAgICAgICAgICAgICBleGlzdGluZyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgaWQKICAgICAgICAgICAgICAgICAgICBGUk9NIGt5Y19yZXF1ZXN0cwogICAgICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICAgICAgICBBTkQgc3RhdHVzID0gJ3BlbmRpbmcnCiAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgaWQgREVTQwogICAgICAgICAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgICAgICBpZiBleGlzdGluZzoKICAgICAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludCgKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiCiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBjdXJzb3IgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIGt5Y19yZXF1ZXN0cyAoCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICAgICBmaWxlX2lkLAogICAgICAgICAgICAgICAgICAgIHN0YXR1cwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/KQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgZmlsZV9pZCwKICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBpZiBzdGF0dXMgPT0gImFwcHJvdmVkIjoKICAgICAgICAgICAgICAgIHZlcmlmaWVkID0gMQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZlcmlmaWVkID0gMAoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBVUERBVEUgdXNlcnMKICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgIGlzX2t5Y192ZXJpZmllZCA9ID8sCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkLAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICAgICByZXR1cm4gaW50KAogICAgICAgICAgICAgICAgY3Vyc29yLmxhc3Ryb3dpZAogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2F2ZSBLWUMgcmVxdWVzdCB8IHVzZXI9JXMiLAogICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgYXN5bmMgZGVmIHNldF91c2VyX2t5Y19zdGF0dXMoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgc3RhdHVzOiBzdHIsCiAgICAgICAgKiwKICAgICAgICByZXZpZXdlZF9ieTogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICAgICAgcmVqZWN0aW9uX3JlYXNvbjogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICApIC0+IGJvb2w6CiAgICAgICAgYXdhaXQgc2VsZi5fZW5zdXJlX2luaXRpYWxpemVkKCkKCiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBzZWxmLl9zZXRfdXNlcl9reWNfc3RhdHVzX3N5bmMsCiAgICAgICAgICAgIGludCh1c2VyX2lkKSwKICAgICAgICAgICAgc3RyKAogICAgICAgICAgICAgICAgc3RhdHVzCiAgICAgICAgICAgICAgICBvciAiIgogICAgICAgICAgICApLnN0cmlwKCkubG93ZXIoKSwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaW50KHJldmlld2VkX2J5KQogICAgICAgICAgICAgICAgaWYgcmV2aWV3ZWRfYnkgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgIGVsc2UgTm9uZQogICAgICAgICAgICApLAogICAgICAgICAgICByZWplY3Rpb25fcmVhc29uLAogICAgICAgICkKCiAgICBkZWYgX3NldF91c2VyX2t5Y19zdGF0dXNfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICBzdGF0dXM6IHN0ciwKICAgICAgICByZXZpZXdlZF9ieTogT3B0aW9uYWxbaW50XSwKICAgICAgICByZWplY3Rpb25fcmVhc29uOiBPcHRpb25hbFtzdHJdLAogICAgKSAtPiBib29sOgogICAgICAgIGlmIHN0YXR1cyBub3QgaW4gewogICAgICAgICAgICAiYXBwcm92ZWQiLAogICAgICAgICAgICAicmVqZWN0ZWQiLAogICAgICAgICAgICAicGVuZGluZyIsCiAgICAgICAgfToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiQkVHSU4gSU1NRURJQVRFIgogICAgICAgICAgICApCgogICAgICAgICAgICByZXF1ZXN0ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QgaWQKICAgICAgICAgICAgICAgIEZST00ga3ljX3JlcXVlc3RzCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgT1JERVIgQlkgaWQgREVTQwogICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgIGlmIHJlcXVlc3Q6CiAgICAgICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIGt5Y19yZXF1ZXN0cwogICAgICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA/LAogICAgICAgICAgICAgICAgICAgICAgICByZXZpZXdlZF9ieSA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGlvbl9yZWFzb24gPSA/LAogICAgICAgICAgICAgICAgICAgICAgICByZXZpZXdlZF9hdCA9IENBU0UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gPyBJTiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcHJvdmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVqZWN0ZWQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHJldmlld2VkX2F0CiAgICAgICAgICAgICAgICAgICAgICAgIEVORCwKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICByZXZpZXdlZF9ieSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0aW9uX3JlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0WwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBVUERBVEUgdXNlcnMKICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgIGlzX2t5Y192ZXJpZmllZCA9ID8sCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICBpZiBzdGF0dXMKICAgICAgICAgICAgICAgICAgICAgICAgPT0gImFwcHJvdmVkIgogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIDAKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKCiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHVwZGF0ZSBLWUMgc3RhdHVzIHwgdXNlcj0lcyIsCiAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICApCgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBVc2VyIFN0YXRpc3RpY3MKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgZ2V0X3VzZXJfZnVsbF9zdGF0cygKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICkgLT4gZGljdFtzdHIsIEFueV06CiAgICAgICAgYXdhaXQgc2VsZi5fZW5zdXJlX2luaXRpYWxpemVkKCkKCiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBzZWxmLl9nZXRfdXNlcl9mdWxsX3N0YXRzX3N5bmMsCiAgICAgICAgICAgIGludCh1c2VyX2lkKSwKICAgICAgICApCgogICAgZGVmIF9nZXRfdXNlcl9mdWxsX3N0YXRzX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICApIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB1c2VyID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QKICAgICAgICAgICAgICAgICAgICBjcmVhdGVkX2F0LAogICAgICAgICAgICAgICAgICAgIGludml0ZWRfYnkKICAgICAgICAgICAgICAgIEZST00gdXNlcnMKICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICBMSU1JVCAxCiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICAgICAgdG90YWxfb3JkZXJzID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QgQ09VTlQoKikgQVMgY291bnQKICAgICAgICAgICAgICAgIEZST00gb3JkZXJzCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKClbCiAgICAgICAgICAgICAgICAiY291bnQiCiAgICAgICAgICAgIF0KCiAgICAgICAgICAgIGNvbXBsZXRlZF9vcmRlcnMgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFNFTEVDVCBDT1VOVCgqKSBBUyBjb3VudAogICAgICAgICAgICAgICAgRlJPTSBvcmRlcnMKICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICAgIEFORCBzdGF0dXMgPSAnY29tcGxldGVkJwogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKClbCiAgICAgICAgICAgICAgICAiY291bnQiCiAgICAgICAgICAgIF0KCiAgICAgICAgICAgIHJlZmVycmFsX2NvdW50ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QgQ09VTlQoCiAgICAgICAgICAgICAgICAgICAgRElTVElOQ1QgcmVmZXJyZWRfaWQKICAgICAgICAgICAgICAgICkgQVMgY291bnQKICAgICAgICAgICAgICAgIEZST00gcmVmZXJyYWxzCiAgICAgICAgICAgICAgICBXSEVSRSByZWZlcnJlcl9pZCA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKS5mZXRjaG9uZSgpWwogICAgICAgICAgICAgICAgImNvdW50IgogICAgICAgICAgICBdCgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRvdGFsX29yZGVycyI6CiAgICAgICAgICAgICAgICAgICAgaW50KAogICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9vcmRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgb3IgMAogICAgICAgICAgICAgICAgICAgICksCgogICAgICAgICAgICAgICAgImNvbXBsZXRlZF9vcmRlcnMiOgogICAgICAgICAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkX29yZGVycwogICAgICAgICAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICAgICAgICAgKSwKCiAgICAgICAgICAgICAgICAicmVmZXJyYWxfY291bnQiOgogICAgICAgICAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyYWxfY291bnQKICAgICAgICAgICAgICAgICAgICAgICAgb3IgMAogICAgICAgICAgICAgICAgICAgICksCgogICAgICAgICAgICAgICAgImpvaW5lZF9kYXRlIjoKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdXNlcgogICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlclsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IgogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgTm9uZQogICAgICAgICAgICAgICAgICAgICksCgogICAgICAgICAgICAgICAgImludml0ZWRfYnkiOgogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgaW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlclsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52aXRlZF9ieSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB1c2VyCiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImludml0ZWRfYnkiCiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEJhbGFuY2UKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgZ2V0X2JhbGFuY2UoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICApIC0+IGludDoKICAgICAgICB1c2VyID0gYXdhaXQgc2VsZi5nZXRfdXNlcigKICAgICAgICAgICAgdXNlcl9pZAogICAgICAgICkKCiAgICAgICAgaWYgbm90IHVzZXI6CiAgICAgICAgICAgIHJldHVybiAwCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGludCgKICAgICAgICAgICAgICAgIHVzZXIuZ2V0KAogICAgICAgICAgICAgICAgICAgICJiYWxhbmNlX3RvbWFuIiwKICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgb3IgMAogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCAoCiAgICAgICAgICAgIFR5cGVFcnJvciwKICAgICAgICAgICAgVmFsdWVFcnJvciwKICAgICAgICApOgogICAgICAgICAgICByZXR1cm4gMAoKICAgIGFzeW5jIGRlZiBnZXRfdXNlcl9iYWxhbmNlKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgKSAtPiBpbnQ6CiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuZ2V0X2JhbGFuY2UoCiAgICAgICAgICAgIHVzZXJfaWQKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZWZlcmVuY2VfYWxyZWFkeV9leGlzdHMoCiAgICAgICAgY29ubjogc3FsaXRlMy5Db25uZWN0aW9uLAogICAgICAgIHJlZmVyZW5jZV9pZDogT3B0aW9uYWxbc3RyXSwKICAgICkgLT4gYm9vbDoKICAgICAgICBpZiBub3QgcmVmZXJlbmNlX2lkOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiIiIKICAgICAgICAgICAgU0VMRUNUIDEKICAgICAgICAgICAgRlJPTSB3YWxsZXRfdHJhbnNhY3Rpb25zCiAgICAgICAgICAgIFdIRVJFIHJlZmVyZW5jZV9pZCA9ID8KICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIHJlZmVyZW5jZV9pZCwKICAgICAgICAgICAgKSwKICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgcmV0dXJuIHJvdyBpcyBub3QgTm9uZQoKICAgIGFzeW5jIGRlZiBpbmNyZWFzZV91c2VyX2JhbGFuY2UoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgYW1vdW50OiBpbnQsCiAgICAgICAgZGVzY3JpcHRpb246IHN0ciA9ICJXYWxsZXQgY2hhcmdlIiwKICAgICAgICByZWZlcmVuY2VfaWQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgKSAtPiBib29sOgogICAgICAgIGF3YWl0IHNlbGYuX2Vuc3VyZV9pbml0aWFsaXplZCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgYW1vdW50ID0gaW50KAogICAgICAgICAgICAgICAgYW1vdW50CiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0ICgKICAgICAgICAgICAgVHlwZUVycm9yLAogICAgICAgICAgICBWYWx1ZUVycm9yLAogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBpZiBhbW91bnQgPD0gMDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgc2VsZi5faW5jcmVhc2VfYmFsYW5jZV9zeW5jLAogICAgICAgICAgICBpbnQodXNlcl9pZCksCiAgICAgICAgICAgIGFtb3VudCwKICAgICAgICAgICAgc3RyKAogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgIG9yICJXYWxsZXQgY2hhcmdlIgogICAgICAgICAgICApLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBzdHIocmVmZXJlbmNlX2lkKQogICAgICAgICAgICAgICAgaWYgcmVmZXJlbmNlX2lkCiAgICAgICAgICAgICAgICBlbHNlIE5vbmUKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgZGVmIF9pbmNyZWFzZV9iYWxhbmNlX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgYW1vdW50OiBpbnQsCiAgICAgICAgZGVzY3JpcHRpb246IHN0ciwKICAgICAgICByZWZlcmVuY2VfaWQ6IE9wdGlvbmFsW3N0cl0sCiAgICApIC0+IGJvb2w6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJCRUdJTiBJTU1FRElBVEUiCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIHNlbGYuX3JlZmVyZW5jZV9hbHJlYWR5X2V4aXN0cygKICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICByZWZlcmVuY2VfaWQsCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFNFTEVDVCBiYWxhbmNlX3RvbWFuCiAgICAgICAgICAgICAgICBGUk9NIHVzZXJzCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgIGlmIG5vdCByb3c6CiAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgYmVmb3JlID0gaW50KAogICAgICAgICAgICAgICAgcm93WwogICAgICAgICAgICAgICAgICAgICJiYWxhbmNlX3RvbWFuIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgb3IgMAogICAgICAgICAgICApCgogICAgICAgICAgICBhZnRlciA9ICgKICAgICAgICAgICAgICAgIGJlZm9yZQogICAgICAgICAgICAgICAgKyBhbW91bnQKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBVUERBVEUgdXNlcnMKICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgIGJhbGFuY2VfdG9tYW4gPSA/LAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPSBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBhZnRlciwKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyB3YWxsZXRfdHJhbnNhY3Rpb25zICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgYW1vdW50LAogICAgICAgICAgICAgICAgICAgIGJhbGFuY2VfYmVmb3JlLAogICAgICAgICAgICAgICAgICAgIGJhbGFuY2VfYWZ0ZXIsCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX2lkCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBWQUxVRVMgKAogICAgICAgICAgICAgICAgICAgID8sICdjcmVkaXQnLCA/LCA/LCA/LCA/LCA/CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICAgICBhbW91bnQsCiAgICAgICAgICAgICAgICAgICAgYmVmb3JlLAogICAgICAgICAgICAgICAgICAgIGFmdGVyLAogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZV9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgaW5jcmVhc2UgYmFsYW5jZSB8ICIKICAgICAgICAgICAgICAgICJ1c2VyPSVzIGFtb3VudD0lcyIsCiAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgYW1vdW50LAogICAgICAgICAgICApCgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgYXN5bmMgZGVmIGRlY3JlYXNlX3VzZXJfYmFsYW5jZSgKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICBhbW91bnQ6IGludCwKICAgICAgICBkZXNjcmlwdGlvbjogc3RyID0gIk9yZGVyIHBheW1lbnQiLAogICAgICAgIHJlZmVyZW5jZV9pZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICApIC0+IGJvb2w6CiAgICAgICAgYXdhaXQgc2VsZi5fZW5zdXJlX2luaXRpYWxpemVkKCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBhbW91bnQgPSBpbnQoCiAgICAgICAgICAgICAgICBhbW91bnQKICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgKAogICAgICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgICAgIFZhbHVlRXJyb3IsCiAgICAgICAgKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGlmIGFtb3VudCA8PSAwOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBzZWxmLl9kZWNyZWFzZV9iYWxhbmNlX3N5bmMsCiAgICAgICAgICAgIGludCh1c2VyX2lkKSwKICAgICAgICAgICAgYW1vdW50LAogICAgICAgICAgICBzdHIoCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgb3IgIk9yZGVyIHBheW1lbnQiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIHN0cihyZWZlcmVuY2VfaWQpCiAgICAgICAgICAgICAgICBpZiByZWZlcmVuY2VfaWQKICAgICAgICAgICAgICAgIGVsc2UgTm9uZQogICAgICAgICAgICApLAogICAgICAgICkKCiAgICBkZWYgX2RlY3JlYXNlX2JhbGFuY2Vfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICBhbW91bnQ6IGludCwKICAgICAgICBkZXNjcmlwdGlvbjogc3RyLAogICAgICAgIHJlZmVyZW5jZV9pZDogT3B0aW9uYWxbc3RyXSwKICAgICkgLT4gYm9vbDoKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIkJFR0lOIElNTUVESUFURSIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgc2VsZi5fcmVmZXJlbmNlX2FscmVhZHlfZXhpc3RzKAogICAgICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgICAgIHJlZmVyZW5jZV9pZCwKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUIGJhbGFuY2VfdG9tYW4KICAgICAgICAgICAgICAgIEZST00gdXNlcnMKICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICBMSU1JVCAxCiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICAgICAgaWYgbm90IHJvdzoKICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBiZWZvcmUgPSBpbnQoCiAgICAgICAgICAgICAgICByb3dbCiAgICAgICAgICAgICAgICAgICAgImJhbGFuY2VfdG9tYW4iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIGJlZm9yZSA8IGFtb3VudDoKICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBhZnRlciA9ICgKICAgICAgICAgICAgICAgIGJlZm9yZQogICAgICAgICAgICAgICAgLSBhbW91bnQKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBVUERBVEUgdXNlcnMKICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgIGJhbGFuY2VfdG9tYW4gPSA/LAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPSBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBhZnRlciwKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyB3YWxsZXRfdHJhbnNhY3Rpb25zICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgYW1vdW50LAogICAgICAgICAgICAgICAgICAgIGJhbGFuY2VfYmVmb3JlLAogICAgICAgICAgICAgICAgICAgIGJhbGFuY2VfYWZ0ZXIsCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX2lkCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBWQUxVRVMgKAogICAgICAgICAgICAgICAgICAgID8sICdkZWJpdCcsID8sID8sID8sID8sID8KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIGFtb3VudCwKICAgICAgICAgICAgICAgICAgICBiZWZvcmUsCiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIsCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5jb21taXQoKQoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpCgogICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZWNyZWFzZSBiYWxhbmNlIHwgIgogICAgICAgICAgICAgICAgInVzZXI9JXMgYW1vdW50PSVzIiwKICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICBhbW91bnQsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEF0b21pYyBMZWdhY3kgT3JkZXIgKyBQYXltZW50CiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYXN5bmMgZGVmIGNyZWF0ZV9wYWlkX29yZGVyKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgICAgIHByb2R1Y3RfaWQ6IHN0ciwKICAgICAgICB0YXJnZXQ6IE9wdGlvbmFsW3N0cl0sCiAgICAgICAgcHJpY2U6IGludCwKICAgICAgICBnYXRld2F5OiBzdHIgPSAid2FsbGV0IiwKICAgICkgLT4gT3B0aW9uYWxbaW50XToKICAgICAgICAiIiIKICAgICAgICBMZWdhY3kgY29tcGF0aWJpbGl0eSBvbmx5LgoKICAgICAgICBOZXcgUHJlbWl1bS9TdGFycyB3b3JrZmxvdyBzaG91bGQgdXNlIE9yZGVyU2VydmljZSBhbmQKICAgICAgICBwZW5kaW5nX293bmVyX2FwcHJvdmFsIGluc3RlYWQuCiAgICAgICAgIiIiCiAgICAgICAgYXdhaXQgc2VsZi5fZW5zdXJlX2luaXRpYWxpemVkKCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcmljZSA9IGludCgKICAgICAgICAgICAgICAgIHByaWNlCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0ICgKICAgICAgICAgICAgVHlwZUVycm9yLAogICAgICAgICAgICBWYWx1ZUVycm9yLAogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGlmIHByaWNlIDw9IDA6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHJldHVybiBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgc2VsZi5fY3JlYXRlX3BhaWRfb3JkZXJfc3luYywKICAgICAgICAgICAgaW50KHVzZXJfaWQpLAogICAgICAgICAgICBzdHIoCiAgICAgICAgICAgICAgICBwcm9kdWN0X2lkCiAgICAgICAgICAgICAgICBvciAiIgogICAgICAgICAgICApLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBzdHIodGFyZ2V0KQogICAgICAgICAgICAgICAgaWYgdGFyZ2V0IGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICBlbHNlIE5vbmUKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcHJpY2UsCiAgICAgICAgICAgIHN0cigKICAgICAgICAgICAgICAgIGdhdGV3YXkKICAgICAgICAgICAgICAgIG9yICJ3YWxsZXQiCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGRlZiBfY3JlYXRlX3BhaWRfb3JkZXJfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICBwcm9kdWN0X2lkOiBzdHIsCiAgICAgICAgdGFyZ2V0OiBPcHRpb25hbFtzdHJdLAogICAgICAgIHByaWNlOiBpbnQsCiAgICAgICAgZ2F0ZXdheTogc3RyLAogICAgKSAtPiBPcHRpb25hbFtpbnRdOgogICAgICAgIGlmIG5vdCBwcm9kdWN0X2lkOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIkJFR0lOIElNTUVESUFURSIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgdXNlciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUIGJhbGFuY2VfdG9tYW4KICAgICAgICAgICAgICAgIEZST00gdXNlcnMKICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICBMSU1JVCAxCiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICAgICAgaWYgbm90IHVzZXI6CiAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICAgICBiYWxhbmNlID0gaW50KAogICAgICAgICAgICAgICAgdXNlclsKICAgICAgICAgICAgICAgICAgICAiYmFsYW5jZV90b21hbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIG9yIDAKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgYmFsYW5jZSA8IHByaWNlOgogICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgbmV3X2JhbGFuY2UgPSAoCiAgICAgICAgICAgICAgICBiYWxhbmNlCiAgICAgICAgICAgICAgICAtIHByaWNlCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgVVBEQVRFIHVzZXJzCiAgICAgICAgICAgICAgICBTRVQKICAgICAgICAgICAgICAgICAgICBiYWxhbmNlX3RvbWFuID0gPywKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkX2F0ID0gQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgbmV3X2JhbGFuY2UsCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGN1cnNvciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gb3JkZXJzICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfaWQsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICAgICAgICAgIHByaWNlLAogICAgICAgICAgICAgICAgICAgIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICBnYXRld2F5CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBWQUxVRVMgKAogICAgICAgICAgICAgICAgICAgID8sID8sID8sID8sICdwcm9jZXNzaW5nJywgPwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9pZCwKICAgICAgICAgICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgcHJpY2UsCiAgICAgICAgICAgICAgICAgICAgZ2F0ZXdheSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIG9yZGVyX2lkID0gaW50KAogICAgICAgICAgICAgICAgY3Vyc29yLmxhc3Ryb3dpZAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHdhbGxldF90cmFuc2FjdGlvbnMgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICAgICAgICBhbW91bnQsCiAgICAgICAgICAgICAgICAgICAgYmFsYW5jZV9iZWZvcmUsCiAgICAgICAgICAgICAgICAgICAgYmFsYW5jZV9hZnRlciwKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VfaWQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIFZBTFVFUyAoCiAgICAgICAgICAgICAgICAgICAgPywgJ2RlYml0JywgPywgPywgPywKICAgICAgICAgICAgICAgICAgICAnT3JkZXIgcGF5bWVudCcsID8KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIHByaWNlLAogICAgICAgICAgICAgICAgICAgIGJhbGFuY2UsCiAgICAgICAgICAgICAgICAgICAgbmV3X2JhbGFuY2UsCiAgICAgICAgICAgICAgICAgICAgc3RyKAogICAgICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICAgICByZXR1cm4gb3JkZXJfaWQKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpCgogICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIkF0b21pYyBsZWdhY3kgb3JkZXIvcGF5bWVudCBmYWlsZWQgfCAiCiAgICAgICAgICAgICAgICAidXNlcj0lcyBwcm9kdWN0PSVzIiwKICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICBwcm9kdWN0X2lkLAogICAgICAgICAgICApCgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFJlZnVuZAogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGRlZiByZWZ1bmRfb3JkZXIoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgICAgIGRlc2NyaXB0aW9uOiBzdHIgPSAiT3JkZXIgcmVmdW5kIiwKICAgICkgLT4gYm9vbDoKICAgICAgICAiIiIKICAgICAgICBNYW51YWwvbGVnYWN5IHJlZnVuZC4KCiAgICAgICAgcHJvdmlkZXJfc3RhdHVzX3Vua25vd24gaXMgaW50ZW50aW9uYWxseSBOT1QgcmVmdW5kYWJsZSBoZXJlLgogICAgICAgIEFtYmlndW91cyBwcm92aWRlciBvdXRjb21lcyBtdXN0IGJlIHJlY29uY2lsZWQgbWFudWFsbHkgZmlyc3QuCiAgICAgICAgIiIiCiAgICAgICAgYXdhaXQgc2VsZi5fZW5zdXJlX2luaXRpYWxpemVkKCkKCiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBzZWxmLl9yZWZ1bmRfb3JkZXJfc3luYywKICAgICAgICAgICAgaW50KG9yZGVyX2lkKSwKICAgICAgICAgICAgc3RyKAogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgIG9yICJPcmRlciByZWZ1bmQiCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGRlZiBfcmVmdW5kX29yZGVyX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgICAgIGRlc2NyaXB0aW9uOiBzdHIsCiAgICApIC0+IGJvb2w6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJCRUdJTiBJTU1FRElBVEUiCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIG9yZGVyID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIHByaWNlLAogICAgICAgICAgICAgICAgICAgIHN0YXR1cwogICAgICAgICAgICAgICAgRlJPTSBvcmRlcnMKICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgICAgICBpZiBub3Qgb3JkZXI6CiAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgc3RhdHVzID0gc3RyKAogICAgICAgICAgICAgICAgb3JkZXJbCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIG9yICIiCiAgICAgICAgICAgICkubG93ZXIoKQoKICAgICAgICAgICAgaWYgc3RhdHVzIGluIHsKICAgICAgICAgICAgICAgICJyZWZ1bmRlZCIsCiAgICAgICAgICAgICAgICAiZmFpbGVkX3JlZnVuZGVkIiwKICAgICAgICAgICAgfToKICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgICAgIGlmIHN0YXR1cyBub3QgaW4gewogICAgICAgICAgICAgICAgInByb2Nlc3NpbmciLAogICAgICAgICAgICAgICAgImZhaWxlZCIsCiAgICAgICAgICAgICAgICAiZmFpbGVkX3JlZnVuZF9yZXF1aXJlZCIsCiAgICAgICAgICAgIH06CiAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgdXNlcl9pZCA9IGludCgKICAgICAgICAgICAgICAgIG9yZGVyWwogICAgICAgICAgICAgICAgICAgICJ1c2VyX2lkIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICApCgogICAgICAgICAgICBhbW91bnQgPSBpbnQoCiAgICAgICAgICAgICAgICBvcmRlclsKICAgICAgICAgICAgICAgICAgICAicHJpY2UiCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHVzZXIgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFNFTEVDVCBiYWxhbmNlX3RvbWFuCiAgICAgICAgICAgICAgICBGUk9NIHVzZXJzCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgIGlmIG5vdCB1c2VyOgogICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIHJlZmVyZW5jZV9pZCA9ICgKICAgICAgICAgICAgICAgIGYib3JkZXI6e29yZGVyX2lkfTpsZWdhY3lfcmVmdW5kIgogICAgICAgICAgICApCgogICAgICAgICAgICBpZiBzZWxmLl9yZWZlcmVuY2VfYWxyZWFkeV9leGlzdHMoCiAgICAgICAgICAgICAgICBjb25uLAogICAgICAgICAgICAgICAgcmVmZXJlbmNlX2lkLAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAgICAgYmVmb3JlID0gaW50KAogICAgICAgICAgICAgICAgdXNlclsKICAgICAgICAgICAgICAgICAgICAiYmFsYW5jZV90b21hbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIG9yIDAKICAgICAgICAgICAgKQoKICAgICAgICAgICAgYWZ0ZXIgPSAoCiAgICAgICAgICAgICAgICBiZWZvcmUKICAgICAgICAgICAgICAgICsgYW1vdW50CiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgVVBEQVRFIHVzZXJzCiAgICAgICAgICAgICAgICBTRVQKICAgICAgICAgICAgICAgICAgICBiYWxhbmNlX3RvbWFuID0gPywKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkX2F0ID0gQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIsCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgVVBEQVRFIG9yZGVycwogICAgICAgICAgICAgICAgU0VUCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ3JlZnVuZGVkJywKICAgICAgICAgICAgICAgICAgICByZWZ1bmRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QLAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPSBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHdhbGxldF90cmFuc2FjdGlvbnMgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICAgICAgICBhbW91bnQsCiAgICAgICAgICAgICAgICAgICAgYmFsYW5jZV9iZWZvcmUsCiAgICAgICAgICAgICAgICAgICAgYmFsYW5jZV9hZnRlciwKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VfaWQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIFZBTFVFUyAoCiAgICAgICAgICAgICAgICAgICAgPywgJ2NyZWRpdCcsID8sID8sID8sID8sID8KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIGFtb3VudCwKICAgICAgICAgICAgICAgICAgICBiZWZvcmUsCiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIsCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5jb21taXQoKQoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpCgogICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIlJlZnVuZCBmYWlsZWQgfCBvcmRlcj0lcyIsCiAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgT3JkZXJzCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYXN5bmMgZGVmIHNhdmVfb3JkZXIoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgcHJvZHVjdF9pZDogc3RyLAogICAgICAgIHRhcmdldDogT3B0aW9uYWxbc3RyXSwKICAgICAgICBwcmljZTogaW50LAogICAgICAgIHN0YXR1czogc3RyID0gInBlbmRpbmciLAogICAgICAgIGdhdGV3YXk6IHN0ciA9ICJ3YWxsZXQiLAogICAgICAgIG1hcmtldF9vcmRlcl9pZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICApIC0+IE9wdGlvbmFsW2ludF06CiAgICAgICAgYXdhaXQgc2VsZi5fZW5zdXJlX2luaXRpYWxpemVkKCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcmljZSA9IGludCgKICAgICAgICAgICAgICAgIHByaWNlCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0ICgKICAgICAgICAgICAgVHlwZUVycm9yLAogICAgICAgICAgICBWYWx1ZUVycm9yLAogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGlmIHByaWNlIDwgMDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgc3RhdHVzID0gc3RyKAogICAgICAgICAgICBzdGF0dXMKICAgICAgICAgICAgb3IgInBlbmRpbmciCiAgICAgICAgKS5zdHJpcCgpCgogICAgICAgIGlmIHN0YXR1cyBub3QgaW4gc2VsZi5WQUxJRF9PUkRFUl9TVEFUVVNFUzoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBzZWxmLl9zYXZlX29yZGVyX3N5bmMsCiAgICAgICAgICAgIGludCh1c2VyX2lkKSwKICAgICAgICAgICAgc3RyKAogICAgICAgICAgICAgICAgcHJvZHVjdF9pZAogICAgICAgICAgICAgICAgb3IgIiIKICAgICAgICAgICAgKS5zdHJpcCgpLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBzdHIodGFyZ2V0KQogICAgICAgICAgICAgICAgaWYgdGFyZ2V0IGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICBlbHNlIE5vbmUKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcHJpY2UsCiAgICAgICAgICAgIHN0YXR1cywKICAgICAgICAgICAgc3RyKAogICAgICAgICAgICAgICAgZ2F0ZXdheQogICAgICAgICAgICAgICAgb3IgIndhbGxldCIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgc3RyKG1hcmtldF9vcmRlcl9pZCkKICAgICAgICAgICAgICAgIGlmIG1hcmtldF9vcmRlcl9pZAogICAgICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGRlZiBfc2F2ZV9vcmRlcl9zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgICAgIHByb2R1Y3RfaWQ6IHN0ciwKICAgICAgICB0YXJnZXQ6IE9wdGlvbmFsW3N0cl0sCiAgICAgICAgcHJpY2U6IGludCwKICAgICAgICBzdGF0dXM6IHN0ciwKICAgICAgICBnYXRld2F5OiBzdHIsCiAgICAgICAgbWFya2V0X29yZGVyX2lkOiBPcHRpb25hbFtzdHJdLAogICAgKSAtPiBPcHRpb25hbFtpbnRdOgogICAgICAgIGlmIG5vdCBwcm9kdWN0X2lkOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgY3Vyc29yID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyBvcmRlcnMgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9pZCwKICAgICAgICAgICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgcHJpY2UsCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgIGdhdGV3YXksCiAgICAgICAgICAgICAgICAgICAgbWFya2V0X29yZGVyX2lkCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8sID8sID8pCiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X2lkLAogICAgICAgICAgICAgICAgICAgIHRhcmdldCwKICAgICAgICAgICAgICAgICAgICBwcmljZSwKICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgZ2F0ZXdheSwKICAgICAgICAgICAgICAgICAgICBtYXJrZXRfb3JkZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICAgICByZXR1cm4gaW50KAogICAgICAgICAgICAgICAgY3Vyc29yLmxhc3Ryb3dpZAogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2F2ZSBvcmRlci4iCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGFzeW5jIGRlZiBnZXRfb3JkZXIoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgKSAtPiBPcHRpb25hbFtkaWN0W3N0ciwgQW55XV06CiAgICAgICAgYXdhaXQgc2VsZi5fZW5zdXJlX2luaXRpYWxpemVkKCkKCiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBzZWxmLl9nZXRfb3JkZXJfc3luYywKICAgICAgICAgICAgaW50KG9yZGVyX2lkKSwKICAgICAgICApCgogICAgZGVmIF9nZXRfb3JkZXJfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICApIC0+IE9wdGlvbmFsW2RpY3Rbc3RyLCBBbnldXToKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QgKgogICAgICAgICAgICAgICAgRlJPTSBvcmRlcnMKICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgZGljdCgKICAgICAgICAgICAgICAgICAgICByb3cKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHJvdwogICAgICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgICAgICkKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgYXN5bmMgZGVmIGdldF91c2VyX29yZGVycygKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICBsaW1pdDogaW50ID0gMjAsCiAgICApIC0+IGxpc3RbZGljdFtzdHIsIEFueV1dOgogICAgICAgIGF3YWl0IHNlbGYuX2Vuc3VyZV9pbml0aWFsaXplZCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgbGltaXQgPSBtYXgoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgbWluKAogICAgICAgICAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIDIwMCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0ICgKICAgICAgICAgICAgVHlwZUVycm9yLAogICAgICAgICAgICBWYWx1ZUVycm9yLAogICAgICAgICk6CiAgICAgICAgICAgIGxpbWl0ID0gMjAKCiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBzZWxmLl9nZXRfdXNlcl9vcmRlcnNfc3luYywKICAgICAgICAgICAgaW50KHVzZXJfaWQpLAogICAgICAgICAgICBsaW1pdCwKICAgICAgICApCgogICAgZGVmIF9nZXRfdXNlcl9vcmRlcnNfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICBsaW1pdDogaW50LAogICAgKSAtPiBsaXN0W2RpY3Rbc3RyLCBBbnldXToKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUICoKICAgICAgICAgICAgICAgIEZST00gb3JkZXJzCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgT1JERVIgQlkgaWQgREVTQwogICAgICAgICAgICAgICAgTElNSVQgPwogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgbGltaXQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNoYWxsKCkKCiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBkaWN0KAogICAgICAgICAgICAgICAgICAgIHJvdwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIHJvdwogICAgICAgICAgICAgICAgaW4gcm93cwogICAgICAgICAgICBdCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGFzeW5jIGRlZiB1cGRhdGVfb3JkZXJfc3RhdHVzKAogICAgICAgIHNlbGYsCiAgICAgICAgb3JkZXJfaWQ6IGludCwKICAgICAgICBzdGF0dXM6IHN0ciwKICAgICAgICBtYXJrZXRfb3JkZXJfaWQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgKSAtPiBib29sOgogICAgICAgIGF3YWl0IHNlbGYuX2Vuc3VyZV9pbml0aWFsaXplZCgpCgogICAgICAgIHN0YXR1cyA9IHN0cigKICAgICAgICAgICAgc3RhdHVzCiAgICAgICAgICAgIG9yICIiCiAgICAgICAgKS5zdHJpcCgpCgogICAgICAgIGlmIHN0YXR1cyBub3QgaW4gc2VsZi5WQUxJRF9PUkRFUl9TVEFUVVNFUzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgc2VsZi5fdXBkYXRlX29yZGVyX3N0YXR1c19zeW5jLAogICAgICAgICAgICBpbnQob3JkZXJfaWQpLAogICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIHN0cihtYXJrZXRfb3JkZXJfaWQpCiAgICAgICAgICAgICAgICBpZiBtYXJrZXRfb3JkZXJfaWQKICAgICAgICAgICAgICAgIGVsc2UgTm9uZQogICAgICAgICAgICApLAogICAgICAgICkKCiAgICBkZWYgX3VwZGF0ZV9vcmRlcl9zdGF0dXNfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgc3RhdHVzOiBzdHIsCiAgICAgICAgbWFya2V0X29yZGVyX2lkOiBPcHRpb25hbFtzdHJdLAogICAgKSAtPiBib29sOgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBtYXJrZXRfb3JkZXJfaWQgaXMgTm9uZToKICAgICAgICAgICAgICAgIGN1cnNvciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgICAgICBVUERBVEUgb3JkZXJzCiAgICAgICAgICAgICAgICAgICAgU0VUCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPSBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjdXJzb3IgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIG9yZGVycwogICAgICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA/LAogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRfb3JkZXJfaWQgPSA/LAogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkX2F0ID0gQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldF9vcmRlcl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBjdXJzb3Iucm93Y291bnQgPT0gMQogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgdXBkYXRlIG9yZGVyICVzIiwKICAgICAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICApCgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBXYWxsZXQgVHJhbnNhY3Rpb25zCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYXN5bmMgZGVmIGdldF93YWxsZXRfdHJhbnNhY3Rpb25zKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgICAgIGxpbWl0OiBpbnQgPSAyMCwKICAgICkgLT4gbGlzdFtkaWN0W3N0ciwgQW55XV06CiAgICAgICAgYXdhaXQgc2VsZi5fZW5zdXJlX2luaXRpYWxpemVkKCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsaW1pdCA9IG1heCgKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICBtaW4oCiAgICAgICAgICAgICAgICAgICAgaW50KAogICAgICAgICAgICAgICAgICAgICAgICBsaW1pdAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgMjAwLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgKAogICAgICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgICAgIFZhbHVlRXJyb3IsCiAgICAgICAgKToKICAgICAgICAgICAgbGltaXQgPSAyMAoKICAgICAgICByZXR1cm4gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgICAgIHNlbGYuX2dldF93YWxsZXRfdHJhbnNhY3Rpb25zX3N5bmMsCiAgICAgICAgICAgIGludCh1c2VyX2lkKSwKICAgICAgICAgICAgbGltaXQsCiAgICAgICAgKQoKICAgIGRlZiBfZ2V0X3dhbGxldF90cmFuc2FjdGlvbnNfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICBsaW1pdDogaW50LAogICAgKSAtPiBsaXN0W2RpY3Rbc3RyLCBBbnldXToKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUICoKICAgICAgICAgICAgICAgIEZST00gd2FsbGV0X3RyYW5zYWN0aW9ucwogICAgICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgIE9SREVSIEJZIGlkIERFU0MKICAgICAgICAgICAgICAgIExJTUlUID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIGxpbWl0LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKS5mZXRjaGFsbCgpCgogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgZGljdCgKICAgICAgICAgICAgICAgICAgICByb3cKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciByb3cKICAgICAgICAgICAgICAgIGluIHJvd3MKICAgICAgICAgICAgXQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEFkbWluIFJlYWRzCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYXN5bmMgZGVmIGdldF9hbGxfdXNlcnMoCiAgICAgICAgc2VsZiwKICAgICAgICBsaW1pdDogaW50ID0gMTAwLAogICAgKSAtPiBsaXN0W2RpY3Rbc3RyLCBBbnldXToKICAgICAgICBhd2FpdCBzZWxmLl9lbnN1cmVfaW5pdGlhbGl6ZWQoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxpbWl0ID0gbWF4KAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgIG1pbigKICAgICAgICAgICAgICAgICAgICBpbnQoCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0CiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAxMDAwLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgKAogICAgICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgICAgIFZhbHVlRXJyb3IsCiAgICAgICAgKToKICAgICAgICAgICAgbGltaXQgPSAxMDAKCiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBzZWxmLl9nZXRfYWxsX3VzZXJzX3N5bmMsCiAgICAgICAgICAgIGxpbWl0LAogICAgICAgICkKCiAgICBkZWYgX2dldF9hbGxfdXNlcnNfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIGxpbWl0OiBpbnQsCiAgICApIC0+IGxpc3RbZGljdFtzdHIsIEFueV1dOgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QgKgogICAgICAgICAgICAgICAgRlJPTSB1c2VycwogICAgICAgICAgICAgICAgT1JERVIgQlkgdXNlcl9pZCBERVNDCiAgICAgICAgICAgICAgICBMSU1JVCA/CiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgbGltaXQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNoYWxsKCkKCiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBzZWxmLl91c2VyX3Jvd190b19kaWN0KAogICAgICAgICAgICAgICAgICAgIHJvdwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIHJvdwogICAgICAgICAgICAgICAgaW4gcm93cwogICAgICAgICAgICBdCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGFzeW5jIGRlZiBnZXRfYWxsX29yZGVycygKICAgICAgICBzZWxmLAogICAgICAgIGxpbWl0OiBpbnQgPSAxMDAsCiAgICApIC0+IGxpc3RbZGljdFtzdHIsIEFueV1dOgogICAgICAgIGF3YWl0IHNlbGYuX2Vuc3VyZV9pbml0aWFsaXplZCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgbGltaXQgPSBtYXgoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgbWluKAogICAgICAgICAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIDEwMDAsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCAoCiAgICAgICAgICAgIFR5cGVFcnJvciwKICAgICAgICAgICAgVmFsdWVFcnJvciwKICAgICAgICApOgogICAgICAgICAgICBsaW1pdCA9IDEwMAoKICAgICAgICByZXR1cm4gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgICAgIHNlbGYuX2dldF9hbGxfb3JkZXJzX3N5bmMsCiAgICAgICAgICAgIGxpbWl0LAogICAgICAgICkKCiAgICBkZWYgX2dldF9hbGxfb3JkZXJzX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICBsaW1pdDogaW50LAogICAgKSAtPiBsaXN0W2RpY3Rbc3RyLCBBbnldXToKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUICoKICAgICAgICAgICAgICAgIEZST00gb3JkZXJzCiAgICAgICAgICAgICAgICBPUkRFUiBCWSBpZCBERVNDCiAgICAgICAgICAgICAgICBMSU1JVCA/CiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgbGltaXQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNoYWxsKCkKCiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBkaWN0KAogICAgICAgICAgICAgICAgICAgIHJvdwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIHJvdwogICAgICAgICAgICAgICAgaW4gcm93cwogICAgICAgICAgICBdCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgU3RhdGlzdGljcwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGRlZiBnZXRfc3RhdGlzdGljcygKICAgICAgICBzZWxmLAogICAgKSAtPiBkaWN0W3N0ciwgQW55XToKICAgICAgICBhd2FpdCBzZWxmLl9lbnN1cmVfaW5pdGlhbGl6ZWQoKQoKICAgICAgICByZXR1cm4gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgICAgIHNlbGYuX2dldF9zdGF0aXN0aWNzX3N5bmMKICAgICAgICApCgogICAgZGVmIF9nZXRfc3RhdGlzdGljc19zeW5jKAogICAgICAgIHNlbGYsCiAgICApIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB1c2VycyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUIENPVU5UKCopIEFTIGNvdW50CiAgICAgICAgICAgICAgICBGUk9NIHVzZXJzCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgKS5mZXRjaG9uZSgpWwogICAgICAgICAgICAgICAgImNvdW50IgogICAgICAgICAgICBdCgogICAgICAgICAgICBvcmRlcnMgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFNFTEVDVCBDT1VOVCgqKSBBUyBjb3VudAogICAgICAgICAgICAgICAgRlJPTSBvcmRlcnMKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICApLmZldGNob25lKClbCiAgICAgICAgICAgICAgICAiY291bnQiCiAgICAgICAgICAgIF0KCiAgICAgICAgICAgIGNvbXBsZXRlZCA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUIENPVU5UKCopIEFTIGNvdW50CiAgICAgICAgICAgICAgICBGUk9NIG9yZGVycwogICAgICAgICAgICAgICAgV0hFUkUgc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICApLmZldGNob25lKClbCiAgICAgICAgICAgICAgICAiY291bnQiCiAgICAgICAgICAgIF0KCiAgICAgICAgICAgIHJldmVudWUgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFNFTEVDVCBDT0FMRVNDRSgKICAgICAgICAgICAgICAgICAgICBTVU0ocHJpY2UpLAogICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICkgQVMgdG90YWwKICAgICAgICAgICAgICAgIEZST00gb3JkZXJzCiAgICAgICAgICAgICAgICBXSEVSRSBzdGF0dXMgPSAnY29tcGxldGVkJwogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKVsKICAgICAgICAgICAgICAgICJ0b3RhbCIKICAgICAgICAgICAgXQoKICAgICAgICAgICAgd2FsbGV0ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QgQ09BTEVTQ0UoCiAgICAgICAgICAgICAgICAgICAgU1VNKGJhbGFuY2VfdG9tYW4pLAogICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICkgQVMgdG90YWwKICAgICAgICAgICAgICAgIEZST00gdXNlcnMKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICApLmZldGNob25lKClbCiAgICAgICAgICAgICAgICAidG90YWwiCiAgICAgICAgICAgIF0KCiAgICAgICAgICAgIHBlbmRpbmdfb3duZXIgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFNFTEVDVCBDT1VOVCgqKSBBUyBjb3VudAogICAgICAgICAgICAgICAgRlJPTSBvcmRlcnMKICAgICAgICAgICAgICAgIFdIRVJFIHN0YXR1cyA9ICdwZW5kaW5nX293bmVyX2FwcHJvdmFsJwogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKVsKICAgICAgICAgICAgICAgICJjb3VudCIKICAgICAgICAgICAgXQoKICAgICAgICAgICAgcHJvdmlkZXJfdW5rbm93biA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUIENPVU5UKCopIEFTIGNvdW50CiAgICAgICAgICAgICAgICBGUk9NIG9yZGVycwogICAgICAgICAgICAgICAgV0hFUkUgc3RhdHVzID0gJ3Byb3ZpZGVyX3N0YXR1c191bmtub3duJwogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKVsKICAgICAgICAgICAgICAgICJjb3VudCIKICAgICAgICAgICAgXQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJ1c2VycyI6CiAgICAgICAgICAgICAgICAgICAgaW50KAogICAgICAgICAgICAgICAgICAgICAgICB1c2VycwogICAgICAgICAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICAgICAgICAgKSwKCiAgICAgICAgICAgICAgICAib3JkZXJzIjoKICAgICAgICAgICAgICAgICAgICBpbnQoCiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVycwogICAgICAgICAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICAgICAgICAgKSwKCiAgICAgICAgICAgICAgICAiY29tcGxldGVkX29yZGVycyI6CiAgICAgICAgICAgICAgICAgICAgaW50KAogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgb3IgMAogICAgICAgICAgICAgICAgICAgICksCgogICAgICAgICAgICAgICAgInJldmVudWVfdG9tYW4iOgogICAgICAgICAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZW51ZQogICAgICAgICAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICAgICAgICAgKSwKCiAgICAgICAgICAgICAgICAid2FsbGV0X2JhbGFuY2VfdG9tYW4iOgogICAgICAgICAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgICAgICAgICAgd2FsbGV0CiAgICAgICAgICAgICAgICAgICAgICAgIG9yIDAKICAgICAgICAgICAgICAgICAgICApLAoKICAgICAgICAgICAgICAgICJwZW5kaW5nX293bmVyX29yZGVycyI6CiAgICAgICAgICAgICAgICAgICAgaW50KAogICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX293bmVyCiAgICAgICAgICAgICAgICAgICAgICAgIG9yIDAKICAgICAgICAgICAgICAgICAgICApLAoKICAgICAgICAgICAgICAgICJwcm92aWRlcl91bmtub3duX29yZGVycyI6CiAgICAgICAgICAgICAgICAgICAgaW50KAogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcl91bmtub3duCiAgICAgICAgICAgICAgICAgICAgICAgIG9yIDAKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9CgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgQXVkaXQKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgYWRkX2F1ZGl0X2xvZygKICAgICAgICBzZWxmLAogICAgICAgICosCiAgICAgICAgdXNlcl9pZDogT3B0aW9uYWxbaW50XSwKICAgICAgICBhY3Rpb246IHN0ciwKICAgICAgICBkZXRhaWxzOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgICAgICBpcF9hZGRyZXNzOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgICkgLT4gYm9vbDoKICAgICAgICBhd2FpdCBzZWxmLl9lbnN1cmVfaW5pdGlhbGl6ZWQoKQoKICAgICAgICByZXR1cm4gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgICAgIHNlbGYuX2FkZF9hdWRpdF9sb2dfc3luYywKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaW50KHVzZXJfaWQpCiAgICAgICAgICAgICAgICBpZiB1c2VyX2lkIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICBlbHNlIE5vbmUKICAgICAgICAgICAgKSwKICAgICAgICAgICAgc3RyKAogICAgICAgICAgICAgICAgYWN0aW9uCiAgICAgICAgICAgICAgICBvciAiIgogICAgICAgICAgICApLnN0cmlwKCksCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIHN0cihkZXRhaWxzKQogICAgICAgICAgICAgICAgaWYgZGV0YWlscyBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgICAgICksCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIHN0cihpcF9hZGRyZXNzKQogICAgICAgICAgICAgICAgaWYgaXBfYWRkcmVzcyBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGRlZiBfYWRkX2F1ZGl0X2xvZ19zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogT3B0aW9uYWxbaW50XSwKICAgICAgICBhY3Rpb246IHN0ciwKICAgICAgICBkZXRhaWxzOiBPcHRpb25hbFtzdHJdLAogICAgICAgIGlwX2FkZHJlc3M6IE9wdGlvbmFsW3N0cl0sCiAgICApIC0+IGJvb2w6CiAgICAgICAgaWYgbm90IGFjdGlvbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIGF1ZGl0X2xvZ3MgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIGRldGFpbHMsCiAgICAgICAgICAgICAgICAgICAgaXBfYWRkcmVzcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/KQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIGRldGFpbHMsCiAgICAgICAgICAgICAgICAgICAgaXBfYWRkcmVzcywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWRkIGF1ZGl0IGxvZyB8IGFjdGlvbj0lcyIsCiAgICAgICAgICAgICAgICBhY3Rpb24sCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEhlYWx0aCAvIENsb3NlCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYXN5bmMgZGVmIGhlYWx0aF9jaGVjaygKICAgICAgICBzZWxmLAogICAgKSAtPiBib29sOgogICAgICAgIHRyeToKICAgICAgICAgICAgYXdhaXQgc2VsZi5fZW5zdXJlX2luaXRpYWxpemVkKCkKCiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgICAgIHNlbGYuX2hlYWx0aF9jaGVja19zeW5jCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJEYXRhYmFzZSBoZWFsdGggY2hlY2sgZmFpbGVkLiIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9oZWFsdGhfY2hlY2tfc3luYygKICAgICAgICBzZWxmLAogICAgKSAtPiBib29sOgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiU0VMRUNUIDEgQVMgb2siCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICAgICAgIyBBbHNvIHZhbGlkYXRlIHRoZSBjYW5vbmljYWwgdXNlciBrZXkgZXhpc3RzLgogICAgICAgICAgICBjb2x1bW5zID0gc2VsZi5fY29sdW1uX25hbWVzKAogICAgICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgICAgICJ1c2VycyIsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBib29sKAogICAgICAgICAgICAgICAgcm93CiAgICAgICAgICAgICAgICBhbmQgcm93WwogICAgICAgICAgICAgICAgICAgICJvayIKICAgICAgICAgICAgICAgIF0gPT0gMQogICAgICAgICAgICAgICAgYW5kICJ1c2VyX2lkIgogICAgICAgICAgICAgICAgaW4gY29sdW1ucwogICAgICAgICAgICApCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGFzeW5jIGRlZiBjbG9zZSgKICAgICAgICBzZWxmLAogICAgKSAtPiBOb25lOgogICAgICAgICMgQ29ubmVjdGlvbnMgYXJlIHNob3J0LWxpdmVkLCBzbyB0aGVyZSBpcyBubyBvcGVuIHNoYXJlZAogICAgICAgICMgU1FMaXRlIGhhbmRsZSB0byBjbG9zZS4KICAgICAgICBzZWxmLl9pbml0aWFsaXplZCA9IEZhbHNlCgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAiRGF0YWJhc2UgbWFuYWdlciBjbG9zZWQuIgogICAgICAgICkKCgpfX2FsbF9fID0gWwogICAgIkRhdGFiYXNlTWFuYWdlciIsCl0K', 'core/ui_emojis.py': 'IyBjb3JlL3VpX2Vtb2ppcy5weQpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgcmUKZnJvbSB0eXBpbmcgaW1wb3J0IEZpbmFsCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBDdXN0b20gUHJlbWl1bSBFbW9qaSBJRHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIwojINin24zZhiBJRNmH2Kcg2KfYsiDYp9uM2YXZiNis24zigIzZh9in24zbjCDaqdmHINmH2YXbjNmGINm+2LHZiNqY2Ycg2YLYqNmE2KfZiyDYp9iz2KrZgdin2K/ZhyDZhduM4oCM2qnYsdivCiMg2YXYqtmF2LHaqdiyINi02K/Zh+KAjNin2YbYryDYqtinINin2q/YsSDYqNi52K/Yp9mLINiu2YjYp9iz2KrbjCDbjNqpIEVtb2ppIElEINix2Kcg2LnZiNi2INqp2YbbjNiMCiMg2YHZgti3INmH2YXbjNmGINmB2KfbjNmEINix2Kcg2KrYutuM24zYsSDYqNiv2YfbjC4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNVU1RPTV9FTU9KSTogRmluYWxbZGljdFtzdHIsIHR1cGxlW3N0ciwgc3RyXV1dID0gewogICAgIyBHZW5lcmFsIFVJCiAgICAic2hvcCI6ICgiNTQwMjUxNjMyMzcxMDI3OTkwOCIsICLwn5uSIiksCiAgICAid2FsbGV0IjogKCI1ODAzMTQzMDM5MDYwODA4ODkwIiwgIvCfkZ0iKSwKICAgICJhZGQiOiAoIjUzMTg5NzQ5MzYzMTA2Mjc2OTgiLCAi4p6VIiksCiAgICAidXNlcnMiOiAoIjU4NzUxODAxMTE3NDQ5OTU2MDQiLCAi8J+RpSIpLAogICAgInN1cHBvcnQiOiAoIjUzMTkxNjQwMjIyNDU4MzI2NTkiLCAi8J+TniIpLAogICAgImhpc3RvcnkiOiAoIjU5ODU3NzQwMjQ5NjgzNzkyOTQiLCAi8J+TiiIpLAogICAgImJhY2siOiAoIjU0NDcxODM0NTk2MDI2NjkzMzgiLCAi8J+UmSIpLAogICAgImNhcmQiOiAoIjUzMDUyNjUzMDE5MTc1NDkxNjIiLCAi8J+SsyIpLAogICAgImJvbHQiOiAoIjU0NDk2ODM1OTQ0MjU0MTAyMzEiLCAi4pqh77iPIiksCgogICAgIyBQcm9kdWN0cwogICAgInN0YXJzIjogKCI1ODQzODkyMDgyNDQ3NDg3MDg4IiwgIuKtkO+4jyIpLAogICAgInByZW1pdW0iOiAoIjU4MjM1Mzc1ODgxODY2NDc5ODAiLCAi8J+SjiIpLAogICAgInRvbiI6ICgiNjAwODE5NjIwMjM4NDg1OTAwOCIsICLwn5KOIiksCiAgICAiZ2lmdCI6ICgiNTI5NDQ2NjM2MjU2NjAxNDA2NyIsICLwn46BIiksCiAgICAic3BhcmtsZXMiOiAoIjU4OTk3NjQ0NTMwMDc2OTIwODUiLCAi4pyoIiksCiAgICAidHJ4IjogKCI2MDMyNzEzMjkzMDQ5NjMzMDgwIiwgIvCfqpkiKSwKICAgICJyZWFjdGlvbiI6ICgiNTk1MTcwNDY2OTMzOTI1ODk1MSIsICLirZDvuI8iKSwKICAgICJnaXZlYXdheSI6ICgiNTk1MTgwMTQ4NjQ5MjA0NTM0NiIsICLwn46JIiksCgogICAgIyBNZXNzYWdlL3N0YXR1cyBlbW9qaXMgYWxyZWFkeSB1c2VkIGJ5IHByb2plY3QKICAgICJzdWNjZXNzIjogKCI1OTUxODYxNzc0OTQ3OTc5NjIwIiwgIuKchSIpLAogICAgImVycm9yIjogKCI2MDMwNDMwMjc3NDEzNjM4NTM0IiwgIuKdjCIpLAogICAgIndhcm5pbmciOiAoIjYwMzA0MzAyNzc0MTM2Mzg1MzQiLCAi4pqg77iPIiksCiAgICAibG9hZGluZyI6ICgiNTk4NzgwMzgyNjUxMjQ2NjE4NCIsICLij7MiKSwKICAgICJwYWNrYWdlIjogKCI1OTkwMTQ3ODk5NDAzNTM5MjY0IiwgIvCfk6YiKSwKICAgICJtb25leSI6ICgiNTk5MDE0Nzg5OTQwMzUzOTI2NCIsICLwn5K1IiksCiAgICAidXNlciI6ICgiNTQzMTU3NzQ5ODM2NDE1ODIzOCIsICLwn5GkIiksCiAgICAidGFyZ2V0IjogKCI1OTg3ODAzODI2NTEyNDY2MTg0IiwgIvCfjq8iKSwKICAgICJjaGF0IjogKCI1OTg3ODAzODI2NTEyNDY2MTg0IiwgIvCfkqwiKSwKICAgICJoZWxsbyI6ICgiNTQzMTU3NzQ5ODM2NDE1ODIzOCIsICLwn5GLIiksCiAgICAibGlzdCI6ICgiNTQzMTU3NzQ5ODM2NDE1ODIzOCIsICLwn5OcIiksCiAgICAicGluIjogKCI1OTg1Nzc0MDI0OTY4Mzc5Mjk0IiwgIvCfk4wiKSwKICAgICJwYXJ0eSI6ICgiNTk1MTgwMTQ4NjQ5MjA0NTM0NiIsICLwn46JIiksCn0KCgojIFVuaWNvZGUgZW1vamkgLT4ga2V5Cl9URVhUX0VNT0pJX0tFWVM6IEZpbmFsW2RpY3Rbc3RyLCBzdHJdXSA9IHsKICAgICLwn5uSIjogInNob3AiLAogICAgIvCfkZ0iOiAid2FsbGV0IiwKICAgICLinpUiOiAiYWRkIiwKICAgICLwn5GlIjogInVzZXJzIiwKICAgICLwn5OeIjogInN1cHBvcnQiLAogICAgIvCfk4oiOiAiaGlzdG9yeSIsCiAgICAi8J+UmSI6ICJiYWNrIiwKICAgICLwn5KzIjogImNhcmQiLAogICAgIuKaoe+4jyI6ICJib2x0IiwKICAgICLimqEiOiAiYm9sdCIsCiAgICAi4q2Q77iPIjogInN0YXJzIiwKICAgICLirZAiOiAic3RhcnMiLAogICAgIvCfko4iOiAicHJlbWl1bSIsCiAgICAi8J+OgSI6ICJnaWZ0IiwKICAgICLinKgiOiAic3BhcmtsZXMiLAogICAgIvCfqpkiOiAidHJ4IiwKICAgICLwn46JIjogInBhcnR5IiwKICAgICLinIUiOiAic3VjY2VzcyIsCiAgICAi4p2MIjogImVycm9yIiwKICAgICLimqDvuI8iOiAid2FybmluZyIsCiAgICAi4pqgIjogIndhcm5pbmciLAogICAgIuKPsyI6ICJsb2FkaW5nIiwKICAgICLwn5OmIjogInBhY2thZ2UiLAogICAgIvCfkrUiOiAibW9uZXkiLAogICAgIvCfkrAiOiAibW9uZXkiLAogICAgIvCfkaQiOiAidXNlciIsCiAgICAi8J+OryI6ICJ0YXJnZXQiLAogICAgIvCfkqwiOiAiY2hhdCIsCiAgICAi8J+RiyI6ICJoZWxsbyIsCiAgICAi8J+TnCI6ICJsaXN0IiwKICAgICLwn5OMIjogInBpbiIsCiAgICAi8J+PoCI6ICJzaG9wIiwKICAgICLwn5uNIjogInNob3AiLAogICAgIvCfm43vuI8iOiAic2hvcCIsCiAgICAi8J+RhyI6ICJ0YXJnZXQiLAp9CgoKX1RHX0VNT0pJX0JMT0NLX1JFID0gcmUuY29tcGlsZSgKICAgIHIiKDx0Zy1lbW9qaVxiW14+XSo+Lio/PC90Zy1lbW9qaT4pIiwKICAgIGZsYWdzPXJlLklHTk9SRUNBU0UgfCByZS5ET1RBTEwsCikKCgpkZWYgZW1vamlfaWQobmFtZTogc3RyKSAtPiBzdHI6CiAgICAiIiIKICAgINmB2YLYtyBJRCDYp9uM2YXZiNis24wg2KjYsdin24wgaWNvbl9jdXN0b21fZW1vamlfaWQg2K/aqdmF2YcuCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gQ1VTVE9NX0VNT0pJW25hbWVdWzBdCiAgICBleGNlcHQgS2V5RXJyb3IgYXMgZXhjOgogICAgICAgIHJhaXNlIEtleUVycm9yKAogICAgICAgICAgICBmIlVua25vd24gY3VzdG9tIGVtb2ppIGtleToge25hbWV9IgogICAgICAgICkgZnJvbSBleGMKCgpkZWYgZmFsbGJhY2tfZW1vamkobmFtZTogc3RyKSAtPiBzdHI6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIENVU1RPTV9FTU9KSVtuYW1lXVsxXQogICAgZXhjZXB0IEtleUVycm9yIGFzIGV4YzoKICAgICAgICByYWlzZSBLZXlFcnJvcigKICAgICAgICAgICAgZiJVbmtub3duIGN1c3RvbSBlbW9qaSBrZXk6IHtuYW1lfSIKICAgICAgICApIGZyb20gZXhjCgoKZGVmIGNlKAogICAgbmFtZTogc3RyLAogICAgZmFsbGJhY2s6IHN0ciB8IE5vbmUgPSBOb25lLAopIC0+IHN0cjoKICAgICIiIgogICAgQ3VzdG9tIEVtb2ppINio2LHYp9uMINmF2KrZhuKAjNmH2KfbjCBIVE1MINiq2YTar9ix2KfZhS4KCiAgICDZhdir2KfZhDoKICAgICAgICBmIntjZSgnc3VjY2VzcycpfSDYrtix24zYryDZhdmI2YHZgiDYqNmI2K8iCiAgICAiIiIKICAgIGVtb2ppX2RvY3VtZW50X2lkLCBkZWZhdWx0X2ZhbGxiYWNrID0gQ1VTVE9NX0VNT0pJW25hbWVdCgogICAgYWx0ID0gZmFsbGJhY2sgb3IgZGVmYXVsdF9mYWxsYmFjawoKICAgIHJldHVybiAoCiAgICAgICAgZic8dGctZW1vamkgZW1vamktaWQ9IntlbW9qaV9kb2N1bWVudF9pZH0iPicKICAgICAgICBmInthbHR9IgogICAgICAgIGYiPC90Zy1lbW9qaT4iCiAgICApCgoKZGVmIHByZW1pdW1pemVfaHRtbCh0ZXh0OiBzdHIpIC0+IHN0cjoKICAgICIiIgogICAg2KfbjNmF2YjYrNuM4oCM2YfYp9uMINmF2LnZhdmI2YTbjCDZhdmI2KzZiNivINiv2LEg2YXYqtmGIEhUTUwg2LHYpyDYqNmHIEN1c3RvbSBFbW9qaQogICAg2KrYqNiv24zZhCDZhduM4oCM2qnZhtivLgoKICAgINio2YTZiNqp4oCM2YfYp9uMIDx0Zy1lbW9qaT4g2YXZiNis2YjYryDYsdinINiv2LPYqiDZhtmF24zigIzYstmG2K8g2KrYpyBuZXN0ZWQgdGFnCiAgICDYs9in2K7YqtmHINmG2LTZiNivLgogICAgIiIiCiAgICBpZiBub3QgdGV4dDoKICAgICAgICByZXR1cm4gdGV4dAoKICAgIHBhcnRzID0gX1RHX0VNT0pJX0JMT0NLX1JFLnNwbGl0KHRleHQpCgogICAgZm9yIGluZGV4LCBwYXJ0IGluIGVudW1lcmF0ZShwYXJ0cyk6CiAgICAgICAgaWYgbm90IHBhcnQ6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIHBhcnQubG93ZXIoKS5zdGFydHN3aXRoKCI8dGctZW1vamkiKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBMb25nZXN0IHNlcXVlbmNlcyBmaXJzdCAoZS5nLiDirZDvuI8gYmVmb3JlIOKtkCkKICAgICAgICBmb3IgcmF3X2Vtb2ppIGluIHNvcnRlZCgKICAgICAgICAgICAgX1RFWFRfRU1PSklfS0VZUywKICAgICAgICAgICAga2V5PWxlbiwKICAgICAgICAgICAgcmV2ZXJzZT1UcnVlLAogICAgICAgICk6CiAgICAgICAgICAgIGtleSA9IF9URVhUX0VNT0pJX0tFWVNbcmF3X2Vtb2ppXQoKICAgICAgICAgICAgaWYgcmF3X2Vtb2ppIGluIHBhcnQ6CiAgICAgICAgICAgICAgICBwYXJ0ID0gcGFydC5yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgIHJhd19lbW9qaSwKICAgICAgICAgICAgICAgICAgICBjZSgKICAgICAgICAgICAgICAgICAgICAgICAga2V5LAogICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFjaz1yYXdfZW1vamksCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgcGFydHNbaW5kZXhdID0gcGFydAoKICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQo=', 'handlers/user/shop.py': 'IyBoYW5kbGVycy91c2VyL3Nob3AucHkKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCBhc3luY2lvCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgc3FsaXRlMwpmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwsIFJPVU5EX0hBTEZfVVAKZnJvbSBodG1sIGltcG9ydCBlc2NhcGUKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgRmluYWwsIE9wdGlvbmFsCgpmcm9tIGFpb2dyYW0gaW1wb3J0IEYsIFJvdXRlcgpmcm9tIGFpb2dyYW0uZXhjZXB0aW9ucyBpbXBvcnQgVGVsZWdyYW1CYWRSZXF1ZXN0LCBUZWxlZ3JhbUZvcmJpZGRlbkVycm9yCmZyb20gYWlvZ3JhbS5mc20uY29udGV4dCBpbXBvcnQgRlNNQ29udGV4dApmcm9tIGFpb2dyYW0udHlwZXMgaW1wb3J0ICgKICAgIENhbGxiYWNrUXVlcnksCiAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbiwKICAgIElubGluZUtleWJvYXJkTWFya3VwLAogICAgTWVzc2FnZSwKKQpmcm9tIGFpb2dyYW0udXRpbHMua2V5Ym9hcmQgaW1wb3J0IElubGluZUtleWJvYXJkQnVpbGRlcgoKZnJvbSBjb3JlLmNvbmZpZyBpbXBvcnQgc2V0dGluZ3MKZnJvbSBjb3JlLnVpX2Vtb2ppcyBpbXBvcnQgY2UsIGVtb2ppX2lkLCBwcmVtaXVtaXplX2h0bWwKCmZyb20ga2V5Ym9hcmRzLnVzZXJfa2IgaW1wb3J0ICgKICAgIGdldF9wcm9kdWN0c19tZW51X2tleWJvYXJkLAogICAgZ2V0X3NlcnZpY2VzX3BhY2thZ2VzX2tleWJvYXJkLAogICAgZ2V0X3VzZXJfbWFpbl9tZW51LAogICAgZ2V0X3dhbGxldF9tZW51X2tleWJvYXJkLAopCgp0cnk6CiAgICBmcm9tIGtleWJvYXJkcy5hZG1pbl9rYiBpbXBvcnQgZ2V0X293bmVyX29yZGVyX2tleWJvYXJkCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGdldF9vd25lcl9vcmRlcl9rZXlib2FyZCA9IE5vbmUKCmZyb20gc2VydmljZXMucHJvZHVjdF9wcmljaW5nX3NlcnZpY2UgaW1wb3J0ICgKICAgIFByb2R1Y3RQcmljZU5vdENvbmZpZ3VyZWQsCiAgICBQcm9kdWN0UHJpY2luZ0Vycm9yLAogICAgUHJvZHVjdFByaWNpbmdTZXJ2aWNlLAogICAgUHJvZHVjdFJhdGVVbmF2YWlsYWJsZSwKKQpmcm9tIHNlcnZpY2VzLm9yZGVyX3NlcnZpY2UgaW1wb3J0ICgKICAgIE9yZGVyLAogICAgT3JkZXJTZXJ2aWNlLAogICAgU1RBVFVTX0NPTVBMRVRFRCwKICAgIFNUQVRVU19GQUlMRURfUkVGVU5ERUQsCiAgICBTVEFUVVNfQ0FOQ0VMTEVEX0JZX1VTRVIsCiAgICBTVEFUVVNfSU5TVUZGSUNJRU5UX0JBTEFOQ0UsCiAgICBTVEFUVVNfT1dORVJfUFJPQ0VTU0lORywKICAgIFNUQVRVU19QRU5ESU5HX09XTkVSLAogICAgU1RBVFVTX1BSSUNFX0NIQU5HRUQsCiAgICBTVEFUVVNfUFJPVklERVJfUFJPQ0VTU0lORywKICAgIFNUQVRVU19QUk9WSURFUl9VTktOT1dOLAogICAgU1RBVFVTX1JFSkVDVEVEX0JZX09XTkVSLAopCmZyb20gc3RhdGVzLm9yZGVyIGltcG9ydCBPcmRlclN0YXRlcwoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKcm91dGVyID0gUm91dGVyKAogICAgbmFtZT0idXNlcl9zaG9wIgopCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQcm9kdWN0cwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKUEFDS0FHRV9OQU1FUzogRmluYWxbZGljdFtzdHIsIHN0cl1dID0gewogICAgIyBQcmVtaXVtCiAgICAicHJlbV8xbSI6CiAgICAgICAgItin2LTYqtix2KfaqSDZvtix2YXbjNmI2YUg27Eg2YXYp9mH2Ycg2KrZhNqv2LHYp9mFIiwKCiAgICAicHJlbV8zbSI6CiAgICAgICAgItin2LTYqtix2KfaqSDZvtix2YXbjNmI2YUg27Mg2YXYp9mH2Ycg2KrZhNqv2LHYp9mFIiwKCiAgICAicHJlbV82bSI6CiAgICAgICAgItin2LTYqtix2KfaqSDZvtix2YXbjNmI2YUg27Yg2YXYp9mH2Ycg2KrZhNqv2LHYp9mFIiwKCiAgICAicHJlbV8xeSI6CiAgICAgICAgItin2LTYqtix2KfaqSDZvtix2YXbjNmI2YUg27Eg2LPYp9mE2Ycg2KrZhNqv2LHYp9mFIiwKCiAgICAjIFN0YXJzCiAgICAic3RhcnNfNTAiOgogICAgICAgICLbtduwINi52K/YryDYp9iz2KrYp9ix2LIg2KrZhNqv2LHYp9mFIiwKCiAgICAic3RhcnNfMTAwIjoKICAgICAgICAi27HbsNuwINi52K/YryDYp9iz2KrYp9ix2LIg2KrZhNqv2LHYp9mFIiwKCiAgICAic3RhcnNfMjUwIjoKICAgICAgICAi27LbtduwINi52K/YryDYp9iz2KrYp9ix2LIg2KrZhNqv2LHYp9mFIiwKCiAgICAic3RhcnNfNTAwIjoKICAgICAgICAi27XbsNuwINi52K/YryDYp9iz2KrYp9ix2LIg2KrZhNqv2LHYp9mFIiwKCiAgICAic3RhcnNfMTAwMCI6CiAgICAgICAgItux27DbsNuwINi52K/YryDYp9iz2KrYp9ix2LIg2KrZhNqv2LHYp9mFIiwKCiAgICAic3RhcnNfNTAwMCI6CiAgICAgICAgItu127DbsNuwINi52K/YryDYp9iz2KrYp9ix2LIg2KrZhNqv2LHYp9mFIiwKfQoKClBSRU1JVU1fTU9OVEhTOiBGaW5hbFsKICAgIGRpY3Rbc3RyLCBpbnRdCl0gPSB7CiAgICAicHJlbV8xbSI6IDEsCiAgICAicHJlbV8zbSI6IDMsCiAgICAicHJlbV82bSI6IDYsCiAgICAicHJlbV8xeSI6IDEyLAp9CgoKU1RBUlNfQU1PVU5UUzogRmluYWxbCiAgICBkaWN0W3N0ciwgaW50XQpdID0gewogICAgInN0YXJzXzUwIjogNTAsCiAgICAic3RhcnNfMTAwIjogMTAwLAogICAgInN0YXJzXzI1MCI6IDI1MCwKICAgICJzdGFyc181MDAiOiA1MDAsCiAgICAic3RhcnNfMTAwMCI6IDEwMDAsCiAgICAic3RhcnNfNTAwMCI6IDUwMDAsCn0KCgpNSU5fQ1VTVE9NX1NUQVJTOiBGaW5hbFtpbnRdID0gNTAKTUFYX0NVU1RPTV9TVEFSUzogRmluYWxbaW50XSA9IDEwXzAwMAoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgRGF0YWJhc2UgUGF0aAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIHJlc29sdmVfZGF0YWJhc2VfcGF0aCgKICAgIGRiOiBBbnkgPSBOb25lLAopIC0+IHN0cjoKICAgIGlmIGRiIGlzIG5vdCBOb25lOgogICAgICAgIGZvciBhdHRyaWJ1dGUgaW4gKAogICAgICAgICAgICAiZGJfcGF0aCIsCiAgICAgICAgICAgICJkYXRhYmFzZV9wYXRoIiwKICAgICAgICAgICAgInBhdGgiLAogICAgICAgICk6CiAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cigKICAgICAgICAgICAgICAgIGRiLAogICAgICAgICAgICAgICAgYXR0cmlidXRlLAogICAgICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgdmFsdWU6CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHZhbHVlKQoKICAgIHJldHVybiBzdHIoCiAgICAgICAgZ2V0YXR0cigKICAgICAgICAgICAgc2V0dGluZ3MsCiAgICAgICAgICAgICJEQl9QQVRIIiwKICAgICAgICAgICAgTm9uZSwKICAgICAgICApCiAgICAgICAgb3IgZ2V0YXR0cigKICAgICAgICAgICAgc2V0dGluZ3MsCiAgICAgICAgICAgICJEQVRBQkFTRV9QQVRIIiwKICAgICAgICAgICAgTm9uZSwKICAgICAgICApCiAgICAgICAgb3IgIm1hdHJpeF9ib3QuZGIiCiAgICApCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBNYW51YWwgUHJvZHVjdCBQcmljZSArIExpdmUgVVNEVC9Ub21hbiBQcmV2aWV3CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpQUkVNSVVNX01FTlVfT1JERVI6IEZpbmFsWwogICAgdHVwbGVbc3RyLCAuLi5dCl0gPSAoCiAgICAicHJlbV8xbSIsCiAgICAicHJlbV8zbSIsCiAgICAicHJlbV82bSIsCiAgICAicHJlbV8xeSIsCikKClNUQVJTX01FTlVfT1JERVI6IEZpbmFsWwogICAgdHVwbGVbc3RyLCAuLi5dCl0gPSAoCiAgICAic3RhcnNfNTAiLAogICAgInN0YXJzXzEwMCIsCiAgICAic3RhcnNfMjUwIiwKICAgICJzdGFyc181MDAiLAogICAgInN0YXJzXzEwMDAiLAogICAgInN0YXJzXzUwMDAiLAopCgoKZGVmIF9wYWNrYWdlX3Nob3J0X3RpdGxlKAogICAgcGFja2FnZV9pZDogc3RyLAopIC0+IHN0cjoKICAgIHRpdGxlcyA9IHsKICAgICAgICAicHJlbV8xbSI6CiAgICAgICAgICAgICJQcmVtaXVtINuxINmF2KfZh9mHIiwKCiAgICAgICAgInByZW1fM20iOgogICAgICAgICAgICAiUHJlbWl1bSDbsyDZhdin2YfZhyIsCgogICAgICAgICJwcmVtXzZtIjoKICAgICAgICAgICAgIlByZW1pdW0g27Yg2YXYp9mH2YciLAoKICAgICAgICAicHJlbV8xeSI6CiAgICAgICAgICAgICJQcmVtaXVtINuxINiz2KfZhNmHIiwKCiAgICAgICAgInN0YXJzXzUwIjoKICAgICAgICAgICAgIjUwIFN0YXJzIiwKCiAgICAgICAgInN0YXJzXzEwMCI6CiAgICAgICAgICAgICIxMDAgU3RhcnMiLAoKICAgICAgICAic3RhcnNfMjUwIjoKICAgICAgICAgICAgIjI1MCBTdGFycyIsCgogICAgICAgICJzdGFyc181MDAiOgogICAgICAgICAgICAiNTAwIFN0YXJzIiwKCiAgICAgICAgInN0YXJzXzEwMDAiOgogICAgICAgICAgICAiMSwwMDAgU3RhcnMiLAoKICAgICAgICAic3RhcnNfNTAwMCI6CiAgICAgICAgICAgICI1LDAwMCBTdGFycyIsCiAgICB9CgogICAgcmV0dXJuIHRpdGxlcy5nZXQoCiAgICAgICAgcGFja2FnZV9pZCwKICAgICAgICBQQUNLQUdFX05BTUVTLmdldCgKICAgICAgICAgICAgcGFja2FnZV9pZCwKICAgICAgICAgICAgcGFja2FnZV9pZCwKICAgICAgICApLAogICAgKQoKCmFzeW5jIGRlZiBnZXRfbWFudWFsX3Byb2R1Y3RfcXVvdGUoCiAgICBwYWNrYWdlX2lkOiBzdHIsCiAgICAqLAogICAgZGI6IEFueSA9IE5vbmUsCiAgICBmb3JjZV9yZWZyZXNoX3JhdGU6IGJvb2wgPSBGYWxzZSwKKToKICAgIHNlcnZpY2UgPSBQcm9kdWN0UHJpY2luZ1NlcnZpY2UoCiAgICAgICAgcmVzb2x2ZV9kYXRhYmFzZV9wYXRoKAogICAgICAgICAgICBkYgogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYXdhaXQgc2VydmljZS5xdW90ZV90b21hbigKICAgICAgICBwYWNrYWdlX2lkLAogICAgICAgIGZvcmNlX3JlZnJlc2hfcmF0ZT1mb3JjZV9yZWZyZXNoX3JhdGUsCiAgICAgICAgYWxsb3dfc3RhbGVfcmF0ZT1UcnVlLAogICAgKQoKCmFzeW5jIGRlZiBnZXRfbGl2ZV9wcmV2aWV3X3ByaWNlcygKICAgIHBhY2thZ2VfaWRzOiB0dXBsZVtzdHIsIC4uLl0KICAgIHwgbGlzdFtzdHJdLAogICAgKiwKICAgIGRiOiBBbnkgPSBOb25lLAopIC0+IHR1cGxlWwogICAgZGljdFtzdHIsIE9wdGlvbmFsW2ludF1dLAogICAgT3B0aW9uYWxbc3RyXSwKXToKICAgICIiIgogICAgQ29tcGF0aWJpbGl0eSBoZWxwZXIgdXNlZCBieSBzaG9wIFVJLgoKICAgIFByb2R1Y3QgYmFzZSBwcmljZXMgYXJlIGNvbmZpZ3VyZWQgYnkgYWRtaW4gaW4gVVNEVC4KICAgIE9ubHkgVVNEVC9Ub21hbiBpcyBmZXRjaGVkIGxpdmUuCiAgICAiIiIKICAgIHByaWNlczogZGljdFsKICAgICAgICBzdHIsCiAgICAgICAgT3B0aW9uYWxbaW50XSwKICAgIF0gPSB7fQoKICAgIGVycm9yczogbGlzdFsKICAgICAgICBzdHIKICAgIF0gPSBbXQoKICAgIGZvciBwYWNrYWdlX2lkIGluIHBhY2thZ2VfaWRzOgogICAgICAgIHBhY2thZ2VfaWQgPSBzdHIoCiAgICAgICAgICAgIHBhY2thZ2VfaWQKICAgICAgICApCgogICAgICAgIHRyeToKICAgICAgICAgICAgcXVvdGUgPSBhd2FpdCBnZXRfbWFudWFsX3Byb2R1Y3RfcXVvdGUoCiAgICAgICAgICAgICAgICBwYWNrYWdlX2lkLAogICAgICAgICAgICAgICAgZGI9ZGIsCiAgICAgICAgICAgICAgICBmb3JjZV9yZWZyZXNoX3JhdGU9RmFsc2UsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHByaWNlc1sKICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQKICAgICAgICAgICAgXSA9IGludCgKICAgICAgICAgICAgICAgIHF1b3RlLmZpbmFsX3RvbWFuCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIHByaWNlc1sKICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQKICAgICAgICAgICAgXSA9IE5vbmUKCiAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoCiAgICAgICAgICAgICAgICBmIntwYWNrYWdlX2lkfToge2V4Y30iCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgIlNob3AgcHJldmlldyB1bmF2YWlsYWJsZSB8ICIKICAgICAgICAgICAgICAgICJwYWNrYWdlPSVzIGVycm9yPSVzIiwKICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQsCiAgICAgICAgICAgICAgICBleGMsCiAgICAgICAgICAgICkKCiAgICByZXR1cm4gKAogICAgICAgIHByaWNlcywKICAgICAgICAoCiAgICAgICAgICAgICIgfCAiLmpvaW4oCiAgICAgICAgICAgICAgICBlcnJvcnNbOjNdCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgZXJyb3JzCiAgICAgICAgICAgIGVsc2UgTm9uZQogICAgICAgICksCiAgICApCgoKYXN5bmMgZGVmIGdldF9saXZlX3ByZXZpZXdfcHJpY2UoCiAgICBwYWNrYWdlX2lkOiBzdHIsCiAgICAqLAogICAgZGI6IEFueSA9IE5vbmUsCikgLT4gT3B0aW9uYWxbaW50XToKICAgIHRyeToKICAgICAgICBxdW90ZSA9IGF3YWl0IGdldF9tYW51YWxfcHJvZHVjdF9xdW90ZSgKICAgICAgICAgICAgcGFja2FnZV9pZCwKICAgICAgICAgICAgZGI9ZGIsCiAgICAgICAgICAgIGZvcmNlX3JlZnJlc2hfcmF0ZT1GYWxzZSwKICAgICAgICApCgogICAgICAgIHJldHVybiBpbnQoCiAgICAgICAgICAgIHF1b3RlLmZpbmFsX3RvbWFuCiAgICAgICAgKQoKICAgIGV4Y2VwdCAoCiAgICAgICAgUHJvZHVjdFByaWNlTm90Q29uZmlndXJlZCwKICAgICAgICBQcm9kdWN0UmF0ZVVuYXZhaWxhYmxlLAogICAgICAgIFByb2R1Y3RQcmljaW5nRXJyb3IsCiAgICApIGFzIGV4YzoKICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgIlNob3AgcHJldmlldyB1bmF2YWlsYWJsZSB8ICIKICAgICAgICAgICAgInBhY2thZ2U9JXMgZXJyb3I9JXMiLAogICAgICAgICAgICBwYWNrYWdlX2lkLAogICAgICAgICAgICBleGMsCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgIlVuZXhwZWN0ZWQgc2hvcCBwcmV2aWV3IGZhaWx1cmUgfCAiCiAgICAgICAgICAgICJwYWNrYWdlPSVzIiwKICAgICAgICAgICAgcGFja2FnZV9pZCwKICAgICAgICApCgogICAgICAgIHJldHVybiBOb25lCgoKZGVmIGJ1aWxkX2xpdmVfcGFja2FnZXNfa2V5Ym9hcmQoCiAgICBzZXJ2aWNlOiBzdHIsCiAgICBwcmljZXM6IGRpY3RbCiAgICAgICAgc3RyLAogICAgICAgIE9wdGlvbmFsW2ludF0sCiAgICBdLAopIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgaWYgc2VydmljZSA9PSAicHJlbWl1bSI6CiAgICAgICAgcGFja2FnZV9pZHMgPSAoCiAgICAgICAgICAgIFBSRU1JVU1fTUVOVV9PUkRFUgogICAgICAgICkKCiAgICAgICAgaWNvbiA9ICLwn5KOIgoKICAgIGVsaWYgc2VydmljZSA9PSAic3RhcnMiOgogICAgICAgIHBhY2thZ2VfaWRzID0gKAogICAgICAgICAgICBTVEFSU19NRU5VX09SREVSCiAgICAgICAgKQoKICAgICAgICBpY29uID0gIuKtkCIKCiAgICBlbHNlOgogICAgICAgIHJldHVybiBidWlsZF9iYWNrX2tleWJvYXJkKAogICAgICAgICAgICAiYnV5X3Byb2R1Y3QiCiAgICAgICAgKQoKICAgIGZvciBwYWNrYWdlX2lkIGluIHBhY2thZ2VfaWRzOgogICAgICAgIHByaWNlID0gcHJpY2VzLmdldCgKICAgICAgICAgICAgcGFja2FnZV9pZAogICAgICAgICkKCiAgICAgICAgaWYgKAogICAgICAgICAgICBpc2luc3RhbmNlKAogICAgICAgICAgICAgICAgcHJpY2UsCiAgICAgICAgICAgICAgICBpbnQsCiAgICAgICAgICAgICkKICAgICAgICAgICAgYW5kIHByaWNlID4gMAogICAgICAgICk6CiAgICAgICAgICAgIHByaWNlX3RleHQgPSAoCiAgICAgICAgICAgICAgICBmIntwcmljZTosfSDYqtmI2YXYp9mGIgogICAgICAgICAgICApCgogICAgICAgICAgICBzdHlsZSA9ICJwcmltYXJ5IgoKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmljZV90ZXh0ID0gKAogICAgICAgICAgICAgICAgItmC24zZhdiqINmF2YjZgtiq2KfZiyDZhtin2YXZiNis2YjYryIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgc3R5bGUgPSAiZGFuZ2VyIgoKICAgICAgICBidWlsZGVyLnJvdygKICAgICAgICAgICAgSW5saW5lS2V5Ym9hcmRCdXR0b24oCiAgICAgICAgICAgICAgICB0ZXh0PSgKICAgICAgICAgICAgICAgICAgICBmIntpY29ufSAiCiAgICAgICAgICAgICAgICAgICAgZiJ7X3BhY2thZ2Vfc2hvcnRfdGl0bGUocGFja2FnZV9pZCl9IgogICAgICAgICAgICAgICAgICAgIGYiIOKAlCB7cHJpY2VfdGV4dH0iCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgY2FsbGJhY2tfZGF0YT1wYWNrYWdlX2lkLAogICAgICAgICAgICAgICAgc3R5bGU9c3R5bGUsCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgaWYgc2VydmljZSA9PSAic3RhcnMiOgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICAgICAgICAgIHRleHQ9IuKtkCDYqti52K/Yp9ivINiv2YTYrtmI2KfZhyBTdGFycyIsCiAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhPSJjdXN0b21fc3RhcnMiLAogICAgICAgICAgICAgICAgc3R5bGU9InN1Y2Nlc3MiLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIElubGluZUtleWJvYXJkQnV0dG9uKAogICAgICAgICAgICB0ZXh0PSLYqNin2LLar9i02KoiLAogICAgICAgICAgICBjYWxsYmFja19kYXRhPSJidXlfcHJvZHVjdCIsCiAgICAgICAgICAgIHN0eWxlPSJkYW5nZXIiLAogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgV2FsbGV0IFJlYWQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBfZ2V0X3VzZXJfYmFsYW5jZV9zeW5jKAogICAgZGJfcGF0aDogc3RyLAogICAgdXNlcl9pZDogaW50LAopIC0+IGludDoKICAgIGNvbm4gPSBzcWxpdGUzLmNvbm5lY3QoCiAgICAgICAgZGJfcGF0aCwKICAgICAgICB0aW1lb3V0PTEwLAogICAgKQoKICAgIGNvbm4ucm93X2ZhY3RvcnkgPSAoCiAgICAgICAgc3FsaXRlMy5Sb3cKICAgICkKCiAgICB0cnk6CiAgICAgICAgY29sdW1ucyA9IHsKICAgICAgICAgICAgcm93WyJuYW1lIl0KICAgICAgICAgICAgZm9yIHJvdwogICAgICAgICAgICBpbiBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiUFJBR01BIHRhYmxlX2luZm8odXNlcnMpIgogICAgICAgICAgICApLmZldGNoYWxsKCkKICAgICAgICB9CgogICAgICAgIGJhbGFuY2VfY29sdW1uID0gKAogICAgICAgICAgICAiYmFsYW5jZV90b21hbiIKICAgICAgICAgICAgaWYgImJhbGFuY2VfdG9tYW4iCiAgICAgICAgICAgIGluIGNvbHVtbnMKICAgICAgICAgICAgZWxzZSAoCiAgICAgICAgICAgICAgICAiYmFsYW5jZSIKICAgICAgICAgICAgICAgIGlmICJiYWxhbmNlIgogICAgICAgICAgICAgICAgaW4gY29sdW1ucwogICAgICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIGlmIG5vdCBiYWxhbmNlX2NvbHVtbjoKICAgICAgICAgICAgcmV0dXJuIDAKCiAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICBmIiIiCiAgICAgICAgICAgIFNFTEVDVAogICAgICAgICAgICAgICAge2JhbGFuY2VfY29sdW1ufQogICAgICAgICAgICAgICAgQVMgYmFsYW5jZQogICAgICAgICAgICBGUk9NIHVzZXJzCiAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBpbnQodXNlcl9pZCksCiAgICAgICAgICAgICksCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIGlmIG5vdCByb3c6CiAgICAgICAgICAgIHJldHVybiAwCgogICAgICAgIHJldHVybiBtYXgoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGludCgKICAgICAgICAgICAgICAgIHJvd1siYmFsYW5jZSJdCiAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGZpbmFsbHk6CiAgICAgICAgY29ubi5jbG9zZSgpCgoKYXN5bmMgZGVmIGdldF91c2VyX2JhbGFuY2UoCiAgICB1c2VyX2lkOiBpbnQsCiAgICBkYjogQW55ID0gTm9uZSwKKSAtPiBpbnQ6CiAgICByZXR1cm4gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgX2dldF91c2VyX2JhbGFuY2Vfc3luYywKICAgICAgICByZXNvbHZlX2RhdGFiYXNlX3BhdGgoCiAgICAgICAgICAgIGRiCiAgICAgICAgKSwKICAgICAgICBpbnQodXNlcl9pZCksCiAgICApCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBPcmRlclNlcnZpY2UgUmVzb2x2ZXIKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmFzeW5jIGRlZiByZXNvbHZlX29yZGVyX3NlcnZpY2UoCiAgICBvcmRlcl9zZXJ2aWNlOiBPcHRpb25hbFsKICAgICAgICBPcmRlclNlcnZpY2UKICAgIF0sCiAgICBkYjogQW55ID0gTm9uZSwKKSAtPiBPcmRlclNlcnZpY2U6CiAgICBzZXJ2aWNlID0gb3JkZXJfc2VydmljZQoKICAgIGlmIHNlcnZpY2UgaXMgTm9uZToKICAgICAgICBzZXJ2aWNlID0gT3JkZXJTZXJ2aWNlKAogICAgICAgICAgICBkYl9wYXRoPSgKICAgICAgICAgICAgICAgIHJlc29sdmVfZGF0YWJhc2VfcGF0aCgKICAgICAgICAgICAgICAgICAgICBkYgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIGF3YWl0IHNlcnZpY2UuZW5zdXJlX3NjaGVtYSgpCgogICAgcmV0dXJuIHNlcnZpY2UKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEFkbWluIEFjY2VzcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl9pZHMoKSAtPiBmcm96ZW5zZXRbaW50XToKICAgIG1ldGhvZCA9IGdldGF0dHIoCiAgICAgICAgc2V0dGluZ3MsCiAgICAgICAgImdldF9hZG1pbl9saXN0IiwKICAgICAgICBOb25lLAogICAgKQoKICAgIGlmIGNhbGxhYmxlKAogICAgICAgIG1ldGhvZAogICAgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBmcm96ZW5zZXQoCiAgICAgICAgICAgICAgICBpbnQodXNlcl9pZCkKICAgICAgICAgICAgICAgIGZvciB1c2VyX2lkCiAgICAgICAgICAgICAgICBpbiBtZXRob2QoKQogICAgICAgICAgICAgICAgaWYgaW50KHVzZXJfaWQpID4gMAogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlYWQgYWRtaW4gbGlzdC4iCiAgICAgICAgICAgICkKCiAgICByYXcgPSBzdHIoCiAgICAgICAgZ2V0YXR0cigKICAgICAgICAgICAgc2V0dGluZ3MsCiAgICAgICAgICAgICJBRE1JTl9JRFMiLAogICAgICAgICAgICAiIiwKICAgICAgICApCiAgICAgICAgb3IgIiIKICAgICkKCiAgICByZXN1bHQ6IHNldFtpbnRdID0gc2V0KCkKCiAgICBmb3IgaXRlbSBpbiByYXcuc3BsaXQoIiwiKToKICAgICAgICBpdGVtID0gaXRlbS5zdHJpcCgpCgogICAgICAgIGlmIG5vdCBpdGVtOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgICAgICAgICBpdGVtCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIHVzZXJfaWQgPiAwOgogICAgICAgICAgICByZXN1bHQuYWRkKAogICAgICAgICAgICAgICAgdXNlcl9pZAogICAgICAgICAgICApCgogICAgcmV0dXJuIGZyb3plbnNldCgKICAgICAgICByZXN1bHQKICAgICkKCgpkZWYgaXNfYWRtaW4oCiAgICB1c2VyX2lkOiBpbnQsCikgLT4gYm9vbDoKICAgIHJldHVybiAoCiAgICAgICAgaW50KHVzZXJfaWQpCiAgICAgICAgaW4gZ2V0X2FkbWluX2lkcygpCiAgICApCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUYXJnZXQgVmFsaWRhdGlvbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIG5vcm1hbGl6ZV91c2VybmFtZSgKICAgIHJhdzogc3RyLAopIC0+IE9wdGlvbmFsW3N0cl06CiAgICB2YWx1ZSA9IHN0cigKICAgICAgICByYXcKICAgICAgICBvciAiIgogICAgKS5zdHJpcCgpCgogICAgaWYgdmFsdWUuc3RhcnRzd2l0aCgiQCIpOgogICAgICAgIHZhbHVlID0gdmFsdWVbMTpdCgogICAgaWYgKAogICAgICAgIGxlbih2YWx1ZSkgPCA0CiAgICAgICAgb3IgbGVuKHZhbHVlKSA+IDMyCiAgICApOgogICAgICAgIHJldHVybiBOb25lCgogICAgYWxsb3dlZCA9ICgKICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCiAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgogICAgICAgICIwMTIzNDU2Nzg5XyIKICAgICkKCiAgICBpZiBhbnkoCiAgICAgICAgY2hhciBub3QgaW4gYWxsb3dlZAogICAgICAgIGZvciBjaGFyIGluIHZhbHVlCiAgICApOgogICAgICAgIHJldHVybiBOb25lCgogICAgcmV0dXJuIHZhbHVlCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBVSQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIF9idXR0b24oCiAgICAqLAogICAgdGV4dDogc3RyLAogICAgY2FsbGJhY2tfZGF0YTogc3RyLAogICAgc3R5bGU6IHN0ciA9ICJwcmltYXJ5IiwKICAgIGljb25fa2V5OiBzdHIgPSAic3BhcmtsZXMiLAopIC0+IElubGluZUtleWJvYXJkQnV0dG9uOgogICAgcmV0dXJuIElubGluZUtleWJvYXJkQnV0dG9uKAogICAgICAgIHRleHQ9dGV4dCwKICAgICAgICBjYWxsYmFja19kYXRhPWNhbGxiYWNrX2RhdGEsCiAgICAgICAgc3R5bGU9c3R5bGUsCiAgICAgICAgaWNvbl9jdXN0b21fZW1vamlfaWQ9KAogICAgICAgICAgICBlbW9qaV9pZCgKICAgICAgICAgICAgICAgIGljb25fa2V5CiAgICAgICAgICAgICkKICAgICAgICApLAogICAgKQoKCmRlZiBidWlsZF9iYWNrX2tleWJvYXJkKAogICAgY2FsbGJhY2tfZGF0YTogc3RyID0gImJ1eV9wcm9kdWN0IiwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9idXR0b24oCiAgICAgICAgICAgIHRleHQ9Itio2KfYstqv2LTYqiIsCiAgICAgICAgICAgIGNhbGxiYWNrX2RhdGE9KAogICAgICAgICAgICAgICAgY2FsbGJhY2tfZGF0YQogICAgICAgICAgICApLAogICAgICAgICAgICBzdHlsZT0icHJpbWFyeSIsCiAgICAgICAgICAgIGljb25fa2V5PSJiYWNrIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgpkZWYgYnVpbGRfcHVyY2hhc2Vfa2V5Ym9hcmQoKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9idXR0b24oCiAgICAgICAgICAgIHRleHQ9Itir2KjYqiDYr9ix2K7ZiNin2LPYqiDYqNix2KfbjCDYqtin24zbjNivINmF2KfZhNqpIiwKICAgICAgICAgICAgY2FsbGJhY2tfZGF0YT0oCiAgICAgICAgICAgICAgICAiZmluYWxpemVfcHVyY2hhc2UiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHN0eWxlPSJzdWNjZXNzIiwKICAgICAgICAgICAgaWNvbl9rZXk9InN1Y2Nlc3MiLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYnV0dG9uKAogICAgICAgICAgICB0ZXh0PSLYtNin2LHamCDaqduM2YEg2b7ZiNmEIiwKICAgICAgICAgICAgY2FsbGJhY2tfZGF0YT0iY2hhcmdlX2ZpYXQiLAogICAgICAgICAgICBzdHlsZT0icHJpbWFyeSIsCiAgICAgICAgICAgIGljb25fa2V5PSJ3YWxsZXQiLAogICAgICAgICksCiAgICAgICAgX2J1dHRvbigKICAgICAgICAgICAgdGV4dD0i2YTYutmIINiz2YHYp9ix2LQiLAogICAgICAgICAgICBjYWxsYmFja19kYXRhPSJjYW5jZWxfc2hvcCIsCiAgICAgICAgICAgIHN0eWxlPSJkYW5nZXIiLAogICAgICAgICAgICBpY29uX2tleT0iZXJyb3IiLAogICAgICAgICksCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgpkZWYgYnVpbGRfcmVzdWx0X2tleWJvYXJkKCkgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYnV0dG9uKAogICAgICAgICAgICB0ZXh0PSLYqNin2LLar9i02Kog2KjZhyDZgdix2YjYtNqv2KfZhyIsCiAgICAgICAgICAgIGNhbGxiYWNrX2RhdGE9ImJ1eV9wcm9kdWN0IiwKICAgICAgICAgICAgc3R5bGU9InByaW1hcnkiLAogICAgICAgICAgICBpY29uX2tleT0ic2hvcCIsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9idXR0b24oCiAgICAgICAgICAgIHRleHQ9ItmF2YbZiNuMINin2LXZhNuMIiwKICAgICAgICAgICAgY2FsbGJhY2tfZGF0YT0ibWFpbl9tZW51IiwKICAgICAgICAgICAgc3R5bGU9InByaW1hcnkiLAogICAgICAgICAgICBpY29uX2tleT0iYmFjayIsCiAgICAgICAgKQogICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKZGVmIGZhbGxiYWNrX293bmVyX2tleWJvYXJkKAogICAgb3JkZXJfaWQ6IGludCwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9idXR0b24oCiAgICAgICAgICAgIHRleHQ9Itiq2KfbjNuM2K8g2Ygg2KLZhdin2K/Zh+KAjNiz2KfYstuMINiq2K3ZiNuM2YQiLAogICAgICAgICAgICBjYWxsYmFja19kYXRhPSgKICAgICAgICAgICAgICAgIGYib3duZXJfYXBwcm92ZV9vcmRlcl97b3JkZXJfaWR9IgogICAgICAgICAgICApLAogICAgICAgICAgICBzdHlsZT0ic3VjY2VzcyIsCiAgICAgICAgICAgIGljb25fa2V5PSJzdWNjZXNzIiwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2J1dHRvbigKICAgICAgICAgICAgdGV4dD0i2LHYryDYs9mB2KfYsdi0IiwKICAgICAgICAgICAgY2FsbGJhY2tfZGF0YT0oCiAgICAgICAgICAgICAgICBmIm93bmVyX3JlamVjdF9vcmRlcl97b3JkZXJfaWR9IgogICAgICAgICAgICApLAogICAgICAgICAgICBzdHlsZT0iZGFuZ2VyIiwKICAgICAgICAgICAgaWNvbl9rZXk9ImVycm9yIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgpkZWYgb3duZXJfa2V5Ym9hcmQoCiAgICBvcmRlcl9pZDogaW50LAopIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgaWYgY2FsbGFibGUoCiAgICAgICAgZ2V0X293bmVyX29yZGVyX2tleWJvYXJkCiAgICApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGdldF9vd25lcl9vcmRlcl9rZXlib2FyZCgKICAgICAgICAgICAgICAgIG9yZGVyX2lkCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJBZG1pbiBvd25lciBrZXlib2FyZCBmYWlsZWQ7ICIKICAgICAgICAgICAgICAgICJ1c2luZyBsb2NhbCBmYWxsYmFjay4iCiAgICAgICAgICAgICkKCiAgICByZXR1cm4gZmFsbGJhY2tfb3duZXJfa2V5Ym9hcmQoCiAgICAgICAgb3JkZXJfaWQKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFRlbGVncmFtIEhlbHBlcnMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmFzeW5jIGRlZiBzYWZlX2Fuc3dlcigKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgdGV4dDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICAqLAogICAgc2hvd19hbGVydDogYm9vbCA9IEZhbHNlLAopIC0+IE5vbmU6CiAgICB0cnk6CiAgICAgICAgYXdhaXQgY2FsbGJhY2suYW5zd2VyKAogICAgICAgICAgICB0ZXh0PXRleHQsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9c2hvd19hbGVydCwKICAgICAgICApCgogICAgZXhjZXB0IFRlbGVncmFtQmFkUmVxdWVzdDoKICAgICAgICBwYXNzCgogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAiQ291bGQgbm90IGFuc3dlciBzaG9wIGNhbGxiYWNrLiIKICAgICAgICApCgoKYXN5bmMgZGVmIHNhZmVfZWRpdF9tZXNzYWdlKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICB0ZXh0OiBzdHIsCiAgICBrZXlib2FyZDogT3B0aW9uYWxbCiAgICAgICAgSW5saW5lS2V5Ym9hcmRNYXJrdXAKICAgIF0gPSBOb25lLAopIC0+IGJvb2w6CiAgICBpZiBub3QgY2FsbGJhY2subWVzc2FnZToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICByZW5kZXJlZCA9IHByZW1pdW1pemVfaHRtbCgKICAgICAgICB0ZXh0CiAgICApCgogICAgdHJ5OgogICAgICAgIGF3YWl0IGNhbGxiYWNrLm1lc3NhZ2UuZWRpdF90ZXh0KAogICAgICAgICAgICByZW5kZXJlZCwKICAgICAgICAgICAgcmVwbHlfbWFya3VwPWtleWJvYXJkLAogICAgICAgICAgICBwYXJzZV9tb2RlPSJIVE1MIiwKICAgICAgICApCgogICAgICAgIHJldHVybiBUcnVlCgogICAgZXhjZXB0IFRlbGVncmFtQmFkUmVxdWVzdCBhcyBleGM6CiAgICAgICAgZXJyb3IgPSBzdHIoCiAgICAgICAgICAgIGV4YwogICAgICAgICkubG93ZXIoKQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICJtZXNzYWdlIGlzIG5vdCBtb2RpZmllZCIKICAgICAgICAgICAgaW4gZXJyb3IKICAgICAgICApOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICJtZXNzYWdlIGNhbid0IGJlIGVkaXRlZCIKICAgICAgICAgICAgaW4gZXJyb3IKICAgICAgICAgICAgb3IgIm1lc3NhZ2UgdG8gZWRpdCBub3QgZm91bmQiCiAgICAgICAgICAgIGluIGVycm9yCiAgICAgICAgKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2subWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQsCiAgICAgICAgICAgICAgICAgICAgcmVwbHlfbWFya3VwPWtleWJvYXJkLAogICAgICAgICAgICAgICAgICAgIHBhcnNlX21vZGU9IkhUTUwiLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNlbmQgcmVwbGFjZW1lbnQgc2hvcCBtZXNzYWdlLiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICJTaG9wIGVkaXQgZmFpbGVkOiAlcyIsCiAgICAgICAgICAgIGV4YywKICAgICAgICApCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgIlVuZXhwZWN0ZWQgc2hvcCBlZGl0IGVycm9yLiIKICAgICAgICApCgogICAgICAgIHJldHVybiBGYWxzZQoKCmFzeW5jIGRlZiBzZW5kX2h0bWwoCiAgICBtZXNzYWdlOiBNZXNzYWdlLAogICAgdGV4dDogc3RyLAogICAgKiwKICAgIGtleWJvYXJkOiBPcHRpb25hbFsKICAgICAgICBJbmxpbmVLZXlib2FyZE1hcmt1cAogICAgXSA9IE5vbmUsCikgLT4gTm9uZToKICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgIHByZW1pdW1pemVfaHRtbCgKICAgICAgICAgICAgdGV4dAogICAgICAgICksCiAgICAgICAgcmVwbHlfbWFya3VwPWtleWJvYXJkLAogICAgICAgIHBhcnNlX21vZGU9IkhUTUwiLAogICAgKQoKCmFzeW5jIGRlZiBub3RpZnlfdXNlcigKICAgIGJvdCwKICAgIHVzZXJfaWQ6IGludCwKICAgIHRleHQ6IHN0ciwKKSAtPiBib29sOgogICAgdHJ5OgogICAgICAgIGF3YWl0IGJvdC5zZW5kX21lc3NhZ2UoCiAgICAgICAgICAgIGNoYXRfaWQ9aW50KAogICAgICAgICAgICAgICAgdXNlcl9pZAogICAgICAgICAgICApLAogICAgICAgICAgICB0ZXh0PXByZW1pdW1pemVfaHRtbCgKICAgICAgICAgICAgICAgIHRleHQKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcmVwbHlfbWFya3VwPSgKICAgICAgICAgICAgICAgIGJ1aWxkX3Jlc3VsdF9rZXlib2FyZCgpCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHBhcnNlX21vZGU9IkhUTUwiLAogICAgICAgICkKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBleGNlcHQgVGVsZWdyYW1Gb3JiaWRkZW5FcnJvcjoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICJDb3VsZCBub3Qgbm90aWZ5IHVzZXIgJXMuIiwKICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICApCgogICAgICAgIHJldHVybiBGYWxzZQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgT3duZXIgTm90aWZpY2F0aW9uCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgphc3luYyBkZWYgbm90aWZ5X293bmVycygKICAgICosCiAgICBib3QsCiAgICBvcmRlcjogT3JkZXIsCiAgICBwYWNrYWdlX25hbWU6IHN0ciwKICAgIGJ1eWVyX25hbWU6IHN0ciwKICAgIGJ1eWVyX3VzZXJuYW1lOiBPcHRpb25hbFtzdHJdLAopIC0+IGludDoKICAgIHRhcmdldHMgPSBnZXRfYWRtaW5faWRzKCkKCiAgICBpZiBub3QgdGFyZ2V0czoKICAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgICJObyBBRE1JTl9JRFMgY29uZmlndXJlZCBmb3Igb3JkZXIgJXMuIiwKICAgICAgICAgICAgb3JkZXIuaWQsCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gMAoKICAgIHVzZXJuYW1lID0gKAogICAgICAgIGYiQHtidXllcl91c2VybmFtZX0iCiAgICAgICAgaWYgYnV5ZXJfdXNlcm5hbWUKICAgICAgICBlbHNlICLYq9io2Kog2YbYtNiv2YciCiAgICApCgogICAgdGV4dCA9ICgKICAgICAgICBmIntjZSgncGFja2FnZScpfSAiCiAgICAgICAgIjxiPtiv2LHYrtmI2KfYs9iqINis2K/bjNivINiu2LHbjNivPC9iPlxuIgogICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgoKICAgICAgICBmIntjZSgnbGlzdCcpfSDYs9mB2KfYsdi0OiAiCiAgICAgICAgZiI8Y29kZT4je29yZGVyLmlkfTwvY29kZT5cbiIKCiAgICAgICAgZiJ7Y2UoJ3VzZXInKX0g2qnYp9ix2KjYsTogIgogICAgICAgIGYiPGI+e2VzY2FwZShidXllcl9uYW1lKX08L2I+XG4iCgogICAgICAgIGYie2NlKCdjaGF0Jyl9INuM2YjYstix2YbbjNmFOiAiCiAgICAgICAgZiI8Y29kZT57ZXNjYXBlKHVzZXJuYW1lKX08L2NvZGU+XG4iCgogICAgICAgIGYie2NlKCdwaW4nKX0gVUlEOiAiCiAgICAgICAgZiI8Y29kZT57b3JkZXIudXNlcl9pZH08L2NvZGU+XG5cbiIKCiAgICAgICAgZiJ7Y2UoJ3BhY2thZ2UnKX0g2YXYrdi12YjZhDpcbiIKICAgICAgICBmIjxjb2RlPntlc2NhcGUocGFja2FnZV9uYW1lKX08L2NvZGU+XG5cbiIKCiAgICAgICAgZiJ7Y2UoJ3RhcmdldCcpfSDZhdmC2LXYrzpcbiIKICAgICAgICBmIjxjb2RlPkB7ZXNjYXBlKG9yZGVyLnRhcmdldCBvciAnJyl9PC9jb2RlPlxuXG4iCgogICAgICAgIGYie2NlKCdtb25leScpfSDZgtuM2YXYqiDZhtmF2KfbjNi024w6XG4iCiAgICAgICAgKyAoCiAgICAgICAgICAgIGYiPGNvZGU+e29yZGVyLnByaWNlOix9INiq2YjZhdin2YY8L2NvZGU+XG5cbiIKICAgICAgICAgICAgaWYgaW50KG9yZGVyLnByaWNlIG9yIDApID4gMAogICAgICAgICAgICBlbHNlICI8Y29kZT7Zhtin2YXZiNis2YjYrzwvY29kZT5cblxuIgogICAgICAgICkKICAgICAgICArIGYie2NlKCd3YXJuaW5nJyl9ICIKICAgICAgICAi2YfZhtqv2KfZhSDYqtin24zbjNivINmF2KfZhNqpINmG2LHYriDYqtiq2LEg2K/ZiNio2KfYsdmHINio2LHYsdiz24wg2YXbjOKAjNi02YjYry4gIgogICAgICAgICLZh9uM2oYg2YXYqNmE2LrbjCDZh9mG2YjYsiDaqdiz2LEg2YbYtNiv2Ycg2KfYs9iqLiIKICAgICkKCiAgICBzZW50ID0gMAoKICAgIGZvciBhZG1pbl9pZCBpbiB0YXJnZXRzOgogICAgICAgIHRyeToKICAgICAgICAgICAgYXdhaXQgYm90LnNlbmRfbWVzc2FnZSgKICAgICAgICAgICAgICAgIGNoYXRfaWQ9YWRtaW5faWQsCiAgICAgICAgICAgICAgICB0ZXh0PXByZW1pdW1pemVfaHRtbCgKICAgICAgICAgICAgICAgICAgICB0ZXh0CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgcmVwbHlfbWFya3VwPSgKICAgICAgICAgICAgICAgICAgICBvd25lcl9rZXlib2FyZCgKICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIuaWQKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgcGFyc2VfbW9kZT0iSFRNTCIsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHNlbnQgKz0gMQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIk93bmVyIG5vdGlmaWNhdGlvbiBmYWlsZWQgfCAiCiAgICAgICAgICAgICAgICAiYWRtaW49JXMgb3JkZXI9JXMiLAogICAgICAgICAgICAgICAgYWRtaW5faWQsCiAgICAgICAgICAgICAgICBvcmRlci5pZCwKICAgICAgICAgICAgKQoKICAgIHJldHVybiBzZW50CgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBTaG9wIE1lbnVzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhID09ICJidXlfcHJvZHVjdCIKKQphc3luYyBkZWYgb3Blbl9zaG9wKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBzdGF0ZTogRlNNQ29udGV4dCwKKSAtPiBOb25lOgogICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgIHRleHQgPSAoCiAgICAgICAgZiJ7Y2UoJ3Nob3AnKX0gIgogICAgICAgICI8Yj7Zgdix2YjYtNqv2KfZhyDYrtiv2YXYp9iqINiq2YTar9ix2KfZhTwvYj5cbiIKICAgICAgICAi4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBXG5cbiIKCiAgICAgICAgZiJ7Y2UoJ3ByZW1pdW0nKX0gIgogICAgICAgICJQcmVtaXVtINmIIFN0YXJzINix2Kcg2KfYsiDZhdmG2YjbjCDYstuM2LEg2KfZhtiq2K7Yp9ioINqp2YbbjNivLlxuXG4iCgogICAgICAgIGYie2NlKCdtb25leScpfSAiCiAgICAgICAgItio2LnYryDYp9iyINin2YbYqtiu2KfYqCDZh9ixINm+2qnbjNis2Iwg2YLbjNmF2Kog2KjYsSDYp9iz2KfYsyDZhtix2K4g2LLZhtiv2Ycg2KrYqtixINiv2KfYrtmEICIKICAgICAgICAi2KrZiNi224zYrdin2Kog2LPZgdin2LHYtCDZhtmF2KfbjNi0INiv2KfYr9mHINmF24zigIzYtNmI2K8uXG5cbiIKCiAgICAgICAgZiJ7Y2UoJ3dhcm5pbmcnKX0gIgogICAgICAgICLZh9mG2q/Yp9mFINiq2KfbjNuM2K8g2YXYp9mE2qkg2YbYsdiuINiq2KrYsSDYr9mI2KjYp9ix2Ycg2KjYsdix2LPbjCDZhduM4oCM2LTZiNivLiIKICAgICkKCiAgICBhd2FpdCBzYWZlX2VkaXRfbWVzc2FnZSgKICAgICAgICBjYWxsYmFjaywKICAgICAgICB0ZXh0LAogICAgICAgIGdldF9wcm9kdWN0c19tZW51X2tleWJvYXJkKCksCiAgICApCgogICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhID09ICJidXlfc3RhcnMiCikKYXN5bmMgZGVmIGJ1eV9zdGFyc19tZW51KAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBzdGF0ZTogRlNNQ29udGV4dCwKKSAtPiBOb25lOgogICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgIHRleHQgPSAoCiAgICAgICAgZiJ7Y2UoJ3NwYXJrbGVzJywgJ+KtkCcpfSAiCiAgICAgICAgIjxiPtiu2LHbjNivIFN0YXJzINiq2YTar9ix2KfZhTwvYj5cbiIKICAgICAgICAi4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBXG5cbiIKCiAgICAgICAgItio2LPYqtmHINmF2YjYsdiv2YbYuNixINix2Kcg2KfZhtiq2K7Yp9ioINqp2YbbjNivLlxuXG4iCgogICAgICAgIGYie2NlKCdtb25leScpfSAiCiAgICAgICAgItmC24zZhdiqINmE2K3YuNmH4oCM2KfbjCDYqNi52K8g2KfYsiDYp9mG2KrYrtin2Kgg2KjYs9iq2YfYjCDYr9in2K7ZhCDYqtmI2LbbjNit2KfYqiDYs9mB2KfYsdi0ICIKICAgICAgICAi2YbZhdin24zYtCDYr9in2K/ZhyDZhduM4oCM2LTZiNivLiIKICAgICkKCiAgICBhd2FpdCBzYWZlX2VkaXRfbWVzc2FnZSgKICAgICAgICBjYWxsYmFjaywKICAgICAgICB0ZXh0LAogICAgICAgIGdldF9zZXJ2aWNlc19wYWNrYWdlc19rZXlib2FyZCgKICAgICAgICAgICAgInN0YXJzIgogICAgICAgICksCiAgICApCgogICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhID09ICJidXlfcHJlbWl1bSIKKQphc3luYyBkZWYgYnV5X3ByZW1pdW1fbWVudSgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgc3RhdGU6IEZTTUNvbnRleHQsCikgLT4gTm9uZToKICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKCiAgICB0ZXh0ID0gKAogICAgICAgIGYie2NlKCdwcmVtaXVtJywgJ/Cfko4nKX0gIgogICAgICAgICI8Yj5UZWxlZ3JhbSBQcmVtaXVtPC9iPlxuIgogICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgoKICAgICAgICAi2YXYr9iqINin2LTYqtix2KfaqSDYsdinINin2YbYqtiu2KfYqCDaqdmG24zYry5cblxuIgoKICAgICAgICBmIntjZSgnbW9uZXknKX0gIgogICAgICAgICLZgtuM2YXYqiDZhNit2LjZh+KAjNin24wg2KjYudivINin2LIg2KfZhtiq2K7Yp9ioINm+2qnbjNis2Iwg2K/Yp9iu2YQg2KrZiNi224zYrdin2Kog2LPZgdin2LHYtCAiCiAgICAgICAgItmG2YXYp9uM2LQg2K/Yp9iv2Ycg2YXbjOKAjNi02YjYry4iCiAgICApCgogICAgYXdhaXQgc2FmZV9lZGl0X21lc3NhZ2UoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgdGV4dCwKICAgICAgICBnZXRfc2VydmljZXNfcGFja2FnZXNfa2V5Ym9hcmQoCiAgICAgICAgICAgICJwcmVtaXVtIgogICAgICAgICksCiAgICApCgogICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNlbGVjdCBTdGFuZGFyZCBQYWNrYWdlCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhLnN0YXJ0c3dpdGgoCiAgICAgICAgInN0YXJzXyIKICAgICkKICAgIHwgRi5kYXRhLnN0YXJ0c3dpdGgoCiAgICAgICAgInByZW1fIgogICAgKQopCmFzeW5jIGRlZiBzZWxlY3RfcGFja2FnZSgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgc3RhdGU6IEZTTUNvbnRleHQsCiAgICBkYjogQW55ID0gTm9uZSwKKSAtPiBOb25lOgogICAgcGFja2FnZV9pZCA9IHN0cigKICAgICAgICBjYWxsYmFjay5kYXRhCiAgICAgICAgb3IgIiIKICAgICkKCiAgICBwYWNrYWdlX25hbWUgPSBQQUNLQUdFX05BTUVTLmdldCgKICAgICAgICBwYWNrYWdlX2lkCiAgICApCgogICAgaWYgbm90IHBhY2thZ2VfbmFtZToKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLinYwg2KfbjNmGINm+2qnbjNisINmF2LnYqtio2LEg2YbbjNiz2KouIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCgogICAgYXdhaXQgc2FmZV9lZGl0X21lc3NhZ2UoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgKAogICAgICAgICAgICBmIntjZSgnbG9hZGluZycpfSAiCiAgICAgICAgICAgICI8Yj7Yr9ixINit2KfZhCDZhdit2KfYs9io2Ycg2YLbjNmF2Kog2KjYpyDZhtix2K4g2YTYrdi42YfigIzYp9uMINiq2KrYsS4uLjwvYj4iCiAgICAgICAgKSwKICAgICAgICBidWlsZF9iYWNrX2tleWJvYXJkKAogICAgICAgICAgICAiYnV5X3ByZW1pdW0iCiAgICAgICAgICAgIGlmIHBhY2thZ2VfaWQuc3RhcnRzd2l0aCgicHJlbV8iKQogICAgICAgICAgICBlbHNlICJidXlfc3RhcnMiCiAgICAgICAgKSwKICAgICkKCiAgICBwcmV2aWV3X3ByaWNlID0gYXdhaXQgZ2V0X2xpdmVfcHJldmlld19wcmljZSgKICAgICAgICBwYWNrYWdlX2lkLAogICAgICAgIGRiPWRiLAogICAgKQoKICAgIGlmICgKICAgICAgICBwcmV2aWV3X3ByaWNlIGlzIE5vbmUKICAgICAgICBvciBwcmV2aWV3X3ByaWNlIDw9IDAKICAgICk6CiAgICAgICAgYXdhaXQgc2FmZV9lZGl0X21lc3NhZ2UoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBmIntjZSgnZXJyb3InKX0gIgogICAgICAgICAgICAgICAgIjxiPtmC24zZhdiqINin24zZhiDZvtqp24zYrCDZgtin2KjZhCDZhdit2KfYs9io2Ycg2YbbjNiz2KouPC9iPlxuXG4iCiAgICAgICAgICAgICAgICAi2YLbjNmF2Kog2K/ZhNin2LHbjCDZhdit2LXZiNmEINio2KfbjNivINiv2LEg2b7ZhtmEINmF2K/bjNix24zYqiDYqtmG2LjbjNmFINi02K/ZhyDYqNin2LTYryAiCiAgICAgICAgICAgICAgICAi2Ygg2K3Yr9in2YLZhCDbjNqp24wg2KfYsiDZhdmG2KfYqNi5INmG2LHYriDYqtiq2LEg2K/YsSDYr9iz2KrYsdizINio2KfYtNivLiIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgYnVpbGRfYmFja19rZXlib2FyZCgKICAgICAgICAgICAgICAgICJidXlfcHJlbWl1bSIKICAgICAgICAgICAgICAgIGlmIHBhY2thZ2VfaWQuc3RhcnRzd2l0aCgicHJlbV8iKQogICAgICAgICAgICAgICAgZWxzZSAiYnV5X3N0YXJzIgogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi2YLbjNmF2Kog2YXYrdi12YjZhCDbjNinINmG2LHYriDYqtiq2LEg2K/YsSDYr9iz2KrYsdizINmG24zYs9iqLiIsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgcHJldmlld19wcmljZSA9IGludCgKICAgICAgICBwcmV2aWV3X3ByaWNlCiAgICApCgogICAgYXdhaXQgc3RhdGUudXBkYXRlX2RhdGEoCiAgICAgICAgc2VsZWN0ZWRfcGFja2FnZT1wYWNrYWdlX2lkLAogICAgICAgIHJlYWRhYmxlX3BhY2thZ2VfbmFtZT1wYWNrYWdlX25hbWUsCiAgICAgICAgcHJpY2U9cHJldmlld19wcmljZSwKICAgICAgICBwcmV2aWV3X3ByaWNlX3RvbWFuPXByZXZpZXdfcHJpY2UsCiAgICApCgogICAgaWYgcGFja2FnZV9pZCBpbiBTVEFSU19BTU9VTlRTOgogICAgICAgIGF3YWl0IHN0YXRlLnVwZGF0ZV9kYXRhKAogICAgICAgICAgICBzdGFyc19hbW91bnQ9U1RBUlNfQU1PVU5UU1sKICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQKICAgICAgICAgICAgXQogICAgICAgICkKCiAgICBpZiBwYWNrYWdlX2lkIGluIFBSRU1JVU1fTU9OVEhTOgogICAgICAgIGF3YWl0IHN0YXRlLnVwZGF0ZV9kYXRhKAogICAgICAgICAgICBwcmVtaXVtX21vbnRocz1QUkVNSVVNX01PTlRIU1sKICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQKICAgICAgICAgICAgXQogICAgICAgICkKCiAgICBhd2FpdCBzdGF0ZS5zZXRfc3RhdGUoCiAgICAgICAgT3JkZXJTdGF0ZXMud2FpdGluZ19mb3JfdGFyZ2V0X2FjY291bnQKICAgICkKCiAgICBiYWxhbmNlID0gYXdhaXQgZ2V0X3VzZXJfYmFsYW5jZSgKICAgICAgICBjYWxsYmFjay5mcm9tX3VzZXIuaWQsCiAgICAgICAgZGIsCiAgICApCgogICAgdGV4dCA9ICgKICAgICAgICBmIntjZSgncGFja2FnZScpfSA8Yj7YqtmI2LbbjNit2KfYqiDYs9mB2KfYsdi0PC9iPlxuIgogICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgoKICAgICAgICBmIntjZSgncGFja2FnZScpfSDZhdit2LXZiNmEOlxuIgogICAgICAgIGYiPGNvZGU+e2VzY2FwZShwYWNrYWdlX25hbWUpfTwvY29kZT5cblxuIgoKICAgICAgICBmIntjZSgnbW9uZXknKX0g2YLbjNmF2Kog2YTYrdi42YfigIzYp9uMOlxuIgogICAgICAgIGYiPGNvZGU+e3ByZXZpZXdfcHJpY2U6LH0g2KrZiNmF2KfZhjwvY29kZT5cblxuIgoKICAgICAgICBmIntjZSgnd2FsbGV0Jyl9INmF2YjYrNmI2K/bjCDZgdi52YTbjDpcbiIKICAgICAgICBmIjxjb2RlPntiYWxhbmNlOix9INiq2YjZhdin2YY8L2NvZGU+XG5cbiIKCiAgICAgICAgZiJ7Y2UoJ3RhcmdldCcpfSDbjNmI2LLYsdmG24zZhSBUZWxlZ3JhbSDZhdmC2LXYryDYsdinINin2LHYs9in2YQg2qnZhtuM2K8uXG5cbiIKICAgICAgICAi2YXYq9in2YQ6IDxjb2RlPkB1c2VybmFtZTwvY29kZT5cblxuIgoKICAgICAgICBmIntjZSgnd2FybmluZycpfSAiCiAgICAgICAgItmH2Ybar9in2YUg2KrYp9uM24zYryDZhdin2YTaqSDZhtix2K4g2KrYqtixINiv2YjYqNin2LHZhyDYqNix2LHYs9uMINmF24zigIzYtNmI2K8uICIKICAgICAgICAi2Kfar9ixINmC24zZhdiqINin2YHYstin24zYtCDZvtuM2K/YpyDaqdmG2K/YjCDZgtio2YQg2KfYsiDaqdiz2LEg2YjYrNmHINiq2KfbjNuM2K8g2K/ZiNio2KfYsdmHINi02YXYpyDar9ix2YHYqtmHINmF24zigIzYtNmI2K8uIgogICAgKQoKICAgIGF3YWl0IHNhZmVfZWRpdF9tZXNzYWdlKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgIHRleHQsCiAgICAgICAgYnVpbGRfYmFja19rZXlib2FyZCgKICAgICAgICAgICAgImJ1eV9wcmVtaXVtIgogICAgICAgICAgICBpZiBwYWNrYWdlX2lkLnN0YXJ0c3dpdGgoInByZW1fIikKICAgICAgICAgICAgZWxzZSAiYnV5X3N0YXJzIgogICAgICAgICksCiAgICApCgogICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEN1c3RvbSBTdGFycwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YSA9PSAiY3VzdG9tX3N0YXJzIgopCmFzeW5jIGRlZiBjdXN0b21fc3RhcnMoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAopIC0+IE5vbmU6CiAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCgogICAgYXdhaXQgc3RhdGUuc2V0X3N0YXRlKAogICAgICAgIE9yZGVyU3RhdGVzCiAgICAgICAgLndhaXRpbmdfZm9yX2N1c3RvbV9hbW91bnQKICAgICkKCiAgICB0ZXh0ID0gKAogICAgICAgIGYie2NlKCdzcGFya2xlcycsICfirZAnKX0gIgogICAgICAgICI8Yj7Yqti52K/Yp9ivINiv2YTYrtmI2KfZhyBTdGFyczwvYj5cbiIKICAgICAgICAi4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBXG5cbiIKCiAgICAgICAgZiLYrdiv2KfZgtmEOiA8Yj57TUlOX0NVU1RPTV9TVEFSUzosfTwvYj5cbiIKICAgICAgICBmItit2K/Yp9qp2KvYsTogPGI+e01BWF9DVVNUT01fU1RBUlM6LH08L2I+XG5cbiIKCiAgICAgICAgItmF2KvYp9mEOiA8Y29kZT4zNTA8L2NvZGU+IgogICAgKQoKICAgIGF3YWl0IHNhZmVfZWRpdF9tZXNzYWdlKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgIHRleHQsCiAgICAgICAgYnVpbGRfYmFja19rZXlib2FyZCgKICAgICAgICAgICAgImJ1eV9zdGFycyIKICAgICAgICApLAogICAgKQoKICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKQHJvdXRlci5tZXNzYWdlKAogICAgT3JkZXJTdGF0ZXMud2FpdGluZ19mb3JfY3VzdG9tX2Ftb3VudCwKICAgIEYudGV4dCwKKQphc3luYyBkZWYgcHJvY2Vzc19jdXN0b21fYW1vdW50KAogICAgbWVzc2FnZTogTWVzc2FnZSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAogICAgZGI6IEFueSA9IE5vbmUsCikgLT4gTm9uZToKICAgIHJhdyA9IChtZXNzYWdlLnRleHQgb3IgIiIpLnN0cmlwKCkKCiAgICB0cmFuc2xhdGlvbiA9IHN0ci5tYWtldHJhbnMoCiAgICAgICAgItuw27Hbstuz27Tbtdu227fbuNu52aDZodmi2aPZpNml2abZp9mo2akiLAogICAgICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIsCiAgICApCgogICAgdmFsdWUgPSAoCiAgICAgICAgcmF3LnRyYW5zbGF0ZSh0cmFuc2xhdGlvbikKICAgICAgICAucmVwbGFjZSgiLCIsICIiKQogICAgICAgIC5yZXBsYWNlKCLYjCIsICIiKQogICAgICAgIC5yZXBsYWNlKCJfIiwgIiIpCiAgICAgICAgLnJlcGxhY2UoIiAiLCAiIikKICAgICkKCiAgICBpZiBub3QgdmFsdWUuaXNkaWdpdCgpOgogICAgICAgIGF3YWl0IHNlbmRfaHRtbCgKICAgICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgICAgZiJ7Y2UoJ2Vycm9yJyl9INmE2LfZgdin2Ysg2YHZgti3INi52K/YryDYp9ix2LPYp9mEINqp2YbbjNivLiIsCiAgICAgICAgICAgIGtleWJvYXJkPWJ1aWxkX2JhY2tfa2V5Ym9hcmQoImJ1eV9zdGFycyIpLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBhbW91bnQgPSBpbnQodmFsdWUpCgogICAgaWYgKAogICAgICAgIGFtb3VudCA8IE1JTl9DVVNUT01fU1RBUlMKICAgICAgICBvciBhbW91bnQgPiBNQVhfQ1VTVE9NX1NUQVJTCiAgICApOgogICAgICAgIGF3YWl0IHNlbmRfaHRtbCgKICAgICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgZiJ7Y2UoJ3dhcm5pbmcnKX0g2KrYudiv2KfYryBTdGFycyDYqNin24zYryDYqNuM2YYgIgogICAgICAgICAgICAgICAgZiI8Yj57TUlOX0NVU1RPTV9TVEFSUzosfTwvYj4g2YggIgogICAgICAgICAgICAgICAgZiI8Yj57TUFYX0NVU1RPTV9TVEFSUzosfTwvYj4g2KjYp9i02K8uIgogICAgICAgICAgICApLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBwYWNrYWdlX2lkID0gZiJjdXN0b21fc3RhcnNfe2Ftb3VudH0iCgogICAgcHJvY2Vzc2luZ19tZXNzYWdlID0gYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgcHJlbWl1bWl6ZV9odG1sKAogICAgICAgICAgICBmIntjZSgnbG9hZGluZycpfSAiCiAgICAgICAgICAgIGYi2K/YsSDYrdin2YQg2YXYrdin2LPYqNmHINmC24zZhdiqIDxiPnthbW91bnQ6LH08L2I+IFN0YXJzLi4uIgogICAgICAgICksCiAgICAgICAgcGFyc2VfbW9kZT0iSFRNTCIsCiAgICApCgogICAgcHJldmlld19wcmljZSA9IGF3YWl0IGdldF9saXZlX3ByZXZpZXdfcHJpY2UoCiAgICAgICAgcGFja2FnZV9pZCwKICAgICAgICBkYj1kYiwKICAgICkKCiAgICBpZiAoCiAgICAgICAgcHJldmlld19wcmljZSBpcyBOb25lCiAgICAgICAgb3IgcHJldmlld19wcmljZSA8PSAwCiAgICApOgogICAgICAgIHRyeToKICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc2luZ19tZXNzYWdlLmVkaXRfdGV4dCgKICAgICAgICAgICAgICAgIHByZW1pdW1pemVfaHRtbCgKICAgICAgICAgICAgICAgICAgICBmIntjZSgnZXJyb3InKX0gIgogICAgICAgICAgICAgICAgICAgICI8Yj7ZgtuM2YXYqiBTdGFycyDYr9mE2K7ZiNin2Ycg2YLYp9io2YQg2YXYrdin2LPYqNmHINmG24zYs9iqLjwvYj5cblxuIgogICAgICAgICAgICAgICAgICAgICLYr9ixINm+2YbZhCDZhdiv24zYsduM2Kog2KjYp9uM2K8g2YLbjNmF2Kog2K/ZhNin2LHbjCDZh9ixINuxIFN0YXIgIgogICAgICAgICAgICAgICAgICAgICLYqNix2KfbjCDYs9mB2KfYsdi04oCM2YfYp9uMINiv2YTYrtmI2KfZhyDYqtmG2LjbjNmFINi02YjYry4iCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgcGFyc2VfbW9kZT0iSFRNTCIsCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHN0YXRlLnVwZGF0ZV9kYXRhKAogICAgICAgIHNlbGVjdGVkX3BhY2thZ2U9cGFja2FnZV9pZCwKICAgICAgICByZWFkYWJsZV9wYWNrYWdlX25hbWU9ZiJ7YW1vdW50Oix9IFN0YXJzINiq2YTar9ix2KfZhSIsCiAgICAgICAgcHJpY2U9aW50KHByZXZpZXdfcHJpY2UpLAogICAgICAgIHByZXZpZXdfcHJpY2VfdG9tYW49aW50KHByZXZpZXdfcHJpY2UpLAogICAgICAgIHN0YXJzX2Ftb3VudD1hbW91bnQsCiAgICApCgogICAgYXdhaXQgc3RhdGUuc2V0X3N0YXRlKAogICAgICAgIE9yZGVyU3RhdGVzLndhaXRpbmdfZm9yX3RhcmdldF9hY2NvdW50CiAgICApCgogICAgYmFsYW5jZSA9IGF3YWl0IGdldF91c2VyX2JhbGFuY2UoCiAgICAgICAgbWVzc2FnZS5mcm9tX3VzZXIuaWQsCiAgICAgICAgZGIsCiAgICApCgogICAgdHJ5OgogICAgICAgIGF3YWl0IHByb2Nlc3NpbmdfbWVzc2FnZS5lZGl0X3RleHQoCiAgICAgICAgICAgIHByZW1pdW1pemVfaHRtbCgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBmIntjZSgncGFja2FnZScpfSA8Yj7YqtmI2LbbjNit2KfYqiDYs9mB2KfYsdi0PC9iPlxuIgogICAgICAgICAgICAgICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgogICAgICAgICAgICAgICAgICAgIGYie2NlKCdwYWNrYWdlJyl9INmF2K3YtdmI2YQ6ICIKICAgICAgICAgICAgICAgICAgICBmIjxiPnthbW91bnQ6LH0gU3RhcnMg2KrZhNqv2LHYp9mFPC9iPlxuXG4iCiAgICAgICAgICAgICAgICAgICAgZiJ7Y2UoJ21vbmV5Jyl9INmC24zZhdiqINmE2K3YuNmH4oCM2KfbjDogIgogICAgICAgICAgICAgICAgICAgIGYiPGNvZGU+e2ludChwcmV2aWV3X3ByaWNlKTosfSDYqtmI2YXYp9mGPC9jb2RlPlxuXG4iCiAgICAgICAgICAgICAgICAgICAgZiJ7Y2UoJ3dhbGxldCcpfSDZhdmI2KzZiNiv24w6ICIKICAgICAgICAgICAgICAgICAgICBmIjxjb2RlPntiYWxhbmNlOix9INiq2YjZhdin2YY8L2NvZGU+XG5cbiIKICAgICAgICAgICAgICAgICAgICBmIntjZSgndGFyZ2V0Jyl9INit2KfZhNinINuM2YjYstix2YbbjNmFINmF2YLYtdivINix2Kcg2KfYsdiz2KfZhCDaqdmG24zYry5cblxuIgogICAgICAgICAgICAgICAgICAgIGYie2NlKCd3YXJuaW5nJyl9ICIKICAgICAgICAgICAgICAgICAgICAi2YfZhtqv2KfZhSDYqtin24zbjNivINmF2KfZhNqpINmG2LHYriDYqtiq2LEg2K/ZiNio2KfYsdmHINio2LHYsdiz24wg2YXbjOKAjNi02YjYry4iCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHJlcGx5X21hcmt1cD1idWlsZF9iYWNrX2tleWJvYXJkKCJidXlfc3RhcnMiKSwKICAgICAgICAgICAgcGFyc2VfbW9kZT0iSFRNTCIsCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBhd2FpdCBzZW5kX2h0bWwoCiAgICAgICAgICAgIG1lc3NhZ2UsCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGYie2NlKCdzdWNjZXNzJyl9IDxiPnthbW91bnQ6LH0gU3RhcnMg2KfZhtiq2K7Yp9ioINi02K8uPC9iPlxuXG4iCiAgICAgICAgICAgICAgICBmIntjZSgnbW9uZXknKX0g2YLbjNmF2Kog2YHYudmE24w6ICIKICAgICAgICAgICAgICAgIGYiPGNvZGU+e2ludChwcmV2aWV3X3ByaWNlKTosfSDYqtmI2YXYp9mGPC9jb2RlPlxuIgogICAgICAgICAgICAgICAgZiJ7Y2UoJ3dhbGxldCcpfSDZhdmI2KzZiNiv24w6ICIKICAgICAgICAgICAgICAgIGYiPGNvZGU+e2JhbGFuY2U6LH0g2KrZiNmF2KfZhjwvY29kZT5cblxuIgogICAgICAgICAgICAgICAgZiJ7Y2UoJ3RhcmdldCcpfSDYrdin2YTYpyDbjNmI2LLYsdmG24zZhSDZhdmC2LXYryDYsdinINin2LHYs9in2YQg2qnZhtuM2K8uIgogICAgICAgICAgICApLAogICAgICAgICAgICBrZXlib2FyZD1idWlsZF9iYWNrX2tleWJvYXJkKCJidXlfc3RhcnMiKSwKICAgICAgICApCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUYXJnZXQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkByb3V0ZXIubWVzc2FnZSgKICAgIE9yZGVyU3RhdGVzLndhaXRpbmdfZm9yX3RhcmdldF9hY2NvdW50LAogICAgRi50ZXh0LAopCmFzeW5jIGRlZiByZWNlaXZlX3RhcmdldF9hY2NvdW50KAogICAgbWVzc2FnZTogTWVzc2FnZSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAogICAgZGI6IEFueSA9IE5vbmUsCikgLT4gTm9uZToKICAgIHRhcmdldCA9IG5vcm1hbGl6ZV91c2VybmFtZSgKICAgICAgICBtZXNzYWdlLnRleHQKICAgICAgICBvciAiIgogICAgKQoKICAgIGlmIG5vdCB0YXJnZXQ6CiAgICAgICAgYXdhaXQgc2VuZF9odG1sKAogICAgICAgICAgICBtZXNzYWdlLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBmIntjZSgnZXJyb3InKX0gIgogICAgICAgICAgICAgICAgIjxiPtuM2YjYstix2YbbjNmFINmF2YLYtdivINmF2LnYqtio2LEg2YbbjNiz2KouPC9iPlxuXG4iCiAgICAgICAgICAgICAgICAi2YXYq9in2YQ6IDxjb2RlPkB1c2VybmFtZTwvY29kZT4iCiAgICAgICAgICAgICksCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGRhdGEgPSBhd2FpdCBzdGF0ZS5nZXRfZGF0YSgpCgogICAgcGFja2FnZV9pZCA9IHN0cigKICAgICAgICBkYXRhLmdldCgic2VsZWN0ZWRfcGFja2FnZSIsICIiKQogICAgICAgIG9yICIiCiAgICApCgogICAgcGFja2FnZV9uYW1lID0gc3RyKAogICAgICAgIGRhdGEuZ2V0KCJyZWFkYWJsZV9wYWNrYWdlX25hbWUiLCAi2YXYrdi12YjZhCIpCiAgICApCgogICAgaWYgbm90IHBhY2thZ2VfaWQ6CiAgICAgICAgYXdhaXQgc3RhdGUuY2xlYXIoKQogICAgICAgIGF3YWl0IHNlbmRfaHRtbCgKICAgICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgICAgZiJ7Y2UoJ2Vycm9yJyl9INin2LfZhNin2LnYp9iqINiz2YHYp9ix2LQg2YXZhtmC2LbbjCDYtNiv2Ycg2KfYs9iqLiIsCiAgICAgICAgICAgIGtleWJvYXJkPWJ1aWxkX3Jlc3VsdF9rZXlib2FyZCgpLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBiYWxhbmNlID0gYXdhaXQgZ2V0X3VzZXJfYmFsYW5jZSgKICAgICAgICBtZXNzYWdlLmZyb21fdXNlci5pZCwKICAgICAgICBkYiwKICAgICkKCiAgICB0cnk6CiAgICAgICAgcHJldmlld19wcmljZSA9IGludCgKICAgICAgICAgICAgZGF0YS5nZXQoCiAgICAgICAgICAgICAgICAicHJpY2UiLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgKQogICAgICAgICAgICBvciAwCiAgICAgICAgKQogICAgZXhjZXB0ICgKICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgVmFsdWVFcnJvciwKICAgICk6CiAgICAgICAgcHJldmlld19wcmljZSA9IDAKCiAgICBpZiBwcmV2aWV3X3ByaWNlIDw9IDA6CiAgICAgICAgcHJldmlldyA9IGF3YWl0IGdldF9saXZlX3ByZXZpZXdfcHJpY2UoCiAgICAgICAgICAgIHBhY2thZ2VfaWQsCiAgICAgICAgICAgIGRiPWRiLAogICAgICAgICkKCiAgICAgICAgcHJldmlld19wcmljZSA9IGludCgKICAgICAgICAgICAgcHJldmlldwogICAgICAgICAgICBvciAwCiAgICAgICAgKQoKICAgIGlmIHByZXZpZXdfcHJpY2UgPD0gMDoKICAgICAgICBhd2FpdCBzZW5kX2h0bWwoCiAgICAgICAgICAgIG1lc3NhZ2UsCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGYie2NlKCdlcnJvcicpfSAiCiAgICAgICAgICAgICAgICAiPGI+2YLbjNmF2Kog2YXYrdi12YjZhCDYr9ixINin24zZhiDZhNit2LjZhyDZgtin2KjZhCDZhdit2KfYs9io2Ycg2YbbjNiz2KouPC9iPlxuXG4iCiAgICAgICAgICAgICAgICAi2KrZhti424zZhdin2Kog2YLbjNmF2Kog2K/ZhNin2LHbjCDZhdit2LXZiNmEINmIINmG2LHYriDYqtiq2LEg2LHYpyDYqNix2LHYs9uMINqp2YbbjNivLiIKICAgICAgICAgICAgKSwKICAgICAgICAgICAga2V5Ym9hcmQ9YnVpbGRfcmVzdWx0X2tleWJvYXJkKCksCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHN0YXRlLnVwZGF0ZV9kYXRhKAogICAgICAgIHRhcmdldF9hY2NvdW50PXRhcmdldCwKICAgICAgICBwcmljZT1wcmV2aWV3X3ByaWNlLAogICAgICAgIHByZXZpZXdfcHJpY2VfdG9tYW49cHJldmlld19wcmljZSwKICAgICkKCiAgICBhd2FpdCBzdGF0ZS5zZXRfc3RhdGUoCiAgICAgICAgT3JkZXJTdGF0ZXMud2FpdGluZ19mb3JfcmVxdWVzdF9jb25maXJtYXRpb24KICAgICkKCiAgICB0ZXh0ID0gKAogICAgICAgIGYie2NlKCdsaXN0Jyl9IDxiPtiq2YjYttuM2K3Yp9iqINmIINm+24zYtOKAjNmB2Kfaqdiq2YjYsSDYs9mB2KfYsdi0PC9iPlxuIgogICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgoKICAgICAgICBmIntjZSgncGFja2FnZScpfSDZhdit2LXZiNmEOlxuIgogICAgICAgIGYiPGNvZGU+e2VzY2FwZShwYWNrYWdlX25hbWUpfTwvY29kZT5cblxuIgoKICAgICAgICBmIntjZSgndGFyZ2V0Jyl9INmF2YLYtdivOlxuIgogICAgICAgIGYiPGNvZGU+QHtlc2NhcGUodGFyZ2V0KX08L2NvZGU+XG5cbiIKCiAgICAgICAgZiJ7Y2UoJ21vbmV5Jyl9INmC24zZhdiqINmB2LnZhNuMOlxuIgogICAgICAgIGYiPGNvZGU+e3ByZXZpZXdfcHJpY2U6LH0g2KrZiNmF2KfZhjwvY29kZT5cblxuIgoKICAgICAgICBmIntjZSgnd2FsbGV0Jyl9INmF2YjYrNmI2K/bjCDZgdi52YTbjDpcbiIKICAgICAgICBmIjxjb2RlPntiYWxhbmNlOix9INiq2YjZhdin2YY8L2NvZGU+XG5cbiIKCiAgICAgICAgZiJ7Y2UoJ3dhcm5pbmcnKX0gIgogICAgICAgICI8Yj7Yr9ixINin24zZhiDZhdix2K3ZhNmHINmH24zahiDZhdio2YTYutuMINqp2LPYsSDZhtmF24zigIzYtNmI2K8uPC9iPlxuIgogICAgICAgICLZh9mG2q/Yp9mFINiq2KfbjNuM2K8g2YXYp9mE2qnYjCDZhtix2K4g2KrYqtixINiv2YjYqNin2LHZhyDYr9ix24zYp9mB2Kog2Ygg2YXYqNmE2Log2YbZh9in24zbjCDYqNix2LHYs9uMINmF24zigIzYtNmI2K8uIgogICAgKQoKICAgIGF3YWl0IHNlbmRfaHRtbCgKICAgICAgICBtZXNzYWdlLAogICAgICAgIHRleHQsCiAgICAgICAga2V5Ym9hcmQ9YnVpbGRfcHVyY2hhc2Vfa2V5Ym9hcmQoKSwKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFN1Ym1pdCBPd25lciBBcHByb3ZhbCBSZXF1ZXN0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhID09ICJmaW5hbGl6ZV9wdXJjaGFzZSIKKQphc3luYyBkZWYgZmluYWxpemVfcHVyY2hhc2UoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAogICAgZGI6IEFueSA9IE5vbmUsCiAgICBvcmRlcl9zZXJ2aWNlOiBPcHRpb25hbFsKICAgICAgICBPcmRlclNlcnZpY2UKICAgIF0gPSBOb25lLAopIC0+IE5vbmU6CiAgICBjdXJyZW50X3N0YXRlID0gYXdhaXQgc3RhdGUuZ2V0X3N0YXRlKCkKCiAgICB2YWxpZF9zdGF0ZXMgPSB7CiAgICAgICAgT3JkZXJTdGF0ZXMud2FpdGluZ19mb3JfcmVxdWVzdF9jb25maXJtYXRpb24uc3RhdGUsCiAgICAgICAgT3JkZXJTdGF0ZXMud2FpdGluZ19mb3JfcGF5bWVudF9jb25maXJtYXRpb24uc3RhdGUsCiAgICB9CgogICAgaWYgKAogICAgICAgIGN1cnJlbnRfc3RhdGUKICAgICAgICBhbmQgY3VycmVudF9zdGF0ZSBub3QgaW4gdmFsaWRfc3RhdGVzCiAgICApOgogICAgICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIuKdjCDZhti02LPYqiDYs9mB2KfYsdi0INmF2LnYqtio2LEg2YbbjNiz2KouIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBkYXRhID0gYXdhaXQgc3RhdGUuZ2V0X2RhdGEoKQoKICAgIHBhY2thZ2VfaWQgPSBzdHIoCiAgICAgICAgZGF0YS5nZXQoInNlbGVjdGVkX3BhY2thZ2UiLCAiIikKICAgICAgICBvciAiIgogICAgKQoKICAgIHBhY2thZ2VfbmFtZSA9IHN0cigKICAgICAgICBkYXRhLmdldCgicmVhZGFibGVfcGFja2FnZV9uYW1lIiwgItmF2K3YtdmI2YQiKQogICAgKQoKICAgIHRhcmdldCA9IG5vcm1hbGl6ZV91c2VybmFtZSgKICAgICAgICBzdHIoCiAgICAgICAgICAgIGRhdGEuZ2V0KCJ0YXJnZXRfYWNjb3VudCIsICIiKQogICAgICAgICAgICBvciAiIgogICAgICAgICkKICAgICkKCiAgICB0cnk6CiAgICAgICAgcHJldmlld19wcmljZSA9IGludCgKICAgICAgICAgICAgZGF0YS5nZXQoCiAgICAgICAgICAgICAgICAicHJpY2UiLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgKQogICAgICAgICAgICBvciAwCiAgICAgICAgKQogICAgZXhjZXB0ICgKICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgVmFsdWVFcnJvciwKICAgICk6CiAgICAgICAgcHJldmlld19wcmljZSA9IDAKCiAgICBpZiAoCiAgICAgICAgbm90IHBhY2thZ2VfaWQKICAgICAgICBvciBub3QgdGFyZ2V0CiAgICAgICAgb3IgcHJldmlld19wcmljZSA8PSAwCiAgICApOgogICAgICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLinYwg2KfYt9mE2KfYudin2Kog2LPZgdin2LHYtCDbjNinINmC24zZhdiqINmF2YbZgti224wg2LTYr9mHINin2LPYqi4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIHRyeToKICAgICAgICBzZXJ2aWNlID0gYXdhaXQgcmVzb2x2ZV9vcmRlcl9zZXJ2aWNlKAogICAgICAgICAgICBvcmRlcl9zZXJ2aWNlLAogICAgICAgICAgICBkYiwKICAgICAgICApCgogICAgICAgICMgU3RvcmUgdGhlIHVzZXItdmlzaWJsZSBwcmV2aWV3IHByaWNlLgogICAgICAgICMgT3duZXIgYXBwcm92YWwgcmVmcmVzaGVzIFVTRFQvVG9tYW4gYmVmb3JlIGFueSB3YWxsZXQgZGViaXQuCiAgICAgICAgb3JkZXIgPSBhd2FpdCBzZXJ2aWNlLmNyZWF0ZV9wZW5kaW5nX293bmVyX29yZGVyKAogICAgICAgICAgICB1c2VyX2lkPWNhbGxiYWNrLmZyb21fdXNlci5pZCwKICAgICAgICAgICAgcHJvZHVjdF9pZD1wYWNrYWdlX2lkLAogICAgICAgICAgICB0YXJnZXQ9dGFyZ2V0LAogICAgICAgICAgICBwcmljZT1wcmV2aWV3X3ByaWNlLAogICAgICAgICkKCiAgICAgICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgICAgICBzZW50ID0gYXdhaXQgbm90aWZ5X293bmVycygKICAgICAgICAgICAgYm90PWNhbGxiYWNrLmJvdCwKICAgICAgICAgICAgb3JkZXI9b3JkZXIsCiAgICAgICAgICAgIHBhY2thZ2VfbmFtZT1wYWNrYWdlX25hbWUsCiAgICAgICAgICAgIGJ1eWVyX25hbWU9KAogICAgICAgICAgICAgICAgY2FsbGJhY2suZnJvbV91c2VyLmZ1bGxfbmFtZQogICAgICAgICAgICAgICAgb3IgItio2K/ZiNmGINmG2KfZhSIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgYnV5ZXJfdXNlcm5hbWU9Y2FsbGJhY2suZnJvbV91c2VyLnVzZXJuYW1lLAogICAgICAgICkKCiAgICAgICAgdGV4dCA9ICgKICAgICAgICAgICAgZiJ7Y2UoJ3N1Y2Nlc3MnKX0gPGI+2K/Ysdiu2YjYp9iz2Kog2K7YsduM2K8g2KvYqNiqINi02K88L2I+XG4iCiAgICAgICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgogICAgICAgICAgICBmIntjZSgnbGlzdCcpfSDYs9mB2KfYsdi0OiA8Y29kZT4je29yZGVyLmlkfTwvY29kZT5cbiIKICAgICAgICAgICAgZiJ7Y2UoJ3BhY2thZ2UnKX0g2YXYrdi12YjZhDpcbjxjb2RlPntlc2NhcGUocGFja2FnZV9uYW1lKX08L2NvZGU+XG5cbiIKICAgICAgICAgICAgZiJ7Y2UoJ3RhcmdldCcpfSDZhdmC2LXYrzogPGNvZGU+QHtlc2NhcGUodGFyZ2V0KX08L2NvZGU+XG4iCiAgICAgICAgICAgIGYie2NlKCdtb25leScpfSDZgtuM2YXYqiDYq9io2KrigIzYtNiv2Yc6ICIKICAgICAgICAgICAgZiI8Y29kZT57cHJldmlld19wcmljZTosfSDYqtmI2YXYp9mGPC9jb2RlPlxuXG4iCiAgICAgICAgICAgIGYie2NlKCdsb2FkaW5nJyl9INmI2LbYuduM2Ko6ICIKICAgICAgICAgICAgIjxjb2RlPtiv2LEg2KfZhtiq2LjYp9ixINiq2KfbjNuM2K8g2YXYp9mE2qk8L2NvZGU+XG5cbiIKICAgICAgICAgICAgZiJ7Y2UoJ3dhcm5pbmcnKX0gIgogICAgICAgICAgICAiPGI+2YfZhtmI2LIg2YfbjNqGINmF2KjZhNi624wg2KfYsiDaqduM2YEg2b7ZiNmEINqp2LPYsSDZhti02K/ZhyDYp9iz2KouPC9iPiIKICAgICAgICApCgogICAgICAgIGlmIHNlbnQgPT0gMDoKICAgICAgICAgICAgdGV4dCArPSAoCiAgICAgICAgICAgICAgICAiXG5cbiIKICAgICAgICAgICAgICAgIGYie2NlKCd3YXJuaW5nJyl9INin2LnZhNin2YYg2YXYs9iq2YLbjNmFINmF2KfZhNqpINin2LHYs9in2YQg2YbYtNiv2IwgIgogICAgICAgICAgICAgICAgItin2YXYpyDYs9mB2KfYsdi0INiv2KfYrtmEINiv24zYqtin2KjbjNizINir2KjYqiDYtNiv2Ycg2KfYs9iqLiIKICAgICAgICAgICAgKQoKICAgICAgICBhd2FpdCBzYWZlX2VkaXRfbWVzc2FnZSgKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgIHRleHQsCiAgICAgICAgICAgIGJ1aWxkX3Jlc3VsdF9rZXlib2FyZCgpLAogICAgICAgICkKCiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi4pyFINiv2LHYrtmI2KfYs9iqINio2LHYp9uMINiq2KfbjNuM2K8g2YXYp9mE2qkg2KvYqNiqINi02K8uIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICJDb3VsZCBub3QgcGVyc2lzdCBvd25lciBhcHByb3ZhbCBvcmRlci4iCiAgICAgICAgKQoKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLinYwg2KvYqNiqINiz2YHYp9ix2LQg2KfZhtis2KfZhSDZhti02K8uIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIENhbmNlbAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YSA9PSAiY2FuY2VsX3Nob3AiCikKYXN5bmMgZGVmIGNhbmNlbF9zaG9wKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBzdGF0ZTogRlNNQ29udGV4dCwKKSAtPiBOb25lOgogICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgIGF3YWl0IHNhZmVfZWRpdF9tZXNzYWdlKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgZiJ7Y2UoJ2Vycm9yJyl9ICIKICAgICAgICAgICAgIjxiPtmB2LHYotuM2YbYryDYs9mB2KfYsdi0INmE2LrZiCDYtNivLjwvYj4iCiAgICAgICAgKSwKICAgICAgICBnZXRfdXNlcl9tYWluX21lbnUoKSwKICAgICkKCiAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJpY2UgQ2hhbmdlIC8gTWFudWFsIEZ1bGZpbGxtZW50IEtleWJvYXJkcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIHByaWNlX2NoYW5nZV9rZXlib2FyZCgKICAgIG9yZGVyX2lkOiBpbnQsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICAgICAgdGV4dD0i4pyFINmC2KjZiNmEINmC24zZhdiqINis2K/bjNivIiwKICAgICAgICAgICAgY2FsbGJhY2tfZGF0YT0oCiAgICAgICAgICAgICAgICBmImFjY2VwdF9uZXdfcHJpY2Vfb3JkZXJfe2ludChvcmRlcl9pZCl9IgogICAgICAgICAgICApLAogICAgICAgICAgICBzdHlsZT0ic3VjY2VzcyIsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIElubGluZUtleWJvYXJkQnV0dG9uKAogICAgICAgICAgICB0ZXh0PSLinYwg2YTYutmIINiz2YHYp9ix2LQiLAogICAgICAgICAgICBjYWxsYmFja19kYXRhPSgKICAgICAgICAgICAgICAgIGYiY2FuY2VsX25ld19wcmljZV9vcmRlcl97aW50KG9yZGVyX2lkKX0iCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHN0eWxlPSJkYW5nZXIiLAogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQoKCmRlZiBtYW51YWxfZnVsZmlsbG1lbnRfa2V5Ym9hcmQoCiAgICBvcmRlcl9pZDogaW50LAopIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgSW5saW5lS2V5Ym9hcmRCdXR0b24oCiAgICAgICAgICAgIHRleHQ9IuKchSDYqtit2YjbjNmEINi02K8iLAogICAgICAgICAgICBjYWxsYmFja19kYXRhPSgKICAgICAgICAgICAgICAgIGYibWFudWFsX2NvbXBsZXRlX29yZGVyX3tpbnQob3JkZXJfaWQpfSIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgc3R5bGU9InN1Y2Nlc3MiLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICAgICAgdGV4dD0i4oap77iPINmE2LrZiCDZiCDYqNin2LLar9i02Kog2YjYrNmHIiwKICAgICAgICAgICAgY2FsbGJhY2tfZGF0YT0oCiAgICAgICAgICAgICAgICBmIm1hbnVhbF9yZWZ1bmRfb3JkZXJfe2ludChvcmRlcl9pZCl9IgogICAgICAgICAgICApLAogICAgICAgICAgICBzdHlsZT0iZGFuZ2VyIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE93bmVyIFJlamVjdAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YS5zdGFydHN3aXRoKAogICAgICAgICJvd25lcl9yZWplY3Rfb3JkZXJfIgogICAgKQopCmFzeW5jIGRlZiBvd25lcl9yZWplY3Rfb3JkZXIoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIGRiOiBBbnkgPSBOb25lLAogICAgb3JkZXJfc2VydmljZTogT3B0aW9uYWxbCiAgICAgICAgT3JkZXJTZXJ2aWNlCiAgICBdID0gTm9uZSwKKSAtPiBOb25lOgogICAgb3duZXJfaWQgPSBpbnQoCiAgICAgICAgY2FsbGJhY2suZnJvbV91c2VyLmlkCiAgICApCgogICAgaWYgbm90IGlzX2FkbWluKAogICAgICAgIG93bmVyX2lkCiAgICApOgogICAgICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIuKblCDYr9iz2KrYsdiz24wg2YbYr9in2LHbjNivLiIsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIG9yZGVyX2lkID0gaW50KAogICAgICAgICAgICBzdHIoCiAgICAgICAgICAgICAgICBjYWxsYmFjay5kYXRhCiAgICAgICAgICAgICkucmVtb3ZlcHJlZml4KAogICAgICAgICAgICAgICAgIm93bmVyX3JlamVjdF9vcmRlcl8iCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgZXhjZXB0ICgKICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgVmFsdWVFcnJvciwKICAgICk6CiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi4p2MINi02YbYp9iz2Ycg2LPZgdin2LHYtCDZhtin2YXYudiq2KjYsSDYp9iz2KouIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBzZXJ2aWNlID0gYXdhaXQgcmVzb2x2ZV9vcmRlcl9zZXJ2aWNlKAogICAgICAgIG9yZGVyX3NlcnZpY2UsCiAgICAgICAgZGIsCiAgICApCgogICAgdHJ5OgogICAgICAgIG9yZGVyID0gYXdhaXQgc2VydmljZS5nZXRfb3JkZXIoCiAgICAgICAgICAgIG9yZGVyX2lkCiAgICAgICAgKQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi4p2MINiz2YHYp9ix2LQg2b7bjNiv2Kcg2YbYtNivLiIsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgcmVqZWN0ZWQgPSAoCiAgICAgICAgYXdhaXQgc2VydmljZS5yZWplY3RfYnlfb3duZXIoCiAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICBvd25lcl9pZCwKICAgICAgICApCiAgICApCgogICAgaWYgbm90IHJlamVjdGVkOgogICAgICAgIGZyZXNoID0gYXdhaXQgc2VydmljZS5nZXRfb3JkZXIoCiAgICAgICAgICAgIG9yZGVyX2lkCiAgICAgICAgKQoKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICLimqDvuI8g2LPZgdin2LHYtCDZgtio2YTYp9mLINm+2LHYr9in2LLYtCDYtNiv2Ycg2KfYs9iqLlxuIgogICAgICAgICAgICAgICAgZiLZiNi22LnbjNiqOiB7ZnJlc2guc3RhdHVzfSIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBhd2FpdCBub3RpZnlfdXNlcigKICAgICAgICBjYWxsYmFjay5ib3QsCiAgICAgICAgb3JkZXIudXNlcl9pZCwKICAgICAgICAoCiAgICAgICAgICAgIGYie2NlKCdlcnJvcicpfSAiCiAgICAgICAgICAgICI8Yj7Yr9ix2K7ZiNin2LPYqiDYrtix24zYryDYtNmF2Kcg2KrZiNiz2Lcg2YXYp9mE2qkg2LHYryDYtNivLjwvYj5cblxuIgogICAgICAgICAgICBmIti02YXYp9ix2Ycg2LPZgdin2LHYtDogPGNvZGU+I3tvcmRlci5pZH08L2NvZGU+XG5cbiIKICAgICAgICAgICAgItmH24zahiDZhdio2YTYutuMINin2LIg2qnbjNmBINm+2YjZhCDYtNmF2Kcg2qnYs9ixINmG2LTYr9mHINin2LPYqi4iCiAgICAgICAgKSwKICAgICkKCiAgICBhd2FpdCBzYWZlX2VkaXRfbWVzc2FnZSgKICAgICAgICBjYWxsYmFjaywKICAgICAgICAoCiAgICAgICAgICAgIGYie2NlKCdlcnJvcicpfSAiCiAgICAgICAgICAgICI8Yj7Ys9mB2KfYsdi0INix2K8g2LTYry48L2I+XG5cbiIKICAgICAgICAgICAgZiJPcmRlcjogPGNvZGU+I3tvcmRlci5pZH08L2NvZGU+XG4iCiAgICAgICAgICAgICLZh9uM2oYg2YXYqNmE2LrbjCDYp9iyINqp2KfYsdio2LEg2qnYs9ixINmG2LTYry4iCiAgICAgICAgKSwKICAgICAgICBOb25lLAogICAgKQoKICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICLYs9mB2KfYsdi0INix2K8g2LTYry4iLAogICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE93bmVyIEFwcHJvdmUKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuc3RhcnRzd2l0aCgKICAgICAgICAib3duZXJfYXBwcm92ZV9vcmRlcl8iCiAgICApCikKYXN5bmMgZGVmIG93bmVyX2FwcHJvdmVfb3JkZXIoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIGRiOiBBbnkgPSBOb25lLAogICAgb3JkZXJfc2VydmljZTogT3B0aW9uYWxbCiAgICAgICAgT3JkZXJTZXJ2aWNlCiAgICBdID0gTm9uZSwKKSAtPiBOb25lOgogICAgIiIiCiAgICBPd25lciBhcHByb3ZhbCBmb3IgTUFOVUFMIGZ1bGZpbGxtZW50IG1vZGUuCgogICAgTm8g2LPYsdmI24zYsyDZgtuM2YXYqiAvIGJyb3dzZXIgc2NyYXBlciBpcyBjYWxsZWQuCgogICAgRmxvdzoKICAgICAgICBjbGFpbQogICAgICAgIC0+IHJlZnJlc2ggcHJvZHVjdCBVU0RUICsgVVNEVC9Ub21hbgogICAgICAgIC0+IGlmIHByaWNlIGluY3JlYXNlZDogYXNrIHVzZXIgdG8gYWNjZXB0IG5ldyBwcmljZQogICAgICAgIC0+IGVsc2UgcGVyc2lzdCBjdXJyZW50L2xvd2VyIHByaWNlCiAgICAgICAgLT4gYXRvbWljIHdhbGxldCBkZWJpdAogICAgICAgIC0+IGF3YWl0IG1hbnVhbCBmdWxmaWxsbWVudAogICAgIiIiCiAgICBvd25lcl9pZCA9IGludCgKICAgICAgICBjYWxsYmFjay5mcm9tX3VzZXIuaWQKICAgICkKCiAgICBpZiBub3QgaXNfYWRtaW4oCiAgICAgICAgb3duZXJfaWQKICAgICk6CiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi4puUINiv2LPYqtix2LPbjCDZhtiv2KfYsduM2K8uIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICB0cnk6CiAgICAgICAgb3JkZXJfaWQgPSBpbnQoCiAgICAgICAgICAgIHN0cigKICAgICAgICAgICAgICAgIGNhbGxiYWNrLmRhdGEKICAgICAgICAgICAgKS5yZW1vdmVwcmVmaXgoCiAgICAgICAgICAgICAgICAib3duZXJfYXBwcm92ZV9vcmRlcl8iCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgZXhjZXB0ICgKICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgVmFsdWVFcnJvciwKICAgICk6CiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi4p2MINi02YbYp9iz2Ycg2LPZgdin2LHYtCDZhtin2YXYudiq2KjYsSDYp9iz2KouIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBzZXJ2aWNlID0gYXdhaXQgcmVzb2x2ZV9vcmRlcl9zZXJ2aWNlKAogICAgICAgIG9yZGVyX3NlcnZpY2UsCiAgICAgICAgZGIsCiAgICApCgogICAgb3JkZXIgPSBhd2FpdCBzZXJ2aWNlLmNsYWltX2Zvcl9vd25lcigKICAgICAgICBvcmRlcl9pZCwKICAgICAgICBvd25lcl9pZCwKICAgICkKCiAgICBpZiBvcmRlciBpcyBOb25lOgogICAgICAgIHRyeToKICAgICAgICAgICAgZnJlc2ggPSBhd2FpdCBzZXJ2aWNlLmdldF9vcmRlcigKICAgICAgICAgICAgICAgIG9yZGVyX2lkCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHN0YXR1cyA9IGZyZXNoLnN0YXR1cwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBzdGF0dXMgPSAidW5rbm93biIKCiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAi4pqg77iPINin24zZhiDYs9mB2KfYsdi0INmC2KjZhNin2Ysg2b7Ysdiv2KfYsti0INi02K/ZhyDYp9iz2KouXG4iCiAgICAgICAgICAgICAgICBmItmI2LbYuduM2Ko6IHtzdGF0dXN9IgogICAgICAgICAgICApLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICLYr9ixINit2KfZhCDYr9ix24zYp9mB2Kog2YbYsdiuINmG2YfYp9uM24wg2KrYqtixLi4uIgogICAgKQoKICAgIHRyeToKICAgICAgICBxdW90ZSA9IGF3YWl0IGdldF9tYW51YWxfcHJvZHVjdF9xdW90ZSgKICAgICAgICAgICAgb3JkZXIucHJvZHVjdF9pZCwKICAgICAgICAgICAgZGI9ZGIsCiAgICAgICAgICAgIGZvcmNlX3JlZnJlc2hfcmF0ZT1UcnVlLAogICAgICAgICkKCiAgICAgICAgZmluYWxfcHJpY2UgPSBpbnQoCiAgICAgICAgICAgIHF1b3RlLmZpbmFsX3RvbWFuCiAgICAgICAgKQoKICAgICAgICBvbGRfcHJpY2UgPSBpbnQoCiAgICAgICAgICAgIG9yZGVyLnByaWNlCiAgICAgICAgICAgIG9yIDAKICAgICAgICApCgogICAgICAgIGlmICgKICAgICAgICAgICAgb2xkX3ByaWNlID4gMAogICAgICAgICAgICBhbmQgZmluYWxfcHJpY2UgPiBvbGRfcHJpY2UKICAgICAgICApOgogICAgICAgICAgICBjaGFuZ2VkID0gYXdhaXQgc2VydmljZS5tYXJrX3ByaWNlX2NoYW5nZWQoCiAgICAgICAgICAgICAgICBvcmRlci5pZCwKICAgICAgICAgICAgICAgIHJlcXVpcmVkX3ByaWNlPWZpbmFsX3ByaWNlLAogICAgICAgICAgICApCgogICAgICAgICAgICBpZiBub3QgY2hhbmdlZDoKICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZpY2UucmVzdG9yZV9vd25lcl9wZW5kaW5nKAogICAgICAgICAgICAgICAgICAgIG9yZGVyLmlkLAogICAgICAgICAgICAgICAgICAgIGVycm9yPSgKICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwZXJzaXN0IGluY3JlYXNlZCBwcmljZS4iCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBhd2FpdCBzYWZlX2VkaXRfbWVzc2FnZSgKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIGYie2NlKCdlcnJvcicpfSAiCiAgICAgICAgICAgICAgICAgICAgICAgICI8Yj7Yq9io2Kog2KrYutuM24zYsSDZgtuM2YXYqiDYp9mG2KzYp9mFINmG2LTYry48L2I+XG5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgItmH24zahiDZhdio2YTYutuMINqp2LPYsSDZhti02K/ZhyDYp9iz2KouIgogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgb3duZXJfa2V5Ym9hcmQoCiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLmlkCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2suYm90LnNlbmRfbWVzc2FnZSgKICAgICAgICAgICAgICAgIGNoYXRfaWQ9b3JkZXIudXNlcl9pZCwKICAgICAgICAgICAgICAgIHRleHQ9cHJlbWl1bWl6ZV9odG1sKAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgZiJ7Y2UoJ3dhcm5pbmcnKX0gIgogICAgICAgICAgICAgICAgICAgICAgICAiPGI+2YLbjNmF2Kog2LPZgdin2LHYtCDYqti624zbjNixINqp2LHYr9mHINin2LPYqi48L2I+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgoKICAgICAgICAgICAgICAgICAgICAgICAgZiJ7Y2UoJ2xpc3QnKX0g2LPZgdin2LHYtDogIgogICAgICAgICAgICAgICAgICAgICAgICBmIjxjb2RlPiN7b3JkZXIuaWR9PC9jb2RlPlxuIgoKICAgICAgICAgICAgICAgICAgICAgICAgZiJ7Y2UoJ21vbmV5Jyl9INmC24zZhdiqINmC2KjZhNuMOiAiCiAgICAgICAgICAgICAgICAgICAgICAgIGYiPGNvZGU+e29sZF9wcmljZTosfSDYqtmI2YXYp9mGPC9jb2RlPlxuIgoKICAgICAgICAgICAgICAgICAgICAgICAgZiJ7Y2UoJ21vbmV5Jyl9INmC24zZhdiqINis2K/bjNivOiAiCiAgICAgICAgICAgICAgICAgICAgICAgIGYiPGNvZGU+e2ZpbmFsX3ByaWNlOix9INiq2YjZhdin2YY8L2NvZGU+XG5cbiIKCiAgICAgICAgICAgICAgICAgICAgICAgICLYp9qv2LEg2YLbjNmF2Kog2KzYr9uM2K8g2LHYpyDZgtio2YjZhCDYr9in2LHbjNivINiq2KfbjNuM2K8g2qnZhtuM2K8uICIKICAgICAgICAgICAgICAgICAgICAgICAgItiq2Kcg2YLYqNmEINin2LIg2KrYp9uM24zYryDYtNmF2Kcg2YfbjNqGINmF2KjZhNi624wg2qnYs9ixINmG2YXbjOKAjNi02YjYry4iCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIHJlcGx5X21hcmt1cD1wcmljZV9jaGFuZ2Vfa2V5Ym9hcmQoCiAgICAgICAgICAgICAgICAgICAgb3JkZXIuaWQKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBwYXJzZV9tb2RlPSJIVE1MIiwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgYXdhaXQgc2FmZV9lZGl0X21lc3NhZ2UoCiAgICAgICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBmIntjZSgnd2FybmluZycpfSAiCiAgICAgICAgICAgICAgICAgICAgIjxiPtmC24zZhdiqINin2YHYstin24zYtCDZvtuM2K/YpyDaqdix2K8uPC9iPlxuXG4iCiAgICAgICAgICAgICAgICAgICAgZiJPcmRlcjogPGNvZGU+I3tvcmRlci5pZH08L2NvZGU+XG4iCiAgICAgICAgICAgICAgICAgICAgZiLZgtio2YTbjDogPGNvZGU+e29sZF9wcmljZTosfSDYqtmI2YXYp9mGPC9jb2RlPlxuIgogICAgICAgICAgICAgICAgICAgIGYi2KzYr9uM2K86IDxjb2RlPntmaW5hbF9wcmljZTosfSDYqtmI2YXYp9mGPC9jb2RlPlxuXG4iCiAgICAgICAgICAgICAgICAgICAgItio2LHYp9uMINiq2KfbjNuM2K8g2YLbjNmF2Kog2KzYr9uM2K8g2KjZhyDaqdin2LHYqNixINm+24zYp9mFINin2LHYs9in2YQg2LTYry4gIgogICAgICAgICAgICAgICAgICAgICLZh9uM2oYg2YXYqNmE2LrbjCDaqdiz2LEg2YbYtNiv2Ycg2KfYs9iqLiIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBOb25lLAogICAgICAgICAgICApCgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc3RvcmVkID0gYXdhaXQgc2VydmljZS5zZXRfb3duZXJfZmluYWxfcHJpY2UoCiAgICAgICAgICAgIG9yZGVyLmlkLAogICAgICAgICAgICBmaW5hbF9wcmljZT1maW5hbF9wcmljZSwKICAgICAgICApCgogICAgICAgIGlmIG5vdCBzdG9yZWQ6CiAgICAgICAgICAgIGF3YWl0IHNlcnZpY2UucmVzdG9yZV9vd25lcl9wZW5kaW5nKAogICAgICAgICAgICAgICAgb3JkZXIuaWQsCiAgICAgICAgICAgICAgICBlcnJvcj0oCiAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwZXJzaXN0IGZpbmFsIG1hbnVhbCBwcmljZS4iCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBhd2FpdCBzYWZlX2VkaXRfbWVzc2FnZSgKICAgICAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIGYie2NlKCdlcnJvcicpfSAiCiAgICAgICAgICAgICAgICAgICAgIjxiPtir2KjYqiDZhdio2YTYuiDZhtmH2KfbjNuMINin2YbYrNin2YUg2YbYtNivLjwvYj5cblxuIgogICAgICAgICAgICAgICAgICAgICLZh9uM2oYg2YXYqNmE2LrbjCDaqdiz2LEg2YbYtNiv2Ycg2KfYs9iqLiIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBvd25lcl9rZXlib2FyZCgKICAgICAgICAgICAgICAgICAgICBvcmRlci5pZAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHJlc2VydmF0aW9uID0gKAogICAgICAgICAgICBhd2FpdCBzZXJ2aWNlLnJlc2VydmVfd2FsbGV0X2Zvcl9wcm92aWRlcigKICAgICAgICAgICAgICAgIG9yZGVyLmlkCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIGlmIG5vdCByZXNlcnZhdGlvbi5zdWNjZXNzOgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICByZXNlcnZhdGlvbi5yZWFzb24KICAgICAgICAgICAgICAgID09ICJpbnN1ZmZpY2llbnRfYmFsYW5jZSIKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIGF3YWl0IG5vdGlmeV91c2VyKAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmJvdCwKICAgICAgICAgICAgICAgICAgICBvcmRlci51c2VyX2lkLAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgZiJ7Y2UoJ2Vycm9yJyl9ICIKICAgICAgICAgICAgICAgICAgICAgICAgIjxiPtmF2YjYrNmI2K/bjCDaqduM2YEg2b7ZiNmEINio2LHYp9uMINiz2YHYp9ix2LQg2qnYp9mB24wg2YbbjNiz2KouPC9iPlxuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGYiT3JkZXI6IDxjb2RlPiN7b3JkZXIuaWR9PC9jb2RlPlxuIgogICAgICAgICAgICAgICAgICAgICAgICBmItmF2YjYrNmI2K/bjDogIgogICAgICAgICAgICAgICAgICAgICAgICBmIjxjb2RlPntyZXNlcnZhdGlvbi5iYWxhbmNlX2JlZm9yZTosfSDYqtmI2YXYp9mGPC9jb2RlPlxuIgogICAgICAgICAgICAgICAgICAgICAgICBmItmF2KjZhNi6OiAiCiAgICAgICAgICAgICAgICAgICAgICAgIGYiPGNvZGU+e3Jlc2VydmF0aW9uLmFtb3VudDosfSDYqtmI2YXYp9mGPC9jb2RlPlxuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICLZh9uM2oYg2LPZgdin2LHYtNuMINio2LHYp9uMINiq2K3ZiNuM2YQg2KfYsdiz2KfZhCDZhti02K8uIgogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgYXdhaXQgc2FmZV9lZGl0X21lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICBmIntjZSgnd2FybmluZycpfSAiCiAgICAgICAgICAgICAgICAgICAgICAgICI8Yj7ZhdmI2KzZiNiv24wg2qnYp9ix2KjYsSDaqdin2YHbjCDZhtuM2LPYqi48L2I+XG5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgZiJPcmRlcjogPGNvZGU+I3tvcmRlci5pZH08L2NvZGU+IgogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGF3YWl0IHNlcnZpY2UucmVzdG9yZV9vd25lcl9wZW5kaW5nKAogICAgICAgICAgICAgICAgb3JkZXIuaWQsCiAgICAgICAgICAgICAgICBlcnJvcj0oCiAgICAgICAgICAgICAgICAgICAgIldhbGxldCByZXNlcnZlIGZhaWxlZDogIgogICAgICAgICAgICAgICAgICAgICsgcmVzZXJ2YXRpb24ucmVhc29uCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBhd2FpdCBzYWZlX2VkaXRfbWVzc2FnZSgKICAgICAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIGYie2NlKCdlcnJvcicpfSAiCiAgICAgICAgICAgICAgICAgICAgIjxiPtqp2LPYsSDZhdmI2KzZiNiv24wg2KfZhtis2KfZhSDZhti02K8uPC9iPlxuXG4iCiAgICAgICAgICAgICAgICAgICAgItiz2YHYp9ix2LQg2KjZhyDYrdin2YTYqiDYp9mG2KrYuNin2LEg2YXYp9mE2qkg2KjYsdqv2LTYqi4iCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgb3duZXJfa2V5Ym9hcmQoCiAgICAgICAgICAgICAgICAgICAgb3JkZXIuaWQKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBhd2FpdCBub3RpZnlfdXNlcigKICAgICAgICAgICAgY2FsbGJhY2suYm90LAogICAgICAgICAgICBvcmRlci51c2VyX2lkLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBmIntjZSgnc3VjY2VzcycpfSAiCiAgICAgICAgICAgICAgICAiPGI+2LPZgdin2LHYtCDYqtmI2LPYtyDZhdin2YTaqSDYqtin24zbjNivINi02K8uPC9iPlxuIgogICAgICAgICAgICAgICAgIuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgVxuXG4iCiAgICAgICAgICAgICAgICBmIk9yZGVyOiA8Y29kZT4je29yZGVyLmlkfTwvY29kZT5cbiIKICAgICAgICAgICAgICAgIGYi2YXYqNmE2Log2YbZh9in24zbjDogIgogICAgICAgICAgICAgICAgZiI8Y29kZT57cmVzZXJ2YXRpb24uYW1vdW50Oix9INiq2YjZhdin2YY8L2NvZGU+XG5cbiIKICAgICAgICAgICAgICAgICLZhdio2YTYuiDYp9iyINqp24zZgSDZvtmI2YQg2qnYs9ixINi02K8g2Ygg2LPZgdin2LHYtCAiCiAgICAgICAgICAgICAgICAi2K/YsSDYp9mG2KrYuNin2LEg2KrYrdmI24zZhCDYr9iz2KrbjCDYp9iz2KouIgogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgYXdhaXQgc2FmZV9lZGl0X21lc3NhZ2UoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBmIntjZSgnc3VjY2VzcycpfSAiCiAgICAgICAgICAgICAgICAiPGI+2LPZgdin2LHYtCDYotmF2KfYr9mHINiq2K3ZiNuM2YQg2K/Ys9iq24wg2KfYs9iqLjwvYj5cbiIKICAgICAgICAgICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgoKICAgICAgICAgICAgICAgIGYiT3JkZXI6IDxjb2RlPiN7b3JkZXIuaWR9PC9jb2RlPlxuIgogICAgICAgICAgICAgICAgZiLZhdit2LXZiNmEOiA8Y29kZT57ZXNjYXBlKG9yZGVyLnByb2R1Y3RfaWQpfTwvY29kZT5cbiIKICAgICAgICAgICAgICAgIGYi2YXZgti12K86IDxjb2RlPkB7ZXNjYXBlKG9yZGVyLnRhcmdldCBvciAnJyl9PC9jb2RlPlxuIgogICAgICAgICAgICAgICAgZiLZgtuM2YXYqiDZvtin24zZhzogPGNvZGU+e3F1b3RlLmJhc2VfdXNkdH0gVVNEVDwvY29kZT5cbiIKICAgICAgICAgICAgICAgIGYi2YbYsdiuINiq2KrYsTogPGNvZGU+e3F1b3RlLnVzZHRfdG9tYW46LH0g2KrZiNmF2KfZhjwvY29kZT5cbiIKICAgICAgICAgICAgICAgIGYi2YXYqNmE2Log2qnYs9ix2LTYr9mHOiAiCiAgICAgICAgICAgICAgICBmIjxjb2RlPntyZXNlcnZhdGlvbi5hbW91bnQ6LH0g2KrZiNmF2KfZhjwvY29kZT5cblxuIgoKICAgICAgICAgICAgICAgICLYqNi52K8g2KfYsiDYqtit2YjbjNmEINmI2KfZgti524wg2YXYrdi12YjZhCDCq9iq2K3ZiNuM2YQg2LTYr8K7INix2Kcg2KjYstmG24zYry4gIgogICAgICAgICAgICAgICAgItin2q/YsSDYs9mB2KfYsdi0INmC2KfYqNmEINin2YbYrNin2YUg2YbbjNiz2KrYjCDCq9mE2LrZiCDZiCDYqNin2LLar9i02Kog2YjYrNmHwrsg2LHYpyDYqNiy2YbbjNivLiIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbWFudWFsX2Z1bGZpbGxtZW50X2tleWJvYXJkKAogICAgICAgICAgICAgICAgb3JkZXIuaWQKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgZXhjZXB0IFByb2R1Y3RQcmljZU5vdENvbmZpZ3VyZWQ6CiAgICAgICAgYXdhaXQgc2VydmljZS5yZXN0b3JlX293bmVyX3BlbmRpbmcoCiAgICAgICAgICAgIG9yZGVyLmlkLAogICAgICAgICAgICBlcnJvcj0oCiAgICAgICAgICAgICAgICAiUHJvZHVjdCBVU0RUIHByaWNlIGlzIG5vdCBjb25maWd1cmVkLiIKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgIGF3YWl0IHNhZmVfZWRpdF9tZXNzYWdlKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgZiJ7Y2UoJ3dhcm5pbmcnKX0gIgogICAgICAgICAgICAgICAgIjxiPtmC24zZhdiqINiv2YTYp9ix24wg2KfbjNmGINmF2K3YtdmI2YQg2KrZhti424zZhSDZhti02K/ZhyDYp9iz2KouPC9iPlxuXG4iCiAgICAgICAgICAgICAgICAi2KfYsiDZvtmG2YQg2YXYr9uM2LHbjNiqIOKGkCDYqtmG2LjbjNmFINmG2LHYriDZiCDZgtuM2YXYquKAjNmH2KfYjCAiCiAgICAgICAgICAgICAgICAi2YLbjNmF2Kog2KfbjNmGINmF2K3YtdmI2YQg2LHYpyDZiNin2LHYryDaqdmG24zYry5cblxuIgogICAgICAgICAgICAgICAgItmH24zahiDZhdio2YTYutuMINqp2LPYsSDZhti02K/ZhyDYp9iz2KouIgogICAgICAgICAgICApLAogICAgICAgICAgICBvd25lcl9rZXlib2FyZCgKICAgICAgICAgICAgICAgIG9yZGVyLmlkCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGV4Y2VwdCAoCiAgICAgICAgUHJvZHVjdFJhdGVVbmF2YWlsYWJsZSwKICAgICAgICBQcm9kdWN0UHJpY2luZ0Vycm9yLAogICAgKSBhcyBleGM6CiAgICAgICAgYXdhaXQgc2VydmljZS5yZXN0b3JlX293bmVyX3BlbmRpbmcoCiAgICAgICAgICAgIG9yZGVyLmlkLAogICAgICAgICAgICBlcnJvcj0oCiAgICAgICAgICAgICAgICBmInt0eXBlKGV4YykuX19uYW1lX199OiB7ZXhjfSIKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgIGF3YWl0IHNhZmVfZWRpdF9tZXNzYWdlKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgZiJ7Y2UoJ3dhcm5pbmcnKX0gIgogICAgICAgICAgICAgICAgIjxiPtmC24zZhdiqINmG2YfYp9uM24wg2YLYp9io2YQg2YXYrdin2LPYqNmHINmG24zYs9iqLjwvYj5cblxuIgogICAgICAgICAgICAgICAgItmG2LHYriDYqtiq2LEg24zYpyDYqtmG2LjbjNmF2KfYqiDZhdit2LXZiNmEINix2Kcg2KjYsdix2LPbjCDaqdmG24zYry4gIgogICAgICAgICAgICAgICAgItmH24zahiDZhdio2YTYutuMINqp2LPYsSDZhti02K/ZhyDYp9iz2KouIgogICAgICAgICAgICApLAogICAgICAgICAgICBvd25lcl9rZXlib2FyZCgKICAgICAgICAgICAgICAgIG9yZGVyLmlkCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICJNYW51YWwgb3duZXIgYXBwcm92YWwgZmFpbGVkIHwgIgogICAgICAgICAgICAib3JkZXI9JXMiLAogICAgICAgICAgICBvcmRlci5pZCwKICAgICAgICApCgogICAgICAgIHRyeToKICAgICAgICAgICAgZnJlc2ggPSBhd2FpdCBzZXJ2aWNlLmdldF9vcmRlcigKICAgICAgICAgICAgICAgIG9yZGVyLmlkCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGZyZXNoLnN0YXR1cwogICAgICAgICAgICAgICAgPT0gU1RBVFVTX09XTkVSX1BST0NFU1NJTkcKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZpY2UucmVzdG9yZV9vd25lcl9wZW5kaW5nKAogICAgICAgICAgICAgICAgICAgIG9yZGVyLmlkLAogICAgICAgICAgICAgICAgICAgIGVycm9yPSgKICAgICAgICAgICAgICAgICAgICAgICAgZiJNYW51YWwgb3duZXIgYXBwcm92YWwgZmFpbGVkOiAiCiAgICAgICAgICAgICAgICAgICAgICAgIGYie3R5cGUoZXhjKS5fX25hbWVfX306IHtleGN9IgogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlY292ZXIgbWFudWFsIG9yZGVyIHN0YXRlLiIKICAgICAgICAgICAgKQoKICAgICAgICBhd2FpdCBzYWZlX2VkaXRfbWVzc2FnZSgKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGYie2NlKCdlcnJvcicpfSAiCiAgICAgICAgICAgICAgICAiPGI+2b7Ysdiv2KfYsti0INiq2KfbjNuM2K8g2YXYp9mE2qkg2KfZhtis2KfZhSDZhti02K8uPC9iPlxuXG4iCiAgICAgICAgICAgICAgICAi2Kfar9ixINmF2KjZhNi6INqp2LPYsSDZhti02K/Zh9iMINiz2YHYp9ix2LQg2KjZhyDYrdin2YTYqiDYp9mG2KrYuNin2LEg2KjYsdmF24zigIzar9ix2K/Yry4iCiAgICAgICAgICAgICksCiAgICAgICAgICAgIG93bmVyX2tleWJvYXJkKAogICAgICAgICAgICAgICAgb3JkZXIuaWQKICAgICAgICAgICAgKSwKICAgICAgICApCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBVc2VyIGFjY2VwdHMvcmVqZWN0cyBpbmNyZWFzZWQgcHJpY2UKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuc3RhcnRzd2l0aCgKICAgICAgICAiYWNjZXB0X25ld19wcmljZV9vcmRlcl8iCiAgICApCikKYXN5bmMgZGVmIGFjY2VwdF9uZXdfcHJpY2Vfb3JkZXIoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIGRiOiBBbnkgPSBOb25lLAogICAgb3JkZXJfc2VydmljZTogT3B0aW9uYWxbCiAgICAgICAgT3JkZXJTZXJ2aWNlCiAgICBdID0gTm9uZSwKKSAtPiBOb25lOgogICAgdHJ5OgogICAgICAgIG9yZGVyX2lkID0gaW50KAogICAgICAgICAgICBzdHIoCiAgICAgICAgICAgICAgICBjYWxsYmFjay5kYXRhCiAgICAgICAgICAgICkucmVtb3ZlcHJlZml4KAogICAgICAgICAgICAgICAgImFjY2VwdF9uZXdfcHJpY2Vfb3JkZXJfIgogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIGV4Y2VwdCAoCiAgICAgICAgVHlwZUVycm9yLAogICAgICAgIFZhbHVlRXJyb3IsCiAgICApOgogICAgICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIti02YbYp9iz2Ycg2LPZgdin2LHYtCDZhtin2YXYudiq2KjYsSDYp9iz2KouIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBzZXJ2aWNlID0gYXdhaXQgcmVzb2x2ZV9vcmRlcl9zZXJ2aWNlKAogICAgICAgIG9yZGVyX3NlcnZpY2UsCiAgICAgICAgZGIsCiAgICApCgogICAgdHJ5OgogICAgICAgIG9yZGVyID0gYXdhaXQgc2VydmljZS5nZXRfb3JkZXIoCiAgICAgICAgICAgIG9yZGVyX2lkCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLYs9mB2KfYsdi0INm+24zYr9inINmG2LTYry4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGlmIGludCgKICAgICAgICBvcmRlci51c2VyX2lkCiAgICApICE9IGludCgKICAgICAgICBjYWxsYmFjay5mcm9tX3VzZXIuaWQKICAgICk6CiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi2KfbjNmGINiz2YHYp9ix2LQg2YXYqti52YTZgiDYqNmHINi02YXYpyDZhtuM2LPYqi4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGFjY2VwdGVkID0gYXdhaXQgc2VydmljZS5hY2NlcHRfcHJpY2VfY2hhbmdlKAogICAgICAgIG9yZGVyX2lkLAogICAgICAgIHVzZXJfaWQ9Y2FsbGJhY2suZnJvbV91c2VyLmlkLAogICAgKQoKICAgIGlmIG5vdCBhY2NlcHRlZDoKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLYp9uM2YYg2K/Ysdiu2YjYp9iz2Kog2K/bjNqv2LEg2YLYp9io2YQg2KrYp9uM24zYryDZhtuM2LPYqi4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIHVwZGF0ZWQgPSBhd2FpdCBzZXJ2aWNlLmdldF9vcmRlcigKICAgICAgICBvcmRlcl9pZAogICAgKQoKICAgIGF3YWl0IHNhZmVfZWRpdF9tZXNzYWdlKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgZiJ7Y2UoJ3N1Y2Nlc3MnKX0gIgogICAgICAgICAgICAiPGI+2YLbjNmF2Kog2KzYr9uM2K8g2KrYp9uM24zYryDYtNivLjwvYj5cblxuIgogICAgICAgICAgICBmIk9yZGVyOiA8Y29kZT4je29yZGVyX2lkfTwvY29kZT5cbiIKICAgICAgICAgICAgZiLZgtuM2YXYqjogPGNvZGU+e3VwZGF0ZWQucHJpY2U6LH0g2KrZiNmF2KfZhjwvY29kZT5cblxuIgogICAgICAgICAgICAi2LPZgdin2LHYtCDYr9mI2KjYp9ix2Ycg2KjYsdin24wg2KrYp9uM24zYryDZhdin2YTaqSDYotmF2KfYr9mHINin2LPYqi4gIgogICAgICAgICAgICAi2YfZhtmI2LIg2YfbjNqGINmF2KjZhNi624wg2qnYs9ixINmG2LTYr9mHINin2LPYqi4iCiAgICAgICAgKSwKICAgICAgICBidWlsZF9yZXN1bHRfa2V5Ym9hcmQoKSwKICAgICkKCiAgICAjIFJlLW5vdGlmeSBvd25lcnMgc28gdGhleSBjYW4gYXBwcm92ZSBhZ2Fpbi4KICAgIGZvciBhZG1pbl9pZCBpbiBnZXRfYWRtaW5faWRzKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBhd2FpdCBjYWxsYmFjay5ib3Quc2VuZF9tZXNzYWdlKAogICAgICAgICAgICAgICAgY2hhdF9pZD1hZG1pbl9pZCwKICAgICAgICAgICAgICAgIHRleHQ9cHJlbWl1bWl6ZV9odG1sKAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgZiJ7Y2UoJ3N1Y2Nlc3MnKX0gIgogICAgICAgICAgICAgICAgICAgICAgICAiPGI+2qnYp9ix2KjYsSDZgtuM2YXYqiDYrNiv24zYryDYsdinINiq2KfbjNuM2K8g2qnYsdivLjwvYj5cblxuIgogICAgICAgICAgICAgICAgICAgICAgICBmIk9yZGVyOiA8Y29kZT4je29yZGVyX2lkfTwvY29kZT5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgZiLZhdio2YTYuiDZvtiw24zYsdmB2KrZh+KAjNi02K/ZhzogIgogICAgICAgICAgICAgICAgICAgICAgICBmIjxjb2RlPnt1cGRhdGVkLnByaWNlOix9INiq2YjZhdin2YY8L2NvZGU+IgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICByZXBseV9tYXJrdXA9b3duZXJfa2V5Ym9hcmQoCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBwYXJzZV9tb2RlPSJIVE1MIiwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlLW5vdGlmeSBvd25lciB8IG9yZGVyPSVzIiwKICAgICAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICApCgogICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgIuKchSDZgtuM2YXYqiDYrNiv24zYryDYqtin24zbjNivINi02K8uIiwKICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICApCgoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YS5zdGFydHN3aXRoKAogICAgICAgICJjYW5jZWxfbmV3X3ByaWNlX29yZGVyXyIKICAgICkKKQphc3luYyBkZWYgY2FuY2VsX25ld19wcmljZV9vcmRlcigKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgZGI6IEFueSA9IE5vbmUsCiAgICBvcmRlcl9zZXJ2aWNlOiBPcHRpb25hbFsKICAgICAgICBPcmRlclNlcnZpY2UKICAgIF0gPSBOb25lLAopIC0+IE5vbmU6CiAgICB0cnk6CiAgICAgICAgb3JkZXJfaWQgPSBpbnQoCiAgICAgICAgICAgIHN0cigKICAgICAgICAgICAgICAgIGNhbGxiYWNrLmRhdGEKICAgICAgICAgICAgKS5yZW1vdmVwcmVmaXgoCiAgICAgICAgICAgICAgICAiY2FuY2VsX25ld19wcmljZV9vcmRlcl8iCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgZXhjZXB0ICgKICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgVmFsdWVFcnJvciwKICAgICk6CiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi2LTZhtin2LPZhyDYs9mB2KfYsdi0INmG2KfZhdi52KrYqNixINin2LPYqi4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIHNlcnZpY2UgPSBhd2FpdCByZXNvbHZlX29yZGVyX3NlcnZpY2UoCiAgICAgICAgb3JkZXJfc2VydmljZSwKICAgICAgICBkYiwKICAgICkKCiAgICB0cnk6CiAgICAgICAgb3JkZXIgPSBhd2FpdCBzZXJ2aWNlLmdldF9vcmRlcigKICAgICAgICAgICAgb3JkZXJfaWQKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgItiz2YHYp9ix2LQg2b7bjNiv2Kcg2YbYtNivLiIsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgaWYgaW50KAogICAgICAgIG9yZGVyLnVzZXJfaWQKICAgICkgIT0gaW50KAogICAgICAgIGNhbGxiYWNrLmZyb21fdXNlci5pZAogICAgKToKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLYp9uM2YYg2LPZgdin2LHYtCDZhdiq2LnZhNmCINio2Ycg2LTZhdinINmG24zYs9iqLiIsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgY2FuY2VsbGVkID0gYXdhaXQgc2VydmljZS5jYW5jZWxfcHJpY2VfY2hhbmdlKAogICAgICAgIG9yZGVyX2lkLAogICAgICAgIHVzZXJfaWQ9Y2FsbGJhY2suZnJvbV91c2VyLmlkLAogICAgKQoKICAgIGlmIG5vdCBjYW5jZWxsZWQ6CiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi2KfbjNmGINiv2LHYrtmI2KfYs9iqINiv24zar9ixINmC2KfYqNmEINmE2LrZiCDZhtuM2LPYqi4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHNhZmVfZWRpdF9tZXNzYWdlKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgZiJ7Y2UoJ2Vycm9yJyl9ICIKICAgICAgICAgICAgIjxiPtiz2YHYp9ix2LQg2YTYutmIINi02K8uPC9iPlxuXG4iCiAgICAgICAgICAgIGYiT3JkZXI6IDxjb2RlPiN7b3JkZXJfaWR9PC9jb2RlPlxuXG4iCiAgICAgICAgICAgICLZh9uM2oYg2YXYqNmE2LrbjCDYp9iyINqp24zZgSDZvtmI2YQg2qnYs9ixINmG2LTYr9mHINin2LPYqi4iCiAgICAgICAgKSwKICAgICAgICBidWlsZF9yZXN1bHRfa2V5Ym9hcmQoKSwKICAgICkKCiAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjaywKICAgICAgICAi2LPZgdin2LHYtCDZhNi62Ygg2LTYry4iLAogICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1hbnVhbCBmdWxmaWxsbWVudCBjb21wbGV0aW9uIC8gcmVmdW5kCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhLnN0YXJ0c3dpdGgoCiAgICAgICAgIm1hbnVhbF9jb21wbGV0ZV9vcmRlcl8iCiAgICApCikKYXN5bmMgZGVmIG1hbnVhbF9jb21wbGV0ZV9vcmRlcigKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgZGI6IEFueSA9IE5vbmUsCiAgICBvcmRlcl9zZXJ2aWNlOiBPcHRpb25hbFsKICAgICAgICBPcmRlclNlcnZpY2UKICAgIF0gPSBOb25lLAopIC0+IE5vbmU6CiAgICBpZiBub3QgaXNfYWRtaW4oCiAgICAgICAgY2FsbGJhY2suZnJvbV91c2VyLmlkCiAgICApOgogICAgICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIuKblCDYr9iz2KrYsdiz24wg2YbYr9in2LHbjNivLiIsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIG9yZGVyX2lkID0gaW50KAogICAgICAgICAgICBzdHIoCiAgICAgICAgICAgICAgICBjYWxsYmFjay5kYXRhCiAgICAgICAgICAgICkucmVtb3ZlcHJlZml4KAogICAgICAgICAgICAgICAgIm1hbnVhbF9jb21wbGV0ZV9vcmRlcl8iCiAgICAgICAgICAgICkKICAgICAgICApCiAgICBleGNlcHQgKAogICAgICAgIFR5cGVFcnJvciwKICAgICAgICBWYWx1ZUVycm9yLAogICAgKToKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLYtNmG2KfYs9mHINiz2YHYp9ix2LQg2YbYp9mF2LnYqtio2LEg2KfYs9iqLiIsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgc2VydmljZSA9IGF3YWl0IHJlc29sdmVfb3JkZXJfc2VydmljZSgKICAgICAgICBvcmRlcl9zZXJ2aWNlLAogICAgICAgIGRiLAogICAgKQoKICAgIHRyeToKICAgICAgICBvcmRlciA9IGF3YWl0IHNlcnZpY2UuZ2V0X29yZGVyKAogICAgICAgICAgICBvcmRlcl9pZAogICAgICAgICkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi2LPZgdin2LHYtCDZvtuM2K/YpyDZhti02K8uIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBjb21wbGV0ZWQgPSBhd2FpdCBzZXJ2aWNlLmNvbXBsZXRlKAogICAgICAgIG9yZGVyX2lkLAogICAgICAgIG1hcmtldF9vcmRlcl9pZD0oCiAgICAgICAgICAgIGYibWFudWFsOntpbnQoY2FsbGJhY2suZnJvbV91c2VyLmlkKX0iCiAgICAgICAgKSwKICAgICkKCiAgICBpZiBub3QgY29tcGxldGVkOgogICAgICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgItin24zZhiDYs9mB2KfYsdi0INiv2LEg2YjYtti524zYqiDZgtin2KjZhCDYqtqp2YXbjNmEINmG24zYs9iqLiIsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgbm90aWZ5X3VzZXIoCiAgICAgICAgY2FsbGJhY2suYm90LAogICAgICAgIG9yZGVyLnVzZXJfaWQsCiAgICAgICAgKAogICAgICAgICAgICBmIntjZSgnc3VjY2VzcycpfSAiCiAgICAgICAgICAgICI8Yj7Ys9mB2KfYsdi0INi02YXYpyDYqtit2YjbjNmEINmIINiq2qnZhduM2YQg2LTYry48L2I+XG5cbiIKICAgICAgICAgICAgZiJPcmRlcjogPGNvZGU+I3tvcmRlcl9pZH08L2NvZGU+XG4iCiAgICAgICAgICAgIGYi2YXYqNmE2Lo6IDxjb2RlPntvcmRlci5wcmljZTosfSDYqtmI2YXYp9mGPC9jb2RlPiIKICAgICAgICApLAogICAgKQoKICAgIGF3YWl0IHNhZmVfZWRpdF9tZXNzYWdlKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgZiJ7Y2UoJ3N1Y2Nlc3MnKX0gIgogICAgICAgICAgICAiPGI+2LPZgdin2LHYtCDYqNmH4oCM2LnZhtmI2KfZhiDYqtit2YjbjNmE4oCM2LTYr9mHINir2KjYqiDYtNivLjwvYj5cblxuIgogICAgICAgICAgICBmIk9yZGVyOiA8Y29kZT4je29yZGVyX2lkfTwvY29kZT4iCiAgICAgICAgKSwKICAgICAgICBOb25lLAogICAgKQoKICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICLinIUg2KraqdmF24zZhCDYtNivLiIsCiAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgKQoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuc3RhcnRzd2l0aCgKICAgICAgICAibWFudWFsX3JlZnVuZF9vcmRlcl8iCiAgICApCikKYXN5bmMgZGVmIG1hbnVhbF9yZWZ1bmRfb3JkZXIoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIGRiOiBBbnkgPSBOb25lLAogICAgb3JkZXJfc2VydmljZTogT3B0aW9uYWxbCiAgICAgICAgT3JkZXJTZXJ2aWNlCiAgICBdID0gTm9uZSwKKSAtPiBOb25lOgogICAgaWYgbm90IGlzX2FkbWluKAogICAgICAgIGNhbGxiYWNrLmZyb21fdXNlci5pZAogICAgKToKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLim5Qg2K/Ys9iq2LHYs9uMINmG2K/Yp9ix24zYry4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIHRyeToKICAgICAgICBvcmRlcl9pZCA9IGludCgKICAgICAgICAgICAgc3RyKAogICAgICAgICAgICAgICAgY2FsbGJhY2suZGF0YQogICAgICAgICAgICApLnJlbW92ZXByZWZpeCgKICAgICAgICAgICAgICAgICJtYW51YWxfcmVmdW5kX29yZGVyXyIKICAgICAgICAgICAgKQogICAgICAgICkKICAgIGV4Y2VwdCAoCiAgICAgICAgVHlwZUVycm9yLAogICAgICAgIFZhbHVlRXJyb3IsCiAgICApOgogICAgICAgIGF3YWl0IHNhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIti02YbYp9iz2Ycg2LPZgdin2LHYtCDZhtin2YXYudiq2KjYsSDYp9iz2KouIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBzZXJ2aWNlID0gYXdhaXQgcmVzb2x2ZV9vcmRlcl9zZXJ2aWNlKAogICAgICAgIG9yZGVyX3NlcnZpY2UsCiAgICAgICAgZGIsCiAgICApCgogICAgdHJ5OgogICAgICAgIG9yZGVyID0gYXdhaXQgc2VydmljZS5nZXRfb3JkZXIoCiAgICAgICAgICAgIG9yZGVyX2lkCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLYs9mB2KfYsdi0INm+24zYr9inINmG2LTYry4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIHJlZnVuZGVkID0gYXdhaXQgc2VydmljZS5yZWZ1bmRfZXhwbGljaXRfcHJvdmlkZXJfZmFpbHVyZSgKICAgICAgICBvcmRlcl9pZCwKICAgICAgICBlcnJvcj0oCiAgICAgICAgICAgICJNYW51YWwgZnVsZmlsbG1lbnQgY2FuY2VsbGVkIGJ5IG93bmVyLiIKICAgICAgICApLAogICAgKQoKICAgIGlmIG5vdCByZWZ1bmRlZDoKICAgICAgICBhd2FpdCBzYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLYqNin2LLar9i02Kog2YjYrNmHINin2YbYrNin2YUg2YbYtNiv2Jsg2YjYtti524zYqiDYs9mB2KfYsdi0INix2Kcg2KjYsdix2LPbjCDaqdmG24zYry4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGF3YWl0IG5vdGlmeV91c2VyKAogICAgICAgIGNhbGxiYWNrLmJvdCwKICAgICAgICBvcmRlci51c2VyX2lkLAogICAgICAgICgKICAgICAgICAgICAgZiJ7Y2UoJ3dhcm5pbmcnKX0gIgogICAgICAgICAgICAiPGI+2LPZgdin2LHYtCDZhNi62Ygg2Ygg2YXYqNmE2Log2KjZhyDaqduM2YEg2b7ZiNmEINio2LHar9i02Kog2K/Yp9iv2Ycg2LTYry48L2I+XG5cbiIKICAgICAgICAgICAgZiJPcmRlcjogPGNvZGU+I3tvcmRlcl9pZH08L2NvZGU+XG4iCiAgICAgICAgICAgIGYi2YXYqNmE2Lo6IDxjb2RlPntvcmRlci5wcmljZTosfSDYqtmI2YXYp9mGPC9jb2RlPiIKICAgICAgICApLAogICAgKQoKICAgIGF3YWl0IHNhZmVfZWRpdF9tZXNzYWdlKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgZiJ7Y2UoJ3N1Y2Nlc3MnKX0gIgogICAgICAgICAgICAiPGI+2LPZgdin2LHYtCDZhNi62Ygg2Ygg2YjYrNmHINio2KfYstqv2LHYr9in2YbYr9mHINi02K8uPC9iPlxuXG4iCiAgICAgICAgICAgIGYiT3JkZXI6IDxjb2RlPiN7b3JkZXJfaWR9PC9jb2RlPiIKICAgICAgICApLAogICAgICAgIE5vbmUsCiAgICApCgogICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgIuKGqe+4jyDZiNis2Ycg2KjYp9iy2q/Ysdiv2KfZhtiv2Ycg2LTYry4iLAogICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFVuc3VwcG9ydGVkIGxlZ2FjeSBzZXJ2aWNlIGNhbGxiYWNrcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YS5pbl8oCiAgICAgICAgewogICAgICAgICAgICAiYnV5X3RvbiIsCiAgICAgICAgICAgICJnaWZ0X3N0YXJzIiwKICAgICAgICAgICAgImJvb3N0X3RlbGVncmFtIiwKICAgICAgICAgICAgImJ1eV90cngiLAogICAgICAgICAgICAic3Rhcl9yZWFjdGlvbiIsCiAgICAgICAgICAgICJzdGFyX2dpdmVhd2F5IiwKICAgICAgICB9CiAgICApCikKYXN5bmMgZGVmIHVuc3VwcG9ydGVkX3NlcnZpY2UoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKKSAtPiBOb25lOgogICAgYXdhaXQgc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgItin24zZhiDYs9ix2YjbjNizINmH2YbZiNiyINiv2LEg2KfbjNmGINmF2LPbjNixINmB2LnYp9mEINmG2LTYr9mHINin2LPYqi4iLAogICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICkKCgpfX2FsbF9fID0gWwogICAgInJvdXRlciIsCiAgICAiUEFDS0FHRV9OQU1FUyIsCiAgICAiUFJFTUlVTV9NT05USFMiLAogICAgIlNUQVJTX0FNT1VOVFMiLApdCg==', 'handlers/user/start.py': 'IyBoYW5kbGVycy91c2VyL3N0YXJ0LnB5Cgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYXN5bmNpbwppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKaW1wb3J0IHNxbGl0ZTMKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmZyb20gaHRtbCBpbXBvcnQgZXNjYXBlCmZyb20gdHlwaW5nIGltcG9ydCBBbnksIEZpbmFsLCBPcHRpb25hbAoKZnJvbSBhaW9ncmFtIGltcG9ydCBGLCBSb3V0ZXIKZnJvbSBhaW9ncmFtLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIFRlbGVncmFtQmFkUmVxdWVzdCwKICAgIFRlbGVncmFtRm9yYmlkZGVuRXJyb3IsCikKZnJvbSBhaW9ncmFtLmZpbHRlcnMgaW1wb3J0IENvbW1hbmRTdGFydApmcm9tIGFpb2dyYW0uZnNtLmNvbnRleHQgaW1wb3J0IEZTTUNvbnRleHQKZnJvbSBhaW9ncmFtLnR5cGVzIGltcG9ydCBDYWxsYmFja1F1ZXJ5LCBNZXNzYWdlLCBVc2VyCgpmcm9tIGNvcmUuY29uZmlnIGltcG9ydCBzZXR0aW5ncwpmcm9tIGNvcmUudWlfZW1vamlzIGltcG9ydCAoCiAgICBjZSwKICAgIHByZW1pdW1pemVfaHRtbCwKKQpmcm9tIGtleWJvYXJkcy51c2VyX2tiIGltcG9ydCBnZXRfdXNlcl9tYWluX21lbnUKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCnJvdXRlciA9IFJvdXRlcigKICAgIG5hbWU9InVzZXJfc3RhcnQiCikKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIENvbnN0YW50cwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTUFYX1NRTElURV9JTlQ6IEZpbmFsW2ludF0gPSAoCiAgICA5XzIyM18zNzJfMDM2Xzg1NF83NzVfODA3CikKCl9SRUZFUlJBTF9QQVlMT0FEX1JFOiBGaW5hbFsKICAgIHJlLlBhdHRlcm5bc3RyXQpdID0gcmUuY29tcGlsZSgKICAgIHIiXnJlZl8oXGQrKSQiLAogICAgZmxhZ3M9cmUuSUdOT1JFQ0FTRSwKKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgV2VsY29tZSBUZXh0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTVEFSVF9XRUxDT01FX1RFWFQ6IEZpbmFsW3N0cl0gPSAoCiAgICBmIntjZSgnc2hvcCcsICfwn4+gJyl9ICIKICAgICI8Yj7ZhdmG2YjbjCDYp9i12YTbjDwvYj5cbiIKICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgoKICAgIGYie2NlKCdoZWxsbycpfSAiCiAgICAiPGI+2K7ZiNi0INii2YXYr9uM2K8hPC9iPlxuXG4iCgogICAgItin2LIg2LfYsduM2YIg2YXZhtmI24wg2LLbjNixINmF24zigIzYqtmI2KfZhtuM2K8g2KjZhyDZgdix2YjYtNqv2KfZh9iMINqp24zZgSDZvtmI2YTYjCAiCiAgICAi2K3Ys9in2Kgg2qnYp9ix2KjYsduM2Iwg2LLbjNix2YXYrNmF2YjYudmH4oCM2q/bjNix24wg2Ygg2b7bjNqv24zYsduMINiz2YHYp9ix2LTigIzZh9in24wg2K7ZiNivICIKICAgICLYr9iz2KrYsdiz24wg2K/Yp9i02KrZhyDYqNin2LTbjNivLlxuXG4iCgogICAgZiJ7Y2UoJ3RhcmdldCcsICfwn5GHJyl9ICIKICAgICI8aT7ZhNi32YHYp9mLINuM2qnbjCDYp9iyINqv2LLbjNmG2YfigIzZh9in24wg2LLbjNixINix2Kcg2KfZhtiq2K7Yp9ioINqp2YbbjNivLjwvaT4iCikKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJlc3VsdCBNb2RlbAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQGRhdGFjbGFzcyhzbG90cz1UcnVlKQpjbGFzcyBTdGFydFJlZ2lzdHJhdGlvblJlc3VsdDoKICAgIHN1Y2Nlc3M6IGJvb2wKCiAgICBpc19uZXdfdXNlcjogYm9vbCA9IEZhbHNlCgogICAgcmVmZXJyYWxfY3JlYXRlZDogYm9vbCA9IEZhbHNlCgogICAgcmVmZXJyZXJfaWQ6IE9wdGlvbmFsW2ludF0gPSBOb25lCgogICAgcmVmZXJyYWxfcmVhc29uOiBzdHIgPSAibm9uZSIKCiAgICBlcnJvcjogT3B0aW9uYWxbc3RyXSA9IE5vbmUKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIERhdGFiYXNlIFBhdGgKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiByZXNvbHZlX2RhdGFiYXNlX3BhdGgoCiAgICBkYjogQW55ID0gTm9uZSwKKSAtPiBzdHI6CiAgICAiIiIKICAgINin2YjZhCDYp9iyIERhdGFiYXNlTWFuYWdlciDYp9i12YTbjCBEaXNwYXRjaGVyINmF2LPbjNixINix2Kcg2YXbjOKAjNqv24zYsduM2YUuCgogICAgZmFsbGJhY2s6CiAgICAgICAgc2V0dGluZ3MuREJfUEFUSAogICAgICAgIHNldHRpbmdzLkRBVEFCQVNFX1BBVEgKICAgICAgICBtYXRyaXhfYm90LmRiCiAgICAiIiIKICAgIGlmIGRiIGlzIG5vdCBOb25lOgogICAgICAgIGZvciBhdHRyaWJ1dGUgaW4gKAogICAgICAgICAgICAiZGJfcGF0aCIsCiAgICAgICAgICAgICJkYXRhYmFzZV9wYXRoIiwKICAgICAgICAgICAgInBhdGgiLAogICAgICAgICk6CiAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cigKICAgICAgICAgICAgICAgIGRiLAogICAgICAgICAgICAgICAgYXR0cmlidXRlLAogICAgICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgdmFsdWU6CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyKAogICAgICAgICAgICAgICAgICAgIHZhbHVlCiAgICAgICAgICAgICAgICApCgogICAgdmFsdWUgPSAoCiAgICAgICAgZ2V0YXR0cigKICAgICAgICAgICAgc2V0dGluZ3MsCiAgICAgICAgICAgICJEQl9QQVRIIiwKICAgICAgICAgICAgTm9uZSwKICAgICAgICApCiAgICAgICAgb3IgZ2V0YXR0cigKICAgICAgICAgICAgc2V0dGluZ3MsCiAgICAgICAgICAgICJEQVRBQkFTRV9QQVRIIiwKICAgICAgICAgICAgTm9uZSwKICAgICAgICApCiAgICAgICAgb3IgIm1hdHJpeF9ib3QuZGIiCiAgICApCgogICAgcmV0dXJuIHN0cigKICAgICAgICB2YWx1ZQogICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgU1FMaXRlIEhlbHBlcnMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBfY29ubmVjdCgKICAgIGRiX3BhdGg6IHN0ciwKKSAtPiBzcWxpdGUzLkNvbm5lY3Rpb246CiAgICBjb25uID0gc3FsaXRlMy5jb25uZWN0KAogICAgICAgIGRiX3BhdGgsCiAgICAgICAgdGltZW91dD0zMCwKICAgICAgICBjaGVja19zYW1lX3RocmVhZD1GYWxzZSwKICAgICkKCiAgICBjb25uLnJvd19mYWN0b3J5ID0gKAogICAgICAgIHNxbGl0ZTMuUm93CiAgICApCgogICAgY29ubi5leGVjdXRlKAogICAgICAgICJQUkFHTUEgYnVzeV90aW1lb3V0ID0gMzAwMDAiCiAgICApCgogICAgIyDYr9ixIERCINmB2LnZhNuMINm+2LHZiNqY2Ycg24zaqSBGSyDZgtiv24zZhduMINiv2LEgb3JkZXJzINmF2YXaqdmGINin2LPYqiDYqNmHCiAgICAjIHVzZXJzKGlkKSDYp9i02KfYsdmHINqp2YbYr9iMINiv2LEg2K3Yp9mE24wg2qnZhyDaqdmE24zYryDYp9i12YTbjCB1c2Vycy51c2VyX2lkINin2LPYqi4KICAgICMg2KfbjNmGINin2KrYtdin2YQg2YHZgti3IHVzZXJzL3JlZmVycmFscyDYsdinINmF2K/bjNix24zYqiDZhduM4oCM2qnZhtivINmIINin2LnYqtio2KfYsQogICAgIyBSZWZlcnJhbCDYsdinINiv2KfYrtmEIFRyYW5zYWN0aW9uINio2YfigIzYtdmI2LHYqiDYr9iz2KrbjCDYqNix2LHYs9uMINmF24zigIzaqdmG2K/YmwogICAgIyDYqNmG2KfYqNix2KfbjNmGIEZLIGVuZm9yY2VtZW50INin24zZhiBjb25uZWN0aW9uINi52YXYr9in2Ysg2K7Yp9mF2YjYtCDYp9iz2Kog2KrYpwogICAgIyDbjNqpIEZLINiu2LHYp9ioINmIINmG2KfZhdix2KrYqNi32IwgL3N0YXJ0INix2Kcg2KfYsiDaqdin2LEg2YbbjNmG2K/Yp9iy2K8uCiAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlBSQUdNQSBmb3JlaWduX2tleXMgPSBPRkYiCiAgICApCgogICAgcmV0dXJuIGNvbm4KCgpkZWYgX3RhYmxlX2V4aXN0cygKICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgIHRhYmxlX25hbWU6IHN0ciwKKSAtPiBib29sOgogICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICIiIgogICAgICAgIFNFTEVDVCAxCiAgICAgICAgRlJPTSBzcWxpdGVfbWFzdGVyCiAgICAgICAgV0hFUkUgdHlwZSA9ICd0YWJsZScKICAgICAgICAgIEFORCBuYW1lID0gPwogICAgICAgIExJTUlUIDEKICAgICAgICAiIiIsCiAgICAgICAgKAogICAgICAgICAgICB0YWJsZV9uYW1lLAogICAgICAgICksCiAgICApLmZldGNob25lKCkKCiAgICByZXR1cm4gcm93IGlzIG5vdCBOb25lCgoKZGVmIF9jb2x1bW5fbmFtZXMoCiAgICBjb25uOiBzcWxpdGUzLkNvbm5lY3Rpb24sCiAgICB0YWJsZV9uYW1lOiBzdHIsCikgLT4gc2V0W3N0cl06CiAgICBpZiBub3QgX3RhYmxlX2V4aXN0cygKICAgICAgICBjb25uLAogICAgICAgIHRhYmxlX25hbWUsCiAgICApOgogICAgICAgIHJldHVybiBzZXQoKQoKICAgIHJldHVybiB7CiAgICAgICAgc3RyKAogICAgICAgICAgICByb3dbIm5hbWUiXQogICAgICAgICkKICAgICAgICBmb3Igcm93IGluIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgZiJQUkFHTUEgdGFibGVfaW5mbyh7dGFibGVfbmFtZX0pIgogICAgICAgICkuZmV0Y2hhbGwoKQogICAgfQoKCmRlZiBfZW5zdXJlX3JlZmVycmFsX2luZGV4ZXNfbG9ja2VkKAogICAgY29ubjogc3FsaXRlMy5Db25uZWN0aW9uLAopIC0+IE5vbmU6CiAgICBpZiBub3QgX3RhYmxlX2V4aXN0cygKICAgICAgICBjb25uLAogICAgICAgICJyZWZlcnJhbHMiLAogICAgKToKICAgICAgICByZXR1cm4KCiAgICBjb2x1bW5zID0gX2NvbHVtbl9uYW1lcygKICAgICAgICBjb25uLAogICAgICAgICJyZWZlcnJhbHMiLAogICAgKQoKICAgIGlmICJyZWZlcnJlcl9pZCIgaW4gY29sdW1uczoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUwogICAgICAgICAgICBpZHhfcmVmZXJyYWxzX3JlZmVycmVyCiAgICAgICAgICAgIE9OIHJlZmVycmFscyhyZWZlcnJlcl9pZCkKICAgICAgICAgICAgIiIiCiAgICAgICAgKQoKICAgIGlmICJyZWZlcnJlZF9pZCIgaW4gY29sdW1uczoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUwogICAgICAgICAgICBpZHhfcmVmZXJyYWxzX3JlZmVycmVkCiAgICAgICAgICAgIE9OIHJlZmVycmFscyhyZWZlcnJlZF9pZCkKICAgICAgICAgICAgIiIiCiAgICAgICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUmVmZXJyYWwgUGFyc2luZwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGV4dHJhY3RfcmVmZXJyZXJfaWQoCiAgICBtZXNzYWdlOiBNZXNzYWdlLAopIC0+IE9wdGlvbmFsW2ludF06CiAgICAiIiIKICAgINmG2YXZiNmG2Yc6CiAgICAgICAgL3N0YXJ0IHJlZl8xMjM0NTY3ODkKCiAgICDZgdmC2LcgcGF5bG9hZCDYr9mC24zZgiByZWZfPHBvc2l0aXZlIGludGVnZXI+INmC2KjZiNmEINmF24zigIzYtNmI2K8uCiAgICAiIiIKICAgIGlmICgKICAgICAgICBub3QgbWVzc2FnZS50ZXh0CiAgICAgICAgb3Igbm90IG1lc3NhZ2UuZnJvbV91c2VyCiAgICApOgogICAgICAgIHJldHVybiBOb25lCgogICAgcGFydHMgPSAoCiAgICAgICAgbWVzc2FnZS50ZXh0CiAgICAgICAgLnN0cmlwKCkKICAgICAgICAuc3BsaXQoCiAgICAgICAgICAgIG1heHNwbGl0PTEKICAgICAgICApCiAgICApCgogICAgaWYgbGVuKAogICAgICAgIHBhcnRzCiAgICApICE9IDI6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBwYXlsb2FkID0gKAogICAgICAgIHBhcnRzWzFdCiAgICAgICAgLnN0cmlwKCkKICAgICkKCiAgICBtYXRjaCA9ICgKICAgICAgICBfUkVGRVJSQUxfUEFZTE9BRF9SRQogICAgICAgIC5mdWxsbWF0Y2goCiAgICAgICAgICAgIHBheWxvYWQKICAgICAgICApCiAgICApCgogICAgaWYgbm90IG1hdGNoOgogICAgICAgIHJldHVybiBOb25lCgogICAgdHJ5OgogICAgICAgIHJlZmVycmVyX2lkID0gaW50KAogICAgICAgICAgICBtYXRjaC5ncm91cCgxKQogICAgICAgICkKCiAgICBleGNlcHQgKAogICAgICAgIFR5cGVFcnJvciwKICAgICAgICBWYWx1ZUVycm9yLAogICAgKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGlmICgKICAgICAgICByZWZlcnJlcl9pZCA8PSAwCiAgICAgICAgb3IgcmVmZXJyZXJfaWQKICAgICAgICA+IE1BWF9TUUxJVEVfSU5UCiAgICApOgogICAgICAgIHJldHVybiBOb25lCgogICAgaWYgKAogICAgICAgIHJlZmVycmVyX2lkCiAgICAgICAgPT0gaW50KAogICAgICAgICAgICBtZXNzYWdlLmZyb21fdXNlci5pZAogICAgICAgICkKICAgICk6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICByZXR1cm4gcmVmZXJyZXJfaWQKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFVzZXIgLyBSZWZlcnJhbCBQZXJzaXN0ZW5jZQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIF91cHNlcnRfaWRlbnRpdHlfbG9ja2VkKAogICAgY29ubjogc3FsaXRlMy5Db25uZWN0aW9uLAogICAgKiwKICAgIHVzZXI6IFVzZXIsCiAgICBpc19uZXdfdXNlcjogYm9vbCwKICAgIHZhbGlkX3JlZmVycmVyX2lkOiBPcHRpb25hbFtpbnRdLAopIC0+IE5vbmU6CiAgICAiIiIKICAgINio2KcgaW50cm9zcGVjdGlvbiDYqNinINqG2YbYryDZhtiz2K7ZhyBTY2hlbWEg2LPYp9iy2q/Yp9ixINmF24zigIzZhdin2YbYry4KICAgICIiIgogICAgY29sdW1ucyA9IF9jb2x1bW5fbmFtZXMoCiAgICAgICAgY29ubiwKICAgICAgICAidXNlcnMiLAogICAgKQoKICAgIGlmICJ1c2VyX2lkIiBub3QgaW4gY29sdW1uczoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICJ1c2Vycy51c2VyX2lkIGNvbHVtbiBpcyBtaXNzaW5nLiIKICAgICAgICApCgogICAgdXNlcl9pZCA9IGludCgKICAgICAgICB1c2VyLmlkCiAgICApCgogICAgaWRlbnRpdHlfdmFsdWVzOiBkaWN0WwogICAgICAgIHN0ciwKICAgICAgICBBbnksCiAgICBdID0gewogICAgICAgICJ1c2VybmFtZSI6CiAgICAgICAgICAgIHVzZXIudXNlcm5hbWUKICAgICAgICAgICAgb3IgTm9uZSwKICAgICAgICAiZnVsbF9uYW1lIjoKICAgICAgICAgICAgdXNlci5mdWxsX25hbWUKICAgICAgICAgICAgb3IgTm9uZSwKICAgICAgICAiZmlyc3RfbmFtZSI6CiAgICAgICAgICAgIHVzZXIuZmlyc3RfbmFtZQogICAgICAgICAgICBvciBOb25lLAogICAgICAgICJsYXN0X25hbWUiOgogICAgICAgICAgICB1c2VyLmxhc3RfbmFtZQogICAgICAgICAgICBvciBOb25lLAogICAgfQoKICAgIGlmIGlzX25ld191c2VyOgogICAgICAgIGluc2VydF9jb2x1bW5zOiBsaXN0W3N0cl0gPSBbCiAgICAgICAgICAgICJ1c2VyX2lkIgogICAgICAgIF0KCiAgICAgICAgaW5zZXJ0X3ZhbHVlczogbGlzdFtBbnldID0gWwogICAgICAgICAgICB1c2VyX2lkCiAgICAgICAgXQoKICAgICAgICBmb3IgY29sdW1uLCB2YWx1ZSBpbiAoCiAgICAgICAgICAgIGlkZW50aXR5X3ZhbHVlcy5pdGVtcygpCiAgICAgICAgKToKICAgICAgICAgICAgaWYgY29sdW1uIGluIGNvbHVtbnM6CiAgICAgICAgICAgICAgICBpbnNlcnRfY29sdW1ucy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgY29sdW1uCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpbnNlcnRfdmFsdWVzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICB2YWx1ZQogICAgICAgICAgICAgICAgKQoKICAgICAgICBpZiAoCiAgICAgICAgICAgIHZhbGlkX3JlZmVycmVyX2lkCiAgICAgICAgICAgIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGFuZCAiaW52aXRlZF9ieSIKICAgICAgICAgICAgaW4gY29sdW1ucwogICAgICAgICk6CiAgICAgICAgICAgIGluc2VydF9jb2x1bW5zLmFwcGVuZCgKICAgICAgICAgICAgICAgICJpbnZpdGVkX2J5IgogICAgICAgICAgICApCiAgICAgICAgICAgIGluc2VydF92YWx1ZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgdmFsaWRfcmVmZXJyZXJfaWQKICAgICAgICAgICAgKQoKICAgICAgICBwbGFjZWhvbGRlcnMgPSAiLCAiLmpvaW4oCiAgICAgICAgICAgICI/IgogICAgICAgICAgICBmb3IgXwogICAgICAgICAgICBpbiBpbnNlcnRfY29sdW1ucwogICAgICAgICkKCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gdXNlcnMgKCIKICAgICAgICAgICAgICAgICsgIiwgIi5qb2luKAogICAgICAgICAgICAgICAgICAgIGluc2VydF9jb2x1bW5zCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICArICIpIFZBTFVFUyAoIgogICAgICAgICAgICAgICAgKyBwbGFjZWhvbGRlcnMKICAgICAgICAgICAgICAgICsgIikiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHR1cGxlKAogICAgICAgICAgICAgICAgaW5zZXJ0X3ZhbHVlcwogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgcmV0dXJuCgogICAgYXNzaWdubWVudHM6IGxpc3Rbc3RyXSA9IFtdCiAgICBwYXJhbXM6IGxpc3RbQW55XSA9IFtdCgogICAgZm9yIGNvbHVtbiwgdmFsdWUgaW4gKAogICAgICAgIGlkZW50aXR5X3ZhbHVlcy5pdGVtcygpCiAgICApOgogICAgICAgIGlmIGNvbHVtbiBpbiBjb2x1bW5zOgogICAgICAgICAgICBhc3NpZ25tZW50cy5hcHBlbmQoCiAgICAgICAgICAgICAgICBmIntjb2x1bW59ID0gPyIKICAgICAgICAgICAgKQogICAgICAgICAgICBwYXJhbXMuYXBwZW5kKAogICAgICAgICAgICAgICAgdmFsdWUKICAgICAgICAgICAgKQoKICAgIGlmICJ1cGRhdGVkX2F0IiBpbiBjb2x1bW5zOgogICAgICAgIGFzc2lnbm1lbnRzLmFwcGVuZCgKICAgICAgICAgICAgInVwZGF0ZWRfYXQgPSBDVVJSRU5UX1RJTUVTVEFNUCIKICAgICAgICApCgogICAgaWYgYXNzaWdubWVudHM6CiAgICAgICAgcGFyYW1zLmFwcGVuZCgKICAgICAgICAgICAgdXNlcl9pZAogICAgICAgICkKCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAiVVBEQVRFIHVzZXJzIFNFVCAiCiAgICAgICAgICAgICAgICArICIsICIuam9pbigKICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50cwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKyAiIFdIRVJFIHVzZXJfaWQgPSA/IgogICAgICAgICAgICApLAogICAgICAgICAgICB0dXBsZSgKICAgICAgICAgICAgICAgIHBhcmFtcwogICAgICAgICAgICApLAogICAgICAgICkKCgpkZWYgX3ZhbGlkYXRlX3JlZmVycmVyX2xvY2tlZCgKICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICosCiAgICB1c2VyX2lkOiBpbnQsCiAgICByZWZlcnJlcl9pZDogT3B0aW9uYWxbaW50XSwKKSAtPiB0dXBsZVsKICAgIE9wdGlvbmFsW2ludF0sCiAgICBzdHIsCl06CiAgICBpZiByZWZlcnJlcl9pZCBpcyBOb25lOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIE5vbmUsCiAgICAgICAgICAgICJub19yZWZlcnJlciIsCiAgICAgICAgKQoKICAgIGlmIHJlZmVycmVyX2lkID09IHVzZXJfaWQ6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgInNlbGZfcmVmZXJyYWwiLAogICAgICAgICkKCiAgICByZWZlcnJlciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiIiIKICAgICAgICBTRUxFQ1QgKgogICAgICAgIEZST00gdXNlcnMKICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgIExJTUlUIDEKICAgICAgICAiIiIsCiAgICAgICAgKAogICAgICAgICAgICByZWZlcnJlcl9pZCwKICAgICAgICApLAogICAgKS5mZXRjaG9uZSgpCgogICAgaWYgbm90IHJlZmVycmVyOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIE5vbmUsCiAgICAgICAgICAgICJyZWZlcnJlcl9ub3RfZm91bmQiLAogICAgICAgICkKCiAgICByZWZlcnJlcl9kYXRhID0gZGljdCgKICAgICAgICByZWZlcnJlcgogICAgKQoKICAgICMg2Kfar9ixIFNjaGVtYSDZiNi22LnbjNiqINmF2LPYr9mI2K/bjCDYr9in2LHYr9iMINqp2KfYsdio2LEg2YXYs9iv2YjYr9i02K/ZhwogICAgIyDZhdi52LHZgSDYrNiv24zYryDYr9ix24zYp9mB2Kog2YbZhduM4oCM2qnZhtivLgogICAgYmxvY2tlZCA9IEZhbHNlCgogICAgZm9yIGtleSBpbiAoCiAgICAgICAgImlzX2Jhbm5lZCIsCiAgICAgICAgImlzX2Jsb2NrZWQiLAogICAgKToKICAgICAgICBpZiBrZXkgaW4gcmVmZXJyZXJfZGF0YToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYmxvY2tlZCA9ICgKICAgICAgICAgICAgICAgICAgICBpbnQoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVycmVyX2RhdGFbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgID09IDEKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZXhjZXB0ICgKICAgICAgICAgICAgICAgIFR5cGVFcnJvciwKICAgICAgICAgICAgICAgIFZhbHVlRXJyb3IsCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBibG9ja2VkID0gRmFsc2UKCiAgICAgICAgICAgIGlmIGJsb2NrZWQ6CiAgICAgICAgICAgICAgICBicmVhawoKICAgIGlmIGJsb2NrZWQ6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgInJlZmVycmVyX2Jsb2NrZWQiLAogICAgICAgICkKCiAgICByZXR1cm4gKAogICAgICAgIHJlZmVycmVyX2lkLAogICAgICAgICJ2YWxpZCIsCiAgICApCgoKZGVmIF9jcmVhdGVfcmVmZXJyYWxfbG9ja2VkKAogICAgY29ubjogc3FsaXRlMy5Db25uZWN0aW9uLAogICAgKiwKICAgIHJlZmVycmVyX2lkOiBpbnQsCiAgICByZWZlcnJlZF9pZDogaW50LAopIC0+IGJvb2w6CiAgICBpZiBub3QgX3RhYmxlX2V4aXN0cygKICAgICAgICBjb25uLAogICAgICAgICJyZWZlcnJhbHMiLAogICAgKToKICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgInJlZmVycmFscyB0YWJsZSBpcyBtaXNzaW5nOyAiCiAgICAgICAgICAgICJyZWZlcnJhbCByZWxhdGlvbnNoaXAgd2FzIG5vdCBjcmVhdGVkLiIKICAgICAgICApCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgY29sdW1ucyA9IF9jb2x1bW5fbmFtZXMoCiAgICAgICAgY29ubiwKICAgICAgICAicmVmZXJyYWxzIiwKICAgICkKCiAgICByZXF1aXJlZCA9IHsKICAgICAgICAicmVmZXJyZXJfaWQiLAogICAgICAgICJyZWZlcnJlZF9pZCIsCiAgICB9CgogICAgaWYgbm90IHJlcXVpcmVkLmlzc3Vic2V0KAogICAgICAgIGNvbHVtbnMKICAgICk6CiAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICJyZWZlcnJhbHMgc2NoZW1hIGlzIGluY29tcGF0aWJsZS4iCiAgICAgICAgKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMg2YfYsSDaqdin2LHYqNixINmB2YLYtyDbjNqpINmF2LnYsdmBLgogICAgZXhpc3RpbmcgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgU0VMRUNUIDEKICAgICAgICBGUk9NIHJlZmVycmFscwogICAgICAgIFdIRVJFIHJlZmVycmVkX2lkID0gPwogICAgICAgIExJTUlUIDEKICAgICAgICAiIiIsCiAgICAgICAgKAogICAgICAgICAgICByZWZlcnJlZF9pZCwKICAgICAgICApLAogICAgKS5mZXRjaG9uZSgpCgogICAgaWYgZXhpc3Rpbmc6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgaW5zZXJ0X2NvbHVtbnMgPSBbCiAgICAgICAgInJlZmVycmVyX2lkIiwKICAgICAgICAicmVmZXJyZWRfaWQiLAogICAgXQoKICAgIHZhbHVlczogbGlzdFtBbnldID0gWwogICAgICAgIHJlZmVycmVyX2lkLAogICAgICAgIHJlZmVycmVkX2lkLAogICAgXQoKICAgIGlmICJyZXdhcmRfZWFybmVkIiBpbiBjb2x1bW5zOgogICAgICAgIGluc2VydF9jb2x1bW5zLmFwcGVuZCgKICAgICAgICAgICAgInJld2FyZF9lYXJuZWQiCiAgICAgICAgKQogICAgICAgIHZhbHVlcy5hcHBlbmQoCiAgICAgICAgICAgIDAKICAgICAgICApCgogICAgcGxhY2Vob2xkZXJzID0gIiwgIi5qb2luKAogICAgICAgICI/IgogICAgICAgIGZvciBfCiAgICAgICAgaW4gaW5zZXJ0X2NvbHVtbnMKICAgICkKCiAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgKAogICAgICAgICAgICAiSU5TRVJUIElOVE8gcmVmZXJyYWxzICgiCiAgICAgICAgICAgICsgIiwgIi5qb2luKAogICAgICAgICAgICAgICAgaW5zZXJ0X2NvbHVtbnMKICAgICAgICAgICAgKQogICAgICAgICAgICArICIpIFZBTFVFUyAoIgogICAgICAgICAgICArIHBsYWNlaG9sZGVycwogICAgICAgICAgICArICIpIgogICAgICAgICksCiAgICAgICAgdHVwbGUoCiAgICAgICAgICAgIHZhbHVlcwogICAgICAgICksCiAgICApCgogICAgcmV0dXJuIFRydWUKCgpkZWYgX3JlZ2lzdGVyX3N0YXJ0X3N5bmMoCiAgICAqLAogICAgZGJfcGF0aDogc3RyLAogICAgdXNlcjogVXNlciwKICAgIHJlZmVycmVyX2lkOiBPcHRpb25hbFtpbnRdLAopIC0+IFN0YXJ0UmVnaXN0cmF0aW9uUmVzdWx0OgogICAgdXNlcl9pZCA9IGludCgKICAgICAgICB1c2VyLmlkCiAgICApCgogICAgY29ubiA9IF9jb25uZWN0KAogICAgICAgIGRiX3BhdGgKICAgICkKCiAgICB0cnk6CiAgICAgICAgaWYgbm90IF90YWJsZV9leGlzdHMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICJ1c2VycyIsCiAgICAgICAgKToKICAgICAgICAgICAgcmV0dXJuIFN0YXJ0UmVnaXN0cmF0aW9uUmVzdWx0KAogICAgICAgICAgICAgICAgc3VjY2Vzcz1GYWxzZSwKICAgICAgICAgICAgICAgIGVycm9yPSgKICAgICAgICAgICAgICAgICAgICAidXNlcnMgdGFibGUgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICByZWZlcnJhbF9yZWFzb249KAogICAgICAgICAgICAgICAgICAgICJkYXRhYmFzZV9ub3RfaW5pdGlhbGl6ZWQiCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIkJFR0lOIElNTUVESUFURSIKICAgICAgICApCgogICAgICAgIF9lbnN1cmVfcmVmZXJyYWxfaW5kZXhlc19sb2NrZWQoCiAgICAgICAgICAgIGNvbm4KICAgICAgICApCgogICAgICAgIGV4aXN0aW5nX3VzZXIgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBTRUxFQ1QgMQogICAgICAgICAgICBGUk9NIHVzZXJzCiAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICApLAogICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICBpc19uZXdfdXNlciA9ICgKICAgICAgICAgICAgZXhpc3RpbmdfdXNlcgogICAgICAgICAgICBpcyBOb25lCiAgICAgICAgKQoKICAgICAgICB2YWxpZF9yZWZlcnJlcl9pZDogT3B0aW9uYWxbCiAgICAgICAgICAgIGludAogICAgICAgIF0gPSBOb25lCgogICAgICAgIHJlZmVycmFsX3JlYXNvbiA9ICgKICAgICAgICAgICAgImV4aXN0aW5nX3VzZXIiCiAgICAgICAgICAgIGlmIG5vdCBpc19uZXdfdXNlcgogICAgICAgICAgICBlbHNlICJub19yZWZlcnJlciIKICAgICAgICApCgogICAgICAgICMgUmVmZXJyYWwg2YHZgti3INmH2Ybar9in2YUg2KfZiNmE24zZhiDYq9io2Kog2qnYp9ix2KjYsSDZvtix2K/Yp9iy2LQg2YXbjOKAjNi02YjYry4KICAgICAgICBpZiBpc19uZXdfdXNlcjoKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgdmFsaWRfcmVmZXJyZXJfaWQsCiAgICAgICAgICAgICAgICByZWZlcnJhbF9yZWFzb24sCiAgICAgICAgICAgICkgPSBfdmFsaWRhdGVfcmVmZXJyZXJfbG9ja2VkKAogICAgICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgICAgIHVzZXJfaWQ9dXNlcl9pZCwKICAgICAgICAgICAgICAgIHJlZmVycmVyX2lkPXJlZmVycmVyX2lkLAogICAgICAgICAgICApCgogICAgICAgIF91cHNlcnRfaWRlbnRpdHlfbG9ja2VkKAogICAgICAgICAgICBjb25uLAogICAgICAgICAgICB1c2VyPXVzZXIsCiAgICAgICAgICAgIGlzX25ld191c2VyPWlzX25ld191c2VyLAogICAgICAgICAgICB2YWxpZF9yZWZlcnJlcl9pZD0oCiAgICAgICAgICAgICAgICB2YWxpZF9yZWZlcnJlcl9pZAogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgcmVmZXJyYWxfY3JlYXRlZCA9IEZhbHNlCgogICAgICAgIGlmICgKICAgICAgICAgICAgaXNfbmV3X3VzZXIKICAgICAgICAgICAgYW5kIHZhbGlkX3JlZmVycmVyX2lkCiAgICAgICAgICAgIGlzIG5vdCBOb25lCiAgICAgICAgKToKICAgICAgICAgICAgcmVmZXJyYWxfY3JlYXRlZCA9ICgKICAgICAgICAgICAgICAgIF9jcmVhdGVfcmVmZXJyYWxfbG9ja2VkKAogICAgICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJfaWQ9KAogICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9yZWZlcnJlcl9pZAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgcmVmZXJyZWRfaWQ9dXNlcl9pZCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmVmZXJyYWxfcmVhc29uID0gKAogICAgICAgICAgICAgICAgImNyZWF0ZWQiCiAgICAgICAgICAgICAgICBpZiByZWZlcnJhbF9jcmVhdGVkCiAgICAgICAgICAgICAgICBlbHNlICJub3RfY3JlYXRlZCIKICAgICAgICAgICAgKQoKICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgIHJldHVybiBTdGFydFJlZ2lzdHJhdGlvblJlc3VsdCgKICAgICAgICAgICAgc3VjY2Vzcz1UcnVlLAogICAgICAgICAgICBpc19uZXdfdXNlcj1pc19uZXdfdXNlciwKICAgICAgICAgICAgcmVmZXJyYWxfY3JlYXRlZD0oCiAgICAgICAgICAgICAgICByZWZlcnJhbF9jcmVhdGVkCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHJlZmVycmVyX2lkPSgKICAgICAgICAgICAgICAgIHZhbGlkX3JlZmVycmVyX2lkCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHJlZmVycmFsX3JlYXNvbj0oCiAgICAgICAgICAgICAgICByZWZlcnJhbF9yZWFzb24KICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICJBdG9taWMgL3N0YXJ0IHJlZ2lzdHJhdGlvbiBmYWlsZWQgfCAiCiAgICAgICAgICAgICJ1c2VyPSVzIiwKICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICApCgogICAgICAgIHJldHVybiBTdGFydFJlZ2lzdHJhdGlvblJlc3VsdCgKICAgICAgICAgICAgc3VjY2Vzcz1GYWxzZSwKICAgICAgICAgICAgZXJyb3I9KAogICAgICAgICAgICAgICAgZiJ7dHlwZShleGMpLl9fbmFtZV9ffTogIgogICAgICAgICAgICAgICAgZiJ7ZXhjfSIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcmVmZXJyYWxfcmVhc29uPSgKICAgICAgICAgICAgICAgICJkYXRhYmFzZV9lcnJvciIKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgZmluYWxseToKICAgICAgICBjb25uLmNsb3NlKCkKCgphc3luYyBkZWYgcmVnaXN0ZXJfdXNlcl9zdGFydCgKICAgICosCiAgICB1c2VyOiBVc2VyLAogICAgcmVmZXJyZXJfaWQ6IE9wdGlvbmFsW2ludF0sCiAgICBkYjogQW55ID0gTm9uZSwKKSAtPiBTdGFydFJlZ2lzdHJhdGlvblJlc3VsdDoKICAgICIiIgogICAg2LnZhdmE24zYp9iqIFNRTGl0ZSDYr9in2K7ZhCBUaHJlYWQg2KfYrNix2Kcg2YXbjOKAjNi02YjYryDYqtinIEV2ZW50IExvb3AKICAgINiq2YTar9ix2KfZhSBibG9jayDZhti02YjYry4KCiAgICDYp9uM2YYg2YXYs9uM2LEg2LnZhdiv2KfZiyDYqNmHIERhdGFiYXNlTWFuYWdlci5jcmVhdGVfdGFibGVzKCkg24zYpwogICAgdXBzZXJ0X3VzZXJfYWN0aXZpdHkoKSDZiNin2KjYs9iq2Ycg2YbbjNiz2KouCiAgICAiIiIKICAgIGRiX3BhdGggPSAoCiAgICAgICAgcmVzb2x2ZV9kYXRhYmFzZV9wYXRoKAogICAgICAgICAgICBkYgogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgX3JlZ2lzdGVyX3N0YXJ0X3N5bmMsCiAgICAgICAgZGJfcGF0aD1kYl9wYXRoLAogICAgICAgIHVzZXI9dXNlciwKICAgICAgICByZWZlcnJlcl9pZD1yZWZlcnJlcl9pZCwKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFRlbGVncmFtIEhlbHBlcnMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmFzeW5jIGRlZiBzYWZlX2NhbGxiYWNrX2Fuc3dlcigKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgdGV4dDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICAqLAogICAgc2hvd19hbGVydDogYm9vbCA9IEZhbHNlLAopIC0+IGJvb2w6CiAgICB0cnk6CiAgICAgICAgYXdhaXQgY2FsbGJhY2suYW5zd2VyKAogICAgICAgICAgICB0ZXh0PXRleHQsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9c2hvd19hbGVydCwKICAgICAgICApCgogICAgICAgIHJldHVybiBUcnVlCgogICAgZXhjZXB0IFRlbGVncmFtQmFkUmVxdWVzdDoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICJDb3VsZCBub3QgYW5zd2VyIG1haW4tbWVudSBjYWxsYmFjay4iCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gRmFsc2UKCgphc3luYyBkZWYgc2hvd19tYWluX21lbnUoCiAgICBtZXNzYWdlOiBNZXNzYWdlLAopIC0+IGJvb2w6CiAgICAiIiIKICAgINin2LHYs9in2YQg2YXZhtmI24wg2KfYtdmE24wg2KjZhyDYtdmI2LHYqiDZvtuM2KfZhSDYrNiv24zYry4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICAgICBwcmVtaXVtaXplX2h0bWwoCiAgICAgICAgICAgICAgICBTVEFSVF9XRUxDT01FX1RFWFQKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcmVwbHlfbWFya3VwPSgKICAgICAgICAgICAgICAgIGdldF91c2VyX21haW5fbWVudSgKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZyb21fdXNlci5pZAogICAgICAgICAgICAgICAgICAgIGlmIG1lc3NhZ2UuZnJvbV91c2VyCiAgICAgICAgICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHBhcnNlX21vZGU9IkhUTUwiLAogICAgICAgICkKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBleGNlcHQgVGVsZWdyYW1Gb3JiaWRkZW5FcnJvcjoKICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgIlVzZXIgYmxvY2tlZCB0aGUgYm90IHwgdXNlcj0lcyIsCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIG1lc3NhZ2UuZnJvbV91c2VyLmlkCiAgICAgICAgICAgICAgICBpZiBtZXNzYWdlLmZyb21fdXNlcgogICAgICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICJDb3VsZCBub3Qgc2VuZCBtYWluIG1lbnUgfCB1c2VyPSVzIiwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgbWVzc2FnZS5mcm9tX3VzZXIuaWQKICAgICAgICAgICAgICAgIGlmIG1lc3NhZ2UuZnJvbV91c2VyCiAgICAgICAgICAgICAgICBlbHNlIE5vbmUKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgIHJldHVybiBGYWxzZQoKCmFzeW5jIGRlZiBzaG93X21haW5fbWVudV9mcm9tX2NhbGxiYWNrKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCikgLT4gYm9vbDoKICAgICIiIgogICAg2Kfar9ixINm+24zYp9mFINmB2LnZhNuMIFRleHQg2KjYp9i02K8gRWRpdCDZhduM4oCM2LTZiNivLgoKICAgINin2q/YsSBjYWxsYmFjayDYp9iyINix2YjbjCBQaG90by9NZWRpYSDYotmF2K/ZhyDYqNin2LTYryAo2YXYq9mE2KfZiyDaqdin2LHYqiDZvtix2YjZgdin24zZhCnYjAogICAg24zaqSDZvtuM2KfZhSDZhdmG2YjbjCDYrNiv24zYryDYp9ix2LPYp9mEINmIIE1lZGlhINmC2KjZhNuMINit2LDZgSDZhduM4oCM2LTZiNiv2Jsg2obZiNmGIGVkaXRfdGV4dAogICAg2LHZiNuMINm+24zYp9mFIE1lZGlhINmC2KfYqNmEINin2KraqdinINmG24zYs9iqLgogICAgIiIiCiAgICBtZXNzYWdlID0gY2FsbGJhY2subWVzc2FnZQoKICAgIGlmIG5vdCBtZXNzYWdlOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIHJlbmRlcmVkID0gcHJlbWl1bWl6ZV9odG1sKAogICAgICAgIFNUQVJUX1dFTENPTUVfVEVYVAogICAgKQoKICAgIGtleWJvYXJkID0gKAogICAgICAgIGdldF91c2VyX21haW5fbWVudSgKICAgICAgICAgICAgY2FsbGJhY2suZnJvbV91c2VyLmlkCiAgICAgICAgICAgIGlmIGNhbGxiYWNrLmZyb21fdXNlcgogICAgICAgICAgICBlbHNlIE5vbmUKICAgICAgICApCiAgICApCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBOb3JtYWwgdGV4dCBtZXNzYWdlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgaWYgbWVzc2FnZS50ZXh0IGlzIG5vdCBOb25lOgogICAgICAgIHRyeToKICAgICAgICAgICAgYXdhaXQgbWVzc2FnZS5lZGl0X3RleHQoCiAgICAgICAgICAgICAgICByZW5kZXJlZCwKICAgICAgICAgICAgICAgIHJlcGx5X21hcmt1cD1rZXlib2FyZCwKICAgICAgICAgICAgICAgIHBhcnNlX21vZGU9IkhUTUwiLAogICAgICAgICAgICApCgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBleGNlcHQgVGVsZWdyYW1CYWRSZXF1ZXN0IGFzIGV4YzoKICAgICAgICAgICAgZXJyb3IgPSBzdHIoCiAgICAgICAgICAgICAgICBleGMKICAgICAgICAgICAgKS5sb3dlcigpCgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAibWVzc2FnZSBpcyBub3QgbW9kaWZpZWQiCiAgICAgICAgICAgICAgICBpbiBlcnJvcgogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICJtZXNzYWdlIGNhbid0IGJlIGVkaXRlZCIKICAgICAgICAgICAgICAgIG5vdCBpbiBlcnJvcgogICAgICAgICAgICAgICAgYW5kICJtZXNzYWdlIHRvIGVkaXQgbm90IGZvdW5kIgogICAgICAgICAgICAgICAgbm90IGluIGVycm9yCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGVkaXQgbWFpbiBtZW51OiAlcyIsCiAgICAgICAgICAgICAgICAgICAgZXhjLAogICAgICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbWFpbi1tZW51IGVkaXQgZmFpbHVyZS4iCiAgICAgICAgICAgICkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIE1lZGlhIC8gdW5lZGl0YWJsZSBmYWxsYmFjawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHRyeToKICAgICAgICBhd2FpdCBtZXNzYWdlLmFuc3dlcigKICAgICAgICAgICAgcmVuZGVyZWQsCiAgICAgICAgICAgIHJlcGx5X21hcmt1cD1rZXlib2FyZCwKICAgICAgICAgICAgcGFyc2VfbW9kZT0iSFRNTCIsCiAgICAgICAgKQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgIkNvdWxkIG5vdCBzZW5kIHJlcGxhY2VtZW50IG1haW4gbWVudS4iCiAgICAgICAgKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMg2b7bjNin2YUg2YLYqNmE24wg2YHZgti3INio2LnYryDYp9iyINin2LHYs9in2YQg2YXZiNmB2YIg2K3YsNmBINmF24zigIzYtNmI2K8uCiAgICB0cnk6CiAgICAgICAgYXdhaXQgbWVzc2FnZS5kZWxldGUoKQoKICAgIGV4Y2VwdCBUZWxlZ3JhbUJhZFJlcXVlc3Q6CiAgICAgICAgcGFzcwoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICJDb3VsZCBub3QgZGVsZXRlIHByZXZpb3VzIG1lbnUvbWVkaWEgbWVzc2FnZS4iLAogICAgICAgICAgICBleGNfaW5mbz1UcnVlLAogICAgICAgICkKCiAgICByZXR1cm4gVHJ1ZQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgL3N0YXJ0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpAcm91dGVyLm1lc3NhZ2UoCiAgICBDb21tYW5kU3RhcnQoKQopCmFzeW5jIGRlZiBjbWRfc3RhcnQoCiAgICBtZXNzYWdlOiBNZXNzYWdlLAogICAgc3RhdGU6IEZTTUNvbnRleHQsCiAgICBkYjogQW55ID0gTm9uZSwKKSAtPiBOb25lOgogICAgIiIiCiAgICDZiNix2YjYryDaqdin2LHYqNixLgoKICAgINmG2qnYp9iqOgogICAgICAgIC0gRGF0YWJhc2VNYW5hZ2VyINis2K/bjNivINiv2KfYrtmEINin24zZhiDZgdin24zZhCDYs9in2K7YqtmHINmG2YXbjOKAjNi02YjYry4KICAgICAgICAtIGNyZWF0ZV90YWJsZXMg2LHZiNuMINmH2LEgL3N0YXJ0INin2KzYsdinINmG2YXbjOKAjNi02YjYry4KICAgICAgICAtIFJlZmVycmFsINmB2YLYtyDZh9mG2q/Yp9mFINin2YjZhNuM2YYg2KvYqNiqINqp2KfYsdio2LEg2YLYp9io2YQg2KvYqNiqINin2LPYqi4KICAgICAgICAtINiu2LfYp9uMIERCINmF2KfZhti5INio2KfYsiDYtNiv2YYg2YXZhtmI24wg2KfYtdmE24wg2YbZhduM4oCM2LTZiNivLgogICAgIiIiCiAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCgogICAgdXNlciA9ICgKICAgICAgICBtZXNzYWdlLmZyb21fdXNlcgogICAgKQoKICAgIGlmIG5vdCB1c2VyOgogICAgICAgIHJldHVybgoKICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgdXNlci5pZAogICAgKQoKICAgIHJlZmVycmVyX2lkID0gKAogICAgICAgIGV4dHJhY3RfcmVmZXJyZXJfaWQoCiAgICAgICAgICAgIG1lc3NhZ2UKICAgICAgICApCiAgICApCgogICAgcmVnaXN0cmF0aW9uOiBPcHRpb25hbFsKICAgICAgICBTdGFydFJlZ2lzdHJhdGlvblJlc3VsdAogICAgXSA9IE5vbmUKCiAgICB0cnk6CiAgICAgICAgcmVnaXN0cmF0aW9uID0gKAogICAgICAgICAgICBhd2FpdCByZWdpc3Rlcl91c2VyX3N0YXJ0KAogICAgICAgICAgICAgICAgdXNlcj11c2VyLAogICAgICAgICAgICAgICAgcmVmZXJyZXJfaWQ9KAogICAgICAgICAgICAgICAgICAgIHJlZmVycmVyX2lkCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgZGI9ZGIsCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIGlmIHJlZ2lzdHJhdGlvbi5zdWNjZXNzOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJVc2VyIHN0YXJ0IHJlZ2lzdGVyZWQgfCAiCiAgICAgICAgICAgICAgICAidXNlcj0lcyBuZXc9JXMgcmVmZXJyZXI9JXMgIgogICAgICAgICAgICAgICAgInJlZmVycmFsX2NyZWF0ZWQ9JXMgcmVhc29uPSVzIiwKICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24uaXNfbmV3X3VzZXIsCiAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24ucmVmZXJyZXJfaWQsCiAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24ucmVmZXJyYWxfY3JlYXRlZCwKICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbi5yZWZlcnJhbF9yZWFzb24sCiAgICAgICAgICAgICkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKAogICAgICAgICAgICAgICAgIlVzZXIgc3RhcnQgREIgcmVnaXN0cmF0aW9uIGZhaWxlZCB8ICIKICAgICAgICAgICAgICAgICJ1c2VyPSVzIHJlYXNvbj0lcyBlcnJvcj0lcyIsCiAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uLnJlZmVycmFsX3JlYXNvbiwKICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbi5lcnJvciwKICAgICAgICAgICAgKQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgIyDZh9uM2oYg2K7Yt9in24wgREIg2YbYqNin24zYryAvc3RhcnQgVUkg2LHYpyDZhdiq2YjZgtmBINqp2YbYry4KICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAiVW5leHBlY3RlZCAvc3RhcnQgcGVyc2lzdGVuY2UgZXJyb3IgfCAiCiAgICAgICAgICAgICJ1c2VyPSVzIiwKICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICApCgogICAgc2VudCA9IGF3YWl0IHNob3dfbWFpbl9tZW51KAogICAgICAgIG1lc3NhZ2UKICAgICkKCiAgICBpZiBzZW50OgogICAgICAgIHJldHVybgoKICAgICMg2KLYrtix24zZhiBmYWxsYmFja9ibINi52YXYr9in2Ysg2KjYr9mI2YYgQ3VzdG9tIEVtb2ppIGVudGl0eS4KICAgIHRyeToKICAgICAgICBhd2FpdCBtZXNzYWdlLmFuc3dlcigKICAgICAgICAgICAgIuKdjCDYrti32Kcg2K/YsSDYqNin2LHar9iw2KfYsduMINmF2YbZiNuMINin2LXZhNuMLlxuIgogICAgICAgICAgICAi2YTYt9mB2KfZiyDYr9mI2KjYp9ix2Ycg2KrZhNin2LQg2qnZhtuM2K8uIgogICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICJGYWlsZWQgdG8gc2VuZCAvc3RhcnQgZmFsbGJhY2sgfCAiCiAgICAgICAgICAgICJ1c2VyPSVzIiwKICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICApCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBNYWluIE1lbnUgQ2FsbGJhY2sKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEgPT0gIm1haW5fbWVudSIKKQphc3luYyBkZWYgY2FsbGJhY2tfbWFpbl9tZW51KAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBzdGF0ZTogRlNNQ29udGV4dCwKKSAtPiBOb25lOgogICAgIiIiCiAgICDYqNin2LLar9i02Kog2KfZhdmGINio2Ycg2YXZhtmI24wg2KfYtdmE24wg2KfYsiBUZXh0INuM2KcgTWVkaWEuCiAgICAiIiIKICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKCiAgICBpZiBub3QgY2FsbGJhY2subWVzc2FnZToKICAgICAgICBhd2FpdCBzYWZlX2NhbGxiYWNrX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2sKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgdXNlcl9pZCA9ICgKICAgICAgICBjYWxsYmFjay5mcm9tX3VzZXIuaWQKICAgICAgICBpZiBjYWxsYmFjay5mcm9tX3VzZXIKICAgICAgICBlbHNlIE5vbmUKICAgICkKCiAgICB0cnk6CiAgICAgICAgc3VjY2VzcyA9ICgKICAgICAgICAgICAgYXdhaXQgc2hvd19tYWluX21lbnVfZnJvbV9jYWxsYmFjaygKICAgICAgICAgICAgICAgIGNhbGxiYWNrCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIGlmIHN1Y2Nlc3M6CiAgICAgICAgICAgIGF3YWl0IHNhZmVfY2FsbGJhY2tfYW5zd2VyKAogICAgICAgICAgICAgICAgY2FsbGJhY2sKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYXdhaXQgc2FmZV9jYWxsYmFja19hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi4p2MINiu2LfYpyDYr9ixINio2KfYsdqv2LDYp9ix24wg2YXZhtmI24wg2KfYtdmE24wuIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICJNYWluLW1lbnUgY2FsbGJhY2sgZmFpbGVkIHwgIgogICAgICAgICAgICAidXNlcj0lcyIsCiAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgKQoKICAgICAgICBhd2FpdCBzYWZlX2NhbGxiYWNrX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLinYwg2K7Yt9inINiv2LEg2KjYp9ix2q/YsNin2LHbjCDZhdmG2YjbjCDYp9i12YTbjC4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgRXhwb3J0cwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKX19hbGxfXyA9IFsKICAgICJyb3V0ZXIiLAogICAgIlNUQVJUX1dFTENPTUVfVEVYVCIsCiAgICAiU3RhcnRSZWdpc3RyYXRpb25SZXN1bHQiLAogICAgImV4dHJhY3RfcmVmZXJyZXJfaWQiLAogICAgInJlZ2lzdGVyX3VzZXJfc3RhcnQiLAogICAgInNob3dfbWFpbl9tZW51IiwKICAgICJjYWxsYmFja19tYWluX21lbnUiLApdCg==', 'handlers/admin/actions.py': 'IyBoYW5kbGVycy9hZG1pbi9hY3Rpb25zLnB5Cgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYXN5bmNpbwppbXBvcnQgbG9nZ2luZwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHNxbGl0ZTMKaW1wb3J0IHRpbWUKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsLCBJbnZhbGlkT3BlcmF0aW9uCmZyb20gaHRtbCBpbXBvcnQgZXNjYXBlCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBPcHRpb25hbAoKZnJvbSBhaW9ncmFtIGltcG9ydCBGLCBSb3V0ZXIKZnJvbSBhaW9ncmFtLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIFRlbGVncmFtQmFkUmVxdWVzdCwKICAgIFRlbGVncmFtRm9yYmlkZGVuRXJyb3IsCikKZnJvbSBhaW9ncmFtLmZzbS5jb250ZXh0IGltcG9ydCBGU01Db250ZXh0CmZyb20gYWlvZ3JhbS5mc20uc3RhdGUgaW1wb3J0IFN0YXRlLCBTdGF0ZXNHcm91cApmcm9tIGFpb2dyYW0udHlwZXMgaW1wb3J0ICgKICAgIENhbGxiYWNrUXVlcnksCiAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbiwKICAgIElubGluZUtleWJvYXJkTWFya3VwLAogICAgTWVzc2FnZSwKKQpmcm9tIGFpb2dyYW0udXRpbHMua2V5Ym9hcmQgaW1wb3J0IElubGluZUtleWJvYXJkQnVpbGRlcgoKZnJvbSBjb3JlLmNvbmZpZyBpbXBvcnQgc2V0dGluZ3MKZnJvbSBjb3JlLmRhdGFiYXNlIGltcG9ydCBEYXRhYmFzZU1hbmFnZXIKZnJvbSBrZXlib2FyZHMuYWRtaW5fa2IgaW1wb3J0ICgKICAgIGdldF9hZG1pbl9icm9hZGNhc3Rfb3B0aW9uc19rZXlib2FyZCwKICAgIGdldF9hZG1pbl9tYWluX21lbnUsCiAgICBnZXRfYWRtaW5fb3JkZXJzX2tleWJvYXJkLAogICAgZ2V0X2FkbWluX3ByaWNpbmdfa2V5Ym9hcmQsCiAgICBnZXRfYWRtaW5fc2VydmVyX3N0YXR1c19rZXlib2FyZCwKICAgIGdldF9hZG1pbl9zdGF0c19rZXlib2FyZCwKICAgIGdldF9hZG1pbl91c2VyX21hbmFnZV9rZXlib2FyZCwKICAgIGdldF9hZG1pbl93YWxsZXRfYWRqdXN0X2tleWJvYXJkLAopCmZyb20gc2VydmljZXMucHJvZHVjdF9wcmljaW5nX3NlcnZpY2UgaW1wb3J0ICgKICAgIFBSRU1JVU1fUFJPRFVDVF9JRFMsCiAgICBQUk9EVUNUX0xBQkVMUywKICAgIFNUQVJTX1BST0RVQ1RfSURTLAogICAgSW52YWxpZFByb2R1Y3RQcmljZSwKICAgIFByb2R1Y3RQcmljaW5nU2VydmljZSwKKQpmcm9tIHV0aWxzLmZpbmFuY2UgaW1wb3J0IGZpbmFuY2VfbWFuYWdlcgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKcm91dGVyID0gUm91dGVyKG5hbWU9ImFkbWluX2FjdGlvbnMiKQoKU1RBUlRFRF9BVCA9IHRpbWUubW9ub3RvbmljKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFN0YXRlcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgQWRtaW5BY3Rpb25TdGF0ZXMoU3RhdGVzR3JvdXApOgogICAgd2FpdGluZ19yYXRlX3ZhbHVlID0gU3RhdGUoKQogICAgd2FpdGluZ19wcm9kdWN0X3VzZHRfcHJpY2UgPSBTdGF0ZSgpCgogICAgd2FpdGluZ191c2VyX3NlYXJjaCA9IFN0YXRlKCkKICAgIHdhaXRpbmdfd2FsbGV0X3VzZXIgPSBTdGF0ZSgpCiAgICB3YWl0aW5nX3dhbGxldF9hbW91bnQgPSBTdGF0ZSgpCgogICAgd2FpdGluZ19icm9hZGNhc3RfdGV4dCA9IFN0YXRlKCkKCiAgICB3YWl0aW5nX2RpcmVjdF9tZXNzYWdlID0gU3RhdGUoKQoKICAgIHdhaXRpbmdfa3ljX3JlamVjdF9yZWFzb24gPSBTdGF0ZSgpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBdXRob3JpemF0aW9uCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgX2FkbWluX2lkcygpIC0+IGZyb3plbnNldFtpbnRdOgogICAgbWV0aG9kID0gZ2V0YXR0cigKICAgICAgICBzZXR0aW5ncywKICAgICAgICAiZ2V0X2FkbWluX2xpc3QiLAogICAgICAgIE5vbmUsCiAgICApCgogICAgaWYgY2FsbGFibGUobWV0aG9kKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBmcm96ZW5zZXQoCiAgICAgICAgICAgICAgICBpbnQoaXRlbSkKICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG1ldGhvZCgpCiAgICAgICAgICAgICAgICBpZiBpbnQoaXRlbSkgPiAwCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVhZCBjb25maWd1cmVkIGFkbWluIElEcy4iCiAgICAgICAgICAgICkKCiAgICByZXR1cm4gZnJvemVuc2V0KCkKCgpkZWYgX2lzX2FkbWluKAogICAgdXNlcl9pZDogT3B0aW9uYWxbaW50XSwKKSAtPiBib29sOgogICAgaWYgdXNlcl9pZCBpcyBOb25lOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIHRyeToKICAgICAgICB2YWx1ZSA9IGludCh1c2VyX2lkKQoKICAgIGV4Y2VwdCAoCiAgICAgICAgVHlwZUVycm9yLAogICAgICAgIFZhbHVlRXJyb3IsCiAgICApOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIHJldHVybiB2YWx1ZSBpbiBfYWRtaW5faWRzKCkKCgphc3luYyBkZWYgX2d1YXJkX2NhbGxiYWNrKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCikgLT4gYm9vbDoKICAgIHVzZXJfaWQgPSAoCiAgICAgICAgY2FsbGJhY2suZnJvbV91c2VyLmlkCiAgICAgICAgaWYgY2FsbGJhY2suZnJvbV91c2VyCiAgICAgICAgZWxzZSBOb25lCiAgICApCgogICAgaWYgX2lzX2FkbWluKHVzZXJfaWQpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgdHJ5OgogICAgICAgIGF3YWl0IGNhbGxiYWNrLmFuc3dlcigKICAgICAgICAgICAgIuKblCDYr9iz2KrYsdiz24wg2YXYr9uM2LHbjNiqINmG2K/Yp9ix24zYry4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBwYXNzCgogICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgIlVuYXV0aG9yaXplZCBhZG1pbiBjYWxsYmFjayB8ICIKICAgICAgICAidXNlcj0lcyBkYXRhPSVzIiwKICAgICAgICB1c2VyX2lkLAogICAgICAgIGNhbGxiYWNrLmRhdGEsCiAgICApCgogICAgcmV0dXJuIEZhbHNlCgoKYXN5bmMgZGVmIF9ndWFyZF9tZXNzYWdlKAogICAgbWVzc2FnZTogTWVzc2FnZSwKKSAtPiBib29sOgogICAgdXNlcl9pZCA9ICgKICAgICAgICBtZXNzYWdlLmZyb21fdXNlci5pZAogICAgICAgIGlmIG1lc3NhZ2UuZnJvbV91c2VyCiAgICAgICAgZWxzZSBOb25lCiAgICApCgogICAgaWYgX2lzX2FkbWluKHVzZXJfaWQpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgIlVuYXV0aG9yaXplZCBhZG1pbiBzdGF0ZSBtZXNzYWdlIHwgdXNlcj0lcyIsCiAgICAgICAgdXNlcl9pZCwKICAgICkKCiAgICByZXR1cm4gRmFsc2UKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFVJIEhlbHBlcnMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBfYmFja19hZG1pbl9rZXlib2FyZCgpIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgcmV0dXJuIElubGluZUtleWJvYXJkTWFya3VwKAogICAgICAgIGlubGluZV9rZXlib2FyZD1bCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIElubGluZUtleWJvYXJkQnV0dG9uKAogICAgICAgICAgICAgICAgICAgIHRleHQ9Itio2KfYstqv2LTYqiDYqNmHINm+2YbZhCDZhdiv24zYsduM2KoiLAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGE9ImFkbWluX21haW4iLAogICAgICAgICAgICAgICAgICAgIHN0eWxlPSJkYW5nZXIiLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBdCiAgICAgICAgXQogICAgKQoKCmRlZiBfYmFja19hbmRfcmVmcmVzaF9rZXlib2FyZCgKICAgIHJlZnJlc2hfY2FsbGJhY2s6IHN0ciwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIHJldHVybiBJbmxpbmVLZXlib2FyZE1hcmt1cCgKICAgICAgICBpbmxpbmVfa2V5Ym9hcmQ9WwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICAgICAgICAgICAgICB0ZXh0PSLYqNix2YjYstix2LPYp9mG24wiLAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGE9cmVmcmVzaF9jYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICBzdHlsZT0icHJpbWFyeSIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIElubGluZUtleWJvYXJkQnV0dG9uKAogICAgICAgICAgICAgICAgICAgIHRleHQ9Itio2KfYstqv2LTYqiDYqNmHINm+2YbZhCDZhdiv24zYsduM2KoiLAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGE9ImFkbWluX21haW4iLAogICAgICAgICAgICAgICAgICAgIHN0eWxlPSJkYW5nZXIiLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBdLAogICAgICAgIF0KICAgICkKCgphc3luYyBkZWYgX3NhZmVfYW5zd2VyKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICB0ZXh0OiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgICosCiAgICBzaG93X2FsZXJ0OiBib29sID0gRmFsc2UsCikgLT4gTm9uZToKICAgIHRyeToKICAgICAgICBhd2FpdCBjYWxsYmFjay5hbnN3ZXIoCiAgICAgICAgICAgIHRleHQ9dGV4dCwKICAgICAgICAgICAgc2hvd19hbGVydD1zaG93X2FsZXJ0LAogICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHBhc3MKCgphc3luYyBkZWYgX3NhZmVfZWRpdCgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgdGV4dDogc3RyLAogICAgcmVwbHlfbWFya3VwOiBPcHRpb25hbFsKICAgICAgICBJbmxpbmVLZXlib2FyZE1hcmt1cAogICAgXSA9IE5vbmUsCikgLT4gTm9uZToKICAgIGlmIG5vdCBjYWxsYmFjay5tZXNzYWdlOgogICAgICAgIHJldHVybgoKICAgIHRyeToKICAgICAgICBhd2FpdCBjYWxsYmFjay5tZXNzYWdlLmVkaXRfdGV4dCgKICAgICAgICAgICAgdGV4dD10ZXh0LAogICAgICAgICAgICByZXBseV9tYXJrdXA9cmVwbHlfbWFya3VwLAogICAgICAgICAgICBwYXJzZV9tb2RlPSJIVE1MIiwKICAgICAgICApCgogICAgZXhjZXB0IFRlbGVncmFtQmFkUmVxdWVzdCBhcyBleGM6CiAgICAgICAgZXJyb3IgPSBzdHIoZXhjKS5sb3dlcigpCgogICAgICAgIGlmICJtZXNzYWdlIGlzIG5vdCBtb2RpZmllZCIgaW4gZXJyb3I6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIE1lZGlhL2NhcHRpb24vb2xkIG1lc3NhZ2U6IHNlbmQgYSBmcmVzaCBhZG1pbiBtZXNzYWdlLgogICAgICAgIHRyeToKICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2subWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgICAgICAgICB0ZXh0PXRleHQsCiAgICAgICAgICAgICAgICByZXBseV9tYXJrdXA9cmVwbHlfbWFya3VwLAogICAgICAgICAgICAgICAgcGFyc2VfbW9kZT0iSFRNTCIsCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVuZGVyIGFkbWluIHBhZ2UuIgogICAgICAgICAgICApCgogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAiQ291bGQgbm90IGVkaXQgYWRtaW4gcGFnZS4iCiAgICAgICAgKQoKCmRlZiBfZm10X2ludCgKICAgIHZhbHVlOiBBbnksCikgLT4gc3RyOgogICAgdHJ5OgogICAgICAgIHJldHVybiBmIntpbnQodmFsdWUgb3IgMCk6LH0iCiAgICBleGNlcHQgKAogICAgICAgIFR5cGVFcnJvciwKICAgICAgICBWYWx1ZUVycm9yLAogICAgKToKICAgICAgICByZXR1cm4gIjAiCgoKZGVmIF9wYXJzZV9wb3NpdGl2ZV9pbnQoCiAgICB2YWx1ZTogc3RyLAopIC0+IE9wdGlvbmFsW2ludF06CiAgICByYXcgPSAoCiAgICAgICAgc3RyKHZhbHVlIG9yICIiKQogICAgICAgIC5zdHJpcCgpCiAgICAgICAgLnJlcGxhY2UoIiwiLCAiIikKICAgICAgICAucmVwbGFjZSgi2awiLCAiIikKICAgICAgICAucmVwbGFjZSgiXyIsICIiKQogICAgICAgIC5yZXBsYWNlKCIgIiwgIiIpCiAgICApCgogICAgaWYgbm90IHJhdy5pc2RpZ2l0KCk6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICByZXN1bHQgPSBpbnQocmF3KQoKICAgIGlmIHJlc3VsdCA8PSAwOgogICAgICAgIHJldHVybiBOb25lCgogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfZGJfcGF0aCgKICAgIGRiOiBEYXRhYmFzZU1hbmFnZXIsCikgLT4gc3RyOgogICAgcmV0dXJuIHN0cigKICAgICAgICBnZXRhdHRyKAogICAgICAgICAgICBkYiwKICAgICAgICAgICAgImRiX3BhdGgiLAogICAgICAgICAgICBnZXRhdHRyKAogICAgICAgICAgICAgICAgZGIsCiAgICAgICAgICAgICAgICAiZGF0YWJhc2VfcGF0aCIsCiAgICAgICAgICAgICAgICBnZXRhdHRyKAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICJEQl9QQVRIIiwKICAgICAgICAgICAgICAgICAgICAibWF0cml4X2JvdC5kYiIsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLAogICAgICAgICkKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNRTGl0ZSBoZWxwZXJzIGZvciBhZG1pbi1vbmx5IHJlcG9ydHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBfc3FsaXRlX3Jvd3MoCiAgICBkYl9wYXRoOiBzdHIsCiAgICBxdWVyeTogc3RyLAogICAgcGFyYW1zOiB0dXBsZVtBbnksIC4uLl0gPSAoKSwKKSAtPiBsaXN0W2RpY3Rbc3RyLCBBbnldXToKICAgIGNvbm4gPSBzcWxpdGUzLmNvbm5lY3QoCiAgICAgICAgZGJfcGF0aCwKICAgICAgICB0aW1lb3V0PTMwLAogICAgKQogICAgY29ubi5yb3dfZmFjdG9yeSA9IHNxbGl0ZTMuUm93CgogICAgdHJ5OgogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIGRpY3Qocm93KQogICAgICAgICAgICBmb3Igcm93CiAgICAgICAgICAgIGluIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgIHF1ZXJ5LAogICAgICAgICAgICAgICAgcGFyYW1zLAogICAgICAgICAgICApLmZldGNoYWxsKCkKICAgICAgICBdCgogICAgZmluYWxseToKICAgICAgICBjb25uLmNsb3NlKCkKCgpkZWYgX3NxbGl0ZV9vbmUoCiAgICBkYl9wYXRoOiBzdHIsCiAgICBxdWVyeTogc3RyLAogICAgcGFyYW1zOiB0dXBsZVtBbnksIC4uLl0gPSAoKSwKKSAtPiBPcHRpb25hbFtkaWN0W3N0ciwgQW55XV06CiAgICByb3dzID0gX3NxbGl0ZV9yb3dzKAogICAgICAgIGRiX3BhdGgsCiAgICAgICAgcXVlcnksCiAgICAgICAgcGFyYW1zLAogICAgKQoKICAgIHJldHVybiAoCiAgICAgICAgcm93c1swXQogICAgICAgIGlmIHJvd3MKICAgICAgICBlbHNlIE5vbmUKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFN0YXRpc3RpY3MKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmFzeW5jIGRlZiBfc3RhdGlzdGljc190ZXh0KAogICAgZGI6IERhdGFiYXNlTWFuYWdlciwKKSAtPiBzdHI6CiAgICBzdGF0cyA9IGF3YWl0IGRiLmdldF9zdGF0aXN0aWNzKCkKCiAgICByZXR1cm4gKAogICAgICAgICLwn5OKIDxiPtii2YXYp9ixINmIINqv2LLYp9ix2LTYp9iqINmF2KfZhNuMPC9iPlxuIgogICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgoKICAgICAgICBmIvCfkaUg2qnYp9ix2KjYsdin2YY6IDxjb2RlPntfZm10X2ludChzdGF0cy5nZXQoJ3VzZXJzJykpfTwvY29kZT5cbiIKICAgICAgICBmIvCfk6Yg2qnZhCDYs9mB2KfYsdi04oCM2YfYpzogPGNvZGU+e19mbXRfaW50KHN0YXRzLmdldCgnb3JkZXJzJykpfTwvY29kZT5cbiIKICAgICAgICBmIuKchSDYs9mB2KfYsdi0INiq2qnZhduM2YTigIzYtNiv2Yc6ICIKICAgICAgICBmIjxjb2RlPntfZm10X2ludChzdGF0cy5nZXQoJ2NvbXBsZXRlZF9vcmRlcnMnKSl9PC9jb2RlPlxuXG4iCgogICAgICAgIGYi8J+StSDZgdix2YjYtCDYqtqp2YXbjNmE4oCM2LTYr9mHOiAiCiAgICAgICAgZiI8Y29kZT57X2ZtdF9pbnQoc3RhdHMuZ2V0KCdyZXZlbnVlX3RvbWFuJykpfTwvY29kZT4g2KrZiNmF2KfZhlxuIgoKICAgICAgICBmIvCfkrMg2YXYrNmF2YjYuSDZhdmI2KzZiNiv24wg2qnYp9ix2KjYsdin2YY6ICIKICAgICAgICBmIjxjb2RlPntfZm10X2ludChzdGF0cy5nZXQoJ3dhbGxldF9iYWxhbmNlX3RvbWFuJykpfTwvY29kZT4g2KrZiNmF2KfZhlxuXG4iCgogICAgICAgIGYi4o+zINmF2YbYqti42LEg2KrYp9uM24zYryDZhdin2YTaqTogIgogICAgICAgIGYiPGNvZGU+e19mbXRfaW50KHN0YXRzLmdldCgncGVuZGluZ19vd25lcl9vcmRlcnMnKSl9PC9jb2RlPlxuIgoKICAgICAgICBmIuKaoO+4jyDZiNi22LnbjNiqINmG2KfZhdi02K7YtSBQcm92aWRlcjogIgogICAgICAgIGYiPGNvZGU+e19mbXRfaW50KHN0YXRzLmdldCgncHJvdmlkZXJfdW5rbm93bl9vcmRlcnMnKSl9PC9jb2RlPiIKICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KEYuZGF0YSA9PSAiYWRtaW5fc3RhdHMiKQphc3luYyBkZWYgYWRtaW5fc3RhdHMoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAogICAgZGI6IERhdGFiYXNlTWFuYWdlciwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9jYWxsYmFjaygKICAgICAgICBjYWxsYmFjawogICAgKToKICAgICAgICByZXR1cm4KCiAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCgogICAgYXdhaXQgX3NhZmVfZWRpdCgKICAgICAgICBjYWxsYmFjaywKICAgICAgICBhd2FpdCBfc3RhdGlzdGljc190ZXh0KGRiKSwKICAgICAgICBnZXRfYWRtaW5fc3RhdHNfa2V5Ym9hcmQoKSwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhLmluXygKICAgICAgICB7CiAgICAgICAgICAgICJhZG1pbl9zdGF0c191c2VycyIsCiAgICAgICAgICAgICJhZG1pbl9zdGF0c19vcmRlcnMiLAogICAgICAgICAgICAiYWRtaW5fc3RhdHNfZmluYW5jZSIsCiAgICAgICAgICAgICJhZG1pbl9zdGF0c190cmFuc2FjdGlvbnMiLAogICAgICAgICAgICAiYWRtaW5fc3RhdHNfZGFpbHkiLAogICAgICAgIH0KICAgICkKKQphc3luYyBkZWYgYWRtaW5fc3RhdHNfZGV0YWlsKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIGJhc2UgPSBhd2FpdCBfc3RhdGlzdGljc190ZXh0KAogICAgICAgIGRiCiAgICApCgogICAgc3VmZml4ID0gIiIKCiAgICBpZiBjYWxsYmFjay5kYXRhID09ICJhZG1pbl9zdGF0c19kYWlseSI6CiAgICAgICAgcGF0aCA9IF9kYl9wYXRoKGRiKQoKICAgICAgICByb3cgPSBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgX3NxbGl0ZV9vbmUsCiAgICAgICAgICAgIHBhdGgsCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBTRUxFQ1QKICAgICAgICAgICAgICAgIENPVU5UKCopIEFTIG9yZGVyc19jb3VudCwKICAgICAgICAgICAgICAgIENPQUxFU0NFKFNVTShwcmljZSksIDApIEFTIHJldmVudWUKICAgICAgICAgICAgRlJPTSBvcmRlcnMKICAgICAgICAgICAgV0hFUkUgc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgICAgICAgICBBTkQgREFURShjcmVhdGVkX2F0KSA9IERBVEUoJ25vdycsICdsb2NhbHRpbWUnKQogICAgICAgICAgICAiIiIsCiAgICAgICAgKQoKICAgICAgICBzdWZmaXggPSAoCiAgICAgICAgICAgICJcblxu8J+ThSA8Yj7Zgdix2YjYtCDYp9mF2LHZiNiyPC9iPlxuIgogICAgICAgICAgICBmItiz2YHYp9ix2LQ6IDxjb2RlPntfZm10X2ludCgocm93IG9yIHt9KS5nZXQoJ29yZGVyc19jb3VudCcpKX08L2NvZGU+XG4iCiAgICAgICAgICAgIGYi2YXYqNmE2Lo6IDxjb2RlPntfZm10X2ludCgocm93IG9yIHt9KS5nZXQoJ3JldmVudWUnKSl9PC9jb2RlPiDYqtmI2YXYp9mGIgogICAgICAgICkKCiAgICBlbGlmIGNhbGxiYWNrLmRhdGEgPT0gImFkbWluX3N0YXRzX3RyYW5zYWN0aW9ucyI6CiAgICAgICAgcGF0aCA9IF9kYl9wYXRoKGRiKQoKICAgICAgICByb3cgPSBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgX3NxbGl0ZV9vbmUsCiAgICAgICAgICAgIHBhdGgsCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBTRUxFQ1QKICAgICAgICAgICAgICAgIENPVU5UKCopIEFTIHR4X2NvdW50LAogICAgICAgICAgICAgICAgQ09BTEVTQ0UoU1VNKAogICAgICAgICAgICAgICAgICAgIENBU0UKICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0eXBlID0gJ2NyZWRpdCcKICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBhbW91bnQKICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwCiAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICApLCAwKSBBUyBjcmVkaXRzLAogICAgICAgICAgICAgICAgQ09BTEVTQ0UoU1VNKAogICAgICAgICAgICAgICAgICAgIENBU0UKICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0eXBlID0gJ2RlYml0JwogICAgICAgICAgICAgICAgICAgICAgICBUSEVOIGFtb3VudAogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDAKICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICksIDApIEFTIGRlYml0cwogICAgICAgICAgICBGUk9NIHdhbGxldF90cmFuc2FjdGlvbnMKICAgICAgICAgICAgIiIiLAogICAgICAgICkKCiAgICAgICAgc3VmZml4ID0gKAogICAgICAgICAgICAiXG5cbvCfkrMgPGI+2KrYsdin2qnZhti04oCM2YfYp9uMINqp24zZgSDZvtmI2YQ8L2I+XG4iCiAgICAgICAgICAgIGYi2KrYudiv2KfYrzogPGNvZGU+e19mbXRfaW50KChyb3cgb3Ige30pLmdldCgndHhfY291bnQnKSl9PC9jb2RlPlxuIgogICAgICAgICAgICBmItmI2KfYsduM2LI6IDxjb2RlPntfZm10X2ludCgocm93IG9yIHt9KS5nZXQoJ2NyZWRpdHMnKSl9PC9jb2RlPiDYqtmI2YXYp9mGXG4iCiAgICAgICAgICAgIGYi2KjYsdiv2KfYtNiqOiA8Y29kZT57X2ZtdF9pbnQoKHJvdyBvciB7fSkuZ2V0KCdkZWJpdHMnKSl9PC9jb2RlPiDYqtmI2YXYp9mGIgogICAgICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgIGJhc2UgKyBzdWZmaXgsCiAgICAgICAgZ2V0X2FkbWluX3N0YXRzX2tleWJvYXJkKCksCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQcmljaW5nCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpSQVRFX0NPTkZJRzogZGljdFtzdHIsIHR1cGxlW3N0ciwgc3RyXV0gPSB7CiAgICAic2V0X3JhdGVfdXNkdCI6CiAgICAgICAgKAogICAgICAgICAgICAidXNkdCIsCiAgICAgICAgICAgICLZhtix2K4g2KrYqtixINio2Ycg2KrZiNmF2KfZhiAoRmFsbGJhY2sg2K/Ys9iq24wpIiwKICAgICAgICApLAoKICAgICJzZXRfcmF0ZV90b24iOgogICAgICAgICgKICAgICAgICAgICAgInRvbiIsCiAgICAgICAgICAgICLZhtix2K4gVE9OL0dSQU0g2KjZhyDYqtmI2YXYp9mGIChGYWxsYmFjayDYr9iz2KrbjCkiLAogICAgICAgICksCn0KCgoKZGVmIF9maW5hbmNlX3ZhbHVlKAogICAga2V5OiBzdHIsCikgLT4gc3RyOgogICAgdHJ5OgogICAgICAgIHZhbHVlID0gZmluYW5jZV9tYW5hZ2VyLmdldF9yYXRlKAogICAgICAgICAgICBrZXkKICAgICAgICApCgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiAi2KrZhti424zZhSDZhti02K/ZhyIKCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgZiJ7ZmluYW5jZV9tYW5hZ2VyLmZvcm1hdF9jdXJyZW5jeSh2YWx1ZSl9IgogICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICJDb3VsZCBub3QgcmVhZCBmaW5hbmNlIHJhdGUgJXMiLAogICAgICAgICAgICBrZXksCiAgICAgICAgKQogICAgICAgIHJldHVybiAi2K7Yt9inIgoKCmRlZiBfcHJpY2luZ190ZXh0KCkgLT4gc3RyOgogICAgcmV0dXJuICgKICAgICAgICAi4pqZ77iPIDxiPtiq2YbYuNuM2YUg2YbYsdiuINmIINmC24zZhdiqINmB2LHZiNi02q/Yp9mHPC9iPlxuIgogICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgoKICAgICAgICAi8J+StSBVU0RUL1RvbWFuINmB2LnZhNuMOiAiCiAgICAgICAgZiI8Y29kZT57ZXNjYXBlKF9maW5hbmNlX3ZhbHVlKCd1c2R0JykpfTwvY29kZT4g2KrZiNmF2KfZhlxuIgoKICAgICAgICAi8J+UtyBUT04vR1JBTSBUb21hbiDZgdi52YTbjDogIgogICAgICAgIGYiPGNvZGU+e2VzY2FwZShfZmluYW5jZV92YWx1ZSgndG9uJykpfTwvY29kZT4g2KrZiNmF2KfZhlxuXG4iCgogICAgICAgICLwn5KOINmC24zZhdiqINm+2KfbjNmHIFByZW1pdW06ICIKICAgICAgICAiPGI+VVNEVCDZiCDYrNiv2Kfar9in2YbZhyDYqNix2KfbjCDZh9ixINm+2qnbjNisPC9iPlxuIgoKICAgICAgICAi4q2QINmC24zZhdiqINm+2KfbjNmHIFN0YXJzOiAiCiAgICAgICAgIjxiPlVTRFQg2KjYsdin24wg2YfYsSDYqNiz2KrZhyArINmC24zZhdiqINmH2LEg27EgU3RhciDYqNix2KfbjCDYs9mB2KfYsdi0INiv2YTYrtmI2KfZhzwvYj5cblxuIgoKICAgICAgICAi8J+TjCDZgtuM2YXYqiDZhtmH2KfbjNuMINqp2KfYsdio2LEgPSDZgtuM2YXYqiDZvtin24zZhyBVU0RUIMOXINmG2LHYriDYstmG2K/ZhyBVU0RUL1RvbWFuXG4iCiAgICAgICAgIvCfk4wg2YbYsdiuINiq2KrYsSDYqNinIEZhbGxiYWNrINqG2YbYryDYtdix2KfZgduMINiv2LHbjNin2YHYqiDZhduM4oCM2LTZiNivLlxuIgogICAgICAgICLwn5OMINmC24zZhdiqINmF2K3YtdmI2YQg2K/bjNqv2LEg2KfYsiBNYXJrZXRBcHAg24zYpyBTY3JhcGluZyDar9ix2YHYqtmHINmG2YXbjOKAjNi02YjYry4iCiAgICApCgoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoRi5kYXRhID09ICJhZG1pbl9wcmljaW5nIikKYXN5bmMgZGVmIGFkbWluX3ByaWNpbmcoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgIF9wcmljaW5nX3RleHQoKSwKICAgICAgICBnZXRfYWRtaW5fcHJpY2luZ19rZXlib2FyZCgpLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuaW5fKAogICAgICAgIHNldCgKICAgICAgICAgICAgUkFURV9DT05GSUcua2V5cygpCiAgICAgICAgKQogICAgKQopCmFzeW5jIGRlZiBhZG1pbl9zZXRfcmF0ZSgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgc3RhdGU6IEZTTUNvbnRleHQsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgY29uZmlnID0gUkFURV9DT05GSUcuZ2V0KAogICAgICAgIGNhbGxiYWNrLmRhdGEgb3IgIiIKICAgICkKCiAgICBpZiBub3QgY29uZmlnOgogICAgICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLar9iy24zZhtmHINmG2KfZhdi52KrYqNixINin2LPYqi4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGtleSwgdGl0bGUgPSBjb25maWcKCiAgICBhd2FpdCBzdGF0ZS5zZXRfc3RhdGUoCiAgICAgICAgQWRtaW5BY3Rpb25TdGF0ZXMud2FpdGluZ19yYXRlX3ZhbHVlCiAgICApCgogICAgYXdhaXQgc3RhdGUudXBkYXRlX2RhdGEoCiAgICAgICAgYWRtaW5fcmF0ZV9rZXk9a2V5LAogICAgICAgIGFkbWluX3JhdGVfdGl0bGU9dGl0bGUsCiAgICApCgogICAgYXdhaXQgX3NhZmVfZWRpdCgKICAgICAgICBjYWxsYmFjaywKICAgICAgICAoCiAgICAgICAgICAgIGYi4pyP77iPIDxiPntlc2NhcGUodGl0bGUpfTwvYj5cbiIKICAgICAgICAgICAgIuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgVxuXG4iCiAgICAgICAgICAgICLZhdmC2K/Yp9ixINis2K/bjNivINix2Kcg2YHZgti3INio2YfigIzYtdmI2LHYqiDYudiv2K8g2KfYsdiz2KfZhCDaqdmG24zYry5cblxuIgogICAgICAgICAgICAi2YXYq9in2YQ6IDxjb2RlPjk1MDAwPC9jb2RlPiIKICAgICAgICApLAogICAgICAgIF9iYWNrX2FkbWluX2tleWJvYXJkKCksCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKQHJvdXRlci5tZXNzYWdlKAogICAgQWRtaW5BY3Rpb25TdGF0ZXMud2FpdGluZ19yYXRlX3ZhbHVlLAogICAgRi50ZXh0LAopCmFzeW5jIGRlZiBhZG1pbl9yYXRlX3ZhbHVlX21lc3NhZ2UoCiAgICBtZXNzYWdlOiBNZXNzYWdlLAogICAgc3RhdGU6IEZTTUNvbnRleHQsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfbWVzc2FnZSgKICAgICAgICBtZXNzYWdlCiAgICApOgogICAgICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKICAgICAgICByZXR1cm4KCiAgICBkYXRhID0gYXdhaXQgc3RhdGUuZ2V0X2RhdGEoKQoKICAgIGtleSA9IGRhdGEuZ2V0KAogICAgICAgICJhZG1pbl9yYXRlX2tleSIKICAgICkKCiAgICB0aXRsZSA9IGRhdGEuZ2V0KAogICAgICAgICJhZG1pbl9yYXRlX3RpdGxlIiwKICAgICAgICBrZXkgb3IgItmG2LHYriIsCiAgICApCgogICAgcmF3ID0gKAogICAgICAgIG1lc3NhZ2UudGV4dAogICAgICAgIG9yICIiCiAgICApLnN0cmlwKCkKCiAgICBjbGVhbmVkID0gKAogICAgICAgIHJhdwogICAgICAgIC5yZXBsYWNlKCIsIiwgIiIpCiAgICAgICAgLnJlcGxhY2UoItmsIiwgIiIpCiAgICAgICAgLnJlcGxhY2UoIl8iLCAiIikKICAgICAgICAucmVwbGFjZSgiICIsICIiKQogICAgICAgIC5yZXBsYWNlKCLZqyIsICIuIikKICAgICkKCiAgICB0cnk6CiAgICAgICAgdmFsdWUgPSBEZWNpbWFsKAogICAgICAgICAgICBjbGVhbmVkCiAgICAgICAgKQoKICAgIGV4Y2VwdCAoCiAgICAgICAgSW52YWxpZE9wZXJhdGlvbiwKICAgICAgICBWYWx1ZUVycm9yLAogICAgICAgIFR5cGVFcnJvciwKICAgICk6CiAgICAgICAgYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgICAgICLinYwg2YXZgtiv2KfYsSDZhdi52KrYqNixINmG24zYs9iqLiDZgdmC2Lcg2LnYr9ivINio2LLYsdqv4oCM2KrYsSDYp9iyINi12YHYsSDYqNmB2LHYs9iqLiIKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgaWYgKAogICAgICAgIG5vdCB2YWx1ZS5pc19maW5pdGUoKQogICAgICAgIG9yIHZhbHVlIDw9IDAKICAgICk6CiAgICAgICAgYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgICAgICLinYwg2YXZgtiv2KfYsSDYqNin24zYryDYqNiy2LHar+KAjNiq2LEg2KfYsiDYtdmB2LEg2KjYp9i02K8uIgogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBpZiBrZXkgbm90IGluIHsKICAgICAgICAidXNkdCIsCiAgICAgICAgInRvbiIsCiAgICB9OgogICAgICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKICAgICAgICBhd2FpdCBtZXNzYWdlLmFuc3dlcigKICAgICAgICAgICAgIuKdjCDZhti02LPYqiDYqtmG2LjbjNmFINmG2LHYriDZhdi52KrYqNixINmG24zYs9iqLiIsCiAgICAgICAgICAgIHJlcGx5X21hcmt1cD1nZXRfYWRtaW5fbWFpbl9tZW51KCksCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIHN1Y2Nlc3MgPSBmaW5hbmNlX21hbmFnZXIudXBkYXRlX3JhdGUoCiAgICAgICAga2V5LAogICAgICAgIHZhbHVlLAogICAgICAgIHNvdXJjZT0iYWRtaW4iLAogICAgKQoKICAgIGlmIG5vdCBzdWNjZXNzOgogICAgICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICAgICAi4p2MINiw2K7bjNix2Ycg2YbYsdiuINin2YbYrNin2YUg2YbYtNivLiIKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICgKICAgICAgICAgICAgIuKchSA8Yj7Zhtix2K4g2LDYrtuM2LHZhyDYtNivLjwvYj5cblxuIgogICAgICAgICAgICBmIntlc2NhcGUoc3RyKHRpdGxlKSl9OiAiCiAgICAgICAgICAgIGYiPGNvZGU+e2VzY2FwZShmaW5hbmNlX21hbmFnZXIuZm9ybWF0X2N1cnJlbmN5KHZhbHVlKSl9PC9jb2RlPiDYqtmI2YXYp9mGIgogICAgICAgICksCiAgICAgICAgcmVwbHlfbWFya3VwPWdldF9hZG1pbl9wcmljaW5nX2tleWJvYXJkKCksCiAgICAgICAgcGFyc2VfbW9kZT0iSFRNTCIsCiAgICApCgoKQHJvdXRlci5jYWxsYmFja19xdWVyeShGLmRhdGEgPT0gImF1dG9fc3luY19yYXRlcyIpCmFzeW5jIGRlZiBhZG1pbl9hdXRvX3N5bmNfcmF0ZXMoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9jYWxsYmFjaygKICAgICAgICBjYWxsYmFjawogICAgKToKICAgICAgICByZXR1cm4KCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmluYW5jZV9tYW5hZ2VyLnN5bmNfcmF0ZXMoKQoKICAgICAgICB1cGRhdGVkID0gc2V0KAogICAgICAgICAgICByZXN1bHQuZ2V0KAogICAgICAgICAgICAgICAgInVwZGF0ZWQiLAogICAgICAgICAgICAgICAgKCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgb3IgKCkKICAgICAgICApCgogICAgICAgIGVycm9ycyA9IGRpY3QoCiAgICAgICAgICAgIHJlc3VsdC5nZXQoCiAgICAgICAgICAgICAgICAiZXJyb3JzIiwKICAgICAgICAgICAgICAgIHt9LAogICAgICAgICAgICApCiAgICAgICAgICAgIG9yIHt9CiAgICAgICAgKQoKICAgICAgICBpZiBlcnJvcnM6CiAgICAgICAgICAgIHN0YXR1c19saW5lcyA9IFsKICAgICAgICAgICAgICAgICLimqDvuI8gPGI+2YfZhdqv2KfZheKAjNiz2KfYstuMINmG2KfZgti1INio2YjYry48L2I+IiwKICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICBdCgogICAgICAgICAgICBzdGF0dXNfbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgIuKchSDYqNix2YjYstix2LPYp9mG24zigIzYtNiv2Yc6ICIKICAgICAgICAgICAgICAgICsgKAogICAgICAgICAgICAgICAgICAgICIsICIuam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkKHVwZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIHVwZGF0ZWQKICAgICAgICAgICAgICAgICAgICBlbHNlICLZh9uM2obigIzaqdiv2KfZhSIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgc3RhdHVzX2xpbmVzLmFwcGVuZCgKICAgICAgICAgICAgICAgICLij7gg2YbYsdiuINmG2KfZhdmI2YHZgiDYqNiv2YjZhiDYqti624zbjNixINmC2KjZhNuMINit2YHYuCDYtNivOiAiCiAgICAgICAgICAgICAgICArICIsICIuam9pbigKICAgICAgICAgICAgICAgICAgICBzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5rZXlzKCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHRleHQgPSAoCiAgICAgICAgICAgICAgICBfcHJpY2luZ190ZXh0KCkKICAgICAgICAgICAgICAgICsgIlxuXG7ilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcbiIKICAgICAgICAgICAgICAgICsgIlxuIi5qb2luKAogICAgICAgICAgICAgICAgICAgIHN0YXR1c19saW5lcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgICAgICBhbnN3ZXJfdGV4dCA9ICgKICAgICAgICAgICAgICAgICLimqDvuI8g2KjYrti024wg2KfYsiDZhtix2K7igIzZh9inINio2LHZiNiy2LHYs9in2YbbjCDYtNiv2JsgIgogICAgICAgICAgICAgICAgItmG2LHYriDZhtin2YXZiNmB2YIg2YLYqNmE24wg2K3Zgdi4INi02K8uIgogICAgICAgICAgICApCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRleHQgPSAoCiAgICAgICAgICAgICAgICBfcHJpY2luZ190ZXh0KCkKICAgICAgICAgICAgICAgICsgIlxuXG7inIUg2YbYsdiu4oCM2YfYpyDYqNix2YjYstix2LPYp9mG24wg2LTYr9mG2K/YmyBVU0RUINin2LIgRmFsbGJhY2sg2LXYsdin2YHbjOKAjNmH2KfbjCDYp9uM2LHYp9mG24wg2Ygg2YbYsdiuIG5hdGl2ZSDYp9iyINiz2LHZiNuM2LMg2KjYp9iy2KfYsS4iCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGFuc3dlcl90ZXh0ID0gKAogICAgICAgICAgICAgICAgIuKchSDZhtix2K7igIzZh9in24wg2KjYp9iy2KfYsSDYqNix2YjYstix2LPYp9mG24wg2LTYr9mG2K8uIgogICAgICAgICAgICApCgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAiQWRtaW4gZmluYW5jZSBzeW5jIGNvbXBsZXRlZCB8IHJlc3VsdD0lcyIsCiAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICApCgogICAgICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICB0ZXh0LAogICAgICAgICAgICBnZXRfYWRtaW5fcHJpY2luZ19rZXlib2FyZCgpLAogICAgICAgICkKCiAgICAgICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgYW5zd2VyX3RleHQsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9Ym9vbChlcnJvcnMpLAogICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAiTWFya2V0IHJhdGUgc3luY2hyb25pemF0aW9uIGZhaWxlZC4iCiAgICAgICAgKQoKICAgICAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICBmIuKdjCDYqNix2YjYstix2LPYp9mG24wg2KfZhtis2KfZhSDZhti02K86IHtzdHIoZXhjKVs6MTIwXX0iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJvZHVjdCBCYXNlIFByaWNlcyAoVVNEVCkKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClBST0RVQ1RfQURNSU5fTEFCRUxTOiBkaWN0WwogICAgc3RyLAogICAgc3RyLApdID0gewogICAgInByZW1fMW0iOgogICAgICAgICJQcmVtaXVtINuxINmF2KfZh9mHIiwKCiAgICAicHJlbV8zbSI6CiAgICAgICAgIlByZW1pdW0g27Mg2YXYp9mH2YciLAoKICAgICJwcmVtXzZtIjoKICAgICAgICAiUHJlbWl1bSDbtiDZhdin2YfZhyIsCgogICAgInByZW1fMXkiOgogICAgICAgICJQcmVtaXVtINuxINiz2KfZhNmHIiwKCiAgICAic3RhcnNfNTAiOgogICAgICAgICI1MCBTdGFycyIsCgogICAgInN0YXJzXzEwMCI6CiAgICAgICAgIjEwMCBTdGFycyIsCgogICAgInN0YXJzXzI1MCI6CiAgICAgICAgIjI1MCBTdGFycyIsCgogICAgInN0YXJzXzUwMCI6CiAgICAgICAgIjUwMCBTdGFycyIsCgogICAgInN0YXJzXzEwMDAiOgogICAgICAgICIxMDAwIFN0YXJzIiwKCiAgICAic3RhcnNfNTAwMCI6CiAgICAgICAgIjUwMDAgU3RhcnMiLAoKICAgICJzdGFyc191bml0IjoKICAgICAgICAi2YfYsSDbsSBTdGFyINio2LHYp9uMINiq2LnYr9in2K8g2K/ZhNiu2YjYp9mHIiwKfQoKCmRlZiBfcHJvZHVjdF9zZXJ2aWNlKAogICAgZGI6IE9wdGlvbmFsWwogICAgICAgIERhdGFiYXNlTWFuYWdlcgogICAgXSA9IE5vbmUsCikgLT4gUHJvZHVjdFByaWNpbmdTZXJ2aWNlOgogICAgaWYgZGIgaXMgbm90IE5vbmU6CiAgICAgICAgcGF0aCA9IF9kYl9wYXRoKAogICAgICAgICAgICBkYgogICAgICAgICkKCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBzdHIoCiAgICAgICAgICAgIGdldGF0dHIoCiAgICAgICAgICAgICAgICBzZXR0aW5ncywKICAgICAgICAgICAgICAgICJEQl9QQVRIIiwKICAgICAgICAgICAgICAgICJtYXRyaXhfYm90LmRiIiwKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICByZXR1cm4gUHJvZHVjdFByaWNpbmdTZXJ2aWNlKAogICAgICAgIHBhdGgKICAgICkKCgpkZWYgX2Zvcm1hdF91c2R0KAogICAgdmFsdWU6IE9wdGlvbmFsWwogICAgICAgIERlY2ltYWwKICAgIF0sCikgLT4gc3RyOgogICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICByZXR1cm4gItiq2YbYuNuM2YUg2YbYtNiv2YciCgogICAgbm9ybWFsaXplZCA9IGZvcm1hdCgKICAgICAgICB2YWx1ZS5ub3JtYWxpemUoKSwKICAgICAgICAiZiIsCiAgICApCgogICAgcmV0dXJuICgKICAgICAgICBub3JtYWxpemVkLnJzdHJpcCgiMCIpLnJzdHJpcCgiLiIpCiAgICAgICAgaWYgIi4iIGluIG5vcm1hbGl6ZWQKICAgICAgICBlbHNlIG5vcm1hbGl6ZWQKICAgICkKCgpkZWYgX3Byb2R1Y3RfY2F0ZWdvcnlfaWRzKAogICAgY2F0ZWdvcnk6IHN0ciwKKSAtPiB0dXBsZVsKICAgIHN0ciwKICAgIC4uLiwKXToKICAgIGlmIGNhdGVnb3J5ID09ICJwcmVtaXVtIjoKICAgICAgICByZXR1cm4gUFJFTUlVTV9QUk9EVUNUX0lEUwoKICAgIGlmIGNhdGVnb3J5ID09ICJzdGFycyI6CiAgICAgICAgcmV0dXJuIFNUQVJTX1BST0RVQ1RfSURTCgogICAgcmV0dXJuICgpCgoKYXN5bmMgZGVmIF9wcm9kdWN0X3ByaWNlc192aWV3KAogICAgY2F0ZWdvcnk6IHN0ciwKICAgIGRiOiBPcHRpb25hbFsKICAgICAgICBEYXRhYmFzZU1hbmFnZXIKICAgIF0gPSBOb25lLAopIC0+IHR1cGxlWwogICAgc3RyLAogICAgSW5saW5lS2V5Ym9hcmRNYXJrdXAsCl06CiAgICBzZXJ2aWNlID0gX3Byb2R1Y3Rfc2VydmljZSgKICAgICAgICBkYgogICAgKQoKICAgIHByaWNlcyA9IGF3YWl0IHNlcnZpY2UuZ2V0X2FsbF9iYXNlX3VzZHQoKQoKICAgIGlkcyA9IF9wcm9kdWN0X2NhdGVnb3J5X2lkcygKICAgICAgICBjYXRlZ29yeQogICAgKQoKICAgIGlmIGNhdGVnb3J5ID09ICJwcmVtaXVtIjoKICAgICAgICB0aXRsZSA9ICLwn5KOINmC24zZhdiqINm+2KfbjNmHIFByZW1pdW0iCiAgICAgICAgbm90ZSA9ICgKICAgICAgICAgICAgItio2LHYp9uMINmH2LEg2b7aqduM2KzYjCDZgtuM2YXYqiDaqdin2YXZhCDZh9mF2KfZhiDYqNiz2KrZhyDYsdinINio2YcgVVNEVCDZiNin2LHYryDaqdmG24zYry4iCiAgICAgICAgKQogICAgICAgIGJhY2tfY2FsbGJhY2sgPSAiYWRtaW5fcHJpY2luZyIKCiAgICBlbHNlOgogICAgICAgIHRpdGxlID0gIuKtkCDZgtuM2YXYqiDZvtin24zZhyBTdGFycyIKICAgICAgICBub3RlID0gKAogICAgICAgICAgICAi2KjYsdin24wg2KjYs9iq2YfigIzZh9in24wg2KvYp9io2Kog2YLbjNmF2Kog2qnYp9mF2YQg2KjYs9iq2Ycg2LHYpyDZiNin2LHYryDaqdmG24zYry4gIgogICAgICAgICAgICAi2KjYsdin24wgU3RhcnMg2K/ZhNiu2YjYp9mH2Iwg2YLbjNmF2Kog2YfYsSDbsSBTdGFyINix2Kcg2K/YsSDar9iy24zZhtmHINii2K7YsSDZiNin2LHYryDaqdmG24zYry4iCiAgICAgICAgKQogICAgICAgIGJhY2tfY2FsbGJhY2sgPSAiYWRtaW5fcHJpY2luZyIKCiAgICBsaW5lcyA9IFsKICAgICAgICBmIjxiPnt0aXRsZX08L2I+IiwKICAgICAgICAi4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBIiwKICAgICAgICAiIiwKICAgIF0KCiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBmb3IgcHJvZHVjdF9pZCBpbiBpZHM6CiAgICAgICAgbGFiZWwgPSBQUk9EVUNUX0FETUlOX0xBQkVMUy5nZXQoCiAgICAgICAgICAgIHByb2R1Y3RfaWQsCiAgICAgICAgICAgIFBST0RVQ1RfTEFCRUxTLmdldCgKICAgICAgICAgICAgICAgIHByb2R1Y3RfaWQsCiAgICAgICAgICAgICAgICBwcm9kdWN0X2lkLAogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgdmFsdWUgPSBwcmljZXMuZ2V0KAogICAgICAgICAgICBwcm9kdWN0X2lkCiAgICAgICAgKQoKICAgICAgICB2YWx1ZV90ZXh0ID0gX2Zvcm1hdF91c2R0KAogICAgICAgICAgICB2YWx1ZQogICAgICAgICkKCiAgICAgICAgbGluZXMuYXBwZW5kKAogICAgICAgICAgICBmIuKAoiB7ZXNjYXBlKGxhYmVsKX06ICIKICAgICAgICAgICAgZiI8Y29kZT57ZXNjYXBlKHZhbHVlX3RleHQpfSIKICAgICAgICAgICAgKyAoCiAgICAgICAgICAgICAgICAiIFVTRFQ8L2NvZGU+IgogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgIGVsc2UgIjwvY29kZT4iCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICAgICAgICAgIHRleHQ9KAogICAgICAgICAgICAgICAgICAgIGYie2xhYmVsfSDigJQgIgogICAgICAgICAgICAgICAgICAgICsgKAogICAgICAgICAgICAgICAgICAgICAgICBmInt2YWx1ZV90ZXh0fSBVU0RUIgogICAgICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlICLYqtmG2LjbjNmFINmG2LTYr9mHIgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhPSgKICAgICAgICAgICAgICAgICAgICBmInNldF9wcm9kdWN0X3VzZHRfe3Byb2R1Y3RfaWR9IgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIHN0eWxlPSgKICAgICAgICAgICAgICAgICAgICAicHJpbWFyeSIKICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgICAgIGVsc2UgImRhbmdlciIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgbGluZXMuZXh0ZW5kKAogICAgICAgIFsKICAgICAgICAgICAgIiIsCiAgICAgICAgICAgIG5vdGUsCiAgICAgICAgXQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIElubGluZUtleWJvYXJkQnV0dG9uKAogICAgICAgICAgICB0ZXh0PSLYqNin2LLar9i02Kog2KjZhyDZhtix2K4g2Ygg2YLbjNmF2KrigIzZh9inIiwKICAgICAgICAgICAgY2FsbGJhY2tfZGF0YT1iYWNrX2NhbGxiYWNrLAogICAgICAgICAgICBzdHlsZT0iZGFuZ2VyIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuICgKICAgICAgICAiXG4iLmpvaW4oCiAgICAgICAgICAgIGxpbmVzCiAgICAgICAgKSwKICAgICAgICBidWlsZGVyLmFzX21hcmt1cCgpLAogICAgKQoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEgPT0gImFkbWluX3Byb2R1Y3RfcHJpY2VzX3ByZW1pdW0iCikKYXN5bmMgZGVmIGFkbWluX3Byb2R1Y3RfcHJpY2VzX3ByZW1pdW0oCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAogICAgZGI6IE9wdGlvbmFsWwogICAgICAgIERhdGFiYXNlTWFuYWdlcgogICAgXSA9IE5vbmUsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgIHRleHRfdmFsdWUsIGtleWJvYXJkID0gYXdhaXQgX3Byb2R1Y3RfcHJpY2VzX3ZpZXcoCiAgICAgICAgInByZW1pdW0iLAogICAgICAgIGRiLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgdGV4dF92YWx1ZSwKICAgICAgICBrZXlib2FyZCwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhID09ICJhZG1pbl9wcm9kdWN0X3ByaWNlc19zdGFycyIKKQphc3luYyBkZWYgYWRtaW5fcHJvZHVjdF9wcmljZXNfc3RhcnMoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAogICAgZGI6IE9wdGlvbmFsWwogICAgICAgIERhdGFiYXNlTWFuYWdlcgogICAgXSA9IE5vbmUsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgIHRleHRfdmFsdWUsIGtleWJvYXJkID0gYXdhaXQgX3Byb2R1Y3RfcHJpY2VzX3ZpZXcoCiAgICAgICAgInN0YXJzIiwKICAgICAgICBkYiwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgIHRleHRfdmFsdWUsCiAgICAgICAga2V5Ym9hcmQsCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YS5zdGFydHN3aXRoKAogICAgICAgICJzZXRfcHJvZHVjdF91c2R0XyIKICAgICkKKQphc3luYyBkZWYgYWRtaW5fc2V0X3Byb2R1Y3RfdXNkdCgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgc3RhdGU6IEZTTUNvbnRleHQsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgcHJvZHVjdF9pZCA9IHN0cigKICAgICAgICBjYWxsYmFjay5kYXRhCiAgICAgICAgb3IgIiIKICAgICkucmVtb3ZlcHJlZml4KAogICAgICAgICJzZXRfcHJvZHVjdF91c2R0XyIKICAgICkKCiAgICBpZiBwcm9kdWN0X2lkIG5vdCBpbiBQUk9EVUNUX0xBQkVMUzoKICAgICAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi2YXYrdi12YjZhCDZhtin2YXYudiq2KjYsSDYp9iz2KouIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBsYWJlbCA9IFBST0RVQ1RfQURNSU5fTEFCRUxTLmdldCgKICAgICAgICBwcm9kdWN0X2lkLAogICAgICAgIFBST0RVQ1RfTEFCRUxTWwogICAgICAgICAgICBwcm9kdWN0X2lkCiAgICAgICAgXSwKICAgICkKCiAgICBhd2FpdCBzdGF0ZS5zZXRfc3RhdGUoCiAgICAgICAgQWRtaW5BY3Rpb25TdGF0ZXMud2FpdGluZ19wcm9kdWN0X3VzZHRfcHJpY2UKICAgICkKCiAgICBhd2FpdCBzdGF0ZS51cGRhdGVfZGF0YSgKICAgICAgICBhZG1pbl9wcm9kdWN0X2lkPXByb2R1Y3RfaWQsCiAgICAgICAgYWRtaW5fcHJvZHVjdF9sYWJlbD1sYWJlbCwKICAgICAgICBhZG1pbl9wcm9kdWN0X2NhdGVnb3J5PSgKICAgICAgICAgICAgInByZW1pdW0iCiAgICAgICAgICAgIGlmIHByb2R1Y3RfaWQuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICJwcmVtXyIKICAgICAgICAgICAgKQogICAgICAgICAgICBlbHNlICJzdGFycyIKICAgICAgICApLAogICAgKQoKICAgIGhpbnQgPSAoCiAgICAgICAgItmF2KvYp9mEOiA8Y29kZT4xMjwvY29kZT4iCiAgICAgICAgaWYgcHJvZHVjdF9pZC5zdGFydHN3aXRoKAogICAgICAgICAgICAicHJlbV8iCiAgICAgICAgKQogICAgICAgIGVsc2UgKAogICAgICAgICAgICAi2YXYq9in2YQ6IDxjb2RlPjAuMDI8L2NvZGU+IgogICAgICAgICAgICBpZiBwcm9kdWN0X2lkCiAgICAgICAgICAgID09ICJzdGFyc191bml0IgogICAgICAgICAgICBlbHNlICLZhdir2KfZhDogPGNvZGU+Mi41PC9jb2RlPiIKICAgICAgICApCiAgICApCgogICAgYXdhaXQgX3NhZmVfZWRpdCgKICAgICAgICBjYWxsYmFjaywKICAgICAgICAoCiAgICAgICAgICAgIGYi4pyP77iPIDxiPntlc2NhcGUobGFiZWwpfTwvYj5cbiIKICAgICAgICAgICAgIuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgVxuXG4iCiAgICAgICAgICAgICLZgtuM2YXYqiDZvtin24zZhyDYsdinINio2YcgPGI+VVNEVDwvYj4g2KfYsdiz2KfZhCDaqdmG24zYry5cbiIKICAgICAgICAgICAgItmB2YLYtyDYudiv2K8g2YXYq9io2Kog2YjYp9ix2K8g2qnZhtuM2K8uXG5cbiIKICAgICAgICAgICAgZiJ7aGludH1cblxuIgogICAgICAgICAgICAi2KjYudiv2KfZiyDZgtuM2YXYqiDYqtmI2YXYp9mGINio2Kcg2YbYsdiuINiy2YbYr9mHINiq2KrYsSDZhdit2KfYs9io2Ycg2YXbjOKAjNi02YjYry4iCiAgICAgICAgKSwKICAgICAgICBfYmFja19hZG1pbl9rZXlib2FyZCgpLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCkByb3V0ZXIubWVzc2FnZSgKICAgIEFkbWluQWN0aW9uU3RhdGVzLndhaXRpbmdfcHJvZHVjdF91c2R0X3ByaWNlLAogICAgRi50ZXh0LAopCmFzeW5jIGRlZiBhZG1pbl9wcm9kdWN0X3VzZHRfdmFsdWUoCiAgICBtZXNzYWdlOiBNZXNzYWdlLAogICAgc3RhdGU6IEZTTUNvbnRleHQsCiAgICBkYjogT3B0aW9uYWxbCiAgICAgICAgRGF0YWJhc2VNYW5hZ2VyCiAgICBdID0gTm9uZSwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9tZXNzYWdlKAogICAgICAgIG1lc3NhZ2UKICAgICk6CiAgICAgICAgYXdhaXQgc3RhdGUuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRhdGEgPSBhd2FpdCBzdGF0ZS5nZXRfZGF0YSgpCgogICAgcHJvZHVjdF9pZCA9IHN0cigKICAgICAgICBkYXRhLmdldCgKICAgICAgICAgICAgImFkbWluX3Byb2R1Y3RfaWQiLAogICAgICAgICAgICAiIiwKICAgICAgICApCiAgICAgICAgb3IgIiIKICAgICkKCiAgICBsYWJlbCA9IHN0cigKICAgICAgICBkYXRhLmdldCgKICAgICAgICAgICAgImFkbWluX3Byb2R1Y3RfbGFiZWwiLAogICAgICAgICAgICBwcm9kdWN0X2lkLAogICAgICAgICkKICAgICkKCiAgICBjYXRlZ29yeSA9IHN0cigKICAgICAgICBkYXRhLmdldCgKICAgICAgICAgICAgImFkbWluX3Byb2R1Y3RfY2F0ZWdvcnkiLAogICAgICAgICAgICAic3RhcnMiLAogICAgICAgICkKICAgICkKCiAgICBpZiBwcm9kdWN0X2lkIG5vdCBpbiBQUk9EVUNUX0xBQkVMUzoKICAgICAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCgogICAgICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICAgICAi4p2MINmG2LTYs9iqINiq2YbYuNuM2YUg2YLbjNmF2Kog2YXYudiq2KjYsSDZhtuM2LPYqi4iLAogICAgICAgICAgICByZXBseV9tYXJrdXA9Z2V0X2FkbWluX21haW5fbWVudSgpLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICByYXcgPSAoCiAgICAgICAgbWVzc2FnZS50ZXh0CiAgICAgICAgb3IgIiIKICAgICkuc3RyaXAoKQoKICAgIGNsZWFuZWQgPSAoCiAgICAgICAgcmF3CiAgICAgICAgLnJlcGxhY2UoItmsIiwgIiIpCiAgICAgICAgLnJlcGxhY2UoIl8iLCAiIikKICAgICAgICAucmVwbGFjZSgiICIsICIiKQogICAgICAgIC5yZXBsYWNlKCLZqyIsICIuIikKICAgICAgICAucmVwbGFjZSgiLCIsICIuIikKICAgICkKCiAgICB0cnk6CiAgICAgICAgdmFsdWUgPSBEZWNpbWFsKAogICAgICAgICAgICBjbGVhbmVkCiAgICAgICAgKQoKICAgIGV4Y2VwdCAoCiAgICAgICAgSW52YWxpZE9wZXJhdGlvbiwKICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgVmFsdWVFcnJvciwKICAgICk6CiAgICAgICAgYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgICAgICLinYwg2YLbjNmF2Kog2YXYudiq2KjYsSDZhtuM2LPYqi4g2YXYq9in2YQ6IDEyINuM2KcgMC4wMiIKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgaWYgKAogICAgICAgIG5vdCB2YWx1ZS5pc19maW5pdGUoKQogICAgICAgIG9yIHZhbHVlIDw9IDAKICAgICk6CiAgICAgICAgYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgICAgICLinYwg2YLbjNmF2Kog2KjYp9uM2K8g2KjYstix2q/igIzYqtixINin2LIg2LXZgdixINio2KfYtNivLiIKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgc2VydmljZSA9IF9wcm9kdWN0X3NlcnZpY2UoCiAgICAgICAgZGIKICAgICkKCiAgICB0cnk6CiAgICAgICAgc3RvcmVkID0gYXdhaXQgc2VydmljZS5zZXRfYmFzZV91c2R0KAogICAgICAgICAgICBwcm9kdWN0X2lkLAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgdXBkYXRlZF9ieT0oCiAgICAgICAgICAgICAgICBtZXNzYWdlLmZyb21fdXNlci5pZAogICAgICAgICAgICAgICAgaWYgbWVzc2FnZS5mcm9tX3VzZXIKICAgICAgICAgICAgICAgIGVsc2UgTm9uZQogICAgICAgICAgICApLAogICAgICAgICkKCiAgICBleGNlcHQgSW52YWxpZFByb2R1Y3RQcmljZToKICAgICAgICBhd2FpdCBtZXNzYWdlLmFuc3dlcigKICAgICAgICAgICAgIuKdjCDZgtuM2YXYqiDZiNin2LHYr9i02K/ZhyDZhdi52KrYqNixINmG24zYs9iqLiIKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgIHRleHRfdmFsdWUsIGtleWJvYXJkID0gYXdhaXQgX3Byb2R1Y3RfcHJpY2VzX3ZpZXcoCiAgICAgICAgY2F0ZWdvcnksCiAgICAgICAgZGIsCiAgICApCgogICAgYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgKAogICAgICAgICAgICAi4pyFIDxiPtmC24zZhdiqINmF2K3YtdmI2YQg2LDYrtuM2LHZhyDYtNivLjwvYj5cblxuIgogICAgICAgICAgICBmIntlc2NhcGUobGFiZWwpfTogIgogICAgICAgICAgICBmIjxjb2RlPntlc2NhcGUoX2Zvcm1hdF91c2R0KHN0b3JlZCkpfSBVU0RUPC9jb2RlPlxuXG4iCiAgICAgICAgICAgICsgdGV4dF92YWx1ZQogICAgICAgICksCiAgICAgICAgcmVwbHlfbWFya3VwPWtleWJvYXJkLAogICAgICAgIHBhcnNlX21vZGU9IkhUTUwiLAogICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgVXNlcnMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmFzeW5jIGRlZiBfdXNlcl9kZXRhaWxzX3RleHQoCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAogICAgdXNlcl9pZDogaW50LAopIC0+IHR1cGxlW3N0ciwgT3B0aW9uYWxbZGljdFtzdHIsIEFueV1dXToKICAgIHVzZXIgPSBhd2FpdCBkYi5nZXRfdXNlcigKICAgICAgICB1c2VyX2lkCiAgICApCgogICAgaWYgbm90IHVzZXI6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgIuKdjCDaqdin2LHYqNixINm+24zYr9inINmG2LTYry4iLAogICAgICAgICAgICBOb25lLAogICAgICAgICkKCiAgICB1c2VybmFtZSA9ICgKICAgICAgICBmIkB7dXNlci5nZXQoJ3VzZXJuYW1lJyl9IgogICAgICAgIGlmIHVzZXIuZ2V0KAogICAgICAgICAgICAidXNlcm5hbWUiCiAgICAgICAgKQogICAgICAgIGVsc2UgItmG2K/Yp9ix2K8iCiAgICApCgogICAgdGV4dCA9ICgKICAgICAgICAi8J+RpCA8Yj7Zvtix2YjZgdin24zZhCDZhdiv24zYsduM2KrbjCDaqdin2LHYqNixPC9iPlxuIgogICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgoKICAgICAgICBmIklEOiA8Y29kZT57dXNlcl9pZH08L2NvZGU+XG4iCiAgICAgICAgZiJVc2VybmFtZTogPGNvZGU+e2VzY2FwZSh1c2VybmFtZSl9PC9jb2RlPlxuIgogICAgICAgIGYi2YbYp9mFOiA8Yj57ZXNjYXBlKHN0cih1c2VyLmdldCgnZnVsbF9uYW1lJykgb3IgJ+KAlCcpKX08L2I+XG5cbiIKCiAgICAgICAgZiLwn5KwINiq2YjZhdin2YY6IDxjb2RlPntfZm10X2ludCh1c2VyLmdldCgnYmFsYW5jZV90b21hbicpKX08L2NvZGU+XG4iCiAgICAgICAgZiLwn5S3IFRPTjogPGNvZGU+e2VzY2FwZShzdHIodXNlci5nZXQoJ2JhbGFuY2VfdG9uJykgb3IgMCkpfTwvY29kZT5cbiIKICAgICAgICBmIvCfkrUgVVNEVDogPGNvZGU+e2VzY2FwZShzdHIodXNlci5nZXQoJ2JhbGFuY2VfdXNkdCcpIG9yIDApKX08L2NvZGU+XG5cbiIKCiAgICAgICAgZiLwn5qrINmF2LPYr9mI2K86IDxiPnsn2KjZhNmHJyBpZiB1c2VyLmdldCgnaXNfYmFubmVkJykgZWxzZSAn2K7bjNixJ308L2I+XG4iCiAgICAgICAgZiLwn5uhIEtZQzogPGI+e2VzY2FwZShzdHIodXNlci5nZXQoJ2t5Y19zdGF0dXMnKSBvciAnbm9uZScpKX08L2I+XG4iCiAgICAgICAgZiLwn46WINiz2LfYrTogPGI+e2VzY2FwZShzdHIodXNlci5nZXQoJ3VzZXJfdGllcicpIG9yICdzdGFuZGFyZCcpKX08L2I+IgogICAgKQoKICAgIHJldHVybiAoCiAgICAgICAgdGV4dCwKICAgICAgICB1c2VyLAogICAgKQoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuaW5fKAogICAgICAgIHsKICAgICAgICAgICAgImFkbWluX3NlYXJjaF91c2VyIiwKICAgICAgICAgICAgImFkbWluX3VzZXJzX2xpc3QiLAogICAgICAgIH0KICAgICkKKQphc3luYyBkZWYgYWRtaW5fdXNlcnNfZW50cnkoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAogICAgZGI6IERhdGFiYXNlTWFuYWdlciwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9jYWxsYmFjaygKICAgICAgICBjYWxsYmFjawogICAgKToKICAgICAgICByZXR1cm4KCiAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCgogICAgaWYgY2FsbGJhY2suZGF0YSA9PSAiYWRtaW5fdXNlcnNfbGlzdCI6CiAgICAgICAgdXNlcnMgPSBhd2FpdCBkYi5nZXRfYWxsX3VzZXJzKAogICAgICAgICAgICBsaW1pdD0yMAogICAgICAgICkKCiAgICAgICAgaWYgdXNlcnM6CiAgICAgICAgICAgIGxpbmVzID0gW10KCiAgICAgICAgICAgIGZvciB1c2VyIGluIHVzZXJzOgogICAgICAgICAgICAgICAgdWlkID0gaW50KAogICAgICAgICAgICAgICAgICAgIHVzZXIuZ2V0KAogICAgICAgICAgICAgICAgICAgICAgICAidXNlcl9pZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIG9yIDAKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICB1c2VybmFtZSA9ICgKICAgICAgICAgICAgICAgICAgICBmIkB7dXNlci5nZXQoJ3VzZXJuYW1lJyl9IgogICAgICAgICAgICAgICAgICAgIGlmIHVzZXIuZ2V0KAogICAgICAgICAgICAgICAgICAgICAgICAidXNlcm5hbWUiCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGVsc2UgIuKAlCIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgZiLigKIgPGNvZGU+e3VpZH08L2NvZGU+IHwgIgogICAgICAgICAgICAgICAgICAgIGYie2VzY2FwZSh1c2VybmFtZSl9IHwgIgogICAgICAgICAgICAgICAgICAgIGYieyfwn5qrJyBpZiB1c2VyLmdldCgnaXNfYmFubmVkJykgZWxzZSAn4pyFJ30iCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICB0ZXh0ID0gKAogICAgICAgICAgICAgICAgIvCfkaUgPGI+2KLYrtix24zZhiDaqdin2LHYqNix2KfZhjwvYj5cbiIKICAgICAgICAgICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgogICAgICAgICAgICAgICAgKyAiXG4iLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgbGluZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICsgIlxuXG7YqNix2KfbjCDZhdiv24zYsduM2Kog2K/ZgtuM2YLYjCDYr9qp2YXZhyDYrNiz2KrYrNmIINix2Kcg2KjYstmG24zYryDbjNinICIKICAgICAgICAgICAgICAgICI8Y29kZT4vYWRtaW48L2NvZGU+INix2Kcg2KjYp9iyINqp2YbbjNivLiIKICAgICAgICAgICAgKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICB0ZXh0ID0gItmH24zahiDaqdin2LHYqNix24wg2KvYqNiqINmG2LTYr9mHINin2LPYqi4iCgogICAgICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICB0ZXh0LAogICAgICAgICAgICBfYmFja19hZG1pbl9rZXlib2FyZCgpLAogICAgICAgICkKCiAgICAgICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjawogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBhd2FpdCBzdGF0ZS5zZXRfc3RhdGUoCiAgICAgICAgQWRtaW5BY3Rpb25TdGF0ZXMud2FpdGluZ191c2VyX3NlYXJjaAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgKAogICAgICAgICAgICAi8J+UjiA8Yj7YrNiz2KrYrNmI24wg2qnYp9ix2KjYsTwvYj5cbiIKICAgICAgICAgICAgIuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgVxuXG4iCiAgICAgICAgICAgICJUZWxlZ3JhbSBVc2VyIElEINuM2KcgVXNlcm5hbWUg2LHYpyDYp9ix2LPYp9mEINqp2YbbjNivLlxuXG4iCiAgICAgICAgICAgICLZhdir2KfZhDpcbiIKICAgICAgICAgICAgIjxjb2RlPjEyMzQ1Njc4OTwvY29kZT5cbiIKICAgICAgICAgICAgIjxjb2RlPkB1c2VybmFtZTwvY29kZT4iCiAgICAgICAgKSwKICAgICAgICBfYmFja19hZG1pbl9rZXlib2FyZCgpLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCkByb3V0ZXIubWVzc2FnZSgKICAgIEFkbWluQWN0aW9uU3RhdGVzLndhaXRpbmdfdXNlcl9zZWFyY2gsCiAgICBGLnRleHQsCikKYXN5bmMgZGVmIGFkbWluX3VzZXJfc2VhcmNoX21lc3NhZ2UoCiAgICBtZXNzYWdlOiBNZXNzYWdlLAogICAgc3RhdGU6IEZTTUNvbnRleHQsCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX21lc3NhZ2UoCiAgICAgICAgbWVzc2FnZQogICAgKToKICAgICAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCiAgICAgICAgcmV0dXJuCgogICAgcmF3ID0gKAogICAgICAgIG1lc3NhZ2UudGV4dAogICAgICAgIG9yICIiCiAgICApLnN0cmlwKCkKCiAgICB1c2VyOiBPcHRpb25hbFsKICAgICAgICBkaWN0W3N0ciwgQW55XQogICAgXSA9IE5vbmUKCiAgICBpZiByYXcuaXNkaWdpdCgpOgogICAgICAgIHVzZXIgPSBhd2FpdCBkYi5nZXRfdXNlcigKICAgICAgICAgICAgaW50KHJhdykKICAgICAgICApCgogICAgZWxzZToKICAgICAgICB1c2VybmFtZSA9ICgKICAgICAgICAgICAgcmF3LmxzdHJpcCgiQCIpCiAgICAgICAgICAgIC5zdHJpcCgpCiAgICAgICAgICAgIC5sb3dlcigpCiAgICAgICAgKQoKICAgICAgICB1c2VycyA9IGF3YWl0IGRiLmdldF9hbGxfdXNlcnMoCiAgICAgICAgICAgIGxpbWl0PTEwMDAKICAgICAgICApCgogICAgICAgIGZvciBpdGVtIGluIHVzZXJzOgogICAgICAgICAgICBjdXJyZW50ID0gc3RyKAogICAgICAgICAgICAgICAgaXRlbS5nZXQoCiAgICAgICAgICAgICAgICAgICAgInVzZXJuYW1lIiwKICAgICAgICAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG9yICIiCiAgICAgICAgICAgICkubG93ZXIoKQoKICAgICAgICAgICAgaWYgY3VycmVudCA9PSB1c2VybmFtZToKICAgICAgICAgICAgICAgIHVzZXIgPSBpdGVtCiAgICAgICAgICAgICAgICBicmVhawoKICAgIGlmIG5vdCB1c2VyOgogICAgICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICAgICAi4p2MINqp2KfYsdio2LEg2b7bjNiv2Kcg2YbYtNivLiDYr9mI2KjYp9ix2YcgSUQg24zYpyBVc2VybmFtZSDYsdinINio2YHYsdiz2KouIgogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCgogICAgdXNlcl9pZCA9IGludCgKICAgICAgICB1c2VyWwogICAgICAgICAgICAidXNlcl9pZCIKICAgICAgICBdCiAgICApCgogICAgdGV4dCwgXyA9IGF3YWl0IF91c2VyX2RldGFpbHNfdGV4dCgKICAgICAgICBkYiwKICAgICAgICB1c2VyX2lkLAogICAgKQoKICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgIHRleHQsCiAgICAgICAgcmVwbHlfbWFya3VwPWdldF9hZG1pbl91c2VyX21hbmFnZV9rZXlib2FyZCgKICAgICAgICAgICAgdXNlcl9pZD11c2VyX2lkLAogICAgICAgICAgICBpc19ibG9ja2VkPWJvb2woCiAgICAgICAgICAgICAgICB1c2VyLmdldCgKICAgICAgICAgICAgICAgICAgICAiaXNfYmFubmVkIgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApLAogICAgICAgICAgICBpc19hZG1pbj1ib29sKAogICAgICAgICAgICAgICAgdXNlci5nZXQoCiAgICAgICAgICAgICAgICAgICAgImlzX2FkbWluIgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApLAogICAgICAgICksCiAgICAgICAgcGFyc2VfbW9kZT0iSFRNTCIsCiAgICApCgoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YS5zdGFydHN3aXRoKAogICAgICAgICJhZG1pbl91c2VyX3ZpZXdfIgogICAgKQopCmFzeW5jIGRlZiBhZG1pbl91c2VyX3ZpZXcoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIGRiOiBEYXRhYmFzZU1hbmFnZXIsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgICAgIChjYWxsYmFjay5kYXRhIG9yICIiKQogICAgICAgICAgICAucnNwbGl0KCJfIiwgMSlbLTFdCiAgICAgICAgKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIklEINmG2KfZhdi52KrYqNixINin2LPYqi4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIHRleHQsIHVzZXIgPSBhd2FpdCBfdXNlcl9kZXRhaWxzX3RleHQoCiAgICAgICAgZGIsCiAgICAgICAgdXNlcl9pZCwKICAgICkKCiAgICBrZXlib2FyZCA9ICgKICAgICAgICBnZXRfYWRtaW5fdXNlcl9tYW5hZ2Vfa2V5Ym9hcmQoCiAgICAgICAgICAgIHVzZXJfaWQ9dXNlcl9pZCwKICAgICAgICAgICAgaXNfYmxvY2tlZD1ib29sKAogICAgICAgICAgICAgICAgdXNlci5nZXQoCiAgICAgICAgICAgICAgICAgICAgImlzX2Jhbm5lZCIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKSwKICAgICAgICAgICAgaXNfYWRtaW49Ym9vbCgKICAgICAgICAgICAgICAgIHVzZXIuZ2V0KAogICAgICAgICAgICAgICAgICAgICJpc19hZG1pbiIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKSwKICAgICAgICApCiAgICAgICAgaWYgdXNlcgogICAgICAgIGVsc2UgX2JhY2tfYWRtaW5fa2V5Ym9hcmQoKQogICAgKQoKICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgdGV4dCwKICAgICAgICBrZXlib2FyZCwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhLnN0YXJ0c3dpdGgoImFkbWluX2Jsb2NrXyIpCikKYXN5bmMgZGVmIGFkbWluX2Jsb2NrX3VzZXIoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIGRiOiBEYXRhYmFzZU1hbmFnZXIsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgICAgIChjYWxsYmFjay5kYXRhIG9yICIiKQogICAgICAgICAgICAucnNwbGl0KCJfIiwgMSlbLTFdCiAgICAgICAgKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIklEINmG2KfZhdi52KrYqNixINin2LPYqi4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGlmIF9pc19hZG1pbigKICAgICAgICB1c2VyX2lkCiAgICApOgogICAgICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICLYp9iv2YXbjNmGINiq2YbYuNuM2YXigIzYtNiv2Ycg2K/YsSBDb25maWcg2LHYpyDYp9iyINin24zZhiDYqNiu2LQg2YbZhduM4oCM2KrZiNin2YYg2YXYs9iv2YjYryDaqdix2K8uIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBzdWNjZXNzID0gYXdhaXQgZGIuc2V0X3VzZXJfYmFuX3N0YXR1cygKICAgICAgICB1c2VyX2lkLAogICAgICAgIFRydWUsCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgIuKchSDaqdin2LHYqNixINmF2LPYr9mI2K8g2LTYry4iCiAgICAgICAgICAgIGlmIHN1Y2Nlc3MKICAgICAgICAgICAgZWxzZSAi4p2MINi52YXZhNuM2KfYqiDZhtin2YXZiNmB2YIg2KjZiNivLiIKICAgICAgICApLAogICAgICAgIHNob3dfYWxlcnQ9bm90IHN1Y2Nlc3MsCiAgICApCgogICAgaWYgc3VjY2VzczoKICAgICAgICB0ZXh0LCB1c2VyID0gYXdhaXQgX3VzZXJfZGV0YWlsc190ZXh0KAogICAgICAgICAgICBkYiwKICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICApCgogICAgICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICB0ZXh0LAogICAgICAgICAgICBnZXRfYWRtaW5fdXNlcl9tYW5hZ2Vfa2V5Ym9hcmQoCiAgICAgICAgICAgICAgICB1c2VyX2lkPXVzZXJfaWQsCiAgICAgICAgICAgICAgICBpc19ibG9ja2VkPVRydWUsCiAgICAgICAgICAgICAgICBpc19hZG1pbj1ib29sKAogICAgICAgICAgICAgICAgICAgICh1c2VyIG9yIHt9KS5nZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICJpc19hZG1pbiIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLAogICAgICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhLnN0YXJ0c3dpdGgoImFkbWluX3VuYmxvY2tfIikKKQphc3luYyBkZWYgYWRtaW5fdW5ibG9ja191c2VyKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIHRyeToKICAgICAgICB1c2VyX2lkID0gaW50KAogICAgICAgICAgICAoY2FsbGJhY2suZGF0YSBvciAiIikKICAgICAgICAgICAgLnJzcGxpdCgiXyIsIDEpWy0xXQogICAgICAgICkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICJJRCDZhtin2YXYudiq2KjYsSDYp9iz2KouIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBzdWNjZXNzID0gYXdhaXQgZGIuc2V0X3VzZXJfYmFuX3N0YXR1cygKICAgICAgICB1c2VyX2lkLAogICAgICAgIEZhbHNlLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjaywKICAgICAgICAoCiAgICAgICAgICAgICLinIUg2YXYs9iv2YjYr9uMINio2LHYr9in2LTYqtmHINi02K8uIgogICAgICAgICAgICBpZiBzdWNjZXNzCiAgICAgICAgICAgIGVsc2UgIuKdjCDYudmF2YTbjNin2Kog2YbYp9mF2YjZgdmCINio2YjYry4iCiAgICAgICAgKSwKICAgICAgICBzaG93X2FsZXJ0PW5vdCBzdWNjZXNzLAogICAgKQoKICAgIGlmIHN1Y2Nlc3M6CiAgICAgICAgdGV4dCwgdXNlciA9IGF3YWl0IF91c2VyX2RldGFpbHNfdGV4dCgKICAgICAgICAgICAgZGIsCiAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgKQoKICAgICAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgdGV4dCwKICAgICAgICAgICAgZ2V0X2FkbWluX3VzZXJfbWFuYWdlX2tleWJvYXJkKAogICAgICAgICAgICAgICAgdXNlcl9pZD11c2VyX2lkLAogICAgICAgICAgICAgICAgaXNfYmxvY2tlZD1GYWxzZSwKICAgICAgICAgICAgICAgIGlzX2FkbWluPWJvb2woCiAgICAgICAgICAgICAgICAgICAgKHVzZXIgb3Ige30pLmdldCgKICAgICAgICAgICAgICAgICAgICAgICAgImlzX2FkbWluIgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICksCiAgICAgICAgKQoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuc3RhcnRzd2l0aCgiYWRtaW5fcHJvbW90ZV8iKQogICAgfCBGLmRhdGEuc3RhcnRzd2l0aCgiYWRtaW5fZGVtb3RlXyIpCikKYXN5bmMgZGVmIGFkbWluX3JvbGVfY29uZmlnX25vdGljZSgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjaywKICAgICAgICAoCiAgICAgICAgICAgICLihLnvuI8g2K/Ys9iq2LHYs9uMINmF2K/bjNixINin2LIgQURNSU5fSURTINiv2LEgQ29uZmlnINmF2K/bjNix24zYqiDZhduM4oCM2LTZiNiv2JsgIgogICAgICAgICAgICAi2KjYsdin24wg2KfZhdmG24zYqiDYp9iyINiv24zYqtin2KjbjNizINio2YfigIzYtdmI2LHYqiDZvtmI24zYpyDYqti624zbjNixINiv2KfYr9mHINmG2YXbjOKAjNi02YjYry4iCiAgICAgICAgKSwKICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICApCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXYWxsZXQgbWFuYWdlbWVudAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQHJvdXRlci5jYWxsYmFja19xdWVyeShGLmRhdGEgPT0gImFkbWluX3dhbGxldF9hZGp1c3QiKQphc3luYyBkZWYgYWRtaW5fd2FsbGV0X2FkanVzdCgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgc3RhdGU6IEZTTUNvbnRleHQsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgc3RhdGUuc2V0X3N0YXRlKAogICAgICAgIEFkbWluQWN0aW9uU3RhdGVzLndhaXRpbmdfd2FsbGV0X3VzZXIKICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgIvCfkrAgPGI+2KrYutuM24zYsSDYr9iz2KrbjCDZhdmI2KzZiNiv24w8L2I+XG4iCiAgICAgICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgogICAgICAgICAgICAiVGVsZWdyYW0gVXNlciBJRCDaqdin2LHYqNixINix2Kcg2KfYsdiz2KfZhCDaqdmG24zYry4iCiAgICAgICAgKSwKICAgICAgICBfYmFja19hZG1pbl9rZXlib2FyZCgpLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCkByb3V0ZXIubWVzc2FnZSgKICAgIEFkbWluQWN0aW9uU3RhdGVzLndhaXRpbmdfd2FsbGV0X3VzZXIsCiAgICBGLnRleHQsCikKYXN5bmMgZGVmIGFkbWluX3dhbGxldF91c2VyX21lc3NhZ2UoCiAgICBtZXNzYWdlOiBNZXNzYWdlLAogICAgc3RhdGU6IEZTTUNvbnRleHQsCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX21lc3NhZ2UoCiAgICAgICAgbWVzc2FnZQogICAgKToKICAgICAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCiAgICAgICAgcmV0dXJuCgogICAgcmF3ID0gKAogICAgICAgIG1lc3NhZ2UudGV4dAogICAgICAgIG9yICIiCiAgICApLnN0cmlwKCkKCiAgICBpZiBub3QgcmF3LmlzZGlnaXQoKToKICAgICAgICBhd2FpdCBtZXNzYWdlLmFuc3dlcigKICAgICAgICAgICAgIuKdjCDZgdmC2LcgVXNlciBJRCDYudiv2K/bjCDYp9ix2LPYp9mEINqp2YbbjNivLiIKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgdXNlcl9pZCA9IGludCgKICAgICAgICByYXcKICAgICkKCiAgICB1c2VyID0gYXdhaXQgZGIuZ2V0X3VzZXIoCiAgICAgICAgdXNlcl9pZAogICAgKQoKICAgIGlmIG5vdCB1c2VyOgogICAgICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICAgICAi4p2MINqp2KfYsdio2LEg2b7bjNiv2Kcg2YbYtNivLiIKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICgKICAgICAgICAgICAgIvCfkrAgPGI+2YXYr9uM2LHbjNiqINmF2YjYrNmI2K/bjDwvYj5cblxuIgogICAgICAgICAgICBmItqp2KfYsdio2LE6IDxjb2RlPnt1c2VyX2lkfTwvY29kZT5cbiIKICAgICAgICAgICAgZiLZhdmI2KzZiNiv24w6IDxjb2RlPntfZm10X2ludCh1c2VyLmdldCgnYmFsYW5jZV90b21hbicpKX08L2NvZGU+INiq2YjZhdin2YYiCiAgICAgICAgKSwKICAgICAgICByZXBseV9tYXJrdXA9Z2V0X2FkbWluX3dhbGxldF9hZGp1c3Rfa2V5Ym9hcmQoCiAgICAgICAgICAgIHVzZXJfaWQKICAgICAgICApLAogICAgICAgIHBhcnNlX21vZGU9IkhUTUwiLAogICAgKQoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuc3RhcnRzd2l0aCgiYWRtaW5fZWRpdF93YWxsZXRfIikKKQphc3luYyBkZWYgYWRtaW5fZWRpdF93YWxsZXQoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIGRiOiBEYXRhYmFzZU1hbmFnZXIsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgICAgIChjYWxsYmFjay5kYXRhIG9yICIiKQogICAgICAgICAgICAucnNwbGl0KCJfIiwgMSlbLTFdCiAgICAgICAgKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIklEINmG2KfZhdi52KrYqNixINin2LPYqi4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIHVzZXIgPSBhd2FpdCBkYi5nZXRfdXNlcigKICAgICAgICB1c2VyX2lkCiAgICApCgogICAgaWYgbm90IHVzZXI6CiAgICAgICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgItqp2KfYsdio2LEg2b7bjNiv2Kcg2YbYtNivLiIsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgX3NhZmVfZWRpdCgKICAgICAgICBjYWxsYmFjaywKICAgICAgICAoCiAgICAgICAgICAgICLwn5KwIDxiPtmF2K/bjNix24zYqiDZhdmI2KzZiNiv24w8L2I+XG5cbiIKICAgICAgICAgICAgZiLaqdin2LHYqNixOiA8Y29kZT57dXNlcl9pZH08L2NvZGU+XG4iCiAgICAgICAgICAgIGYi2YXZiNis2YjYr9uMOiA8Y29kZT57X2ZtdF9pbnQodXNlci5nZXQoJ2JhbGFuY2VfdG9tYW4nKSl9PC9jb2RlPiDYqtmI2YXYp9mGIgogICAgICAgICksCiAgICAgICAgZ2V0X2FkbWluX3dhbGxldF9hZGp1c3Rfa2V5Ym9hcmQoCiAgICAgICAgICAgIHVzZXJfaWQKICAgICAgICApLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuc3RhcnRzd2l0aCgiYWRtaW5fd2FsbGV0X3ZpZXdfIikKKQphc3luYyBkZWYgYWRtaW5fd2FsbGV0X3ZpZXcoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIGRiOiBEYXRhYmFzZU1hbmFnZXIsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgICAgIChjYWxsYmFjay5kYXRhIG9yICIiKQogICAgICAgICAgICAucnNwbGl0KCJfIiwgMSlbLTFdCiAgICAgICAgKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmV0dXJuCgogICAgYmFsYW5jZSA9IGF3YWl0IGRiLmdldF9iYWxhbmNlKAogICAgICAgIHVzZXJfaWQKICAgICkKCiAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgZiLZhdmI2KzZiNiv24w6IHtiYWxhbmNlOix9INiq2YjZhdin2YYiLAogICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhLnN0YXJ0c3dpdGgoImFkbWluX3dhbGxldF9hZGRfIikKICAgIHwgRi5kYXRhLnN0YXJ0c3dpdGgoImFkbWluX3dhbGxldF9yZW1vdmVfIikKKQphc3luYyBkZWYgYWRtaW5fd2FsbGV0X2Ftb3VudF9wcm9tcHQoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIGRhdGEgPSAoCiAgICAgICAgY2FsbGJhY2suZGF0YQogICAgICAgIG9yICIiCiAgICApCgogICAgbW9kZSA9ICgKICAgICAgICAiYWRkIgogICAgICAgIGlmIGRhdGEuc3RhcnRzd2l0aCgKICAgICAgICAgICAgImFkbWluX3dhbGxldF9hZGRfIgogICAgICAgICkKICAgICAgICBlbHNlICJyZW1vdmUiCiAgICApCgogICAgdHJ5OgogICAgICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgICAgIGRhdGEucnNwbGl0KAogICAgICAgICAgICAgICAgIl8iLAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgKVstMV0KICAgICAgICApCgogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIklEINmG2KfZhdi52KrYqNixINin2LPYqi4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHN0YXRlLnNldF9zdGF0ZSgKICAgICAgICBBZG1pbkFjdGlvblN0YXRlcy53YWl0aW5nX3dhbGxldF9hbW91bnQKICAgICkKCiAgICBhd2FpdCBzdGF0ZS51cGRhdGVfZGF0YSgKICAgICAgICB3YWxsZXRfdXNlcl9pZD11c2VyX2lkLAogICAgICAgIHdhbGxldF9tb2RlPW1vZGUsCiAgICApCgogICAgYWN0aW9uID0gKAogICAgICAgICLYp9mB2LLYp9uM2LQiCiAgICAgICAgaWYgbW9kZSA9PSAiYWRkIgogICAgICAgIGVsc2UgItqp2KfZh9i0IgogICAgKQoKICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgKAogICAgICAgICAgICBmIvCfkrAgPGI+e2FjdGlvbn0g2YXZiNis2YjYr9uMPC9iPlxuXG4iCiAgICAgICAgICAgIGYi2qnYp9ix2KjYsTogPGNvZGU+e3VzZXJfaWR9PC9jb2RlPlxuXG4iCiAgICAgICAgICAgICLZhdio2YTYuiDYsdinINio2Ycg2KrZiNmF2KfZhiDYp9ix2LPYp9mEINqp2YbbjNivLiIKICAgICAgICApLAogICAgICAgIF9iYWNrX2FkbWluX2tleWJvYXJkKCksCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKQHJvdXRlci5tZXNzYWdlKAogICAgQWRtaW5BY3Rpb25TdGF0ZXMud2FpdGluZ193YWxsZXRfYW1vdW50LAogICAgRi50ZXh0LAopCmFzeW5jIGRlZiBhZG1pbl93YWxsZXRfYW1vdW50X21lc3NhZ2UoCiAgICBtZXNzYWdlOiBNZXNzYWdlLAogICAgc3RhdGU6IEZTTUNvbnRleHQsCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX21lc3NhZ2UoCiAgICAgICAgbWVzc2FnZQogICAgKToKICAgICAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCiAgICAgICAgcmV0dXJuCgogICAgYW1vdW50ID0gX3BhcnNlX3Bvc2l0aXZlX2ludCgKICAgICAgICBtZXNzYWdlLnRleHQgb3IgIiIKICAgICkKCiAgICBpZiBhbW91bnQgaXMgTm9uZToKICAgICAgICBhd2FpdCBtZXNzYWdlLmFuc3dlcigKICAgICAgICAgICAgIuKdjCDZhdio2YTYuiDZhdi52KrYqNixINmG24zYs9iqLiIKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgZGF0YSA9IGF3YWl0IHN0YXRlLmdldF9kYXRhKCkKCiAgICB1c2VyX2lkID0gaW50KAogICAgICAgIGRhdGEuZ2V0KAogICAgICAgICAgICAid2FsbGV0X3VzZXJfaWQiLAogICAgICAgICAgICAwLAogICAgICAgICkKICAgICAgICBvciAwCiAgICApCgogICAgbW9kZSA9IGRhdGEuZ2V0KAogICAgICAgICJ3YWxsZXRfbW9kZSIKICAgICkKCiAgICBpZiAoCiAgICAgICAgdXNlcl9pZCA8PSAwCiAgICAgICAgb3IgbW9kZSBub3QgaW4gewogICAgICAgICAgICAiYWRkIiwKICAgICAgICAgICAgInJlbW92ZSIsCiAgICAgICAgfQogICAgKToKICAgICAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCiAgICAgICAgYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgICAgICLinYwg2YbYtNiz2Kog2YXYr9uM2LHbjNiqINmF2YjYrNmI2K/bjCDZhtin2YXYudiq2KjYsSDYp9iz2KouIgogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBhZG1pbl9pZCA9ICgKICAgICAgICBtZXNzYWdlLmZyb21fdXNlci5pZAogICAgICAgIGlmIG1lc3NhZ2UuZnJvbV91c2VyCiAgICAgICAgZWxzZSAwCiAgICApCgogICAgcmVmZXJlbmNlID0gKAogICAgICAgIGYiYWRtaW46e2FkbWluX2lkfTp7dXNlcl9pZH06IgogICAgICAgIGYie21vZGV9Ont0aW1lLnRpbWVfbnMoKX0iCiAgICApCgogICAgaWYgbW9kZSA9PSAiYWRkIjoKICAgICAgICBzdWNjZXNzID0gYXdhaXQgZGIuaW5jcmVhc2VfdXNlcl9iYWxhbmNlKAogICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICBhbW91bnQsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSgKICAgICAgICAgICAgICAgIGYiQWRtaW4gY3JlZGl0IGJ5IHthZG1pbl9pZH0iCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHJlZmVyZW5jZV9pZD1yZWZlcmVuY2UsCiAgICAgICAgKQoKICAgIGVsc2U6CiAgICAgICAgc3VjY2VzcyA9IGF3YWl0IGRiLmRlY3JlYXNlX3VzZXJfYmFsYW5jZSgKICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgYW1vdW50LAogICAgICAgICAgICBkZXNjcmlwdGlvbj0oCiAgICAgICAgICAgICAgICBmIkFkbWluIGRlYml0IGJ5IHthZG1pbl9pZH0iCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHJlZmVyZW5jZV9pZD1yZWZlcmVuY2UsCiAgICAgICAgKQoKICAgIGlmIG5vdCBzdWNjZXNzOgogICAgICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAi4p2MINi52YXZhNuM2KfYqiDYp9mG2KzYp9mFINmG2LTYry4gIgogICAgICAgICAgICAgICAgItio2LHYp9uMINqp2KfZh9i0INmF2YjYrNmI2K/bjNiMINmF2YjYrNmI2K/bjCDaqdin2LHYqNixINix2Kcg2YfZhSDYqNix2LHYs9uMINqp2YYuIgogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKCiAgICBiYWxhbmNlID0gYXdhaXQgZGIuZ2V0X2JhbGFuY2UoCiAgICAgICAgdXNlcl9pZAogICAgKQoKICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICgKICAgICAgICAgICAgIuKchSA8Yj7ZhdmI2KzZiNiv24wg2KjYsdmI2LLYsdiz2KfZhtuMINi02K8uPC9iPlxuXG4iCiAgICAgICAgICAgIGYi2qnYp9ix2KjYsTogPGNvZGU+e3VzZXJfaWR9PC9jb2RlPlxuIgogICAgICAgICAgICBmItmF2YjYrNmI2K/bjCDYrNiv24zYrzogPGNvZGU+e2JhbGFuY2U6LH08L2NvZGU+INiq2YjZhdin2YYiCiAgICAgICAgKSwKICAgICAgICByZXBseV9tYXJrdXA9Z2V0X2FkbWluX3dhbGxldF9hZGp1c3Rfa2V5Ym9hcmQoCiAgICAgICAgICAgIHVzZXJfaWQKICAgICAgICApLAogICAgICAgIHBhcnNlX21vZGU9IkhUTUwiLAogICAgKQoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuc3RhcnRzd2l0aCgiYWRtaW5fdXNlcl9oaXN0b3J5XyIpCiAgICB8IEYuZGF0YS5zdGFydHN3aXRoKCJhZG1pbl93YWxsZXRfaGlzdG9yeV8iKQopCmFzeW5jIGRlZiBhZG1pbl91c2VyX2hpc3RvcnkoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIGRiOiBEYXRhYmFzZU1hbmFnZXIsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgICAgIChjYWxsYmFjay5kYXRhIG9yICIiKQogICAgICAgICAgICAucnNwbGl0KCJfIiwgMSlbLTFdCiAgICAgICAgKQoKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHJldHVybgoKICAgIHR4cyA9IGF3YWl0IGRiLmdldF93YWxsZXRfdHJhbnNhY3Rpb25zKAogICAgICAgIHVzZXJfaWQsCiAgICAgICAgbGltaXQ9MTUsCiAgICApCgogICAgaWYgbm90IHR4czoKICAgICAgICB0ZXh0ID0gKAogICAgICAgICAgICAi8J+TrSDYqtix2KfaqdmG2LTbjCDYqNix2KfbjCDYp9uM2YYg2qnYp9ix2KjYsSDYq9io2Kog2YbYtNiv2Ycg2KfYs9iqLiIKICAgICAgICApCgogICAgZWxzZToKICAgICAgICBsaW5lcyA9IFtdCgogICAgICAgIGZvciB0eCBpbiB0eHM6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBmIuKAoiAje3R4LmdldCgnaWQnKX0gfCAiCiAgICAgICAgICAgICAgICAgICAgZiI8Yj57ZXNjYXBlKHN0cih0eC5nZXQoJ3R5cGUnKSBvciAn4oCUJykpfTwvYj4gfCAiCiAgICAgICAgICAgICAgICAgICAgZiI8Y29kZT57X2ZtdF9pbnQodHguZ2V0KCdhbW91bnQnKSl9PC9jb2RlPiDYqtmI2YXYp9mGXG4iCiAgICAgICAgICAgICAgICAgICAgZiIgINmF2YjYrNmI2K/bjDogIgogICAgICAgICAgICAgICAgICAgIGYiPGNvZGU+e19mbXRfaW50KHR4LmdldCgnYmFsYW5jZV9iZWZvcmUnKSl9PC9jb2RlPiDihpIgIgogICAgICAgICAgICAgICAgICAgIGYiPGNvZGU+e19mbXRfaW50KHR4LmdldCgnYmFsYW5jZV9hZnRlcicpKX08L2NvZGU+IgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgIHRleHQgPSAoCiAgICAgICAgICAgIGYi8J+TnCA8Yj7Yqtix2KfaqdmG2LTigIzZh9in24wg2qnYp9ix2KjYsSB7dXNlcl9pZH08L2I+XG4iCiAgICAgICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgogICAgICAgICAgICArICJcblxuIi5qb2luKAogICAgICAgICAgICAgICAgbGluZXMKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgIHRleHQsCiAgICAgICAgX2JhY2tfYWRtaW5fa2V5Ym9hcmQoKSwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIERpcmVjdCBtZXNzYWdlCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhLnN0YXJ0c3dpdGgoImFkbWluX3NlbmRfbXNnXyIpCikKYXN5bmMgZGVmIGFkbWluX2RpcmVjdF9tZXNzYWdlX3Byb21wdCgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgc3RhdGU6IEZTTUNvbnRleHQsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgICAgIChjYWxsYmFjay5kYXRhIG9yICIiKQogICAgICAgICAgICAucnNwbGl0KCJfIiwgMSlbLTFdCiAgICAgICAgKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgc3RhdGUuc2V0X3N0YXRlKAogICAgICAgIEFkbWluQWN0aW9uU3RhdGVzLndhaXRpbmdfZGlyZWN0X21lc3NhZ2UKICAgICkKCiAgICBhd2FpdCBzdGF0ZS51cGRhdGVfZGF0YSgKICAgICAgICBkaXJlY3RfdXNlcl9pZD11c2VyX2lkCiAgICApCgogICAgYXdhaXQgX3NhZmVfZWRpdCgKICAgICAgICBjYWxsYmFjaywKICAgICAgICAoCiAgICAgICAgICAgICLinInvuI8gPGI+2KfYsdiz2KfZhCDZvtuM2KfZhSDZhdiz2KrZgtuM2YU8L2I+XG5cbiIKICAgICAgICAgICAgZiLaqdin2LHYqNixOiA8Y29kZT57dXNlcl9pZH08L2NvZGU+XG5cbiIKICAgICAgICAgICAgItmF2KrZhiDZvtuM2KfZhSDYsdinINin2LHYs9in2YQg2qnZhtuM2K8uIgogICAgICAgICksCiAgICAgICAgX2JhY2tfYWRtaW5fa2V5Ym9hcmQoKSwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgpAcm91dGVyLm1lc3NhZ2UoCiAgICBBZG1pbkFjdGlvblN0YXRlcy53YWl0aW5nX2RpcmVjdF9tZXNzYWdlLAogICAgRi50ZXh0LAopCmFzeW5jIGRlZiBhZG1pbl9kaXJlY3RfbWVzc2FnZV9zZW5kKAogICAgbWVzc2FnZTogTWVzc2FnZSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX21lc3NhZ2UoCiAgICAgICAgbWVzc2FnZQogICAgKToKICAgICAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCiAgICAgICAgcmV0dXJuCgogICAgZGF0YSA9IGF3YWl0IHN0YXRlLmdldF9kYXRhKCkKCiAgICB1c2VyX2lkID0gaW50KAogICAgICAgIGRhdGEuZ2V0KAogICAgICAgICAgICAiZGlyZWN0X3VzZXJfaWQiLAogICAgICAgICAgICAwLAogICAgICAgICkKICAgICAgICBvciAwCiAgICApCgogICAgaWYgdXNlcl9pZCA8PSAwOgogICAgICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKICAgICAgICByZXR1cm4KCiAgICB0cnk6CiAgICAgICAgYXdhaXQgbWVzc2FnZS5ib3Quc2VuZF9tZXNzYWdlKAogICAgICAgICAgICBjaGF0X2lkPXVzZXJfaWQsCiAgICAgICAgICAgIHRleHQ9KAogICAgICAgICAgICAgICAgbWVzc2FnZS50ZXh0CiAgICAgICAgICAgICAgICBvciAiIgogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgICAgICBhd2FpdCBtZXNzYWdlLmFuc3dlcigKICAgICAgICAgICAgIuKchSDZvtuM2KfZhSDYp9ix2LPYp9mEINi02K8uIiwKICAgICAgICAgICAgcmVwbHlfbWFya3VwPWdldF9hZG1pbl9tYWluX21lbnUoKSwKICAgICAgICApCgogICAgZXhjZXB0IFRlbGVncmFtRm9yYmlkZGVuRXJyb3I6CiAgICAgICAgYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgICAgICLinYwg2qnYp9ix2KjYsSDYsdio2KfYqiDYsdinINmF2LPYr9mI2K8g2qnYsdiv2Ycg2KfYs9iqLiIKICAgICAgICApCgogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAiRGlyZWN0IGFkbWluIG1lc3NhZ2UgZmFpbGVkIHwgdXNlcj0lcyIsCiAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgKQoKICAgICAgICBhd2FpdCBtZXNzYWdlLmFuc3dlcigKICAgICAgICAgICAgIuKdjCDYp9ix2LPYp9mEINm+24zYp9mFINmG2KfZhdmI2YHZgiDYqNmI2K8uIgogICAgICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE9yZGVycwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQHJvdXRlci5jYWxsYmFja19xdWVyeShGLmRhdGEgPT0gImFkbWluX29yZGVyc19tYW5hZ2UiKQphc3luYyBkZWYgYWRtaW5fb3JkZXJzX21hbmFnZSgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgc3RhdGU6IEZTTUNvbnRleHQsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgKAogICAgICAgICAgICAi8J+TpiA8Yj7Zhdiv24zYsduM2Kog2LPZgdin2LHYtOKAjNmH2Kc8L2I+XG4iCiAgICAgICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgogICAgICAgICAgICAi2YHbjNmE2KrYsSDZhdmI2LHYr9mG2LjYsSDYsdinINin2YbYqtiu2KfYqCDaqdmG24zYry4iCiAgICAgICAgKSwKICAgICAgICBnZXRfYWRtaW5fb3JkZXJzX2tleWJvYXJkKCksCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YS5pbl8oCiAgICAgICAgewogICAgICAgICAgICAiYWRtaW5fb3JkZXJzX2FsbCIsCiAgICAgICAgICAgICJhZG1pbl9vcmRlcnNfbmV3IiwKICAgICAgICAgICAgImFkbWluX29yZGVyc19wcm9jZXNzaW5nIiwKICAgICAgICAgICAgImFkbWluX29yZGVyc19jb21wbGV0ZWQiLAogICAgICAgICAgICAiYWRtaW5fb3JkZXJzX2NhbmNlbGxlZCIsCiAgICAgICAgfQogICAgKQopCmFzeW5jIGRlZiBhZG1pbl9vcmRlcnNfbGlzdCgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgZGI6IERhdGFiYXNlTWFuYWdlciwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9jYWxsYmFjaygKICAgICAgICBjYWxsYmFjawogICAgKToKICAgICAgICByZXR1cm4KCiAgICBvcmRlcnMgPSBhd2FpdCBkYi5nZXRfYWxsX29yZGVycygKICAgICAgICBsaW1pdD02MAogICAgKQoKICAgIGRhdGEgPSBjYWxsYmFjay5kYXRhCgogICAgaWYgZGF0YSA9PSAiYWRtaW5fb3JkZXJzX25ldyI6CiAgICAgICAgYWNjZXB0ZWQgPSB7CiAgICAgICAgICAgICJwZW5kaW5nX293bmVyX2FwcHJvdmFsIiwKICAgICAgICAgICAgInBlbmRpbmciLAogICAgICAgICAgICAiY3JlYXRlZCIsCiAgICAgICAgfQoKICAgIGVsaWYgZGF0YSA9PSAiYWRtaW5fb3JkZXJzX3Byb2Nlc3NpbmciOgogICAgICAgIGFjY2VwdGVkID0gewogICAgICAgICAgICAib3duZXJfcHJvY2Vzc2luZyIsCiAgICAgICAgICAgICJwcm92aWRlcl9wcm9jZXNzaW5nIiwKICAgICAgICAgICAgInByb2Nlc3NpbmciLAogICAgICAgICAgICAicHJvdmlkZXJfc3RhdHVzX3Vua25vd24iLAogICAgICAgIH0KCiAgICBlbGlmIGRhdGEgPT0gImFkbWluX29yZGVyc19jb21wbGV0ZWQiOgogICAgICAgIGFjY2VwdGVkID0gewogICAgICAgICAgICAiY29tcGxldGVkIiwKICAgICAgICB9CgogICAgZWxpZiBkYXRhID09ICJhZG1pbl9vcmRlcnNfY2FuY2VsbGVkIjoKICAgICAgICBhY2NlcHRlZCA9IHsKICAgICAgICAgICAgInJlamVjdGVkX2J5X293bmVyIiwKICAgICAgICAgICAgImNhbmNlbGxlZCIsCiAgICAgICAgICAgICJmYWlsZWRfcmVmdW5kZWQiLAogICAgICAgICAgICAicmVmdW5kZWQiLAogICAgICAgICAgICAiZmFpbGVkIiwKICAgICAgICB9CgogICAgZWxzZToKICAgICAgICBhY2NlcHRlZCA9IE5vbmUKCiAgICBpZiBhY2NlcHRlZCBpcyBub3QgTm9uZToKICAgICAgICBvcmRlcnMgPSBbCiAgICAgICAgICAgIGl0ZW0KICAgICAgICAgICAgZm9yIGl0ZW0KICAgICAgICAgICAgaW4gb3JkZXJzCiAgICAgICAgICAgIGlmIHN0cigKICAgICAgICAgICAgICAgIGl0ZW0uZ2V0KAogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiLAogICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApIGluIGFjY2VwdGVkCiAgICAgICAgXQoKICAgIG9yZGVycyA9IG9yZGVyc1s6MjBdCgogICAgaWYgbm90IG9yZGVyczoKICAgICAgICB0ZXh0ID0gIvCfk60g2LPZgdin2LHYtNuMINiv2LEg2KfbjNmGINio2K7YtCDZiNis2YjYryDZhtiv2KfYsdivLiIKCiAgICBlbHNlOgogICAgICAgIGxpbmVzID0gW10KCiAgICAgICAgZm9yIG9yZGVyIGluIG9yZGVyczoKICAgICAgICAgICAgbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIGYi4oCiIDxiPiN7b3JkZXIuZ2V0KCdpZCcpfTwvYj4gfCAiCiAgICAgICAgICAgICAgICAgICAgZiJ1c2VyPTxjb2RlPntvcmRlci5nZXQoJ3VzZXJfaWQnKX08L2NvZGU+XG4iCiAgICAgICAgICAgICAgICAgICAgZiIgIHtlc2NhcGUoc3RyKG9yZGVyLmdldCgncHJvZHVjdF9pZCcpIG9yICfigJQnKSl9IHwgIgogICAgICAgICAgICAgICAgICAgIGYiPGNvZGU+e19mbXRfaW50KG9yZGVyLmdldCgncHJpY2UnKSl9PC9jb2RlPiDYqtmI2YXYp9mGXG4iCiAgICAgICAgICAgICAgICAgICAgZiIgINmI2LbYuduM2Ko6IDxjb2RlPntlc2NhcGUoc3RyKG9yZGVyLmdldCgnc3RhdHVzJykgb3IgJ+KAlCcpKX08L2NvZGU+IgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgIHRleHQgPSAoCiAgICAgICAgICAgICLwn5OmIDxiPtii2K7YsduM2YYg2LPZgdin2LHYtOKAjNmH2Kc8L2I+XG4iCiAgICAgICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgogICAgICAgICAgICArICJcblxuIi5qb2luKAogICAgICAgICAgICAgICAgbGluZXMKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgIHRleHQsCiAgICAgICAgZ2V0X2FkbWluX29yZGVyc19rZXlib2FyZCgpLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQnJvYWRjYXN0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KEYuZGF0YSA9PSAiYWRtaW5fYnJvYWRjYXN0IikKYXN5bmMgZGVmIGFkbWluX2Jyb2FkY2FzdCgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgc3RhdGU6IEZTTUNvbnRleHQsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgKAogICAgICAgICAgICAi8J+ToiA8Yj7Yp9ix2LPYp9mEINm+24zYp9mFINmH2YXar9in2YbbjDwvYj5cbiIKICAgICAgICAgICAgIuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgVxuXG4iCiAgICAgICAgICAgICLar9ix2YjZhyDZh9iv2YEg2LHYpyDYp9mG2KrYrtin2Kgg2qnZhtuM2K8uIgogICAgICAgICksCiAgICAgICAgZ2V0X2FkbWluX2Jyb2FkY2FzdF9vcHRpb25zX2tleWJvYXJkKCksCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YS5pbl8oCiAgICAgICAgewogICAgICAgICAgICAiYnJvYWRjYXN0X2FsbCIsCiAgICAgICAgICAgICJicm9hZGNhc3Rfa3ljX3Bhc3NlZCIsCiAgICAgICAgICAgICJicm9hZGNhc3RfcG9zaXRpdmVfYmFsYW5jZSIsCiAgICAgICAgfQogICAgKQopCmFzeW5jIGRlZiBhZG1pbl9icm9hZGNhc3RfdGFyZ2V0KAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBzdGF0ZTogRlNNQ29udGV4dCwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9jYWxsYmFjaygKICAgICAgICBjYWxsYmFjawogICAgKToKICAgICAgICByZXR1cm4KCiAgICBhd2FpdCBzdGF0ZS5zZXRfc3RhdGUoCiAgICAgICAgQWRtaW5BY3Rpb25TdGF0ZXMud2FpdGluZ19icm9hZGNhc3RfdGV4dAogICAgKQoKICAgIGF3YWl0IHN0YXRlLnVwZGF0ZV9kYXRhKAogICAgICAgIGJyb2FkY2FzdF90YXJnZXQ9Y2FsbGJhY2suZGF0YSwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgIvCfk6IgPGI+2YXYqtmGINm+24zYp9mFINmH2YXar9in2YbbjCDYsdinINin2LHYs9in2YQg2qnZhtuM2K8uPC9iPlxuXG4iCiAgICAgICAgICAgICLZvtuM2KfZhSDYqNi52K/bjCDYtNmF2Kcg2KjYsdin24wg2q/YsdmI2Ycg2KfZhtiq2K7Yp9io4oCM2LTYr9mHINin2LHYs9in2YQg2YXbjOKAjNi02YjYry4iCiAgICAgICAgKSwKICAgICAgICBfYmFja19hZG1pbl9rZXlib2FyZCgpLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCmRlZiBfYnJvYWRjYXN0X3VzZXJfaWRzKAogICAgZGJfcGF0aDogc3RyLAogICAgdGFyZ2V0OiBzdHIsCikgLT4gbGlzdFtpbnRdOgogICAgd2hlcmUgPSAiIgoKICAgIGlmIHRhcmdldCA9PSAiYnJvYWRjYXN0X2t5Y19wYXNzZWQiOgogICAgICAgIHdoZXJlID0gKAogICAgICAgICAgICAiV0hFUkUgQ09BTEVTQ0UoaXNfa3ljX3ZlcmlmaWVkLCAwKSA9IDEiCiAgICAgICAgKQoKICAgIGVsaWYgdGFyZ2V0ID09ICJicm9hZGNhc3RfcG9zaXRpdmVfYmFsYW5jZSI6CiAgICAgICAgd2hlcmUgPSAoCiAgICAgICAgICAgICJXSEVSRSBDT0FMRVNDRShiYWxhbmNlX3RvbWFuLCAwKSA+IDAiCiAgICAgICAgKQoKICAgIHJvd3MgPSBfc3FsaXRlX3Jvd3MoCiAgICAgICAgZGJfcGF0aCwKICAgICAgICBmIiIiCiAgICAgICAgU0VMRUNUIHVzZXJfaWQKICAgICAgICBGUk9NIHVzZXJzCiAgICAgICAge3doZXJlfQogICAgICAgIE9SREVSIEJZIHVzZXJfaWQKICAgICAgICAiIiIsCiAgICApCgogICAgcmV0dXJuIFsKICAgICAgICBpbnQoCiAgICAgICAgICAgIHJvd1sKICAgICAgICAgICAgICAgICJ1c2VyX2lkIgogICAgICAgICAgICBdCiAgICAgICAgKQogICAgICAgIGZvciByb3cKICAgICAgICBpbiByb3dzCiAgICBdCgoKQHJvdXRlci5tZXNzYWdlKAogICAgQWRtaW5BY3Rpb25TdGF0ZXMud2FpdGluZ19icm9hZGNhc3RfdGV4dCwKICAgIEYudGV4dCwKKQphc3luYyBkZWYgYWRtaW5fYnJvYWRjYXN0X3NlbmQoCiAgICBtZXNzYWdlOiBNZXNzYWdlLAogICAgc3RhdGU6IEZTTUNvbnRleHQsCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX21lc3NhZ2UoCiAgICAgICAgbWVzc2FnZQogICAgKToKICAgICAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCiAgICAgICAgcmV0dXJuCgogICAgZGF0YSA9IGF3YWl0IHN0YXRlLmdldF9kYXRhKCkKCiAgICB0YXJnZXQgPSBzdHIoCiAgICAgICAgZGF0YS5nZXQoCiAgICAgICAgICAgICJicm9hZGNhc3RfdGFyZ2V0IiwKICAgICAgICAgICAgIiIsCiAgICAgICAgKQogICAgKQoKICAgIGlmIHRhcmdldCBub3QgaW4gewogICAgICAgICJicm9hZGNhc3RfYWxsIiwKICAgICAgICAiYnJvYWRjYXN0X2t5Y19wYXNzZWQiLAogICAgICAgICJicm9hZGNhc3RfcG9zaXRpdmVfYmFsYW5jZSIsCiAgICB9OgogICAgICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKICAgICAgICByZXR1cm4KCiAgICB1c2VyX2lkcyA9IGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgIF9icm9hZGNhc3RfdXNlcl9pZHMsCiAgICAgICAgX2RiX3BhdGgoZGIpLAogICAgICAgIHRhcmdldCwKICAgICkKCiAgICBhd2FpdCBzdGF0ZS5jbGVhcigpCgogICAgc3RhdHVzID0gYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgKAogICAgICAgICAgICAi4o+zINin2LHYs9in2YQg2LTYsdmI2Lkg2LTYry4uLlxuIgogICAgICAgICAgICBmItiq2LnYr9in2K8g2YXZgti12K86IDxjb2RlPntsZW4odXNlcl9pZHMpOix9PC9jb2RlPiIKICAgICAgICApLAogICAgICAgIHBhcnNlX21vZGU9IkhUTUwiLAogICAgKQoKICAgIHNlbnQgPSAwCiAgICBmYWlsZWQgPSAwCgogICAgZm9yIHVzZXJfaWQgaW4gdXNlcl9pZHM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBhd2FpdCBtZXNzYWdlLmJvdC5zZW5kX21lc3NhZ2UoCiAgICAgICAgICAgICAgICBjaGF0X2lkPXVzZXJfaWQsCiAgICAgICAgICAgICAgICB0ZXh0PSgKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRleHQKICAgICAgICAgICAgICAgICAgICBvciAiIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgc2VudCArPSAxCgogICAgICAgIGV4Y2VwdCAoCiAgICAgICAgICAgIFRlbGVncmFtRm9yYmlkZGVuRXJyb3IsCiAgICAgICAgICAgIFRlbGVncmFtQmFkUmVxdWVzdCwKICAgICAgICApOgogICAgICAgICAgICBmYWlsZWQgKz0gMQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBmYWlsZWQgKz0gMQoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJCcm9hZGNhc3Qgc2VuZCBmYWlsZWQgfCB1c2VyPSVzIiwKICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICkKCiAgICAgICAgIyBHZW50bGUgcGFjaW5nLgogICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoCiAgICAgICAgICAgIDAuMDM1CiAgICAgICAgKQoKICAgIHRyeToKICAgICAgICBhd2FpdCBzdGF0dXMuZWRpdF90ZXh0KAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAi4pyFIDxiPtin2LHYs9in2YQg2YfZhdqv2KfZhtuMINm+2KfbjNin2YYg24zYp9mB2KouPC9iPlxuXG4iCiAgICAgICAgICAgICAgICBmItmF2YjZgdmCOiA8Y29kZT57c2VudDosfTwvY29kZT5cbiIKICAgICAgICAgICAgICAgIGYi2YbYp9mF2YjZgdmCOiA8Y29kZT57ZmFpbGVkOix9PC9jb2RlPiIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcmVwbHlfbWFya3VwPWdldF9hZG1pbl9tYWluX21lbnUoKSwKICAgICAgICAgICAgcGFyc2VfbW9kZT0iSFRNTCIsCiAgICAgICAgKQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcGFzcwoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgS1lDCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgX3BlbmRpbmdfa3ljKAogICAgZGJfcGF0aDogc3RyLAopIC0+IGxpc3RbZGljdFtzdHIsIEFueV1dOgogICAgcmV0dXJuIF9zcWxpdGVfcm93cygKICAgICAgICBkYl9wYXRoLAogICAgICAgICIiIgogICAgICAgIFNFTEVDVAogICAgICAgICAgICBrLmlkLAogICAgICAgICAgICBrLnVzZXJfaWQsCiAgICAgICAgICAgIGsuZmlsZV9pZCwKICAgICAgICAgICAgay5zdGF0dXMsCiAgICAgICAgICAgIGsuY3JlYXRlZF9hdCwKICAgICAgICAgICAgdS51c2VybmFtZSwKICAgICAgICAgICAgdS5mdWxsX25hbWUKICAgICAgICBGUk9NIGt5Y19yZXF1ZXN0cyBBUyBrCiAgICAgICAgTEVGVCBKT0lOIHVzZXJzIEFTIHUKICAgICAgICAgICAgT04gdS51c2VyX2lkID0gay51c2VyX2lkCiAgICAgICAgV0hFUkUgay5zdGF0dXMgPSAncGVuZGluZycKICAgICAgICBPUkRFUiBCWSBrLmlkIERFU0MKICAgICAgICBMSU1JVCAyMAogICAgICAgICIiIiwKICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KEYuZGF0YSA9PSAiYWRtaW5fa3ljX3F1ZXVlIikKYXN5bmMgZGVmIGFkbWluX2t5Y19xdWV1ZSgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgc3RhdGU6IEZTTUNvbnRleHQsCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKCiAgICByb3dzID0gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgX3BlbmRpbmdfa3ljLAogICAgICAgIF9kYl9wYXRoKGRiKSwKICAgICkKCiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBpZiByb3dzOgogICAgICAgIGZvciBpdGVtIGluIHJvd3M6CiAgICAgICAgICAgIHJlcXVlc3RfaWQgPSBpbnQoCiAgICAgICAgICAgICAgICBpdGVtWwogICAgICAgICAgICAgICAgICAgICJpZCIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgKQoKICAgICAgICAgICAgdXNlcl9pZCA9IGludCgKICAgICAgICAgICAgICAgIGl0ZW1bCiAgICAgICAgICAgICAgICAgICAgInVzZXJfaWQiCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHVzZXJuYW1lID0gKAogICAgICAgICAgICAgICAgZiJAe2l0ZW0uZ2V0KCd1c2VybmFtZScpfSIKICAgICAgICAgICAgICAgIGlmIGl0ZW0uZ2V0KAogICAgICAgICAgICAgICAgICAgICJ1c2VybmFtZSIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVsc2Ugc3RyKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgYnVpbGRlci5yb3coCiAgICAgICAgICAgICAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICAgICAgICAgICAgICB0ZXh0PSgKICAgICAgICAgICAgICAgICAgICAgICAgZiLYr9ix2K7ZiNin2LPYqiAje3JlcXVlc3RfaWR9IHwgIgogICAgICAgICAgICAgICAgICAgICAgICBmInt1c2VybmFtZX0iCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhPSgKICAgICAgICAgICAgICAgICAgICAgICAgZiJhZG1pbl9reWNfdmlld197cmVxdWVzdF9pZH0iCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBzdHlsZT0icHJpbWFyeSIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICAgICAgdGV4dD0i2KjYp9iy2q/YtNiqINio2Ycg2b7ZhtmEINmF2K/bjNix24zYqiIsCiAgICAgICAgICAgIGNhbGxiYWNrX2RhdGE9ImFkbWluX21haW4iLAogICAgICAgICAgICBzdHlsZT0iZGFuZ2VyIiwKICAgICAgICApCiAgICApCgogICAgdGV4dCA9ICgKICAgICAgICAi8J+boSA8Yj7YtdmBINin2K3Ysdin2LIg2YfZiNuM2Ko8L2I+XG4iCiAgICAgICAgIuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgVxuXG4iCiAgICAgICAgZiLYr9ixINin2YbYqti42KfYsSDYqNix2LHYs9uMOiA8Y29kZT57bGVuKHJvd3MpfTwvY29kZT5cblxuIgogICAgICAgICsgKAogICAgICAgICAgICAi24zaqSDYr9ix2K7ZiNin2LPYqiDYsdinINin2YbYqtiu2KfYqCDaqdmG24zYry4iCiAgICAgICAgICAgIGlmIHJvd3MKICAgICAgICAgICAgZWxzZSAi2K/Ysdiu2YjYp9iz2KrbjCDYr9ixINin2YbYqti42KfYsSDYqNix2LHYs9uMINmG24zYs9iqLiIKICAgICAgICApCiAgICApCgogICAgYXdhaXQgX3NhZmVfZWRpdCgKICAgICAgICBjYWxsYmFjaywKICAgICAgICB0ZXh0LAogICAgICAgIGJ1aWxkZXIuYXNfbWFya3VwKCksCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YS5zdGFydHN3aXRoKCJhZG1pbl9reWNfdmlld18iKQopCmFzeW5jIGRlZiBhZG1pbl9reWNfdmlldygKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgZGI6IERhdGFiYXNlTWFuYWdlciwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9jYWxsYmFjaygKICAgICAgICBjYWxsYmFjawogICAgKToKICAgICAgICByZXR1cm4KCiAgICB0cnk6CiAgICAgICAgcmVxdWVzdF9pZCA9IGludCgKICAgICAgICAgICAgKGNhbGxiYWNrLmRhdGEgb3IgIiIpCiAgICAgICAgICAgIC5yc3BsaXQoIl8iLCAxKVstMV0KICAgICAgICApCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICByZXR1cm4KCiAgICByb3cgPSBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICBfc3FsaXRlX29uZSwKICAgICAgICBfZGJfcGF0aChkYiksCiAgICAgICAgIiIiCiAgICAgICAgU0VMRUNUCiAgICAgICAgICAgIGsuKiwKICAgICAgICAgICAgdS51c2VybmFtZSwKICAgICAgICAgICAgdS5mdWxsX25hbWUKICAgICAgICBGUk9NIGt5Y19yZXF1ZXN0cyBBUyBrCiAgICAgICAgTEVGVCBKT0lOIHVzZXJzIEFTIHUKICAgICAgICAgICAgT04gdS51c2VyX2lkID0gay51c2VyX2lkCiAgICAgICAgV0hFUkUgay5pZCA9ID8KICAgICAgICBMSU1JVCAxCiAgICAgICAgIiIiLAogICAgICAgICgKICAgICAgICAgICAgcmVxdWVzdF9pZCwKICAgICAgICApLAogICAgKQoKICAgIGlmIG5vdCByb3c6CiAgICAgICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgItiv2LHYrtmI2KfYs9iqINm+24zYr9inINmG2LTYry4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgcm93WwogICAgICAgICAgICAidXNlcl9pZCIKICAgICAgICBdCiAgICApCgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgSW5saW5lS2V5Ym9hcmRCdXR0b24oCiAgICAgICAgICAgIHRleHQ9Itiq2KfbjNuM2K8g2KfYrdix2KfYsiDZh9mI24zYqiIsCiAgICAgICAgICAgIGNhbGxiYWNrX2RhdGE9KAogICAgICAgICAgICAgICAgZiJhZG1pbl9reWNfYXBwcm92ZV97cmVxdWVzdF9pZH0iCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHN0eWxlPSJzdWNjZXNzIiwKICAgICAgICApLAogICAgICAgIElubGluZUtleWJvYXJkQnV0dG9uKAogICAgICAgICAgICB0ZXh0PSLYsdivINin2K3Ysdin2LIg2YfZiNuM2KoiLAogICAgICAgICAgICBjYWxsYmFja19kYXRhPSgKICAgICAgICAgICAgICAgIGYiYWRtaW5fa3ljX3JlamVjdF97cmVxdWVzdF9pZH0iCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHN0eWxlPSJkYW5nZXIiLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgSW5saW5lS2V5Ym9hcmRCdXR0b24oCiAgICAgICAgICAgIHRleHQ9Itio2KfYstqv2LTYqiDYqNmHINi12YEiLAogICAgICAgICAgICBjYWxsYmFja19kYXRhPSJhZG1pbl9reWNfcXVldWUiLAogICAgICAgICAgICBzdHlsZT0icHJpbWFyeSIsCiAgICAgICAgKQogICAgKQoKICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgKAogICAgICAgICAgICAi8J+boSA8Yj7YrNiy2KbbjNin2KogS1lDPC9iPlxuIgogICAgICAgICAgICAi4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBXG5cbiIKICAgICAgICAgICAgZiJSZXF1ZXN0IElEOiA8Y29kZT57cmVxdWVzdF9pZH08L2NvZGU+XG4iCiAgICAgICAgICAgIGYiVXNlciBJRDogPGNvZGU+e3VzZXJfaWR9PC9jb2RlPlxuIgogICAgICAgICAgICBmIlVzZXJuYW1lOiAiCiAgICAgICAgICAgIGYiPGNvZGU+e2VzY2FwZShzdHIocm93LmdldCgndXNlcm5hbWUnKSBvciAn4oCUJykpfTwvY29kZT5cbiIKICAgICAgICAgICAgZiLZhtin2YU6IDxiPntlc2NhcGUoc3RyKHJvdy5nZXQoJ2Z1bGxfbmFtZScpIG9yICfigJQnKSl9PC9iPlxuIgogICAgICAgICAgICBmItmI2LbYuduM2Ko6IDxjb2RlPntlc2NhcGUoc3RyKHJvdy5nZXQoJ3N0YXR1cycpIG9yICfigJQnKSl9PC9jb2RlPlxuIgogICAgICAgICAgICBmItiy2YXYp9mGOiA8Y29kZT57ZXNjYXBlKHN0cihyb3cuZ2V0KCdjcmVhdGVkX2F0Jykgb3IgJ+KAlCcpKX08L2NvZGU+XG5cbiIKICAgICAgICAgICAgIkZpbGUgSUQ6XG4iCiAgICAgICAgICAgIGYiPGNvZGU+e2VzY2FwZShzdHIocm93LmdldCgnZmlsZV9pZCcpIG9yICfigJQnKSl9PC9jb2RlPiIKICAgICAgICApLAogICAgICAgIGJ1aWxkZXIuYXNfbWFya3VwKCksCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKYXN5bmMgZGVmIF9reWNfc2V0X3N0YXR1cygKICAgIGRiOiBEYXRhYmFzZU1hbmFnZXIsCiAgICB1c2VyX2lkOiBpbnQsCiAgICBzdGF0dXM6IHN0ciwKICAgICosCiAgICBhZG1pbl9pZDogaW50LAogICAgcmVhc29uOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKKSAtPiBib29sOgogICAgcmV0dXJuIGF3YWl0IGRiLnNldF91c2VyX2t5Y19zdGF0dXMoCiAgICAgICAgdXNlcl9pZCwKICAgICAgICBzdGF0dXMsCiAgICAgICAgcmV2aWV3ZWRfYnk9YWRtaW5faWQsCiAgICAgICAgcmVqZWN0aW9uX3JlYXNvbj1yZWFzb24sCiAgICApCgoKQHJvdXRlci5jYWxsYmFja19xdWVyeSgKICAgIEYuZGF0YS5zdGFydHN3aXRoKCJhZG1pbl9reWNfYXBwcm92ZV8iKQopCmFzeW5jIGRlZiBhZG1pbl9reWNfYXBwcm92ZSgKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgZGI6IERhdGFiYXNlTWFuYWdlciwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9jYWxsYmFjaygKICAgICAgICBjYWxsYmFjawogICAgKToKICAgICAgICByZXR1cm4KCiAgICB0cnk6CiAgICAgICAgcmVxdWVzdF9pZCA9IGludCgKICAgICAgICAgICAgKGNhbGxiYWNrLmRhdGEgb3IgIiIpCiAgICAgICAgICAgIC5yc3BsaXQoIl8iLCAxKVstMV0KICAgICAgICApCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICByZXR1cm4KCiAgICByb3cgPSBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICBfc3FsaXRlX29uZSwKICAgICAgICBfZGJfcGF0aChkYiksCiAgICAgICAgIiIiCiAgICAgICAgU0VMRUNUIHVzZXJfaWQKICAgICAgICBGUk9NIGt5Y19yZXF1ZXN0cwogICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgIExJTUlUIDEKICAgICAgICAiIiIsCiAgICAgICAgKAogICAgICAgICAgICByZXF1ZXN0X2lkLAogICAgICAgICksCiAgICApCgogICAgaWYgbm90IHJvdzoKICAgICAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgICAi2K/Ysdiu2YjYp9iz2Kog2b7bjNiv2Kcg2YbYtNivLiIsCiAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgdXNlcl9pZCA9IGludCgKICAgICAgICByb3dbCiAgICAgICAgICAgICJ1c2VyX2lkIgogICAgICAgIF0KICAgICkKCiAgICBhZG1pbl9pZCA9IGNhbGxiYWNrLmZyb21fdXNlci5pZAoKICAgIHN1Y2Nlc3MgPSBhd2FpdCBfa3ljX3NldF9zdGF0dXMoCiAgICAgICAgZGIsCiAgICAgICAgdXNlcl9pZCwKICAgICAgICAiYXBwcm92ZWQiLAogICAgICAgIGFkbWluX2lkPWFkbWluX2lkLAogICAgKQoKICAgIGlmIHN1Y2Nlc3M6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBhd2FpdCBjYWxsYmFjay5ib3Quc2VuZF9tZXNzYWdlKAogICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICLinIUg2KfYrdix2KfYsiDZh9mI24zYqiDYtNmF2Kcg2KrYp9uM24zYryDYtNivLiIsCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgIuKchSDYp9it2LHYp9iyINmH2YjbjNiqINiq2KfbjNuM2K8g2LTYry4iCiAgICAgICAgICAgIGlmIHN1Y2Nlc3MKICAgICAgICAgICAgZWxzZSAi4p2MINir2KjYqiDYqtin24zbjNivINmG2KfZhdmI2YHZgiDYqNmI2K8uIgogICAgICAgICksCiAgICAgICAgc2hvd19hbGVydD1ub3Qgc3VjY2VzcywKICAgICkKCiAgICBpZiBzdWNjZXNzOgogICAgICAgIGF3YWl0IF9zaG93X2t5Y19kb25lKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIuKchSA8Yj7Yp9it2LHYp9iyINmH2YjbjNiqINiq2KfbjNuM2K8g2LTYry48L2I+IiwKICAgICAgICApCgoKIyBMaWdodHdlaWdodCBwb3N0LWFjdGlvbiBwYWdlLgphc3luYyBkZWYgX3Nob3dfa3ljX2RvbmUoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIHRleHQ6IHN0ciwKKSAtPiBOb25lOgogICAgYXdhaXQgX3NhZmVfZWRpdCgKICAgICAgICBjYWxsYmFjaywKICAgICAgICB0ZXh0LAogICAgICAgIF9iYWNrX2FuZF9yZWZyZXNoX2tleWJvYXJkKAogICAgICAgICAgICAiYWRtaW5fa3ljX3F1ZXVlIgogICAgICAgICksCiAgICApCgoKIyBSZS1yZWdpc3RlciB3aXRoIGEgbW9yZSBzcGVjaWZpYyBjYWxsYmFjayBoYW5kbGVyIG5hbWUgaXMgbm90IHBvc3NpYmxlOwojIGluc3RlYWQgdGhlIGFwcHJvdmUgaGFuZGxlciByZXR1cm5zIGJlZm9yZSB0aGUgaW52YWxpZCBjb250ZXh0IGNhbGwgdXNpbmcKIyB0aGlzIG1vbmtleS1zYWZlIHdyYXBwZXIgYmVsb3cuIFRoZSBzb3VyY2UgaXMgcGF0Y2hlZCBhZnRlciBkZWZpbml0aW9uLgoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuc3RhcnRzd2l0aCgiYWRtaW5fa3ljX3JlamVjdF8iKQopCmFzeW5jIGRlZiBhZG1pbl9reWNfcmVqZWN0KAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBzdGF0ZTogRlNNQ29udGV4dCwKICAgIGRiOiBEYXRhYmFzZU1hbmFnZXIsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIHJlcXVlc3RfaWQgPSBpbnQoCiAgICAgICAgICAgIChjYWxsYmFjay5kYXRhIG9yICIiKQogICAgICAgICAgICAucnNwbGl0KCJfIiwgMSlbLTFdCiAgICAgICAgKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmV0dXJuCgogICAgcm93ID0gYXdhaXQgYXN5bmNpby50b190aHJlYWQoCiAgICAgICAgX3NxbGl0ZV9vbmUsCiAgICAgICAgX2RiX3BhdGgoZGIpLAogICAgICAgICIiIgogICAgICAgIFNFTEVDVCB1c2VyX2lkCiAgICAgICAgRlJPTSBreWNfcmVxdWVzdHMKICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICBMSU1JVCAxCiAgICAgICAgIiIiLAogICAgICAgICgKICAgICAgICAgICAgcmVxdWVzdF9pZCwKICAgICAgICApLAogICAgKQoKICAgIGlmIG5vdCByb3c6CiAgICAgICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgItiv2LHYrtmI2KfYs9iqINm+24zYr9inINmG2LTYry4iLAogICAgICAgICAgICBzaG93X2FsZXJ0PVRydWUsCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHN0YXRlLnNldF9zdGF0ZSgKICAgICAgICBBZG1pbkFjdGlvblN0YXRlcy53YWl0aW5nX2t5Y19yZWplY3RfcmVhc29uCiAgICApCgogICAgYXdhaXQgc3RhdGUudXBkYXRlX2RhdGEoCiAgICAgICAga3ljX3JlamVjdF91c2VyX2lkPWludCgKICAgICAgICAgICAgcm93WwogICAgICAgICAgICAgICAgInVzZXJfaWQiCiAgICAgICAgICAgIF0KICAgICAgICApCiAgICApCgogICAgYXdhaXQgX3NhZmVfZWRpdCgKICAgICAgICBjYWxsYmFjaywKICAgICAgICAoCiAgICAgICAgICAgICLinYwgPGI+2LHYryDYp9it2LHYp9iyINmH2YjbjNiqPC9iPlxuXG4iCiAgICAgICAgICAgICLYr9mE24zZhCDYsdivINix2Kcg2KfYsdiz2KfZhCDaqdmG24zYry4iCiAgICAgICAgKSwKICAgICAgICBfYmFja19hZG1pbl9rZXlib2FyZCgpLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCkByb3V0ZXIubWVzc2FnZSgKICAgIEFkbWluQWN0aW9uU3RhdGVzLndhaXRpbmdfa3ljX3JlamVjdF9yZWFzb24sCiAgICBGLnRleHQsCikKYXN5bmMgZGVmIGFkbWluX2t5Y19yZWplY3RfcmVhc29uKAogICAgbWVzc2FnZTogTWVzc2FnZSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAogICAgZGI6IERhdGFiYXNlTWFuYWdlciwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9tZXNzYWdlKAogICAgICAgIG1lc3NhZ2UKICAgICk6CiAgICAgICAgYXdhaXQgc3RhdGUuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRhdGEgPSBhd2FpdCBzdGF0ZS5nZXRfZGF0YSgpCgogICAgdXNlcl9pZCA9IGludCgKICAgICAgICBkYXRhLmdldCgKICAgICAgICAgICAgImt5Y19yZWplY3RfdXNlcl9pZCIsCiAgICAgICAgICAgIDAsCiAgICAgICAgKQogICAgICAgIG9yIDAKICAgICkKCiAgICByZWFzb24gPSAoCiAgICAgICAgbWVzc2FnZS50ZXh0CiAgICAgICAgb3IgIiIKICAgICkuc3RyaXAoKQoKICAgIGlmICgKICAgICAgICB1c2VyX2lkIDw9IDAKICAgICAgICBvciBsZW4ocmVhc29uKSA8IDMKICAgICk6CiAgICAgICAgYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgICAgICLinYwg2K/ZhNuM2YQg2LHYryDYqNin24zYryDYrdiv2KfZgtmEINuzINqp2KfYsdin2qnYqtixINio2KfYtNivLiIKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgYWRtaW5faWQgPSBtZXNzYWdlLmZyb21fdXNlci5pZAoKICAgIHN1Y2Nlc3MgPSBhd2FpdCBfa3ljX3NldF9zdGF0dXMoCiAgICAgICAgZGIsCiAgICAgICAgdXNlcl9pZCwKICAgICAgICAicmVqZWN0ZWQiLAogICAgICAgIGFkbWluX2lkPWFkbWluX2lkLAogICAgICAgIHJlYXNvbj1yZWFzb25bOjEwMDBdLAogICAgKQoKICAgIGlmIG5vdCBzdWNjZXNzOgogICAgICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICAgICAi4p2MINir2KjYqiDYsdivINin2K3Ysdin2LIg2YfZiNuM2Kog2YbYp9mF2YjZgdmCINio2YjYry4iCiAgICAgICAgKQogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHN0YXRlLmNsZWFyKCkKCiAgICB0cnk6CiAgICAgICAgYXdhaXQgbWVzc2FnZS5ib3Quc2VuZF9tZXNzYWdlKAogICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAi4p2MINin2K3Ysdin2LIg2YfZiNuM2Kog2LTZhdinINix2K8g2LTYry5cblxuIgogICAgICAgICAgICAgICAgZiLYr9mE24zZhDoge3JlYXNvbls6MTAwMF19IgogICAgICAgICAgICApLAogICAgICAgICkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcGFzcwoKICAgIGF3YWl0IG1lc3NhZ2UuYW5zd2VyKAogICAgICAgICLinIUg2LHYryDYp9it2LHYp9iyINmH2YjbjNiqINir2KjYqiDYtNivLiIsCiAgICAgICAgcmVwbHlfbWFya3VwPWdldF9hZG1pbl9tYWluX21lbnUoKSwKICAgICkKCgojIExlZ2FjeSBLWUMgYnV0dG9ucyBlbWl0dGVkIGJ5IG9sZGVyIHVzZXIgS1lDIGhhbmRsZXIuCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuc3RhcnRzd2l0aCgia3ljX2FwcHJvdmVfIikKKQphc3luYyBkZWYgYWRtaW5fa3ljX2xlZ2FjeV9hcHByb3ZlKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIHRyeToKICAgICAgICB1c2VyX2lkID0gaW50KAogICAgICAgICAgICAoY2FsbGJhY2suZGF0YSBvciAiIikKICAgICAgICAgICAgLnJzcGxpdCgiXyIsIDEpWy0xXQogICAgICAgICkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHJldHVybgoKICAgIHN1Y2Nlc3MgPSBhd2FpdCBfa3ljX3NldF9zdGF0dXMoCiAgICAgICAgZGIsCiAgICAgICAgdXNlcl9pZCwKICAgICAgICAiYXBwcm92ZWQiLAogICAgICAgIGFkbWluX2lkPWNhbGxiYWNrLmZyb21fdXNlci5pZCwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgKAogICAgICAgICAgICAi4pyFINiq2KfbjNuM2K8g2LTYry4iCiAgICAgICAgICAgIGlmIHN1Y2Nlc3MKICAgICAgICAgICAgZWxzZSAi4p2MINmG2KfZhdmI2YHZgiDYqNmI2K8uIgogICAgICAgICksCiAgICAgICAgc2hvd19hbGVydD1ub3Qgc3VjY2VzcywKICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhLnN0YXJ0c3dpdGgoImt5Y19yZWplY3RfIikKKQphc3luYyBkZWYgYWRtaW5fa3ljX2xlZ2FjeV9yZWplY3QoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIHN0YXRlOiBGU01Db250ZXh0LAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIHRyeToKICAgICAgICB1c2VyX2lkID0gaW50KAogICAgICAgICAgICAoY2FsbGJhY2suZGF0YSBvciAiIikKICAgICAgICAgICAgLnJzcGxpdCgiXyIsIDEpWy0xXQogICAgICAgICkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHJldHVybgoKICAgIGF3YWl0IHN0YXRlLnNldF9zdGF0ZSgKICAgICAgICBBZG1pbkFjdGlvblN0YXRlcy53YWl0aW5nX2t5Y19yZWplY3RfcmVhc29uCiAgICApCgogICAgYXdhaXQgc3RhdGUudXBkYXRlX2RhdGEoCiAgICAgICAga3ljX3JlamVjdF91c2VyX2lkPXVzZXJfaWQKICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICLYr9mE24zZhCDYsdivINin2K3Ysdin2LIg2YfZiNuM2Kog2LHYpyDYp9ix2LPYp9mEINqp2YbbjNivLiIsCiAgICAgICAgX2JhY2tfYWRtaW5fa2V5Ym9hcmQoKSwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNlcnZlciBzdGF0dXMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBfaHVtYW5fdXB0aW1lKCkgLT4gc3RyOgogICAgc2Vjb25kcyA9IGludCgKICAgICAgICB0aW1lLm1vbm90b25pYygpCiAgICAgICAgLSBTVEFSVEVEX0FUCiAgICApCgogICAgaG91cnMsIHJlbWFpbmRlciA9IGRpdm1vZCgKICAgICAgICBzZWNvbmRzLAogICAgICAgIDM2MDAsCiAgICApCgogICAgbWludXRlcywgc2Vjb25kcyA9IGRpdm1vZCgKICAgICAgICByZW1haW5kZXIsCiAgICAgICAgNjAsCiAgICApCgogICAgcmV0dXJuICgKICAgICAgICBmIntob3VyczowMmR9OnttaW51dGVzOjAyZH06e3NlY29uZHM6MDJkfSIKICAgICkKCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KEYuZGF0YSA9PSAiYWRtaW5fc2VydmVyX3N0YXR1cyIpCmFzeW5jIGRlZiBhZG1pbl9zZXJ2ZXJfc3RhdHVzKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIGRiX29rID0gYXdhaXQgZGIuaGVhbHRoX2NoZWNrKCkKCiAgICBwcm9kdWN0X3ByaWNlcyA9IGF3YWl0IF9wcm9kdWN0X3NlcnZpY2UoCiAgICAgICAgZGIKICAgICkuZ2V0X2FsbF9iYXNlX3VzZHQoKQoKICAgIGNvbmZpZ3VyZWRfcHJvZHVjdHMgPSBzdW0oCiAgICAgICAgMQogICAgICAgIGZvciB2YWx1ZQogICAgICAgIGluIHByb2R1Y3RfcHJpY2VzLnZhbHVlcygpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUKICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgIvCflqUgPGI+2YjYtti524zYqiDYs9ix2YjYsSDZiCDYs9ix2YjbjNiz4oCM2YfYpzwvYj5cbiIKICAgICAgICAgICAgIuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgVxuXG4iCgogICAgICAgICAgICBmIvCfkI0gUHl0aG9uOiA8Y29kZT57ZXNjYXBlKHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkpfTwvY29kZT5cbiIKICAgICAgICAgICAgZiLij7EgVXB0aW1lOiA8Y29kZT57X2h1bWFuX3VwdGltZSgpfTwvY29kZT5cbiIKICAgICAgICAgICAgZiLwn5eEIERhdGFiYXNlOiA8Yj57J+KchSDYs9in2YTZhScgaWYgZGJfb2sgZWxzZSAn4p2MINiu2LfYpyd9PC9iPlxuIgogICAgICAgICAgICBmIvCfkrUg2YLbjNmF2KrigIzZh9in24wg2b7Yp9uM2Yc6IDxiPntjb25maWd1cmVkX3Byb2R1Y3RzfS97bGVuKFBST0RVQ1RfTEFCRUxTKX0g2KrZhti424zZheKAjNi02K/ZhzwvYj5cbiIKICAgICAgICAgICAgIvCfk4ggVVNEVC9Ub21hbjogPGI+RmFsbGJhY2sg2obZhtivINi12LHYp9mB24wg2LnZhdmI2YXbjDwvYj5cbiIKICAgICAgICAgICAgIvCfk6Yg2KrYrdmI24zZhCDYs9mB2KfYsdi0OiA8Yj7Yr9iz2KrbjCDYqtmI2LPYtyDZhdin2YTaqTwvYj4iCiAgICAgICAgKSwKICAgICAgICBnZXRfYWRtaW5fc2VydmVyX3N0YXR1c19rZXlib2FyZCgpLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoCiAgICBGLmRhdGEuaW5fKAogICAgICAgIHsKICAgICAgICAgICAgImFkbWluX2NoZWNrX2RhdGFiYXNlIiwKICAgICAgICAgICAgImFkbWluX2NoZWNrX2FwaXMiLAogICAgICAgICAgICAiYWRtaW5fY2hlY2tfd2FsbGV0cyIsCiAgICAgICAgfQogICAgKQopCmFzeW5jIGRlZiBhZG1pbl9zZXJ2ZXJfY2hlY2tzKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICBkYjogRGF0YWJhc2VNYW5hZ2VyLAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIGlmIGNhbGxiYWNrLmRhdGEgPT0gImFkbWluX2NoZWNrX2RhdGFiYXNlIjoKICAgICAgICBvayA9IGF3YWl0IGRiLmhlYWx0aF9jaGVjaygpCgogICAgICAgIHRleHQgPSAoCiAgICAgICAgICAgICLinIUg2K/bjNiq2KfYqNuM2LMg2LPYp9mE2YUg2KfYs9iqLiIKICAgICAgICAgICAgaWYgb2sKICAgICAgICAgICAgZWxzZSAi4p2MIEhlYWx0aCBjaGVjayDYr9uM2KrYp9io24zYsyDZhtin2YXZiNmB2YIg2KjZiNivLiIKICAgICAgICApCgogICAgZWxpZiBjYWxsYmFjay5kYXRhID09ICJhZG1pbl9jaGVja193YWxsZXRzIjoKICAgICAgICBzdGF0cyA9IGF3YWl0IGRiLmdldF9zdGF0aXN0aWNzKCkKCiAgICAgICAgdGV4dCA9ICgKICAgICAgICAgICAgIvCfkrMg2YXYrNmF2YjYuSDZhdmI2KzZiNiv24wg2KvYqNiq4oCM2LTYr9mHINqp2KfYsdio2LHYp9mGOlxuIgogICAgICAgICAgICBmIntfZm10X2ludChzdGF0cy5nZXQoJ3dhbGxldF9iYWxhbmNlX3RvbWFuJykpfSDYqtmI2YXYp9mGIgogICAgICAgICkKCiAgICBlbHNlOgogICAgICAgIHByaWNlcyA9IGF3YWl0IF9wcm9kdWN0X3NlcnZpY2UoCiAgICAgICAgICAgIGRiCiAgICAgICAgKS5nZXRfYWxsX2Jhc2VfdXNkdCgpCgogICAgICAgIGNvbmZpZ3VyZWRfY291bnQgPSBzdW0oCiAgICAgICAgICAgIDEKICAgICAgICAgICAgZm9yIHZhbHVlCiAgICAgICAgICAgIGluIHByaWNlcy52YWx1ZXMoKQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZQogICAgICAgICkKCiAgICAgICAgdGV4dCA9ICgKICAgICAgICAgICAgIvCfkrUgUHJvZHVjdCBwcmljaW5nOiAiCiAgICAgICAgICAgIGYie2NvbmZpZ3VyZWRfY291bnR9L3tsZW4oUFJPRFVDVF9MQUJFTFMpfSBjb25maWd1cmVkIgogICAgICAgICAgICAiXG5VU0RUL1RvbWFuIG1hcmtldCBkYXRhOiBwdWJsaWMgbXVsdGktZXhjaGFuZ2UgZmFsbGJhY2siCiAgICAgICAgICAgICJcbkRlbGl2ZXJ5OiBtYW51YWwgb3duZXIgZnVsZmlsbG1lbnQiCiAgICAgICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjaywKICAgICAgICB0ZXh0LAogICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIExvZ3MKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoRi5kYXRhID09ICJhZG1pbl9sb2dzX3ZpZXciKQphc3luYyBkZWYgYWRtaW5fbG9nc19tZW51KAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAga2V5Ym9hcmQgPSBJbmxpbmVLZXlib2FyZE1hcmt1cCgKICAgICAgICBpbmxpbmVfa2V5Ym9hcmQ9WwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICAgICAgICAgICAgICB0ZXh0PSLZhNin2q/igIzZh9in24wg2KfYrtuM2LEiLAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGE9ImFkbWluX2xvZ3NfcmVjZW50IiwKICAgICAgICAgICAgICAgICAgICBzdHlsZT0icHJpbWFyeSIsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgSW5saW5lS2V5Ym9hcmRCdXR0b24oCiAgICAgICAgICAgICAgICAgICAgdGV4dD0i2K7Yt9in2YfYp9uMINin2K7bjNixIiwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhPSJhZG1pbl9sb2dzX2Vycm9ycyIsCiAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImRhbmdlciIsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICAgICAgICAgICAgICB0ZXh0PSLYqNin2LLar9i02KoiLAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGE9ImFkbWluX21haW4iLAogICAgICAgICAgICAgICAgICAgIHN0eWxlPSJkYW5nZXIiLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBdLAogICAgICAgIF0KICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgIvCfk50gPGI+2YXYr9uM2LHbjNiqINmE2Kfar+KAjNmH2Kc8L2I+XG5cbiIKICAgICAgICAgICAgItmG2YjYuSDZhNin2q8g2LHYpyDYp9mG2KrYrtin2Kgg2qnZhtuM2K8uIgogICAgICAgICksCiAgICAgICAga2V5Ym9hcmQsCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKZGVmIF9yZWFkX2xvZ19saW5lcygKICAgICosCiAgICBlcnJvcnNfb25seTogYm9vbCwKICAgIGxpbWl0OiBpbnQgPSAzNSwKKSAtPiBzdHI6CiAgICBwYXRoID0gUGF0aCgKICAgICAgICAibWF0cml4X2JvdC5sb2ciCiAgICApCgogICAgaWYgbm90IHBhdGguaXNfZmlsZSgpOgogICAgICAgIHJldHVybiAi2YHYp9uM2YQgbWF0cml4X2JvdC5sb2cg2b7bjNiv2Kcg2YbYtNivLiIKCiAgICB0cnk6CiAgICAgICAgbGluZXMgPSBwYXRoLnJlYWRfdGV4dCgKICAgICAgICAgICAgZW5jb2Rpbmc9InV0Zi04IiwKICAgICAgICAgICAgZXJyb3JzPSJyZXBsYWNlIiwKICAgICAgICApLnNwbGl0bGluZXMoKQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGYi2K7Yt9inINiv2LEg2K7ZiNin2YbYr9mGINmE2Kfarzoge2V4Y30iCiAgICAgICAgKQoKICAgIGlmIGVycm9yc19vbmx5OgogICAgICAgIGxpbmVzID0gWwogICAgICAgICAgICBsaW5lCiAgICAgICAgICAgIGZvciBsaW5lCiAgICAgICAgICAgIGluIGxpbmVzCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICIgLSBFUlJPUiAtICIgaW4gbGluZQogICAgICAgICAgICAgICAgb3IgIiAtIENSSVRJQ0FMIC0gIiBpbiBsaW5lCiAgICAgICAgICAgICkKICAgICAgICBdCgogICAgc2VsZWN0ZWQgPSBsaW5lc1sKICAgICAgICAtbGltaXQ6CiAgICBdCgogICAgY29udGVudCA9ICJcbiIuam9pbigKICAgICAgICBzZWxlY3RlZAogICAgKQoKICAgICMgS2VlcCBUZWxlZ3JhbSBIVE1MIG1lc3NhZ2UgYmVsb3cgbGltaXQuCiAgICByZXR1cm4gY29udGVudFsKICAgICAgICAtMzIwMDoKICAgIF0KCgpAcm91dGVyLmNhbGxiYWNrX3F1ZXJ5KAogICAgRi5kYXRhLmluXygKICAgICAgICB7CiAgICAgICAgICAgICJhZG1pbl9sb2dzX3JlY2VudCIsCiAgICAgICAgICAgICJhZG1pbl9sb2dzX2Vycm9ycyIsCiAgICAgICAgICAgICJhZG1pbl9sb2dzX3NlY3VyaXR5IiwKICAgICAgICB9CiAgICApCikKYXN5bmMgZGVmIGFkbWluX2xvZ3Nfc2hvdygKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAopIC0+IE5vbmU6CiAgICBpZiBub3QgYXdhaXQgX2d1YXJkX2NhbGxiYWNrKAogICAgICAgIGNhbGxiYWNrCiAgICApOgogICAgICAgIHJldHVybgoKICAgIGVycm9yc19vbmx5ID0gKAogICAgICAgIGNhbGxiYWNrLmRhdGEKICAgICAgICA9PSAiYWRtaW5fbG9nc19lcnJvcnMiCiAgICApCgogICAgY29udGVudCA9IGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgIF9yZWFkX2xvZ19saW5lcywKICAgICAgICBlcnJvcnNfb25seT1lcnJvcnNfb25seSwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgICgKICAgICAgICAgICAgIvCfk50gPGI+2YTYp9qvINiz24zYs9iq2YU8L2I+XG5cbiIKICAgICAgICAgICAgZiI8cHJlPntlc2NhcGUoY29udGVudCl9PC9wcmU+IgogICAgICAgICksCiAgICAgICAgX2JhY2tfYW5kX3JlZnJlc2hfa2V5Ym9hcmQoCiAgICAgICAgICAgIGNhbGxiYWNrLmRhdGEKICAgICAgICAgICAgb3IgImFkbWluX2xvZ3NfdmlldyIKICAgICAgICApLAogICAgKQoKICAgIGF3YWl0IF9zYWZlX2Fuc3dlcigKICAgICAgICBjYWxsYmFjawogICAgKQoKCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoRi5kYXRhID09ICJhZG1pbl9sb2dzX2NsZWFyIikKYXN5bmMgZGVmIGFkbWluX2xvZ3NfY2xlYXJfZGlzYWJsZWQoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9jYWxsYmFjaygKICAgICAgICBjYWxsYmFjawogICAgKToKICAgICAgICByZXR1cm4KCiAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgKAogICAgICAgICAgICAi2KjYsdin24wg2KzZhNmI2q/bjNix24wg2KfYsiDYrdiw2YEg2KrYtdin2K/ZgduMINi02YjYp9mH2K8g2K7Yt9in2IwgIgogICAgICAgICAgICAi2b7Yp9qp4oCM2LPYp9iy24wg2YTYp9qvINin2LIg2K/Yp9iu2YQg2LHYqNin2Kog2LrbjNix2YHYudin2YQg2KfYs9iqLiIKICAgICAgICApLAogICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEJvdCBzZXR0aW5ncwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQHJvdXRlci5jYWxsYmFja19xdWVyeShGLmRhdGEgPT0gImFkbWluX2JvdF9zZXR0aW5ncyIpCmFzeW5jIGRlZiBhZG1pbl9ib3Rfc2V0dGluZ3MoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKKSAtPiBOb25lOgogICAgaWYgbm90IGF3YWl0IF9ndWFyZF9jYWxsYmFjaygKICAgICAgICBjYWxsYmFjawogICAgKToKICAgICAgICByZXR1cm4KCiAgICBzdXBwb3J0ID0gc3RyKAogICAgICAgIGdldGF0dHIoCiAgICAgICAgICAgIHNldHRpbmdzLAogICAgICAgICAgICAiU1VQUE9SVF9VU0VSTkFNRSIsCiAgICAgICAgICAgICLigJQiLAogICAgICAgICkKICAgICAgICBvciAi4oCUIgogICAgKQoKICAgIGF3YWl0IF9zYWZlX2VkaXQoCiAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgKAogICAgICAgICAgICAi4pqZ77iPIDxiPtiq2YbYuNuM2YXYp9iqINix2KjYp9iqPC9iPlxuIgogICAgICAgICAgICAi4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBXG5cbiIKICAgICAgICAgICAgZiLZvti02KrbjNio2KfZhtuMOiA8Y29kZT57ZXNjYXBlKHN1cHBvcnQpfTwvY29kZT5cbiIKICAgICAgICAgICAgZiLYqti52K/Yp9ivINmF2K/bjNix2KfZhiBDb25maWc6IDxjb2RlPntsZW4oX2FkbWluX2lkcygpKX08L2NvZGU+XG5cbiIKICAgICAgICAgICAgIvCflJAg2K/Ys9iq2LHYs9uMINmF2K/bjNixINmB2YLYtyDYp9iyIEFETUlOX0lEUyDYrtmI2KfZhtiv2Ycg2YXbjOKAjNi02YjYry5cbiIKICAgICAgICAgICAgItio2LHYp9uMINis2YTZiNqv24zYsduMINin2LIg2KrYutuM24zYsSDZhtin2KfZhdmGINiq2YbYuNuM2YXYp9iqINit2LPYp9iz2IwgIgogICAgICAgICAgICAiVG9rZW7Zh9inINmIIEFkbWluIElE2YfYpyDYp9iyINiv2KfYrtmEINiq2YTar9ix2KfZhSDZiNuM2LHYp9uM2LQg2YbZhduM4oCM2LTZiNmG2K8uIgogICAgICAgICksCiAgICAgICAgX2JhY2tfYWRtaW5fa2V5Ym9hcmQoKSwKICAgICkKCiAgICBhd2FpdCBfc2FmZV9hbnN3ZXIoCiAgICAgICAgY2FsbGJhY2sKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBlbmRpbmcgcmVjZWlwdHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkByb3V0ZXIuY2FsbGJhY2tfcXVlcnkoRi5kYXRhID09ICJhZG1pbl9wZW5kaW5nX3JlY2VpcHRzIikKYXN5bmMgZGVmIGFkbWluX3BlbmRpbmdfcmVjZWlwdHMoCiAgICBjYWxsYmFjazogQ2FsbGJhY2tRdWVyeSwKICAgIGRiOiBEYXRhYmFzZU1hbmFnZXIsCikgLT4gTm9uZToKICAgIGlmIG5vdCBhd2FpdCBfZ3VhcmRfY2FsbGJhY2soCiAgICAgICAgY2FsbGJhY2sKICAgICk6CiAgICAgICAgcmV0dXJuCgogICAgcGF0aCA9IF9kYl9wYXRoKAogICAgICAgIGRiCiAgICApCgogICAgdHJ5OgogICAgICAgIHJvd3MgPSBhd2FpdCBhc3luY2lvLnRvX3RocmVhZCgKICAgICAgICAgICAgX3NxbGl0ZV9yb3dzLAogICAgICAgICAgICBwYXRoLAogICAgICAgICAgICAiIiIKICAgICAgICAgICAgU0VMRUNUCiAgICAgICAgICAgICAgICB0eF9pZCwKICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICBhbW91bnRfdG9tYW4sCiAgICAgICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgICAgICBnYXRld2F5LAogICAgICAgICAgICAgICAgY3JlYXRlZF9hdAogICAgICAgICAgICBGUk9NIHRyYW5zYWN0aW9ucwogICAgICAgICAgICBXSEVSRSBMT1dFUigKICAgICAgICAgICAgICAgIENPQUxFU0NFKHN0YXR1cywgJycpCiAgICAgICAgICAgICkgSU4gKAogICAgICAgICAgICAgICAgJ3BlbmRpbmcnLAogICAgICAgICAgICAgICAgJ3dhaXRpbmcnLAogICAgICAgICAgICAgICAgJ3JldmlldycKICAgICAgICAgICAgKQogICAgICAgICAgICBPUkRFUiBCWSBjcmVhdGVkX2F0IERFU0MKICAgICAgICAgICAgTElNSVQgMjAKICAgICAgICAgICAgIiIiLAogICAgICAgICkKCiAgICBleGNlcHQgc3FsaXRlMy5PcGVyYXRpb25hbEVycm9yOgogICAgICAgIHJvd3MgPSBbXQoKICAgIGlmIHJvd3M6CiAgICAgICAgbGluZXMgPSBbXQoKICAgICAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBmIuKAoiA8Y29kZT57ZXNjYXBlKHN0cihyb3cuZ2V0KCd0eF9pZCcpIG9yICfigJQnKSl9PC9jb2RlPiB8ICIKICAgICAgICAgICAgICAgICAgICBmInVzZXI9PGNvZGU+e3Jvdy5nZXQoJ3VzZXJfaWQnKX08L2NvZGU+IHwgIgogICAgICAgICAgICAgICAgICAgIGYiPGNvZGU+e19mbXRfaW50KHJvdy5nZXQoJ2Ftb3VudF90b21hbicpKX08L2NvZGU+INiq2YjZhdin2YYgfCAiCiAgICAgICAgICAgICAgICAgICAgZiJ7ZXNjYXBlKHN0cihyb3cuZ2V0KCdzdGF0dXMnKSBvciAn4oCUJykpfSIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICB0ZXh0ID0gKAogICAgICAgICAgICAi8J+nviA8Yj7Yqtix2KfaqdmG2LTigIzZh9in24wg2YXYudmE2YI8L2I+XG4iCiAgICAgICAgICAgICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIFcblxuIgogICAgICAgICAgICArICJcblxuIi5qb2luKAogICAgICAgICAgICAgICAgbGluZXMKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICBlbHNlOgogICAgICAgIHRleHQgPSAoCiAgICAgICAgICAgICLwn6e+IDxiPtiq2LHYp9qp2YbYtOKAjNmH2KfbjCDZhdi52YTZgjwvYj5cblxuIgogICAgICAgICAgICAi2YXZiNix2K/bjCDYqNix2KfbjCDYqNix2LHYs9uMINmI2KzZiNivINmG2K/Yp9ix2K8uIgogICAgICAgICkKCiAgICBhd2FpdCBfc2FmZV9lZGl0KAogICAgICAgIGNhbGxiYWNrLAogICAgICAgIHRleHQsCiAgICAgICAgX2JhY2tfYW5kX3JlZnJlc2hfa2V5Ym9hcmQoCiAgICAgICAgICAgICJhZG1pbl9wZW5kaW5nX3JlY2VpcHRzIgogICAgICAgICksCiAgICApCgogICAgYXdhaXQgX3NhZmVfYW5zd2VyKAogICAgICAgIGNhbGxiYWNrCiAgICApCgoKX19hbGxfXyA9IFsKICAgICJyb3V0ZXIiLAogICAgIkFkbWluQWN0aW9uU3RhdGVzIiwKXQo=', 'handlers/admin/panel.py': 'IyBoYW5kbGVycy9hZG1pbi9wYW5lbC5weQoKaW1wb3J0IGxvZ2dpbmcKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgRGljdCwgT3B0aW9uYWwKCmZyb20gYWlvZ3JhbSBpbXBvcnQgRiwgUm91dGVyCmZyb20gYWlvZ3JhbS5leGNlcHRpb25zIGltcG9ydCBUZWxlZ3JhbUJhZFJlcXVlc3QKZnJvbSBhaW9ncmFtLmZzbS5jb250ZXh0IGltcG9ydCBGU01Db250ZXh0CmZyb20gYWlvZ3JhbS50eXBlcyBpbXBvcnQgQ2FsbGJhY2tRdWVyeSwgTWVzc2FnZQoKZnJvbSBjb3JlLmNvbmZpZyBpbXBvcnQgc2V0dGluZ3MKZnJvbSBrZXlib2FyZHMuYWRtaW5fa2IgaW1wb3J0IGdldF9hZG1pbl9tYWluX21lbnUKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKcm91dGVyID0gUm91dGVyKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEFETUlOIEFDQ0VTUwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9jb25maWd1cmVkX2FkbWluX2lkcygpIC0+IGZyb3plbnNldFtpbnRdOgogICAgIiIiCiAgICDYqtmG2YfYpyDZhdmG2KjYuSDYr9iz2KrYsdiz24wg2YXYr9uM2LHbjNiqOgogICAgICAgIGNvcmUuY29uZmlnLnNldHRpbmdzLmdldF9hZG1pbl9saXN0KCkKCiAgICDZh9uM2oYgQWRtaW4gSUQg2K/Yp9iu2YQg2KfbjNmGINmB2KfbjNmEIGhhcmRjb2RlINmG2YXbjOKAjNi02YjYry4KICAgICIiIgogICAgbWV0aG9kID0gZ2V0YXR0cigKICAgICAgICBzZXR0aW5ncywKICAgICAgICAiZ2V0X2FkbWluX2xpc3QiLAogICAgICAgIE5vbmUsCiAgICApCgogICAgaWYgY2FsbGFibGUobWV0aG9kKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBmcm96ZW5zZXQoCiAgICAgICAgICAgICAgICBpbnQodXNlcl9pZCkKICAgICAgICAgICAgICAgIGZvciB1c2VyX2lkCiAgICAgICAgICAgICAgICBpbiBtZXRob2QoKQogICAgICAgICAgICAgICAgaWYgaW50KHVzZXJfaWQpID4gMAogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlYWQgY29uZmlndXJlZCBhZG1pbiBsaXN0LiIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIGZyb3plbnNldCgpCgogICAgcmF3ID0gc3RyKAogICAgICAgIGdldGF0dHIoCiAgICAgICAgICAgIHNldHRpbmdzLAogICAgICAgICAgICAiQURNSU5fSURTIiwKICAgICAgICAgICAgIiIsCiAgICAgICAgKQogICAgICAgIG9yICIiCiAgICApCgogICAgcmVzdWx0OiBzZXRbaW50XSA9IHNldCgpCgogICAgZm9yIGl0ZW0gaW4gcmF3LnNwbGl0KCIsIik6CiAgICAgICAgaXRlbSA9IGl0ZW0uc3RyaXAoKQoKICAgICAgICBpZiBub3QgaXRlbToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB2YWx1ZSA9IGludChpdGVtKQoKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgdmFsdWUgPiAwOgogICAgICAgICAgICByZXN1bHQuYWRkKHZhbHVlKQoKICAgIHJldHVybiBmcm96ZW5zZXQocmVzdWx0KQoKCmFzeW5jIGRlZiB2ZXJpZnlfYWRtaW5fYWNjZXNzKAogICAgdXNlcl9pZDogaW50LAopIC0+IGJvb2w6CiAgICAiIiIKICAgINio2LHYsdiz24wg2K/Ys9iq2LHYs9uMINio2KcgQ29uZmlnINmF2LHaqdiy24wg2b7YsdmI2pjZhy4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHVzZXJfaWQgPSBpbnQodXNlcl9pZCkKCiAgICBleGNlcHQgKAogICAgICAgIFR5cGVFcnJvciwKICAgICAgICBWYWx1ZUVycm9yLAogICAgKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBpZiB1c2VyX2lkIDw9IDA6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgcmV0dXJuICgKICAgICAgICB1c2VyX2lkCiAgICAgICAgaW4gZ2V0X2NvbmZpZ3VyZWRfYWRtaW5faWRzKCkKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNZU1RFTSBNRVRSSUNTCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgphc3luYyBkZWYgZmV0Y2hfcmVhbHRpbWVfc3lzdGVtX21ldHJpY3MoKSAtPiBEaWN0W3N0ciwgQW55XToKICAgICIiIgogICAg2K/YsduM2KfZgdiqINii2YXYp9ixINiz24zYs9iq2YUg2KjYsdin24wg2K/Yp9i02KjZiNix2K8g2YXYr9uM2LHbjNiqLgoKICAgINin24zZhiDYqtin2KjYuSDZgdi52YTYp9mLINmF2YLYr9in2LEg2b7bjNi04oCM2YHYsdi2INio2LHZhduM4oCM2q/Ysdiv2KfZhtivINiq2Kcg2KjZhyDYr9uM2KrYp9io24zYswogICAg2YXYqti12YQg2LTZiNivLgogICAgIiIiCgogICAgdHJ5OgogICAgICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICMgREFUQUJBU0UgRVhBTVBMRQogICAgICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICMKICAgICAgICAjIGZyb20gdXRpbHMuZGF0YWJhc2UgaW1wb3J0IGRiX21hbmFnZXIKICAgICAgICAjCiAgICAgICAgIyB0b3RhbF91c2VycyA9IGF3YWl0IGRiX21hbmFnZXIuZ2V0X3RvdGFsX3VzZXJzKCkKICAgICAgICAjIHBlbmRpbmdfa3ljID0gYXdhaXQgZGJfbWFuYWdlci5nZXRfcGVuZGluZ19reWNfY291bnQoKQogICAgICAgICMgYWN0aXZlX3NlcnZpY2VzID0gYXdhaXQgZGJfbWFuYWdlci5nZXRfYWN0aXZlX3NlcnZpY2VzX2NvdW50KCkKICAgICAgICAjIGJhbm5lZF91c2VycyA9IGF3YWl0IGRiX21hbmFnZXIuZ2V0X2Jhbm5lZF91c2Vyc19jb3VudCgpCiAgICAgICAgIwogICAgICAgICMgcmV0dXJuIHsKICAgICAgICAjICAgICAidG90YWxfdXNlcnMiOiB0b3RhbF91c2VycywKICAgICAgICAjICAgICAicGVuZGluZ19reWMiOiBwZW5kaW5nX2t5YywKICAgICAgICAjICAgICAiYWN0aXZlX3NlcnZpY2VzIjogYWN0aXZlX3NlcnZpY2VzLAogICAgICAgICMgICAgICJiYW5uZWRfdXNlcnMiOiBiYW5uZWRfdXNlcnMsCiAgICAgICAgIyAgICAgInNlcnZlcl9zdGF0dXMiOiAi2LnZhdmE24zYp9iq24wg8J+foiIsCiAgICAgICAgIyAgICAgImRiX2xhdGVuY3kiOiAiMTJtcyIsCiAgICAgICAgIyB9CgogICAgICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICMgVEVNUE9SQVJZIEZBTExCQUNLCiAgICAgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJ0b3RhbF91c2VycyI6IDAsCiAgICAgICAgICAgICJwZW5kaW5nX2t5YyI6IDAsCiAgICAgICAgICAgICJhY3RpdmVfc2VydmljZXMiOiAwLAogICAgICAgICAgICAiYmFubmVkX3VzZXJzIjogMCwKICAgICAgICAgICAgInNlcnZlcl9zdGF0dXMiOiAi2LnZhdmE24zYp9iq24wg8J+foiIsCiAgICAgICAgICAgICJkYl9sYXRlbmN5IjogIk4vQSIsCiAgICAgICAgfQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigiRmFpbGVkIHRvIGZldGNoIHN5c3RlbSBtZXRyaWNzIikKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInRvdGFsX3VzZXJzIjogMCwKICAgICAgICAgICAgInBlbmRpbmdfa3ljIjogMCwKICAgICAgICAgICAgImFjdGl2ZV9zZXJ2aWNlcyI6IDAsCiAgICAgICAgICAgICJiYW5uZWRfdXNlcnMiOiAwLAogICAgICAgICAgICAic2VydmVyX3N0YXR1cyI6ICLYrti32Kcg4pqg77iPIiwKICAgICAgICAgICAgImRiX2xhdGVuY3kiOiAiTi9BIiwKICAgICAgICB9CgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBEQVNIQk9BUkQgVEVYVAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGJ1aWxkX2FkbWluX2Rhc2hib2FyZF90ZXh0KG1ldHJpY3M6IERpY3Rbc3RyLCBBbnldKSAtPiBzdHI6CiAgICAiIiIKICAgINiz2KfYrtiqINmF2KrZhiDYr9in2LTYqNmI2LHYryDZhdiv24zYsduM2KouCiAgICAiIiIKCiAgICB0b3RhbF91c2VycyA9IGludChtZXRyaWNzLmdldCgidG90YWxfdXNlcnMiLCAwKSBvciAwKQogICAgcGVuZGluZ19reWMgPSBpbnQobWV0cmljcy5nZXQoInBlbmRpbmdfa3ljIiwgMCkgb3IgMCkKICAgIGFjdGl2ZV9zZXJ2aWNlcyA9IGludChtZXRyaWNzLmdldCgiYWN0aXZlX3NlcnZpY2VzIiwgMCkgb3IgMCkKICAgIGJhbm5lZF91c2VycyA9IGludChtZXRyaWNzLmdldCgiYmFubmVkX3VzZXJzIiwgMCkgb3IgMCkKCiAgICBzZXJ2ZXJfc3RhdHVzID0gbWV0cmljcy5nZXQoCiAgICAgICAgInNlcnZlcl9zdGF0dXMiLAogICAgICAgICLZhtin2YXYtNiu2LUg4pqg77iPIiwKICAgICkKCiAgICBkYl9sYXRlbmN5ID0gbWV0cmljcy5nZXQoCiAgICAgICAgImRiX2xhdGVuY3kiLAogICAgICAgICJOL0EiLAogICAgKQoKICAgIHJldHVybiAoCiAgICAgICAgIvCfmoAgPGI+2YXYsdqp2LIg2YHYsdmF2KfZhtiv2YfbjCDZhdiv24zYsduM2Kog2LHYqNin2Ko8L2I+XG4iCiAgICAgICAgIuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgVxuXG4iCgogICAgICAgICLwn5OKIDxiPtii2YXYp9ixINiz24zYs9iq2YU8L2I+XG5cbiIKCiAgICAgICAgZiLwn5GlINqp2KfYsdio2LHYp9mGINir2KjYquKAjNmG2KfZhduMOiAiCiAgICAgICAgZiI8Y29kZT57dG90YWxfdXNlcnM6LH08L2NvZGU+INmG2YHYsVxuIgoKICAgICAgICBmIuKPsyBLWUMg2K/YsSDYp9mG2KrYuNin2LEg2KjYsdix2LPbjDogIgogICAgICAgIGYiPGNvZGU+e3BlbmRpbmdfa3ljOix9PC9jb2RlPiDZhdmI2LHYr1xuIgoKICAgICAgICBmIuKaoSDYs9ix2YjbjNiz4oCM2YfYp9uMINmB2LnYp9mEOiAiCiAgICAgICAgZiI8Y29kZT57YWN0aXZlX3NlcnZpY2VzOix9PC9jb2RlPiDZhdmI2LHYr1xuIgoKICAgICAgICBmIvCfmqsg2qnYp9ix2KjYsdin2YYg2YXYs9iv2YjYrzogIgogICAgICAgIGYiPGNvZGU+e2Jhbm5lZF91c2VyczosfTwvY29kZT4g2YbZgdixXG5cbiIKCiAgICAgICAgIvCflqUgPGI+2YjYtti524zYqiDYstuM2LHYs9in2K7YqjwvYj5cblxuIgoKICAgICAgICBmIvCfm6Eg2YjYtti524zYqiDYs9ix2YjYsTogPGNvZGU+e3NlcnZlcl9zdGF0dXN9PC9jb2RlPlxuIgogICAgICAgIGYi4o+xINiq2KfYrtuM2LEg2K/bjNiq2KfYqNuM2LM6IDxjb2RlPntkYl9sYXRlbmN5fTwvY29kZT5cblxuIgoKICAgICAgICAi4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBXG4iCiAgICAgICAgIvCfkYcgPGI+2KjYrti0INmF2YjYsdivINmG2LjYsSDYsdinINin2YbYqtiu2KfYqCDaqdmG24zYrzo8L2I+IgogICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgU0FGRSBNRVNTQUdFIEVESVQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmFzeW5jIGRlZiBzYWZlX2VkaXRfZGFzaGJvYXJkKAogICAgY2FsbGJhY2s6IENhbGxiYWNrUXVlcnksCiAgICB0ZXh0OiBzdHIsCikgLT4gYm9vbDoKICAgICIiIgogICAg2YjbjNix2KfbjNi0INin2YXZhiDZvtuM2KfZhSDYr9in2LTYqNmI2LHYry4KCiAgICDYp9qv2LEg2b7bjNin2YUg2YLYqNmE2KfZiyDZh9mF2KfZhiDZhdiq2YYg2LHYpyDYr9in2LTYqtmHINio2KfYtNivINuM2KcgVGVsZWdyYW0KICAgINiu2LfYp9uMIE1lc3NhZ2UgaXMgbm90IG1vZGlmaWVkINio2K/Zh9iv2Iwg2KjYsdmG2KfZhdmHINmF2KrZiNmC2YEg2YbZhduM4oCM2LTZiNivLgogICAgIiIiCgogICAgaWYgbm90IGNhbGxiYWNrLm1lc3NhZ2U6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgdHJ5OgogICAgICAgIGF3YWl0IGNhbGxiYWNrLm1lc3NhZ2UuZWRpdF90ZXh0KAogICAgICAgICAgICB0ZXh0LAogICAgICAgICAgICByZXBseV9tYXJrdXA9Z2V0X2FkbWluX21haW5fbWVudSgpLAogICAgICAgICAgICBwYXJzZV9tb2RlPSJIVE1MIiwKICAgICAgICApCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBleGNlcHQgVGVsZWdyYW1CYWRSZXF1ZXN0IGFzIGV4YzoKICAgICAgICBlcnJvcl90ZXh0ID0gc3RyKGV4YykubG93ZXIoKQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICJtZXNzYWdlIGlzIG5vdCBtb2RpZmllZCIgaW4gZXJyb3JfdGV4dAogICAgICAgICAgICBvciAibWVzc2FnZSBjYW4ndCBiZSBlZGl0ZWQiIGluIGVycm9yX3RleHQKICAgICAgICApOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmFpc2UKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIENBTExCQUNLOiBBRE1JTiBQQU5FTAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQHJvdXRlci5jYWxsYmFja19xdWVyeShGLmRhdGEuaW5fKHsiYWRtaW5fcGFuZWwiLCAiYWRtaW5fbWFpbiJ9KSkKYXN5bmMgZGVmIGFkbWluX2Rhc2hib2FyZF9jYWxsYmFjaygKICAgIGNhbGxiYWNrOiBDYWxsYmFja1F1ZXJ5LAogICAgc3RhdGU6IEZTTUNvbnRleHQsCikgLT4gTm9uZToKICAgICIiIgogICAg2YbZhdin24zYtCDZvtmG2YQg2YXYr9uM2LHbjNiqINin2LIg2LfYsduM2YIgQ2FsbGJhY2suCiAgICAiIiIKCiAgICBpZiBub3QgY2FsbGJhY2suZnJvbV91c2VyOgogICAgICAgIGF3YWl0IGNhbGxiYWNrLmFuc3dlcigKICAgICAgICAgICAgIuKdjCDYp9i32YTYp9i52KfYqiDaqdin2LHYqNixINiv2LHbjNin2YHYqiDZhti02K8uIiwKICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBhZG1pbl9pZCA9IGNhbGxiYWNrLmZyb21fdXNlci5pZAoKICAgIHRyeToKICAgICAgICAjINm+2Kfaqdiz2KfYstuMIFN0YXRl2YfYp9uMINmC2KjZhNuMCiAgICAgICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgICAgICAjINio2LHYsdiz24wg2K/Ys9iq2LHYs9uMCiAgICAgICAgaWYgbm90IGF3YWl0IHZlcmlmeV9hZG1pbl9hY2Nlc3MoYWRtaW5faWQpOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJVbmF1dGhvcml6ZWQgYWRtaW4gcGFuZWwgY2FsbGJhY2sgYXR0ZW1wdDogdXNlcl9pZD0lcyIsCiAgICAgICAgICAgICAgICBhZG1pbl9pZCwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2suYW5zd2VyKAogICAgICAgICAgICAgICAgIuKblCDYtNmF2Kcg2K/Ys9iq2LHYs9uMINmF2K/bjNix24zYqiDZhtiv2KfYsduM2K8uIiwKICAgICAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyDYr9ix24zYp9mB2Kog2KLZhdin2LEKICAgICAgICBtZXRyaWNzID0gYXdhaXQgZmV0Y2hfcmVhbHRpbWVfc3lzdGVtX21ldHJpY3MoKQoKICAgICAgICAjINiz2KfYrtiqINiv2KfYtNio2YjYsdivCiAgICAgICAgZGFzaGJvYXJkX3RleHQgPSBidWlsZF9hZG1pbl9kYXNoYm9hcmRfdGV4dChtZXRyaWNzKQoKICAgICAgICAjINmG2YXYp9uM2LQKICAgICAgICBhd2FpdCBzYWZlX2VkaXRfZGFzaGJvYXJkKAogICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgZGFzaGJvYXJkX3RleHQsCiAgICAgICAgKQoKICAgICAgICBhd2FpdCBjYWxsYmFjay5hbnN3ZXIoKQoKICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgIkFkbWluIGRhc2hib2FyZCBvcGVuZWQgdmlhIGNhbGxiYWNrIHwgYWRtaW5faWQ9JXMiLAogICAgICAgICAgICBhZG1pbl9pZCwKICAgICAgICApCgogICAgZXhjZXB0IFRlbGVncmFtQmFkUmVxdWVzdCBhcyBleGM6CiAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICJUZWxlZ3JhbSBlcnJvciB3aGlsZSBvcGVuaW5nIGFkbWluIGRhc2hib2FyZDogJXMiLAogICAgICAgICAgICBleGMsCiAgICAgICAgKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGF3YWl0IGNhbGxiYWNrLmFuc3dlcigKICAgICAgICAgICAgICAgICLimqDvuI8g2KfbjNmGINm+24zYp9mFINiv24zar9ixINmC2KfYqNmEINmI24zYsdin24zYtCDZhtuM2LPYqi4iLAogICAgICAgICAgICAgICAgc2hvd19hbGVydD1UcnVlLAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IFRlbGVncmFtQmFkUmVxdWVzdDoKICAgICAgICAgICAgcGFzcwoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZXJyb3IgaW4gYWRtaW5fZGFzaGJvYXJkX2NhbGxiYWNrIHwgYWRtaW5faWQ9JXMiLAogICAgICAgICAgICBhZG1pbl9pZCwKICAgICAgICApCgogICAgICAgIHRyeToKICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2suYW5zd2VyKAogICAgICAgICAgICAgICAgIuKdjCDYrti32Kcg2K/YsSDYqNin2LHar9iw2KfYsduMINm+2YbZhCDZhdiv24zYsduM2KouIiwKICAgICAgICAgICAgICAgIHNob3dfYWxlcnQ9VHJ1ZSwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBUZWxlZ3JhbUJhZFJlcXVlc3Q6CiAgICAgICAgICAgIHBhc3MKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1FU1NBR0U6IC9BRE1JTgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQHJvdXRlci5tZXNzYWdlKAogICAgRi50ZXh0LmluXygKICAgICAgICB7CiAgICAgICAgICAgICIvYWRtaW4iLAogICAgICAgICAgICAiL3BhbmVsIiwKICAgICAgICAgICAgItm+2YbZhCDZhdiv24zYsduM2KoiLAogICAgICAgICAgICAi2YXZhtmI24wg2YXYr9uM2LHbjNiqIiwKICAgICAgICAgICAgItmF2K/bjNix24zYqiIsCiAgICAgICAgfQogICAgKQopCmFzeW5jIGRlZiBhZG1pbl9kYXNoYm9hcmRfbWVzc2FnZSgKICAgIG1lc3NhZ2U6IE1lc3NhZ2UsCiAgICBzdGF0ZTogRlNNQ29udGV4dCwKKSAtPiBOb25lOgogICAgIiIiCiAgICDZiNix2YjYryDYqNmHINm+2YbZhCDZhdiv24zYsduM2Kog2KfYsiDYt9ix24zZgiDZvtuM2KfZhSDZhdiq2YbbjC4KICAgICIiIgoKICAgIGlmIG5vdCBtZXNzYWdlLmZyb21fdXNlcjoKICAgICAgICByZXR1cm4KCiAgICBhZG1pbl9pZCA9IG1lc3NhZ2UuZnJvbV91c2VyLmlkCgogICAgdHJ5OgogICAgICAgICMg2b7Yp9qpINqp2LHYr9mGIFN0YXRlINmC2KjZhNuMCiAgICAgICAgYXdhaXQgc3RhdGUuY2xlYXIoKQoKICAgICAgICAjINio2LHYsdiz24wg2K/Ys9iq2LHYs9uMCiAgICAgICAgaWYgbm90IGF3YWl0IHZlcmlmeV9hZG1pbl9hY2Nlc3MoYWRtaW5faWQpOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJVbmF1dGhvcml6ZWQgYWRtaW4gcGFuZWwgbWVzc2FnZSBhdHRlbXB0OiB1c2VyX2lkPSVzIiwKICAgICAgICAgICAgICAgIGFkbWluX2lkLAogICAgICAgICAgICApCgogICAgICAgICAgICBhd2FpdCBtZXNzYWdlLmFuc3dlcigKICAgICAgICAgICAgICAgICLim5QgPGI+2K/Ys9iq2LHYs9uMINi624zYsdmF2KzYp9iyPC9iPlxuXG4iCiAgICAgICAgICAgICAgICAi2LTZhdinINin2KzYp9iy2Ycg2YjYsdmI2K8g2KjZhyDZvtmG2YQg2YXYr9uM2LHbjNiqINix2Kcg2YbYr9in2LHbjNivLiIsCiAgICAgICAgICAgICAgICBwYXJzZV9tb2RlPSJIVE1MIiwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyDYr9ix24zYp9mB2KogTWV0cmljcwogICAgICAgIG1ldHJpY3MgPSBhd2FpdCBmZXRjaF9yZWFsdGltZV9zeXN0ZW1fbWV0cmljcygpCgogICAgICAgICMg2LPYp9iu2Kog2YXYqtmGCiAgICAgICAgZGFzaGJvYXJkX3RleHQgPSBidWlsZF9hZG1pbl9kYXNoYm9hcmRfdGV4dChtZXRyaWNzKQoKICAgICAgICAjINin2LHYs9in2YQg2b7ZhtmECiAgICAgICAgYXdhaXQgbWVzc2FnZS5hbnN3ZXIoCiAgICAgICAgICAgIGRhc2hib2FyZF90ZXh0LAogICAgICAgICAgICByZXBseV9tYXJrdXA9Z2V0X2FkbWluX21haW5fbWVudSgpLAogICAgICAgICAgICBwYXJzZV9tb2RlPSJIVE1MIiwKICAgICAgICApCgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAiQWRtaW4gZGFzaGJvYXJkIG9wZW5lZCB2aWEgbWVzc2FnZSB8IGFkbWluX2lkPSVzIiwKICAgICAgICAgICAgYWRtaW5faWQsCiAgICAgICAgKQoKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZXJyb3IgaW4gYWRtaW5fZGFzaGJvYXJkX21lc3NhZ2UgfCBhZG1pbl9pZD0lcyIsCiAgICAgICAgICAgIGFkbWluX2lkLAogICAgICAgICkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBhd2FpdCBtZXNzYWdlLmFuc3dlcigKICAgICAgICAgICAgICAgICLinYwg2K7Yt9in24zbjCDZh9mG2q/Yp9mFINio2KfYsiDaqdix2K/ZhiDZvtmG2YQg2YXYr9uM2LHbjNiqINix2K4g2K/Yp9ivLlxuIgogICAgICAgICAgICAgICAgItmE2LfZgdin2Ysg2K/ZiNio2KfYsdmHINiq2YTYp9i0INqp2YbbjNivLiIsCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgpfX2FsbF9fID0gWwogICAgInJvdXRlciIsCiAgICAidmVyaWZ5X2FkbWluX2FjY2VzcyIsCiAgICAiZ2V0X2NvbmZpZ3VyZWRfYWRtaW5faWRzIiwKXQo=', 'keyboards/admin_kb.py': 'IyBrZXlib2FyZHMvYWRtaW5fa2IucHkKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmZyb20gdHlwaW5nIGltcG9ydCBGaW5hbAoKZnJvbSBhaW9ncmFtLnR5cGVzIGltcG9ydCAoCiAgICBJbmxpbmVLZXlib2FyZEJ1dHRvbiwKICAgIElubGluZUtleWJvYXJkTWFya3VwLAopCmZyb20gYWlvZ3JhbS51dGlscy5rZXlib2FyZCBpbXBvcnQgKAogICAgSW5saW5lS2V5Ym9hcmRCdWlsZGVyLAopCgpmcm9tIGNvcmUudWlfZW1vamlzIGltcG9ydCBlbW9qaV9pZAoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgVGVsZWdyYW0gR2xhc3MgQnV0dG9uIFN0eWxlcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU1RZTEVfUFJJTUFSWTogRmluYWxbc3RyXSA9ICJwcmltYXJ5IgpTVFlMRV9TVUNDRVNTOiBGaW5hbFtzdHJdID0gInN1Y2Nlc3MiClNUWUxFX0RBTkdFUjogRmluYWxbc3RyXSA9ICJkYW5nZXIiCgpfQUxMT1dFRF9TVFlMRVM6IEZpbmFsW2Zyb3plbnNldFtzdHJdXSA9IGZyb3plbnNldCgKICAgIHsKICAgICAgICBTVFlMRV9QUklNQVJZLAogICAgICAgIFNUWUxFX1NVQ0NFU1MsCiAgICAgICAgU1RZTEVfREFOR0VSLAogICAgfQopCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBTdHlsZSBQb2xpY3kKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIwojIHN1Y2Nlc3MgPSDYqtin24zbjNiv2Iwg2YHYudin2YTigIzYs9in2LLbjNiMINio2LHZiNiy2LHYs9in2YbbjCDZhdir2KjYqtiMINiq2qnZhduM2YQKIyBkYW5nZXIgID0g2LHYr9iMINit2LDZgdiMINmF2LPYr9mI2K/Ys9in2LLbjNiMINi624zYsdmB2LnYp9mE4oCM2LPYp9iy24zYjCDYrtix2YjYrNiMINiu2LfYpwojIHByaW1hcnkgPSDZiNix2YjYryDYqNmHINmF2YbZiNiMINmF2LTYp9mH2K/Zh9iMINis2LPYqtis2YjYjCDYqNin2LLar9i02KrYjCDYqtmG2LjbjNmF2KfYqgojCiMg2KrZhdin2YUg2K/aqdmF2YfigIzZh9inINio2KfbjNivINi52YTYp9mI2Ycg2KjYsSBzdHlsZSDbjNqpIGljb25fY3VzdG9tX2Vtb2ppX2lkCiMgUHJlbWl1bSDZhtuM2LIg2K/Yp9i02KrZhyDYqNin2LTZhtivLgojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNoYXJlZCBQcmVtaXVtIEN1c3RvbSBFbW9qaSBJRHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkVNT0pJX1NVQ0NFU1M6IEZpbmFsW3N0cl0gPSBlbW9qaV9pZCgic3VjY2VzcyIpCkVNT0pJX0RBTkdFUjogRmluYWxbc3RyXSA9IGVtb2ppX2lkKCJlcnJvciIpCkVNT0pJX1NFVFRJTkdTOiBGaW5hbFtzdHJdID0gZW1vamlfaWQoInNwYXJrbGVzIikKRU1PSklfTU9ORVk6IEZpbmFsW3N0cl0gPSBlbW9qaV9pZCgibW9uZXkiKQpFTU9KSV9VU0VSOiBGaW5hbFtzdHJdID0gZW1vamlfaWQoInVzZXIiKQpFTU9KSV9QSE9ORTogRmluYWxbc3RyXSA9IGVtb2ppX2lkKCJzdXBwb3J0IikKRU1PSklfQlJPQURDQVNUOiBGaW5hbFtzdHJdID0gZW1vamlfaWQoImNoYXQiKQpFTU9KSV9GSUxFOiBGaW5hbFtzdHJdID0gZW1vamlfaWQoImxpc3QiKQpFTU9KSV9VUDogRmluYWxbc3RyXSA9IGVtb2ppX2lkKCJib2x0IikKRU1PSklfRE9XTjogRmluYWxbc3RyXSA9IGVtb2ppX2lkKCJiYWNrIikKRU1PSklfV0FSTklORzogRmluYWxbc3RyXSA9IGVtb2ppX2lkKCJ3YXJuaW5nIikKRU1PSklfU0VSVkVSOiBGaW5hbFtzdHJdID0gZW1vamlfaWQoImxvYWRpbmciKQpFTU9KSV9BRE1JTjogRmluYWxbc3RyXSA9IGVtb2ppX2lkKCJ1c2VycyIpCkVNT0pJX1BBQ0tBR0U6IEZpbmFsW3N0cl0gPSBlbW9qaV9pZCgicGFja2FnZSIpCkVNT0pJX1dBTExFVDogRmluYWxbc3RyXSA9IGVtb2ppX2lkKCJ3YWxsZXQiKQpFTU9KSV9TSE9QOiBGaW5hbFtzdHJdID0gZW1vamlfaWQoInNob3AiKQpFTU9KSV9QUkVNSVVNOiBGaW5hbFtzdHJdID0gZW1vamlfaWQoInByZW1pdW0iKQpFTU9KSV9TVEFSUzogRmluYWxbc3RyXSA9IGVtb2ppX2lkKCJzdGFycyIpCkVNT0pJX0JBQ0s6IEZpbmFsW3N0cl0gPSBlbW9qaV9pZCgiYmFjayIpCkVNT0pJX0hJU1RPUlk6IEZpbmFsW3N0cl0gPSBlbW9qaV9pZCgiaGlzdG9yeSIpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBJbnRlcm5hbCBIZWxwZXJzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgX3ZhbGlkYXRlX2NhbGxiYWNrX2RhdGEoCiAgICBjYWxsYmFja19kYXRhOiBzdHIsCikgLT4gc3RyOgogICAgY2FsbGJhY2tfZGF0YSA9IHN0cigKICAgICAgICBjYWxsYmFja19kYXRhCiAgICApLnN0cmlwKCkKCiAgICBpZiBub3QgY2FsbGJhY2tfZGF0YToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAiY2FsbGJhY2tfZGF0YSBjYW5ub3QgYmUgZW1wdHkuIgogICAgICAgICkKCiAgICBpZiBsZW4oCiAgICAgICAgY2FsbGJhY2tfZGF0YS5lbmNvZGUoInV0Zi04IikKICAgICkgPiA2NDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAiY2FsbGJhY2tfZGF0YSBleGNlZWRzIFRlbGVncmFtIDY0LWJ5dGUgbGltaXQuIgogICAgICAgICkKCiAgICByZXR1cm4gY2FsbGJhY2tfZGF0YQoKCmRlZiBfdmFsaWRhdGVfaWQoCiAgICB2YWx1ZSwKICAgICosCiAgICBuYW1lOiBzdHIgPSAiaWQiLAopIC0+IGludDoKICAgIHRyeToKICAgICAgICB2YWx1ZSA9IGludCh2YWx1ZSkKICAgIGV4Y2VwdCAoCiAgICAgICAgVHlwZUVycm9yLAogICAgICAgIFZhbHVlRXJyb3IsCiAgICApIGFzIGV4YzoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICBmIntuYW1lfSBtdXN0IGJlIGFuIGludGVnZXIuIgogICAgICAgICkgZnJvbSBleGMKCiAgICBpZiB2YWx1ZSA8PSAwOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgIGYie25hbWV9IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIgogICAgICAgICkKCiAgICByZXR1cm4gdmFsdWUKCgpkZWYgX2J1dHRvbigKICAgIHRleHQ6IHN0ciwKICAgIGNhbGxiYWNrX2RhdGE6IHN0ciwKICAgIHN0eWxlOiBzdHIgPSBTVFlMRV9QUklNQVJZLAogICAgaWNvbjogc3RyIHwgTm9uZSA9IE5vbmUsCikgLT4gSW5saW5lS2V5Ym9hcmRCdXR0b246CiAgICAiIiIKICAgIEZhY3Rvcnkg2YXYsdqp2LLbjCDYqtmF2KfZhSDYr9qp2YXZh+KAjNmH2KfbjCDZvtmG2YQg2KfYr9mF24zZhi4KCiAgICDYqtmF2KfZhSBjYWxsYmFjayBidXR0b27Zh9in24wg2KfbjNmGINmB2KfbjNmEOgogICAgICAgIC0gc3R5bGUg2K/Yp9ix2YbYrwogICAgICAgIC0gUHJlbWl1bSBDdXN0b20gRW1vamkg2K/Yp9ix2YbYrwogICAgICAgIC0gY2FsbGJhY2tfZGF0YSDYotmG4oCM2YfYpyB2YWxpZGF0ZSDZhduM4oCM2LTZiNivCiAgICAiIiIKICAgIGlmIHN0eWxlIG5vdCBpbiBfQUxMT1dFRF9TVFlMRVM6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgZiJJbnZhbGlkIGJ1dHRvbiBzdHlsZToge3N0eWxlIXJ9IgogICAgICAgICkKCiAgICBjYWxsYmFja19kYXRhID0gX3ZhbGlkYXRlX2NhbGxiYWNrX2RhdGEoCiAgICAgICAgY2FsbGJhY2tfZGF0YQogICAgKQoKICAgICMg2YfbjNqGINiv2qnZhdmH4oCM2KfbjCDYqNiv2YjZhiDYp9iz2KrYp9uM2YQg24zYpyDYotuM2qnZhiBQcmVtaXVtINiz2KfYrtiq2Ycg2YbZhduM4oCM2LTZiNivLgogICAgaWYgbm90IGljb246CiAgICAgICAgaWYgc3R5bGUgPT0gU1RZTEVfU1VDQ0VTUzoKICAgICAgICAgICAgaWNvbiA9IEVNT0pJX1NVQ0NFU1MKICAgICAgICBlbGlmIHN0eWxlID09IFNUWUxFX0RBTkdFUjoKICAgICAgICAgICAgaWNvbiA9IEVNT0pJX0RBTkdFUgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGljb24gPSBFTU9KSV9TRVRUSU5HUwoKICAgIHJldHVybiBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICB0ZXh0PXN0cih0ZXh0KSwKICAgICAgICBjYWxsYmFja19kYXRhPWNhbGxiYWNrX2RhdGEsCiAgICAgICAgc3R5bGU9c3R5bGUsCiAgICAgICAgaWNvbl9jdXN0b21fZW1vamlfaWQ9aWNvbiwKICAgICkKCgpkZWYgX3VybF9idXR0b24oCiAgICB0ZXh0OiBzdHIsCiAgICB1cmw6IHN0ciwKICAgICosCiAgICBzdHlsZTogc3RyID0gU1RZTEVfUFJJTUFSWSwKICAgIGljb246IHN0ciB8IE5vbmUgPSBOb25lLAopIC0+IElubGluZUtleWJvYXJkQnV0dG9uOgogICAgIiIiCiAgICDYr9qp2YXZhyDZhNuM2YbaqSDYrtin2LHYrNuMINio2Kcg2YfZhdin2YYg2LPbjNiz2KrZhSDYp9iz2KrYp9uM2YQg2YggUHJlbWl1bSBFbW9qaS4KICAgICIiIgogICAgdXJsID0gc3RyKHVybCkuc3RyaXAoKQoKICAgIGlmIG5vdCB1cmw6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgInVybCBjYW5ub3QgYmUgZW1wdHkuIgogICAgICAgICkKCiAgICBpZiBzdHlsZSBub3QgaW4gX0FMTE9XRURfU1RZTEVTOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgIGYiSW52YWxpZCBidXR0b24gc3R5bGU6IHtzdHlsZSFyfSIKICAgICAgICApCgogICAgaWYgbm90IGljb246CiAgICAgICAgaWYgc3R5bGUgPT0gU1RZTEVfU1VDQ0VTUzoKICAgICAgICAgICAgaWNvbiA9IEVNT0pJX1NVQ0NFU1MKICAgICAgICBlbGlmIHN0eWxlID09IFNUWUxFX0RBTkdFUjoKICAgICAgICAgICAgaWNvbiA9IEVNT0pJX0RBTkdFUgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGljb24gPSBFTU9KSV9TRVRUSU5HUwoKICAgIHJldHVybiBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICB0ZXh0PXN0cih0ZXh0KSwKICAgICAgICB1cmw9dXJsLAogICAgICAgIHN0eWxlPXN0eWxlLAogICAgICAgIGljb25fY3VzdG9tX2Vtb2ppX2lkPWljb24sCiAgICApCgoKZGVmIF9wcmltYXJ5KAogICAgdGV4dDogc3RyLAogICAgY2FsbGJhY2tfZGF0YTogc3RyLAogICAgaWNvbjogc3RyIHwgTm9uZSA9IEVNT0pJX1NFVFRJTkdTLAopIC0+IElubGluZUtleWJvYXJkQnV0dG9uOgogICAgcmV0dXJuIF9idXR0b24oCiAgICAgICAgdGV4dD10ZXh0LAogICAgICAgIGNhbGxiYWNrX2RhdGE9Y2FsbGJhY2tfZGF0YSwKICAgICAgICBzdHlsZT1TVFlMRV9QUklNQVJZLAogICAgICAgIGljb249aWNvbiwKICAgICkKCgpkZWYgX3N1Y2Nlc3MoCiAgICB0ZXh0OiBzdHIsCiAgICBjYWxsYmFja19kYXRhOiBzdHIsCiAgICBpY29uOiBzdHIgfCBOb25lID0gRU1PSklfU1VDQ0VTUywKKSAtPiBJbmxpbmVLZXlib2FyZEJ1dHRvbjoKICAgIHJldHVybiBfYnV0dG9uKAogICAgICAgIHRleHQ9dGV4dCwKICAgICAgICBjYWxsYmFja19kYXRhPWNhbGxiYWNrX2RhdGEsCiAgICAgICAgc3R5bGU9U1RZTEVfU1VDQ0VTUywKICAgICAgICBpY29uPWljb24sCiAgICApCgoKZGVmIF9kYW5nZXIoCiAgICB0ZXh0OiBzdHIsCiAgICBjYWxsYmFja19kYXRhOiBzdHIsCiAgICBpY29uOiBzdHIgfCBOb25lID0gRU1PSklfREFOR0VSLAopIC0+IElubGluZUtleWJvYXJkQnV0dG9uOgogICAgcmV0dXJuIF9idXR0b24oCiAgICAgICAgdGV4dD10ZXh0LAogICAgICAgIGNhbGxiYWNrX2RhdGE9Y2FsbGJhY2tfZGF0YSwKICAgICAgICBzdHlsZT1TVFlMRV9EQU5HRVIsCiAgICAgICAgaWNvbj1pY29uLAogICAgKQoKCmRlZiBfYmFjaygKICAgIGNhbGxiYWNrX2RhdGE6IHN0ciA9ICJhZG1pbl9tYWluIiwKICAgIHRleHQ6IHN0ciA9ICLYqNin2LLar9i02KoiLAopIC0+IElubGluZUtleWJvYXJkQnV0dG9uOgogICAgcmV0dXJuIF9wcmltYXJ5KAogICAgICAgIHRleHQ9dGV4dCwKICAgICAgICBjYWxsYmFja19kYXRhPWNhbGxiYWNrX2RhdGEsCiAgICAgICAgaWNvbj1FTU9KSV9CQUNLLAogICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTWFpbiBBZG1pbiBNZW51CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X2FkbWluX21haW5fbWVudSgpIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgIyBPd25lciBhcHByb3ZhbCBoYXMgcHJpb3JpdHkgaW4gdGhpcyBwcm9qZWN0LgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYr9ix2K7ZiNin2LPYquKAjNmH2KfbjCDYrtix24zYryDZhdmG2KrYuNixINiq2KfbjNuM2K8iLAogICAgICAgICAgICAiYWRtaW5fb3JkZXJzX3BlbmRpbmdfb3duZXIiLAogICAgICAgICAgICBFTU9KSV9QQUNLQUdFLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfZGFuZ2VyKAogICAgICAgICAgICAi2LPZgdin2LHYtOKAjNmH2KfbjCDZhtuM2KfYstmF2YbYryDYqNix2LHYs9uMINiv2LPYqtuMIiwKICAgICAgICAgICAgImFkbWluX29yZGVyc19wcm92aWRlcl91bmtub3duIiwKICAgICAgICAgICAgRU1PSklfV0FSTklORywKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYqNix2LHYs9uMINin2K3Ysdin2LIg2YfZiNuM2KrigIzZh9in24wg2KzYr9uM2K8iLAogICAgICAgICAgICAiYWRtaW5fa3ljX3F1ZXVlIiwKICAgICAgICAgICAgRU1PSklfU1VDQ0VTUywKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYotmF2KfYsSDZiCDar9iy2KfYsdi02KfYqiDZhdin2YTbjCIsCiAgICAgICAgICAgICJhZG1pbl9zdGF0cyIsCiAgICAgICAgICAgIEVNT0pJX0hJU1RPUlksCiAgICAgICAgKSwKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItiq2YbYuNuM2YUg2YbYsdiuINin2LHYsiDZiCDZgtuM2YXYquKAjNmH2KciLAogICAgICAgICAgICAiYWRtaW5fcHJpY2luZyIsCiAgICAgICAgICAgIEVNT0pJX01PTkVZLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhdiv24zYsduM2Kog2LPZgdin2LHYtOKAjNmH2KciLAogICAgICAgICAgICAiYWRtaW5fb3JkZXJzX21hbmFnZSIsCiAgICAgICAgICAgIEVNT0pJX1BBQ0tBR0UsCiAgICAgICAgKSwKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItis2LPYqtis2YjbjCDaqdin2LHYqNixIiwKICAgICAgICAgICAgImFkbWluX3NlYXJjaF91c2VyIiwKICAgICAgICAgICAgRU1PSklfVVNFUiwKICAgICAgICApLAogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2KfYsdiz2KfZhCDZvtuM2KfZhSDZh9mF2q/Yp9mG24wiLAogICAgICAgICAgICAiYWRtaW5fYnJvYWRjYXN0IiwKICAgICAgICAgICAgRU1PSklfQlJPQURDQVNULAogICAgICAgICksCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYqtmG2LjbjNmF2KfYqiDZvtuM2LTYsdmB2KrZhyDYsdio2KfYqiIsCiAgICAgICAgICAgICJhZG1pbl9ib3Rfc2V0dGluZ3MiLAogICAgICAgICAgICBFTU9KSV9TRVRUSU5HUywKICAgICAgICApLAogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2YjYtti524zYqiDYs9ix2YjYsSDZiCDYs9ix2YjbjNiz4oCM2YfYpyIsCiAgICAgICAgICAgICJhZG1pbl9zZXJ2ZXJfc3RhdHVzIiwKICAgICAgICAgICAgRU1PSklfU0VSVkVSLAogICAgICAgICksCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhdiv24zYsduM2Kog2YTYp9qv4oCM2YfYpyDZiCDYrti32KfZh9inIiwKICAgICAgICAgICAgImFkbWluX2xvZ3NfdmlldyIsCiAgICAgICAgICAgIEVNT0pJX0ZJTEUsCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItin2YHYstin24zYtCAvINqp2KfZh9i0INmF2YjYrNmI2K/bjCIsCiAgICAgICAgICAgICJhZG1pbl93YWxsZXRfYWRqdXN0IiwKICAgICAgICAgICAgRU1PSklfTU9ORVksCiAgICAgICAgKSwKICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgItmB24zYtOKAjNmH2KfbjCDZiNin2LHbjNiy24wg2YXYudmE2YIiLAogICAgICAgICAgICAiYWRtaW5fcGVuZGluZ19yZWNlaXB0cyIsCiAgICAgICAgICAgIEVNT0pJX0ZJTEUsCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfZGFuZ2VyKAogICAgICAgICAgICAi2K7YsdmI2Kwg2KfYsiDZvtmG2YQg2YXYr9uM2LHbjNiqIiwKICAgICAgICAgICAgIm1haW5fbWVudSIsCiAgICAgICAgICAgIEVNT0pJX0RBTkdFUiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE93bmVyIEFwcHJvdmFsIC8gTWFya2V0QXBwIE9yZGVyIEtleWJvYXJkcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9vd25lcl9vcmRlcl9rZXlib2FyZCgKICAgIG9yZGVyX2lkOiBpbnQsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICAiIiIKICAgINqp24zYqNmI2LHYryDYp9i12YTbjCDYs9mB2KfYsdi024wg2qnZhyDYqNin24zYryDZhdin2YTaqSDYqtin24zbjNivINuM2Kcg2LHYryDaqdmG2K8uCgogICAgY2FsbGJhY2vZh9inINiv2YLbjNmC2KfZiyDYqNinIGhhbmRsZXJzL3VzZXIvc2hvcC5weSDYrNiv24zYryDZh9mF2KfZh9mG2q/igIzYp9mG2K8uCiAgICAiIiIKICAgIG9yZGVyX2lkID0gX3ZhbGlkYXRlX2lkKAogICAgICAgIG9yZGVyX2lkLAogICAgICAgIG5hbWU9Im9yZGVyX2lkIiwKICAgICkKCiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgItiq2KfbjNuM2K8g2Ygg2KLZhdin2K/Zh+KAjNiz2KfYstuMINiq2K3ZiNuM2YQiLAogICAgICAgICAgICBmIm93bmVyX2FwcHJvdmVfb3JkZXJfe29yZGVyX2lkfSIsCiAgICAgICAgICAgIEVNT0pJX1NVQ0NFU1MsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9kYW5nZXIoCiAgICAgICAgICAgICLYsdivINiv2LHYrtmI2KfYs9iqINiu2LHbjNivIiwKICAgICAgICAgICAgZiJvd25lcl9yZWplY3Rfb3JkZXJfe29yZGVyX2lkfSIsCiAgICAgICAgICAgIEVNT0pJX0RBTkdFUiwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhdi02KfZh9iv2Ycg2KzYstim24zYp9iqINiz2YHYp9ix2LQiLAogICAgICAgICAgICBmImFkbWluX29yZGVyX3ZpZXdfe29yZGVyX2lkfSIsCiAgICAgICAgICAgIEVNT0pJX0ZJTEUsCiAgICAgICAgKQogICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKZGVmIGdldF9wcm92aWRlcl91bmtub3duX29yZGVyX2tleWJvYXJkKAogICAgb3JkZXJfaWQ6IGludCwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgICIiIgogICAg2LPZgdin2LHYtOKAjNmH2KfbjNuMINqp2Ycg2K/Ysdiu2YjYp9iz2KogTWFya2V0QXBwINin2K3YqtmF2KfZhNin2Ysg2KfYsdiz2KfZhCDYtNiv2YcKICAgINmI2YTbjCDZhtiq24zYrNmHINmC2LfYuduMINiv2LHbjNin2YHYqiDZhti02K/ZhyDYp9iz2KouCgogICAg2LnZhdiv2KfZiyDYr9qp2YXZhyDCq9iu2LHbjNivINiv2YjYqNin2LHZh8K7INmG2K/Yp9ix2K8uCiAgICAiIiIKICAgIG9yZGVyX2lkID0gX3ZhbGlkYXRlX2lkKAogICAgICAgIG9yZGVyX2lkLAogICAgICAgIG5hbWU9Im9yZGVyX2lkIiwKICAgICkKCiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfZGFuZ2VyKAogICAgICAgICAgICAi2KjYsdix2LPbjCDYr9iz2KrbjCDZiNi22LnbjNiqINiz2YHYp9ix2LQiLAogICAgICAgICAgICBmImFkbWluX29yZGVyX3JlY29uY2lsZV97b3JkZXJfaWR9IiwKICAgICAgICAgICAgRU1PSklfV0FSTklORywKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhdi02KfZh9iv2Ycg2KzYstim24zYp9iqINiz2YHYp9ix2LQiLAogICAgICAgICAgICBmImFkbWluX29yZGVyX3ZpZXdfe29yZGVyX2lkfSIsCiAgICAgICAgICAgIEVNT0pJX0ZJTEUsCiAgICAgICAgKSwKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItm+24zYp9mFINio2Ycg2K7YsduM2K/Yp9ixIiwKICAgICAgICAgICAgZiJhZG1pbl9vcmRlcl9tZXNzYWdlX3tvcmRlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9CUk9BRENBU1QsCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgImFkbWluX29yZGVyc19wcm92aWRlcl91bmtub3duIiwKICAgICAgICAgICAgItio2KfYstqv2LTYqiDYqNmHINiz2YHYp9ix2LTigIzZh9in24wg2YbYp9mF2LTYrti1IiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEtZQyBSZXZpZXcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfYWRtaW5fa3ljX3Jldmlld19rZXlib2FyZCgKICAgIHVzZXJfaWQ6IGludCwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIHVzZXJfaWQgPSBfdmFsaWRhdGVfaWQoCiAgICAgICAgdXNlcl9pZCwKICAgICAgICBuYW1lPSJ1c2VyX2lkIiwKICAgICkKCiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgItiq2KfbjNuM2K8g2KfYrdix2KfYsiDZh9mI24zYqiIsCiAgICAgICAgICAgIGYia3ljX2FwcHJvdmVfe3VzZXJfaWR9IiwKICAgICAgICAgICAgRU1PSklfU1VDQ0VTUywKICAgICAgICApLAogICAgICAgIF9kYW5nZXIoCiAgICAgICAgICAgICLYsdivINmF2K/Yp9ix2qkiLAogICAgICAgICAgICBmImt5Y19yZWplY3Rfe3VzZXJfaWR9IiwKICAgICAgICAgICAgRU1PSklfREFOR0VSLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYp9ix2LPYp9mEINin2K7Yt9in2LEg2KjZhyDaqdin2LHYqNixIiwKICAgICAgICAgICAgZiJreWNfd2Fybl97dXNlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9XQVJOSU5HLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgImFkbWluX2t5Y19xdWV1ZSIsCiAgICAgICAgICAgICLYqNin2LLar9i02Kog2KjZhyDZhNuM2LPYqiDYp9mG2KrYuNin2LEiLAogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJpY2luZwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl9wcmljaW5nX2tleWJvYXJkKCkgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItmC24zZhdiq4oCM2YfYp9uMIFByZW1pdW0gKFVTRFQpIiwKICAgICAgICAgICAgImFkbWluX3Byb2R1Y3RfcHJpY2VzX3ByZW1pdW0iLAogICAgICAgICAgICBFTU9KSV9QUkVNSVVNLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItmC24zZhdiq4oCM2YfYp9uMIFN0YXJzIChVU0RUKSIsCiAgICAgICAgICAgICJhZG1pbl9wcm9kdWN0X3ByaWNlc19zdGFycyIsCiAgICAgICAgICAgIEVNT0pJX1NUQVJTLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItmG2LHYriDYr9iz2KrbjCBVU0RUIiwKICAgICAgICAgICAgInNldF9yYXRlX3VzZHQiLAogICAgICAgICAgICBFTU9KSV9NT05FWSwKICAgICAgICApLAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2YbYsdiuINiv2LPYqtuMIFRPTi9HUkFNIiwKICAgICAgICAgICAgInNldF9yYXRlX3RvbiIsCiAgICAgICAgICAgIEVNT0pJX1VQLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYqNix2YjYstix2LPYp9mG24wg2K7ZiNiv2qnYp9ixINmG2LHYriDYqNin2LLYp9ixIiwKICAgICAgICAgICAgImF1dG9fc3luY19yYXRlcyIsCiAgICAgICAgICAgIEVNT0pJX1NFVFRJTkdTLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgImFkbWluX21haW4iLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqINio2Ycg2YXZhtmI24wg2YXYr9uM2LHbjNiqIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEJvdCBTZXR0aW5ncwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl9ib3Rfc2V0dGluZ3Nfa2V5Ym9hcmQoCiAgICBpc19tYWludGVuYW5jZTogYm9vbCA9IEZhbHNlLAogICAgYXV0b19iYWNrdXA6IGJvb2wgPSBUcnVlLAopIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgaWYgYm9vbCgKICAgICAgICBpc19tYWludGVuYW5jZQogICAgKToKICAgICAgICBidWlsZGVyLnJvdygKICAgICAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICAgICAi2K7Yp9mF2YjYtCDaqdix2K/ZhiDYrdin2YTYqiDYqti52YXbjNix2KfYqiIsCiAgICAgICAgICAgICAgICAiYWRtaW5fdG9nZ2xlX21haW50X29mZiIsCiAgICAgICAgICAgICAgICBFTU9KSV9TVUNDRVNTLAogICAgICAgICAgICApCiAgICAgICAgKQogICAgZWxzZToKICAgICAgICBidWlsZGVyLnJvdygKICAgICAgICAgICAgX2RhbmdlcigKICAgICAgICAgICAgICAgICLZgdi52KfZhOKAjNiz2KfYstuMINit2KfZhNiqINiq2LnZhduM2LHYp9iqIiwKICAgICAgICAgICAgICAgICJhZG1pbl90b2dnbGVfbWFpbnRfb24iLAogICAgICAgICAgICAgICAgRU1PSklfV0FSTklORywKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICBpZiBib29sKAogICAgICAgIGF1dG9fYmFja3VwCiAgICApOgogICAgICAgIGJhY2t1cF9idXR0b24gPSBfZGFuZ2VyKAogICAgICAgICAgICAi2LrbjNix2YHYudin2YTigIzYs9in2LLbjCDYqNqp2KfZviDYrtmI2K/aqdin2LEiLAogICAgICAgICAgICAiYWRtaW5fdG9nZ2xlX2JhY2t1cF9vZmYiLAogICAgICAgICAgICBFTU9KSV9EQU5HRVIsCiAgICAgICAgKQogICAgZWxzZToKICAgICAgICBiYWNrdXBfYnV0dG9uID0gX3N1Y2Nlc3MoCiAgICAgICAgICAgICLZgdi52KfZhOKAjNiz2KfYstuMINio2qnYp9m+INiu2YjYr9qp2KfYsSIsCiAgICAgICAgICAgICJhZG1pbl90b2dnbGVfYmFja3VwX29uIiwKICAgICAgICAgICAgRU1PSklfU1VDQ0VTUywKICAgICAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgYmFja3VwX2J1dHRvbiwKICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgItiq2YfbjNmHINm+2LTYqtuM2KjYp9mGINiv2LPYqtuMIiwKICAgICAgICAgICAgImFkbWluX2ZvcmNlX2JhY2t1cCIsCiAgICAgICAgICAgIEVNT0pJX0ZJTEUsCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItmF2K/bjNix24zYqiDaqdin2LHYquKAjNmH2Kcg2Ygg2K/Ysdqv2KfZh+KAjNmH2KciLAogICAgICAgICAgICAiYWRtaW5fbWFuYWdlX2NhcmRzIiwKICAgICAgICAgICAgRU1PSklfV0FMTEVULAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgImFkbWluX21haW4iLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqINio2Ycg2YXZhtmI24wg2YXYr9uM2LHbjNiqIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFVzZXIgTWFuYWdlbWVudAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl91c2VyX21hbmFnZV9rZXlib2FyZCgKICAgIHVzZXJfaWQ6IGludCwKICAgIGlzX2Jsb2NrZWQ6IGJvb2wgPSBGYWxzZSwKICAgIGlzX2FkbWluOiBib29sID0gRmFsc2UsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICB1c2VyX2lkID0gX3ZhbGlkYXRlX2lkKAogICAgICAgIHVzZXJfaWQsCiAgICAgICAgbmFtZT0idXNlcl9pZCIsCiAgICApCgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgaWYgYm9vbCgKICAgICAgICBpc19ibG9ja2VkCiAgICApOgogICAgICAgIGJsb2NrX2J1dHRvbiA9IF9zdWNjZXNzKAogICAgICAgICAgICAi2LHZgdi5INmF2LPYr9mI2K/bjCDaqdin2LHYqNixIiwKICAgICAgICAgICAgZiJhZG1pbl91bmJsb2NrX3t1c2VyX2lkfSIsCiAgICAgICAgICAgIEVNT0pJX1NVQ0NFU1MsCiAgICAgICAgKQogICAgZWxzZToKICAgICAgICBibG9ja19idXR0b24gPSBfZGFuZ2VyKAogICAgICAgICAgICAi2YXYs9iv2YjYryDaqdix2K/ZhiDaqdin2LHYqNixIiwKICAgICAgICAgICAgZiJhZG1pbl9ibG9ja197dXNlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9EQU5HRVIsCiAgICAgICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIGJsb2NrX2J1dHRvbiwKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItmI24zYsdin24zYtCDZhdmI2KzZiNiv24wg2YjZhNiqIiwKICAgICAgICAgICAgZiJhZG1pbl9lZGl0X3dhbGxldF97dXNlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9NT05FWSwKICAgICAgICApLAogICAgKQoKICAgIGlmIGJvb2woCiAgICAgICAgaXNfYWRtaW4KICAgICk6CiAgICAgICAgYWRtaW5fYnV0dG9uID0gX2RhbmdlcigKICAgICAgICAgICAgIti52LLZhCDYp9iyINin2K/ZhduM2YbbjCIsCiAgICAgICAgICAgIGYiYWRtaW5fZGVtb3RlX3t1c2VyX2lkfSIsCiAgICAgICAgICAgIEVNT0pJX0FETUlOLAogICAgICAgICkKICAgIGVsc2U6CiAgICAgICAgYWRtaW5fYnV0dG9uID0gX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYp9ix2KrZgtinINio2Ycg2KfYr9mF24zZhiIsCiAgICAgICAgICAgIGYiYWRtaW5fcHJvbW90ZV97dXNlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9BRE1JTiwKICAgICAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgYWRtaW5fYnV0dG9uLAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2KrYp9ix24zYrtqG2Ycg2KrYsdin2qnZhti04oCM2YfYpyIsCiAgICAgICAgICAgIGYiYWRtaW5fdXNlcl9oaXN0b3J5X3t1c2VyX2lkfSIsCiAgICAgICAgICAgIEVNT0pJX0hJU1RPUlksCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItin2LHYs9in2YQg2b7bjNin2YUg2YXYs9iq2YLbjNmFIiwKICAgICAgICAgICAgZiJhZG1pbl9zZW5kX21zZ197dXNlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9CUk9BRENBU1QsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9iYWNrKAogICAgICAgICAgICAiYWRtaW5fc2VhcmNoX3VzZXIiLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqINio2Ycg2KzYs9iq2KzZiCIsCiAgICAgICAgKQogICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBSZWNlaXB0IFJldmlldwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl9yZWNlaXB0X3Jldmlld19rZXlib2FyZCgKICAgIHR4X2lkOiBzdHIsCiAgICB1c2VyX2lkOiBpbnQsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICB1c2VyX2lkID0gX3ZhbGlkYXRlX2lkKAogICAgICAgIHVzZXJfaWQsCiAgICAgICAgbmFtZT0idXNlcl9pZCIsCiAgICApCgogICAgdHhfaWQgPSBzdHIoCiAgICAgICAgdHhfaWQKICAgICkuc3RyaXAoKQoKICAgIGlmIG5vdCB0eF9pZDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAidHhfaWQgY2Fubm90IGJlIGVtcHR5LiIKICAgICAgICApCgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYqtin24zbjNivINmIINmI2KfYsduM2LIg2KjZhyDYrdiz2KfYqCIsCiAgICAgICAgICAgIGYiYWRtaW5fYWNjZXB0X3JlY2VpcHRfe3R4X2lkfV97dXNlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9TVUNDRVNTLAogICAgICAgICksCiAgICAgICAgX2RhbmdlcigKICAgICAgICAgICAgItix2K8g2YHbjNi0IC8g2KrYsdin2qnZhti0IiwKICAgICAgICAgICAgZiJhZG1pbl9yZWplY3RfcmVjZWlwdF97dHhfaWR9X3t1c2VyX2lkfSIsCiAgICAgICAgICAgIEVNT0pJX0RBTkdFUiwKICAgICAgICApLAogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2K/Ysdiu2YjYp9iz2Kog2KfYsdiz2KfZhCDZhdis2K/YryDYsdiz24zYryIsCiAgICAgICAgICAgIGYiYWRtaW5fYXNrX3JlY2VpcHRfe3VzZXJfaWR9IiwKICAgICAgICAgICAgRU1PSklfUEhPTkUsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9iYWNrKAogICAgICAgICAgICAiYWRtaW5fcGVuZGluZ19yZWNlaXB0cyIsCiAgICAgICAgICAgICLYqNin2LLar9i02Kog2KjZhyDYqtix2KfaqdmG2LTigIzZh9in24wg2YXYudmE2YIiLAogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQnJvYWRjYXN0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X2FkbWluX2Jyb2FkY2FzdF9vcHRpb25zX2tleWJvYXJkKCkgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItin2LHYs9in2YQg2KjZhyDZh9mF2Ycg2qnYp9ix2KjYsdin2YYiLAogICAgICAgICAgICAiYnJvYWRjYXN0X2FsbCIsCiAgICAgICAgICAgIEVNT0pJX0JST0FEQ0FTVCwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLZgdmC2Lcg2qnYp9ix2KjYsdin2YYg2KfYrdix2KfYsiDYtNiv2YciLAogICAgICAgICAgICAiYnJvYWRjYXN0X2t5Y19wYXNzZWQiLAogICAgICAgICAgICBFTU9KSV9TVUNDRVNTLAogICAgICAgICksCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLZgdmC2Lcg2qnYp9ix2KjYsdin2YYg2K/Yp9ix2KfbjCDZhdmI2KzZiNiv24wiLAogICAgICAgICAgICAiYnJvYWRjYXN0X3Bvc2l0aXZlX2JhbGFuY2UiLAogICAgICAgICAgICBFTU9KSV9NT05FWSwKICAgICAgICApLAogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9kYW5nZXIoCiAgICAgICAgICAgICLYqNin2LLar9i02Kog2KjZhyDZhdmG2YjbjCDZhdiv24zYsduM2KoiLAogICAgICAgICAgICAiYWRtaW5fbWFpbiIsCiAgICAgICAgICAgIEVNT0pJX0JBQ0ssCiAgICAgICAgKQogICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBDb25maXJtIFNlbnNpdGl2ZSBBY3Rpb24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfYWRtaW5fY29uZmlybV9hY3Rpb25fa2V5Ym9hcmQoCiAgICBhY3Rpb25fdGFnOiBzdHIsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBhY3Rpb25fdGFnID0gc3RyKAogICAgICAgIGFjdGlvbl90YWcKICAgICkuc3RyaXAoKQoKICAgIGlmIG5vdCBhY3Rpb25fdGFnOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICJhY3Rpb25fdGFnIGNhbm5vdCBiZSBlbXB0eS4iCiAgICAgICAgKQoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9zdWNjZXNzKAogICAgICAgICAgICAi2KjZhNmH2Iwg2YXYt9mF2KbZhiDZh9iz2KrZhSIsCiAgICAgICAgICAgIGYiYWRtaW5fY29uZmlybV95ZXNfe2FjdGlvbl90YWd9IiwKICAgICAgICAgICAgRU1PSklfU1VDQ0VTUywKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2RhbmdlcigKICAgICAgICAgICAgItin2YbYtdix2KfZgSDZiCDYqNin2LLar9i02KoiLAogICAgICAgICAgICAiYWRtaW5fbWFpbiIsCiAgICAgICAgICAgIEVNT0pJX0RBTkdFUiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhZ2luYXRpb24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfYWRtaW5fcGFnaW5hdGlvbl9rZXlib2FyZCgKICAgIGN1cnJlbnRfcGFnZTogaW50LAogICAgdG90YWxfcGFnZXM6IGludCwKICAgIGFjdGlvbl9wcmVmaXg6IHN0ciwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIHRvdGFsX3BhZ2VzID0gbWF4KAogICAgICAgIDEsCiAgICAgICAgaW50KHRvdGFsX3BhZ2VzKSwKICAgICkKCiAgICBjdXJyZW50X3BhZ2UgPSBtYXgoCiAgICAgICAgMSwKICAgICAgICBpbnQoY3VycmVudF9wYWdlKSwKICAgICkKCiAgICBjdXJyZW50X3BhZ2UgPSBtaW4oCiAgICAgICAgY3VycmVudF9wYWdlLAogICAgICAgIHRvdGFsX3BhZ2VzLAogICAgKQoKICAgIGFjdGlvbl9wcmVmaXggPSBzdHIoCiAgICAgICAgYWN0aW9uX3ByZWZpeAogICAgKS5zdHJpcCgpCgogICAgaWYgbm90IGFjdGlvbl9wcmVmaXg6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgImFjdGlvbl9wcmVmaXggY2Fubm90IGJlIGVtcHR5LiIKICAgICAgICApCgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCiAgICBuYXZpZ2F0aW9uX2J1dHRvbnMgPSBbXQoKICAgIGlmIGN1cnJlbnRfcGFnZSA+IDE6CiAgICAgICAgbmF2aWdhdGlvbl9idXR0b25zLmFwcGVuZCgKICAgICAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICAgICAi2YLYqNmE24wiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIGYie2FjdGlvbl9wcmVmaXh9X3BhZ2VfIgogICAgICAgICAgICAgICAgICAgIGYie2N1cnJlbnRfcGFnZSAtIDF9IgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEVNT0pJX1VQLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIG5hdmlnYXRpb25fYnV0dG9ucy5hcHBlbmQoCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGYi2LXZgdit2Ycge2N1cnJlbnRfcGFnZX0gIgogICAgICAgICAgICAgICAgZiLYp9iyIHt0b3RhbF9wYWdlc30iCiAgICAgICAgICAgICksCiAgICAgICAgICAgICJub29wIiwKICAgICAgICAgICAgRU1PSklfU0VUVElOR1MsCiAgICAgICAgKQogICAgKQoKICAgIGlmIGN1cnJlbnRfcGFnZSA8IHRvdGFsX3BhZ2VzOgogICAgICAgIG5hdmlnYXRpb25fYnV0dG9ucy5hcHBlbmQoCiAgICAgICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAgICAgItio2LnYr9uMIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBmInthY3Rpb25fcHJlZml4fV9wYWdlXyIKICAgICAgICAgICAgICAgICAgICBmIntjdXJyZW50X3BhZ2UgKyAxfSIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBFTU9KSV9ET1dOLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgICpuYXZpZ2F0aW9uX2J1dHRvbnMKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgImFkbWluX21haW4iLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqINio2Ycg2YXZhtmI24wg2YXYr9uM2LHbjNiqIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNlYXJjaCBVc2VyIFJlc3VsdAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl91c2VyX3NlYXJjaF9yZXN1bHRfa2V5Ym9hcmQoCiAgICB1c2VyX2lkOiBpbnQsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICB1c2VyX2lkID0gX3ZhbGlkYXRlX2lkKAogICAgICAgIHVzZXJfaWQsCiAgICAgICAgbmFtZT0idXNlcl9pZCIsCiAgICApCgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhdi02KfZh9iv2Ycg2b7YsdmI2YHYp9uM2YQg2qnYp9ix2KjYsSIsCiAgICAgICAgICAgIGYiYWRtaW5fdXNlcl92aWV3X3t1c2VyX2lkfSIsCiAgICAgICAgICAgIEVNT0pJX1VTRVIsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2YjbjNix2KfbjNi0INmF2YjYrNmI2K/bjCIsCiAgICAgICAgICAgIGYiYWRtaW5fZWRpdF93YWxsZXRfe3VzZXJfaWR9IiwKICAgICAgICAgICAgRU1PSklfTU9ORVksCiAgICAgICAgKSwKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItiq2KfYsduM2K7ahtmHINiq2LHYp9qp2YbYtOKAjNmH2KciLAogICAgICAgICAgICBmImFkbWluX3VzZXJfaGlzdG9yeV97dXNlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9ISVNUT1JZLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYp9ix2LPYp9mEINm+24zYp9mFIiwKICAgICAgICAgICAgZiJhZG1pbl9zZW5kX21zZ197dXNlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9CUk9BRENBU1QsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9iYWNrKAogICAgICAgICAgICAiYWRtaW5fc2VhcmNoX3VzZXIiLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqINio2Ycg2KzYs9iq2KzZiCIsCiAgICAgICAgKQogICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQYXltZW50IC8gQ2FyZCBNYW5hZ2VtZW50CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X2FkbWluX3BheW1lbnRfbWV0aG9kc19rZXlib2FyZCgpIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhdiv24zYsduM2Kog2qnYp9ix2KrigIzZh9in24wg2KjYp9mG2qnbjCIsCiAgICAgICAgICAgICJhZG1pbl9jYXJkcyIsCiAgICAgICAgICAgIEVNT0pJX01PTkVZLAogICAgICAgICksCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhdiv24zYsduM2Kog2K/Ysdqv2KfZh+KAjNmH2KciLAogICAgICAgICAgICAiYWRtaW5fZ2F0ZXdheXMiLAogICAgICAgICAgICBFTU9KSV9TRVRUSU5HUywKICAgICAgICApLAogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9zdWNjZXNzKAogICAgICAgICAgICAi2YHYudin2YTigIzYs9in2LLbjCDYsdmI2LQg2b7Ysdiv2KfYrtiqIiwKICAgICAgICAgICAgImFkbWluX3BheW1lbnRfZW5hYmxlIiwKICAgICAgICAgICAgRU1PSklfU1VDQ0VTUywKICAgICAgICApLAogICAgICAgIF9kYW5nZXIoCiAgICAgICAgICAgICLYutuM2LHZgdi52KfZhOKAjNiz2KfYstuMINix2YjYtCDZvtix2K/Yp9iu2KoiLAogICAgICAgICAgICAiYWRtaW5fcGF5bWVudF9kaXNhYmxlIiwKICAgICAgICAgICAgRU1PSklfREFOR0VSLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2JhY2soCiAgICAgICAgICAgICJhZG1pbl9ib3Rfc2V0dGluZ3MiLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFdhbGxldCBBZGp1c3RtZW50CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X2FkbWluX3dhbGxldF9hZGp1c3Rfa2V5Ym9hcmQoCiAgICB1c2VyX2lkOiBpbnQsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICB1c2VyX2lkID0gX3ZhbGlkYXRlX2lkKAogICAgICAgIHVzZXJfaWQsCiAgICAgICAgbmFtZT0idXNlcl9pZCIsCiAgICApCgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYp9mB2LLYp9uM2LQg2YXZiNis2YjYr9uMIiwKICAgICAgICAgICAgZiJhZG1pbl93YWxsZXRfYWRkX3t1c2VyX2lkfSIsCiAgICAgICAgICAgIEVNT0pJX01PTkVZLAogICAgICAgICksCiAgICAgICAgX2RhbmdlcigKICAgICAgICAgICAgItqp2KfZh9i0INmF2YjYrNmI2K/bjCIsCiAgICAgICAgICAgIGYiYWRtaW5fd2FsbGV0X3JlbW92ZV97dXNlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9NT05FWSwKICAgICAgICApLAogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2YXYtNin2YfYr9mHINmF2YjYrNmI2K/bjCIsCiAgICAgICAgICAgIGYiYWRtaW5fd2FsbGV0X3ZpZXdfe3VzZXJfaWR9IiwKICAgICAgICAgICAgRU1PSklfV0FMTEVULAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItiq2KfYsduM2K7ahtmHINiq2LrbjNuM2LHYp9iqINmF2YjYrNmI2K/bjCIsCiAgICAgICAgICAgIGYiYWRtaW5fd2FsbGV0X2hpc3Rvcnlfe3VzZXJfaWR9IiwKICAgICAgICAgICAgRU1PSklfSElTVE9SWSwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2JhY2soCiAgICAgICAgICAgIGYiYWRtaW5fdXNlcl92aWV3X3t1c2VyX2lkfSIsCiAgICAgICAgICAgICLYqNin2LLar9i02KoiLAogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgU3RhdGlzdGljcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl9zdGF0c19rZXlib2FyZCgpIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYotmF2KfYsSDaqdin2LHYqNix2KfZhiIsCiAgICAgICAgICAgICJhZG1pbl9zdGF0c191c2VycyIsCiAgICAgICAgICAgIEVNT0pJX1VTRVIsCiAgICAgICAgKSwKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItii2YXYp9ixINiz2YHYp9ix2LTigIzZh9inIiwKICAgICAgICAgICAgImFkbWluX3N0YXRzX29yZGVycyIsCiAgICAgICAgICAgIEVNT0pJX1BBQ0tBR0UsCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItqv2LLYp9ix2LQg2YXYp9mE24wiLAogICAgICAgICAgICAiYWRtaW5fc3RhdHNfZmluYW5jZSIsCiAgICAgICAgICAgIEVNT0pJX01PTkVZLAogICAgICAgICksCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLar9iy2KfYsdi0INiq2LHYp9qp2YbYtOKAjNmH2KciLAogICAgICAgICAgICAiYWRtaW5fc3RhdHNfdHJhbnNhY3Rpb25zIiwKICAgICAgICAgICAgRU1PSklfSElTVE9SWSwKICAgICAgICApLAogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9zdWNjZXNzKAogICAgICAgICAgICAi2q/Ystin2LHYtCDZgdix2YjYtCDYsdmI2LLYp9mG2YciLAogICAgICAgICAgICAiYWRtaW5fc3RhdHNfZGFpbHkiLAogICAgICAgICAgICBFTU9KSV9TVUNDRVNTLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgImFkbWluX21haW4iLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqINio2Ycg2YXZhtmI24wg2YXYr9uM2LHbjNiqIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNlcnZlciBTdGF0dXMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfYWRtaW5fc2VydmVyX3N0YXR1c19rZXlib2FyZCgpIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYqNix2YjYstix2LPYp9mG24wg2YjYtti524zYqiIsCiAgICAgICAgICAgICJhZG1pbl9zZXJ2ZXJfc3RhdHVzIiwKICAgICAgICAgICAgRU1PSklfU0VUVElOR1MsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2KjYsdix2LPbjCDYr9uM2KrYp9io24zYsyIsCiAgICAgICAgICAgICJhZG1pbl9jaGVja19kYXRhYmFzZSIsCiAgICAgICAgICAgIEVNT0pJX0ZJTEUsCiAgICAgICAgKSwKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItio2LHYsdiz24wgQVBJ2YfYpyIsCiAgICAgICAgICAgICJhZG1pbl9jaGVja19hcGlzIiwKICAgICAgICAgICAgRU1PSklfU0VSVkVSLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYqNix2LHYs9uMINqp24zZgSDZvtmI2YTigIzZh9inIiwKICAgICAgICAgICAgImFkbWluX2NoZWNrX3dhbGxldHMiLAogICAgICAgICAgICBFTU9KSV9XQUxMRVQsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9iYWNrKAogICAgICAgICAgICAiYWRtaW5fbWFpbiIsCiAgICAgICAgICAgICLYqNin2LLar9i02KoiLAogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTG9ncwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl9sb2dzX2tleWJvYXJkKCkgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItmF2LTYp9mH2K/ZhyDZhNin2q/igIzZh9in24wg2KfYrtuM2LEiLAogICAgICAgICAgICAiYWRtaW5fbG9nc19yZWNlbnQiLAogICAgICAgICAgICBFTU9KSV9GSUxFLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfZGFuZ2VyKAogICAgICAgICAgICAi2K7Yt9in2YfYp9uMINin2K7bjNixIiwKICAgICAgICAgICAgImFkbWluX2xvZ3NfZXJyb3JzIiwKICAgICAgICAgICAgRU1PSklfV0FSTklORywKICAgICAgICApLAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2YTYp9qvINin2YXZhtuM2KrbjCIsCiAgICAgICAgICAgICJhZG1pbl9sb2dzX3NlY3VyaXR5IiwKICAgICAgICAgICAgRU1PSklfU0VUVElOR1MsCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfZGFuZ2VyKAogICAgICAgICAgICAi2b7Yp9qp2LPYp9iy24wg2YTYp9qv4oCM2YfYpyIsCiAgICAgICAgICAgICJhZG1pbl9sb2dzX2NsZWFyIiwKICAgICAgICAgICAgRU1PSklfREFOR0VSLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgImFkbWluX21haW4iLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE9yZGVyIE1hbmFnZW1lbnQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfYWRtaW5fb3JkZXJzX2tleWJvYXJkKCkgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICAiIiIKICAgINmF2YbZiNuMINiz2YHYp9ix2LTigIzZh9inINio2Kcg2KfZiNmE2YjbjNiqIE93bmVyIEFwcHJvdmFsINmIIE1hcmtldEFwcC4KICAgICIiIgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYr9ixINin2YbYqti42KfYsSDYqtin24zbjNivINmF2KfZhNqpIiwKICAgICAgICAgICAgImFkbWluX29yZGVyc19wZW5kaW5nX293bmVyIiwKICAgICAgICAgICAgRU1PSklfUEFDS0FHRSwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2RhbmdlcigKICAgICAgICAgICAgItmG24zYp9iy2YXZhtivINio2LHYsdiz24wg2K/Ys9iq24wiLAogICAgICAgICAgICAiYWRtaW5fb3JkZXJzX3Byb3ZpZGVyX3Vua25vd24iLAogICAgICAgICAgICBFTU9KSV9XQVJOSU5HLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItmH2YXZhyDYs9mB2KfYsdi04oCM2YfYpyIsCiAgICAgICAgICAgICJhZG1pbl9vcmRlcnNfYWxsIiwKICAgICAgICAgICAgRU1PSklfRklMRSwKICAgICAgICApLAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2LPZgdin2LHYtOKAjNmH2KfbjCDYrNiv24zYryIsCiAgICAgICAgICAgICJhZG1pbl9vcmRlcnNfbmV3IiwKICAgICAgICAgICAgRU1PSklfUEFDS0FHRSwKICAgICAgICApLAogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2K/YsSDYrdin2YQg2b7Ysdiv2KfYsti0IiwKICAgICAgICAgICAgImFkbWluX29yZGVyc19wcm9jZXNzaW5nIiwKICAgICAgICAgICAgRU1PSklfU0VUVElOR1MsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9zdWNjZXNzKAogICAgICAgICAgICAi2KraqdmF24zZhOKAjNi02K/ZhyIsCiAgICAgICAgICAgICJhZG1pbl9vcmRlcnNfY29tcGxldGVkIiwKICAgICAgICAgICAgRU1PSklfU1VDQ0VTUywKICAgICAgICApLAogICAgICAgIF9kYW5nZXIoCiAgICAgICAgICAgICLYsdivIC8g2YTYutmIINi02K/ZhyIsCiAgICAgICAgICAgICJhZG1pbl9vcmRlcnNfY2FuY2VsbGVkIiwKICAgICAgICAgICAgRU1PSklfREFOR0VSLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYrNiz2KrYrNmI24wg2LPZgdin2LHYtCIsCiAgICAgICAgICAgICJhZG1pbl9vcmRlcl9zZWFyY2giLAogICAgICAgICAgICBFTU9KSV9QSE9ORSwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2JhY2soCiAgICAgICAgICAgICJhZG1pbl9tYWluIiwKICAgICAgICAgICAgItio2KfYstqv2LTYqiIsCiAgICAgICAgKQogICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKZGVmIGdldF9hZG1pbl9vcmRlcl9hY3Rpb25zX2tleWJvYXJkKAogICAgb3JkZXJfaWQ6IHN0ciB8IGludCwKICAgIHN0YXR1czogc3RyIHwgTm9uZSA9IE5vbmUsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICAiIiIKICAgINi52YXZhNuM2KfYqiDYsdmI24wg24zaqSDYs9mB2KfYsdi0LgoKICAgINin2q/YsSBzdGF0dXMg2K/Yp9iv2Ycg2YbYtNmI2K/YjCDYqNix2KfbjCDYs9in2LLar9in2LHbjCDYqNinINqp2K/Zh9in24wg2YLYqNmE24wKICAgINiz2YHYp9ix2LQg2LHYpyBwZW5kaW5nX293bmVyX2FwcHJvdmFsINiv2LEg2YbYuNixINmF24zigIzar9uM2LHYryDZiAogICAg2K/aqdmF2Ycg2KrYp9uM24zYry/YsdivINmF2KfZhNqpINmG2YXYp9uM2LQg2YXbjOKAjNiv2YfYry4KICAgICIiIgogICAgb3JkZXJfaWQgPSBfdmFsaWRhdGVfaWQoCiAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgbmFtZT0ib3JkZXJfaWQiLAogICAgKQoKICAgIHN0YXR1cyA9ICgKICAgICAgICBzdHIoc3RhdHVzKQogICAgICAgIC5zdHJpcCgpCiAgICAgICAgLmxvd2VyKCkKICAgICAgICBpZiBzdGF0dXMgaXMgbm90IE5vbmUKICAgICAgICBlbHNlICJwZW5kaW5nX293bmVyX2FwcHJvdmFsIgogICAgKQoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGlmIHN0YXR1cyA9PSAicGVuZGluZ19vd25lcl9hcHByb3ZhbCI6CiAgICAgICAgYnVpbGRlci5yb3coCiAgICAgICAgICAgIF9zdWNjZXNzKAogICAgICAgICAgICAgICAgItiq2KfbjNuM2K8g2Ygg2KLZhdin2K/Zh+KAjNiz2KfYstuMINiq2K3ZiNuM2YQiLAogICAgICAgICAgICAgICAgZiJvd25lcl9hcHByb3ZlX29yZGVyX3tvcmRlcl9pZH0iLAogICAgICAgICAgICAgICAgRU1PSklfU1VDQ0VTUywKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAgICAgYnVpbGRlci5yb3coCiAgICAgICAgICAgIF9kYW5nZXIoCiAgICAgICAgICAgICAgICAi2LHYryDYr9ix2K7ZiNin2LPYqiIsCiAgICAgICAgICAgICAgICBmIm93bmVyX3JlamVjdF9vcmRlcl97b3JkZXJfaWR9IiwKICAgICAgICAgICAgICAgIEVNT0pJX0RBTkdFUiwKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICBlbGlmIHN0YXR1cyA9PSAicHJvdmlkZXJfc3RhdHVzX3Vua25vd24iOgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBfZGFuZ2VyKAogICAgICAgICAgICAgICAgItio2LHYsdiz24wg2K/Ys9iq24wg2LPZgdin2LHYtCIsCiAgICAgICAgICAgICAgICBmImFkbWluX29yZGVyX3JlY29uY2lsZV97b3JkZXJfaWR9IiwKICAgICAgICAgICAgICAgIEVNT0pJX1dBUk5JTkcsCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgZWxpZiBzdGF0dXMgaW4gewogICAgICAgICJwcmljZV9jaGFuZ2VkIiwKICAgICAgICAiaW5zdWZmaWNpZW50X2JhbGFuY2UiLAogICAgICAgICJyZWplY3RlZF9ieV9vd25lciIsCiAgICAgICAgImZhaWxlZF9yZWZ1bmRlZCIsCiAgICAgICAgImZhaWxlZF9yZWZ1bmRfcmVxdWlyZWQiLAogICAgICAgICJjYW5jZWxsZWQiLAogICAgfToKICAgICAgICAjINmI2LbYuduM2KrigIzZh9in24wg2KjYs9iq2Ycg24zYpyDZhdiq2YjZgtmBINi02K/ZhzoKICAgICAgICAjINmH24zahiDYr9qp2YXZhyDYrtix24zYryDYr9mI2KjYp9ix2Ycg2KfYsiDYp9uM2YbYrNinINmG2YXbjOKAjNiv2YfbjNmFLgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgICAgICLZhdi02KfZh9iv2Ycg2YjYtti524zYqiIsCiAgICAgICAgICAgICAgICBmImFkbWluX29yZGVyX3ZpZXdfe29yZGVyX2lkfSIsCiAgICAgICAgICAgICAgICBFTU9KSV9GSUxFLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIGVsaWYgc3RhdHVzID09ICJjb21wbGV0ZWQiOgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgICAgICLYs9mB2KfYsdi0INiq2qnZhduM2YQg2LTYr9mHIiwKICAgICAgICAgICAgICAgIGYiYWRtaW5fb3JkZXJfdmlld197b3JkZXJfaWR9IiwKICAgICAgICAgICAgICAgIEVNT0pJX1NVQ0NFU1MsCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgZWxzZToKICAgICAgICBidWlsZGVyLnJvdygKICAgICAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICAgICAi2YXYtNin2YfYr9mHINis2LLYptuM2KfYqiIsCiAgICAgICAgICAgICAgICBmImFkbWluX29yZGVyX3ZpZXdfe29yZGVyX2lkfSIsCiAgICAgICAgICAgICAgICBFTU9KSV9GSUxFLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICMgQ29tbW9uIGFjdGlvbnMKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2KzYstim24zYp9iqINqp2KfZhdmEIiwKICAgICAgICAgICAgZiJhZG1pbl9vcmRlcl92aWV3X3tvcmRlcl9pZH0iLAogICAgICAgICAgICBFTU9KSV9GSUxFLAogICAgICAgICksCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZvtuM2KfZhSDYqNmHINiu2LHbjNiv2KfYsSIsCiAgICAgICAgICAgIGYiYWRtaW5fb3JkZXJfbWVzc2FnZV97b3JkZXJfaWR9IiwKICAgICAgICAgICAgRU1PSklfQlJPQURDQVNULAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2JhY2soCiAgICAgICAgICAgICJhZG1pbl9vcmRlcnNfbWFuYWdlIiwKICAgICAgICAgICAgItio2KfYstqv2LTYqiDYqNmHINiz2YHYp9ix2LTigIzZh9inIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBlbmRpbmcgUmVjZWlwdHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfYWRtaW5fcGVuZGluZ19yZWNlaXB0c19rZXlib2FyZCgpIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYqNix2YjYstix2LPYp9mG24wg2YTbjNiz2KoiLAogICAgICAgICAgICAiYWRtaW5fcGVuZGluZ19yZWNlaXB0cyIsCiAgICAgICAgICAgIEVNT0pJX1NFVFRJTkdTLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItmB24zYtOKAjNmH2KfbjCDYrNiv24zYryIsCiAgICAgICAgICAgICJhZG1pbl9yZWNlaXB0c19uZXciLAogICAgICAgICAgICBFTU9KSV9GSUxFLAogICAgICAgICksCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYr9ixINin2YbYqti42KfYsSDYqNix2LHYs9uMIiwKICAgICAgICAgICAgImFkbWluX3JlY2VpcHRzX3BlbmRpbmciLAogICAgICAgICAgICBFTU9KSV9XQVJOSU5HLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLZgduM2LTigIzZh9in24wg2KrYp9uM24zYr9i02K/ZhyIsCiAgICAgICAgICAgICJhZG1pbl9yZWNlaXB0c19hcHByb3ZlZCIsCiAgICAgICAgICAgIEVNT0pJX1NVQ0NFU1MsCiAgICAgICAgKSwKICAgICAgICBfZGFuZ2VyKAogICAgICAgICAgICAi2YHbjNi04oCM2YfYp9uMINix2K/YtNiv2YciLAogICAgICAgICAgICAiYWRtaW5fcmVjZWlwdHNfcmVqZWN0ZWQiLAogICAgICAgICAgICBFTU9KSV9EQU5HRVIsCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgImFkbWluX21haW4iLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEdlbmVyaWMgWWVzIC8gTm8KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfYWRtaW5feWVzX25vX2tleWJvYXJkKAogICAgeWVzX2NhbGxiYWNrOiBzdHIsCiAgICBub19jYWxsYmFjazogc3RyLAopIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgeWVzX2NhbGxiYWNrID0gX3ZhbGlkYXRlX2NhbGxiYWNrX2RhdGEoCiAgICAgICAgeWVzX2NhbGxiYWNrCiAgICApCiAgICBub19jYWxsYmFjayA9IF92YWxpZGF0ZV9jYWxsYmFja19kYXRhKAogICAgICAgIG5vX2NhbGxiYWNrCiAgICApCgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYqNmE2YciLAogICAgICAgICAgICB5ZXNfY2FsbGJhY2ssCiAgICAgICAgICAgIEVNT0pJX1NVQ0NFU1MsCiAgICAgICAgKSwKICAgICAgICBfZGFuZ2VyKAogICAgICAgICAgICAi2K7bjNixIiwKICAgICAgICAgICAgbm9fY2FsbGJhY2ssCiAgICAgICAgICAgIEVNT0pJX0RBTkdFUiwKICAgICAgICApLAogICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBHZW5lcmljIEJhY2sKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfYWRtaW5fYmFja19rZXlib2FyZCgKICAgIGNhbGxiYWNrX2RhdGE6IHN0ciA9ICJhZG1pbl9tYWluIiwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9iYWNrKAogICAgICAgICAgICBjYWxsYmFja19kYXRhLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEdlbmVyaWMgQ2FuY2VsCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X2FkbWluX2NhbmNlbF9rZXlib2FyZCgKICAgIGNhbGxiYWNrX2RhdGE6IHN0ciA9ICJhZG1pbl9tYWluIiwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9kYW5nZXIoCiAgICAgICAgICAgICLYp9mG2LXYsdin2YEiLAogICAgICAgICAgICBjYWxsYmFja19kYXRhLAogICAgICAgICAgICBFTU9KSV9EQU5HRVIsCiAgICAgICAgKQogICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBCYWNrICsgQ2FuY2VsCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X2FkbWluX2JhY2tfY2FuY2VsX2tleWJvYXJkKAogICAgYmFja19jYWxsYmFjazogc3RyID0gImFkbWluX21haW4iLAogICAgY2FuY2VsX2NhbGxiYWNrOiBzdHIgPSAiYWRtaW5fbWFpbiIsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgYmFja19jYWxsYmFjaywKICAgICAgICAgICAgItio2KfYstqv2LTYqiIsCiAgICAgICAgKSwKICAgICAgICBfZGFuZ2VyKAogICAgICAgICAgICAi2KfZhti12LHYp9mBIiwKICAgICAgICAgICAgY2FuY2VsX2NhbGxiYWNrLAogICAgICAgICAgICBFTU9KSV9EQU5HRVIsCiAgICAgICAgKSwKICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQWRtaW4gSG9tZQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl9ob21lX2tleWJvYXJkKCkgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItmF2YbZiNuMINmF2K/bjNix24zYqiIsCiAgICAgICAgICAgICJhZG1pbl9tYWluIiwKICAgICAgICAgICAgRU1PSklfU0VUVElOR1MsCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9kYW5nZXIoCiAgICAgICAgICAgICLYrtix2YjYrCDYp9iyINm+2YbZhCIsCiAgICAgICAgICAgICJtYWluX21lbnUiLAogICAgICAgICAgICBFTU9KSV9EQU5HRVIsCiAgICAgICAgKQogICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBTZWN1cml0eQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl9zZWN1cml0eV9rZXlib2FyZCgpIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2RhbmdlcigKICAgICAgICAgICAgItqp2KfYsdio2LHYp9mGINmF2LPYr9mI2K/YtNiv2YciLAogICAgICAgICAgICAiYWRtaW5fYmxvY2tlZF91c2VycyIsCiAgICAgICAgICAgIEVNT0pJX0RBTkdFUiwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhNin2q/igIzZh9in24wg2KfZhdmG24zYqtuMIiwKICAgICAgICAgICAgImFkbWluX2xvZ3Nfc2VjdXJpdHkiLAogICAgICAgICAgICBFTU9KSV9TRVRUSU5HUywKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhdiv24zYsduM2Kog2KfYr9mF24zZhuKAjNmH2KciLAogICAgICAgICAgICAiYWRtaW5fbWFuYWdlX2FkbWlucyIsCiAgICAgICAgICAgIEVNT0pJX0FETUlOLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgImFkbWluX21haW4iLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkK', 'keyboards/user_kb.py': 'IyBrZXlib2FyZHMvdXNlcl9rYi5weQoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSB0eXBpbmcgaW1wb3J0IEZpbmFsCgpmcm9tIGFpb2dyYW0udHlwZXMgaW1wb3J0ICgKICAgIElubGluZUtleWJvYXJkQnV0dG9uLAogICAgSW5saW5lS2V5Ym9hcmRNYXJrdXAsCikKZnJvbSBhaW9ncmFtLnV0aWxzLmtleWJvYXJkIGltcG9ydCAoCiAgICBJbmxpbmVLZXlib2FyZEJ1aWxkZXIsCikKCmZyb20gY29yZS5jb25maWcgaW1wb3J0IHNldHRpbmdzCmZyb20gY29yZS51aV9lbW9qaXMgaW1wb3J0IGVtb2ppX2lkCgoKU1RZTEVfUFJJTUFSWTogRmluYWxbc3RyXSA9ICJwcmltYXJ5IgpTVFlMRV9TVUNDRVNTOiBGaW5hbFtzdHJdID0gInN1Y2Nlc3MiClNUWUxFX0RBTkdFUjogRmluYWxbc3RyXSA9ICJkYW5nZXIiCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBCdXR0b24gaGVscGVyCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgX2J1dHRvbigKICAgICosCiAgICB0ZXh0OiBzdHIsCiAgICBjYWxsYmFja19kYXRhOiBzdHIsCiAgICBzdHlsZTogc3RyID0gU1RZTEVfUFJJTUFSWSwKICAgIGljb246IHN0ciB8IE5vbmUgPSBOb25lLAopIC0+IElubGluZUtleWJvYXJkQnV0dG9uOgogICAgaWYgbGVuKAogICAgICAgIGNhbGxiYWNrX2RhdGEuZW5jb2RlKCJ1dGYtOCIpCiAgICApID4gNjQ6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgImNhbGxiYWNrX2RhdGEgZXhjZWVkcyA2NCBieXRlcy4iCiAgICAgICAgKQoKICAgIHJldHVybiBJbmxpbmVLZXlib2FyZEJ1dHRvbigKICAgICAgICB0ZXh0PXRleHQsCiAgICAgICAgY2FsbGJhY2tfZGF0YT1jYWxsYmFja19kYXRhLAogICAgICAgIHN0eWxlPXN0eWxlLAogICAgICAgIGljb25fY3VzdG9tX2Vtb2ppX2lkPWljb24sCiAgICApCgoKZGVmIF9wcmltYXJ5KAogICAgdGV4dDogc3RyLAogICAgY2FsbGJhY2tfZGF0YTogc3RyLAogICAgaWNvbjogc3RyIHwgTm9uZSA9IE5vbmUsCik6CiAgICByZXR1cm4gX2J1dHRvbigKICAgICAgICB0ZXh0PXRleHQsCiAgICAgICAgY2FsbGJhY2tfZGF0YT1jYWxsYmFja19kYXRhLAogICAgICAgIHN0eWxlPVNUWUxFX1BSSU1BUlksCiAgICAgICAgaWNvbj1pY29uLAogICAgKQoKCmRlZiBfc3VjY2VzcygKICAgIHRleHQ6IHN0ciwKICAgIGNhbGxiYWNrX2RhdGE6IHN0ciwKICAgIGljb246IHN0ciB8IE5vbmUgPSBOb25lLAopOgogICAgcmV0dXJuIF9idXR0b24oCiAgICAgICAgdGV4dD10ZXh0LAogICAgICAgIGNhbGxiYWNrX2RhdGE9Y2FsbGJhY2tfZGF0YSwKICAgICAgICBzdHlsZT1TVFlMRV9TVUNDRVNTLAogICAgICAgIGljb249aWNvbiwKICAgICkKCgpkZWYgX2RhbmdlcigKICAgIHRleHQ6IHN0ciwKICAgIGNhbGxiYWNrX2RhdGE6IHN0ciwKICAgIGljb246IHN0ciB8IE5vbmUgPSBOb25lLAopOgogICAgcmV0dXJuIF9idXR0b24oCiAgICAgICAgdGV4dD10ZXh0LAogICAgICAgIGNhbGxiYWNrX2RhdGE9Y2FsbGJhY2tfZGF0YSwKICAgICAgICBzdHlsZT1TVFlMRV9EQU5HRVIsCiAgICAgICAgaWNvbj1pY29uLAogICAgKQoKCmRlZiBfYmFjaygKICAgIGNhbGxiYWNrX2RhdGE6IHN0ciwKICAgIHRleHQ6IHN0ciA9ICLYqNin2LLar9i02KoiLAopOgogICAgcmV0dXJuIF9kYW5nZXIoCiAgICAgICAgdGV4dCwKICAgICAgICBjYWxsYmFja19kYXRhLAogICAgICAgIGVtb2ppX2lkKCJiYWNrIiksCiAgICApCgoKZGVmIF9zb29uKAogICAgdGV4dDogc3RyLAogICAgaWNvbl9rZXk6IHN0ciwKKToKICAgIHJldHVybiBfcHJpbWFyeSgKICAgICAgICBmInt0ZXh0fSDigKIg2KjZh+KAjNiy2YjYr9uMIiwKICAgICAgICAibm9vcCIsCiAgICAgICAgZW1vamlfaWQoaWNvbl9rZXkpLAogICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQWRtaW4gaGVscGVyCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgX2lzX2NvbmZpZ3VyZWRfYWRtaW4oCiAgICB1c2VyX2lkOiBpbnQgfCBOb25lLAopIC0+IGJvb2w6CiAgICBpZiB1c2VyX2lkIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgdHJ5OgogICAgICAgIHVzZXJfaWQgPSBpbnQodXNlcl9pZCkKCiAgICBleGNlcHQgKAogICAgICAgIFR5cGVFcnJvciwKICAgICAgICBWYWx1ZUVycm9yLAogICAgKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBtZXRob2QgPSBnZXRhdHRyKAogICAgICAgIHNldHRpbmdzLAogICAgICAgICJnZXRfYWRtaW5fbGlzdCIsCiAgICAgICAgTm9uZSwKICAgICkKCiAgICBpZiBjYWxsYWJsZShtZXRob2QpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHVzZXJfaWQgaW4gewogICAgICAgICAgICAgICAgaW50KGl0ZW0pCiAgICAgICAgICAgICAgICBmb3IgaXRlbQogICAgICAgICAgICAgICAgaW4gbWV0aG9kKCkKICAgICAgICAgICAgfQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICByZXR1cm4gRmFsc2UKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFVzZXIgTWFpbiBNZW51CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X3VzZXJfbWFpbl9tZW51KAogICAgdXNlcl9pZDogaW50IHwgTm9uZSA9IE5vbmUsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgItmB2LHZiNi02q/Yp9mHINmIINiu2LHbjNivIiwKICAgICAgICAgICAgImJ1eV9wcm9kdWN0IiwKICAgICAgICAgICAgZW1vamlfaWQoInNob3AiKSwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYp9mB2LLYp9uM2LQg2YXZiNis2YjYr9uMIiwKICAgICAgICAgICAgImNoYXJnZV9maWF0IiwKICAgICAgICAgICAgZW1vamlfaWQoImFkZCIpLAogICAgICAgICksCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYrdiz2KfYqCDaqdin2LHYqNix24wiLAogICAgICAgICAgICAidXNlcl9wcm9maWxlIiwKICAgICAgICAgICAgZW1vamlfaWQoIndhbGxldCIpLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2RhbmdlcigKICAgICAgICAgICAgItiy24zYsdmF2KzZhdmI2LnZh+KAjNqv24zYsduMIiwKICAgICAgICAgICAgInJlZmVycmFsX21lbnUiLAogICAgICAgICAgICBlbW9qaV9pZCgidXNlcnMiKSwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZvti02KrbjNio2KfZhtuMIiwKICAgICAgICAgICAgInN1cHBvcnQiLAogICAgICAgICAgICBlbW9qaV9pZCgic3VwcG9ydCIpLAogICAgICAgICksCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZvtuM2q/bjNix24wg2LPZgdin2LHYtCIsCiAgICAgICAgICAgICJteV9vcmRlcnMiLAogICAgICAgICAgICBlbW9qaV9pZCgiaGlzdG9yeSIpLAogICAgICAgICksCiAgICApCgogICAgaWYgX2lzX2NvbmZpZ3VyZWRfYWRtaW4oCiAgICAgICAgdXNlcl9pZAogICAgKToKICAgICAgICBidWlsZGVyLnJvdygKICAgICAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICAgICAi2b7ZhtmEINmF2K/bjNix24zYqiIsCiAgICAgICAgICAgICAgICAiYWRtaW5fcGFuZWwiLAogICAgICAgICAgICAgICAgZW1vamlfaWQoImJvbHQiKSwKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJvZHVjdHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfcHJvZHVjdHNfbWVudV9rZXlib2FyZCgpIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYs9mB2KfYsdi04oCM2YfYp9uMINin2K7bjNixINmF2YYiLAogICAgICAgICAgICAibXlfb3JkZXJzIiwKICAgICAgICAgICAgZW1vamlfaWQoImhpc3RvcnkiKSwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYrtix24zYryDYp9iz2KrYp9ix2LIiLAogICAgICAgICAgICAiYnV5X3N0YXJzIiwKICAgICAgICAgICAgZW1vamlfaWQoInN0YXJzIiksCiAgICAgICAgKSwKICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgItiu2LHbjNivINm+2LHZhduM2YjZhSIsCiAgICAgICAgICAgICJidXlfcHJlbWl1bSIsCiAgICAgICAgICAgIGVtb2ppX2lkKCJwcmVtaXVtIiksCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfc29vbigKICAgICAgICAgICAgItiu2LHbjNivIFRPTiIsCiAgICAgICAgICAgICJ0b24iLAogICAgICAgICksCiAgICAgICAgX3Nvb24oCiAgICAgICAgICAgICLYrtix24zYryBUUlgiLAogICAgICAgICAgICAidHJ4IiwKICAgICAgICApLAogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9zb29uKAogICAgICAgICAgICAi2q/bjNmB2Kog2KfYs9iq2KfYsdiy24wiLAogICAgICAgICAgICAiZ2lmdCIsCiAgICAgICAgKSwKICAgICAgICBfc29vbigKICAgICAgICAgICAgItio2YjYs9iqINiq2YTar9ix2KfZhSIsCiAgICAgICAgICAgICJzcGFya2xlcyIsCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfc29vbigKICAgICAgICAgICAgItix24zigIzYp9qp2LTZhiDYp9iz2KrYp9ix2LLbjCIsCiAgICAgICAgICAgICJzdGFycyIsCiAgICAgICAgKSwKICAgICAgICBfc29vbigKICAgICAgICAgICAgItqv24zZiCDYp9mI24wg2KfYs9iq2KfYsdiy24wiLAogICAgICAgICAgICAic3BhcmtsZXMiLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2JhY2soCiAgICAgICAgICAgICJtYWluX21lbnUiLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqINio2Ycg2YXZhtmI24wg2KfYtdmE24wiLAogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgV2FsbGV0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X3dhbGxldF9tZW51X2tleWJvYXJkKCkgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgIti02KfYsdqYINit2LPYp9ioINiq2YjZhdin2YbbjCIsCiAgICAgICAgICAgICJjaGFyZ2VfZmlhdCIsCiAgICAgICAgICAgIGVtb2ppX2lkKCJjYXJkIiksCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9zdWNjZXNzKAogICAgICAgICAgICAi2LTYp9ix2pgg2KLZhtuMIFRPTiIsCiAgICAgICAgICAgICJjaGFyZ2VfdG9uIiwKICAgICAgICAgICAgZW1vamlfaWQoInRvbiIpLAogICAgICAgICksCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYtNin2LHamCDYotmG24wgVFJPTiAvIFVTRFQiLAogICAgICAgICAgICAiY2hhcmdlX3RyeCIsCiAgICAgICAgICAgIGVtb2ppX2lkKCJ0cngiKSwKICAgICAgICApLAogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2KrYp9ix24zYrtqG2Ycg2KrYsdin2qnZhti04oCM2YfYpyIsCiAgICAgICAgICAgICJ3YWxsZXRfdHhfaGlzdG9yeSIsCiAgICAgICAgICAgIGVtb2ppX2lkKCJoaXN0b3J5IiksCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9iYWNrKAogICAgICAgICAgICAibWFpbl9tZW51IiwKICAgICAgICAgICAgItio2KfYstqv2LTYqiDYqNmHINmF2YbZiNuMINin2LXZhNuMIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhY2thZ2VzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X3NlcnZpY2VzX3BhY2thZ2VzX2tleWJvYXJkKAogICAgc2VydmljZV90eXBlOiBzdHIsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBzZXJ2aWNlX3R5cGUgPSAoCiAgICAgICAgc3RyKHNlcnZpY2VfdHlwZSkKICAgICAgICAuc3RyaXAoKQogICAgICAgIC5sb3dlcigpCiAgICApCgogICAgaWYgc2VydmljZV90eXBlID09ICJwcmVtaXVtIjoKICAgICAgICBidWlsZGVyLnJvdygKICAgICAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICAgICAi2b7YsdmF24zZiNmFINuxINmF2KfZh9mHIiwKICAgICAgICAgICAgICAgICJwcmVtXzFtIiwKICAgICAgICAgICAgICAgIGVtb2ppX2lkKCJwcmVtaXVtIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAgICAgItm+2LHZhduM2YjZhSDbsyDZhdin2YfZhyIsCiAgICAgICAgICAgICAgICAicHJlbV8zbSIsCiAgICAgICAgICAgICAgICBlbW9qaV9pZCgicHJlbWl1bSIpLAogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgYnVpbGRlci5yb3coCiAgICAgICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAgICAgItm+2LHZhduM2YjZhSDbtiDZhdin2YfZhyIsCiAgICAgICAgICAgICAgICAicHJlbV82bSIsCiAgICAgICAgICAgICAgICBlbW9qaV9pZCgicHJlbWl1bSIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgICAgICLZvtix2YXbjNmI2YUg27Eg2LPYp9mE2YciLAogICAgICAgICAgICAgICAgInByZW1fMXkiLAogICAgICAgICAgICAgICAgZW1vamlfaWQoInNwYXJrbGVzIiksCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICBidWlsZGVyLnJvdygKICAgICAgICAgICAgX2JhY2soCiAgICAgICAgICAgICAgICAiYnV5X3Byb2R1Y3QiLAogICAgICAgICAgICAgICAgItio2KfYstqv2LTYqiDYqNmHINmB2LHZiNi02q/Yp9mHIiwKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICBlbGlmIHNlcnZpY2VfdHlwZSA9PSAic3RhcnMiOgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgICAgICLbtduwINin2LPYqtin2LHYsiIsCiAgICAgICAgICAgICAgICAic3RhcnNfNTAiLAogICAgICAgICAgICAgICAgZW1vamlfaWQoInN0YXJzIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAgICAgItux27DbsCDYp9iz2KrYp9ix2LIiLAogICAgICAgICAgICAgICAgInN0YXJzXzEwMCIsCiAgICAgICAgICAgICAgICBlbW9qaV9pZCgic3RhcnMiKSwKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgICAgICLbstu127Ag2KfYs9iq2KfYsdiyIiwKICAgICAgICAgICAgICAgICJzdGFyc18yNTAiLAogICAgICAgICAgICAgICAgZW1vamlfaWQoInN0YXJzIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAgICAgItu127DbsCDYp9iz2KrYp9ix2LIiLAogICAgICAgICAgICAgICAgInN0YXJzXzUwMCIsCiAgICAgICAgICAgICAgICBlbW9qaV9pZCgic3RhcnMiKSwKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgICAgICLbsduw27DbsCDYp9iz2KrYp9ix2LIiLAogICAgICAgICAgICAgICAgInN0YXJzXzEwMDAiLAogICAgICAgICAgICAgICAgZW1vamlfaWQoInN0YXJzIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIF9zdWNjZXNzKAogICAgICAgICAgICAgICAgItu127DbsNuwINin2LPYqtin2LHYsiIsCiAgICAgICAgICAgICAgICAic3RhcnNfNTAwMCIsCiAgICAgICAgICAgICAgICBlbW9qaV9pZCgic3RhcnMiKSwKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgICAgICLYqti52K/Yp9ivINiv2YTYrtmI2KfZhyDYp9iz2KrYp9ix2LIiLAogICAgICAgICAgICAgICAgImN1c3RvbV9zdGFycyIsCiAgICAgICAgICAgICAgICBlbW9qaV9pZCgic2hvcCIpLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICAgICBidWlsZGVyLnJvdygKICAgICAgICAgICAgX2JhY2soCiAgICAgICAgICAgICAgICAiYnV5X3Byb2R1Y3QiLAogICAgICAgICAgICAgICAgItio2KfYstqv2LTYqiDYqNmHINmB2LHZiNi02q/Yp9mHIiwKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICBlbHNlOgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBfYmFjaygKICAgICAgICAgICAgICAgICJidXlfcHJvZHVjdCIsCiAgICAgICAgICAgICAgICAi2KjYp9iy2q/YtNiqINio2Ycg2YHYsdmI2LTar9in2YciLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBVc2VyIHB1cmNoYXNlIHJlcXVlc3QKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfc3VibWl0X29yZGVyX2tleWJvYXJkKAogICAgY2FuX3N1Ym1pdDogYm9vbCA9IFRydWUsCikgLT4gSW5saW5lS2V5Ym9hcmRNYXJrdXA6CiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBpZiBjYW5fc3VibWl0OgogICAgICAgIGJ1aWxkZXIucm93KAogICAgICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgICAgICLYp9ix2LPYp9mEINiv2LHYrtmI2KfYs9iqINio2LHYp9uMINiq2KfbjNuM2K8g2YXYp9mE2qkiLAogICAgICAgICAgICAgICAgImZpbmFsaXplX3B1cmNoYXNlIiwKICAgICAgICAgICAgICAgIGVtb2ppX2lkKCJzdWNjZXNzIiksCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYtNin2LHamCDaqduM2YEg2b7ZiNmEIiwKICAgICAgICAgICAgImNoYXJnZV9maWF0IiwKICAgICAgICAgICAgZW1vamlfaWQoImNhcmQiKSwKICAgICAgICApLAogICAgICAgIF9kYW5nZXIoCiAgICAgICAgICAgICLZhNi62YgiLAogICAgICAgICAgICAiY2FuY2VsX3Nob3AiLAogICAgICAgICAgICBlbW9qaV9pZCgiZXJyb3IiKSwKICAgICAgICApLAogICAgKQoKICAgIHJldHVybiBidWlsZGVyLmFzX21hcmt1cCgpCgoKIyBDb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgaW1wb3J0cy4KZGVmIGdldF9jb25maXJtX29yZGVyX2tleWJvYXJkKAogICAgb3JkZXJfaWQ6IHN0ciB8IE5vbmUgPSBOb25lLAopIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgZGVsIG9yZGVyX2lkCiAgICByZXR1cm4gZ2V0X3N1Ym1pdF9vcmRlcl9rZXlib2FyZCgKICAgICAgICBjYW5fc3VibWl0PVRydWUKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE93bmVyIGFwcHJvdmFsCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X293bmVyX29yZGVyX2tleWJvYXJkKAogICAgb3JkZXJfaWQ6IGludCwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIG9yZGVyX2lkID0gaW50KG9yZGVyX2lkKQoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9zdWNjZXNzKAogICAgICAgICAgICAi2KrYp9uM24zYryDZiCDYp9ix2LPYp9mEINio2YcgTWFya2V0QXBwIiwKICAgICAgICAgICAgZiJvd25lcl9hcHByb3ZlX29yZGVyX3tvcmRlcl9pZH0iLAogICAgICAgICAgICBlbW9qaV9pZCgic3VjY2VzcyIpLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfZGFuZ2VyKAogICAgICAgICAgICAi2LHYryDYr9ix2K7ZiNin2LPYqiIsCiAgICAgICAgICAgIGYib3duZXJfcmVqZWN0X29yZGVyX3tvcmRlcl9pZH0iLAogICAgICAgICAgICBlbW9qaV9pZCgiZXJyb3IiKSwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJlc3VsdCAvIEhpc3RvcnkgLyBTdXBwb3J0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgZ2V0X29yZGVyX3Jlc3VsdF9rZXlib2FyZCgpIC0+IElubGluZUtleWJvYXJkTWFya3VwOgogICAgYnVpbGRlciA9IElubGluZUtleWJvYXJkQnVpbGRlcigpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYqNin2LLar9i02Kog2KjZhyDZgdix2YjYtNqv2KfZhyIsCiAgICAgICAgICAgICJidXlfcHJvZHVjdCIsCiAgICAgICAgICAgIGVtb2ppX2lkKCJzaG9wIiksCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2YXZhtmI24wg2KfYtdmE24wiLAogICAgICAgICAgICAibWFpbl9tZW51IiwKICAgICAgICAgICAgZW1vamlfaWQoInNob3AiKSwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgpkZWYgZ2V0X29yZGVyX2hpc3Rvcnlfa2V5Ym9hcmQoKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9zdWNjZXNzKAogICAgICAgICAgICAi2YHYsdmI2LTar9in2YciLAogICAgICAgICAgICAiYnV5X3Byb2R1Y3QiLAogICAgICAgICAgICBlbW9qaV9pZCgic2hvcCIpLAogICAgICAgICksCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhdmG2YjbjCDYp9i12YTbjCIsCiAgICAgICAgICAgICJtYWluX21lbnUiLAogICAgICAgICAgICBlbW9qaV9pZCgic2hvcCIpLAogICAgICAgICksCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgpkZWYgZ2V0X3N1cHBvcnRfa2V5Ym9hcmQoKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIElubGluZUtleWJvYXJkQnV0dG9uKAogICAgICAgICAgICB0ZXh0PSLYp9ix2KrYqNin2Lcg2KjYpyDZvti02KrbjNio2KfZhtuMIiwKICAgICAgICAgICAgdXJsPSJodHRwczovL3QubWUvU3VwcG9ydF9BZG1pbiIsCiAgICAgICAgICAgIHN0eWxlPVNUWUxFX1BSSU1BUlksCiAgICAgICAgICAgIGljb25fY3VzdG9tX2Vtb2ppX2lkPWVtb2ppX2lkKAogICAgICAgICAgICAgICAgInN1cHBvcnQiCiAgICAgICAgICAgICksCiAgICAgICAgKQogICAgKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9iYWNrKAogICAgICAgICAgICAibWFpbl9tZW51IiwKICAgICAgICAgICAgItmF2YbZiNuMINin2LXZhNuMIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhZ2luYXRpb24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBnZXRfcGFnaW5hdGlvbl9rZXlib2FyZCgKICAgIGN1cnJlbnRfcGFnZTogaW50LAogICAgdG90YWxfcGFnZXM6IGludCwKICAgIGFjdGlvbl9wcmVmaXg6IHN0ciwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIGN1cnJlbnRfcGFnZSA9IG1heCgKICAgICAgICAxLAogICAgICAgIGludChjdXJyZW50X3BhZ2UpLAogICAgKQogICAgdG90YWxfcGFnZXMgPSBtYXgoCiAgICAgICAgMSwKICAgICAgICBpbnQodG90YWxfcGFnZXMpLAogICAgKQoKICAgIGlmIGN1cnJlbnRfcGFnZSA+IHRvdGFsX3BhZ2VzOgogICAgICAgIGN1cnJlbnRfcGFnZSA9IHRvdGFsX3BhZ2VzCgogICAgYWN0aW9uX3ByZWZpeCA9IHN0cigKICAgICAgICBhY3Rpb25fcHJlZml4CiAgICApLnN0cmlwKCkKCiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBuYXYgPSBbXQoKICAgIGlmIGN1cnJlbnRfcGFnZSA+IDE6CiAgICAgICAgbmF2LmFwcGVuZCgKICAgICAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICAgICAi2YLYqNmE24wiLAogICAgICAgICAgICAgICAgZiJ7YWN0aW9uX3ByZWZpeH1fcGFnZV8iCiAgICAgICAgICAgICAgICBmIntjdXJyZW50X3BhZ2UgLSAxfSIsCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgbmF2LmFwcGVuZCgKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgZiLYtdmB2K3ZhyB7Y3VycmVudF9wYWdlfSDYp9iyIHt0b3RhbF9wYWdlc30iLAogICAgICAgICAgICAibm9vcCIsCiAgICAgICAgKQogICAgKQoKICAgIGlmIGN1cnJlbnRfcGFnZSA8IHRvdGFsX3BhZ2VzOgogICAgICAgIG5hdi5hcHBlbmQoCiAgICAgICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAgICAgItio2LnYr9uMIiwKICAgICAgICAgICAgICAgIGYie2FjdGlvbl9wcmVmaXh9X3BhZ2VfIgogICAgICAgICAgICAgICAgZiJ7Y3VycmVudF9wYWdlICsgMX0iLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIGJ1aWxkZXIucm93KCpuYXYpCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX2JhY2soCiAgICAgICAgICAgICJtYWluX21lbnUiLAogICAgICAgICAgICAi2KjYp9iy2q/YtNiqINio2Ycg2YXZhtmIIiwKICAgICAgICApCiAgICApCgogICAgcmV0dXJuIGJ1aWxkZXIuYXNfbWFya3VwKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEV4aXN0aW5nIEFkbWluIEtleWJvYXJkcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIGdldF9hZG1pbl9tYWluX21lbnUoKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIGJ1aWxkZXIgPSBJbmxpbmVLZXlib2FyZEJ1aWxkZXIoKQoKICAgIGJ1aWxkZXIucm93KAogICAgICAgIF9wcmltYXJ5KAogICAgICAgICAgICAi2KjYsdix2LPbjCDYp9it2LHYp9iyINmH2YjbjNiq4oCM2YfYp9uMINis2K/bjNivIiwKICAgICAgICAgICAgImFkbWluX2t5Y19xdWV1ZSIsCiAgICAgICAgICAgIGVtb2ppX2lkKCJ3YWxsZXQiKSwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3N1Y2Nlc3MoCiAgICAgICAgICAgICLYotmF2KfYsSDZiCDar9iy2KfYsdi02KfYqiDZhdin2YTbjCIsCiAgICAgICAgICAgICJhZG1pbl9zdGF0cyIsCiAgICAgICAgICAgIGVtb2ppX2lkKCJoaXN0b3J5IiksCiAgICAgICAgKSwKICAgICAgICBfcHJpbWFyeSgKICAgICAgICAgICAgItiq2YbYuNuM2YUg2YbYsdiuINin2LHYsiDZiCDZgtuM2YXYquKAjNmH2KciLAogICAgICAgICAgICAiYWRtaW5fcHJpY2luZyIsCiAgICAgICAgICAgIGVtb2ppX2lkKCJzdGFycyIpLAogICAgICAgICksCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLZhdiv24zYsduM2Kog2qnYp9ix2KjYsdin2YYg2Ygg2YXYs9iv2YjYr9iz2KfYstuMIiwKICAgICAgICAgICAgImFkbWluX3VzZXJzX2xpc3QiLAogICAgICAgICAgICBlbW9qaV9pZCgidXNlcnMiKSwKICAgICAgICApCiAgICApCgogICAgYnVpbGRlci5yb3coCiAgICAgICAgX3ByaW1hcnkoCiAgICAgICAgICAgICLYp9ix2LPYp9mEINm+24zYp9mFINmH2YXar9in2YbbjCIsCiAgICAgICAgICAgICJhZG1pbl9icm9hZGNhc3QiLAogICAgICAgICAgICBlbW9qaV9pZCgiY2hhdCIpLAogICAgICAgICkKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgIm1haW5fbWVudSIsCiAgICAgICAgICAgICLYrtix2YjYrCDYp9iyINm+2YbZhCDZhdiv24zYsduM2KoiLAogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQoKCmRlZiBnZXRfYWRtaW5fa3ljX3Jldmlld19rZXlib2FyZCgKICAgIHVzZXJfaWQ6IGludCwKKSAtPiBJbmxpbmVLZXlib2FyZE1hcmt1cDoKICAgIHVzZXJfaWQgPSBpbnQodXNlcl9pZCkKCiAgICBidWlsZGVyID0gSW5saW5lS2V5Ym9hcmRCdWlsZGVyKCkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfc3VjY2VzcygKICAgICAgICAgICAgItiq2KfbjNuM2K8g2KfYrdix2KfYsiDZh9mI24zYqiIsCiAgICAgICAgICAgIGYia3ljX2FwcHJvdmVfe3VzZXJfaWR9IiwKICAgICAgICAgICAgZW1vamlfaWQoInN1Y2Nlc3MiKSwKICAgICAgICApLAogICAgICAgIF9kYW5nZXIoCiAgICAgICAgICAgICLYsdivINmF2K/Yp9ix2qkiLAogICAgICAgICAgICBmImt5Y19yZWplY3Rfe3VzZXJfaWR9IiwKICAgICAgICAgICAgZW1vamlfaWQoImVycm9yIiksCiAgICAgICAgKSwKICAgICkKCiAgICBidWlsZGVyLnJvdygKICAgICAgICBfYmFjaygKICAgICAgICAgICAgImFkbWluX2t5Y19xdWV1ZSIsCiAgICAgICAgICAgICLYqNin2LLar9i02Kog2KjZhyDZhNuM2LPYqiDYp9mG2KrYuNin2LEiLAogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gYnVpbGRlci5hc19tYXJrdXAoKQ==', 'services/product_pricing_service.py': 'IyBzZXJ2aWNlcy9wcm9kdWN0X3ByaWNpbmdfc2VydmljZS5weQoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGFzeW5jaW8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHNxbGl0ZTMKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbCwgSW52YWxpZE9wZXJhdGlvbiwgUk9VTkRfSEFMRl9VUApmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsCgpmcm9tIHNlcnZpY2VzLmlyYW5fdXNkdF9yYXRlX3NlcnZpY2UgaW1wb3J0ICgKICAgIElyYW5Vc2R0QWxsUHJvdmlkZXJzRmFpbGVkLAogICAgSXJhblVzZHRSYXRlU2VydmljZSwKKQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJvZHVjdHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClBST0RVQ1RfTEFCRUxTOiBkaWN0W3N0ciwgc3RyXSA9IHsKICAgICJwcmVtXzFtIjogIlByZW1pdW0gMSBNb250aCIsCiAgICAicHJlbV8zbSI6ICJQcmVtaXVtIDMgTW9udGhzIiwKICAgICJwcmVtXzZtIjogIlByZW1pdW0gNiBNb250aHMiLAogICAgInByZW1fMXkiOiAiUHJlbWl1bSAxIFllYXIiLAoKICAgICJzdGFyc181MCI6ICI1MCBTdGFycyIsCiAgICAic3RhcnNfMTAwIjogIjEwMCBTdGFycyIsCiAgICAic3RhcnNfMjUwIjogIjI1MCBTdGFycyIsCiAgICAic3RhcnNfNTAwIjogIjUwMCBTdGFycyIsCiAgICAic3RhcnNfMTAwMCI6ICIxMDAwIFN0YXJzIiwKICAgICJzdGFyc181MDAwIjogIjUwMDAgU3RhcnMiLAoKICAgICMgVXNlZCBvbmx5IGZvciBjdXN0b20gU3RhcnMgb3JkZXJzLgogICAgInN0YXJzX3VuaXQiOiAiQ3VzdG9tIFN0YXJzIC0gcHJpY2UgcGVyIDEgU3RhciIsCn0KClBSRU1JVU1fUFJPRFVDVF9JRFM6IHR1cGxlW3N0ciwgLi4uXSA9ICgKICAgICJwcmVtXzFtIiwKICAgICJwcmVtXzNtIiwKICAgICJwcmVtXzZtIiwKICAgICJwcmVtXzF5IiwKKQoKU1RBUlNfUFJPRFVDVF9JRFM6IHR1cGxlW3N0ciwgLi4uXSA9ICgKICAgICJzdGFyc181MCIsCiAgICAic3RhcnNfMTAwIiwKICAgICJzdGFyc18yNTAiLAogICAgInN0YXJzXzUwMCIsCiAgICAic3RhcnNfMTAwMCIsCiAgICAic3RhcnNfNTAwMCIsCiAgICAic3RhcnNfdW5pdCIsCikKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEVycm9ycyAvIE1vZGVscwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgUHJvZHVjdFByaWNpbmdFcnJvcihFeGNlcHRpb24pOgogICAgcGFzcwoKCmNsYXNzIFByb2R1Y3RQcmljZU5vdENvbmZpZ3VyZWQoUHJvZHVjdFByaWNpbmdFcnJvcik6CiAgICBwYXNzCgoKY2xhc3MgUHJvZHVjdFJhdGVVbmF2YWlsYWJsZShQcm9kdWN0UHJpY2luZ0Vycm9yKToKICAgIHBhc3MKCgpjbGFzcyBJbnZhbGlkUHJvZHVjdFByaWNlKFByb2R1Y3RQcmljaW5nRXJyb3IpOgogICAgcGFzcwoKCkBkYXRhY2xhc3Moc2xvdHM9VHJ1ZSwgZnJvemVuPVRydWUpCmNsYXNzIFByb2R1Y3RUb21hblF1b3RlOgogICAgcGFja2FnZV9pZDogc3RyCiAgICBiYXNlX3VzZHQ6IERlY2ltYWwKICAgIHVzZHRfdG9tYW46IERlY2ltYWwKICAgIGZpbmFsX3RvbWFuOiBpbnQKICAgIHJhdGVfc291cmNlOiBzdHIKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNlcnZpY2UKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmNsYXNzIFByb2R1Y3RQcmljaW5nU2VydmljZToKICAgICIiIgogICAgU3RhYmxlIHNob3AgcHJpY2luZyB3aXRob3V0IE1hcmtldEFwcC9BUEkgc2NyYXBpbmcuCgogICAgU291cmNlIG9mIHByb2R1Y3QgYmFzZSBwcmljZToKICAgICAgICBhZG1pbi1jb25maWd1cmVkIFVTRFQgdmFsdWVzIGluIFNRTGl0ZS4KCiAgICBTb3VyY2Ugb2YgVG9tYW4gY29udmVyc2lvbjoKICAgICAgICBJcmFuVXNkdFJhdGVTZXJ2aWNlOgogICAgICAgICAgICBUYWJkZWFsIC0+IFdhbGxleCAtPiBCaXRwaW4gLT4gTm9iaXRleCAtPiBFeGlyIC0+IFNhcnJhZmV4CgogICAgU3RhbmRhcmQgcHJvZHVjdHM6CiAgICAgICAgZXhhY3QgY29uZmlndXJlZCBVU0RUIHByaWNlLgoKICAgIEN1c3RvbSBTdGFyczoKICAgICAgICBzdGFyc191bml0IFVTRFQgKiByZXF1ZXN0ZWQgU3RhciBjb3VudC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICBzZWxmLAogICAgICAgIGRiX3BhdGg6IHN0ciB8IFBhdGggPSAibWF0cml4X2JvdC5kYiIsCiAgICApIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYl9wYXRoID0gc3RyKGRiX3BhdGgpCgogICAgICAgIGlmIG5vdCBzZWxmLmRiX3BhdGguc3RyaXAoKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJkYl9wYXRoIGNhbm5vdCBiZSBlbXB0eS4iCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5fc2NoZW1hX2xvY2sgPSBhc3luY2lvLkxvY2soKQogICAgICAgIHNlbGYuX3NjaGVtYV9yZWFkeSA9IEZhbHNlCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBTUUxpdGUKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgX2Nvbm5lY3QoCiAgICAgICAgc2VsZiwKICAgICkgLT4gc3FsaXRlMy5Db25uZWN0aW9uOgogICAgICAgIGNvbm4gPSBzcWxpdGUzLmNvbm5lY3QoCiAgICAgICAgICAgIHNlbGYuZGJfcGF0aCwKICAgICAgICAgICAgdGltZW91dD0zMCwKICAgICAgICAgICAgY2hlY2tfc2FtZV90aHJlYWQ9RmFsc2UsCiAgICAgICAgKQoKICAgICAgICBjb25uLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiUFJBR01BIGpvdXJuYWxfbW9kZT1XQUwiCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgc3FsaXRlMy5EYXRhYmFzZUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlBSQUdNQSBidXN5X3RpbWVvdXQ9MzAwMDAiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gY29ubgoKICAgIGFzeW5jIGRlZiBfcnVuKAogICAgICAgIHNlbGYsCiAgICAgICAgZnVuYywKICAgICAgICAqYXJncywKICAgICk6CiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBmdW5jLAogICAgICAgICAgICAqYXJncywKICAgICAgICApCgogICAgYXN5bmMgZGVmIGVuc3VyZV9zY2hlbWEoCiAgICAgICAgc2VsZiwKICAgICkgLT4gTm9uZToKICAgICAgICBpZiBzZWxmLl9zY2hlbWFfcmVhZHk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBhc3luYyB3aXRoIHNlbGYuX3NjaGVtYV9sb2NrOgogICAgICAgICAgICBpZiBzZWxmLl9zY2hlbWFfcmVhZHk6CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGF3YWl0IHNlbGYuX3J1bigKICAgICAgICAgICAgICAgIHNlbGYuX2Vuc3VyZV9zY2hlbWFfc3luYwogICAgICAgICAgICApCgogICAgICAgICAgICBzZWxmLl9zY2hlbWFfcmVhZHkgPSBUcnVlCgogICAgZGVmIF9lbnN1cmVfc2NoZW1hX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICkgLT4gTm9uZToKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBwcm9kdWN0X2Jhc2VfcHJpY2VzICgKICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X2lkIFRFWFQgUFJJTUFSWSBLRVksCiAgICAgICAgICAgICAgICAgICAgcHJpY2VfdXNkdCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYnkgSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkX2F0IFRJTUVTVEFNUAogICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5jb21taXQoKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFZhbGlkYXRpb24KICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2RlY2ltYWwoCiAgICAgICAgdmFsdWUsCiAgICApIC0+IERlY2ltYWw6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHQgPSBEZWNpbWFsKAogICAgICAgICAgICAgICAgc3RyKHZhbHVlKQogICAgICAgICAgICAgICAgLnN0cmlwKCkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCIsIiwgIi4iKQogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCAoCiAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24sCiAgICAgICAgICAgIFR5cGVFcnJvciwKICAgICAgICAgICAgVmFsdWVFcnJvciwKICAgICAgICApIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFByb2R1Y3RQcmljZSgKICAgICAgICAgICAgICAgICJJbnZhbGlkIFVTRFQgcHJvZHVjdCBwcmljZS4iCiAgICAgICAgICAgICkgZnJvbSBleGMKCiAgICAgICAgaWYgKAogICAgICAgICAgICBub3QgcmVzdWx0LmlzX2Zpbml0ZSgpCiAgICAgICAgICAgIG9yIHJlc3VsdCA8PSAwCiAgICAgICAgKToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFByb2R1Y3RQcmljZSgKICAgICAgICAgICAgICAgICJVU0RUIHByb2R1Y3QgcHJpY2UgbXVzdCBiZSBwb3NpdGl2ZS4iCiAgICAgICAgICAgICkKCiAgICAgICAgIyA4IGRlY2ltYWxzIGlzIHBsZW50eSBmb3IgcGVyLVN0YXIgcHJpY2luZy4KICAgICAgICByZXR1cm4gcmVzdWx0LnF1YW50aXplKAogICAgICAgICAgICBEZWNpbWFsKCIwLjAwMDAwMDAxIikKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF92YWxpZGF0ZV9wcm9kdWN0X2lkKAogICAgICAgIHByb2R1Y3RfaWQ6IHN0ciwKICAgICkgLT4gc3RyOgogICAgICAgIHByb2R1Y3RfaWQgPSBzdHIoCiAgICAgICAgICAgIHByb2R1Y3RfaWQKICAgICAgICAgICAgb3IgIiIKICAgICAgICApLnN0cmlwKCkubG93ZXIoKQoKICAgICAgICBpZiBwcm9kdWN0X2lkIG5vdCBpbiBQUk9EVUNUX0xBQkVMUzoKICAgICAgICAgICAgcmFpc2UgUHJvZHVjdFByaWNpbmdFcnJvcigKICAgICAgICAgICAgICAgIGYiVW5rbm93biBwcm9kdWN0IGlkOiB7cHJvZHVjdF9pZH0iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHByb2R1Y3RfaWQKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEFkbWluIENSVUQKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgc2V0X2Jhc2VfdXNkdCgKICAgICAgICBzZWxmLAogICAgICAgIHByb2R1Y3RfaWQ6IHN0ciwKICAgICAgICBwcmljZV91c2R0LAogICAgICAgICosCiAgICAgICAgdXBkYXRlZF9ieTogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICApIC0+IERlY2ltYWw6CiAgICAgICAgYXdhaXQgc2VsZi5lbnN1cmVfc2NoZW1hKCkKCiAgICAgICAgcHJvZHVjdF9pZCA9IHNlbGYuX3ZhbGlkYXRlX3Byb2R1Y3RfaWQoCiAgICAgICAgICAgIHByb2R1Y3RfaWQKICAgICAgICApCgogICAgICAgIHZhbHVlID0gc2VsZi5fZGVjaW1hbCgKICAgICAgICAgICAgcHJpY2VfdXNkdAogICAgICAgICkKCiAgICAgICAgYXdhaXQgc2VsZi5fcnVuKAogICAgICAgICAgICBzZWxmLl9zZXRfYmFzZV91c2R0X3N5bmMsCiAgICAgICAgICAgIHByb2R1Y3RfaWQsCiAgICAgICAgICAgIHN0cih2YWx1ZSksCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGludCh1cGRhdGVkX2J5KQogICAgICAgICAgICAgICAgaWYgdXBkYXRlZF9ieSBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgIlByb2R1Y3QgYmFzZSBwcmljZSB1cGRhdGVkIHwgIgogICAgICAgICAgICAicHJvZHVjdD0lcyBwcmljZV91c2R0PSVzIiwKICAgICAgICAgICAgcHJvZHVjdF9pZCwKICAgICAgICAgICAgdmFsdWUsCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBkZWYgX3NldF9iYXNlX3VzZHRfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIHByb2R1Y3RfaWQ6IHN0ciwKICAgICAgICB2YWx1ZTogc3RyLAogICAgICAgIHVwZGF0ZWRfYnk6IE9wdGlvbmFsW2ludF0sCiAgICApIC0+IE5vbmU6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gcHJvZHVjdF9iYXNlX3ByaWNlcyAoCiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9pZCwKICAgICAgICAgICAgICAgICAgICBwcmljZV91c2R0LAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYnksCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/LCBDVVJSRU5UX1RJTUVTVEFNUCkKICAgICAgICAgICAgICAgIE9OIENPTkZMSUNUKHByb2R1Y3RfaWQpCiAgICAgICAgICAgICAgICBETyBVUERBVEUgU0VUCiAgICAgICAgICAgICAgICAgICAgcHJpY2VfdXNkdCA9IGV4Y2x1ZGVkLnByaWNlX3VzZHQsCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9ieSA9IGV4Y2x1ZGVkLnVwZGF0ZWRfYnksCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9pZCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkX2J5LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5jb21taXQoKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBhc3luYyBkZWYgZ2V0X2Jhc2VfdXNkdCgKICAgICAgICBzZWxmLAogICAgICAgIHByb2R1Y3RfaWQ6IHN0ciwKICAgICkgLT4gRGVjaW1hbDoKICAgICAgICBhd2FpdCBzZWxmLmVuc3VyZV9zY2hlbWEoKQoKICAgICAgICBwcm9kdWN0X2lkID0gc2VsZi5fdmFsaWRhdGVfcHJvZHVjdF9pZCgKICAgICAgICAgICAgcHJvZHVjdF9pZAogICAgICAgICkKCiAgICAgICAgcmF3ID0gYXdhaXQgc2VsZi5fcnVuKAogICAgICAgICAgICBzZWxmLl9nZXRfYmFzZV91c2R0X3N5bmMsCiAgICAgICAgICAgIHByb2R1Y3RfaWQsCiAgICAgICAgKQoKICAgICAgICBpZiByYXcgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgUHJvZHVjdFByaWNlTm90Q29uZmlndXJlZCgKICAgICAgICAgICAgICAgIGYiUHJvZHVjdCBwcmljZSBpcyBub3QgY29uZmlndXJlZDoge3Byb2R1Y3RfaWR9IgogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBzZWxmLl9kZWNpbWFsKAogICAgICAgICAgICByYXcKICAgICAgICApCgogICAgZGVmIF9nZXRfYmFzZV91c2R0X3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICBwcm9kdWN0X2lkOiBzdHIsCiAgICApIC0+IE9wdGlvbmFsW3N0cl06CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUIHByaWNlX3VzZHQKICAgICAgICAgICAgICAgIEZST00gcHJvZHVjdF9iYXNlX3ByaWNlcwogICAgICAgICAgICAgICAgV0hFUkUgcHJvZHVjdF9pZCA9ID8KICAgICAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgc3RyKAogICAgICAgICAgICAgICAgICAgIHJvd1sicHJpY2VfdXNkdCJdCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiByb3cKICAgICAgICAgICAgICAgIGVsc2UgTm9uZQogICAgICAgICAgICApCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGFzeW5jIGRlZiBnZXRfYWxsX2Jhc2VfdXNkdCgKICAgICAgICBzZWxmLAogICAgKSAtPiBkaWN0WwogICAgICAgIHN0ciwKICAgICAgICBPcHRpb25hbFtEZWNpbWFsXSwKICAgIF06CiAgICAgICAgYXdhaXQgc2VsZi5lbnN1cmVfc2NoZW1hKCkKCiAgICAgICAgcm93cyA9IGF3YWl0IHNlbGYuX3J1bigKICAgICAgICAgICAgc2VsZi5fZ2V0X2FsbF9iYXNlX3VzZHRfc3luYwogICAgICAgICkKCiAgICAgICAgcmVzdWx0OiBkaWN0WwogICAgICAgICAgICBzdHIsCiAgICAgICAgICAgIE9wdGlvbmFsW0RlY2ltYWxdLAogICAgICAgIF0gPSB7CiAgICAgICAgICAgIGtleTogTm9uZQogICAgICAgICAgICBmb3Iga2V5CiAgICAgICAgICAgIGluIFBST0RVQ1RfTEFCRUxTCiAgICAgICAgfQoKICAgICAgICBmb3IgcHJvZHVjdF9pZCwgcmF3IGluIHJvd3M6CiAgICAgICAgICAgIGlmIHByb2R1Y3RfaWQgbm90IGluIHJlc3VsdDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHRbCiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9pZAogICAgICAgICAgICAgICAgXSA9IHNlbGYuX2RlY2ltYWwoCiAgICAgICAgICAgICAgICAgICAgcmF3CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkUHJvZHVjdFByaWNlOgogICAgICAgICAgICAgICAgcmVzdWx0WwogICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfaWQKICAgICAgICAgICAgICAgIF0gPSBOb25lCgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2dldF9hbGxfYmFzZV91c2R0X3N5bmMoCiAgICAgICAgc2VsZiwKICAgICkgLT4gbGlzdFsKICAgICAgICB0dXBsZVsKICAgICAgICAgICAgc3RyLAogICAgICAgICAgICBzdHIsCiAgICAgICAgXQogICAgXToKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUIHByb2R1Y3RfaWQsIHByaWNlX3VzZHQKICAgICAgICAgICAgICAgIEZST00gcHJvZHVjdF9iYXNlX3ByaWNlcwogICAgICAgICAgICAgICAgT1JERVIgQlkgcHJvZHVjdF9pZAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICkuZmV0Y2hhbGwoKQoKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBzdHIoCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1sicHJvZHVjdF9pZCJdCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBzdHIoCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1sicHJpY2VfdXNkdCJdCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciByb3cKICAgICAgICAgICAgICAgIGluIHJvd3MKICAgICAgICAgICAgXQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFF1b3RlCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYXN5bmMgZGVmIGdldF9wYWNrYWdlX2Jhc2VfdXNkdCgKICAgICAgICBzZWxmLAogICAgICAgIHBhY2thZ2VfaWQ6IHN0ciwKICAgICkgLT4gRGVjaW1hbDoKICAgICAgICBwYWNrYWdlX2lkID0gc3RyKAogICAgICAgICAgICBwYWNrYWdlX2lkCiAgICAgICAgICAgIG9yICIiCiAgICAgICAgKS5zdHJpcCgpLmxvd2VyKCkKCiAgICAgICAgaWYgcGFja2FnZV9pZCBpbiBQUk9EVUNUX0xBQkVMUzoKICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuZ2V0X2Jhc2VfdXNkdCgKICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQKICAgICAgICAgICAgKQoKICAgICAgICBwcmVmaXggPSAiY3VzdG9tX3N0YXJzXyIKCiAgICAgICAgaWYgcGFja2FnZV9pZC5zdGFydHN3aXRoKAogICAgICAgICAgICBwcmVmaXgKICAgICAgICApOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBhbW91bnQgPSBpbnQoCiAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9pZFsKICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHByZWZpeCk6CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgZXhjZXB0ICgKICAgICAgICAgICAgICAgIFR5cGVFcnJvciwKICAgICAgICAgICAgICAgIFZhbHVlRXJyb3IsCiAgICAgICAgICAgICkgYXMgZXhjOgogICAgICAgICAgICAgICAgcmFpc2UgUHJvZHVjdFByaWNpbmdFcnJvcigKICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjdXN0b20gU3RhcnMgYW1vdW50LiIKICAgICAgICAgICAgICAgICkgZnJvbSBleGMKCiAgICAgICAgICAgIGlmIGFtb3VudCA8PSAwOgogICAgICAgICAgICAgICAgcmFpc2UgUHJvZHVjdFByaWNpbmdFcnJvcigKICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjdXN0b20gU3RhcnMgYW1vdW50LiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIHVuaXQgPSBhd2FpdCBzZWxmLmdldF9iYXNlX3VzZHQoCiAgICAgICAgICAgICAgICAic3RhcnNfdW5pdCIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIHVuaXQKICAgICAgICAgICAgICAgICogRGVjaW1hbCgKICAgICAgICAgICAgICAgICAgICBhbW91bnQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKS5xdWFudGl6ZSgKICAgICAgICAgICAgICAgIERlY2ltYWwoIjAuMDAwMDAwMDEiKQogICAgICAgICAgICApCgogICAgICAgIHJhaXNlIFByb2R1Y3RQcmljaW5nRXJyb3IoCiAgICAgICAgICAgIGYiVW5rbm93biBwYWNrYWdlOiB7cGFja2FnZV9pZH0iCiAgICAgICAgKQoKICAgIGFzeW5jIGRlZiBxdW90ZV90b21hbigKICAgICAgICBzZWxmLAogICAgICAgIHBhY2thZ2VfaWQ6IHN0ciwKICAgICAgICAqLAogICAgICAgIGZvcmNlX3JlZnJlc2hfcmF0ZTogYm9vbCA9IEZhbHNlLAogICAgICAgIGFsbG93X3N0YWxlX3JhdGU6IGJvb2wgPSBUcnVlLAogICAgKSAtPiBQcm9kdWN0VG9tYW5RdW90ZToKICAgICAgICBiYXNlX3VzZHQgPSBhd2FpdCBzZWxmLmdldF9wYWNrYWdlX2Jhc2VfdXNkdCgKICAgICAgICAgICAgcGFja2FnZV9pZAogICAgICAgICkKCiAgICAgICAgcmF0ZXMgPSBJcmFuVXNkdFJhdGVTZXJ2aWNlKAogICAgICAgICAgICB0aW1lb3V0PTQuMCwKICAgICAgICAgICAgY2FjaGVfdHRsPTE1LjAsCiAgICAgICAgICAgIHN0YWxlX3R0bD0zMDAuMCwKICAgICAgICApCgogICAgICAgIHRyeToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmF0ZV9xdW90ZSA9IGF3YWl0IHJhdGVzLmdldF9xdW90ZSgKICAgICAgICAgICAgICAgICAgICBmb3JjZV9yZWZyZXNoPWZvcmNlX3JlZnJlc2hfcmF0ZSwKICAgICAgICAgICAgICAgICAgICBhbGxvd19zdGFsZT1hbGxvd19zdGFsZV9yYXRlLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgZXhjZXB0IElyYW5Vc2R0QWxsUHJvdmlkZXJzRmFpbGVkIGFzIGV4YzoKICAgICAgICAgICAgICAgIHJhaXNlIFByb2R1Y3RSYXRlVW5hdmFpbGFibGUoCiAgICAgICAgICAgICAgICAgICAgIlVTRFQvVG9tYW4gcmF0ZSBpcyB1bmF2YWlsYWJsZS4iCiAgICAgICAgICAgICAgICApIGZyb20gZXhjCgogICAgICAgICAgICB0b21hbiA9ICgKICAgICAgICAgICAgICAgIGJhc2VfdXNkdAogICAgICAgICAgICAgICAgKiByYXRlX3F1b3RlLnJhdGVfdG9tYW4KICAgICAgICAgICAgKQoKICAgICAgICAgICAgZmluYWxfdG9tYW4gPSBpbnQoCiAgICAgICAgICAgICAgICB0b21hbi5xdWFudGl6ZSgKICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKCIxIiksCiAgICAgICAgICAgICAgICAgICAgcm91bmRpbmc9Uk9VTkRfSEFMRl9VUCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgZmluYWxfdG9tYW4gPD0gMDoKICAgICAgICAgICAgICAgIHJhaXNlIFByb2R1Y3RSYXRlVW5hdmFpbGFibGUoCiAgICAgICAgICAgICAgICAgICAgIkNvbnZlcnRlZCBUb21hbiBwcmljZSBpcyBpbnZhbGlkLiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgIlNob3AgcHJvZHVjdCBxdW90ZSB8ICIKICAgICAgICAgICAgICAgICJwYWNrYWdlPSVzIGJhc2VfdXNkdD0lcyAiCiAgICAgICAgICAgICAgICAidXNkdF90b21hbj0lcyBzb3VyY2U9JXMgZmluYWxfdG9tYW49JXMiLAogICAgICAgICAgICAgICAgcGFja2FnZV9pZCwKICAgICAgICAgICAgICAgIGJhc2VfdXNkdCwKICAgICAgICAgICAgICAgIHJhdGVfcXVvdGUucmF0ZV90b21hbiwKICAgICAgICAgICAgICAgIHJhdGVfcXVvdGUuc291cmNlLAogICAgICAgICAgICAgICAgZmluYWxfdG9tYW4sCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBQcm9kdWN0VG9tYW5RdW90ZSgKICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQ9cGFja2FnZV9pZCwKICAgICAgICAgICAgICAgIGJhc2VfdXNkdD1iYXNlX3VzZHQsCiAgICAgICAgICAgICAgICB1c2R0X3RvbWFuPXJhdGVfcXVvdGUucmF0ZV90b21hbiwKICAgICAgICAgICAgICAgIGZpbmFsX3RvbWFuPWZpbmFsX3RvbWFuLAogICAgICAgICAgICAgICAgcmF0ZV9zb3VyY2U9cmF0ZV9xdW90ZS5zb3VyY2UsCiAgICAgICAgICAgICkKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgYXdhaXQgcmF0ZXMuY2xvc2UoKQoKCl9fYWxsX18gPSBbCiAgICAiUFJPRFVDVF9MQUJFTFMiLAogICAgIlBSRU1JVU1fUFJPRFVDVF9JRFMiLAogICAgIlNUQVJTX1BST0RVQ1RfSURTIiwKICAgICJQcm9kdWN0UHJpY2luZ1NlcnZpY2UiLAogICAgIlByb2R1Y3RUb21hblF1b3RlIiwKICAgICJQcm9kdWN0UHJpY2luZ0Vycm9yIiwKICAgICJQcm9kdWN0UHJpY2VOb3RDb25maWd1cmVkIiwKICAgICJQcm9kdWN0UmF0ZVVuYXZhaWxhYmxlIiwKICAgICJJbnZhbGlkUHJvZHVjdFByaWNlIiwKXQo=', 'services/order_service.py': 'IyBzZXJ2aWNlcy9vcmRlcl9zZXJ2aWNlLnB5Cgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYXN5bmNpbwppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3FsaXRlMwpmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBhc2RpY3QsIGRhdGFjbGFzcwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgSXRlcmFibGUsIE9wdGlvbmFsCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBTdGF0dXNlcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU1RBVFVTX1BFTkRJTkdfT1dORVIgPSAicGVuZGluZ19vd25lcl9hcHByb3ZhbCIKU1RBVFVTX09XTkVSX1BST0NFU1NJTkcgPSAib3duZXJfcHJvY2Vzc2luZyIKU1RBVFVTX1JFSkVDVEVEX0JZX09XTkVSID0gInJlamVjdGVkX2J5X293bmVyIgpTVEFUVVNfQ0FOQ0VMTEVEX0JZX1VTRVIgPSAiY2FuY2VsbGVkX2J5X3VzZXIiClNUQVRVU19QUklDRV9DSEFOR0VEID0gInByaWNlX2NoYW5nZWQiClNUQVRVU19JTlNVRkZJQ0lFTlRfQkFMQU5DRSA9ICJpbnN1ZmZpY2llbnRfYmFsYW5jZSIKU1RBVFVTX1BST1ZJREVSX1BST0NFU1NJTkcgPSAicHJvdmlkZXJfcHJvY2Vzc2luZyIKU1RBVFVTX1BST1ZJREVSX1VOS05PV04gPSAicHJvdmlkZXJfc3RhdHVzX3Vua25vd24iClNUQVRVU19DT01QTEVURUQgPSAiY29tcGxldGVkIgpTVEFUVVNfRkFJTEVEX1JFRlVOREVEID0gImZhaWxlZF9yZWZ1bmRlZCIKU1RBVFVTX0ZBSUxFRF9SRUZVTkRfUkVRVUlSRUQgPSAiZmFpbGVkX3JlZnVuZF9yZXF1aXJlZCIKCiMgTGVnYWN5IHN0YXR1c2VzIGFyZSByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCByb3dzL2hhbmRsZXJzLgpMRUdBQ1lfU1RBVFVTRVMgPSB7CiAgICAicGVuZGluZyIsCiAgICAicHJvY2Vzc2luZyIsCiAgICAicGFpZCIsCiAgICAiZmFpbGVkIiwKICAgICJjYW5jZWxsZWQiLAogICAgInJlZnVuZGVkIiwKICAgICJjcmVhdGVkIiwKfQoKVkFMSURfU1RBVFVTRVMgPSB7CiAgICBTVEFUVVNfUEVORElOR19PV05FUiwKICAgIFNUQVRVU19PV05FUl9QUk9DRVNTSU5HLAogICAgU1RBVFVTX1JFSkVDVEVEX0JZX09XTkVSLAogICAgU1RBVFVTX0NBTkNFTExFRF9CWV9VU0VSLAogICAgU1RBVFVTX1BSSUNFX0NIQU5HRUQsCiAgICBTVEFUVVNfSU5TVUZGSUNJRU5UX0JBTEFOQ0UsCiAgICBTVEFUVVNfUFJPVklERVJfUFJPQ0VTU0lORywKICAgIFNUQVRVU19QUk9WSURFUl9VTktOT1dOLAogICAgU1RBVFVTX0NPTVBMRVRFRCwKICAgIFNUQVRVU19GQUlMRURfUkVGVU5ERUQsCiAgICBTVEFUVVNfRkFJTEVEX1JFRlVORF9SRVFVSVJFRCwKICAgICpMRUdBQ1lfU1RBVFVTRVMsCn0KCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1vZGVscwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQGRhdGFjbGFzcyhzbG90cz1UcnVlKQpjbGFzcyBPcmRlcjoKICAgIGlkOiBpbnQKICAgIHVzZXJfaWQ6IGludAogICAgcHJvZHVjdF9pZDogc3RyCiAgICB0YXJnZXQ6IE9wdGlvbmFsW3N0cl0KICAgIHByaWNlOiBpbnQKICAgIHN0YXR1czogc3RyCiAgICBnYXRld2F5OiBzdHIKICAgIG1hcmtldF9vcmRlcl9pZDogT3B0aW9uYWxbc3RyXQogICAgY3JlYXRlZF9hdDogc3RyCiAgICB1cGRhdGVkX2F0OiBzdHIKCiAgICBvd25lcl9pZDogT3B0aW9uYWxbaW50XSA9IE5vbmUKICAgIHByb3ZpZGVyX3JlcXVpcmVkX3ByaWNlOiBPcHRpb25hbFtpbnRdID0gTm9uZQogICAgcHJvdmlkZXJfZXJyb3I6IE9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICBwcm92aWRlcl9zdGFydGVkX2F0OiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgY29tcGxldGVkX2F0OiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgcmVmdW5kZWRfYXQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lCgogICAgZGVmIHRvX2RpY3Qoc2VsZikgLT4gZGljdFtzdHIsIEFueV06CiAgICAgICAgcmV0dXJuIGFzZGljdChzZWxmKQoKCkBkYXRhY2xhc3Moc2xvdHM9VHJ1ZSkKY2xhc3MgV2FsbGV0UmVzZXJ2YXRpb25SZXN1bHQ6CiAgICBzdWNjZXNzOiBib29sCiAgICByZWFzb246IHN0cgoKICAgIG9yZGVyX2lkOiBPcHRpb25hbFtpbnRdID0gTm9uZQogICAgdXNlcl9pZDogT3B0aW9uYWxbaW50XSA9IE5vbmUKICAgIGFtb3VudDogaW50ID0gMAoKICAgIGJhbGFuY2VfYmVmb3JlOiBpbnQgPSAwCiAgICBiYWxhbmNlX2FmdGVyOiBpbnQgPSAwCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBFeGNlcHRpb25zCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpjbGFzcyBPcmRlclNlcnZpY2VFcnJvcihFeGNlcHRpb24pOgogICAgcGFzcwoKCmNsYXNzIE9yZGVyTm90Rm91bmRFcnJvcihPcmRlclNlcnZpY2VFcnJvcik6CiAgICBwYXNzCgoKY2xhc3MgSW52YWxpZE9yZGVyRXJyb3IoT3JkZXJTZXJ2aWNlRXJyb3IpOgogICAgcGFzcwoKCmNsYXNzIEludmFsaWRPcmRlclN0YXR1c0Vycm9yKE9yZGVyU2VydmljZUVycm9yKToKICAgIHBhc3MKCgpjbGFzcyBXYWxsZXRFcnJvcihPcmRlclNlcnZpY2VFcnJvcik6CiAgICBwYXNzCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBPcmRlciBTZXJ2aWNlCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpjbGFzcyBPcmRlclNlcnZpY2U6CiAgICAiIiIKICAgIE9yZGVyIHNlcnZpY2UgZm9yIHRoZSBtYWluIGJvdCBkYXRhYmFzZS4KCiAgICBEYXRhYmFzZSBjb250cmFjdCB1c2VkIGJ5IHRoZSBjdXJyZW50IHByb2plY3Q6CiAgICAgICAgdXNlcnMudXNlcl9pZAogICAgICAgIHVzZXJzLmJhbGFuY2VfdG9tYW4gICAocHJlZmVycmVkKQogICAgICAgIHVzZXJzLmJhbGFuY2UgICAgICAgICAobGVnYWN5IGZhbGxiYWNrKQoKICAgICAgICBvcmRlcnMuaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5UCiAgICAgICAgb3JkZXJzLnVzZXJfaWQgLT4gdXNlcnMudXNlcl9pZAoKICAgIFB1cmNoYXNlIGZsb3c6CiAgICAgICAgcGVuZGluZ19vd25lcl9hcHByb3ZhbAogICAgICAgIC0+IG93bmVyX3Byb2Nlc3NpbmcKICAgICAgICAtPiBwcm92aWRlcl9wcm9jZXNzaW5nCiAgICAgICAgLT4gY29tcGxldGVkCgogICAgQWx0ZXJuYXRpdmUgdGVybWluYWwvaW50ZXJtZWRpYXRlIHN0YXRlczoKICAgICAgICByZWplY3RlZF9ieV9vd25lcgogICAgICAgIGNhbmNlbGxlZF9ieV91c2VyCiAgICAgICAgcHJpY2VfY2hhbmdlZAogICAgICAgIGluc3VmZmljaWVudF9iYWxhbmNlCiAgICAgICAgZmFpbGVkX3JlZnVuZGVkCiAgICAgICAgZmFpbGVkX3JlZnVuZF9yZXF1aXJlZAogICAgICAgIHByb3ZpZGVyX3N0YXR1c191bmtub3duCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgc2VsZiwKICAgICAgICBkYl9wYXRoOiBzdHIgfCBQYXRoID0gIm1hdHJpeF9ib3QuZGIiLAogICAgKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGJfcGF0aCA9IHN0cihkYl9wYXRoKQoKICAgICAgICBpZiBub3Qgc2VsZi5kYl9wYXRoLnN0cmlwKCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiZGJfcGF0aCBjYW5ub3QgYmUgZW1wdHkuIgogICAgICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBTUUxpdGUKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgX2Nvbm5lY3QoCiAgICAgICAgc2VsZiwKICAgICAgICAqLAogICAgICAgIGZvcmVpZ25fa2V5czogYm9vbCA9IFRydWUsCiAgICApIC0+IHNxbGl0ZTMuQ29ubmVjdGlvbjoKICAgICAgICBjb25uID0gc3FsaXRlMy5jb25uZWN0KAogICAgICAgICAgICBzZWxmLmRiX3BhdGgsCiAgICAgICAgICAgIHRpbWVvdXQ9MzAsCiAgICAgICAgICAgIGNoZWNrX3NhbWVfdGhyZWFkPUZhbHNlLAogICAgICAgICkKCiAgICAgICAgY29ubi5yb3dfZmFjdG9yeSA9IHNxbGl0ZTMuUm93CgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlBSQUdNQSBidXN5X3RpbWVvdXQgPSAzMDAwMCIKICAgICAgICApCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgIlBSQUdNQSBmb3JlaWduX2tleXMgPSBPTiIKICAgICAgICAgICAgICAgIGlmIGZvcmVpZ25fa2V5cwogICAgICAgICAgICAgICAgZWxzZSAiUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9GRiIKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAgICAgcmV0dXJuIGNvbm4KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3RhYmxlX2V4aXN0cygKICAgICAgICBjb25uOiBzcWxpdGUzLkNvbm5lY3Rpb24sCiAgICAgICAgdGFibGVfbmFtZTogc3RyLAogICAgKSAtPiBib29sOgogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIFNFTEVDVCAxCiAgICAgICAgICAgIEZST00gc3FsaXRlX21hc3RlcgogICAgICAgICAgICBXSEVSRSB0eXBlPSd0YWJsZScKICAgICAgICAgICAgICBBTkQgbmFtZT0/CiAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAodGFibGVfbmFtZSwpLAogICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICByZXR1cm4gcm93IGlzIG5vdCBOb25lCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2NvbHVtbl9uYW1lcygKICAgICAgICBjbHMsCiAgICAgICAgY29ubjogc3FsaXRlMy5Db25uZWN0aW9uLAogICAgICAgIHRhYmxlX25hbWU6IHN0ciwKICAgICkgLT4gc2V0W3N0cl06CiAgICAgICAgaWYgbm90IGNscy5fdGFibGVfZXhpc3RzKAogICAgICAgICAgICBjb25uLAogICAgICAgICAgICB0YWJsZV9uYW1lLAogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybiBzZXQoKQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzdHIocm93WyJuYW1lIl0pCiAgICAgICAgICAgIGZvciByb3cKICAgICAgICAgICAgaW4gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgZiJQUkFHTUEgdGFibGVfaW5mbyh7dGFibGVfbmFtZX0pIgogICAgICAgICAgICApLmZldGNoYWxsKCkKICAgICAgICB9CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3dhbGxldF9jb2x1bW4oCiAgICAgICAgY2xzLAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICkgLT4gT3B0aW9uYWxbc3RyXToKICAgICAgICBjb2x1bW5zID0gY2xzLl9jb2x1bW5fbmFtZXMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICJ1c2VycyIsCiAgICAgICAgKQoKICAgICAgICBpZiAiYmFsYW5jZV90b21hbiIgaW4gY29sdW1uczoKICAgICAgICAgICAgcmV0dXJuICJiYWxhbmNlX3RvbWFuIgoKICAgICAgICBpZiAiYmFsYW5jZSIgaW4gY29sdW1uczoKICAgICAgICAgICAgcmV0dXJuICJiYWxhbmNlIgoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGFzeW5jIGRlZiBfcnVuKAogICAgICAgIHNlbGYsCiAgICAgICAgZnVuYywKICAgICAgICAqYXJncywKICAgICk6CiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jaW8udG9fdGhyZWFkKAogICAgICAgICAgICBmdW5jLAogICAgICAgICAgICAqYXJncywKICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBTY2hlbWEKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgZW5zdXJlX3NjaGVtYSgKICAgICAgICBzZWxmLAogICAgKSAtPiBOb25lOgogICAgICAgICIiIgogICAgICAgIFZlcmlmeS9yZXBhaXIgdGhlIG9yZGVycyB0YWJsZS4KCiAgICAgICAgUmVwYWlycyB0aGUga25vd24gaGlzdG9yaWNhbCBGSyBidWc6CiAgICAgICAgICAgIG9yZGVycy51c2VyX2lkIC0+IHVzZXJzLmlkCgogICAgICAgIHRvOgogICAgICAgICAgICBvcmRlcnMudXNlcl9pZCAtPiB1c2Vycy51c2VyX2lkCgogICAgICAgIFRoZSBtaWdyYXRpb24gaXMgcGVyZm9ybWVkIHdpdGggZm9yZWlnbl9rZXlzIGRpc2FibGVkLAogICAgICAgIGluc2lkZSBCRUdJTiBJTU1FRElBVEUsIGFuZCBwcmVzZXJ2ZXMga25vd24gb3JkZXIgY29sdW1ucy4KICAgICAgICAiIiIKICAgICAgICBhd2FpdCBzZWxmLl9ydW4oCiAgICAgICAgICAgIHNlbGYuX2Vuc3VyZV9zY2hlbWFfc3luYwogICAgICAgICkKCiAgICBkZWYgX2Vuc3VyZV9zY2hlbWFfc3luYygKICAgICAgICBzZWxmLAogICAgKSAtPiBOb25lOgogICAgICAgICMgRm9yZWlnbiBrZXlzIG11c3QgYmUgT0ZGIGJlZm9yZSBCRUdJTiBmb3IgdGFibGUgcmVwYWlyLgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KAogICAgICAgICAgICBmb3JlaWduX2tleXM9RmFsc2UKICAgICAgICApCgogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIkJFR0lOIElNTUVESUFURSIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgbm90IHNlbGYuX3RhYmxlX2V4aXN0cygKICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICAidXNlcnMiLAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgcmFpc2UgT3JkZXJTZXJ2aWNlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgInVzZXJzIHRhYmxlIGRvZXMgbm90IGV4aXN0LiAiCiAgICAgICAgICAgICAgICAgICAgIkluaXRpYWxpemUgRGF0YWJhc2VNYW5hZ2VyIGZpcnN0LiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIHVzZXJfY29sdW1ucyA9IHNlbGYuX2NvbHVtbl9uYW1lcygKICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICAidXNlcnMiLAogICAgICAgICAgICApCgogICAgICAgICAgICBpZiAidXNlcl9pZCIgbm90IGluIHVzZXJfY29sdW1uczoKICAgICAgICAgICAgICAgIHJhaXNlIE9yZGVyU2VydmljZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJ1c2Vycy51c2VyX2lkIGlzIG1pc3NpbmcuIgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgbm90IHNlbGYuX3RhYmxlX2V4aXN0cygKICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICAib3JkZXJzIiwKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9vcmRlcnNfdGFibGUoCiAgICAgICAgICAgICAgICAgICAgY29ubgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9pbmRleGVzKAogICAgICAgICAgICAgICAgICAgIGNvbm4KICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgIm9yZGVycyB0YWJsZSBjcmVhdGVkLiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIG9yZGVyX2NvbHVtbnMgPSAoCiAgICAgICAgICAgICAgICBzZWxmLl9jb2x1bW5fbmFtZXMoCiAgICAgICAgICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgICAgICAgICAib3JkZXJzIiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmVxdWlyZWRfY29sdW1ucyA9IHsKICAgICAgICAgICAgICAgICJpZCIsCiAgICAgICAgICAgICAgICAidXNlcl9pZCIsCiAgICAgICAgICAgICAgICAicHJvZHVjdF9pZCIsCiAgICAgICAgICAgICAgICAidGFyZ2V0IiwKICAgICAgICAgICAgICAgICJwcmljZSIsCiAgICAgICAgICAgICAgICAic3RhdHVzIiwKICAgICAgICAgICAgICAgICJnYXRld2F5IiwKICAgICAgICAgICAgICAgICJtYXJrZXRfb3JkZXJfaWQiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiLAogICAgICAgICAgICB9CgogICAgICAgICAgICBma19yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIlBSQUdNQSBmb3JlaWduX2tleV9saXN0KG9yZGVycykiCiAgICAgICAgICAgICkuZmV0Y2hhbGwoKQoKICAgICAgICAgICAgaGFzX2NvcnJlY3RfdXNlcl9mayA9IGFueSgKICAgICAgICAgICAgICAgIHN0cihyb3dbInRhYmxlIl0pID09ICJ1c2VycyIKICAgICAgICAgICAgICAgIGFuZCBzdHIocm93WyJmcm9tIl0pID09ICJ1c2VyX2lkIgogICAgICAgICAgICAgICAgYW5kIHN0cihyb3dbInRvIl0pID09ICJ1c2VyX2lkIgogICAgICAgICAgICAgICAgZm9yIHJvdyBpbiBma19yb3dzCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgSWYgdGhlIGJhc2ljIHNjaGVtYSArIEZLIGlzIGFscmVhZHkgZ29vZCwKICAgICAgICAgICAgIyBvbmx5IGFkZCBvcHRpb25hbCBvd25lci1hcHByb3ZhbCBjb2x1bW5zLgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICByZXF1aXJlZF9jb2x1bW5zLmlzc3Vic2V0KAogICAgICAgICAgICAgICAgICAgIG9yZGVyX2NvbHVtbnMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGFuZCBoYXNfY29ycmVjdF91c2VyX2ZrCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBzZWxmLl9hZGRfb3B0aW9uYWxfY29sdW1ucygKICAgICAgICAgICAgICAgICAgICBjb25uLAogICAgICAgICAgICAgICAgICAgIG9yZGVyX2NvbHVtbnMsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2luZGV4ZXMoCiAgICAgICAgICAgICAgICAgICAgY29ubgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICMgUmVwYWlyIGN1cnJlbnQgb3JkZXJzIHRhYmxlCiAgICAgICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBsZWdhY3lfbmFtZSA9ICgKICAgICAgICAgICAgICAgICJvcmRlcnNfbGVnYWN5X29yZGVyX3NlcnZpY2UiCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIHNlbGYuX3RhYmxlX2V4aXN0cygKICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICBsZWdhY3lfbmFtZSwKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICMgQSBwcmV2aW91cyBmYWlsZWQgbWlncmF0aW9uIGxlZnQgYSB0ZW1wIHRhYmxlLgogICAgICAgICAgICAgICAgcmFpc2UgT3JkZXJTZXJ2aWNlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgZiJ7bGVnYWN5X25hbWV9IGFscmVhZHkgZXhpc3RzLiAiCiAgICAgICAgICAgICAgICAgICAgIk1hbnVhbCBpbnNwZWN0aW9uIGlzIHJlcXVpcmVkIGJlZm9yZSBtaWdyYXRpb24uIgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICJBTFRFUiBUQUJMRSBvcmRlcnMgIgogICAgICAgICAgICAgICAgICAgIGYiUkVOQU1FIFRPIHtsZWdhY3lfbmFtZX0iCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9vcmRlcnNfdGFibGUoCiAgICAgICAgICAgICAgICBjb25uCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIG9sZF9jb2x1bW5zID0gKAogICAgICAgICAgICAgICAgc2VsZi5fY29sdW1uX25hbWVzKAogICAgICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICAgICAgbGVnYWN5X25hbWUsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIG5ld19jb2x1bW5zID0gKAogICAgICAgICAgICAgICAgc2VsZi5fY29sdW1uX25hbWVzKAogICAgICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICAgICAgIm9yZGVycyIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvcHlfY29sdW1ucyA9IFsKICAgICAgICAgICAgICAgIGNvbHVtbgogICAgICAgICAgICAgICAgZm9yIGNvbHVtbgogICAgICAgICAgICAgICAgaW4gKAogICAgICAgICAgICAgICAgICAgICJpZCIsCiAgICAgICAgICAgICAgICAgICAgInVzZXJfaWQiLAogICAgICAgICAgICAgICAgICAgICJwcm9kdWN0X2lkIiwKICAgICAgICAgICAgICAgICAgICAidGFyZ2V0IiwKICAgICAgICAgICAgICAgICAgICAicHJpY2UiLAogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiLAogICAgICAgICAgICAgICAgICAgICJnYXRld2F5IiwKICAgICAgICAgICAgICAgICAgICAibWFya2V0X29yZGVyX2lkIiwKICAgICAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiLAogICAgICAgICAgICAgICAgICAgICJvd25lcl9pZCIsCiAgICAgICAgICAgICAgICAgICAgInByb3ZpZGVyX3JlcXVpcmVkX3ByaWNlIiwKICAgICAgICAgICAgICAgICAgICAicHJvdmlkZXJfZXJyb3IiLAogICAgICAgICAgICAgICAgICAgICJwcm92aWRlcl9zdGFydGVkX2F0IiwKICAgICAgICAgICAgICAgICAgICAiY29tcGxldGVkX2F0IiwKICAgICAgICAgICAgICAgICAgICAicmVmdW5kZWRfYXQiLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIGNvbHVtbiBpbiBvbGRfY29sdW1ucwogICAgICAgICAgICAgICAgICAgIGFuZCBjb2x1bW4gaW4gbmV3X2NvbHVtbnMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgXQoKICAgICAgICAgICAgaWYgY29weV9jb2x1bW5zOgogICAgICAgICAgICAgICAgbmFtZXMgPSAiLCAiLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgY29weV9jb2x1bW5zCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIGYiIiIKICAgICAgICAgICAgICAgICAgICBJTlNFUlQgT1IgSUdOT1JFIElOVE8gb3JkZXJzICgKICAgICAgICAgICAgICAgICAgICAgICAge25hbWVzfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBTRUxFQ1QKICAgICAgICAgICAgICAgICAgICAgICAge25hbWVzfQogICAgICAgICAgICAgICAgICAgIEZST00ge2xlZ2FjeV9uYW1lfQogICAgICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgZiJEUk9QIFRBQkxFIHtsZWdhY3lfbmFtZX0iCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9pbmRleGVzKAogICAgICAgICAgICAgICAgY29ubgogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJvcmRlcnMgc2NoZW1hIHJlcGFpcmVkIHwgIgogICAgICAgICAgICAgICAgImRiPSVzIiwKICAgICAgICAgICAgICAgIHNlbGYuZGJfcGF0aCwKICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IGluaXRpYWxpemUvcmVwYWlyIG9yZGVycyBzY2hlbWEuIgogICAgICAgICAgICApCgogICAgICAgICAgICByYWlzZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NyZWF0ZV9vcmRlcnNfdGFibGUoCiAgICAgICAgY29ubjogc3FsaXRlMy5Db25uZWN0aW9uLAogICAgKSAtPiBOb25lOgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIG9yZGVycyAoCiAgICAgICAgICAgICAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCgogICAgICAgICAgICAgICAgdXNlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLAoKICAgICAgICAgICAgICAgIHByb2R1Y3RfaWQgVEVYVCBOT1QgTlVMTCwKCiAgICAgICAgICAgICAgICB0YXJnZXQgVEVYVCwKCiAgICAgICAgICAgICAgICBwcmljZSBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwKCiAgICAgICAgICAgICAgICBzdGF0dXMgVEVYVCBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgJ3BlbmRpbmdfb3duZXJfYXBwcm92YWwnLAoKICAgICAgICAgICAgICAgIGdhdGV3YXkgVEVYVCBOT1QgTlVMTAogICAgICAgICAgICAgICAgICAgIERFRkFVTFQgJ3dhbGxldCcsCgogICAgICAgICAgICAgICAgbWFya2V0X29yZGVyX2lkIFRFWFQsCgogICAgICAgICAgICAgICAgb3duZXJfaWQgSU5URUdFUiwKCiAgICAgICAgICAgICAgICBwcm92aWRlcl9yZXF1aXJlZF9wcmljZSBJTlRFR0VSLAoKICAgICAgICAgICAgICAgIHByb3ZpZGVyX2Vycm9yIFRFWFQsCgogICAgICAgICAgICAgICAgcHJvdmlkZXJfc3RhcnRlZF9hdCBUSU1FU1RBTVAsCgogICAgICAgICAgICAgICAgY29tcGxldGVkX2F0IFRJTUVTVEFNUCwKCiAgICAgICAgICAgICAgICByZWZ1bmRlZF9hdCBUSU1FU1RBTVAsCgogICAgICAgICAgICAgICAgY3JlYXRlZF9hdCBUSU1FU1RBTVAgTk9UIE5VTEwKICAgICAgICAgICAgICAgICAgICBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QLAoKICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgVElNRVNUQU1QIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwKCiAgICAgICAgICAgICAgICBGT1JFSUdOIEtFWSAodXNlcl9pZCkKICAgICAgICAgICAgICAgICAgICBSRUZFUkVOQ0VTIHVzZXJzKHVzZXJfaWQpCiAgICAgICAgICAgICAgICAgICAgT04gREVMRVRFIENBU0NBREUKICAgICAgICAgICAgKQogICAgICAgICAgICAiIiIKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9hZGRfb3B0aW9uYWxfY29sdW1ucygKICAgICAgICBjb25uOiBzcWxpdGUzLkNvbm5lY3Rpb24sCiAgICAgICAgY29sdW1uczogc2V0W3N0cl0sCiAgICApIC0+IE5vbmU6CiAgICAgICAgYWRkaXRpb25zID0gewogICAgICAgICAgICAib3duZXJfaWQiOgogICAgICAgICAgICAgICAgIklOVEVHRVIiLAogICAgICAgICAgICAicHJvdmlkZXJfcmVxdWlyZWRfcHJpY2UiOgogICAgICAgICAgICAgICAgIklOVEVHRVIiLAogICAgICAgICAgICAicHJvdmlkZXJfZXJyb3IiOgogICAgICAgICAgICAgICAgIlRFWFQiLAogICAgICAgICAgICAicHJvdmlkZXJfc3RhcnRlZF9hdCI6CiAgICAgICAgICAgICAgICAiVElNRVNUQU1QIiwKICAgICAgICAgICAgImNvbXBsZXRlZF9hdCI6CiAgICAgICAgICAgICAgICAiVElNRVNUQU1QIiwKICAgICAgICAgICAgInJlZnVuZGVkX2F0IjoKICAgICAgICAgICAgICAgICJUSU1FU1RBTVAiLAogICAgICAgIH0KCiAgICAgICAgZm9yICgKICAgICAgICAgICAgY29sdW1uLAogICAgICAgICAgICBkZWZpbml0aW9uLAogICAgICAgICkgaW4gYWRkaXRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGNvbHVtbiBub3QgaW4gY29sdW1uczoKICAgICAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICJBTFRFUiBUQUJMRSBvcmRlcnMgIgogICAgICAgICAgICAgICAgICAgICAgICBmIkFERCBDT0xVTU4ge2NvbHVtbn0ge2RlZmluaXRpb259IgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NyZWF0ZV9pbmRleGVzKAogICAgICAgIGNvbm46IHNxbGl0ZTMuQ29ubmVjdGlvbiwKICAgICkgLT4gTm9uZToKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUwogICAgICAgICAgICBpZHhfb3JkZXJzX3VzZXJfaWQKICAgICAgICAgICAgT04gb3JkZXJzKHVzZXJfaWQpCiAgICAgICAgICAgICIiIgogICAgICAgICkKCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAiIiIKICAgICAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMKICAgICAgICAgICAgaWR4X29yZGVyc19zdGF0dXMKICAgICAgICAgICAgT04gb3JkZXJzKHN0YXR1cykKICAgICAgICAgICAgIiIiCiAgICAgICAgKQoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIgogICAgICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUwogICAgICAgICAgICBpZHhfb3JkZXJzX3VzZXJfc3RhdHVzCiAgICAgICAgICAgIE9OIG9yZGVycyh1c2VyX2lkLCBzdGF0dXMpCiAgICAgICAgICAgICIiIgogICAgICAgICkKCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAiIiIKICAgICAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMKICAgICAgICAgICAgaWR4X29yZGVyc19tYXJrZXRfb3JkZXJfaWQKICAgICAgICAgICAgT04gb3JkZXJzKG1hcmtldF9vcmRlcl9pZCkKICAgICAgICAgICAgIiIiCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgUm93IENvbnZlcnNpb24KICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3Jvd190b19vcmRlcigKICAgICAgICByb3c6IHNxbGl0ZTMuUm93LAogICAgKSAtPiBPcmRlcjoKICAgICAgICBrZXlzID0gc2V0KAogICAgICAgICAgICByb3cua2V5cygpCiAgICAgICAgKQoKICAgICAgICBkZWYgb3B0aW9uYWxfaW50KAogICAgICAgICAgICBrZXk6IHN0ciwKICAgICAgICApIC0+IE9wdGlvbmFsW2ludF06CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGtleSBub3QgaW4ga2V5cwogICAgICAgICAgICAgICAgb3Igcm93W2tleV0gaXMgTm9uZQogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIHJldHVybiBpbnQoCiAgICAgICAgICAgICAgICByb3dba2V5XQogICAgICAgICAgICApCgogICAgICAgIGRlZiBvcHRpb25hbF9zdHIoCiAgICAgICAgICAgIGtleTogc3RyLAogICAgICAgICkgLT4gT3B0aW9uYWxbc3RyXToKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAga2V5IG5vdCBpbiBrZXlzCiAgICAgICAgICAgICAgICBvciByb3dba2V5XSBpcyBOb25lCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgcmV0dXJuIHN0cigKICAgICAgICAgICAgICAgIHJvd1trZXldCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIE9yZGVyKAogICAgICAgICAgICBpZD1pbnQoCiAgICAgICAgICAgICAgICByb3dbImlkIl0KICAgICAgICAgICAgKSwKICAgICAgICAgICAgdXNlcl9pZD1pbnQoCiAgICAgICAgICAgICAgICByb3dbInVzZXJfaWQiXQogICAgICAgICAgICApLAogICAgICAgICAgICBwcm9kdWN0X2lkPXN0cigKICAgICAgICAgICAgICAgIHJvd1sicHJvZHVjdF9pZCJdCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHRhcmdldD0oCiAgICAgICAgICAgICAgICBvcHRpb25hbF9zdHIoCiAgICAgICAgICAgICAgICAgICAgInRhcmdldCIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcHJpY2U9aW50KAogICAgICAgICAgICAgICAgcm93WyJwcmljZSJdCiAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHN0YXR1cz1zdHIoCiAgICAgICAgICAgICAgICByb3dbInN0YXR1cyJdCiAgICAgICAgICAgICAgICBvciAiIgogICAgICAgICAgICApLAogICAgICAgICAgICBnYXRld2F5PXN0cigKICAgICAgICAgICAgICAgIHJvd1siZ2F0ZXdheSJdCiAgICAgICAgICAgICAgICBvciAid2FsbGV0IgogICAgICAgICAgICApLAogICAgICAgICAgICBtYXJrZXRfb3JkZXJfaWQ9KAogICAgICAgICAgICAgICAgb3B0aW9uYWxfc3RyKAogICAgICAgICAgICAgICAgICAgICJtYXJrZXRfb3JkZXJfaWQiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGNyZWF0ZWRfYXQ9c3RyKAogICAgICAgICAgICAgICAgcm93WyJjcmVhdGVkX2F0Il0KICAgICAgICAgICAgICAgIG9yICIiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHVwZGF0ZWRfYXQ9c3RyKAogICAgICAgICAgICAgICAgcm93WyJ1cGRhdGVkX2F0Il0KICAgICAgICAgICAgICAgIG9yICIiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIG93bmVyX2lkPSgKICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ludCgKICAgICAgICAgICAgICAgICAgICAib3duZXJfaWQiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHByb3ZpZGVyX3JlcXVpcmVkX3ByaWNlPSgKICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ludCgKICAgICAgICAgICAgICAgICAgICAicHJvdmlkZXJfcmVxdWlyZWRfcHJpY2UiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHByb3ZpZGVyX2Vycm9yPSgKICAgICAgICAgICAgICAgIG9wdGlvbmFsX3N0cigKICAgICAgICAgICAgICAgICAgICAicHJvdmlkZXJfZXJyb3IiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHByb3ZpZGVyX3N0YXJ0ZWRfYXQ9KAogICAgICAgICAgICAgICAgb3B0aW9uYWxfc3RyKAogICAgICAgICAgICAgICAgICAgICJwcm92aWRlcl9zdGFydGVkX2F0IgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApLAogICAgICAgICAgICBjb21wbGV0ZWRfYXQ9KAogICAgICAgICAgICAgICAgb3B0aW9uYWxfc3RyKAogICAgICAgICAgICAgICAgICAgICJjb21wbGV0ZWRfYXQiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHJlZnVuZGVkX2F0PSgKICAgICAgICAgICAgICAgIG9wdGlvbmFsX3N0cigKICAgICAgICAgICAgICAgICAgICAicmVmdW5kZWRfYXQiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgUmVhZAogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGRlZiBnZXRfb3JkZXIoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgICAgICosCiAgICAgICAgdXNlcl9pZDogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICApIC0+IE9yZGVyOgogICAgICAgIGF3YWl0IHNlbGYuZW5zdXJlX3NjaGVtYSgpCgogICAgICAgIHJldHVybiBhd2FpdCBzZWxmLl9ydW4oCiAgICAgICAgICAgIHNlbGYuX2dldF9vcmRlcl9zeW5jLAogICAgICAgICAgICBpbnQob3JkZXJfaWQpLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBpbnQodXNlcl9pZCkKICAgICAgICAgICAgICAgIGlmIHVzZXJfaWQKICAgICAgICAgICAgICAgIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICBlbHNlIE5vbmUKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgZGVmIF9nZXRfb3JkZXJfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgdXNlcl9pZDogT3B0aW9uYWxbaW50XSwKICAgICkgLT4gT3JkZXI6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHF1ZXJ5ID0gKAogICAgICAgICAgICAgICAgIlNFTEVDVCAqICIKICAgICAgICAgICAgICAgICJGUk9NIG9yZGVycyAiCiAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSA/IgogICAgICAgICAgICApCgogICAgICAgICAgICBwYXJhbXM6IGxpc3RbQW55XSA9IFsKICAgICAgICAgICAgICAgIG9yZGVyX2lkCiAgICAgICAgICAgIF0KCiAgICAgICAgICAgIGlmIHVzZXJfaWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBxdWVyeSArPSAoCiAgICAgICAgICAgICAgICAgICAgIiBBTkQgdXNlcl9pZCA9ID8iCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBxdWVyeSArPSAiIExJTUlUIDEiCgogICAgICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICBxdWVyeSwKICAgICAgICAgICAgICAgIHR1cGxlKHBhcmFtcyksCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICAgICAgaWYgbm90IHJvdzoKICAgICAgICAgICAgICAgIHJhaXNlIE9yZGVyTm90Rm91bmRFcnJvcigKICAgICAgICAgICAgICAgICAgICBmIk9yZGVyIHtvcmRlcl9pZH0gbm90IGZvdW5kLiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yb3dfdG9fb3JkZXIoCiAgICAgICAgICAgICAgICByb3cKICAgICAgICAgICAgKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBhc3luYyBkZWYgbGlzdF9vcmRlcnMoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgKiwKICAgICAgICBzdGF0dXM6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgICAgIGxpbWl0OiBpbnQgPSA1MCwKICAgICAgICBvZmZzZXQ6IGludCA9IDAsCiAgICApIC0+IGxpc3RbT3JkZXJdOgogICAgICAgIGF3YWl0IHNlbGYuZW5zdXJlX3NjaGVtYSgpCgogICAgICAgIHJldHVybiBhd2FpdCBzZWxmLl9ydW4oCiAgICAgICAgICAgIHNlbGYuX2xpc3Rfb3JkZXJzX3N5bmMsCiAgICAgICAgICAgIGludCh1c2VyX2lkKSwKICAgICAgICAgICAgc3RhdHVzLAogICAgICAgICAgICBpbnQobGltaXQpLAogICAgICAgICAgICBpbnQob2Zmc2V0KSwKICAgICAgICApCgogICAgZGVmIF9saXN0X29yZGVyc19zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgICAgIHN0YXR1czogT3B0aW9uYWxbc3RyXSwKICAgICAgICBsaW1pdDogaW50LAogICAgICAgIG9mZnNldDogaW50LAogICAgKSAtPiBsaXN0W09yZGVyXToKICAgICAgICBsaW1pdCA9IG1heCgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgbWluKAogICAgICAgICAgICAgICAgbGltaXQsCiAgICAgICAgICAgICAgICAxMDAsCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICBvZmZzZXQgPSBtYXgoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIG9mZnNldCwKICAgICAgICApCgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBxdWVyeSA9ICgKICAgICAgICAgICAgICAgICJTRUxFQ1QgKiAiCiAgICAgICAgICAgICAgICAiRlJPTSBvcmRlcnMgIgogICAgICAgICAgICAgICAgIldIRVJFIHVzZXJfaWQgPSA/IgogICAgICAgICAgICApCgogICAgICAgICAgICBwYXJhbXM6IGxpc3RbQW55XSA9IFsKICAgICAgICAgICAgICAgIHVzZXJfaWQKICAgICAgICAgICAgXQoKICAgICAgICAgICAgaWYgc3RhdHVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcXVlcnkgKz0gKAogICAgICAgICAgICAgICAgICAgICIgQU5EIHN0YXR1cyA9ID8iCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICBzdHIoc3RhdHVzKQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgcXVlcnkgKz0gKAogICAgICAgICAgICAgICAgIiBPUkRFUiBCWSBpZCBERVNDICIKICAgICAgICAgICAgICAgICJMSU1JVCA/IE9GRlNFVCA/IgogICAgICAgICAgICApCgogICAgICAgICAgICBwYXJhbXMuZXh0ZW5kKAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIGxpbWl0LAogICAgICAgICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgKQoKICAgICAgICAgICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgIHF1ZXJ5LAogICAgICAgICAgICAgICAgdHVwbGUocGFyYW1zKSwKICAgICAgICAgICAgKS5mZXRjaGFsbCgpCgogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgc2VsZi5fcm93X3RvX29yZGVyKAogICAgICAgICAgICAgICAgICAgIHJvdwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIHJvdwogICAgICAgICAgICAgICAgaW4gcm93cwogICAgICAgICAgICBdCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGFzeW5jIGRlZiBsaXN0X2J5X3N0YXR1cygKICAgICAgICBzZWxmLAogICAgICAgIHN0YXR1czogc3RyLAogICAgICAgICosCiAgICAgICAgbGltaXQ6IGludCA9IDEwMCwKICAgICkgLT4gbGlzdFtPcmRlcl06CiAgICAgICAgYXdhaXQgc2VsZi5lbnN1cmVfc2NoZW1hKCkKCiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuX3J1bigKICAgICAgICAgICAgc2VsZi5fbGlzdF9ieV9zdGF0dXNfc3luYywKICAgICAgICAgICAgc3RyKHN0YXR1cyksCiAgICAgICAgICAgIGludChsaW1pdCksCiAgICAgICAgKQoKICAgIGRlZiBfbGlzdF9ieV9zdGF0dXNfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIHN0YXR1czogc3RyLAogICAgICAgIGxpbWl0OiBpbnQsCiAgICApIC0+IGxpc3RbT3JkZXJdOgogICAgICAgIGxpbWl0ID0gbWF4KAogICAgICAgICAgICAxLAogICAgICAgICAgICBtaW4oCiAgICAgICAgICAgICAgICBsaW1pdCwKICAgICAgICAgICAgICAgIDUwMCwKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QgKgogICAgICAgICAgICAgICAgRlJPTSBvcmRlcnMKICAgICAgICAgICAgICAgIFdIRVJFIHN0YXR1cyA9ID8KICAgICAgICAgICAgICAgIE9SREVSIEJZIGlkIEFTQwogICAgICAgICAgICAgICAgTElNSVQgPwogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICBsaW1pdCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkuZmV0Y2hhbGwoKQoKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgIHNlbGYuX3Jvd190b19vcmRlcigKICAgICAgICAgICAgICAgICAgICByb3cKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciByb3cKICAgICAgICAgICAgICAgIGluIHJvd3MKICAgICAgICAgICAgXQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIENyZWF0ZQogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGRlZiBjcmVhdGVfb3JkZXIoCiAgICAgICAgc2VsZiwKICAgICAgICAqLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICBwcm9kdWN0X2lkOiBzdHIsCiAgICAgICAgdGFyZ2V0OiBPcHRpb25hbFtzdHJdLAogICAgICAgIHByaWNlOiBpbnQsCiAgICAgICAgc3RhdHVzOiBzdHIgPSBTVEFUVVNfUEVORElOR19PV05FUiwKICAgICAgICBnYXRld2F5OiBzdHIgPSAid2FsbGV0IiwKICAgICkgLT4gT3JkZXI6CiAgICAgICAgYXdhaXQgc2VsZi5lbnN1cmVfc2NoZW1hKCkKCiAgICAgICAgaWYgaW50KHVzZXJfaWQpIDw9IDA6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRPcmRlckVycm9yKAogICAgICAgICAgICAgICAgInVzZXJfaWQgbXVzdCBiZSBwb3NpdGl2ZS4iCiAgICAgICAgICAgICkKCiAgICAgICAgcHJvZHVjdF9pZCA9IHN0cigKICAgICAgICAgICAgcHJvZHVjdF9pZAogICAgICAgICAgICBvciAiIgogICAgICAgICkuc3RyaXAoKQoKICAgICAgICBpZiBub3QgcHJvZHVjdF9pZDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZE9yZGVyRXJyb3IoCiAgICAgICAgICAgICAgICAicHJvZHVjdF9pZCBpcyByZXF1aXJlZC4iCiAgICAgICAgICAgICkKCiAgICAgICAgcHJpY2UgPSBpbnQoCiAgICAgICAgICAgIHByaWNlCiAgICAgICAgKQoKICAgICAgICBpZiBwcmljZSA8IDA6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRPcmRlckVycm9yKAogICAgICAgICAgICAgICAgInByaWNlIGNhbm5vdCBiZSBuZWdhdGl2ZS4iCiAgICAgICAgICAgICkKCiAgICAgICAgc3RhdHVzID0gc3RyKAogICAgICAgICAgICBzdGF0dXMKICAgICAgICApLnN0cmlwKCkKCiAgICAgICAgaWYgc3RhdHVzIG5vdCBpbiBWQUxJRF9TVEFUVVNFUzoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZE9yZGVyU3RhdHVzRXJyb3IoCiAgICAgICAgICAgICAgICBmIlVuc3VwcG9ydGVkIHN0YXR1czoge3N0YXR1c30iCiAgICAgICAgICAgICkKCiAgICAgICAgZ2F0ZXdheSA9IHN0cigKICAgICAgICAgICAgZ2F0ZXdheQogICAgICAgICAgICBvciAid2FsbGV0IgogICAgICAgICkuc3RyaXAoKQoKICAgICAgICBpZiBub3QgZ2F0ZXdheToKICAgICAgICAgICAgZ2F0ZXdheSA9ICJ3YWxsZXQiCgogICAgICAgIHRhcmdldF92YWx1ZSA9ICgKICAgICAgICAgICAgc3RyKHRhcmdldCkuc3RyaXAoKQogICAgICAgICAgICBpZiB0YXJnZXQgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5fcnVuKAogICAgICAgICAgICBzZWxmLl9jcmVhdGVfb3JkZXJfc3luYywKICAgICAgICAgICAgaW50KHVzZXJfaWQpLAogICAgICAgICAgICBwcm9kdWN0X2lkLAogICAgICAgICAgICB0YXJnZXRfdmFsdWUsCiAgICAgICAgICAgIHByaWNlLAogICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgIGdhdGV3YXksCiAgICAgICAgKQoKICAgIGRlZiBfY3JlYXRlX29yZGVyX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICAgICAgcHJvZHVjdF9pZDogc3RyLAogICAgICAgIHRhcmdldDogT3B0aW9uYWxbc3RyXSwKICAgICAgICBwcmljZTogaW50LAogICAgICAgIHN0YXR1czogc3RyLAogICAgICAgIGdhdGV3YXk6IHN0ciwKICAgICkgLT4gT3JkZXI6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1cnNvciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gb3JkZXJzICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfaWQsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICAgICAgICAgIHByaWNlLAogICAgICAgICAgICAgICAgICAgIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICBnYXRld2F5CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8sID8pCiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X2lkLAogICAgICAgICAgICAgICAgICAgIHRhcmdldCwKICAgICAgICAgICAgICAgICAgICBwcmljZSwKICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgZ2F0ZXdheSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIG9yZGVyX2lkID0gaW50KAogICAgICAgICAgICAgICAgY3Vyc29yLmxhc3Ryb3dpZAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X29yZGVyX3N5bmMoCiAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICBOb25lLAogICAgICAgICkKCiAgICBhc3luYyBkZWYgY3JlYXRlX3BlbmRpbmdfb3duZXJfb3JkZXIoCiAgICAgICAgc2VsZiwKICAgICAgICAqLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICAgICBwcm9kdWN0X2lkOiBzdHIsCiAgICAgICAgdGFyZ2V0OiBzdHIsCiAgICAgICAgcHJpY2U6IGludCwKICAgICkgLT4gT3JkZXI6CiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuY3JlYXRlX29yZGVyKAogICAgICAgICAgICB1c2VyX2lkPXVzZXJfaWQsCiAgICAgICAgICAgIHByb2R1Y3RfaWQ9cHJvZHVjdF9pZCwKICAgICAgICAgICAgdGFyZ2V0PXRhcmdldCwKICAgICAgICAgICAgcHJpY2U9cHJpY2UsCiAgICAgICAgICAgIHN0YXR1cz0oCiAgICAgICAgICAgICAgICBTVEFUVVNfUEVORElOR19PV05FUgogICAgICAgICAgICApLAogICAgICAgICAgICBnYXRld2F5PSJ3YWxsZXQiLAogICAgICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIE93bmVyIEFwcHJvdmFsCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYXN5bmMgZGVmIGNsYWltX2Zvcl9vd25lcigKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgb3duZXJfaWQ6IGludCwKICAgICkgLT4gT3B0aW9uYWxbT3JkZXJdOgogICAgICAgICIiIgogICAgICAgIEF0b21pYyBjbGFpbS4KCiAgICAgICAgUmV0dXJucyBOb25lIGlmIGFub3RoZXIgb3duZXIgYWxyZWFkeSBoYW5kbGVkIHRoZSBvcmRlci4KICAgICAgICAiIiIKICAgICAgICBhd2FpdCBzZWxmLmVuc3VyZV9zY2hlbWEoKQoKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5fcnVuKAogICAgICAgICAgICBzZWxmLl9jbGFpbV9mb3Jfb3duZXJfc3luYywKICAgICAgICAgICAgaW50KG9yZGVyX2lkKSwKICAgICAgICAgICAgaW50KG93bmVyX2lkKSwKICAgICAgICApCgogICAgZGVmIF9jbGFpbV9mb3Jfb3duZXJfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgb3duZXJfaWQ6IGludCwKICAgICkgLT4gT3B0aW9uYWxbT3JkZXJdOgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiQkVHSU4gSU1NRURJQVRFIgogICAgICAgICAgICApCgogICAgICAgICAgICBjdXJzb3IgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFVQREFURSBvcmRlcnMKICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ID8sCiAgICAgICAgICAgICAgICAgICAgb3duZXJfaWQgPSA/LAogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyX2Vycm9yID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkX2F0ID0gQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgICAgICAgICAgICBBTkQgc3RhdHVzID0gPwogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIFNUQVRVU19PV05FUl9QUk9DRVNTSU5HLAogICAgICAgICAgICAgICAgICAgIG93bmVyX2lkLAogICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICAgICAgICAgIFNUQVRVU19QRU5ESU5HX09XTkVSLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgY3Vyc29yLnJvd2NvdW50ICE9IDE6CiAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFNFTEVDVCAqCiAgICAgICAgICAgICAgICBGUk9NIG9yZGVycwogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICAgICBMSU1JVCAxCiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBzZWxmLl9yb3dfdG9fb3JkZXIoCiAgICAgICAgICAgICAgICAgICAgcm93CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiByb3cKICAgICAgICAgICAgICAgIGVsc2UgTm9uZQogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQogICAgICAgICAgICByYWlzZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBhc3luYyBkZWYgcmVqZWN0X2J5X293bmVyKAogICAgICAgIHNlbGYsCiAgICAgICAgb3JkZXJfaWQ6IGludCwKICAgICAgICBvd25lcl9pZDogaW50LAogICAgKSAtPiBib29sOgogICAgICAgIGF3YWl0IHNlbGYuZW5zdXJlX3NjaGVtYSgpCgogICAgICAgIHJldHVybiBhd2FpdCBzZWxmLl9ydW4oCiAgICAgICAgICAgIHNlbGYuX3JlamVjdF9ieV9vd25lcl9zeW5jLAogICAgICAgICAgICBpbnQob3JkZXJfaWQpLAogICAgICAgICAgICBpbnQob3duZXJfaWQpLAogICAgICAgICkKCiAgICBkZWYgX3JlamVjdF9ieV9vd25lcl9zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgb3JkZXJfaWQ6IGludCwKICAgICAgICBvd25lcl9pZDogaW50LAogICAgKSAtPiBib29sOgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXJzb3IgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFVQREFURSBvcmRlcnMKICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ID8sCiAgICAgICAgICAgICAgICAgICAgb3duZXJfaWQgPSA/LAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPSBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICAgICAgIEFORCBzdGF0dXMgPSA/CiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgU1RBVFVTX1JFSkVDVEVEX0JZX09XTkVSLAogICAgICAgICAgICAgICAgICAgIG93bmVyX2lkLAogICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICAgICAgICAgIFNUQVRVU19QRU5ESU5HX09XTkVSLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5jb21taXQoKQoKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIGN1cnNvci5yb3djb3VudCA9PSAxCiAgICAgICAgICAgICkKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgYXN5bmMgZGVmIHJlc3RvcmVfb3duZXJfcGVuZGluZygKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgKiwKICAgICAgICBlcnJvcjogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICApIC0+IGJvb2w6CiAgICAgICAgYXdhaXQgc2VsZi5lbnN1cmVfc2NoZW1hKCkKCiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuX3J1bigKICAgICAgICAgICAgc2VsZi5fcmVzdG9yZV9vd25lcl9wZW5kaW5nX3N5bmMsCiAgICAgICAgICAgIGludChvcmRlcl9pZCksCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIHN0cihlcnJvcilbOjEwMDBdCiAgICAgICAgICAgICAgICBpZiBlcnJvcgogICAgICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGRlZiBfcmVzdG9yZV9vd25lcl9wZW5kaW5nX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgICAgIGVycm9yOiBPcHRpb25hbFtzdHJdLAogICAgKSAtPiBib29sOgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXJzb3IgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFVQREFURSBvcmRlcnMKICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ID8sCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJfZXJyb3IgPSA/LAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPSBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICAgICAgIEFORCBzdGF0dXMgPSA/CiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgU1RBVFVTX1BFTkRJTkdfT1dORVIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgU1RBVFVTX09XTkVSX1BST0NFU1NJTkcsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgY3Vyc29yLnJvd2NvdW50ID09IDEKICAgICAgICAgICAgKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBhc3luYyBkZWYgbWFya19wcmljZV9jaGFuZ2VkKAogICAgICAgIHNlbGYsCiAgICAgICAgb3JkZXJfaWQ6IGludCwKICAgICAgICAqLAogICAgICAgIHJlcXVpcmVkX3ByaWNlOiBpbnQsCiAgICApIC0+IGJvb2w6CiAgICAgICAgYXdhaXQgc2VsZi5lbnN1cmVfc2NoZW1hKCkKCiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuX3J1bigKICAgICAgICAgICAgc2VsZi5fbWFya19wcmljZV9jaGFuZ2VkX3N5bmMsCiAgICAgICAgICAgIGludChvcmRlcl9pZCksCiAgICAgICAgICAgIGludChyZXF1aXJlZF9wcmljZSksCiAgICAgICAgKQoKICAgIGRlZiBfbWFya19wcmljZV9jaGFuZ2VkX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgICAgIHJlcXVpcmVkX3ByaWNlOiBpbnQsCiAgICApIC0+IGJvb2w6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1cnNvciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgVVBEQVRFIG9yZGVycwogICAgICAgICAgICAgICAgU0VUCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPywKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcl9yZXF1aXJlZF9wcmljZSA9ID8sCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgICAgQU5EIHN0YXR1cyA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfUFJJQ0VfQ0hBTkdFRCwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9wcmljZSwKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfT1dORVJfUFJPQ0VTU0lORywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBjdXJzb3Iucm93Y291bnQgPT0gMQogICAgICAgICAgICApCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGFzeW5jIGRlZiBhY2NlcHRfcHJpY2VfY2hhbmdlKAogICAgICAgIHNlbGYsCiAgICAgICAgb3JkZXJfaWQ6IGludCwKICAgICAgICAqLAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICkgLT4gYm9vbDoKICAgICAgICAiIiIKICAgICAgICBVc2VyIGFjY2VwdHMgcHJvdmlkZXJfcmVxdWlyZWRfcHJpY2UgYWZ0ZXIgYSBwcmljZSBpbmNyZWFzZS4KCiAgICAgICAgQXRvbWljOgogICAgICAgICAgICBwcmljZV9jaGFuZ2VkCiAgICAgICAgICAgIC0+IHByaWNlID0gcHJvdmlkZXJfcmVxdWlyZWRfcHJpY2UKICAgICAgICAgICAgLT4gcGVuZGluZ19vd25lcl9hcHByb3ZhbAoKICAgICAgICBObyB3YWxsZXQgZGViaXQgb2NjdXJzIGhlcmUuCiAgICAgICAgIiIiCiAgICAgICAgYXdhaXQgc2VsZi5lbnN1cmVfc2NoZW1hKCkKCiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuX3J1bigKICAgICAgICAgICAgc2VsZi5fYWNjZXB0X3ByaWNlX2NoYW5nZV9zeW5jLAogICAgICAgICAgICBpbnQob3JkZXJfaWQpLAogICAgICAgICAgICBpbnQodXNlcl9pZCksCiAgICAgICAgKQoKICAgIGRlZiBfYWNjZXB0X3ByaWNlX2NoYW5nZV9zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgb3JkZXJfaWQ6IGludCwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICApIC0+IGJvb2w6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJCRUdJTiBJTU1FRElBVEUiCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJfcmVxdWlyZWRfcHJpY2UKICAgICAgICAgICAgICAgIEZST00gb3JkZXJzCiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICAgICAgaWYgbm90IHJvdzoKICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBzdHIoCiAgICAgICAgICAgICAgICAgICAgcm93WyJzdGF0dXMiXQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIT0gU1RBVFVTX1BSSUNFX0NIQU5HRUQKICAgICAgICAgICAgICAgIG9yIGludCgKICAgICAgICAgICAgICAgICAgICByb3dbInVzZXJfaWQiXQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIT0gdXNlcl9pZAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIHJlcXVpcmVkX3ByaWNlID0gaW50KAogICAgICAgICAgICAgICAgcm93WwogICAgICAgICAgICAgICAgICAgICJwcm92aWRlcl9yZXF1aXJlZF9wcmljZSIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIG9yIDAKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgcmVxdWlyZWRfcHJpY2UgPD0gMDoKICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBjdXJzb3IgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgIFVQREFURSBvcmRlcnMKICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgIHByaWNlID0gPywKICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA/LAogICAgICAgICAgICAgICAgICAgIG93bmVyX2lkID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcl9lcnJvciA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgICAgQU5EIHN0YXR1cyA9ID8KICAgICAgICAgICAgICAgICAgQU5EIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfcHJpY2UsCiAgICAgICAgICAgICAgICAgICAgU1RBVFVTX1BFTkRJTkdfT1dORVIsCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgU1RBVFVTX1BSSUNFX0NIQU5HRUQsCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBjdXJzb3Iucm93Y291bnQgPT0gMQogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQogICAgICAgICAgICByYWlzZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBhc3luYyBkZWYgY2FuY2VsX3ByaWNlX2NoYW5nZSgKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgKiwKICAgICAgICB1c2VyX2lkOiBpbnQsCiAgICApIC0+IGJvb2w6CiAgICAgICAgIiIiCiAgICAgICAgVXNlciByZWplY3RzIHRoZSBpbmNyZWFzZWQgcHJpY2UuCgogICAgICAgIE5vIHdhbGxldCBkZWJpdCBjYW4gaGF2ZSBoYXBwZW5lZCB3aGlsZSBzdGF0dXM9cHJpY2VfY2hhbmdlZC4KICAgICAgICAiIiIKICAgICAgICBhd2FpdCBzZWxmLmVuc3VyZV9zY2hlbWEoKQoKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5fcnVuKAogICAgICAgICAgICBzZWxmLl9jYW5jZWxfcHJpY2VfY2hhbmdlX3N5bmMsCiAgICAgICAgICAgIGludChvcmRlcl9pZCksCiAgICAgICAgICAgIGludCh1c2VyX2lkKSwKICAgICAgICApCgogICAgZGVmIF9jYW5jZWxfcHJpY2VfY2hhbmdlX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgICAgIHVzZXJfaWQ6IGludCwKICAgICkgLT4gYm9vbDoKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgY3Vyc29yID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBVUERBVEUgb3JkZXJzCiAgICAgICAgICAgICAgICBTRVQKICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA/LAogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyX2Vycm9yID0gPywKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkX2F0ID0gQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgICAgICAgICAgICBBTkQgc3RhdHVzID0gPwogICAgICAgICAgICAgICAgICBBTkQgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfQ0FOQ0VMTEVEX0JZX1VTRVIsCiAgICAgICAgICAgICAgICAgICAgIlVzZXIgcmVqZWN0ZWQgdXBkYXRlZCBwcmljZS4iLAogICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICAgICAgICAgIFNUQVRVU19QUklDRV9DSEFOR0VELAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgY3Vyc29yLnJvd2NvdW50ID09IDEKICAgICAgICAgICAgKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEZpbmFsIE1hcmtldEFwcCBQcmljZQogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGRlZiBzZXRfb3duZXJfZmluYWxfcHJpY2UoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgICAgICosCiAgICAgICAgZmluYWxfcHJpY2U6IGludCwKICAgICkgLT4gYm9vbDoKICAgICAgICAiIiIKICAgICAgICBQZXJzaXN0IHRoZSBleGFjdCBjb252ZXJ0ZWQgTWFya2V0QXBwIHByaWNlIGFmdGVyIG93bmVyIGFwcHJvdmFsLgoKICAgICAgICBUaGlzIGlzIGFsbG93ZWQgb25seSB3aGlsZSB0aGUgb3JkZXIgaXMgb3duZXJfcHJvY2Vzc2luZyBhbmQgYmVmb3JlCiAgICAgICAgYW55IHdhbGxldCBkZWJpdC9wcm92aWRlciBidXkgc3RhcnRzLgogICAgICAgICIiIgogICAgICAgIGF3YWl0IHNlbGYuZW5zdXJlX3NjaGVtYSgpCgogICAgICAgIGZpbmFsX3ByaWNlID0gaW50KGZpbmFsX3ByaWNlKQoKICAgICAgICBpZiBmaW5hbF9wcmljZSA8PSAwOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkT3JkZXJFcnJvcigKICAgICAgICAgICAgICAgICJmaW5hbF9wcmljZSBtdXN0IGJlIHBvc2l0aXZlLiIKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5fcnVuKAogICAgICAgICAgICBzZWxmLl9zZXRfb3duZXJfZmluYWxfcHJpY2Vfc3luYywKICAgICAgICAgICAgaW50KG9yZGVyX2lkKSwKICAgICAgICAgICAgZmluYWxfcHJpY2UsCiAgICAgICAgKQoKICAgIGRlZiBfc2V0X293bmVyX2ZpbmFsX3ByaWNlX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgICAgIGZpbmFsX3ByaWNlOiBpbnQsCiAgICApIC0+IGJvb2w6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1cnNvciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgVVBEQVRFIG9yZGVycwogICAgICAgICAgICAgICAgU0VUCiAgICAgICAgICAgICAgICAgICAgcHJpY2UgPSA/LAogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyX3JlcXVpcmVkX3ByaWNlID0gPywKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcl9lcnJvciA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgICAgQU5EIHN0YXR1cyA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBmaW5hbF9wcmljZSwKICAgICAgICAgICAgICAgICAgICBmaW5hbF9wcmljZSwKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfT1dORVJfUFJPQ0VTU0lORywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiBjdXJzb3Iucm93Y291bnQgPT0gMQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBXYWxsZXQgUmVzZXJ2ZQogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGRlZiByZXNlcnZlX3dhbGxldF9mb3JfcHJvdmlkZXIoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgKSAtPiBXYWxsZXRSZXNlcnZhdGlvblJlc3VsdDoKICAgICAgICAiIiIKICAgICAgICBBdG9taWM6CiAgICAgICAgICAgIG93bmVyX3Byb2Nlc3NpbmcKICAgICAgICAgICAgKyBiYWxhbmNlIGNoZWNrCiAgICAgICAgICAgICsgYmFsYW5jZSBkZWJpdAogICAgICAgICAgICAtPiBwcm92aWRlcl9wcm9jZXNzaW5nCiAgICAgICAgIiIiCiAgICAgICAgYXdhaXQgc2VsZi5lbnN1cmVfc2NoZW1hKCkKCiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuX3J1bigKICAgICAgICAgICAgc2VsZi5fcmVzZXJ2ZV93YWxsZXRfc3luYywKICAgICAgICAgICAgaW50KG9yZGVyX2lkKSwKICAgICAgICApCgogICAgZGVmIF9yZXNlcnZlX3dhbGxldF9zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgb3JkZXJfaWQ6IGludCwKICAgICkgLT4gV2FsbGV0UmVzZXJ2YXRpb25SZXN1bHQ6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJCRUdJTiBJTU1FRElBVEUiCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIG9yZGVyID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QgKgogICAgICAgICAgICAgICAgRlJPTSBvcmRlcnMKICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgICAgICBpZiBub3Qgb3JkZXI6CiAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKCiAgICAgICAgICAgICAgICByZXR1cm4gV2FsbGV0UmVzZXJ2YXRpb25SZXN1bHQoCiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzcz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICByZWFzb249Im9yZGVyX25vdF9mb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQ9b3JkZXJfaWQsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBpZiBzdHIoCiAgICAgICAgICAgICAgICBvcmRlclsic3RhdHVzIl0KICAgICAgICAgICAgKSAhPSBTVEFUVVNfT1dORVJfUFJPQ0VTU0lORzoKICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgICAgIHJldHVybiBXYWxsZXRSZXNlcnZhdGlvblJlc3VsdCgKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzPUZhbHNlLAogICAgICAgICAgICAgICAgICAgIHJlYXNvbj0iaW52YWxpZF9vcmRlcl9zdGF0dXMiLAogICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkPW9yZGVyX2lkLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgd2FsbGV0X2NvbHVtbiA9ICgKICAgICAgICAgICAgICAgIHNlbGYuX3dhbGxldF9jb2x1bW4oCiAgICAgICAgICAgICAgICAgICAgY29ubgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgICAgICBpZiBub3Qgd2FsbGV0X2NvbHVtbjoKICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgICAgIHJldHVybiBXYWxsZXRSZXNlcnZhdGlvblJlc3VsdCgKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzPUZhbHNlLAogICAgICAgICAgICAgICAgICAgIHJlYXNvbj0id2FsbGV0X2NvbHVtbl9taXNzaW5nIiwKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZD1vcmRlcl9pZCwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIHVzZXJfaWQgPSBpbnQoCiAgICAgICAgICAgICAgICBvcmRlclsidXNlcl9pZCJdCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGFtb3VudCA9IGludCgKICAgICAgICAgICAgICAgIG9yZGVyWyJwcmljZSJdCiAgICAgICAgICAgICAgICBvciAwCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHVzZXIgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICBmIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QKICAgICAgICAgICAgICAgICAgICB7d2FsbGV0X2NvbHVtbn0KICAgICAgICAgICAgICAgICAgICBBUyBiYWxhbmNlCiAgICAgICAgICAgICAgICBGUk9NIHVzZXJzCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgIGlmIG5vdCB1c2VyOgogICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpCgogICAgICAgICAgICAgICAgcmV0dXJuIFdhbGxldFJlc2VydmF0aW9uUmVzdWx0KAogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgcmVhc29uPSJ1c2VyX25vdF9mb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQ9b3JkZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgdXNlcl9pZD11c2VyX2lkLAogICAgICAgICAgICAgICAgICAgIGFtb3VudD1hbW91bnQsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBiZWZvcmUgPSBpbnQoCiAgICAgICAgICAgICAgICB1c2VyWyJiYWxhbmNlIl0KICAgICAgICAgICAgICAgIG9yIDAKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgYmVmb3JlIDwgYW1vdW50OgogICAgICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgICAgIFVQREFURSBvcmRlcnMKICAgICAgICAgICAgICAgICAgICBTRVQKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPywKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICAgICAgICAgICBBTkQgc3RhdHVzID0gPwogICAgICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRVU19JTlNVRkZJQ0lFTlRfQkFMQU5DRSwKICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRVU19PV05FUl9QUk9DRVNTSU5HLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgY29ubi5jb21taXQoKQoKICAgICAgICAgICAgICAgIHJldHVybiBXYWxsZXRSZXNlcnZhdGlvblJlc3VsdCgKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzPUZhbHNlLAogICAgICAgICAgICAgICAgICAgIHJlYXNvbj0iaW5zdWZmaWNpZW50X2JhbGFuY2UiLAogICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkPW9yZGVyX2lkLAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQ9dXNlcl9pZCwKICAgICAgICAgICAgICAgICAgICBhbW91bnQ9YW1vdW50LAogICAgICAgICAgICAgICAgICAgIGJhbGFuY2VfYmVmb3JlPWJlZm9yZSwKICAgICAgICAgICAgICAgICAgICBiYWxhbmNlX2FmdGVyPWJlZm9yZSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGFmdGVyID0gKAogICAgICAgICAgICAgICAgYmVmb3JlCiAgICAgICAgICAgICAgICAtIGFtb3VudAogICAgICAgICAgICApCgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICBmIiIiCiAgICAgICAgICAgICAgICBVUERBVEUgdXNlcnMKICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgIHt3YWxsZXRfY29sdW1ufSA9ID8sCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIGFmdGVyLAogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCgogICAgICAgICAgICBzZWxmLl9pbnNlcnRfd2FsbGV0X3RyYW5zYWN0aW9uKAogICAgICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgICAgIHVzZXJfaWQ9dXNlcl9pZCwKICAgICAgICAgICAgICAgIHR4X3R5cGU9Im9yZGVyX3Jlc2VydmUiLAogICAgICAgICAgICAgICAgYW1vdW50PS1hbW91bnQsCiAgICAgICAgICAgICAgICBiYWxhbmNlX2JlZm9yZT1iZWZvcmUsCiAgICAgICAgICAgICAgICBiYWxhbmNlX2FmdGVyPWFmdGVyLAogICAgICAgICAgICAgICAgZGVzY3JpcHRpb249KAogICAgICAgICAgICAgICAgICAgIGYi2LHYstix2Ygg2YXZiNis2YjYr9uMINiz2YHYp9ix2LQgI3tvcmRlcl9pZH0iCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgcmVmZXJlbmNlX2lkPSgKICAgICAgICAgICAgICAgICAgICBmIm9yZGVyOntvcmRlcl9pZH06cmVzZXJ2ZSIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgVVBEQVRFIG9yZGVycwogICAgICAgICAgICAgICAgU0VUCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPywKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcl9zdGFydGVkX2F0ID0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9USU1FU1RBTVAsCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9CiAgICAgICAgICAgICAgICAgICAgICAgIENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgICAgQU5EIHN0YXR1cyA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfUFJPVklERVJfUFJPQ0VTU0lORywKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfT1dORVJfUFJPQ0VTU0lORywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiBXYWxsZXRSZXNlcnZhdGlvblJlc3VsdCgKICAgICAgICAgICAgICAgIHN1Y2Nlc3M9VHJ1ZSwKICAgICAgICAgICAgICAgIHJlYXNvbj0icmVzZXJ2ZWQiLAogICAgICAgICAgICAgICAgb3JkZXJfaWQ9b3JkZXJfaWQsCiAgICAgICAgICAgICAgICB1c2VyX2lkPXVzZXJfaWQsCiAgICAgICAgICAgICAgICBhbW91bnQ9YW1vdW50LAogICAgICAgICAgICAgICAgYmFsYW5jZV9iZWZvcmU9YmVmb3JlLAogICAgICAgICAgICAgICAgYmFsYW5jZV9hZnRlcj1hZnRlciwKICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKCiAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oCiAgICAgICAgICAgICAgICAiV2FsbGV0IHJlc2VydmUgZmFpbGVkIHwgIgogICAgICAgICAgICAgICAgIm9yZGVyPSVzIiwKICAgICAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICApCgogICAgICAgICAgICByZXR1cm4gV2FsbGV0UmVzZXJ2YXRpb25SZXN1bHQoCiAgICAgICAgICAgICAgICBzdWNjZXNzPUZhbHNlLAogICAgICAgICAgICAgICAgcmVhc29uPSJkYXRhYmFzZV9lcnJvciIsCiAgICAgICAgICAgICAgICBvcmRlcl9pZD1vcmRlcl9pZCwKICAgICAgICAgICAgKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFByb3ZpZGVyIE91dGNvbWUKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgbWFya19wcm92aWRlcl91bmtub3duKAogICAgICAgIHNlbGYsCiAgICAgICAgb3JkZXJfaWQ6IGludCwKICAgICAgICAqLAogICAgICAgIGVycm9yOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgICkgLT4gYm9vbDoKICAgICAgICBhd2FpdCBzZWxmLmVuc3VyZV9zY2hlbWEoKQoKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5fcnVuKAogICAgICAgICAgICBzZWxmLl9tYXJrX3Byb3ZpZGVyX3Vua25vd25fc3luYywKICAgICAgICAgICAgaW50KG9yZGVyX2lkKSwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgc3RyKGVycm9yKVs6MTAwMF0KICAgICAgICAgICAgICAgIGlmIGVycm9yCiAgICAgICAgICAgICAgICBlbHNlIE5vbmUKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgZGVmIF9tYXJrX3Byb3ZpZGVyX3Vua25vd25fc3luYygKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgZXJyb3I6IE9wdGlvbmFsW3N0cl0sCiAgICApIC0+IGJvb2w6CiAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1cnNvciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgVVBEQVRFIG9yZGVycwogICAgICAgICAgICAgICAgU0VUCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPywKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcl9lcnJvciA9ID8sCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9CiAgICAgICAgICAgICAgICAgICAgICAgIENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgICAgQU5EIHN0YXR1cyA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfUFJPVklERVJfVU5LTk9XTiwKICAgICAgICAgICAgICAgICAgICBlcnJvciwKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfUFJPVklERVJfUFJPQ0VTU0lORywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBjdXJzb3Iucm93Y291bnQgPT0gMQogICAgICAgICAgICApCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGFzeW5jIGRlZiBjb21wbGV0ZSgKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgKiwKICAgICAgICBtYXJrZXRfb3JkZXJfaWQ6IHN0ciwKICAgICkgLT4gYm9vbDoKICAgICAgICBhd2FpdCBzZWxmLmVuc3VyZV9zY2hlbWEoKQoKICAgICAgICBtYXJrZXRfb3JkZXJfaWQgPSBzdHIoCiAgICAgICAgICAgIG1hcmtldF9vcmRlcl9pZAogICAgICAgICAgICBvciAiIgogICAgICAgICkuc3RyaXAoKQoKICAgICAgICBpZiBub3QgbWFya2V0X29yZGVyX2lkOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkT3JkZXJFcnJvcigKICAgICAgICAgICAgICAgICJtYXJrZXRfb3JkZXJfaWQgaXMgcmVxdWlyZWQuIgogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBhd2FpdCBzZWxmLl9ydW4oCiAgICAgICAgICAgIHNlbGYuX2NvbXBsZXRlX3N5bmMsCiAgICAgICAgICAgIGludChvcmRlcl9pZCksCiAgICAgICAgICAgIG1hcmtldF9vcmRlcl9pZCwKICAgICAgICApCgogICAgZGVmIF9jb21wbGV0ZV9zeW5jKAogICAgICAgIHNlbGYsCiAgICAgICAgb3JkZXJfaWQ6IGludCwKICAgICAgICBtYXJrZXRfb3JkZXJfaWQ6IHN0ciwKICAgICkgLT4gYm9vbDoKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgY3Vyc29yID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBVUERBVEUgb3JkZXJzCiAgICAgICAgICAgICAgICBTRVQKICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA/LAogICAgICAgICAgICAgICAgICAgIG1hcmtldF9vcmRlcl9pZCA9ID8sCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkX2F0ID0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9USU1FU1RBTVAsCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9CiAgICAgICAgICAgICAgICAgICAgICAgIENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgICAgQU5EIHN0YXR1cyA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfQ09NUExFVEVELAogICAgICAgICAgICAgICAgICAgIG1hcmtldF9vcmRlcl9pZCwKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfUFJPVklERVJfUFJPQ0VTU0lORywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBjdXJzb3Iucm93Y291bnQgPT0gMQogICAgICAgICAgICApCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgIGFzeW5jIGRlZiByZWZ1bmRfZXhwbGljaXRfcHJvdmlkZXJfZmFpbHVyZSgKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgKiwKICAgICAgICBlcnJvcjogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICApIC0+IGJvb2w6CiAgICAgICAgIiIiCiAgICAgICAgUmVmdW5kIG9ubHkgZm9yIGFuIGV4cGxpY2l0IHByb3ZpZGVyL2J1c2luZXNzIGZhaWx1cmUuCgogICAgICAgIERvIE5PVCBjYWxsIGZvciB0aW1lb3V0L2Nvbm5lY3Rpb24vNXh4IGFtYmlndWl0eS4KICAgICAgICAiIiIKICAgICAgICBhd2FpdCBzZWxmLmVuc3VyZV9zY2hlbWEoKQoKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5fcnVuKAogICAgICAgICAgICBzZWxmLl9yZWZ1bmRfZXhwbGljaXRfZmFpbHVyZV9zeW5jLAogICAgICAgICAgICBpbnQob3JkZXJfaWQpLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBzdHIoZXJyb3IpWzoxMDAwXQogICAgICAgICAgICAgICAgaWYgZXJyb3IKICAgICAgICAgICAgICAgIGVsc2UgTm9uZQogICAgICAgICAgICApLAogICAgICAgICkKCiAgICBkZWYgX3JlZnVuZF9leHBsaWNpdF9mYWlsdXJlX3N5bmMoCiAgICAgICAgc2VsZiwKICAgICAgICBvcmRlcl9pZDogaW50LAogICAgICAgIGVycm9yOiBPcHRpb25hbFtzdHJdLAogICAgKSAtPiBib29sOgogICAgICAgIGNvbm4gPSBzZWxmLl9jb25uZWN0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiQkVHSU4gSU1NRURJQVRFIgogICAgICAgICAgICApCgogICAgICAgICAgICBvcmRlciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUICoKICAgICAgICAgICAgICAgIEZST00gb3JkZXJzCiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICAgICAgaWYgbm90IG9yZGVyOgogICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGlmIHN0cigKICAgICAgICAgICAgICAgIG9yZGVyWyJzdGF0dXMiXQogICAgICAgICAgICApICE9IFNUQVRVU19QUk9WSURFUl9QUk9DRVNTSU5HOgogICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIHdhbGxldF9jb2x1bW4gPSAoCiAgICAgICAgICAgICAgICBzZWxmLl93YWxsZXRfY29sdW1uKAogICAgICAgICAgICAgICAgICAgIGNvbm4KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgbm90IHdhbGxldF9jb2x1bW46CiAgICAgICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIG9yZGVycwogICAgICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA/LAogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcl9lcnJvciA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICBTVEFUVVNfRkFJTEVEX1JFRlVORF9SRVFVSVJFRCwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICB1c2VyX2lkID0gaW50KAogICAgICAgICAgICAgICAgb3JkZXJbInVzZXJfaWQiXQogICAgICAgICAgICApCgogICAgICAgICAgICBhbW91bnQgPSBpbnQoCiAgICAgICAgICAgICAgICBvcmRlclsicHJpY2UiXQogICAgICAgICAgICAgICAgb3IgMAogICAgICAgICAgICApCgogICAgICAgICAgICB1c2VyID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgZiIiIgogICAgICAgICAgICAgICAgU0VMRUNUCiAgICAgICAgICAgICAgICAgICAge3dhbGxldF9jb2x1bW59CiAgICAgICAgICAgICAgICAgICAgQVMgYmFsYW5jZQogICAgICAgICAgICAgICAgRlJPTSB1c2VycwogICAgICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgICAgICBpZiBub3QgdXNlcjoKICAgICAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgICAgICBVUERBVEUgb3JkZXJzCiAgICAgICAgICAgICAgICAgICAgU0VUCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyX2Vycm9yID0gPywKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRVU19GQUlMRURfUkVGVU5EX1JFUVVJUkVELAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGJlZm9yZSA9IGludCgKICAgICAgICAgICAgICAgIHVzZXJbImJhbGFuY2UiXQogICAgICAgICAgICAgICAgb3IgMAogICAgICAgICAgICApCgogICAgICAgICAgICBhZnRlciA9ICgKICAgICAgICAgICAgICAgIGJlZm9yZQogICAgICAgICAgICAgICAgKyBhbW91bnQKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgZiIiIgogICAgICAgICAgICAgICAgVVBEQVRFIHVzZXJzCiAgICAgICAgICAgICAgICBTRVQKICAgICAgICAgICAgICAgICAgICB7d2FsbGV0X2NvbHVtbn0gPSA/LAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPQogICAgICAgICAgICAgICAgICAgICAgICBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBhZnRlciwKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgc2VsZi5faW5zZXJ0X3dhbGxldF90cmFuc2FjdGlvbigKICAgICAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICAgICB1c2VyX2lkPXVzZXJfaWQsCiAgICAgICAgICAgICAgICB0eF90eXBlPSJvcmRlcl9yZWZ1bmQiLAogICAgICAgICAgICAgICAgYW1vdW50PWFtb3VudCwKICAgICAgICAgICAgICAgIGJhbGFuY2VfYmVmb3JlPWJlZm9yZSwKICAgICAgICAgICAgICAgIGJhbGFuY2VfYWZ0ZXI9YWZ0ZXIsCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0oCiAgICAgICAgICAgICAgICAgICAgZiLYqNin2LLar9i02Kog2YjYrNmHINiz2YHYp9ix2LQgI3tvcmRlcl9pZH0iCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgcmVmZXJlbmNlX2lkPSgKICAgICAgICAgICAgICAgICAgICBmIm9yZGVyOntvcmRlcl9pZH06cmVmdW5kIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICBVUERBVEUgb3JkZXJzCiAgICAgICAgICAgICAgICBTRVQKICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA/LAogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyX2Vycm9yID0gPywKICAgICAgICAgICAgICAgICAgICByZWZ1bmRlZF9hdCA9CiAgICAgICAgICAgICAgICAgICAgICAgIENVUlJFTlRfVElNRVNUQU1QLAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPQogICAgICAgICAgICAgICAgICAgICAgICBDVVJSRU5UX1RJTUVTVEFNUAogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICAgICAgIEFORCBzdGF0dXMgPSA/CiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgU1RBVFVTX0ZBSUxFRF9SRUZVTkRFRCwKICAgICAgICAgICAgICAgICAgICBlcnJvciwKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgICAgICAgICBTVEFUVVNfUFJPVklERVJfUFJPQ0VTU0lORywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKQoKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJQcm92aWRlciBmYWlsdXJlIHJlZnVuZCBmYWlsZWQgfCAiCiAgICAgICAgICAgICAgICAib3JkZXI9JXMiLAogICAgICAgICAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEdlbmVyaWMgQ29tcGF0aWJpbGl0eSBVcGRhdGUKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgdXBkYXRlX29yZGVyX3N0YXR1cygKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgc3RhdHVzOiBzdHIsCiAgICAgICAgKiwKICAgICAgICBtYXJrZXRfb3JkZXJfaWQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgKSAtPiBPcmRlcjoKICAgICAgICBhd2FpdCBzZWxmLmVuc3VyZV9zY2hlbWEoKQoKICAgICAgICBzdGF0dXMgPSBzdHIoCiAgICAgICAgICAgIHN0YXR1cwogICAgICAgICkuc3RyaXAoKQoKICAgICAgICBpZiBzdGF0dXMgbm90IGluIFZBTElEX1NUQVRVU0VTOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkT3JkZXJTdGF0dXNFcnJvcigKICAgICAgICAgICAgICAgIGYiVW5zdXBwb3J0ZWQgc3RhdHVzOiB7c3RhdHVzfSIKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5fcnVuKAogICAgICAgICAgICBzZWxmLl91cGRhdGVfc3RhdHVzX3N5bmMsCiAgICAgICAgICAgIGludChvcmRlcl9pZCksCiAgICAgICAgICAgIHN0YXR1cywKICAgICAgICAgICAgbWFya2V0X29yZGVyX2lkLAogICAgICAgICkKCiAgICBkZWYgX3VwZGF0ZV9zdGF0dXNfc3luYygKICAgICAgICBzZWxmLAogICAgICAgIG9yZGVyX2lkOiBpbnQsCiAgICAgICAgc3RhdHVzOiBzdHIsCiAgICAgICAgbWFya2V0X29yZGVyX2lkOiBPcHRpb25hbFtzdHJdLAogICAgKSAtPiBPcmRlcjoKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgY3VycmVudCA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgICAgU0VMRUNUIGlkCiAgICAgICAgICAgICAgICBGUk9NIG9yZGVycwogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICAgICBMSU1JVCAxCiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50OgogICAgICAgICAgICAgICAgcmFpc2UgT3JkZXJOb3RGb3VuZEVycm9yKAogICAgICAgICAgICAgICAgICAgIGYiT3JkZXIge29yZGVyX2lkfSBub3QgZm91bmQuIgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgbWFya2V0X29yZGVyX2lkIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIG9yZGVycwogICAgICAgICAgICAgICAgICAgIFNFVAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA/LAogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkX2F0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUlJFTlRfVElNRVNUQU1QCiAgICAgICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgICAgICAgICBVUERBVEUgb3JkZXJzCiAgICAgICAgICAgICAgICAgICAgU0VUCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldF9vcmRlcl9pZCA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldF9vcmRlcl9pZAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29ubi5jb21taXQoKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9vcmRlcl9zeW5jKAogICAgICAgICAgICBvcmRlcl9pZCwKICAgICAgICAgICAgTm9uZSwKICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBXYWxsZXQgVHJhbnNhY3Rpb24KICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfaW5zZXJ0X3dhbGxldF90cmFuc2FjdGlvbigKICAgICAgICBjbHMsCiAgICAgICAgY29ubjogc3FsaXRlMy5Db25uZWN0aW9uLAogICAgICAgICosCiAgICAgICAgdXNlcl9pZDogaW50LAogICAgICAgIHR4X3R5cGU6IHN0ciwKICAgICAgICBhbW91bnQ6IGludCwKICAgICAgICBiYWxhbmNlX2JlZm9yZTogaW50LAogICAgICAgIGJhbGFuY2VfYWZ0ZXI6IGludCwKICAgICAgICBkZXNjcmlwdGlvbjogc3RyLAogICAgICAgIHJlZmVyZW5jZV9pZDogc3RyLAogICAgKSAtPiBOb25lOgogICAgICAgIGlmIG5vdCBjbHMuX3RhYmxlX2V4aXN0cygKICAgICAgICAgICAgY29ubiwKICAgICAgICAgICAgIndhbGxldF90cmFuc2FjdGlvbnMiLAogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBjb2x1bW5zID0gY2xzLl9jb2x1bW5fbmFtZXMoCiAgICAgICAgICAgIGNvbm4sCiAgICAgICAgICAgICJ3YWxsZXRfdHJhbnNhY3Rpb25zIiwKICAgICAgICApCgogICAgICAgIHJlcXVpcmVkID0gewogICAgICAgICAgICAidXNlcl9pZCIsCiAgICAgICAgICAgICJ0eXBlIiwKICAgICAgICAgICAgImFtb3VudCIsCiAgICAgICAgICAgICJiYWxhbmNlX2JlZm9yZSIsCiAgICAgICAgICAgICJiYWxhbmNlX2FmdGVyIiwKICAgICAgICB9CgogICAgICAgIGlmIG5vdCByZXF1aXJlZC5pc3N1YnNldCgKICAgICAgICAgICAgY29sdW1ucwogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpbnNlcnRfY29sdW1ucyA9IFsKICAgICAgICAgICAgInVzZXJfaWQiLAogICAgICAgICAgICAidHlwZSIsCiAgICAgICAgICAgICJhbW91bnQiLAogICAgICAgICAgICAiYmFsYW5jZV9iZWZvcmUiLAogICAgICAgICAgICAiYmFsYW5jZV9hZnRlciIsCiAgICAgICAgXQoKICAgICAgICB2YWx1ZXM6IGxpc3RbQW55XSA9IFsKICAgICAgICAgICAgdXNlcl9pZCwKICAgICAgICAgICAgdHhfdHlwZSwKICAgICAgICAgICAgYW1vdW50LAogICAgICAgICAgICBiYWxhbmNlX2JlZm9yZSwKICAgICAgICAgICAgYmFsYW5jZV9hZnRlciwKICAgICAgICBdCgogICAgICAgIGlmICJkZXNjcmlwdGlvbiIgaW4gY29sdW1uczoKICAgICAgICAgICAgaW5zZXJ0X2NvbHVtbnMuYXBwZW5kKAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIgogICAgICAgICAgICApCgogICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgKQoKICAgICAgICBpZiAicmVmZXJlbmNlX2lkIiBpbiBjb2x1bW5zOgogICAgICAgICAgICAjIFByZXZlbnQgZHVwbGljYXRlIGJvb2trZWVwaW5nIHdoZW4gYSB1bmlxdWUgaW5kZXgKICAgICAgICAgICAgIyBleGlzdHMgaW4gYSBmdXR1cmUgc2NoZW1hLiBUaGUgb3JkZXIgc3RhdGUgaXRzZWxmCiAgICAgICAgICAgICMgaXMgc3RpbGwgdGhlIHByaW1hcnkgaWRlbXBvdGVuY3kgZ3VhcmQuCiAgICAgICAgICAgIGluc2VydF9jb2x1bW5zLmFwcGVuZCgKICAgICAgICAgICAgICAgICJyZWZlcmVuY2VfaWQiCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoCiAgICAgICAgICAgICAgICByZWZlcmVuY2VfaWQKICAgICAgICAgICAgKQoKICAgICAgICBwbGFjZWhvbGRlcnMgPSAiLCAiLmpvaW4oCiAgICAgICAgICAgICI/IgogICAgICAgICAgICBmb3IgXwogICAgICAgICAgICBpbiBpbnNlcnRfY29sdW1ucwogICAgICAgICkKCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gd2FsbGV0X3RyYW5zYWN0aW9ucyAoIgogICAgICAgICAgICAgICAgKyAiLCAiLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0X2NvbHVtbnMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICsgIikgVkFMVUVTICgiCiAgICAgICAgICAgICAgICArIHBsYWNlaG9sZGVycwogICAgICAgICAgICAgICAgKyAiKSIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgdHVwbGUoCiAgICAgICAgICAgICAgICB2YWx1ZXMKICAgICAgICAgICAgKSwKICAgICAgICApCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBCYWNrd2FyZC1jb21wYXRpYmxlIG1vZHVsZSBzaW5nbGV0b24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMgTGVnYWN5IGNvZGUgbWF5IHN0aWxsIGRvOgojICAgICBmcm9tIHNlcnZpY2VzLm9yZGVyX3NlcnZpY2UgaW1wb3J0IG9yZGVyX3NlcnZpY2UKIwojIE5ldyBtYWluLnB5IHNob3VsZCB1c2U6CiMgICAgIE9yZGVyU2VydmljZShkYl9wYXRoPS4uLikKIwojIE5vIERCIHdvcmsgaGFwcGVucyBhdCBpbXBvcnQgdGltZS4Kb3JkZXJfc2VydmljZSA9IE9yZGVyU2VydmljZSgpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBDb21wYXRpYmlsaXR5IG1vZHVsZS1sZXZlbCBhc3luYyB3cmFwcGVycwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKYXN5bmMgZGVmIGVuc3VyZV9zY2hlbWEoKSAtPiBOb25lOgogICAgYXdhaXQgb3JkZXJfc2VydmljZS5lbnN1cmVfc2NoZW1hKCkKCgphc3luYyBkZWYgZ2V0X29yZGVyKAogICAgb3JkZXJfaWQ6IGludCwKICAgICosCiAgICB1c2VyX2lkOiBPcHRpb25hbFtpbnRdID0gTm9uZSwKKSAtPiBPcmRlcjoKICAgIHJldHVybiBhd2FpdCBvcmRlcl9zZXJ2aWNlLmdldF9vcmRlcigKICAgICAgICBvcmRlcl9pZCwKICAgICAgICB1c2VyX2lkPXVzZXJfaWQsCiAgICApCgoKYXN5bmMgZGVmIGxpc3Rfb3JkZXJzKAogICAgdXNlcl9pZDogaW50LAogICAgKiwKICAgIHN0YXR1czogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBsaW1pdDogaW50ID0gNTAsCiAgICBvZmZzZXQ6IGludCA9IDAsCikgLT4gbGlzdFtPcmRlcl06CiAgICByZXR1cm4gYXdhaXQgb3JkZXJfc2VydmljZS5saXN0X29yZGVycygKICAgICAgICB1c2VyX2lkLAogICAgICAgIHN0YXR1cz1zdGF0dXMsCiAgICAgICAgbGltaXQ9bGltaXQsCiAgICAgICAgb2Zmc2V0PW9mZnNldCwKICAgICkKCgphc3luYyBkZWYgY3JlYXRlX3BlbmRpbmdfb3duZXJfb3JkZXIoCiAgICAqLAogICAgdXNlcl9pZDogaW50LAogICAgcHJvZHVjdF9pZDogc3RyLAogICAgdGFyZ2V0OiBzdHIsCiAgICBwcmljZTogaW50LAopIC0+IE9yZGVyOgogICAgcmV0dXJuICgKICAgICAgICBhd2FpdCBvcmRlcl9zZXJ2aWNlCiAgICAgICAgLmNyZWF0ZV9wZW5kaW5nX293bmVyX29yZGVyKAogICAgICAgICAgICB1c2VyX2lkPXVzZXJfaWQsCiAgICAgICAgICAgIHByb2R1Y3RfaWQ9cHJvZHVjdF9pZCwKICAgICAgICAgICAgdGFyZ2V0PXRhcmdldCwKICAgICAgICAgICAgcHJpY2U9cHJpY2UsCiAgICAgICAgKQogICAgKQoKCl9fYWxsX18gPSBbCiAgICAiT3JkZXIiLAogICAgIldhbGxldFJlc2VydmF0aW9uUmVzdWx0IiwKCiAgICAiT3JkZXJTZXJ2aWNlIiwKICAgICJvcmRlcl9zZXJ2aWNlIiwKCiAgICAiT3JkZXJTZXJ2aWNlRXJyb3IiLAogICAgIk9yZGVyTm90Rm91bmRFcnJvciIsCiAgICAiSW52YWxpZE9yZGVyRXJyb3IiLAogICAgIkludmFsaWRPcmRlclN0YXR1c0Vycm9yIiwKICAgICJXYWxsZXRFcnJvciIsCgogICAgIlNUQVRVU19QRU5ESU5HX09XTkVSIiwKICAgICJTVEFUVVNfT1dORVJfUFJPQ0VTU0lORyIsCiAgICAiU1RBVFVTX1JFSkVDVEVEX0JZX09XTkVSIiwKICAgICJTVEFUVVNfQ0FOQ0VMTEVEX0JZX1VTRVIiLAogICAgIlNUQVRVU19QUklDRV9DSEFOR0VEIiwKICAgICJTVEFUVVNfSU5TVUZGSUNJRU5UX0JBTEFOQ0UiLAogICAgIlNUQVRVU19QUk9WSURFUl9QUk9DRVNTSU5HIiwKICAgICJTVEFUVVNfUFJPVklERVJfVU5LTk9XTiIsCiAgICAiU1RBVFVTX0NPTVBMRVRFRCIsCiAgICAiU1RBVFVTX0ZBSUxFRF9SRUZVTkRFRCIsCiAgICAiU1RBVFVTX0ZBSUxFRF9SRUZVTkRfUkVRVUlSRUQiLAogICAgIlZBTElEX1NUQVRVU0VTIiwKCiAgICAiZW5zdXJlX3NjaGVtYSIsCiAgICAiZ2V0X29yZGVyIiwKICAgICJsaXN0X29yZGVycyIsCiAgICAiY3JlYXRlX3BlbmRpbmdfb3duZXJfb3JkZXIiLApdCg==', 'services/iran_usdt_rate_service.py': 'IyBzZXJ2aWNlcy9pcmFuX3VzZHRfcmF0ZV9zZXJ2aWNlLnB5Cgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYXN5bmNpbwppbXBvcnQgbG9nZ2luZwppbXBvcnQgdGltZQpmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MKZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsLCBJbnZhbGlkT3BlcmF0aW9uCmZyb20gdHlwaW5nIGltcG9ydCBBbnksIEF3YWl0YWJsZSwgQ2FsbGFibGUsIE9wdGlvbmFsCgppbXBvcnQgYWlvaHR0cAoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIElyYW5Vc2R0UmF0ZUVycm9yKEV4Y2VwdGlvbik6CiAgICBwYXNzCgoKY2xhc3MgSXJhblVzZHRBbGxQcm92aWRlcnNGYWlsZWQoSXJhblVzZHRSYXRlRXJyb3IpOgogICAgcGFzcwoKCmNsYXNzIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKElyYW5Vc2R0UmF0ZUVycm9yKToKICAgIHBhc3MKCgpAZGF0YWNsYXNzKHNsb3RzPVRydWUsIGZyb3plbj1UcnVlKQpjbGFzcyBJcmFuVXNkdFF1b3RlOgogICAgcmF0ZV90b21hbjogRGVjaW1hbAogICAgc291cmNlOiBzdHIKICAgIGZldGNoZWRfYXQ6IGZsb2F0CiAgICBzdGFsZTogYm9vbCA9IEZhbHNlCgoKQGRhdGFjbGFzcyhzbG90cz1UcnVlKQpjbGFzcyBfQ2FjaGVJdGVtOgogICAgcXVvdGU6IElyYW5Vc2R0UXVvdGUKICAgIGV4cGlyZXNfYXQ6IGZsb2F0CiAgICBzdGFsZV91bnRpbDogZmxvYXQKCgpjbGFzcyBJcmFuVXNkdFJhdGVTZXJ2aWNlOgogICAgIiIiCiAgICBTZXF1ZW50aWFsIFVTRFQvVG9tYW4gZmFsbGJhY2suCgogICAgUHJpb3JpdHk6CiAgICAgICAgVGFiZGVhbCAtPiBXYWxsZXggLT4gQml0cGluIC0+IE5vYml0ZXggLT4gRXhpciAtPiBTYXJyYWZleAoKICAgIE5vcm1hbCBwcmljaW5nIHN0b3BzIGF0IHRoZSBmaXJzdCB2YWxpZCBzb3VyY2UgdG8gcmVkdWNlIEFQSSBwcmVzc3VyZS4KICAgICIiIgoKICAgIFRBQkRFQUxfREVQVEhfVVJMID0gImh0dHBzOi8vYXBpMS50YWJkZWFsLm9yZy9yL2FwaS92MS9kZXB0aCIKICAgIFdBTExFWF9NQVJLRVRTX1VSTCA9ICJodHRwczovL2FwaS53YWxsZXguaXIvaGVjdG9yL3dlYi92MS9tYXJrZXRzIgogICAgQklUUElOX01BUktFVFNfVVJMID0gImh0dHBzOi8vYXBpLmJpdHBpbi5pci92MS9ta3QvbWFya2V0cy8iCiAgICBOT0JJVEVYX1NUQVRTX1VSTCA9ICJodHRwczovL2FwaXYyLm5vYml0ZXguaXIvbWFya2V0L3N0YXRzIgogICAgRVhJUl9USUNLRVJfVVJMID0gImh0dHBzOi8vYXBpLmV4aXIuaW8vdjIvdGlja2VyIgogICAgU0FSUkFGRVhfTUFSS0VUU19VUkwgPSAiaHR0cHM6Ly9hcGkuc2FycmFmZXguY29tL0V4Y2hhbmdlci9xdWVyeS9tYXJrZXQiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgKiwKICAgICAgICB0aW1lb3V0OiBmbG9hdCA9IDQuMCwKICAgICAgICBjYWNoZV90dGw6IGZsb2F0ID0gMTUuMCwKICAgICAgICBzdGFsZV90dGw6IGZsb2F0ID0gMzAwLjAsCiAgICAgICAgc2Vzc2lvbjogT3B0aW9uYWxbYWlvaHR0cC5DbGllbnRTZXNzaW9uXSA9IE5vbmUsCiAgICAgICAgbWluX3JlYXNvbmFibGVfdG9tYW46IERlY2ltYWwgfCBpbnQgPSBEZWNpbWFsKCIxMDAwMCIpLAogICAgICAgIG1heF9yZWFzb25hYmxlX3RvbWFuOiBEZWNpbWFsIHwgaW50ID0gRGVjaW1hbCgiMTAwMDAwMDAiKSwKICAgICkgLT4gTm9uZToKICAgICAgICBzZWxmLnRpbWVvdXQgPSBtYXgoMS4wLCBmbG9hdCh0aW1lb3V0KSkKICAgICAgICBzZWxmLmNhY2hlX3R0bCA9IG1heCgxLjAsIGZsb2F0KGNhY2hlX3R0bCkpCiAgICAgICAgc2VsZi5zdGFsZV90dGwgPSBtYXgoc2VsZi5jYWNoZV90dGwsIGZsb2F0KHN0YWxlX3R0bCkpCgogICAgICAgIHNlbGYubWluX3JlYXNvbmFibGVfdG9tYW4gPSBEZWNpbWFsKHN0cihtaW5fcmVhc29uYWJsZV90b21hbikpCiAgICAgICAgc2VsZi5tYXhfcmVhc29uYWJsZV90b21hbiA9IERlY2ltYWwoc3RyKG1heF9yZWFzb25hYmxlX3RvbWFuKSkKCiAgICAgICAgc2VsZi5fc2Vzc2lvbiA9IHNlc3Npb24KICAgICAgICBzZWxmLl9vd25zX3Nlc3Npb24gPSBzZXNzaW9uIGlzIE5vbmUKICAgICAgICBzZWxmLl9jYWNoZTogT3B0aW9uYWxbX0NhY2hlSXRlbV0gPSBOb25lCiAgICAgICAgc2VsZi5fbG9jayA9IGFzeW5jaW8uTG9jaygpCgogICAgICAgIHNlbGYuX3Byb3ZpZGVyczogbGlzdFsKICAgICAgICAgICAgdHVwbGVbc3RyLCBDYWxsYWJsZVtbXSwgQXdhaXRhYmxlW0RlY2ltYWxdXV0KICAgICAgICBdID0gWwogICAgICAgICAgICAoInRhYmRlYWwiLCBzZWxmLl90YWJkZWFsKSwKICAgICAgICAgICAgKCJ3YWxsZXgiLCBzZWxmLl93YWxsZXgpLAogICAgICAgICAgICAoImJpdHBpbiIsIHNlbGYuX2JpdHBpbiksCiAgICAgICAgICAgICgibm9iaXRleCIsIHNlbGYuX25vYml0ZXgpLAogICAgICAgICAgICAoImV4aXIiLCBzZWxmLl9leGlyKSwKICAgICAgICAgICAgKCJzYXJyYWZleCIsIHNlbGYuX3NhcnJhZmV4KSwKICAgICAgICBdCgogICAgYXN5bmMgZGVmIF9nZXRfc2Vzc2lvbihzZWxmKSAtPiBhaW9odHRwLkNsaWVudFNlc3Npb246CiAgICAgICAgaWYgc2VsZi5fc2Vzc2lvbiBpcyBub3QgTm9uZSBhbmQgbm90IHNlbGYuX3Nlc3Npb24uY2xvc2VkOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fc2Vzc2lvbgoKICAgICAgICB0aW1lb3V0ID0gYWlvaHR0cC5DbGllbnRUaW1lb3V0KAogICAgICAgICAgICB0b3RhbD1zZWxmLnRpbWVvdXQsCiAgICAgICAgICAgIGNvbm5lY3Q9bWluKHNlbGYudGltZW91dCwgMy4wKSwKICAgICAgICApCgogICAgICAgIHNlbGYuX3Nlc3Npb24gPSBhaW9odHRwLkNsaWVudFNlc3Npb24oCiAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwKICAgICAgICAgICAgaGVhZGVycz17CiAgICAgICAgICAgICAgICAiQWNjZXB0IjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAgICAgIlVzZXItQWdlbnQiOiAiTWF0cml4VGVsZWdyYW1Cb3QvMS4wIFVTRFQtVG9tYW4tUmF0ZSIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKQogICAgICAgIHNlbGYuX293bnNfc2Vzc2lvbiA9IFRydWUKICAgICAgICByZXR1cm4gc2VsZi5fc2Vzc2lvbgoKICAgIGFzeW5jIGRlZiBjbG9zZShzZWxmKSAtPiBOb25lOgogICAgICAgIGlmICgKICAgICAgICAgICAgc2VsZi5fb3duc19zZXNzaW9uCiAgICAgICAgICAgIGFuZCBzZWxmLl9zZXNzaW9uIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5fc2Vzc2lvbi5jbG9zZWQKICAgICAgICApOgogICAgICAgICAgICBhd2FpdCBzZWxmLl9zZXNzaW9uLmNsb3NlKCkKICAgICAgICBzZWxmLl9zZXNzaW9uID0gTm9uZQoKICAgIGFzeW5jIGRlZiBfZ2V0X2pzb24oCiAgICAgICAgc2VsZiwKICAgICAgICB1cmw6IHN0ciwKICAgICAgICAqLAogICAgICAgIHBhcmFtczogT3B0aW9uYWxbZGljdFtzdHIsIEFueV1dID0gTm9uZSwKICAgICkgLT4gQW55OgogICAgICAgIHNlc3Npb24gPSBhd2FpdCBzZWxmLl9nZXRfc2Vzc2lvbigpCgogICAgICAgIHRyeToKICAgICAgICAgICAgYXN5bmMgd2l0aCBzZXNzaW9uLmdldCh1cmwsIHBhcmFtcz1wYXJhbXMpIGFzIHJlc3BvbnNlOgogICAgICAgICAgICAgICAgcmF3ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpCgogICAgICAgICAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzICE9IDIwMDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBJcmFuVXNkdEludmFsaWRSZXNwb25zZSgKICAgICAgICAgICAgICAgICAgICAgICAgZiJIVFRQIHtyZXNwb25zZS5zdGF0dXN9OiB7cmF3WzoxODBdfSIKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKGNvbnRlbnRfdHlwZT1Ob25lKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSXJhblVzZHRJbnZhbGlkUmVzcG9uc2UoCiAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEpTT04gcmVzcG9uc2UuIgogICAgICAgICAgICAgICAgICAgICkgZnJvbSBleGMKCiAgICAgICAgZXhjZXB0IGFzeW5jaW8uVGltZW91dEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgSXJhblVzZHRSYXRlRXJyb3IoIlJlcXVlc3QgdGltZW91dC4iKSBmcm9tIGV4YwogICAgICAgIGV4Y2VwdCBhaW9odHRwLkNsaWVudEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgSXJhblVzZHRSYXRlRXJyb3IoZiJOZXR3b3JrIGVycm9yOiB7ZXhjfSIpIGZyb20gZXhjCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9kZWNpbWFsKHZhbHVlOiBBbnkpIC0+IERlY2ltYWw6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHQgPSBEZWNpbWFsKHN0cih2YWx1ZSkpCiAgICAgICAgZXhjZXB0IChJbnZhbGlkT3BlcmF0aW9uLCBUeXBlRXJyb3IsIFZhbHVlRXJyb3IpIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgSXJhblVzZHRJbnZhbGlkUmVzcG9uc2UoCiAgICAgICAgICAgICAgICBmIkludmFsaWQgbnVtZXJpYyByYXRlOiB7dmFsdWUhcn0iCiAgICAgICAgICAgICkgZnJvbSBleGMKCiAgICAgICAgaWYgbm90IHJlc3VsdC5pc19maW5pdGUoKSBvciByZXN1bHQgPD0gMDoKICAgICAgICAgICAgcmFpc2UgSXJhblVzZHRJbnZhbGlkUmVzcG9uc2UoCiAgICAgICAgICAgICAgICBmIk5vbi1wb3NpdGl2ZSByYXRlOiB7dmFsdWUhcn0iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfdmFsaWRhdGVfdG9tYW4oc2VsZiwgdmFsdWU6IEFueSkgLT4gRGVjaW1hbDoKICAgICAgICByZXN1bHQgPSBzZWxmLl9kZWNpbWFsKHZhbHVlKQoKICAgICAgICBpZiAoCiAgICAgICAgICAgIHJlc3VsdCA8IHNlbGYubWluX3JlYXNvbmFibGVfdG9tYW4KICAgICAgICAgICAgb3IgcmVzdWx0ID4gc2VsZi5tYXhfcmVhc29uYWJsZV90b21hbgogICAgICAgICk6CiAgICAgICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKAogICAgICAgICAgICAgICAgZiJVU0RUL1RvbWFuIG91dHNpZGUgc2FuaXR5IHJhbmdlOiB7cmVzdWx0fSIKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgYXN5bmMgZGVmIF90YWJkZWFsKHNlbGYpIC0+IERlY2ltYWw6CiAgICAgICAgZGF0YSA9IGF3YWl0IHNlbGYuX2dldF9qc29uKAogICAgICAgICAgICBzZWxmLlRBQkRFQUxfREVQVEhfVVJMLAogICAgICAgICAgICBwYXJhbXM9eyJzeW1ib2wiOiAiVVNEVElSVCIsICJsaW1pdCI6IDF9LAogICAgICAgICkKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6CiAgICAgICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKCJUYWJkZWFsIHJlc3BvbnNlIGlzIGludmFsaWQuIikKCiAgICAgICAgYXNrcyA9IGRhdGEuZ2V0KCJhc2tzIikKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYXNrcywgbGlzdCkgb3Igbm90IGFza3M6CiAgICAgICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKAogICAgICAgICAgICAgICAgIlRhYmRlYWwgVVNEVElSVCBhc2sgYm9vayBpcyBlbXB0eS4iCiAgICAgICAgICAgICkKCiAgICAgICAgZmlyc3QgPSBhc2tzWzBdCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpcnN0LCAobGlzdCwgdHVwbGUpKSBvciBub3QgZmlyc3Q6CiAgICAgICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKCJJbnZhbGlkIFRhYmRlYWwgYXNrIHJvdy4iKQoKICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfdG9tYW4oZmlyc3RbMF0pCgogICAgYXN5bmMgZGVmIF93YWxsZXgoc2VsZikgLT4gRGVjaW1hbDoKICAgICAgICBkYXRhID0gYXdhaXQgc2VsZi5fZ2V0X2pzb24oc2VsZi5XQUxMRVhfTUFSS0VUU19VUkwpCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgICAgICByYWlzZSBJcmFuVXNkdEludmFsaWRSZXNwb25zZSgiV2FsbGV4IHJlc3BvbnNlIGlzIGludmFsaWQuIikKCiAgICAgICAgcmVzdWx0ID0gZGF0YS5nZXQoInJlc3VsdCIpCiAgICAgICAgbWFya2V0cyA9IHJlc3VsdC5nZXQoIm1hcmtldHMiKSBpZiBpc2luc3RhbmNlKHJlc3VsdCwgZGljdCkgZWxzZSBOb25lCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG1hcmtldHMsIGxpc3QpOgogICAgICAgICAgICByYWlzZSBJcmFuVXNkdEludmFsaWRSZXNwb25zZSgiV2FsbGV4IG1hcmtldHMgbGlzdCBtaXNzaW5nLiIpCgogICAgICAgIGZvciBtYXJrZXQgaW4gbWFya2V0czoKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobWFya2V0LCBkaWN0KToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBzeW1ib2wgPSBzdHIobWFya2V0LmdldCgic3ltYm9sIikgb3IgIiIpLnVwcGVyKCkKCiAgICAgICAgICAgIGlmIHN5bWJvbCBub3QgaW4geyJVU0RUVE1OIiwgIlVTRFRJUlQifToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB2YWx1ZSA9ICgKICAgICAgICAgICAgICAgIG1hcmtldC5nZXQoInByaWNlIikKICAgICAgICAgICAgICAgIG9yIG1hcmtldC5nZXQoImxhc3RfcHJpY2UiKQogICAgICAgICAgICAgICAgb3IgbWFya2V0LmdldCgibGFzdFByaWNlIikKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3RvbWFuKHZhbHVlKQoKICAgICAgICByYWlzZSBJcmFuVXNkdEludmFsaWRSZXNwb25zZSgiV2FsbGV4IFVTRFRUTU4gbWFya2V0IG5vdCBmb3VuZC4iKQoKICAgIGFzeW5jIGRlZiBfYml0cGluKHNlbGYpIC0+IERlY2ltYWw6CiAgICAgICAgIiIiCiAgICAgICAgQmVzdC1lZmZvcnQgdjEgYWRhcHRlci4KCiAgICAgICAgQW55IEJpdHBpbiBkZXByZWNhdGlvbi9zaGFwZSBjaGFuZ2UgaXMgaXNvbGF0ZWQgYW5kIGF1dG9tYXRpY2FsbHkKICAgICAgICBmYWxscyB0aHJvdWdoIHRvIGxhdGVyIHByb3ZpZGVycy4KICAgICAgICAiIiIKICAgICAgICBuZXh0X3VybDogT3B0aW9uYWxbc3RyXSA9IHNlbGYuQklUUElOX01BUktFVFNfVVJMCiAgICAgICAgcGFyYW1zOiBPcHRpb25hbFtkaWN0W3N0ciwgQW55XV0gPSB7InBhZ2UiOiAxfQoKICAgICAgICBmb3IgXyBpbiByYW5nZSg1KToKICAgICAgICAgICAgaWYgbm90IG5leHRfdXJsOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgIGRhdGEgPSBhd2FpdCBzZWxmLl9nZXRfanNvbihuZXh0X3VybCwgcGFyYW1zPXBhcmFtcykKICAgICAgICAgICAgcGFyYW1zID0gTm9uZQoKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6CiAgICAgICAgICAgICAgICByYWlzZSBJcmFuVXNkdEludmFsaWRSZXNwb25zZSgiQml0cGluIHJlc3BvbnNlIGlzIGludmFsaWQuIikKCiAgICAgICAgICAgIHJlc3VsdHMgPSBkYXRhLmdldCgicmVzdWx0cyIpCgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShyZXN1bHRzLCBsaXN0KToKICAgICAgICAgICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKCJCaXRwaW4gbWFya2V0cyBsaXN0IG1pc3NpbmcuIikKCiAgICAgICAgICAgIGZvciBtYXJrZXQgaW4gcmVzdWx0czoKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG1hcmtldCwgZGljdCk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICBjb2RlID0gc3RyKG1hcmtldC5nZXQoImNvZGUiKSBvciAiIikudXBwZXIoKQogICAgICAgICAgICAgICAgYzEgPSBtYXJrZXQuZ2V0KCJjdXJyZW5jeTEiKQogICAgICAgICAgICAgICAgYzIgPSBtYXJrZXQuZ2V0KCJjdXJyZW5jeTIiKQoKICAgICAgICAgICAgICAgIGMxX2NvZGUgPSAoCiAgICAgICAgICAgICAgICAgICAgc3RyKGMxLmdldCgiY29kZSIpIG9yICIiKS51cHBlcigpCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjMSwgZGljdCkKICAgICAgICAgICAgICAgICAgICBlbHNlICIiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBjMl9jb2RlID0gKAogICAgICAgICAgICAgICAgICAgIHN0cihjMi5nZXQoImNvZGUiKSBvciAiIikudXBwZXIoKQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYzIsIGRpY3QpCiAgICAgICAgICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIG1hdGNoZWQgPSAoCiAgICAgICAgICAgICAgICAgICAgY29kZSBpbiB7IlVTRFRfSVJUIiwgIlVTRFRJUlQifQogICAgICAgICAgICAgICAgICAgIG9yICgKICAgICAgICAgICAgICAgICAgICAgICAgYzFfY29kZSA9PSAiVVNEVCIKICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGMyX2NvZGUgaW4geyJJUlQiLCAiVE1OIn0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoZWQ6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hcmtldC5nZXQoInByaWNlIikKCiAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lIGFuZCBpc2luc3RhbmNlKAogICAgICAgICAgICAgICAgICAgIG1hcmtldC5nZXQoInByaWNlX2luZm8iKSwgZGljdAogICAgICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hcmtldFsicHJpY2VfaW5mbyJdLmdldCgicHJpY2UiKQoKICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmUgYW5kIGlzaW5zdGFuY2UoCiAgICAgICAgICAgICAgICAgICAgbWFya2V0LmdldCgib3JkZXJfYm9va19pbmZvIiksIGRpY3QKICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXJrZXRbIm9yZGVyX2Jvb2tfaW5mbyJdLmdldCgicHJpY2UiKQoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl92YWxpZGF0ZV90b21hbih2YWx1ZSkKCiAgICAgICAgICAgIHJhd19uZXh0ID0gZGF0YS5nZXQoIm5leHQiKQogICAgICAgICAgICBuZXh0X3VybCA9IHN0cihyYXdfbmV4dCkgaWYgcmF3X25leHQgZWxzZSBOb25lCgogICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKCJCaXRwaW4gVVNEVC9JUlQgbWFya2V0IG5vdCBmb3VuZC4iKQoKICAgIGFzeW5jIGRlZiBfbm9iaXRleChzZWxmKSAtPiBEZWNpbWFsOgogICAgICAgIGRhdGEgPSBhd2FpdCBzZWxmLl9nZXRfanNvbigKICAgICAgICAgICAgc2VsZi5OT0JJVEVYX1NUQVRTX1VSTCwKICAgICAgICAgICAgcGFyYW1zPXsKICAgICAgICAgICAgICAgICJzcmNDdXJyZW5jeSI6ICJ1c2R0IiwKICAgICAgICAgICAgICAgICJkc3RDdXJyZW5jeSI6ICJybHMiLAogICAgICAgICAgICB9LAogICAgICAgICkKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6CiAgICAgICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKCJOb2JpdGV4IHJlc3BvbnNlIGlzIGludmFsaWQuIikKCiAgICAgICAgc3RhdHMgPSBkYXRhLmdldCgic3RhdHMiKQoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzdGF0cywgZGljdCk6CiAgICAgICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKCJOb2JpdGV4IHN0YXRzIG1pc3NpbmcuIikKCiAgICAgICAgbWFya2V0ID0gTm9uZQoKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzdGF0cy5pdGVtcygpOgogICAgICAgICAgICBpZiBzdHIoa2V5KS5sb3dlcigpIGluIHsKICAgICAgICAgICAgICAgICJ1c2R0LXJscyIsCiAgICAgICAgICAgICAgICAidXNkdF9ybHMiLAogICAgICAgICAgICAgICAgInVzZHRybHMiLAogICAgICAgICAgICB9OgogICAgICAgICAgICAgICAgbWFya2V0ID0gdmFsdWUKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG1hcmtldCwgZGljdCk6CiAgICAgICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKAogICAgICAgICAgICAgICAgIk5vYml0ZXggVVNEVC1STFMgbWFya2V0IG1pc3NpbmcuIgogICAgICAgICAgICApCgogICAgICAgIHJpYWwgPSAoCiAgICAgICAgICAgIG1hcmtldC5nZXQoImJlc3RTZWxsIikKICAgICAgICAgICAgb3IgbWFya2V0LmdldCgibGF0ZXN0IikKICAgICAgICAgICAgb3IgbWFya2V0LmdldCgibWFyayIpCiAgICAgICAgKQoKICAgICAgICB0b21hbiA9IHNlbGYuX2RlY2ltYWwocmlhbCkgLyBEZWNpbWFsKCIxMCIpCiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3RvbWFuKHRvbWFuKQoKICAgIGFzeW5jIGRlZiBfZXhpcihzZWxmKSAtPiBEZWNpbWFsOgogICAgICAgIGRhdGEgPSBhd2FpdCBzZWxmLl9nZXRfanNvbigKICAgICAgICAgICAgc2VsZi5FWElSX1RJQ0tFUl9VUkwsCiAgICAgICAgICAgIHBhcmFtcz17InN5bWJvbCI6ICJ1c2R0LWlydCJ9LAogICAgICAgICkKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6CiAgICAgICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKCJFeGlyIHJlc3BvbnNlIGlzIGludmFsaWQuIikKCiAgICAgICAgdmFsdWUgPSAoCiAgICAgICAgICAgIGRhdGEuZ2V0KCJsYXN0IikKICAgICAgICAgICAgb3IgZGF0YS5nZXQoImNsb3NlIikKICAgICAgICAgICAgb3IgZGF0YS5nZXQoInByaWNlIikKICAgICAgICApCgogICAgICAgIHJldHVybiBzZWxmLl92YWxpZGF0ZV90b21hbih2YWx1ZSkKCiAgICBhc3luYyBkZWYgX3NhcnJhZmV4KHNlbGYpIC0+IERlY2ltYWw6CiAgICAgICAgZGF0YSA9IGF3YWl0IHNlbGYuX2dldF9qc29uKHNlbGYuU0FSUkFGRVhfTUFSS0VUU19VUkwpCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgICAgICByYWlzZSBJcmFuVXNkdEludmFsaWRSZXNwb25zZSgiU2FycmFmZXggcmVzcG9uc2UgaXMgaW52YWxpZC4iKQoKICAgICAgICBtYXJrZXRzID0gZGF0YS5nZXQoInZhbHVlIikKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobWFya2V0cywgbGlzdCk6CiAgICAgICAgICAgIHJhaXNlIElyYW5Vc2R0SW52YWxpZFJlc3BvbnNlKCJTYXJyYWZleCBtYXJrZXRzIGxpc3QgbWlzc2luZy4iKQoKICAgICAgICBmb3IgbWFya2V0IGluIG1hcmtldHM6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG1hcmtldCwgZGljdCk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgc3ltYm9sID0gc3RyKG1hcmtldC5nZXQoInN5bWJvbCIpIG9yICIiKS51cHBlcigpCiAgICAgICAgICAgIHBhaXIgPSBzdHIobWFya2V0LmdldCgicGFpciIpIG9yICIiKS51cHBlcigpCgogICAgICAgICAgICBpZiBub3QgKAogICAgICAgICAgICAgICAgc3ltYm9sIGluIHsiVVNEVElSVCIsICJVU0RUVE1OIn0KICAgICAgICAgICAgICAgIG9yIHBhaXIgaW4geyJVU0RUL0lSVCIsICJVU0RUL1RNTiJ9CiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgdmFsdWUgPSAoCiAgICAgICAgICAgICAgICBtYXJrZXQuZ2V0KCJjbG9zZSIpCiAgICAgICAgICAgICAgICBvciBtYXJrZXQuZ2V0KCJsYXRlc3RSYXRlIikKICAgICAgICAgICAgICAgIG9yIG1hcmtldC5nZXQoInByaWNlIikKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3RvbWFuKHZhbHVlKQoKICAgICAgICByYWlzZSBJcmFuVXNkdEludmFsaWRSZXNwb25zZSgKICAgICAgICAgICAgIlNhcnJhZmV4IFVTRFQvSVJUIG1hcmtldCBub3QgZm91bmQuIgogICAgICAgICkKCiAgICBhc3luYyBkZWYgZ2V0X3F1b3RlKAogICAgICAgIHNlbGYsCiAgICAgICAgKiwKICAgICAgICBmb3JjZV9yZWZyZXNoOiBib29sID0gRmFsc2UsCiAgICAgICAgYWxsb3dfc3RhbGU6IGJvb2wgPSBUcnVlLAogICAgKSAtPiBJcmFuVXNkdFF1b3RlOgogICAgICAgIG5vdyA9IHRpbWUudGltZSgpCgogICAgICAgIGlmICgKICAgICAgICAgICAgbm90IGZvcmNlX3JlZnJlc2gKICAgICAgICAgICAgYW5kIHNlbGYuX2NhY2hlIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGFuZCBub3cgPCBzZWxmLl9jYWNoZS5leHBpcmVzX2F0CiAgICAgICAgKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NhY2hlLnF1b3RlCgogICAgICAgIGFzeW5jIHdpdGggc2VsZi5fbG9jazoKICAgICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIG5vdCBmb3JjZV9yZWZyZXNoCiAgICAgICAgICAgICAgICBhbmQgc2VsZi5fY2FjaGUgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgIGFuZCBub3cgPCBzZWxmLl9jYWNoZS5leHBpcmVzX2F0CiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2FjaGUucXVvdGUKCiAgICAgICAgICAgIGVycm9yczogbGlzdFtzdHJdID0gW10KCiAgICAgICAgICAgIGZvciBzb3VyY2UsIHByb3ZpZGVyIGluIHNlbGYuX3Byb3ZpZGVyczoKICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSB0aW1lLnBlcmZfY291bnRlcigpCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJhdGUgPSBhd2FpdCBwcm92aWRlcigpCgogICAgICAgICAgICAgICAgICAgIHF1b3RlID0gSXJhblVzZHRRdW90ZSgKICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZV90b21hbj1yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICBmZXRjaGVkX2F0PXRpbWUudGltZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFsZT1GYWxzZSwKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2FjaGUgPSBfQ2FjaGVJdGVtKAogICAgICAgICAgICAgICAgICAgICAgICBxdW90ZT1xdW90ZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlc19hdD1ub3cgKyBzZWxmLmNhY2hlX3R0bCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhbGVfdW50aWw9bm93ICsgc2VsZi5zdGFsZV90dGwsCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgIlVTRFQvVG9tYW4gc291cmNlIHNlbGVjdGVkIHwgIgogICAgICAgICAgICAgICAgICAgICAgICAic291cmNlPSVzIHJhdGU9JXMgbGF0ZW5jeV9tcz0lLjBmIiwKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICByYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAodGltZS5wZXJmX2NvdW50ZXIoKSAtIHN0YXJ0ZWQpICogMTAwMCwKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgICAgIHJldHVybiBxdW90ZQoKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgIGYie3NvdXJjZX06IHt0eXBlKGV4YykuX19uYW1lX199OiB7ZXhjfSIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICJVU0RUL1RvbWFuIHByb3ZpZGVyIGZhaWxlZCB8ICIKICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZT0lcyBlcnJvcj0lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhjLAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGFsbG93X3N0YWxlCiAgICAgICAgICAgICAgICBhbmQgc2VsZi5fY2FjaGUgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgIGFuZCB0aW1lLnRpbWUoKSA8IHNlbGYuX2NhY2hlLnN0YWxlX3VudGlsCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBvbGQgPSBzZWxmLl9jYWNoZS5xdW90ZQoKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJBbGwgVVNEVC9Ub21hbiBwcm92aWRlcnMgZmFpbGVkOyAiCiAgICAgICAgICAgICAgICAgICAgInVzaW5nIHJlY2VudCBzdGFsZSBxdW90ZSB8IHNvdXJjZT0lcyByYXRlPSVzIiwKICAgICAgICAgICAgICAgICAgICBvbGQuc291cmNlLAogICAgICAgICAgICAgICAgICAgIG9sZC5yYXRlX3RvbWFuLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHJldHVybiBJcmFuVXNkdFF1b3RlKAogICAgICAgICAgICAgICAgICAgIHJhdGVfdG9tYW49b2xkLnJhdGVfdG9tYW4sCiAgICAgICAgICAgICAgICAgICAgc291cmNlPWYie29sZC5zb3VyY2V9OnN0YWxlIiwKICAgICAgICAgICAgICAgICAgICBmZXRjaGVkX2F0PW9sZC5mZXRjaGVkX2F0LAogICAgICAgICAgICAgICAgICAgIHN0YWxlPVRydWUsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICByYWlzZSBJcmFuVXNkdEFsbFByb3ZpZGVyc0ZhaWxlZCgKICAgICAgICAgICAgICAgICJBbGwgSXJhbmlhbiBVU0RUL1RvbWFuIHByb3ZpZGVycyBmYWlsZWQuICIKICAgICAgICAgICAgICAgICsgIiB8ICIuam9pbihlcnJvcnMpCiAgICAgICAgICAgICkKCiAgICBhc3luYyBkZWYgZ2V0X3VzZHRfdG9tYW5fcmF0ZSgKICAgICAgICBzZWxmLAogICAgICAgICosCiAgICAgICAgZm9yY2VfcmVmcmVzaDogYm9vbCA9IEZhbHNlLAogICAgICAgIGFsbG93X3N0YWxlOiBib29sID0gVHJ1ZSwKICAgICkgLT4gRGVjaW1hbDoKICAgICAgICBxdW90ZSA9IGF3YWl0IHNlbGYuZ2V0X3F1b3RlKAogICAgICAgICAgICBmb3JjZV9yZWZyZXNoPWZvcmNlX3JlZnJlc2gsCiAgICAgICAgICAgIGFsbG93X3N0YWxlPWFsbG93X3N0YWxlLAogICAgICAgICkKICAgICAgICByZXR1cm4gcXVvdGUucmF0ZV90b21hbgoKICAgIGFzeW5jIGRlZiBkaWFnbm9zdGljcyhzZWxmKSAtPiBkaWN0W3N0ciwgZGljdFtzdHIsIEFueV1dOgogICAgICAgIGFzeW5jIGRlZiBydW5fb25lKAogICAgICAgICAgICBzb3VyY2U6IHN0ciwKICAgICAgICAgICAgcHJvdmlkZXI6IENhbGxhYmxlW1tdLCBBd2FpdGFibGVbRGVjaW1hbF1dLAogICAgICAgICkgLT4gdHVwbGVbc3RyLCBkaWN0W3N0ciwgQW55XV06CiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0aW1lLnBlcmZfY291bnRlcigpCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByYXRlID0gYXdhaXQgcHJvdmlkZXIoKQogICAgICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAib2siOiBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmF0ZV90b21hbiI6IHJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJsYXRlbmN5X21zIjogaW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWUucGVyZl9jb3VudGVyKCkgLSBzdGFydGVkKSAqIDEwMDAKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICAgICAgc291cmNlLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm9rIjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciI6IGYie3R5cGUoZXhjKS5fX25hbWVfX306IHtzdHIoZXhjKVs6MTgwXX0iLAogICAgICAgICAgICAgICAgICAgICAgICAibGF0ZW5jeV9tcyI6IGludCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lLnBlcmZfY291bnRlcigpIC0gc3RhcnRlZCkgKiAxMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgcmVzdWx0cyA9IGF3YWl0IGFzeW5jaW8uZ2F0aGVyKAogICAgICAgICAgICAqWwogICAgICAgICAgICAgICAgcnVuX29uZShzb3VyY2UsIHByb3ZpZGVyKQogICAgICAgICAgICAgICAgZm9yIHNvdXJjZSwgcHJvdmlkZXIgaW4gc2VsZi5fcHJvdmlkZXJzCiAgICAgICAgICAgIF0KICAgICAgICApCgogICAgICAgIHJldHVybiBkaWN0KHJlc3VsdHMpCgoKX19hbGxfXyA9IFsKICAgICJJcmFuVXNkdFJhdGVTZXJ2aWNlIiwKICAgICJJcmFuVXNkdFF1b3RlIiwKICAgICJJcmFuVXNkdFJhdGVFcnJvciIsCiAgICAiSXJhblVzZHRBbGxQcm92aWRlcnNGYWlsZWQiLAogICAgIklyYW5Vc2R0SW52YWxpZFJlc3BvbnNlIiwKXQo=', 'services/tabdeal_rate_service.py': 'IyBzZXJ2aWNlcy90YWJkZWFsX3JhdGVfc2VydmljZS5weQoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGFzeW5jaW8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHRpbWUKCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcwpmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwsIEludmFsaWRPcGVyYXRpb24KZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgT3B0aW9uYWwKCmltcG9ydCBhaW9odHRwCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBFeGNlcHRpb25zCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpjbGFzcyBUYWJkZWFsUmF0ZUVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJCYXNlIGVycm9yIGZvciBUYWJkZWFsIHB1YmxpYyBtYXJrZXQtcmF0ZSBvcGVyYXRpb25zLiIiIgoKCmNsYXNzIFRhYmRlYWxDb25uZWN0aW9uRXJyb3IoVGFiZGVhbFJhdGVFcnJvcik6CiAgICAiIiJOZXR3b3JrL3RyYW5zcG9ydCBmYWlsdXJlLiIiIgoKCmNsYXNzIFRhYmRlYWxSZXNwb25zZUVycm9yKFRhYmRlYWxSYXRlRXJyb3IpOgogICAgIiIiSW52YWxpZCBvciB1bnVzYWJsZSBBUEkgcmVzcG9uc2UuIiIiCgoKY2xhc3MgVGFiZGVhbE1hcmtldFVuYXZhaWxhYmxlRXJyb3IoVGFiZGVhbFJhdGVFcnJvcik6CiAgICAiIiJSZXF1ZXN0ZWQgbWFya2V0IGhhcyBubyB1c2FibGUgb3JkZXIgYm9vay4iIiIKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1vZGVscwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQGRhdGFjbGFzcyhzbG90cz1UcnVlLCBmcm96ZW49VHJ1ZSkKY2xhc3MgVGFiZGVhbFF1b3RlOgogICAgc3ltYm9sOiBzdHIKICAgIGJlc3RfYmlkOiBEZWNpbWFsCiAgICBiZXN0X2FzazogRGVjaW1hbAogICAgZmV0Y2hlZF9hdDogZmxvYXQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBtaWQoc2VsZikgLT4gRGVjaW1hbDoKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLmJlc3RfYmlkCiAgICAgICAgICAgICsgc2VsZi5iZXN0X2FzawogICAgICAgICkgLyBEZWNpbWFsKCIyIikKCgpAZGF0YWNsYXNzKHNsb3RzPVRydWUpCmNsYXNzIF9DYWNoZUl0ZW06CiAgICBxdW90ZTogVGFiZGVhbFF1b3RlCiAgICBleHBpcmVzX2F0OiBmbG9hdAoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHVibGljIE1hcmtldCBSYXRlIFNlcnZpY2UKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmNsYXNzIFRhYmRlYWxSYXRlU2VydmljZToKICAgICIiIgogICAgUmVhZC1vbmx5IFRhYmRlYWwgbWFya2V0LXJhdGUgY2xpZW50LgoKICAgIEltcG9ydGFudDoKICAgICAgICBUaGUgZW5kcG9pbnRzIHVzZWQgaGVyZSBhcmUgcHVibGljIG1hcmtldCBlbmRwb2ludHMuCiAgICAgICAgTm8gQVBJIGtleSBvciBBUEkgc2VjcmV0IGlzIHJlcXVpcmVkLgoKICAgIEN1cnJlbnQgdXNlIGluIHRoZSBUZWxlZ3JhbSBzaG9wOgogICAgICAgIFVTRFRJUlQgLT4gbGl2ZSBVU0RUL1RvbWFuIHJhdGUKICAgICAgICBUT05VU0RUIC0+IGxpdmUgVE9OL1VTRFQgcmF0ZQoKICAgIENvbnNlcnZhdGl2ZSBwcmljaW5nOgogICAgICAgIEZvciBwcm92aWRlci1jb3N0IGNhbGN1bGF0aW9ucyB3ZSB1c2UgdGhlIGJlc3QgQVNLLAogICAgICAgIGJlY2F1c2UgaXQgYXZvaWRzIHVuZGVyZXN0aW1hdGluZyB0aGUgY29zdCBvZiBhY3F1aXJpbmcKICAgICAgICB0aGUgYmFzZSBhc3NldC4KCiAgICBGYWxsYmFjazoKICAgICAgICBJZiBUT05VU0RUIGlzIHVuYXZhaWxhYmxlLCBUT04vVVNEVCBjYW4gYmUgZGVyaXZlZCBmcm9tOgogICAgICAgICAgICBUT05JUlQgYmVzdCBhc2sgLyBVU0RUSVJUIGJlc3QgYmlkCgogICAgICAgIFRoYXQgZmFsbGJhY2sgaXMgaW50ZW50aW9uYWxseSBjb25zZXJ2YXRpdmUuCiAgICAiIiIKCiAgICBCQVNFX1VSTCA9ICgKICAgICAgICAiaHR0cHM6Ly9hcGkxLnRhYmRlYWwub3JnIgogICAgICAgICIvci9hcGkvdjEiCiAgICApCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgKiwKICAgICAgICB0aW1lb3V0OiBmbG9hdCA9IDEwLjAsCiAgICAgICAgY2FjaGVfdHRsOiBmbG9hdCA9IDEwLjAsCiAgICAgICAgcmV0cmllczogaW50ID0gMywKICAgICAgICByZXRyeV9kZWxheTogZmxvYXQgPSAwLjcsCiAgICAgICAgc2Vzc2lvbjogT3B0aW9uYWxbCiAgICAgICAgICAgIGFpb2h0dHAuQ2xpZW50U2Vzc2lvbgogICAgICAgIF0gPSBOb25lLAogICAgKSAtPiBOb25lOgogICAgICAgIHNlbGYudGltZW91dCA9IG1heCgKICAgICAgICAgICAgMS4wLAogICAgICAgICAgICBmbG9hdCh0aW1lb3V0KSwKICAgICAgICApCgogICAgICAgIHNlbGYuY2FjaGVfdHRsID0gbWF4KAogICAgICAgICAgICAwLjAsCiAgICAgICAgICAgIGZsb2F0KGNhY2hlX3R0bCksCiAgICAgICAgKQoKICAgICAgICBzZWxmLnJldHJpZXMgPSBtYXgoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIGludChyZXRyaWVzKSwKICAgICAgICApCgogICAgICAgIHNlbGYucmV0cnlfZGVsYXkgPSBtYXgoCiAgICAgICAgICAgIDAuMCwKICAgICAgICAgICAgZmxvYXQocmV0cnlfZGVsYXkpLAogICAgICAgICkKCiAgICAgICAgc2VsZi5fc2Vzc2lvbiA9IHNlc3Npb24KCiAgICAgICAgc2VsZi5fb3duc19zZXNzaW9uID0gKAogICAgICAgICAgICBzZXNzaW9uIGlzIE5vbmUKICAgICAgICApCgogICAgICAgIHNlbGYuX3Nlc3Npb25fbG9jayA9ICgKICAgICAgICAgICAgYXN5bmNpby5Mb2NrKCkKICAgICAgICApCgogICAgICAgIHNlbGYuX2NhY2hlX2xvY2sgPSAoCiAgICAgICAgICAgIGFzeW5jaW8uTG9jaygpCiAgICAgICAgKQoKICAgICAgICBzZWxmLl9jYWNoZTogZGljdFsKICAgICAgICAgICAgc3RyLAogICAgICAgICAgICBfQ2FjaGVJdGVtLAogICAgICAgIF0gPSB7fQoKICAgICAgICBzZWxmLl9tYXJrZXRfc3ltYm9sczogc2V0W3N0cl0gPSBzZXQoKQogICAgICAgIHNlbGYuX21hcmtldF9zeW1ib2xzX2V4cGlyZXNfYXQ6IGZsb2F0ID0gMC4wCiAgICAgICAgc2VsZi5fbWFya2V0X3N5bWJvbHNfbG9jayA9IGFzeW5jaW8uTG9jaygpCiAgICAgICAgc2VsZi5tYXJrZXRfc3ltYm9sc190dGwgPSBtYXgoCiAgICAgICAgICAgIDMwLjAsCiAgICAgICAgICAgIHNlbGYuY2FjaGVfdHRsLAogICAgICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFNlc3Npb24KICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgX2dldF9zZXNzaW9uKAogICAgICAgIHNlbGYsCiAgICApIC0+IGFpb2h0dHAuQ2xpZW50U2Vzc2lvbjoKICAgICAgICBpZiAoCiAgICAgICAgICAgIHNlbGYuX3Nlc3Npb24gaXMgbm90IE5vbmUKICAgICAgICAgICAgYW5kIG5vdCBzZWxmLl9zZXNzaW9uLmNsb3NlZAogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9zZXNzaW9uCgogICAgICAgIGFzeW5jIHdpdGggc2VsZi5fc2Vzc2lvbl9sb2NrOgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBzZWxmLl9zZXNzaW9uIGlzIE5vbmUKICAgICAgICAgICAgICAgIG9yIHNlbGYuX3Nlc3Npb24uY2xvc2VkCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gYWlvaHR0cC5DbGllbnRUaW1lb3V0KAogICAgICAgICAgICAgICAgICAgIHRvdGFsPXNlbGYudGltZW91dAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHNlbGYuX3Nlc3Npb24gPSAoCiAgICAgICAgICAgICAgICAgICAgYWlvaHR0cC5DbGllbnRTZXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2VwdCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXItQWdlbnQiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hdHJpeFRlbGVncmFtQm90LyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhYmRlYWxSYXRlcy8xLjAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgc2VsZi5fb3duc19zZXNzaW9uID0gVHJ1ZQoKICAgICAgICByZXR1cm4gc2VsZi5fc2Vzc2lvbgoKICAgIGFzeW5jIGRlZiBjbG9zZSgKICAgICAgICBzZWxmLAogICAgKSAtPiBOb25lOgogICAgICAgIGlmICgKICAgICAgICAgICAgc2VsZi5fb3duc19zZXNzaW9uCiAgICAgICAgICAgIGFuZCBzZWxmLl9zZXNzaW9uIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5fc2Vzc2lvbi5jbG9zZWQKICAgICAgICApOgogICAgICAgICAgICBhd2FpdCBzZWxmLl9zZXNzaW9uLmNsb3NlKCkKCiAgICAgICAgc2VsZi5fc2Vzc2lvbiA9IE5vbmUKCiAgICBhc3luYyBkZWYgX19hZW50ZXJfXygKICAgICAgICBzZWxmLAogICAgKSAtPiAiVGFiZGVhbFJhdGVTZXJ2aWNlIjoKICAgICAgICBhd2FpdCBzZWxmLl9nZXRfc2Vzc2lvbigpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBhc3luYyBkZWYgX19hZXhpdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgZXhjX3R5cGUsCiAgICAgICAgZXhjLAogICAgICAgIHRiLAogICAgKSAtPiBOb25lOgogICAgICAgIGF3YWl0IHNlbGYuY2xvc2UoKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgSGVscGVycwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfbm9ybWFsaXplX3N5bWJvbCgKICAgICAgICBzeW1ib2w6IHN0ciwKICAgICkgLT4gc3RyOgogICAgICAgIHN5bWJvbCA9ICgKICAgICAgICAgICAgc3RyKHN5bWJvbCkKICAgICAgICAgICAgLnN0cmlwKCkKICAgICAgICAgICAgLnVwcGVyKCkKICAgICAgICAgICAgLnJlcGxhY2UoIl8iLCAiIikKICAgICAgICAgICAgLnJlcGxhY2UoIi0iLCAiIikKICAgICAgICAgICAgLnJlcGxhY2UoIi8iLCAiIikKICAgICAgICApCgogICAgICAgIGlmICgKICAgICAgICAgICAgbm90IHN5bWJvbAogICAgICAgICAgICBvciBsZW4oc3ltYm9sKSA+IDMwCiAgICAgICAgICAgIG9yIG5vdCBzeW1ib2wuaXNhbG51bSgpCiAgICAgICAgKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJJbnZhbGlkIFRhYmRlYWwgbWFya2V0IHN5bWJvbC4iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHN5bWJvbAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZGVjaW1hbCgKICAgICAgICB2YWx1ZTogQW55LAogICAgKSAtPiBEZWNpbWFsOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0ID0gRGVjaW1hbCgKICAgICAgICAgICAgICAgIHN0cih2YWx1ZSkKICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgKAogICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uLAogICAgICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgICAgIFZhbHVlRXJyb3IsCiAgICAgICAgKSBhcyBleGM6CiAgICAgICAgICAgIHJhaXNlIFRhYmRlYWxSZXNwb25zZUVycm9yKAogICAgICAgICAgICAgICAgIkludmFsaWQgZGVjaW1hbCB2YWx1ZSAiCiAgICAgICAgICAgICAgICAiaW4gVGFiZGVhbCByZXNwb25zZS4iCiAgICAgICAgICAgICkgZnJvbSBleGMKCiAgICAgICAgaWYgKAogICAgICAgICAgICBub3QgcmVzdWx0LmlzX2Zpbml0ZSgpCiAgICAgICAgICAgIG9yIHJlc3VsdCA8PSAwCiAgICAgICAgKToKICAgICAgICAgICAgcmFpc2UgVGFiZGVhbFJlc3BvbnNlRXJyb3IoCiAgICAgICAgICAgICAgICAiTm9uLXBvc2l0aXZlIG1hcmtldCBwcmljZSAiCiAgICAgICAgICAgICAgICAiaW4gVGFiZGVhbCByZXNwb25zZS4iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9maXJzdF9wcmljZSgKICAgICAgICBjbHMsCiAgICAgICAgcm93czogQW55LAogICAgICAgIHNpZGVfbmFtZTogc3RyLAogICAgKSAtPiBEZWNpbWFsOgogICAgICAgIGlmICgKICAgICAgICAgICAgbm90IGlzaW5zdGFuY2UoCiAgICAgICAgICAgICAgICByb3dzLAogICAgICAgICAgICAgICAgbGlzdCwKICAgICAgICAgICAgKQogICAgICAgICAgICBvciBub3Qgcm93cwogICAgICAgICk6CiAgICAgICAgICAgIHJhaXNlICgKICAgICAgICAgICAgICAgIFRhYmRlYWxNYXJrZXRVbmF2YWlsYWJsZUVycm9yKAogICAgICAgICAgICAgICAgICAgIGYiVGFiZGVhbCB7c2lkZV9uYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyIGJvb2sgaXMgZW1wdHkuIgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgIGZpcnN0ID0gcm93c1swXQoKICAgICAgICBpZiAoCiAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKAogICAgICAgICAgICAgICAgZmlyc3QsCiAgICAgICAgICAgICAgICAobGlzdCwgdHVwbGUpLAogICAgICAgICAgICApCiAgICAgICAgICAgIG9yIG5vdCBmaXJzdAogICAgICAgICk6CiAgICAgICAgICAgIHJhaXNlIFRhYmRlYWxSZXNwb25zZUVycm9yKAogICAgICAgICAgICAgICAgZiJJbnZhbGlkIHtzaWRlX25hbWV9IHJvdy4iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIGNscy5fZGVjaW1hbCgKICAgICAgICAgICAgZmlyc3RbMF0KICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBDYWNoZQogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGRlZiBfZ2V0X2NhY2hlZCgKICAgICAgICBzZWxmLAogICAgICAgIHN5bWJvbDogc3RyLAogICAgKSAtPiBPcHRpb25hbFtUYWJkZWFsUXVvdGVdOgogICAgICAgIGlmIHNlbGYuY2FjaGVfdHRsIDw9IDA6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIG5vdyA9IHRpbWUubW9ub3RvbmljKCkKCiAgICAgICAgYXN5bmMgd2l0aCBzZWxmLl9jYWNoZV9sb2NrOgogICAgICAgICAgICBpdGVtID0gc2VsZi5fY2FjaGUuZ2V0KAogICAgICAgICAgICAgICAgc3ltYm9sCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGl0ZW0gaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgIGFuZCBpdGVtLmV4cGlyZXNfYXQgPiBub3cKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnF1b3RlCgogICAgICAgICAgICBpZiBpdGVtIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5fY2FjaGUucG9wKAogICAgICAgICAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgICAgICAgICBOb25lLAogICAgICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGFzeW5jIGRlZiBfcHV0X2NhY2hlKAogICAgICAgIHNlbGYsCiAgICAgICAgcXVvdGU6IFRhYmRlYWxRdW90ZSwKICAgICkgLT4gTm9uZToKICAgICAgICBpZiBzZWxmLmNhY2hlX3R0bCA8PSAwOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYXN5bmMgd2l0aCBzZWxmLl9jYWNoZV9sb2NrOgogICAgICAgICAgICBzZWxmLl9jYWNoZVsKICAgICAgICAgICAgICAgIHF1b3RlLnN5bWJvbAogICAgICAgICAgICBdID0gX0NhY2hlSXRlbSgKICAgICAgICAgICAgICAgIHF1b3RlPXF1b3RlLAogICAgICAgICAgICAgICAgZXhwaXJlc19hdD0oCiAgICAgICAgICAgICAgICAgICAgdGltZS5tb25vdG9uaWMoKQogICAgICAgICAgICAgICAgICAgICsgc2VsZi5jYWNoZV90dGwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICBhc3luYyBkZWYgY2xlYXJfY2FjaGUoCiAgICAgICAgc2VsZiwKICAgICkgLT4gTm9uZToKICAgICAgICBhc3luYyB3aXRoIHNlbGYuX2NhY2hlX2xvY2s6CiAgICAgICAgICAgIHNlbGYuX2NhY2hlLmNsZWFyKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEhUVFAKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgX2dldF9qc29uKAogICAgICAgIHNlbGYsCiAgICAgICAgZW5kcG9pbnQ6IHN0ciwKICAgICAgICAqLAogICAgICAgIHBhcmFtczogT3B0aW9uYWxbCiAgICAgICAgICAgIGRpY3Rbc3RyLCBBbnldCiAgICAgICAgXSA9IE5vbmUsCiAgICApIC0+IEFueToKICAgICAgICBzZXNzaW9uID0gYXdhaXQgc2VsZi5fZ2V0X3Nlc3Npb24oKQoKICAgICAgICB1cmwgPSAoCiAgICAgICAgICAgIHNlbGYuQkFTRV9VUkwKICAgICAgICAgICAgKyAiLyIKICAgICAgICAgICAgKyBlbmRwb2ludC5sc3RyaXAoIi8iKQogICAgICAgICkKCiAgICAgICAgbGFzdF9lcnJvcjogT3B0aW9uYWxbCiAgICAgICAgICAgIEV4Y2VwdGlvbgogICAgICAgIF0gPSBOb25lCgogICAgICAgIGZvciBhdHRlbXB0IGluIHJhbmdlKAogICAgICAgICAgICAxLAogICAgICAgICAgICBzZWxmLnJldHJpZXMgKyAxLAogICAgICAgICk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGFzeW5jIHdpdGggc2Vzc2lvbi5nZXQoCiAgICAgICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgICAgIHBhcmFtcz1wYXJhbXMsCiAgICAgICAgICAgICAgICApIGFzIHJlc3BvbnNlOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkKCiAgICAgICAgICAgICAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzICE9IDIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVGFiZGVhbFJlc3BvbnNlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFiZGVhbCBIVFRQICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYie3Jlc3BvbnNlLnN0YXR1c306ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYie3RleHRbOjMwMF19IgogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlc3BvbnNlLmpzb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlPU5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVGFiZGVhbFJlc3BvbnNlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFiZGVhbCByZXR1cm5lZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBKU09OLiIKICAgICAgICAgICAgICAgICAgICAgICAgKSBmcm9tIGV4YwoKICAgICAgICAgICAgZXhjZXB0ICgKICAgICAgICAgICAgICAgIGFzeW5jaW8uVGltZW91dEVycm9yLAogICAgICAgICAgICAgICAgYWlvaHR0cC5DbGllbnRFcnJvciwKICAgICAgICAgICAgICAgIFRhYmRlYWxSZXNwb25zZUVycm9yLAogICAgICAgICAgICApIGFzIGV4YzoKICAgICAgICAgICAgICAgIGxhc3RfZXJyb3IgPSBleGMKCiAgICAgICAgICAgICAgICBpZiBhdHRlbXB0ID49IHNlbGYucmV0cmllczoKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXRyeV9kZWxheQogICAgICAgICAgICAgICAgICAgICogYXR0ZW1wdAogICAgICAgICAgICAgICAgKQoKICAgICAgICBpZiBpc2luc3RhbmNlKAogICAgICAgICAgICBsYXN0X2Vycm9yLAogICAgICAgICAgICBUYWJkZWFsUmF0ZUVycm9yLAogICAgICAgICk6CiAgICAgICAgICAgIHJhaXNlIGxhc3RfZXJyb3IKCiAgICAgICAgcmFpc2UgVGFiZGVhbENvbm5lY3Rpb25FcnJvcigKICAgICAgICAgICAgIkNvdWxkIG5vdCBjb25uZWN0IHRvICIKICAgICAgICAgICAgIlRhYmRlYWwgcHVibGljIG1hcmtldCBBUEkuIgogICAgICAgICkgZnJvbSBsYXN0X2Vycm9yCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBNYXJrZXQgRGlzY292ZXJ5CiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2NvbGxlY3RfbWFya2V0X3N5bWJvbHMoCiAgICAgICAgY2xzLAogICAgICAgIHZhbHVlOiBBbnksCiAgICAgICAgcmVzdWx0OiBzZXRbc3RyXSwKICAgICkgLT4gTm9uZToKICAgICAgICBpZiBpc2luc3RhbmNlKAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgZGljdCwKICAgICAgICApOgogICAgICAgICAgICBmb3Iga2V5IGluICgKICAgICAgICAgICAgICAgICJzeW1ib2wiLAogICAgICAgICAgICAgICAgInRhYmRlYWxTeW1ib2wiLAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgcmF3ID0gdmFsdWUuZ2V0KAogICAgICAgICAgICAgICAgICAgIGtleQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoCiAgICAgICAgICAgICAgICAgICAgcmF3LAogICAgICAgICAgICAgICAgICAgIHN0ciwKICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLl9ub3JtYWxpemVfc3ltYm9sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgICAgIGZvciBjaGlsZCBpbiB2YWx1ZS52YWx1ZXMoKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoCiAgICAgICAgICAgICAgICAgICAgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgKGRpY3QsIGxpc3QsIHR1cGxlKSwKICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgY2xzLl9jb2xsZWN0X21hcmtldF9zeW1ib2xzKAogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBpc2luc3RhbmNlKAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgKGxpc3QsIHR1cGxlKSwKICAgICAgICApOgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICBjbHMuX2NvbGxlY3RfbWFya2V0X3N5bWJvbHMoCiAgICAgICAgICAgICAgICAgICAgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LAogICAgICAgICAgICAgICAgKQoKICAgIGFzeW5jIGRlZiBnZXRfbWFya2V0X3N5bWJvbHMoCiAgICAgICAgc2VsZiwKICAgICAgICAqLAogICAgICAgIGZvcmNlX3JlZnJlc2g6IGJvb2wgPSBGYWxzZSwKICAgICkgLT4gc2V0W3N0cl06CiAgICAgICAgbm93ID0gdGltZS50aW1lKCkKCiAgICAgICAgaWYgKAogICAgICAgICAgICBub3QgZm9yY2VfcmVmcmVzaAogICAgICAgICAgICBhbmQgc2VsZi5fbWFya2V0X3N5bWJvbHMKICAgICAgICAgICAgYW5kIG5vdyA8IHNlbGYuX21hcmtldF9zeW1ib2xzX2V4cGlyZXNfYXQKICAgICAgICApOgogICAgICAgICAgICByZXR1cm4gc2V0KAogICAgICAgICAgICAgICAgc2VsZi5fbWFya2V0X3N5bWJvbHMKICAgICAgICAgICAgKQoKICAgICAgICBhc3luYyB3aXRoIHNlbGYuX21hcmtldF9zeW1ib2xzX2xvY2s6CiAgICAgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBub3QgZm9yY2VfcmVmcmVzaAogICAgICAgICAgICAgICAgYW5kIHNlbGYuX21hcmtldF9zeW1ib2xzCiAgICAgICAgICAgICAgICBhbmQgbm93IDwgc2VsZi5fbWFya2V0X3N5bWJvbHNfZXhwaXJlc19hdAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgcmV0dXJuIHNldCgKICAgICAgICAgICAgICAgICAgICBzZWxmLl9tYXJrZXRfc3ltYm9scwogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHNlbGYuX2dldF9qc29uKAogICAgICAgICAgICAgICAgImV4Y2hhbmdlSW5mbyIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgc3ltYm9sczogc2V0W3N0cl0gPSBzZXQoKQoKICAgICAgICAgICAgc2VsZi5fY29sbGVjdF9tYXJrZXRfc3ltYm9scygKICAgICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAgICBzeW1ib2xzLAogICAgICAgICAgICApCgogICAgICAgICAgICBpZiBub3Qgc3ltYm9sczoKICAgICAgICAgICAgICAgIHJhaXNlIFRhYmRlYWxSZXNwb25zZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJUYWJkZWFsIGV4Y2hhbmdlSW5mbyBjb250YWluZWQgbm8gbWFya2V0IHN5bWJvbHMuIgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgc2VsZi5fbWFya2V0X3N5bWJvbHMgPSBzeW1ib2xzCiAgICAgICAgICAgIHNlbGYuX21hcmtldF9zeW1ib2xzX2V4cGlyZXNfYXQgPSAoCiAgICAgICAgICAgICAgICB0aW1lLnRpbWUoKQogICAgICAgICAgICAgICAgKyBzZWxmLm1hcmtldF9zeW1ib2xzX3R0bAogICAgICAgICAgICApCgogICAgICAgICAgICByZXR1cm4gc2V0KAogICAgICAgICAgICAgICAgc3ltYm9scwogICAgICAgICAgICApCgogICAgYXN5bmMgZGVmIF9uYXRpdmVfbWFya2V0X2NhbmRpZGF0ZXMoCiAgICAgICAgc2VsZiwKICAgICAgICBxdW90ZV9hc3NldDogc3RyLAogICAgICAgICosCiAgICAgICAgZm9yY2VfcmVmcmVzaDogYm9vbCA9IEZhbHNlLAogICAgKSAtPiBsaXN0W3N0cl06CiAgICAgICAgIiIiCiAgICAgICAgUHJlZmVyIEdSQU0gKGN1cnJlbnQgbmF0aXZlLWN1cnJlbmN5IG5hbWUpIGFuZCBrZWVwIFRPTiBhcyB0aGUKICAgICAgICBleGNoYW5nZS1jb21wYXRpYmlsaXR5IGZhbGxiYWNrLgogICAgICAgICIiIgogICAgICAgIHF1b3RlX2Fzc2V0ID0gc2VsZi5fbm9ybWFsaXplX3N5bWJvbCgKICAgICAgICAgICAgcXVvdGVfYXNzZXQKICAgICAgICApCgogICAgICAgIHByZWZlcnJlZCA9IFsKICAgICAgICAgICAgZiJHUkFNe3F1b3RlX2Fzc2V0fSIsCiAgICAgICAgICAgIGYiVE9Oe3F1b3RlX2Fzc2V0fSIsCiAgICAgICAgXQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGF2YWlsYWJsZSA9IGF3YWl0IHNlbGYuZ2V0X21hcmtldF9zeW1ib2xzKAogICAgICAgICAgICAgICAgZm9yY2VfcmVmcmVzaD1mb3JjZV9yZWZyZXNoCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IFRhYmRlYWxSYXRlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGlzY292ZXIgVGFiZGVhbCBtYXJrZXQgYWxpYXNlczsgIgogICAgICAgICAgICAgICAgInByb2JpbmcgR1JBTS9UT04gZGlyZWN0bHkgfCBxdW90ZT0lcyBlcnJvcj0lcyIsCiAgICAgICAgICAgICAgICBxdW90ZV9hc3NldCwKICAgICAgICAgICAgICAgIGV4YywKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIHByZWZlcnJlZAoKICAgICAgICBkaXNjb3ZlcmVkID0gWwogICAgICAgICAgICBzeW1ib2wKICAgICAgICAgICAgZm9yIHN5bWJvbCBpbiBwcmVmZXJyZWQKICAgICAgICAgICAgaWYgc3ltYm9sIGluIGF2YWlsYWJsZQogICAgICAgIF0KCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgZGlzY292ZXJlZAogICAgICAgICAgICArIFsKICAgICAgICAgICAgICAgIHN5bWJvbAogICAgICAgICAgICAgICAgZm9yIHN5bWJvbCBpbiBwcmVmZXJyZWQKICAgICAgICAgICAgICAgIGlmIHN5bWJvbCBub3QgaW4gZGlzY292ZXJlZAogICAgICAgICAgICBdCiAgICAgICAgKQoKICAgIGFzeW5jIGRlZiBfbmF0aXZlX2Jlc3RfYXNrKAogICAgICAgIHNlbGYsCiAgICAgICAgcXVvdGVfYXNzZXQ6IHN0ciwKICAgICAgICAqLAogICAgICAgIGZvcmNlX3JlZnJlc2g6IGJvb2wgPSBGYWxzZSwKICAgICkgLT4gdHVwbGVbRGVjaW1hbCwgc3RyXToKICAgICAgICBlcnJvcnM6IGxpc3Rbc3RyXSA9IFtdCgogICAgICAgIGZvciBzeW1ib2wgaW4gYXdhaXQgc2VsZi5fbmF0aXZlX21hcmtldF9jYW5kaWRhdGVzKAogICAgICAgICAgICBxdW90ZV9hc3NldCwKICAgICAgICAgICAgZm9yY2VfcmVmcmVzaD1mb3JjZV9yZWZyZXNoLAogICAgICAgICk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHByaWNlID0gYXdhaXQgc2VsZi5iZXN0X2FzaygKICAgICAgICAgICAgICAgICAgICBzeW1ib2wsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VfcmVmcmVzaD1mb3JjZV9yZWZyZXNoLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICJUYWJkZWFsIG5hdGl2ZSBtYXJrZXQgc2VsZWN0ZWQgfCBzeW1ib2w9JXMiLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgICAgIHByaWNlLAogICAgICAgICAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGV4Y2VwdCBUYWJkZWFsUmF0ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgZiJ7c3ltYm9sfToge2V4Y30iCiAgICAgICAgICAgICAgICApCgogICAgICAgIHJhaXNlIFRhYmRlYWxNYXJrZXRVbmF2YWlsYWJsZUVycm9yKAogICAgICAgICAgICAiTm8gdXNhYmxlIEdSQU0vVE9OIGFzayBtYXJrZXQuICIKICAgICAgICAgICAgKyAiIHwgIi5qb2luKAogICAgICAgICAgICAgICAgZXJyb3JzCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIyBQdWJsaWMgTWFya2V0IERhdGEKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBkZWYgcGluZygKICAgICAgICBzZWxmLAogICAgKSAtPiBib29sOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2VsZi5fZ2V0X2pzb24oCiAgICAgICAgICAgICAgICAicGluZyIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2UoCiAgICAgICAgICAgICAgICByZXN1bHQsCiAgICAgICAgICAgICAgICBkaWN0LAogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGFzeW5jIGRlZiBnZXRfcXVvdGUoCiAgICAgICAgc2VsZiwKICAgICAgICBzeW1ib2w6IHN0ciwKICAgICAgICAqLAogICAgICAgIGZvcmNlX3JlZnJlc2g6IGJvb2wgPSBGYWxzZSwKICAgICkgLT4gVGFiZGVhbFF1b3RlOgogICAgICAgIHN5bWJvbCA9IHNlbGYuX25vcm1hbGl6ZV9zeW1ib2woCiAgICAgICAgICAgIHN5bWJvbAogICAgICAgICkKCiAgICAgICAgaWYgbm90IGZvcmNlX3JlZnJlc2g6CiAgICAgICAgICAgIGNhY2hlZCA9IGF3YWl0IHNlbGYuX2dldF9jYWNoZWQoCiAgICAgICAgICAgICAgICBzeW1ib2wKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgY2FjaGVkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZAoKICAgICAgICBkYXRhID0gYXdhaXQgc2VsZi5fZ2V0X2pzb24oCiAgICAgICAgICAgICJkZXB0aCIsCiAgICAgICAgICAgIHBhcmFtcz17CiAgICAgICAgICAgICAgICAic3ltYm9sIjogc3ltYm9sLAogICAgICAgICAgICAgICAgImxpbWl0IjogMSwKICAgICAgICAgICAgfSwKICAgICAgICApCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKAogICAgICAgICAgICBkYXRhLAogICAgICAgICAgICBkaWN0LAogICAgICAgICk6CiAgICAgICAgICAgIHJhaXNlIFRhYmRlYWxSZXNwb25zZUVycm9yKAogICAgICAgICAgICAgICAgIkludmFsaWQgVGFiZGVhbCBkZXB0aCByZXNwb25zZS4iCiAgICAgICAgICAgICkKCiAgICAgICAgYmlkID0gc2VsZi5fZmlyc3RfcHJpY2UoCiAgICAgICAgICAgIGRhdGEuZ2V0KAogICAgICAgICAgICAgICAgImJpZHMiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICJiaWQiLAogICAgICAgICkKCiAgICAgICAgYXNrID0gc2VsZi5fZmlyc3RfcHJpY2UoCiAgICAgICAgICAgIGRhdGEuZ2V0KAogICAgICAgICAgICAgICAgImFza3MiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICJhc2siLAogICAgICAgICkKCiAgICAgICAgaWYgYmlkID4gYXNrOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJUYWJkZWFsIGNyb3NzZWQgYm9vayB8ICIKICAgICAgICAgICAgICAgICJzeW1ib2w9JXMgYmlkPSVzIGFzaz0lcyIsCiAgICAgICAgICAgICAgICBzeW1ib2wsCiAgICAgICAgICAgICAgICBiaWQsCiAgICAgICAgICAgICAgICBhc2ssCiAgICAgICAgICAgICkKCiAgICAgICAgcXVvdGUgPSBUYWJkZWFsUXVvdGUoCiAgICAgICAgICAgIHN5bWJvbD1zeW1ib2wsCiAgICAgICAgICAgIGJlc3RfYmlkPWJpZCwKICAgICAgICAgICAgYmVzdF9hc2s9YXNrLAogICAgICAgICAgICBmZXRjaGVkX2F0PXRpbWUudGltZSgpLAogICAgICAgICkKCiAgICAgICAgYXdhaXQgc2VsZi5fcHV0X2NhY2hlKAogICAgICAgICAgICBxdW90ZQogICAgICAgICkKCiAgICAgICAgcmV0dXJuIHF1b3RlCgogICAgYXN5bmMgZGVmIF9iZXN0X3NpZGUoCiAgICAgICAgc2VsZiwKICAgICAgICBzeW1ib2w6IHN0ciwKICAgICAgICBzaWRlOiBzdHIsCiAgICAgICAgKiwKICAgICAgICBmb3JjZV9yZWZyZXNoOiBib29sID0gRmFsc2UsCiAgICApIC0+IERlY2ltYWw6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIG9ubHkgdGhlIHJlcXVlc3RlZCBzaWRlIG9mIHRoZSBvcmRlciBib29rLgoKICAgICAgICBJbXBvcnRhbnQ6CiAgICAgICAgICAgIEEgbWFya2V0IG1heSB0ZW1wb3JhcmlseSBoYXZlIGFuIGVtcHR5IGJpZCBzaWRlIHdoaWxlIGFza3MKICAgICAgICAgICAgc3RpbGwgZXhpc3QgKG9yIHZpY2UgdmVyc2EpLiBUaGUgb2xkIGltcGxlbWVudGF0aW9uIGNhbGxlZAogICAgICAgICAgICBnZXRfcXVvdGUoKSwgd2hpY2ggcmVxdWlyZWQgQk9USCBzaWRlcyBhbmQgdGhlcmVmb3JlIG1hZGUKICAgICAgICAgICAgYmVzdF9hc2soKSBmYWlsIG9ubHkgYmVjYXVzZSBiaWRzIHdlcmUgZW1wdHkuCgogICAgICAgIFdlIG9ubHkgcmVxdWlyZSB0aGUgc2lkZSB0aGUgY2FsbGVyIGFjdHVhbGx5IHJlcXVlc3RlZC4KICAgICAgICBJZiBib3RoIHNpZGVzIGFyZSBhdmFpbGFibGUgd2Ugc3RpbGwgcG9wdWxhdGUgdGhlIGZ1bGwgcXVvdGUgY2FjaGUuCiAgICAgICAgIiIiCiAgICAgICAgc3ltYm9sID0gc2VsZi5fbm9ybWFsaXplX3N5bWJvbCgKICAgICAgICAgICAgc3ltYm9sCiAgICAgICAgKQoKICAgICAgICBpZiBzaWRlIG5vdCBpbiB7CiAgICAgICAgICAgICJiaWQiLAogICAgICAgICAgICAiYXNrIiwKICAgICAgICB9OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgInNpZGUgbXVzdCBiZSAnYmlkJyBvciAnYXNrJy4iCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgbm90IGZvcmNlX3JlZnJlc2g6CiAgICAgICAgICAgIGNhY2hlZCA9IGF3YWl0IHNlbGYuX2dldF9jYWNoZWQoCiAgICAgICAgICAgICAgICBzeW1ib2wKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgY2FjaGVkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgICAgICBjYWNoZWQuYmVzdF9iaWQKICAgICAgICAgICAgICAgICAgICBpZiBzaWRlID09ICJiaWQiCiAgICAgICAgICAgICAgICAgICAgZWxzZSBjYWNoZWQuYmVzdF9hc2sKICAgICAgICAgICAgICAgICkKCiAgICAgICAgZGF0YSA9IGF3YWl0IHNlbGYuX2dldF9qc29uKAogICAgICAgICAgICAiZGVwdGgiLAogICAgICAgICAgICBwYXJhbXM9ewogICAgICAgICAgICAgICAgInN5bWJvbCI6IHN5bWJvbCwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKQoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSgKICAgICAgICAgICAgZGF0YSwKICAgICAgICAgICAgZGljdCwKICAgICAgICApOgogICAgICAgICAgICByYWlzZSBUYWJkZWFsUmVzcG9uc2VFcnJvcigKICAgICAgICAgICAgICAgICJJbnZhbGlkIFRhYmRlYWwgZGVwdGggcmVzcG9uc2UuIgogICAgICAgICAgICApCgogICAgICAgIHJlcXVlc3RlZF9yb3dzID0gKAogICAgICAgICAgICBkYXRhLmdldCgiYmlkcyIpCiAgICAgICAgICAgIGlmIHNpZGUgPT0gImJpZCIKICAgICAgICAgICAgZWxzZSBkYXRhLmdldCgiYXNrcyIpCiAgICAgICAgKQoKICAgICAgICBwcmljZSA9IHNlbGYuX2ZpcnN0X3ByaWNlKAogICAgICAgICAgICByZXF1ZXN0ZWRfcm93cywKICAgICAgICAgICAgc2lkZSwKICAgICAgICApCgogICAgICAgICMgQ2FjaGUgYSBjb21wbGV0ZSBxdW90ZSBvbmx5IHdoZW4gYm90aCBzaWRlcyBhcmUgYWN0dWFsbHkgdXNhYmxlLgogICAgICAgIHRyeToKICAgICAgICAgICAgYmlkID0gc2VsZi5fZmlyc3RfcHJpY2UoCiAgICAgICAgICAgICAgICBkYXRhLmdldCgiYmlkcyIpLAogICAgICAgICAgICAgICAgImJpZCIsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGFzayA9IHNlbGYuX2ZpcnN0X3ByaWNlKAogICAgICAgICAgICAgICAgZGF0YS5nZXQoImFza3MiKSwKICAgICAgICAgICAgICAgICJhc2siLAogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBUYWJkZWFsUmF0ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gcHJpY2UKCiAgICAgICAgaWYgYmlkID4gYXNrOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJUYWJkZWFsIGNyb3NzZWQgYm9vayB8ICIKICAgICAgICAgICAgICAgICJzeW1ib2w9JXMgYmlkPSVzIGFzaz0lcyIsCiAgICAgICAgICAgICAgICBzeW1ib2wsCiAgICAgICAgICAgICAgICBiaWQsCiAgICAgICAgICAgICAgICBhc2ssCiAgICAgICAgICAgICkKCiAgICAgICAgYXdhaXQgc2VsZi5fcHV0X2NhY2hlKAogICAgICAgICAgICBUYWJkZWFsUXVvdGUoCiAgICAgICAgICAgICAgICBzeW1ib2w9c3ltYm9sLAogICAgICAgICAgICAgICAgYmVzdF9iaWQ9YmlkLAogICAgICAgICAgICAgICAgYmVzdF9hc2s9YXNrLAogICAgICAgICAgICAgICAgZmV0Y2hlZF9hdD10aW1lLnRpbWUoKSwKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAgICAgcmV0dXJuIHByaWNlCgogICAgYXN5bmMgZGVmIGJlc3RfYmlkKAogICAgICAgIHNlbGYsCiAgICAgICAgc3ltYm9sOiBzdHIsCiAgICAgICAgKiwKICAgICAgICBmb3JjZV9yZWZyZXNoOiBib29sID0gRmFsc2UsCiAgICApIC0+IERlY2ltYWw6CiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuX2Jlc3Rfc2lkZSgKICAgICAgICAgICAgc3ltYm9sLAogICAgICAgICAgICAiYmlkIiwKICAgICAgICAgICAgZm9yY2VfcmVmcmVzaD1mb3JjZV9yZWZyZXNoLAogICAgICAgICkKCiAgICBhc3luYyBkZWYgYmVzdF9hc2soCiAgICAgICAgc2VsZiwKICAgICAgICBzeW1ib2w6IHN0ciwKICAgICAgICAqLAogICAgICAgIGZvcmNlX3JlZnJlc2g6IGJvb2wgPSBGYWxzZSwKICAgICkgLT4gRGVjaW1hbDoKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5fYmVzdF9zaWRlKAogICAgICAgICAgICBzeW1ib2wsCiAgICAgICAgICAgICJhc2siLAogICAgICAgICAgICBmb3JjZV9yZWZyZXNoPWZvcmNlX3JlZnJlc2gsCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgU2hvcCBSYXRlcwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGRlZiBnZXRfdXNkdF90b21hbl9yYXRlKAogICAgICAgIHNlbGYsCiAgICAgICAgKiwKICAgICAgICBmb3JjZV9yZWZyZXNoOiBib29sID0gRmFsc2UsCiAgICApIC0+IERlY2ltYWw6CiAgICAgICAgIiIiCiAgICAgICAgVVNEVCAtPiBJUlQuCgogICAgICAgIFRhYmRlYWwgdXNlcyB0aGUgVVNEVElSVCBtYXJrZXQgc3ltYm9sLgogICAgICAgIFRoZSBib3QgdHJlYXRzIElSVCBhcyBpdHMgVG9tYW4tZGVub21pbmF0ZWQgd2FsbGV0IHVuaXQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuYmVzdF9hc2soCiAgICAgICAgICAgICJVU0RUSVJUIiwKICAgICAgICAgICAgZm9yY2VfcmVmcmVzaD1mb3JjZV9yZWZyZXNoLAogICAgICAgICkKCiAgICBhc3luYyBkZWYgZ2V0X25hdGl2ZV90b21hbl9yYXRlKAogICAgICAgIHNlbGYsCiAgICAgICAgKiwKICAgICAgICBmb3JjZV9yZWZyZXNoOiBib29sID0gRmFsc2UsCiAgICApIC0+IERlY2ltYWw6CiAgICAgICAgIiIiCiAgICAgICAgUHJpY2UgdGhlIFRPTi1uZXR3b3JrIG5hdGl2ZSBjdXJyZW5jeSBpbiBUb21hbi4KCiAgICAgICAgRGlyZWN0OgogICAgICAgICAgICBHUkFNSVJUIC8gVE9OSVJUCgogICAgICAgIEZhbGxiYWNrOgogICAgICAgICAgICAoR1JBTVVTRFQgLyBUT05VU0RUKSAqIFVTRFRJUlQKICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIG5hdGl2ZV9pcnQsIF8gPSBhd2FpdCBzZWxmLl9uYXRpdmVfYmVzdF9hc2soCiAgICAgICAgICAgICAgICAiSVJUIiwKICAgICAgICAgICAgICAgIGZvcmNlX3JlZnJlc2g9Zm9yY2VfcmVmcmVzaCwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZV9pcnQKCiAgICAgICAgZXhjZXB0IFRhYmRlYWxSYXRlRXJyb3I6CiAgICAgICAgICAgIG5hdGl2ZV91c2R0ID0gYXdhaXQgc2VsZi5nZXRfbmF0aXZlX3VzZHRfcmF0ZSgKICAgICAgICAgICAgICAgIGZvcmNlX3JlZnJlc2g9Zm9yY2VfcmVmcmVzaCwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgdXNkdF9pcnQgPSBhd2FpdCBzZWxmLmdldF91c2R0X3RvbWFuX3JhdGUoCiAgICAgICAgICAgICAgICBmb3JjZV9yZWZyZXNoPWZvcmNlX3JlZnJlc2gsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJlc3VsdCA9ICgKICAgICAgICAgICAgICAgIG5hdGl2ZV91c2R0CiAgICAgICAgICAgICAgICAqIHVzZHRfaXJ0CiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIG5vdCByZXN1bHQuaXNfZmluaXRlKCkKICAgICAgICAgICAgICAgIG9yIHJlc3VsdCA8PSAwCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICByYWlzZSBUYWJkZWFsUmVzcG9uc2VFcnJvcigKICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBkZXJpdmVkIG5hdGl2ZS9Ub21hbiByYXRlLiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICBhc3luYyBkZWYgZ2V0X25hdGl2ZV91c2R0X3JhdGUoCiAgICAgICAgc2VsZiwKICAgICAgICAqLAogICAgICAgIGZvcmNlX3JlZnJlc2g6IGJvb2wgPSBGYWxzZSwKICAgICkgLT4gRGVjaW1hbDoKICAgICAgICAiIiIKICAgICAgICBQcmljZSB0aGUgVE9OLW5ldHdvcmsgbmF0aXZlIGN1cnJlbmN5IGluIFVTRFQuCgogICAgICAgIERpcmVjdDoKICAgICAgICAgICAgR1JBTVVTRFQgLyBUT05VU0RUCgogICAgICAgIEZhbGxiYWNrOgogICAgICAgICAgICBHUkFNSVJUIC8gVE9OSVJUIGJlc3QgYXNrCiAgICAgICAgICAgIGRpdmlkZWQgYnkKICAgICAgICAgICAgVVNEVElSVCBiZXN0IGJpZAogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgbmF0aXZlX3VzZHQsIF8gPSBhd2FpdCBzZWxmLl9uYXRpdmVfYmVzdF9hc2soCiAgICAgICAgICAgICAgICAiVVNEVCIsCiAgICAgICAgICAgICAgICBmb3JjZV9yZWZyZXNoPWZvcmNlX3JlZnJlc2gsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiBuYXRpdmVfdXNkdAoKICAgICAgICBleGNlcHQgVGFiZGVhbFJhdGVFcnJvcjoKICAgICAgICAgICAgbmF0aXZlX2lydCwgc3ltYm9sID0gYXdhaXQgc2VsZi5fbmF0aXZlX2Jlc3RfYXNrKAogICAgICAgICAgICAgICAgIklSVCIsCiAgICAgICAgICAgICAgICBmb3JjZV9yZWZyZXNoPWZvcmNlX3JlZnJlc2gsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHVzZHRfaXJ0X2JpZCA9IGF3YWl0IHNlbGYuYmVzdF9iaWQoCiAgICAgICAgICAgICAgICAiVVNEVElSVCIsCiAgICAgICAgICAgICAgICBmb3JjZV9yZWZyZXNoPWZvcmNlX3JlZnJlc2gsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIHVzZHRfaXJ0X2JpZCA8PSAwOgogICAgICAgICAgICAgICAgcmFpc2UgVGFiZGVhbFJlc3BvbnNlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgVVNEVElSVCBiaWQuIgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmVzdWx0ID0gKAogICAgICAgICAgICAgICAgbmF0aXZlX2lydAogICAgICAgICAgICAgICAgLyB1c2R0X2lydF9iaWQKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgbm90IHJlc3VsdC5pc19maW5pdGUoKQogICAgICAgICAgICAgICAgb3IgcmVzdWx0IDw9IDAKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHJhaXNlIFRhYmRlYWxSZXNwb25zZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGRlcml2ZWQgbmF0aXZlL1VTRFQgcmF0ZS4iCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJUYWJkZWFsIG5hdGl2ZS9VU0RUIGRlcml2ZWQgfCAiCiAgICAgICAgICAgICAgICAibmF0aXZlX21hcmtldD0lcyB1c2R0X21hcmtldD1VU0RUSVJUIiwKICAgICAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGFzeW5jIGRlZiBnZXRfdG9uX3RvbWFuX3JhdGUoCiAgICAgICAgc2VsZiwKICAgICAgICAqLAogICAgICAgIGZvcmNlX3JlZnJlc2g6IGJvb2wgPSBGYWxzZSwKICAgICkgLT4gRGVjaW1hbDoKICAgICAgICAiIiIKICAgICAgICBCYWNrd2FyZC1jb21wYXRpYmxlIGFsaWFzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBhd2FpdCBzZWxmLmdldF9uYXRpdmVfdG9tYW5fcmF0ZSgKICAgICAgICAgICAgZm9yY2VfcmVmcmVzaD1mb3JjZV9yZWZyZXNoLAogICAgICAgICkKCiAgICBhc3luYyBkZWYgZ2V0X3Rvbl91c2R0X3JhdGUoCiAgICAgICAgc2VsZiwKICAgICAgICAqLAogICAgICAgIGZvcmNlX3JlZnJlc2g6IGJvb2wgPSBGYWxzZSwKICAgICkgLT4gRGVjaW1hbDoKICAgICAgICAiIiIKICAgICAgICBCYWNrd2FyZC1jb21wYXRpYmxlIGFsaWFzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBhd2FpdCBzZWxmLmdldF9uYXRpdmVfdXNkdF9yYXRlKAogICAgICAgICAgICBmb3JjZV9yZWZyZXNoPWZvcmNlX3JlZnJlc2gsCiAgICAgICAgKQoKICAgIGFzeW5jIGRlZiBnZXRfc2hvcF9yYXRlcygKICAgICAgICBzZWxmLAogICAgICAgICosCiAgICAgICAgZm9yY2VfcmVmcmVzaDogYm9vbCA9IEZhbHNlLAogICAgKSAtPiBkaWN0W3N0ciwgRGVjaW1hbF06CiAgICAgICAgIiIiCiAgICAgICAgRmV0Y2ggcmF0ZXMgcmVxdWlyZWQgZm9yIE1hcmtldEFwcCBwcmljZSBjb252ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIHVzZHRfdG9tYW4sIHRvbl91c2R0ID0gKAogICAgICAgICAgICBhd2FpdCBhc3luY2lvLmdhdGhlcigKICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3VzZHRfdG9tYW5fcmF0ZSgKICAgICAgICAgICAgICAgICAgICBmb3JjZV9yZWZyZXNoPWZvcmNlX3JlZnJlc2gsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgc2VsZi5nZXRfdG9uX3VzZHRfcmF0ZSgKICAgICAgICAgICAgICAgICAgICBmb3JjZV9yZWZyZXNoPWZvcmNlX3JlZnJlc2gsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAidXNkdF90b21hbiI6CiAgICAgICAgICAgICAgICB1c2R0X3RvbWFuLAoKICAgICAgICAgICAgIm5hdGl2ZV91c2R0IjoKICAgICAgICAgICAgICAgIHRvbl91c2R0LAoKICAgICAgICAgICAgIyBFeGlzdGluZyBwcm9qZWN0IGNvbXBhdGliaWxpdHkuCiAgICAgICAgICAgICJ0b25fdXNkdCI6CiAgICAgICAgICAgICAgICB0b25fdXNkdCwKICAgICAgICB9CgoKX19hbGxfXyA9IFsKICAgICJUYWJkZWFsUmF0ZVNlcnZpY2UiLAogICAgIlRhYmRlYWxRdW90ZSIsCiAgICAiVGFiZGVhbFJhdGVFcnJvciIsCiAgICAiVGFiZGVhbENvbm5lY3Rpb25FcnJvciIsCiAgICAiVGFiZGVhbFJlc3BvbnNlRXJyb3IiLAogICAgIlRhYmRlYWxNYXJrZXRVbmF2YWlsYWJsZUVycm9yIiwKXQo=', 'states/order.py': 'IyBzdGF0ZXMvb3JkZXIucHkKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmZyb20gdHlwaW5nIGltcG9ydCBGaW5hbAoKZnJvbSBhaW9ncmFtLmZzbS5zdGF0ZSBpbXBvcnQgU3RhdGUsIFN0YXRlc0dyb3VwCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBVc2VyIE9yZGVyIEZTTQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgT3JkZXJTdGF0ZXMoU3RhdGVzR3JvdXApOgogICAgIiIiCiAgICBTdGF0ZdmH2KfbjCDZhdmI2YLYqtuMINqv2YHYquKAjNmI2q/ZiNuMINiz2YHYp9ix2LQg2qnYp9ix2KjYsS4KCiAgICDZhtqp2KrZhyDYqNiz24zYp9ixINmF2YfZhToKICAgICAgICBGU00g2YXZhtio2Lkg2K3ZgtuM2YLYqiDYs9mB2KfYsdi0INmG24zYs9iqLgoKICAgINmI2LbYuduM2Kog2YjYp9mC2LnbjCDYs9mB2KfYsdi0INio2LnYryDYp9iyINir2KjYqiDYr9ix2K7ZiNin2LPYqiDYqNin24zYryDYr9ixOgogICAgICAgIG9yZGVycy5zdGF0dXMKCiAgICDYsNiu24zYsdmHINi02YjYryDYqtinIFJlc3RhcnQg2LHYqNin2Kog2KjYp9i52Ksg2q/ZhSDYtNiv2YYg2YjYtti524zYqiDYs9mB2KfYsdi0INmG2LTZiNivLgoKICAgINis2LHbjNin2YYg2KfYtdmE24wgT3duZXIgQXBwcm92YWw6CgogICAgICAgIHNlbGVjdGluZ19wYWNrYWdlCiAgICAgICAgICAgIOKGkwogICAgICAgIHdhaXRpbmdfZm9yX2Ftb3VudCAvIHdhaXRpbmdfZm9yX2R1cmF0aW9uCiAgICAgICAgICAgIOKGkwogICAgICAgIHdhaXRpbmdfZm9yX3RhcmdldF9hY2NvdW50CiAgICAgICAgICAgIOKGkwogICAgICAgIHJldmlld2luZ19vcmRlcgogICAgICAgICAgICDihpMKICAgICAgICB3YWl0aW5nX2Zvcl9yZXF1ZXN0X2NvbmZpcm1hdGlvbgogICAgICAgICAgICDihpMKICAgICAgICDYs9mB2KfYsdi0INiv2LEgREI6CiAgICAgICAgICAgIHBlbmRpbmdfb3duZXJfYXBwcm92YWwKCiAgICDYqNi52K8g2KfYsiDYq9io2Kog2K/YsSBEQiDZhdi52YXZiNmE2KfZiyBGU00g2qnYp9ix2KjYsSBjbGVhciDZhduM4oCM2LTZiNivLgogICAgIiIiCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBQcm9kdWN0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgc2VsZWN0aW5nX3BhY2thZ2UgPSBTdGF0ZSgpCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBBbW91bnQgLyBEdXJhdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHdhaXRpbmdfZm9yX2Ftb3VudCA9IFN0YXRlKCkKCiAgICAjIExlZ2FjeSBjb21wYXRpYmlsaXR5CiAgICB3YWl0aW5nX2Zvcl9jdXN0b21fYW1vdW50ID0gU3RhdGUoKQoKICAgIHdhaXRpbmdfZm9yX2R1cmF0aW9uID0gU3RhdGUoKQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgVGFyZ2V0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgd2FpdGluZ19mb3JfdGFyZ2V0X2FjY291bnQgPSBTdGF0ZSgpCgogICAgIyBMZWdhY3kgYWxpYXNlcyB1c2VkIGJ5IG9sZGVyIGhhbmRsZXJzCiAgICB3YWl0aW5nX2Zvcl90YXJnZXQgPSBTdGF0ZSgpCiAgICB3YWl0aW5nX2Zvcl91c2VybmFtZSA9IFN0YXRlKCkKICAgIHdhaXRpbmdfZm9yX3JlY2lwaWVudCA9IFN0YXRlKCkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFJldmlldyAvIFVzZXIgQ29uZmlybWF0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgcmV2aWV3aW5nX29yZGVyID0gU3RhdGUoKQoKICAgIHdhaXRpbmdfZm9yX3JlcXVlc3RfY29uZmlybWF0aW9uID0gU3RhdGUoKQoKICAgICMgTGVnYWN5IG5hbWU6CiAgICAjINiv2LEg2YXYudmF2KfYsduMINis2K/bjNivINin24zZhiBTdGF0ZSDYr9uM2q/YsSDYqNmHINmF2LnZhtuMINm+2LHYr9in2K7YqiDZhtuM2LPYqtibCiAgICAjINmB2YLYtyDYqNix2KfbjCDYtNqp2LPYqtmHINmG2LTYr9mGIEhhbmRsZXLZh9in24wg2YLYqNmE24wg2Ybar9mHINiv2KfYtNiq2Ycg2LTYr9mHLgogICAgd2FpdGluZ19mb3JfcGF5bWVudF9jb25maXJtYXRpb24gPSBTdGF0ZSgpCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBPd25lciBBcHByb3ZhbAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHdhaXRpbmdfZm9yX293bmVyX2FwcHJvdmFsID0gU3RhdGUoKQoKICAgIG93bmVyX3JlamVjdGVkID0gU3RhdGUoKQoKICAgIHZhbGlkYXRpbmdfZmluYWxfb3JkZXIgPSBTdGF0ZSgpCgogICAgcHJpY2VfY2hhbmdlZCA9IFN0YXRlKCkKCiAgICBpbnN1ZmZpY2llbnRfYmFsYW5jZSA9IFN0YXRlKCkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFBheW1lbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBwcm9jZXNzaW5nX3BheW1lbnQgPSBTdGF0ZSgpCgogICAgIyBDcnlwdG8gLyBleHRlcm5hbCBwYXltZW50cwogICAgd2FpdGluZ19mb3JfcGF5bWVudCA9IFN0YXRlKCkKCiAgICB2ZXJpZnlpbmdfcGF5bWVudCA9IFN0YXRlKCkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFByb3ZpZGVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgcHJvY2Vzc2luZ19wcm92aWRlciA9IFN0YXRlKCkKCiAgICAjIExlZ2FjeSBnZW5lcmljIG5hbWUKICAgIHByb2Nlc3Npbmdfb3JkZXIgPSBTdGF0ZSgpCgogICAgd2FpdGluZ19mb3JfcHJvdmlkZXIgPSBTdGF0ZSgpCgogICAgcHJvdmlkZXJfc3RhdHVzX3Vua25vd24gPSBTdGF0ZSgpCgogICAgIyDZgdmC2Lcg2KjYsdin24wgUHJvdmlkZXLZh9in24zbjCDaqdmHIGVuZHBvaW50INix2LPZhduMINin2LPYqti52YTYp9mFINiv2KfYsdmG2K8uCiAgICAjINio2LHYp9uMIE1hcmtldEFwcCDZgdi52YTbjCDZhtio2KfbjNivINio2K/ZiNmGIGVuZHBvaW50INix2LPZhduMINin2LIg2KLZhiDYp9iz2KrZgdin2K/ZhyDYtNmI2K8uCiAgICBjaGVja2luZ19vcmRlcl9zdGF0dXMgPSBTdGF0ZSgpCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBGaW5hbCBVSSBTdGF0ZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBvcmRlcl9jb21wbGV0ZWQgPSBTdGF0ZSgpCgogICAgb3JkZXJfZmFpbGVkID0gU3RhdGUoKQoKICAgIG9yZGVyX2NhbmNlbGxlZCA9IFN0YXRlKCkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFN1cHBvcnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICB3YWl0aW5nX2Zvcl9zdXBwb3J0ID0gU3RhdGUoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGF5bWVudCBGU00KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmNsYXNzIFBheW1lbnRTdGF0ZXMoU3RhdGVzR3JvdXApOgogICAgIiIiCiAgICBTdGF0ZdmH2KfbjCDZhdiz2KrZgtmEINm+2LHYr9in2K7Yqi4KCiAgICDYqNix2KfbjCBXYWxsZXQg2K/Yp9iu2YTbjCBQcmVtaXVtL1N0YXJzINmF2LnZhdmI2YTYp9mLINin24zZhiBTdGF0ZdmH2Kcg2YTYp9iy2YUKICAgINmG24zYs9iq2YbYr9ibINio24zYtNiq2LEg2KjYsdin24wgVE9OIC8gVFJYIC8gVVNEVCDZiCDZvtix2K/Yp9iu2Kog2K7Yp9ix2KzbjOKAjNin2YbYry4KICAgICIiIgoKICAgIHNlbGVjdGluZ19tZXRob2QgPSBTdGF0ZSgpCgogICAgd2FpdGluZ19mb3JfdHJhbnNhY3Rpb25faGFzaCA9IFN0YXRlKCkKCiAgICB2ZXJpZnlpbmdfdHJhbnNhY3Rpb24gPSBTdGF0ZSgpCgogICAgcGF5bWVudF9jb25maXJtZWQgPSBTdGF0ZSgpCgogICAgcGF5bWVudF9mYWlsZWQgPSBTdGF0ZSgpCgogICAgcGF5bWVudF9leHBpcmVkID0gU3RhdGUoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQWRtaW4gLyBPd25lciBPcmRlciBGU00KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmNsYXNzIEFkbWluT3JkZXJTdGF0ZXMoU3RhdGVzR3JvdXApOgogICAgIiIiCiAgICBTdGF0ZdmH2KfbjCDahtmG2K/Zhdix2K3ZhNmH4oCM2KfbjCDZhdiv24zYsduM2Kog2LPZgdin2LHYtC4KCiAgICDYqtin24zbjNivL9ix2K8g2LPYp9iv2YcgT3duZXIg2KjYpyBjYWxsYmFjayDZiCDZiNi22LnbjNiqINiv24zYqtin2KjbjNizINin2YbYrNin2YUg2YXbjOKAjNi02YjYrwogICAg2Ygg2KfZhNiy2KfZhdin2Ysg2YbbjNin2LLbjCDYqNmHIEZTTSDZhtiv2KfYsdivLgogICAgIiIiCgogICAgc2VhcmNoaW5nX29yZGVyID0gU3RhdGUoKQoKICAgIHZpZXdpbmdfb3JkZXIgPSBTdGF0ZSgpCgogICAgcmV2aWV3aW5nX293bmVyX3JlcXVlc3QgPSBTdGF0ZSgpCgogICAgY29uZmlybWluZ19hcHByb3ZhbCA9IFN0YXRlKCkKCiAgICBlbnRlcmluZ19yZWplY3RfcmVhc29uID0gU3RhdGUoKQoKICAgIGNoYW5naW5nX29yZGVyX3N0YXR1cyA9IFN0YXRlKCkKCiAgICBlbnRlcmluZ19hZG1pbl9ub3RlID0gU3RhdGUoKQoKICAgIHJlc29sdmluZ19wcm92aWRlcl91bmtub3duID0gU3RhdGUoKQoKICAgIGNvbmZpcm1pbmdfbWFudWFsX3JlZnVuZCA9IFN0YXRlKCkKCiAgICBjb25maXJtaW5nX21hbnVhbF9jb21wbGV0aW9uID0gU3RhdGUoKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGVyc2lzdGVudCBEQiBPcmRlciBTdGF0dXNlcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgT3JkZXJTdGF0dXM6CiAgICAiIiIKICAgINmI2LbYuduM2KrigIzZh9in24wg2K/Yp9im2YXbjCBvcmRlcnMuc3RhdHVzLgoKICAgINin24zZhiDaqdmE2KfYsyBTdGF0ZXNHcm91cCDZhtuM2LPYqi4KCiAgICDZhdiz24zYsSDYp9i12YTbjDoKCiAgICAgICAgcGVuZGluZ19vd25lcl9hcHByb3ZhbAogICAgICAgICAgICDihpMKICAgICAgICBvd25lcl9wcm9jZXNzaW5nCiAgICAgICAgICAgIOKGkwogICAgICAgIHByb3ZpZGVyX3Byb2Nlc3NpbmcKICAgICAgICAgICAg4oaTCiAgICAgICAgY29tcGxldGVkCgogICAg2YXYs9uM2LHZh9in24wg2KzYp9uM2q/YstuM2YY6CgogICAgICAgIHJlamVjdGVkX2J5X293bmVyCiAgICAgICAgcHJpY2VfY2hhbmdlZAogICAgICAgIGluc3VmZmljaWVudF9iYWxhbmNlCiAgICAgICAgZmFpbGVkX3JlZnVuZGVkCiAgICAgICAgZmFpbGVkX3JlZnVuZF9yZXF1aXJlZAogICAgICAgIHByb3ZpZGVyX3N0YXR1c191bmtub3duCiAgICAiIiIKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIE93bmVyIEFwcHJvdmFsCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgUEVORElOR19PV05FUl9BUFBST1ZBTDogRmluYWxbc3RyXSA9ICgKICAgICAgICAicGVuZGluZ19vd25lcl9hcHByb3ZhbCIKICAgICkKCiAgICBPV05FUl9QUk9DRVNTSU5HOiBGaW5hbFtzdHJdID0gKAogICAgICAgICJvd25lcl9wcm9jZXNzaW5nIgogICAgKQoKICAgIFJFSkVDVEVEX0JZX09XTkVSOiBGaW5hbFtzdHJdID0gKAogICAgICAgICJyZWplY3RlZF9ieV9vd25lciIKICAgICkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFZhbGlkYXRpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBQUklDRV9DSEFOR0VEOiBGaW5hbFtzdHJdID0gKAogICAgICAgICJwcmljZV9jaGFuZ2VkIgogICAgKQoKICAgIElOU1VGRklDSUVOVF9CQUxBTkNFOiBGaW5hbFtzdHJdID0gKAogICAgICAgICJpbnN1ZmZpY2llbnRfYmFsYW5jZSIKICAgICkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFByb3ZpZGVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgUFJPVklERVJfUFJPQ0VTU0lORzogRmluYWxbc3RyXSA9ICgKICAgICAgICAicHJvdmlkZXJfcHJvY2Vzc2luZyIKICAgICkKCiAgICBQUk9WSURFUl9TVEFUVVNfVU5LTk9XTjogRmluYWxbc3RyXSA9ICgKICAgICAgICAicHJvdmlkZXJfc3RhdHVzX3Vua25vd24iCiAgICApCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBGaW5hbAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIENPTVBMRVRFRDogRmluYWxbc3RyXSA9ICgKICAgICAgICAiY29tcGxldGVkIgogICAgKQoKICAgIEZBSUxFRF9SRUZVTkRFRDogRmluYWxbc3RyXSA9ICgKICAgICAgICAiZmFpbGVkX3JlZnVuZGVkIgogICAgKQoKICAgIEZBSUxFRF9SRUZVTkRfUkVRVUlSRUQ6IEZpbmFsW3N0cl0gPSAoCiAgICAgICAgImZhaWxlZF9yZWZ1bmRfcmVxdWlyZWQiCiAgICApCgogICAgQ0FOQ0VMTEVEOiBGaW5hbFtzdHJdID0gKAogICAgICAgICJjYW5jZWxsZWQiCiAgICApCgogICAgUkVGVU5ERUQ6IEZpbmFsW3N0cl0gPSAoCiAgICAgICAgInJlZnVuZGVkIgogICAgKQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgTGVnYWN5IERCIHN0YXR1c2VzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgUEVORElORzogRmluYWxbc3RyXSA9ICgKICAgICAgICAicGVuZGluZyIKICAgICkKCiAgICBQUk9DRVNTSU5HOiBGaW5hbFtzdHJdID0gKAogICAgICAgICJwcm9jZXNzaW5nIgogICAgKQoKICAgIFBBSUQ6IEZpbmFsW3N0cl0gPSAoCiAgICAgICAgInBhaWQiCiAgICApCgogICAgRkFJTEVEOiBGaW5hbFtzdHJdID0gKAogICAgICAgICJmYWlsZWQiCiAgICApCgogICAgQ1JFQVRFRDogRmluYWxbc3RyXSA9ICgKICAgICAgICAiY3JlYXRlZCIKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFZhbGlkIERCIFN0YXR1c2VzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpPUkRFUl9EQl9TVEFUVVNFUzogRmluYWxbCiAgICBmcm96ZW5zZXRbc3RyXQpdID0gZnJvemVuc2V0KAogICAgewogICAgICAgIE9yZGVyU3RhdHVzLlBFTkRJTkdfT1dORVJfQVBQUk9WQUwsCiAgICAgICAgT3JkZXJTdGF0dXMuT1dORVJfUFJPQ0VTU0lORywKICAgICAgICBPcmRlclN0YXR1cy5SRUpFQ1RFRF9CWV9PV05FUiwKCiAgICAgICAgT3JkZXJTdGF0dXMuUFJJQ0VfQ0hBTkdFRCwKICAgICAgICBPcmRlclN0YXR1cy5JTlNVRkZJQ0lFTlRfQkFMQU5DRSwKCiAgICAgICAgT3JkZXJTdGF0dXMuUFJPVklERVJfUFJPQ0VTU0lORywKICAgICAgICBPcmRlclN0YXR1cy5QUk9WSURFUl9TVEFUVVNfVU5LTk9XTiwKCiAgICAgICAgT3JkZXJTdGF0dXMuQ09NUExFVEVELAogICAgICAgIE9yZGVyU3RhdHVzLkZBSUxFRF9SRUZVTkRFRCwKICAgICAgICBPcmRlclN0YXR1cy5GQUlMRURfUkVGVU5EX1JFUVVJUkVELAogICAgICAgIE9yZGVyU3RhdHVzLkNBTkNFTExFRCwKICAgICAgICBPcmRlclN0YXR1cy5SRUZVTkRFRCwKCiAgICAgICAgIyBMZWdhY3kKICAgICAgICBPcmRlclN0YXR1cy5QRU5ESU5HLAogICAgICAgIE9yZGVyU3RhdHVzLlBST0NFU1NJTkcsCiAgICAgICAgT3JkZXJTdGF0dXMuUEFJRCwKICAgICAgICBPcmRlclN0YXR1cy5GQUlMRUQsCiAgICAgICAgT3JkZXJTdGF0dXMuQ1JFQVRFRCwKICAgIH0KKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgU3RhdHVzIEdyb3VwcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT1dORVJfUEVORElOR19TVEFUVVNFUzogRmluYWxbCiAgICBmcm96ZW5zZXRbc3RyXQpdID0gZnJvemVuc2V0KAogICAgewogICAgICAgIE9yZGVyU3RhdHVzLlBFTkRJTkdfT1dORVJfQVBQUk9WQUwsCiAgICB9CikKCgpQUk9DRVNTSU5HX1NUQVRVU0VTOiBGaW5hbFsKICAgIGZyb3plbnNldFtzdHJdCl0gPSBmcm96ZW5zZXQoCiAgICB7CiAgICAgICAgT3JkZXJTdGF0dXMuT1dORVJfUFJPQ0VTU0lORywKICAgICAgICBPcmRlclN0YXR1cy5QUk9WSURFUl9QUk9DRVNTSU5HLAogICAgfQopCgoKU1VDQ0VTU19TVEFUVVNFUzogRmluYWxbCiAgICBmcm96ZW5zZXRbc3RyXQpdID0gZnJvemVuc2V0KAogICAgewogICAgICAgIE9yZGVyU3RhdHVzLkNPTVBMRVRFRCwKICAgIH0KKQoKCkZBSUxVUkVfU1RBVFVTRVM6IEZpbmFsWwogICAgZnJvemVuc2V0W3N0cl0KXSA9IGZyb3plbnNldCgKICAgIHsKICAgICAgICBPcmRlclN0YXR1cy5SRUpFQ1RFRF9CWV9PV05FUiwKICAgICAgICBPcmRlclN0YXR1cy5QUklDRV9DSEFOR0VELAogICAgICAgIE9yZGVyU3RhdHVzLklOU1VGRklDSUVOVF9CQUxBTkNFLAogICAgICAgIE9yZGVyU3RhdHVzLkZBSUxFRF9SRUZVTkRFRCwKICAgICAgICBPcmRlclN0YXR1cy5GQUlMRURfUkVGVU5EX1JFUVVJUkVELAogICAgICAgIE9yZGVyU3RhdHVzLkNBTkNFTExFRCwKICAgIH0KKQoKCk1BTlVBTF9SRVZJRVdfU1RBVFVTRVM6IEZpbmFsWwogICAgZnJvemVuc2V0W3N0cl0KXSA9IGZyb3plbnNldCgKICAgIHsKICAgICAgICBPcmRlclN0YXR1cy5QUk9WSURFUl9TVEFUVVNfVU5LTk9XTiwKICAgICAgICBPcmRlclN0YXR1cy5GQUlMRURfUkVGVU5EX1JFUVVJUkVELAogICAgfQopCgoKVEVSTUlOQUxfU1RBVFVTRVM6IEZpbmFsWwogICAgZnJvemVuc2V0W3N0cl0KXSA9IGZyb3plbnNldCgKICAgIHsKICAgICAgICBPcmRlclN0YXR1cy5SRUpFQ1RFRF9CWV9PV05FUiwKICAgICAgICBPcmRlclN0YXR1cy5QUklDRV9DSEFOR0VELAogICAgICAgIE9yZGVyU3RhdHVzLklOU1VGRklDSUVOVF9CQUxBTkNFLAogICAgICAgIE9yZGVyU3RhdHVzLkNPTVBMRVRFRCwKICAgICAgICBPcmRlclN0YXR1cy5GQUlMRURfUkVGVU5ERUQsCiAgICAgICAgT3JkZXJTdGF0dXMuQ0FOQ0VMTEVELAogICAgICAgIE9yZGVyU3RhdHVzLlJFRlVOREVELAoKICAgICAgICAjIExlZ2FjeSB0ZXJtaW5hbCBzdGF0dXNlcwogICAgICAgIE9yZGVyU3RhdHVzLkZBSUxFRCwKICAgIH0KKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgSHVtYW4tcmVhZGFibGUgREIgU3RhdHVzIE5hbWVzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpPUkRFUl9TVEFUVVNfTkFNRVM6IEZpbmFsWwogICAgZGljdFtzdHIsIHN0cl0KXSA9IHsKICAgIE9yZGVyU3RhdHVzLlBFTkRJTkdfT1dORVJfQVBQUk9WQUw6CiAgICAgICAgItiv2LEg2KfZhtiq2LjYp9ixINiq2KfbjNuM2K8g2YXYp9mE2qkiLAoKICAgIE9yZGVyU3RhdHVzLk9XTkVSX1BST0NFU1NJTkc6CiAgICAgICAgItiv2LEg2K3Yp9mEINio2LHYsdiz24wg2KrZiNiz2Lcg2YXYp9mE2qkiLAoKICAgIE9yZGVyU3RhdHVzLlJFSkVDVEVEX0JZX09XTkVSOgogICAgICAgICLYsdivINi02K/ZhyDYqtmI2LPYtyDZhdin2YTaqSIsCgogICAgT3JkZXJTdGF0dXMuUFJJQ0VfQ0hBTkdFRDoKICAgICAgICAi2YLbjNmF2Kog2KrYutuM24zYsSDaqdix2K/ZhyIsCgogICAgT3JkZXJTdGF0dXMuSU5TVUZGSUNJRU5UX0JBTEFOQ0U6CiAgICAgICAgItmF2YjYrNmI2K/bjCDZhtin2qnYp9mB24wiLAoKICAgIE9yZGVyU3RhdHVzLlBST1ZJREVSX1BST0NFU1NJTkc6CiAgICAgICAgItiv2LEg2K3Yp9mEINm+2LHYr9in2LLYtCBNYXJrZXRBcHAiLAoKICAgIE9yZGVyU3RhdHVzLlBST1ZJREVSX1NUQVRVU19VTktOT1dOOgogICAgICAgICLZhtuM2KfYstmF2YbYryDYqNix2LHYs9uMINiv2LPYqtuMIE1hcmtldEFwcCIsCgogICAgT3JkZXJTdGF0dXMuQ09NUExFVEVEOgogICAgICAgICLYqtqp2YXbjNmEINi02K/ZhyIsCgogICAgT3JkZXJTdGF0dXMuRkFJTEVEX1JFRlVOREVEOgogICAgICAgICLZhtin2YXZiNmB2YIgLSDZhdio2YTYuiDYqNix2q/YtNiqINiv2KfYr9mHINi02K8iLAoKICAgIE9yZGVyU3RhdHVzLkZBSUxFRF9SRUZVTkRfUkVRVUlSRUQ6CiAgICAgICAgItmG2KfZhdmI2YHZgiAtINmG24zYp9iy2YXZhtivINio2LHYsdiz24wg2YXYp9mE24wiLAoKICAgIE9yZGVyU3RhdHVzLkNBTkNFTExFRDoKICAgICAgICAi2YTYutmIINi02K/ZhyIsCgogICAgT3JkZXJTdGF0dXMuUkVGVU5ERUQ6CiAgICAgICAgItmF2KjZhNi6INio2LHar9i02Kog2K/Yp9iv2Ycg2LTYryIsCgogICAgIyBMZWdhY3kKICAgIE9yZGVyU3RhdHVzLlBFTkRJTkc6CiAgICAgICAgItiv2LEg2KfZhtiq2LjYp9ixIiwKCiAgICBPcmRlclN0YXR1cy5QUk9DRVNTSU5HOgogICAgICAgICLYr9ixINit2KfZhCDZvtix2K/Yp9iy2LQiLAoKICAgIE9yZGVyU3RhdHVzLlBBSUQ6CiAgICAgICAgItm+2LHYr9in2K7YqiDYtNiv2YciLAoKICAgIE9yZGVyU3RhdHVzLkZBSUxFRDoKICAgICAgICAi2YbYp9mF2YjZgdmCIiwKCiAgICBPcmRlclN0YXR1cy5DUkVBVEVEOgogICAgICAgICLYp9uM2KzYp9ivINi02K/ZhyIsCn0KCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEh1bWFuLXJlYWRhYmxlIFVzZXIgRlNNIE5hbWVzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpPUkRFUl9TVEFURV9OQU1FUzogRmluYWxbCiAgICBkaWN0W3N0ciwgc3RyXQpdID0gewogICAgInNlbGVjdGluZ19wYWNrYWdlIjoKICAgICAgICAi2KfZhtiq2K7Yp9ioINm+2qnbjNisIiwKCiAgICAid2FpdGluZ19mb3JfYW1vdW50IjoKICAgICAgICAi2K/YsduM2KfZgdiqINmF2YLYr9in2LEiLAoKICAgICJ3YWl0aW5nX2Zvcl9jdXN0b21fYW1vdW50IjoKICAgICAgICAi2K/YsduM2KfZgdiqINmF2YLYr9in2LEg2K/ZhNiu2YjYp9mHIiwKCiAgICAid2FpdGluZ19mb3JfZHVyYXRpb24iOgogICAgICAgICLYr9ix24zYp9mB2Kog2YXYr9iqIiwKCiAgICAid2FpdGluZ19mb3JfdGFyZ2V0X2FjY291bnQiOgogICAgICAgICLYr9ix24zYp9mB2Kog2YXZgti12K8iLAoKICAgICJ3YWl0aW5nX2Zvcl90YXJnZXQiOgogICAgICAgICLYr9ix24zYp9mB2Kog2YXZgti12K8iLAoKICAgICJ3YWl0aW5nX2Zvcl91c2VybmFtZSI6CiAgICAgICAgItiv2LHbjNin2YHYqiDbjNmI2LLYsdmG24zZhSIsCgogICAgIndhaXRpbmdfZm9yX3JlY2lwaWVudCI6CiAgICAgICAgItiv2LHbjNin2YHYqiDar9uM2LHZhtiv2YciLAoKICAgICJyZXZpZXdpbmdfb3JkZXIiOgogICAgICAgICLYqNin2LLYqNuM2YbbjCDYs9mB2KfYsdi0IiwKCiAgICAid2FpdGluZ19mb3JfcmVxdWVzdF9jb25maXJtYXRpb24iOgogICAgICAgICLYp9mG2KrYuNin2LEg2KrYp9uM24zYryDYq9io2Kog2K/Ysdiu2YjYp9iz2KoiLAoKICAgICJ3YWl0aW5nX2Zvcl9wYXltZW50X2NvbmZpcm1hdGlvbiI6CiAgICAgICAgItin2YbYqti42KfYsSDYqtin24zbjNivINir2KjYqiDYr9ix2K7ZiNin2LPYqiIsCgogICAgIndhaXRpbmdfZm9yX293bmVyX2FwcHJvdmFsIjoKICAgICAgICAi2K/YsSDYp9mG2KrYuNin2LEg2KrYp9uM24zYryDZhdin2YTaqSIsCgogICAgIm93bmVyX3JlamVjdGVkIjoKICAgICAgICAi2LHYryDYtNiv2Ycg2KrZiNiz2Lcg2YXYp9mE2qkiLAoKICAgICJ2YWxpZGF0aW5nX2ZpbmFsX29yZGVyIjoKICAgICAgICAi2KjYsdix2LPbjCDZhtmH2KfbjNuMINiz2YHYp9ix2LQiLAoKICAgICJwcmljZV9jaGFuZ2VkIjoKICAgICAgICAi2YLbjNmF2Kog2KrYutuM24zYsSDaqdix2K/ZhyIsCgogICAgImluc3VmZmljaWVudF9iYWxhbmNlIjoKICAgICAgICAi2YXZiNis2YjYr9uMINmG2Kfaqdin2YHbjCIsCgogICAgInByb2Nlc3NpbmdfcGF5bWVudCI6CiAgICAgICAgItm+2LHYr9in2LLYtCDZhdin2YTbjCIsCgogICAgIndhaXRpbmdfZm9yX3BheW1lbnQiOgogICAgICAgICLYp9mG2KrYuNin2LEg2b7Ysdiv2KfYrtiqIiwKCiAgICAidmVyaWZ5aW5nX3BheW1lbnQiOgogICAgICAgICLYqNix2LHYs9uMINm+2LHYr9in2K7YqiIsCgogICAgInByb2Nlc3NpbmdfcHJvdmlkZXIiOgogICAgICAgICLZvtix2K/Yp9iy2LQg2LPYsdmI24zYs+KAjNiv2YfZhtiv2YciLAoKICAgICJwcm9jZXNzaW5nX29yZGVyIjoKICAgICAgICAi2b7Ysdiv2KfYsti0INiz2YHYp9ix2LQiLAoKICAgICJ3YWl0aW5nX2Zvcl9wcm92aWRlciI6CiAgICAgICAgItin2YbYqti42KfYsSDZvtin2LPYriDYs9ix2YjbjNiz4oCM2K/Zh9mG2K/ZhyIsCgogICAgInByb3ZpZGVyX3N0YXR1c191bmtub3duIjoKICAgICAgICAi2YjYtti524zYqiDYs9ix2YjbjNiz4oCM2K/Zh9mG2K/ZhyDZhtin2YXYtNiu2LUiLAoKICAgICJjaGVja2luZ19vcmRlcl9zdGF0dXMiOgogICAgICAgICLYqNix2LHYs9uMINmI2LbYuduM2Kog2LPZgdin2LHYtCIsCgogICAgIm9yZGVyX2NvbXBsZXRlZCI6CiAgICAgICAgItiz2YHYp9ix2LQg2KraqdmF24zZhCDYtNivIiwKCiAgICAib3JkZXJfZmFpbGVkIjoKICAgICAgICAi2LPZgdin2LHYtCDZhtin2YXZiNmB2YIiLAoKICAgICJvcmRlcl9jYW5jZWxsZWQiOgogICAgICAgICLYs9mB2KfYsdi0INmE2LrZiCDYtNivIiwKCiAgICAid2FpdGluZ19mb3Jfc3VwcG9ydCI6CiAgICAgICAgItin2YbYqti42KfYsSDZvti02KrbjNio2KfZhtuMIiwKfQoKClBBWU1FTlRfU1RBVEVfTkFNRVM6IEZpbmFsWwogICAgZGljdFtzdHIsIHN0cl0KXSA9IHsKICAgICJzZWxlY3RpbmdfbWV0aG9kIjoKICAgICAgICAi2KfZhtiq2K7Yp9ioINix2YjYtCDZvtix2K/Yp9iu2KoiLAoKICAgICJ3YWl0aW5nX2Zvcl90cmFuc2FjdGlvbl9oYXNoIjoKICAgICAgICAi2KfZhtiq2LjYp9ixINi02YbYp9iz2Ycg2KrYsdin2qnZhti0IiwKCiAgICAidmVyaWZ5aW5nX3RyYW5zYWN0aW9uIjoKICAgICAgICAi2KjYsdix2LPbjCDYqtix2KfaqdmG2LQiLAoKICAgICJwYXltZW50X2NvbmZpcm1lZCI6CiAgICAgICAgItm+2LHYr9in2K7YqiDYqtin24zbjNivINi02K8iLAoKICAgICJwYXltZW50X2ZhaWxlZCI6CiAgICAgICAgItm+2LHYr9in2K7YqiDZhtin2YXZiNmB2YIiLAoKICAgICJwYXltZW50X2V4cGlyZWQiOgogICAgICAgICLZvtix2K/Yp9iu2Kog2YXZhtmC2LbbjCDYtNivIiwKfQoKCkFETUlOX09SREVSX1NUQVRFX05BTUVTOiBGaW5hbFsKICAgIGRpY3Rbc3RyLCBzdHJdCl0gPSB7CiAgICAic2VhcmNoaW5nX29yZGVyIjoKICAgICAgICAi2KzYs9iq2KzZiNuMINiz2YHYp9ix2LQiLAoKICAgICJ2aWV3aW5nX29yZGVyIjoKICAgICAgICAi2YXYtNin2YfYr9mHINiz2YHYp9ix2LQiLAoKICAgICJyZXZpZXdpbmdfb3duZXJfcmVxdWVzdCI6CiAgICAgICAgItio2LHYsdiz24wg2K/Ysdiu2YjYp9iz2Kog2K7YsduM2K8iLAoKICAgICJjb25maXJtaW5nX2FwcHJvdmFsIjoKICAgICAgICAi2KrYp9uM24zYryDZhtmH2KfbjNuMINmF2KfZhNqpIiwKCiAgICAiZW50ZXJpbmdfcmVqZWN0X3JlYXNvbiI6CiAgICAgICAgItir2KjYqiDYr9mE24zZhCDYsdivIiwKCiAgICAiY2hhbmdpbmdfb3JkZXJfc3RhdHVzIjoKICAgICAgICAi2KrYutuM24zYsSDZiNi22LnbjNiqINiz2YHYp9ix2LQiLAoKICAgICJlbnRlcmluZ19hZG1pbl9ub3RlIjoKICAgICAgICAi2KvYqNiqINuM2KfYr9iv2KfYtNiqINin2K/ZhduM2YYiLAoKICAgICJyZXNvbHZpbmdfcHJvdmlkZXJfdW5rbm93biI6CiAgICAgICAgItio2LHYsdiz24wg2YjYtti524zYqiDZhtin2YXYtNiu2LUgTWFya2V0QXBwIiwKCiAgICAiY29uZmlybWluZ19tYW51YWxfcmVmdW5kIjoKICAgICAgICAi2KrYp9uM24zYryBSZWZ1bmQg2K/Ys9iq24wiLAoKICAgICJjb25maXJtaW5nX21hbnVhbF9jb21wbGV0aW9uIjoKICAgICAgICAi2KrYp9uM24zYryDYqtqp2YXbjNmEINiv2LPYqtuMIiwKfQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgSGVscGVycwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIF9zaG9ydF9zdGF0ZV9uYW1lKAogICAgc3RhdGVfbmFtZTogc3RyIHwgTm9uZSwKKSAtPiBzdHI6CiAgICBpZiBub3Qgc3RhdGVfbmFtZToKICAgICAgICByZXR1cm4gIiIKCiAgICByZXR1cm4gKAogICAgICAgIHN0cihzdGF0ZV9uYW1lKQogICAgICAgIC5zdHJpcCgpCiAgICAgICAgLnNwbGl0KCI6IilbLTFdCiAgICApCgoKZGVmIGdldF9vcmRlcl9zdGF0ZV9uYW1lKAogICAgc3RhdGVfbmFtZTogc3RyIHwgTm9uZSwKKSAtPiBzdHI6CiAgICAiIiIKICAgINmG2KfZhSDZgdin2LHYs9uMIFN0YXRlINqp2KfYsdio2LEuCgogICAg2YbZhdmI2YbZhyDZiNix2YjYr9uMOgogICAgICAgIE9yZGVyU3RhdGVzOndhaXRpbmdfZm9yX3RhcmdldF9hY2NvdW50CiAgICAiIiIKICAgIHNob3J0X25hbWUgPSAoCiAgICAgICAgX3Nob3J0X3N0YXRlX25hbWUoCiAgICAgICAgICAgIHN0YXRlX25hbWUKICAgICAgICApCiAgICApCgogICAgaWYgbm90IHNob3J0X25hbWU6CiAgICAgICAgcmV0dXJuICLZhtin2YXYtNiu2LUiCgogICAgcmV0dXJuIE9SREVSX1NUQVRFX05BTUVTLmdldCgKICAgICAgICBzaG9ydF9uYW1lLAogICAgICAgIHNob3J0X25hbWUsCiAgICApCgoKZGVmIGdldF9wYXltZW50X3N0YXRlX25hbWUoCiAgICBzdGF0ZV9uYW1lOiBzdHIgfCBOb25lLAopIC0+IHN0cjoKICAgIHNob3J0X25hbWUgPSAoCiAgICAgICAgX3Nob3J0X3N0YXRlX25hbWUoCiAgICAgICAgICAgIHN0YXRlX25hbWUKICAgICAgICApCiAgICApCgogICAgaWYgbm90IHNob3J0X25hbWU6CiAgICAgICAgcmV0dXJuICLZhtin2YXYtNiu2LUiCgogICAgcmV0dXJuIFBBWU1FTlRfU1RBVEVfTkFNRVMuZ2V0KAogICAgICAgIHNob3J0X25hbWUsCiAgICAgICAgc2hvcnRfbmFtZSwKICAgICkKCgpkZWYgZ2V0X2FkbWluX29yZGVyX3N0YXRlX25hbWUoCiAgICBzdGF0ZV9uYW1lOiBzdHIgfCBOb25lLAopIC0+IHN0cjoKICAgIHNob3J0X25hbWUgPSAoCiAgICAgICAgX3Nob3J0X3N0YXRlX25hbWUoCiAgICAgICAgICAgIHN0YXRlX25hbWUKICAgICAgICApCiAgICApCgogICAgaWYgbm90IHNob3J0X25hbWU6CiAgICAgICAgcmV0dXJuICLZhtin2YXYtNiu2LUiCgogICAgcmV0dXJuIEFETUlOX09SREVSX1NUQVRFX05BTUVTLmdldCgKICAgICAgICBzaG9ydF9uYW1lLAogICAgICAgIHNob3J0X25hbWUsCiAgICApCgoKZGVmIG5vcm1hbGl6ZV9vcmRlcl9zdGF0dXMoCiAgICBzdGF0dXM6IHN0ciB8IE5vbmUsCikgLT4gc3RyOgogICAgaWYgbm90IHN0YXR1czoKICAgICAgICByZXR1cm4gIiIKCiAgICByZXR1cm4gKAogICAgICAgIHN0cihzdGF0dXMpCiAgICAgICAgLnN0cmlwKCkKICAgICAgICAubG93ZXIoKQogICAgKQoKCmRlZiBnZXRfb3JkZXJfc3RhdHVzX25hbWUoCiAgICBzdGF0dXM6IHN0ciB8IE5vbmUsCikgLT4gc3RyOgogICAgbm9ybWFsaXplZCA9ICgKICAgICAgICBub3JtYWxpemVfb3JkZXJfc3RhdHVzKAogICAgICAgICAgICBzdGF0dXMKICAgICAgICApCiAgICApCgogICAgaWYgbm90IG5vcm1hbGl6ZWQ6CiAgICAgICAgcmV0dXJuICLZhtin2YXYtNiu2LUiCgogICAgcmV0dXJuIE9SREVSX1NUQVRVU19OQU1FUy5nZXQoCiAgICAgICAgbm9ybWFsaXplZCwKICAgICAgICBub3JtYWxpemVkLAogICAgKQoKCmRlZiBpc192YWxpZF9vcmRlcl9zdGF0dXMoCiAgICBzdGF0dXM6IHN0ciB8IE5vbmUsCikgLT4gYm9vbDoKICAgIG5vcm1hbGl6ZWQgPSAoCiAgICAgICAgbm9ybWFsaXplX29yZGVyX3N0YXR1cygKICAgICAgICAgICAgc3RhdHVzCiAgICAgICAgKQogICAgKQoKICAgIHJldHVybiAoCiAgICAgICAgYm9vbChub3JtYWxpemVkKQogICAgICAgIGFuZCBub3JtYWxpemVkCiAgICAgICAgaW4gT1JERVJfREJfU1RBVFVTRVMKICAgICkKCgpkZWYgaXNfdGVybWluYWxfb3JkZXJfc3RhdHVzKAogICAgc3RhdHVzOiBzdHIgfCBOb25lLAopIC0+IGJvb2w6CiAgICBub3JtYWxpemVkID0gKAogICAgICAgIG5vcm1hbGl6ZV9vcmRlcl9zdGF0dXMoCiAgICAgICAgICAgIHN0YXR1cwogICAgICAgICkKICAgICkKCiAgICByZXR1cm4gKAogICAgICAgIGJvb2wobm9ybWFsaXplZCkKICAgICAgICBhbmQgbm9ybWFsaXplZAogICAgICAgIGluIFRFUk1JTkFMX1NUQVRVU0VTCiAgICApCgoKZGVmIHJlcXVpcmVzX21hbnVhbF9yZXZpZXcoCiAgICBzdGF0dXM6IHN0ciB8IE5vbmUsCikgLT4gYm9vbDoKICAgIG5vcm1hbGl6ZWQgPSAoCiAgICAgICAgbm9ybWFsaXplX29yZGVyX3N0YXR1cygKICAgICAgICAgICAgc3RhdHVzCiAgICAgICAgKQogICAgKQoKICAgIHJldHVybiAoCiAgICAgICAgYm9vbChub3JtYWxpemVkKQogICAgICAgIGFuZCBub3JtYWxpemVkCiAgICAgICAgaW4gTUFOVUFMX1JFVklFV19TVEFUVVNFUwogICAgKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgRXhwb3J0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpfX2FsbF9fID0gWwogICAgIyBGU00KICAgICJPcmRlclN0YXRlcyIsCiAgICAiUGF5bWVudFN0YXRlcyIsCiAgICAiQWRtaW5PcmRlclN0YXRlcyIsCgogICAgIyBEQiBTdGF0dXMKICAgICJPcmRlclN0YXR1cyIsCiAgICAiT1JERVJfREJfU1RBVFVTRVMiLAogICAgIk9XTkVSX1BFTkRJTkdfU1RBVFVTRVMiLAogICAgIlBST0NFU1NJTkdfU1RBVFVTRVMiLAogICAgIlNVQ0NFU1NfU1RBVFVTRVMiLAogICAgIkZBSUxVUkVfU1RBVFVTRVMiLAogICAgIk1BTlVBTF9SRVZJRVdfU1RBVFVTRVMiLAogICAgIlRFUk1JTkFMX1NUQVRVU0VTIiwKCiAgICAjIExhYmVscwogICAgIk9SREVSX1NUQVRVU19OQU1FUyIsCiAgICAiT1JERVJfU1RBVEVfTkFNRVMiLAogICAgIlBBWU1FTlRfU1RBVEVfTkFNRVMiLAogICAgIkFETUlOX09SREVSX1NUQVRFX05BTUVTIiwKCiAgICAjIEhlbHBlcnMKICAgICJub3JtYWxpemVfb3JkZXJfc3RhdHVzIiwKICAgICJnZXRfb3JkZXJfc3RhdHVzX25hbWUiLAogICAgImdldF9vcmRlcl9zdGF0ZV9uYW1lIiwKICAgICJnZXRfcGF5bWVudF9zdGF0ZV9uYW1lIiwKICAgICJnZXRfYWRtaW5fb3JkZXJfc3RhdGVfbmFtZSIsCiAgICAiaXNfdmFsaWRfb3JkZXJfc3RhdHVzIiwKICAgICJpc190ZXJtaW5hbF9vcmRlcl9zdGF0dXMiLAogICAgInJlcXVpcmVzX21hbnVhbF9yZXZpZXciLApdCg==', 'utils/finance.py': 'IyB1dGlscy9maW5hbmNlLnB5Cgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYXN5bmNpbwppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHNxbGl0ZTMKaW1wb3J0IHRocmVhZGluZwpmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwsIEludmFsaWRPcGVyYXRpb24KZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBBbnksIEZpbmFsLCBPcHRpb25hbAoKZnJvbSBjb3JlLmNvbmZpZyBpbXBvcnQgc2V0dGluZ3MKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIENvbnN0YW50cwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU1VQUE9SVEVEX1JBVEVTOiBGaW5hbFtmcm96ZW5zZXRbc3RyXV0gPSBmcm96ZW5zZXQoCiAgICB7CiAgICAgICAgInVzZHQiLAogICAgICAgICJ0b24iLAogICAgICAgICJzdGFycyIsCiAgICAgICAgInByZW1pdW1fbW9udGhseSIsCiAgICB9CikKClRBQkxFX05BTUU6IEZpbmFsW3N0cl0gPSAiYm90X2ZpbmFuY2VfcmF0ZXMiCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBIZWxwZXJzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgX3Jlc29sdmVfZGJfcGF0aCgpIC0+IHN0cjoKICAgIHZhbHVlID0gKAogICAgICAgIGdldGF0dHIoc2V0dGluZ3MsICJEQl9QQVRIIiwgTm9uZSkKICAgICAgICBvciBnZXRhdHRyKHNldHRpbmdzLCAiREFUQUJBU0VfUEFUSCIsIE5vbmUpCiAgICAgICAgb3IgIm1hdHJpeF9ib3QuZGIiCiAgICApCgogICAgcmV0dXJuIHN0cih2YWx1ZSkKCgpkZWYgX3RvX2RlY2ltYWwoCiAgICB2YWx1ZTogQW55LAopIC0+IE9wdGlvbmFsW0RlY2ltYWxdOgogICAgdHJ5OgogICAgICAgIHJlc3VsdCA9IERlY2ltYWwoc3RyKHZhbHVlKSkKCiAgICBleGNlcHQgKAogICAgICAgIEludmFsaWRPcGVyYXRpb24sCiAgICAgICAgVHlwZUVycm9yLAogICAgICAgIFZhbHVlRXJyb3IsCiAgICApOgogICAgICAgIHJldHVybiBOb25lCgogICAgaWYgKAogICAgICAgIG5vdCByZXN1bHQuaXNfZmluaXRlKCkKICAgICAgICBvciByZXN1bHQgPD0gMAogICAgKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIHJldHVybiByZXN1bHQKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEZpbmFuY2UgTWFuYWdlcgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgRmluYW5jZU1hbmFnZXI6CiAgICAiIiIKICAgIFBlcnNpc3RlbnQgZmluYW5jZS1yYXRlIG1hbmFnZXIuCgogICAgU3RvcmVkIHJhdGVzOgogICAgICAgIHVzZHQKICAgICAgICAgICAgVG9tYW4gcGVyIDEgVVNEVC4KCiAgICAgICAgdG9uCiAgICAgICAgICAgIFRvbWFuIHBlciAxIFRPTi4KCiAgICAgICAgc3RhcnMKICAgICAgICAgICAgVG9tYW4gcGVyIDEgVGVsZWdyYW0gU3Rhci4KCiAgICAgICAgcHJlbWl1bV9tb250aGx5CiAgICAgICAgICAgIFRvbWFuIHBlciBvbmUgbW9udGggb2YgVGVsZWdyYW0gUHJlbWl1bS4KCiAgICBUYWJkZWFsIGludGVncmF0aW9uOgogICAgICAgIHN5bmNfcmF0ZXMoKSByZWZyZXNoZXMgb25seToKICAgICAgICAgICAgdXNkdAogICAgICAgICAgICB0b24KCiAgICAgICAgU3RhcnMvUHJlbWl1bSBhcmUgcHJvZHVjdCBzZWxsaW5nIHByaWNlcyBhbmQgdGhlcmVmb3JlIHJlbWFpbgogICAgICAgIGFkbWluLWNvbnRyb2xsZWQuCgogICAgTm8gVGFiZGVhbCBwcml2YXRlIEFQSSBjcmVkZW50aWFsIGlzIG5lZWRlZCBmb3IgcHVibGljIG1hcmtldCBkYXRhLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgZGJfcGF0aDogc3RyIHwgUGF0aCB8IE5vbmUgPSBOb25lLAogICAgKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGJfcGF0aCA9IHN0cigKICAgICAgICAgICAgZGJfcGF0aAogICAgICAgICAgICBvciBfcmVzb2x2ZV9kYl9wYXRoKCkKICAgICAgICApCgogICAgICAgIHNlbGYuX3dyaXRlX2xvY2sgPSAoCiAgICAgICAgICAgIHRocmVhZGluZy5STG9jaygpCiAgICAgICAgKQoKICAgICAgICBzZWxmLl9lbnN1cmVfc2NoZW1hKCkKCiAgICAgICAgc2VsZi5fc2VlZF9mcm9tX2Vudmlyb25tZW50KCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFNRTGl0ZQogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiBfY29ubmVjdCgKICAgICAgICBzZWxmLAogICAgKSAtPiBzcWxpdGUzLkNvbm5lY3Rpb246CiAgICAgICAgY29ubiA9IHNxbGl0ZTMuY29ubmVjdCgKICAgICAgICAgICAgc2VsZi5kYl9wYXRoLAogICAgICAgICAgICB0aW1lb3V0PTMwLAogICAgICAgICAgICBjaGVja19zYW1lX3RocmVhZD1GYWxzZSwKICAgICAgICApCgogICAgICAgIGNvbm4ucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdwoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJQUkFHTUEgYnVzeV90aW1lb3V0ID0gMzAwMDAiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gY29ubgoKICAgIGRlZiBfZW5zdXJlX3NjaGVtYSgKICAgICAgICBzZWxmLAogICAgKSAtPiBOb25lOgogICAgICAgIHdpdGggc2VsZi5fd3JpdGVfbG9jazoKICAgICAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIGYiIiIKICAgICAgICAgICAgICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB7VEFCTEVfTkFNRX0gKAogICAgICAgICAgICAgICAgICAgICAgICByYXRlX2tleSBURVhUIFBSSU1BUlkgS0VZLAogICAgICAgICAgICAgICAgICAgICAgICByYXRlX3ZhbHVlIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBURVhUIE5PVCBOVUxMIERFRkFVTFQgJ2FkbWluJywKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9hdCBUSU1FU1RBTVAgTk9UIE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgY29ubi5jb21taXQoKQoKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICMgRW52aXJvbm1lbnQgU2VlZAogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiBfc2VlZF9mcm9tX2Vudmlyb25tZW50KAogICAgICAgIHNlbGYsCiAgICApIC0+IE5vbmU6CiAgICAgICAgIiIiCiAgICAgICAgT3B0aW9uYWwgZmlyc3QtcnVuIHNlZWQuCgogICAgICAgIEV4aXN0aW5nIERCIHZhbHVlcyBhcmUgbmV2ZXIgb3ZlcndyaXR0ZW4uCgogICAgICAgIFN1cHBvcnRlZCBvcHRpb25hbCBlbnYgbmFtZXM6CiAgICAgICAgICAgIEZJTkFOQ0VfVVNEVF9UT01BTgogICAgICAgICAgICBGSU5BTkNFX1RPTl9UT01BTgogICAgICAgICAgICBGSU5BTkNFX1NUQVJTX1RPTUFOCiAgICAgICAgICAgIEZJTkFOQ0VfUFJFTUlVTV9NT05USExZX1RPTUFOCiAgICAgICAgIiIiCiAgICAgICAgZW52X21hcCA9IHsKICAgICAgICAgICAgInVzZHQiOgogICAgICAgICAgICAgICAgIkZJTkFOQ0VfVVNEVF9UT01BTiIsCgogICAgICAgICAgICAidG9uIjoKICAgICAgICAgICAgICAgICJGSU5BTkNFX1RPTl9UT01BTiIsCgogICAgICAgICAgICAic3RhcnMiOgogICAgICAgICAgICAgICAgIkZJTkFOQ0VfU1RBUlNfVE9NQU4iLAoKICAgICAgICAgICAgInByZW1pdW1fbW9udGhseSI6CiAgICAgICAgICAgICAgICAiRklOQU5DRV9QUkVNSVVNX01PTlRITFlfVE9NQU4iLAogICAgICAgIH0KCiAgICAgICAgZm9yIGtleSwgZW52X25hbWUgaW4gKAogICAgICAgICAgICBlbnZfbWFwLml0ZW1zKCkKICAgICAgICApOgogICAgICAgICAgICBpZiBzZWxmLmdldF9yYXRlKGtleSkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgcmF3ID0gb3MuZ2V0ZW52KAogICAgICAgICAgICAgICAgZW52X25hbWUsCiAgICAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgKS5zdHJpcCgpCgogICAgICAgICAgICBpZiBub3QgcmF3OgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHZhbHVlID0gX3RvX2RlY2ltYWwoCiAgICAgICAgICAgICAgICByYXcKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJJbnZhbGlkICVzIGlnbm9yZWQuIiwKICAgICAgICAgICAgICAgICAgICBlbnZfbmFtZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBzZWxmLnVwZGF0ZV9yYXRlKAogICAgICAgICAgICAgICAga2V5LAogICAgICAgICAgICAgICAgdmFsdWUsCiAgICAgICAgICAgICAgICBzb3VyY2U9ImVudiIsCiAgICAgICAgICAgICkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFB1YmxpYyBBUEkKICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgbm9ybWFsaXplX2tleSgKICAgICAgICBrZXk6IHN0ciwKICAgICkgLT4gc3RyOgogICAgICAgIHJlc3VsdCA9IHN0cigKICAgICAgICAgICAga2V5CiAgICAgICAgICAgIG9yICIiCiAgICAgICAgKS5zdHJpcCgpLmxvd2VyKCkKCiAgICAgICAgYWxpYXNlcyA9IHsKICAgICAgICAgICAgInByZW1pdW0iOgogICAgICAgICAgICAgICAgInByZW1pdW1fbW9udGhseSIsCgogICAgICAgICAgICAicHJlbWl1bV9tb250aCI6CiAgICAgICAgICAgICAgICAicHJlbWl1bV9tb250aGx5IiwKCiAgICAgICAgICAgICJ1c2R0X3RvbWFuIjoKICAgICAgICAgICAgICAgICJ1c2R0IiwKCiAgICAgICAgICAgICJ0b25fdG9tYW4iOgogICAgICAgICAgICAgICAgInRvbiIsCiAgICAgICAgfQoKICAgICAgICByZXN1bHQgPSBhbGlhc2VzLmdldCgKICAgICAgICAgICAgcmVzdWx0LAogICAgICAgICAgICByZXN1bHQsCiAgICAgICAgKQoKICAgICAgICBpZiByZXN1bHQgbm90IGluIFNVUFBPUlRFRF9SQVRFUzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgIGYiVW5zdXBwb3J0ZWQgZmluYW5jZSByYXRlOiB7cmVzdWx0fSIKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldF9yYXRlKAogICAgICAgIHNlbGYsCiAgICAgICAga2V5OiBzdHIsCiAgICApIC0+IE9wdGlvbmFsW0RlY2ltYWxdOgogICAgICAgIGtleSA9IHNlbGYubm9ybWFsaXplX2tleSgKICAgICAgICAgICAga2V5CiAgICAgICAgKQoKICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgZiIiIgogICAgICAgICAgICAgICAgU0VMRUNUIHJhdGVfdmFsdWUKICAgICAgICAgICAgICAgIEZST00ge1RBQkxFX05BTUV9CiAgICAgICAgICAgICAgICBXSEVSRSByYXRlX2tleSA9ID8KICAgICAgICAgICAgICAgIExJTUlUIDEKICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBrZXksCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgIGlmIG5vdCByb3c6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgcmV0dXJuIF90b19kZWNpbWFsKAogICAgICAgICAgICAgICAgcm93WyJyYXRlX3ZhbHVlIl0KICAgICAgICAgICAgKQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBkZWYgdXBkYXRlX3JhdGUoCiAgICAgICAgc2VsZiwKICAgICAgICBrZXk6IHN0ciwKICAgICAgICB2YWx1ZTogQW55LAogICAgICAgICosCiAgICAgICAgc291cmNlOiBzdHIgPSAiYWRtaW4iLAogICAgKSAtPiBib29sOgogICAgICAgIGtleSA9IHNlbGYubm9ybWFsaXplX2tleSgKICAgICAgICAgICAga2V5CiAgICAgICAgKQoKICAgICAgICBkZWNpbWFsX3ZhbHVlID0gX3RvX2RlY2ltYWwoCiAgICAgICAgICAgIHZhbHVlCiAgICAgICAgKQoKICAgICAgICBpZiBkZWNpbWFsX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBzb3VyY2UgPSBzdHIoCiAgICAgICAgICAgIHNvdXJjZQogICAgICAgICAgICBvciAiYWRtaW4iCiAgICAgICAgKS5zdHJpcCgpWzo1MF0KCiAgICAgICAgd2l0aCBzZWxmLl93cml0ZV9sb2NrOgogICAgICAgICAgICBjb25uID0gc2VsZi5fY29ubmVjdCgpCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgIkJFR0lOIElNTUVESUFURSIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgZiIiIgogICAgICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHtUQUJMRV9OQU1FfSAoCiAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVfa2V5LAogICAgICAgICAgICAgICAgICAgICAgICByYXRlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/LCBDVVJSRU5UX1RJTUVTVEFNUCkKCiAgICAgICAgICAgICAgICAgICAgT04gQ09ORkxJQ1QocmF0ZV9rZXkpCiAgICAgICAgICAgICAgICAgICAgRE8gVVBEQVRFIFNFVAogICAgICAgICAgICAgICAgICAgICAgICByYXRlX3ZhbHVlID0gZXhjbHVkZWQucmF0ZV92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gZXhjbHVkZWQuc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkX2F0ID0gQ1VSUkVOVF9USU1FU1RBTVAKICAgICAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWxfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAiRmluYW5jZSByYXRlIHVwZGF0ZWQgfCAiCiAgICAgICAgICAgICAgICAgICAgImtleT0lcyBzb3VyY2U9JXMiLAogICAgICAgICAgICAgICAgICAgIGtleSwKICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBjb25uLnJvbGxiYWNrKCkKCiAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgdXBkYXRlIGZpbmFuY2UgcmF0ZSB8ICIKICAgICAgICAgICAgICAgICAgICAia2V5PSVzIiwKICAgICAgICAgICAgICAgICAgICBrZXksCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgZGVmIGRlbGV0ZV9yYXRlKAogICAgICAgIHNlbGYsCiAgICAgICAga2V5OiBzdHIsCiAgICApIC0+IGJvb2w6CiAgICAgICAga2V5ID0gc2VsZi5ub3JtYWxpemVfa2V5KAogICAgICAgICAgICBrZXkKICAgICAgICApCgogICAgICAgIHdpdGggc2VsZi5fd3JpdGVfbG9jazoKICAgICAgICAgICAgY29ubiA9IHNlbGYuX2Nvbm5lY3QoKQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3Vyc29yID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIGYiIiIKICAgICAgICAgICAgICAgICAgICBERUxFVEUgRlJPTSB7VEFCTEVfTkFNRX0KICAgICAgICAgICAgICAgICAgICBXSEVSRSByYXRlX2tleSA9ID8KICAgICAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICBrZXksCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5yb3djb3VudCA+IDAKCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBkZWYgZ2V0X2FsbF9yYXRlcygKICAgICAgICBzZWxmLAogICAgKSAtPiBkaWN0W3N0ciwgT3B0aW9uYWxbRGVjaW1hbF1dOgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGtleTogc2VsZi5nZXRfcmF0ZSgKICAgICAgICAgICAgICAgIGtleQogICAgICAgICAgICApCiAgICAgICAgICAgIGZvciBrZXkKICAgICAgICAgICAgaW4gc29ydGVkKAogICAgICAgICAgICAgICAgU1VQUE9SVEVEX1JBVEVTCiAgICAgICAgICAgICkKICAgICAgICB9CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGZvcm1hdF9jdXJyZW5jeSgKICAgICAgICB2YWx1ZTogQW55LAogICAgKSAtPiBzdHI6CiAgICAgICAgZGVjaW1hbF92YWx1ZSA9IF90b19kZWNpbWFsKAogICAgICAgICAgICB2YWx1ZQogICAgICAgICkKCiAgICAgICAgaWYgZGVjaW1hbF92YWx1ZSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gItmG2KfZhdi02K7YtSIKCiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWNpbWFsX3ZhbHVlCiAgICAgICAgICAgID09IGRlY2ltYWxfdmFsdWUudG9faW50ZWdyYWwoKQogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBmIntpbnQoZGVjaW1hbF92YWx1ZSk6LH0iCiAgICAgICAgICAgICkKCiAgICAgICAgdGV4dCA9IGZvcm1hdCgKICAgICAgICAgICAgZGVjaW1hbF92YWx1ZS5ub3JtYWxpemUoKSwKICAgICAgICAgICAgImYiLAogICAgICAgICkKCiAgICAgICAgaWYgIi4iIGluIHRleHQ6CiAgICAgICAgICAgIGludGVnZXIsIGZyYWN0aW9uID0gKAogICAgICAgICAgICAgICAgdGV4dC5zcGxpdCgKICAgICAgICAgICAgICAgICAgICAiLiIsCiAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW50ZWdlciA9ICgKICAgICAgICAgICAgICAgICAgICBmIntpbnQoaW50ZWdlcik6LH0iCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgICAgIGZyYWN0aW9uID0gKAogICAgICAgICAgICAgICAgZnJhY3Rpb24ucnN0cmlwKCIwIikKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIGYie2ludGVnZXJ9LntmcmFjdGlvbn0iCiAgICAgICAgICAgICAgICBpZiBmcmFjdGlvbgogICAgICAgICAgICAgICAgZWxzZSBpbnRlZ2VyCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHRleHQKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFRhYmRlYWwgU3luYwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGRlZiBzeW5jX3JhdGVzKAogICAgICAgIHNlbGYsCiAgICApIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgICAgICIiIgogICAgICAgIFJlZnJlc2ggbWFya2V0IGNvbnZlcnNpb24gcmF0ZXMuCgogICAgICAgIFVTRFQvVG9tYW46CiAgICAgICAgICAgIFRhYmRlYWwgLT4gV2FsbGV4IC0+IEJpdHBpbiAtPiBOb2JpdGV4IC0+IEV4aXIgLT4gU2FycmFmZXgKCiAgICAgICAgVE9OLW5ldHdvcmsgbmF0aXZlIGNvaW4vVG9tYW46CiAgICAgICAgICAgIFRhYmRlYWwgR1JBTS9UT04gbWFya2V0IGRpc2NvdmVyeS4KCiAgICAgICAgUHJlbWl1bS9TdGFycyBwcm9kdWN0IGJhc2UgcHJpY2VzIGFyZSBub3QgdXNlZCBieSB0aGUgYWN0aXZlCiAgICAgICAgTWFya2V0QXBwIHByaWNpbmcgZmxvdy4KICAgICAgICAiIiIKICAgICAgICBmcm9tIHNlcnZpY2VzLmlyYW5fdXNkdF9yYXRlX3NlcnZpY2UgaW1wb3J0ICgKICAgICAgICAgICAgSXJhblVzZHRSYXRlU2VydmljZSwKICAgICAgICApCiAgICAgICAgZnJvbSBzZXJ2aWNlcy50YWJkZWFsX3JhdGVfc2VydmljZSBpbXBvcnQgKAogICAgICAgICAgICBUYWJkZWFsUmF0ZVNlcnZpY2UsCiAgICAgICAgKQoKICAgICAgICB1c2R0X2NsaWVudCA9IElyYW5Vc2R0UmF0ZVNlcnZpY2UoCiAgICAgICAgICAgIHRpbWVvdXQ9NC4wLAogICAgICAgICAgICBjYWNoZV90dGw9MTUuMCwKICAgICAgICAgICAgc3RhbGVfdHRsPTMwMC4wLAogICAgICAgICkKCiAgICAgICAgbmF0aXZlX2NsaWVudCA9IFRhYmRlYWxSYXRlU2VydmljZSgKICAgICAgICAgICAgdGltZW91dD02LjAsCiAgICAgICAgICAgIGNhY2hlX3R0bD0xNS4wLAogICAgICAgICAgICByZXRyaWVzPTIsCiAgICAgICAgKQoKICAgICAgICBlcnJvcnM6IGRpY3Rbc3RyLCBzdHJdID0ge30KICAgICAgICB1cGRhdGVkOiBkaWN0W3N0ciwgRGVjaW1hbF0gPSB7fQogICAgICAgIHNvdXJjZXM6IGRpY3Rbc3RyLCBzdHJdID0ge30KCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFVTRFQvVG9tYW4gaXMgaW5kZXBlbmRlbnQgZnJvbSBuYXRpdmUtY29pbiBwcmljaW5nLgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBxdW90ZSA9IGF3YWl0IHVzZHRfY2xpZW50LmdldF9xdW90ZSgKICAgICAgICAgICAgICAgICAgICBmb3JjZV9yZWZyZXNoPVRydWUsCiAgICAgICAgICAgICAgICAgICAgYWxsb3dfc3RhbGU9VHJ1ZSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBwZXJzaXN0ZWQgPSBzZWxmLnVwZGF0ZV9yYXRlKAogICAgICAgICAgICAgICAgICAgICJ1c2R0IiwKICAgICAgICAgICAgICAgICAgICBxdW90ZS5yYXRlX3RvbWFuLAogICAgICAgICAgICAgICAgICAgIHNvdXJjZT1mImlyYW46e3F1b3RlLnNvdXJjZX0iLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGlmIHBlcnNpc3RlZDoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkWyJ1c2R0Il0gPSBxdW90ZS5yYXRlX3RvbWFuCiAgICAgICAgICAgICAgICAgICAgc291cmNlc1sidXNkdCJdID0gcXVvdGUuc291cmNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGVycm9yc1sidXNkdCJdID0gKAogICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBlcnNpc3QgVVNEVC9Ub21hbi4iCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgICAgICBlcnJvcnNbInVzZHQiXSA9ICgKICAgICAgICAgICAgICAgICAgICBmInt0eXBlKGV4YykuX19uYW1lX199OiB7ZXhjfSIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJNdWx0aS1leGNoYW5nZSBVU0RUIHN5bmMgZmFpbGVkIHwgZXJyb3I9JXMiLAogICAgICAgICAgICAgICAgICAgIGV4YywKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgR1JBTS9UT04gLT4gVG9tYW4gcmVtYWlucyBpbmRlcGVuZGVudC4KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbmF0aXZlX3RvbWFuID0gKAogICAgICAgICAgICAgICAgICAgIGF3YWl0IG5hdGl2ZV9jbGllbnQKICAgICAgICAgICAgICAgICAgICAuZ2V0X3Rvbl90b21hbl9yYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBmb3JjZV9yZWZyZXNoPVRydWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgcGVyc2lzdGVkID0gc2VsZi51cGRhdGVfcmF0ZSgKICAgICAgICAgICAgICAgICAgICAidG9uIiwKICAgICAgICAgICAgICAgICAgICBuYXRpdmVfdG9tYW4sCiAgICAgICAgICAgICAgICAgICAgc291cmNlPSJ0YWJkZWFsX25hdGl2ZSIsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgcGVyc2lzdGVkOgogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRbInRvbiJdID0gbmF0aXZlX3RvbWFuCiAgICAgICAgICAgICAgICAgICAgc291cmNlc1sidG9uIl0gPSAidGFiZGVhbF9uYXRpdmUiCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGVycm9yc1sidG9uIl0gPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcGVyc2lzdCBuYXRpdmUvVG9tYW4uIgogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICAgICAgZXJyb3JzWyJ0b24iXSA9ICgKICAgICAgICAgICAgICAgICAgICBmInt0eXBlKGV4YykuX19uYW1lX199OiB7ZXhjfSIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJOYXRpdmUgR1JBTS9UT04gc3luYyBmYWlsZWQgfCBlcnJvcj0lcyIsCiAgICAgICAgICAgICAgICAgICAgZXhjLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgbm90IHVwZGF0ZWQ6CiAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIk5vIG1hcmtldCByYXRlIGNvdWxkIGJlIHJlZnJlc2hlZC4gIgogICAgICAgICAgICAgICAgICAgICsgIiB8ICIuam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgZiJ7a2V5fT17dmFsdWV9IgogICAgICAgICAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBlcnJvcnMuaXRlbXMoKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAic3VjY2VzcyI6IG5vdCBlcnJvcnMsCiAgICAgICAgICAgICAgICAicGFydGlhbCI6IGJvb2woZXJyb3JzKSwKICAgICAgICAgICAgICAgICJ1cGRhdGVkIjogdHVwbGUoc29ydGVkKHVwZGF0ZWQua2V5cygpKSksCiAgICAgICAgICAgICAgICAiZXJyb3JzIjogZXJyb3JzLAogICAgICAgICAgICAgICAgInNvdXJjZXMiOiBzb3VyY2VzLAogICAgICAgICAgICAgICAgInVzZHQiOiBzZWxmLmdldF9yYXRlKCJ1c2R0IiksCiAgICAgICAgICAgICAgICAidG9uIjogc2VsZi5nZXRfcmF0ZSgidG9uIiksCiAgICAgICAgICAgIH0KCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgYXdhaXQgdXNkdF9jbGllbnQuY2xvc2UoKQogICAgICAgICAgICBhd2FpdCBuYXRpdmVfY2xpZW50LmNsb3NlKCkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNoYXJlZCBTaW5nbGV0b24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmZpbmFuY2VfbWFuYWdlciA9IEZpbmFuY2VNYW5hZ2VyKCkKCgpfX2FsbF9fID0gWwogICAgIkZpbmFuY2VNYW5hZ2VyIiwKICAgICJmaW5hbmNlX21hbmFnZXIiLAogICAgIlNVUFBPUlRFRF9SQVRFUyIsCl0K'}
HASHES = {'main.py': '368ac173ea05ffcb547bb7ae5fbc3f79ac30e954f05da86b9a3f5cffe20c833c', 'core/config.py': '5e8f2a62cfb5d6a880e74b8a1a203a9f788227fec6d35735edcd74b4f007e816', 'core/database.py': 'dc1e334ea11ca03edb8b661ffb906f91c2d8404331c9571b50a8ee564d0e2dcb', 'core/ui_emojis.py': '8c2b0977c6550ab8fe6d2ed861665b8d8b4c4b50c98813d354723cd59bc8dbec', 'handlers/user/shop.py': '2b31db4aecef916f38715ab649b3e9ac35f3b6ab6d497fc6cbbf86d051b528fe', 'handlers/user/start.py': '83b1aefa6176bb6417806308fa6aeba1fbb67117b0b720b8b8877d37a46a28be', 'handlers/admin/actions.py': 'a7be38b1e97e4bc0b20f2c99ed4f01f9c09e1441b32d185baf7ac615731916b2', 'handlers/admin/panel.py': '5a1978dbc8af220340067020263c67ba562e77f534d234b8e53394448358e8f2', 'keyboards/admin_kb.py': '6e09a5ed07ccb136f791e3284e9689a1cb96acb8f3af39b009b24786ec321a1e', 'keyboards/user_kb.py': '5acf7bc5c07cf80978c17aa4f2559f5527648c47a2a6e1b3bc8a7c9b37bd342b', 'services/product_pricing_service.py': 'ee26248e23acfc221971cc2eaaa2eaa78450e6b5a93ac1f968eefd21ec2f766a', 'services/order_service.py': '0e8e16c42f8bdece97abe993767271b8653d13ae4f118fece6453442a7b15813', 'services/iran_usdt_rate_service.py': 'f4945e44fbf6efb7296589415c3e8aacf0d415bc3201906a755ac703f58ba596', 'services/tabdeal_rate_service.py': '31c755c0a4a78536f0513cee32184e51b519ed2b14c7235d9e1db6a09a28b4e8', 'states/order.py': '2e058d3b4c584324d03c777418307c7c0dcedf9c4bcb568d28263dd9c5021b6c', 'utils/finance.py': '18f5c1d7258b99634dc7de8217c67012400028712300979c780946585e478042'}

def sha256(data: bytes) -> str:
    return hashlib.sha256(data).hexdigest()

def main() -> int:
    main_py = ROOT / 'main.py'
    if not main_py.exists():
        print('ERROR: Put this file next to main.py, then run it again.')
        print('Current folder:', ROOT)
        return 1

    stamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    backup_root = ROOT / ('backup_before_manual_pricing_' + stamp)
    backup_root.mkdir(parents=True, exist_ok=True)

    print('Project root:', ROOT)
    print('Backup:', backup_root)
    print()

    for rel, encoded in FILES.items():
        target = ROOT / rel
        data = base64.b64decode(encoded.encode('ascii'))

        if sha256(data) != HASHES[rel]:
            print('ERROR: Embedded file checksum mismatch:', rel)
            return 2

        if target.exists():
            backup = backup_root / rel
            backup.parent.mkdir(parents=True, exist_ok=True)
            shutil.copy2(target, backup)

        target.parent.mkdir(parents=True, exist_ok=True)
        target.write_bytes(data)
        print('UPDATED', rel)

    # Never touch .env or the SQLite database.
    print()
    print('VERIFYING...')

    required = [
        ROOT / 'services' / 'product_pricing_service.py',
        ROOT / 'services' / 'order_service.py',
        ROOT / 'handlers' / 'user' / 'shop.py',
        ROOT / 'core' / 'config.py',
    ]

    for path in required:
        if not path.exists():
            print('FAIL missing:', path.relative_to(ROOT))
            return 3

    main_text = (ROOT / 'main.py').read_text(encoding='utf-8', errors='replace')
    config_text = (ROOT / 'core' / 'config.py').read_text(encoding='utf-8', errors='replace')
    order_text = (ROOT / 'services' / 'order_service.py').read_text(encoding='utf-8', errors='replace')

    checks = {
        'main has no market_app_api import':
            'from services.market_app_api import' not in main_text,
        'main uses ProductPricingService':
            'from services.product_pricing_service import ProductPricingService' in main_text,
        'old MARKET_APP_TOKEN warning removed':
            'MARKET_APP_TOKEN is not configured. MarketApp operations may fail.' not in config_text,
        'STATUS_CANCELLED_BY_USER exists':
            'STATUS_CANCELLED_BY_USER' in order_text,
        'accept_price_change exists':
            'async def accept_price_change(' in order_text,
    }

    failed = False
    for name, ok in checks.items():
        print(('OK   ' if ok else 'FAIL '), name)
        failed = failed or (not ok)

    if failed:
        print()
        print('Repair completed, but verification failed. Do NOT run the bot yet.')
        return 4

    # Compile the replaced Python files without importing them.
    for rel in FILES:
        if not rel.endswith('.py'):
            continue
        path = ROOT / rel
        try:
            compile(path.read_text(encoding='utf-8'), str(path), 'exec')
        except Exception as exc:
            print('FAIL syntax:', rel, exc)
            return 5

    print()
    print('DONE: manual pricing files installed successfully.')
    print('Your .env and database were NOT modified.')
    print('Now run: python main.py')
    return 0

if __name__ == '__main__':
    raise SystemExit(main())