sonamu 0.11.2 → 0.11.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;AAQ1E,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAE9B,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AAQJ,qBAAa,6BAA8B,SAAQ,KAAK;aAEpC,OAAO,EAAE,eAAe,GAAG,QAAQ;IADrD,YACkB,OAAO,EAAE,eAAe,GAAG,QAAQ,EACnD,KAAK,EAAE,OAAO,EAIf;CACF;AA4BD;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,4BAA4B;IAapC,yCAAyC;IACzC,sBAAsB,IAAI,eAAe,EAAE,CAY1C;YAEa,yBAAyB;IAsCvC,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,qBAAqB;IAQ7B;;;;;OAKG;IACH,cAAc,IAAI,uBAAuB,EAAE,CAkB1C;IAED;;;;OAIG;IACG,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAmBlD;IAED;;;;;OAKG;IACG,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAwFtF;IAED;;;;OAIG;IACG,qBAAqB,CACzB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CA8C/C;IAED;;;;OAIG;IACG,gBAAgB,CAAC,cAAc,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CASnF;YAEa,qBAAqB;IASnC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CA0C1C;IAED;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAE/F;IAED;;;;;OAKG;IACG,QAAQ,CACZ,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;IAED;;;;OAIG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC,CAE1B;YAEa,qBAAqB;IAuDnC,OAAO,CAAC,UAAU;IAYlB;;;;;;OAMG;IACG,qBAAqB,CAAC,cAAc,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB7E;IAEK,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmEpE;IAED;;;;;OAKG;IACG,aAAa,CACjB,OAAO,CAAC,EAAE,mBAAmB,GAAG;QAAE,MAAM,CAAC,EAAE,eAAe,CAAA;KAAE,GAC3D,OAAO,CAAC,eAAe,CAAC,CAwG1B;CACF"}
1
+ {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;AAQ1E,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAE9B,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AAQJ,qBAAa,6BAA8B,SAAQ,KAAK;aAEpC,OAAO,EAAE,eAAe,GAAG,QAAQ;IADrD,YACkB,OAAO,EAAE,eAAe,GAAG,QAAQ,EACnD,KAAK,EAAE,OAAO,EAIf;CACF;AA4BD;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,4BAA4B;IAapC,yCAAyC;IACzC,sBAAsB,IAAI,eAAe,EAAE,CAY1C;YAEa,yBAAyB;IAsCvC,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,qBAAqB;IAQ7B;;;;;OAKG;IACH,cAAc,IAAI,uBAAuB,EAAE,CAkB1C;IAED;;;;OAIG;IACG,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAmBlD;IAED;;;;;OAKG;IACG,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAwFtF;IAED;;;;OAIG;IACG,qBAAqB,CACzB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CA8C/C;IAED;;;;OAIG;IACG,gBAAgB,CAAC,cAAc,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CASnF;YAEa,qBAAqB;IASnC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CA0C1C;IAED;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAE/F;IAED;;;;;OAKG;IACG,QAAQ,CACZ,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;IAED;;;;OAIG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC,CAE1B;YAEa,qBAAqB;IAuDnC,OAAO,CAAC,UAAU;IAYlB;;;;;;OAMG;IACG,qBAAqB,CAAC,cAAc,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB7E;IAEK,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoEpE;IAED;;;;;OAKG;IACG,aAAa,CACjB,OAAO,CAAC,EAAE,mBAAmB,GAAG;QAAE,MAAM,CAAC,EAAE,eAAe,CAAA;KAAE,GAC3D,OAAO,CAAC,eAAe,CAAC,CAwG1B;CACF"}
@@ -458,9 +458,10 @@ var init_migrator = __esmMin((() => {
458
458
  const entitySets = [...entitySetsWithJoinTable, ...joinTables];
459
459
  const codes = [];
460
460
  const batchSize = 4;
461
+ const dbSets = await PostgreSQLSchemaReader.getMigrationSetFromDBAll(compareDB);
461
462
  for (let i = 0; i < entitySets.length; i += batchSize) {
462
463
  const batchCodes = await Promise.all(entitySets.slice(i, i + batchSize).map(async (entitySet) => {
463
- const dbSet = await PostgreSQLSchemaReader.getMigrationSetFromDB(compareDB, entitySet.table);
464
+ const dbSet = dbSets.get(entitySet.table) ?? null;
464
465
  Naite.t(`migrator:compareMigrations:entitySet:${entitySet.table}`, entitySet);
465
466
  Naite.t(`migrator:compareMigrations:dbSet:${entitySet.table}`, dbSet);
466
467
  if (dbSet === null) return await generateCreateCode(entitySet);
@@ -562,4 +563,4 @@ var init_migrator = __esmMin((() => {
562
563
  init_migrator();
563
564
  export { MigrationTargetExecutionError, Migrator, init_migrator };
564
565
 
565
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9taWdyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgR2VuTWlncmF0aW9uQ29kZSwgdHlwZSBNaWdyYXRpb25TZXQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzTG9jYWwsIGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVBbHRlckNvZGUsIGdlbmVyYXRlQ3JlYXRlQ29kZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHsgZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eSB9IGZyb20gXCIuL21pZ3JhdGlvbi1zZXRcIjtcbmltcG9ydCB7IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgfSBmcm9tIFwiLi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXJcIjtcbmltcG9ydCB7IFNsYWNrQ29uZmlybSB9IGZyb20gXCIuL3NsYWNrLWNvbmZpcm1cIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29ublN0cmluZyxcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uTWV0YSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzLFxuICB0eXBlIE1pZ3JhdGlvblByb2dyZXNzRXZlbnQsXG4gIHR5cGUgTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgdHlwZSBNaWdyYXRpb25TdGF0dXMsXG4gIHR5cGUgTWlncmF0aW9uVGFyZ2V0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBNaWdyYXRpb25SZXN1bHQgPSB7XG4gIGNvbm5LZXk6IHN0cmluZztcbiAgYmF0Y2hObzogbnVtYmVyO1xuICBhcHBsaWVkOiBzdHJpbmdbXTtcbn1bXTtcblxudHlwZSBTaGFkb3dNaWdyYXRpb25UYXJnZXQgPSBFeHRyYWN0PE1pZ3JhdGlvblRhcmdldCwgXCJmaXh0dXJlXCIgfCBcInRlc3RcIj47XG5cbmZ1bmN0aW9uIHBhZERhdGVQYXJ0KG51bWJlcjogbnVtYmVyLCBzaXplOiBudW1iZXIgPSAyKTogc3RyaW5nIHtcbiAgcmV0dXJuIG51bWJlci50b1N0cmluZygpLnBhZFN0YXJ0KHNpemUsIFwiMFwiKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29ubktleTogTWlncmF0aW9uVGFyZ2V0IHwgXCJzaGFkb3dcIixcbiAgICBjYXVzZTogdW5rbm93bixcbiAgKSB7XG4gICAgc3VwZXIoY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8g66eI7J206re466CI7J207IWYIOyDge2DnCDsobDtmowg7IucIERCIOyXsOqysCDtmZXsnbgg7YOA7J6E7JWE7JuDKG1zKS5cbi8vIGNyZWF0ZUtuZXhJbnN0YW5jZeydmCDsu6TrhKXshZgg7ZqN65OdIO2DgOyehOyVhOybgygzMOy0iCnsl5Agc3RhdHVzL2xpc3QvY3VycmVudFZlcnNpb27snbRcbi8vIOqwgeqwgSDqsbjrpqzrqbQgQ0xJL1VJ6rCAIOy1nOuMgCDsiJjsi60g7LSIIGhhbmftlZzri6QuIOygleyDgSDsnZHri7XsnYAg7IiY67CxIG1z7J2066+A66GcIDXstIjrqbQg7Lap67aE7ZWY64ukLlxuY29uc3QgTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyA9IDUwMDA7XG5jb25zdCBMT0NBTF9EQl9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5cbi8qKlxuICog7KO87Ja07KeEIFByb21pc2XqsIAgbXMg7JWI7JeQIOyZhOujjOuQmOyngCDslYrsnLzrqbQgb25UaW1lb3V0IOyXkOufrOuhnCByZWplY3TtlZzri6QuXG4gKiDsm5Drs7ggUHJvbWlzZSDsnpDssrTripQg6rOE7IaNIOynhO2WieuQmOuvgOuhnCwg7Zi47Lac7Lih7JeQ7IScIOy7pOuEpeyFmCDsoJXrpqwoZGVzdHJveSnrpbwg7LGF7J6E7KeE64ukLlxuICovXG5mdW5jdGlvbiB3aXRoVGltZW91dDxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBtczogbnVtYmVyLCBvblRpbWVvdXQ6ICgpID0+IEVycm9yKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChvblRpbWVvdXQoKSksIG1zKTtcbiAgICBwcm9taXNlLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIE5vdGUgMjAyNi0wOC0yNiwg67OR7KSAXG4gKiDsnbQg7YG0656Y7Iqk7JeQ7IScIGRlcHJlY2F0ZWQg67aZ7Ja07J6I64qUIOy5nOq1rOuTpOydgCDtmIQgQ0xJ66W8IOychO2VnCDtlZjsnIQg7Zi47ZmY7J2064uILFxuICogQ0xJIOumrO2Mqe2GoOungSDsi5zsoJDsl5DshJwg7KCc6rGw7ZW07KO87IWU64+EIOustOuwqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1pZ3JhdG9yIHtcbiAgcHJpdmF0ZSBpc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yPFZhbHVlPihlcnJvcjogVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzT2JqZWN0VmFsdWUoZXJyb3IpIHx8IGVycm9yID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbWF5YmVQb3N0Z3Jlc0Vycm9yID1cbiAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZXJyb3IgYXMge1xuICAgICAgICBjb2RlPzogdW5rbm93bjtcbiAgICAgIH07XG4gICAgLy8gUG9zdGdyZVNRTCB1bmRlZmluZWRfdGFibGUg7L2U65Oc64qUIOyCrOyaqeyekCDsp4DsoJUgbWlncmF0aW9uIHRhYmxl7JeQ64+EIOuPmeydvO2VmOqyjCDsoIHsmqnrkKnri4jri6QuXG4gICAgcmV0dXJuIG1heWJlUG9zdGdyZXNFcnJvci5jb2RlID09PSBcIjQyUDAxXCI7XG4gIH1cblxuICAvKiog7ZiE7J6sIOyLpO2WiSDtmZjqsr3sl5DshJwg7ZeI7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDrjIDsg4Eg7YKk66W8IOuwmO2ZmO2VqeuLiOuLpC4gKi9cbiAgZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpOiBNaWdyYXRpb25UYXJnZXRbXSB7XG4gICAgY29uc3QgY29ubktleXMgPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBPYmplY3Qua2V5cyhcbiAgICAgICAgU29uYW11LmRiQ29uZmlnLFxuICAgICAgKS5maWx0ZXIoKGtleSkgPT4gIWtleS5lbmRzV2l0aChcIl9yZWFkb25seVwiKSkgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgcmV0dXJuIGNvbm5LZXlzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICByZXR1cm4gY29ubktleXMuZmlsdGVyKChrZXkpID0+IGtleSA9PT0gZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KFxuICAgIGNvbm5zOiB7IGNvbm5LZXk6IGtleW9mIFNvbmFtdURCQ29uZmlnOyBrbmV4OiBLbmV4IH1bXSxcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHQgPSBbXTtcblxuICAgIGZvciAoY29uc3QgeyBjb25uS2V5LCBrbmV4IH0gb2YgY29ubnMpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKGFjdGlvbiwgY29ubktleSwgb3B0aW9ucyk7XG4gICAgICBsZXQgbWlncmF0aW9uUmVzdWx0OiBbbnVtYmVyLCBzdHJpbmdbXV07XG4gICAgICB0cnkge1xuICAgICAgICBtaWdyYXRpb25SZXN1bHQgPVxuICAgICAgICAgIGFjdGlvbiA9PT0gXCJhcHBseVwiXG4gICAgICAgICAgICA/IGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpXG4gICAgICAgICAgICA6IGF3YWl0IGtuZXgubWlncmF0ZS5yb2xsYmFjayhwcm9ncmVzcyk7XG4gICAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgICAgLy8gbGlmZWN5Y2xlIGhvb2sg7J207KCE7J2YIOyXsOqysMK3bG9ja8K366qp66GdIOyhsO2ajCDsi6TtjKjrj4Qg7Iuk7KCcIOuMgOyDgSBEQuyXkCDqt4Dsho3tlanri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25UYXJnZXRFeGVjdXRpb25FcnJvcihjb25uS2V5LCBjYXVnaHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gbWlncmF0aW9uUmVzdWx0O1xuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBjb25uS2V5LFxuICAgICAgICBiYXRjaE5vLFxuICAgICAgICBhcHBsaWVkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhvcHRpb25zLCB7XG4gICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgZmlsZXM6IGFwcGxpZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgbWlncmF0aW9uTmFtZTxWYWx1ZT4obWlncmF0aW9uOiBWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKGlzU3RyaW5nVmFsdWUobWlncmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUobWlncmF0aW9uKTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUobWlncmF0aW9uKSAmJiBtaWdyYXRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gbWlncmF0aW9uIGFzIHtcbiAgICAgICAgICBmaWxlPzogdW5rbm93bjtcbiAgICAgICAgICBuYW1lPzogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNhbmRpZGF0ZS5maWxlKSkge1xuICAgICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjYW5kaWRhdGUuZmlsZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShjYW5kaWRhdGUubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUoY2FuZGlkYXRlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG1pZ3JhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm9ncmVzcyhvcHRpb25zOiBNaWdyYXRpb25SdW5PcHRpb25zIHwgdW5kZWZpbmVkLCBldmVudDogTWlncmF0aW9uUHJvZ3Jlc3NFdmVudCkge1xuICAgIHRyeSB7XG4gICAgICBvcHRpb25zPy5vblByb2dyZXNzPy4oZXZlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDsp4TtlonrpaAg7IaM67mE7J6Q7J2YIOyLpO2MqOqwgCDsnbTrr7gg7Iuc7J6R7ZWcIERCIOyekeyXheqzvCDsoJXrpqzrpbwg67Cp7ZW07ZWY66m0IOyViCDrkKnri4jri6QuXG4gICAgICBjb25zb2xlLndhcm4oXCJNaWdyYXRpb24gcHJvZ3Jlc3Mgb2JzZXJ2ZXIgZmFpbGVkOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQcm9ncmVzc0hvb2tzKFxuICAgIGFjdGlvbjogTWlncmF0aW9uQWN0aW9uLFxuICAgIGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCB8IFwic2hhZG93XCIsXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IEtuZXguTWlncmF0b3JDb25maWdXaXRoTGlmZWN5Y2xlSG9va3Mge1xuICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbWl0RmlsZSA9IDxWYWx1ZT4odHlwZTogXCJmaWxlLXN0YXJ0XCIgfCBcImZpbGUtZXhlY3V0ZWRcIiwgbWlncmF0aW9uOiBWYWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMubWlncmF0aW9uTmFtZShtaWdyYXRpb24pO1xuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLm1heChmaWxlcy5pbmRleE9mKGZpbGUpLCAwKTtcbiAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb25uS2V5LFxuICAgICAgICBmaWxlLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdG90YWw6IGZpbGVzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgYmVmb3JlQWxsOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgZmlsZXMgPSBtaWdyYXRpb25zLm1hcCgobWlncmF0aW9uKSA9PiB0aGlzLm1pZ3JhdGlvbk5hbWUobWlncmF0aW9uKSk7XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHsgdHlwZTogXCJ0YXJnZXQtc3RhcnRcIiwgYWN0aW9uLCBjb25uS2V5LCBmaWxlcyB9KTtcbiAgICAgIH0sXG4gICAgICBiZWZvcmVFYWNoOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgbWlncmF0aW9ucy5mb3JFYWNoKChtaWdyYXRpb24pID0+IGVtaXRGaWxlKFwiZmlsZS1zdGFydFwiLCBtaWdyYXRpb24pKTtcbiAgICAgIH0sXG4gICAgICBhZnRlckVhY2g6IGFzeW5jIChfa25leCwgbWlncmF0aW9ucykgPT4ge1xuICAgICAgICBtaWdyYXRpb25zLmZvckVhY2goKG1pZ3JhdGlvbikgPT4gZW1pdEZpbGUoXCJmaWxlLWV4ZWN1dGVkXCIsIG1pZ3JhdGlvbikpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRNaWdyYXRpb25UYXJnZXQoY29ubktleTogTWlncmF0aW9uVGFyZ2V0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5pbmNsdWRlcyhjb25uS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlncmF0aW9uIHRhcmdldCBpcyBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke1N0cmluZyhjb25uS2V5KX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOuMgOyDgSDsu6TrhKXshZjsnZgg7KCV7KCBIOuplO2DgOuNsOydtO2EsOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqIERC7JeQIOyXsOqysO2VmOyngCDslYrsnLzrr4DroZwgQ0xJ7JmAIFdlYuydtCDsg4Htg5wg7KGw7ZqMIOyghOyXkCDsponsi5wg7IKs7Jqp7ZWgIOyImCDsnojsirXri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvbnMoKTogTWlncmF0aW9uQ29ubmVjdGlvbk1ldGFbXSB7XG4gICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgIHJldHVybiB0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5tYXAoKGNvbm5LZXkpID0+IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgICBjb25uS2V5XG4gICAgICAgIF0uY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgIGNvbnN0IGhvc3QgPSBjb25uZWN0aW9uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIG5hbWU6IFN0cmluZyhjb25uS2V5KSxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydDogY29ubmVjdGlvbi5wb3J0ID8/IDU0MzIsXG4gICAgICAgIGRhdGFiYXNlOiBjb25uZWN0aW9uLmRhdGFiYXNlID8/IFwiXCIsXG4gICAgICAgIHJlbW90ZTogIUxPQ0FMX0RCX0hPU1RTLmhhcyhob3N0LnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICByZXF1aXJlc0FwcHJvdmFsOiBzbGFja0NvbmZpcm0uaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKGNvbm5LZXkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshozsiqTsl5Ag7KG07J6s7ZWY64qUIOuniOydtOq3uOugiOydtOyFmCDtjIzsnbwg66qp66Gd7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25Db2RlcygpOiBQcm9taXNlPE1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHNyY01pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcIm1pZ3JhdGlvbnNcIik7IC8vIOydtOqxtCDtmZjqsr3sl5Ag6rSA6rOE7JeG7J20IO2VreyDgSBzcmPsl5DshJwg7LC+7JWE7JW8IO2VtOyalC5cblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNNaWdyYXRpb25zRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHNyY01pZ3JhdGlvbnNEaXIsIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29kZXMgPSAoYXdhaXQgcmVhZGRpcihzcmNNaWdyYXRpb25zRGlyKSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICBuYW1lOiBmLnJlcGxhY2UoXCIudHNcIiwgXCJcIiksXG4gICAgICAgIHBhdGg6IHBhdGguam9pbihzcmNNaWdyYXRpb25zRGlyLCBmKSxcbiAgICAgIH0pKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gMSA6IC0xKSk7IC8vIOydtOumhCDrgrTrprzssKjsiJwg7KCV66CsKOy1nOyLoOyInClcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRNaWdyYXRpb25Db2RlczpyZXN1bHRzXCIsIGNvZGVzKTtcbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICog7Luk64Sl7IWYIO2VmOuCmOydmCDtmITsnqwg67KE7KCE6rO8IHBlbmRpbmcg66qp66Gd7J2EIOuPheumveyggeycvOuhnCDsobDtmoztlanri4jri6QuXG4gICAqIOyXrOufrCDrjIDsg4HsnYAg7Zi47Lac7J6Q6rCAIOuzkeugrOuhnCDsobDrpr3tlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRDb25uZWN0aW9uU3RhdHVzKGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCk6IFByb21pc2U8TWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cz4ge1xuICAgIHRoaXMuYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KGNvbm5LZXkpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5nZXRNaWdyYXRpb25Db2RlcygpO1xuICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIC8vIFNBRkVUWTogS25leOqwgCDsoJzqs7XtlZwgUG9zdGdyZVNRTCDsl7DqsrAg6rWs7ISx7J2EIOuzteyCrO2VtCB0aW1lb3V0IO2VhOuTnOunjCDrja7slrTsk7Tri6QuXG4gICAgY29uc3QgdENvbm4gPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4ua25leE9wdGlvbnMsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5lY3Rpb24sXG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgfSxcbiAgICAgIHBvb2w6IHtcbiAgICAgICAgLi4ua25leE9wdGlvbnMucG9vbCxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBhY3F1aXJlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgY3JlYXRlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgcHJvcGFnYXRlQ3JlYXRlRXJyb3I6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhUaW1lb3V0KHRDb25uLnJhdyhcInNlbGVjdCAxXCIpLCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgICAgYERCIOyXsOqysCDsi5zqsIQg7LSI6rO8ICgke01JR1JBVElPTl9DT05OX1RJTUVPVVRfTVN9bXMpIOKAlCAke2Nvbm5lY3Rpb24uaG9zdH06JHtjb25uZWN0aW9uLnBvcnR9LyR7Y29ubmVjdGlvbi5kYXRhYmFzZX1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc3RhdHVzOiBudW1iZXIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlLnN0YXR1cygpLmNhdGNoKChjYXVnaHQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNaXNzaW5nTWlncmF0aW9uVGFibGVFcnJvcihjYXVnaHQpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvZGVzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvciA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgICAgcmV0dXJuIFwiZXJyb3JcIiBhcyBjb25zdDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGVuZGluZzogc3RyaW5nW10gPSBhd2FpdCB0Q29ubi5taWdyYXRlLmxpc3QoKS50aGVuKFxuICAgICAgICAoWywgZmlsZXNdOiBbdW5rbm93bltdLCB7IGZpbGU6IHN0cmluZyB9W11dKSA9PlxuICAgICAgICAgIGZpbGVzLm1hcCgoeyBmaWxlIH0pID0+IGZpbGUucmVwbGFjZSgvXFwudHMkLywgXCJcIikpLFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVzLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgXCJub25lXCIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlXG4gICAgICAgIC5jdXJyZW50VmVyc2lvbigpXG4gICAgICAgIC5jYXRjaCgoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwibm9uZVwiIGFzIGNvbnN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBcImVycm9yXCIgYXMgY29uc3Q7XG4gICAgICAgIH0pO1xuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpzdGF0dXNcIiwgc3RhdHVzKTtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25TdGF0dXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXMgPSB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHBlbmRpbmcsXG4gICAgICAgIGxhdGVuY3lNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICB9O1xuICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIGNvbm5lY3Rpb25TdGF0dXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgIHJldHVybiBjb25uZWN0aW9uU3RhdHVzO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBjYXVnaHQgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodC5tZXNzYWdlIDogU3RyaW5nKGNhdWdodCk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgJHtTdHJpbmcoY29ubktleSl97J2YIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zrpbwg6rCA7KC47Jik64qUIOuNsOyXkCDsi6TtjKjtlZjsmIDsirXri4jri6QuXFxuJHtlcnJvcn1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBcImVycm9yXCIsXG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBwZW5kaW5nOiBbXSxcbiAgICAgICAgbGF0ZW5jeU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB3aXRoVGltZW91dCh0Q29ubi5kZXN0cm95KCksIE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZGVzdHJveSB0aW1lb3V0XCIpO1xuICAgICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5DshJwg6rCA7J6lIOy1nOq3vOyXkCDsoIHsmqnrkJwgbWlncmF0aW9uIGJhdGNo66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RBcHBsaWVkQmF0Y2goXG4gICAgY29ubktleTogTWlncmF0aW9uVGFyZ2V0LFxuICApOiBQcm9taXNlPHsgYmF0Y2hObzogbnVtYmVyOyBmaWxlczogc3RyaW5nW10gfT4ge1xuICAgIHRoaXMuYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KGNvbm5LZXkpO1xuICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IHRDb25uID0gY3JlYXRlS25leEluc3RhbmNlKHtcbiAgICAgIC4uLmtuZXhPcHRpb25zLFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi5jb25uZWN0aW9uLFxuICAgICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgIH0sXG4gICAgICBwb29sOiB7XG4gICAgICAgIC4uLmtuZXhPcHRpb25zLnBvb2wsXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgYWNxdWlyZVRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgIGNyZWF0ZVRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgIHByb3BhZ2F0ZUNyZWF0ZUVycm9yOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBrbmV4T3B0aW9ucy5taWdyYXRpb25zPy50YWJsZU5hbWUgPz8gXCJrbmV4X21pZ3JhdGlvbnNcIjtcbiAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBrbmV4T3B0aW9ucy5taWdyYXRpb25zPy5zY2hlbWFOYW1lO1xuICAgICAgY29uc3QgbWlncmF0aW9uc1RhYmxlID1cbiAgICAgICAgc2NoZW1hTmFtZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0Q29ubjx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgYmF0Y2g6IG51bWJlciB9Pih0YWJsZU5hbWUpXG4gICAgICAgICAgOiB0Q29ubjx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgYmF0Y2g6IG51bWJlciB9Pih0YWJsZU5hbWUpLndpdGhTY2hlbWEoc2NoZW1hTmFtZSk7XG4gICAgICBjb25zdCBsYXRlc3QgPSBhd2FpdCBtaWdyYXRpb25zVGFibGUuY2xvbmUoKS5zZWxlY3QoXCJiYXRjaFwiKS5vcmRlckJ5KFwiYmF0Y2hcIiwgXCJkZXNjXCIpLmZpcnN0KCk7XG4gICAgICBpZiAobGF0ZXN0ID09PSB1bmRlZmluZWQpIHJldHVybiB7IGJhdGNoTm86IDAsIGZpbGVzOiBbXSB9O1xuXG4gICAgICAvLyDqsJnsnYAgYmF0Y2gg7JWI7JeQ7ISc64qUIEtuZXgg7Iuk7ZaJIOyInOyEnOuMgOuhnCDroaTrsLEg6rOE7ZqN7J2EIOqzoOygle2VnOuLpC5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBtaWdyYXRpb25zVGFibGVcbiAgICAgICAgLmNsb25lKClcbiAgICAgICAgLnNlbGVjdChcIm5hbWVcIilcbiAgICAgICAgLndoZXJlKFwiYmF0Y2hcIiwgbGF0ZXN0LmJhdGNoKVxuICAgICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmF0Y2hObzogbGF0ZXN0LmJhdGNoLFxuICAgICAgICBmaWxlczogcm93cy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lLnJlcGxhY2UoL1xcLnRzJC8sIFwiXCIpKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdWdodCkpIHJldHVybiB7IGJhdGNoTm86IDAsIGZpbGVzOiBbXSB9O1xuICAgICAgdGhyb3cgY2F1Z2h0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0Q29ubi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOy1nOyLoCDsg4Htg5zsnbgg6riw7KSAIERC7JmAIOyXlO2LsO2LsCDsoJXsnZjrpbwg67mE6rWQ7ZW0IOyDneyEsSDsmIjsoJUg7L2U65Oc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvblN0YXR1cyhjb21wYXJlQ29ubktleSk7XG4gICAgaWYgKHN0YXR1cy5zdGF0dXMgIT09IDAgfHwgc3RhdHVzLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiBjb21wYXJpc29uIHJlcXVpcmVzIGFuIHVwLXRvLWRhdGUgZGF0YWJhc2U6ICR7U3RyaW5nKGNvbXBhcmVDb25uS2V5KX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlV2l0aENvbm5lY3Rpb24oY29tcGFyZUNvbm5LZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb21wYXJlV2l0aENvbm5lY3Rpb24oY29tcGFyZUNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCkge1xuICAgIGNvbnN0IGNvbXBhcmVEQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbY29tcGFyZUNvbm5LZXldKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY29tcGFyZURCLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQg7Iug6recIFVJ7JeQ7ISc64qUIOy7pOuEpeyFmOuzhCDsobDtmowgQVBJ66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgICog6riw7KG0IENMSeyZgCDsiqTtgazrpr3tirgg7Zi47ZmY7J2EIOychO2VtCDsoITssrQg7IOB7YOc66W8IOyhsOumve2VqeuLiOuLpC5cbiAgICogQGNhdGVnb3J5IO2YuO2ZmOyaqSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRTdGF0dXMoKTogUHJvbWlzZTxNaWdyYXRpb25TdGF0dXM+IHtcbiAgICBjb25zdCBbY29kZXMsIGNvbm5lY3Rpb25zXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuZ2V0TWlncmF0aW9uQ29kZXMoKSxcbiAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLmdldENvbm5lY3Rpb25zKCkpLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29kZXNcIiwgY29kZXMpO1xuXG4gICAgY29uc3QgY29ubmVjdGlvblN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25uZWN0aW9ucy5tYXAoKHsgY29ubktleSB9KSA9PiB0aGlzLmdldENvbm5lY3Rpb25TdGF0dXMoY29ubktleSkpLFxuICAgICk7XG4gICAgY29uc3QgY29ubnMgPSBjb25uZWN0aW9ucy5tYXAoKGNvbm5lY3Rpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBjb25uZWN0aW9uU3RhdHVzZXNbaW5kZXhdO1xuICAgICAgYXNzZXJ0KHN0YXR1cyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWQgPVxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgICBjb25uZWN0aW9uLmNvbm5LZXlcbiAgICAgICAgXS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogY29ubmVjdGlvbi5uYW1lLFxuICAgICAgICBjb25uS2V5OiBjb25uZWN0aW9uLmNvbm5LZXksXG4gICAgICAgIGNvbm5TdHJpbmc6XG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBgcGc6Ly8ke2NvbmZpZ3VyZWQudXNlciA/PyBcIlwifUAke2NvbmZpZ3VyZWQuaG9zdH06JHtjb25maWd1cmVkLnBvcnR9LyR7Y29uZmlndXJlZC5kYXRhYmFzZX1gIGFzIENvbm5TdHJpbmcsXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBzdGF0dXMuY3VycmVudFZlcnNpb24sXG4gICAgICAgIHN0YXR1czogc3RhdHVzLnN0YXR1cyxcbiAgICAgICAgcGVuZGluZzogc3RhdHVzLnBlbmRpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29ubnNcIiwgY29ubnMpO1xuXG4gICAgY29uc3QgY29tcGFyZUNvbm4gPSBjb25uZWN0aW9uU3RhdHVzZXMuZmluZChcbiAgICAgICh7IHN0YXR1cywgZXJyb3IgfSkgPT4gc3RhdHVzID09PSAwICYmIGVycm9yID09PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICBjb25zdCBwcmVwYXJlZENvZGVzID1cbiAgICAgIGNvbXBhcmVDb25uID09PSB1bmRlZmluZWQgPyBbXSA6IGF3YWl0IHRoaXMuY29tcGFyZVdpdGhDb25uZWN0aW9uKGNvbXBhcmVDb25uLmNvbm5LZXkpO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6cHJlcGFyZWRDb2Rlc1wiLCBwcmVwYXJlZENvZGVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb25ucyxcbiAgICAgIGNvZGVzLFxuICAgICAgcHJlcGFyZWRDb2RlcyxcbiAgICAgIGVycm9yOiBjb25uZWN0aW9uU3RhdHVzZXMuZmluZCgoeyBlcnJvciB9KSA9PiBlcnJvciAhPT0gdW5kZWZpbmVkKT8uZXJyb3IsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5AgcGVuZGluZyDrp4jsnbTqt7jroIjsnbTshZjsnYQg7KCB7Jqp7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIOqwmeydgCDrqZTshJzrk5zrpbwg7IKs7Jqp7ZWY66mwLCBXZWLsnYAgYG9uUHJvZ3Jlc3Ng66W8IHN0cmVhbeycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgYXBwbHkodGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW5BY3Rpb25XaXRoUHJvZ3Jlc3MoXCJhcHBseVwiLCB0YXJnZXRzLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5DshJwg6rCA7J6lIOy1nOq3vCBtaWdyYXRpb24gYmF0Y2jrpbwg66Gk67Cx7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIOqwmeydgCDrqZTshJzrk5zrpbwg7IKs7Jqp7ZWY66mwLCBXZWLsnYAgYG9uUHJvZ3Jlc3Ng66W8IHN0cmVhbeycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcm9sbGJhY2soXG4gICAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuQWN0aW9uV2l0aFByb2dyZXNzKFwicm9sbGJhY2tcIiwgdGFyZ2V0cywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgYWN0aW9uIOusuOyekOyXtCDrjIDsi6Age0BsaW5rIGFwcGx5fSDrmJDripQge0BsaW5rIHJvbGxiYWNrfeydhCDsp4HsoJEg7IKs7Jqp7ZWp64uI64ukLlxuICAgKiDquLDsobQg7Jm467aAIO2YuOy2nOydmCDtlZjsnIQg7Zi47ZmY66eM7J2EIOychO2VtCDsnKDsp4Dtlanri4jri6QuXG4gICAqIEBjYXRlZ29yeSDtmLjtmZjsmqkg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcnVuQWN0aW9uKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gYWN0aW9uID09PSBcImFwcGx5XCIgPyB0aGlzLmFwcGx5KHRhcmdldHMpIDogdGhpcy5yb2xsYmFjayh0YXJnZXRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWN0aW9uV2l0aFByb2dyZXNzKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICAgIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246YWN0aW9uXCIsIGFjdGlvbik7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjp0YXJnZXRzXCIsIHRhcmdldHMpO1xuXG4gICAgY29uc3QgYWxsb3dlZFRhcmdldHMgPSBuZXcgU2V0KHRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpKTtcbiAgICBjb25zdCBkaXNhbGxvd2VkVGFyZ2V0cyA9IHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFhbGxvd2VkVGFyZ2V0cy5oYXModGFyZ2V0KSk7XG4gICAgaWYgKGRpc2FsbG93ZWRUYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiB0YXJnZXRzIGFyZSBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke2Rpc2FsbG93ZWRUYXJnZXRzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdW5pcSBrbmV4IGNvbmZpZ3NcbiAgICBjb25zdCBjb25maWdzID0gdW5pcXVlKFxuICAgICAgdGFyZ2V0c1xuICAgICAgICAubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgICAgICAgY29ubktleTogdGFyZ2V0LFxuICAgICAgICAgIG9wdGlvbnM6IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXRdLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy5vcHRpb25zICE9PSB1bmRlZmluZWQpLFxuICAgICAgKHsgb3B0aW9uczogZGJPcHRpb25zIH0pID0+XG4gICAgICAgIGAkey8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKGRiT3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5ob3N0fToke1xuICAgICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZGJPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWdcbiAgICAgICAgICApLnBvcnQgPz8gNTQzMlxuICAgICAgICB9LyR7LyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoZGJPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlfWAsXG4gICAgKTtcblxuICAgIC8vIGdldCBjb25uZWN0aW9uc1xuICAgIGNvbnN0IGNvbm5zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25maWdzLm1hcChhc3luYyAoY29uZmlnKSA9PiAoe1xuICAgICAgICBjb25uS2V5OiBjb25maWcuY29ubktleSxcbiAgICAgICAga25leDogY3JlYXRlS25leEluc3RhbmNlKGNvbmZpZy5vcHRpb25zKSxcbiAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuTWlncmF0aW9uc1NlcXVlbnRpYWxseShjb25ucywgYWN0aW9uLCBvcHRpb25zKTtcblxuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjpyZXN1bHRcIiwgcmVzdWx0KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNvbm5zLm1hcCgoeyBrbmV4IH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ga25leC5kZXN0cm95KCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbkRhdGVUYWcoaW5kZXg6IG51bWJlciwgYmFzZURhdGU6IERhdGUgPSBuZXcgRGF0ZSgpKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYmFzZURhdGUuZ2V0VGltZSgpICsgaW5kZXggKiAxMDAwKTtcbiAgICByZXR1cm4gKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXREYXRlKCkpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0SG91cnMoKSkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0U2Vjb25kcygpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg6rCc7IiYXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVByZXBhcmVkQ29kZXMoY29tcGFyZUNvbm5LZXk/OiBNaWdyYXRpb25UYXJnZXQpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHByZXBhcmVkQ29kZXMgPVxuICAgICAgY29tcGFyZUNvbm5LZXkgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChhd2FpdCB0aGlzLmdldFN0YXR1cygpKS5wcmVwYXJlZENvZGVzXG4gICAgICAgIDogYXdhaXQgdGhpcy5nZXRQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5KTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVQcmVwYXJlZENvZGVzOnByZXBhcmVkQ29kZXNcIiwgcHJlcGFyZWRDb2Rlcyk7XG4gICAgaWYgKHByZXBhcmVkQ29kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlxcbu2YhOyerCDrqqjrkZAg7Iux7YGs65CcIOyDge2DnOyeheuLiOuLpC5cIikpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8g7Iuk7KCcIOy9lOuTnCDsg53shLFcbiAgICBjb25zdCBtaWdyYXRpb25zRGlyID0gYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvbWlncmF0aW9uc2A7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGNvZGVdIG9mIHByZXBhcmVkQ29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGNvZGUuZm9ybWF0dGVkKSB7XG4gICAgICAgIGNvbnN0IGRhdGVUYWcgPSB0aGlzLmdlbkRhdGVUYWcoaW5kZXgpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke21pZ3JhdGlvbnNEaXJ9LyR7ZGF0ZVRhZ31fJHtwY29kZS50aXRsZX0udHNgO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIHBjb2RlLmZvcm1hdHRlZCk7XG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgTUlHUkFUSU9OIENSRUFURUQgJHtmaWxlUGF0aH1gKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXBhcmVkQ29kZXMubGVuZ3RoO1xuICB9XG5cbiAgYXN5bmMgY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCOiBLbmV4KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgICAvLyBFbnRpdHkg7Iic7ZqM7ZWY7JesIOyLse2BrFxuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIEVudGl0eeyXkOyEnCBNaWdyYXRpb25TZXQg7LaU7LacXG4gICAgY29uc3QgZW50aXR5U2V0c1dpdGhKb2luVGFibGUgPSBlbnRpdHlJZHNcbiAgICAgIC5maWx0ZXIoKGVudGl0eUlkKSA9PiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMubGVuZ3RoID4gMClcbiAgICAgIC5tYXAoKGVudGl0eUlkKSA9PiBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5KEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKSkpO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iU66eMIOy2lOy2nFxuICAgIGNvbnN0IGpvaW5UYWJsZXNXaXRoRHVwID0gZW50aXR5U2V0c1dpdGhKb2luVGFibGUuZmxhdE1hcCgoZW50aXR5U2V0KSA9PiBlbnRpdHlTZXQuam9pblRhYmxlcyk7XG4gICAgLy8g7KSR67O1IOygnOqxsCAo7KSR67O17J24IOqyveyasCBpbmRleGVz66W8IOuzke2VqSlcbiAgICBjb25zdCBqb2luVGFibGVzID0gT2JqZWN0LnZhbHVlcyhncm91cChqb2luVGFibGVzV2l0aER1cCwgKGp0KSA9PiBqdC50YWJsZSkpLm1hcCgodGFibGVzKSA9PiB7XG4gICAgICBhc3NlcnQodGFibGVzICE9PSB1bmRlZmluZWQsIFwidGFibGVzIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGlmICh0YWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0YWJsZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50YWJsZXNbMF0sXG4gICAgICAgIGluZGV4ZXM6IHVuaXF1ZShcbiAgICAgICAgICB0YWJsZXMuZmxhdE1hcCgodCkgPT4gdC5pbmRleGVzKSxcbiAgICAgICAgICAoaW5kZXgpID0+IFtpbmRleC50eXBlLCAuLi5pbmRleC5jb2x1bW5zXS5qb2luKFwiLVwiKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIE1pZ3JhdGlvblNldCDrsLDsl7RcbiAgICBjb25zdCBlbnRpdHlTZXRzOiBNaWdyYXRpb25TZXRbXSA9IFsuLi5lbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSwgLi4uam9pblRhYmxlc107XG5cbiAgICBjb25zdCBjb2RlczogR2VuTWlncmF0aW9uQ29kZVtdID0gW107XG4gICAgY29uc3QgYmF0Y2hTaXplID0gNDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50aXR5U2V0cy5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICBjb25zdCBiYXRjaENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGVudGl0eVNldHMuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSkubWFwKGFzeW5jIChlbnRpdHlTZXQpID0+IHtcbiAgICAgICAgICBjb25zdCBkYlNldCA9IGF3YWl0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIuZ2V0TWlncmF0aW9uU2V0RnJvbURCKFxuICAgICAgICAgICAgY29tcGFyZURCLFxuICAgICAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZW50aXR5U2V0OiR7ZW50aXR5U2V0LnRhYmxlfWAsIGVudGl0eVNldCk7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZGJTZXQ6JHtlbnRpdHlTZXQudGFibGV9YCwgZGJTZXQpO1xuXG4gICAgICAgICAgaWYgKGRiU2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyDquLDsobQg7YWM7J2067iUIOyXhuydjCwg7IOI66GcIO2FjOydtOu4lCDsg53shLFcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGUoZW50aXR5U2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g6riw7KG0IO2FjOydtOu4lCDsobTsnqztlZjripQg7LyA7J207IqkXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGUoZW50aXR5U2V0LCBkYlNldCwgY29tcGFyZURCKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgY29kZXMucHVzaCguLi5iYXRjaENvZGVzLmZsYXQoKSk7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsIO2DgOyeheydtCDslZ7snLzroZwsIGZvcmVpZ27snbQg65Kk66GcXG4gICAgY29kZXMuc29ydCgoY29kZUEsIGNvZGVCKSA9PiB7XG4gICAgICBpZiAoY29kZUEudHlwZSA9PT0gXCJmb3JlaWduXCIgJiYgY29kZUIudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZUEudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBjb2RlQi50eXBlID09PSBcImZvcmVpZ25cIikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiB0ZXN0IERC7J2YIHNuYXBzaG907Jy866GcIOyehOyLnCBTaGFkb3cgRELrpbwg66eM65Ok6rOgIOyghOyytCDrp4jsnbTqt7jroIjsnbTshZjsnYQg6rKA7Kad7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIGBvblByb2dyZXNzYCDsnKDrrLTrp4wg64us66as7ZW0IOqwmeydgCDsi6Ttlokg7J2Y66+466W8IOqzteycoO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIHJ1blNoYWRvd1Rlc3QoXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMgJiB7IHRhcmdldD86IE1pZ3JhdGlvblRhcmdldCB9LFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnM/LnRhcmdldCA/PyBcInRlc3RcIjtcbiAgICBpZiAodGFyZ2V0ICE9PSBcInRlc3RcIiAmJiB0YXJnZXQgIT09IFwiZml4dHVyZVwiKSB7XG4gICAgICAvLyDsmrTsmIEg6rOE7Je0IERC64qUIOyEpOyglSDsobDtmozrgpgg7Jew6rKwIOyDneyEseuztOuLpCDrqLzsoIAg7LCo64uo7ZWc64ukLlxuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYOyngOybkO2VmOyngCDslYrripQgU2hhZG93IOuniOydtOq3uOugiOydtOyFmCDrjIDsg4HsnoXri4jri6Q6ICR7dGFyZ2V0fWApLCB7XG4gICAgICAgIGNvZGU6IFwiSU5WQUxJRF9TSEFET1dfTUlHUkFUSU9OX1RBUkdFVFwiLFxuICAgICAgICB0YXJnZXQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2hhZG93VGFyZ2V0OiBTaGFkb3dNaWdyYXRpb25UYXJnZXQgPSB0YXJnZXQ7XG4gICAgY29uc3QgYmFzZVRhcmdldENvbm4gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXUuZGJDb25maWdbXG4gICAgICAgIHNoYWRvd1RhcmdldFxuICAgICAgXS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IGNvbmZpZ3VyZWREYXRhYmFzZSA9IGJhc2VUYXJnZXRDb25uLmRhdGFiYXNlO1xuICAgIGlmICghY29uZmlndXJlZERhdGFiYXNlKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgU2hhZG93IOuMgOyDgSBEQiDsnbTrpoTsnbQg7JeG7Iq164uI64ukOiAke3NoYWRvd1RhcmdldH1gKSwge1xuICAgICAgICBjb2RlOiBcIklOVkFMSURfU0hBRE9XX0RBVEFCQVNFX0NPTkZJR1wiLFxuICAgICAgICB0YXJnZXQ6IHNoYWRvd1RhcmdldCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB3b3JrZXJJZCA9XG4gICAgICBzaGFkb3dUYXJnZXQgPT09IFwidGVzdFwiICYmIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiXG4gICAgICAgID8gcHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSURcbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHRlbXBsYXRlRGF0YWJhc2UgPVxuICAgICAgd29ya2VySWQgIT09IG51bGwgPyBgJHtjb25maWd1cmVkRGF0YWJhc2V9XyR7d29ya2VySWQgPz8gXCIxXCJ9YCA6IGNvbmZpZ3VyZWREYXRhYmFzZTtcbiAgICBjb25zdCBzaGFkb3dEYXRhYmFzZSA9IGAke3RlbXBsYXRlRGF0YWJhc2V9X19taWdyYXRpb25fc2hhZG93YDtcbiAgICBjb25zdCBjcmVhdGVTaGFkb3dDb25uZWN0aW9uID0gKGRhdGFiYXNlOiBzdHJpbmcpID0+XG4gICAgICBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgICAuLi5Tb25hbXUuZGJDb25maWdbc2hhZG93VGFyZ2V0XSxcbiAgICAgICAgY29ubmVjdGlvbjogeyAuLi5iYXNlVGFyZ2V0Q29ubiwgZGF0YWJhc2UgfSxcbiAgICAgIH0pO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IOyDge2ZqeyXkOyEnOuKlCDtirjrnpzsnq3shZjsnYQg7LSI6riw7ZmU7ZWY6rOgLCDsg4gg642w7J207YSw67Kg7J207IqkIOy7pOuEpeyFmOydhCDqsIDsoLjsmYDslbwg7ZWoXG4gICAgaWYgKGlzVGVzdCgpKSB7XG4gICAgICBhd2FpdCBEQi5jbGVhclRlc3RUcmFuc2FjdGlvbigpO1xuICAgICAgYXdhaXQgREIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIOq4sOyhtCBTaGFkb3cgREIg7IKt7KCcIO2bhCBTaGFkb3cgREIg7IOd7ISxXG4gICAgY29uc3QgdGRiID0gY3JlYXRlU2hhZG93Q29ubmVjdGlvbihcInBvc3RncmVzXCIpO1xuICAgIHRyeSB7XG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgICAgYXdhaXQgdGRiLnJhdyhcIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTID8/XCIsIFtzaGFkb3dEYXRhYmFzZV0pO1xuICAgICAgYXdhaXQgdGRiLnJhdyhcbiAgICAgICAgYFxuICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgICBXSEVSRSBkYXRuYW1lID0gP1xuICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKTtcbiAgICAgIGAsXG4gICAgICAgIFt0ZW1wbGF0ZURhdGFiYXNlXSxcbiAgICAgICk7XG4gICAgICBhd2FpdCB0ZGIucmF3KFwiQ1JFQVRFIERBVEFCQVNFID8/IFRFTVBMQVRFID8/XCIsIFtzaGFkb3dEYXRhYmFzZSwgdGVtcGxhdGVEYXRhYmFzZV0pO1xuXG4gICAgICAvLyBTaGFkb3cgRELsl5Ag7Jew6rKwXG4gICAgICBjb25zdCBzZGIgPSBjcmVhdGVTaGFkb3dDb25uZWN0aW9uKHNoYWRvd0RhdGFiYXNlKTtcblxuICAgICAgLy8gc2hhZG93IERCIO2FjOyKpO2KuCDsp4TtlolcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKFwic2hhZG93XCIsIFwic2hhZG93XCIsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBzZGIubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpO1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlNoYWRvdyBEQiDthYzsiqTtirjsl5Ag7ISx6rO17ZaI7Iq164uI64ukIVwiKSwge1xuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3Mob3B0aW9ucywge1xuICAgICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgICAgYWN0aW9uOiBcInNoYWRvd1wiLFxuICAgICAgICAgIGNvbm5LZXk6IFwic2hhZG93XCIsXG4gICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICBmaWxlczogYXBwbGllZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25uS2V5OiBcInNoYWRvd1wiLFxuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgdGhyb3cgbmV3IE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIFwic2hhZG93XCIsXG4gICAgICAgICAgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zaGFkb3dEYlRlc3RGYWlsZWRcIikpLFxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgc2RiLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gU2hhZG93IERCIOyCreygnFxuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGEoYCR7c2hhZG93RGF0YWJhc2V9IOyCreygnGApKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRkYi5yYXcoXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyA/P1wiLCBbc2hhZG93RGF0YWJhc2VdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNoYWRvdyBEQiDsoJXrpqwg7Iuk7YyoOlwiLCBlKTsgLy8g7J206rKMIOyXhuycvOuptCDsobDsmqntnogg64iE7IiYXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0ZGIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkNBLFNBQVMsWUFBWSxRQUFnQixPQUFlLEdBQVc7Q0FDN0QsT0FBTyxPQUFPLFNBQVMsQ0FBQyxDQUFDLFNBQVMsTUFBTSxHQUFHO0FBQzdDOzs7OztBQXNCQSxTQUFTLFlBQWUsU0FBcUIsSUFBWSxXQUFvQztDQUMzRixPQUFPLElBQUksU0FBWSxTQUFTLFdBQVc7RUFDekMsTUFBTSxRQUFRLGlCQUFp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
566
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9taWdyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgR2VuTWlncmF0aW9uQ29kZSwgdHlwZSBNaWdyYXRpb25TZXQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzTG9jYWwsIGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVBbHRlckNvZGUsIGdlbmVyYXRlQ3JlYXRlQ29kZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHsgZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eSB9IGZyb20gXCIuL21pZ3JhdGlvbi1zZXRcIjtcbmltcG9ydCB7IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgfSBmcm9tIFwiLi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXJcIjtcbmltcG9ydCB7IFNsYWNrQ29uZmlybSB9IGZyb20gXCIuL3NsYWNrLWNvbmZpcm1cIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29ublN0cmluZyxcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uTWV0YSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzLFxuICB0eXBlIE1pZ3JhdGlvblByb2dyZXNzRXZlbnQsXG4gIHR5cGUgTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgdHlwZSBNaWdyYXRpb25TdGF0dXMsXG4gIHR5cGUgTWlncmF0aW9uVGFyZ2V0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBNaWdyYXRpb25SZXN1bHQgPSB7XG4gIGNvbm5LZXk6IHN0cmluZztcbiAgYmF0Y2hObzogbnVtYmVyO1xuICBhcHBsaWVkOiBzdHJpbmdbXTtcbn1bXTtcblxudHlwZSBTaGFkb3dNaWdyYXRpb25UYXJnZXQgPSBFeHRyYWN0PE1pZ3JhdGlvblRhcmdldCwgXCJmaXh0dXJlXCIgfCBcInRlc3RcIj47XG5cbmZ1bmN0aW9uIHBhZERhdGVQYXJ0KG51bWJlcjogbnVtYmVyLCBzaXplOiBudW1iZXIgPSAyKTogc3RyaW5nIHtcbiAgcmV0dXJuIG51bWJlci50b1N0cmluZygpLnBhZFN0YXJ0KHNpemUsIFwiMFwiKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29ubktleTogTWlncmF0aW9uVGFyZ2V0IHwgXCJzaGFkb3dcIixcbiAgICBjYXVzZTogdW5rbm93bixcbiAgKSB7XG4gICAgc3VwZXIoY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8g66eI7J206re466CI7J207IWYIOyDge2DnCDsobDtmowg7IucIERCIOyXsOqysCDtmZXsnbgg7YOA7J6E7JWE7JuDKG1zKS5cbi8vIGNyZWF0ZUtuZXhJbnN0YW5jZeydmCDsu6TrhKXshZgg7ZqN65OdIO2DgOyehOyVhOybgygzMOy0iCnsl5Agc3RhdHVzL2xpc3QvY3VycmVudFZlcnNpb27snbRcbi8vIOqwgeqwgSDqsbjrpqzrqbQgQ0xJL1VJ6rCAIOy1nOuMgCDsiJjsi60g7LSIIGhhbmftlZzri6QuIOygleyDgSDsnZHri7XsnYAg7IiY67CxIG1z7J2066+A66GcIDXstIjrqbQg7Lap67aE7ZWY64ukLlxuY29uc3QgTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyA9IDUwMDA7XG5jb25zdCBMT0NBTF9EQl9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5cbi8qKlxuICog7KO87Ja07KeEIFByb21pc2XqsIAgbXMg7JWI7JeQIOyZhOujjOuQmOyngCDslYrsnLzrqbQgb25UaW1lb3V0IOyXkOufrOuhnCByZWplY3TtlZzri6QuXG4gKiDsm5Drs7ggUHJvbWlzZSDsnpDssrTripQg6rOE7IaNIOynhO2WieuQmOuvgOuhnCwg7Zi47Lac7Lih7JeQ7IScIOy7pOuEpeyFmCDsoJXrpqwoZGVzdHJveSnrpbwg7LGF7J6E7KeE64ukLlxuICovXG5mdW5jdGlvbiB3aXRoVGltZW91dDxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBtczogbnVtYmVyLCBvblRpbWVvdXQ6ICgpID0+IEVycm9yKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChvblRpbWVvdXQoKSksIG1zKTtcbiAgICBwcm9taXNlLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIE5vdGUgMjAyNi0wOC0yNiwg67OR7KSAXG4gKiDsnbQg7YG0656Y7Iqk7JeQ7IScIGRlcHJlY2F0ZWQg67aZ7Ja07J6I64qUIOy5nOq1rOuTpOydgCDtmIQgQ0xJ66W8IOychO2VnCDtlZjsnIQg7Zi47ZmY7J2064uILFxuICogQ0xJIOumrO2Mqe2GoOungSDsi5zsoJDsl5DshJwg7KCc6rGw7ZW07KO87IWU64+EIOustOuwqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1pZ3JhdG9yIHtcbiAgcHJpdmF0ZSBpc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yPFZhbHVlPihlcnJvcjogVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzT2JqZWN0VmFsdWUoZXJyb3IpIHx8IGVycm9yID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbWF5YmVQb3N0Z3Jlc0Vycm9yID1cbiAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZXJyb3IgYXMge1xuICAgICAgICBjb2RlPzogdW5rbm93bjtcbiAgICAgIH07XG4gICAgLy8gUG9zdGdyZVNRTCB1bmRlZmluZWRfdGFibGUg7L2U65Oc64qUIOyCrOyaqeyekCDsp4DsoJUgbWlncmF0aW9uIHRhYmxl7JeQ64+EIOuPmeydvO2VmOqyjCDsoIHsmqnrkKnri4jri6QuXG4gICAgcmV0dXJuIG1heWJlUG9zdGdyZXNFcnJvci5jb2RlID09PSBcIjQyUDAxXCI7XG4gIH1cblxuICAvKiog7ZiE7J6sIOyLpO2WiSDtmZjqsr3sl5DshJwg7ZeI7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDrjIDsg4Eg7YKk66W8IOuwmO2ZmO2VqeuLiOuLpC4gKi9cbiAgZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpOiBNaWdyYXRpb25UYXJnZXRbXSB7XG4gICAgY29uc3QgY29ubktleXMgPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBPYmplY3Qua2V5cyhcbiAgICAgICAgU29uYW11LmRiQ29uZmlnLFxuICAgICAgKS5maWx0ZXIoKGtleSkgPT4gIWtleS5lbmRzV2l0aChcIl9yZWFkb25seVwiKSkgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgcmV0dXJuIGNvbm5LZXlzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICByZXR1cm4gY29ubktleXMuZmlsdGVyKChrZXkpID0+IGtleSA9PT0gZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KFxuICAgIGNvbm5zOiB7IGNvbm5LZXk6IGtleW9mIFNvbmFtdURCQ29uZmlnOyBrbmV4OiBLbmV4IH1bXSxcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHQgPSBbXTtcblxuICAgIGZvciAoY29uc3QgeyBjb25uS2V5LCBrbmV4IH0gb2YgY29ubnMpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKGFjdGlvbiwgY29ubktleSwgb3B0aW9ucyk7XG4gICAgICBsZXQgbWlncmF0aW9uUmVzdWx0OiBbbnVtYmVyLCBzdHJpbmdbXV07XG4gICAgICB0cnkge1xuICAgICAgICBtaWdyYXRpb25SZXN1bHQgPVxuICAgICAgICAgIGFjdGlvbiA9PT0gXCJhcHBseVwiXG4gICAgICAgICAgICA/IGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpXG4gICAgICAgICAgICA6IGF3YWl0IGtuZXgubWlncmF0ZS5yb2xsYmFjayhwcm9ncmVzcyk7XG4gICAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgICAgLy8gbGlmZWN5Y2xlIGhvb2sg7J207KCE7J2YIOyXsOqysMK3bG9ja8K366qp66GdIOyhsO2ajCDsi6TtjKjrj4Qg7Iuk7KCcIOuMgOyDgSBEQuyXkCDqt4Dsho3tlanri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25UYXJnZXRFeGVjdXRpb25FcnJvcihjb25uS2V5LCBjYXVnaHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gbWlncmF0aW9uUmVzdWx0O1xuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBjb25uS2V5LFxuICAgICAgICBiYXRjaE5vLFxuICAgICAgICBhcHBsaWVkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhvcHRpb25zLCB7XG4gICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgZmlsZXM6IGFwcGxpZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgbWlncmF0aW9uTmFtZTxWYWx1ZT4obWlncmF0aW9uOiBWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKGlzU3RyaW5nVmFsdWUobWlncmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUobWlncmF0aW9uKTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUobWlncmF0aW9uKSAmJiBtaWdyYXRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gbWlncmF0aW9uIGFzIHtcbiAgICAgICAgICBmaWxlPzogdW5rbm93bjtcbiAgICAgICAgICBuYW1lPzogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNhbmRpZGF0ZS5maWxlKSkge1xuICAgICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjYW5kaWRhdGUuZmlsZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShjYW5kaWRhdGUubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUoY2FuZGlkYXRlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG1pZ3JhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm9ncmVzcyhvcHRpb25zOiBNaWdyYXRpb25SdW5PcHRpb25zIHwgdW5kZWZpbmVkLCBldmVudDogTWlncmF0aW9uUHJvZ3Jlc3NFdmVudCkge1xuICAgIHRyeSB7XG4gICAgICBvcHRpb25zPy5vblByb2dyZXNzPy4oZXZlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDsp4TtlonrpaAg7IaM67mE7J6Q7J2YIOyLpO2MqOqwgCDsnbTrr7gg7Iuc7J6R7ZWcIERCIOyekeyXheqzvCDsoJXrpqzrpbwg67Cp7ZW07ZWY66m0IOyViCDrkKnri4jri6QuXG4gICAgICBjb25zb2xlLndhcm4oXCJNaWdyYXRpb24gcHJvZ3Jlc3Mgb2JzZXJ2ZXIgZmFpbGVkOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQcm9ncmVzc0hvb2tzKFxuICAgIGFjdGlvbjogTWlncmF0aW9uQWN0aW9uLFxuICAgIGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCB8IFwic2hhZG93XCIsXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IEtuZXguTWlncmF0b3JDb25maWdXaXRoTGlmZWN5Y2xlSG9va3Mge1xuICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbWl0RmlsZSA9IDxWYWx1ZT4odHlwZTogXCJmaWxlLXN0YXJ0XCIgfCBcImZpbGUtZXhlY3V0ZWRcIiwgbWlncmF0aW9uOiBWYWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMubWlncmF0aW9uTmFtZShtaWdyYXRpb24pO1xuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLm1heChmaWxlcy5pbmRleE9mKGZpbGUpLCAwKTtcbiAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb25uS2V5LFxuICAgICAgICBmaWxlLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdG90YWw6IGZpbGVzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgYmVmb3JlQWxsOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgZmlsZXMgPSBtaWdyYXRpb25zLm1hcCgobWlncmF0aW9uKSA9PiB0aGlzLm1pZ3JhdGlvbk5hbWUobWlncmF0aW9uKSk7XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHsgdHlwZTogXCJ0YXJnZXQtc3RhcnRcIiwgYWN0aW9uLCBjb25uS2V5LCBmaWxlcyB9KTtcbiAgICAgIH0sXG4gICAgICBiZWZvcmVFYWNoOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgbWlncmF0aW9ucy5mb3JFYWNoKChtaWdyYXRpb24pID0+IGVtaXRGaWxlKFwiZmlsZS1zdGFydFwiLCBtaWdyYXRpb24pKTtcbiAgICAgIH0sXG4gICAgICBhZnRlckVhY2g6IGFzeW5jIChfa25leCwgbWlncmF0aW9ucykgPT4ge1xuICAgICAgICBtaWdyYXRpb25zLmZvckVhY2goKG1pZ3JhdGlvbikgPT4gZW1pdEZpbGUoXCJmaWxlLWV4ZWN1dGVkXCIsIG1pZ3JhdGlvbikpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRNaWdyYXRpb25UYXJnZXQoY29ubktleTogTWlncmF0aW9uVGFyZ2V0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5pbmNsdWRlcyhjb25uS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlncmF0aW9uIHRhcmdldCBpcyBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke1N0cmluZyhjb25uS2V5KX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOuMgOyDgSDsu6TrhKXshZjsnZgg7KCV7KCBIOuplO2DgOuNsOydtO2EsOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqIERC7JeQIOyXsOqysO2VmOyngCDslYrsnLzrr4DroZwgQ0xJ7JmAIFdlYuydtCDsg4Htg5wg7KGw7ZqMIOyghOyXkCDsponsi5wg7IKs7Jqp7ZWgIOyImCDsnojsirXri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvbnMoKTogTWlncmF0aW9uQ29ubmVjdGlvbk1ldGFbXSB7XG4gICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgIHJldHVybiB0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5tYXAoKGNvbm5LZXkpID0+IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgICBjb25uS2V5XG4gICAgICAgIF0uY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgIGNvbnN0IGhvc3QgPSBjb25uZWN0aW9uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIG5hbWU6IFN0cmluZyhjb25uS2V5KSxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydDogY29ubmVjdGlvbi5wb3J0ID8/IDU0MzIsXG4gICAgICAgIGRhdGFiYXNlOiBjb25uZWN0aW9uLmRhdGFiYXNlID8/IFwiXCIsXG4gICAgICAgIHJlbW90ZTogIUxPQ0FMX0RCX0hPU1RTLmhhcyhob3N0LnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICByZXF1aXJlc0FwcHJvdmFsOiBzbGFja0NvbmZpcm0uaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKGNvbm5LZXkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshozsiqTsl5Ag7KG07J6s7ZWY64qUIOuniOydtOq3uOugiOydtOyFmCDtjIzsnbwg66qp66Gd7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25Db2RlcygpOiBQcm9taXNlPE1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHNyY01pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcIm1pZ3JhdGlvbnNcIik7IC8vIOydtOqxtCDtmZjqsr3sl5Ag6rSA6rOE7JeG7J20IO2VreyDgSBzcmPsl5DshJwg7LC+7JWE7JW8IO2VtOyalC5cblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNNaWdyYXRpb25zRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHNyY01pZ3JhdGlvbnNEaXIsIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29kZXMgPSAoYXdhaXQgcmVhZGRpcihzcmNNaWdyYXRpb25zRGlyKSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICBuYW1lOiBmLnJlcGxhY2UoXCIudHNcIiwgXCJcIiksXG4gICAgICAgIHBhdGg6IHBhdGguam9pbihzcmNNaWdyYXRpb25zRGlyLCBmKSxcbiAgICAgIH0pKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gMSA6IC0xKSk7IC8vIOydtOumhCDrgrTrprzssKjsiJwg7KCV66CsKOy1nOyLoOyInClcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRNaWdyYXRpb25Db2RlczpyZXN1bHRzXCIsIGNvZGVzKTtcbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICog7Luk64Sl7IWYIO2VmOuCmOydmCDtmITsnqwg67KE7KCE6rO8IHBlbmRpbmcg66qp66Gd7J2EIOuPheumveyggeycvOuhnCDsobDtmoztlanri4jri6QuXG4gICAqIOyXrOufrCDrjIDsg4HsnYAg7Zi47Lac7J6Q6rCAIOuzkeugrOuhnCDsobDrpr3tlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRDb25uZWN0aW9uU3RhdHVzKGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCk6IFByb21pc2U8TWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cz4ge1xuICAgIHRoaXMuYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KGNvbm5LZXkpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5nZXRNaWdyYXRpb25Db2RlcygpO1xuICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIC8vIFNBRkVUWTogS25leOqwgCDsoJzqs7XtlZwgUG9zdGdyZVNRTCDsl7DqsrAg6rWs7ISx7J2EIOuzteyCrO2VtCB0aW1lb3V0IO2VhOuTnOunjCDrja7slrTsk7Tri6QuXG4gICAgY29uc3QgdENvbm4gPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4ua25leE9wdGlvbnMsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5lY3Rpb24sXG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgfSxcbiAgICAgIHBvb2w6IHtcbiAgICAgICAgLi4ua25leE9wdGlvbnMucG9vbCxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBhY3F1aXJlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgY3JlYXRlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgcHJvcGFnYXRlQ3JlYXRlRXJyb3I6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhUaW1lb3V0KHRDb25uLnJhdyhcInNlbGVjdCAxXCIpLCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgICAgYERCIOyXsOqysCDsi5zqsIQg7LSI6rO8ICgke01JR1JBVElPTl9DT05OX1RJTUVPVVRfTVN9bXMpIOKAlCAke2Nvbm5lY3Rpb24uaG9zdH06JHtjb25uZWN0aW9uLnBvcnR9LyR7Y29ubmVjdGlvbi5kYXRhYmFzZX1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc3RhdHVzOiBudW1iZXIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlLnN0YXR1cygpLmNhdGNoKChjYXVnaHQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNaXNzaW5nTWlncmF0aW9uVGFibGVFcnJvcihjYXVnaHQpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvZGVzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvciA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgICAgcmV0dXJuIFwiZXJyb3JcIiBhcyBjb25zdDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGVuZGluZzogc3RyaW5nW10gPSBhd2FpdCB0Q29ubi5taWdyYXRlLmxpc3QoKS50aGVuKFxuICAgICAgICAoWywgZmlsZXNdOiBbdW5rbm93bltdLCB7IGZpbGU6IHN0cmluZyB9W11dKSA9PlxuICAgICAgICAgIGZpbGVzLm1hcCgoeyBmaWxlIH0pID0+IGZpbGUucmVwbGFjZSgvXFwudHMkLywgXCJcIikpLFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVzLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgXCJub25lXCIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlXG4gICAgICAgIC5jdXJyZW50VmVyc2lvbigpXG4gICAgICAgIC5jYXRjaCgoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwibm9uZVwiIGFzIGNvbnN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBcImVycm9yXCIgYXMgY29uc3Q7XG4gICAgICAgIH0pO1xuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpzdGF0dXNcIiwgc3RhdHVzKTtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25TdGF0dXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXMgPSB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHBlbmRpbmcsXG4gICAgICAgIGxhdGVuY3lNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICB9O1xuICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIGNvbm5lY3Rpb25TdGF0dXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgIHJldHVybiBjb25uZWN0aW9uU3RhdHVzO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBjYXVnaHQgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodC5tZXNzYWdlIDogU3RyaW5nKGNhdWdodCk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgJHtTdHJpbmcoY29ubktleSl97J2YIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zrpbwg6rCA7KC47Jik64qUIOuNsOyXkCDsi6TtjKjtlZjsmIDsirXri4jri6QuXFxuJHtlcnJvcn1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBcImVycm9yXCIsXG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBwZW5kaW5nOiBbXSxcbiAgICAgICAgbGF0ZW5jeU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB3aXRoVGltZW91dCh0Q29ubi5kZXN0cm95KCksIE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZGVzdHJveSB0aW1lb3V0XCIpO1xuICAgICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5DshJwg6rCA7J6lIOy1nOq3vOyXkCDsoIHsmqnrkJwgbWlncmF0aW9uIGJhdGNo66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RBcHBsaWVkQmF0Y2goXG4gICAgY29ubktleTogTWlncmF0aW9uVGFyZ2V0LFxuICApOiBQcm9taXNlPHsgYmF0Y2hObzogbnVtYmVyOyBmaWxlczogc3RyaW5nW10gfT4ge1xuICAgIHRoaXMuYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KGNvbm5LZXkpO1xuICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IHRDb25uID0gY3JlYXRlS25leEluc3RhbmNlKHtcbiAgICAgIC4uLmtuZXhPcHRpb25zLFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi5jb25uZWN0aW9uLFxuICAgICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgIH0sXG4gICAgICBwb29sOiB7XG4gICAgICAgIC4uLmtuZXhPcHRpb25zLnBvb2wsXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgYWNxdWlyZVRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgIGNyZWF0ZVRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgIHByb3BhZ2F0ZUNyZWF0ZUVycm9yOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBrbmV4T3B0aW9ucy5taWdyYXRpb25zPy50YWJsZU5hbWUgPz8gXCJrbmV4X21pZ3JhdGlvbnNcIjtcbiAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBrbmV4T3B0aW9ucy5taWdyYXRpb25zPy5zY2hlbWFOYW1lO1xuICAgICAgY29uc3QgbWlncmF0aW9uc1RhYmxlID1cbiAgICAgICAgc2NoZW1hTmFtZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0Q29ubjx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgYmF0Y2g6IG51bWJlciB9Pih0YWJsZU5hbWUpXG4gICAgICAgICAgOiB0Q29ubjx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgYmF0Y2g6IG51bWJlciB9Pih0YWJsZU5hbWUpLndpdGhTY2hlbWEoc2NoZW1hTmFtZSk7XG4gICAgICBjb25zdCBsYXRlc3QgPSBhd2FpdCBtaWdyYXRpb25zVGFibGUuY2xvbmUoKS5zZWxlY3QoXCJiYXRjaFwiKS5vcmRlckJ5KFwiYmF0Y2hcIiwgXCJkZXNjXCIpLmZpcnN0KCk7XG4gICAgICBpZiAobGF0ZXN0ID09PSB1bmRlZmluZWQpIHJldHVybiB7IGJhdGNoTm86IDAsIGZpbGVzOiBbXSB9O1xuXG4gICAgICAvLyDqsJnsnYAgYmF0Y2gg7JWI7JeQ7ISc64qUIEtuZXgg7Iuk7ZaJIOyInOyEnOuMgOuhnCDroaTrsLEg6rOE7ZqN7J2EIOqzoOygle2VnOuLpC5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBtaWdyYXRpb25zVGFibGVcbiAgICAgICAgLmNsb25lKClcbiAgICAgICAgLnNlbGVjdChcIm5hbWVcIilcbiAgICAgICAgLndoZXJlKFwiYmF0Y2hcIiwgbGF0ZXN0LmJhdGNoKVxuICAgICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmF0Y2hObzogbGF0ZXN0LmJhdGNoLFxuICAgICAgICBmaWxlczogcm93cy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lLnJlcGxhY2UoL1xcLnRzJC8sIFwiXCIpKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdWdodCkpIHJldHVybiB7IGJhdGNoTm86IDAsIGZpbGVzOiBbXSB9O1xuICAgICAgdGhyb3cgY2F1Z2h0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0Q29ubi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOy1nOyLoCDsg4Htg5zsnbgg6riw7KSAIERC7JmAIOyXlO2LsO2LsCDsoJXsnZjrpbwg67mE6rWQ7ZW0IOyDneyEsSDsmIjsoJUg7L2U65Oc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvblN0YXR1cyhjb21wYXJlQ29ubktleSk7XG4gICAgaWYgKHN0YXR1cy5zdGF0dXMgIT09IDAgfHwgc3RhdHVzLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiBjb21wYXJpc29uIHJlcXVpcmVzIGFuIHVwLXRvLWRhdGUgZGF0YWJhc2U6ICR7U3RyaW5nKGNvbXBhcmVDb25uS2V5KX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlV2l0aENvbm5lY3Rpb24oY29tcGFyZUNvbm5LZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb21wYXJlV2l0aENvbm5lY3Rpb24oY29tcGFyZUNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCkge1xuICAgIGNvbnN0IGNvbXBhcmVEQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbY29tcGFyZUNvbm5LZXldKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY29tcGFyZURCLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQg7Iug6recIFVJ7JeQ7ISc64qUIOy7pOuEpeyFmOuzhCDsobDtmowgQVBJ66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgICog6riw7KG0IENMSeyZgCDsiqTtgazrpr3tirgg7Zi47ZmY7J2EIOychO2VtCDsoITssrQg7IOB7YOc66W8IOyhsOumve2VqeuLiOuLpC5cbiAgICogQGNhdGVnb3J5IO2YuO2ZmOyaqSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRTdGF0dXMoKTogUHJvbWlzZTxNaWdyYXRpb25TdGF0dXM+IHtcbiAgICBjb25zdCBbY29kZXMsIGNvbm5lY3Rpb25zXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuZ2V0TWlncmF0aW9uQ29kZXMoKSxcbiAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLmdldENvbm5lY3Rpb25zKCkpLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29kZXNcIiwgY29kZXMpO1xuXG4gICAgY29uc3QgY29ubmVjdGlvblN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25uZWN0aW9ucy5tYXAoKHsgY29ubktleSB9KSA9PiB0aGlzLmdldENvbm5lY3Rpb25TdGF0dXMoY29ubktleSkpLFxuICAgICk7XG4gICAgY29uc3QgY29ubnMgPSBjb25uZWN0aW9ucy5tYXAoKGNvbm5lY3Rpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBjb25uZWN0aW9uU3RhdHVzZXNbaW5kZXhdO1xuICAgICAgYXNzZXJ0KHN0YXR1cyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWQgPVxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgICBjb25uZWN0aW9uLmNvbm5LZXlcbiAgICAgICAgXS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogY29ubmVjdGlvbi5uYW1lLFxuICAgICAgICBjb25uS2V5OiBjb25uZWN0aW9uLmNvbm5LZXksXG4gICAgICAgIGNvbm5TdHJpbmc6XG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBgcGc6Ly8ke2NvbmZpZ3VyZWQudXNlciA/PyBcIlwifUAke2NvbmZpZ3VyZWQuaG9zdH06JHtjb25maWd1cmVkLnBvcnR9LyR7Y29uZmlndXJlZC5kYXRhYmFzZX1gIGFzIENvbm5TdHJpbmcsXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBzdGF0dXMuY3VycmVudFZlcnNpb24sXG4gICAgICAgIHN0YXR1czogc3RhdHVzLnN0YXR1cyxcbiAgICAgICAgcGVuZGluZzogc3RhdHVzLnBlbmRpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29ubnNcIiwgY29ubnMpO1xuXG4gICAgY29uc3QgY29tcGFyZUNvbm4gPSBjb25uZWN0aW9uU3RhdHVzZXMuZmluZChcbiAgICAgICh7IHN0YXR1cywgZXJyb3IgfSkgPT4gc3RhdHVzID09PSAwICYmIGVycm9yID09PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICBjb25zdCBwcmVwYXJlZENvZGVzID1cbiAgICAgIGNvbXBhcmVDb25uID09PSB1bmRlZmluZWQgPyBbXSA6IGF3YWl0IHRoaXMuY29tcGFyZVdpdGhDb25uZWN0aW9uKGNvbXBhcmVDb25uLmNvbm5LZXkpO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6cHJlcGFyZWRDb2Rlc1wiLCBwcmVwYXJlZENvZGVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb25ucyxcbiAgICAgIGNvZGVzLFxuICAgICAgcHJlcGFyZWRDb2RlcyxcbiAgICAgIGVycm9yOiBjb25uZWN0aW9uU3RhdHVzZXMuZmluZCgoeyBlcnJvciB9KSA9PiBlcnJvciAhPT0gdW5kZWZpbmVkKT8uZXJyb3IsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5AgcGVuZGluZyDrp4jsnbTqt7jroIjsnbTshZjsnYQg7KCB7Jqp7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIOqwmeydgCDrqZTshJzrk5zrpbwg7IKs7Jqp7ZWY66mwLCBXZWLsnYAgYG9uUHJvZ3Jlc3Ng66W8IHN0cmVhbeycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgYXBwbHkodGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW5BY3Rpb25XaXRoUHJvZ3Jlc3MoXCJhcHBseVwiLCB0YXJnZXRzLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5DshJwg6rCA7J6lIOy1nOq3vCBtaWdyYXRpb24gYmF0Y2jrpbwg66Gk67Cx7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIOqwmeydgCDrqZTshJzrk5zrpbwg7IKs7Jqp7ZWY66mwLCBXZWLsnYAgYG9uUHJvZ3Jlc3Ng66W8IHN0cmVhbeycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcm9sbGJhY2soXG4gICAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuQWN0aW9uV2l0aFByb2dyZXNzKFwicm9sbGJhY2tcIiwgdGFyZ2V0cywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgYWN0aW9uIOusuOyekOyXtCDrjIDsi6Age0BsaW5rIGFwcGx5fSDrmJDripQge0BsaW5rIHJvbGxiYWNrfeydhCDsp4HsoJEg7IKs7Jqp7ZWp64uI64ukLlxuICAgKiDquLDsobQg7Jm467aAIO2YuOy2nOydmCDtlZjsnIQg7Zi47ZmY66eM7J2EIOychO2VtCDsnKDsp4Dtlanri4jri6QuXG4gICAqIEBjYXRlZ29yeSDtmLjtmZjsmqkg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcnVuQWN0aW9uKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gYWN0aW9uID09PSBcImFwcGx5XCIgPyB0aGlzLmFwcGx5KHRhcmdldHMpIDogdGhpcy5yb2xsYmFjayh0YXJnZXRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWN0aW9uV2l0aFByb2dyZXNzKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICAgIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246YWN0aW9uXCIsIGFjdGlvbik7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjp0YXJnZXRzXCIsIHRhcmdldHMpO1xuXG4gICAgY29uc3QgYWxsb3dlZFRhcmdldHMgPSBuZXcgU2V0KHRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpKTtcbiAgICBjb25zdCBkaXNhbGxvd2VkVGFyZ2V0cyA9IHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFhbGxvd2VkVGFyZ2V0cy5oYXModGFyZ2V0KSk7XG4gICAgaWYgKGRpc2FsbG93ZWRUYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiB0YXJnZXRzIGFyZSBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke2Rpc2FsbG93ZWRUYXJnZXRzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdW5pcSBrbmV4IGNvbmZpZ3NcbiAgICBjb25zdCBjb25maWdzID0gdW5pcXVlKFxuICAgICAgdGFyZ2V0c1xuICAgICAgICAubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgICAgICAgY29ubktleTogdGFyZ2V0LFxuICAgICAgICAgIG9wdGlvbnM6IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXRdLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy5vcHRpb25zICE9PSB1bmRlZmluZWQpLFxuICAgICAgKHsgb3B0aW9uczogZGJPcHRpb25zIH0pID0+XG4gICAgICAgIGAkey8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKGRiT3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5ob3N0fToke1xuICAgICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZGJPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWdcbiAgICAgICAgICApLnBvcnQgPz8gNTQzMlxuICAgICAgICB9LyR7LyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoZGJPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlfWAsXG4gICAgKTtcblxuICAgIC8vIGdldCBjb25uZWN0aW9uc1xuICAgIGNvbnN0IGNvbm5zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25maWdzLm1hcChhc3luYyAoY29uZmlnKSA9PiAoe1xuICAgICAgICBjb25uS2V5OiBjb25maWcuY29ubktleSxcbiAgICAgICAga25leDogY3JlYXRlS25leEluc3RhbmNlKGNvbmZpZy5vcHRpb25zKSxcbiAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuTWlncmF0aW9uc1NlcXVlbnRpYWxseShjb25ucywgYWN0aW9uLCBvcHRpb25zKTtcblxuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjpyZXN1bHRcIiwgcmVzdWx0KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNvbm5zLm1hcCgoeyBrbmV4IH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ga25leC5kZXN0cm95KCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbkRhdGVUYWcoaW5kZXg6IG51bWJlciwgYmFzZURhdGU6IERhdGUgPSBuZXcgRGF0ZSgpKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYmFzZURhdGUuZ2V0VGltZSgpICsgaW5kZXggKiAxMDAwKTtcbiAgICByZXR1cm4gKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXREYXRlKCkpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0SG91cnMoKSkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0U2Vjb25kcygpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg6rCc7IiYXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVByZXBhcmVkQ29kZXMoY29tcGFyZUNvbm5LZXk/OiBNaWdyYXRpb25UYXJnZXQpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHByZXBhcmVkQ29kZXMgPVxuICAgICAgY29tcGFyZUNvbm5LZXkgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChhd2FpdCB0aGlzLmdldFN0YXR1cygpKS5wcmVwYXJlZENvZGVzXG4gICAgICAgIDogYXdhaXQgdGhpcy5nZXRQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5KTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVQcmVwYXJlZENvZGVzOnByZXBhcmVkQ29kZXNcIiwgcHJlcGFyZWRDb2Rlcyk7XG4gICAgaWYgKHByZXBhcmVkQ29kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlxcbu2YhOyerCDrqqjrkZAg7Iux7YGs65CcIOyDge2DnOyeheuLiOuLpC5cIikpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8g7Iuk7KCcIOy9lOuTnCDsg53shLFcbiAgICBjb25zdCBtaWdyYXRpb25zRGlyID0gYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvbWlncmF0aW9uc2A7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGNvZGVdIG9mIHByZXBhcmVkQ29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGNvZGUuZm9ybWF0dGVkKSB7XG4gICAgICAgIGNvbnN0IGRhdGVUYWcgPSB0aGlzLmdlbkRhdGVUYWcoaW5kZXgpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke21pZ3JhdGlvbnNEaXJ9LyR7ZGF0ZVRhZ31fJHtwY29kZS50aXRsZX0udHNgO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIHBjb2RlLmZvcm1hdHRlZCk7XG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgTUlHUkFUSU9OIENSRUFURUQgJHtmaWxlUGF0aH1gKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXBhcmVkQ29kZXMubGVuZ3RoO1xuICB9XG5cbiAgYXN5bmMgY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCOiBLbmV4KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgICAvLyBFbnRpdHkg7Iic7ZqM7ZWY7JesIOyLse2BrFxuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIEVudGl0eeyXkOyEnCBNaWdyYXRpb25TZXQg7LaU7LacXG4gICAgY29uc3QgZW50aXR5U2V0c1dpdGhKb2luVGFibGUgPSBlbnRpdHlJZHNcbiAgICAgIC5maWx0ZXIoKGVudGl0eUlkKSA9PiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMubGVuZ3RoID4gMClcbiAgICAgIC5tYXAoKGVudGl0eUlkKSA9PiBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5KEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKSkpO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iU66eMIOy2lOy2nFxuICAgIGNvbnN0IGpvaW5UYWJsZXNXaXRoRHVwID0gZW50aXR5U2V0c1dpdGhKb2luVGFibGUuZmxhdE1hcCgoZW50aXR5U2V0KSA9PiBlbnRpdHlTZXQuam9pblRhYmxlcyk7XG4gICAgLy8g7KSR67O1IOygnOqxsCAo7KSR67O17J24IOqyveyasCBpbmRleGVz66W8IOuzke2VqSlcbiAgICBjb25zdCBqb2luVGFibGVzID0gT2JqZWN0LnZhbHVlcyhncm91cChqb2luVGFibGVzV2l0aER1cCwgKGp0KSA9PiBqdC50YWJsZSkpLm1hcCgodGFibGVzKSA9PiB7XG4gICAgICBhc3NlcnQodGFibGVzICE9PSB1bmRlZmluZWQsIFwidGFibGVzIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGlmICh0YWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0YWJsZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50YWJsZXNbMF0sXG4gICAgICAgIGluZGV4ZXM6IHVuaXF1ZShcbiAgICAgICAgICB0YWJsZXMuZmxhdE1hcCgodCkgPT4gdC5pbmRleGVzKSxcbiAgICAgICAgICAoaW5kZXgpID0+IFtpbmRleC50eXBlLCAuLi5pbmRleC5jb2x1bW5zXS5qb2luKFwiLVwiKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIE1pZ3JhdGlvblNldCDrsLDsl7RcbiAgICBjb25zdCBlbnRpdHlTZXRzOiBNaWdyYXRpb25TZXRbXSA9IFsuLi5lbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSwgLi4uam9pblRhYmxlc107XG5cbiAgICBjb25zdCBjb2RlczogR2VuTWlncmF0aW9uQ29kZVtdID0gW107XG4gICAgY29uc3QgYmF0Y2hTaXplID0gNDtcblxuICAgIC8vIO2FjOydtOu4lOuniOuLpCDsiqTtgqTrp4jrpbwg7KGw7ZqM7ZWY66m0IOyZleuzteydtCDthYzsnbTruJQg7IiY7JeQIOu5hOuhgO2VtCDripjslrTrgpzri6QuXG4gICAgLy8g7KKF66WY67OE66GcIO2VnCDrsojslKnrp4wg7J297Ja065GQ6rOgIOyVhOuemOyXkOyEnCDthYzsnbTruJTrqoXsnLzroZwg7LC+7JWEIOyTtOuLpC5cbiAgICBjb25zdCBkYlNldHMgPSBhd2FpdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyLmdldE1pZ3JhdGlvblNldEZyb21EQkFsbChjb21wYXJlREIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRpdHlTZXRzLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICAgIGNvbnN0IGJhdGNoQ29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZW50aXR5U2V0cy5zbGljZShpLCBpICsgYmF0Y2hTaXplKS5tYXAoYXN5bmMgKGVudGl0eVNldCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRiU2V0ID0gZGJTZXRzLmdldChlbnRpdHlTZXQudGFibGUpID8/IG51bGw7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZW50aXR5U2V0OiR7ZW50aXR5U2V0LnRhYmxlfWAsIGVudGl0eVNldCk7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZGJTZXQ6JHtlbnRpdHlTZXQudGFibGV9YCwgZGJTZXQpO1xuXG4gICAgICAgICAgaWYgKGRiU2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyDquLDsobQg7YWM7J2067iUIOyXhuydjCwg7IOI66GcIO2FjOydtOu4lCDsg53shLFcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGUoZW50aXR5U2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g6riw7KG0IO2FjOydtOu4lCDsobTsnqztlZjripQg7LyA7J207IqkXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGUoZW50aXR5U2V0LCBkYlNldCwgY29tcGFyZURCKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgY29kZXMucHVzaCguLi5iYXRjaENvZGVzLmZsYXQoKSk7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsIO2DgOyeheydtCDslZ7snLzroZwsIGZvcmVpZ27snbQg65Kk66GcXG4gICAgY29kZXMuc29ydCgoY29kZUEsIGNvZGVCKSA9PiB7XG4gICAgICBpZiAoY29kZUEudHlwZSA9PT0gXCJmb3JlaWduXCIgJiYgY29kZUIudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZUEudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBjb2RlQi50eXBlID09PSBcImZvcmVpZ25cIikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiB0ZXN0IERC7J2YIHNuYXBzaG907Jy866GcIOyehOyLnCBTaGFkb3cgRELrpbwg66eM65Ok6rOgIOyghOyytCDrp4jsnbTqt7jroIjsnbTshZjsnYQg6rKA7Kad7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIGBvblByb2dyZXNzYCDsnKDrrLTrp4wg64us66as7ZW0IOqwmeydgCDsi6Ttlokg7J2Y66+466W8IOqzteycoO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIHJ1blNoYWRvd1Rlc3QoXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMgJiB7IHRhcmdldD86IE1pZ3JhdGlvblRhcmdldCB9LFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnM/LnRhcmdldCA/PyBcInRlc3RcIjtcbiAgICBpZiAodGFyZ2V0ICE9PSBcInRlc3RcIiAmJiB0YXJnZXQgIT09IFwiZml4dHVyZVwiKSB7XG4gICAgICAvLyDsmrTsmIEg6rOE7Je0IERC64qUIOyEpOyglSDsobDtmozrgpgg7Jew6rKwIOyDneyEseuztOuLpCDrqLzsoIAg7LCo64uo7ZWc64ukLlxuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYOyngOybkO2VmOyngCDslYrripQgU2hhZG93IOuniOydtOq3uOugiOydtOyFmCDrjIDsg4HsnoXri4jri6Q6ICR7dGFyZ2V0fWApLCB7XG4gICAgICAgIGNvZGU6IFwiSU5WQUxJRF9TSEFET1dfTUlHUkFUSU9OX1RBUkdFVFwiLFxuICAgICAgICB0YXJnZXQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2hhZG93VGFyZ2V0OiBTaGFkb3dNaWdyYXRpb25UYXJnZXQgPSB0YXJnZXQ7XG4gICAgY29uc3QgYmFzZVRhcmdldENvbm4gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXUuZGJDb25maWdbXG4gICAgICAgIHNoYWRvd1RhcmdldFxuICAgICAgXS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IGNvbmZpZ3VyZWREYXRhYmFzZSA9IGJhc2VUYXJnZXRDb25uLmRhdGFiYXNlO1xuICAgIGlmICghY29uZmlndXJlZERhdGFiYXNlKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgU2hhZG93IOuMgOyDgSBEQiDsnbTrpoTsnbQg7JeG7Iq164uI64ukOiAke3NoYWRvd1RhcmdldH1gKSwge1xuICAgICAgICBjb2RlOiBcIklOVkFMSURfU0hBRE9XX0RBVEFCQVNFX0NPTkZJR1wiLFxuICAgICAgICB0YXJnZXQ6IHNoYWRvd1RhcmdldCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB3b3JrZXJJZCA9XG4gICAgICBzaGFkb3dUYXJnZXQgPT09IFwidGVzdFwiICYmIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiXG4gICAgICAgID8gcHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSURcbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHRlbXBsYXRlRGF0YWJhc2UgPVxuICAgICAgd29ya2VySWQgIT09IG51bGwgPyBgJHtjb25maWd1cmVkRGF0YWJhc2V9XyR7d29ya2VySWQgPz8gXCIxXCJ9YCA6IGNvbmZpZ3VyZWREYXRhYmFzZTtcbiAgICBjb25zdCBzaGFkb3dEYXRhYmFzZSA9IGAke3RlbXBsYXRlRGF0YWJhc2V9X19taWdyYXRpb25fc2hhZG93YDtcbiAgICBjb25zdCBjcmVhdGVTaGFkb3dDb25uZWN0aW9uID0gKGRhdGFiYXNlOiBzdHJpbmcpID0+XG4gICAgICBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgICAuLi5Tb25hbXUuZGJDb25maWdbc2hhZG93VGFyZ2V0XSxcbiAgICAgICAgY29ubmVjdGlvbjogeyAuLi5iYXNlVGFyZ2V0Q29ubiwgZGF0YWJhc2UgfSxcbiAgICAgIH0pO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IOyDge2ZqeyXkOyEnOuKlCDtirjrnpzsnq3shZjsnYQg7LSI6riw7ZmU7ZWY6rOgLCDsg4gg642w7J207YSw67Kg7J207IqkIOy7pOuEpeyFmOydhCDqsIDsoLjsmYDslbwg7ZWoXG4gICAgaWYgKGlzVGVzdCgpKSB7XG4gICAgICBhd2FpdCBEQi5jbGVhclRlc3RUcmFuc2FjdGlvbigpO1xuICAgICAgYXdhaXQgREIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIOq4sOyhtCBTaGFkb3cgREIg7IKt7KCcIO2bhCBTaGFkb3cgREIg7IOd7ISxXG4gICAgY29uc3QgdGRiID0gY3JlYXRlU2hhZG93Q29ubmVjdGlvbihcInBvc3RncmVzXCIpO1xuICAgIHRyeSB7XG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgICAgYXdhaXQgdGRiLnJhdyhcIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTID8/XCIsIFtzaGFkb3dEYXRhYmFzZV0pO1xuICAgICAgYXdhaXQgdGRiLnJhdyhcbiAgICAgICAgYFxuICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgICBXSEVSRSBkYXRuYW1lID0gP1xuICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKTtcbiAgICAgIGAsXG4gICAgICAgIFt0ZW1wbGF0ZURhdGFiYXNlXSxcbiAgICAgICk7XG4gICAgICBhd2FpdCB0ZGIucmF3KFwiQ1JFQVRFIERBVEFCQVNFID8/IFRFTVBMQVRFID8/XCIsIFtzaGFkb3dEYXRhYmFzZSwgdGVtcGxhdGVEYXRhYmFzZV0pO1xuXG4gICAgICAvLyBTaGFkb3cgRELsl5Ag7Jew6rKwXG4gICAgICBjb25zdCBzZGIgPSBjcmVhdGVTaGFkb3dDb25uZWN0aW9uKHNoYWRvd0RhdGFiYXNlKTtcblxuICAgICAgLy8gc2hhZG93IERCIO2FjOyKpO2KuCDsp4TtlolcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKFwic2hhZG93XCIsIFwic2hhZG93XCIsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBzZGIubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpO1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlNoYWRvdyBEQiDthYzsiqTtirjsl5Ag7ISx6rO17ZaI7Iq164uI64ukIVwiKSwge1xuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3Mob3B0aW9ucywge1xuICAgICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgICAgYWN0aW9uOiBcInNoYWRvd1wiLFxuICAgICAgICAgIGNvbm5LZXk6IFwic2hhZG93XCIsXG4gICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICBmaWxlczogYXBwbGllZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25uS2V5OiBcInNoYWRvd1wiLFxuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgdGhyb3cgbmV3IE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIFwic2hhZG93XCIsXG4gICAgICAgICAgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zaGFkb3dEYlRlc3RGYWlsZWRcIikpLFxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgc2RiLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gU2hhZG93IERCIOyCreygnFxuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGEoYCR7c2hhZG93RGF0YWJhc2V9IOyCreygnGApKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRkYi5yYXcoXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyA/P1wiLCBbc2hhZG93RGF0YWJhc2VdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNoYWRvdyBEQiDsoJXrpqwg7Iuk7YyoOlwiLCBlKTsgLy8g7J206rKMIOyXhuycvOuptCDsobDsmqntnogg64iE7IiYXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0ZGIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBp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
@@ -63,6 +63,23 @@ declare class PostgreSQLSchemaReaderClass {
63
63
  * @returns MigrationSet 객체
64
64
  */
65
65
  getMigrationSetFromDB(compareDB: RawCapableKnex, table: string): Promise<MigrationSet | null>;
66
+ /**
67
+ * public 스키마의 모든 테이블을 한 번에 읽어서 테이블별 MigrationSet을 반환합니다.
68
+ *
69
+ * getMigrationSetFromDB를 테이블마다 호출하면 (컬럼/인덱스/FK/벡터차원) × 테이블 수 만큼
70
+ * 왕복이 발생한다. 비교 대상이 수십 개면 원격 DB에서 왕복 비용이 지배적이 되므로,
71
+ * 종류별로 한 번씩만 조회한다. 행 해석은 getMigrationSetFromDB와 동일한
72
+ * buildMigrationSet을 공유한다.
73
+ *
74
+ * @returns 테이블명 → MigrationSet. DB에 없는 테이블은 항목이 없다.
75
+ */
76
+ getMigrationSetFromDBAll(compareDB: RawCapableKnex): Promise<Map<string, MigrationSet>>;
77
+ /**
78
+ * 조회 결과 행들을 MigrationSet으로 변환합니다.
79
+ * 테이블 단위 조회(getMigrationSetFromDB)와 전체 일괄 조회(getMigrationSetFromDBAll)가
80
+ * 이 로직을 공유합니다.
81
+ */
82
+ private buildMigrationSet;
66
83
  /**
67
84
  * PostgreSQL의 constraint action을 Knex 형식으로 변환
68
85
  */
@@ -71,6 +88,14 @@ declare class PostgreSQLSchemaReaderClass {
71
88
  * 기존 테이블 읽어서 cols, indexes, foreigns 반환
72
89
  */
73
90
  readTable(compareDB: RawCapableKnex, tableName: string): Promise<[PgColumn[], PgIndex[], PgForeign[]]>;
91
+ /**
92
+ * public 스키마 테이블들의 cols/indexes/foreigns를 테이블별로 묶어서 반환합니다.
93
+ *
94
+ * tableName을 주면 그 테이블만, 생략하면 전체를 조회합니다. 쿼리는 두 경로가 공유하므로
95
+ * 단일 조회와 일괄 조회의 해석이 갈라지지 않습니다. 전체 조회 시에는 테이블마다 4번씩
96
+ * 왕복하는 대신 종류별로 한 번씩만 돌기 때문에, 원격 DB에서 왕복 비용이 크게 줄어듭니다.
97
+ */
98
+ private readTables;
74
99
  private restoreMigrationIndexType;
75
100
  private restoreGenericUsing;
76
101
  private parseVectorIndexOptions;
@@ -91,6 +116,11 @@ declare class PostgreSQLSchemaReaderClass {
91
116
  * pg_attribute의 atttypmod에서 차원 수를 추출합니다.
92
117
  */
93
118
  private getVectorDimensions;
119
+ /**
120
+ * vector 컬럼의 dimensions를 테이블별로 조회합니다.
121
+ * tableName을 생략하면 public 스키마 전체를 한 번에 조회합니다.
122
+ */
123
+ private getVectorDimensionsAll;
94
124
  /**
95
125
  * PostgreSQL 컬럼 타입을 분석하여 MigrationColumn 객체로 변환합니다.
96
126
  */
@@ -1 +1 @@
1
- {"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"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"}