if%20__import__(%22os%22).path.isdir(%22quickstart%2Fxmile%22)%3A%0A%20%20%20%20__import__(%22os%22).chdir(%22quickstart%2Fxmile%22)
%23%20assets%20embedded%20for%20the%20browser%3A%20only%20the%20wheel%20reaches%20Pyodide%2C%20never%20the%20page's%0A%23%20directory%2C%20and%20the%20worker%20has%20no%20base%20URL%20to%20fetch%20it%20from.%0Aif%20__import__(%22sys%22).platform%20%3D%3D%20%22emscripten%22%3A%0A%20%20%20%20_dateien%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22scenarios%2Fscenarios.json%22%3A%20%22ewogICAgInhtaWxlX2N1c3RvbWVyX2FjcXVpc2l0aW9uIjoKICAgIHsKICAgICAgICAic291cmNlIjoic2ltdWxhdGlvbl9tb2RlbHMvY3VzdG9tZXJfYWNxdWlzaXRpb25feG1pbGUuc3RteCIsCiAgICAgICAgIm1vZGVsIjoic2ltdWxhdGlvbl9tb2RlbHMvY3VzdG9tZXJfYWNxdWlzaXRpb25feG1pbGUiLAogICAgICAgICJzY2VuYXJpb3MiOgogICAgICAgIHsKICAgICAgICAgICJiYXNlIjogeyB9LAogICAgICAgICAgCiAgICAgICAgImxvd193b3JkX29mX21vdXRoIjp7CiAgICAgICAgICAgICJjb25zdGFudHMiOnsKICAgICAgICAgICAgICAgICJ3b3JkT2ZNb3V0aFN1Y2Nlc3MiOjAuMDAxCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJoaWdoX3dvcmRfb2ZfbW91dGgiOnsKICAgICAgICAgICAgImNvbnN0YW50cyI6ewogICAgICAgICAgICAgICAgIndvcmRPZk1vdXRoU3VjY2VzcyI6MC4xCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgfQogICAgfQp9%22%2C%0A%20%20%20%20%20%20%20%20%22simulation_models%2Fcustomer_acquisition_xmile.py%22%3A%20%22CiMgICAgICBfICAgICAgICAgICAgICAgICAgIF8gXwojICBfX19fX3wgfF9fIF9fXyBfIF9fICBfIF9fKF98IHxfX18gXyBfCiMgKF8tLyBfYCAvIF8vIF8gfCAnICBcfCAnXyB8IHwgLyAtX3wgJ198CiMgL19fXF9fLF9cX19cX19ffF98X3xffCAuX198X3xfXF9fX3xffAojICAgICAgICAgICAgICAgICAgICAgIHxffAojIENvcHlyaWdodCAoYykgMjAxMy0yMDIwIHRyYW5zZW50aXMgbWFuYWdlbWVudCAmIGNvbnN1bHRpbmcuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiMKICAgIAppbXBvcnQgbnVtcHkgYXMgbnAKZnJvbSBzY2lweS5pbnRlcnBvbGF0ZSBpbXBvcnQgaW50ZXJwMWQKZnJvbSBzY2lweS5zcGVjaWFsIGltcG9ydCBnYW1tYWxuCmZyb20gc2NpcHkuc3RhdHMgaW1wb3J0IG5vcm0KaW1wb3J0IG1hdGgsIHN0YXRpc3RpY3MsIHJhbmRvbSwgbG9nZ2luZwpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQppbXBvcnQgcmUKaW1wb3J0IGl0ZXJ0b29scwpmcm9tIGNvcHkgaW1wb3J0IGNvcHksIGRlZXBjb3B5CgoKCmRlZiBjYXJ0ZXNpYW5fcHJvZHVjdChsaXN0b2ZsaXN0cyk6CiAgICAiIiIKICAgIEhlbHBlciBmb3IgQ2FydGVzaWFuIHByb2R1Y3QKICAgIDpwYXJhbSBsaXN0b2ZsaXN0czoKICAgIDpyZXR1cm46CiAgICAiIiIKICAgIGlmIGxlbihsaXN0b2ZsaXN0cykgPT0gMToKICAgICAgICByZXR1cm4gbGlzdG9mbGlzdHNbMF0KICAgIHJlcyA9IGxpc3QoaXRlcnRvb2xzLnByb2R1Y3QoKmxpc3RvZmxpc3RzKSkKCiAgICBpZiBsZW4ocmVzKSA9PSAxOgogICAgICAgIHJldHVybiByZXNbMF0KCiAgICByZXR1cm4gcmVzCgpkZWYgTEVSUCh4LHBvaW50cyk6CiAgICAiIiIKICAgIExpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gYSBzZXQgb2YgcG9pbnRzCiAgICA6cGFyYW0geDogeCB0byBvYnRhaW4geSBmb3IKICAgIDpwYXJhbSBwb2ludHM6IExpc3Qgb2YgdHVwbGVzIGNvbnRhaW5pbmcgdGhlIGdyYXBoaWNhbCBmdW5jdGlvbidzIHBvaW50cyBbKHgseSksKHgseSkgLi4uIF0KICAgIDpyZXR1cm46IHkgdmFsdWUgZm9yIHggb2J0YWluZWQgdXNpbmcgbGluZWFyIGludGVycG9sYXRpb24KICAgICIiIgogICAgeF92YWxzID0gbnAuYXJyYXkoWyB4WzBdIGZvciB4IGluIHBvaW50c10pCiAgICB5X3ZhbHMgPSBucC5hcnJheShbeFsxXSBmb3IgeCBpbiBwb2ludHNdKQoKICAgIGlmIHg8PSB4X3ZhbHNbMF06CiAgICAgICAgcmV0dXJuIHlfdmFsc1swXQoKICAgIGlmIHggPj0geF92YWxzW2xlbih4X3ZhbHMpLTFdOgogICAgICAgIHJldHVybiB5X3ZhbHNbbGVuKHhfdmFscyktMV0KCiAgICBmID0gaW50ZXJwMWQoeF92YWxzLCB5X3ZhbHMpCiAgICByZXR1cm4gZmxvYXQoZih4KSkKCmNsYXNzIHNpbXVsYXRpb25fbW9kZWwoKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAjIFNpbXVsYXRpb24gU2V0dGluZ3MKICAgICAgICBzZWxmLmR0ID0gMS4wCiAgICAgICAgc2VsZi5zdGFydHRpbWUgPSAwLjAKICAgICAgICBzZWxmLnN0b3B0aW1lID0gNjAuMAogICAgICAgIHNlbGYudW5pdHMgPSAnTW9udGhzJwogICAgICAgIHNlbGYubWV0aG9kID0gJ0V1bGVyJwogICAgICAgIHNlbGYuZXF1YXRpb25zID0gewoKICAgICAgICAjIFN0b2NrcwogICAgICAgIAogICAgCiAgICAgICAgJ2N1c3RvbWVycycgICAgICAgICAgOiBsYW1iZGEgdDogKCAoc2VsZi5tZW1vaXplKCdpbml0aWFsQ3VzdG9tZXJzJywgdCkpIGlmICggdCAgPD0gIHNlbGYuc3RhcnR0aW1lICkgZWxzZSAoc2VsZi5tZW1vaXplKCdjdXN0b21lcnMnLHQtc2VsZi5kdCkgKyBzZWxmLmR0ICogKCBzZWxmLm1lbW9pemUoJ2N1c3RvbWVyQWNxdWlzaXRpb24nLHQtc2VsZi5kdCkgKSkgKSwKICAgICAgICAncG90ZW50aWFsQ3VzdG9tZXJzJyAgICAgICAgICA6IGxhbWJkYSB0OiAoIChzZWxmLm1lbW9pemUoJ2luaXRpYWxQb3RlbnRpYWxDdXN0b21lcnMnLCB0KSkgaWYgKCB0ICA8PSAgc2VsZi5zdGFydHRpbWUgKSBlbHNlIChzZWxmLm1lbW9pemUoJ3BvdGVudGlhbEN1c3RvbWVycycsdC1zZWxmLmR0KSArIHNlbGYuZHQgKiAoIC0xICogKCBzZWxmLm1lbW9pemUoJ2N1c3RvbWVyQWNxdWlzaXRpb24nLHQtc2VsZi5kdCkgKSApKSApLAogICAgICAgIAogICAgCiAgICAgICAgIyBGbG93cwogICAgICAgICdjdXN0b21lckFjcXVpc2l0aW9uJyAgICAgICAgICAgICA6IGxhbWJkYSB0OiBtYXgoWzAgLCBzZWxmLm1lbW9pemUoJ2FjcXVpc2l0aW9uVGhyb3VnaEFkdmVydGlzaW5nJywgdCkgKyBzZWxmLm1lbW9pemUoJ2FjcXVpc2l0aW9uVGhyb3VnaFdvcmRPZk1vdXRoJywgdCldKSwKICAgICAgICAKICAgIAogICAgICAgICMgY29udmVydGVycwogICAgICAgICdhY3F1aXNpdGlvblRocm91Z2hBZHZlcnRpc2luZycgICAgICA6IGxhbWJkYSB0OiBzZWxmLm1lbW9pemUoJ2NvbnN1bWVyc1JlYWNoZWRUaHJvdWdoQWR2ZXJ0aXNpbmcnLCB0KSAqIHNlbGYubWVtb2l6ZSgnYWR2ZXJ0aXNpbmdTdWNjZXNzJywgdCksCiAgICAgICAgJ2FjcXVpc2l0aW9uVGhyb3VnaFdvcmRPZk1vdXRoJyAgICAgIDogbGFtYmRhIHQ6IHNlbGYubWVtb2l6ZSgnY29uc3VtZXJzUmVhY2hlZFRocm91Z2hXb3JkT2ZNb3V0aCcsIHQpICogc2VsZi5tZW1vaXplKCd3b3JkT2ZNb3V0aFN1Y2Nlc3MnLCB0KSAqICggMS4wIC0gc2VsZi5tZW1vaXplKCdtYXJrZXRTYXR1cmF0aW9uJywgdCkgKSwKICAgICAgICAnYWR2ZXJ0aXNpbmdCdWRnZXQnICAgICAgOiBsYW1iZGEgdDogMTAwLjAsCiAgICAgICAgJ2FkdmVydGlzaW5nU3VjY2VzcycgICAgICA6IGxhbWJkYSB0OiAwLjEsCiAgICAgICAgJ2NvbnN1bWVyc1JlYWNoZWRQZXJFdXJvJyAgICAgIDogbGFtYmRhIHQ6IDEwMC4wLAogICAgICAgICdjb25zdW1lcnNSZWFjaGVkVGhyb3VnaEFkdmVydGlzaW5nJyAgICAgIDogbGFtYmRhIHQ6IHNlbGYubWVtb2l6ZSgnY29uc3VtZXJzUmVhY2hlZFBlckV1cm8nLCB0KSAqIHNlbGYubWVtb2l6ZSgnYWR2ZXJ0aXNpbmdCdWRnZXQnLCB0KSAqICggMS4wIC0gc2VsZi5tZW1vaXplKCdtYXJrZXRTYXR1cmF0aW9uJywgdCkgKSwKICAgICAgICAnY29uc3VtZXJzUmVhY2hlZFRocm91Z2hXb3JkT2ZNb3V0aCcgICAgICA6IGxhbWJkYSB0OiBzZWxmLm1lbW9pemUoJ2N1c3RvbWVycycsIHQpICogc2VsZi5tZW1vaXplKCdjb250YWN0UmF0ZScsIHQpLAogICAgICAgICdjb250YWN0UmF0ZScgICAgICA6IGxhbWJkYSB0OiAxMC4wLAogICAgICAgICdpbml0aWFsQ3VzdG9tZXJzJyAgICAgIDogbGFtYmRhIHQ6IDAuMCwKICAgICAgICAnaW5pdGlhbFBvdGVudGlhbEN1c3RvbWVycycgICAgICA6IGxhbWJkYSB0OiA2MDAwMC4wLAogICAgICAgICdtYXJrZXRTYXR1cmF0aW9uJyAgICAgIDogbGFtYmRhIHQ6IHNlbGYubWVtb2l6ZSgnY3VzdG9tZXJzJywgdCkgLyAoIHNlbGYubWVtb2l6ZSgncG90ZW50aWFsQ3VzdG9tZXJzJywgdCkgKyBzZWxmLm1lbW9pemUoJ2N1c3RvbWVycycsIHQpICksCiAgICAgICAgJ3dvcmRPZk1vdXRoU3VjY2VzcycgICAgICA6IGxhbWJkYSB0OiAwLjAxLAogICAgICAgIAogICAgCiAgICAgICAgIyBnZgogICAgICAgIAogICAgCiAgICAgICAgI2NvbnN0YW50cwogICAgICAgIAogICAgCiAgICAKICAgICAgICB9CiAgICAKICAgICAgICBzZWxmLnBvaW50cyA9IHsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgCiAgICAKICAgICAgICBzZWxmLmRpbWVuc2lvbnMgPSB7CiAgICAgICAgCScnOiB7CiAgICAgICAgICAgICAgICAnbGFiZWxzJzogWyAgXSwKICAgICAgICAgICAgICAgICd2YXJpYWJsZXMnOiBbICBdLAogICAgICAgICAgICB9LAogICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgIHNlbGYuZGltZW5zaW9uc19vcmRlciA9IHt9ICAgICAKICAgIAogICAgICAgIHNlbGYuc3RvY2tzID0gWydjdXN0b21lcnMnLCAgICdwb3RlbnRpYWxDdXN0b21lcnMnICBdCiAgICAgICAgc2VsZi5mbG93cyA9IFsnY3VzdG9tZXJBY3F1aXNpdGlvbicgIF0KICAgICAgICBzZWxmLmNvbnZlcnRlcnMgPSBbJ2FjcXVpc2l0aW9uVGhyb3VnaEFkdmVydGlzaW5nJywgICAnYWNxdWlzaXRpb25UaHJvdWdoV29yZE9mTW91dGgnLCAgICdhZHZlcnRpc2luZ0J1ZGdldCcsICAgJ2FkdmVydGlzaW5nU3VjY2VzcycsICAgJ2NvbnN1bWVyc1JlYWNoZWRQZXJFdXJvJywgICAnY29uc3VtZXJzUmVhY2hlZFRocm91Z2hBZHZlcnRpc2luZycsICAgJ2NvbnN1bWVyc1JlYWNoZWRUaHJvdWdoV29yZE9mTW91dGgnLCAgICdjb250YWN0UmF0ZScsICAgJ2luaXRpYWxDdXN0b21lcnMnLCAgICdpbml0aWFsUG90ZW50aWFsQ3VzdG9tZXJzJywgICAnbWFya2V0U2F0dXJhdGlvbicsICAgJ3dvcmRPZk1vdXRoU3VjY2VzcycgIF0KICAgICAgICBzZWxmLmdmID0gW10KICAgICAgICBzZWxmLmNvbnN0YW50cz0gW10KICAgICAgICBzZWxmLmV2ZW50cyA9IFsKICAgICAgICAgICAgXQogICAgCiAgICAgICAgc2VsZi5tZW1vID0ge30KICAgICAgICBmb3Iga2V5IGluIGxpc3Qoc2VsZi5lcXVhdGlvbnMua2V5cygpKToKICAgICAgICAgIHNlbGYubWVtb1trZXldID0ge30gICMgRElDVCBPRiBESUNUUyEKICAgICAgICAgIAogICAgCiAgICAiIiIKICAgIEJ1aWx0aW4gaGVscGVycwogICAgIiIiCiAgICBkZWYgcmFtcChzZWxmLHNsb3BlLHN0YXJ0LHQpOgogICAgICAgIGlmIG5vdCBzdGFydDoKICAgICAgICAgICAgc3RhcnQgPSBzZWxmLnN0YXJ0dGltZQogICAgICAgIGlmIHQgPD0gc3RhcnQ6IHJldHVybiAwCiAgICAgICAgcmV0dXJuICh0LXN0YXJ0KSpzbG9wZQogICAgICAgIAogICAgZGVmIHJvb3RuKHNlbGYsZXhwcmVzc2lvbixvcmRlcik6CiAgICAgICAgb3JkZXIgPSByb3VuZChvcmRlciwwKQogICAgICAgIGlmIGV4cHJlc3Npb24gPCAwIGFuZCBvcmRlciAlIDIgPT0gMDogIyBTdGVsbGEgZG9lcyBub3QgYWxsb3cgZXZlbiByb290cyBmb3IgbmVnYXRpdmUgbnVtYmVycyBhcyBubyBjb21wbGV4IG51bWJlcnMgYXJlIHN1cHBvcnRlZAogICAgICAgICAgICByZXR1cm4gbnAubmFuCiAgICAgICAgcmV0dXJuIC1hYnMoZXhwcmVzc2lvbikqKigxL3JvdW5kKG9yZGVyLDApKSBpZiBleHByZXNzaW9uIDwgMCBlbHNlIGFicyhleHByZXNzaW9uKSoqKDEvcm91bmQob3JkZXIsMCkpICMgU3RlbGxhIExvZ2ljISBObyBDb21wbGV4IG51bWJlcnMgZm9yIG5lZ2F0aXZlIG51bWJlcnMuIEhlbmNlIHRha2UgdGhlIG50aCByb290IG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBhbmQgdGhlbiBhZGQgdGhlIG5lZ2F0aXZpdHkgKGlmIGFueSkKICAgIAogICAgIiIiCiAgICBTdGF0aXN0aWNhbCBidWlsdGlucyB3aXRoIFNlZWQKICAgICIiIgogICAgZGVmIHBhcmV0b193aXRoX3NlZWQoc2VsZiwgc2hhcGUsIHNjYWxlLCBzZWVkLCB0KToKICAgICAgICBpZiB0ID09IHNlbGYuc3RhcnR0aW1lOgogICAgICAgICAgICBucC5yYW5kb20uc2VlZChpbnQoc2VlZCkpCiAgICAgICAgcmV0dXJuIG5wLnJhbmRvbS5wYXJldG8oc2hhcGUpICogc2NhbGUgIAogICAgCiAgICBkZWYgd2VpYnVsbF93aXRoX3NlZWQoc2VsZiwgc2hhcGUsIHNjYWxlLCBzZWVkLCB0KToKICAgICAgICBpZiB0ID09IHNlbGYuc3RhcnR0aW1lOgogICAgICAgICAgICBucC5yYW5kb20uc2VlZChpbnQoc2VlZCkpCiAgICAgICAgcmV0dXJuIG5wLnJhbmRvbS53ZWlidWxsKHNoYXBlKSAqIHNjYWxlICAgICAgCiAgICAKICAgIGRlZiBwb2lzc29uX3dpdGhfc2VlZChzZWxmLCBtdSwgc2VlZCwgdCk6CiAgICAgICAgaWYgdCA9PSBzZWxmLnN0YXJ0dGltZToKICAgICAgICAgICAgbnAucmFuZG9tLnNlZWQoaW50KHNlZWQpKQogICAgICAgIHJldHVybiBucC5yYW5kb20ucG9pc3NvbihtdSkgICAKICAgIAogICAgZGVmIG5lZ2Jpbm9taWFsX3dpdGhfc2VlZChzZWxmLCBzdWNjZXNzZXMsIHAsIHNlZWQsIHQpOgogICAgICAgIGlmIHQgPT0gc2VsZi5zdGFydHRpbWU6CiAgICAgICAgICAgIG5wLnJhbmRvbS5zZWVkKGludChzZWVkKSkKICAgICAgICByZXR1cm4gbnAucmFuZG9tLm5lZ2F0aXZlX2Jpbm9taWFsKHN1Y2Nlc3NlcywgcCkgIAogICAgCiAgICBkZWYgbG9nbm9ybWFsX3dpdGhfc2VlZChzZWxmLCBtZWFuLCBzdGRldiwgc2VlZCwgdCk6CiAgICAgICAgaWYgdCA9PSBzZWxmLnN0YXJ0dGltZToKICAgICAgICAgICAgbnAucmFuZG9tLnNlZWQoaW50KHNlZWQpKQogICAgICAgIHJldHVybiBucC5yYW5kb20ubG9nbm9ybWFsKG1lYW4sIHN0ZGV2KSAgIAogICAgCiAgICBkZWYgbG9naXN0aWNfd2l0aF9zZWVkKHNlbGYsIG1lYW4sIHNjYWxlLCBzZWVkLCB0KToKICAgICAgICBpZiB0ID09IHNlbGYuc3RhcnR0aW1lOgogICAgICAgICAgICBucC5yYW5kb20uc2VlZChpbnQoc2VlZCkpCiAgICAgICAgcmV0dXJuIG5wLnJhbmRvbS5sb2dpc3RpYyhtZWFuLCBzY2FsZSkKICAgIAogICAgZGVmIHJhbmRvbV93aXRoX3NlZWQoc2VsZiwgc2VlZCwgdCApOgogICAgICAgIGlmIHQgPT0gc2VsZi5zdGFydHRpbWU6CiAgICAgICAgICAgIHJhbmRvbS5zZWVkKGludChzZWVkKSkKICAgICAgICByZXR1cm4gcmFuZG9tLnJhbmRvbSgpCgogICAgZGVmIGJldGFfd2l0aF9zZWVkKHNlbGYsIGEsYixzZWVkLCB0KToKICAgICAgICBpZiB0ID09IHNlbGYuc3RhcnR0aW1lOgogICAgICAgICAgICBucC5yYW5kb20uc2VlZChpbnQoc2VlZCkpCiAgICAgICAgcmV0dXJuIG5wLnJhbmRvbS5iZXRhKGEsYikKICAgICAgICAKICAgIGRlZiBiaW5vbWlhbF93aXRoX3NlZWQoc2VsZiwgbixwLHNlZWQsIHQpOgogICAgICAgIGlmIHQgPT0gc2VsZi5zdGFydHRpbWU6CiAgICAgICAgICAgIG5wLnJhbmRvbS5zZWVkKGludChzZWVkKSkKICAgICAgICByZXR1cm4gbnAucmFuZG9tLmJpbm9taWFsKG4scCkKICAgICAgICAKICAgIGRlZiBnYW1tYV93aXRoX3NlZWQoc2VsZiwgc2hhcGUsc2NhbGUsc2VlZCwgdCk6CiAgICAgICAgaWYgdCA9PSBzZWxmLnN0YXJ0dGltZToKICAgICAgICAgICAgbnAucmFuZG9tLnNlZWQoaW50KHNlZWQpKQogICAgICAgIHJldHVybiBucC5yYW5kb20uZ2FtbWEoc2hhcGUsc2NhbGUpCiAgICAgICAgCiAgICBkZWYgZXhwcm5kX3dpdGhfc2VlZChzZWxmLCBwbGFtYmRhLHNlZWQsIHQpOgogICAgICAgIGlmIHQgPT0gc2VsZi5zdGFydHRpbWU6CiAgICAgICAgICAgIG5wLnJhbmRvbS5zZWVkKGludChzZWVkKSkKICAgICAgICByZXR1cm4gbnAucmFuZG9tLmV4cG9uZW50aWFsKHBsYW1iZGEpCiAgICAgICAgCiAgICBkZWYgZ2VvbWV0cmljX3dpdGhfc2VlZChzZWxmLCBwLCBzZWVkLCB0KToKICAgICAgICBpZiB0ID09IHNlbGYuc3RhcnR0aW1lOgogICAgICAgICAgICBucC5yYW5kb20uc2VlZChpbnQoc2VlZCkpCiAgICAgICAgcmV0dXJuIG5wLnJhbmRvbS5nZW9tZXRyaWMocCkKICAgIAogICAgZGVmIHRyaWFuZ3VsYXJfd2l0aF9zZWVkKHNlbGYsIGxlZnQsIG1vZGUsIHJpZ2h0LCBzZWVkLCB0KToKICAgICAgICBpZiB0ID09IHNlbGYuc3RhcnR0aW1lOgogICAgICAgICAgICBucC5yYW5kb20uc2VlZChpbnQoc2VlZCkpCiAgICAgICAgcmV0dXJuIG5wLnJhbmRvbS50cmlhbmd1bGFyKGxlZnQsIG1vZGUsIHJpZ2h0KQogICAgCiAgICBkZWYgcmFuayhzZWxmLCBsaXMsIHJhbmspOgogICAgICAgIHJhbmsgPSBpbnQocmFuaykKICAgICAgICBzb3J0ZWRfbGlzdCA9IG5wLnNvcnQobGlzKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmFua3RoX2VsZW0gPSBzb3J0ZWRfbGlzdFtyYW5rLTFdCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3IgYXMgZToKICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiUkFOSzogUmFuayB7fSB0b28gaGlnaCBmb3IgYXJyYXkgb2Ygc2l6ZSB7fSIuZm9ybWF0KHJhbmssbGVuKGxpcykpKQogICAgICAgIHJldHVybiAobGlzPT1yYW5rdGhfZWxlbSkubm9uemVybygpWzBdWzBdKzEKICAgICAgICAKCiAgICBkZWYgaW50ZXJwb2xhdGUoc2VsZiwgdmFyaWFibGUsIHQsICphcmdzKToKICAgICAgICAiIiIKICAgICAgICBIZWxwZXIgZm9yIGJ1aWx0aW4gImludGVycG9sYXRlIi4gVXNlcyB0aGUgYXJyYXllZCB2YXJpYWJsZSBhbmQgYXJncyB0byBjb21wdXRlIHRoZSBpbnRlcnBvbGF0aW9uCiAgICAgICAgOnBhcmFtIHZhcmlhYmxlOgogICAgICAgIDpwYXJhbSB0OgogICAgICAgIDpwYXJhbSBhcmdzOiBJbnRlcnBvbGF0aW9uIHdlaWdodCBmb3IgZWFjaCBkaW1lbnNpb24sIGJldHdlZW4gb25lIG9yIHplcm8KICAgICAgICA6cmV0dXJuOgogICAgICAgICIiIgogICAgICAgIGRlZiBjb21wdXRlX3godmFsdWVzKTogIwogICAgICAgICAgICAiIiIKICAgICAgICAgICAgQ29tcHV0ZSB4IHZhbHVlcyBmb3IgaW50ZXJwb2xhdGlvbi4gQWx3YXlzIGZyb20gMCB0byAxLiBFLmcuIHZhbHVlcyA9IFsxLDIsM10sIHRoZW4geCA9IFswLCAwLjUsIDEuMF0KICAgICAgICAgICAgOnBhcmFtIHZhbHVlczoKICAgICAgICAgICAgOnJldHVybjoKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICMKICAgICAgICAgICAgeCA9IFswXQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4odmFsdWVzKSk6IHggKz0gW3hbaSAtIDFdICsgMSAvIChsZW4odmFsdWVzKSAtIDEpXQogICAgICAgICAgICByZXR1cm4geAoKICAgICAgICBkZWYgaW50ZXJwb2xhdGVfdmFsdWVzKGluZGV4LCB5X3ZhbCk6ICAjIEludGVybmFsIGludGVycG9sYXRlIG9mIGEgZGltZW5zaW9uJ3MgcmVzdWx0cwogICAgICAgICAgICB4X3ZhbCA9IGNvbXB1dGVfeCh5X3ZhbCkKICAgICAgICAgICAgcG9pbnRzID0gWyh4X3ZhbFtpXSwgeV92YWxbaV0pIGZvciBpIGluIHJhbmdlKDAsIGxlbih4X3ZhbCkpXQogICAgICAgICAgICByZXR1cm4gTEVSUChpbmRleCwgcG9pbnRzKQoKICAgICAgICAjIEZpeCBlYWNoIHdlaWdodCB0byBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMQogICAgICAgIGFyZ3MgPSBbbWF4KDAsbWluKHgsMSkpIGZvciB4IGluIGFyZ3NdCgogICAgICAgICMgR2V0IGRpbWVuc2lvbnMgb2YgdmFyaWFibGUgKDIsMyw0IC4uLikKICAgICAgICBkaW1lbnNpb25zID0gc2VsZi5kaW1lbnNpb25zX29yZGVyW3ZhcmlhYmxlXQoKICAgICAgICAjIEdldCBMYWJlbHMKICAgICAgICBsYWJlbHMgPSB7a2V5OiBkaW1bImxhYmVscyJdIGZvciBrZXksIGRpbSBpbgogICAgICAgICAgICAgICAgICBkaWN0KGZpbHRlcihsYW1iZGEgZWxlbTogZWxlbVswXSBpbiBkaW1lbnNpb25zLCBzZWxmLmRpbWVuc2lvbnMuaXRlbXMoKSkpLml0ZW1zKCl9CgogICAgICAgICMgQ29tcHV0ZQogICAgICAgIHJlc3VsdHMgPSB7fQogICAgICAgIGlmIGxlbihsYWJlbHMua2V5cygpKSA9PSAxOgogICAgICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGVfdmFsdWVzKGFyZ3NbMF0sIHNlbGYuZXF1YXRpb24odmFyaWFibGUgKyAiWypdIiwgdCkpCiAgICAgICAgZm9yIGluZGV4LCBkaW1lbnNpb24gaW4gZW51bWVyYXRlKGRpbWVuc2lvbnMpOgogICAgICAgICAgICByZXN1bHRzW2RpbWVuc2lvbl0gPSBbXQogICAgICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzW2RpbWVuc2lvbl06CiAgICAgICAgICAgICAgICBpbmRpY2VzID0gWyIqIiBpZiBpICE9IGluZGV4IGVsc2UgbGFiZWwgZm9yIGkgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UoMCwgbGVuKGRpbWVuc2lvbnMpKV0gICMgQnVpbGQgaW5kaWNlcywgc3VjaCBhcyAiKixlbGVtZW50MSIgb3IgIjEsKiIKCiAgICAgICAgICAgICAgICByZXN1bHRzW2RpbWVuc2lvbl0gKz0gWwogICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlX3ZhbHVlcyhhcmdzW2luZGV4XSwgc2VsZi5lcXVhdGlvbih2YXJpYWJsZSArICJbe31dIi5mb3JtYXQoIiwiLmpvaW4oaW5kaWNlcykpLCB0KSldCgogICAgICAgIHJldHVybiBbaW50ZXJwb2xhdGVfdmFsdWVzKGFyZ3NbaV0sIHYpIGZvciBpLCB2IGluIGVudW1lcmF0ZShyZXN1bHRzLnZhbHVlcygpKV1bMF0KCiAgICBkZWYgbG9va3VwaW52KHNlbGYsZ2YsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBIZWxwZXIgZm9yIGxvb2t1cGludiBidWlsdGluLiBMb29rcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgeCBvZiBhIGdpdmVuIHkKICAgICAgICA6cGFyYW0gZ2Y6IE5hbWUgb2YgZ3JhcGhpY2FsIGZ1bmN0aW9uCiAgICAgICAgOnBhcmFtIHZhbHVlOiBWYWx1ZSB3ZSBhcmUgbG9va2luZyBmb3IgKHkpCiAgICAgICAgOnJldHVybjoKICAgICAgICAiIiIKICAgICAgICBkZWYgbGVycGZ1bih4LCBwb2ludHMpOiAgIyBTcGVjaWFsIGxlcnAgZnVuY3Rpb24gZm9yIHRoZSByZXZlcnNlZCBwb2ludHMKICAgICAgICAgICAgZnJvbSBzY2lweS5pbnRlcnBvbGF0ZSBpbXBvcnQgaW50ZXJwMWQKICAgICAgICAgICAgeF92YWxzID0gbnAuYXJyYXkoW3hbMF0gZm9yIHggaW4gcG9pbnRzXSkKICAgICAgICAgICAgeV92YWxzID0gbnAuYXJyYXkoW3hbMV0gZm9yIHggaW4gcG9pbnRzXSkKICAgICAgICAgICAgZiA9IGludGVycDFkKHhfdmFscywgeV92YWxzKQogICAgICAgICAgICByZXR1cm4gZih4KQoKICAgICAgICByZXN1bHRzID0gW10KICAgICAgICBmb3IgdCBpbiBucC5hcmFuZ2Uoc2VsZi5zdGFydHRpbWUsIHNlbGYuc3RvcHRpbWUgKyBzZWxmLmR0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmR0KTogICMgQ29tcHV0ZSBhbGwgeSB2YWx1ZXMgZm9yIGdyYXBoaWNhbCBmdW5jdGlvbnMgdXNpbmcgc3RhbmRhcmQgaW50ZXJwb2xhdGUgKExFUlApCiAgICAgICAgICAgIHJlc3VsdHMgKz0gWyhMRVJQKHQsIHNlbGYucG9pbnRzW2dmXSksIHQpXSAjIHkseAoKICAgICAgICByZXR1cm4gbnAucm91bmQobGVycGZ1bih2YWx1ZSwgcmVzdWx0cyksCiAgICAgICAgICAgICAgICAgICAgIDMpICAjIFVzZSBMRVJQIGZ1bmN0aW9uIGZvciB0aGUgcmV2ZXJzZWQgc2V0IG9mIHBvaW50cyAoeSx4KSBhbmQgZmluZCB0aGUgY29ycmVjdCB2YWx1ZS4gQ2Fubm90IHVzZSBzdGFuZGFyZCBMRVJQIGhlcmUgYmVjYXVzZSB0aGF0IHdvdWxkIHJlcXVpcmUgY29udGludW91cyBYICgxLDIsMy4uKQoKICAgIGRlZiBkZWxheShzZWxmLCB0ZGVsYXllZCwgb2Zmc2V0LCBpbml0aWFsLCB0KToKICAgICAgICAnJycKICAgICAgICBEZWxheSBidWlsdGluCiAgICAgICAgOnBhcmFtIHRkZWxheWVkOiBEZWxheWVkIFQKICAgICAgICA6cGFyYW0gb2Zmc2V0OiBPZmZzZXQKICAgICAgICA6cGFyYW0gaW5pdGlhbDogSW5pdGlhbCB2YWx1ZQogICAgICAgIDpwYXJhbSB0OgogICAgICAgIDpyZXR1cm46CiAgICAgICAgJycnCiAgICAgICAgaWYgKHQgLSBzZWxmLnN0YXJ0dGltZSkgPCBvZmZzZXQ6IHJldHVybiBpbml0aWFsCiAgICAgICAgZWxzZTogcmV0dXJuIHRkZWxheWVkCgogICAgZGVmIGNvdW50ZXIoc2VsZixzdGFydCwgaW50ZXJ2YWwsIHQpOgogICAgICAgICcnJwogICAgICAgIENvdW50ZXIgYnVsdGluCiAgICAgICAgOnBhcmFtIHN0YXJ0OgogICAgICAgIDpwYXJhbSBpbnRlcnZhbDoKICAgICAgICA6cGFyYW0gdDoKICAgICAgICA6cmV0dXJuOgogICAgICAgICcnJwogICAgICAgIG51bV9lbGVtcyA9IChpbnRlcnZhbCAvIHN0YXJ0IC8gc2VsZi5kdCkKICAgICAgICB2YWx1ZSA9IGludGVydmFsIC8gbnVtX2VsZW1zCiAgICAgICAgdF9jb3B5ID0gY29weSh0KQoKICAgICAgICB3aGlsZSB0ID49IGludGVydmFsOiB0ID0gdCAtIGludGVydmFsCiAgICAgICAgaWYgKHRfY29weSA%2BIGludGVydmFsKTogcmV0dXJuIChzdGFydCArICh0IC8gc2VsZi5kdCkgKiB2YWx1ZSkKCiAgICAgICAgcmV0dXJuICh0IC8gc2VsZi5kdCAqIHZhbHVlKQoKICAgIGRlZiBucHYoc2VsZiwgaW5pdGlhbCwgcCwgdCk6CiAgICAgICAgIiIiCiAgICAgICAgTlBWIChOZXQgUHJlc2VudCBWYWx1ZSkgYnVpbHRpbgogICAgICAgIDpwYXJhbSBpbml0aWFsOgogICAgICAgIDpwYXJhbSBwOgogICAgICAgIDpwYXJhbSB0OgogICAgICAgIDpyZXR1cm46CiAgICAgICAgIiIiCiAgICAgICAgcmF0ZSA9IDEuMCAvICgxLjAgKyBwKSAqKiAodCAtIHNlbGYuZHQgLSBzZWxmLnN0YXJ0dGltZSArIHNlbGYuZHQpCiAgICAgICAgcmV0dXJuIGluaXRpYWwgaWYgKHQgPD0gc2VsZi5zdGFydHRpbWUpIGVsc2UgKCBzZWxmLm5wdihpbml0aWFsLCBwLCB0IC0gc2VsZi5kdCkgKyAoc2VsZi5kdCAqIHJhdGUgKiBpbml0aWFsKSApIyBSZWN1cnNlCgogICAgZGVmIGlycihzZWxmLCBzdG9ja19uYW1lLCBtaXNzaW5nLCB0LG15bmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgQXBwcm94aW1hdGUgSVJSIChJbnRlcm5hbCBSYXRlIG9mIFJldHVybikKICAgICAgICA6cGFyYW0gc3RvY2tfbmFtZTogSWRlbnRpZmllciBvZiBTdG9jayB0byBhcHByb3hpbWF0ZSBmb3IKICAgICAgICA6cGFyYW0gbWlzc2luZzogUmVwbGFjZSBtaXNzaW5nIHZhbHVlcyB3aXRoIHRoaXMgdmFsdWUKICAgICAgICA6cGFyYW0gdDoKICAgICAgICA6cmV0dXJuOgogICAgICAgICIiIgoKICAgICAgICBkZWYgY29tcHV0ZV9ucHYoc3RvY2tfbmFtZSwgdCwgaSwgbWlzc2luZyk6CiAgICAgICAgICAgIEkgPSBtaXNzaW5nIGlmIG1pc3NpbmcgZWxzZSBzZWxmLmVxdWF0aW9uKHN0b2NrX25hbWUsIHNlbGYuc3RhcnR0aW1lKQogICAgICAgICAgICByZXR1cm4gSSArIHN1bSggW3NlbGYubWVtb2l6ZShzdG9ja19uYW1lLCB0KSAvICgxICsgaSkgKiogdCBmb3IgdCBpbiBucC5hcmFuZ2Uoc2VsZi5zdGFydHRpbWUrc2VsZi5kdCAsIHQsIHNlbGYuZHQpXSkKCiAgICAgICAgaSA9IDAKICAgICAgICB0cnk6CiAgICAgICAgICAgIGkgPSAwIGlmIHQgPD0gc2VsZi5zdGFydHRpbWUgKyBzZWxmLmR0IGVsc2Ugc2VsZi5tZW1vW215bmFtZV1bdC1zZWxmLmR0XQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiB0ID09IHNlbGYuc3RhcnR0aW1lOiByZXR1cm4gTm9uZQoKICAgICAgICBiZXN0X2t3ID0ge2kgOiBjb21wdXRlX25wdihzdG9ja19uYW1lLCB0LCBpLCBtaXNzaW5nKX0KICAgICAgICBmb3IgXyBpbiByYW5nZSgwLCAzMDApOgogICAgICAgICAgICAjIEhlcmUgd2UgYXBwcm94aW1hdGUgdGhlIElSUgogICAgICAgICAgICBrdyA9IGNvbXB1dGVfbnB2KHN0b2NrX25hbWUsIHQsIGksIG1pc3NpbmcpCgogICAgICAgICAgICBjaGFuZ2UgPSAwLjAwMQoKICAgICAgICAgICAgYmVzdF9rd1tpXSA9IGt3CgogICAgICAgICAgICBpZiBhYnMoa3cpIDwgc2VsZi5tZW1vaXplKHN0b2NrX25hbWUsIHQpKjAuMTogY2hhbmdlID0gMC4wMDAxCgogICAgICAgICAgICBpZiBhYnMoa3cpIDwgc2VsZi5tZW1vaXplKHN0b2NrX25hbWUsIHQpKjAuMDU6IGNoYW5nZSA9IDAuMDAwMDEKCiAgICAgICAgICAgIGlmIGFicyhrdykgPCBzZWxmLm1lbW9pemUoc3RvY2tfbmFtZSwgdCkqMC4wMjogY2hhbmdlID0gMC4wMDAwMDEKCiAgICAgICAgICAgIGlmIGt3IDwgMDogaSAtPSBjaGFuZ2UKICAgICAgICAgICAgZWxpZiBrdyA%2BIDA6ICBpICs9IGNoYW5nZQoKICAgICAgICAgICAgaWYga3cgPT0gMDogcmV0dXJuIGkKICAgICAgICBiZXN0X2t3ID0ge2s6IHYgZm9yIGssIHYgaW4gc29ydGVkKGJlc3Rfa3cuaXRlbXMoKSwga2V5PWxhbWJkYSBpdGVtOiBpdGVtWzFdKX0KICAgICAgICB4ID0ge3Y6IGsgZm9yIGssIHYgaW4gc29ydGVkKGJlc3Rfa3cuaXRlbXMoKSwga2V5PWxhbWJkYSBpdGVtOiBpdGVtWzFdKX0gIyBTb3J0IGJ5IGJlc3QgbnB2CiAgICAgICAgcmV0dXJuIHhbbWluKHgua2V5cygpKV0KCiAgICBkZWYgbm9ybWFsY2RmKHNlbGYsbGVmdCwgcmlnaHQsIG1lYW4sIHNpZ21hKToKICAgICAgICBpbXBvcnQgc2NpcHkuc3RhdHMKICAgICAgICByaWdodCA9IHNjaXB5LnN0YXRzLm5vcm0oZmxvYXQobWVhbiksIGZsb2F0KHNpZ21hKSkuY2RmKGZsb2F0KHJpZ2h0KSkKICAgICAgICBsZWZ0ID0gc2NpcHkuc3RhdHMubm9ybShmbG9hdChtZWFuKSwgZmxvYXQoc2lnbWEpKS5jZGYoZmxvYXQobGVmdCkpCiAgICAgICAgcmV0dXJuIHJvdW5kKHJpZ2h0IC0gbGVmdCwgMykKCiAgICBkZWYgY2dyb3d0aChzZWxmLCBwKToKICAgICAgICAiIiJUaGUgcGVyLXN0ZXAgZ3Jvd3RoIHJhdGUgeiB0aGF0IGNvbXBvdW5kcyB0byBwIG92ZXIgb25lIHRpbWUgdW5pdC4KCiAgICAgICAgQ2xvc2VkIGZvcm0gb2Ygd2hhdCB0aGUgc3ltYm9saWMgdmVyc2lvbiBzb2x2ZWQgZm9yOiB0aGUgY29tcG91bmRpbmcKICAgICAgICBsb29wIG9ubHkgZXZlciBwcm9kdWNlZCB4ID0gKDEgKyBkdCp6KSoqbiB3aXRoIG4gPSBpbnQoMS9kdCksIHNvCiAgICAgICAgMSArIHAgPSAoMSArIGR0KnopKipuIHJlc29sdmVzIGRpcmVjdGx5LgogICAgICAgICIiIgogICAgICAgIGR0ID0gc2VsZi5kdAogICAgICAgICMgZHQgPiAxIGxlZnQgdGhlIG9sZCBsb29wIGVtcHR5LCBpLmUuIGEgc2luZ2xlIGZhY3Rvci4KICAgICAgICBuID0gbWF4KGludCgxIC8gZHQpLCAxKQogICAgICAgIHJldHVybiAoKDEuMCArIHApICoqICgxLjAgLyBuKSAtIDEuMCkgLyBkdAoKICAgIGRlZiBtb250ZWNhcmxvKHNlbGYscHJvYmFiaWxpdHksc2VlZCwgdCk6CiAgICAgICAgIiIiCiAgICAgICAgTW9udGVjYXJsbyBidWlsdGluCiAgICAgICAgOnBhcmFtIHByb2JhYmlsaXR5OgogICAgICAgIDpwYXJhbSBzZWVkOgogICAgICAgIDpwYXJhbSB0OgogICAgICAgIDpyZXR1cm46CiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VlZCBhbmQgdD09c2VsZi5zdGFydHRpbWU6CiAgICAgICAgICAgIHJhbmRvbS5zZWVkKHNlZWQpCiAgICAgICAgcm5kbnVtYmVyID0gcmFuZG9tLnVuaWZvcm0oMCwxMDApCiAgICAgICAgcmV0dXJuIDEgaWYgcm5kbnVtYmVyIDwgKHByb2JhYmlsaXR5KnNlbGYuZHQpIGVsc2UgMAoKCiAgICBkZWYgZGVyaXZuKHNlbGYsIGVxdWF0aW9uLCBvcmRlciwgdCk6CiAgICAgICAgIiIiCiAgICAgICAgbnRoIGRlcml2YXRpdmUgb2YgYW4gZXF1YXRpb24KICAgICAgICA6cGFyYW0gZXF1YXRpb246IE5hbWUgb2YgdGhlIGVxdWF0aW9uCiAgICAgICAgOnBhcmFtIG9yZGVyOiBuCiAgICAgICAgOnBhcmFtIHQ6IGN1cnJlbnQgdAogICAgICAgIDpyZXR1cm46CiAgICAgICAgIiIiCiAgICAgICAgbWVtbyA9IHt9CiAgICAgICAgZHQgPSAwLjI1CgogICAgICAgIGRlZiBtZW0oZXEsIHQpOgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgTWVtbyBmb3IgaW50ZXJuYWwgZXF1YXRpb25zCiAgICAgICAgICAgIDpwYXJhbSBlcToKICAgICAgICAgICAgOnBhcmFtIHQ6CiAgICAgICAgICAgIDpyZXR1cm46CiAgICAgICAgICAgICIiIgogICAgICAgICAgICBpZiBub3QgZXEgaW4gbWVtby5rZXlzKCk6IG1lbW9bZXFdID0ge30KICAgICAgICAgICAgbXltZW1vID0gbWVtb1tlcV0KICAgICAgICAgICAgaWYgdCBpbiBteW1lbW8ua2V5cygpOiByZXR1cm4gbXltZW1vW3RdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBteW1lbW9bdF0gPSBzW2VxXSh0KQogICAgICAgICAgICAgICAgcmV0dXJuIG15bWVtb1t0XQoKICAgICAgICBzID0ge30KICAgICAgICBzWzFdID0gbGFtYmRhIHQ6IDAgaWYgdCA8PSBzZWxmLnN0YXJ0dGltZSBlbHNlIChzZWxmLm1lbW9pemUoZXF1YXRpb24sIHQpIC0gc2VsZi5tZW1vaXplKGVxdWF0aW9uLCB0IC0gZHQpKSAvIGR0CgogICAgICAgIGRlZiBhZGRFcXVhdGlvbihuKToKICAgICAgICAgICAgc1tuXSA9IGxhbWJkYSB0OiAwIGlmIHQgPD0gc2VsZi5zdGFydHRpbWUgZWxzZSAobWVtKG4gLSAxLCB0KSAtIG1lbShuIC0gMSwgdCAtIGR0KSkgLyBkdAoKICAgICAgICBmb3IgbiBpbiBsaXN0KHJhbmdlKDIsIG9yZGVyICsgMSkpOiBhZGRFcXVhdGlvbihuKQoKICAgICAgICByZXR1cm4gc1tvcmRlcl0odCkgaWYgKCB0ID49IHNlbGYuc3RhcnR0aW1lICsgKGR0ICogb3JkZXIpICkgZWxzZSAwCgogICAgZGVmIHNtdGhuKHNlbGYsIGlucHV0c3RyZWFtLCBhdmVyYWdpbmdfdGltZSwgaW5pdGlhbCwgbiwgdCk6CiAgICAgICAgIiIiCiAgICAgICAgUHJldHR5IGNvbXBsZXggb3BlcmF0b3IuIEFjdHVhbGx5IHdlIGFyZSBidWlsZGluZyBhIHdob2xlIG1vZGVsIGhlcmUgYW5kIGhhdmUgaXQgcnVuCiAgICAgICAgRmluZCBpbmZvIGluIGh0dHBzOi8vd3d3LmlzZWVzeXN0ZW1zLmNvbS9yZXNvdXJjZXMvaGVscC92MS05L2RlZmF1bHQuaHRtIzA4LVJlZmVyZW5jZS8wNy1CdWlsdGlucy9EZWxheV9idWlsdGlucy5odG0ja2FuY2hvcjM2NAogICAgICAgIDpwYXJhbSBpbnB1dHN0cmVhbToKICAgICAgICA6cGFyYW0gYXZlcmFnaW5nX3RpbWU6CiAgICAgICAgOnBhcmFtIGluaXRpYWw6CiAgICAgICAgOnBhcmFtIG46CiAgICAgICAgOnBhcmFtIHQ6CiAgICAgICAgOnJldHVybjoKICAgICAgICAiIiIKICAgICAgICBtZW1vID0ge30KICAgICAgICBkdCA9IHNlbGYuZHQKICAgICAgICBmcm9tIGNvcHkgaW1wb3J0IGRlZXBjb3B5CgogICAgICAgIGRlZiBtZW0oZXEsIHQpOgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgSW50ZXJuYWwgbWVtbyBmb3IgZXF1YXRpb25zCiAgICAgICAgICAgIDpwYXJhbSBlcToKICAgICAgICAgICAgOnBhcmFtIHQ6CiAgICAgICAgICAgIDpyZXR1cm46CiAgICAgICAgICAgICIiIgogICAgICAgICAgICBpZiBub3QgZXEgaW4gbWVtby5rZXlzKCk6IG1lbW9bZXFdID0ge30KICAgICAgICAgICAgbXltZW1vID0gbWVtb1tlcV0KICAgICAgICAgICAgaWYgdCBpbiBteW1lbW8ua2V5cygpOnJldHVybiBteW1lbW9bdF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG15bWVtb1t0XSA9IHNbZXFdKHQpCiAgICAgICAgICAgICAgICByZXR1cm4gbXltZW1vW3RdCgogICAgICAgIHMgPSB7fQoKICAgICAgICBkZWYgYWRkRXF1YXRpb24obiwgdXBwZXIpOgogICAgICAgICAgICB5ID0gZGVlcGNvcHkobikKICAgICAgICAgICAgaWYgeSA9PSAxOgogICAgICAgICAgICAgICAgc1sic3RvY2sxIl0gPSBsYW1iZGEgdDogKAogICAgICAgICAgICAgICAgICAgIChtYXgoWzAsIChzZWxmLm1lbW9pemUoaW5wdXRzdHJlYW0sIHQpIGlmIChpbml0aWFsIGlzIE5vbmUpIGVsc2UgaW5pdGlhbCldKSkgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPD0gc2VsZi5zdGFydHRpbWUpIGVsc2UgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbSgnc3RvY2sxJywgdCAtIGR0KSArIGR0ICogKG1lbSgnY2hhbmdlSW5TdG9jazEnLCB0IC0gZHQpKSkpCiAgICAgICAgICAgICAgICBzWydjaGFuZ2VJblN0b2NrMSddID0gbGFtYmRhIHQ6IChzZWxmLm1lbW9pemUoaW5wdXRzdHJlYW0sIHQpIC0gbWVtKCdzdG9jazEnLCB0KSkgLyAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdpbmdfdGltZSAvIHVwcGVyKQogICAgICAgICAgICBpZiB5ID4gMToKICAgICAgICAgICAgICAgIHNbInN0b2Nre30iLmZvcm1hdCh5KV0gPSBsYW1iZGEgdDogKAogICAgICAgICAgICAgICAgICAgIChtYXgoWzAsIChzZWxmLm1lbW9pemUoaW5wdXRzdHJlYW0sIHQpIGlmIChpbml0aWFsIGlzIE5vbmUpIGVsc2UgaW5pdGlhbCldKSkgaWYgKHQgPD0gc2VsZi5zdGFydHRpbWUpIGVsc2UgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbSgic3RvY2t7fSIuZm9ybWF0KHkpLCB0IC0gZHQpICsgZHQgKiAobWVtKCdjaGFuZ2VJblN0b2Nre30nLmZvcm1hdCh5KSwgdCAtIGR0KSkpKQogICAgICAgICAgICAgICAgc1snY2hhbmdlSW5TdG9ja3t9Jy5mb3JtYXQoeSldID0gbGFtYmRhIHQ6IChtZW0oInN0b2Nre30iLmZvcm1hdCh5IC0gMSksIHQpIC0gbWVtKCJzdG9ja3t9Ii5mb3JtYXQoeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCkpIC8gKGF2ZXJhZ2luZ190aW1lIC8gdXBwZXIpCiAgICAgICAgbiA9IGludChuKQoKICAgICAgICBmb3IgaSBpbiBsaXN0KHJhbmdlKDAsIG4gKyAxKSk6IGFkZEVxdWF0aW9uKGksIG4pCgogICAgICAgIHJldHVybiBzWydzdG9ja3t9Jy5mb3JtYXQobildKHQpCgogICAgZGVmIGZvcmNzdChzZWxmLGlucHV0c3RyZWFtLCBhdmVyYWdpbmdfdGltZSwgaG9yaXpvbiwgaW5pdGlhbCwgdCk6CiAgICAgICAgbWVtbyA9IHsiY2hhbmdlX2luX2lucHV0Ijoge30sICJhdmVyYWdlX2lucHV0Ijoge30sICJ0cmVuZF9pbl9pbnB1dCI6IHt9LCAiZm9yZWNhc3RfaW5wdXQiOiB7fX0KCiAgICAgICAgZGVmIG1lbShlcSwgdCk6CiAgICAgICAgICAgICIiIgogICAgICAgICAgICBJbnRlcm5hbCBtZW1vIGZvciBlcXVhdGlvbnMKICAgICAgICAgICAgOnBhcmFtIGVxOgogICAgICAgICAgICA6cGFyYW0gdDoKICAgICAgICAgICAgOnJldHVybjoKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIG15bWVtbyA9IG1lbW9bZXFdCiAgICAgICAgICAgIGlmIHQgaW4gbXltZW1vLmtleXMoKTogcmV0dXJuIG15bWVtb1t0XQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbXltZW1vW3RdID0gc1tlcV0odCkKICAgICAgICAgICAgICAgIHJldHVybiBteW1lbW9bdF0KCiAgICAgICAgcyA9IHsKICAgICAgICAgICAgImNoYW5nZV9pbl9pbnB1dCI6IGxhbWJkYSB0OiBtYXgoWzAsIChzZWxmLm1lbW9pemUoaW5wdXRzdHJlYW0sdCkgLSBtZW0oJ2F2ZXJhZ2VfaW5wdXQnLCB0KSkgLyBhdmVyYWdpbmdfdGltZV0pLAogICAgICAgICAgICAiYXZlcmFnZV9pbnB1dCI6IGxhbWJkYSB0OiAoKHNlbGYubWVtb2l6ZShpbnB1dHN0cmVhbSx0KSkgaWYgKHQgPD0gc2VsZi5zdGFydHRpbWUpIGVsc2UgKAogICAgICAgICAgICAgICAgICAgICAgICBtZW0oImF2ZXJhZ2VfaW5wdXQiLCB0IC0gc2VsZi5kdCkgKyBzZWxmLmR0ICogKG1lbSgiY2hhbmdlX2luX2lucHV0IiwgdCAtIHNlbGYuZHQpKSkpLAogICAgICAgICAgICAidHJlbmRfaW5faW5wdXQiOiBsYW1iZGEgdDogKCgoc2VsZi5tZW1vaXplKGlucHV0c3RyZWFtLHQpIC0gc2VsZi5tZW1vaXplKCdhdmVyYWdlSW5wdXQnLCB0KSkgLyAoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVtb2l6ZSgnYXZlcmFnZUlucHV0JywgdCkgKiBzZWxmLm1lbW9pemUoJ2F2ZXJhZ2luZ1RpbWUnLCB0KSkpIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZW1vaXplKCdhdmVyYWdlSW5wdXQnLCB0KSA%2BIDAuMCkgZWxzZSAobnAubmFuKSksCiAgICAgICAgICAgICJmb3JlY2FzdF9pbnB1dCI6IGxhbWJkYSB0OiBzZWxmLm1lbW9pemUoaW5wdXRzdHJlYW0sdCkgKiAoMS4wICsgbWVtKCJ0cmVuZF9pbl9pbnB1dCIsIHQpICogaG9yaXpvbikKICAgICAgICB9CgogICAgICAgIHJldHVybiBzWyJmb3JlY2FzdF9pbnB1dCJdKHQpCgogICAgI0hlbHBlcnMgZm9yIERpbWVuc2lvbnMgKEFycmF5cykKCiAgICBkZWYgZmluZF9kaW1lbnNpb25zKHNlbGYsIHN0b2NrKToKICAgICAgICBzdG9ja2RpbWVuc2lvbnMgPSB7fQogICAgICAgIGZvciBkaW1lbnNpb24sIHZhbHVlcyBpbiBzZWxmLmRpbWVuc2lvbnMuaXRlbXMoKToKICAgICAgICAgICAgaWYgc3RvY2sgaW4gdmFsdWVzWyJ2YXJpYWJsZXMiXToKICAgICAgICAgICAgICAgIHN0b2NrZGltZW5zaW9uc1tkaW1lbnNpb25dID0gdmFsdWVzWyJsYWJlbHMiXQoKICAgICAgICBpZiBsZW4oc3RvY2tkaW1lbnNpb25zLmtleXMoKSkgPT0gMToKICAgICAgICAgICAgcmV0dXJuIFtzdG9jayArICJbe31dIi5mb3JtYXQoeCkgZm9yIHggaW4gc3RvY2tkaW1lbnNpb25zW2xpc3Qoc3RvY2tkaW1lbnNpb25zLmtleXMoKSlbMF1dXQoKICAgIGRlZiBnZXRfZGltZW5zaW9ucyhzZWxmLCBlcXVhdGlvbiwgdCk6CiAgICAgICAgcmVfZmluZF9pbmRpY2VzID0gcidcWyhbXildKylcXScKICAgICAgICBncm91cCA9IHJlLnNlYXJjaChyZV9maW5kX2luZGljZXMsIGVxdWF0aW9uKS5ncm91cCgwKS5yZXBsYWNlKCJbIiwgIiIpLnJlcGxhY2UoIl0iLCAiIikKICAgICAgICBlcXVhdGlvbl9iYXNpYyA9IGVxdWF0aW9uLnJlcGxhY2UoZ3JvdXAsICIiKS5yZXBsYWNlKCJbXSIsICIiKQogICAgICAgIGxhYmVscyA9IFtdCiAgICAgICAgZm9yIGluZGV4LCBlbGVtIGluIGVudW1lcmF0ZShncm91cC5zcGxpdCgiLCIpKToKICAgICAgICAgICAgaWYgbGVuKGVsZW0uc3BsaXQoIjoiKSkgPiAxOiAjIExpc3Qgb3BlcmF0b3IKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBib3VuZHMgPSBbaW50KHgpIGZvciB4IGluIGVsZW0uc3BsaXQoIjoiKV0KICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcihlKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBib3VuZHMgPSBzb3J0ZWQoYm91bmRzKQogICAgICAgICAgICAgICAgaWYgbGVuKGJvdW5kcykgPiAyOgogICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyBmb3IgbGlzdCBvcGVyYXRvci4gRXhwZWN0aW5nIDIsIGdvdCB7fSIuZm9ybWF0KGxlbihib3VuZHMpKSkKCiAgICAgICAgICAgICAgICBsYWJlbHMgKz0gW2xpc3QocmFuZ2UoYm91bmRzWzBdLCBib3VuZHNbMV0rMSkpXQoKICAgICAgICAgICAgZWxpZiBlbGVtID09ICIqIjogIyBTdGFyIG9wZXJhdG9yCiAgICAgICAgICAgICAgICBkaW0gPSBzZWxmLmRpbWVuc2lvbnNfb3JkZXJbZXF1YXRpb25fYmFzaWNdW2luZGV4XQogICAgICAgICAgICAgICAgbGFiZWxzICs9IFtzZWxmLmRpbWVuc2lvbnNbZGltXVsibGFiZWxzIl1dCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBub3QgdHlwZShlbGVtKSBpcyBsaXN0OgogICAgICAgICAgICAgICAgICAgIGxhYmVscyArPSBbW2VsZW1dXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgKz0gW2VsZW1dCgogICAgICAgIHByb2R1Y3RzID0gY2FydGVzaWFuX3Byb2R1Y3QobGFiZWxzKQoKICAgICAgICByZXR1cm5fbGlzdCA9IFtdCgogICAgICAgIGZvciBwcm9kdWN0IGluIHByb2R1Y3RzOgogICAgICAgICAgICBwcm9kID0gc3RyKHByb2R1Y3QpLnJlcGxhY2UoIigiLCAiIikucmVwbGFjZSgiKSIsICIiKS5yZXBsYWNlKCJbIiwgIiIpLnJlcGxhY2UoIl0iLCAiIikucmVwbGFjZSgiJyIsICIiKS5yZXBsYWNlKCIgIiwgIiIpCiAgICAgICAgICAgIHJldHVybl9saXN0ICs9IFtzZWxmLm1lbW9pemUoZXF1YXRpb25fYmFzaWMgKyAiW3t9XSIuZm9ybWF0KHByb2QpLCB0KV0KICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIG5wLmFycmF5KHJldHVybl9saXN0KQoKCiAgICAjQWNjZXNzIGVxdWF0aW9ucyBBUEkKCiAgICBkZWYgZXF1YXRpb24oc2VsZiwgZXF1YXRpb24sIGFyZyk6CiAgICAgICAgcmV0dXJuIHNlbGYubWVtb2l6ZShlcXVhdGlvbixhcmcpCgoKICAgICNNZW1vaXplciBmb3IgZXF1YXRpb25zLiBBbHNvIGRvZXMgbW9zdCBvZiBBUEkgd29yawoKICAgIGRlZiBtZW1vaXplKHNlbGYsIGVxdWF0aW9uLCBhcmcpOgogICAgICAgIGlmIHR5cGUoZXF1YXRpb24pIGlzIGZsb2F0IG9yIHR5cGUoZXF1YXRpb24pIGlzIGludDogIyBGYWxsYmFjayBmb3IgdmFsdWVzCiAgICAgICAgICAgIHJldHVybiBlcXVhdGlvbgogICAgICAgIGlmICIqIiBpbiBlcXVhdGlvbiBvciAiOiIgaW4gZXF1YXRpb246CiAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF9kaW1lbnNpb25zKGVxdWF0aW9uLGFyZykKICAgICAgICAgICAgCiAgICAgICAgaWYgbm90IGVxdWF0aW9uIGluIHNlbGYuZXF1YXRpb25zLmtleXMoKToKCiAgICAgICAgICAgICMgbWF0Y2ggYXJyYXkgcGF0dGVybiBhbmQgZmluZCBub24tYXJyYXllZCB2YXIKICAgICAgICAgICAgaW1wb3J0IHJlCiAgICAgICAgICAgIG1hdGNoID0gcmUuZmluZGFsbChyJ1xbW2EtekEtWjEtOSxfXSpcXScsIGVxdWF0aW9uKQoKICAgICAgICAgICAgaWYgbWF0Y2g6CgogICAgICAgICAgICAgICAgZXF1YXRpb25fcmVwbGFjZWQgPSBlcXVhdGlvbi5yZXBsYWNlKG1hdGNoWzBdLCAiIikKCiAgICAgICAgICAgICAgICBpZiBlcXVhdGlvbl9yZXBsYWNlZCBpbiBzZWxmLmVxdWF0aW9uczoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5tZW1vaXplKGVxdWF0aW9uPWVxdWF0aW9uX3JlcGxhY2VkLGFyZz1hcmcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJFcXVhdGlvbiAne30nIG5vdCBmb3VuZCEiLmZvcm1hdChlcXVhdGlvbikpCgogICAgICAgIG15bWVtbyA9IHNlbGYubWVtb1tlcXVhdGlvbl0KCiAgICAgICAgaWYgYXJnIGluIG15bWVtby5rZXlzKCk6CiAgICAgICAgICAgIHJldHVybiBteW1lbW9bYXJnXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZXF1YXRpb25zW2VxdWF0aW9uXShhcmcpCiAgICAgICAgICAgIG15bWVtb1thcmddID0gcmVzdWx0CgogICAgICAgIHJldHVybiByZXN1bHQKCgogICAgZGVmIHNldERUKHNlbGYsIHYpOgogICAgICAgIHNlbGYuZHQgPSB2CgogICAgZGVmIHNldFN0YXJ0dGltZShzZWxmLCB2KToKICAgICAgICBzZWxmLnN0YXJ0dGltZSA9IHYKCiAgICBkZWYgc2V0U3RvcHRpbWUoc2VsZiwgdik6CiAgICAgICAgc2VsZi5zdG9wdGltZSA9IHYKICAgIAogICAgZGVmIHNwZWNzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnN0YXJ0dGltZSwgc2VsZi5zdG9wdGltZSwgc2VsZi5kdCwgJ01vbnRocycsICdFdWxlcicKICAgIA%3D%3D%22%2C%0A%20%20%20%20%20%20%20%20%22simulation_models%2Fcustomer_acquisition_xmile.stmx%22%3A%20%22PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHhtaWxlIHZlcnNpb249IjEuMCIgeG1sbnM9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3htaWxlL25zL1hNSUxFL3YxLjAiIHhtbG5zOmlzZWU9Imh0dHA6Ly9pc2Vlc3lzdGVtcy5jb20vWE1JTEUiPgoJPGhlYWRlcj4KCQk8c21pbGUgdmVyc2lvbj0iMS4wIiBuYW1lc3BhY2U9InN0ZCwgaXNlZSIvPgoJCTxuYW1lPmN1c3RvbWVyX2FjcXVpc2l0aW9uX3htaWxlPC9uYW1lPgoJCTx1dWlkPjFhZjAyNGUwLWI2YWQtNDVlNy1hMzZlLWFhZmI1NjUyMGExMzwvdXVpZD4KCQk8dmVuZG9yPmlzZWUgc3lzdGVtcywgaW5jLjwvdmVuZG9yPgoJCTxwcm9kdWN0IHZlcnNpb249IjIuMSIgaXNlZTpidWlsZF9udW1iZXI9IjIzMjQiIGlzZWU6c2F2ZWRfYnlfdjE9InRydWUiIGxhbmc9ImVuIj5TdGVsbGEgQXJjaGl0ZWN0PC9wcm9kdWN0PgoJPC9oZWFkZXI%2BCgk8c2ltX3NwZWNzIGlzZWU6c2ltX2R1cmF0aW9uPSIxLjI3ODY5IiBpc2VlOnNpbXVsYXRpb25fZGVsYXk9IjAuMDIxMzExNSIgaXNlZTpyZXN0b3JlX29uX3N0YXJ0PSJmYWxzZSIgbWV0aG9kPSJFdWxlciIgdGltZV91bml0cz0iTW9udGhzIiBpc2VlOmluc3RhbnRhbmVvdXNfZmxvd3M9ImZhbHNlIiBpc2VlOmxvb3Bfc2NvcmVzPSJmYWxzZSIgaXNlZTpsb29wX2V4aGF1c3RpdmVfYWxsb3dlZD0iMTAwMCI%2BCgkJPHN0YXJ0PjA8L3N0YXJ0PgoJCTxzdG9wPjYwPC9zdG9wPgoJCTxkdCByZWNpcHJvY2FsPSJ0cnVlIj4xPC9kdD4KCTwvc2ltX3NwZWNzPgoJPGlzZWU6cHJlZnMgc2hvd19tb2R1bGVfcHJlZml4PSJ0cnVlIiBsaXZlX3VwZGF0ZV9vbl9kcmFnPSJmYWxzZSIgc2hvd19yZXN0b3JlX2J1dHRvbnM9ImZhbHNlIiBsYXllcj0ibW9kZWwiIGludGVyZmFjZV9zY2FsZV91aT0idHJ1ZSIgaW50ZXJmYWNlX21heF9wYWdlX3dpZHRoPSIxMDAwMCIgaW50ZXJmYWNlX21heF9wYWdlX2hlaWdodD0iMTAwMDAiIGludGVyZmFjZV9taW5fcGFnZV93aWR0aD0iMCIgaW50ZXJmYWNlX21pbl9wYWdlX2hlaWdodD0iMCIgcmVydW5fb25fc3RydWN0dXJlX2NoYW5nZT0iZmFsc2UiIHNhdmVkX3J1bnM9IjUiIGtlZXA9ImZhbHNlIiByaWZwPSJmYWxzZSIvPgoJPGlzZWU6bXVsdGlwbGF5ZXJfc2V0dGluZ3MgaW5jbHVkZV9jaGF0PSJ0cnVlIiBhbGxvd19vYnNlcnZlcnM9ImZhbHNlIiBhZHZhbmNlX3RpbWVfaW5jcmVtZW50PSIxIiBtYXhfYWR2YW5jZV90aW1lX2luX21zPSIwIiBvYnNlcnZlcl9zdGFydF9wYWdlPSJob21lX3BhZ2UiIGVuYWJsZWQ9ImZhbHNlIi8%2BCgk8aXNlZTp0aW1lX2Zvcm1hdHMgZGVmYXVsdF9mb3JtYXQ9IkJ1aWx0aW4iPgoJCTxpc2VlOnRpbWVfZm9ybWF0IG5hbWU9IkJ1aWx0aW4iIHR5cGU9ImFkYXB0aXZlIi8%2BCgk8L2lzZWU6dGltZV9mb3JtYXRzPgoJPGRlZmF1bHRfZm9ybWF0Lz4KCTxpc2VlOnNlbnNpX3NwZWNzX2xpc3QgYWN0aXZlX2luZGV4PSIwIj4KCQk8aXNlZTpzZW5zaV9zcGVjcyBuYW1lPSJTZW5zaXRpdml0eSBBbmFseXNpcyAxIiBtZXRob2Q9Im11bHRpdmFyaWF0ZSIgcnVucz0iMCIvPgoJPC9pc2VlOnNlbnNpX3NwZWNzX2xpc3Q%2BCgk8bW9kZWxfdW5pdHMvPgoJPG1vZGVsPgoJCTx2YXJpYWJsZXM%2BCgkJCTxzdG9jayBuYW1lPSJDdXN0b21lcnMiIGFjY2Vzcz0ib3V0cHV0Ij4KCQkJCTxlcW4%2BSW5pdGlhbF9DdXN0b21lcnM8L2Vxbj4KCQkJCTxpbmZsb3c%2BQ3VzdG9tZXJfQWNxdWlzaXRpb248L2luZmxvdz4KCQkJPC9zdG9jaz4KCQkJPGZsb3cgbmFtZT0iQ3VzdG9tZXIgQWNxdWlzaXRpb24iPgoJCQkJPGVxbj5BY3F1aXNpdGlvbl90aHJvdWdoX0FkdmVydGlzaW5nK0FjcXVpc2l0aW9uX3Rocm91Z2hfV29yZF9PZl9Nb3V0aDwvZXFuPgoJCQkJPG5vbl9uZWdhdGl2ZS8%2BCgkJCTwvZmxvdz4KCQkJPGF1eCBuYW1lPSJBY3F1aXNpdGlvbiB0aHJvdWdoIEFkdmVydGlzaW5nIj4KCQkJCTxlcW4%2BY29uc3VtZXJzX3JlYWNoZWRfdGhyb3VnaF9hZHZlcnRpc2luZypBZHZlcnRpc2luZ19TdWNjZXNzPC9lcW4%2BCgkJCTwvYXV4PgoJCQk8YXV4IG5hbWU9ImNvbnN1bWVycyByZWFjaGVkIHRocm91Z2ggYWR2ZXJ0aXNpbmciPgoJCQkJPGVxbj5Db25zdW1lcnNfcmVhY2hlZF9wZXJfRXVybypBZHZlcnRpc2luZ19CdWRnZXQqKDEtTWFya2V0X1NhdHVyYXRpb24pPC9lcW4%2BCgkJCTwvYXV4PgoJCQk8YXV4IG5hbWU9IkFkdmVydGlzaW5nIFN1Y2Nlc3MiPgoJCQkJPGVxbj4wLjE8L2Vxbj4KCQkJPC9hdXg%2BCgkJCTxhdXggbmFtZT0iQ29uc3VtZXJzIHJlYWNoZWQgcGVyIEV1cm8iPgoJCQkJPGVxbj4xMDA8L2Vxbj4KCQkJPC9hdXg%2BCgkJCTxhdXggbmFtZT0iQWR2ZXJ0aXNpbmcgQnVkZ2V0IiBhY2Nlc3M9Im91dHB1dCI%2BCgkJCQk8ZXFuPjEwMDwvZXFuPgoJCQk8L2F1eD4KCQkJPGF1eCBuYW1lPSJNYXJrZXQgU2F0dXJhdGlvbiI%2BCgkJCQk8ZXFuPkN1c3RvbWVycy8oUG90ZW50aWFsX0N1c3RvbWVycytDdXN0b21lcnMpPC9lcW4%2BCgkJCTwvYXV4PgoJCQk8YXV4IG5hbWU9IkluaXRpYWwgQ3VzdG9tZXJzIj4KCQkJCTxlcW4%2BMDwvZXFuPgoJCQk8L2F1eD4KCQkJPGF1eCBuYW1lPSJBY3F1aXNpdGlvbiB0aHJvdWdoIFdvcmQgT2YgTW91dGgiPgoJCQkJPGVxbj5Db25zdW1lcnNfcmVhY2hlZF90aHJvdWdoX3dvcmRfb2ZfbW91dGgqV29yZF9vZl9tb3V0aF9zdWNjZXNzKigxLU1hcmtldF9TYXR1cmF0aW9uKTwvZXFuPgoJCQk8L2F1eD4KCQkJPGF1eCBuYW1lPSJDb250YWN0IFJhdGUiPgoJCQkJPGVxbj4xMDwvZXFuPgoJCQk8L2F1eD4KCQkJPGF1eCBuYW1lPSJDb25zdW1lcnMgcmVhY2hlZCB0aHJvdWdoIHdvcmQgb2YgbW91dGgiPgoJCQkJPGVxbj5DdXN0b21lcnMqQ29udGFjdF9SYXRlPC9lcW4%2BCgkJCTwvYXV4PgoJCQk8YXV4IG5hbWU9IldvcmQgb2YgbW91dGggc3VjY2VzcyI%2BCgkJCQk8ZXFuPjAuMDE8L2Vxbj4KCQkJPC9hdXg%2BCgkJCTxzdG9jayBuYW1lPSJQb3RlbnRpYWwgQ3VzdG9tZXJzIj4KCQkJCTxlcW4%2BSW5pdGlhbF9Qb3RlbnRpYWxfQ3VzdG9tZXJzPC9lcW4%2BCgkJCQk8b3V0Zmxvdz5DdXN0b21lcl9BY3F1aXNpdGlvbjwvb3V0Zmxvdz4KCQkJPC9zdG9jaz4KCQkJPGF1eCBuYW1lPSJJbml0aWFsIFBvdGVudGlhbCBDdXN0b21lcnMiPgoJCQkJPGVxbj42MDAwMDwvZXFuPgoJCQk8L2F1eD4KCQk8L3ZhcmlhYmxlcz4KCQk8dmlld3M%2BCgkJCTxzdHlsZSBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IndoaXRlIiBmb250X3N0eWxlPSJub3JtYWwiIGZvbnRfd2VpZ2h0PSJub3JtYWwiIHRleHRfZGVjb3JhdGlvbj0ibm9uZSIgdGV4dF9hbGlnbj0iY2VudGVyIiB2ZXJ0aWNhbF90ZXh0X2FsaWduPSJjZW50ZXIiIGZvbnRfY29sb3I9ImJsYWNrIiBmb250X2ZhbWlseT0iQXJpYWwiIGZvbnRfc2l6ZT0iMTBwdCIgcGFkZGluZz0iMiIgYm9yZGVyX2NvbG9yPSJibGFjayIgYm9yZGVyX3dpZHRoPSJ0aGluIiBib3JkZXJfc3R5bGU9Im5vbmUiPgoJCQkJPHRleHRfYm94IGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0id2hpdGUiIHRleHRfYWxpZ249ImxlZnQiIHZlcnRpY2FsX3RleHRfYWxpZ249InRvcCIgZm9udF9zaXplPSIxMnB0Ii8%2BCgkJCQk8aXNlZTpsb29wX2luZGljYXRvciBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IndoaXRlIiB0ZXh0X2FsaWduPSJsZWZ0IiB2ZXJ0aWNhbF90ZXh0X2FsaWduPSJ0b3AiIGZvbnRfc2l6ZT0iMTJwdCIvPgoJCQkJPG51bWVyaWNfZGlzcGxheSBjb2xvcj0iYmx1ZSIgYmFja2dyb3VuZD0id2hpdGUiIGZvbnRfc2l6ZT0iOXB0IiBpc2VlOnRyYW5zcGFyZW50PSJmYWxzZSIvPgoJCQkJPGdyYXBoIGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0id2hpdGUiIGZvbnRfc2l6ZT0iMTJwdCIgYXhpc19jb2xvcj0iIzY2NjY2NiIgZ3JpZF9jb2xvcj0iI0M4QzhDOCIgaXNlZTpncmFwaF9hcmVhX2NvbG9yPSJ3aGl0ZSIgbGVnZW5kX3Bvc2l0aW9uPSJib3R0b20iIGlzZWU6dHJhbnNwYXJlbnQ9ImZhbHNlIiBpc2VlOmhpZGVfYm9yZGVyPSJmYWxzZSIgYXhpc190aXRsZV9mb250X3N0eWxlPSJub3JtYWwiIGF4aXNfdGl0bGVfZm9udF93ZWlnaHQ9Im5vcm1hbCIgYXhpc190aXRsZV90ZXh0X2RlY29yYXRpb249Im5vbmUiIGF4aXNfdGl0bGVfdGV4dF9hbGlnbj0iY2VudGVyIiBheGlzX3RpdGxlX3ZlcnRpY2FsX3RleHRfYWxpZ249ImNlbnRlciIgYXhpc190aXRsZV9mb250X2NvbG9yPSJibGFjayIgYXhpc190aXRsZV9mb250X2ZhbWlseT0iQXJpYWwiIGF4aXNfdGl0bGVfZm9udF9zaXplPSIxMnB0IiBheGlzX3RpdGxlX3RleHRfcGFkZGluZz0iMiIgYXhpc190aXRsZV90ZXh0X2JvcmRlcl9jb2xvcj0iYmxhY2siIGF4aXNfdGl0bGVfdGV4dF9ib3JkZXJfd2lkdGg9InRoaW4iIGF4aXNfdGl0bGVfdGV4dF9ib3JkZXJfc3R5bGU9Im5vbmUiIGF4aXNfbGFiZWxfZm9udF9zdHlsZT0ibm9ybWFsIiBheGlzX2xhYmVsX2ZvbnRfd2VpZ2h0PSJub3JtYWwiIGF4aXNfbGFiZWxfdGV4dF9kZWNvcmF0aW9uPSJub25lIiBheGlzX2xhYmVsX3RleHRfYWxpZ249ImNlbnRlciIgYXhpc19sYWJlbF92ZXJ0aWNhbF90ZXh0X2FsaWduPSJjZW50ZXIiIGF4aXNfbGFiZWxfZm9udF9jb2xvcj0iYmxhY2siIGF4aXNfbGFiZWxfZm9udF9mYW1pbHk9IkFyaWFsIiBheGlzX2xhYmVsX2ZvbnRfc2l6ZT0iOXB0IiBheGlzX2xhYmVsX3RleHRfcGFkZGluZz0iMiIgYXhpc19sYWJlbF90ZXh0X2JvcmRlcl9jb2xvcj0iYmxhY2siIGF4aXNfbGFiZWxfdGV4dF9ib3JkZXJfd2lkdGg9InRoaW4iIGF4aXNfbGFiZWxfdGV4dF9ib3JkZXJfc3R5bGU9Im5vbmUiPgoJCQkJCTxpc2VlOnNlcmllc19zdHlsZXM%2BCgkJCQkJCTxpc2VlOnNlcmllc19zdHlsZSBjb2xvcj0iYmx1ZSIgdGhpY2tuZXNzPSIxIi8%2BCgkJCQkJCTxpc2VlOnNlcmllc19zdHlsZSBjb2xvcj0icmVkIiB0aGlja25lc3M9IjEiIHBlbl9zdHlsZT0iZG90X2Rhc2hlZCIvPgoJCQkJCQk8aXNlZTpzZXJpZXNfc3R5bGUgY29sb3I9ImZ1Y2hzaWEiIHRoaWNrbmVzcz0iMSIgcGVuX3N0eWxlPSJkb3R0ZWQiLz4KCQkJCQkJPGlzZWU6c2VyaWVzX3N0eWxlIGNvbG9yPSIjMDA4RjQ0IiB0aGlja25lc3M9IjEiIHBlbl9zdHlsZT0iZGFzaGVkIi8%2BCgkJCQkJCTxpc2VlOnNlcmllc19zdHlsZSBjb2xvcj0iI0ZGN0YwMCIgdGhpY2tuZXNzPSIxIi8%2BCgkJCQkJCTxpc2VlOnNlcmllc19zdHlsZSBjb2xvcj0iIzdGMDBGRiIgdGhpY2tuZXNzPSIxIiBwZW5fc3R5bGU9ImRvdF9kYXNoZWQiLz4KCQkJCQkJPGlzZWU6c2VyaWVzX3N0eWxlIGNvbG9yPSIjMENBMEZGIiB0aGlja25lc3M9IjEiIHBlbl9zdHlsZT0iZG90dGVkIi8%2BCgkJCQkJCTxpc2VlOnNlcmllc19zdHlsZSBjb2xvcj0ibGltZSIgdGhpY2tuZXNzPSIxIiBwZW5fc3R5bGU9ImRhc2hlZCIvPgoJCQkJCQk8aXNlZTpzZXJpZXNfc3R5bGUgY29sb3I9IiNGRjAwN0YiIHRoaWNrbmVzcz0iMSIvPgoJCQkJCQk8aXNlZTpzZXJpZXNfc3R5bGUgY29sb3I9ImFxdWEiIHRoaWNrbmVzcz0iMSIgcGVuX3N0eWxlPSJkb3RfZGFzaGVkIi8%2BCgkJCQkJCTxpc2VlOnNlcmllc19zdHlsZSBjb2xvcj0iI0Y1ODZGRiIgdGhpY2tuZXNzPSIxIiBwZW5fc3R5bGU9ImRvdHRlZCIvPgoJCQkJCQk8aXNlZTpzZXJpZXNfc3R5bGUgY29sb3I9ImJsYWNrIiB0aGlja25lc3M9IjEiIHBlbl9zdHlsZT0iZGFzaGVkIi8%2BCgkJCQkJCTxpc2VlOnNlcmllc19zdHlsZSBjb2xvcj0iI0M4QzhDOCIgdGhpY2tuZXNzPSIxIi8%2BCgkJCQkJPC9pc2VlOnNlcmllc19zdHlsZXM%2BCgkJCQk8L2dyYXBoPgoJCQkJPHRhYmxlIGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0iI0UwRTBFMCIgdGV4dF9hbGlnbj0icmlnaHQiIGZvbnRfc2l6ZT0iMTJwdCIgb3JpZW50YXRpb249InZlcnRpY2FsIiB3cmFwX3RleHQ9ImZhbHNlIiBpc2VlOmF1dG9fZml0PSJ0cnVlIiBpc2VlOnVzZV9hbHRlcm5hdGVfcm93X2NvbG9ycz0iZmFsc2UiIGlzZWU6dW5saW1pdGVkX3RhYmxlX2xlbmd0aD0iZmFsc2UiIGJsYW5rX2NvbHVtbl93aWR0aD0iODAiIGNvbHVtbl93aWR0aD0iMTYwIiBpbnRlcnZhbD0iMSIgcmVwb3J0X2JhbGFuY2VzPSJlbmRpbmciIHJlcG9ydF9mbG93cz0ic3VtbWVkIiBoZWFkZXJfZm9udF9zdHlsZT0ibm9ybWFsIiBoZWFkZXJfZm9udF93ZWlnaHQ9Im5vcm1hbCIgaGVhZGVyX3RleHRfZGVjb3JhdGlvbj0ibm9uZSIgaGVhZGVyX3RleHRfYWxpZ249ImNlbnRlciIgaGVhZGVyX3ZlcnRpY2FsX3RleHRfYWxpZ249ImNlbnRlciIgaGVhZGVyX2ZvbnRfY29sb3I9ImJsYWNrIiBoZWFkZXJfZm9udF9mYW1pbHk9IkFyaWFsIiBoZWFkZXJfZm9udF9zaXplPSIxMnB0IiBoZWFkZXJfdGV4dF9wYWRkaW5nPSIyIiBoZWFkZXJfdGV4dF9ib3JkZXJfY29sb3I9ImJsYWNrIiBoZWFkZXJfdGV4dF9ib3JkZXJfd2lkdGg9InRoaW4iIGhlYWRlcl90ZXh0X2JvcmRlcl9zdHlsZT0ibm9uZSIvPgoJCQkJPGJ1dHRvbiBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IiNFMEUwRTAiIGZvbnRfc2l6ZT0iMTJwdCIgYm9yZGVyX3dpZHRoPSJ0aGluIiBib3JkZXJfc3R5bGU9InNvbGlkIiB0cmFuc3BhcmVudD0iZmFsc2UiIGNvcm5lcl9yYWRpdXM9IjAiIGlzZWU6ZmxhdD0iZmFsc2UiIGljb25fc2lkZT0idG9wIiBpc2VlOmhpZ2hsaWdodF9vbl9ob3Zlcj0iZmFsc2UiIGlzZWU6aGlnaGxpZ2h0X2NvbG9yPSIjOTU5NTk1Ii8%2BCgkJCQk8aXNlZTphbm5vdGF0aW9uIGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0iI0UwRTBFMCIgZm9udF9zaXplPSIxMnB0IiBib3JkZXJfd2lkdGg9InRoaW4iIGJvcmRlcl9zdHlsZT0ic29saWQiIHRyYW5zcGFyZW50PSJmYWxzZSIgY29ybmVyX3JhZGl1cz0iMCIgaXNlZTpmbGF0PSJmYWxzZSIgaWNvbl9zaWRlPSJ0b3AiIGlzZWU6aGlnaGxpZ2h0X29uX2hvdmVyPSJmYWxzZSIgaXNlZTpoaWdobGlnaHRfY29sb3I9IiM5NTk1OTUiIHBvcHVwX2Nvcm5lcl9yYWRpdXM9IjAiIHBvcHVwX2JhY2tncm91bmRfY29sb3I9IiNGRkZFQ0YiLz4KCQkJCTxzbGlkZXIgY29sb3I9ImJsYWNrIiBiYWNrZ3JvdW5kPSIjRTBFMEUwIiBmb250X3NpemU9IjEycHQiIG51bV90aWNrcz0iMyIgbGFiZWxfc2lkZT0idG9wIiB3cmFwX3RpdGxlPSJ0cnVlIiB2ZXJ0aWNhbD0iZmFsc2UiIGlzZWU6ZmFuY3lfYXBwZWFyYW5jZT0iZmFsc2UiIGlzZWU6c2hvd19ob3Zlcl90aXA9IndoZW5fZGVjaWRpbmciIGlucHV0X2V4cGFuZHM9InRydWUiIGlucHV0X3dpZHRoPSIxMDAiLz4KCQkJCTxpc2VlOnNpbV9zcGVlZF9zbGlkZXIgY29sb3I9ImJsYWNrIiBiYWNrZ3JvdW5kPSJ3aGl0ZSIvPgoJCQkJPGlzZWU6dGltZV9zbGlkZXIgY29sb3I9ImJsYWNrIiBiYWNrZ3JvdW5kPSJ3aGl0ZSIvPgoJCQkJPGlzZWU6cGllX2lucHV0IGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0id2hpdGUiIGZvbnRfc2l6ZT0iMTJwdCIgbGVnZW5kX3Bvc2l0aW9uPSJib3R0b20iIGlzZWU6dHJhbnNwYXJlbnQ9ImZhbHNlIi8%2BCgkJCQk8a25vYiBjb2xvcj0iIzY2Q0M2NiIgYmFja2dyb3VuZD0iI0UwRTBFMCIgZm9udF9zaXplPSIxMnB0IiBsYWJlbF9zaWRlPSJib3R0b20iIHdyYXBfdGl0bGU9InRydWUiLz4KCQkJCTxudW1lcmljX2lucHV0IGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0iI0UwRTBFMCIgZm9udF9zaXplPSIxMnB0IiBsYWJlbF9zaWRlPSJsZWZ0IiB3cmFwX3RpdGxlPSJ0cnVlIiBpbnB1dF9leHBhbmRzPSJmYWxzZSIgaW5wdXRfd2lkdGg9IjEwMCIvPgoJCQkJPHN3aXRjaCBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IiNFMEUwRTAiIGZvbnRfc2l6ZT0iMTJwdCIgbGFiZWxfc2lkZT0idG9wIiB3cmFwX3RpdGxlPSJ0cnVlIiBpc2VlOmFwcGVhcmFuY2U9InN3aXRjaCIgaXNlZTpvbl9jb2xvcj0iZ3JlZW4iLz4KCQkJCTxvcHRpb25zIGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0id2hpdGUiIGFwcGVhcmFuY2U9InJhZGlvLWJ1dHRvbnMiIGFycmFuZ2VtZW50PSJ2ZXJ0aWNhbCIvPgoJCQkJPGdyYXBoaWNhbF9pbnB1dCBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IiNFMEUwRTAiIGZvbnRfc2l6ZT0iMTJwdCIgaXNlZTpzaG93X2hvdmVyX3RpcD0idHJ1ZSIvPgoJCQkJPGdyb3VwX2lucHV0IGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0iI0UwRTBFMCIgZm9udF9zaXplPSIxMnB0Ii8%2BCgkJCQk8bGFtcCBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IndoaXRlIiBmb250X3NpemU9IjlwdCIvPgoJCQkJPGdhdWdlIGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0id2hpdGUiIGZvbnRfc2l6ZT0iOXB0IiBuZWVkbGVfY29sb3I9IiNGMDlGNzIiIGJhcl9jb2xvcj0iI0VFRUVFRSIgYmFyX3Byb2dyZXNzX2NvbG9yPSJibGFjayIgYXBwZWFyYW5jZT0icmFkaWFsIiBudW1fbWFqb3JfdGlja3M9IjExIiBudW1fbWlub3JfdGlja3M9IjExIiBzaG93X251bWVyaWNfdmFsdWU9InRydWUiLz4KCQkJCTxpc2VlOnNwYXRpYWxfbWFwIGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0id2hpdGUiIGZvbnRfc2l6ZT0iMTJwdCIvPgoJCQkJPGlzZWU6YW5pbWF0aW9uX29iamVjdCBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IndoaXRlIiBmb250X3NpemU9IjEycHQiLz4KCQkJCTxpc2VlOm5hdmlnYXRpb25fd2lkZ2V0IGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0id2hpdGUiIHRleHRfYWxpZ249ImxlZnQiIHZlcnRpY2FsX3RleHRfYWxpZ249InRvcCIgZm9udF9zaXplPSIxMnB0IiBib3JkZXJfY29sb3I9IiM5OTk5OTkiIGJvcmRlcl93aWR0aD0idGhpbiIgYm9yZGVyX3N0eWxlPSJzb2xpZCIgaXRlbV9zcGFjaW5nPSI2IiBhcHBlYXJhbmNlPSJ0YWJzIiBjb3JuZXJfcmFkaXVzPSI0IiBzZWxlY3RlZF9pdGVtX2NvbG9yPSJibGFjayIgc2VsZWN0ZWRfaXRlbV9iYWNrZ3JvdW5kPSJ3aGl0ZSIgaXRlbV9iYWNrZ3JvdW5kPSIjREREREREIi8%2BCgkJCQk8aXNlZTpzaGFwZSBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IndoaXRlIiB0ZXh0X2FsaWduPSJsZWZ0IiB2ZXJ0aWNhbF90ZXh0X2FsaWduPSJ0b3AiIGZvbnRfc2l6ZT0iMTJwdCIgYm9yZGVyX3dpZHRoPSJ0aGluIiBib3JkZXJfc3R5bGU9InNvbGlkIiBvcGFjaXR5PSIxIiB0cmFuc3BhcmVudF9iYWNrZ3JvdW5kPSJ0cnVlIi8%2BCgkJCQk8aXNlZTpzZWxlY3RvciBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IndoaXRlIiB0ZXh0X2FsaWduPSJsZWZ0IiB2ZXJ0aWNhbF90ZXh0X2FsaWduPSJ0b3AiIGZvbnRfc2l6ZT0iMTJwdCIvPgoJCQkJPGlzZWU6aWZyYW1lIGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0id2hpdGUiIHRleHRfYWxpZ249ImxlZnQiIHZlcnRpY2FsX3RleHRfYWxpZ249InRvcCIgZm9udF9zaXplPSIxMnB0IiBib3JkZXJfd2lkdGg9InRoaW4iIGJvcmRlcl9zdHlsZT0ic29saWQiLz4KCQkJCTxpc2VlOmZpbmFuY2lhbF90YWJsZSBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IndoaXRlIiB0ZXh0X2FsaWduPSJyaWdodCIgZm9udF9zaXplPSIxMnB0IiBoaWRlX2JvcmRlcj0iZmFsc2UiIGF1dG9fZml0PSJ0cnVlIiBmaXJzdF9jb2x1bW5fd2lkdGg9IjI1MCIgb3RoZXJfY29sdW1uX3dpZHRoPSIxMDAiIGhlYWRlcl9mb250X3N0eWxlPSJub3JtYWwiIGhlYWRlcl9mb250X3dlaWdodD0iYm9sZCIgaGVhZGVyX3RleHRfZGVjb3JhdGlvbj0ibm9uZSIgaGVhZGVyX3RleHRfYWxpZ249ImNlbnRlciIgaGVhZGVyX3ZlcnRpY2FsX3RleHRfYWxpZ249ImNlbnRlciIgaGVhZGVyX2ZvbnRfY29sb3I9ImJsYWNrIiBoZWFkZXJfZm9udF9mYW1pbHk9IkFyaWFsIiBoZWFkZXJfZm9udF9zaXplPSIxNHB0IiBoZWFkZXJfdGV4dF9wYWRkaW5nPSIyIiBoZWFkZXJfdGV4dF9ib3JkZXJfY29sb3I9ImJsYWNrIiBoZWFkZXJfdGV4dF9ib3JkZXJfd2lkdGg9InRoaW4iIGhlYWRlcl90ZXh0X2JvcmRlcl9zdHlsZT0ibm9uZSIvPgoJCQk8L3N0eWxlPgoJCQk8dmlldyBpc2VlOnNob3dfcGFnZXM9ImZhbHNlIiBiYWNrZ3JvdW5kPSJ3aGl0ZSIgcGFnZV93aWR0aD0iODE4IiBwYWdlX2hlaWdodD0iNTcxIiBpc2VlOnBhZ2VfY29scz0iMiIgaXNlZTpwYWdlX3Jvd3M9IjIiIGlzZWU6c2Nyb2xsX3k9IjEiIGlzZWU6cG9wdXBfZ3JhcGhzX2FyZV9jb21wYXJhdGl2ZT0idHJ1ZSIgaXNlZTplbmFibGVfbm9uX25lZ2F0aXZlX2hpZ2hsaWdodHM9ImZhbHNlIiB0eXBlPSJzdG9ja19mbG93Ij4KCQkJCTxzdHlsZSBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IndoaXRlIiBmb250X3N0eWxlPSJub3JtYWwiIGZvbnRfd2VpZ2h0PSJub3JtYWwiIHRleHRfZGVjb3JhdGlvbj0ibm9uZSIgdGV4dF9hbGlnbj0iY2VudGVyIiB2ZXJ0aWNhbF90ZXh0X2FsaWduPSJjZW50ZXIiIGZvbnRfY29sb3I9ImJsYWNrIiBmb250X2ZhbWlseT0iQXJpYWwiIGZvbnRfc2l6ZT0iMTBwdCIgcGFkZGluZz0iMiIgYm9yZGVyX2NvbG9yPSJibGFjayIgYm9yZGVyX3dpZHRoPSJ0aGluIiBib3JkZXJfc3R5bGU9Im5vbmUiPgoJCQkJCTxzdG9jayBjb2xvcj0iYmx1ZSIgYmFja2dyb3VuZD0id2hpdGUiIGZvbnRfY29sb3I9ImJsdWUiIGZvbnRfc2l6ZT0iOXB0IiBsYWJlbF9zaWRlPSJ0b3AiPgoJCQkJCQk8c2hhcGUgdHlwZT0icmVjdGFuZ2xlIiB3aWR0aD0iNDUiIGhlaWdodD0iMzUiLz4KCQkJCQk8L3N0b2NrPgoJCQkJCTxmbG93IGNvbG9yPSJibHVlIiBiYWNrZ3JvdW5kPSJ3aGl0ZSIgZm9udF9jb2xvcj0iYmx1ZSIgZm9udF9zaXplPSI5cHQiIGxhYmVsX3NpZGU9ImJvdHRvbSIvPgoJCQkJCTxpc2VlOnBsYWNlaG9sZGVyIGNvbG9yPSIjMjI4QjIyIiBiYWNrZ3JvdW5kPSJ3aGl0ZSIgZm9udF9jb2xvcj0iIzIyOEIyMiIgbGFiZWxfc2lkZT0iYm90dG9tIi8%2BCgkJCQkJPG1vZHVsZSBjb2xvcj0iYmx1ZSIgYmFja2dyb3VuZD0id2hpdGUiIGZvbnRfY29sb3I9ImJsdWUiIGZvbnRfc2l6ZT0iOXB0IiBsYWJlbF9zaWRlPSJ0b3AiPgoJCQkJCQk8c2hhcGUgdHlwZT0icmVjdGFuZ2xlIiB3aWR0aD0iNTUiIGhlaWdodD0iNDUiLz4KCQkJCQk8L21vZHVsZT4KCQkJCQk8YXV4IGNvbG9yPSJibHVlIiBiYWNrZ3JvdW5kPSJ3aGl0ZSIgZm9udF9jb2xvcj0iYmx1ZSIgZm9udF9zaXplPSI5cHQiIGxhYmVsX3NpZGU9ImJvdHRvbSI%2BCgkJCQkJCTxzaGFwZSB0eXBlPSJjaXJjbGUiIHJhZGl1cz0iMTgiLz4KCQkJCQk8L2F1eD4KCQkJCQk8Z3JvdXAgY29sb3I9InJlZCIgYmFja2dyb3VuZD0id2hpdGUiIGZvbnRfY29sb3I9InJlZCIgZm9udF9zaXplPSI5cHQiLz4KCQkJCQk8Y29ubmVjdG9yIGNvbG9yPSIjRkYwMDdGIiBiYWNrZ3JvdW5kPSJ3aGl0ZSIgZm9udF9jb2xvcj0iI0ZGMDA3RiIgZm9udF9zaXplPSI5cHQiIGlzZWU6dGhpY2tuZXNzPSIxIi8%2BCgkJCQkJPHRleHRfYm94IGNvbG9yPSJibGFjayIgYmFja2dyb3VuZD0id2hpdGUiIHRleHRfYWxpZ249ImxlZnQiIHZlcnRpY2FsX3RleHRfYWxpZ249InRvcCIgZm9udF9zaXplPSIxMnB0Ii8%2BCgkJCQkJPGlzZWU6bG9vcF9pbmRpY2F0b3IgY29sb3I9ImJsYWNrIiBiYWNrZ3JvdW5kPSJ3aGl0ZSIvPgoJCQkJCTxudW1lcmljX2Rpc3BsYXkgY29sb3I9ImJsdWUiIGJhY2tncm91bmQ9IndoaXRlIiBmb250X3NpemU9IjlwdCIgaXNlZTp0cmFuc3BhcmVudD0iZmFsc2UiLz4KCQkJCQk8Z3JhcGggY29sb3I9ImJsYWNrIiBiYWNrZ3JvdW5kPSJ3aGl0ZSIgZm9udF9zaXplPSIxMnB0IiBheGlzX2NvbG9yPSIjNjY2NjY2IiBncmlkX2NvbG9yPSIjQzhDOEM4IiBpc2VlOmdyYXBoX2FyZWFfY29sb3I9IndoaXRlIiBsZWdlbmRfcG9zaXRpb249ImJvdHRvbSIgaXNlZTp0cmFuc3BhcmVudD0iZmFsc2UiIGlzZWU6aGlkZV9ib3JkZXI9ImZhbHNlIiBheGlzX3RpdGxlX2ZvbnRfc3R5bGU9Im5vcm1hbCIgYXhpc190aXRsZV9mb250X3dlaWdodD0ibm9ybWFsIiBheGlzX3RpdGxlX3RleHRfZGVjb3JhdGlvbj0ibm9uZSIgYXhpc190aXRsZV90ZXh0X2FsaWduPSJjZW50ZXIiIGF4aXNfdGl0bGVfdmVydGljYWxfdGV4dF9hbGlnbj0iY2VudGVyIiBheGlzX3RpdGxlX2ZvbnRfY29sb3I9ImJsYWNrIiBheGlzX3RpdGxlX2ZvbnRfZmFtaWx5PSJBcmlhbCIgYXhpc190aXRsZV9mb250X3NpemU9IjEycHQiIGF4aXNfdGl0bGVfdGV4dF9wYWRkaW5nPSIyIiBheGlzX3RpdGxlX3RleHRfYm9yZGVyX2NvbG9yPSJibGFjayIgYXhpc190aXRsZV90ZXh0X2JvcmRlcl93aWR0aD0idGhpbiIgYXhpc190aXRsZV90ZXh0X2JvcmRlcl9zdHlsZT0ibm9uZSIgYXhpc19sYWJlbF9mb250X3N0eWxlPSJub3JtYWwiIGF4aXNfbGFiZWxfZm9udF93ZWlnaHQ9Im5vcm1hbCIgYXhpc19sYWJlbF90ZXh0X2RlY29yYXRpb249Im5vbmUiIGF4aXNfbGFiZWxfdGV4dF9hbGlnbj0iY2VudGVyIiBheGlzX2xhYmVsX3ZlcnRpY2FsX3RleHRfYWxpZ249ImNlbnRlciIgYXhpc19sYWJlbF9mb250X2NvbG9yPSJibGFjayIgYXhpc19sYWJlbF9mb250X2ZhbWlseT0iQXJpYWwiIGF4aXNfbGFiZWxfZm9udF9zaXplPSI5cHQiIGF4aXNfbGFiZWxfdGV4dF9wYWRkaW5nPSIyIiBheGlzX2xhYmVsX3RleHRfYm9yZGVyX2NvbG9yPSJibGFjayIgYXhpc19sYWJlbF90ZXh0X2JvcmRlcl93aWR0aD0idGhpbiIgYXhpc19sYWJlbF90ZXh0X2JvcmRlcl9zdHlsZT0ibm9uZSI%2BCgkJCQkJCTxpc2VlOnNlcmllc19zdHlsZXM%2BCgkJCQkJCQk8aXNlZTpzZXJpZXNfc3R5bGUgY29sb3I9ImJsdWUiIHRoaWNrbmVzcz0iMSIvPgoJCQkJCQkJPGlzZWU6c2VyaWVzX3N0eWxlIGNvbG9yPSJyZWQiIHRoaWNrbmVzcz0iMSIgcGVuX3N0eWxlPSJkb3RfZGFzaGVkIi8%2BCgkJCQkJCQk8aXNlZTpzZXJpZXNfc3R5bGUgY29sb3I9ImZ1Y2hzaWEiIHRoaWNrbmVzcz0iMSIgcGVuX3N0eWxlPSJkb3R0ZWQiLz4KCQkJCQkJCTxpc2VlOnNlcmllc19zdHlsZSBjb2xvcj0iIzAwOEY0NCIgdGhpY2tuZXNzPSIxIiBwZW5fc3R5bGU9ImRhc2hlZCIvPgoJCQkJCQkJPGlzZWU6c2VyaWVzX3N0eWxlIGNvbG9yPSIjRkY3RjAwIiB0aGlja25lc3M9IjEiLz4KCQkJCQkJCTxpc2VlOnNlcmllc19zdHlsZSBjb2xvcj0iIzdGMDBGRiIgdGhpY2tuZXNzPSIxIiBwZW5fc3R5bGU9ImRvdF9kYXNoZWQiLz4KCQkJCQkJCTxpc2VlOnNlcmllc19zdHlsZSBjb2xvcj0iIzBDQTBGRiIgdGhpY2tuZXNzPSIxIiBwZW5fc3R5bGU9ImRvdHRlZCIvPgoJCQkJCQkJPGlzZWU6c2VyaWVzX3N0eWxlIGNvbG9yPSJsaW1lIiB0aGlja25lc3M9IjEiIHBlbl9zdHlsZT0iZGFzaGVkIi8%2BCgkJCQkJCQk8aXNlZTpzZXJpZXNfc3R5bGUgY29sb3I9IiNGRjAwN0YiIHRoaWNrbmVzcz0iMSIvPgoJCQkJCQkJPGlzZWU6c2VyaWVzX3N0eWxlIGNvbG9yPSJhcXVhIiB0aGlja25lc3M9IjEiIHBlbl9zdHlsZT0iZG90X2Rhc2hlZCIvPgoJCQkJCQkJPGlzZWU6c2VyaWVzX3N0eWxlIGNvbG9yPSIjRjU4NkZGIiB0aGlja25lc3M9IjEiIHBlbl9zdHlsZT0iZG90dGVkIi8%2BCgkJCQkJCQk8aXNlZTpzZXJpZXNfc3R5bGUgY29sb3I9ImJsYWNrIiB0aGlja25lc3M9IjEiIHBlbl9zdHlsZT0iZGFzaGVkIi8%2BCgkJCQkJCQk8aXNlZTpzZXJpZXNfc3R5bGUgY29sb3I9IiNDOEM4QzgiIHRoaWNrbmVzcz0iMSIvPgoJCQkJCQk8L2lzZWU6c2VyaWVzX3N0eWxlcz4KCQkJCQk8L2dyYXBoPgoJCQkJCTx0YWJsZSBjb2xvcj0iYmxhY2siIGJhY2tncm91bmQ9IiNFMEUwRTAiIHRleHRfYWxpZ249InJpZ2h0IiBmb250X3NpemU9IjEycHQiIG9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgd3JhcF90ZXh0PSJmYWxzZSIgaXNlZTphdXRvX2ZpdD0idHJ1ZSIgaXNlZTp1c2VfYWx0ZXJuYXRlX3Jvd19jb2xvcnM9ImZhbHNlIiBpc2VlOnVubGltaXRlZF90YWJsZV9sZW5ndGg9ImZhbHNlIiBibGFua19jb2x1bW5fd2lkdGg9IjgwIiBjb2x1bW5fd2lkdGg9IjE2MCIgaW50ZXJ2YWw9IjEiIHJlcG9ydF9iYWxhbmNlcz0iZW5kaW5nIiByZXBvcnRfZmxvd3M9InN1bW1lZCIgaGVhZGVyX2ZvbnRfc3R5bGU9Im5vcm1hbCIgaGVhZGVyX2ZvbnRfd2VpZ2h0PSJub3JtYWwiIGhlYWRlcl90ZXh0X2RlY29yYXRpb249Im5vbmUiIGhlYWRlcl90ZXh0X2FsaWduPSJjZW50ZXIiIGhlYWRlcl92ZXJ0aWNhbF90ZXh0X2FsaWduPSJjZW50ZXIiIGhlYWRlcl9mb250X2NvbG9yPSJibGFjayIgaGVhZGVyX2ZvbnRfZmFtaWx5PSJBcmlhbCIgaGVhZGVyX2ZvbnRfc2l6ZT0iMTJwdCIgaGVhZGVyX3RleHRfcGFkZGluZz0iMiIgaGVhZGVyX3RleHRfYm9yZGVyX2NvbG9yPSJibGFjayIgaGVhZGVyX3RleHRfYm9yZGVyX3dpZHRoPSJ0aGluIiBoZWFkZXJfdGV4dF9ib3JkZXJfc3R5bGU9Im5vbmUiLz4KCQkJCTwvc3R5bGU%2BCgkJCQk8Y29ubmVjdG9yIHVpZD0iMiIgYW5nbGU9IjEwNC4wMzYiPgoJCQkJCTxmcm9tPkFkdmVydGlzaW5nX1N1Y2Nlc3M8L2Zyb20%2BCgkJCQkJPHRvPkFjcXVpc2l0aW9uX3Rocm91Z2hfQWR2ZXJ0aXNpbmc8L3RvPgoJCQkJPC9jb25uZWN0b3I%2BCgkJCQk8Y29ubmVjdG9yIHVpZD0iMyIgYW5nbGU9IjgxLjc3MzMiPgoJCQkJCTxmcm9tPkFjcXVpc2l0aW9uX3Rocm91Z2hfQWR2ZXJ0aXNpbmc8L2Zyb20%2BCgkJCQkJPHRvPkN1c3RvbWVyX0FjcXVpc2l0aW9uPC90bz4KCQkJCTwvY29ubmVjdG9yPgoJCQkJPGNvbm5lY3RvciB1aWQ9IjQiIGFuZ2xlPSI4MS4yNTM4Ij4KCQkJCQk8ZnJvbT5Db25zdW1lcnNfcmVhY2hlZF9wZXJfRXVybzwvZnJvbT4KCQkJCQk8dG8%2BY29uc3VtZXJzX3JlYWNoZWRfdGhyb3VnaF9hZHZlcnRpc2luZzwvdG8%2BCgkJCQk8L2Nvbm5lY3Rvcj4KCQkJCTxjb25uZWN0b3IgdWlkPSI1IiBhbmdsZT0iMTAyLjUyOSI%2BCgkJCQkJPGZyb20%2BY29uc3VtZXJzX3JlYWNoZWRfdGhyb3VnaF9hZHZlcnRpc2luZzwvZnJvbT4KCQkJCQk8dG8%2BQWNxdWlzaXRpb25fdGhyb3VnaF9BZHZlcnRpc2luZzwvdG8%2BCgkJCQk8L2Nvbm5lY3Rvcj4KCQkJCTxjb25uZWN0b3IgdWlkPSI3IiBhbmdsZT0iOTAiPgoJCQkJCTxmcm9tPk1hcmtldF9TYXR1cmF0aW9uPC9mcm9tPgoJCQkJCTx0bz5jb25zdW1lcnNfcmVhY2hlZF90aHJvdWdoX2FkdmVydGlzaW5nPC90bz4KCQkJCTwvY29ubmVjdG9yPgoJCQkJPGNvbm5lY3RvciB1aWQ9IjgiIGFuZ2xlPSIxMi45OTQ2Ij4KCQkJCQk8ZnJvbT5DdXN0b21lcnM8L2Zyb20%2BCgkJCQkJPHRvPk1hcmtldF9TYXR1cmF0aW9uPC90bz4KCQkJCTwvY29ubmVjdG9yPgoJCQkJPGNvbm5lY3RvciB1aWQ9IjkiIGFuZ2xlPSI3Ny40NzEyIj4KCQkJCQk8ZnJvbT5BZHZlcnRpc2luZ19CdWRnZXQ8L2Zyb20%2BCgkJCQkJPHRvPmNvbnN1bWVyc19yZWFjaGVkX3Rocm91Z2hfYWR2ZXJ0aXNpbmc8L3RvPgoJCQkJPC9jb25uZWN0b3I%2BCgkJCQk8c3RvY2sgeD0iNDc0IiB5PSIxMDUiIG5hbWU9IkN1c3RvbWVycyIvPgoJCQkJPGZsb3cgeD0iMzIyIiB5PSIxMDUiIG5hbWU9IkN1c3RvbWVyIEFjcXVpc2l0aW9uIj4KCQkJCQk8cHRzPgoJCQkJCQk8cHQgeD0iMjA0LjUiIHk9IjEwNSIvPgoJCQkJCQk8cHQgeD0iNDUxLjUiIHk9IjEwNSIvPgoJCQkJCTwvcHRzPgoJCQkJPC9mbG93PgoJCQkJPGF1eCB4PSIzMTAiIHk9IjE4OCIgbmFtZT0iQWNxdWlzaXRpb24gdGhyb3VnaCBBZHZlcnRpc2luZyIvPgoJCQkJPGF1eCB4PSIyMDkiIHk9IjI3MiIgbmFtZT0iY29uc3VtZXJzIHJlYWNoZWQgdGhyb3VnaCBhZHZlcnRpc2luZyIvPgoJCQkJPGF1eCB4PSIzOTYiIHk9IjI5MyIgbmFtZT0iQWR2ZXJ0aXNpbmcgU3VjY2VzcyIvPgoJCQkJPGF1eCB4PSIxMDQiIHk9IjM0OCIgbmFtZT0iQ29uc3VtZXJzIHJlYWNoZWQgcGVyIEV1cm8iLz4KCQkJCTxhdXggeD0iMjY1IiB5PSIzNjkiIG5hbWU9IkFkdmVydGlzaW5nIEJ1ZGdldCIvPgoJCQkJPGF1eCB4PSIzNTgiIHk9IjQwNSIgbmFtZT0iTWFya2V0IFNhdHVyYXRpb24iLz4KCQkJCTxhdXggeD0iNTI3IiB5PSIzMi41IiBuYW1lPSJJbml0aWFsIEN1c3RvbWVycyIvPgoJCQkJPGF1eCB4PSI0NzkiIHk9IjE5NCIgbmFtZT0iQWNxdWlzaXRpb24gdGhyb3VnaCBXb3JkIE9mIE1vdXRoIi8%2BCgkJCQk8Y29ubmVjdG9yIHVpZD0iMjMiIGFuZ2xlPSI1LjE5NDQzIj4KCQkJCQk8ZnJvbT5NYXJrZXRfU2F0dXJhdGlvbjwvZnJvbT4KCQkJCQk8dG8%2BQWNxdWlzaXRpb25fdGhyb3VnaF9Xb3JkX09mX01vdXRoPC90bz4KCQkJCTwvY29ubmVjdG9yPgoJCQkJPGNvbm5lY3RvciB1aWQ9IjI4IiBhbmdsZT0iMTc2LjgyIj4KCQkJCQk8ZnJvbT5BY3F1aXNpdGlvbl90aHJvdWdoX1dvcmRfT2ZfTW91dGg8L2Zyb20%2BCgkJCQkJPHRvPkN1c3RvbWVyX0FjcXVpc2l0aW9uPC90bz4KCQkJCTwvY29ubmVjdG9yPgoJCQkJPGF1eCB4PSI2MzciIHk9IjI4MiIgbmFtZT0iQ29udGFjdCBSYXRlIi8%2BCgkJCQk8YXV4IGxhYmVsX3NpZGU9InJpZ2h0IiBsYWJlbF9hbmdsZT0iMzE1IiB4PSI2MDEiIHk9IjE4OCIgbmFtZT0iQ29uc3VtZXJzIHJlYWNoZWQgdGhyb3VnaCB3b3JkIG9mIG1vdXRoIi8%2BCgkJCQk8Y29ubmVjdG9yIHVpZD0iMzQiIGFuZ2xlPSI3Ljg1MzMxIj4KCQkJCQk8ZnJvbT5DdXN0b21lcnM8L2Zyb20%2BCgkJCQkJPHRvPkNvbnN1bWVyc19yZWFjaGVkX3Rocm91Z2hfd29yZF9vZl9tb3V0aDwvdG8%2BCgkJCQk8L2Nvbm5lY3Rvcj4KCQkJCTxjb25uZWN0b3IgdWlkPSIzNSIgYW5nbGU9IjExMC45NTYiPgoJCQkJCTxmcm9tPkNvbnRhY3RfUmF0ZTwvZnJvbT4KCQkJCQk8dG8%2BQ29uc3VtZXJzX3JlYWNoZWRfdGhyb3VnaF93b3JkX29mX21vdXRoPC90bz4KCQkJCTwvY29ubmVjdG9yPgoJCQkJPGNvbm5lY3RvciB1aWQ9IjM2IiBhbmdsZT0iMjM5LjAzNiI%2BCgkJCQkJPGZyb20%2BQ29uc3VtZXJzX3JlYWNoZWRfdGhyb3VnaF93b3JkX29mX21vdXRoPC9mcm9tPgoJCQkJCTx0bz5BY3F1aXNpdGlvbl90aHJvdWdoX1dvcmRfT2ZfTW91dGg8L3RvPgoJCQkJPC9jb25uZWN0b3I%2BCgkJCQk8YXV4IHg9IjU0MSIgeT0iMzg3IiBuYW1lPSJXb3JkIG9mIG1vdXRoIHN1Y2Nlc3MiLz4KCQkJCTxjb25uZWN0b3IgdWlkPSIzNyIgYW5nbGU9IjkyLjg2MjQiPgoJCQkJCTxmcm9tPldvcmRfb2ZfbW91dGhfc3VjY2VzczwvZnJvbT4KCQkJCQk8dG8%2BQWNxdWlzaXRpb25fdGhyb3VnaF9Xb3JkX09mX01vdXRoPC90bz4KCQkJCTwvY29ubmVjdG9yPgoJCQkJPHN0b2NrIHg9IjE4MiIgeT0iMTAyIiBuYW1lPSJQb3RlbnRpYWwgQ3VzdG9tZXJzIi8%2BCgkJCQk8YXV4IHg9IjExMCIgeT0iMzIuNSIgbmFtZT0iSW5pdGlhbCBQb3RlbnRpYWwgQ3VzdG9tZXJzIi8%2BCgkJCQk8Y29ubmVjdG9yIHVpZD0iMzgiIGFuZ2xlPSIxOTYuOTI4Ij4KCQkJCQk8ZnJvbT5Qb3RlbnRpYWxfQ3VzdG9tZXJzPC9mcm9tPgoJCQkJCTx0bz5NYXJrZXRfU2F0dXJhdGlvbjwvdG8%2BCgkJCQk8L2Nvbm5lY3Rvcj4KCQkJPC92aWV3PgoJCQk8dmlldyBiYWNrZ3JvdW5kPSJ3aGl0ZSIgcGFnZV93aWR0aD0iODAwIiBwYWdlX2hlaWdodD0iNjAwIiBob21lX3ZpZXc9InRydWUiIHR5cGU9ImludGVyZmFjZSI%2BCgkJCQk8c3R5bGUvPgoJCQkJPHN0YWNrZWRfY29udGFpbmVyIHg9IjYyIiB5PSI1MCIgd2lkdGg9IjY2NCIgaGVpZ2h0PSIyNTAiIHZpc2libGVfaW5kZXg9IjEiPgoJCQkJCTxncmFwaCBpc2VlOmdyYXBoX2FyZWFfY29sb3I9IndoaXRlIiB3aWR0aD0iNjY0IiBoZWlnaHQ9IjI1MCIgdHlwZT0idGltZV9zZXJpZXMiIGlzZWU6cG9pbnRzX29ubHk9ImZhbHNlIiBzaG93X2dyaWQ9ImZhbHNlIiBpbmNsdWRlX3VuaXRzX2luX2xlZ2VuZD0iZmFsc2UiIHBsb3RfbnVtYmVycz0iZmFsc2UiIGlzZWU6bGFiZWxfcGllX3NsaWNlcz0iZmFsc2UiIG51bV94X2dyaWRfbGluZXM9IjAiIG51bV95X2dyaWRfbGluZXM9IjAiIG51bV94X2xhYmVscz0iNSIgbnVtX3lfbGFiZWxzPSIzIiB0aXRsZT0iUHJvZml0IiBpc2VlOmZpbGxfaW50ZW5zaXR5PSIwLjEiIGlzZWU6YWxsb3dfemVyb19heGlzPSJ0cnVlIiBsZWZ0X2F4aXNfbXVsdGlfc2NhbGU9ImZhbHNlIiBsZWZ0X2F4aXNfYXV0b19zY2FsZT0idHJ1ZSIgbGVmdF9pbmNsdWRlX3VuaXRzPSJ0cnVlIiByaWdodF9heGlzX211bHRpX3NjYWxlPSJmYWxzZSIgcmlnaHRfYXhpc19hdXRvX3NjYWxlPSJ0cnVlIiByaWdodF9pbmNsdWRlX3VuaXRzPSJ0cnVlIi8%2BCgkJCQkJPGdyYXBoIGlzZWU6Z3JhcGhfYXJlYV9jb2xvcj0id2hpdGUiIHdpZHRoPSI2NjQiIGhlaWdodD0iMjUwIiB0eXBlPSJ0aW1lX3NlcmllcyIgaXNlZTpwb2ludHNfb25seT0iZmFsc2UiIHNob3dfZ3JpZD0iZmFsc2UiIGluY2x1ZGVfdW5pdHNfaW5fbGVnZW5kPSJmYWxzZSIgcGxvdF9udW1iZXJzPSJmYWxzZSIgaXNlZTpsYWJlbF9waWVfc2xpY2VzPSJmYWxzZSIgbnVtX3hfZ3JpZF9saW5lcz0iMCIgbnVtX3lfZ3JpZF9saW5lcz0iMCIgbnVtX3hfbGFiZWxzPSI1IiBudW1feV9sYWJlbHM9IjMiIHRpdGxlPSJDdXN0b21lcnMiIGlzZWU6ZmlsbF9pbnRlbnNpdHk9IjAuMSIgaXNlZTphbGxvd196ZXJvX2F4aXM9InRydWUiIGxlZnRfYXhpc19tdWx0aV9zY2FsZT0iZmFsc2UiIGxlZnRfYXhpc19hdXRvX3NjYWxlPSJ0cnVlIiBsZWZ0X2luY2x1ZGVfdW5pdHM9InRydWUiIHJpZ2h0X2F4aXNfbXVsdGlfc2NhbGU9ImZhbHNlIiByaWdodF9heGlzX2F1dG9fc2NhbGU9InRydWUiIHJpZ2h0X2luY2x1ZGVfdW5pdHM9InRydWUiPgoJCQkJCQk8cGxvdCBpc2VlOmltbWVkaWF0ZWx5X3VwZGF0ZV9vbl91c2VyX2lucHV0PSJ0cnVlIiBjb2xvcj0iYmx1ZSIgaXNlZTprZWVwX3plcm9fdmlzaWJsZT0iZmFsc2UiIHBlbl93aWR0aD0iMSIgaW5kZXg9IjAiIHNob3dfeV9heGlzPSJ0cnVlIj4KCQkJCQkJCTxlbnRpdHkgbmFtZT0iQ3VzdG9tZXJzIi8%2BCgkJCQkJCTwvcGxvdD4KCQkJCQk8L2dyYXBoPgoJCQkJPC9zdGFja2VkX2NvbnRhaW5lcj4KCQkJCTxzbGlkZXIgeD0iMTcwIiB5PSIzNTQiIGlzZWU6bmF2aWdhdGVfdG89ImZhbHNlIiBzaG93X25hbWU9InRydWUiPgoJCQkJCTxyZXNldF90byBhZnRlcj0ibmV2ZXIiPjA8L3Jlc2V0X3RvPgoJCQkJPC9zbGlkZXI%2BCgkJCQk8c2xpZGVyIHg9IjQwMSIgeT0iMzU0IiBpc2VlOm5hdmlnYXRlX3RvPSJmYWxzZSIgc2hvd19uYW1lPSJ0cnVlIj4KCQkJCQk8cmVzZXRfdG8gYWZ0ZXI9Im5ldmVyIj4wPC9yZXNldF90bz4KCQkJCTwvc2xpZGVyPgoJCQkJPHNsaWRlciB4PSI2MDkiIHk9IjM1NCIgaXNlZTpuYXZpZ2F0ZV90bz0iZmFsc2UiIHNob3dfbmFtZT0idHJ1ZSI%2BCgkJCQkJPHJlc2V0X3RvIGFmdGVyPSJuZXZlciI%2BMDwvcmVzZXRfdG8%2BCgkJCQk8L3NsaWRlcj4KCQkJCTxidXR0b24gbGFiZWw9IiIgeD0iOTEiIHk9IjQzMCI%2BCgkJCQkJPGFjdGlvbnM%2BCgkJCQkJCTxhY3Rpb24%2Bc3RhcnQ8L2FjdGlvbj4KCQkJCQk8L2FjdGlvbnM%2BCgkJCQk8L2J1dHRvbj4KCQkJPC92aWV3PgoJCQk8aXNlZTp0ZW1wbGF0ZXM%2BCgkJCQk8dmlldyBiYWNrZ3JvdW5kPSJ3aGl0ZSIgcGFnZV93aWR0aD0iODAwIiBwYWdlX2hlaWdodD0iNjAwIiB0eXBlPSJ0ZW1wbGF0ZSI%2BCgkJCQkJPHN0eWxlLz4KCQkJCTwvdmlldz4KCQkJPC9pc2VlOnRlbXBsYXRlcz4KCQkJPGlzZWU6c3Rvcmllcy8%2BCgkJPC92aWV3cz4KCTwvbW9kZWw%2BCjwveG1pbGU%2BCgo%3D%22%2C%0A%20%20%20%20%7D%0A%20%20%20%20for%20_pfad%2C%20_inhalt%20in%20_dateien.items()%3A%0A%20%20%20%20%20%20%20%20_ordner%20%3D%20__import__(%22os%22).path.dirname(_pfad)%0A%20%20%20%20%20%20%20%20if%20_ordner%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20__import__(%22os%22).makedirs(_ordner%2C%20exist_ok%3DTrue)%0A%20%20%20%20%20%20%20%20with%20open(_pfad%2C%20%22wb%22)%20as%20_ziel%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_ziel.write(__import__(%22base64%22).b64decode(_inhalt))
import%20marimo%20as%20mo
Customer Acquisition as an XMILE Model
Many modelers prefer to build models using visual modeling environments and not directly in code. One such environment is Stella Architect. Using Stella Architect, you can build System Dynamics models visually. You can then import them into Python using BPTK and work with them much like with any other model.
The framework automatically re-transpiles the XMILE model if changes are made in the visual modeling environment. So you can model in Stella Architect and experiment with scenarios in a notebook.
Transpiled models work stand-alone, so you can run them anywhere independently of the modeling environment.
Setting Up The Model
This is what our customer acquisition model looks like in Stella Architect:
Setting Up The Scenarios
To work with XMILE models, all we have to do is set up a scenario file in the scenarios folder.
The scenario file tells the framework where to find the XMILE model and which scenarios to set up.
In our case the file looks like this - the only difference to the SD DSL scenario definition is the inclusion of the XMILE source.
{
"xmile_customer_acquisition" :
{
"source" : "simulation_models/customer_acquisition_xmile.stmx" ,
"model" : "simulation_models/customer_acquisition_xmile" ,
"scenarios" :
{
"base" : { },
"low_word_of_mouth" :{
"constants" :{
"wordOfMouthSuccess" : 0.001
}
},
"high_word_of_mouth" :{
"constants" :{
"wordOfMouthSuccess" : 0.1
}
}
}
}
}
As soon as we instantiate bptk, the framework automatically searches the scenarios folder for scenarios and loads them.
Let’s list all the scenarios and equations the framework finds.
Available Equations:
Scenario Manager: xmile_customer_acquisition
Scenario: base
--------------------------
stock: customers
stock: potentialCustomers
flow: customerAcquisition
converter: acquisitionThroughAdvertising
converter: acquisitionThroughWordOfMouth
converter: advertisingBudget
converter: advertisingSuccess
converter: consumersReachedPerEuro
converter: consumersReachedThroughAdvertising
converter: consumersReachedThroughWordOfMouth
converter: contactRate
converter: initialCustomers
converter: initialPotentialCustomers
converter: marketSaturation
converter: wordOfMouthSuccess
Scenario: low_word_of_mouth
--------------------------
stock: customers
stock: potentialCustomers
flow: customerAcquisition
converter: acquisitionThroughAdvertising
converter: acquisitionThroughWordOfMouth
converter: advertisingBudget
converter: advertisingSuccess
converter: consumersReachedPerEuro
converter: consumersReachedThroughAdvertising
converter: consumersReachedThroughWordOfMouth
converter: contactRate
converter: initialCustomers
converter: initialPotentialCustomers
converter: marketSaturation
converter: wordOfMouthSuccess
Scenario: high_word_of_mouth
--------------------------
stock: customers
stock: potentialCustomers
flow: customerAcquisition
converter: acquisitionThroughAdvertising
converter: acquisitionThroughWordOfMouth
converter: advertisingBudget
converter: advertisingSuccess
converter: consumersReachedPerEuro
converter: consumersReachedThroughAdvertising
converter: consumersReachedThroughWordOfMouth
converter: contactRate
converter: initialCustomers
converter: initialPotentialCustomers
converter: marketSaturation
converter: wordOfMouthSuccess
We directly plot the scenarios:
NOTE: Once the XMILE file has been transpiled into a Python model, the framework is independent of the XMILE file. All simulation is done in Python. The software that was used to create the XMILE file is not needed by the BPTK framework.