sonamu 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/database/base-model.js +2 -2
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +3 -4
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +48 -3
- package/package.json +4 -4
- package/src/database/base-model.ts +1 -1
- package/src/database/upsert-builder.ts +2 -3
- package/src/template/zod-converter.ts +55 -3
|
@@ -138,7 +138,7 @@ import { UpsertBuilder } from "./upsert-builder.js";
|
|
|
138
138
|
// COUNT(*)로 전체 레코드 수를 계산
|
|
139
139
|
// TODO: qb의 DISTINCT가 있는 경우 처리해야 함
|
|
140
140
|
const countResult = await countPuri.clear("select").select({
|
|
141
|
-
total: Puri.rawNumber(`COUNT(*)`)
|
|
141
|
+
total: Puri.rawNumber(`COUNT(*)::integer`)
|
|
142
142
|
}).first();
|
|
143
143
|
if (debug) {
|
|
144
144
|
countPuri.debug();
|
|
@@ -387,4 +387,4 @@ import { UpsertBuilder } from "./upsert-builder.js";
|
|
|
387
387
|
}
|
|
388
388
|
export const BaseModel = new BaseModelClass();
|
|
389
389
|
|
|
390
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCwgaXNPYmplY3QsIG9taXQsIHNldCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIGlzQ3VzdG9tSm9pbkNsYXVzZSwgdHlwZSBTdWJzZXRRdWVyeSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBCYXNlTGlzdFBhcmFtcyB9IGZyb20gXCIuLi91dGlscy9tb2RlbFwiO1xuaW1wb3J0IHsgZ2V0Sm9pblRhYmxlcywgZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSB9IGZyb20gXCIuLi91dGlscy9zcWwtcGFyc2VyXCI7XG5pbXBvcnQgeyBjaHVuayB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbmhhbmNlck1hcCxcbiAgRXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0LFxuICBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uLFxuICBVbmlvbkV4dHJhY3RlZFRUYWJsZXMsXG59IGZyb20gXCIuL2Jhc2UtbW9kZWwudHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgREJQcmVzZXQgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgUHVyaSB9IGZyb20gXCIuL3B1cmlcIjtcbmltcG9ydCB0eXBlIHsgSW5mZXJBbGxTdWJzZXRzLCBQdXJpTG9hZGVyUXVlcmllcywgUHVyaVN1YnNldEZuIH0gZnJvbSBcIi4vcHVyaS1zdWJzZXQudHlwZXNcIjtcbmltcG9ydCB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBVbmtub3duREJSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiDrqqjrk6AgTW9kZWwg7YG0656Y7Iqk7J2YIOq4sOuzuCDtgbTrnpjsiqRcbiAqXG4gKiBAdGVtcGxhdGUgVFN1YnNldEtleSAtIOyEnOu4jOyFiyDtgqQg7Jyg64uI7JioICjsmIg6IFwiQVwiIHwgXCJQXCIgfCBcIlNTXCIpXG4gKiBAdGVtcGxhdGUgVFN1YnNldE1hcHBpbmcgLSDshJzruIzshYvrs4Qg7LWc7KKFIOqysOqzvCDtg4DsnoUg66ek7ZWRXG4gKiBAdGVtcGxhdGUgVFN1YnNldFF1ZXJpZXMgLSDshJzruIzshYsg7L+866asIO2VqOyImCDqsJ3ssrRcbiAqIEB0ZW1wbGF0ZSBUTG9hZGVyUXVlcmllcyAtIOyEnOu4jOyFi+uzhCDroZzrjZQg7L+866asIOuwsOyXtCDqsJ3ssrRcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VNb2RlbENsYXNzPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUU3Vic2V0UXVlcmllcyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBQdXJpU3Vic2V0Rm4+ID0gbmV2ZXIsXG4gIFRMb2FkZXJRdWVyaWVzIGV4dGVuZHMgUHVyaUxvYWRlclF1ZXJpZXM8VFN1YnNldEtleT4gPSBuZXZlcixcbj4ge1xuICBwdWJsaWMgbW9kZWxOYW1lOiBzdHJpbmcgPSBcIlVua25vd25cIjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3Vic2V0UXVlcmllcz86IFRTdWJzZXRRdWVyaWVzLFxuICAgIHByb3RlY3RlZCBsb2FkZXJRdWVyaWVzPzogVExvYWRlclF1ZXJpZXMsXG4gICkge31cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICByZXR1cm4gREIuZ2V0REIod2hpY2gpO1xuICB9XG5cbiAgZ2V0UHVyaSh3aGljaDogREJQcmVzZXQpOiBQdXJpV3JhcHBlciB7XG4gICAgLy8g7Yq4656c7J6t7IWYIOy7qO2FjeyKpO2KuOyXkOyEnCDtirjrnpzsnq3shZgg7ZqN65OdXG4gICAgY29uc3QgdHJ4ID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0VHJhbnNhY3Rpb24od2hpY2gpO1xuICAgIGlmICh0cngpIHtcbiAgICAgIHJldHVybiB0cng7XG4gICAgfVxuXG4gICAgLy8g7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZzsmrQgUHVyaVdyYXBwZXIg67CY7ZmYXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKHdoaWNoKTtcbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKGRiLCB0aGlzLmdldFVwc2VydEJ1aWxkZXIoKSk7XG4gIH1cblxuICBhc3luYyBkZXN0cm95KCkge1xuICAgIHJldHVybiBEQi5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRJbnNlcnRlZElkcyhcbiAgICB3ZGI6IEtuZXgsXG4gICAgcm93czogVW5rbm93bkRCUmVjb3JkW10sXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgdW5xS2V5RmllbGRzOiBzdHJpbmdbXSxcbiAgICBjaHVua1NpemU6IG51bWJlciA9IDUwMCxcbiAgKSB7XG4gICAgaWYgKCF3ZGIpIHtcbiAgICAgIHdkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIH1cblxuICAgIGxldCB1bnFLZXlzOiBzdHJpbmdbXTtcbiAgICBsZXQgd2hlcmVJbkZpZWxkOiBzdHJpbmcgfCBLbmV4LlJhdztcbiAgICBsZXQgc2VsZWN0RmllbGQ6IHN0cmluZztcblxuICAgIGlmICh1bnFLZXlGaWVsZHMubGVuZ3RoID4gMSkge1xuICAgICAgd2hlcmVJbkZpZWxkID0gd2RiLnJhdyhgQ09OQ0FUX1dTKCdfJywgJyR7dW5xS2V5RmllbGRzLmpvaW4oXCIsXCIpfScpYCk7XG4gICAgICBzZWxlY3RGaWVsZCA9IGAke3doZXJlSW5GaWVsZH0gYXMgdG1wVWlkYDtcbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiB1bnFLZXlGaWVsZHMubWFwKChmaWVsZCkgPT4gcm93W2ZpZWxkXSkuam9pbihcIl9cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB1bnFLZXlGaWVsZHNbMF07XG4gICAgICBzZWxlY3RGaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiByb3dbdW5xS2V5RmllbGRzWzBdXSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRJZHM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtcyBvZiBjaHVuayh1bnFLZXlzLCBjaHVua1NpemUpKSB7XG4gICAgICBjb25zdCBkYlJvd3MgPSBhd2FpdCB3ZGIodGFibGVOYW1lKVxuICAgICAgICAuc2VsZWN0KFwiaWRcIiwgd2RiLnJhdyhzZWxlY3RGaWVsZCkpXG4gICAgICAgIC53aGVyZUluKHdoZXJlSW5GaWVsZCBhcyBzdHJpbmcsIGl0ZW1zKTtcbiAgICAgIHJlc3VsdElkcyA9IHJlc3VsdElkcy5jb25jYXQoXG4gICAgICAgIGRiUm93cy5tYXAoKGRiUm93OiBVbmtub3duREJSZWNvcmQpID0+IHBhcnNlSW50KFN0cmluZyhkYlJvdy5pZCkpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdElkcztcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUg7ISc67iM7IWL7JeQIOuMgO2VnCDsv7zrpqwg67mM642UIO2ajeuTnVxuICAgKlxuICAgKiBAcmV0dXJucyBxYiAtIOy/vOumrCDruYzrjZQgKOyhsOqxtCDstpTqsIDsmqkpXG4gICAqIEByZXR1cm5zIG9uU3Vic2V0IC0g7Yq57KCVIOyEnOu4jOyFiyDsoITsmqkg7YOA7J6F7J20IO2VhOyalO2VoCDrlYwg7IKs7JqpXG4gICAqL1xuICBnZXRTdWJzZXRRdWVyaWVzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihzdWJzZXQ6IFQpIHtcbiAgICBpZiAoIXRoaXMuc3Vic2V0UXVlcmllcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3Vic2V0UXVlcmllcyBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXJpV3JhcHBlciA9IG5ldyBQdXJpV3JhcHBlcih0aGlzLmdldERCKFwiclwiKSwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gICAgY29uc3QgcWIgPSB0aGlzLnN1YnNldFF1ZXJpZXNbc3Vic2V0XT8uKHB1cmlXcmFwcGVyKTtcblxuICAgIC8vIE5vbkFsbG93ZWRBc1NpbmdsZVRhYmxlOiDri6jsnbwg7YWM7J2067iUIOy7rOufvCDsoJHqt7wg67Cp7KeA7JqpIOuniOy7pFxuICAgIHR5cGUgUUJUYWJsZXMgPSBVbmlvbkV4dHJhY3RlZFRUYWJsZXM8VFN1YnNldEtleSwgVFN1YnNldFF1ZXJpZXM+ICYge1xuICAgICAgTm9uQWxsb3dlZEFzU2luZ2xlVGFibGU6IHsgX19mdWxsdGV4dF9fOiB0cnVlIH07XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBxYjogcWIgYXMgdW5rbm93biBhcyBQdXJpPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBRQlRhYmxlcywge30+LFxuICAgICAgb25TdWJzZXQ6ICgoX3N1YnNldDogVFN1YnNldEtleSB8IHJlYWRvbmx5IFRTdWJzZXRLZXlbXSkgPT4gcWIpIGFzIHtcbiAgICAgICAgLy8g64uo7J28IO2CpFxuICAgICAgICA8UyBleHRlbmRzIFRTdWJzZXRLZXk+KHN1YnNldDogUyk6IFJldHVyblR5cGU8VFN1YnNldFF1ZXJpZXNbU10+O1xuICAgICAgICAvLyDtgqQg67Cw7Je0IC0+IOq1kOynke2VqSDrsJjtmZhcbiAgICAgICAgPEFyciBleHRlbmRzIHJlYWRvbmx5IFRTdWJzZXRLZXlbXT4oXG4gICAgICAgICAgc3Vic2V0czogWy4uLkFycl0sXG4gICAgICAgICk6IFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248QXJyLCBUU3Vic2V0UXVlcmllcz47XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZXIg6rCd7LK0IOyDneyEsSDtl6ztjbxcbiAgICog7YOA7J6FIOqygOymnSDrsI8g7LaU66Gg7J2EIOuPhOyZgOykjFxuICAgKi9cbiAgY3JlYXRlRW5oYW5jZXJzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFQsIEluZmVyQWxsU3Vic2V0czxUU3Vic2V0UXVlcmllcywgVExvYWRlclF1ZXJpZXM+LCBUU3Vic2V0TWFwcGluZz4sXG4gICkge1xuICAgIHJldHVybiBlbmhhbmNlcnM7XG4gIH1cblxuICAvKipcbiAgICog7ISc67iM7IWLIOy/vOumrCDsi6TtlolcbiAgICpcbiAgICogMS4g7L+866asIOyLpO2WiSAocGFnaW5hdGlvbiDsoIHsmqkpXG4gICAqIDIuIOuhnOuNlCDsi6TtlokgKDE6TiwgTjpNIOq0gOqzhCDrjbDsnbTthLAg66Gc65SpKVxuICAgKiAzLiBIeWRyYXRlIChmbGF0IOKGkiDspJHssqkg6rCd7LK0KVxuICAgKiA0LiBFbmhhbmNlciDsoIHsmqkgKHZpcnR1YWwg7ZWE65OcIOqzhOyCsClcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJzZXRRdWVyeTxcbiAgICBUIGV4dGVuZHMgVFN1YnNldEtleSxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgSW5mZXJBbGxTdWJzZXRzPFRTdWJzZXRRdWVyaWVzLCBUTG9hZGVyUXVlcmllcz4sXG4gID4oXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJzZXQ6IFQ7XG4gICAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PjtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBudW0/OiBudW1iZXI7XG4gICAgICAgIHBhZ2U/OiBudW1iZXI7XG4gICAgICAgIHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCI7XG4gICAgICB9O1xuICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgICAgb3B0aW1pemVDb3VudFF1ZXJ5PzogYm9vbGVhbjtcbiAgICB9ICYgRW5oYW5jZXJQYXJhbTxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz4sXG4gICk6IFByb21pc2U8RXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0PFRTdWJzZXRNYXBwaW5nLCBUPj4ge1xuICAgIGNvbnN0IHsgc3Vic2V0LCBxYiwgcGFyYW1zOiBxdWVyeVBhcmFtcywgZGVidWcgPSBmYWxzZSwgb3B0aW1pemVDb3VudFF1ZXJ5ID0gZmFsc2UgfSA9IHBhcmFtcztcblxuICAgIGlmICghdGhpcy5sb2FkZXJRdWVyaWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsb2FkZXJRdWVyaWVzIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIGlmICghcXVlcnlQYXJhbXMubnVtIHx8ICFxdWVyeVBhcmFtcy5wYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJudW0gYW5kIHBhZ2UgYXJlIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbnVtLCBwYWdlIH0gPSBxdWVyeVBhcmFtcztcblxuICAgIC8vIENPVU5UIOy/vOumrCDsi6TtlolcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUNvdW50UXVlcnkocWIsIHF1ZXJ5UGFyYW1zLCBkZWJ1Zywgb3B0aW1pemVDb3VudFF1ZXJ5KTtcblxuICAgIC8vIExJU1Qg7L+866asIOyLpO2WiVxuICAgIGNvbnN0IGNvbXB1dGVkUm93cyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUxpc3RRdWVyeShzdWJzZXQsIHFiLCBxdWVyeVBhcmFtcywgbnVtLCBwYWdlLCBkZWJ1Zyk7XG5cbiAgICAvLyBFbmhhbmNlciDsoIHsmqlcbiAgICBjb25zdCBlbmhhbmNlciA9IChwYXJhbXMgYXMgYW55KS5lbmhhbmNlcnM/LltzdWJzZXRdO1xuICAgIGNvbnN0IHJvd3MgPSAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb21wdXRlZFJvd3MubWFwKChyb3cpID0+IGVuaGFuY2VyPy4ocm93KSA/PyByb3cpLFxuICAgICkpIGFzIFRTdWJzZXRNYXBwaW5nW1RdW107XG5cbiAgICByZXR1cm4geyByb3dzLCB0b3RhbCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENPVU5UIOy/vOumrCDsi6TtlokgKOuCtOu2gCDrqZTshJzrk5wpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVDb3VudFF1ZXJ5KFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIHBhcmFtczogeyBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiIH0sXG4gICAgZGVidWc6IGJvb2xlYW4sXG4gICAgb3B0aW1pemVDb3VudFF1ZXJ5OiBib29sZWFuLFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmIChwYXJhbXMucXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgY291bnRQdXJpID0gcWIuY2xvbmUoKS5jbGVhcihcIm9yZGVyXCIpLmNsZWFyKFwibGltaXRcIikuY2xlYXIoXCJvZmZzZXRcIik7XG5cbiAgICBpZiAob3B0aW1pemVDb3VudFF1ZXJ5KSB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IFNxbFBhcnNlciB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZS1zcWwtcGFyc2VyXCIpO1xuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFNxbFBhcnNlci5QYXJzZXIoKTtcbiAgICAgIGNvbnN0IHBhcnNlZFF1ZXJ5ID0gcGFyc2VyLmFzdGlmeShjb3VudFB1cmkudG9RdWVyeSgpLCB7XG4gICAgICAgIGRhdGFiYXNlOiBTb25hbXUuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGxlZnRKb2luVGFibGVzID0gZ2V0Sm9pblRhYmxlcyhwYXJzZWRRdWVyeSwgW1wiTEVGVCBKT0lOXCJdKTtcbiAgICAgIGNvbnN0IHdoZXJlVGFibGVzID0gZ2V0VGFibGVOYW1lc0Zyb21XaGVyZShwYXJzZWRRdWVyeSk7XG5cbiAgICAgIGNvbnN0IHRhYmxlc1RvUmVtb3ZlID0gbGVmdEpvaW5UYWJsZXMuZmlsdGVyKChqKSA9PiAhd2hlcmVUYWJsZXMuaW5jbHVkZXMoaikpO1xuICAgICAgdGFibGVzVG9SZW1vdmUuZm9yRWFjaCgodGFibGUpID0+IHtcbiAgICAgICAgY291bnRQdXJpLmNsZWFySm9pbih0YWJsZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDT1VOVCgqKeuhnCDsoITssrQg66CI7L2U65OcIOyImOulvCDqs4TsgrBcbiAgICAvLyBUT0RPOiBxYuydmCBESVNUSU5DVOqwgCDsnojripQg6rK97JqwIOyymOumrO2VtOyVvCDtlahcbiAgICBjb25zdCBjb3VudFJlc3VsdDogeyB0b3RhbD86IG51bWJlciB9ID0gYXdhaXQgY291bnRQdXJpXG4gICAgICAuY2xlYXIoXCJzZWxlY3RcIilcbiAgICAgIC5zZWxlY3QoeyB0b3RhbDogUHVyaS5yYXdOdW1iZXIoYENPVU5UKCopYCkgfSlcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb3VudFB1cmkuZGVidWcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRSZXN1bHQ/LnRvdGFsID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogTElTVCDsv7zrpqwg7Iuk7ZaJICjrgrTrtoAg66mU7ISc65OcKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTGlzdFF1ZXJ5PFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgcGFyYW1zOiB7IHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCIgfSxcbiAgICBudW06IG51bWJlcixcbiAgICBwYWdlOiBudW1iZXIsXG4gICAgZGVidWc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJjb3VudFwiKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IHVubG9hZGVkUm93cyA9IChhd2FpdCBxYi5saW1pdChudW0pLm9mZnNldChudW0gKiAocGFnZSAtIDEpKSkgYXMgYW55W107XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIHFiLmRlYnVnKCk7XG4gICAgfVxuXG4gICAgLy8g66Gc642UIOyymOumrFxuICAgIGNvbnN0IGxvYWRlcnMgPSAodGhpcy5sb2FkZXJRdWVyaWVzIGFzIGFueSlbc3Vic2V0XTtcbiAgICBpZiAobG9hZGVycyAmJiBBcnJheS5pc0FycmF5KGxvYWRlcnMpKSB7XG4gICAgICB1bmxvYWRlZFJvd3MgPSBhd2FpdCB0aGlzLnByb2Nlc3NMb2FkZXJzKHVubG9hZGVkUm93cywgbG9hZGVycywgZGVidWcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh5ZHJhdGUodW5sb2FkZWRSb3dzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsnqzqt4DsoIEg66Gc642UIOyymOumrFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTG9hZGVycyhyb3dzOiBhbnlbXSwgbG9hZGVyczogYW55W10sIGRlYnVnOiBib29sZWFuKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZUxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICBjb25zdCB7IGFzLCByZWZJZCwgcWI6IHJlc29sdmVMb2FkZXJRYkZuLCBsb2FkZXJzOiBuZXN0ZWRMb2FkZXJzIH0gPSByZXNvbHZlTG9hZGVyO1xuXG4gICAgICBjb25zdCByZXNvbHZlTG9hZGVyUWIgPSByZXNvbHZlTG9hZGVyUWJGbihcbiAgICAgICAgbmV3IFB1cmlXcmFwcGVyKHRoaXMuZ2V0REIoXCJyXCIpLCBuZXcgVXBzZXJ0QnVpbGRlcigpKSxcbiAgICAgICAgcm93cy5tYXAoKHJvdykgPT4gcm93W3JlZklkXSksXG4gICAgICApO1xuXG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgcmVzb2x2ZUxvYWRlclFiLmRlYnVnKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBsb2FkZWRSb3dzID0gKGF3YWl0IHJlc29sdmVMb2FkZXJRYikgYXMgYW55W107XG5cbiAgICAgIC8vIOykkeyyqSBsb2FkZXJz6rCAIOyeiOycvOuptCDsnqzqt4Ag7LKY66asXG4gICAgICBpZiAobmVzdGVkTG9hZGVycyAmJiBuZXN0ZWRMb2FkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9hZGVkUm93cyA9IGF3YWl0IHRoaXMucHJvY2Vzc0xvYWRlcnMobG9hZGVkUm93cywgbmVzdGVkTG9hZGVycywgZGVidWcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdWJSb3dHcm91cHMgPSBncm91cChsb2FkZWRSb3dzLCAocm93KSA9PiByb3cucmVmSWQpO1xuXG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByb3dbYXNdID0gKHN1YlJvd0dyb3Vwc1tyb3dbcmVmSWRdXSA/PyBbXSkubWFwKChyKSA9PiBvbWl0KHIsIFtcInJlZklkXCJdKSk7XG4gICAgICAgIHJldHVybiByb3c7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0IOugiOy9lOuTnOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmFxuICAgKlxuICAgKiAtIGB1c2VyX19uYW1lYCDihpIgYHsgdXNlcjogeyBuYW1lIH0gfWBcbiAgICogLSBudWxsYWJsZSByZWxhdGlvbuydmCDqsr3smrAg66qo65OgIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsnpDssrTrpbwgbnVsbOuhnFxuICAgKi9cbiAgaHlkcmF0ZTxUIGV4dGVuZHMgVW5rbm93bkRCUmVjb3JkPihyb3dzOiBUW10pOiBUW10ge1xuICAgIHJldHVybiByb3dzLm1hcCgocm93OiBUKSA9PiB7XG4gICAgICAvLyBudWxsYWJsZSByZWxhdGlvbiDsspjrpqw6IOq0gOugqCDtlYTrk5zqsIAg7KCE67aAIG51bGzsnbgg6rK97JqwIOuwqeyngFxuICAgICAgY29uc3QgbmVzdGVkS2V5cyA9IE9iamVjdC5rZXlzKHJvdykuZmlsdGVyKChrZXkpID0+IGtleS5pbmNsdWRlcyhcIl9fXCIpKTtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC5ncm91cEJ5KG5lc3RlZEtleXMsIChrZXkpID0+IGtleS5zcGxpdChcIl9fXCIpWzBdKTtcbiAgICAgIGNvbnN0IG51bGxLZXlzID0gT2JqZWN0LmVudHJpZXMoZ3JvdXBzKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChbXywgZGF0YV0pID0+XG4gICAgICAgICAgICBkYXRhICYmXG4gICAgICAgICAgICBkYXRhLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgIGRhdGEuZXZlcnkoXG4gICAgICAgICAgICAgIChmaWVsZCkgPT5cbiAgICAgICAgICAgICAgICByb3dbZmllbGRdID09PSBudWxsIHx8IChBcnJheS5pc0FycmF5KHJvd1tmaWVsZF0pICYmIHJvd1tmaWVsZF0ubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG5cbiAgICAgIGNvbnN0IGh5ZHJhdGVkID0gT2JqZWN0LmtleXMocm93KS5yZWR1Y2UoKHIsIGZpZWxkKSA9PiB7XG4gICAgICAgIGlmICghZmllbGQuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAgIC8vIOydvOuwmCDtlYTrk5w6IOuwsOyXtCDrgrQg6rCd7LK066m0IOyerOq3gCBoeWRyYXRlXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93W2ZpZWxkXSkgJiYgaXNPYmplY3Qocm93W2ZpZWxkXVswXSkpIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gdGhpcy5oeWRyYXRlKHJvd1tmaWVsZF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByW2ZpZWxkXSA9IHJvd1tmaWVsZF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KSR7LKpIO2VhOuTnCDsspjrpqw6IHVzZXJfX25hbWUg4oaSIHVzZXJbbmFtZV1cbiAgICAgICAgY29uc3QgcGFydHMgPSBmaWVsZC5zcGxpdChcIl9fXCIpO1xuICAgICAgICBjb25zdCBvYmpQYXRoID1cbiAgICAgICAgICBwYXJ0c1swXSArXG4gICAgICAgICAgcGFydHNcbiAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gYFske3BhcnR9XWApXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcblxuICAgICAgICByID0gc2V0KFxuICAgICAgICAgIHIsXG4gICAgICAgICAgb2JqUGF0aCxcbiAgICAgICAgICByb3dbZmllbGRdICYmIEFycmF5LmlzQXJyYXkocm93W2ZpZWxkXSkgJiYgaXNPYmplY3Qocm93W2ZpZWxkXVswXSlcbiAgICAgICAgICAgID8gdGhpcy5oeWRyYXRlKHJvd1tmaWVsZF0pXG4gICAgICAgICAgICA6IHJvd1tmaWVsZF0sXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LCB7fSBhcyBVbmtub3duREJSZWNvcmQpO1xuXG4gICAgICAvLyBudWxsIHJlbGF0aW9uIOyymOumrFxuICAgICAgbnVsbEtleXMuZm9yRWFjaCgobnVsbEtleSkgPT4ge1xuICAgICAgICBoeWRyYXRlZFtudWxsS2V5XSA9IG51bGw7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGh5ZHJhdGVkO1xuICAgIH0pIGFzIFRbXTtcbiAgfVxuXG4gIC8vIExlZ2FjeSBTdWJzZXRRdWVyeSDsi6TtlokgKFB1cmkg64+E7J6FIOyghCDtmLjtmZjsmqkpXG4gIGFzeW5jIHJ1blN1YnNldFF1ZXJ5PFQgZXh0ZW5kcyBCYXNlTGlzdFBhcmFtcywgVSBleHRlbmRzIHN0cmluZz4oe1xuICAgIHBhcmFtcyxcbiAgICBiYXNlVGFibGUsXG4gICAgc3Vic2V0LFxuICAgIHN1YnNldFF1ZXJ5LFxuICAgIGJ1aWxkLFxuICAgIGFmdGVyQnVpbGQsXG4gICAgZGVidWcsXG4gICAgZGI6IF9kYixcbiAgICBvcHRpbWl6ZUNvdW50UXVlcnksXG4gIH06IHtcbiAgICBzdWJzZXQ6IFU7XG4gICAgcGFyYW1zOiBUO1xuICAgIHN1YnNldFF1ZXJ5OiBTdWJzZXRRdWVyeTtcbiAgICBidWlsZDogKGJ1aWxkUGFyYW1zOiB7XG4gICAgICBxYjogS25leC5RdWVyeUJ1aWxkZXI7XG4gICAgICBkYjogS25leDtcbiAgICAgIHNlbGVjdDogKHN0cmluZyB8IEtuZXguUmF3KVtdO1xuICAgICAgam9pbnM6IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl07XG4gICAgICB2aXJ0dWFsOiBzdHJpbmdbXTtcbiAgICB9KSA9PiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgICBhZnRlckJ1aWxkPzogKGJ1aWxkUGFyYW1zOiB7XG4gICAgICBxYjogS25leC5RdWVyeUJ1aWxkZXI7XG4gICAgICBkYjogS25leDtcbiAgICAgIHNlbGVjdDogKHN0cmluZyB8IEtuZXguUmF3KVtdO1xuICAgICAgam9pbnM6IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl07XG4gICAgICB2aXJ0dWFsOiBzdHJpbmdbXTtcbiAgICB9KSA9PiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgICBiYXNlVGFibGU/OiBzdHJpbmc7XG4gICAgZGVidWc/OiBib29sZWFuIHwgXCJsaXN0XCIgfCBcImNvdW50XCI7XG4gICAgZGI/OiBLbmV4O1xuICAgIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFB1cmkg64+E7J6FIOyghOq5jOyngCBhbnnroZwg7Jyg7KeAXG4gICAgcm93czogYW55W107XG4gICAgdG90YWw/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgc3Vic2V0UXVlcnk6IFN1YnNldFF1ZXJ5O1xuICAgIHFiOiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgfT4ge1xuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnN0IFNxbFBhcnNlciA9IChhd2FpdCBpbXBvcnQoXCJub2RlLXNxbC1wYXJzZXJcIikpLmRlZmF1bHQ7XG4gICAgY29uc3QgeyBnZXRUYWJsZU5hbWUsIGdldFRhYmxlTmFtZXNGcm9tV2hlcmUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3NxbC1wYXJzZXJcIik7XG5cbiAgICBjb25zdCBkYiA9IF9kYiA/PyB0aGlzLmdldERCKHN1YnNldC5zdGFydHNXaXRoKFwiQVwiKSA/IFwid1wiIDogXCJyXCIpO1xuICAgIGJhc2VUYWJsZSA9IGJhc2VUYWJsZSA/PyBpbmZsZWN0aW9uLnBsdXJhbGl6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5tb2RlbE5hbWUpKTtcbiAgICBjb25zdCBxdWVyeU1vZGUgPSBwYXJhbXMucXVlcnlNb2RlID8/IChwYXJhbXMuaWQgIT09IHVuZGVmaW5lZCA/IFwibGlzdFwiIDogXCJib3RoXCIpO1xuXG4gICAgY29uc3QgeyBzZWxlY3QsIHZpcnR1YWwsIGpvaW5zLCBsb2FkZXJzIH0gPSBzdWJzZXRRdWVyeTtcbiAgICBjb25zdCBxYiA9IGJ1aWxkKHtcbiAgICAgIHFiOiBkYi5mcm9tKGJhc2VUYWJsZSksXG4gICAgICBkYixcbiAgICAgIHNlbGVjdCxcbiAgICAgIGpvaW5zLFxuICAgICAgdmlydHVhbCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFwcGx5Sm9pbkNsYXVzZSA9IChxYjogS25leC5RdWVyeUJ1aWxkZXIsIGpvaW5zOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdKSA9PiB7XG4gICAgICBqb2lucy5mb3JFYWNoKChqb2luKSA9PiB7XG4gICAgICAgIGlmIChqb2luLmpvaW4gPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgIHFiLmlubmVySm9pbihgJHtqb2luLnRhYmxlfSBhcyAke2pvaW4uYXN9YCwgdGhpcy5nZXRKb2luQ2xhdXNlKGRiLCBqb2luKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoam9pbi5qb2luID09PSBcIm91dGVyXCIpIHtcbiAgICAgICAgICBxYi5sZWZ0T3V0ZXJKb2luKGAke2pvaW4udGFibGV9IGFzICR7am9pbi5hc31gLCB0aGlzLmdldEpvaW5DbGF1c2UoZGIsIGpvaW4pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIGNvdW50UXVlcnlcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbG9uZWRRYiA9IHFiLmNsb25lKCkuY2xlYXIoXCJvcmRlclwiKS5jbGVhcihcIm9mZnNldFwiKS5jbGVhcihcImxpbWl0XCIpO1xuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFNxbFBhcnNlci5QYXJzZXIoKTtcblxuICAgICAgaWYgKG9wdGltaXplQ291bnRRdWVyeSkge1xuICAgICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHBhcnNlci5hc3RpZnkoY2xvbmVkUWIudG9RdWVyeSgpLCB7XG4gICAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0YWJsZXMgPSBnZXRUYWJsZU5hbWVzRnJvbVdoZXJlKHBhcnNlZFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgbmVlZFRvSm9pbiA9IHVuaXF1ZShcbiAgICAgICAgICB0YWJsZXMuZmxhdE1hcCgodGFibGUpID0+IHRhYmxlLnNwbGl0KFwiX19cIikubWFwKCh0KSA9PiBpbmZsZWN0aW9uLnBsdXJhbGl6ZSh0KSkpLFxuICAgICAgICApO1xuICAgICAgICBhcHBseUpvaW5DbGF1c2UoXG4gICAgICAgICAgY2xvbmVkUWIsXG4gICAgICAgICAgam9pbnMuZmlsdGVyKChqKSA9PiBuZWVkVG9Kb2luLmluY2x1ZGVzKGoudGFibGUpKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcGx5Sm9pbkNsYXVzZShjbG9uZWRRYiwgam9pbnMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9jZXNzZWRRYiA9IGFmdGVyQnVpbGQ/Lih7IHFiOiBjbG9uZWRRYiwgZGIsIHNlbGVjdCwgam9pbnMsIHZpcnR1YWwgfSkgPz8gY2xvbmVkUWI7XG5cbiAgICAgIGNvbnN0IHBhcnNlZFF1ZXJ5ID0gcGFyc2VyLmFzdGlmeShwcm9jZXNzZWRRYi50b1F1ZXJ5KCksIHtcbiAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHEgPSBBcnJheS5pc0FycmF5KHBhcnNlZFF1ZXJ5KSA/IHBhcnNlZFF1ZXJ5WzBdIDogcGFyc2VkUXVlcnk7XG4gICAgICBpZiAocS50eXBlICE9PSBcInNlbGVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcXVlcnlcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvdW50UXVlcnkgPVxuICAgICAgICBxLmRpc3RpbmN0ICE9PSBudWxsXG4gICAgICAgICAgPyBjbG9uZWRRYlxuICAgICAgICAgICAgICAuY2xlYXIoXCJzZWxlY3RcIilcbiAgICAgICAgICAgICAgLnNlbGVjdChcbiAgICAgICAgICAgICAgICBkYi5yYXcoXG4gICAgICAgICAgICAgICAgICBgQ09VTlQoRElTVElOQ1QgXFxgJHtnZXRUYWJsZU5hbWUocS5jb2x1bW5zWzBdLmV4cHIpfVxcYC5cXGAke3EuY29sdW1uc1swXS5leHByLmNvbHVtbn1cXGApIGFzIHRvdGFsYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5maXJzdCgpXG4gICAgICAgICAgOiBjbG9uZWRRYi5jbGVhcihcInNlbGVjdFwiKS5jb3VudChcIipcIiwgeyBhczogXCJ0b3RhbFwiIH0pLmZpcnN0KCk7XG4gICAgICBjb25zdCBjb3VudFJvdzogeyB0b3RhbD86IG51bWJlciB9ID0gYXdhaXQgY291bnRRdWVyeTtcblxuICAgICAgaWYgKGRlYnVnID09PSB0cnVlIHx8IGRlYnVnID09PSBcImNvdW50XCIpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkRFQlVHOiBjb3VudCBxdWVyeVwiLCBjaGFsay5ibHVlKGNvdW50UXVlcnkudG9RdWVyeSgpLnRvU3RyaW5nKCkpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvdW50Um93Py50b3RhbCA/PyAwO1xuICAgIH0pKCk7XG5cbiAgICAvLyBsaXN0UXVlcnlcbiAgICBjb25zdCByb3dzID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChxdWVyeU1vZGUgPT09IFwiY291bnRcIikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMubnVtICE9PSAwKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMubnVtKTtcbiAgICAgICAgcWIubGltaXQocGFyYW1zLm51bSk7XG4gICAgICAgIHFiLm9mZnNldChwYXJhbXMubnVtICogKChwYXJhbXMucGFnZSA/PyAxKSAtIDEpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xvbmVkUWIgPSBxYi5jbG9uZSgpLnNlbGVjdChzZWxlY3QpO1xuICAgICAgYXBwbHlKb2luQ2xhdXNlKGNsb25lZFFiLCBqb2lucyk7XG5cbiAgICAgIGNvbnN0IGxpc3RRdWVyeSA9IGFmdGVyQnVpbGQ/Lih7IHFiOiBjbG9uZWRRYiwgZGIsIHNlbGVjdCwgam9pbnMsIHZpcnR1YWwgfSkgPz8gY2xvbmVkUWI7XG5cbiAgICAgIGxldCByb3dzID0gYXdhaXQgbGlzdFF1ZXJ5O1xuICAgICAgaWYgKGRlYnVnID09PSB0cnVlIHx8IGRlYnVnID09PSBcImxpc3RcIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKFwiREVCVUc6IGxpc3QgcXVlcnlcIiwgY2hhbGsuYmx1ZShsaXN0UXVlcnkudG9RdWVyeSgpLnRvU3RyaW5nKCkpKTtcbiAgICAgIH1cblxuICAgICAgcm93cyA9IGF3YWl0IHRoaXMudXNlTG9hZGVycyhkYiwgcm93cywgbG9hZGVycyk7XG4gICAgICByb3dzID0gdGhpcy5oeWRyYXRlKHJvd3MpO1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB7IHJvd3MsIHRvdGFsLCBzdWJzZXRRdWVyeSwgcWIgfTtcbiAgfVxuXG4gIC8vIExlZ2FjeSBMb2FkZXIg7LKY66asIChQdXJpIOuPhOyehSDsoIQg7Zi47ZmY7JqpKVxuICBhc3luYyB1c2VMb2FkZXJzKGRiOiBLbmV4LCByb3dzOiBVbmtub3duREJSZWNvcmRbXSwgbG9hZGVyczogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdKSB7XG4gICAgaWYgKGxvYWRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICBsZXQgc3ViUTogS25leC5RdWVyeUJ1aWxkZXI7XG4gICAgICBsZXQgc3ViUm93czogVW5rbm93bkRCUmVjb3JkW107XG4gICAgICBsZXQgdG9Db2w6IHN0cmluZztcblxuICAgICAgY29uc3QgZnJvbUlkcyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1tsb2FkZXIubWFueUpvaW4uaWRGaWVsZF0pO1xuXG4gICAgICBpZiAobG9hZGVyLm1hbnlKb2luLnRocm91Z2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBIYXNNYW55XG4gICAgICAgIGNvbnN0IGlkQ29sdW1uID0gYCR7bG9hZGVyLm1hbnlKb2luLnRvVGFibGV9LiR7bG9hZGVyLm1hbnlKb2luLnRvQ29sfWA7XG4gICAgICAgIHN1YlEgPSBkYihsb2FkZXIubWFueUpvaW4udG9UYWJsZSlcbiAgICAgICAgICAud2hlcmVJbihpZENvbHVtbiBhcyBzdHJpbmcsIGZyb21JZHMgYXMgc3RyaW5nW10pXG4gICAgICAgICAgLnNlbGVjdChbLi4ubG9hZGVyLnNlbGVjdCwgaWRDb2x1bW5dKTtcblxuICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbikgPT4ge1xuICAgICAgICAgIGlmIChqb2luLmpvaW4gPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgICAgc3ViUS5pbm5lckpvaW4oYCR7am9pbi50YWJsZX0gYXMgJHtqb2luLmFzfWAsIHRoaXMuZ2V0Sm9pbkNsYXVzZShkYiwgam9pbikpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoam9pbi5qb2luID09PSBcIm91dGVyXCIpIHtcbiAgICAgICAgICAgIHN1YlEubGVmdE91dGVySm9pbihgJHtqb2luLnRhYmxlfSBhcyAke2pvaW4uYXN9YCwgdGhpcy5nZXRKb2luQ2xhdXNlKGRiLCBqb2luKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdG9Db2wgPSBsb2FkZXIubWFueUpvaW4udG9Db2w7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNYW55VG9NYW55XG4gICAgICAgIGNvbnN0IGlkQ29sdW1uID0gYCR7bG9hZGVyLm1hbnlKb2luLnRocm91Z2gudGFibGV9LiR7bG9hZGVyLm1hbnlKb2luLnRocm91Z2guZnJvbUNvbH1gO1xuICAgICAgICBzdWJRID0gZGIobG9hZGVyLm1hbnlKb2luLnRocm91Z2gudGFibGUpXG4gICAgICAgICAgLmpvaW4oXG4gICAgICAgICAgICBsb2FkZXIubWFueUpvaW4udG9UYWJsZSxcbiAgICAgICAgICAgIGAke2xvYWRlci5tYW55Sm9pbi50aHJvdWdoLnRhYmxlfS4ke2xvYWRlci5tYW55Sm9pbi50aHJvdWdoLnRvQ29sfWAsXG4gICAgICAgICAgICBgJHtsb2FkZXIubWFueUpvaW4udG9UYWJsZX0uJHtsb2FkZXIubWFueUpvaW4udG9Db2x9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgLndoZXJlSW4oaWRDb2x1bW4gYXMgc3RyaW5nLCBmcm9tSWRzIGFzIHN0cmluZ1tdKVxuICAgICAgICAgIC5zZWxlY3QodW5pcXVlKFsuLi5sb2FkZXIuc2VsZWN0LCBpZENvbHVtbl0pKTtcblxuICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbikgPT4ge1xuICAgICAgICAgIGlmIChqb2luLmpvaW4gPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgICAgc3ViUS5pbm5lckpvaW4oYCR7am9pbi50YWJsZX0gYXMgJHtqb2luLmFzfWAsIHRoaXMuZ2V0Sm9pbkNsYXVzZShkYiwgam9pbikpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoam9pbi5qb2luID09PSBcIm91dGVyXCIpIHtcbiAgICAgICAgICAgIHN1YlEubGVmdE91dGVySm9pbihgJHtqb2luLnRhYmxlfSBhcyAke2pvaW4uYXN9YCwgdGhpcy5nZXRKb2luQ2xhdXNlKGRiLCBqb2luKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdG9Db2wgPSBsb2FkZXIubWFueUpvaW4udGhyb3VnaC5mcm9tQ29sO1xuICAgICAgfVxuICAgICAgc3ViUm93cyA9IGF3YWl0IHN1YlE7XG5cbiAgICAgIGlmIChsb2FkZXIubG9hZGVycykge1xuICAgICAgICBzdWJSb3dzID0gYXdhaXQgdGhpcy51c2VMb2FkZXJzKGRiLCBzdWJSb3dzLCBsb2FkZXIubG9hZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd0dyb3VwcyA9IGdyb3VwKHN1YlJvd3MsIChyb3cpID0+IHJvd1t0b0NvbF0gYXMgc3RyaW5nKTtcbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJvd1tsb2FkZXIuYXNdID0gKHN1YlJvd0dyb3Vwc1tyb3dbbG9hZGVyLm1hbnlKb2luLmlkRmllbGRdIGFzIHN0cmluZ10gPz8gW10pLm1hcCgocikgPT5cbiAgICAgICAgICBvbWl0KHIsIFt0b0NvbF0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcm93O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgZ2V0Sm9pbkNsYXVzZShkYjogS25leDxhbnksIHVua25vd24+LCBqb2luOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdW251bWJlcl0pOiBLbmV4LlJhdzxhbnk+IHtcbiAgICBpZiAoIWlzQ3VzdG9tSm9pbkNsYXVzZShqb2luKSkge1xuICAgICAgcmV0dXJuIGRiLnJhdyhgJHtqb2luLmZyb219ID0gJHtqb2luLnRvfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGIucmF3KGpvaW4uY3VzdG9tKTtcbiAgICB9XG4gIH1cblxuICBnZXRVcHNlcnRCdWlsZGVyKCk6IFVwc2VydEJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgOiB7IGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiaW5mbGVjdGlvbiIsImdyb3VwIiwiaXNPYmplY3QiLCJvbWl0Iiwic2V0IiwidW5pcXVlIiwiU29uYW11IiwiaXNDdXN0b21Kb2luQ2xhdXNlIiwiZ2V0Sm9pblRhYmxlcyIsImdldFRhYmxlTmFtZXNGcm9tV2hlcmUiLCJjaHVuayIsIkRCIiwiUHVyaSIsIlB1cmlXcmFwcGVyIiwiVXBzZXJ0QnVpbGRlciIsIkJhc2VNb2RlbENsYXNzIiwibW9kZWxOYW1lIiwic3Vic2V0UXVlcmllcyIsImxvYWRlclF1ZXJpZXMiLCJnZXREQiIsIndoaWNoIiwiZ2V0UHVyaSIsInRyeCIsImdldFRyYW5zYWN0aW9uQ29udGV4dCIsImdldFRyYW5zYWN0aW9uIiwiZGIiLCJnZXRVcHNlcnRCdWlsZGVyIiwiZGVzdHJveSIsImdldEluc2VydGVkSWRzIiwid2RiIiwicm93cyIsInRhYmxlTmFtZSIsInVucUtleUZpZWxkcyIsImNodW5rU2l6ZSIsInVucUtleXMiLCJ3aGVyZUluRmllbGQiLCJzZWxlY3RGaWVsZCIsImxlbmd0aCIsInJhdyIsImpvaW4iLCJtYXAiLCJyb3ciLCJmaWVsZCIsInJlc3VsdElkcyIsIml0ZW1zIiwiZGJSb3dzIiwic2VsZWN0Iiwid2hlcmVJbiIsImNvbmNhdCIsImRiUm93IiwicGFyc2VJbnQiLCJTdHJpbmciLCJpZCIsImdldFN1YnNldFF1ZXJpZXMiLCJzdWJzZXQiLCJFcnJvciIsInB1cmlXcmFwcGVyIiwicWIiLCJvblN1YnNldCIsIl9zdWJzZXQiLCJjcmVhdGVFbmhhbmNlcnMiLCJlbmhhbmNlcnMiLCJleGVjdXRlU3Vic2V0UXVlcnkiLCJwYXJhbXMiLCJxdWVyeVBhcmFtcyIsImRlYnVnIiwib3B0aW1pemVDb3VudFF1ZXJ5IiwibnVtIiwicGFnZSIsInRvdGFsIiwiZXhlY3V0ZUNvdW50UXVlcnkiLCJjb21wdXRlZFJvd3MiLCJleGVjdXRlTGlzdFF1ZXJ5IiwiZW5oYW5jZXIiLCJQcm9taXNlIiwiYWxsIiwicXVlcnlNb2RlIiwiY291bnRQdXJpIiwiY2xvbmUiLCJjbGVhciIsImRlZmF1bHQiLCJTcWxQYXJzZXIiLCJwYXJzZXIiLCJQYXJzZXIiLCJwYXJzZWRRdWVyeSIsImFzdGlmeSIsInRvUXVlcnkiLCJkYXRhYmFzZSIsImNvbmZpZyIsImxlZnRKb2luVGFibGVzIiwid2hlcmVUYWJsZXMiLCJ0YWJsZXNUb1JlbW92ZSIsImZpbHRlciIsImoiLCJpbmNsdWRlcyIsImZvckVhY2giLCJ0YWJsZSIsImNsZWFySm9pbiIsImNvdW50UmVzdWx0IiwicmF3TnVtYmVyIiwiZmlyc3QiLCJ1bmxvYWRlZFJvd3MiLCJsaW1pdCIsIm9mZnNldCIsImxvYWRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJwcm9jZXNzTG9hZGVycyIsImh5ZHJhdGUiLCJyZXNvbHZlTG9hZGVyIiwiYXMiLCJyZWZJZCIsInJlc29sdmVMb2FkZXJRYkZuIiwibmVzdGVkTG9hZGVycyIsInJlc29sdmVMb2FkZXJRYiIsImxvYWRlZFJvd3MiLCJzdWJSb3dHcm91cHMiLCJyIiwibmVzdGVkS2V5cyIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJncm91cHMiLCJncm91cEJ5Iiwic3BsaXQiLCJudWxsS2V5cyIsImVudHJpZXMiLCJfIiwiZGF0YSIsImV2ZXJ5IiwiaHlkcmF0ZWQiLCJyZWR1Y2UiLCJwYXJ0cyIsIm9ialBhdGgiLCJzbGljZSIsInBhcnQiLCJudWxsS2V5IiwicnVuU3Vic2V0UXVlcnkiLCJiYXNlVGFibGUiLCJzdWJzZXRRdWVyeSIsImJ1aWxkIiwiYWZ0ZXJCdWlsZCIsIl9kYiIsImNoYWxrIiwiZ2V0VGFibGVOYW1lIiwic3RhcnRzV2l0aCIsInBsdXJhbGl6ZSIsInVuZGVyc2NvcmUiLCJ1bmRlZmluZWQiLCJ2aXJ0dWFsIiwiam9pbnMiLCJmcm9tIiwiYXBwbHlKb2luQ2xhdXNlIiwiaW5uZXJKb2luIiwiZ2V0Sm9pbkNsYXVzZSIsImxlZnRPdXRlckpvaW4iLCJjbG9uZWRRYiIsInRhYmxlcyIsIm5lZWRUb0pvaW4iLCJmbGF0TWFwIiwidCIsInByb2Nlc3NlZFFiIiwicSIsInR5cGUiLCJjb3VudFF1ZXJ5IiwiZGlzdGluY3QiLCJjb2x1bW5zIiwiZXhwciIsImNvbHVtbiIsImNvdW50IiwiY291bnRSb3ciLCJjb25zb2xlIiwiYmx1ZSIsInRvU3RyaW5nIiwibGlzdFF1ZXJ5IiwidXNlTG9hZGVycyIsImxvYWRlciIsInN1YlEiLCJzdWJSb3dzIiwidG9Db2wiLCJmcm9tSWRzIiwibWFueUpvaW4iLCJpZEZpZWxkIiwidGhyb3VnaCIsImlkQ29sdW1uIiwidG9UYWJsZSIsIm9uZUpvaW5zIiwiZnJvbUNvbCIsInRvIiwiY3VzdG9tIiwiQmFzZU1vZGVsIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0Ms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
|
|
390
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCwgaXNPYmplY3QsIG9taXQsIHNldCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIGlzQ3VzdG9tSm9pbkNsYXVzZSwgdHlwZSBTdWJzZXRRdWVyeSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBCYXNlTGlzdFBhcmFtcyB9IGZyb20gXCIuLi91dGlscy9tb2RlbFwiO1xuaW1wb3J0IHsgZ2V0Sm9pblRhYmxlcywgZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSB9IGZyb20gXCIuLi91dGlscy9zcWwtcGFyc2VyXCI7XG5pbXBvcnQgeyBjaHVuayB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbmhhbmNlck1hcCxcbiAgRXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0LFxuICBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uLFxuICBVbmlvbkV4dHJhY3RlZFRUYWJsZXMsXG59IGZyb20gXCIuL2Jhc2UtbW9kZWwudHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgREJQcmVzZXQgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgUHVyaSB9IGZyb20gXCIuL3B1cmlcIjtcbmltcG9ydCB0eXBlIHsgSW5mZXJBbGxTdWJzZXRzLCBQdXJpTG9hZGVyUXVlcmllcywgUHVyaVN1YnNldEZuIH0gZnJvbSBcIi4vcHVyaS1zdWJzZXQudHlwZXNcIjtcbmltcG9ydCB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBVbmtub3duREJSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiDrqqjrk6AgTW9kZWwg7YG0656Y7Iqk7J2YIOq4sOuzuCDtgbTrnpjsiqRcbiAqXG4gKiBAdGVtcGxhdGUgVFN1YnNldEtleSAtIOyEnOu4jOyFiyDtgqQg7Jyg64uI7JioICjsmIg6IFwiQVwiIHwgXCJQXCIgfCBcIlNTXCIpXG4gKiBAdGVtcGxhdGUgVFN1YnNldE1hcHBpbmcgLSDshJzruIzshYvrs4Qg7LWc7KKFIOqysOqzvCDtg4DsnoUg66ek7ZWRXG4gKiBAdGVtcGxhdGUgVFN1YnNldFF1ZXJpZXMgLSDshJzruIzshYsg7L+866asIO2VqOyImCDqsJ3ssrRcbiAqIEB0ZW1wbGF0ZSBUTG9hZGVyUXVlcmllcyAtIOyEnOu4jOyFi+uzhCDroZzrjZQg7L+866asIOuwsOyXtCDqsJ3ssrRcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VNb2RlbENsYXNzPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUU3Vic2V0UXVlcmllcyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBQdXJpU3Vic2V0Rm4+ID0gbmV2ZXIsXG4gIFRMb2FkZXJRdWVyaWVzIGV4dGVuZHMgUHVyaUxvYWRlclF1ZXJpZXM8VFN1YnNldEtleT4gPSBuZXZlcixcbj4ge1xuICBwdWJsaWMgbW9kZWxOYW1lOiBzdHJpbmcgPSBcIlVua25vd25cIjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3Vic2V0UXVlcmllcz86IFRTdWJzZXRRdWVyaWVzLFxuICAgIHByb3RlY3RlZCBsb2FkZXJRdWVyaWVzPzogVExvYWRlclF1ZXJpZXMsXG4gICkge31cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICByZXR1cm4gREIuZ2V0REIod2hpY2gpO1xuICB9XG5cbiAgZ2V0UHVyaSh3aGljaDogREJQcmVzZXQpOiBQdXJpV3JhcHBlciB7XG4gICAgLy8g7Yq4656c7J6t7IWYIOy7qO2FjeyKpO2KuOyXkOyEnCDtirjrnpzsnq3shZgg7ZqN65OdXG4gICAgY29uc3QgdHJ4ID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0VHJhbnNhY3Rpb24od2hpY2gpO1xuICAgIGlmICh0cngpIHtcbiAgICAgIHJldHVybiB0cng7XG4gICAgfVxuXG4gICAgLy8g7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZzsmrQgUHVyaVdyYXBwZXIg67CY7ZmYXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKHdoaWNoKTtcbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKGRiLCB0aGlzLmdldFVwc2VydEJ1aWxkZXIoKSk7XG4gIH1cblxuICBhc3luYyBkZXN0cm95KCkge1xuICAgIHJldHVybiBEQi5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRJbnNlcnRlZElkcyhcbiAgICB3ZGI6IEtuZXgsXG4gICAgcm93czogVW5rbm93bkRCUmVjb3JkW10sXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgdW5xS2V5RmllbGRzOiBzdHJpbmdbXSxcbiAgICBjaHVua1NpemU6IG51bWJlciA9IDUwMCxcbiAgKSB7XG4gICAgaWYgKCF3ZGIpIHtcbiAgICAgIHdkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIH1cblxuICAgIGxldCB1bnFLZXlzOiBzdHJpbmdbXTtcbiAgICBsZXQgd2hlcmVJbkZpZWxkOiBzdHJpbmcgfCBLbmV4LlJhdztcbiAgICBsZXQgc2VsZWN0RmllbGQ6IHN0cmluZztcblxuICAgIGlmICh1bnFLZXlGaWVsZHMubGVuZ3RoID4gMSkge1xuICAgICAgd2hlcmVJbkZpZWxkID0gd2RiLnJhdyhgQ09OQ0FUX1dTKCdfJywgJyR7dW5xS2V5RmllbGRzLmpvaW4oXCIsXCIpfScpYCk7XG4gICAgICBzZWxlY3RGaWVsZCA9IGAke3doZXJlSW5GaWVsZH0gYXMgdG1wVWlkYDtcbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiB1bnFLZXlGaWVsZHMubWFwKChmaWVsZCkgPT4gcm93W2ZpZWxkXSkuam9pbihcIl9cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB1bnFLZXlGaWVsZHNbMF07XG4gICAgICBzZWxlY3RGaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiByb3dbdW5xS2V5RmllbGRzWzBdXSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRJZHM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtcyBvZiBjaHVuayh1bnFLZXlzLCBjaHVua1NpemUpKSB7XG4gICAgICBjb25zdCBkYlJvd3MgPSBhd2FpdCB3ZGIodGFibGVOYW1lKVxuICAgICAgICAuc2VsZWN0KFwiaWRcIiwgd2RiLnJhdyhzZWxlY3RGaWVsZCkpXG4gICAgICAgIC53aGVyZUluKHdoZXJlSW5GaWVsZCBhcyBzdHJpbmcsIGl0ZW1zKTtcbiAgICAgIHJlc3VsdElkcyA9IHJlc3VsdElkcy5jb25jYXQoXG4gICAgICAgIGRiUm93cy5tYXAoKGRiUm93OiBVbmtub3duREJSZWNvcmQpID0+IHBhcnNlSW50KFN0cmluZyhkYlJvdy5pZCkpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdElkcztcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUg7ISc67iM7IWL7JeQIOuMgO2VnCDsv7zrpqwg67mM642UIO2ajeuTnVxuICAgKlxuICAgKiBAcmV0dXJucyBxYiAtIOy/vOumrCDruYzrjZQgKOyhsOqxtCDstpTqsIDsmqkpXG4gICAqIEByZXR1cm5zIG9uU3Vic2V0IC0g7Yq57KCVIOyEnOu4jOyFiyDsoITsmqkg7YOA7J6F7J20IO2VhOyalO2VoCDrlYwg7IKs7JqpXG4gICAqL1xuICBnZXRTdWJzZXRRdWVyaWVzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihzdWJzZXQ6IFQpIHtcbiAgICBpZiAoIXRoaXMuc3Vic2V0UXVlcmllcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3Vic2V0UXVlcmllcyBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXJpV3JhcHBlciA9IG5ldyBQdXJpV3JhcHBlcih0aGlzLmdldERCKFwiclwiKSwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gICAgY29uc3QgcWIgPSB0aGlzLnN1YnNldFF1ZXJpZXNbc3Vic2V0XT8uKHB1cmlXcmFwcGVyKTtcblxuICAgIC8vIE5vbkFsbG93ZWRBc1NpbmdsZVRhYmxlOiDri6jsnbwg7YWM7J2067iUIOy7rOufvCDsoJHqt7wg67Cp7KeA7JqpIOuniOy7pFxuICAgIHR5cGUgUUJUYWJsZXMgPSBVbmlvbkV4dHJhY3RlZFRUYWJsZXM8VFN1YnNldEtleSwgVFN1YnNldFF1ZXJpZXM+ICYge1xuICAgICAgTm9uQWxsb3dlZEFzU2luZ2xlVGFibGU6IHsgX19mdWxsdGV4dF9fOiB0cnVlIH07XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBxYjogcWIgYXMgdW5rbm93biBhcyBQdXJpPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBRQlRhYmxlcywge30+LFxuICAgICAgb25TdWJzZXQ6ICgoX3N1YnNldDogVFN1YnNldEtleSB8IHJlYWRvbmx5IFRTdWJzZXRLZXlbXSkgPT4gcWIpIGFzIHtcbiAgICAgICAgLy8g64uo7J28IO2CpFxuICAgICAgICA8UyBleHRlbmRzIFRTdWJzZXRLZXk+KHN1YnNldDogUyk6IFJldHVyblR5cGU8VFN1YnNldFF1ZXJpZXNbU10+O1xuICAgICAgICAvLyDtgqQg67Cw7Je0IC0+IOq1kOynke2VqSDrsJjtmZhcbiAgICAgICAgPEFyciBleHRlbmRzIHJlYWRvbmx5IFRTdWJzZXRLZXlbXT4oXG4gICAgICAgICAgc3Vic2V0czogWy4uLkFycl0sXG4gICAgICAgICk6IFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248QXJyLCBUU3Vic2V0UXVlcmllcz47XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZXIg6rCd7LK0IOyDneyEsSDtl6ztjbxcbiAgICog7YOA7J6FIOqygOymnSDrsI8g7LaU66Gg7J2EIOuPhOyZgOykjFxuICAgKi9cbiAgY3JlYXRlRW5oYW5jZXJzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFQsIEluZmVyQWxsU3Vic2V0czxUU3Vic2V0UXVlcmllcywgVExvYWRlclF1ZXJpZXM+LCBUU3Vic2V0TWFwcGluZz4sXG4gICkge1xuICAgIHJldHVybiBlbmhhbmNlcnM7XG4gIH1cblxuICAvKipcbiAgICog7ISc67iM7IWLIOy/vOumrCDsi6TtlolcbiAgICpcbiAgICogMS4g7L+866asIOyLpO2WiSAocGFnaW5hdGlvbiDsoIHsmqkpXG4gICAqIDIuIOuhnOuNlCDsi6TtlokgKDE6TiwgTjpNIOq0gOqzhCDrjbDsnbTthLAg66Gc65SpKVxuICAgKiAzLiBIeWRyYXRlIChmbGF0IOKGkiDspJHssqkg6rCd7LK0KVxuICAgKiA0LiBFbmhhbmNlciDsoIHsmqkgKHZpcnR1YWwg7ZWE65OcIOqzhOyCsClcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJzZXRRdWVyeTxcbiAgICBUIGV4dGVuZHMgVFN1YnNldEtleSxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgSW5mZXJBbGxTdWJzZXRzPFRTdWJzZXRRdWVyaWVzLCBUTG9hZGVyUXVlcmllcz4sXG4gID4oXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJzZXQ6IFQ7XG4gICAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PjtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBudW0/OiBudW1iZXI7XG4gICAgICAgIHBhZ2U/OiBudW1iZXI7XG4gICAgICAgIHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCI7XG4gICAgICB9O1xuICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgICAgb3B0aW1pemVDb3VudFF1ZXJ5PzogYm9vbGVhbjtcbiAgICB9ICYgRW5oYW5jZXJQYXJhbTxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz4sXG4gICk6IFByb21pc2U8RXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0PFRTdWJzZXRNYXBwaW5nLCBUPj4ge1xuICAgIGNvbnN0IHsgc3Vic2V0LCBxYiwgcGFyYW1zOiBxdWVyeVBhcmFtcywgZGVidWcgPSBmYWxzZSwgb3B0aW1pemVDb3VudFF1ZXJ5ID0gZmFsc2UgfSA9IHBhcmFtcztcblxuICAgIGlmICghdGhpcy5sb2FkZXJRdWVyaWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsb2FkZXJRdWVyaWVzIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIGlmICghcXVlcnlQYXJhbXMubnVtIHx8ICFxdWVyeVBhcmFtcy5wYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJudW0gYW5kIHBhZ2UgYXJlIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbnVtLCBwYWdlIH0gPSBxdWVyeVBhcmFtcztcblxuICAgIC8vIENPVU5UIOy/vOumrCDsi6TtlolcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUNvdW50UXVlcnkocWIsIHF1ZXJ5UGFyYW1zLCBkZWJ1Zywgb3B0aW1pemVDb3VudFF1ZXJ5KTtcblxuICAgIC8vIExJU1Qg7L+866asIOyLpO2WiVxuICAgIGNvbnN0IGNvbXB1dGVkUm93cyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUxpc3RRdWVyeShzdWJzZXQsIHFiLCBxdWVyeVBhcmFtcywgbnVtLCBwYWdlLCBkZWJ1Zyk7XG5cbiAgICAvLyBFbmhhbmNlciDsoIHsmqlcbiAgICBjb25zdCBlbmhhbmNlciA9IChwYXJhbXMgYXMgYW55KS5lbmhhbmNlcnM/LltzdWJzZXRdO1xuICAgIGNvbnN0IHJvd3MgPSAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb21wdXRlZFJvd3MubWFwKChyb3cpID0+IGVuaGFuY2VyPy4ocm93KSA/PyByb3cpLFxuICAgICkpIGFzIFRTdWJzZXRNYXBwaW5nW1RdW107XG5cbiAgICByZXR1cm4geyByb3dzLCB0b3RhbCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENPVU5UIOy/vOumrCDsi6TtlokgKOuCtOu2gCDrqZTshJzrk5wpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVDb3VudFF1ZXJ5KFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIHBhcmFtczogeyBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiIH0sXG4gICAgZGVidWc6IGJvb2xlYW4sXG4gICAgb3B0aW1pemVDb3VudFF1ZXJ5OiBib29sZWFuLFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmIChwYXJhbXMucXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgY291bnRQdXJpID0gcWIuY2xvbmUoKS5jbGVhcihcIm9yZGVyXCIpLmNsZWFyKFwibGltaXRcIikuY2xlYXIoXCJvZmZzZXRcIik7XG5cbiAgICBpZiAob3B0aW1pemVDb3VudFF1ZXJ5KSB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IFNxbFBhcnNlciB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZS1zcWwtcGFyc2VyXCIpO1xuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFNxbFBhcnNlci5QYXJzZXIoKTtcbiAgICAgIGNvbnN0IHBhcnNlZFF1ZXJ5ID0gcGFyc2VyLmFzdGlmeShjb3VudFB1cmkudG9RdWVyeSgpLCB7XG4gICAgICAgIGRhdGFiYXNlOiBTb25hbXUuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGxlZnRKb2luVGFibGVzID0gZ2V0Sm9pblRhYmxlcyhwYXJzZWRRdWVyeSwgW1wiTEVGVCBKT0lOXCJdKTtcbiAgICAgIGNvbnN0IHdoZXJlVGFibGVzID0gZ2V0VGFibGVOYW1lc0Zyb21XaGVyZShwYXJzZWRRdWVyeSk7XG5cbiAgICAgIGNvbnN0IHRhYmxlc1RvUmVtb3ZlID0gbGVmdEpvaW5UYWJsZXMuZmlsdGVyKChqKSA9PiAhd2hlcmVUYWJsZXMuaW5jbHVkZXMoaikpO1xuICAgICAgdGFibGVzVG9SZW1vdmUuZm9yRWFjaCgodGFibGUpID0+IHtcbiAgICAgICAgY291bnRQdXJpLmNsZWFySm9pbih0YWJsZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDT1VOVCgqKeuhnCDsoITssrQg66CI7L2U65OcIOyImOulvCDqs4TsgrBcbiAgICAvLyBUT0RPOiBxYuydmCBESVNUSU5DVOqwgCDsnojripQg6rK97JqwIOyymOumrO2VtOyVvCDtlahcbiAgICBjb25zdCBjb3VudFJlc3VsdDogeyB0b3RhbD86IG51bWJlciB9ID0gYXdhaXQgY291bnRQdXJpXG4gICAgICAuY2xlYXIoXCJzZWxlY3RcIilcbiAgICAgIC5zZWxlY3QoeyB0b3RhbDogUHVyaS5yYXdOdW1iZXIoYENPVU5UKCopOjppbnRlZ2VyYCkgfSlcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb3VudFB1cmkuZGVidWcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRSZXN1bHQ/LnRvdGFsID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogTElTVCDsv7zrpqwg7Iuk7ZaJICjrgrTrtoAg66mU7ISc65OcKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTGlzdFF1ZXJ5PFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgcGFyYW1zOiB7IHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCIgfSxcbiAgICBudW06IG51bWJlcixcbiAgICBwYWdlOiBudW1iZXIsXG4gICAgZGVidWc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJjb3VudFwiKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IHVubG9hZGVkUm93cyA9IChhd2FpdCBxYi5saW1pdChudW0pLm9mZnNldChudW0gKiAocGFnZSAtIDEpKSkgYXMgYW55W107XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIHFiLmRlYnVnKCk7XG4gICAgfVxuXG4gICAgLy8g66Gc642UIOyymOumrFxuICAgIGNvbnN0IGxvYWRlcnMgPSAodGhpcy5sb2FkZXJRdWVyaWVzIGFzIGFueSlbc3Vic2V0XTtcbiAgICBpZiAobG9hZGVycyAmJiBBcnJheS5pc0FycmF5KGxvYWRlcnMpKSB7XG4gICAgICB1bmxvYWRlZFJvd3MgPSBhd2FpdCB0aGlzLnByb2Nlc3NMb2FkZXJzKHVubG9hZGVkUm93cywgbG9hZGVycywgZGVidWcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh5ZHJhdGUodW5sb2FkZWRSb3dzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsnqzqt4DsoIEg66Gc642UIOyymOumrFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTG9hZGVycyhyb3dzOiBhbnlbXSwgbG9hZGVyczogYW55W10sIGRlYnVnOiBib29sZWFuKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZUxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICBjb25zdCB7IGFzLCByZWZJZCwgcWI6IHJlc29sdmVMb2FkZXJRYkZuLCBsb2FkZXJzOiBuZXN0ZWRMb2FkZXJzIH0gPSByZXNvbHZlTG9hZGVyO1xuXG4gICAgICBjb25zdCByZXNvbHZlTG9hZGVyUWIgPSByZXNvbHZlTG9hZGVyUWJGbihcbiAgICAgICAgbmV3IFB1cmlXcmFwcGVyKHRoaXMuZ2V0REIoXCJyXCIpLCBuZXcgVXBzZXJ0QnVpbGRlcigpKSxcbiAgICAgICAgcm93cy5tYXAoKHJvdykgPT4gcm93W3JlZklkXSksXG4gICAgICApO1xuXG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgcmVzb2x2ZUxvYWRlclFiLmRlYnVnKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBsb2FkZWRSb3dzID0gKGF3YWl0IHJlc29sdmVMb2FkZXJRYikgYXMgYW55W107XG5cbiAgICAgIC8vIOykkeyyqSBsb2FkZXJz6rCAIOyeiOycvOuptCDsnqzqt4Ag7LKY66asXG4gICAgICBpZiAobmVzdGVkTG9hZGVycyAmJiBuZXN0ZWRMb2FkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9hZGVkUm93cyA9IGF3YWl0IHRoaXMucHJvY2Vzc0xvYWRlcnMobG9hZGVkUm93cywgbmVzdGVkTG9hZGVycywgZGVidWcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdWJSb3dHcm91cHMgPSBncm91cChsb2FkZWRSb3dzLCAocm93KSA9PiByb3cucmVmSWQpO1xuXG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByb3dbYXNdID0gKHN1YlJvd0dyb3Vwc1tyb3dbcmVmSWRdXSA/PyBbXSkubWFwKChyKSA9PiBvbWl0KHIsIFtcInJlZklkXCJdKSk7XG4gICAgICAgIHJldHVybiByb3c7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0IOugiOy9lOuTnOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmFxuICAgKlxuICAgKiAtIGB1c2VyX19uYW1lYCDihpIgYHsgdXNlcjogeyBuYW1lIH0gfWBcbiAgICogLSBudWxsYWJsZSByZWxhdGlvbuydmCDqsr3smrAg66qo65OgIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsnpDssrTrpbwgbnVsbOuhnFxuICAgKi9cbiAgaHlkcmF0ZTxUIGV4dGVuZHMgVW5rbm93bkRCUmVjb3JkPihyb3dzOiBUW10pOiBUW10ge1xuICAgIHJldHVybiByb3dzLm1hcCgocm93OiBUKSA9PiB7XG4gICAgICAvLyBudWxsYWJsZSByZWxhdGlvbiDsspjrpqw6IOq0gOugqCDtlYTrk5zqsIAg7KCE67aAIG51bGzsnbgg6rK97JqwIOuwqeyngFxuICAgICAgY29uc3QgbmVzdGVkS2V5cyA9IE9iamVjdC5rZXlzKHJvdykuZmlsdGVyKChrZXkpID0+IGtleS5pbmNsdWRlcyhcIl9fXCIpKTtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC5ncm91cEJ5KG5lc3RlZEtleXMsIChrZXkpID0+IGtleS5zcGxpdChcIl9fXCIpWzBdKTtcbiAgICAgIGNvbnN0IG51bGxLZXlzID0gT2JqZWN0LmVudHJpZXMoZ3JvdXBzKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChbXywgZGF0YV0pID0+XG4gICAgICAgICAgICBkYXRhICYmXG4gICAgICAgICAgICBkYXRhLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgIGRhdGEuZXZlcnkoXG4gICAgICAgICAgICAgIChmaWVsZCkgPT5cbiAgICAgICAgICAgICAgICByb3dbZmllbGRdID09PSBudWxsIHx8IChBcnJheS5pc0FycmF5KHJvd1tmaWVsZF0pICYmIHJvd1tmaWVsZF0ubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG5cbiAgICAgIGNvbnN0IGh5ZHJhdGVkID0gT2JqZWN0LmtleXMocm93KS5yZWR1Y2UoKHIsIGZpZWxkKSA9PiB7XG4gICAgICAgIGlmICghZmllbGQuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAgIC8vIOydvOuwmCDtlYTrk5w6IOuwsOyXtCDrgrQg6rCd7LK066m0IOyerOq3gCBoeWRyYXRlXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93W2ZpZWxkXSkgJiYgaXNPYmplY3Qocm93W2ZpZWxkXVswXSkpIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gdGhpcy5oeWRyYXRlKHJvd1tmaWVsZF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByW2ZpZWxkXSA9IHJvd1tmaWVsZF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KSR7LKpIO2VhOuTnCDsspjrpqw6IHVzZXJfX25hbWUg4oaSIHVzZXJbbmFtZV1cbiAgICAgICAgY29uc3QgcGFydHMgPSBmaWVsZC5zcGxpdChcIl9fXCIpO1xuICAgICAgICBjb25zdCBvYmpQYXRoID1cbiAgICAgICAgICBwYXJ0c1swXSArXG4gICAgICAgICAgcGFydHNcbiAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gYFske3BhcnR9XWApXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcblxuICAgICAgICByID0gc2V0KFxuICAgICAgICAgIHIsXG4gICAgICAgICAgb2JqUGF0aCxcbiAgICAgICAgICByb3dbZmllbGRdICYmIEFycmF5LmlzQXJyYXkocm93W2ZpZWxkXSkgJiYgaXNPYmplY3Qocm93W2ZpZWxkXVswXSlcbiAgICAgICAgICAgID8gdGhpcy5oeWRyYXRlKHJvd1tmaWVsZF0pXG4gICAgICAgICAgICA6IHJvd1tmaWVsZF0sXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LCB7fSBhcyBVbmtub3duREJSZWNvcmQpO1xuXG4gICAgICAvLyBudWxsIHJlbGF0aW9uIOyymOumrFxuICAgICAgbnVsbEtleXMuZm9yRWFjaCgobnVsbEtleSkgPT4ge1xuICAgICAgICBoeWRyYXRlZFtudWxsS2V5XSA9IG51bGw7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGh5ZHJhdGVkO1xuICAgIH0pIGFzIFRbXTtcbiAgfVxuXG4gIC8vIExlZ2FjeSBTdWJzZXRRdWVyeSDsi6TtlokgKFB1cmkg64+E7J6FIOyghCDtmLjtmZjsmqkpXG4gIGFzeW5jIHJ1blN1YnNldFF1ZXJ5PFQgZXh0ZW5kcyBCYXNlTGlzdFBhcmFtcywgVSBleHRlbmRzIHN0cmluZz4oe1xuICAgIHBhcmFtcyxcbiAgICBiYXNlVGFibGUsXG4gICAgc3Vic2V0LFxuICAgIHN1YnNldFF1ZXJ5LFxuICAgIGJ1aWxkLFxuICAgIGFmdGVyQnVpbGQsXG4gICAgZGVidWcsXG4gICAgZGI6IF9kYixcbiAgICBvcHRpbWl6ZUNvdW50UXVlcnksXG4gIH06IHtcbiAgICBzdWJzZXQ6IFU7XG4gICAgcGFyYW1zOiBUO1xuICAgIHN1YnNldFF1ZXJ5OiBTdWJzZXRRdWVyeTtcbiAgICBidWlsZDogKGJ1aWxkUGFyYW1zOiB7XG4gICAgICBxYjogS25leC5RdWVyeUJ1aWxkZXI7XG4gICAgICBkYjogS25leDtcbiAgICAgIHNlbGVjdDogKHN0cmluZyB8IEtuZXguUmF3KVtdO1xuICAgICAgam9pbnM6IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl07XG4gICAgICB2aXJ0dWFsOiBzdHJpbmdbXTtcbiAgICB9KSA9PiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgICBhZnRlckJ1aWxkPzogKGJ1aWxkUGFyYW1zOiB7XG4gICAgICBxYjogS25leC5RdWVyeUJ1aWxkZXI7XG4gICAgICBkYjogS25leDtcbiAgICAgIHNlbGVjdDogKHN0cmluZyB8IEtuZXguUmF3KVtdO1xuICAgICAgam9pbnM6IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl07XG4gICAgICB2aXJ0dWFsOiBzdHJpbmdbXTtcbiAgICB9KSA9PiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgICBiYXNlVGFibGU/OiBzdHJpbmc7XG4gICAgZGVidWc/OiBib29sZWFuIHwgXCJsaXN0XCIgfCBcImNvdW50XCI7XG4gICAgZGI/OiBLbmV4O1xuICAgIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFB1cmkg64+E7J6FIOyghOq5jOyngCBhbnnroZwg7Jyg7KeAXG4gICAgcm93czogYW55W107XG4gICAgdG90YWw/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgc3Vic2V0UXVlcnk6IFN1YnNldFF1ZXJ5O1xuICAgIHFiOiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgfT4ge1xuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnN0IFNxbFBhcnNlciA9IChhd2FpdCBpbXBvcnQoXCJub2RlLXNxbC1wYXJzZXJcIikpLmRlZmF1bHQ7XG4gICAgY29uc3QgeyBnZXRUYWJsZU5hbWUsIGdldFRhYmxlTmFtZXNGcm9tV2hlcmUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3NxbC1wYXJzZXJcIik7XG5cbiAgICBjb25zdCBkYiA9IF9kYiA/PyB0aGlzLmdldERCKHN1YnNldC5zdGFydHNXaXRoKFwiQVwiKSA/IFwid1wiIDogXCJyXCIpO1xuICAgIGJhc2VUYWJsZSA9IGJhc2VUYWJsZSA/PyBpbmZsZWN0aW9uLnBsdXJhbGl6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5tb2RlbE5hbWUpKTtcbiAgICBjb25zdCBxdWVyeU1vZGUgPSBwYXJhbXMucXVlcnlNb2RlID8/IChwYXJhbXMuaWQgIT09IHVuZGVmaW5lZCA/IFwibGlzdFwiIDogXCJib3RoXCIpO1xuXG4gICAgY29uc3QgeyBzZWxlY3QsIHZpcnR1YWwsIGpvaW5zLCBsb2FkZXJzIH0gPSBzdWJzZXRRdWVyeTtcbiAgICBjb25zdCBxYiA9IGJ1aWxkKHtcbiAgICAgIHFiOiBkYi5mcm9tKGJhc2VUYWJsZSksXG4gICAgICBkYixcbiAgICAgIHNlbGVjdCxcbiAgICAgIGpvaW5zLFxuICAgICAgdmlydHVhbCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFwcGx5Sm9pbkNsYXVzZSA9IChxYjogS25leC5RdWVyeUJ1aWxkZXIsIGpvaW5zOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdKSA9PiB7XG4gICAgICBqb2lucy5mb3JFYWNoKChqb2luKSA9PiB7XG4gICAgICAgIGlmIChqb2luLmpvaW4gPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgIHFiLmlubmVySm9pbihgJHtqb2luLnRhYmxlfSBhcyAke2pvaW4uYXN9YCwgdGhpcy5nZXRKb2luQ2xhdXNlKGRiLCBqb2luKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoam9pbi5qb2luID09PSBcIm91dGVyXCIpIHtcbiAgICAgICAgICBxYi5sZWZ0T3V0ZXJKb2luKGAke2pvaW4udGFibGV9IGFzICR7am9pbi5hc31gLCB0aGlzLmdldEpvaW5DbGF1c2UoZGIsIGpvaW4pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIGNvdW50UXVlcnlcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbG9uZWRRYiA9IHFiLmNsb25lKCkuY2xlYXIoXCJvcmRlclwiKS5jbGVhcihcIm9mZnNldFwiKS5jbGVhcihcImxpbWl0XCIpO1xuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFNxbFBhcnNlci5QYXJzZXIoKTtcblxuICAgICAgaWYgKG9wdGltaXplQ291bnRRdWVyeSkge1xuICAgICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHBhcnNlci5hc3RpZnkoY2xvbmVkUWIudG9RdWVyeSgpLCB7XG4gICAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0YWJsZXMgPSBnZXRUYWJsZU5hbWVzRnJvbVdoZXJlKHBhcnNlZFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgbmVlZFRvSm9pbiA9IHVuaXF1ZShcbiAgICAgICAgICB0YWJsZXMuZmxhdE1hcCgodGFibGUpID0+IHRhYmxlLnNwbGl0KFwiX19cIikubWFwKCh0KSA9PiBpbmZsZWN0aW9uLnBsdXJhbGl6ZSh0KSkpLFxuICAgICAgICApO1xuICAgICAgICBhcHBseUpvaW5DbGF1c2UoXG4gICAgICAgICAgY2xvbmVkUWIsXG4gICAgICAgICAgam9pbnMuZmlsdGVyKChqKSA9PiBuZWVkVG9Kb2luLmluY2x1ZGVzKGoudGFibGUpKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcGx5Sm9pbkNsYXVzZShjbG9uZWRRYiwgam9pbnMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9jZXNzZWRRYiA9IGFmdGVyQnVpbGQ/Lih7IHFiOiBjbG9uZWRRYiwgZGIsIHNlbGVjdCwgam9pbnMsIHZpcnR1YWwgfSkgPz8gY2xvbmVkUWI7XG5cbiAgICAgIGNvbnN0IHBhcnNlZFF1ZXJ5ID0gcGFyc2VyLmFzdGlmeShwcm9jZXNzZWRRYi50b1F1ZXJ5KCksIHtcbiAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHEgPSBBcnJheS5pc0FycmF5KHBhcnNlZFF1ZXJ5KSA/IHBhcnNlZFF1ZXJ5WzBdIDogcGFyc2VkUXVlcnk7XG4gICAgICBpZiAocS50eXBlICE9PSBcInNlbGVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcXVlcnlcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvdW50UXVlcnkgPVxuICAgICAgICBxLmRpc3RpbmN0ICE9PSBudWxsXG4gICAgICAgICAgPyBjbG9uZWRRYlxuICAgICAgICAgICAgICAuY2xlYXIoXCJzZWxlY3RcIilcbiAgICAgICAgICAgICAgLnNlbGVjdChcbiAgICAgICAgICAgICAgICBkYi5yYXcoXG4gICAgICAgICAgICAgICAgICBgQ09VTlQoRElTVElOQ1QgXFxgJHtnZXRUYWJsZU5hbWUocS5jb2x1bW5zWzBdLmV4cHIpfVxcYC5cXGAke3EuY29sdW1uc1swXS5leHByLmNvbHVtbn1cXGApIGFzIHRvdGFsYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5maXJzdCgpXG4gICAgICAgICAgOiBjbG9uZWRRYi5jbGVhcihcInNlbGVjdFwiKS5jb3VudChcIipcIiwgeyBhczogXCJ0b3RhbFwiIH0pLmZpcnN0KCk7XG4gICAgICBjb25zdCBjb3VudFJvdzogeyB0b3RhbD86IG51bWJlciB9ID0gYXdhaXQgY291bnRRdWVyeTtcblxuICAgICAgaWYgKGRlYnVnID09PSB0cnVlIHx8IGRlYnVnID09PSBcImNvdW50XCIpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkRFQlVHOiBjb3VudCBxdWVyeVwiLCBjaGFsay5ibHVlKGNvdW50UXVlcnkudG9RdWVyeSgpLnRvU3RyaW5nKCkpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvdW50Um93Py50b3RhbCA/PyAwO1xuICAgIH0pKCk7XG5cbiAgICAvLyBsaXN0UXVlcnlcbiAgICBjb25zdCByb3dzID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChxdWVyeU1vZGUgPT09IFwiY291bnRcIikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMubnVtICE9PSAwKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMubnVtKTtcbiAgICAgICAgcWIubGltaXQocGFyYW1zLm51bSk7XG4gICAgICAgIHFiLm9mZnNldChwYXJhbXMubnVtICogKChwYXJhbXMucGFnZSA/PyAxKSAtIDEpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xvbmVkUWIgPSBxYi5jbG9uZSgpLnNlbGVjdChzZWxlY3QpO1xuICAgICAgYXBwbHlKb2luQ2xhdXNlKGNsb25lZFFiLCBqb2lucyk7XG5cbiAgICAgIGNvbnN0IGxpc3RRdWVyeSA9IGFmdGVyQnVpbGQ/Lih7IHFiOiBjbG9uZWRRYiwgZGIsIHNlbGVjdCwgam9pbnMsIHZpcnR1YWwgfSkgPz8gY2xvbmVkUWI7XG5cbiAgICAgIGxldCByb3dzID0gYXdhaXQgbGlzdFF1ZXJ5O1xuICAgICAgaWYgKGRlYnVnID09PSB0cnVlIHx8IGRlYnVnID09PSBcImxpc3RcIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKFwiREVCVUc6IGxpc3QgcXVlcnlcIiwgY2hhbGsuYmx1ZShsaXN0UXVlcnkudG9RdWVyeSgpLnRvU3RyaW5nKCkpKTtcbiAgICAgIH1cblxuICAgICAgcm93cyA9IGF3YWl0IHRoaXMudXNlTG9hZGVycyhkYiwgcm93cywgbG9hZGVycyk7XG4gICAgICByb3dzID0gdGhpcy5oeWRyYXRlKHJvd3MpO1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB7IHJvd3MsIHRvdGFsLCBzdWJzZXRRdWVyeSwgcWIgfTtcbiAgfVxuXG4gIC8vIExlZ2FjeSBMb2FkZXIg7LKY66asIChQdXJpIOuPhOyehSDsoIQg7Zi47ZmY7JqpKVxuICBhc3luYyB1c2VMb2FkZXJzKGRiOiBLbmV4LCByb3dzOiBVbmtub3duREJSZWNvcmRbXSwgbG9hZGVyczogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdKSB7XG4gICAgaWYgKGxvYWRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICBsZXQgc3ViUTogS25leC5RdWVyeUJ1aWxkZXI7XG4gICAgICBsZXQgc3ViUm93czogVW5rbm93bkRCUmVjb3JkW107XG4gICAgICBsZXQgdG9Db2w6IHN0cmluZztcblxuICAgICAgY29uc3QgZnJvbUlkcyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1tsb2FkZXIubWFueUpvaW4uaWRGaWVsZF0pO1xuXG4gICAgICBpZiAobG9hZGVyLm1hbnlKb2luLnRocm91Z2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBIYXNNYW55XG4gICAgICAgIGNvbnN0IGlkQ29sdW1uID0gYCR7bG9hZGVyLm1hbnlKb2luLnRvVGFibGV9LiR7bG9hZGVyLm1hbnlKb2luLnRvQ29sfWA7XG4gICAgICAgIHN1YlEgPSBkYihsb2FkZXIubWFueUpvaW4udG9UYWJsZSlcbiAgICAgICAgICAud2hlcmVJbihpZENvbHVtbiBhcyBzdHJpbmcsIGZyb21JZHMgYXMgc3RyaW5nW10pXG4gICAgICAgICAgLnNlbGVjdChbLi4ubG9hZGVyLnNlbGVjdCwgaWRDb2x1bW5dKTtcblxuICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbikgPT4ge1xuICAgICAgICAgIGlmIChqb2luLmpvaW4gPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgICAgc3ViUS5pbm5lckpvaW4oYCR7am9pbi50YWJsZX0gYXMgJHtqb2luLmFzfWAsIHRoaXMuZ2V0Sm9pbkNsYXVzZShkYiwgam9pbikpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoam9pbi5qb2luID09PSBcIm91dGVyXCIpIHtcbiAgICAgICAgICAgIHN1YlEubGVmdE91dGVySm9pbihgJHtqb2luLnRhYmxlfSBhcyAke2pvaW4uYXN9YCwgdGhpcy5nZXRKb2luQ2xhdXNlKGRiLCBqb2luKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdG9Db2wgPSBsb2FkZXIubWFueUpvaW4udG9Db2w7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNYW55VG9NYW55XG4gICAgICAgIGNvbnN0IGlkQ29sdW1uID0gYCR7bG9hZGVyLm1hbnlKb2luLnRocm91Z2gudGFibGV9LiR7bG9hZGVyLm1hbnlKb2luLnRocm91Z2guZnJvbUNvbH1gO1xuICAgICAgICBzdWJRID0gZGIobG9hZGVyLm1hbnlKb2luLnRocm91Z2gudGFibGUpXG4gICAgICAgICAgLmpvaW4oXG4gICAgICAgICAgICBsb2FkZXIubWFueUpvaW4udG9UYWJsZSxcbiAgICAgICAgICAgIGAke2xvYWRlci5tYW55Sm9pbi50aHJvdWdoLnRhYmxlfS4ke2xvYWRlci5tYW55Sm9pbi50aHJvdWdoLnRvQ29sfWAsXG4gICAgICAgICAgICBgJHtsb2FkZXIubWFueUpvaW4udG9UYWJsZX0uJHtsb2FkZXIubWFueUpvaW4udG9Db2x9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgLndoZXJlSW4oaWRDb2x1bW4gYXMgc3RyaW5nLCBmcm9tSWRzIGFzIHN0cmluZ1tdKVxuICAgICAgICAgIC5zZWxlY3QodW5pcXVlKFsuLi5sb2FkZXIuc2VsZWN0LCBpZENvbHVtbl0pKTtcblxuICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbikgPT4ge1xuICAgICAgICAgIGlmIChqb2luLmpvaW4gPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgICAgc3ViUS5pbm5lckpvaW4oYCR7am9pbi50YWJsZX0gYXMgJHtqb2luLmFzfWAsIHRoaXMuZ2V0Sm9pbkNsYXVzZShkYiwgam9pbikpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoam9pbi5qb2luID09PSBcIm91dGVyXCIpIHtcbiAgICAgICAgICAgIHN1YlEubGVmdE91dGVySm9pbihgJHtqb2luLnRhYmxlfSBhcyAke2pvaW4uYXN9YCwgdGhpcy5nZXRKb2luQ2xhdXNlKGRiLCBqb2luKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdG9Db2wgPSBsb2FkZXIubWFueUpvaW4udGhyb3VnaC5mcm9tQ29sO1xuICAgICAgfVxuICAgICAgc3ViUm93cyA9IGF3YWl0IHN1YlE7XG5cbiAgICAgIGlmIChsb2FkZXIubG9hZGVycykge1xuICAgICAgICBzdWJSb3dzID0gYXdhaXQgdGhpcy51c2VMb2FkZXJzKGRiLCBzdWJSb3dzLCBsb2FkZXIubG9hZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd0dyb3VwcyA9IGdyb3VwKHN1YlJvd3MsIChyb3cpID0+IHJvd1t0b0NvbF0gYXMgc3RyaW5nKTtcbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJvd1tsb2FkZXIuYXNdID0gKHN1YlJvd0dyb3Vwc1tyb3dbbG9hZGVyLm1hbnlKb2luLmlkRmllbGRdIGFzIHN0cmluZ10gPz8gW10pLm1hcCgocikgPT5cbiAgICAgICAgICBvbWl0KHIsIFt0b0NvbF0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcm93O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgZ2V0Sm9pbkNsYXVzZShkYjogS25leDxhbnksIHVua25vd24+LCBqb2luOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdW251bWJlcl0pOiBLbmV4LlJhdzxhbnk+IHtcbiAgICBpZiAoIWlzQ3VzdG9tSm9pbkNsYXVzZShqb2luKSkge1xuICAgICAgcmV0dXJuIGRiLnJhdyhgJHtqb2luLmZyb219ID0gJHtqb2luLnRvfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGIucmF3KGpvaW4uY3VzdG9tKTtcbiAgICB9XG4gIH1cblxuICBnZXRVcHNlcnRCdWlsZGVyKCk6IFVwc2VydEJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgOiB7IGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiaW5mbGVjdGlvbiIsImdyb3VwIiwiaXNPYmplY3QiLCJvbWl0Iiwic2V0IiwidW5pcXVlIiwiU29uYW11IiwiaXNDdXN0b21Kb2luQ2xhdXNlIiwiZ2V0Sm9pblRhYmxlcyIsImdldFRhYmxlTmFtZXNGcm9tV2hlcmUiLCJjaHVuayIsIkRCIiwiUHVyaSIsIlB1cmlXcmFwcGVyIiwiVXBzZXJ0QnVpbGRlciIsIkJhc2VNb2RlbENsYXNzIiwibW9kZWxOYW1lIiwic3Vic2V0UXVlcmllcyIsImxvYWRlclF1ZXJpZXMiLCJnZXREQiIsIndoaWNoIiwiZ2V0UHVyaSIsInRyeCIsImdldFRyYW5zYWN0aW9uQ29udGV4dCIsImdldFRyYW5zYWN0aW9uIiwiZGIiLCJnZXRVcHNlcnRCdWlsZGVyIiwiZGVzdHJveSIsImdldEluc2VydGVkSWRzIiwid2RiIiwicm93cyIsInRhYmxlTmFtZSIsInVucUtleUZpZWxkcyIsImNodW5rU2l6ZSIsInVucUtleXMiLCJ3aGVyZUluRmllbGQiLCJzZWxlY3RGaWVsZCIsImxlbmd0aCIsInJhdyIsImpvaW4iLCJtYXAiLCJyb3ciLCJmaWVsZCIsInJlc3VsdElkcyIsIml0ZW1zIiwiZGJSb3dzIiwic2VsZWN0Iiwid2hlcmVJbiIsImNvbmNhdCIsImRiUm93IiwicGFyc2VJbnQiLCJTdHJpbmciLCJpZCIsImdldFN1YnNldFF1ZXJpZXMiLCJzdWJzZXQiLCJFcnJvciIsInB1cmlXcmFwcGVyIiwicWIiLCJvblN1YnNldCIsIl9zdWJzZXQiLCJjcmVhdGVFbmhhbmNlcnMiLCJlbmhhbmNlcnMiLCJleGVjdXRlU3Vic2V0UXVlcnkiLCJwYXJhbXMiLCJxdWVyeVBhcmFtcyIsImRlYnVnIiwib3B0aW1pemVDb3VudFF1ZXJ5IiwibnVtIiwicGFnZSIsInRvdGFsIiwiZXhlY3V0ZUNvdW50UXVlcnkiLCJjb21wdXRlZFJvd3MiLCJleGVjdXRlTGlzdFF1ZXJ5IiwiZW5oYW5jZXIiLCJQcm9taXNlIiwiYWxsIiwicXVlcnlNb2RlIiwiY291bnRQdXJpIiwiY2xvbmUiLCJjbGVhciIsImRlZmF1bHQiLCJTcWxQYXJzZXIiLCJwYXJzZXIiLCJQYXJzZXIiLCJwYXJzZWRRdWVyeSIsImFzdGlmeSIsInRvUXVlcnkiLCJkYXRhYmFzZSIsImNvbmZpZyIsImxlZnRKb2luVGFibGVzIiwid2hlcmVUYWJsZXMiLCJ0YWJsZXNUb1JlbW92ZSIsImZpbHRlciIsImoiLCJpbmNsdWRlcyIsImZvckVhY2giLCJ0YWJsZSIsImNsZWFySm9pbiIsImNvdW50UmVzdWx0IiwicmF3TnVtYmVyIiwiZmlyc3QiLCJ1bmxvYWRlZFJvd3MiLCJsaW1pdCIsIm9mZnNldCIsImxvYWRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJwcm9jZXNzTG9hZGVycyIsImh5ZHJhdGUiLCJyZXNvbHZlTG9hZGVyIiwiYXMiLCJyZWZJZCIsInJlc29sdmVMb2FkZXJRYkZuIiwibmVzdGVkTG9hZGVycyIsInJlc29sdmVMb2FkZXJRYiIsImxvYWRlZFJvd3MiLCJzdWJSb3dHcm91cHMiLCJyIiwibmVzdGVkS2V5cyIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJncm91cHMiLCJncm91cEJ5Iiwic3BsaXQiLCJudWxsS2V5cyIsImVudHJpZXMiLCJfIiwiZGF0YSIsImV2ZXJ5IiwiaHlkcmF0ZWQiLCJyZWR1Y2UiLCJwYXJ0cyIsIm9ialBhdGgiLCJzbGljZSIsInBhcnQiLCJudWxsS2V5IiwicnVuU3Vic2V0UXVlcnkiLCJiYXNlVGFibGUiLCJzdWJzZXRRdWVyeSIsImJ1aWxkIiwiYWZ0ZXJCdWlsZCIsIl9kYiIsImNoYWxrIiwiZ2V0VGFibGVOYW1lIiwic3RhcnRzV2l0aCIsInBsdXJhbGl6ZSIsInVuZGVyc2NvcmUiLCJ1bmRlZmluZWQiLCJ2aXJ0dWFsIiwiam9pbnMiLCJmcm9tIiwiYXBwbHlKb2luQ2xhdXNlIiwiaW5uZXJKb2luIiwiZ2V0Sm9pbkNsYXVzZSIsImxlZnRPdXRlckpvaW4iLCJjbG9uZWRRYiIsInRhYmxlcyIsIm5lZWRUb0pvaW4iLCJmbGF0TWFwIiwidCIsInByb2Nlc3NlZFFiIiwicSIsInR5cGUiLCJjb3VudFF1ZXJ5IiwiZGlzdGluY3QiLCJjb2x1bW5zIiwiZXhwciIsImNvbHVtbiIsImNvdW50IiwiY291bnRSb3ciLCJjb25zb2xlIiwiYmx1ZSIsInRvU3RyaW5nIiwibGlzdFF1ZXJ5IiwidXNlTG9hZGVycyIsImxvYWRlciIsInN1YlEiLCJzdWJSb3dzIiwidG9Db2wiLCJmcm9tSWRzIiwibWFueUpvaW4iLCJpZEZpZWxkIiwidGhyb3VnaCIsImlkQ29sdW1uIiwidG9UYWJsZSIsIm9uZUpvaW5zIiwiZnJvbUNvbCIsInRvIiwiY3VzdG9tIiwiQmFzZU1vZGVsIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upsert-builder.d.ts","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAOjC,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,aAAa,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACtD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AACF,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AACF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAOzD;AAED,qBAAa,aAAa;IACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;IAK/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IAwBtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE;SACF,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO;KAClF,GACA,KAAK;IAqFF,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAG3E,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/E,cAAc,CAClB,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"upsert-builder.d.ts","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAOjC,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,aAAa,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACtD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AACF,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AACF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAOzD;AAED,qBAAa,aAAa;IACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;IAK/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IAwBtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE;SACF,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO;KAClF,GACA,KAAK;IAqFF,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAG3E,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/E,cAAc,CAClB,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC;IAoKd,WAAW,CACf,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC3B,GACA,OAAO,CAAC,IAAI,CAAC;IAyChB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CA8D1B"}
|
|
@@ -205,12 +205,11 @@ export class UpsertBuilder {
|
|
|
205
205
|
const uuids = dataChunk.map((r)=>r.uuid);
|
|
206
206
|
resultRows = await wdb(tableName).select(selectFields).whereIn("uuid", uuids);
|
|
207
207
|
} else {
|
|
208
|
-
// UPSERT
|
|
208
|
+
// UPSERT 모드: onConflict로 중복 처리
|
|
209
209
|
const conflictColumns = table.uniqueIndexes[0].columns;
|
|
210
210
|
const updateColumns = Object.keys(dataChunk[0]).filter((col)=>col !== "uuid" && !conflictColumns.includes(col));
|
|
211
|
-
// RETURNING으로 결과 받기
|
|
212
211
|
const query = wdb.insert(dataChunk).into(tableName).onConflict(conflictColumns);
|
|
213
|
-
// updateColumns
|
|
212
|
+
// updateColumns 유무에 따라 ignore/merge 선택하고 RETURNING으로 결과 받기
|
|
214
213
|
if (updateColumns.length === 0) {
|
|
215
214
|
resultRows = await query.ignore().returning(selectFields);
|
|
216
215
|
} else {
|
|
@@ -362,4 +361,4 @@ export class UpsertBuilder {
|
|
|
362
361
|
}
|
|
363
362
|
}
|
|
364
363
|
|
|
365
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS91cHNlcnQtYnVpbGRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIGNodW5rLCBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgYmF0Y2hVcGRhdGUsIHR5cGUgUm93V2l0aElkIH0gZnJvbSBcIi4vX2JhdGNoX3VwZGF0ZVwiO1xuXG50eXBlIFRhYmxlRGF0YSA9IHtcbiAgcmVmZXJlbmNlczogU2V0PHN0cmluZz47XG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIHVuaXF1ZUluZGV4ZXM6IHsgbmFtZT86IHN0cmluZzsgY29sdW1uczogc3RyaW5nW10gfVtdO1xuICB1bmlxdWVzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufTtcbmV4cG9ydCB0eXBlIFVCUmVmID0ge1xuICB1dWlkOiBzdHJpbmc7XG4gIG9mOiBzdHJpbmc7XG4gIHVzZT86IHN0cmluZztcbn07XG5leHBvcnQgZnVuY3Rpb24gaXNSZWZGaWVsZChmaWVsZDogdW5rbm93bik6IGZpZWxkIGlzIFVCUmVmIHtcbiAgcmV0dXJuIChcbiAgICBmaWVsZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgZmllbGQgIT09IG51bGwgJiZcbiAgICAoZmllbGQgYXMgVUJSZWYpPy5vZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8udXVpZCAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBVcHNlcnRCdWlsZGVyIHtcbiAgdGFibGVzOiBNYXA8c3RyaW5nLCBUYWJsZURhdGE+O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRhYmxlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIGdldFRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVEYXRhIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlU3BlYyA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgY29uc3QgdGFibGVEYXRhID0ge1xuICAgICAgcmVmZXJlbmNlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICByb3dzOiBbXSxcbiAgICAgIHVuaXF1ZUluZGV4ZXM6IHRhYmxlU3BlYz8udW5pcXVlSW5kZXhlcyA/PyBbXSxcbiAgICAgIHVuaXF1ZXNNYXA6IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCksXG4gICAgfTtcbiAgICB0aGlzLnRhYmxlcy5zZXQodGFibGVOYW1lLCB0YWJsZURhdGEpO1xuICAgIHJldHVybiB0YWJsZURhdGE7XG4gIH1cblxuICBoYXNUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlcy5oYXModGFibGVOYW1lKTtcbiAgfVxuXG4gIHJlZ2lzdGVyPFQgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHJvdzoge1xuICAgICAgW2tleSBpbiBUXT86IFVCUmVmIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludCB8IG51bGwgfCBvYmplY3QgfCB1bmtub3duO1xuICAgIH0sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZ2V0VGFibGUodGFibGVOYW1lKTtcblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJTsnZggdW5pcXVlIOyduOuNseyKpOulvCDsiJztmoztlZjrqbAg7YKkIOyDneyEsVxuICAgIGNvbnN0IHVuaXF1ZUtleXMgPSB0YWJsZS51bmlxdWVJbmRleGVzXG4gICAgICAubWFwKCh1bnFJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB1bmlxdWVLZXlBcnJheSA9IHVucUluZGV4LmNvbHVtbnMubWFwKCh1bnFDb2wpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSByb3dbdW5xQ29sIGFzIGtleW9mIHR5cGVvZiByb3ddO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwudXVpZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1t1bnFDb2wgYXMga2V5b2YgdHlwZW9mIHJvd10gPz8gcmFuZG9tVVVJRCgpOyAvLyBudWxsYWJsZeyduCDqsr3smrAgdXVpZOuhnCDrnpzrjaTqsJIg7IK97J6FXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDqsJLsnbQg66qo65GQIG51bGzsnbgg6rK97JqwIO2CpCDsg53shLEg7Yyo7IqkXG4gICAgICAgIGlmICh1bmlxdWVLZXlBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pcXVlS2V5QXJyYXkuam9pbihcIi0tLWRlbGltaXRlci0tXCIpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgLy8gdXVpZCDsg53shLEg66Gc7KeBXG4gICAgY29uc3QgeyB1dWlkLCBpc1JldXNlZCB9ID0gKCgpID0+IHtcbiAgICAgIC8vIO2CpOulvCDsiJztmoztlZjsl6wg7J2066+4IOyhtOyerO2VmOuKlCDtgqTqsIAg7J6I64qU7KeAIO2ZleyduFxuICAgICAgaWYgKHVuaXF1ZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgICAgaWYgKHRhYmxlLnVuaXF1ZXNNYXAuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHV1aWQ6IGFzc2VydERlZmluZWQodGFibGUudW5pcXVlc01hcC5nZXQodW5pcXVlS2V5KSwgXCJVbmlxdWUga2V5IG5vdCBmb3VuZFwiKSxcbiAgICAgICAgICAgICAgaXNSZXVzZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDssL7snYQg7IiYIOyXhuuKlCDqsr3smrAg7IOd7ISxXG4gICAgICByZXR1cm4geyB1dWlkOiByYW5kb21VVUlEKCksIGlzUmV1c2VkOiBmYWxzZSB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyDrqqjrk6Ag7Jyg64uI7YGs7YKk7JeQIOuMgO2VtCDsnKDri4jtgazrp7Xsl5AgdXVpZCDsoIDsnqVcbiAgICBpZiAodW5pcXVlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgIHRhYmxlLnVuaXF1ZXNNYXAuc2V0KHVuaXF1ZUtleSwgdXVpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7J20IO2FjOydtOu4lOyXkCDsgqzsmqnrkJwgUmVmRmllbGTrpbwg7Iic7ZqM7ZWY7JesLCDtmITsnqwg7YWM7J2067iUIOygleuztOyXkCDslrTrlqQg7ZWE65Oc66W8IOywuOyhsO2VmOuKlOyngCDstpTqsIBcbiAgICAvLyDsnbQg7KCV67O066W8IOuCmOykkeyXkCDsuZjtmZjtlaAg65WMIOyCrOyaqVxuICAgIHJvdyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJvdykubWFwKChbcm93S2V5LCByb3dWYWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGlzUmVmRmllbGQocm93VmFsdWUpKSB7XG4gICAgICAgICAgcm93VmFsdWUudXNlID8/PSBcImlkXCI7XG4gICAgICAgICAgdGFibGUucmVmZXJlbmNlcy5hZGQoYCR7cm93VmFsdWUub2Z9LiR7cm93VmFsdWUudXNlfWApO1xuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvd1ZhbHVlID09PSBcIm9iamVjdFwiICYmICEocm93VmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgIC8vIG9iamVjdOyduCDqsr3smrAgSlNPTuycvOuhnCDrs4DtmZhcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWUgPT09IG51bGwgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkocm93VmFsdWUpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApIGFzIHsgW2tleSBpbiBUXT86IHVua25vd24gfTtcblxuICAgIHRhYmxlLnJvd3MucHVzaCh7XG4gICAgICB1dWlkLFxuICAgICAgLi4ucm93LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0OiBVQlJlZiA9IHtcbiAgICAgIG9mOiB0YWJsZU5hbWUsXG4gICAgICB1dWlkOiAocm93IGFzIHsgdXVpZD86IHN0cmluZyB9KS51dWlkID8/IHV1aWQsXG4gICAgfTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZ2lzdGVyXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHV1aWQ6IHJlc3VsdC51dWlkLFxuICAgICAgaXNVdWlkUmV1c2VkOiBpc1JldXNlZCxcbiAgICAgIHJvdyxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyB1cHNlcnQod2RiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZywgY2h1bmtTaXplPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcInVwc2VydFwiLCBjaHVua1NpemUpO1xuICB9XG4gIGFzeW5jIGluc2VydE9ubHkod2RiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZywgY2h1bmtTaXplPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcImluc2VydFwiLCBjaHVua1NpemUpO1xuICB9XG5cbiAgYXN5bmMgdXBzZXJ0T3JJbnNlcnQoXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIG1vZGU6IFwidXBzZXJ0XCIgfCBcImluc2VydFwiLFxuICAgIGNodW5rU2l6ZT86IG51bWJlcixcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGlmICh0aGlzLmhhc1RhYmxlKHRhYmxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVwc2VydCDtlaAg642w7J207YSw6rCAIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0YWJsZS5yb3dzLnNvbWUoKHJvdykgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5zb21lKChbLCB2YWx1ZV0pID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mICE9PSB0YWJsZU5hbWUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX0g7ZW06rKw65CY7KeAIOyViuydgCDssLjsobDqsIAg7J6I7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIC8vIOyghOyytCDthYzsnbTruJQg7Iic7ZqM7ZWY7JesIO2YhOyerCDthYzsnbTruJQg7LC47KGw7ZWY64qUIOuqqOuToCDthYzsnbTruJQg7LaU7LacXG4gICAgY29uc3QgeyByZWZlcmVuY2VzLCByZWZUYWJsZXMgfSA9IEFycmF5LmZyb20odGhpcy50YWJsZXMpLnJlZHVjZShcbiAgICAgIChyLCBbLCB0YWJsZV0pID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gQXJyYXkuZnJvbSh0YWJsZS5yZWZlcmVuY2VzLnZhbHVlcygpKS5maW5kKChyZWYpID0+XG4gICAgICAgICAgcmVmLmluY2x1ZGVzKGAke3RhYmxlTmFtZX0uYCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgICByLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICAgIHIucmVmVGFibGVzLnB1c2godGFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICByZWZlcmVuY2VzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmVmVGFibGVzOiBbXSBhcyBUYWJsZURhdGFbXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBleHRyYWN0RmllbGRzID0gdW5pcXVlKHJlZmVyZW5jZXMpXG4gICAgICAubWFwKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5zcGxpdChcIi5cIilbMV0pXG4gICAgICAuZmlsdGVyKChmaWVsZCk6IGZpZWxkIGlzIHN0cmluZyA9PiBmaWVsZCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIOydmOyhtOyEsSDsiJzshJzsl5Ag65Sw6528IOugiOuyqOuzhCDqt7jro7ntmZQgKOyekOq4sCDssLjsobDqsIAg7JeG7Jy866m0IExldmVsIDAg7ZWY64KYKVxuICAgIGNvbnN0IHsgbGV2ZWxzLCBoYXNDaXJjdWxhciB9ID0gdGhpcy5idWlsZEluc2VydExldmVscyh0YWJsZS5yb3dzLCB0YWJsZU5hbWUpO1xuXG4gICAgaWYgKGhhc0NpcmN1bGFyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfeyXkCDsiJztmZgg7J6Q6riwIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8gdXBzZXJ0IOuqqOuTnOydvCDrlYwg7Jyg64uI7YGsIOyduOuNseyKpOqwgCDsl4bsnLzrqbQg7JeQ65+sXG4gICAgaWYgKG1vZGUgPT09IFwidXBzZXJ0XCIgJiYgdGFibGUudW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVuaXF1ZSBpbmRleOqwgCDsoJXsnZjrkJjsp4Ag7JWK7JWEIHVwc2VydOulvCDtlaAg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB1dWlkTWFwID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gICAgY29uc3QgYWxsSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8g66CI67Ko67OE66GcIOyInOywqCDsspjrpqxcbiAgICBmb3IgKGNvbnN0IGxldmVsUm93cyBvZiBsZXZlbHMpIHtcbiAgICAgIC8vIOydtOyghCDroIjrsqjsl5DshJwg7Ja77J2AIElE66GcIOyekOq4sCDssLjsobAg7ZW06rKwXG4gICAgICBjb25zdCByZXNvbHZlZFJvd3MgPSBsZXZlbFJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLnJvdyB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHV1aWRNYXAuZ2V0KHZhbHVlLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHt2YWx1ZS51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRba2V5XSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3ZhbHVlLnVzZSA/PyBcImlkXCJdO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHZhbHVlLm9mLCB1dWlkOiB2YWx1ZS51dWlkLCB1c2U6IHZhbHVlLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIO2YhOyerCDroIjrsqggdXBzZXJ0XG4gICAgICBjb25zdCBsZXZlbENodW5rcyA9IGNodW5rU2l6ZSA/IGNodW5rKHJlc29sdmVkUm93cywgY2h1bmtTaXplKSA6IFtyZXNvbHZlZFJvd3NdO1xuICAgICAgY29uc3Qgc2VsZWN0RmllbGRzID0gdW5pcXVlKFtcInV1aWRcIiwgXCJpZFwiLCAuLi5leHRyYWN0RmllbGRzXSk7XG5cbiAgICAgIGZvciAoY29uc3QgZGF0YUNodW5rIG9mIGxldmVsQ2h1bmtzKSB7XG4gICAgICAgIGlmIChkYXRhQ2h1bmsubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICBsZXQgcmVzdWx0Um93czogeyB1dWlkOiBzdHJpbmc7IGlkOiBudW1iZXI7IFtrZXk6IHN0cmluZ106IHVua25vd24gfVtdO1xuXG4gICAgICAgIGlmIChtb2RlID09PSBcImluc2VydFwiKSB7XG4gICAgICAgICAgLy8gSU5TRVJUIOuqqOuTnFxuICAgICAgICAgIGF3YWl0IHdkYi5pbnNlcnQoZGF0YUNodW5rKS5pbnRvKHRhYmxlTmFtZSk7XG5cbiAgICAgICAgICBjb25zdCB1dWlkcyA9IGRhdGFDaHVuay5tYXAoKHIpID0+IHIudXVpZCk7XG4gICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgICAgICAuc2VsZWN0KHNlbGVjdEZpZWxkcylcbiAgICAgICAgICAgIC53aGVyZUluKFwidXVpZFwiLCB1dWlkcyBhcyByZWFkb25seSBzdHJpbmdbXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVVBTRVJUIOuqqOuTnCAodW5pcXVlSW5kZXhlcyDsnbTrr7gg7LK07YGs65CoKVxuICAgICAgICAgIGNvbnN0IGNvbmZsaWN0Q29sdW1ucyA9IHRhYmxlLnVuaXF1ZUluZGV4ZXNbMF0uY29sdW1ucztcbiAgICAgICAgICBjb25zdCB1cGRhdGVDb2x1bW5zID0gT2JqZWN0LmtleXMoZGF0YUNodW5rWzBdKS5maWx0ZXIoXG4gICAgICAgICAgICAoY29sKSA9PiBjb2wgIT09IFwidXVpZFwiICYmICFjb25mbGljdENvbHVtbnMuaW5jbHVkZXMoY29sKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUkVUVVJOSU5H7Jy866GcIOqysOqzvCDrsJvquLBcbiAgICAgICAgICBjb25zdCBxdWVyeSA9IHdkYi5pbnNlcnQoZGF0YUNodW5rKS5pbnRvKHRhYmxlTmFtZSkub25Db25mbGljdChjb25mbGljdENvbHVtbnMpO1xuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1uc+qwgCDruYTslrTsnojsnLzrqbQgaWdub3JlKCksIOyVhOuLiOuptCBtZXJnZSgpXG4gICAgICAgICAgaWYgKHVwZGF0ZUNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHRSb3dzID0gYXdhaXQgcXVlcnkuaWdub3JlKCkucmV0dXJuaW5nKHNlbGVjdEZpZWxkcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCBxdWVyeS5tZXJnZSh1cGRhdGVDb2x1bW5zKS5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDslpHsqr0g66qo65OcIOqzte2GtSDsspjrpqxcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0Um93cykge1xuICAgICAgICAgIHV1aWRNYXAuc2V0KHJvdy51dWlkLCByb3cpO1xuICAgICAgICAgIGFsbElkcy5wdXNoKHJvdy5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iUIOywuOyhsOulvCDsi6TsoJwg67C466WY66GcIOuzgOqyvVxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgcmVmVGFibGVzKSB7XG4gICAgICB0YWJsZS5yb3dzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IHJvd1trZXldO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHByb3ApICYmIHByb3Aub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQocHJvcC51dWlkKTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocHJvcCk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7cHJvcC51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wLnVzZSA/PyBcImlkXCJdO1xuICAgICAgICAgICAgcm93W2tleV0gPSByZXNvbHZlZFZhbHVlO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHByb3Aub2YsIHV1aWQ6IHByb3AudXVpZCwgdXNlOiBwcm9wLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJTsnZgg642w7J207YSwIOy0iOq4sO2ZlFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuXG4gICAgTmFpdGUudChcInB1cmk6dWItdXBzZXJ0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgbW9kZSxcbiAgICAgIHJvd0NvdW50OiBhbGxJZHMubGVuZ3RoLFxuICAgICAgcmV0dXJuZWRJZHM6IGFsbElkcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhbGxJZHM7XG4gIH1cblxuICBhc3luYyB1cGRhdGVCYXRjaChcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgICAgIHdoZXJlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjaHVua1NpemU6IG9wdGlvbnM/LmNodW5rU2l6ZSA/PyA1MDAsXG4gICAgICB3aGVyZTogb3B0aW9ucz8ud2hlcmUgPz8gXCJpZFwiLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5oYXNUYWJsZSh0YWJsZU5hbWUpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg65Ox66Gd65CY7KeAIOyViuydgCDthYzsnbTruJQgJHt0YWJsZU5hbWV97JeQIHVwZGF0ZUJhdGNoIOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNvbHVtbnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMud2hlcmUpID8gb3B0aW9ucy53aGVyZSA6IFtvcHRpb25zLndoZXJlID8/IFwiaWRcIl07XG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnJvd3MubWFwKChfcm93KSA9PiB7XG4gICAgICBjb25zdCB7IHV1aWQ6IF8sIC4uLnJvdyB9ID0gX3JvdzsgLy8gdXVpZCDsoJzsmbhcbiAgICAgIHJldHVybiByb3cgYXMgUm93V2l0aElkPHN0cmluZz47XG4gICAgfSk7XG5cbiAgICBhd2FpdCBiYXRjaFVwZGF0ZSh3ZGIsIHRhYmxlTmFtZSwgd2hlcmVDb2x1bW5zLCByb3dzLCBvcHRpb25zLmNodW5rU2l6ZSk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi1iYXRjaC11cGRhdGVkXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgIHdoZXJlQ29sdW1ucyxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUJhdGNoIOyZhOujjCDtm4Qg7LKY66as65CcIOuNsOydtO2EsCDsoJzqsbBcbiAgICB0YWJsZS5yb3dzID0gW107XG4gICAgdGFibGUucmVmZXJlbmNlcy5jbGVhcigpO1xuICAgIHRhYmxlLnVuaXF1ZXNNYXAuY2xlYXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJpdmF0ZSBIZWxwZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogcm93c+ulvCDsnZjsobTshLEg7Iic7ISc7JeQIOuUsOudvCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsl4bripQg6rK97JqwIDog66qo65OgIHJvd3PqsIAgTGV2ZWwgMFxuICAgKiAtIOyekOq4sCDssLjsobAg7J6I64qUIOqyveyasCA6IOyekOq4sCDssLjsobAg6rSA6rOE66W8IOychOyDgSDsoJXroKztlZjsl6wg66CI67Ko67OE66GcIOq3uOujue2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluc2VydExldmVscyhcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiB7IGxldmVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVtdOyBoYXNDaXJjdWxhcjogYm9vbGVhbiB9IHtcbiAgICAvLyAxLiDsnpDquLAg7LC47KGw6rCAIOyXhuycvOuptCDtlZwg66CI67Ko66GcIOyymOumrFxuICAgIGNvbnN0IGhhc1NlbGZSZWYgPSByb3dzXG4gICAgICAuZmxhdE1hcCgocm93KSA9PiBPYmplY3QudmFsdWVzKHJvdykpXG4gICAgICAuc29tZSgodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpO1xuICAgIGlmICghaGFzU2VsZlJlZikgcmV0dXJuIHsgbGV2ZWxzOiBbcm93c10sIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuXG4gICAgLy8gMi4gdXVpZCDihpIgcm93IOunpO2VkSAo7KSR67O1IHV1aWQg67Cp7KeAKVxuICAgIGNvbnN0IHJvd0J5VXVpZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCB1dWlkID0gcm93LnV1aWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCF1dWlkKSB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkSW5zZXJ0TGV2ZWxzOiB1dWlk6rCAIOyXhuuKlCByb3cgLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICByb3dCeVV1aWQuc2V0KHV1aWQsIHJvdyk7XG4gICAgfVxuXG4gICAgbGV0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHJvd0J5VXVpZC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW10gPSBbXTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gMy4g66CI67Ko67OEIOu2hOulmFxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgY29uc3QgbmV4dFBlbmRpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGVuZGluZykge1xuICAgICAgICAvLyDsnbQgcm936rCAIOywuOyhsO2VmOuKlCDsnpDquLAg7LC47KGw65OkXG4gICAgICAgIGNvbnN0IHNlbGZSZWZzID0gT2JqZWN0LnZhbHVlcyhyb3cpLmZpbHRlcihcbiAgICAgICAgICAodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUsXG4gICAgICAgICkgYXMgVUJSZWZbXTtcblxuICAgICAgICAvLyDssLjsobDtlZjripQg66qo65OgIHV1aWTqsIAg7J2066+4IGluc2VydGVk7JeQIOyeiOyWtOyVvCDsnbTrsogg66CI67Ko7JeQIO2PrO2VqFxuICAgICAgICBjb25zdCBjYW5JbnNlcnQgPSBzZWxmUmVmcy5ldmVyeSgocmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFyb3dCeVV1aWQuaGFzKHJlZi51dWlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtyZWYudXVpZH0gLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbnNlcnRlZC5oYXMocmVmLnV1aWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuSW5zZXJ0KSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7Iic7ZmYIOywuOyhsCDqsJDsp4BcbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSByZXR1cm4geyBsZXZlbHM6IFtdLCBoYXNDaXJjdWxhcjogdHJ1ZSB9O1xuXG4gICAgICAvLyDroIjrsqgg7ZmV7KCVICsgaW5zZXJ0ZWQg6rCx7IugXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIGluc2VydGVkLmFkZChyb3cudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbGV2ZWxzLCBoYXNDaXJjdWxhcjogZmFsc2UgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJ1bmlxdWUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJhc3NlcnREZWZpbmVkIiwiY2h1bmsiLCJub25OdWxsYWJsZSIsImJhdGNoVXBkYXRlIiwiaXNSZWZGaWVsZCIsImZpZWxkIiwidW5kZWZpbmVkIiwib2YiLCJ1dWlkIiwiVXBzZXJ0QnVpbGRlciIsInRhYmxlcyIsIk1hcCIsImdldFRhYmxlIiwidGFibGVOYW1lIiwidGFibGUiLCJnZXQiLCJ0YWJsZVNwZWMiLCJnZXRUYWJsZVNwZWMiLCJ0YWJsZURhdGEiLCJyZWZlcmVuY2VzIiwiU2V0Iiwicm93cyIsInVuaXF1ZUluZGV4ZXMiLCJ1bmlxdWVzTWFwIiwic2V0IiwiaGFzVGFibGUiLCJoYXMiLCJyZWdpc3RlciIsInJvdyIsInVuaXF1ZUtleXMiLCJtYXAiLCJ1bnFJbmRleCIsInVuaXF1ZUtleUFycmF5IiwiY29sdW1ucyIsInVucUNvbCIsInZhbCIsImxlbmd0aCIsImpvaW4iLCJmaWx0ZXIiLCJpc1JldXNlZCIsInVuaXF1ZUtleSIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsInJvd0tleSIsInJvd1ZhbHVlIiwidXNlIiwiYWRkIiwiRGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwdXNoIiwicmVzdWx0IiwidCIsImlzVXVpZFJldXNlZCIsInVwc2VydCIsIndkYiIsImNodW5rU2l6ZSIsInVwc2VydE9ySW5zZXJ0IiwiaW5zZXJ0T25seSIsIm1vZGUiLCJFcnJvciIsInNvbWUiLCJ2YWx1ZSIsInJlZlRhYmxlcyIsIkFycmF5IiwiZnJvbSIsInJlZHVjZSIsInIiLCJyZWZlcmVuY2UiLCJ2YWx1ZXMiLCJmaW5kIiwicmVmIiwiaW5jbHVkZXMiLCJleHRyYWN0RmllbGRzIiwic3BsaXQiLCJsZXZlbHMiLCJoYXNDaXJjdWxhciIsImJ1aWxkSW5zZXJ0TGV2ZWxzIiwidXVpZE1hcCIsImFsbElkcyIsImxldmVsUm93cyIsInJlc29sdmVkUm93cyIsInJlc29sdmVkIiwia2V5IiwicGFyZW50IiwidG8iLCJsZXZlbENodW5rcyIsInNlbGVjdEZpZWxkcyIsImRhdGFDaHVuayIsInJlc3VsdFJvd3MiLCJpbnNlcnQiLCJpbnRvIiwidXVpZHMiLCJzZWxlY3QiLCJ3aGVyZUluIiwiY29uZmxpY3RDb2x1bW5zIiwidXBkYXRlQ29sdW1ucyIsImtleXMiLCJjb2wiLCJxdWVyeSIsIm9uQ29uZmxpY3QiLCJpZ25vcmUiLCJyZXR1cm5pbmciLCJtZXJnZSIsImlkIiwicHJvcCIsImNvbnNvbGUiLCJlcnJvciIsInJlc29sdmVkVmFsdWUiLCJjbGVhciIsInJvd0NvdW50IiwicmV0dXJuZWRJZHMiLCJ1cGRhdGVCYXRjaCIsIm9wdGlvbnMiLCJ3aGVyZSIsIndoZXJlQ29sdW1ucyIsImlzQXJyYXkiLCJfcm93IiwiXyIsImhhc1NlbGZSZWYiLCJmbGF0TWFwIiwicm93QnlVdWlkIiwicGVuZGluZyIsImluc2VydGVkIiwiY3VycmVudExldmVsIiwibmV4dFBlbmRpbmciLCJzZWxmUmVmcyIsImNhbkluc2VydCIsImV2ZXJ5Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLFFBQVEsU0FBUztBQUVwQyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxhQUFhLFFBQVEsOEJBQTJCO0FBQ3pELFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FBU0MsYUFBYSxFQUFFQyxLQUFLLEVBQUVDLFdBQVcsUUFBUSxvQkFBaUI7QUFD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
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS91cHNlcnQtYnVpbGRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIGNodW5rLCBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgYmF0Y2hVcGRhdGUsIHR5cGUgUm93V2l0aElkIH0gZnJvbSBcIi4vX2JhdGNoX3VwZGF0ZVwiO1xuXG50eXBlIFRhYmxlRGF0YSA9IHtcbiAgcmVmZXJlbmNlczogU2V0PHN0cmluZz47XG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIHVuaXF1ZUluZGV4ZXM6IHsgbmFtZT86IHN0cmluZzsgY29sdW1uczogc3RyaW5nW10gfVtdO1xuICB1bmlxdWVzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufTtcbmV4cG9ydCB0eXBlIFVCUmVmID0ge1xuICB1dWlkOiBzdHJpbmc7XG4gIG9mOiBzdHJpbmc7XG4gIHVzZT86IHN0cmluZztcbn07XG5leHBvcnQgZnVuY3Rpb24gaXNSZWZGaWVsZChmaWVsZDogdW5rbm93bik6IGZpZWxkIGlzIFVCUmVmIHtcbiAgcmV0dXJuIChcbiAgICBmaWVsZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgZmllbGQgIT09IG51bGwgJiZcbiAgICAoZmllbGQgYXMgVUJSZWYpPy5vZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8udXVpZCAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBVcHNlcnRCdWlsZGVyIHtcbiAgdGFibGVzOiBNYXA8c3RyaW5nLCBUYWJsZURhdGE+O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRhYmxlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIGdldFRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVEYXRhIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlU3BlYyA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgY29uc3QgdGFibGVEYXRhID0ge1xuICAgICAgcmVmZXJlbmNlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICByb3dzOiBbXSxcbiAgICAgIHVuaXF1ZUluZGV4ZXM6IHRhYmxlU3BlYz8udW5pcXVlSW5kZXhlcyA/PyBbXSxcbiAgICAgIHVuaXF1ZXNNYXA6IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCksXG4gICAgfTtcbiAgICB0aGlzLnRhYmxlcy5zZXQodGFibGVOYW1lLCB0YWJsZURhdGEpO1xuICAgIHJldHVybiB0YWJsZURhdGE7XG4gIH1cblxuICBoYXNUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlcy5oYXModGFibGVOYW1lKTtcbiAgfVxuXG4gIHJlZ2lzdGVyPFQgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHJvdzoge1xuICAgICAgW2tleSBpbiBUXT86IFVCUmVmIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludCB8IG51bGwgfCBvYmplY3QgfCB1bmtub3duO1xuICAgIH0sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZ2V0VGFibGUodGFibGVOYW1lKTtcblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJTsnZggdW5pcXVlIOyduOuNseyKpOulvCDsiJztmoztlZjrqbAg7YKkIOyDneyEsVxuICAgIGNvbnN0IHVuaXF1ZUtleXMgPSB0YWJsZS51bmlxdWVJbmRleGVzXG4gICAgICAubWFwKCh1bnFJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB1bmlxdWVLZXlBcnJheSA9IHVucUluZGV4LmNvbHVtbnMubWFwKCh1bnFDb2wpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSByb3dbdW5xQ29sIGFzIGtleW9mIHR5cGVvZiByb3ddO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwudXVpZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1t1bnFDb2wgYXMga2V5b2YgdHlwZW9mIHJvd10gPz8gcmFuZG9tVVVJRCgpOyAvLyBudWxsYWJsZeyduCDqsr3smrAgdXVpZOuhnCDrnpzrjaTqsJIg7IK97J6FXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDqsJLsnbQg66qo65GQIG51bGzsnbgg6rK97JqwIO2CpCDsg53shLEg7Yyo7IqkXG4gICAgICAgIGlmICh1bmlxdWVLZXlBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pcXVlS2V5QXJyYXkuam9pbihcIi0tLWRlbGltaXRlci0tXCIpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgLy8gdXVpZCDsg53shLEg66Gc7KeBXG4gICAgY29uc3QgeyB1dWlkLCBpc1JldXNlZCB9ID0gKCgpID0+IHtcbiAgICAgIC8vIO2CpOulvCDsiJztmoztlZjsl6wg7J2066+4IOyhtOyerO2VmOuKlCDtgqTqsIAg7J6I64qU7KeAIO2ZleyduFxuICAgICAgaWYgKHVuaXF1ZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgICAgaWYgKHRhYmxlLnVuaXF1ZXNNYXAuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHV1aWQ6IGFzc2VydERlZmluZWQodGFibGUudW5pcXVlc01hcC5nZXQodW5pcXVlS2V5KSwgXCJVbmlxdWUga2V5IG5vdCBmb3VuZFwiKSxcbiAgICAgICAgICAgICAgaXNSZXVzZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDssL7snYQg7IiYIOyXhuuKlCDqsr3smrAg7IOd7ISxXG4gICAgICByZXR1cm4geyB1dWlkOiByYW5kb21VVUlEKCksIGlzUmV1c2VkOiBmYWxzZSB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyDrqqjrk6Ag7Jyg64uI7YGs7YKk7JeQIOuMgO2VtCDsnKDri4jtgazrp7Xsl5AgdXVpZCDsoIDsnqVcbiAgICBpZiAodW5pcXVlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgIHRhYmxlLnVuaXF1ZXNNYXAuc2V0KHVuaXF1ZUtleSwgdXVpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7J20IO2FjOydtOu4lOyXkCDsgqzsmqnrkJwgUmVmRmllbGTrpbwg7Iic7ZqM7ZWY7JesLCDtmITsnqwg7YWM7J2067iUIOygleuztOyXkCDslrTrlqQg7ZWE65Oc66W8IOywuOyhsO2VmOuKlOyngCDstpTqsIBcbiAgICAvLyDsnbQg7KCV67O066W8IOuCmOykkeyXkCDsuZjtmZjtlaAg65WMIOyCrOyaqVxuICAgIHJvdyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJvdykubWFwKChbcm93S2V5LCByb3dWYWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGlzUmVmRmllbGQocm93VmFsdWUpKSB7XG4gICAgICAgICAgcm93VmFsdWUudXNlID8/PSBcImlkXCI7XG4gICAgICAgICAgdGFibGUucmVmZXJlbmNlcy5hZGQoYCR7cm93VmFsdWUub2Z9LiR7cm93VmFsdWUudXNlfWApO1xuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvd1ZhbHVlID09PSBcIm9iamVjdFwiICYmICEocm93VmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgIC8vIG9iamVjdOyduCDqsr3smrAgSlNPTuycvOuhnCDrs4DtmZhcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWUgPT09IG51bGwgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkocm93VmFsdWUpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApIGFzIHsgW2tleSBpbiBUXT86IHVua25vd24gfTtcblxuICAgIHRhYmxlLnJvd3MucHVzaCh7XG4gICAgICB1dWlkLFxuICAgICAgLi4ucm93LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0OiBVQlJlZiA9IHtcbiAgICAgIG9mOiB0YWJsZU5hbWUsXG4gICAgICB1dWlkOiAocm93IGFzIHsgdXVpZD86IHN0cmluZyB9KS51dWlkID8/IHV1aWQsXG4gICAgfTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZ2lzdGVyXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHV1aWQ6IHJlc3VsdC51dWlkLFxuICAgICAgaXNVdWlkUmV1c2VkOiBpc1JldXNlZCxcbiAgICAgIHJvdyxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyB1cHNlcnQod2RiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZywgY2h1bmtTaXplPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcInVwc2VydFwiLCBjaHVua1NpemUpO1xuICB9XG4gIGFzeW5jIGluc2VydE9ubHkod2RiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZywgY2h1bmtTaXplPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcImluc2VydFwiLCBjaHVua1NpemUpO1xuICB9XG5cbiAgYXN5bmMgdXBzZXJ0T3JJbnNlcnQoXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIG1vZGU6IFwidXBzZXJ0XCIgfCBcImluc2VydFwiLFxuICAgIGNodW5rU2l6ZT86IG51bWJlcixcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGlmICh0aGlzLmhhc1RhYmxlKHRhYmxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVwc2VydCDtlaAg642w7J207YSw6rCAIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0YWJsZS5yb3dzLnNvbWUoKHJvdykgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5zb21lKChbLCB2YWx1ZV0pID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mICE9PSB0YWJsZU5hbWUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX0g7ZW06rKw65CY7KeAIOyViuydgCDssLjsobDqsIAg7J6I7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIC8vIOyghOyytCDthYzsnbTruJQg7Iic7ZqM7ZWY7JesIO2YhOyerCDthYzsnbTruJQg7LC47KGw7ZWY64qUIOuqqOuToCDthYzsnbTruJQg7LaU7LacXG4gICAgY29uc3QgeyByZWZlcmVuY2VzLCByZWZUYWJsZXMgfSA9IEFycmF5LmZyb20odGhpcy50YWJsZXMpLnJlZHVjZShcbiAgICAgIChyLCBbLCB0YWJsZV0pID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gQXJyYXkuZnJvbSh0YWJsZS5yZWZlcmVuY2VzLnZhbHVlcygpKS5maW5kKChyZWYpID0+XG4gICAgICAgICAgcmVmLmluY2x1ZGVzKGAke3RhYmxlTmFtZX0uYCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgICByLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICAgIHIucmVmVGFibGVzLnB1c2godGFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICByZWZlcmVuY2VzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmVmVGFibGVzOiBbXSBhcyBUYWJsZURhdGFbXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBleHRyYWN0RmllbGRzID0gdW5pcXVlKHJlZmVyZW5jZXMpXG4gICAgICAubWFwKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5zcGxpdChcIi5cIilbMV0pXG4gICAgICAuZmlsdGVyKChmaWVsZCk6IGZpZWxkIGlzIHN0cmluZyA9PiBmaWVsZCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIOydmOyhtOyEsSDsiJzshJzsl5Ag65Sw6528IOugiOuyqOuzhCDqt7jro7ntmZQgKOyekOq4sCDssLjsobDqsIAg7JeG7Jy866m0IExldmVsIDAg7ZWY64KYKVxuICAgIGNvbnN0IHsgbGV2ZWxzLCBoYXNDaXJjdWxhciB9ID0gdGhpcy5idWlsZEluc2VydExldmVscyh0YWJsZS5yb3dzLCB0YWJsZU5hbWUpO1xuXG4gICAgaWYgKGhhc0NpcmN1bGFyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfeyXkCDsiJztmZgg7J6Q6riwIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8gdXBzZXJ0IOuqqOuTnOydvCDrlYwg7Jyg64uI7YGsIOyduOuNseyKpOqwgCDsl4bsnLzrqbQg7JeQ65+sXG4gICAgaWYgKG1vZGUgPT09IFwidXBzZXJ0XCIgJiYgdGFibGUudW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVuaXF1ZSBpbmRleOqwgCDsoJXsnZjrkJjsp4Ag7JWK7JWEIHVwc2VydOulvCDtlaAg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB1dWlkTWFwID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gICAgY29uc3QgYWxsSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8g66CI67Ko67OE66GcIOyInOywqCDsspjrpqxcbiAgICBmb3IgKGNvbnN0IGxldmVsUm93cyBvZiBsZXZlbHMpIHtcbiAgICAgIC8vIOydtOyghCDroIjrsqjsl5DshJwg7Ja77J2AIElE66GcIOyekOq4sCDssLjsobAg7ZW06rKwXG4gICAgICBjb25zdCByZXNvbHZlZFJvd3MgPSBsZXZlbFJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLnJvdyB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHV1aWRNYXAuZ2V0KHZhbHVlLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHt2YWx1ZS51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRba2V5XSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3ZhbHVlLnVzZSA/PyBcImlkXCJdO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHZhbHVlLm9mLCB1dWlkOiB2YWx1ZS51dWlkLCB1c2U6IHZhbHVlLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIO2YhOyerCDroIjrsqggdXBzZXJ0XG4gICAgICBjb25zdCBsZXZlbENodW5rcyA9IGNodW5rU2l6ZSA/IGNodW5rKHJlc29sdmVkUm93cywgY2h1bmtTaXplKSA6IFtyZXNvbHZlZFJvd3NdO1xuICAgICAgY29uc3Qgc2VsZWN0RmllbGRzID0gdW5pcXVlKFtcInV1aWRcIiwgXCJpZFwiLCAuLi5leHRyYWN0RmllbGRzXSk7XG5cbiAgICAgIGZvciAoY29uc3QgZGF0YUNodW5rIG9mIGxldmVsQ2h1bmtzKSB7XG4gICAgICAgIGlmIChkYXRhQ2h1bmsubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICBsZXQgcmVzdWx0Um93czogeyB1dWlkOiBzdHJpbmc7IGlkOiBudW1iZXI7IFtrZXk6IHN0cmluZ106IHVua25vd24gfVtdO1xuXG4gICAgICAgIGlmIChtb2RlID09PSBcImluc2VydFwiKSB7XG4gICAgICAgICAgLy8gSU5TRVJUIOuqqOuTnFxuICAgICAgICAgIGF3YWl0IHdkYi5pbnNlcnQoZGF0YUNodW5rKS5pbnRvKHRhYmxlTmFtZSk7XG5cbiAgICAgICAgICBjb25zdCB1dWlkcyA9IGRhdGFDaHVuay5tYXAoKHIpID0+IHIudXVpZCk7XG4gICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgICAgICAuc2VsZWN0KHNlbGVjdEZpZWxkcylcbiAgICAgICAgICAgIC53aGVyZUluKFwidXVpZFwiLCB1dWlkcyBhcyByZWFkb25seSBzdHJpbmdbXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVVBTRVJUIOuqqOuTnDogb25Db25mbGljdOuhnCDspJHrs7Ug7LKY66asXG4gICAgICAgICAgY29uc3QgY29uZmxpY3RDb2x1bW5zID0gdGFibGUudW5pcXVlSW5kZXhlc1swXS5jb2x1bW5zO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSBPYmplY3Qua2V5cyhkYXRhQ2h1bmtbMF0pLmZpbHRlcihcbiAgICAgICAgICAgIChjb2wpID0+IGNvbCAhPT0gXCJ1dWlkXCIgJiYgIWNvbmZsaWN0Q29sdW1ucy5pbmNsdWRlcyhjb2wpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBxdWVyeSA9IHdkYi5pbnNlcnQoZGF0YUNodW5rKS5pbnRvKHRhYmxlTmFtZSkub25Db25mbGljdChjb25mbGljdENvbHVtbnMpO1xuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1ucyDsnKDrrLTsl5Ag65Sw6528IGlnbm9yZS9tZXJnZSDshKDtg53tlZjqs6AgUkVUVVJOSU5H7Jy866GcIOqysOqzvCDrsJvquLBcbiAgICAgICAgICBpZiAodXBkYXRlQ29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCBxdWVyeS5pZ25vcmUoKS5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHF1ZXJ5Lm1lcmdlKHVwZGF0ZUNvbHVtbnMpLnJldHVybmluZyhzZWxlY3RGaWVsZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOyWkeyqvSDrqqjrk5wg6rO17Ya1IOyymOumrFxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXN1bHRSb3dzKSB7XG4gICAgICAgICAgdXVpZE1hcC5zZXQocm93LnV1aWQsIHJvdyk7XG4gICAgICAgICAgYWxsSWRzLnB1c2gocm93LmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJQg7LC47KGw66W8IOyLpOygnCDrsLjrpZjroZwg67OA6rK9XG4gICAgZm9yIChjb25zdCB0YWJsZSBvZiByZWZUYWJsZXMpIHtcbiAgICAgIHRhYmxlLnJvd3MgPSB0YWJsZS5yb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJvdykpIHtcbiAgICAgICAgICBjb25zdCBwcm9wID0gcm93W2tleV07XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQocHJvcCkgJiYgcHJvcC5vZiA9PT0gdGFibGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB1dWlkTWFwLmdldChwcm9wLnV1aWQpO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihwcm9wKTtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtwcm9wLnV1aWR9IC0tIGluICR7dGFibGVOYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRWYWx1ZSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3Byb3AudXNlID8/IFwiaWRcIl07XG4gICAgICAgICAgICByb3dba2V5XSA9IHJlc29sdmVkVmFsdWU7XG5cbiAgICAgICAgICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZi1yZXNvbHZlZFwiLCB7XG4gICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgZmllbGQ6IGtleSxcbiAgICAgICAgICAgICAgZnJvbTogeyBvZjogcHJvcC5vZiwgdXVpZDogcHJvcC51dWlkLCB1c2U6IHByb3AudXNlID8/IFwiaWRcIiB9LFxuICAgICAgICAgICAgICB0bzogcmVzb2x2ZWRWYWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8g7ZW064u5IO2FjOydtOu4lOydmCDrjbDsnbTthLAg7LSI6riw7ZmUXG4gICAgdGFibGUucm93cyA9IFtdO1xuICAgIHRhYmxlLnJlZmVyZW5jZXMuY2xlYXIoKTtcbiAgICB0YWJsZS51bmlxdWVzTWFwLmNsZWFyKCk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi11cHNlcnRlZFwiLCB7XG4gICAgICB0YWJsZU5hbWUsXG4gICAgICBtb2RlLFxuICAgICAgcm93Q291bnQ6IGFsbElkcy5sZW5ndGgsXG4gICAgICByZXR1cm5lZElkczogYWxsSWRzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFsbElkcztcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUJhdGNoKFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgY2h1bmtTaXplPzogbnVtYmVyO1xuICAgICAgd2hlcmU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGNodW5rU2l6ZTogb3B0aW9ucz8uY2h1bmtTaXplID8/IDUwMCxcbiAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZSA/PyBcImlkXCIsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmhhc1RhYmxlKHRhYmxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZXMuZ2V0KHRhYmxlTmFtZSk7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDrk7HroZ3rkJjsp4Ag7JWK7J2AIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBkYXRlQmF0Y2gg7JqU7LKtYCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdoZXJlQ29sdW1ucyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy53aGVyZSkgPyBvcHRpb25zLndoZXJlIDogW29wdGlvbnMud2hlcmUgPz8gXCJpZFwiXTtcbiAgICBjb25zdCByb3dzID0gdGFibGUucm93cy5tYXAoKF9yb3cpID0+IHtcbiAgICAgIGNvbnN0IHsgdXVpZDogXywgLi4ucm93IH0gPSBfcm93OyAvLyB1dWlkIOygnOyZuFxuICAgICAgcmV0dXJuIHJvdyBhcyBSb3dXaXRoSWQ8c3RyaW5nPjtcbiAgICB9KTtcblxuICAgIGF3YWl0IGJhdGNoVXBkYXRlKHdkYiwgdGFibGVOYW1lLCB3aGVyZUNvbHVtbnMsIHJvd3MsIG9wdGlvbnMuY2h1bmtTaXplKTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLWJhdGNoLXVwZGF0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgcm93Q291bnQ6IHJvd3MubGVuZ3RoLFxuICAgICAgd2hlcmVDb2x1bW5zLFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlQmF0Y2gg7JmE66OMIO2bhCDsspjrpqzrkJwg642w7J207YSwIOygnOqxsFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcml2YXRlIEhlbHBlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiByb3dz66W8IOydmOyhtOyEsSDsiJzshJzsl5Ag65Sw6528IOugiOuyqOuzhOuhnCDqt7jro7ntmZRcbiAgICogLSDsnpDquLAg7LC47KGwIOyXhuuKlCDqsr3smrAgOiDrqqjrk6Agcm93c+qwgCBMZXZlbCAwXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsnojripQg6rK97JqwIDog7J6Q6riwIOywuOyhsCDqtIDqs4Trpbwg7JyE7IOBIOygleugrO2VmOyXrCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkSW5zZXJ0TGV2ZWxzKFxuICAgIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICk6IHsgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW107IGhhc0NpcmN1bGFyOiBib29sZWFuIH0ge1xuICAgIC8vIDEuIOyekOq4sCDssLjsobDqsIAg7JeG7Jy866m0IO2VnCDroIjrsqjroZwg7LKY66asXG4gICAgY29uc3QgaGFzU2VsZlJlZiA9IHJvd3NcbiAgICAgIC5mbGF0TWFwKChyb3cpID0+IE9iamVjdC52YWx1ZXMocm93KSlcbiAgICAgIC5zb21lKCh2YWx1ZSkgPT4gaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgPT09IHRhYmxlTmFtZSk7XG4gICAgaWYgKCFoYXNTZWxmUmVmKSByZXR1cm4geyBsZXZlbHM6IFtyb3dzXSwgaGFzQ2lyY3VsYXI6IGZhbHNlIH07XG5cbiAgICAvLyAyLiB1dWlkIOKGkiByb3cg66ek7ZWRICjspJHrs7UgdXVpZCDrsKnsp4ApXG4gICAgY29uc3Qgcm93QnlVdWlkID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGNvbnN0IHV1aWQgPSByb3cudXVpZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXV1aWQpIHRocm93IG5ldyBFcnJvcihgYnVpbGRJbnNlcnRMZXZlbHM6IHV1aWTqsIAg7JeG64qUIHJvdyAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgIHJvd0J5VXVpZC5zZXQodXVpZCwgcm93KTtcbiAgICB9XG5cbiAgICBsZXQgcGVuZGluZyA9IEFycmF5LmZyb20ocm93QnlVdWlkLnZhbHVlcygpKTtcbiAgICBjb25zdCBsZXZlbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W11bXSA9IFtdO1xuICAgIGNvbnN0IGluc2VydGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAvLyAzLiDroIjrsqjrs4Qg67aE66WYXG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudExldmVsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG4gICAgICBjb25zdCBuZXh0UGVuZGluZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBwZW5kaW5nKSB7XG4gICAgICAgIC8vIOydtCByb3fqsIAg7LC47KGw7ZWY64qUIOyekOq4sCDssLjsobDrk6RcbiAgICAgICAgY29uc3Qgc2VsZlJlZnMgPSBPYmplY3QudmFsdWVzKHJvdykuZmlsdGVyKFxuICAgICAgICAgICh2YWx1ZSkgPT4gaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgPT09IHRhYmxlTmFtZSxcbiAgICAgICAgKSBhcyBVQlJlZltdO1xuXG4gICAgICAgIC8vIOywuOyhsO2VmOuKlCDrqqjrk6AgdXVpZOqwgCDsnbTrr7ggaW5zZXJ0ZWTsl5Ag7J6I7Ja07JW8IOydtOuyiCDroIjrsqjsl5Ag7Y+s7ZWoXG4gICAgICAgIGNvbnN0IGNhbkluc2VydCA9IHNlbGZSZWZzLmV2ZXJ5KChyZWYpID0+IHtcbiAgICAgICAgICBpZiAoIXJvd0J5VXVpZC5oYXMocmVmLnV1aWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgdXVpZCAke3JlZi51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGluc2VydGVkLmhhcyhyZWYudXVpZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjYW5JbnNlcnQpIHtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwucHVzaChyb3cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHRQZW5kaW5nLnB1c2gocm93KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDsiJztmZgg7LC47KGwIOqwkOyngFxuICAgICAgaWYgKGN1cnJlbnRMZXZlbC5sZW5ndGggPT09IDApIHJldHVybiB7IGxldmVsczogW10sIGhhc0NpcmN1bGFyOiB0cnVlIH07XG5cbiAgICAgIC8vIOugiOuyqCDtmZXsoJUgKyBpbnNlcnRlZCDqsLHsi6BcbiAgICAgIGxldmVscy5wdXNoKGN1cnJlbnRMZXZlbCk7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBjdXJyZW50TGV2ZWwpIHtcbiAgICAgICAgaW5zZXJ0ZWQuYWRkKHJvdy51dWlkIGFzIHN0cmluZyk7XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmcgPSBuZXh0UGVuZGluZztcbiAgICB9XG5cbiAgICByZXR1cm4geyBsZXZlbHMsIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsicmFuZG9tVVVJRCIsInVuaXF1ZSIsIkVudGl0eU1hbmFnZXIiLCJOYWl0ZSIsImFzc2VydERlZmluZWQiLCJjaHVuayIsIm5vbk51bGxhYmxlIiwiYmF0Y2hVcGRhdGUiLCJpc1JlZkZpZWxkIiwiZmllbGQiLCJ1bmRlZmluZWQiLCJvZiIsInV1aWQiLCJVcHNlcnRCdWlsZGVyIiwidGFibGVzIiwiTWFwIiwiZ2V0VGFibGUiLCJ0YWJsZU5hbWUiLCJ0YWJsZSIsImdldCIsInRhYmxlU3BlYyIsImdldFRhYmxlU3BlYyIsInRhYmxlRGF0YSIsInJlZmVyZW5jZXMiLCJTZXQiLCJyb3dzIiwidW5pcXVlSW5kZXhlcyIsInVuaXF1ZXNNYXAiLCJzZXQiLCJoYXNUYWJsZSIsImhhcyIsInJlZ2lzdGVyIiwicm93IiwidW5pcXVlS2V5cyIsIm1hcCIsInVucUluZGV4IiwidW5pcXVlS2V5QXJyYXkiLCJjb2x1bW5zIiwidW5xQ29sIiwidmFsIiwibGVuZ3RoIiwiam9pbiIsImZpbHRlciIsImlzUmV1c2VkIiwidW5pcXVlS2V5IiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwicm93S2V5Iiwicm93VmFsdWUiLCJ1c2UiLCJhZGQiLCJEYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsInB1c2giLCJyZXN1bHQiLCJ0IiwiaXNVdWlkUmV1c2VkIiwidXBzZXJ0Iiwid2RiIiwiY2h1bmtTaXplIiwidXBzZXJ0T3JJbnNlcnQiLCJpbnNlcnRPbmx5IiwibW9kZSIsIkVycm9yIiwic29tZSIsInZhbHVlIiwicmVmVGFibGVzIiwiQXJyYXkiLCJmcm9tIiwicmVkdWNlIiwiciIsInJlZmVyZW5jZSIsInZhbHVlcyIsImZpbmQiLCJyZWYiLCJpbmNsdWRlcyIsImV4dHJhY3RGaWVsZHMiLCJzcGxpdCIsImxldmVscyIsImhhc0NpcmN1bGFyIiwiYnVpbGRJbnNlcnRMZXZlbHMiLCJ1dWlkTWFwIiwiYWxsSWRzIiwibGV2ZWxSb3dzIiwicmVzb2x2ZWRSb3dzIiwicmVzb2x2ZWQiLCJrZXkiLCJwYXJlbnQiLCJ0byIsImxldmVsQ2h1bmtzIiwic2VsZWN0RmllbGRzIiwiZGF0YUNodW5rIiwicmVzdWx0Um93cyIsImluc2VydCIsImludG8iLCJ1dWlkcyIsInNlbGVjdCIsIndoZXJlSW4iLCJjb25mbGljdENvbHVtbnMiLCJ1cGRhdGVDb2x1bW5zIiwia2V5cyIsImNvbCIsInF1ZXJ5Iiwib25Db25mbGljdCIsImlnbm9yZSIsInJldHVybmluZyIsIm1lcmdlIiwiaWQiLCJwcm9wIiwiY29uc29sZSIsImVycm9yIiwicmVzb2x2ZWRWYWx1ZSIsImNsZWFyIiwicm93Q291bnQiLCJyZXR1cm5lZElkcyIsInVwZGF0ZUJhdGNoIiwib3B0aW9ucyIsIndoZXJlIiwid2hlcmVDb2x1bW5zIiwiaXNBcnJheSIsIl9yb3ciLCJfIiwiaGFzU2VsZlJlZiIsImZsYXRNYXAiLCJyb3dCeVV1aWQiLCJwZW5kaW5nIiwiaW5zZXJ0ZWQiLCJjdXJyZW50TGV2ZWwiLCJuZXh0UGVuZGluZyIsInNlbGZSZWZzIiwiY2FuSW5zZXJ0IiwiZXZlcnkiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxTQUFTO0FBRXBDLFNBQVNDLE1BQU0sUUFBUSxVQUFVO0FBQ2pDLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQUN2QyxTQUFTQyxhQUFhLEVBQUVDLEtBQUssRUFBRUMsV0FBVyxRQUFRLG9CQUFpQjtBQUNuRSxTQUFTQyxXQUFXLFFBQXdCLHFC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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EAwBnB,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AAYxB;;;GAGG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAU7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAkE3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CAyErF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjG;
|
|
1
|
+
{"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EAwBnB,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AAYxB;;;GAGG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAU7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAkE3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CAyErF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CA+FxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CA+GtD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,CAAC,UAAU,EACrB,OAAO,GAAE,MAAe,GACvB,aAAa,CAoDf"}
|
|
@@ -204,7 +204,6 @@ import { createImportUrl } from "../utils/esm-utils.js";
|
|
|
204
204
|
throw Error;
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
|
-
// TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
|
|
208
207
|
export function zodTypeToTsTypeDef(zt) {
|
|
209
208
|
switch(zt.def.type){
|
|
210
209
|
case "string":
|
|
@@ -263,11 +262,35 @@ export function zodTypeToTsTypeDef(zt) {
|
|
|
263
262
|
}
|
|
264
263
|
case "optional":
|
|
265
264
|
return `${zodTypeToTsTypeDef(zt.def.innerType)} | undefined`;
|
|
265
|
+
case "template_literal":
|
|
266
|
+
{
|
|
267
|
+
const def = zt.def;
|
|
268
|
+
// 빈 template literal은 string으로 폴백
|
|
269
|
+
if (!def.parts || def.parts.length === 0) {
|
|
270
|
+
return "string";
|
|
271
|
+
}
|
|
272
|
+
// 각 part를 TypeScript 타입 문자열로 변환
|
|
273
|
+
const parts = def.parts.map((part)=>{
|
|
274
|
+
// 리터럴 값 (string, number, boolean, null, undefined)
|
|
275
|
+
if (typeof part === "string") {
|
|
276
|
+
return `${part}`;
|
|
277
|
+
}
|
|
278
|
+
// ZodType - 재귀적으로 변환
|
|
279
|
+
if (part && typeof part === "object" && part._zod) {
|
|
280
|
+
const innerType = zodTypeToTsTypeDef(part);
|
|
281
|
+
return `\${${innerType}}`;
|
|
282
|
+
}
|
|
283
|
+
// 폴백
|
|
284
|
+
return `\${string}`;
|
|
285
|
+
});
|
|
286
|
+
return `\`${parts.join("")}\``;
|
|
287
|
+
}
|
|
288
|
+
case "file":
|
|
289
|
+
return "File";
|
|
266
290
|
default:
|
|
267
291
|
throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|
|
268
292
|
}
|
|
269
293
|
}
|
|
270
|
-
// TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
|
|
271
294
|
/**
|
|
272
295
|
* Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환합니다.
|
|
273
296
|
*/ export function zodTypeToZodCode(zt) {
|
|
@@ -343,6 +366,28 @@ export function zodTypeToTsTypeDef(zt) {
|
|
|
343
366
|
return `${zodTypeToZodCode(zt.def.innerType)}.optional()`;
|
|
344
367
|
case "file":
|
|
345
368
|
return `z.file()`;
|
|
369
|
+
case "template_literal":
|
|
370
|
+
{
|
|
371
|
+
const def = zt.def;
|
|
372
|
+
// 빈 template literal
|
|
373
|
+
if (!def.parts || def.parts.length === 0) {
|
|
374
|
+
return "z.templateLiteral([])";
|
|
375
|
+
}
|
|
376
|
+
// 각 part를 Zod 코드 문자열로 변환
|
|
377
|
+
const parts = def.parts.map((part)=>{
|
|
378
|
+
// 문자열 리터럴
|
|
379
|
+
if (typeof part === "string") {
|
|
380
|
+
return `"${part}"`;
|
|
381
|
+
}
|
|
382
|
+
// ZodType - 재귀적으로 변환
|
|
383
|
+
if (part && typeof part === "object" && part._zod) {
|
|
384
|
+
return zodTypeToZodCode(part);
|
|
385
|
+
}
|
|
386
|
+
// 폴백
|
|
387
|
+
return "z.string()";
|
|
388
|
+
});
|
|
389
|
+
return `z.templateLiteral([${parts.join(", ")}])`;
|
|
390
|
+
}
|
|
346
391
|
case "intersection":
|
|
347
392
|
{
|
|
348
393
|
const zIntersectionDef = zt.def;
|
|
@@ -446,4 +491,4 @@ export function zodTypeToTsTypeDef(zt) {
|
|
|
446
491
|
}
|
|
447
492
|
}
|
|
448
493
|
|
|
449
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogem9kLWNvbnZlcnRlciDqtazshLFcbiAqIDEuIOycoO2LuOumrO2LsFxuICogIC0gZ2V0Wm9kVHlwZUJ5SWRcbiAqXG4gKiAyLiBab2Qg7YOA7J6FIOuzgO2ZmCAoRW50aXR5UHJvcCAtPiBab2RUeXBlKVxuICogIC0gcHJvcFRvWm9kVHlwZVxuICpcbiAqIDMuIEVudGl0eVByb3AvTm9kZSAtPiBab2Qg7L2U65OcIOusuOyekOyXtFxuICogIC0gcHJvcFRvWm9kVHlwZURlZlxuICogIC0gcHJvcE5vZGVUb1pvZFR5cGVEZWZcbiAqXG4gKiA0LiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYIChab2RUeXBlIC0+IFpvZENvZGUpXG4gKiAgLSB6b2RUeXBlVG9ab2RDb2RlXG4gKlxuICogNS4gWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZggKFpvZFR5cGUgLT4gUmVuZGVyaW5nTm9kZSlcbiAqICAtIHpvZFR5cGVUb1JlbmRlcmluZ05vZGVcbiAqICAtIHJlc29sdmVSZW5kZXJUeXBlXG4gKi9cblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyAkWm9kTG9vc2VTaGFwZSB9IGZyb20gXCJ6b2QvdjQvY29yZVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0JpZ0ludGVnZXJBcnJheVByb3AsXG4gIGlzQmlnSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzQm9vbGVhbkFycmF5UHJvcCxcbiAgaXNCb29sZWFuU2luZ2xlUHJvcCxcbiAgaXNEYXRlQXJyYXlQcm9wLFxuICBpc0RhdGVTaW5nbGVQcm9wLFxuICBpc0VudW1BcnJheVByb3AsXG4gIGlzRW51bVNpbmdsZVByb3AsXG4gIGlzSW50ZWdlckFycmF5UHJvcCxcbiAgaXNJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNKc29uUHJvcCxcbiAgaXNOdW1iZXJBcnJheVByb3AsXG4gIGlzTnVtYmVyU2luZ2xlUHJvcCxcbiAgaXNOdW1lcmljQXJyYXlQcm9wLFxuICBpc051bWVyaWNTaW5nbGVQcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNTdHJpbmdBcnJheVByb3AsXG4gIGlzU3RyaW5nU2luZ2xlUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0PCRab2RMb29zZVNoYXBlPjtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZERlZmF1bHQgPSB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVW5pb24gPSB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPjtcbnR5cGUgQW55Wm9kQXJyYXkgPSB6LlpvZEFycmF5PHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xuXG4vKipcbiAqIFpvZCDtg4DsnoUgSUTroZzrtoDthLAg64+Z7KCB7Jy866GcIFpvZCDsiqTtgqTrp4jrpbwg66Gc65Oc7ZWp64uI64ukLlxuICogZGlzdCDrlJTroInthqDrpqzsl5DshJwgRVNN7Jy866GcIGltcG9ydO2VmOyXrCDqsIDsoLjsmLXri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRab2RUeXBlQnlJZCh6b2RUeXBlSWQ6IHN0cmluZyk6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIGNvbnN0IG1vZHVsZVBhdGggPSBFbnRpdHlNYW5hZ2VyLmdldE1vZHVsZVBhdGgoem9kVHlwZUlkKTtcbiAgY29uc3QgbW9kdWxlQWJzUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcImFwcGxpY2F0aW9uXCIsIGAke21vZHVsZVBhdGh9LmpzYCk7XG4gIGNvbnN0IGltcG9ydFVybCA9IGNyZWF0ZUltcG9ydFVybChtb2R1bGVBYnNQYXRoKTtcbiAgY29uc3QgaW1wb3J0ZWQgPSBhd2FpdCBpbXBvcnQoaW1wb3J0VXJsKTtcblxuICBpZiAoIWltcG9ydGVkW3pvZFR5cGVJZF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgem9kVHlwZUlkICR7em9kVHlwZUlkfWApO1xuICB9XG4gIHJldHVybiBpbXBvcnRlZFt6b2RUeXBlSWRdLmRlc2NyaWJlKHpvZFR5cGVJZCk7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc0VudW1BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gKGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpLmFycmF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmFycmF5KCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgcHJvcOydhCB6b2RUeXBl7Jy866GcIOuzgO2ZmO2VmOuKlOuNsCDsi6TtjKggJHtwcm9wfX1gKTtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZE51bWJlcikubm9ubmVnYXRpdmUoKTtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHpvZFR5cGUgPSB6b2RUeXBlLm51bGxhYmxlKCk7XG4gIH1cblxuICByZXR1cm4gem9kVHlwZTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoUg7KCV7J2YIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZURlZihwcm9wOiBFbnRpdHlQcm9wLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGxldCBzdG10OiBzdHJpbmc7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouaW50KClgO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5iaWdpbnQoKWA7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH0uYXJyYXkoKWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdBcnJheVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSkuYXJyYXkoKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmFycmF5KClgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5udW1iZXIoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5udW1iZXIoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKClgO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKWA7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKChwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH0pLnVuc2lnbmVkKSB7XG4gICAgc3RtdCArPSBcIi5ub25uZWdhdGl2ZSgpXCI7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICBzdG10ICs9IFwiLm51bGxhYmxlKClcIjtcbiAgfVxuXG4gIHJldHVybiBgJHtzdG10fSxgO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3BOb2Rl66W8IFpvZCDtg4DsnoUg7KCV7J2YIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogcGxhaW4sIGFycmF5LCBvYmplY3Qg64W465OcIO2DgOyeheydhCDsnqzqt4DsoIHsnLzroZwg7LKY66as7ZWY7JesIOykkeyyqSDqtazsobDrpbwg7KeA7JuQ7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGU6IEVudGl0eVByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJwbGFpblwiKSB7XG4gICAgcmV0dXJuIHByb3BUb1pvZFR5cGVEZWYocHJvcE5vZGUucHJvcCwgaW5qZWN0SW1wb3J0S2V5cyk7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInouYXJyYXkoei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIFwifSkpLFwiLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBgfSkke3Byb3BOb2RlLnByb3A/Lm51bGxhYmxlID8gXCIubnVsbGFibGUoKVwiIDogXCJcIn0sYCxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3I7XG4gIH1cbn1cblxuLy8gVE9ETyhIYXplLCAyNTEwMzEpOiBcInRlbXBsYXRlX2xpdGVyYWxcIiwgXCJmaWxlXCLsl5Ag64yA7ZWcIOyngOybkOydtCDtlYTsmpTtlaguXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgIGNhc2UgXCJhbnlcIjpcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIHp0LmRlZi50eXBlO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kTnVsbGFibGUpLmRlZi5pbm5lclR5cGUpfSB8IG51bGxgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6XG4gICAgICByZXR1cm4gem9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWYuaW5uZXJUeXBlKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPSB6dCBhcyBBbnlab2RSZWNvcmQ7XG4gICAgICByZXR1cm4gYHsgWyBrZXk6ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLmtleVR5cGUpfSBdOiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi52YWx1ZVR5cGUpfX1gO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbCkudmFsdWVzKVxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIik7XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIEFueVpvZFVuaW9uKS5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gem9kVHlwZVRvVHNUeXBlRGVmKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgei5ab2RFbnVtKS5vcHRpb25zLm1hcCgodmFsKSA9PiBgXCIke3ZhbH1cImApLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZEFycmF5KS5lbGVtZW50KX1bXWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9ICh6dCBhcyBBbnlab2RPYmplY3QpLnNoYXBlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNoYXBlKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChzaGFwZVtrZXldLmRlZi50eXBlID09PSBcIm9wdGlvbmFsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PzogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XS5kZWYuaW5uZXJUeXBlKX0sYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0pfSxgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIFwifVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKX0gfCB1bmRlZmluZWRgO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8vIFRPRE8oSGF6ZSwgMjUxMDMxKTogXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsIFwiZmlsZVwi7JeQIOuMgO2VnCDsp4Dsm5DsnbQg7ZWE7JqU7ZWoLlxuLyoqXG4gKiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9Lm51bGxhYmxlKClgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6IHtcbiAgICAgIGNvbnN0IHpEZWZhdWx0RGVmID0gKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZjtcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKHpEZWZhdWx0RGVmLmlubmVyVHlwZSl9LmRlZmF1bHQoJHt6RGVmYXVsdERlZi5kZWZhdWx0VmFsdWV9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgelJlY29yZERlZiA9ICh6dCBhcyBBbnlab2RSZWNvcmQpLmRlZjtcbiAgICAgIHJldHVybiBgei5yZWNvcmQoJHt6b2RUeXBlVG9ab2RDb2RlKHpSZWNvcmREZWYua2V5VHlwZSl9LCAke3pvZFR5cGVUb1pvZENvZGUoXG4gICAgICAgIHpSZWNvcmREZWYudmFsdWVUeXBlLFxuICAgICAgKX0pYDtcbiAgICB9XG4gICAgY2FzZSBcImxpdGVyYWxcIjoge1xuICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKCh6dCBhcyB6LlpvZExpdGVyYWw8c3RyaW5nIHwgbnVtYmVyPikudmFsdWVzKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYG51bGxgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYHVuZGVmaW5lZGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgei5saXRlcmFsKCR7aXRlbXNbMF19KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHoubGl0ZXJhbChbJHtpdGVtcy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgei51bmlvbihbJHsoenQgYXMgQW55Wm9kVW5pb24pLmRlZi5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbjogei5ab2RUeXBlKSA9PiB6b2RUeXBlVG9ab2RDb2RlKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiLFwiKX1dKWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIC8vIE5PVEU6IHouZW51bShbXCJBXCIsIFwiQlwiXSnrj4Qgei5lbnVtKHsgQTogXCJBXCIsIEI6IFwiQlwiIH0p66GcIOyymOumrOuQqC5cbiAgICAgIHJldHVybiBgei5lbnVtKHske09iamVjdC5lbnRyaWVzKCh6dCBhcyB6LlpvZEVudW0pLmRlZi5lbnRyaWVzKVxuICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IGAke2tleX06IFwiJHt2YWx9XCJgIDogYCR7a2V5fTogJHt2YWx9YCkpXG4gICAgICAgIC5qb2luKFwiLCBcIil9fSlgO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGB6LmFycmF5KCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU+KS5kZWYuZWxlbWVudCl9KWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9ICh6dCBhcyBBbnlab2RPYmplY3QpLnNoYXBlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNoYXBlKS5tYXAoKGtleSkgPT4gYCR7a2V5fTogJHt6b2RUeXBlVG9ab2RDb2RlKHNoYXBlW2tleV0pfSxgKSxcbiAgICAgICAgXCJ9KVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUpfS5vcHRpb25hbCgpYDtcbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIGB6LmZpbGUoKWA7XG4gICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICBjb25zdCB6SW50ZXJzZWN0aW9uRGVmID0gKHp0IGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPikuZGVmO1xuICAgICAgcmV0dXJuIGB6LmludGVyc2VjdGlvbigke3pvZFR5cGVUb1pvZENvZGUoekludGVyc2VjdGlvbkRlZi5sZWZ0KX0sICR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLnJpZ2h0KX0pYDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyerOq3gOyggeycvOuhnCDspJHssqnrkJwg7YOA7J6F65Ok7J2EIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gIHpvZFR5cGU6IHouWm9kVHlwZUFueSxcbiAgYmFzZUtleTogc3RyaW5nID0gXCJyb290XCIsXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gT2JqZWN0LmtleXMoem9kVHlwZS5zaGFwZSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlLnNoYXBlW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGVBbnk+KS5kZWYuZWxlbWVudDtcbiAgICBpZiAoaW5uZXJUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcgJiYgYmFzZUtleS5pbmNsdWRlcyhcImltYWdlc1wiKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICByZW5kZXJUeXBlOiBcImFycmF5LWltYWdlc1wiLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGVsZW1lbnQ6IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgY29uc3Qgb3B0aW9uTm9kZXMgPSAoem9kVHlwZSBhcyB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPikuZGVmLm9wdGlvbnMubWFwKChvcHQpID0+XG4gICAgICB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSksXG4gICAgKTtcbiAgICAvLyBUT0RPOiBab2RVbmlvbuydtCDrk6TslrTsnojripQg6rK97JqwIO2VuOuTpOungVxuICAgIHJldHVybiBvcHRpb25Ob2Rlc1swXTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPcHRpb25hbCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi56b2RUeXBlVG9SZW5kZXJpbmdOb2RlKCh6b2RUeXBlIGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IHJlc29sdmVSZW5kZXJUeXBlKGJhc2VLZXksIHpvZFR5cGUpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F6rO8IO2CpCDsnbTrpoTsnLzroZzrtoDthLAg7KCB7KCI7ZWcIFJlbmRlclR5cGXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVuZGVyVHlwZShrZXk6IHN0cmluZywgem9kVHlwZTogei5ab2RUeXBlQW55KTogUmVuZGVyaW5nTm9kZVtcInJlbmRlclR5cGVcIl0ge1xuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRGF0ZSkge1xuICAgIHJldHVybiBcImRhdGV0aW1lXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kU3RyaW5nKSB7XG4gICAgaWYgKGtleS5pbmNsdWRlcyhcImltZ1wiKSB8fCBrZXkuaW5jbHVkZXMoXCJpbWFnZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWltYWdlXCI7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNRTERhdGVUaW1lU3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRldGltZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiZGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGVcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlcikge1xuICAgIGlmIChrZXkgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWlkXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJfaWRcIikpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1ma19pZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQm9vbGVhbikge1xuICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgcmV0dXJuIFwiZW51bXNcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RSZWNvcmQpIHtcbiAgICByZXR1cm4gXCJyZWNvcmRcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBbnkgfHwgem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5rbm93bikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YOA7J6FIO2MjOyLsSDrtojqsIAgJHtrZXl9ICR7em9kVHlwZS5kZWYudHlwZX1gKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImluZmxlY3Rpb24iLCJwYXRoIiwieiIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCIsImlzQmlnSW50ZWdlckFycmF5UHJvcCIsImlzQmlnSW50ZWdlclNpbmdsZVByb3AiLCJpc0Jvb2xlYW5BcnJheVByb3AiLCJpc0Jvb2xlYW5TaW5nbGVQcm9wIiwiaXNEYXRlQXJyYXlQcm9wIiwiaXNEYXRlU2luZ2xlUHJvcCIsImlzRW51bUFycmF5UHJvcCIsImlzRW51bVNpbmdsZVByb3AiLCJpc0ludGVnZXJBcnJheVByb3AiLCJpc0ludGVnZXJTaW5nbGVQcm9wIiwiaXNKc29uUHJvcCIsImlzTnVtYmVyQXJyYXlQcm9wIiwiaXNOdW1iZXJTaW5nbGVQcm9wIiwiaXNOdW1lcmljQXJyYXlQcm9wIiwiaXNOdW1lcmljU2luZ2xlUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzU3RyaW5nQXJyYXlQcm9wIiwiaXNTdHJpbmdTaW5nbGVQcm9wIiwiaXNVdWlkQXJyYXlQcm9wIiwiaXNVdWlkU2luZ2xlUHJvcCIsImlzVmlydHVhbFByb3AiLCJjcmVhdGVJbXBvcnRVcmwiLCJnZXRab2RUeXBlQnlJZCIsInpvZFR5cGVJZCIsIm1vZHVsZVBhdGgiLCJnZXRNb2R1bGVQYXRoIiwibW9kdWxlQWJzUGF0aCIsImpvaW4iLCJhcGlSb290UGF0aCIsImltcG9ydFVybCIsImltcG9ydGVkIiwiRXJyb3IiLCJkZXNjcmliZSIsInByb3BUb1pvZFR5cGUiLCJwcm9wIiwiem9kVHlwZSIsInVua25vd24iLCJudW1iZXIiLCJpbnQiLCJhcnJheSIsImJpZ2ludCIsImlkIiwibGVuZ3RoIiwic3RyaW5nIiwibWF4IiwiYm9vbGVhbiIsImRhdGUiLCJ1dWlkIiwiaGFzSm9pbkNvbHVtbiIsInVuc2lnbmVkIiwibm9ubmVnYXRpdmUiLCJudWxsYWJsZSIsInByb3BUb1pvZFR5cGVEZWYiLCJpbmplY3RJbXBvcnRLZXlzIiwic3RtdCIsIm5hbWUiLCJwdXNoIiwicmVsYXRpb25UeXBlIiwid2l0aCIsInByb3BOb2RlVG9ab2RUeXBlRGVmIiwicHJvcE5vZGUiLCJub2RlVHlwZSIsImNoaWxkcmVuIiwibWFwIiwiY2hpbGRQcm9wTm9kZSIsInpvZFR5cGVUb1RzVHlwZURlZiIsInp0IiwiZGVmIiwidHlwZSIsImlubmVyVHlwZSIsInJlY29yZFR5cGUiLCJrZXlUeXBlIiwidmFsdWVUeXBlIiwiQXJyYXkiLCJmcm9tIiwidmFsdWVzIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJvcHRpb25zIiwib3B0aW9uIiwidmFsIiwiZWxlbWVudCIsInNoYXBlIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsInpvZFR5cGVUb1pvZENvZGUiLCJ6RGVmYXVsdERlZiIsImRlZmF1bHRWYWx1ZSIsInpSZWNvcmREZWYiLCJpdGVtcyIsImVudHJpZXMiLCJ6SW50ZXJzZWN0aW9uRGVmIiwibGVmdCIsInJpZ2h0Iiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsImJhc2VLZXkiLCJsYWJlbCIsImNhbWVsaXplIiwiWm9kT2JqZWN0IiwiY29sdW1uS2V5cyIsInJlbmRlclR5cGUiLCJab2RBcnJheSIsIlpvZFN0cmluZyIsImluY2x1ZGVzIiwiWm9kVW5pb24iLCJvcHRpb25Ob2RlcyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsInJlc29sdmVSZW5kZXJUeXBlIiwiWm9kRGF0ZSIsImRlc2NyaXB0aW9uIiwiZW5kc1dpdGgiLCJab2ROdW1iZXIiLCJab2RCb29sZWFuIiwiWm9kRW51bSIsIlpvZFJlY29yZCIsIlpvZEFueSIsIlpvZFVua25vd24iLCJab2RMaXRlcmFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBRUQsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBRXhCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUdFQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsc0JBQXNCLEVBQ3RCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsVUFBVSxFQUNWQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsa0JBQWtCLEVBQ2xCQyxtQkFBbUIsRUFDbkJDLHNCQUFzQixFQUN0QkMsY0FBYyxFQUNkQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGFBQWEsUUFFUixvQkFBaUI7QUFDeEIsU0FBU0MsZUFBZSxRQUFRLHdCQUFxQjtBQVdyRDs7O0NBR0MsR0FDRCxPQUFPLGVBQWVDLGVBQWVDLFNBQWlCO0lBQ3BELE1BQU1DLGFBQWEzQixjQUFjNEIsYUFBYSxDQUFDRjtJQUMvQyxNQUFNRyxnQkFBZ0JoQyxLQUFLaUMsSUFBSSxDQUFDL0IsT0FBT2dDLFdBQVcsRUFBRSxRQUFRLGVBQWUsR0FBR0osV0FBVyxHQUFHLENBQUM7SUFDN0YsTUFBTUssWUFBWVIsZ0JBQWdCSztJQUNsQyxNQUFNSSxXQUFXLE1BQU0sTUFBTSxDQUFDRDtJQUU5QixJQUFJLENBQUNDLFFBQVEsQ0FBQ1AsVUFBVSxFQUFFO1FBQ3hCLE1BQU0sSUFBSVEsTUFBTSxDQUFDLGtCQUFrQixFQUFFUixXQUFXO0lBQ2xEO0lBQ0EsT0FBT08sUUFBUSxDQUFDUCxVQUFVLENBQUNTLFFBQVEsQ0FBQ1Q7QUFDdEM7QUFFQTs7O0NBR0MsR0FDRCxPQUFPLGVBQWVVLGNBQWNDLElBQWdCO0lBQ2xELElBQUlDLFVBQXdCeEMsRUFBRXlDLE9BQU87SUFDckMsSUFBSTVCLG9CQUFvQjBCLE9BQU87UUFDN0JDLFVBQVV4QyxFQUFFMEMsTUFBTSxHQUFHQyxHQUFHO0lBQzFCLE9BQU8sSUFBSS9CLG1CQUFtQjJCLE9BQU87UUFDbkNDLFVBQVV4QyxFQUFFMEMsTUFBTSxHQUFHQyxHQUFHLEdBQUdDLEtBQUs7SUFDbEMsT0FBTyxJQUFJdkMsdUJBQXVCa0MsT0FBTztRQUN2Q0MsVUFBVXhDLEVBQUU2QyxNQUFNO0lBQ3BCLE9BQU8sSUFBSXpDLHNCQUFzQm1DLE9BQU87UUFDdENDLFVBQVV4QyxFQUFFNkMsTUFBTSxHQUFHRCxLQUFLO0lBQzVCLE9BQU8sSUFBSWpDLGlCQUFpQjRCLE9BQU87UUFDakNDLFVBQVUsTUFBTWIsZUFBZVksS0FBS08sRUFBRTtJQUN4QyxPQUFPLElBQUlwQyxnQkFBZ0I2QixPQUFPO1FBQ2hDQyxVQUFVLEFBQUMsQ0FBQSxNQUFNYixlQUFlWSxLQUFLTyxFQUFFLENBQUEsRUFBR0YsS0FBSztJQUNqRCxPQUFPLElBQUl0QixtQkFBbUJpQixPQUFPO1FBQ25DLElBQUlBLEtBQUtRLE1BQU0sRUFBRTtZQUNmUCxVQUFVeEMsRUFBRWdELE1BQU0sR0FBR0MsR0FBRyxDQUFDVixLQUFLUSxNQUFNO1FBQ3RDLE9BQU87WUFDTFAsVUFBVXhDLEVBQUVnRCxNQUFNO1FBQ3BCO0lBQ0YsT0FBTyxJQUFJM0Isa0JBQWtCa0IsT0FBTztRQUNsQyxJQUFJQSxLQUFLUSxNQUFNLEVBQUU7WUFDZlAsVUFBVXhDLEVBQUVnRCxNQUFNLEdBQUdDLEdBQUcsQ0FBQ1YsS0FBS1EsTUFBTSxFQUFFSCxLQUFLO1FBQzdDLE9BQU87WUFDTEosVUFBVXhDLEVBQUVnRCxNQUFNLEdBQUdKLEtBQUs7UUFDNUI7SUFDRixPQUFPLElBQUk1QixtQkFBbUJ1QixPQUFPO1FBQ25DQyxVQUFVeEMsRUFBRTBDLE1BQU07SUFDcEIsT0FBTyxJQUFJM0Isa0JBQWtCd0IsT0FBTztRQUNsQ0MsVUFBVXhDLEVBQUUwQyxNQUFNLEdBQUdFLEtBQUs7SUFDNUIsT0FBTyxJQUFJMUIsb0JBQW9CcUIsT0FBTztRQUNwQ0MsVUFBVXhDLEVBQUVnRCxNQUFNO0lBQ3BCLE9BQU8sSUFBSS9CLG1CQUFtQnNCLE9BQU87UUFDbkNDLFVBQVV4QyxFQUFFZ0QsTUFBTSxHQUFHSixLQUFLO0lBQzVCLE9BQU8sSUFBSXJDLG9CQUFvQmdDLE9BQU87UUFDcENDLFVBQVV4QyxFQUFFa0QsT0FBTztJQUNyQixPQUFPLElBQUk1QyxtQkFBbUJpQyxPQUFPO1FBQ25DQyxVQUFVeEMsRUFBRWtELE9BQU8sR0FBR04sS0FBSztJQUM3QixPQUFPLElBQUluQyxpQkFBaUI4QixPQUFPO1FBQ2pDQyxVQUFVeEMsRUFBRW1ELElBQUk7SUFDbEIsT0FBTyxJQUFJM0MsZ0JBQWdCK0IsT0FBTztRQUNoQ0MsVUFBVXhDLEVBQUVtRCxJQUFJLEdBQUdQLEtBQUs7SUFDMUIsT0FBTyxJQUFJcEIsaUJBQWlCZSxPQUFPO1FBQ2pDQyxVQUFVeEMsRUFBRW9ELElBQUk7SUFDbEIsT0FBTyxJQUFJN0IsZ0JBQWdCZ0IsT0FBTztRQUNoQ0MsVUFBVXhDLEVBQUVvRCxJQUFJLEdBQUdSLEtBQUs7SUFDMUIsT0FBTyxJQUFJOUIsV0FBV3lCLE9BQU87UUFDM0JDLFVBQVUsTUFBTWIsZUFBZVksS0FBS08sRUFBRTtJQUN4QyxPQUFPLElBQUlyQixjQUFjYyxPQUFPO1FBQzlCQyxVQUFVLE1BQU1iLGVBQWVZLEtBQUtPLEVBQUU7SUFDeEMsT0FBTyxJQUFJMUIsZUFBZW1CLE9BQU87UUFDL0IsSUFBSXBDLDJCQUEyQm9DLFNBQVVwQix1QkFBdUJvQixTQUFTQSxLQUFLYyxhQUFhLEVBQUc7WUFDNUZiLFVBQVV4QyxFQUFFMEMsTUFBTSxHQUFHQyxHQUFHO1FBQzFCO0lBQ0YsT0FBTztRQUNMLE1BQU0sSUFBSVAsTUFBTSxDQUFDLHlCQUF5QixFQUFFRyxLQUFLLENBQUMsQ0FBQztJQUNyRDtJQUVBLElBQUksQUFBQ0EsS0FBZ0NlLFFBQVEsRUFBRTtRQUM3Q2QsVUFBVSxBQUFDQSxRQUF3QmUsV0FBVztJQUNoRDtJQUNBLElBQUloQixLQUFLaUIsUUFBUSxFQUFFO1FBQ2pCaEIsVUFBVUEsUUFBUWdCLFFBQVE7SUFDNUI7SUFFQSxPQUFPaEI7QUFDVDtBQUVBOztDQUVDLEdBQ0QsT0FBTyxTQUFTaUIsaUJBQWlCbEIsSUFBZ0IsRUFBRW1CLGdCQUEwQjtJQUMzRSxJQUFJQztJQUNKLElBQUk5QyxvQkFBb0IwQixPQUFPO1FBQzdCb0IsT0FBTyxHQUFHcEIsS0FBS3FCLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDaEMsT0FBTyxJQUFJaEQsbUJBQW1CMkIsT0FBTztRQUNuQ29CLE9BQU8sR0FBR3BCLEtBQUtxQixJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDeEMsT0FBTyxJQUFJdkQsdUJBQXVCa0MsT0FBTztRQUN2Q29CLE9BQU8sR0FBR3BCLEtBQUtxQixJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ25DLE9BQU8sSUFBSXhELHNCQUFzQm1DLE9BQU87UUFDdENvQixPQUFPLEdBQUdwQixLQUFLcUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQzNDLE9BQU8sSUFBSWpELGlCQUFpQjRCLE9BQU87UUFDakNvQixPQUFPLEdBQUdwQixLQUFLcUIsSUFBSSxDQUFDLEVBQUUsRUFBRXJCLEtBQUtPLEVBQUUsRUFBRTtRQUNqQ1ksaUJBQWlCRyxJQUFJLENBQUN0QixLQUFLTyxFQUFFO0lBQy9CLE9BQU8sSUFBSXBDLGdCQUFnQjZCLE9BQU87UUFDaENvQixPQUFPLEdBQUdwQixLQUFLcUIsSUFBSSxDQUFDLEVBQUUsRUFBRXJCLEtBQUtPLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDekNZLGlCQUFpQkcsSUFBSSxDQUFDdEIsS0FBS08sRUFBRTtJQUMvQixPQUFPLElBQUl4QixtQkFBbUJpQixPQUFPO1FBQ25DLElBQUlBLEtBQUtRLE1BQU0sRUFBRTtZQUNmWSxPQUFPLEdBQUdwQixLQUFLcUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFckIsS0FBS1EsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN2RCxPQUFPO1lBQ0xZLE9BQU8sR0FBR3BCLEtBQUtxQixJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ25DO0lBQ0YsT0FBTyxJQUFJdkMsa0JBQWtCa0IsT0FBTztRQUNsQyxJQUFJQSxLQUFLUSxNQUFNLEVBQUU7WUFDZlksT0FBTyxHQUFHcEIsS0FBS3FCLElBQUksQ0FBQyxpQkFBaUIsRUFBRXJCLEtBQUtRLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDL0QsT0FBTztZQUNMWSxPQUFPLEdBQUdwQixLQUFLcUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQzNDO0lBQ0YsT0FBTyxJQUFJNUMsbUJBQW1CdUIsT0FBTztRQUNuQ29CLE9BQU8sR0FBR3BCLEtBQUtxQixJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ25DLE9BQU8sSUFBSTdDLGtCQUFrQndCLE9BQU87UUFDbENvQixPQUFPLEdBQUdwQixLQUFLcUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQzNDLE9BQU8sSUFBSTFDLG9CQUFvQnFCLE9BQU87UUFDcENvQixPQUFPLEdBQUdwQixLQUFLcUIsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUNuQyxPQUFPLElBQUkzQyxtQkFBbUJzQixPQUFPO1FBQ25Db0IsT0FBTyxHQUFHcEIsS0FBS3FCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUMzQyxPQUFPLElBQUluRCxpQkFBaUI4QixPQUFPO1FBQ2pDb0IsT0FBTyxHQUFHcEIsS0FBS3FCLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDakMsT0FBTyxJQUFJcEQsZ0JBQWdCK0IsT0FBTztRQUNoQ29CLE9BQU8sR0FBR3BCLEtBQUtxQixJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDekMsT0FBTyxJQUFJckQsb0JBQW9CZ0MsT0FBTztRQUNwQ29CLE9BQU8sR0FBR3BCLEtBQUtxQixJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ3BDLE9BQU8sSUFBSXRELG1CQUFtQmlDLE9BQU87UUFDbkNvQixPQUFPLEdBQUdwQixLQUFLcUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQzVDLE9BQU8sSUFBSXBDLGlCQUFpQmUsT0FBTztRQUNqQ29CLE9BQU8sR0FBR3BCLEtBQUtxQixJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ2pDLE9BQU8sSUFBSXJDLGdCQUFnQmdCLE9BQU87UUFDaENvQixPQUFPLEdBQUdwQixLQUFLcUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ3pDLE9BQU8sSUFBSTlDLFdBQVd5QixPQUFPO1FBQzNCb0IsT0FBTyxHQUFHcEIsS0FBS3FCLElBQUksQ0FBQyxFQUFFLEVBQUVyQixLQUFLTyxFQUFFLEVBQUU7UUFDakNZLGlCQUFpQkcsSUFBSSxDQUFDdEIsS0FBS08sRUFBRTtJQUMvQixPQUFPLElBQUlyQixjQUFjYyxPQUFPO1FBQzlCb0IsT0FBTyxHQUFHcEIsS0FBS3FCLElBQUksQ0FBQyxFQUFFLEVBQUVyQixLQUFLTyxFQUFFLEVBQUU7UUFDakNZLGlCQUFpQkcsSUFBSSxDQUFDdEIsS0FBS08sRUFBRTtJQUMvQixPQUFPLElBQUkxQixlQUFlbUIsT0FBTztRQUMvQixJQUFJcEMsMkJBQTJCb0MsU0FBVXBCLHVCQUF1Qm9CLFNBQVNBLEtBQUtjLGFBQWEsRUFBRztZQUM1Rk0sT0FBTyxHQUFHcEIsS0FBS3FCLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDbkMsT0FBTztZQUNMLHFCQUFxQjtZQUNyQixPQUFPLENBQUMsR0FBRyxFQUFFckIsS0FBS3FCLElBQUksQ0FBQyxFQUFFLEVBQUVyQixLQUFLdUIsWUFBWSxDQUFDLENBQUMsRUFBRXZCLEtBQUt3QixJQUFJLEVBQUU7UUFDN0Q7SUFDRixPQUFPO1FBQ0wsT0FBTztJQUNUO0lBRUEsSUFBSSxBQUFDeEIsS0FBZ0NlLFFBQVEsRUFBRTtRQUM3Q0ssUUFBUTtJQUNWO0lBQ0EsSUFBSXBCLEtBQUtpQixRQUFRLEVBQUU7UUFDakJHLFFBQVE7SUFDVjtJQUVBLE9BQU8sR0FBR0EsS0FBSyxDQUFDLENBQUM7QUFDbkI7QUFFQTs7O0NBR0MsR0FDRCxPQUFPLFNBQVNLLHFCQUFxQkMsUUFBd0IsRUFBRVAsZ0JBQTBCO0lBQ3ZGLElBQUlPLFNBQVNDLFFBQVEsS0FBSyxTQUFTO1FBQ2pDLE9BQU9ULGlCQUFpQlEsU0FBUzFCLElBQUksRUFBRW1CO0lBQ3pDLE9BQU8sSUFBSU8sU0FBU0MsUUFBUSxLQUFLLFNBQVM7UUFDeEMsT0FBTztZQUNMRCxTQUFTMUIsSUFBSSxHQUFHLEdBQUcwQixTQUFTMUIsSUFBSSxDQUFDcUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHO1lBQzVDO1lBQ0FLLFNBQVNFLFFBQVEsQ0FDZEMsR0FBRyxDQUFDLENBQUNDLGdCQUFrQkwscUJBQXFCSyxlQUFlWCxtQkFDM0QxQixJQUFJLENBQUM7WUFDUjtZQUNBO1NBQ0QsQ0FBQ0EsSUFBSSxDQUFDO0lBQ1QsT0FBTyxJQUFJaUMsU0FBU0MsUUFBUSxLQUFLLFVBQVU7UUFDekMsT0FBTztZQUNMRCxTQUFTMUIsSUFBSSxHQUFHLEdBQUcwQixTQUFTMUIsSUFBSSxDQUFDcUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHO1lBQzVDO1lBQ0FLLFNBQVNFLFFBQVEsQ0FDZEMsR0FBRyxDQUFDLENBQUNDLGdCQUFrQkwscUJBQXFCSyxlQUFlWCxtQkFDM0QxQixJQUFJLENBQUM7WUFDUjtZQUNBLENBQUMsRUFBRSxFQUFFaUMsU0FBUzFCLElBQUksRUFBRWlCLFdBQVcsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1NBQ3JELENBQUN4QixJQUFJLENBQUM7SUFDVCxPQUFPO1FBQ0wsTUFBTUk7SUFDUjtBQUNGO0FBRUEsOERBQThEO0FBQzlELE9BQU8sU0FBU2tDLG1CQUFtQkMsRUFBYTtJQUM5QyxPQUFRQSxHQUFHQyxHQUFHLENBQUNDLElBQUk7UUFDakIsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztZQUNILE9BQU9GLEdBQUdDLEdBQUcsQ0FBQ0MsSUFBSTtRQUNwQixLQUFLO1lBQ0gsT0FBTyxHQUFHSCxtQkFBbUIsQUFBQ0MsR0FBc0JDLEdBQUcsQ0FBQ0UsU0FBUyxFQUFFLE9BQU8sQ0FBQztRQUM3RSxLQUFLO1lBQ0gsT0FBT0osbUJBQW1CLEFBQUNDLEdBQXFCQyxHQUFHLENBQUNFLFNBQVM7UUFDL0QsS0FBSztZQUFVO2dCQUNiLE1BQU1DLGFBQWFKO2dCQUNuQixPQUFPLENBQUMsU0FBUyxFQUFFRCxtQkFBbUJLLFdBQVdILEdBQUcsQ0FBQ0ksT0FBTyxFQUFFLElBQUksRUFBRU4sbUJBQW1CSyxXQUFXSCxHQUFHLENBQUNLLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDckg7UUFDQSxLQUFLO1lBQ0gsT0FBT0MsTUFBTUMsSUFBSSxDQUFDLEFBQUNSLEdBQW9CUyxNQUFNLEVBQzFDWixHQUFHLENBQUMsQ0FBQ2E7Z0JBQ0osSUFBSSxPQUFPQSxVQUFVLFVBQVU7b0JBQzdCLE9BQU8sQ0FBQyxDQUFDLEVBQUVBLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQjtnQkFFQSxJQUFJQSxVQUFVLE1BQU07b0JBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2Y7Z0JBRUEsSUFBSUEsVUFBVUMsV0FBVztvQkFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQztnQkFDcEI7Z0JBRUEsT0FBTyxHQUFHRCxPQUFPO1lBQ25CLEdBQ0NqRCxJQUFJLENBQUM7UUFDVixLQUFLO1lBQ0gsT0FBTyxHQUFHLEFBQUN1QyxHQUFtQlksT0FBTyxDQUNsQ2YsR0FBRyxDQUFDLENBQUNnQixTQUFXZCxtQkFBbUJjLFNBQ25DcEQsSUFBSSxDQUFDLFFBQVE7UUFDbEIsS0FBSztZQUNILE9BQU8sR0FBRyxBQUFDdUMsR0FBaUJZLE9BQU8sQ0FBQ2YsR0FBRyxDQUFDLENBQUNpQixNQUFRLENBQUMsQ0FBQyxFQUFFQSxJQUFJLENBQUMsQ0FBQyxFQUFFckQsSUFBSSxDQUFDLFFBQVE7UUFDNUUsS0FBSztZQUNILE9BQU8sR0FBR3NDLG1CQUFtQixBQUFDQyxHQUFtQmUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUMvRCxLQUFLO1lBQVU7Z0JBQ2IsTUFBTUMsUUFBUSxBQUFDaEIsR0FBb0JnQixLQUFLO2dCQUN4QyxPQUFPO29CQUNMO3VCQUNHQyxPQUFPQyxJQUFJLENBQUNGLE9BQU9uQixHQUFHLENBQUMsQ0FBQ3NCO3dCQUN6QixJQUFJSCxLQUFLLENBQUNHLElBQUksQ0FBQ2xCLEdBQUcsQ0FBQ0MsSUFBSSxLQUFLLFlBQVk7NEJBQ3RDLE9BQU8sR0FBR2lCLElBQUksR0FBRyxFQUFFcEIsbUJBQW1CaUIsS0FBSyxDQUFDRyxJQUFJLENBQUNsQixHQUFHLENBQUNFLFNBQVMsRUFBRSxDQUFDLENBQUM7d0JBQ3BFLE9BQU87NEJBQ0wsT0FBTyxHQUFHZ0IsSUFBSSxFQUFFLEVBQUVwQixtQkFBbUJpQixLQUFLLENBQUNHLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ3JEO29CQUNGO29CQUNBO2lCQUNELENBQUMxRCxJQUFJLENBQUM7WUFDVDtRQUNBLEtBQUs7WUFDSCxPQUFPLEdBQUdzQyxtQkFBbUIsQUFBQ0MsR0FBc0JDLEdBQUcsQ0FBQ0UsU0FBUyxFQUFFLFlBQVksQ0FBQztRQUNsRjtZQUNFLE1BQU0sSUFBSXRDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRW1DLEdBQUdDLEdBQUcsQ0FBQ0MsSUFBSSxFQUFFO0lBQ3BEO0FBQ0Y7QUFFQSw4REFBOEQ7QUFDOUQ7O0NBRUMsR0FDRCxPQUFPLFNBQVNrQixpQkFBaUJwQixFQUFhO0lBQzVDLE9BQVFBLEdBQUdDLEdBQUcsQ0FBQ0MsSUFBSTtRQUNqQixLQUFLO1lBQ0gsT0FBTztRQUNULEtBQUs7WUFDSCxPQUFPO1FBQ1QsS0FBSztZQUNILE9BQU87UUFDVCxLQUFLO1lBQ0gsT0FBTztRQUNULEtBQUs7WUFDSCxPQUFPO1FBQ1QsS0FBSztZQUNILE9BQU87UUFDVCxLQUFLO1lBQ0gsT0FBTztRQUNULEtBQUs7WUFDSCxPQUFPO1FBQ1QsS0FBSztZQUNILE9BQU87UUFDVCxLQUFLO1lBQ0gsT0FBTztRQUNULEtBQUs7WUFDSCxPQUFPLEdBQUdrQixpQkFBaUIsQUFBQ3BCLEdBQXNCQyxHQUFHLENBQUNFLFNBQVMsRUFBRSxXQUFXLENBQUM7UUFDL0UsS0FBSztZQUFXO2dCQUNkLE1BQU1rQixjQUFjLEFBQUNyQixHQUFxQkMsR0FBRztnQkFDN0MsT0FBTyxHQUFHbUIsaUJBQWlCQyxZQUFZbEIsU0FBUyxFQUFFLFNBQVMsRUFBRWtCLFlBQVlDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDMUY7UUFDQSxLQUFLO1lBQVU7Z0JBQ2IsTUFBTUMsYUFBYSxBQUFDdkIsR0FBb0JDLEdBQUc7Z0JBQzNDLE9BQU8sQ0FBQyxTQUFTLEVBQUVtQixpQkFBaUJHLFdBQVdsQixPQUFPLEVBQUUsRUFBRSxFQUFFZSxpQkFDMURHLFdBQVdqQixTQUFTLEVBQ3BCLENBQUMsQ0FBQztZQUNOO1FBQ0EsS0FBSztZQUFXO2dCQUNkLE1BQU1rQixRQUFRakIsTUFBTUMsSUFBSSxDQUFDLEFBQUNSLEdBQXFDUyxNQUFNLEVBQUVaLEdBQUcsQ0FBQyxDQUFDYTtvQkFDMUUsSUFBSSxPQUFPQSxVQUFVLFVBQVU7d0JBQzdCLE9BQU8sQ0FBQyxDQUFDLEVBQUVBLE1BQU0sQ0FBQyxDQUFDO29CQUNyQjtvQkFFQSxJQUFJQSxVQUFVLE1BQU07d0JBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQ2Y7b0JBRUEsSUFBSUEsVUFBVUMsV0FBVzt3QkFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQztvQkFDcEI7b0JBRUEsT0FBTyxHQUFHRCxPQUFPO2dCQUNuQjtnQkFFQSxJQUFJYyxNQUFNaEQsTUFBTSxLQUFLLEdBQUc7b0JBQ3RCLE9BQU8sQ0FBQyxVQUFVLEVBQUVnRCxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakM7Z0JBQ0EsT0FBTyxDQUFDLFdBQVcsRUFBRUEsTUFBTS9ELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQztRQUNBLEtBQUs7WUFDSCxPQUFPLENBQUMsU0FBUyxFQUFFLEFBQUN1QyxHQUFtQkMsR0FBRyxDQUFDVyxPQUFPLENBQy9DZixHQUFHLENBQUMsQ0FBQ2dCLFNBQXNCTyxpQkFBaUJQLFNBQzVDcEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLEtBQUs7WUFDSCw2REFBNkQ7WUFDN0QsT0FBTyxDQUFDLFFBQVEsRUFBRXdELE9BQU9RLE9BQU8sQ0FBQyxBQUFDekIsR0FBaUJDLEdBQUcsQ0FBQ3dCLE9BQU8sRUFDM0Q1QixHQUFHLENBQUMsQ0FBQyxDQUFDc0IsS0FBS0wsSUFBSSxHQUFNLE9BQU9BLFFBQVEsV0FBVyxHQUFHSyxJQUFJLEdBQUcsRUFBRUwsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHSyxJQUFJLEVBQUUsRUFBRUwsS0FBSyxFQUNwRnJELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixLQUFLO1lBQ0gsT0FBTyxDQUFDLFFBQVEsRUFBRTJELGlCQUFpQixBQUFDcEIsR0FBNkJDLEdBQUcsQ0FBQ2MsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRixLQUFLO1lBQVU7Z0JBQ2IsTUFBTUMsUUFBUSxBQUFDaEIsR0FBb0JnQixLQUFLO2dCQUN4QyxPQUFPO29CQUNMO3VCQUNHQyxPQUFPQyxJQUFJLENBQUNGLE9BQU9uQixHQUFHLENBQUMsQ0FBQ3NCLE1BQVEsR0FBR0EsSUFBSSxFQUFFLEVBQUVDLGlCQUFpQkosS0FBSyxDQUFDRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUM3RTtpQkFDRCxDQUFDMUQsSUFBSSxDQUFDO1lBQ1Q7UUFDQSxLQUFLO1lBQ0gsT0FBTyxHQUFHMkQsaUJBQWlCLEFBQUNwQixHQUFnQ0MsR0FBRyxDQUFDRSxTQUFTLEVBQUUsV0FBVyxDQUFDO1FBQ3pGLEtBQUs7WUFDSCxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ25CLEtBQUs7WUFBZ0I7Z0JBQ25CLE1BQU11QixtQkFBbUIsQUFBQzFCLEdBQStDQyxHQUFHO2dCQUM1RSxPQUFPLENBQUMsZUFBZSxFQUFFbUIsaUJBQWlCTSxpQkFBaUJDLElBQUksRUFBRSxFQUFFLEVBQUVQLGlCQUFpQk0saUJBQWlCRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2xIO1FBQ0E7WUFDRSxNQUFNLElBQUkvRCxNQUFNLENBQUMsZ0JBQWdCLEVBQUVtQyxHQUFHQyxHQUFHLENBQUNDLElBQUksRUFBRTtJQUNwRDtBQUNGO0FBRUE7OztDQUdDLEdBQ0QsT0FBTyxTQUFTMkIsdUJBQ2Q1RCxPQUFxQixFQUNyQjZELFVBQWtCLE1BQU07SUFFeEIsTUFBTTdCLE1BQU07UUFDVlosTUFBTXlDO1FBQ05DLE9BQU94RyxXQUFXeUcsUUFBUSxDQUFDRixTQUFTO1FBQ3BDN0Q7SUFDRjtJQUNBLElBQUlBLG1CQUFtQnhDLEVBQUV3RyxTQUFTLEVBQUU7UUFDbEMsTUFBTUMsYUFBYWpCLE9BQU9DLElBQUksQ0FBQ2pELFFBQVErQyxLQUFLO1FBQzVDLE1BQU1wQixXQUFXc0MsV0FBV3JDLEdBQUcsQ0FBQyxDQUFDc0I7WUFDL0IsTUFBTWhCLFlBQVlsQyxRQUFRK0MsS0FBSyxDQUFDRyxJQUFJO1lBQ3BDLE9BQU9VLHVCQUF1QjFCLFdBQVdnQjtRQUMzQztRQUNBLE9BQU87WUFDTCxHQUFHbEIsR0FBRztZQUNOa0MsWUFBWTtZQUNadkM7UUFDRjtJQUNGLE9BQU8sSUFBSTNCLG1CQUFtQnhDLEVBQUUyRyxRQUFRLEVBQUU7UUFDeEMsTUFBTWpDLFlBQVksQUFBQ2xDLFFBQXFDZ0MsR0FBRyxDQUFDYyxPQUFPO1FBQ25FLElBQUlaLHFCQUFxQjFFLEVBQUU0RyxTQUFTLElBQUlQLFFBQVFRLFFBQVEsQ0FBQyxXQUFXO1lBQ2xFLE9BQU87Z0JBQ0wsR0FBR3JDLEdBQUc7Z0JBQ05rQyxZQUFZO1lBQ2Q7UUFDRjtRQUNBLE9BQU87WUFDTCxHQUFHbEMsR0FBRztZQUNOa0MsWUFBWTtZQUNacEIsU0FBU2MsdUJBQXVCMUIsV0FBVzJCO1FBQzdDO0lBQ0YsT0FBTyxJQUFJN0QsbUJBQW1CeEMsRUFBRThHLFFBQVEsRUFBRTtRQUN4QyxNQUFNQyxjQUFjLEFBQUN2RSxRQUFvQ2dDLEdBQUcsQ0FBQ1csT0FBTyxDQUFDZixHQUFHLENBQUMsQ0FBQzRDLE1BQ3hFWix1QkFBdUJZLEtBQUtYO1FBRTlCLDhCQUE4QjtRQUM5QixPQUFPVSxXQUFXLENBQUMsRUFBRTtJQUN2QixPQUFPLElBQUl2RSxtQkFBbUJ4QyxFQUFFaUgsV0FBVyxFQUFFO1FBQzNDLE9BQU87WUFDTCxHQUFHYix1QkFBdUIsQUFBQzVELFFBQXFDZ0MsR0FBRyxDQUFDRSxTQUFTLEVBQUUyQixRQUFRO1lBQ3ZGYSxVQUFVO1FBQ1o7SUFDRixPQUFPLElBQUkxRSxtQkFBbUJ4QyxFQUFFbUgsV0FBVyxFQUFFO1FBQzNDLE9BQU87WUFDTCxHQUFHZix1QkFBdUIsQUFBQzVELFFBQXFDZ0MsR0FBRyxDQUFDRSxTQUFTLEVBQUUyQixRQUFRO1lBQ3ZGN0MsVUFBVTtRQUNaO0lBQ0YsT0FBTztRQUNMLE9BQU87WUFDTCxHQUFHZ0IsR0FBRztZQUNOa0MsWUFBWVUsa0JBQWtCZixTQUFTN0Q7UUFDekM7SUFDRjtBQUNGO0FBRUE7O0NBRUMsR0FDRCxTQUFTNEUsa0JBQWtCMUIsR0FBVyxFQUFFbEQsT0FBcUI7SUFDM0QsSUFBSUEsbUJBQW1CeEMsRUFBRXFILE9BQU8sRUFBRTtRQUNoQyxPQUFPO0lBQ1QsT0FBTyxJQUFJN0UsbUJBQW1CeEMsRUFBRTRHLFNBQVMsRUFBRTtRQUN6QyxJQUFJbEIsSUFBSW1CLFFBQVEsQ0FBQyxVQUFVbkIsSUFBSW1CLFFBQVEsQ0FBQyxVQUFVO1lBQ2hELE9BQU87UUFDVCxPQUFPLElBQUlyRSxRQUFROEUsV0FBVyxLQUFLLHFCQUFxQjtZQUN0RCxPQUFPO1FBQ1QsT0FBTyxJQUFJNUIsSUFBSTZCLFFBQVEsQ0FBQyxTQUFTO1lBQy9CLE9BQU87UUFDVCxPQUFPO1lBQ0wsT0FBTztRQUNUO0lBQ0YsT0FBTyxJQUFJL0UsbUJBQW1CeEMsRUFBRXdILFNBQVMsRUFBRTtRQUN6QyxJQUFJOUIsUUFBUSxNQUFNO1lBQ2hCLE9BQU87UUFDVCxPQUFPLElBQUlBLElBQUk2QixRQUFRLENBQUMsUUFBUTtZQUM5QixPQUFPO1FBQ1QsT0FBTztZQUNMLE9BQU87UUFDVDtJQUNGLE9BQU8sSUFBSS9FLG1CQUFtQnhDLEVBQUV5SCxVQUFVLEVBQUU7UUFDMUMsT0FBTztJQUNULE9BQU8sSUFBSWpGLG1CQUFtQnhDLEVBQUUwSCxPQUFPLEVBQUU7UUFDdkMsT0FBTztJQUNULE9BQU8sSUFBSWxGLG1CQUFtQnhDLEVBQUUySCxTQUFTLEVBQUU7UUFDekMsT0FBTztJQUNULE9BQU8sSUFBSW5GLG1CQUFtQnhDLEVBQUU0SCxNQUFNLElBQUlwRixtQkFBbUJ4QyxFQUFFNkgsVUFBVSxFQUFFO1FBQ3pFLE9BQU87SUFDVCxPQUFPLElBQUlyRixtQkFBbUJ4QyxFQUFFOEcsUUFBUSxFQUFFO1FBQ3hDLE9BQU87SUFDVCxPQUFPLElBQUl0RSxtQkFBbUJ4QyxFQUFFOEgsVUFBVSxFQUFFO1FBQzFDLE9BQU87SUFDVCxPQUFPO1FBQ0wsTUFBTSxJQUFJMUYsTUFBTSxDQUFDLFNBQVMsRUFBRXNELElBQUksQ0FBQyxFQUFFbEQsUUFBUWdDLEdBQUcsQ0FBQ0MsSUFBSSxFQUFFO0lBQ3ZEO0FBQ0YifQ==
|
|
494
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogem9kLWNvbnZlcnRlciDqtazshLFcbiAqIDEuIOycoO2LuOumrO2LsFxuICogIC0gZ2V0Wm9kVHlwZUJ5SWRcbiAqXG4gKiAyLiBab2Qg7YOA7J6FIOuzgO2ZmCAoRW50aXR5UHJvcCAtPiBab2RUeXBlKVxuICogIC0gcHJvcFRvWm9kVHlwZVxuICpcbiAqIDMuIEVudGl0eVByb3AvTm9kZSAtPiBab2Qg7L2U65OcIOusuOyekOyXtFxuICogIC0gcHJvcFRvWm9kVHlwZURlZlxuICogIC0gcHJvcE5vZGVUb1pvZFR5cGVEZWZcbiAqXG4gKiA0LiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYIChab2RUeXBlIC0+IFpvZENvZGUpXG4gKiAgLSB6b2RUeXBlVG9ab2RDb2RlXG4gKlxuICogNS4gWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZggKFpvZFR5cGUgLT4gUmVuZGVyaW5nTm9kZSlcbiAqICAtIHpvZFR5cGVUb1JlbmRlcmluZ05vZGVcbiAqICAtIHJlc29sdmVSZW5kZXJUeXBlXG4gKi9cblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyAkWm9kTG9vc2VTaGFwZSB9IGZyb20gXCJ6b2QvdjQvY29yZVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0JpZ0ludGVnZXJBcnJheVByb3AsXG4gIGlzQmlnSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzQm9vbGVhbkFycmF5UHJvcCxcbiAgaXNCb29sZWFuU2luZ2xlUHJvcCxcbiAgaXNEYXRlQXJyYXlQcm9wLFxuICBpc0RhdGVTaW5nbGVQcm9wLFxuICBpc0VudW1BcnJheVByb3AsXG4gIGlzRW51bVNpbmdsZVByb3AsXG4gIGlzSW50ZWdlckFycmF5UHJvcCxcbiAgaXNJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNKc29uUHJvcCxcbiAgaXNOdW1iZXJBcnJheVByb3AsXG4gIGlzTnVtYmVyU2luZ2xlUHJvcCxcbiAgaXNOdW1lcmljQXJyYXlQcm9wLFxuICBpc051bWVyaWNTaW5nbGVQcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNTdHJpbmdBcnJheVByb3AsXG4gIGlzU3RyaW5nU2luZ2xlUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0PCRab2RMb29zZVNoYXBlPjtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZERlZmF1bHQgPSB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVW5pb24gPSB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPjtcbnR5cGUgQW55Wm9kQXJyYXkgPSB6LlpvZEFycmF5PHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RUZW1wbGF0ZUxpdGVyYWwgPSB6LlpvZFRlbXBsYXRlTGl0ZXJhbDxzdHJpbmc+O1xuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcImRpc3RcIiwgXCJhcHBsaWNhdGlvblwiLCBgJHttb2R1bGVQYXRofS5qc2ApO1xuICBjb25zdCBpbXBvcnRVcmwgPSBjcmVhdGVJbXBvcnRVcmwobW9kdWxlQWJzUGF0aCk7XG4gIGNvbnN0IGltcG9ydGVkID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG5cbiAgaWYgKCFpbXBvcnRlZFt6b2RUeXBlSWRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHpvZFR5cGVJZCAke3pvZFR5cGVJZH1gKTtcbiAgfVxuICByZXR1cm4gaW1wb3J0ZWRbem9kVHlwZUlkXS5kZXNjcmliZSh6b2RUeXBlSWQpO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3DsnYQgWm9kIO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDqsIEgcHJvcOydmCDtg4DsnoXsl5Ag65Sw6528IOyggeygiO2VnCBab2QgdmFsaWRhdG9y66W8IOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3BUb1pvZFR5cGUocHJvcDogRW50aXR5UHJvcCk6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIGxldCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkgPSB6LnVua25vd24oKTtcbiAgaWYgKGlzSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKTtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IChhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKSkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKS5hcnJheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKTtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpIHtcbiAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICB6b2RUeXBlID0gKHpvZFR5cGUgYXMgei5ab2ROdW1iZXIpLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfV9pZDogei5pbnQoKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOq3uOyZuCByZWxhdGlvbiDsvIDsnbTsiqQg7KCc7Jm4XG4gICAgICByZXR1cm4gYC8vICR7cHJvcC5uYW1lfTogJHtwcm9wLnJlbGF0aW9uVHlwZX0gJHtwcm9wLndpdGh9YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiLy8gdW5hYmxlIHRvIHJlc29sdmVcIjtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHN0bXQgKz0gXCIubm9ubmVnYXRpdmUoKVwiO1xuICB9XG4gIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgc3RtdCArPSBcIi5udWxsYWJsZSgpXCI7XG4gIH1cblxuICByZXR1cm4gYCR7c3RtdH0sYDtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9wTm9kZeulvCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHBsYWluLCBhcnJheSwgb2JqZWN0IOuFuOuTnCDtg4DsnoXsnYQg7J6s6reA7KCB7Jy866GcIOyymOumrO2VmOyXrCDspJHssqkg6rWs7KGw66W8IOyngOybkO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwicGxhaW5cIikge1xuICAgIHJldHVybiBwcm9wVG9ab2RUeXBlRGVmKHByb3BOb2RlLnByb3AsIGluamVjdEltcG9ydEtleXMpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6LmFycmF5KHoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBcIn0pKSxcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgYH0pJHtwcm9wTm9kZS5wcm9wPy5udWxsYWJsZSA/IFwiLm51bGxhYmxlKClcIiA6IFwiXCJ9LGAsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9Uc1R5cGVEZWYoenQ6IHouWm9kVHlwZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgY2FzZSBcImFueVwiOlxuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4genQuZGVmLnR5cGU7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZi5pbm5lclR5cGUpO1xuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgcmVjb3JkVHlwZSA9IHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIHJldHVybiBgeyBbIGtleTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSl9IF06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLnZhbHVlVHlwZSl9fWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsKS52YWx1ZXMpXG4gICAgICAgIC5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiB8IFwiKTtcbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgQW55Wm9kVW5pb24pLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB6b2RUeXBlVG9Uc1R5cGVEZWYob3B0aW9uKSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgcmV0dXJuIGAkeyh6dCBhcyB6LlpvZEVudW0pLm9wdGlvbnMubWFwKCh2YWwpID0+IGBcIiR7dmFsfVwiYCkuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kQXJyYXkpLmVsZW1lbnQpfVtdYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcIntcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHNoYXBlW2tleV0uZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX0/OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldLmRlZi5pbm5lclR5cGUpfSxgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XSl9LGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kT3B0aW9uYWwpLmRlZi5pbm5lclR5cGUpfSB8IHVuZGVmaW5lZGA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbOydgCBzdHJpbmfsnLzroZwg7Y+067CxXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66as7YSw65+0IOqwkiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIChwYXJ0IGFzIHouWm9kVHlwZSkuX3pvZCkge1xuICAgICAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGVUb1RzVHlwZURlZihwYXJ0IGFzIHouWm9kVHlwZSk7XG4gICAgICAgICAgcmV0dXJuIGBcXCR7JHtpbm5lclR5cGV9fWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIGBcXCR7c3RyaW5nfWA7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGBcXGAke3BhcnRzLmpvaW4oXCJcIil9XFxgYDtcbiAgICB9XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBcIkZpbGVcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9ab2RDb2RlKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiBcInoubnVtYmVyKClcIjtcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICByZXR1cm4gXCJ6LmJpZ2ludCgpXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcInouYm9vbGVhbigpXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInouZGF0ZSgpXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcInoubnVsbCgpXCI7XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgcmV0dXJuIFwiei51bmRlZmluZWQoKVwiO1xuICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgIHJldHVybiBcInouYW55KClcIjtcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgICAgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiBcInoubmV2ZXIoKVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKX0ubnVsbGFibGUoKWA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjoge1xuICAgICAgY29uc3QgekRlZmF1bHREZWYgPSAoenQgYXMgQW55Wm9kRGVmYXVsdCkuZGVmO1xuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlKX0uZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYDtcbiAgICB9XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID0gKHp0IGFzIEFueVpvZFJlY29yZCkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGUsXG4gICAgICApfSlgO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbDxzdHJpbmcgfCBudW1iZXI+KS52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGB6LnVuaW9uKFskeyh6dCBhcyBBbnlab2RVbmlvbikuZGVmLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uOiB6LlpvZFR5cGUpID0+IHpvZFR5cGVUb1pvZENvZGUob3B0aW9uKSlcbiAgICAgICAgLmpvaW4oXCIsXCIpfV0pYDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgLy8gTk9URTogei5lbnVtKFtcIkFcIiwgXCJCXCJdKeuPhCB6LmVudW0oeyBBOiBcIkFcIiwgQjogXCJCXCIgfSnroZwg7LKY66as65CoLlxuICAgICAgcmV0dXJuIGB6LmVudW0oeyR7T2JqZWN0LmVudHJpZXMoKHp0IGFzIHouWm9kRW51bSkuZGVmLmVudHJpZXMpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbF0pID0+ICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX19KWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYHouYXJyYXkoJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZEFycmF5PHouWm9kVHlwZT4pLmRlZi5lbGVtZW50KX0pYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcCgoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUoc2hhcGVba2V5XSl9LGApLFxuICAgICAgICBcIn0pXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSl9Lm9wdGlvbmFsKClgO1xuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gYHouZmlsZSgpYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAoenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFsXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInoudGVtcGxhdGVMaXRlcmFsKFtdKVwiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydDogdW5rbm93bikgPT4ge1xuICAgICAgICAvLyDrrLjsnpDsl7Qg66as7YSw65+0XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3BhcnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIChwYXJ0IGFzIHouWm9kVHlwZSkuX3pvZCkge1xuICAgICAgICAgIHJldHVybiB6b2RUeXBlVG9ab2RDb2RlKHBhcnQgYXMgei5ab2RUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGB6LnRlbXBsYXRlTGl0ZXJhbChbJHtwYXJ0cy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwiaW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIGNvbnN0IHpJbnRlcnNlY3Rpb25EZWYgPSAoenQgYXMgei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlLCB6LlpvZFR5cGU+KS5kZWY7XG4gICAgICByZXR1cm4gYHouaW50ZXJzZWN0aW9uKCR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLmxlZnQpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQpfSlgO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlQW55LFxuICBiYXNlS2V5OiBzdHJpbmcgPSBcInJvb3RcIixcbik6IFJlbmRlcmluZ05vZGUge1xuICBjb25zdCBkZWYgPSB7XG4gICAgbmFtZTogYmFzZUtleSxcbiAgICBsYWJlbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShiYXNlS2V5LCBmYWxzZSksXG4gICAgem9kVHlwZSxcbiAgfTtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlLnNoYXBlKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNvbHVtbktleXMubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGUuc2hhcGVba2V5XTtcbiAgICAgIHJldHVybiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICBjb25zdCBpbm5lclR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZEFycmF5PHouWm9kVHlwZUFueT4pLmRlZi5lbGVtZW50O1xuICAgIGlmIChpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiBiYXNlS2V5LmluY2x1ZGVzKFwiaW1hZ2VzXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXktaW1hZ2VzXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJhcnJheVwiLFxuICAgICAgZWxlbWVudDogem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICBjb25zdCBvcHRpb25Ob2RlcyA9ICh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9ucy5tYXAoKG9wdCkgPT5cbiAgICAgIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUob3B0LCBiYXNlS2V5KSxcbiAgICApO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgoem9kVHlwZSBhcyB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogcmVzb2x2ZVJlbmRlclR5cGUoYmFzZUtleSwgem9kVHlwZSksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXqs7wg7YKkIOydtOumhOycvOuhnOu2gO2EsCDsoIHsoIjtlZwgUmVuZGVyVHlwZeydhCDqsrDsoJXtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZW5kZXJUeXBlKGtleTogc3RyaW5nLCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkpOiBSZW5kZXJpbmdOb2RlW1wicmVuZGVyVHlwZVwiXSB7XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2REYXRlKSB7XG4gICAgcmV0dXJuIFwiZGF0ZXRpbWVcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiaW1nXCIpIHx8IGtleS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaW1hZ2VcIjtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsInBhdGgiLCJ6IiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNCaWdJbnRlZ2VyQXJyYXlQcm9wIiwiaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCIsImlzQm9vbGVhbkFycmF5UHJvcCIsImlzQm9vbGVhblNpbmdsZVByb3AiLCJpc0RhdGVBcnJheVByb3AiLCJpc0RhdGVTaW5nbGVQcm9wIiwiaXNFbnVtQXJyYXlQcm9wIiwiaXNFbnVtU2luZ2xlUHJvcCIsImlzSW50ZWdlckFycmF5UHJvcCIsImlzSW50ZWdlclNpbmdsZVByb3AiLCJpc0pzb25Qcm9wIiwiaXNOdW1iZXJBcnJheVByb3AiLCJpc051bWJlclNpbmdsZVByb3AiLCJpc051bWVyaWNBcnJheVByb3AiLCJpc051bWVyaWNTaW5nbGVQcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNTdHJpbmdBcnJheVByb3AiLCJpc1N0cmluZ1NpbmdsZVByb3AiLCJpc1V1aWRBcnJheVByb3AiLCJpc1V1aWRTaW5nbGVQcm9wIiwiaXNWaXJ0dWFsUHJvcCIsImNyZWF0ZUltcG9ydFVybCIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZUlkIiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJtb2R1bGVBYnNQYXRoIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiaW1wb3J0VXJsIiwiaW1wb3J0ZWQiLCJFcnJvciIsImRlc2NyaWJlIiwicHJvcFRvWm9kVHlwZSIsInByb3AiLCJ6b2RUeXBlIiwidW5rbm93biIsIm51bWJlciIsImludCIsImFycmF5IiwiYmlnaW50IiwiaWQiLCJsZW5ndGgiLCJzdHJpbmciLCJtYXgiLCJib29sZWFuIiwiZGF0ZSIsInV1aWQiLCJoYXNKb2luQ29sdW1uIiwidW5zaWduZWQiLCJub25uZWdhdGl2ZSIsIm51bGxhYmxlIiwicHJvcFRvWm9kVHlwZURlZiIsImluamVjdEltcG9ydEtleXMiLCJzdG10IiwibmFtZSIsInB1c2giLCJyZWxhdGlvblR5cGUiLCJ3aXRoIiwicHJvcE5vZGVUb1pvZFR5cGVEZWYiLCJwcm9wTm9kZSIsIm5vZGVUeXBlIiwiY2hpbGRyZW4iLCJtYXAiLCJjaGlsZFByb3BOb2RlIiwiem9kVHlwZVRvVHNUeXBlRGVmIiwienQiLCJkZWYiLCJ0eXBlIiwiaW5uZXJUeXBlIiwicmVjb3JkVHlwZSIsImtleVR5cGUiLCJ2YWx1ZVR5cGUiLCJBcnJheSIsImZyb20iLCJ2YWx1ZXMiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsIm9wdGlvbnMiLCJvcHRpb24iLCJ2YWwiLCJlbGVtZW50Iiwic2hhcGUiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwicGFydHMiLCJwYXJ0IiwiX3pvZCIsInpvZFR5cGVUb1pvZENvZGUiLCJ6RGVmYXVsdERlZiIsImRlZmF1bHRWYWx1ZSIsInpSZWNvcmREZWYiLCJpdGVtcyIsImVudHJpZXMiLCJ6SW50ZXJzZWN0aW9uRGVmIiwibGVmdCIsInJpZ2h0Iiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsImJhc2VLZXkiLCJsYWJlbCIsImNhbWVsaXplIiwiWm9kT2JqZWN0IiwiY29sdW1uS2V5cyIsInJlbmRlclR5cGUiLCJab2RBcnJheSIsIlpvZFN0cmluZyIsImluY2x1ZGVzIiwiWm9kVW5pb24iLCJvcHRpb25Ob2RlcyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsInJlc29sdmVSZW5kZXJUeXBlIiwiWm9kRGF0ZSIsImRlc2NyaXB0aW9uIiwiZW5kc1dpdGgiLCJab2ROdW1iZXIiLCJab2RCb29sZWFuIiwiWm9kRW51bSIsIlpvZFJlY29yZCIsIlpvZEFueSIsIlpvZFVua25vd24iLCJab2RMaXRlcmFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBRUQsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBRXhCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUdFQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsc0JBQXNCLEVBQ3RCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsVUFBVSxFQUNWQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsa0JBQWtCLEVBQ2xCQyxtQkFBbUIsRUFDbkJDLHNCQUFzQixFQUN0QkMsY0FBYyxFQUNkQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGFBQWEsUUFFUixvQkFBaUI7QUFDeEIsU0FBU0Ms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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sonamu",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Sonamu — TypeScript Fullstack API Framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
},
|
|
37
37
|
"repository": {
|
|
38
38
|
"type": "git",
|
|
39
|
-
"url": "https://github.com/
|
|
39
|
+
"url": "https://github.com/cartanova-ai/sonamu.git"
|
|
40
40
|
},
|
|
41
41
|
"bin": "./bin/cli.js",
|
|
42
42
|
"files": [
|
|
@@ -77,9 +77,9 @@
|
|
|
77
77
|
"tsicli": "^1.0.5",
|
|
78
78
|
"vitest": "^4.0.10",
|
|
79
79
|
"zod": "^4.1.12",
|
|
80
|
+
"@sonamu-kit/hot-hook": "^0.4.1",
|
|
80
81
|
"@sonamu-kit/hot-runner": "^0.1.1",
|
|
81
|
-
"@sonamu-kit/loader": "^2.1.3"
|
|
82
|
-
"@sonamu-kit/hot-hook": "^0.4.1"
|
|
82
|
+
"@sonamu-kit/loader": "^2.1.3"
|
|
83
83
|
},
|
|
84
84
|
"devDependencies": {
|
|
85
85
|
"@biomejs/biome": "^2.3.7",
|
|
@@ -229,7 +229,7 @@ export class BaseModelClass<
|
|
|
229
229
|
// TODO: qb의 DISTINCT가 있는 경우 처리해야 함
|
|
230
230
|
const countResult: { total?: number } = await countPuri
|
|
231
231
|
.clear("select")
|
|
232
|
-
.select({ total: Puri.rawNumber(`COUNT(*)`) })
|
|
232
|
+
.select({ total: Puri.rawNumber(`COUNT(*)::integer`) })
|
|
233
233
|
.first();
|
|
234
234
|
|
|
235
235
|
if (debug) {
|
|
@@ -261,16 +261,15 @@ export class UpsertBuilder {
|
|
|
261
261
|
.select(selectFields)
|
|
262
262
|
.whereIn("uuid", uuids as readonly string[]);
|
|
263
263
|
} else {
|
|
264
|
-
// UPSERT
|
|
264
|
+
// UPSERT 모드: onConflict로 중복 처리
|
|
265
265
|
const conflictColumns = table.uniqueIndexes[0].columns;
|
|
266
266
|
const updateColumns = Object.keys(dataChunk[0]).filter(
|
|
267
267
|
(col) => col !== "uuid" && !conflictColumns.includes(col),
|
|
268
268
|
);
|
|
269
269
|
|
|
270
|
-
// RETURNING으로 결과 받기
|
|
271
270
|
const query = wdb.insert(dataChunk).into(tableName).onConflict(conflictColumns);
|
|
272
271
|
|
|
273
|
-
// updateColumns
|
|
272
|
+
// updateColumns 유무에 따라 ignore/merge 선택하고 RETURNING으로 결과 받기
|
|
274
273
|
if (updateColumns.length === 0) {
|
|
275
274
|
resultRows = await query.ignore().returning(selectFields);
|
|
276
275
|
} else {
|
|
@@ -62,7 +62,7 @@ type AnyZodDefault = z.ZodDefault<z.ZodType>;
|
|
|
62
62
|
type AnyZodUnion = z.ZodUnion<z.ZodType[]>;
|
|
63
63
|
type AnyZodArray = z.ZodArray<z.ZodType>;
|
|
64
64
|
type AnyZodOptional = z.ZodOptional<z.ZodType>;
|
|
65
|
-
|
|
65
|
+
type AnyZodTemplateLiteral = z.ZodTemplateLiteral<string>;
|
|
66
66
|
/**
|
|
67
67
|
* Zod 타입 ID로부터 동적으로 Zod 스키마를 로드합니다.
|
|
68
68
|
* dist 디렉토리에서 ESM으로 import하여 가져옵니다.
|
|
@@ -261,7 +261,6 @@ export function propNodeToZodTypeDef(propNode: EntityPropNode, injectImportKeys:
|
|
|
261
261
|
}
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
// TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
|
|
265
264
|
export function zodTypeToTsTypeDef(zt: z.ZodType): string {
|
|
266
265
|
switch (zt.def.type) {
|
|
267
266
|
case "string":
|
|
@@ -325,12 +324,40 @@ export function zodTypeToTsTypeDef(zt: z.ZodType): string {
|
|
|
325
324
|
}
|
|
326
325
|
case "optional":
|
|
327
326
|
return `${zodTypeToTsTypeDef((zt as AnyZodOptional).def.innerType)} | undefined`;
|
|
327
|
+
case "template_literal": {
|
|
328
|
+
const def = (zt as AnyZodTemplateLiteral).def;
|
|
329
|
+
|
|
330
|
+
// 빈 template literal은 string으로 폴백
|
|
331
|
+
if (!def.parts || def.parts.length === 0) {
|
|
332
|
+
return "string";
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// 각 part를 TypeScript 타입 문자열로 변환
|
|
336
|
+
const parts = def.parts.map((part: unknown) => {
|
|
337
|
+
// 리터럴 값 (string, number, boolean, null, undefined)
|
|
338
|
+
if (typeof part === "string") {
|
|
339
|
+
return `${part}`;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// ZodType - 재귀적으로 변환
|
|
343
|
+
if (part && typeof part === "object" && (part as z.ZodType)._zod) {
|
|
344
|
+
const innerType = zodTypeToTsTypeDef(part as z.ZodType);
|
|
345
|
+
return `\${${innerType}}`;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// 폴백
|
|
349
|
+
return `\${string}`;
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
return `\`${parts.join("")}\``;
|
|
353
|
+
}
|
|
354
|
+
case "file":
|
|
355
|
+
return "File";
|
|
328
356
|
default:
|
|
329
357
|
throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|
|
330
358
|
}
|
|
331
359
|
}
|
|
332
360
|
|
|
333
|
-
// TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
|
|
334
361
|
/**
|
|
335
362
|
* Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환합니다.
|
|
336
363
|
*/
|
|
@@ -413,6 +440,31 @@ export function zodTypeToZodCode(zt: z.ZodType): string {
|
|
|
413
440
|
return `${zodTypeToZodCode((zt as z.ZodOptional<z.ZodType>).def.innerType)}.optional()`;
|
|
414
441
|
case "file":
|
|
415
442
|
return `z.file()`;
|
|
443
|
+
case "template_literal": {
|
|
444
|
+
const def = (zt as AnyZodTemplateLiteral).def;
|
|
445
|
+
|
|
446
|
+
// 빈 template literal
|
|
447
|
+
if (!def.parts || def.parts.length === 0) {
|
|
448
|
+
return "z.templateLiteral([])";
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// 각 part를 Zod 코드 문자열로 변환
|
|
452
|
+
const parts = def.parts.map((part: unknown) => {
|
|
453
|
+
// 문자열 리터럴
|
|
454
|
+
if (typeof part === "string") {
|
|
455
|
+
return `"${part}"`;
|
|
456
|
+
}
|
|
457
|
+
// ZodType - 재귀적으로 변환
|
|
458
|
+
if (part && typeof part === "object" && (part as z.ZodType)._zod) {
|
|
459
|
+
return zodTypeToZodCode(part as z.ZodType);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// 폴백
|
|
463
|
+
return "z.string()";
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
return `z.templateLiteral([${parts.join(", ")}])`;
|
|
467
|
+
}
|
|
416
468
|
case "intersection": {
|
|
417
469
|
const zIntersectionDef = (zt as z.ZodIntersection<z.ZodType, z.ZodType>).def;
|
|
418
470
|
return `z.intersection(${zodTypeToZodCode(zIntersectionDef.left)}, ${zodTypeToZodCode(zIntersectionDef.right)})`;
|