verbose: false
spec:
  command: ''
  build:
    auto_build: true
    code_origin: ''
    with_mlrun: true
    requirements:
    - azureml-core==1.54.0.post1
    - azureml-train-automl-client==1.54.0.post1
    - plotly~=5.4
    functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKaW1wb3J0IG9zCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmZyb20gdHlwaW5nIGltcG9ydCBUdXBsZSwgTGlzdAoKZnJvbSBtbHJ1biBpbXBvcnQgTUxDbGllbnRDdHgsIERhdGFJdGVtLCBnZXRfZGF0YWl0ZW0KaW1wb3J0IG1scnVuLmZlYXR1cmVfc3RvcmUgYXMgZl9zdG9yZQppbXBvcnQgbWxydW4uZGF0YXN0b3JlCmltcG9ydCBtbHJ1bi51dGlscwpmcm9tIG1scnVuLmRhdGFzdG9yZS50YXJnZXRzIGltcG9ydCBQYXJxdWV0VGFyZ2V0Cgpmcm9tIGF6dXJlbWwuY29yZS5hdXRoZW50aWNhdGlvbiBpbXBvcnQgU2VydmljZVByaW5jaXBhbEF1dGhlbnRpY2F0aW9uCmZyb20gYXp1cmVtbC5jb3JlLndvcmtzcGFjZSBpbXBvcnQgV29ya3NwYWNlCmZyb20gYXp1cmVtbC5jb3JlLmV4cGVyaW1lbnQgaW1wb3J0IEV4cGVyaW1lbnQKZnJvbSBhenVyZW1sLmNvcmUuZGF0YXNldCBpbXBvcnQgRGF0YXNldApmcm9tIGF6dXJlbWwuY29yZS5tb2RlbCBpbXBvcnQgTW9kZWwKZnJvbSBhenVyZW1sLmNvcmUuY29tcHV0ZSBpbXBvcnQgQ29tcHV0ZVRhcmdldCwgQW1sQ29tcHV0ZQpmcm9tIGF6dXJlbWwuY29yZS5jb21wdXRlX3RhcmdldCBpbXBvcnQgQ29tcHV0ZVRhcmdldEV4Y2VwdGlvbgpmcm9tIGF6dXJlbWwuY29yZS5zY3JpcHRfcnVuIGltcG9ydCBTY3JpcHRSdW4KCmZyb20gYXp1cmVtbC50cmFpbi5hdXRvbWwgaW1wb3J0IEF1dG9NTENvbmZpZwpmcm9tIGF6dXJlbWwudHJhaW4uYXV0b21sLnJ1biBpbXBvcnQgQXV0b01MUnVuCgoKZGVmIF9lbnZfb3Jfc2VjcmV0KGNvbnRleHQsIGtleSk6CiAgICBpZiBrZXkgaW4gb3MuZW52aXJvbjoKICAgICAgICByZXR1cm4gb3MuZW52aXJvbltrZXldCiAgICByZXR1cm4gY29udGV4dC5nZXRfc2VjcmV0KGtleSkKCgpkZWYgX2xvYWRfd29ya3NwYWNlKGNvbnRleHQ6IE1MQ2xpZW50Q3R4KSAtPiBXb3Jrc3BhY2U6CiAgICAiIiIKICAgIExvYWRpbmcgQXp1cmVNTCBXb3Jrc3BhY2Ugd2l0aCBBenVyZSBzZWNyZXRzLgoKICAgIDpwYXJhbSBjb250ZXh0OiBNTFJ1biBjb250ZXh0LgogICAgOnJldHVybnM6ICAgICAgIEF6dXJlTUwgV29ya3NwYWNlCiAgICAiIiIKCiAgICBpZiBoYXNhdHRyKGNvbnRleHQsICJfYXp1cmVfd29ya3NwYWNlIik6CiAgICAgICAgcmV0dXJuIGNvbnRleHQuX2F6dXJlX3dvcmtzcGFjZQoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oIkxvYWRpbmcgQXp1cmVNTCBXb3Jrc3BhY2UiKQogICAgIyBBenVyZSBzZXJ2aWNlIGF1dGhlbnRpY2F0aW9uOgogICAgc2VydmljZV9hdXRoZW50aWNhdGlvbiA9IFNlcnZpY2VQcmluY2lwYWxBdXRoZW50aWNhdGlvbigKICAgICAgICB0ZW5hbnRfaWQ9X2Vudl9vcl9zZWNyZXQoY29udGV4dCwgIkFaVVJFX1RFTkFOVF9JRCIpLAogICAgICAgIHNlcnZpY2VfcHJpbmNpcGFsX2lkPV9lbnZfb3Jfc2VjcmV0KGNvbnRleHQsICJBWlVSRV9TRVJWSUNFX1BSSU5DSVBBTF9JRCIpLAogICAgICAgIHNlcnZpY2VfcHJpbmNpcGFsX3Bhc3N3b3JkPV9lbnZfb3Jfc2VjcmV0KAogICAgICAgICAgICBjb250ZXh0LCAiQVpVUkVfU0VSVklDRV9QUklOQ0lQQUxfUEFTU1dPUkQiCiAgICAgICAgKSwKICAgICkKCiAgICAjIExvYWRpbmcgQXp1cmUgd29ya3NwYWNlOgogICAgd29ya3NwYWNlID0gV29ya3NwYWNlKAogICAgICAgIHN1YnNjcmlwdGlvbl9pZD1fZW52X29yX3NlY3JldChjb250ZXh0LCAiQVpVUkVfU1VCU0NSSVBUSU9OX0lEIiksCiAgICAgICAgcmVzb3VyY2VfZ3JvdXA9X2Vudl9vcl9zZWNyZXQoY29udGV4dCwgIkFaVVJFX1JFU09VUkNFX0dST1VQIiksCiAgICAgICAgd29ya3NwYWNlX25hbWU9X2Vudl9vcl9zZWNyZXQoY29udGV4dCwgIkFaVVJFX1dPUktTUEFDRV9OQU1FIiksCiAgICAgICAgYXV0aD1zZXJ2aWNlX2F1dGhlbnRpY2F0aW9uLAogICAgKQoKICAgIGNvbnRleHQuX2F6dXJlX3dvcmtzcGFjZSA9IHdvcmtzcGFjZQogICAgcmV0dXJuIHdvcmtzcGFjZQoKCmRlZiBfaW5pdF9leHBlcmltZW50KAogICAgY29udGV4dDogTUxDbGllbnRDdHgsIGV4cGVyaW1lbnRfbmFtZTogc3RyCikgLT4gVHVwbGVbV29ya3NwYWNlLCBFeHBlcmltZW50XToKICAgICIiIgogICAgSW5pdGlhbGl6ZSB3b3Jrc3BhY2UgYW5kIGV4cGVyaW1lbnQgaW4gQXp1cmUgTUwuIFVzZXMgU2VydmljZQogICAgUHJpbmNpcGFsIGF1dGhlbnRpY2F0aW9uIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgTUxSdW4gY29udGV4dC4KICAgIDpwYXJhbSBleHBlcmltZW50X25hbWU6IE5hbWUgb2YgZXhwZXJpbWVudCB0byBjcmVhdGUgaW4gQXp1cmUgTUwuCiAgICA6cmV0dXJuczogICAgICAgICAgICAgICBBenVyZSBNTCBXb3Jrc3BhY2UgYW5kIEV4cGVyaW1lbnQuCiAgICAiIiIKCiAgICAjIEluaXRpYWxpemUgZXhwZXJpbWVudCB2aWEgU2VydmljZSBQcmluY2lwYWwgQXV0aGVudGljYXRpb246CiAgICAjIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL21hY2hpbmUtbGVhcm5pbmcvaG93LXRvLXNldHVwLWF1dGhlbnRpY2F0aW9uI3VzZS1zZXJ2aWNlLXByaW5jaXBhbC1hdXRoZW50aWNhdGlvbgoKICAgIHdvcmtzcGFjZSA9IF9sb2FkX3dvcmtzcGFjZShjb250ZXh0KQoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJJbml0aWFsaXppbmcgQXp1cmVNTCBleHBlcmltZW50IHtleHBlcmltZW50X25hbWV9IikKICAgICMgQ3JlYXRpbmcgZXhwZXJpbWVudDoKICAgIGV4cGVyaW1lbnQgPSBFeHBlcmltZW50KHdvcmtzcGFjZSwgZXhwZXJpbWVudF9uYW1lKQoKICAgIHJldHVybiB3b3Jrc3BhY2UsIGV4cGVyaW1lbnQKCgpkZWYgaW5pdF9jb21wdXRlKAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBjcHVfY2x1c3Rlcl9uYW1lOiBzdHIsCiAgICB2bV9zaXplOiBzdHIgPSAiU1RBTkRBUkRfRDJfVjIiLAogICAgbWF4X25vZGVzOiBpbnQgPSAxLAopIC0+IENvbXB1dGVUYXJnZXQ6CiAgICAiIiIKICAgIEluaXRpYWxpemUgQXp1cmUgTUwgY29tcHV0ZSB0YXJnZXQgdG8gcnVuIGV4cGVyaW1lbnQuIENoZWNrcyBmb3IKICAgIGV4aXN0aW5nIGNvbXB1dGUgdGFyZ2V0IGFuZCBjcmVhdGVzIG5ldyBpZiBkb2VzIG5vdCBleGlzdC4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgTUxSdW4gY29udGV4dC4KICAgIDpwYXJhbSBjcHVfY2x1c3Rlcl9uYW1lOiBOYW1lIG9mIEF6dXJlIE1MIGNvbXB1dGUgdGFyZ2V0LiBDcmVhdGVkIGlmIGRvZXMgbm90IGV4aXN0LgogICAgOnBhcmFtIHZtX3NpemU6ICAgICAgICAgIEF6dXJlIG1hY2hpbmUgdHlwZSBmb3IgY29tcHV0ZSB0YXJnZXQuCiAgICA6cGFyYW0gbWF4X25vZGVzOiAgICAgICAgTWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBjb21wdXRlIHRhcmdldHMuCiAgICA6cmV0dXJuczogICAgICAgICAgICAgICAgQXp1cmUgTUwgQ29tcHV0ZSBUYXJnZXQuCiAgICAiIiIKCiAgICB3b3Jrc3BhY2UgPSBfbG9hZF93b3Jrc3BhY2UoY29udGV4dCkKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJJbml0aWFsaXppbmcgQXp1cmVNTCBjb21wdXRlIHRhcmdldCB7Y3B1X2NsdXN0ZXJfbmFtZX0iKQoKICAgICMgVmVyaWZ5IHRoYXQgY2x1c3RlciBkb2VzIG5vdCBleGlzdCBhbHJlYWR5OgogICAgdHJ5OgogICAgICAgIGNvbXB1dGVfdGFyZ2V0ID0gQ29tcHV0ZVRhcmdldCh3b3Jrc3BhY2U9d29ya3NwYWNlLCBuYW1lPWNwdV9jbHVzdGVyX25hbWUpCiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygiRm91bmQgZXhpc3RpbmcgY2x1c3Rlciwgd2lsbCB1c2UgaXQuIikKICAgIGV4Y2VwdCBDb21wdXRlVGFyZ2V0RXhjZXB0aW9uOgogICAgICAgIGNvbXB1dGVfY29uZmlnID0gQW1sQ29tcHV0ZS5wcm92aXNpb25pbmdfY29uZmlndXJhdGlvbigKICAgICAgICAgICAgdm1fc2l6ZT12bV9zaXplLCBtYXhfbm9kZXM9bWF4X25vZGVzCiAgICAgICAgKQogICAgICAgIGNvbXB1dGVfdGFyZ2V0ID0gQ29tcHV0ZVRhcmdldC5jcmVhdGUoCiAgICAgICAgICAgIHdvcmtzcGFjZSwgY3B1X2NsdXN0ZXJfbmFtZSwgY29tcHV0ZV9jb25maWcKICAgICAgICApCgogICAgY29tcHV0ZV90YXJnZXQud2FpdF9mb3JfY29tcGxldGlvbihzaG93X291dHB1dD1UcnVlKQogICAgcmV0dXJuIGNvbXB1dGVfdGFyZ2V0CgoKZGVmIHJlZ2lzdGVyX2RhdGFzZXQoCiAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgIGRhdGFzZXRfbmFtZTogc3RyLAogICAgZGF0YXNldF9kZXNjcmlwdGlvbjogc3RyLAogICAgZGF0YTogRGF0YUl0ZW0sCiAgICBjcmVhdGVfbmV3X3ZlcnNpb246IGJvb2wgPSBGYWxzZSwKKToKICAgICIiIgogICAgUmVnaXN0ZXIgZGF0YXNldCBvYmplY3QgKGNhbiBiZSBhbHNvIGFuIElndWF6aW8gRmVhdHVyZVZlY3RvcikgaW4gQXp1cmUgTUwuCiAgICBVcGxvYWRzIHBhcnF1ZXQgZmlsZSB0byBBenVyZSBibG9iIHN0b3JhZ2UgYW5kIHJlZ2lzdGVycwogICAgdGhhdCBmaWxlIGFzIGEgZGF0YXNldCBpbiBBenVyZSBNTC4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgICBNTFJ1biBjb250ZXh0LgogICAgOnBhcmFtIGRhdGFzZXRfbmFtZTogICAgICAgICAgTmFtZSBvZiBBenVyZSBkYXRhc2V0IHRvIHJlZ2lzdGVyLgogICAgOnBhcmFtIGRhdGFzZXRfZGVzY3JpcHRpb246ICAgRGVzY3JpcHRpb24gb2YgQXp1cmUgZGF0YXNldCB0byByZWdpc3Rlci4KICAgIDpwYXJhbSBkYXRhOiAgICAgICAgICAgICAgICAgIE1MUnVuIEZlYXR1cmVWZWN0b3Igb3IgZGF0YXNldCBvYmplY3QgdG8gdXBsb2FkLgogICAgOnBhcmFtIGNyZWF0ZV9uZXdfdmVyc2lvbjogICAgUmVnaXN0ZXIgQXp1cmUgZGF0YXNldCBhcyBuZXcgdmVyc2lvbi4gTXVzdCBiZSB1c2VkIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeWluZyBkYXRhc2V0IHNjaGVtYS4KICAgICIiIgoKICAgICMgdGVzdCBmb3IgQXp1cmUgc3RvcmFnZSBjb25uZWN0aW9uIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHNlY3JldDoKICAgIGFzc2VydCBfZW52X29yX3NlY3JldCgKICAgICAgICBjb250ZXh0LCAiQVpVUkVfU1RPUkFHRV9DT05ORUNUSU9OX1NUUklORyIKICAgICksICJBWlVSRV9TVE9SQUdFX0NPTk5FQ1RJT05fU1RSSU5HIHNlY3JldCBub3Qgc2V0IgoKICAgICMgQ29ubmVjdCB0byBBenVyZU1MIGV4cGVyaW1lbnQgYW5kIGRhdGFzdG9yZToKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oIkNvbm5lY3RpbmcgdG8gQXp1cmVNTCBleHBlcmltZW50IGRlZmF1bHQgZGF0YXN0b3JlIikKCiAgICB3b3Jrc3BhY2UgPSBfbG9hZF93b3Jrc3BhY2UoY29udGV4dCkKICAgIGRhdGFzdG9yZSA9IHdvcmtzcGFjZS5nZXRfZGVmYXVsdF9kYXRhc3RvcmUoKQoKICAgICMgQXp1cmUgYmxvYiBwYXRoIChkZWZhdWx0IGRhdGFzdG9yZSBmb3Igd29ya3NwYWNlKToKICAgIGJsb2JfcGF0aCA9IGYiYXo6Ly97ZGF0YXN0b3JlLmNvbnRhaW5lcl9uYW1lfS97ZGF0YXNldF9uYW1lfSIKCiAgICBzdG9yZV91cmlfcHJlZml4LCBfID0gbWxydW4uZGF0YXN0b3JlLnBhcnNlX3N0b3JlX3VyaShkYXRhLmFydGlmYWN0X3VybCkKICAgIGZlYXR1cmVfdmVjdG9yX2Nhc2UgPSBtbHJ1bi51dGlscy5TdG9yZVByZWZpeC5GZWF0dXJlVmVjdG9yID09IHN0b3JlX3VyaV9wcmVmaXgKICAgICMgUmV0cmlldmUgZGF0YSBzb3VyY2UgYXMgZGF0YWZyYW1lOgogICAgaWYgZmVhdHVyZV92ZWN0b3JfY2FzZToKICAgICAgICAjIEZlYXR1cmVWZWN0b3IgY2FzZToKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKAogICAgICAgICAgICBmIlJldHJpZXZpbmcgZmVhdHVyZSB2ZWN0b3IgYW5kIHVwbG9hZGluZyB0byBBenVyZSBibG9iIHN0b3JhZ2U6IHtibG9iX3BhdGh9IgogICAgICAgICkKICAgICAgICBmX3N0b3JlLmdldF9vZmZsaW5lX2ZlYXR1cmVzKGRhdGEubWV0YS51cmksIHRhcmdldD1QYXJxdWV0VGFyZ2V0KHBhdGg9YmxvYl9wYXRoKSkKICAgIGVsc2U6CiAgICAgICAgYmxvYl9wYXRoICs9IGRhdGEuc3VmZml4CiAgICAgICAgIyBEYXRhSXRlbSBjYXNlOgogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oCiAgICAgICAgICAgIGYiUmV0cmlldmluZyBmZWF0dXJlIHZlY3RvciBhbmQgdXBsb2FkaW5nIHRvIEF6dXJlIGJsb2Igc3RvcmFnZToge2Jsb2JfcGF0aH0iCiAgICAgICAgKQogICAgICAgIGRhdGFfaW5fYnl0ZXMgPSBkYXRhLmdldCgpCiAgICAgICAgZ2V0X2RhdGFpdGVtKGJsb2JfcGF0aCkucHV0KGRhdGFfaW5fYnl0ZXMpCgogICAgIyBSZWdpc3RlciBkYXRhc2V0IGluIEF6dXJlTUw6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiUmVnaXN0ZXJpbmcgZGF0YXNldCB7ZGF0YXNldF9uYW1lfSBpbiBBenVyZSBNTCIpCiAgICBpZiBkYXRhLnN1ZmZpeCA9PSAiLnBhcnF1ZXQiIG9yIGZlYXR1cmVfdmVjdG9yX2Nhc2U6CiAgICAgICAgZGF0YXNldCA9IERhdGFzZXQuVGFidWxhci5mcm9tX3BhcnF1ZXRfZmlsZXMoCiAgICAgICAgICAgIHBhdGg9KGRhdGFzdG9yZSwgZiJ7ZGF0YXNldF9uYW1lfS5wYXJxdWV0IiksIHZhbGlkYXRlPUZhbHNlCiAgICAgICAgKQogICAgZWxzZToKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKAogICAgICAgICAgICBmIk9wZW5TU0wgdmVyc2lvbiBtdXN0IGJlIDEuMS4gT3ZlcnJpZGluZyB0aGUgT3BlblNTTCB2ZXJzaW9uIHRvIDEuMSIKICAgICAgICApCiAgICAgICAgIyBPcGVuU1NMIHZlcnNpb24gbXVzdCBiZSAxLjEKICAgICAgICBvcy5lbnZpcm9uWyJDTFJfT1BFTlNTTF9WRVJTSU9OX09WRVJSSURFIl0gPSAiMS4xIgogICAgICAgIGRhdGFzZXQgPSBEYXRhc2V0LlRhYnVsYXIuZnJvbV9kZWxpbWl0ZWRfZmlsZXMoCiAgICAgICAgICAgIHBhdGg9KGRhdGFzdG9yZSwgZiJ7ZGF0YXNldF9uYW1lfXtkYXRhLnN1ZmZpeH0iKSwgdmFsaWRhdGU9RmFsc2UKICAgICAgICApCgogICAgZGF0YXNldC5yZWdpc3RlcigKICAgICAgICB3b3Jrc3BhY2U9d29ya3NwYWNlLAogICAgICAgIG5hbWU9ZGF0YXNldF9uYW1lLAogICAgICAgIGRlc2NyaXB0aW9uPWRhdGFzZXRfZGVzY3JpcHRpb24sCiAgICAgICAgY3JlYXRlX25ld192ZXJzaW9uPWNyZWF0ZV9uZXdfdmVyc2lvbiwKICAgICkKCiAgICAjIE91dHB1dCByZWdpc3RlcmVkIGRhdGFzZXQgbmFtZSBpbiBBenVyZToKICAgIGNvbnRleHQubG9nX3Jlc3VsdCgiZGF0YXNldF9ibG9iX3BhdGgiLCBibG9iX3BhdGgpCgoKZGVmIGRvd25sb2FkX21vZGVsKAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBtb2RlbF9uYW1lOiBzdHIsCiAgICBtb2RlbF92ZXJzaW9uOiBpbnQsCiAgICB0YXJnZXRfZGlyOiBzdHIgPSAiLiIsCikgLT4gTm9uZToKICAgICIiIgogICAgRG93bmxvYWQgdHJhaW5lZCBtb2RlbCBmcm9tIEF6dXJlIE1MIHRvIGxvY2FsIGZpbGVzeXN0ZW0uCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgIE1MUnVuIGNvbnRleHQuCiAgICA6cGFyYW0gbW9kZWxfbmFtZTogICAgTmFtZSBvZiB0cmFpbmVkIGFuZCByZWdpc3RlcmVkIG1vZGVsLgogICAgOnBhcmFtIG1vZGVsX3ZlcnNpb246IFZlcnNpb24gb2YgbW9kZWwgdG8gZG93bmxvYWQuCiAgICA6cGFyYW0gdGFyZ2V0X2RpcjogICAgVGFyZ2V0IGRpcmVjdG9yeSB0byBkb3dubG9hZCBtb2RlbC4KICAgICIiIgogICAgIyBMb2FkaW5nIHdvcmtzcGFjZSBpZiBub3QgcHJvdmlkZWQ6CiAgICB3b3Jrc3BhY2UgPSBfbG9hZF93b3Jrc3BhY2UoY29udGV4dCkKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJEb3dubG9hZGluZyBtb2RlbCB7bW9kZWxfbmFtZX06e21vZGVsX3ZlcnNpb259IikKICAgIG1vZGVsID0gTW9kZWwod29ya3NwYWNlLCBtb2RlbF9uYW1lLCB2ZXJzaW9uPW1vZGVsX3ZlcnNpb24pCiAgICBtb2RlbC5kb3dubG9hZCh0YXJnZXRfZGlyPXRhcmdldF9kaXIsIGV4aXN0X29rPVRydWUpCgoKZGVmIHVwbG9hZF9tb2RlbCgKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgbW9kZWxfbmFtZTogc3RyLAogICAgbW9kZWxfcGF0aDogc3RyLAogICAgbW9kZWxfZGVzY3JpcHRpb246IHN0ciA9IE5vbmUsCiAgICBtb2RlbF90YWdzOiBkaWN0ID0gTm9uZSwKKSAtPiBOb25lOgogICAgIiIiCiAgICBVcGxvYWQgcHJlLXRyYWluZWQgbW9kZWwgZnJvbSBsb2NhbCBmaWxlc3lzdGVtIHRvIEF6dXJlIE1MLgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgICBNTFJ1biBjb250ZXh0LgogICAgOnBhcmFtIG1vZGVsX25hbWU6ICAgICAgICBOYW1lIG9mIHRyYWluZWQgYW5kIHJlZ2lzdGVyZWQgbW9kZWwuCiAgICA6cGFyYW0gbW9kZWxfcGF0aDogICAgICAgIFBhdGggdG8gZmlsZSBvbiBsb2NhbCBmaWxlc3lzdGVtLgogICAgOnBhcmFtIG1vZGVsX2Rlc2NyaXB0aW9uOiBEZXNjcmlwdGlvbiBvZiBtb2RlbHMuCiAgICA6cGFyYW0gbW9kZWxfdGFnczogICAgICAgIEtWIHBhaXJzIG9mIG1vZGVsIHRhZ3MuCiAgICAiIiIKICAgICMgTG9hZGluZyB3b3Jrc3BhY2UgaWYgbm90IHByb3ZpZGVkOgogICAgd29ya3NwYWNlID0gX2xvYWRfd29ya3NwYWNlKGNvbnRleHQpCgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIlVwbG9hZCBtb2RlbCB7bW9kZWxfbmFtZX0gZnJvbSB7bW9kZWxfcGF0aH0iKQogICAgTW9kZWwucmVnaXN0ZXIoCiAgICAgICAgd29ya3NwYWNlPXdvcmtzcGFjZSwKICAgICAgICBtb2RlbF9wYXRoPW1vZGVsX3BhdGgsCiAgICAgICAgbW9kZWxfbmFtZT1tb2RlbF9uYW1lLAogICAgICAgIGRlc2NyaXB0aW9uPW1vZGVsX2Rlc2NyaXB0aW9uLAogICAgICAgIHRhZ3M9bW9kZWxfdGFncywKICAgICkKCgpkZWYgX2dldF90b3Bfbl9ydW5zKAogICAgcmVtb3RlX3J1bjogQXV0b01MUnVuLCBuOiBpbnQgPSA1LCBwcmltYXJ5X21ldHJpYzogc3RyID0gImFjY3VyYWN5IgopIC0+IExpc3RbU2NyaXB0UnVuXToKICAgICIiIgogICAgR2V0IHRvcCBOIGNvbXBsZXRlIHJ1bnMgZnJvbSBleHBlcmltZW50IHNvcnRlZCBieSBwcmltYXJ5IG1ldHJpYy4KCiAgICA6cGFyYW0gcmVtb3RlX3J1bjogICAgIEF6dXJlIE1MIFJ1bi4KICAgIDpwYXJhbSBuOiAgICAgICAgICAgICAgTnVtYmVyIG9mIHRvcCBydW5zIHRvIHJldHVybi4KICAgIDpwYXJhbSBwcmltYXJ5X21ldHJpYzogTWV0cmljIHRvIHNvcnQgYnkuCgogICAgOnJldHVybnM6ICAgICAgICAgICAgICBMaXN0IG9mIHRvcCBOIHJ1bnMgc29ydGVkIGJ5IHByaW1hcnkgbWV0cmljLgogICAgIiIiCiAgICAjIENvbGxlY3QgYWxsIG1vZGVsczoKICAgIGNvbXBsZXRlX3J1bnMgPSBbCiAgICAgICAgcnVuCiAgICAgICAgZm9yIHJ1biBpbiByZW1vdGVfcnVuLmdldF9jaGlsZHJlbihzdGF0dXM9IkNvbXBsZXRlZCIpCiAgICAgICAgaWYgbm90IGFueShzIGluIHJ1bi5pZCBmb3IgcyBpbiBbInNldHVwIiwgIndvcmtlciJdKQogICAgXQoKICAgICMgQ2hlY2tpbmcgdGhhdCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIHJ1bnMgYXJlIGRvbmU6CiAgICBpZiBsZW4oY29tcGxldGVfcnVucykgPCBuOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJFeHBlY3RlZCB7bn0gcnVucyBidXQgb25seSByZWNlaXZlZCB7bGVuKGNvbXBsZXRlX3J1bnMpfSIpCgogICAgIyBTb3J0aW5nIGJ5IHRoZSBwcmltYXJ5IG1ldHJpYzoKICAgIHNvcnRlZF9ydW5zID0gc29ydGVkKAogICAgICAgIGNvbXBsZXRlX3J1bnMsIGtleT1sYW1iZGEgcnVuOiBydW4uZ2V0X21ldHJpY3MoKVtwcmltYXJ5X21ldHJpY10sIHJldmVyc2U9VHJ1ZQogICAgKQogICAgcmV0dXJuIHNvcnRlZF9ydW5zWzpuXQoKCmRlZiBfZ2V0X21vZGVsX2hwKAogICAgcnVuOiBTY3JpcHRSdW4sCikgLT4gZGljdDoKICAgICIiIgogICAgR2V0IGh5cGVyLXBhcmFtZXRlcnMgb2YgdHJhaW5lZCBBenVyZU1MIG1vZGVsLgogICAgQ29tYmluZSB0aGUgaHlwZXItcGFyYW1ldGVycyBvZiB0aGUgZGF0YSB0cmFuc2Zvcm1hdGlvbiBhbmQgdHJhaW5pbmcgdG8gYSBkaWN0aW9uYXJ5LgogICAgVGhlIHByZWZpeCBvZiB0aGUgZGljdGlvbmFyeSBrZXlzIGNvcnJlc3BvbmRzIHRvICdkYXRhIHRyYW5zZm9ybWF0aW9uJyBhbmQgJ3RyYWluaW5nJy4KCiAgICA6cGFyYW0gcnVuOiBSdW4gb2JqZWN0IG9mIEF6dXJlTUwgdHJhaW5lZCBtb2RlbC4KCiAgICA6cmV0dXJuczogICAgQSBkaWN0aW9uYXJ5IGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jc3RyaW5nLgogICAgIiIiCgogICAgc3BlY19maWVsZCA9ICJwaXBlbGluZV9zcGVjIgogICAgaWYgc3BlY19maWVsZCBub3QgaW4gcnVuLnByb3BlcnRpZXM6CiAgICAgICAgcmV0dXJuIHt9CiAgICBzcGVjX3N0cmluZyA9IHJ1bi5wcm9wZXJ0aWVzW3NwZWNfZmllbGRdCiAgICBzcGVjX2RpY3QgPSBqc29uLmxvYWRzKHNwZWNfc3RyaW5nKQoKICAgIGlmICJvYmplY3RzIiBub3QgaW4gc3BlY19kaWN0OgogICAgICAgICMgTm8gaHlwZXItcGFyYW1zCiAgICAgICAgcmV0dXJuIHt9CiAgICBocF9kaWN0cyA9IHNwZWNfZGljdFsib2JqZWN0cyJdCiAgICAjIGFmdGVyIHRyYWluaW5nIHRoZXJlIGFyZSB0d28gaHlwZXItcGFyYW1ldGVycyBkaWN0cyBpbnNpZGUgdGhlIHJ1biBvYmplY3Q6CiAgICBhc3NlcnQgKAogICAgICAgIGxlbihocF9kaWN0cykgPT0gMgogICAgKSwgImFmdGVyIHRyYWluaW5nIHRoZXJlIGFyZSB0d28gaHlwZXItcGFyYW1ldGVycyBkaWN0cyBpbnNpZGUgdGhlIHJ1biBvYmplY3QiCiAgICByZXN1bHRfZGljdCA9IHt9CiAgICBkaWN0X2tleXMgPSBbCiAgICAgICAgWyJkYXRhX3RyYW5zX2NsYXNzX25hbWUiLCAiZGF0YV90cmFuc19tb2R1bGUiLCAiZGF0YV90cmFuc19zcGVjX2NsYXNzIl0sCiAgICAgICAgWwogICAgICAgICAgICAidHJhaW5fY2xhc3NfbmFtZSIsCiAgICAgICAgICAgICJ0cmFpbl9tb2R1bGUiLAogICAgICAgICAgICAidHJhaW5fcGFyYW1fa3dhcmdzX0MiLAogICAgICAgICAgICAidHJhaW5fcGFyYW1fa3dhcmdzX2NsYXNzX3dlaWdodCIsCiAgICAgICAgICAgICJ0cmFpbl9zcGVjX2NsYXNzIiwKICAgICAgICBdLAogICAgXQoKICAgICMgY3JlYXRpbmcgaHlwZXItcGFyYW1zIGRpY3Qgd2l0aCBrZXkgcHJlZml4ZXMgZm9yIGVhY2ggcGFydDoKICAgIGt3YXJnc19wcmVmaXggPSAicGFyYW1fa3dhcmdzIgogICAgZm9yIGQsIG5hbWUsIGtleXMgaW4gemlwKGhwX2RpY3RzLCBbImRhdGFfdHJhbnMiLCAidHJhaW4iXSwgZGljdF9rZXlzKToKICAgICAgICBmb3Iga2V5IGluIGtleXM6CgogICAgICAgICAgICBpZiBrd2FyZ3NfcHJlZml4IGluIGtleToKICAgICAgICAgICAgICAgIHJlc3VsdF9kaWN0W2tleV0gPSBkW2t3YXJnc19wcmVmaXhdWwogICAgICAgICAgICAgICAgICAgIGtleS5yZXBsYWNlKGYie25hbWV9X3trd2FyZ3NfcHJlZml4fV8iLCAiIikKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdF9kaWN0W2tleV0gPSBkW2tleS5yZXBsYWNlKGYie25hbWV9XyIsICIiKV0KICAgICAgICAgICAgaWYgbm90IHJlc3VsdF9kaWN0W2tleV06CiAgICAgICAgICAgICAgICByZXN1bHRfZGljdFtrZXldID0gIiIKCiAgICByZXR1cm4gcmVzdWx0X2RpY3QKCgpkZWYgc3VibWl0X3RyYWluaW5nX2pvYigKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZXhwZXJpbWVudDogRXhwZXJpbWVudCwKICAgIGNvbXB1dGVfdGFyZ2V0OiBDb21wdXRlVGFyZ2V0LAogICAgcmVnaXN0ZXJfbW9kZWxfbmFtZTogc3RyLAogICAgcmVnaXN0ZXJlZF9kYXRhc2V0X25hbWU6IHN0ciwKICAgIGF1dG9tbF9zZXR0aW5nczogZGljdCwKICAgIHRyYWluaW5nX3NldDogRGF0YUl0ZW0sCiAgICBsYWJlbF9jb2x1bW5fbmFtZTogc3RyID0gJycsCiAgICBzYXZlX25fbW9kZWxzOiBpbnQgPSAzLAogICAgc2hvd19vdXRwdXQ6IGJvb2wgPSBUcnVlLAopIC0+IE5vbmU6CiAgICAiIiIKICAgIFN1Ym1pdCB0cmFpbmluZyBqb2IgdG8gQXp1cmUgQXV0b01MIGFuZCBkb3dubG9hZCB0cmFpbmVkIG1vZGVsCiAgICB3aGVuIGNvbXBsZXRlZC4gVXNlcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZGF0YXNldCBmb3IgdHJhaW5pbmcuCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgICAgICAgICBNTFJ1biBjb250ZXh0LgogICAgOnBhcmFtIGV4cGVyaW1lbnQ6ICAgICAgICAgICAgICBBenVyZSBleHBlcmltZW50LgogICAgOnBhcmFtIGNvbXB1dGVfdGFyZ2V0OiAgICAgICAgICBBenVyZSBjb21wdXRlIHRhcmdldC4KICAgIDpwYXJhbSByZWdpc3Rlcl9tb2RlbF9uYW1lOiAgICAgTmFtZSBvZiBtb2RlbCB0byByZWdpc3RlciBpbiBBenVyZS4KICAgIDpwYXJhbSByZWdpc3RlcmVkX2RhdGFzZXRfbmFtZTogTmFtZSBvZiBkYXRhc2V0IHJlZ2lzdGVyZWQgaW4gQXp1cmUgTUwuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uX25hbWU6ICAgICAgIE5hbWUgb2YgdGFyZ2V0IGNvbHVtbiBpbiBkYXRhc2V0LgogICAgOnBhcmFtIGF1dG9tbF9zZXR0aW5nczogICAgICAgICBKU09OIHN0cmluZyBvZiBhbGwgQXp1cmUgQXV0b01MIHNldHRpbmdzLgogICAgOnBhcmFtIHRyYWluaW5nX3NldDogICAgICAgICAgICBUcmFpbmluZyBzZXQgdG8gbG9nIHdpdGggbW9kZWwuIEZvciBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yaW5nIGludGVncmF0aW9uLgogICAgOnBhcmFtIHNob3dfb3V0cHV0OiAgICAgICAgICAgICBEaXNwbGF5aW5nIEF6dXJlIGxvZ3MuCiAgICA6cGFyYW0gc2F2ZV9uX21vZGVsczogICAgICAgICAgIEhvdyBtYW55IG9mIHRoZSB0b3AgcGVyZm9ybWluZyBtb2RlbHMgdG8gbG9nLgogICAgIiIiCiAgICAjIExvYWRpbmcgd29ya3NwYWNlIGlmIG5vdCBwcm92aWRlZDoKICAgIHdvcmtzcGFjZSA9IF9sb2FkX3dvcmtzcGFjZShjb250ZXh0KQoKICAgICMgU2V0dXAgZXhwZXJpbWVudDoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oIlNldHRpbmcgdXAgZXhwZXJpbWVudCBwYXJhbWV0ZXJzIikKICAgIGRhdGFzZXQgPSBEYXRhc2V0LmdldF9ieV9uYW1lKHdvcmtzcGFjZSwgbmFtZT1yZWdpc3RlcmVkX2RhdGFzZXRfbmFtZSkKCiAgICAjIEdldCB0cmFpbmluZyBzZXQgdG8gbG9nIHdpdGggbW9kZWw6CiAgICBmZWF0dXJlX3ZlY3RvciA9IE5vbmUKICAgIHN0b3JlX3VyaV9wcmVmaXgsIF8gPSBtbHJ1bi5kYXRhc3RvcmUucGFyc2Vfc3RvcmVfdXJpKHRyYWluaW5nX3NldC5hcnRpZmFjdF91cmwpCiAgICBpZiBtbHJ1bi51dGlscy5TdG9yZVByZWZpeC5GZWF0dXJlVmVjdG9yID09IHN0b3JlX3VyaV9wcmVmaXg6CiAgICAgICAgZmVhdHVyZV92ZWN0b3IgPSB0cmFpbmluZ19zZXQubWV0YS51cmkKICAgICAgICBsYWJlbF9jb2x1bW5fbmFtZSA9IGxhYmVsX2NvbHVtbl9uYW1lIG9yIHRyYWluaW5nX3NldC5tZXRhLnN0YXR1cy5sYWJlbF9jb2x1bW4KICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnbGFiZWwgY29sdW1uIG5hbWU6IHtsYWJlbF9jb2x1bW5fbmFtZX0nKQogICAgICAgIHRyYWluaW5nX3NldCA9IGZfc3RvcmUuZ2V0X29mZmxpbmVfZmVhdHVyZXMoZmVhdHVyZV92ZWN0b3IpLnRvX2RhdGFmcmFtZSgpCiAgICBlbHNlOgogICAgICAgIHRyYWluaW5nX3NldCA9IHRyYWluaW5nX3NldC5hc19kZigpCgogICAgYXV0b21sX2NvbmZpZyA9IEF1dG9NTENvbmZpZygKICAgICAgICBjb21wdXRlX3RhcmdldD1jb21wdXRlX3RhcmdldCwKICAgICAgICB0cmFpbmluZ19kYXRhPWRhdGFzZXQsCiAgICAgICAgdmVyYm9zaXR5PWxvZ2dpbmcuSU5GTywKICAgICAgICBsYWJlbF9jb2x1bW5fbmFtZT1sYWJlbF9jb2x1bW5fbmFtZSwKICAgICAgICAqKmF1dG9tbF9zZXR0aW5ncywKICAgICkKCiAgICAjIFJ1biBleHBlcmltZW50IG9uIEF6dXJlTUw6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCJTdWJtaXR0aW5nIGFuZCBydW5uaW5nIGV4cGVyaW1lbnQiKQogICAgcmVtb3RlX3J1biA9IGV4cGVyaW1lbnQuc3VibWl0KGF1dG9tbF9jb25maWcpCiAgICByZW1vdGVfcnVuLndhaXRfZm9yX2NvbXBsZXRpb24oc2hvd19vdXRwdXQ9c2hvd19vdXRwdXQpCiAgICBpZiBzaG93X291dHB1dDoKICAgICAgICAjIEF6dXJlIGxvZyBlbmRpbmcgcm93OgogICAgICAgIHByaW50KGYiXG57JyonICogOTJ9XG4iKQogICAgIyBHZXQgdG9wIE4gcnVucyB0byBsb2c6CiAgICB0b3BfcnVucyA9IF9nZXRfdG9wX25fcnVucygKICAgICAgICByZW1vdGVfcnVuPXJlbW90ZV9ydW4sCiAgICAgICAgbj1zYXZlX25fbW9kZWxzLAogICAgICAgIHByaW1hcnlfbWV0cmljPWF1dG9tbF9zZXR0aW5nc1sicHJpbWFyeV9tZXRyaWMiXSwKICAgICkKCiAgICAjIFJlZ2lzdGVyLCBkb3dubG9hZCwgYW5kIGxvZyBtb2RlbHM6CiAgICBmb3IgaSwgcnVuIGluIGVudW1lcmF0ZSh0b3BfcnVucyk6CiAgICAgICAgIyBSZWdpc3RlciBtb2RlbDoKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCJSZWdpc3RlcmluZyBtb2RlbCIpCiAgICAgICAgbW9kZWwgPSBydW4ucmVnaXN0ZXJfbW9kZWwoCiAgICAgICAgICAgIG1vZGVsX25hbWU9cmVnaXN0ZXJfbW9kZWxfbmFtZSwgbW9kZWxfcGF0aD0ib3V0cHV0cy9tb2RlbC5wa2wiCiAgICAgICAgKQogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oCiAgICAgICAgICAgIGYiUmVnaXN0ZXJlZCBtb2RlbCB3aXRoIG5hbWUgJ3ttb2RlbC5uYW1lfScsIGlkICd7bW9kZWwuaWR9JywgdmVyc2lvbiAne21vZGVsLnZlcnNpb259JyIKICAgICAgICApCgogICAgICAgICMgRG93bmxvYWQgbW9kZWwgbG9jYWxseToKICAgICAgICBkb3dubG9hZF9tb2RlbCgKICAgICAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgICAgICBtb2RlbF9uYW1lPXJlZ2lzdGVyX21vZGVsX25hbWUsCiAgICAgICAgICAgIG1vZGVsX3ZlcnNpb249bW9kZWwudmVyc2lvbiwKICAgICAgICAgICAgdGFyZ2V0X2Rpcj1mIi4ve21vZGVsLnZlcnNpb259IiwKICAgICAgICApCgogICAgICAgIG1ldHJpY3MgPSB7ay5sb3dlcigpOiB2YWwgZm9yIGssIHZhbCBpbiBydW4uZ2V0X21ldHJpY3MoKS5pdGVtcygpfQogICAgICAgIGRlbCBtZXRyaWNzWyJjb25mdXNpb25fbWF0cml4Il0KICAgICAgICBkZWwgbWV0cmljc1siYWNjdXJhY3lfdGFibGUiXQoKICAgICAgICAjIENvbGxlY3QgbW9kZWwgaHlwZXItcGFyYW1ldGVyczoKICAgICAgICBtb2RlbF9ocF9kaWN0ID0gX2dldF9tb2RlbF9ocChydW4pCiAgICAgICAgd2l0aCBjb250ZXh0LmdldF9jaGlsZF9jb250ZXh0KCoqbW9kZWxfaHBfZGljdCkgYXMgY2hpbGQ6CiAgICAgICAgICAgIG1vZGVsX2tleSA9IGYibW9kZWxfe2kgKyAxfV97bW9kZWxfaHBfZGljdFsnZGF0YV90cmFuc19jbGFzc19uYW1lJ10ubG93ZXIoKX1fe21vZGVsX2hwX2RpY3RbJ3RyYWluX2NsYXNzX25hbWUnXS5sb3dlcigpfSIKICAgICAgICAgICAgIyBMb2cgbW9kZWw6CiAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICBmIkxvZ2dpbmcge21vZGVsX2tleX0gbW9kZWwgdG8gTUxSdW4iCiAgICAgICAgICAgICkKICAgICAgICAgICAgY2hpbGQubG9nX3Jlc3VsdHMobWV0cmljcykKICAgICAgICAgICAgY2hpbGQubG9nX21vZGVsKAogICAgICAgICAgICAgICAgIm1vZGVsIiwKICAgICAgICAgICAgICAgIGRiX2tleT1tb2RlbF9rZXksCiAgICAgICAgICAgICAgICBhcnRpZmFjdF9wYXRoPWNvbnRleHQuYXJ0aWZhY3Rfc3VicGF0aCgibW9kZWxzIiksCiAgICAgICAgICAgICAgICBtZXRyaWNzPW1ldHJpY3MsCiAgICAgICAgICAgICAgICBtb2RlbF9maWxlPWYie21vZGVsLnZlcnNpb259L21vZGVsLnBrbCIsCiAgICAgICAgICAgICAgICB0cmFpbmluZ19zZXQ9dHJhaW5pbmdfc2V0LAogICAgICAgICAgICAgICAgbGFiZWxfY29sdW1uPWxhYmVsX2NvbHVtbl9uYW1lLAogICAgICAgICAgICAgICAgZmVhdHVyZV92ZWN0b3I9ZmVhdHVyZV92ZWN0b3IsCiAgICAgICAgICAgICAgICBmcmFtZXdvcms9IkF6dXJlTUwiLAogICAgICAgICAgICAgICAgYWxnb3JpdGhtPW1vZGVsX2hwX2RpY3QuZ2V0KCJ0cmFpbl9jbGFzc19uYW1lIiksCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICAgICAgIyBUaGlzIGFsc28gbG9ncyB0aGUgbW9kZWw6CiAgICAgICAgICAgICAgICBjaGlsZC5tYXJrX2FzX2Jlc3QoKQoKCmRlZiB0cmFpbigKICAgICMgTWxSdW4KICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGF0YXNldDogRGF0YUl0ZW0sCiAgICAjIEluaXQgZXhwZXJpbWVudCBhbmQgY29tcHV0ZQogICAgZXhwZXJpbWVudF9uYW1lOiBzdHIgPSAiIiwKICAgIGNwdV9jbHVzdGVyX25hbWU6IHN0ciA9ICIiLAogICAgdm1fc2l6ZTogc3RyID0gIlNUQU5EQVJEX0QyX1YyIiwKICAgIG1heF9ub2RlczogaW50ID0gMSwKICAgICMgUmVnaXN0ZXIgZGF0YXNldAogICAgZGF0YXNldF9uYW1lOiBzdHIgPSAiIiwKICAgIGRhdGFzZXRfZGVzY3JpcHRpb246IHN0ciA9ICIiLAogICAgY3JlYXRlX25ld192ZXJzaW9uOiBib29sID0gRmFsc2UsCiAgICBsYWJlbF9jb2x1bW5fbmFtZTogc3RyID0gIiIsCiAgICAjIFN1Ym1pdCB0cmFpbmluZyBqb2IKICAgIHJlZ2lzdGVyX21vZGVsX25hbWU6IHN0ciA9ICIiLAogICAgc2F2ZV9uX21vZGVsczogaW50ID0gMSwKICAgIGxvZ19henVyZTogYm9vbCA9IFRydWUsCiAgICBhdXRvbWxfc2V0dGluZ3M6IHN0ciA9IE5vbmUsCikgLT4gTm9uZToKICAgICIiIgogICAgV2hvbGUgdHJhaW5pbmcgZmxvdyBmb3IgQXp1cmUgQXV0b01MLiBSZWdpc3RlcnMgZGF0YXNldC9mZWF0dXJlIHZlY3RvciwKICAgIHN1Ym1pdHMgdHJhaW5pbmcgam9iIHRvIEF6dXJlIEF1dG9NTCwgYW5kIGRvd25sb2FkcyB0cmFpbmVkIG1vZGVsCiAgICB3aGVuIGNvbXBsZXRlZC4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgTUxSdW4gY29udGV4dC4KCiAgICA6cGFyYW0gZGF0YXNldDogICAgICAgICAgICAgTUxSdW4gRmVhdHVyZVZlY3RvciBvciBkYXRhc2V0IFVSSSB0byB1cGxvYWQuIFdpbGwgZHJvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4IGJlZm9yZSB1cGxvYWRpbmcgd2hlbiBpdCBpcyBhIEZlYXR1cmVWZWN0b3IuCgogICAgOnBhcmFtIGV4cGVyaW1lbnRfbmFtZTogICAgIE5hbWUgb2YgZXhwZXJpbWVudCB0byBjcmVhdGUgaW4gQXp1cmUgTUwuCiAgICA6cGFyYW0gY3B1X2NsdXN0ZXJfbmFtZTogICAgTmFtZSBvZiBBenVyZSBNTCBjb21wdXRlIHRhcmdldC4gQ3JlYXRlZCBpZiBkb2VzIG5vdCBleGlzdC4KICAgIDpwYXJhbSB2bV9zaXplOiAgICAgICAgICAgICBBenVyZSBtYWNoaW5lIHR5cGUgZm9yIGNvbXB1dGUgdGFyZ2V0LgogICAgOnBhcmFtIG1heF9ub2RlczogICAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgY29tcHV0ZSB0YXJnZXRzLgoKICAgIDpwYXJhbSBkYXRhc2V0X25hbWU6ICAgICAgICBOYW1lIG9mIEF6dXJlIGRhdGFzZXQgdG8gcmVnaXN0ZXIuCiAgICA6cGFyYW0gZGF0YXNldF9kZXNjcmlwdGlvbjogRGVzY3JpcHRpb24gb2YgQXp1cmUgZGF0YXNldCB0byByZWdpc3Rlci4KCiAgICA6cGFyYW0gY3JlYXRlX25ld192ZXJzaW9uOiAgUmVnaXN0ZXIgQXp1cmUgZGF0YXNldCBhcyBuZXcgdmVyc2lvbi4gTXVzdCBiZSB1c2VkIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlpbmcgZGF0YXNldCBzY2hlbWEuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uX25hbWU6ICAgVGFyZ2V0IGNvbHVtbiBpbiBkYXRhc2V0LgoKICAgIDpwYXJhbSByZWdpc3Rlcl9tb2RlbF9uYW1lOiBOYW1lIG9mIG1vZGVsIHRvIHJlZ2lzdGVyIGluIEF6dXJlLgogICAgOnBhcmFtIHNhdmVfbl9tb2RlbHM6ICAgICAgIEhvdyBtYW55IG9mIHRoZSB0b3AgcGVyZm9ybWluZyBtb2RlbHMgdG8gbG9nLgogICAgOnBhcmFtIGxvZ19henVyZTogICAgICAgICAgIERpc3BsYXlpbmcgQXp1cmUgbG9ncy4KICAgIDpwYXJhbSBhdXRvbWxfc2V0dGluZ3M6ICAgICBKU09OIHN0cmluZyBvZiBhbGwgQXp1cmUgQXV0b01MIHNldHRpbmdzLgogICAgIiIiCiAgICBpZiBub3QgYXV0b21sX3NldHRpbmdzOgogICAgICAgIGF1dG9tbF9zZXR0aW5ncyA9IHsKICAgICAgICAgICAgInRhc2siOiAiY2xhc3NpZmljYXRpb24iLAogICAgICAgICAgICAiZGVidWdfbG9nIjogImF1dG9tbF9lcnJvcnMubG9nIiwKICAgICAgICAgICAgIyAiZXhwZXJpbWVudF9leGl0X3Njb3JlIjogMC45LAogICAgICAgICAgICAiZW5hYmxlX2Vhcmx5X3N0b3BwaW5nIjogRmFsc2UsCiAgICAgICAgICAgICJhbGxvd2VkX21vZGVscyI6IFsiTG9naXN0aWNSZWdyZXNzaW9uIiwgIlNHRCIsICJTVk0iXSwKICAgICAgICAgICAgIml0ZXJhdGlvbnMiOiAzLAogICAgICAgICAgICAiaXRlcmF0aW9uX3RpbWVvdXRfbWludXRlcyI6IDIsCiAgICAgICAgICAgICJtYXhfY29uY3VycmVudF9pdGVyYXRpb25zIjogMiwKICAgICAgICAgICAgIm1heF9jb3Jlc19wZXJfaXRlcmF0aW9uIjogLTEsCiAgICAgICAgICAgICJuX2Nyb3NzX3ZhbGlkYXRpb25zIjogNSwKICAgICAgICAgICAgInByaW1hcnlfbWV0cmljIjogImFjY3VyYWN5IiwKICAgICAgICAgICAgImZlYXR1cml6YXRpb24iOiAib2ZmIiwKICAgICAgICAgICAgIm1vZGVsX2V4cGxhaW5hYmlsaXR5IjogRmFsc2UsCiAgICAgICAgICAgICJlbmFibGVfdm90aW5nX2Vuc2VtYmxlIjogRmFsc2UsCiAgICAgICAgICAgICJlbmFibGVfc3RhY2tfZW5zZW1ibGUiOiBGYWxzZSwKICAgICAgICB9CgogICAgIyBJbml0IGV4cGVyaW1lbnQgYW5kIGNvbXB1dGUKICAgIHdvcmtzcGFjZSwgZXhwZXJpbWVudCA9IF9pbml0X2V4cGVyaW1lbnQoCiAgICAgICAgY29udGV4dD1jb250ZXh0LCBleHBlcmltZW50X25hbWU9ZXhwZXJpbWVudF9uYW1lCiAgICApCgogICAgY29tcHV0ZV90YXJnZXQgPSBpbml0X2NvbXB1dGUoCiAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgIGNwdV9jbHVzdGVyX25hbWU9Y3B1X2NsdXN0ZXJfbmFtZSwKICAgICAgICB2bV9zaXplPXZtX3NpemUsCiAgICAgICAgbWF4X25vZGVzPW1heF9ub2RlcywKICAgICkKCiAgICAjIFJlZ2lzdGVyIGRhdGFzZXQKICAgIHJlZ2lzdGVyX2RhdGFzZXQoCiAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgIGRhdGFzZXRfbmFtZT1kYXRhc2V0X25hbWUsCiAgICAgICAgZGF0YXNldF9kZXNjcmlwdGlvbj1kYXRhc2V0X2Rlc2NyaXB0aW9uLAogICAgICAgIGRhdGE9ZGF0YXNldCwKICAgICAgICBjcmVhdGVfbmV3X3ZlcnNpb249Y3JlYXRlX25ld192ZXJzaW9uLAogICAgKQoKICAgICMgU3VibWl0IHRyYWluaW5nIGpvYgogICAgc3VibWl0X3RyYWluaW5nX2pvYigKICAgICAgICBjb250ZXh0LAogICAgICAgIGV4cGVyaW1lbnQ9ZXhwZXJpbWVudCwKICAgICAgICBjb21wdXRlX3RhcmdldD1jb21wdXRlX3RhcmdldCwKICAgICAgICByZWdpc3Rlcl9tb2RlbF9uYW1lPXJlZ2lzdGVyX21vZGVsX25hbWUsCiAgICAgICAgcmVnaXN0ZXJlZF9kYXRhc2V0X25hbWU9ZGF0YXNldF9uYW1lLAogICAgICAgIGxhYmVsX2NvbHVtbl9uYW1lPWxhYmVsX2NvbHVtbl9uYW1lLAogICAgICAgIGF1dG9tbF9zZXR0aW5ncz1hdXRvbWxfc2V0dGluZ3MsCiAgICAgICAgdHJhaW5pbmdfc2V0PWRhdGFzZXQsCiAgICAgICAgc2hvd19vdXRwdXQ9bG9nX2F6dXJlLAogICAgICAgIHNhdmVfbl9tb2RlbHM9c2F2ZV9uX21vZGVscywKICAgICkK
    commands:
    - apt-get update && apt-get install -y --no-install-recommends git
    - apt install -y liblttng-ust0
    base_image: python:3.9-bullseye
    origin_filename: ''
  default_handler: train
  allow_empty_resources: true
  disable_auto_mount: false
  image: ''
  entry_points:
    init_compute:
      doc: 'Initialize Azure ML compute target to run experiment. Checks for

        existing compute target and creates new if does not exist.'
      name: init_compute
      lineno: 102
      has_kwargs: false
      parameters:
      - name: context
        type: MLClientCtx
        doc: MLRun context.
      - name: cpu_cluster_name
        type: str
        doc: Name of Azure ML compute target. Created if does not exist.
      - name: vm_size
        type: str
        doc: Azure machine type for compute target.
        default: STANDARD_D2_V2
      - name: max_nodes
        type: int
        doc: Maximum number of concurrent compute targets.
        default: 1
      outputs:
      - doc: Azure ML Compute Target.
        type: ComputeTarget
      has_varargs: false
    register_dataset:
      doc: 'Register dataset object (can be also an Iguazio FeatureVector) in Azure
        ML.

        Uploads parquet file to Azure blob storage and registers

        that file as a dataset in Azure ML.'
      name: register_dataset
      lineno: 138
      has_kwargs: false
      parameters:
      - name: context
        type: MLClientCtx
        doc: MLRun context.
      - name: dataset_name
        type: str
        doc: Name of Azure dataset to register.
      - name: dataset_description
        type: str
        doc: Description of Azure dataset to register.
      - name: data
        type: DataItem
        doc: MLRun FeatureVector or dataset object to upload.
      - name: create_new_version
        type: bool
        doc: Register Azure dataset as new version. Must be used when modifying dataset
          schema.
        default: false
      has_varargs: false
    download_model:
      doc: Download trained model from Azure ML to local filesystem.
      name: download_model
      lineno: 217
      has_kwargs: false
      parameters:
      - name: context
        type: MLClientCtx
        doc: MLRun context.
      - name: model_name
        type: str
        doc: Name of trained and registered model.
      - name: model_version
        type: int
        doc: Version of model to download.
      - name: target_dir
        type: str
        doc: Target directory to download model.
        default: .
      outputs:
      - type: None
      has_varargs: false
    upload_model:
      doc: Upload pre-trained model from local filesystem to Azure ML.
      name: upload_model
      lineno: 238
      has_kwargs: false
      parameters:
      - name: context
        type: MLClientCtx
        doc: MLRun context.
      - name: model_name
        type: str
        doc: Name of trained and registered model.
      - name: model_path
        type: str
        doc: Path to file on local filesystem.
      - name: model_description
        type: str
        doc: Description of models.
        default: null
      - name: model_tags
        type: dict
        doc: KV pairs of model tags.
        default: null
      outputs:
      - type: None
      has_varargs: false
    submit_training_job:
      doc: 'Submit training job to Azure AutoML and download trained model

        when completed. Uses previously registered dataset for training.'
      name: submit_training_job
      lineno: 352
      has_kwargs: false
      parameters:
      - name: context
        type: MLClientCtx
        doc: MLRun context.
      - name: experiment
        type: Experiment
        doc: Azure experiment.
      - name: compute_target
        type: ComputeTarget
        doc: Azure compute target.
      - name: register_model_name
        type: str
        doc: Name of model to register in Azure.
      - name: registered_dataset_name
        type: str
        doc: Name of dataset registered in Azure ML.
      - name: automl_settings
        type: dict
        doc: JSON string of all Azure AutoML settings.
      - name: training_set
        type: DataItem
        doc: Training set to log with model. For model monitoring integration.
      - name: label_column_name
        type: str
        doc: Name of target column in dataset.
        default: ''
      - name: save_n_models
        type: int
        doc: How many of the top performing models to log.
        default: 3
      - name: show_output
        type: bool
        doc: Displaying Azure logs.
        default: true
      outputs:
      - type: None
      has_varargs: false
    train:
      doc: 'Whole training flow for Azure AutoML. Registers dataset/feature vector,

        submits training job to Azure AutoML, and downloads trained model

        when completed.'
      name: train
      lineno: 469
      has_kwargs: false
      parameters:
      - name: context
        type: MLClientCtx
        doc: MLRun context.
      - name: dataset
        type: DataItem
        doc: MLRun FeatureVector or dataset URI to upload. Will drop index before
          uploading when it is a FeatureVector.
      - name: experiment_name
        type: str
        doc: Name of experiment to create in Azure ML.
        default: ''
      - name: cpu_cluster_name
        type: str
        doc: Name of Azure ML compute target. Created if does not exist.
        default: ''
      - name: vm_size
        type: str
        doc: Azure machine type for compute target.
        default: STANDARD_D2_V2
      - name: max_nodes
        type: int
        doc: Maximum number of concurrent compute targets.
        default: 1
      - name: dataset_name
        type: str
        doc: Name of Azure dataset to register.
        default: ''
      - name: dataset_description
        type: str
        doc: Description of Azure dataset to register.
        default: ''
      - name: create_new_version
        type: bool
        doc: Register Azure dataset as new version. Must be used when modifying dataset
          schema.
        default: false
      - name: label_column_name
        type: str
        doc: Target column in dataset.
        default: ''
      - name: register_model_name
        type: str
        doc: Name of model to register in Azure.
        default: ''
      - name: save_n_models
        type: int
        doc: How many of the top performing models to log.
        default: 1
      - name: log_azure
        type: bool
        doc: Displaying Azure logs.
        default: true
      - name: automl_settings
        type: str
        doc: JSON string of all Azure AutoML settings.
        default: null
      outputs:
      - type: None
      has_varargs: false
  description: Azure AutoML integration in MLRun, including utils functions for training
    models on Azure AutoML platfrom.
kind: job
metadata:
  categories:
  - model-serving
  - utils
  tag: ''
  name: azureml-utils