@bitgo-beta/sdk-coin-ada 2.2.3-alpha.462 → 2.2.3-alpha.464
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":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EACL,WAAW,EACX,OAAO,EACP,sBAAsB,EAEtB,SAAS,IAAI,aAAa,EAC1B,SAAS,EACT,eAAe,EAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,WAAW,MAAM,0CAA0C,CAAC;AAexE,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAG,WAAW,CAAC;IACrC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAM;IACnC,SAAS,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,CAAM;IACtD,SAAS,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,CAAM;IACxD,SAAS,CAAC,eAAe,EAAE,SAAS,EAAE,CAAM;IAC5C,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,CAAM;IACxC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,IAAI,SAAK;IACnB,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,EAAE,CAAM;IACjD,SAAS,CAAC,YAAY,EAAE,UAAU,EAAE,CAAM;IAC1C,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC;IACjC,SAAS,CAAC,YAAY,EAAE,KAAK,EAAE,CAAM;IACrC,2CAA2C;IAC3C,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACpC,2CAA2C;IAC3C,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAM;IACrD,SAAS,CAAC,gBAAgB,EAAE,eAAe,GAAG,SAAS,CAAC;IACxD,OAAO,CAAC,IAAI,CAAS;IACrB,qDAAqD;IACrD,OAAO,CAAC,mBAAmB,CAAS;IACpC;;;SAGK;IACL,OAAO,CAAC,uBAAuB,CAA2B;gBAE9C,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM7C,KAAK,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAKhC,MAAM,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAKlC,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAKtB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKpB;;;;;OAKG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAQlG,yBAAyB;IAIzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB;;;OAGG;IACH,kBAAkB;IAKlB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAK5C;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAmDlC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAMjE;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAWjB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAuBlB;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IA4D1B;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAsBnB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAgCvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,0BAA0B;IAsDlC,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IA2V3D,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAKvD,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;IAED,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAMnE,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAQ/B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,GAAG,GAAG,IAAI;IAQjD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAMnD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAOrC,kBAAkB;IAClB,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/D,OAAO,CAAC,gBAAgB;CAGzB"}
|
|
@@ -452,7 +452,34 @@ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
|
452
452
|
let totalAmountToSend = CardanoWasm.BigNum.zero();
|
|
453
453
|
this._transactionOutputs.forEach((output) => {
|
|
454
454
|
const amount = CardanoWasm.BigNum.from_str(output.amount);
|
|
455
|
-
|
|
455
|
+
if (this._sponsorshipInfo && this._sponsorshipInfo.isRebuild && output.multiAssets) {
|
|
456
|
+
let txOutputBuilder = CardanoWasm.TransactionOutputBuilder.new();
|
|
457
|
+
const toAddress = utils_1.default.getWalletAddress(output.address);
|
|
458
|
+
txOutputBuilder = txOutputBuilder.with_address(toAddress);
|
|
459
|
+
let txOutputAmountBuilder = txOutputBuilder.next();
|
|
460
|
+
const multiAssets = output.multiAssets;
|
|
461
|
+
const multiAsset = CardanoWasm.MultiAsset.new();
|
|
462
|
+
for (let i = 0; i < multiAssets.keys().len(); i++) {
|
|
463
|
+
const policyId = multiAssets.keys().get(i);
|
|
464
|
+
const assets = multiAssets.get(policyId);
|
|
465
|
+
const asset = CardanoWasm.Assets.new();
|
|
466
|
+
if (!assets) {
|
|
467
|
+
continue;
|
|
468
|
+
}
|
|
469
|
+
const assetName = assets.keys().get(0);
|
|
470
|
+
const quantity = assets.get(assetName);
|
|
471
|
+
if (!quantity) {
|
|
472
|
+
continue;
|
|
473
|
+
}
|
|
474
|
+
asset.insert(assetName, quantity);
|
|
475
|
+
multiAsset.insert(policyId, asset);
|
|
476
|
+
}
|
|
477
|
+
txOutputAmountBuilder = txOutputAmountBuilder.with_coin_and_asset(amount, multiAsset);
|
|
478
|
+
outputs.add(txOutputAmountBuilder.build());
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
outputs.add(CardanoWasm.TransactionOutput.new(utils_1.default.getWalletAddress(output.address), CardanoWasm.Value.new(amount)));
|
|
482
|
+
}
|
|
456
483
|
totalAmountToSend = totalAmountToSend.checked_add(amount);
|
|
457
484
|
});
|
|
458
485
|
if (this._fee.is_zero()) {
|
|
@@ -753,4 +780,4 @@ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
|
753
780
|
}
|
|
754
781
|
}
|
|
755
782
|
exports.TransactionBuilder = TransactionBuilder;
|
|
756
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsbURBUzhCO0FBQzlCLCtDQUFxSDtBQUNySCx1Q0FBb0M7QUFDcEMsaURBQXNEO0FBQ3RELHNGQUF3RTtBQUN4RSwrRkFBa0U7QUFFbEU7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHO0lBQ3ZCLDZCQUE2QjtJQUM3QixhQUFhLEVBQUUsSUFBSTtJQUNuQiw2QkFBNkI7SUFDN0IsYUFBYSxFQUFFLFFBQVE7SUFDdkIsMkNBQTJDO0lBQzNDLGFBQWEsRUFBRSxLQUFLO0NBQ3JCLENBQUM7QUFFRixNQUFzQixrQkFBbUIsU0FBUSxpQ0FBc0I7SUE0QnJFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBM0JYLGFBQVEsR0FBYyxFQUFFLENBQUM7UUFDekIsdUJBQWtCLEdBQXVCLEVBQUUsQ0FBQztRQUM1Qyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBQzlDLG9CQUFlLEdBQWdCLEVBQUUsQ0FBQztRQUNsQyxnQkFBVyxHQUFnQixFQUFFLENBQUM7UUFHOUIsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULFdBQU0sR0FBOEIsRUFBRSxDQUFDO1FBQ3ZDLGlCQUFZLEdBQWlCLEVBQUUsQ0FBQztRQUVoQyxpQkFBWSxHQUFZLEVBQUUsQ0FBQztRQUdyQywyQ0FBMkM7UUFDakMscUJBQWdCLEdBQXdCLEVBQUUsQ0FBQztRQUdyRCxxREFBcUQ7UUFDN0Msd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ3BDOzs7YUFHSztRQUNHLDRCQUF1QixHQUF3QixFQUFFLENBQUM7UUFJeEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHlCQUFXLENBQUMsV0FBVyxDQUFDLENB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ZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBaDBCRCxnREFnMEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQmFzZUFkZHJlc3MsXG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgUHVibGljS2V5IGFzIEJhc2VQdWJsaWNLZXksXG4gIFNpZ25hdHVyZSxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBVdGlsc0Vycm9yLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBc3NldCwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uSW5wdXQsIFRyYW5zYWN0aW9uT3V0cHV0LCBXaXRoZHJhd2FsLCBTcG9uc29yc2hpcEluZm8gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHV0aWwsIHsgTUlOX0FEQV9GT1JfT05FX0FTU0VUIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgKiBhcyBDYXJkYW5vV2FzbSBmcm9tICdAZW11cmdvL2NhcmRhbm8tc2VyaWFsaXphdGlvbi1saWItbm9kZWpzJztcbmltcG9ydCB7IEJpZ051bSB9IGZyb20gJ0BlbXVyZ28vY2FyZGFuby1zZXJpYWxpemF0aW9uLWxpYi1ub2RlanMnO1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdHJhbnNhY3Rpb24gYnVpbGRpbmdcbiAqL1xuY29uc3QgRkVFX0NPRUZGSUNJRU5UUyA9IHtcbiAgLyoqIExpbmVhciBmZWUgcGFyYW1ldGVyIGEgKi9cbiAgQV9DT0VGRklDSUVOVDogJzQ0JyxcbiAgLyoqIExpbmVhciBmZWUgcGFyYW1ldGVyIGIgKi9cbiAgQl9DT0VGRklDSUVOVDogJzE1NTM4MScsXG4gIC8qKiBBZGRpdGlvbmFsIHNhZmV0eSBtYXJnaW4gZm9yIHRoZSBmZWUgKi9cbiAgU0FGRVRZX01BUkdJTjogJzQ0MCcsXG59O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb24hOiBUcmFuc2FjdGlvbjtcbiAgcHJvdGVjdGVkIF9zaWduZXJzOiBLZXlQYWlyW10gPSBbXTtcbiAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbklucHV0czogVHJhbnNhY3Rpb25JbnB1dFtdID0gW107XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb25PdXRwdXRzOiBUcmFuc2FjdGlvbk91dHB1dFtdID0gW107XG4gIHByb3RlY3RlZCBfaW5pdFNpZ25hdHVyZXM6IFNpZ25hdHVyZVtdID0gW107XG4gIHByb3RlY3RlZCBfc2lnbmF0dXJlczogU2lnbmF0dXJlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9jaGFuZ2VBZGRyZXNzOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfc2VuZGVyQmFsYW5jZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3R0bCA9IDA7XG4gIHByb3RlY3RlZCBfY2VydHM6IENhcmRhbm9XYXNtLkNlcnRpZmljYXRlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF93aXRoZHJhd2FsczogV2l0aGRyYXdhbFtdID0gW107XG4gIHByb3RlY3RlZCBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwcm90ZWN0ZWQgX211bHRpQXNzZXRzOiBBc3NldFtdID0gW107XG4gIC8qKiBBZGRyZXNzIG9mIHRoZSB0cmFuc2FjdGlvbiByZWNpcGllbnQgKi9cbiAgcHJvdGVjdGVkIF9yZWNpcGllbnRBZGRyZXNzOiBzdHJpbmc7XG4gIC8qKiBNYXAgb2Ygc2VuZGVyJ3MgYXNzZXRzIGJ5IGFzc2V0IG5hbWUgKi9cbiAgcHJvdGVjdGVkIF9zZW5kZXJBc3NldExpc3Q6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgcHJvdGVjdGVkIF9zcG9uc29yc2hpcEluZm86IFNwb25zb3JzaGlwSW5mbyB8IHVuZGVmaW5lZDsgLy8gRW5yaWNoZWQgZm9yIHNwb25zb3JlZCB0cmFuc2FjdGlvbnNcbiAgcHJpdmF0ZSBfZmVlOiBCaWdOdW07XG4gIC8qKiBGbGFnIGluZGljYXRpbmcgaWYgdGhpcyBpcyBhIHRva2VuIHRyYW5zYWN0aW9uICovXG4gIHByaXZhdGUgX2lzVG9rZW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAvKiogRGVlcCBjbG9uZSBvZiBfc2VuZGVyQXNzZXRMaXN0IC0gZm9yIG1hbmlwdWxhdGluZyBkdXJpbmcgdHdvIGl0ZXJhdGlvbnNcbiAgICogICAtIG9uZSBmb3IgY2FsY3VsYXRpbmcgdGhlIGZlZVxuICAgKiAgIC0gb25lIGZvciB0aGUgYWN0dWFsIHRyYW5zYWN0aW9uIGJ1aWxkIHdpdGggdGhlIGNhbGN1bGF0ZWQgZmVlXG4gICAqICovXG4gIHByaXZhdGUgX211dGFibGVTZW5kZXJBc3NldExpc3Q6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fZmVlID0gQmlnTnVtLnplcm8oKTtcbiAgfVxuXG4gIGlucHV0KGk6IFRyYW5zYWN0aW9uSW5wdXQpOiB0aGlzIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbklucHV0cy5wdXNoKGkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3V0cHV0KG86IFRyYW5zYWN0aW9uT3V0cHV0KTogdGhpcyB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25PdXRwdXRzLnB1c2gobyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhc3NldHMoYTogQXNzZXQpOiB0aGlzIHtcbiAgICB0aGlzLl9tdWx0aUFzc2V0cy5wdXNoKGEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdHRsKHQ6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuX3R0bCA9IHQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY2hhbmdlIGFkZHJlc3MgYW5kIGlucHV0IGJhbGFuY2VzIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGFkZHIgLSBUaGUgYWRkcmVzcyB3aGVyZSBjaGFuZ2Ugd2lsbCBiZSBzZW50XG4gICAqIEBwYXJhbSB0b3RhbElucHV0QmFsYW5jZSAtIFRoZSB0b3RhbCBBREEgaW5wdXQgYmFsYW5jZSBpbiBMb3ZlbGFjZVxuICAgKiBAcGFyYW0gaW5wdXRBc3NldExpc3QgLSBPcHRpb25hbCBtYXAgb2YgdG9rZW4gYXNzZXRzIGluIHRoZSBpbnB1dFxuICAgKi9cbiAgY2hhbmdlQWRkcmVzcyhhZGRyOiBzdHJpbmcsIHRvdGFsSW5wdXRCYWxhbmNlOiBzdHJpbmcsIGlucHV0QXNzZXRMaXN0PzogUmVjb3JkPHN0cmluZywgYW55Pik6IHRoaXMge1xuICAgIHRoaXMuX2NoYW5nZUFkZHJlc3MgPSBhZGRyO1xuICAgIHRoaXMuX3NlbmRlckJhbGFuY2UgPSB0b3RhbElucHV0QmFsYW5jZTtcbiAgICB0aGlzLl9zZW5kZXJBc3NldExpc3QgPSBpbnB1dEFzc2V0TGlzdCA/PyB7fTtcbiAgICB0aGlzLnNldE11dGFibGVTZW5kZXJBc3NldExpc3QoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE11dGFibGVTZW5kZXJBc3NldExpc3QoKSB7XG4gICAgdGhpcy5fbXV0YWJsZVNlbmRlckFzc2V0TGlzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5fc2VuZGVyQXNzZXRMaXN0KSk7XG4gIH1cblxuICBmZWUoZmVlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLl9mZWUgPSBCaWdOdW0uZnJvbV9zdHIoZmVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGlzIHRyYW5zYWN0aW9uIGFzIGEgdG9rZW4gdHJhbnNhY3Rpb25cbiAgICogRW5hYmxlcyBzcGVjaWFsIGhhbmRsaW5nIGZvciB0b2tlbiB0cmFuc2ZlcnNcbiAgICovXG4gIGlzVG9rZW5UcmFuc2FjdGlvbigpIHtcbiAgICB0aGlzLl9pc1Rva2VuVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3BvbnNvcnNoaXBJbmZvKGluZm86IFNwb25zb3JzaGlwSW5mbyk6IHRoaXMge1xuICAgIHRoaXMuX3Nwb25zb3JzaGlwSW5mbyA9IGluZm87XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24gYnVpbGRlciBmaWVsZHMgdXNpbmcgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSB0eCB0aGUgdHJhbnNhY3Rpb24gZGF0YVxuICAgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0eDtcbiAgICBjb25zdCB0eG5Cb2R5ID0gdHgudHJhbnNhY3Rpb24uYm9keSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHhuQm9keS5pbnB1dHMoKS5sZW4oKTsgaSsrKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IHR4bkJvZHkuaW5wdXRzKCkuZ2V0KGkpO1xuICAgICAgdGhpcy5pbnB1dCh7XG4gICAgICAgIHRyYW5zYWN0aW9uX2lkOiBCdWZmZXIuZnJvbShpbnB1dC50cmFuc2FjdGlvbl9pZCgpLnRvX2J5dGVzKCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdHJhbnNhY3Rpb25faW5kZXg6IGlucHV0LmluZGV4KCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eG5Cb2R5Lm91dHB1dHMoKS5sZW4oKTsgaSsrKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSB0eG5Cb2R5Lm91dHB1dHMoKS5nZXQoaSk7XG4gICAgICB0aGlzLm91dHB1dCh7XG4gICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzKCkudG9fYmVjaDMyKCksXG4gICAgICAgIGFtb3VudDogb3V0cHV0LmFtb3VudCgpLmNvaW4oKS50b19zdHIoKSxcbiAgICAgICAgbXVsdGlBc3NldHM6IG91dHB1dC5hbW91bnQoKS5tdWx0aWFzc2V0KCkgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR4bkJvZHkuY2VydHMoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjZXJ0cyA9IHR4bkJvZHkuY2VydHMoKSBhcyBDYXJkYW5vV2FzbS5DZXJ0aWZpY2F0ZXM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNlcnRzLmxlbigpOyBpKyspIHtcbiAgICAgICAgdGhpcy5fY2VydHMucHVzaChjZXJ0cy5nZXQoaSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eG5Cb2R5LndpdGhkcmF3YWxzKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgd2l0aGRyYXdhbHMgPSB0eG5Cb2R5LndpdGhkcmF3YWxzKCkgYXMgQ2FyZGFub1dhc20uV2l0aGRyYXdhbHM7XG4gICAgICBjb25zdCBrZXlzID0gd2l0aGRyYXdhbHMua2V5cygpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbigpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmV3YXJkQWRkcmVzcyA9IGtleXMuZ2V0KGkpIGFzIENhcmRhbm9XYXNtLlJld2FyZEFkZHJlc3M7XG4gICAgICAgIGNvbnN0IHJld2FyZCA9IHdpdGhkcmF3YWxzLmdldChyZXdhcmRBZGRyZXNzKSBhcyBDYXJkYW5vV2FzbS5CaWdOdW07XG4gICAgICAgIHRoaXMuX3dpdGhkcmF3YWxzLnB1c2goeyBzdGFrZUFkZHJlc3M6IHJld2FyZEFkZHJlc3MudG9fYWRkcmVzcygpLnRvX2JlY2gzMigpLCB2YWx1ZTogcmV3YXJkLnRvX3N0cigpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3R0bCA9IHR4LnRyYW5zYWN0aW9uLmJvZHkoKS50dGwoKSBhcyBudW1iZXI7XG4gICAgdGhpcy5fZmVlID0gdHgudHJhbnNhY3Rpb24uYm9keSgpLmZlZSgpO1xuXG4gICAgaWYgKHR4LnRyYW5zYWN0aW9uLndpdG5lc3Nfc2V0KCkudmtleXMoKSkge1xuICAgICAgY29uc3QgdmtleXMgPSB0eC50cmFuc2FjdGlvbi53aXRuZXNzX3NldCgpLnZrZXlzKCkhIGFzIENhcmRhbm9XYXNtLlZrZXl3aXRuZXNzZXM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZrZXlzLmxlbigpOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmtleSA9IHZrZXlzLmdldChpKTtcbiAgICAgICAgdGhpcy5faW5pdFNpZ25hdHVyZXMucHVzaCh7XG4gICAgICAgICAgcHVibGljS2V5OiB7IHB1YjogdmtleS52a2V5KCkucHVibGljX2tleSgpLnRvX2hleCgpIH0sXG4gICAgICAgICAgc2lnbmF0dXJlOiBCdWZmZXIuZnJvbSh2a2V5LnNpZ25hdHVyZSgpLnRvX2hleCgpLCAnaGV4JyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgdGhpcy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0aGlzLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSB0cmFuc2FjdGlvbiB0aGF0IGluY2x1ZGVzIHRva2VuIGFzc2V0c1xuICAgKiBAcmV0dXJucyBUaGUgYnVpbHQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1Rva2VuQnVpbGQoKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGlucHV0cyA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uSW5wdXRzLm5ldygpO1xuICAgIGxldCBvdXRwdXRzID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXRzLm5ldygpO1xuICAgIHRoaXMuYWRkSW5wdXRzKGlucHV0cyk7XG4gICAgLy8gRmVlIGlzIG5ldmVyIHNldCBzbyBmYXIgZnJvbSBJTVNcbiAgICBpZiAodGhpcy5fZmVlLmlzX3plcm8oKSkge1xuICAgICAgdGhpcy5hZGRPdXRwdXRzKG91dHB1dHMpO1xuICAgICAgY29uc3QgdHhEcmFmdCA9IHRoaXMucHJlcGFyZUFkYVRyYW5zYWN0aW9uRHJhZnQoaW5wdXRzLCBvdXRwdXRzLCBmYWxzZSk7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUZlZSh0eERyYWZ0KTtcbiAgICAgIHRoaXMuc2V0RmVlSW5UcmFuc2FjdGlvbigpO1xuICAgIH1cbiAgICAvLyBSZXNldCBvdXRwdXRzIHRvIGFkZCB0aGVtIGJhY2sgd2l0aCB0aGUgY29ycmVjdCBjaGFuZ2VcbiAgICBvdXRwdXRzID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXRzLm5ldygpO1xuICAgIHRoaXMuc2V0TXV0YWJsZVNlbmRlckFzc2V0TGlzdCgpO1xuICAgIHRoaXMuYWRkT3V0cHV0cyhvdXRwdXRzKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi50cmFuc2FjdGlvbiA9IHRoaXMucHJlcGFyZUFkYVRyYW5zYWN0aW9uRHJhZnQoaW5wdXRzLCBvdXRwdXRzLCB0cnVlKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRyYW5zYWN0aW9uIGlucHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGlucHV0cyAtIFRoZSBpbnB1dHMgY29sbGVjdGlvbiB0byBhZGQgdG9cbiAgICovXG4gIHByaXZhdGUgYWRkSW5wdXRzKGlucHV0cykge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uSW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpbnB1dHMuYWRkKFxuICAgICAgICBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbklucHV0Lm5ldyhcbiAgICAgICAgICBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbkhhc2guZnJvbV9ieXRlcyhCdWZmZXIuZnJvbShpbnB1dC50cmFuc2FjdGlvbl9pZCwgJ2hleCcpKSxcbiAgICAgICAgICBpbnB1dC50cmFuc2FjdGlvbl9pbmRleFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgb3V0cHV0cyB0byB0aGUgdHJhbnNhY3Rpb24gaW5jbHVkaW5nIHRva2VuIG91dHB1dHMgYW5kIGNoYW5nZVxuICAgKiBAcGFyYW0gb3V0cHV0cyAtIFRoZSBvdXRwdXRzIGNvbGxlY3Rpb24gdG8gYWRkIHRvXG4gICAqL1xuICBwcml2YXRlIGFkZE91dHB1dHMob3V0cHV0cykge1xuICAgIGlmICh0aGlzLl9zcG9uc29yc2hpcEluZm8pIHtcbiAgICAgIGNvbnN0IGZlZUFkZHJlc3NVdHhvQmFsYW5jZSA9IENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih0aGlzLl9zcG9uc29yc2hpcEluZm8uZmVlQWRkcmVzc0lucHV0QmFsYW5jZSk7XG4gICAgICBsZXQgZmVlQWRkcmVzc0NoYW5nZSA9IGZlZUFkZHJlc3NVdHhvQmFsYW5jZS5jaGVja2VkX3N1Yih0aGlzLl9mZWUpO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzc1V0eG9CYWxhbmNlID0gQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKHRoaXMuX3NlbmRlckJhbGFuY2UpO1xuICAgICAgaWYgKHRoaXMuX2lzVG9rZW5UcmFuc2FjdGlvbikge1xuICAgICAgICAvLyBGZWUgYWRkcmVzcyBzcG9uc29ycyBtaW4gYWRhXG4gICAgICAgIGZlZUFkZHJlc3NDaGFuZ2UgPSB0aGlzLmFkZFJlY2VpdmVyT3V0cHV0cyhvdXRwdXRzLCBmZWVBZGRyZXNzQ2hhbmdlKTtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2VPdXRwdXQoc2VuZGVyQWRkcmVzc1V0eG9CYWxhbmNlLCBvdXRwdXRzLCB0aGlzLl9jaGFuZ2VBZGRyZXNzKTtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2VPdXRwdXQoZmVlQWRkcmVzc0NoYW5nZSwgb3V0cHV0cywgdGhpcy5fc3BvbnNvcnNoaXBJbmZvLmZlZUFkZHJlc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VuZGVyQ2hhbmdlQWZ0ZXJSZWNlaXZlckRlZHVjdGlvbnMgPSB0aGlzLmFkZFJlY2VpdmVyT3V0cHV0cyhvdXRwdXRzLCBzZW5kZXJBZGRyZXNzVXR4b0JhbGFuY2UpO1xuICAgICAgICB0aGlzLmFkZENoYW5nZU91dHB1dChzZW5kZXJDaGFuZ2VBZnRlclJlY2VpdmVyRGVkdWN0aW9ucywgb3V0cHV0cywgdGhpcy5fY2hhbmdlQWRkcmVzcyk7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlT3V0cHV0KGZlZUFkZHJlc3NDaGFuZ2UsIG91dHB1dHMsIHRoaXMuX3Nwb25zb3JzaGlwSW5mby5mZWVBZGRyZXNzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdXR4b0JhbGFuY2UgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIodGhpcy5fc2VuZGVyQmFsYW5jZSk7IC8vIFRvdGFsIFVUWE8gYmFsYW5jZVxuICAgICAgY29uc3QgY2hhbmdlID0gdXR4b0JhbGFuY2UuY2hlY2tlZF9zdWIodGhpcy5fZmVlKTtcbiAgICAgIGNvbnN0IGNoYW5nZUFmdGVyUmVjZWl2ZXJEZWR1Y3Rpb25zID0gdGhpcy5hZGRSZWNlaXZlck91dHB1dHMob3V0cHV0cywgY2hhbmdlKTtcbiAgICAgIHRoaXMuYWRkQ2hhbmdlT3V0cHV0KGNoYW5nZUFmdGVyUmVjZWl2ZXJEZWR1Y3Rpb25zLCBvdXRwdXRzLCB0aGlzLl9jaGFuZ2VBZGRyZXNzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyByZWNlaXZlciBvdXRwdXRzIHRvIHRoZSB0cmFuc2FjdGlvbiBhbmQgY2FsY3VsYXRlcyB0aGUgcmVtYWluaW5nIGNoYW5nZVxuICAgKiBAcGFyYW0gb3V0cHV0cyAtIFRyYW5zYWN0aW9uIG91dHB1dHMgY29sbGVjdGlvblxuICAgKiBAcGFyYW0gY2hhbmdlIC0gQ3VycmVudCBjaGFuZ2UgYW1vdW50IGluIEFEQVxuICAgKiBAcmV0dXJucyBSZW1haW5pbmcgY2hhbmdlIGFmdGVyIGFkZGluZyByZWNlaXZlciBvdXRwdXRzXG4gICAqL1xuICBwcml2YXRlIGFkZFJlY2VpdmVyT3V0cHV0cyhvdXRwdXRzLCBjaGFuZ2UpIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbk91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBpZiAoIW91dHB1dC5hZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3V0cHV0OiBtaXNzaW5nIGFkZHJlc3MnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVjZWl2ZXJBZGRyZXNzID0gb3V0cHV0LmFkZHJlc3M7XG4gICAgICBjb25zdCByZWNlaXZlckFtb3VudCA9IG91dHB1dC5hbW91bnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyQW1vdW50Qk4gPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIocmVjZWl2ZXJBbW91bnQpO1xuICAgICAgICBjaGFuZ2UgPSBjaGFuZ2UuY2hlY2tlZF9zdWIocmVjZWl2ZXJBbW91bnRCTik7XG5cbiAgICAgICAgaWYgKGNoYW5nZS5sZXNzX3RoYW4oQ2FyZGFub1dhc20uQmlnTnVtLnplcm8oKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICAgJ0luc3VmZmljaWVudCBmdW5kczogbm90IGVub3VnaCBBREEgdG8gY292ZXIgcmVjZWl2ZXIgb3V0cHV0IGFtb3VudHMgYW5kIGZlZXMnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG91dHB1dC5tdWx0aUFzc2V0cyBpcyBzZXQgd2hlbiB0aGVyZSBhcmUgdG9rZW4gYXNzZXRzIHRvIHNlbmRcbiAgICAgICAgY29uc3QgbXVsdGlBc3NldHMgPSBvdXRwdXQubXVsdGlBc3NldHMgYXMgQXNzZXQ7XG4gICAgICAgIGlmIChtdWx0aUFzc2V0cykge1xuICAgICAgICAgIGNvbnN0IHBvbGljeUlkID0gbXVsdGlBc3NldHMucG9saWN5X2lkO1xuICAgICAgICAgIGNvbnN0IGFzc2V0TmFtZSA9IG11bHRpQXNzZXRzLmFzc2V0X25hbWU7XG4gICAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBtdWx0aUFzc2V0cy5xdWFudGl0eTtcbiAgICAgICAgICBjb25zdCBmaW5nZXJwcmludCA9IG11bHRpQXNzZXRzLmZpbmdlcnByaW50IGFzIHN0cmluZztcblxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdHkgPSB0aGlzLl9tdXRhYmxlU2VuZGVyQXNzZXRMaXN0W2ZpbmdlcnByaW50XS5xdWFudGl0eTtcbiAgICAgICAgICBjb25zdCByZW1haW5pbmdRdHkgPSBCaWdJbnQoY3VycmVudFF0eSkgLSBCaWdJbnQocXVhbnRpdHkpO1xuICAgICAgICAgIGlmIChyZW1haW5pbmdRdHkgPCAwbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW5zdWZmaWNpZW50IHF0eTogbm90IGVub3VnaCB0b2tlbiBxdHkgdG8gY292ZXIgcmVjZWl2ZXIgb3V0cHV0Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fbXV0YWJsZVNlbmRlckFzc2V0TGlzdFtmaW5nZXJwcmludF0ucXVhbnRpdHkgPSByZW1haW5pbmdRdHkudG9TdHJpbmcoKTtcblxuICAgICAgICAgIGNvbnN0IG1pbkFtb3VudE5lZWRlZEZvckFzc2V0T3V0cHV0ID0gdGhpcy5hZGRUb2tlbnNUb091dHB1dChjaGFuZ2UsIG91dHB1dHMsIHJlY2VpdmVyQWRkcmVzcywge1xuICAgICAgICAgICAgcG9saWN5X2lkOiBwb2xpY3lJZCxcbiAgICAgICAgICAgIGFzc2V0X25hbWU6IGFzc2V0TmFtZSxcbiAgICAgICAgICAgIHF1YW50aXR5LFxuICAgICAgICAgICAgZmluZ2VycHJpbnQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjaGFuZ2UgPSBjaGFuZ2UuY2hlY2tlZF9zdWIobWluQW1vdW50TmVlZGVkRm9yQXNzZXRPdXRwdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5hdGl2ZSBjb2luIHNlbmRcbiAgICAgICAgICBjb25zdCBhbW91bnQgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIocmVjZWl2ZXJBbW91bnQpO1xuICAgICAgICAgIG91dHB1dHMuYWRkKFxuICAgICAgICAgICAgQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXQubmV3KHV0aWwuZ2V0V2FsbGV0QWRkcmVzcyhyZWNlaXZlckFkZHJlc3MpLCBDYXJkYW5vV2FzbS5WYWx1ZS5uZXcoYW1vdW50KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgQnVpbGRUcmFuc2FjdGlvbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBFcnJvciBwcm9jZXNzaW5nIG91dHB1dDogJHtlLm1lc3NhZ2UgPz8gZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdG9rZW5zIHRvIGEgdHJhbnNhY3Rpb24gb3V0cHV0XG4gICAqIEBwYXJhbSBjaGFuZ2UgLSBUaGUgY3VycmVudCBjaGFuZ2UgYW1vdW50IGluIExvdmVsYWNlXG4gICAqIEBwYXJhbSBvdXRwdXRzIC0gVGhlIG91dHB1dHMgY29sbGVjdGlvbiB0byBhZGQgdG9cbiAgICogQHBhcmFtIGFkZHJlc3MgLSBUaGUgcmVjaXBpZW50IGFkZHJlc3NcbiAgICogQHBhcmFtIGFzc2V0IC0gVGhlIGFzc2V0IHRvIGFkZFxuICAgKiBAcmV0dXJucyBUaGUgbWluaW11bSBBREEgYW1vdW50IG5lZWRlZCBmb3IgdGhpcyBhc3NldCBvdXRwdXRcbiAgICovXG4gIHByaXZhdGUgYWRkVG9rZW5zVG9PdXRwdXQoY2hhbmdlOiBCaWdOdW0sIG91dHB1dHM6IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0cywgYWRkcmVzcywgYXNzZXQ6IEFzc2V0KTogQmlnTnVtIHtcbiAgICBjb25zdCBtaW5BbW91bnROZWVkZWRGb3JPbmVBc3NldE91dHB1dCA9IENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihNSU5fQURBX0ZPUl9PTkVfQVNTRVQpO1xuICAgIGlmIChjaGFuZ2UubGVzc190aGFuKG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEluc3VmZmljaWVudCBmdW5kczogbmVlZCBhIG1pbmltdW0gb2YgJHtNSU5fQURBX0ZPUl9PTkVfQVNTRVR9IGxvdmVsYWNlIHBlciBvdXRwdXQgdG8gY29uc3RydWN0IHRva2VuIHRyYW5zYWN0aW9uc2BcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRUb2tlbnMoYXNzZXQsIG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0LCBvdXRwdXRzLCBhZGRyZXNzKTtcbiAgICByZXR1cm4gbWluQW1vdW50TmVlZGVkRm9yT25lQXNzZXRPdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRva2VuIG91dHB1dHMgZm9yIGEgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGFzc2V0IC0gVGhlIGFzc2V0IHRvIGluY2x1ZGUgaW4gdGhlIG91dHB1dFxuICAgKiBAcGFyYW0gbWluQW1vdW50TmVlZGVkRm9yT25lQXNzZXRPdXRwdXQgLSBNaW5pbXVtIEFEQSByZXF1aXJlZCBmb3IgdGhpcyBhc3NldCBvdXRwdXRcbiAgICogQHBhcmFtIG91dHB1dHMgLSBUcmFuc2FjdGlvbiBvdXRwdXRzIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIGFkZHJlc3MgLSBSZWNpcGllbnQgYWRkcmVzc1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRva2Vucyhhc3NldDogQXNzZXQsIG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0LCBvdXRwdXRzLCBhZGRyZXNzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCB0eE91dHB1dEJ1aWxkZXIgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dEJ1aWxkZXIubmV3KCk7XG4gICAgICBjb25zdCB0b0FkZHJlc3MgPSB1dGlsLmdldFdhbGxldEFkZHJlc3MoYWRkcmVzcyk7XG4gICAgICB0eE91dHB1dEJ1aWxkZXIgPSB0eE91dHB1dEJ1aWxkZXIud2l0aF9hZGRyZXNzKHRvQWRkcmVzcyk7XG4gICAgICBsZXQgdHhPdXRwdXRBbW91bnRCdWlsZGVyID0gdHhPdXRwdXRCdWlsZGVyLm5leHQoKTtcbiAgICAgIGNvbnN0IGFzc2V0TmFtZSA9IENhcmRhbm9XYXNtLkFzc2V0TmFtZS5uZXcoQnVmZmVyLmZyb20oYXNzZXQuYXNzZXRfbmFtZSwgJ2hleCcpKTtcbiAgICAgIGNvbnN0IHBvbGljeUlkID0gQ2FyZGFub1dhc20uU2NyaXB0SGFzaC5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKGFzc2V0LnBvbGljeV9pZCwgJ2hleCcpKTtcbiAgICAgIGNvbnN0IG11bHRpQXNzZXQgPSBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0Lm5ldygpO1xuICAgICAgY29uc3QgYXNzZXRzID0gQ2FyZGFub1dhc20uQXNzZXRzLm5ldygpO1xuICAgICAgYXNzZXRzLmluc2VydChhc3NldE5hbWUsIENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihhc3NldC5xdWFudGl0eSkpO1xuICAgICAgbXVsdGlBc3NldC5pbnNlcnQocG9saWN5SWQsIGFzc2V0cyk7XG5cbiAgICAgIHR4T3V0cHV0QW1vdW50QnVpbGRlciA9IHR4T3V0cHV0QW1vdW50QnVpbGRlci53aXRoX2NvaW5fYW5kX2Fzc2V0KG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0LCBtdWx0aUFzc2V0KTtcblxuICAgICAgY29uc3QgdHhPdXRwdXQgPSB0eE91dHB1dEFtb3VudEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIG91dHB1dHMuYWRkKHR4T3V0cHV0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBFcnJvciBidWlsZGluZyB0b2tlbnM6ICR7ZS5tZXNzYWdlIHx8IGV9IGZvciBhc3NldCAke0pTT04uc3RyaW5naWZ5KGFzc2V0KX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNoYW5nZSBvdXRwdXQgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBjaGFuZ2UgLSBUaGUgY2hhbmdlIGFtb3VudCBpbiBMb3ZlbGFjZVxuICAgKiBAcGFyYW0gb3V0cHV0cyAtIFRoZSBvdXRwdXRzIGNvbGxlY3Rpb24gdG8gYWRkIHRvXG4gICAqL1xuICBwcml2YXRlIGFkZENoYW5nZU91dHB1dChjaGFuZ2UsIG91dHB1dHMsIG91dHB1dEFkZHJlc3MpIHtcbiAgICBjb25zdCBjaGFuZ2VBZGRyZXNzID0gdXRpbC5nZXRXYWxsZXRBZGRyZXNzKG91dHB1dEFkZHJlc3MpO1xuICAgIC8qKlxuICAgICAqIHRoaXMubXV0YWJsZVNlbmRlckFzc2V0TGlzdCBpcyB0aGUgbGlzdCBvZiBhc3NldHMgZnJvbSB0aGUgc2VuZGVyIGFkZHJlc3NcbiAgICAgKiBBcyBhZGEgb25seSB1dHhvcyBhcmUgcGlja2VkIGZvciBmZWUgYWRkcmVzcywgdGhlIGFzc2V0cyBieSBkZWZhdWx0IGFyZSBzZW50IHRvIHRoZSBzZW5kZXIgYWRkcmVzc1xuICAgICAqL1xuICAgIGlmICghdGhpcy5fc3BvbnNvcnNoaXBJbmZvIHx8IHRoaXMuX3Nwb25zb3JzaGlwSW5mby5mZWVBZGRyZXNzICE9PSBvdXRwdXRBZGRyZXNzKSB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLl9tdXRhYmxlU2VuZGVyQXNzZXRMaXN0KS5mb3JFYWNoKChmaW5nZXJwcmludCkgPT4ge1xuICAgICAgICBjb25zdCBhc3NldCA9IHRoaXMuX211dGFibGVTZW5kZXJBc3NldExpc3RbZmluZ2VycHJpbnRdO1xuICAgICAgICBjb25zdCBjaGFuZ2VRdHkgPSBhc3NldC5xdWFudGl0eTtcbiAgICAgICAgY29uc3QgcG9saWN5SWQgPSBhc3NldC5wb2xpY3lfaWQ7XG4gICAgICAgIGNvbnN0IGFzc2V0TmFtZSA9IGFzc2V0LmFzc2V0X25hbWU7XG5cbiAgICAgICAgaWYgKENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihjaGFuZ2VRdHkpLmlzX3plcm8oKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pbkFtb3VudE5lZWRlZEZvckFzc2V0T3V0cHV0ID0gdGhpcy5hZGRUb2tlbnNUb091dHB1dChjaGFuZ2UsIG91dHB1dHMsIG91dHB1dEFkZHJlc3MsIHtcbiAgICAgICAgICBwb2xpY3lfaWQ6IHBvbGljeUlkLFxuICAgICAgICAgIGFzc2V0X25hbWU6IGFzc2V0TmFtZSxcbiAgICAgICAgICBxdWFudGl0eTogY2hhbmdlUXR5LFxuICAgICAgICAgIGZpbmdlcnByaW50LFxuICAgICAgICB9KTtcbiAgICAgICAgY2hhbmdlID0gY2hhbmdlLmNoZWNrZWRfc3ViKG1pbkFtb3VudE5lZWRlZEZvckFzc2V0T3V0cHV0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIWNoYW5nZS5pc196ZXJvKCkpIHtcbiAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0Lm5ldyhjaGFuZ2VBZGRyZXNzLCBDYXJkYW5vV2FzbS5WYWx1ZS5uZXcoY2hhbmdlKSk7XG4gICAgICBvdXRwdXRzLmFkZChjaGFuZ2VPdXRwdXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjYWxjdWxhdGVkIGZlZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgc2V0RmVlSW5UcmFuc2FjdGlvbigpIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5mZWUodGhpcy5fZmVlLnRvX3N0cigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0cmFuc2FjdGlvbiBmZWUgYmFzZWQgb24gdHJhbnNhY3Rpb24gc2l6ZVxuICAgKiBAcGFyYW0gdHhEcmFmdCAtIERyYWZ0IHRyYW5zYWN0aW9uIHRvIGNhbGN1bGF0ZSBmZWUgZm9yXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUZlZSh0eERyYWZ0KSB7XG4gICAgY29uc3QgbGluZWFyRmVlID0gQ2FyZGFub1dhc20uTGluZWFyRmVlLm5ldyhcbiAgICAgIENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihGRUVfQ09FRkZJQ0lFTlRTLkFfQ09FRkZJQ0lFTlQpLFxuICAgICAgQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKEZFRV9DT0VGRklDSUVOVFMuQl9DT0VGRklDSUVOVClcbiAgICApO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBmZWUgYmFzZWQgb2ZmIG91ciBkdW1teSB0cmFuc2FjdGlvblxuICAgIGNvbnN0IGZlZSA9IENhcmRhbm9XYXNtLm1pbl9mZWUodHhEcmFmdCwgbGluZWFyRmVlKS5jaGVja2VkX2FkZChCaWdOdW0uZnJvbV9zdHIoRkVFX0NPRUZGSUNJRU5UUy5TQUZFVFlfTUFSR0lOKSk7XG4gICAgdGhpcy5fZmVlID0gZmVlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlQWRhVHJhbnNhY3Rpb25EcmFmdChpbnB1dHMsIG91dHB1dHMsIHJlZnJlc2hTaWduYXR1cmVzID0gZmFsc2UpIHtcbiAgICBjb25zdCB0eEJvZHkgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbkJvZHkubmV3X3R4X2JvZHkoaW5wdXRzLCBvdXRwdXRzLCB0aGlzLl9mZWUpO1xuICAgIHR4Qm9keS5zZXRfdHRsKENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih0aGlzLl90dGwudG9TdHJpbmcoKSkpO1xuICAgIGNvbnN0IHR4SGFzaCA9IENhcmRhbm9XYXNtLmhhc2hfdHJhbnNhY3Rpb24odHhCb2R5KTtcblxuICAgIC8vIHdlIGFkZCB3aXRuZXNzZXMgb25jZSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIGFwcHJvcHJpYXRlIGFtb3VudCBvZiBzaWduZXJzIGZvciBjYWxjdWxhdGluZyB0aGUgZmVlXG4gICAgY29uc3Qgd2l0bmVzc1NldCA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uV2l0bmVzc1NldC5uZXcoKTtcbiAgICBjb25zdCB2a2V5V2l0bmVzc2VzID0gQ2FyZGFub1dhc20uVmtleXdpdG5lc3Nlcy5uZXcoKTtcbiAgICB0aGlzLl9zaWduZXJzLmZvckVhY2goKGtleVBhaXIpID0+IHtcbiAgICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0S2V5cygpLnBydiBhcyBzdHJpbmc7XG4gICAgICBjb25zdCB2a2V5V2l0bmVzcyA9IENhcmRhbm9XYXNtLm1ha2VfdmtleV93aXRuZXNzKFxuICAgICAgICB0eEhhc2gsXG4gICAgICAgIENhcmRhbm9XYXNtLlByaXZhdGVLZXkuZnJvbV9ub3JtYWxfYnl0ZXMoQnVmZmVyLmZyb20ocHJ2LCAnaGV4JykpXG4gICAgICApO1xuICAgICAgdmtleVdpdG5lc3Nlcy5hZGQodmtleVdpdG5lc3MpO1xuICAgIH0pO1xuICAgIGlmIChyZWZyZXNoU2lnbmF0dXJlcykge1xuICAgICAgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIHRoaXMuZ2V0QWxsU2lnbmF0dXJlcygpLmZvckVhY2goKHNpZ25hdHVyZSkgPT4ge1xuICAgICAgY29uc3QgdmtleSA9IENhcmRhbm9XYXNtLlZrZXkubmV3KENhcmRhbm9XYXNtLlB1YmxpY0tleS5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZS5wdWJsaWNLZXkucHViLCAnaGV4JykpKTtcbiAgICAgIGNvbnN0IGVkMjU1U2lnID0gQ2FyZGFub1dhc20uRWQyNTUxOVNpZ25hdHVyZS5mcm9tX2J5dGVzKHNpZ25hdHVyZS5zaWduYXR1cmUpO1xuICAgICAgdmtleVdpdG5lc3Nlcy5hZGQoQ2FyZGFub1dhc20uVmtleXdpdG5lc3MubmV3KHZrZXksIGVkMjU1U2lnKSk7XG4gICAgICAvLyBSZXN0b3JpbmcgdGhlIGJlaGF2aW91ciBmcm9tIHRoZSBvcmlnaW5hbCBidWlsZEltcGxlbWVudGF0aW9uXG4gICAgICBpZiAocmVmcmVzaFNpZ25hdHVyZXMpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlLnB1c2goc2lnbmF0dXJlLnNpZ25hdHVyZS50b1N0cmluZygnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghcmVmcmVzaFNpZ25hdHVyZXMgJiYgdmtleVdpdG5lc3Nlcy5sZW4oKSA9PT0gMCkge1xuICAgICAgY29uc3QgcHJ2ID0gQ2FyZGFub1dhc20uUHJpdmF0ZUtleS5nZW5lcmF0ZV9lZDI1NTE5KCk7XG4gICAgICBjb25zdCB2a2V5V2l0bmVzcyA9IENhcmRhbm9XYXNtLm1ha2VfdmtleV93aXRuZXNzKHR4SGFzaCwgcHJ2KTtcbiAgICAgIHZrZXlXaXRuZXNzZXMuYWRkKHZrZXlXaXRuZXNzKTtcbiAgICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU2VuZCkge1xuICAgICAgICB2a2V5V2l0bmVzc2VzLmFkZCh2a2V5V2l0bmVzcyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fc3BvbnNvcnNoaXBJbmZvKSB7XG4gICAgICAgIGNvbnN0IHNwb25zb3JQcnYgPSBDYXJkYW5vV2FzbS5Qcml2YXRlS2V5LmdlbmVyYXRlX2VkMjU1MTkoKTtcbiAgICAgICAgY29uc3Qgc3BvbnNvclZrZXlXaXRuZXNzID0gQ2FyZGFub1dhc20ubWFrZV92a2V5X3dpdG5lc3ModHhIYXNoLCBzcG9uc29yUHJ2KTtcbiAgICAgICAgdmtleVdpdG5lc3Nlcy5hZGQoc3BvbnNvclZrZXlXaXRuZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2l0bmVzc1NldC5zZXRfdmtleXModmtleVdpdG5lc3Nlcyk7XG5cbiAgICAvLyBhZGQgaW4gY2VydGlmaWNhdGVzIHRvIGdldCBtb2NrIHNpemVcbiAgICBjb25zdCBkcmFmdENlcnRzID0gQ2FyZGFub1dhc20uQ2VydGlmaWNhdGVzLm5ldygpO1xuICAgIGZvciAoY29uc3QgY2VydCBvZiB0aGlzLl9jZXJ0cykge1xuICAgICAgZHJhZnRDZXJ0cy5hZGQoY2VydCk7XG4gICAgfVxuICAgIHR4Qm9keS5zZXRfY2VydHMoZHJhZnRDZXJ0cyk7XG5cbiAgICBjb25zdCB0eERyYWZ0ID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb24ubmV3KHR4Qm9keSwgd2l0bmVzc1NldCk7XG4gICAgcmV0dXJuIHR4RHJhZnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIC8qKlxuICAgICAqIEZlZSBhZGRyZXNzIHV0eG8gcmVzZXJ2YXRpb24gYnVpbGRzIGEgbmV3IHRyYW5zYWN0aW9uIHRoYXQgZ29lcyB0aHJvdWdoIGxlZ2FjeSBidWlsZFxuICAgICAqIHJlYnVpbGQgZmxhZyBpcyBqdXN0IGEgaGFjayB0byByZWRpcmVjdCB0aGUgZmxvdyB0byB0aGUgbGVnYWN5IGJ1aWxkXG4gICAgICovXG4gICAgaWYgKFxuICAgICAgdGhpcy5faXNUb2tlblRyYW5zYWN0aW9uIHx8XG4gICAgICAodGhpcy5fc3BvbnNvcnNoaXBJbmZvICYmICF0aGlzLl9zcG9uc29yc2hpcEluZm8uaXNSZWJ1aWxkICYmIHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Rva2VuQnVpbGQoKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25JbnB1dHMubmV3KCk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25JbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlucHV0cy5hZGQoXG4gICAgICAgIENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uSW5wdXQubmV3KFxuICAgICAgICAgIENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uSGFzaC5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKGlucHV0LnRyYW5zYWN0aW9uX2lkLCAnaGV4JykpLFxuICAgICAgICAgIGlucHV0LnRyYW5zYWN0aW9uX2luZGV4XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gICAgbGV0IG91dHB1dHMgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dHMubmV3KCk7XG4gICAgbGV0IHRvdGFsQW1vdW50VG9TZW5kID0gQ2FyZGFub1dhc20uQmlnTnVtLnplcm8oKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbk91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCBhbW91bnQgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIob3V0cHV0LmFtb3VudCk7XG4gICAgICBvdXRwdXRzLmFkZChcbiAgICAgICAgQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXQubmV3KHV0aWwuZ2V0V2FsbGV0QWRkcmVzcyhvdXRwdXQuYWRkcmVzcyksIENhcmRhbm9XYXNtLlZhbHVlLm5ldyhhbW91bnQpKVxuICAgICAgKTtcbiAgICAgIHRvdGFsQW1vdW50VG9TZW5kID0gdG90YWxBbW91bnRUb1NlbmQuY2hlY2tlZF9hZGQoYW1vdW50KTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLl9mZWUuaXNfemVybygpKSB7XG4gICAgICAvLyBlc3RpbWF0ZSBmZWVcbiAgICAgIC8vIGFkZCBleHRyYSBvdXRwdXQgZm9yIHRoZSBjaGFuZ2VcbiAgICAgIGlmICh0aGlzLl9jaGFuZ2VBZGRyZXNzICYmIHRoaXMuX3NlbmRlckJhbGFuY2UpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlQWRkcmVzcyA9IHV0aWwuZ2V0V2FsbGV0QWRkcmVzcyh0aGlzLl9jaGFuZ2VBZGRyZXNzKTtcbiAgICAgICAgY29uc3QgdXR4b0JhbGFuY2UgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIodGhpcy5fc2VuZGVyQmFsYW5jZSk7XG5cbiAgICAgICAgY29uc3QgYWRqdXN0bWVudCA9IEJpZ051bS5mcm9tX3N0cignMjAwMDAwMCcpO1xuICAgICAgICBsZXQgY2hhbmdlID0gdXR4b0JhbGFuY2UuY2hlY2tlZF9zdWIodGhpcy5fZmVlKS5jaGVja2VkX3N1Yih0b3RhbEFtb3VudFRvU2VuZCk7XG4gICAgICAgIGlmICh0aGlzLl90eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKSB7XG4gICAgICAgICAgY2hhbmdlID0gY2hhbmdlLmNoZWNrZWRfc3ViKGFkanVzdG1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSkge1xuICAgICAgICAgIGNoYW5nZSA9IGNoYW5nZS5jaGVja2VkX2FkZChhZGp1c3RtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3IHx8IHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQ2xhaW0pIHtcbiAgICAgICAgICB0aGlzLl93aXRoZHJhd2Fscy5mb3JFYWNoKCh3aXRoZHJhd2FsOiBXaXRoZHJhd2FsKSA9PiB7XG4gICAgICAgICAgICBjaGFuZ2UgPSBjaGFuZ2UuY2hlY2tlZF9hZGQoQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKHdpdGhkcmF3YWwudmFsdWUpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRvdGFsQW1vdW50VG9TZW5kIGlzIDAsIGl0cyBjb25zb2xpZGF0aW9uXG4gICAgICAgIGlmICh0b3RhbEFtb3VudFRvU2VuZC50b19zdHIoKSA9PSAnMCcpIHtcbiAgICAgICAgICAvLyBzdXBwb3J0IGZvciBtdWx0aS1hc3NldCBjb25zb2xpZGF0aW9uXG4gICAgICAgICAgaWYgKHRoaXMuX211bHRpQXNzZXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsTnVtYmVyT2ZBc3NldHMgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIodGhpcy5fbXVsdGlBc3NldHMubGVuZ3RoLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgbWluQW1vdW50TmVlZGVkRm9yT25lQXNzZXRPdXRwdXQgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIoTUlOX0FEQV9GT1JfT05FX0FTU0VUKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbkFtb3VudE5lZWRlZEZvclRvdGFsQXNzZXRPdXRwdXRzID1cbiAgICAgICAgICAgICAgbWluQW1vdW50TmVlZGVkRm9yT25lQXNzZXRPdXRwdXQuY2hlY2tlZF9tdWwodG90YWxOdW1iZXJPZkFzc2V0cyk7XG5cbiAgICAgICAgICAgIGlmICghY2hhbmdlLmxlc3NfdGhhbihtaW5BbW91bnROZWVkZWRGb3JUb3RhbEFzc2V0T3V0cHV0cykpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbXVsdGlBc3NldHMuZm9yRWFjaCgoYXNzZXQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdHhPdXRwdXRCdWlsZGVyID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXRCdWlsZGVyLm5ldygpO1xuICAgICAgICAgICAgICAgIC8vIGNoYW5nZUFkZHJlc3MgaXMgdGhlIHJvb3QgYWRkcmVzcywgd2hpY2ggaXMgd2hlcmUgd2Ugd2FudCB0aGUgdG9rZW5zIGFzc2V0cyB0byBiZSBzZW50IHRvXG4gICAgICAgICAgICAgICAgY29uc3QgdG9BZGRyZXNzID0gdXRpbC5nZXRXYWxsZXRBZGRyZXNzKHRoaXMuX2NoYW5nZUFkZHJlc3MpO1xuICAgICAgICAgICAgICAgIHR4T3V0cHV0QnVpbGRlciA9IHR4T3V0cHV0QnVpbGRlci53aXRoX2FkZHJlc3ModG9BZGRyZXNzKTtcbiAgICAgICAgICAgICAgICBsZXQgdHhPdXRwdXRBbW91bnRCdWlsZGVyID0gdHhPdXRwdXRCdWlsZGVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhc3NldE5hbWUgPSBDYXJkYW5vV2FzbS5Bc3NldE5hbWUubmV3KEJ1ZmZlci5mcm9tKGFzc2V0LmFzc2V0X25hbWUsICdoZXgnKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9saWN5SWQgPSBDYXJkYW5vV2FzbS5TY3JpcHRIYXNoLmZyb21fYnl0ZXMoQnVmZmVyLmZyb20oYXNzZXQucG9saWN5X2lkLCAnaGV4JykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG11bHRpQXNzZXQgPSBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0Lm5ldygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0cyA9IENhcmRhbm9XYXNtLkFzc2V0cy5uZXcoKTtcbiAgICAgICAgICAgICAgICBhc3NldHMuaW5zZXJ0KGFzc2V0TmFtZSwgQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKGFzc2V0LnF1YW50aXR5KSk7XG4gICAgICAgICAgICAgICAgbXVsdGlBc3NldC5pbnNlcnQocG9saWN5SWQsIGFzc2V0cyk7XG5cbiAgICAgICAgICAgICAgICB0eE91dHB1dEFtb3VudEJ1aWxkZXIgPSB0eE91dHB1dEFtb3VudEJ1aWxkZXIud2l0aF9jb2luX2FuZF9hc3NldChcbiAgICAgICAgICAgICAgICAgIG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0LFxuICAgICAgICAgICAgICAgICAgbXVsdGlBc3NldFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0eE91dHB1dCA9IHR4T3V0cHV0QW1vdW50QnVpbGRlci5idWlsZCgpO1xuICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKHR4T3V0cHV0KTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgLy8gZmluYWxseSBzZW5kIHRoZSByZW1haW5pbmcgQURBIGluIGl0cyBvd24gb3V0cHV0XG4gICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ091dHB1dEFtb3VudCA9IGNoYW5nZS5jaGVja2VkX3N1YihtaW5BbW91bnROZWVkZWRGb3JUb3RhbEFzc2V0T3V0cHV0cyk7XG4gICAgICAgICAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0Lm5ldyhcbiAgICAgICAgICAgICAgICBjaGFuZ2VBZGRyZXNzLFxuICAgICAgICAgICAgICAgIENhcmRhbm9XYXNtLlZhbHVlLm5ldyhyZW1haW5pbmdPdXRwdXRBbW91bnQpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG91dHB1dHMuYWRkKGNoYW5nZU91dHB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyB0b2tlbnMgdG8gY29uc29saWRhdGUsIHlvdSBvbmx5IGhhdmUgMSBvdXRwdXQgd2hpY2ggaXMgQURBIGFsb25lXG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VPdXRwdXQgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dC5uZXcoY2hhbmdlQWRkcmVzcywgQ2FyZGFub1dhc20uVmFsdWUubmV3KGNoYW5nZSkpO1xuICAgICAgICAgICAgb3V0cHV0cy5hZGQoY2hhbmdlT3V0cHV0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBhIGNvbnNvbGlkYXRlIHJlcXVlc3QsIHdoYXRldmVyIGNoYW5nZSB0aGF0IG5lZWRzIHRvIGJlIHNlbnQgYmFjayB0byB0aGUgcm9vdGFkZHJlc3MgaXMgYWRkZWQgYXMgYSBzZXBhcmF0ZSBvdXRwdXQgaGVyZVxuICAgICAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0Lm5ldyhjaGFuZ2VBZGRyZXNzLCBDYXJkYW5vV2FzbS5WYWx1ZS5uZXcoY2hhbmdlKSk7XG4gICAgICAgICAgb3V0cHV0cy5hZGQoY2hhbmdlT3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0eEJvZHkgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbkJvZHkubmV3X3R4X2JvZHkoaW5wdXRzLCBvdXRwdXRzLCB0aGlzLl9mZWUpO1xuICAgICAgdHhCb2R5LnNldF90dGwoQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKHRoaXMuX3R0bC50b1N0cmluZygpKSk7XG4gICAgICBjb25zdCB0eEhhc2ggPSBDYXJkYW5vV2FzbS5oYXNoX3RyYW5zYWN0aW9uKHR4Qm9keSk7XG5cbiAgICAgIC8vIHdlIGFkZCB3aXRuZXNzZXMgb25jZSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIGFwcHJvcHJpYXRlIGFtb3VudCBvZiBzaWduZXJzIGZvciBjYWxjdWxhdGluZyB0aGUgZmVlXG4gICAgICBjb25zdCB3aXRuZXNzU2V0ID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25XaXRuZXNzU2V0Lm5ldygpO1xuICAgICAgY29uc3QgdmtleVdpdG5lc3NlcyA9IENhcmRhbm9XYXNtLlZrZXl3aXRuZXNzZXMubmV3KCk7XG4gICAgICB0aGlzLl9zaWduZXJzLmZvckVhY2goKGtleVBhaXIpID0+IHtcbiAgICAgICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRLZXlzKCkucHJ2IGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgdmtleVdpdG5lc3MgPSBDYXJkYW5vV2FzbS5tYWtlX3ZrZXlfd2l0bmVzcyhcbiAgICAgICAgICB0eEhhc2gsXG4gICAgICAgICAgQ2FyZGFub1dhc20uUHJpdmF0ZUtleS5mcm9tX25vcm1hbF9ieXRlcyhCdWZmZXIuZnJvbShwcnYsICdoZXgnKSlcbiAgICAgICAgKTtcbiAgICAgICAgdmtleVdpdG5lc3Nlcy5hZGQodmtleVdpdG5lc3MpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdldEFsbFNpZ25hdHVyZXMoKS5mb3JFYWNoKChzaWduYXR1cmUpID0+IHtcbiAgICAgICAgY29uc3QgdmtleSA9IENhcmRhbm9XYXNtLlZrZXkubmV3KFxuICAgICAgICAgIENhcmRhbm9XYXNtLlB1YmxpY0tleS5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZS5wdWJsaWNLZXkucHViLCAnaGV4JykpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGVkMjU1U2lnID0gQ2FyZGFub1dhc20uRWQyNTUxOVNpZ25hdHVyZS5mcm9tX2J5dGVzKHNpZ25hdHVyZS5zaWduYXR1cmUpO1xuICAgICAgICB2a2V5V2l0bmVzc2VzLmFkZChDYXJkYW5vV2FzbS5Wa2V5d2l0bmVzcy5uZXcodmtleSwgZWQyNTVTaWcpKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHZrZXlXaXRuZXNzZXMubGVuKCkgPT09IDApIHtcbiAgICAgICAgY29uc3QgcHJ2ID0gQ2FyZGFub1dhc20uUHJpdmF0ZUtleS5nZW5lcmF0ZV9lZDI1NTE5KCk7XG4gICAgICAgIGNvbnN0IHZrZXlXaXRuZXNzID0gQ2FyZGFub1dhc20ubWFrZV92a2V5X3dpdG5lc3ModHhIYXNoLCBwcnYpO1xuICAgICAgICB2a2V5V2l0bmVzc2VzLmFkZCh2a2V5V2l0bmVzcyk7XG4gICAgICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU2VuZCkge1xuICAgICAgICAgIHZrZXlXaXRuZXNzZXMuYWRkKHZrZXlXaXRuZXNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc3BvbnNvcnNoaXBJbmZvPy5pc1JlYnVpbGQpIHtcbiAgICAgICAgICBjb25zdCBzcG9uc29yUHJ2ID0gQ2FyZGFub1dhc20uUHJpdmF0ZUtleS5nZW5lcmF0ZV9lZDI1NTE5KCk7XG4gICAgICAgICAgY29uc3Qgc3BvbnNvclZrZXlXaXRuZXNzID0gQ2FyZGFub1dhc20ubWFrZV92a2V5X3dpdG5lc3ModHhIYXNoLCBzcG9uc29yUHJ2KTtcbiAgICAgICAgICB2a2V5V2l0bmVzc2VzLmFkZChzcG9uc29yVmtleVdpdG5lc3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aXRuZXNzU2V0LnNldF92a2V5cyh2a2V5V2l0bmVzc2VzKTtcblxuICAgICAgLy8gYWRkIGluIHdpdGhkcmF3YWwgaWYgdGhpcyBpcyBhIHdpdGhkcmF3YWwgdHhcbiAgICAgIGlmICh0aGlzLl93aXRoZHJhd2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHdpdGhkcmF3YWxzID0gQ2FyZGFub1dhc20uV2l0aGRyYXdhbHMubmV3KCk7XG4gICAgICAgIHRoaXMuX3dpdGhkcmF3YWxzLmZvckVhY2goKHdpdGhkcmF3YWw6IFdpdGhkcmF3YWwpID0+IHtcbiAgICAgICAgICBjb25zdCByZXdhcmRBZGRyZXNzID0gQ2FyZGFub1dhc20uUmV3YXJkQWRkcmVzcy5mcm9tX2FkZHJlc3MoXG4gICAgICAgICAgICBDYXJkYW5vV2FzbS5BZGRyZXNzLmZyb21fYmVjaDMyKHdpdGhkcmF3YWwuc3Rha2VBZGRyZXNzKVxuICAgICAgICAgICk7XG4gICAgICAgICAgd2l0aGRyYXdhbHMuaW5zZXJ0KHJld2FyZEFkZHJlc3MhLCBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIod2l0aGRyYXdhbC52YWx1ZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0eEJvZHkuc2V0X3dpdGhkcmF3YWxzKHdpdGhkcmF3YWxzKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIGluIGNlcnRpZmljYXRlcyB0byBnZXQgbW9jayBzaXplXG4gICAgICBjb25zdCBkcmFmdENlcnRzID0gQ2FyZGFub1dhc20uQ2VydGlmaWNhdGVzLm5ldygpO1xuICAgICAgZm9yIChjb25zdCBjZXJ0IG9mIHRoaXMuX2NlcnRzKSB7XG4gICAgICAgIGRyYWZ0Q2VydHMuYWRkKGNlcnQpO1xuICAgICAgfVxuICAgICAgdHhCb2R5LnNldF9jZXJ0cyhkcmFmdENlcnRzKTtcblxuICAgICAgY29uc3QgdHhEcmFmdCA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uLm5ldyh0eEJvZHksIHdpdG5lc3NTZXQpO1xuICAgICAgY29uc3QgbGluZWFyRmVlID0gQ2FyZGFub1dhc20uTGluZWFyRmVlLm5ldyhcbiAgICAgICAgQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKCc0NCcpLFxuICAgICAgICBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIoJzE1NTM4MScpXG4gICAgICApO1xuXG4gICAgICAvLyBjYWxjdWxhdGUgdGhlIGZlZSBiYXNlZCBvZmYgb3VyIGR1bW15IHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBmZWUgPSBDYXJkYW5vV2FzbS5taW5fZmVlKHR4RHJhZnQsIGxpbmVhckZlZSkuY2hlY2tlZF9hZGQoQmlnTnVtLmZyb21fc3RyKCc0NDAnKSk7XG4gICAgICB0aGlzLl9mZWUgPSBmZWU7XG4gICAgfVxuICAgIHRoaXMuX3RyYW5zYWN0aW9uLmZlZSh0aGlzLl9mZWUudG9fc3RyKCkpO1xuICAgIC8vIG5vdyBjYWxjdWxhdGUgdGhlIGNoYW5nZSBiYXNlZCBvZmYgb2YgPHV0eG9CYWxhbmNlPiAtIDxmZWU+IC0gPGFtb3VudFRvU2VuZD5cbiAgICAvLyByZXNldCB0aGUgb3V0cHV0cyBjb2xsZWN0aW9uIGJlY2F1c2Ugbm93IG91ciBsYXN0IG91dHB1dCBoYXMgY2hhbmdlZFxuICAgIG91dHB1dHMgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dHMubmV3KCk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25PdXRwdXRzLmZvckVhY2goKG91dHB1dCkgPT4ge1xuICAgICAgY29uc3QgbXVsdGlBc3NldHMgPSBvdXRwdXQubXVsdGlBc3NldHMgYXMgQ2FyZGFub1dhc20uTXVsdGlBc3NldDtcbiAgICAgIGlmIChtdWx0aUFzc2V0cykge1xuICAgICAgICBjb25zdCBwb2xpY3lJZCA9IG11bHRpQXNzZXRzLmtleXMoKS5nZXQoMCk7XG4gICAgICAgIGNvbnN0IGFzc2V0cyA9IG11bHRpQXNzZXRzLmdldChwb2xpY3lJZCk7XG4gICAgICAgIGNvbnN0IGFzc2V0TmFtZSA9IGFzc2V0cyEua2V5cygpLmdldCgwKTtcbiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBhc3NldHMhLmdldChhc3NldE5hbWUpO1xuICAgICAgICBsZXQgdHhPdXRwdXRCdWlsZGVyID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXRCdWlsZGVyLm5ldygpO1xuICAgICAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIob3V0cHV0LmFtb3VudCk7XG4gICAgICAgIGNvbnN0IHRvQWRkcmVzcyA9IHV0aWwuZ2V0V2FsbGV0QWRkcmVzcyhvdXRwdXQuYWRkcmVzcyk7XG4gICAgICAgIHR4T3V0cHV0QnVpbGRlciA9IHR4T3V0cHV0QnVpbGRlci53aXRoX2FkZHJlc3ModG9BZGRyZXNzKTtcbiAgICAgICAgbGV0IHR4T3V0cHV0QW1vdW50QnVpbGRlciA9IHR4T3V0cHV0QnVpbGRlci5uZXh0KCk7XG4gICAgICAgIGNvbnN0IG11bHRpQXNzZXQgPSBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0Lm5ldygpO1xuICAgICAgICBjb25zdCBhc3NldCA9IENhcmRhbm9XYXNtLkFzc2V0cy5uZXcoKTtcbiAgICAgICAgYXNzZXQuaW5zZXJ0KGFzc2V0TmFtZSwgcXVhbnRpdHkhKTtcbiAgICAgICAgbXVsdGlBc3NldC5pbnNlcnQocG9saWN5SWQsIGFzc2V0KTtcbiAgICAgICAgdHhPdXRwdXRBbW91bnRCdWlsZGVyID0gdHhPdXRwdXRBbW91bnRCdWlsZGVyLndpdGhfY29pbl9hbmRfYXNzZXQob3V0cHV0QW1vdW50LCBtdWx0aUFzc2V0KTtcbiAgICAgICAgY29uc3QgdHhPdXRwdXQgPSB0eE91dHB1dEFtb3VudEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgb3V0cHV0cy5hZGQodHhPdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0cy5hZGQoXG4gICAgICAgICAgQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXQubmV3KFxuICAgICAgICAgICAgdXRpbC5nZXRXYWxsZXRBZGRyZXNzKG91dHB1dC5hZGRyZXNzKSxcbiAgICAgICAgICAgIENhcmRhbm9XYXNtLlZhbHVlLm5ldyhDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIob3V0cHV0LmFtb3VudCkpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLl9jaGFuZ2VBZGRyZXNzICYmIHRoaXMuX3NlbmRlckJhbGFuY2UpIHtcbiAgICAgIGNvbnN0IGNoYW5nZUFkZHJlc3MgPSB1dGlsLmdldFdhbGxldEFkZHJlc3ModGhpcy5fY2hhbmdlQWRkcmVzcyk7XG4gICAgICBjb25zdCB1dHhvQmFsYW5jZSA9IENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih0aGlzLl9zZW5kZXJCYWxhbmNlKTtcblxuICAgICAgY29uc3QgYWRqdXN0bWVudCA9IEJpZ051bS5mcm9tX3N0cignMjAwMDAwMCcpO1xuICAgICAgbGV0IGNoYW5nZSA9IHV0eG9CYWxhbmNlLmNoZWNrZWRfc3ViKHRoaXMuX2ZlZSkuY2hlY2tlZF9zdWIodG90YWxBbW91bnRUb1NlbmQpO1xuICAgICAgaWYgKHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpIHtcbiAgICAgICAgY2hhbmdlID0gY2hhbmdlLmNoZWNrZWRfc3ViKGFkanVzdG1lbnQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl90eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpIHtcbiAgICAgICAgY2hhbmdlID0gY2hhbmdlLmNoZWNrZWRfYWRkKGFkanVzdG1lbnQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl90eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3IHx8IHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQ2xhaW0pIHtcbiAgICAgICAgdGhpcy5fd2l0aGRyYXdhbHMuZm9yRWFjaCgod2l0aGRyYXdhbDogV2l0aGRyYXdhbCkgPT4ge1xuICAgICAgICAgIGNoYW5nZSA9IGNoYW5nZS5jaGVja2VkX2FkZChDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIod2l0aGRyYXdhbC52YWx1ZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdG90YWxBbW91bnRUb1NlbmQgaXMgMCwgaXRzIGNvbnNvbGlkYXRpb25cbiAgICAgIGlmICh0b3RhbEFtb3VudFRvU2VuZC50b19zdHIoKSA9PSAnMCcpIHtcbiAgICAgICAgLy8gc3VwcG9ydCBmb3IgbXVsdGktYXNzZXQgY29uc29saWRhdGlvblxuICAgICAgICBpZiAodGhpcy5fbXVsdGlBc3NldHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHRvdGFsTnVtYmVyT2ZBc3NldHMgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIodGhpcy5fbXVsdGlBc3NldHMubGVuZ3RoLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIGNvbnN0IG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0ID0gQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKCcxNTAwMDAwJyk7XG4gICAgICAgICAgY29uc3QgbWluQW1vdW50TmVlZGVkRm9yVG90YWxBc3NldE91dHB1dHMgPSBtaW5BbW91bnROZWVkZWRGb3JPbmVBc3NldE91dHB1dC5jaGVja2VkX211bCh0b3RhbE51bWJlck9mQXNzZXRzKTtcblxuICAgICAgICAgIGlmICghY2hhbmdlLmxlc3NfdGhhbihtaW5BbW91bnROZWVkZWRGb3JUb3RhbEFzc2V0T3V0cHV0cykpIHtcbiAgICAgICAgICAgIHRoaXMuX211bHRpQXNzZXRzLmZvckVhY2goKGFzc2V0KSA9PiB7XG4gICAgICAgICAgICAgIGxldCB0eE91dHB1dEJ1aWxkZXIgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dEJ1aWxkZXIubmV3KCk7XG4gICAgICAgICAgICAgIC8vIGNoYW5nZUFkZHJlc3MgaXMgdGhlIHJvb3QgYWRkcmVzcywgd2hpY2ggaXMgd2hlcmUgd2Ugd2FudCB0aGUgdG9rZW5zIGFzc2V0cyB0byBiZSBzZW50IHRvXG4gICAgICAgICAgICAgIGNvbnN0IHRvQWRkcmVzcyA9IHV0aWwuZ2V0V2FsbGV0QWRkcmVzcyh0aGlzLl9jaGFuZ2VBZGRyZXNzKTtcbiAgICAgICAgICAgICAgdHhPdXRwdXRCdWlsZGVyID0gdHhPdXRwdXRCdWlsZGVyLndpdGhfYWRkcmVzcyh0b0FkZHJlc3MpO1xuICAgICAgICAgICAgICBsZXQgdHhPdXRwdXRBbW91bnRCdWlsZGVyID0gdHhPdXRwdXRCdWlsZGVyLm5leHQoKTtcbiAgICAgICAgICAgICAgY29uc3QgYXNzZXROYW1lID0gQ2FyZGFub1dhc20uQXNzZXROYW1lLm5ldyhCdWZmZXIuZnJvbShhc3NldC5hc3NldF9uYW1lLCAnaGV4JykpO1xuICAgICAgICAgICAgICBjb25zdCBwb2xpY3lJZCA9IENhcmRhbm9XYXNtLlNjcmlwdEhhc2guZnJvbV9ieXRlcyhCdWZmZXIuZnJvbShhc3NldC5wb2xpY3lfaWQsICdoZXgnKSk7XG4gICAgICAgICAgICAgIGNvbnN0IG11bHRpQXNzZXQgPSBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0Lm5ldygpO1xuICAgICAgICAgICAgICBjb25zdCBhc3NldHMgPSBDYXJkYW5vV2FzbS5Bc3NldHMubmV3KCk7XG4gICAgICAgICAgICAgIGFzc2V0cy5pbnNlcnQoYXNzZXROYW1lLCBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIoYXNzZXQucXVhbnRpdHkpKTtcbiAgICAgICAgICAgICAgbXVsdGlBc3NldC5pbnNlcnQocG9saWN5SWQsIGFzc2V0cyk7XG5cbiAgICAgICAgICAgICAgdHhPdXRwdXRBbW91bnRCdWlsZGVyID0gdHhPdXRwdXRBbW91bnRCdWlsZGVyLndpdGhfY29pbl9hbmRfYXNzZXQoXG4gICAgICAgICAgICAgICAgbWluQW1vdW50TmVlZGVkRm9yT25lQXNzZXRPdXRwdXQsXG4gICAgICAgICAgICAgICAgbXVsdGlBc3NldFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHR4T3V0cHV0ID0gdHhPdXRwdXRBbW91bnRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgICAgICAgIG91dHB1dHMuYWRkKHR4T3V0cHV0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBmaW5hbGx5IHNlbmQgdGhlIHJlbWFpbmluZyBBREEgaW4gaXRzIG93biBvdXRwdXRcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ091dHB1dEFtb3VudCA9IGNoYW5nZS5jaGVja2VkX3N1YihtaW5BbW91bnROZWVkZWRGb3JUb3RhbEFzc2V0T3V0cHV0cyk7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VPdXRwdXQgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dC5uZXcoXG4gICAgICAgICAgICAgIGNoYW5nZUFkZHJlc3MsXG4gICAgICAgICAgICAgIENhcmRhbm9XYXNtLlZhbHVlLm5ldyhyZW1haW5pbmdPdXRwdXRBbW91bnQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgb3V0cHV0cy5hZGQoY2hhbmdlT3V0cHV0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICAgICAgJ0luc3VmZmljaWVudCBmdW5kczogbmVlZCBhIG1pbmltdW0gb2YgMS41IEFEQSBwZXIgb3V0cHV0IHRvIGNvbnN0cnVjdCB0b2tlbiBjb25zb2xpZGF0aW9uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHRva2VucyB0byBjb25zb2xpZGF0ZSwgeW91IG9ubHkgaGF2ZSAxIG91dHB1dCB3aGljaCBpcyBBREEgYWxvbmVcbiAgICAgICAgICBjb25zdCBjaGFuZ2VPdXRwdXQgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dC5uZXcoY2hhbmdlQWRkcmVzcywgQ2FyZGFub1dhc20uVmFsdWUubmV3KGNoYW5nZSkpO1xuICAgICAgICAgIG91dHB1dHMuYWRkKGNoYW5nZU91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgYSBjb25zb2xpZGF0ZSByZXF1ZXN0LCB3aGF0ZXZlciBjaGFuZ2UgdGhhdCBuZWVkcyB0byBiZSBzZW50IGJhY2sgdG8gdGhlIHJvb3RhZGRyZXNzIGlzIGFkZGVkIGFzIGEgc2VwYXJhdGUgb3V0cHV0IGhlcmVcbiAgICAgICAgY29uc3QgY2hhbmdlT3V0cHV0ID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXQubmV3KGNoYW5nZUFkZHJlc3MsIENhcmRhbm9XYXNtLlZhbHVlLm5ldyhjaGFuZ2UpKTtcbiAgICAgICAgb3V0cHV0cy5hZGQoY2hhbmdlT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0eFJhdyA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uQm9keS5uZXdfdHhfYm9keShpbnB1dHMsIG91dHB1dHMsIHRoaXMuX2ZlZSk7XG5cbiAgICBjb25zdCBjZXJ0cyA9IENhcmRhbm9XYXNtLkNlcnRpZmljYXRlcy5uZXcoKTtcbiAgICBmb3IgKGNvbnN0IGNlcnQgb2YgdGhpcy5fY2VydHMpIHtcbiAgICAgIGNlcnRzLmFkZChjZXJ0KTtcbiAgICB9XG4gICAgdHhSYXcuc2V0X2NlcnRzKGNlcnRzKTtcblxuICAgIC8vIGFkZCBpbiB3aXRoZHJhd2FsIGlmIHRoaXMgaXMgYSB3aXRoZHJhd2FsIHR4XG4gICAgaWYgKHRoaXMuX3dpdGhkcmF3YWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHdpdGhkcmF3YWxzID0gQ2FyZGFub1dhc20uV2l0aGRyYXdhbHMubmV3KCk7XG4gICAgICB0aGlzLl93aXRoZHJhd2Fscy5mb3JFYWNoKCh3aXRoZHJhd2FsOiBXaXRoZHJhd2FsKSA9PiB7XG4gICAgICAgIGNvbnN0IHJld2FyZEFkZHJlc3MgPSBDYXJkYW5vV2FzbS5SZXdhcmRBZGRyZXNzLmZyb21fYWRkcmVzcyhcbiAgICAgICAgICBDYXJkYW5vV2FzbS5BZGRyZXNzLmZyb21fYmVjaDMyKHdpdGhkcmF3YWwuc3Rha2VBZGRyZXNzKVxuICAgICAgICApO1xuICAgICAgICB3aXRoZHJhd2Fscy5pbnNlcnQocmV3YXJkQWRkcmVzcyEsIENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih3aXRoZHJhd2FsLnZhbHVlKSk7XG4gICAgICB9KTtcblxuICAgICAgdHhSYXcuc2V0X3dpdGhkcmF3YWxzKHdpdGhkcmF3YWxzKTtcbiAgICB9XG5cbiAgICB0eFJhdy5zZXRfdHRsKENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih0aGlzLl90dGwudG9TdHJpbmcoKSkpO1xuICAgIGNvbnN0IHR4UmF3SGFzaCA9IENhcmRhbm9XYXNtLmhhc2hfdHJhbnNhY3Rpb24odHhSYXcpO1xuXG4gICAgLy8gbm93IGFkZCB0aGUgd2l0bmVzc2VzIGFnYWluIHRoaXMgdGltZSBmb3IgcmVhbC4gV2UgbmVlZCB0byBkbyB0aGlzIGFnYWluXG4gICAgLy8gYmVjYXVzZSBub3cgdGhhdCB3ZSd2ZSBhZGRlZCBvdXIgcmVhbCBmZWUgYW5kIGNoYW5nZSBvdXRwdXQsIHdlIGhhdmUgYSBkaWZmZXJlbmNlIHRyYW5zYWN0aW9uIGhhc2hcbiAgICBjb25zdCB3aXRuZXNzU2V0ID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25XaXRuZXNzU2V0Lm5ldygpO1xuICAgIGNvbnN0IHZrZXlXaXRuZXNzZXMgPSBDYXJkYW5vV2FzbS5Wa2V5d2l0bmVzc2VzLm5ldygpO1xuICAgIHRoaXMuX3NpZ25lcnMuZm9yRWFjaCgoa2V5UGFpcikgPT4ge1xuICAgICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRLZXlzKCkucHJ2IGFzIHN0cmluZztcbiAgICAgIGNvbnN0IHZrZXlXaXRuZXNzID0gQ2FyZGFub1dhc20ubWFrZV92a2V5X3dpdG5lc3MoXG4gICAgICAgIHR4UmF3SGFzaCxcbiAgICAgICAgQ2FyZGFub1dhc20uUHJpdmF0ZUtleS5mcm9tX25vcm1hbF9ieXRlcyhCdWZmZXIuZnJvbShwcnYsICdoZXgnKSlcbiAgICAgICk7XG4gICAgICB2a2V5V2l0bmVzc2VzLmFkZCh2a2V5V2l0bmVzcyk7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhciB0aGUgY29zbWV0aWMgc2lnbmF0dXJlIGFycmF5IGluIG5hdGl2ZSB0eG4gd3JhcHBlciB0byBwcmV2ZW50IGR1cGxpY2F0ZSB3aGVuIGJ1aWxkZXIgaXMgaW5pdGVkIGZyb20gYSBwYXJ0aWFsbHkgd2l0bmVzc2VkIHR4blxuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNpZ25hdHVyZS5sZW5ndGggPSAwO1xuICAgIHRoaXMuZ2V0QWxsU2lnbmF0dXJlcygpLmZvckVhY2goKHNpZ25hdHVyZSkgPT4ge1xuICAgICAgY29uc3QgdmtleSA9IENhcmRhbm9XYXNtLlZrZXkubmV3KENhcmRhbm9XYXNtLlB1YmxpY0tleS5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZS5wdWJsaWNLZXkucHViLCAnaGV4JykpKTtcbiAgICAgIGNvbnN0IGVkMjU1U2lnID0gQ2FyZGFub1dhc20uRWQyNTUxOVNpZ25hdHVyZS5mcm9tX2J5dGVzKHNpZ25hdHVyZS5zaWduYXR1cmUpO1xuICAgICAgdmtleVdpdG5lc3Nlcy5hZGQoQ2FyZGFub1dhc20uVmtleXdpdG5lc3MubmV3KHZrZXksIGVkMjU1U2lnKSk7XG4gICAgICB0aGlzLl90cmFuc2FjdGlvbi5zaWduYXR1cmUucHVzaChzaWduYXR1cmUuc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgfSk7XG4gICAgd2l0bmVzc1NldC5zZXRfdmtleXModmtleVdpdG5lc3Nlcyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24udHJhbnNhY3Rpb24gPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbi5uZXcodHhSYXcsIHdpdG5lc3NTZXQpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzaWduSW1wbGVtZW50YXRpb24oa2V5OiBCYXNlS2V5KTogVHJhbnNhY3Rpb24ge1xuICAgIHRoaXMuX3NpZ25lcnMucHVzaChuZXcgS2V5UGFpcih7IHBydjoga2V5LmtleSB9KSk7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2V0IHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IEJhc2VBZGRyZXNzLCBhZGRyZXNzRm9ybWF0Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF1dGlsLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdpbnZhbGlkIGFkZHJlc3MgJyArIGFkZHJlc3MuYWRkcmVzcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlS2V5KGtleTogQmFzZUtleSk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBuZXcgS2V5UGFpcih7IHBydjoga2V5LmtleSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEtleSB2YWxpZGF0aW9uIGZhaWxlZGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgQ2FyZGFub1dhc20uVHJhbnNhY3Rpb24uZnJvbV9ieXRlcyhyYXdUcmFuc2FjdGlvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICghdHJhbnNhY3Rpb24udHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQmlnTnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLmlzTGVzc1RoYW4oMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgIH1cbiAgfVxuICAvLyBlbmRyZWdpb25cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYWRkU2lnbmF0dXJlKHB1YmxpY0tleTogQmFzZVB1YmxpY0tleSwgc2lnbmF0dXJlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goeyBwdWJsaWNLZXksIHNpZ25hdHVyZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsU2lnbmF0dXJlcygpOiBTaWduYXR1cmVbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRTaWduYXR1cmVzLmNvbmNhdCh0aGlzLl9zaWduYXR1cmVzKTtcbiAgfVxufVxuIl19
|
|
783
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsbURBUzhCO0FBQzlCLCtDQUFxSDtBQUNySCx1Q0FBb0M7QUFDcEMsaURBQXNEO0FBQ3RELHNGQUF3RTtBQUN4RSwrRkFBa0U7QUFFbEU7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHO0lBQ3ZCLDZCQUE2QjtJQUM3QixhQUFhLEVBQUUsSUFBSTtJQUNuQiw2QkFBNkI7SUFDN0IsYUFBYSxFQUFFLFFBQVE7SUFDdkIsMkNBQTJDO0lBQzNDLGFBQWEsRUFBRSxLQUFLO0NBQ3JCLENBQUM7QUFFRixNQUFzQixrQkFBbUIsU0FBUSxpQ0FBc0I7SUE0QnJFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBM0JYLGFBQVEsR0FBYyxFQUFFLENBQUM7UUFDekIsdUJBQWtCLEdBQXVCLEVBQUUsQ0FBQztRQUM1Qyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBQzlDLG9CQUFlLEdBQWdCLEVBQUUsQ0FBQztRQUNsQyxnQkFBVyxHQUFnQixFQUFFLENBQUM7UUFHOUIsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULFdBQU0sR0FBOEIsRUFBRSxDQUFDO1FBQ3ZDLGlCQUFZLEdBQWlCLEVBQUUsQ0FBQztRQUVoQyxpQkFBWSxHQUFZLEVBQUUsQ0FBQztRQUdyQywyQ0FBMkM7UUFDakMscUJBQWdCLEdBQXdCLEVBQUUsQ0FBQztRQUdyRCxxREFBcUQ7UUFDN0Msd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ3BDOzs7YUFHSztRQUNHLDRCQUF1QixHQUF3QixFQUFFLENBQUM7UUFJeEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHlCQUFXLENBQUMsV0FBVyxDQUFDLENB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RCxrQkFBa0I7SUFDbEIsYUFBYSxDQUFDLEtBQWdCO1FBQzVCLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBQ0QsWUFBWTtJQUVaLGtCQUFrQjtJQUNsQixZQUFZLENBQUMsU0FBd0IsRUFBRSxTQUFpQjtRQUN0RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBMTFCRCxnREEwMUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQmFzZUFkZHJlc3MsXG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgUHVibGljS2V5IGFzIEJhc2VQdWJsaWNLZXksXG4gIFNpZ25hdHVyZSxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBVdGlsc0Vycm9yLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBc3NldCwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uSW5wdXQsIFRyYW5zYWN0aW9uT3V0cHV0LCBXaXRoZHJhd2FsLCBTcG9uc29yc2hpcEluZm8gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHV0aWwsIHsgTUlOX0FEQV9GT1JfT05FX0FTU0VUIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgKiBhcyBDYXJkYW5vV2FzbSBmcm9tICdAZW11cmdvL2NhcmRhbm8tc2VyaWFsaXphdGlvbi1saWItbm9kZWpzJztcbmltcG9ydCB7IEJpZ051bSB9IGZyb20gJ0BlbXVyZ28vY2FyZGFuby1zZXJpYWxpemF0aW9uLWxpYi1ub2RlanMnO1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdHJhbnNhY3Rpb24gYnVpbGRpbmdcbiAqL1xuY29uc3QgRkVFX0NPRUZGSUNJRU5UUyA9IHtcbiAgLyoqIExpbmVhciBmZWUgcGFyYW1ldGVyIGEgKi9cbiAgQV9DT0VGRklDSUVOVDogJzQ0JyxcbiAgLyoqIExpbmVhciBmZWUgcGFyYW1ldGVyIGIgKi9cbiAgQl9DT0VGRklDSUVOVDogJzE1NTM4MScsXG4gIC8qKiBBZGRpdGlvbmFsIHNhZmV0eSBtYXJnaW4gZm9yIHRoZSBmZWUgKi9cbiAgU0FGRVRZX01BUkdJTjogJzQ0MCcsXG59O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb24hOiBUcmFuc2FjdGlvbjtcbiAgcHJvdGVjdGVkIF9zaWduZXJzOiBLZXlQYWlyW10gPSBbXTtcbiAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbklucHV0czogVHJhbnNhY3Rpb25JbnB1dFtdID0gW107XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb25PdXRwdXRzOiBUcmFuc2FjdGlvbk91dHB1dFtdID0gW107XG4gIHByb3RlY3RlZCBfaW5pdFNpZ25hdHVyZXM6IFNpZ25hdHVyZVtdID0gW107XG4gIHByb3RlY3RlZCBfc2lnbmF0dXJlczogU2lnbmF0dXJlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9jaGFuZ2VBZGRyZXNzOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfc2VuZGVyQmFsYW5jZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3R0bCA9IDA7XG4gIHByb3RlY3RlZCBfY2VydHM6IENhcmRhbm9XYXNtLkNlcnRpZmljYXRlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF93aXRoZHJhd2FsczogV2l0aGRyYXdhbFtdID0gW107XG4gIHByb3RlY3RlZCBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwcm90ZWN0ZWQgX211bHRpQXNzZXRzOiBBc3NldFtdID0gW107XG4gIC8qKiBBZGRyZXNzIG9mIHRoZSB0cmFuc2FjdGlvbiByZWNpcGllbnQgKi9cbiAgcHJvdGVjdGVkIF9yZWNpcGllbnRBZGRyZXNzOiBzdHJpbmc7XG4gIC8qKiBNYXAgb2Ygc2VuZGVyJ3MgYXNzZXRzIGJ5IGFzc2V0IG5hbWUgKi9cbiAgcHJvdGVjdGVkIF9zZW5kZXJBc3NldExpc3Q6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgcHJvdGVjdGVkIF9zcG9uc29yc2hpcEluZm86IFNwb25zb3JzaGlwSW5mbyB8IHVuZGVmaW5lZDsgLy8gRW5yaWNoZWQgZm9yIHNwb25zb3JlZCB0cmFuc2FjdGlvbnNcbiAgcHJpdmF0ZSBfZmVlOiBCaWdOdW07XG4gIC8qKiBGbGFnIGluZGljYXRpbmcgaWYgdGhpcyBpcyBhIHRva2VuIHRyYW5zYWN0aW9uICovXG4gIHByaXZhdGUgX2lzVG9rZW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAvKiogRGVlcCBjbG9uZSBvZiBfc2VuZGVyQXNzZXRMaXN0IC0gZm9yIG1hbmlwdWxhdGluZyBkdXJpbmcgdHdvIGl0ZXJhdGlvbnNcbiAgICogICAtIG9uZSBmb3IgY2FsY3VsYXRpbmcgdGhlIGZlZVxuICAgKiAgIC0gb25lIGZvciB0aGUgYWN0dWFsIHRyYW5zYWN0aW9uIGJ1aWxkIHdpdGggdGhlIGNhbGN1bGF0ZWQgZmVlXG4gICAqICovXG4gIHByaXZhdGUgX211dGFibGVTZW5kZXJBc3NldExpc3Q6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fZmVlID0gQmlnTnVtLnplcm8oKTtcbiAgfVxuXG4gIGlucHV0KGk6IFRyYW5zYWN0aW9uSW5wdXQpOiB0aGlzIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbklucHV0cy5wdXNoKGkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3V0cHV0KG86IFRyYW5zYWN0aW9uT3V0cHV0KTogdGhpcyB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25PdXRwdXRzLnB1c2gobyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhc3NldHMoYTogQXNzZXQpOiB0aGlzIHtcbiAgICB0aGlzLl9tdWx0aUFzc2V0cy5wdXNoKGEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdHRsKHQ6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuX3R0bCA9IHQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY2hhbmdlIGFkZHJlc3MgYW5kIGlucHV0IGJhbGFuY2VzIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGFkZHIgLSBUaGUgYWRkcmVzcyB3aGVyZSBjaGFuZ2Ugd2lsbCBiZSBzZW50XG4gICAqIEBwYXJhbSB0b3RhbElucHV0QmFsYW5jZSAtIFRoZSB0b3RhbCBBREEgaW5wdXQgYmFsYW5jZSBpbiBMb3ZlbGFjZVxuICAgKiBAcGFyYW0gaW5wdXRBc3NldExpc3QgLSBPcHRpb25hbCBtYXAgb2YgdG9rZW4gYXNzZXRzIGluIHRoZSBpbnB1dFxuICAgKi9cbiAgY2hhbmdlQWRkcmVzcyhhZGRyOiBzdHJpbmcsIHRvdGFsSW5wdXRCYWxhbmNlOiBzdHJpbmcsIGlucHV0QXNzZXRMaXN0PzogUmVjb3JkPHN0cmluZywgYW55Pik6IHRoaXMge1xuICAgIHRoaXMuX2NoYW5nZUFkZHJlc3MgPSBhZGRyO1xuICAgIHRoaXMuX3NlbmRlckJhbGFuY2UgPSB0b3RhbElucHV0QmFsYW5jZTtcbiAgICB0aGlzLl9zZW5kZXJBc3NldExpc3QgPSBpbnB1dEFzc2V0TGlzdCA/PyB7fTtcbiAgICB0aGlzLnNldE11dGFibGVTZW5kZXJBc3NldExpc3QoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE11dGFibGVTZW5kZXJBc3NldExpc3QoKSB7XG4gICAgdGhpcy5fbXV0YWJsZVNlbmRlckFzc2V0TGlzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5fc2VuZGVyQXNzZXRMaXN0KSk7XG4gIH1cblxuICBmZWUoZmVlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLl9mZWUgPSBCaWdOdW0uZnJvbV9zdHIoZmVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGlzIHRyYW5zYWN0aW9uIGFzIGEgdG9rZW4gdHJhbnNhY3Rpb25cbiAgICogRW5hYmxlcyBzcGVjaWFsIGhhbmRsaW5nIGZvciB0b2tlbiB0cmFuc2ZlcnNcbiAgICovXG4gIGlzVG9rZW5UcmFuc2FjdGlvbigpIHtcbiAgICB0aGlzLl9pc1Rva2VuVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3BvbnNvcnNoaXBJbmZvKGluZm86IFNwb25zb3JzaGlwSW5mbyk6IHRoaXMge1xuICAgIHRoaXMuX3Nwb25zb3JzaGlwSW5mbyA9IGluZm87XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24gYnVpbGRlciBmaWVsZHMgdXNpbmcgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSB0eCB0aGUgdHJhbnNhY3Rpb24gZGF0YVxuICAgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0eDtcbiAgICBjb25zdCB0eG5Cb2R5ID0gdHgudHJhbnNhY3Rpb24uYm9keSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHhuQm9keS5pbnB1dHMoKS5sZW4oKTsgaSsrKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IHR4bkJvZHkuaW5wdXRzKCkuZ2V0KGkpO1xuICAgICAgdGhpcy5pbnB1dCh7XG4gICAgICAgIHRyYW5zYWN0aW9uX2lkOiBCdWZmZXIuZnJvbShpbnB1dC50cmFuc2FjdGlvbl9pZCgpLnRvX2J5dGVzKCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdHJhbnNhY3Rpb25faW5kZXg6IGlucHV0LmluZGV4KCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eG5Cb2R5Lm91dHB1dHMoKS5sZW4oKTsgaSsrKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSB0eG5Cb2R5Lm91dHB1dHMoKS5nZXQoaSk7XG4gICAgICB0aGlzLm91dHB1dCh7XG4gICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzKCkudG9fYmVjaDMyKCksXG4gICAgICAgIGFtb3VudDogb3V0cHV0LmFtb3VudCgpLmNvaW4oKS50b19zdHIoKSxcbiAgICAgICAgbXVsdGlBc3NldHM6IG91dHB1dC5hbW91bnQoKS5tdWx0aWFzc2V0KCkgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR4bkJvZHkuY2VydHMoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjZXJ0cyA9IHR4bkJvZHkuY2VydHMoKSBhcyBDYXJkYW5vV2FzbS5DZXJ0aWZpY2F0ZXM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNlcnRzLmxlbigpOyBpKyspIHtcbiAgICAgICAgdGhpcy5fY2VydHMucHVzaChjZXJ0cy5nZXQoaSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eG5Cb2R5LndpdGhkcmF3YWxzKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgd2l0aGRyYXdhbHMgPSB0eG5Cb2R5LndpdGhkcmF3YWxzKCkgYXMgQ2FyZGFub1dhc20uV2l0aGRyYXdhbHM7XG4gICAgICBjb25zdCBrZXlzID0gd2l0aGRyYXdhbHMua2V5cygpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbigpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmV3YXJkQWRkcmVzcyA9IGtleXMuZ2V0KGkpIGFzIENhcmRhbm9XYXNtLlJld2FyZEFkZHJlc3M7XG4gICAgICAgIGNvbnN0IHJld2FyZCA9IHdpdGhkcmF3YWxzLmdldChyZXdhcmRBZGRyZXNzKSBhcyBDYXJkYW5vV2FzbS5CaWdOdW07XG4gICAgICAgIHRoaXMuX3dpdGhkcmF3YWxzLnB1c2goeyBzdGFrZUFkZHJlc3M6IHJld2FyZEFkZHJlc3MudG9fYWRkcmVzcygpLnRvX2JlY2gzMigpLCB2YWx1ZTogcmV3YXJkLnRvX3N0cigpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3R0bCA9IHR4LnRyYW5zYWN0aW9uLmJvZHkoKS50dGwoKSBhcyBudW1iZXI7XG4gICAgdGhpcy5fZmVlID0gdHgudHJhbnNhY3Rpb24uYm9keSgpLmZlZSgpO1xuXG4gICAgaWYgKHR4LnRyYW5zYWN0aW9uLndpdG5lc3Nfc2V0KCkudmtleXMoKSkge1xuICAgICAgY29uc3QgdmtleXMgPSB0eC50cmFuc2FjdGlvbi53aXRuZXNzX3NldCgpLnZrZXlzKCkhIGFzIENhcmRhbm9XYXNtLlZrZXl3aXRuZXNzZXM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZrZXlzLmxlbigpOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmtleSA9IHZrZXlzLmdldChpKTtcbiAgICAgICAgdGhpcy5faW5pdFNpZ25hdHVyZXMucHVzaCh7XG4gICAgICAgICAgcHVibGljS2V5OiB7IHB1YjogdmtleS52a2V5KCkucHVibGljX2tleSgpLnRvX2hleCgpIH0sXG4gICAgICAgICAgc2lnbmF0dXJlOiBCdWZmZXIuZnJvbSh2a2V5LnNpZ25hdHVyZSgpLnRvX2hleCgpLCAnaGV4JyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgdGhpcy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0aGlzLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSB0cmFuc2FjdGlvbiB0aGF0IGluY2x1ZGVzIHRva2VuIGFzc2V0c1xuICAgKiBAcmV0dXJucyBUaGUgYnVpbHQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1Rva2VuQnVpbGQoKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGlucHV0cyA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uSW5wdXRzLm5ldygpO1xuICAgIGxldCBvdXRwdXRzID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXRzLm5ldygpO1xuICAgIHRoaXMuYWRkSW5wdXRzKGlucHV0cyk7XG4gICAgLy8gRmVlIGlzIG5ldmVyIHNldCBzbyBmYXIgZnJvbSBJTVNcbiAgICBpZiAodGhpcy5fZmVlLmlzX3plcm8oKSkge1xuICAgICAgdGhpcy5hZGRPdXRwdXRzKG91dHB1dHMpO1xuICAgICAgY29uc3QgdHhEcmFmdCA9IHRoaXMucHJlcGFyZUFkYVRyYW5zYWN0aW9uRHJhZnQoaW5wdXRzLCBvdXRwdXRzLCBmYWxzZSk7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUZlZSh0eERyYWZ0KTtcbiAgICAgIHRoaXMuc2V0RmVlSW5UcmFuc2FjdGlvbigpO1xuICAgIH1cbiAgICAvLyBSZXNldCBvdXRwdXRzIHRvIGFkZCB0aGVtIGJhY2sgd2l0aCB0aGUgY29ycmVjdCBjaGFuZ2VcbiAgICBvdXRwdXRzID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXRzLm5ldygpO1xuICAgIHRoaXMuc2V0TXV0YWJsZVNlbmRlckFzc2V0TGlzdCgpO1xuICAgIHRoaXMuYWRkT3V0cHV0cyhvdXRwdXRzKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi50cmFuc2FjdGlvbiA9IHRoaXMucHJlcGFyZUFkYVRyYW5zYWN0aW9uRHJhZnQoaW5wdXRzLCBvdXRwdXRzLCB0cnVlKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRyYW5zYWN0aW9uIGlucHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGlucHV0cyAtIFRoZSBpbnB1dHMgY29sbGVjdGlvbiB0byBhZGQgdG9cbiAgICovXG4gIHByaXZhdGUgYWRkSW5wdXRzKGlucHV0cykge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uSW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpbnB1dHMuYWRkKFxuICAgICAgICBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbklucHV0Lm5ldyhcbiAgICAgICAgICBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbkhhc2guZnJvbV9ieXRlcyhCdWZmZXIuZnJvbShpbnB1dC50cmFuc2FjdGlvbl9pZCwgJ2hleCcpKSxcbiAgICAgICAgICBpbnB1dC50cmFuc2FjdGlvbl9pbmRleFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgb3V0cHV0cyB0byB0aGUgdHJhbnNhY3Rpb24gaW5jbHVkaW5nIHRva2VuIG91dHB1dHMgYW5kIGNoYW5nZVxuICAgKiBAcGFyYW0gb3V0cHV0cyAtIFRoZSBvdXRwdXRzIGNvbGxlY3Rpb24gdG8gYWRkIHRvXG4gICAqL1xuICBwcml2YXRlIGFkZE91dHB1dHMob3V0cHV0cykge1xuICAgIGlmICh0aGlzLl9zcG9uc29yc2hpcEluZm8pIHtcbiAgICAgIGNvbnN0IGZlZUFkZHJlc3NVdHhvQmFsYW5jZSA9IENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih0aGlzLl9zcG9uc29yc2hpcEluZm8uZmVlQWRkcmVzc0lucHV0QmFsYW5jZSk7XG4gICAgICBsZXQgZmVlQWRkcmVzc0NoYW5nZSA9IGZlZUFkZHJlc3NVdHhvQmFsYW5jZS5jaGVja2VkX3N1Yih0aGlzLl9mZWUpO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzc1V0eG9CYWxhbmNlID0gQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKHRoaXMuX3NlbmRlckJhbGFuY2UpO1xuICAgICAgaWYgKHRoaXMuX2lzVG9rZW5UcmFuc2FjdGlvbikge1xuICAgICAgICAvLyBGZWUgYWRkcmVzcyBzcG9uc29ycyBtaW4gYWRhXG4gICAgICAgIGZlZUFkZHJlc3NDaGFuZ2UgPSB0aGlzLmFkZFJlY2VpdmVyT3V0cHV0cyhvdXRwdXRzLCBmZWVBZGRyZXNzQ2hhbmdlKTtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2VPdXRwdXQoc2VuZGVyQWRkcmVzc1V0eG9CYWxhbmNlLCBvdXRwdXRzLCB0aGlzLl9jaGFuZ2VBZGRyZXNzKTtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2VPdXRwdXQoZmVlQWRkcmVzc0NoYW5nZSwgb3V0cHV0cywgdGhpcy5fc3BvbnNvcnNoaXBJbmZvLmZlZUFkZHJlc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VuZGVyQ2hhbmdlQWZ0ZXJSZWNlaXZlckRlZHVjdGlvbnMgPSB0aGlzLmFkZFJlY2VpdmVyT3V0cHV0cyhvdXRwdXRzLCBzZW5kZXJBZGRyZXNzVXR4b0JhbGFuY2UpO1xuICAgICAgICB0aGlzLmFkZENoYW5nZU91dHB1dChzZW5kZXJDaGFuZ2VBZnRlclJlY2VpdmVyRGVkdWN0aW9ucywgb3V0cHV0cywgdGhpcy5fY2hhbmdlQWRkcmVzcyk7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlT3V0cHV0KGZlZUFkZHJlc3NDaGFuZ2UsIG91dHB1dHMsIHRoaXMuX3Nwb25zb3JzaGlwSW5mby5mZWVBZGRyZXNzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdXR4b0JhbGFuY2UgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIodGhpcy5fc2VuZGVyQmFsYW5jZSk7IC8vIFRvdGFsIFVUWE8gYmFsYW5jZVxuICAgICAgY29uc3QgY2hhbmdlID0gdXR4b0JhbGFuY2UuY2hlY2tlZF9zdWIodGhpcy5fZmVlKTtcbiAgICAgIGNvbnN0IGNoYW5nZUFmdGVyUmVjZWl2ZXJEZWR1Y3Rpb25zID0gdGhpcy5hZGRSZWNlaXZlck91dHB1dHMob3V0cHV0cywgY2hhbmdlKTtcbiAgICAgIHRoaXMuYWRkQ2hhbmdlT3V0cHV0KGNoYW5nZUFmdGVyUmVjZWl2ZXJEZWR1Y3Rpb25zLCBvdXRwdXRzLCB0aGlzLl9jaGFuZ2VBZGRyZXNzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyByZWNlaXZlciBvdXRwdXRzIHRvIHRoZSB0cmFuc2FjdGlvbiBhbmQgY2FsY3VsYXRlcyB0aGUgcmVtYWluaW5nIGNoYW5nZVxuICAgKiBAcGFyYW0gb3V0cHV0cyAtIFRyYW5zYWN0aW9uIG91dHB1dHMgY29sbGVjdGlvblxuICAgKiBAcGFyYW0gY2hhbmdlIC0gQ3VycmVudCBjaGFuZ2UgYW1vdW50IGluIEFEQVxuICAgKiBAcmV0dXJucyBSZW1haW5pbmcgY2hhbmdlIGFmdGVyIGFkZGluZyByZWNlaXZlciBvdXRwdXRzXG4gICAqL1xuICBwcml2YXRlIGFkZFJlY2VpdmVyT3V0cHV0cyhvdXRwdXRzLCBjaGFuZ2UpIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbk91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBpZiAoIW91dHB1dC5hZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3V0cHV0OiBtaXNzaW5nIGFkZHJlc3MnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVjZWl2ZXJBZGRyZXNzID0gb3V0cHV0LmFkZHJlc3M7XG4gICAgICBjb25zdCByZWNlaXZlckFtb3VudCA9IG91dHB1dC5hbW91bnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyQW1vdW50Qk4gPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIocmVjZWl2ZXJBbW91bnQpO1xuICAgICAgICBjaGFuZ2UgPSBjaGFuZ2UuY2hlY2tlZF9zdWIocmVjZWl2ZXJBbW91bnRCTik7XG5cbiAgICAgICAgaWYgKGNoYW5nZS5sZXNzX3RoYW4oQ2FyZGFub1dhc20uQmlnTnVtLnplcm8oKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICAgJ0luc3VmZmljaWVudCBmdW5kczogbm90IGVub3VnaCBBREEgdG8gY292ZXIgcmVjZWl2ZXIgb3V0cHV0IGFtb3VudHMgYW5kIGZlZXMnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG91dHB1dC5tdWx0aUFzc2V0cyBpcyBzZXQgd2hlbiB0aGVyZSBhcmUgdG9rZW4gYXNzZXRzIHRvIHNlbmRcbiAgICAgICAgY29uc3QgbXVsdGlBc3NldHMgPSBvdXRwdXQubXVsdGlBc3NldHMgYXMgQXNzZXQ7XG4gICAgICAgIGlmIChtdWx0aUFzc2V0cykge1xuICAgICAgICAgIGNvbnN0IHBvbGljeUlkID0gbXVsdGlBc3NldHMucG9saWN5X2lkO1xuICAgICAgICAgIGNvbnN0IGFzc2V0TmFtZSA9IG11bHRpQXNzZXRzLmFzc2V0X25hbWU7XG4gICAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBtdWx0aUFzc2V0cy5xdWFudGl0eTtcbiAgICAgICAgICBjb25zdCBmaW5nZXJwcmludCA9IG11bHRpQXNzZXRzLmZpbmdlcnByaW50IGFzIHN0cmluZztcblxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdHkgPSB0aGlzLl9tdXRhYmxlU2VuZGVyQXNzZXRMaXN0W2ZpbmdlcnByaW50XS5xdWFudGl0eTtcbiAgICAgICAgICBjb25zdCByZW1haW5pbmdRdHkgPSBCaWdJbnQoY3VycmVudFF0eSkgLSBCaWdJbnQocXVhbnRpdHkpO1xuICAgICAgICAgIGlmIChyZW1haW5pbmdRdHkgPCAwbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW5zdWZmaWNpZW50IHF0eTogbm90IGVub3VnaCB0b2tlbiBxdHkgdG8gY292ZXIgcmVjZWl2ZXIgb3V0cHV0Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fbXV0YWJsZVNlbmRlckFzc2V0TGlzdFtmaW5nZXJwcmludF0ucXVhbnRpdHkgPSByZW1haW5pbmdRdHkudG9TdHJpbmcoKTtcblxuICAgICAgICAgIGNvbnN0IG1pbkFtb3VudE5lZWRlZEZvckFzc2V0T3V0cHV0ID0gdGhpcy5hZGRUb2tlbnNUb091dHB1dChjaGFuZ2UsIG91dHB1dHMsIHJlY2VpdmVyQWRkcmVzcywge1xuICAgICAgICAgICAgcG9saWN5X2lkOiBwb2xpY3lJZCxcbiAgICAgICAgICAgIGFzc2V0X25hbWU6IGFzc2V0TmFtZSxcbiAgICAgICAgICAgIHF1YW50aXR5LFxuICAgICAgICAgICAgZmluZ2VycHJpbnQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjaGFuZ2UgPSBjaGFuZ2UuY2hlY2tlZF9zdWIobWluQW1vdW50TmVlZGVkRm9yQXNzZXRPdXRwdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5hdGl2ZSBjb2luIHNlbmRcbiAgICAgICAgICBjb25zdCBhbW91bnQgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIocmVjZWl2ZXJBbW91bnQpO1xuICAgICAgICAgIG91dHB1dHMuYWRkKFxuICAgICAgICAgICAgQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXQubmV3KHV0aWwuZ2V0V2FsbGV0QWRkcmVzcyhyZWNlaXZlckFkZHJlc3MpLCBDYXJkYW5vV2FzbS5WYWx1ZS5uZXcoYW1vdW50KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgQnVpbGRUcmFuc2FjdGlvbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBFcnJvciBwcm9jZXNzaW5nIG91dHB1dDogJHtlLm1lc3NhZ2UgPz8gZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdG9rZW5zIHRvIGEgdHJhbnNhY3Rpb24gb3V0cHV0XG4gICAqIEBwYXJhbSBjaGFuZ2UgLSBUaGUgY3VycmVudCBjaGFuZ2UgYW1vdW50IGluIExvdmVsYWNlXG4gICAqIEBwYXJhbSBvdXRwdXRzIC0gVGhlIG91dHB1dHMgY29sbGVjdGlvbiB0byBhZGQgdG9cbiAgICogQHBhcmFtIGFkZHJlc3MgLSBUaGUgcmVjaXBpZW50IGFkZHJlc3NcbiAgICogQHBhcmFtIGFzc2V0IC0gVGhlIGFzc2V0IHRvIGFkZFxuICAgKiBAcmV0dXJucyBUaGUgbWluaW11bSBBREEgYW1vdW50IG5lZWRlZCBmb3IgdGhpcyBhc3NldCBvdXRwdXRcbiAgICovXG4gIHByaXZhdGUgYWRkVG9rZW5zVG9PdXRwdXQoY2hhbmdlOiBCaWdOdW0sIG91dHB1dHM6IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0cywgYWRkcmVzcywgYXNzZXQ6IEFzc2V0KTogQmlnTnVtIHtcbiAgICBjb25zdCBtaW5BbW91bnROZWVkZWRGb3JPbmVBc3NldE91dHB1dCA9IENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihNSU5fQURBX0ZPUl9PTkVfQVNTRVQpO1xuICAgIGlmIChjaGFuZ2UubGVzc190aGFuKG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEluc3VmZmljaWVudCBmdW5kczogbmVlZCBhIG1pbmltdW0gb2YgJHtNSU5fQURBX0ZPUl9PTkVfQVNTRVR9IGxvdmVsYWNlIHBlciBvdXRwdXQgdG8gY29uc3RydWN0IHRva2VuIHRyYW5zYWN0aW9uc2BcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRUb2tlbnMoYXNzZXQsIG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0LCBvdXRwdXRzLCBhZGRyZXNzKTtcbiAgICByZXR1cm4gbWluQW1vdW50TmVlZGVkRm9yT25lQXNzZXRPdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRva2VuIG91dHB1dHMgZm9yIGEgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGFzc2V0IC0gVGhlIGFzc2V0IHRvIGluY2x1ZGUgaW4gdGhlIG91dHB1dFxuICAgKiBAcGFyYW0gbWluQW1vdW50TmVlZGVkRm9yT25lQXNzZXRPdXRwdXQgLSBNaW5pbXVtIEFEQSByZXF1aXJlZCBmb3IgdGhpcyBhc3NldCBvdXRwdXRcbiAgICogQHBhcmFtIG91dHB1dHMgLSBUcmFuc2FjdGlvbiBvdXRwdXRzIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIGFkZHJlc3MgLSBSZWNpcGllbnQgYWRkcmVzc1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRva2Vucyhhc3NldDogQXNzZXQsIG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0LCBvdXRwdXRzLCBhZGRyZXNzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCB0eE91dHB1dEJ1aWxkZXIgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dEJ1aWxkZXIubmV3KCk7XG4gICAgICBjb25zdCB0b0FkZHJlc3MgPSB1dGlsLmdldFdhbGxldEFkZHJlc3MoYWRkcmVzcyk7XG4gICAgICB0eE91dHB1dEJ1aWxkZXIgPSB0eE91dHB1dEJ1aWxkZXIud2l0aF9hZGRyZXNzKHRvQWRkcmVzcyk7XG4gICAgICBsZXQgdHhPdXRwdXRBbW91bnRCdWlsZGVyID0gdHhPdXRwdXRCdWlsZGVyLm5leHQoKTtcbiAgICAgIGNvbnN0IGFzc2V0TmFtZSA9IENhcmRhbm9XYXNtLkFzc2V0TmFtZS5uZXcoQnVmZmVyLmZyb20oYXNzZXQuYXNzZXRfbmFtZSwgJ2hleCcpKTtcbiAgICAgIGNvbnN0IHBvbGljeUlkID0gQ2FyZGFub1dhc20uU2NyaXB0SGFzaC5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKGFzc2V0LnBvbGljeV9pZCwgJ2hleCcpKTtcbiAgICAgIGNvbnN0IG11bHRpQXNzZXQgPSBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0Lm5ldygpO1xuICAgICAgY29uc3QgYXNzZXRzID0gQ2FyZGFub1dhc20uQXNzZXRzLm5ldygpO1xuICAgICAgYXNzZXRzLmluc2VydChhc3NldE5hbWUsIENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihhc3NldC5xdWFudGl0eSkpO1xuICAgICAgbXVsdGlBc3NldC5pbnNlcnQocG9saWN5SWQsIGFzc2V0cyk7XG5cbiAgICAgIHR4T3V0cHV0QW1vdW50QnVpbGRlciA9IHR4T3V0cHV0QW1vdW50QnVpbGRlci53aXRoX2NvaW5fYW5kX2Fzc2V0KG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0LCBtdWx0aUFzc2V0KTtcblxuICAgICAgY29uc3QgdHhPdXRwdXQgPSB0eE91dHB1dEFtb3VudEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIG91dHB1dHMuYWRkKHR4T3V0cHV0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBFcnJvciBidWlsZGluZyB0b2tlbnM6ICR7ZS5tZXNzYWdlIHx8IGV9IGZvciBhc3NldCAke0pTT04uc3RyaW5naWZ5KGFzc2V0KX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNoYW5nZSBvdXRwdXQgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBjaGFuZ2UgLSBUaGUgY2hhbmdlIGFtb3VudCBpbiBMb3ZlbGFjZVxuICAgKiBAcGFyYW0gb3V0cHV0cyAtIFRoZSBvdXRwdXRzIGNvbGxlY3Rpb24gdG8gYWRkIHRvXG4gICAqL1xuICBwcml2YXRlIGFkZENoYW5nZU91dHB1dChjaGFuZ2UsIG91dHB1dHMsIG91dHB1dEFkZHJlc3MpIHtcbiAgICBjb25zdCBjaGFuZ2VBZGRyZXNzID0gdXRpbC5nZXRXYWxsZXRBZGRyZXNzKG91dHB1dEFkZHJlc3MpO1xuICAgIC8qKlxuICAgICAqIHRoaXMubXV0YWJsZVNlbmRlckFzc2V0TGlzdCBpcyB0aGUgbGlzdCBvZiBhc3NldHMgZnJvbSB0aGUgc2VuZGVyIGFkZHJlc3NcbiAgICAgKiBBcyBhZGEgb25seSB1dHhvcyBhcmUgcGlja2VkIGZvciBmZWUgYWRkcmVzcywgdGhlIGFzc2V0cyBieSBkZWZhdWx0IGFyZSBzZW50IHRvIHRoZSBzZW5kZXIgYWRkcmVzc1xuICAgICAqL1xuICAgIGlmICghdGhpcy5fc3BvbnNvcnNoaXBJbmZvIHx8IHRoaXMuX3Nwb25zb3JzaGlwSW5mby5mZWVBZGRyZXNzICE9PSBvdXRwdXRBZGRyZXNzKSB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLl9tdXRhYmxlU2VuZGVyQXNzZXRMaXN0KS5mb3JFYWNoKChmaW5nZXJwcmludCkgPT4ge1xuICAgICAgICBjb25zdCBhc3NldCA9IHRoaXMuX211dGFibGVTZW5kZXJBc3NldExpc3RbZmluZ2VycHJpbnRdO1xuICAgICAgICBjb25zdCBjaGFuZ2VRdHkgPSBhc3NldC5xdWFudGl0eTtcbiAgICAgICAgY29uc3QgcG9saWN5SWQgPSBhc3NldC5wb2xpY3lfaWQ7XG4gICAgICAgIGNvbnN0IGFzc2V0TmFtZSA9IGFzc2V0LmFzc2V0X25hbWU7XG5cbiAgICAgICAgaWYgKENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihjaGFuZ2VRdHkpLmlzX3plcm8oKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pbkFtb3VudE5lZWRlZEZvckFzc2V0T3V0cHV0ID0gdGhpcy5hZGRUb2tlbnNUb091dHB1dChjaGFuZ2UsIG91dHB1dHMsIG91dHB1dEFkZHJlc3MsIHtcbiAgICAgICAgICBwb2xpY3lfaWQ6IHBvbGljeUlkLFxuICAgICAgICAgIGFzc2V0X25hbWU6IGFzc2V0TmFtZSxcbiAgICAgICAgICBxdWFudGl0eTogY2hhbmdlUXR5LFxuICAgICAgICAgIGZpbmdlcnByaW50LFxuICAgICAgICB9KTtcbiAgICAgICAgY2hhbmdlID0gY2hhbmdlLmNoZWNrZWRfc3ViKG1pbkFtb3VudE5lZWRlZEZvckFzc2V0T3V0cHV0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIWNoYW5nZS5pc196ZXJvKCkpIHtcbiAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0Lm5ldyhjaGFuZ2VBZGRyZXNzLCBDYXJkYW5vV2FzbS5WYWx1ZS5uZXcoY2hhbmdlKSk7XG4gICAgICBvdXRwdXRzLmFkZChjaGFuZ2VPdXRwdXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjYWxjdWxhdGVkIGZlZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgc2V0RmVlSW5UcmFuc2FjdGlvbigpIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5mZWUodGhpcy5fZmVlLnRvX3N0cigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0cmFuc2FjdGlvbiBmZWUgYmFzZWQgb24gdHJhbnNhY3Rpb24gc2l6ZVxuICAgKiBAcGFyYW0gdHhEcmFmdCAtIERyYWZ0IHRyYW5zYWN0aW9uIHRvIGNhbGN1bGF0ZSBmZWUgZm9yXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUZlZSh0eERyYWZ0KSB7XG4gICAgY29uc3QgbGluZWFyRmVlID0gQ2FyZGFub1dhc20uTGluZWFyRmVlLm5ldyhcbiAgICAgIENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihGRUVfQ09FRkZJQ0lFTlRTLkFfQ09FRkZJQ0lFTlQpLFxuICAgICAgQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKEZFRV9DT0VGRklDSUVOVFMuQl9DT0VGRklDSUVOVClcbiAgICApO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBmZWUgYmFzZWQgb2ZmIG91ciBkdW1teSB0cmFuc2FjdGlvblxuICAgIGNvbnN0IGZlZSA9IENhcmRhbm9XYXNtLm1pbl9mZWUodHhEcmFmdCwgbGluZWFyRmVlKS5jaGVja2VkX2FkZChCaWdOdW0uZnJvbV9zdHIoRkVFX0NPRUZGSUNJRU5UUy5TQUZFVFlfTUFSR0lOKSk7XG4gICAgdGhpcy5fZmVlID0gZmVlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlQWRhVHJhbnNhY3Rpb25EcmFmdChpbnB1dHMsIG91dHB1dHMsIHJlZnJlc2hTaWduYXR1cmVzID0gZmFsc2UpIHtcbiAgICBjb25zdCB0eEJvZHkgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbkJvZHkubmV3X3R4X2JvZHkoaW5wdXRzLCBvdXRwdXRzLCB0aGlzLl9mZWUpO1xuICAgIHR4Qm9keS5zZXRfdHRsKENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih0aGlzLl90dGwudG9TdHJpbmcoKSkpO1xuICAgIGNvbnN0IHR4SGFzaCA9IENhcmRhbm9XYXNtLmhhc2hfdHJhbnNhY3Rpb24odHhCb2R5KTtcblxuICAgIC8vIHdlIGFkZCB3aXRuZXNzZXMgb25jZSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIGFwcHJvcHJpYXRlIGFtb3VudCBvZiBzaWduZXJzIGZvciBjYWxjdWxhdGluZyB0aGUgZmVlXG4gICAgY29uc3Qgd2l0bmVzc1NldCA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uV2l0bmVzc1NldC5uZXcoKTtcbiAgICBjb25zdCB2a2V5V2l0bmVzc2VzID0gQ2FyZGFub1dhc20uVmtleXdpdG5lc3Nlcy5uZXcoKTtcbiAgICB0aGlzLl9zaWduZXJzLmZvckVhY2goKGtleVBhaXIpID0+IHtcbiAgICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0S2V5cygpLnBydiBhcyBzdHJpbmc7XG4gICAgICBjb25zdCB2a2V5V2l0bmVzcyA9IENhcmRhbm9XYXNtLm1ha2VfdmtleV93aXRuZXNzKFxuICAgICAgICB0eEhhc2gsXG4gICAgICAgIENhcmRhbm9XYXNtLlByaXZhdGVLZXkuZnJvbV9ub3JtYWxfYnl0ZXMoQnVmZmVyLmZyb20ocHJ2LCAnaGV4JykpXG4gICAgICApO1xuICAgICAgdmtleVdpdG5lc3Nlcy5hZGQodmtleVdpdG5lc3MpO1xuICAgIH0pO1xuICAgIGlmIChyZWZyZXNoU2lnbmF0dXJlcykge1xuICAgICAgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIHRoaXMuZ2V0QWxsU2lnbmF0dXJlcygpLmZvckVhY2goKHNpZ25hdHVyZSkgPT4ge1xuICAgICAgY29uc3QgdmtleSA9IENhcmRhbm9XYXNtLlZrZXkubmV3KENhcmRhbm9XYXNtLlB1YmxpY0tleS5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZS5wdWJsaWNLZXkucHViLCAnaGV4JykpKTtcbiAgICAgIGNvbnN0IGVkMjU1U2lnID0gQ2FyZGFub1dhc20uRWQyNTUxOVNpZ25hdHVyZS5mcm9tX2J5dGVzKHNpZ25hdHVyZS5zaWduYXR1cmUpO1xuICAgICAgdmtleVdpdG5lc3Nlcy5hZGQoQ2FyZGFub1dhc20uVmtleXdpdG5lc3MubmV3KHZrZXksIGVkMjU1U2lnKSk7XG4gICAgICAvLyBSZXN0b3JpbmcgdGhlIGJlaGF2aW91ciBmcm9tIHRoZSBvcmlnaW5hbCBidWlsZEltcGxlbWVudGF0aW9uXG4gICAgICBpZiAocmVmcmVzaFNpZ25hdHVyZXMpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlLnB1c2goc2lnbmF0dXJlLnNpZ25hdHVyZS50b1N0cmluZygnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghcmVmcmVzaFNpZ25hdHVyZXMgJiYgdmtleVdpdG5lc3Nlcy5sZW4oKSA9PT0gMCkge1xuICAgICAgY29uc3QgcHJ2ID0gQ2FyZGFub1dhc20uUHJpdmF0ZUtleS5nZW5lcmF0ZV9lZDI1NTE5KCk7XG4gICAgICBjb25zdCB2a2V5V2l0bmVzcyA9IENhcmRhbm9XYXNtLm1ha2VfdmtleV93aXRuZXNzKHR4SGFzaCwgcHJ2KTtcbiAgICAgIHZrZXlXaXRuZXNzZXMuYWRkKHZrZXlXaXRuZXNzKTtcbiAgICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU2VuZCkge1xuICAgICAgICB2a2V5V2l0bmVzc2VzLmFkZCh2a2V5V2l0bmVzcyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fc3BvbnNvcnNoaXBJbmZvKSB7XG4gICAgICAgIGNvbnN0IHNwb25zb3JQcnYgPSBDYXJkYW5vV2FzbS5Qcml2YXRlS2V5LmdlbmVyYXRlX2VkMjU1MTkoKTtcbiAgICAgICAgY29uc3Qgc3BvbnNvclZrZXlXaXRuZXNzID0gQ2FyZGFub1dhc20ubWFrZV92a2V5X3dpdG5lc3ModHhIYXNoLCBzcG9uc29yUHJ2KTtcbiAgICAgICAgdmtleVdpdG5lc3Nlcy5hZGQoc3BvbnNvclZrZXlXaXRuZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2l0bmVzc1NldC5zZXRfdmtleXModmtleVdpdG5lc3Nlcyk7XG5cbiAgICAvLyBhZGQgaW4gY2VydGlmaWNhdGVzIHRvIGdldCBtb2NrIHNpemVcbiAgICBjb25zdCBkcmFmdENlcnRzID0gQ2FyZGFub1dhc20uQ2VydGlmaWNhdGVzLm5ldygpO1xuICAgIGZvciAoY29uc3QgY2VydCBvZiB0aGlzLl9jZXJ0cykge1xuICAgICAgZHJhZnRDZXJ0cy5hZGQoY2VydCk7XG4gICAgfVxuICAgIHR4Qm9keS5zZXRfY2VydHMoZHJhZnRDZXJ0cyk7XG5cbiAgICBjb25zdCB0eERyYWZ0ID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb24ubmV3KHR4Qm9keSwgd2l0bmVzc1NldCk7XG4gICAgcmV0dXJuIHR4RHJhZnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIC8qKlxuICAgICAqIEZlZSBhZGRyZXNzIHV0eG8gcmVzZXJ2YXRpb24gYnVpbGRzIGEgbmV3IHRyYW5zYWN0aW9uIHRoYXQgZ29lcyB0aHJvdWdoIGxlZ2FjeSBidWlsZFxuICAgICAqIHJlYnVpbGQgZmxhZyBpcyBqdXN0IGEgaGFjayB0byByZWRpcmVjdCB0aGUgZmxvdyB0byB0aGUgbGVnYWN5IGJ1aWxkXG4gICAgICovXG4gICAgaWYgKFxuICAgICAgdGhpcy5faXNUb2tlblRyYW5zYWN0aW9uIHx8XG4gICAgICAodGhpcy5fc3BvbnNvcnNoaXBJbmZvICYmICF0aGlzLl9zcG9uc29yc2hpcEluZm8uaXNSZWJ1aWxkICYmIHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Rva2VuQnVpbGQoKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25JbnB1dHMubmV3KCk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25JbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlucHV0cy5hZGQoXG4gICAgICAgIENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uSW5wdXQubmV3KFxuICAgICAgICAgIENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uSGFzaC5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKGlucHV0LnRyYW5zYWN0aW9uX2lkLCAnaGV4JykpLFxuICAgICAgICAgIGlucHV0LnRyYW5zYWN0aW9uX2luZGV4XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gICAgbGV0IG91dHB1dHMgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dHMubmV3KCk7XG4gICAgbGV0IHRvdGFsQW1vdW50VG9TZW5kID0gQ2FyZGFub1dhc20uQmlnTnVtLnplcm8oKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbk91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCBhbW91bnQgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIob3V0cHV0LmFtb3VudCk7XG4gICAgICBpZiAodGhpcy5fc3BvbnNvcnNoaXBJbmZvICYmIHRoaXMuX3Nwb25zb3JzaGlwSW5mby5pc1JlYnVpbGQgJiYgb3V0cHV0Lm11bHRpQXNzZXRzKSB7XG4gICAgICAgIGxldCB0eE91dHB1dEJ1aWxkZXIgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dEJ1aWxkZXIubmV3KCk7XG4gICAgICAgIGNvbnN0IHRvQWRkcmVzcyA9IHV0aWwuZ2V0V2FsbGV0QWRkcmVzcyhvdXRwdXQuYWRkcmVzcyk7XG4gICAgICAgIHR4T3V0cHV0QnVpbGRlciA9IHR4T3V0cHV0QnVpbGRlci53aXRoX2FkZHJlc3ModG9BZGRyZXNzKTtcbiAgICAgICAgbGV0IHR4T3V0cHV0QW1vdW50QnVpbGRlciA9IHR4T3V0cHV0QnVpbGRlci5uZXh0KCk7XG4gICAgICAgIGNvbnN0IG11bHRpQXNzZXRzID0gb3V0cHV0Lm11bHRpQXNzZXRzIGFzIENhcmRhbm9XYXNtLk11bHRpQXNzZXQ7XG4gICAgICAgIGNvbnN0IG11bHRpQXNzZXQgPSBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0Lm5ldygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11bHRpQXNzZXRzLmtleXMoKS5sZW4oKTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcG9saWN5SWQgPSBtdWx0aUFzc2V0cy5rZXlzKCkuZ2V0KGkpO1xuICAgICAgICAgIGNvbnN0IGFzc2V0cyA9IG11bHRpQXNzZXRzLmdldChwb2xpY3lJZCk7XG4gICAgICAgICAgY29uc3QgYXNzZXQgPSBDYXJkYW5vV2FzbS5Bc3NldHMubmV3KCk7XG4gICAgICAgICAgaWYgKCFhc3NldHMpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhc3NldE5hbWUgPSBhc3NldHMua2V5cygpLmdldCgwKTtcbiAgICAgICAgICBjb25zdCBxdWFudGl0eSA9IGFzc2V0cy5nZXQoYXNzZXROYW1lKTtcbiAgICAgICAgICBpZiAoIXF1YW50aXR5KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXQuaW5zZXJ0KGFzc2V0TmFtZSwgcXVhbnRpdHkpO1xuICAgICAgICAgIG11bHRpQXNzZXQuaW5zZXJ0KHBvbGljeUlkLCBhc3NldCk7XG4gICAgICAgIH1cbiAgICAgICAgdHhPdXRwdXRBbW91bnRCdWlsZGVyID0gdHhPdXRwdXRBbW91bnRCdWlsZGVyLndpdGhfY29pbl9hbmRfYXNzZXQoYW1vdW50LCBtdWx0aUFzc2V0KTtcbiAgICAgICAgb3V0cHV0cy5hZGQodHhPdXRwdXRBbW91bnRCdWlsZGVyLmJ1aWxkKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0cy5hZGQoXG4gICAgICAgICAgQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXQubmV3KHV0aWwuZ2V0V2FsbGV0QWRkcmVzcyhvdXRwdXQuYWRkcmVzcyksIENhcmRhbm9XYXNtLlZhbHVlLm5ldyhhbW91bnQpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdG90YWxBbW91bnRUb1NlbmQgPSB0b3RhbEFtb3VudFRvU2VuZC5jaGVja2VkX2FkZChhbW91bnQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuX2ZlZS5pc196ZXJvKCkpIHtcbiAgICAgIC8vIGVzdGltYXRlIGZlZVxuICAgICAgLy8gYWRkIGV4dHJhIG91dHB1dCBmb3IgdGhlIGNoYW5nZVxuICAgICAgaWYgKHRoaXMuX2NoYW5nZUFkZHJlc3MgJiYgdGhpcy5fc2VuZGVyQmFsYW5jZSkge1xuICAgICAgICBjb25zdCBjaGFuZ2VBZGRyZXNzID0gdXRpbC5nZXRXYWxsZXRBZGRyZXNzKHRoaXMuX2NoYW5nZUFkZHJlc3MpO1xuICAgICAgICBjb25zdCB1dHhvQmFsYW5jZSA9IENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih0aGlzLl9zZW5kZXJCYWxhbmNlKTtcblxuICAgICAgICBjb25zdCBhZGp1c3RtZW50ID0gQmlnTnVtLmZyb21fc3RyKCcyMDAwMDAwJyk7XG4gICAgICAgIGxldCBjaGFuZ2UgPSB1dHhvQmFsYW5jZS5jaGVja2VkX3N1Yih0aGlzLl9mZWUpLmNoZWNrZWRfc3ViKHRvdGFsQW1vdW50VG9TZW5kKTtcbiAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpIHtcbiAgICAgICAgICBjaGFuZ2UgPSBjaGFuZ2UuY2hlY2tlZF9zdWIoYWRqdXN0bWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlKSB7XG4gICAgICAgICAgY2hhbmdlID0gY2hhbmdlLmNoZWNrZWRfYWRkKGFkanVzdG1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcgfHwgdGhpcy5fdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbSkge1xuICAgICAgICAgIHRoaXMuX3dpdGhkcmF3YWxzLmZvckVhY2goKHdpdGhkcmF3YWw6IFdpdGhkcmF3YWwpID0+IHtcbiAgICAgICAgICAgIGNoYW5nZSA9IGNoYW5nZS5jaGVja2VkX2FkZChDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIod2l0aGRyYXdhbC52YWx1ZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdG90YWxBbW91bnRUb1NlbmQgaXMgMCwgaXRzIGNvbnNvbGlkYXRpb25cbiAgICAgICAgaWYgKHRvdGFsQW1vdW50VG9TZW5kLnRvX3N0cigpID09ICcwJykge1xuICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIG11bHRpLWFzc2V0IGNvbnNvbGlkYXRpb25cbiAgICAgICAgICBpZiAodGhpcy5fbXVsdGlBc3NldHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdG90YWxOdW1iZXJPZkFzc2V0cyA9IENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih0aGlzLl9tdWx0aUFzc2V0cy5sZW5ndGgudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBjb25zdCBtaW5BbW91bnROZWVkZWRGb3JPbmVBc3NldE91dHB1dCA9IENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihNSU5fQURBX0ZPUl9PTkVfQVNTRVQpO1xuICAgICAgICAgICAgY29uc3QgbWluQW1vdW50TmVlZGVkRm9yVG90YWxBc3NldE91dHB1dHMgPVxuICAgICAgICAgICAgICBtaW5BbW91bnROZWVkZWRGb3JPbmVBc3NldE91dHB1dC5jaGVja2VkX211bCh0b3RhbE51bWJlck9mQXNzZXRzKTtcblxuICAgICAgICAgICAgaWYgKCFjaGFuZ2UubGVzc190aGFuKG1pbkFtb3VudE5lZWRlZEZvclRvdGFsQXNzZXRPdXRwdXRzKSkge1xuICAgICAgICAgICAgICB0aGlzLl9tdWx0aUFzc2V0cy5mb3JFYWNoKChhc3NldCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0eE91dHB1dEJ1aWxkZXIgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dEJ1aWxkZXIubmV3KCk7XG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlQWRkcmVzcyBpcyB0aGUgcm9vdCBhZGRyZXNzLCB3aGljaCBpcyB3aGVyZSB3ZSB3YW50IHRoZSB0b2tlbnMgYXNzZXRzIHRvIGJlIHNlbnQgdG9cbiAgICAgICAgICAgICAgICBjb25zdCB0b0FkZHJlc3MgPSB1dGlsLmdldFdhbGxldEFkZHJlc3ModGhpcy5fY2hhbmdlQWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgdHhPdXRwdXRCdWlsZGVyID0gdHhPdXRwdXRCdWlsZGVyLndpdGhfYWRkcmVzcyh0b0FkZHJlc3MpO1xuICAgICAgICAgICAgICAgIGxldCB0eE91dHB1dEFtb3VudEJ1aWxkZXIgPSB0eE91dHB1dEJ1aWxkZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0TmFtZSA9IENhcmRhbm9XYXNtLkFzc2V0TmFtZS5uZXcoQnVmZmVyLmZyb20oYXNzZXQuYXNzZXRfbmFtZSwgJ2hleCcpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2xpY3lJZCA9IENhcmRhbm9XYXNtLlNjcmlwdEhhc2guZnJvbV9ieXRlcyhCdWZmZXIuZnJvbShhc3NldC5wb2xpY3lfaWQsICdoZXgnKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXVsdGlBc3NldCA9IENhcmRhbm9XYXNtLk11bHRpQXNzZXQubmV3KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXNzZXRzID0gQ2FyZGFub1dhc20uQXNzZXRzLm5ldygpO1xuICAgICAgICAgICAgICAgIGFzc2V0cy5pbnNlcnQoYXNzZXROYW1lLCBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIoYXNzZXQucXVhbnRpdHkpKTtcbiAgICAgICAgICAgICAgICBtdWx0aUFzc2V0Lmluc2VydChwb2xpY3lJZCwgYXNzZXRzKTtcblxuICAgICAgICAgICAgICAgIHR4T3V0cHV0QW1vdW50QnVpbGRlciA9IHR4T3V0cHV0QW1vdW50QnVpbGRlci53aXRoX2NvaW5fYW5kX2Fzc2V0KFxuICAgICAgICAgICAgICAgICAgbWluQW1vdW50TmVlZGVkRm9yT25lQXNzZXRPdXRwdXQsXG4gICAgICAgICAgICAgICAgICBtdWx0aUFzc2V0XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHR4T3V0cHV0ID0gdHhPdXRwdXRBbW91bnRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQodHhPdXRwdXQpO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBmaW5hbGx5IHNlbmQgdGhlIHJlbWFpbmluZyBBREEgaW4gaXRzIG93biBvdXRwdXRcbiAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nT3V0cHV0QW1vdW50ID0gY2hhbmdlLmNoZWNrZWRfc3ViKG1pbkFtb3VudE5lZWRlZEZvclRvdGFsQXNzZXRPdXRwdXRzKTtcbiAgICAgICAgICAgICAgY29uc3QgY2hhbmdlT3V0cHV0ID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXQubmV3KFxuICAgICAgICAgICAgICAgIGNoYW5nZUFkZHJlc3MsXG4gICAgICAgICAgICAgICAgQ2FyZGFub1dhc20uVmFsdWUubmV3KHJlbWFpbmluZ091dHB1dEFtb3VudClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgb3V0cHV0cy5hZGQoY2hhbmdlT3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHRva2VucyB0byBjb25zb2xpZGF0ZSwgeW91IG9ubHkgaGF2ZSAxIG91dHB1dCB3aGljaCBpcyBBREEgYWxvbmVcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0Lm5ldyhjaGFuZ2VBZGRyZXNzLCBDYXJkYW5vV2FzbS5WYWx1ZS5uZXcoY2hhbmdlKSk7XG4gICAgICAgICAgICBvdXRwdXRzLmFkZChjaGFuZ2VPdXRwdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGEgY29uc29saWRhdGUgcmVxdWVzdCwgd2hhdGV2ZXIgY2hhbmdlIHRoYXQgbmVlZHMgdG8gYmUgc2VudCBiYWNrIHRvIHRoZSByb290YWRkcmVzcyBpcyBhZGRlZCBhcyBhIHNlcGFyYXRlIG91dHB1dCBoZXJlXG4gICAgICAgICAgY29uc3QgY2hhbmdlT3V0cHV0ID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25PdXRwdXQubmV3KGNoYW5nZUFkZHJlc3MsIENhcmRhbm9XYXNtLlZhbHVlLm5ldyhjaGFuZ2UpKTtcbiAgICAgICAgICBvdXRwdXRzLmFkZChjaGFuZ2VPdXRwdXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR4Qm9keSA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uQm9keS5uZXdfdHhfYm9keShpbnB1dHMsIG91dHB1dHMsIHRoaXMuX2ZlZSk7XG4gICAgICB0eEJvZHkuc2V0X3R0bChDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIodGhpcy5fdHRsLnRvU3RyaW5nKCkpKTtcbiAgICAgIGNvbnN0IHR4SGFzaCA9IENhcmRhbm9XYXNtLmhhc2hfdHJhbnNhY3Rpb24odHhCb2R5KTtcblxuICAgICAgLy8gd2UgYWRkIHdpdG5lc3NlcyBvbmNlIHNvIHRoYXQgd2UgY2FuIGdldCB0aGUgYXBwcm9wcmlhdGUgYW1vdW50IG9mIHNpZ25lcnMgZm9yIGNhbGN1bGF0aW5nIHRoZSBmZWVcbiAgICAgIGNvbnN0IHdpdG5lc3NTZXQgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbldpdG5lc3NTZXQubmV3KCk7XG4gICAgICBjb25zdCB2a2V5V2l0bmVzc2VzID0gQ2FyZGFub1dhc20uVmtleXdpdG5lc3Nlcy5uZXcoKTtcbiAgICAgIHRoaXMuX3NpZ25lcnMuZm9yRWFjaCgoa2V5UGFpcikgPT4ge1xuICAgICAgICBjb25zdCBwcnYgPSBrZXlQYWlyLmdldEtleXMoKS5wcnYgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCB2a2V5V2l0bmVzcyA9IENhcmRhbm9XYXNtLm1ha2VfdmtleV93aXRuZXNzKFxuICAgICAgICAgIHR4SGFzaCxcbiAgICAgICAgICBDYXJkYW5vV2FzbS5Qcml2YXRlS2V5LmZyb21fbm9ybWFsX2J5dGVzKEJ1ZmZlci5mcm9tKHBydiwgJ2hleCcpKVxuICAgICAgICApO1xuICAgICAgICB2a2V5V2l0bmVzc2VzLmFkZCh2a2V5V2l0bmVzcyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ2V0QWxsU2lnbmF0dXJlcygpLmZvckVhY2goKHNpZ25hdHVyZSkgPT4ge1xuICAgICAgICBjb25zdCB2a2V5ID0gQ2FyZGFub1dhc20uVmtleS5uZXcoXG4gICAgICAgICAgQ2FyZGFub1dhc20uUHVibGljS2V5LmZyb21fYnl0ZXMoQnVmZmVyLmZyb20oc2lnbmF0dXJlLnB1YmxpY0tleS5wdWIsICdoZXgnKSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZWQyNTVTaWcgPSBDYXJkYW5vV2FzbS5FZDI1NTE5U2lnbmF0dXJlLmZyb21fYnl0ZXMoc2lnbmF0dXJlLnNpZ25hdHVyZSk7XG4gICAgICAgIHZrZXlXaXRuZXNzZXMuYWRkKENhcmRhbm9XYXNtLlZrZXl3aXRuZXNzLm5ldyh2a2V5LCBlZDI1NVNpZykpO1xuICAgICAgfSk7XG4gICAgICBpZiAodmtleVdpdG5lc3Nlcy5sZW4oKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBwcnYgPSBDYXJkYW5vV2FzbS5Qcml2YXRlS2V5LmdlbmVyYXRlX2VkMjU1MTkoKTtcbiAgICAgICAgY29uc3QgdmtleVdpdG5lc3MgPSBDYXJkYW5vV2FzbS5tYWtlX3ZrZXlfd2l0bmVzcyh0eEhhc2gsIHBydik7XG4gICAgICAgIHZrZXlXaXRuZXNzZXMuYWRkKHZrZXlXaXRuZXNzKTtcbiAgICAgICAgaWYgKHRoaXMuX3R5cGUgIT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kKSB7XG4gICAgICAgICAgdmtleVdpdG5lc3Nlcy5hZGQodmtleVdpdG5lc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zcG9uc29yc2hpcEluZm8/LmlzUmVidWlsZCkge1xuICAgICAgICAgIGNvbnN0IHNwb25zb3JQcnYgPSBDYXJkYW5vV2FzbS5Qcml2YXRlS2V5LmdlbmVyYXRlX2VkMjU1MTkoKTtcbiAgICAgICAgICBjb25zdCBzcG9uc29yVmtleVdpdG5lc3MgPSBDYXJkYW5vV2FzbS5tYWtlX3ZrZXlfd2l0bmVzcyh0eEhhc2gsIHNwb25zb3JQcnYpO1xuICAgICAgICAgIHZrZXlXaXRuZXNzZXMuYWRkKHNwb25zb3JWa2V5V2l0bmVzcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdpdG5lc3NTZXQuc2V0X3ZrZXlzKHZrZXlXaXRuZXNzZXMpO1xuXG4gICAgICAvLyBhZGQgaW4gd2l0aGRyYXdhbCBpZiB0aGlzIGlzIGEgd2l0aGRyYXdhbCB0eFxuICAgICAgaWYgKHRoaXMuX3dpdGhkcmF3YWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgd2l0aGRyYXdhbHMgPSBDYXJkYW5vV2FzbS5XaXRoZHJhd2Fscy5uZXcoKTtcbiAgICAgICAgdGhpcy5fd2l0aGRyYXdhbHMuZm9yRWFjaCgod2l0aGRyYXdhbDogV2l0aGRyYXdhbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJld2FyZEFkZHJlc3MgPSBDYXJkYW5vV2FzbS5SZXdhcmRBZGRyZXNzLmZyb21fYWRkcmVzcyhcbiAgICAgICAgICAgIENhcmRhbm9XYXNtLkFkZHJlc3MuZnJvbV9iZWNoMzIod2l0aGRyYXdhbC5zdGFrZUFkZHJlc3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB3aXRoZHJhd2Fscy5pbnNlcnQocmV3YXJkQWRkcmVzcyEsIENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih3aXRoZHJhd2FsLnZhbHVlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHR4Qm9keS5zZXRfd2l0aGRyYXdhbHMod2l0aGRyYXdhbHMpO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgaW4gY2VydGlmaWNhdGVzIHRvIGdldCBtb2NrIHNpemVcbiAgICAgIGNvbnN0IGRyYWZ0Q2VydHMgPSBDYXJkYW5vV2FzbS5DZXJ0aWZpY2F0ZXMubmV3KCk7XG4gICAgICBmb3IgKGNvbnN0IGNlcnQgb2YgdGhpcy5fY2VydHMpIHtcbiAgICAgICAgZHJhZnRDZXJ0cy5hZGQoY2VydCk7XG4gICAgICB9XG4gICAgICB0eEJvZHkuc2V0X2NlcnRzKGRyYWZ0Q2VydHMpO1xuXG4gICAgICBjb25zdCB0eERyYWZ0ID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb24ubmV3KHR4Qm9keSwgd2l0bmVzc1NldCk7XG4gICAgICBjb25zdCBsaW5lYXJGZWUgPSBDYXJkYW5vV2FzbS5MaW5lYXJGZWUubmV3KFxuICAgICAgICBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIoJzQ0JyksXG4gICAgICAgIENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cignMTU1MzgxJylcbiAgICAgICk7XG5cbiAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgZmVlIGJhc2VkIG9mZiBvdXIgZHVtbXkgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGZlZSA9IENhcmRhbm9XYXNtLm1pbl9mZWUodHhEcmFmdCwgbGluZWFyRmVlKS5jaGVja2VkX2FkZChCaWdOdW0uZnJvbV9zdHIoJzQ0MCcpKTtcbiAgICAgIHRoaXMuX2ZlZSA9IGZlZTtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uZmVlKHRoaXMuX2ZlZS50b19zdHIoKSk7XG4gICAgLy8gbm93IGNhbGN1bGF0ZSB0aGUgY2hhbmdlIGJhc2VkIG9mZiBvZiA8dXR4b0JhbGFuY2U+IC0gPGZlZT4gLSA8YW1vdW50VG9TZW5kPlxuICAgIC8vIHJlc2V0IHRoZSBvdXRwdXRzIGNvbGxlY3Rpb24gYmVjYXVzZSBub3cgb3VyIGxhc3Qgb3V0cHV0IGhhcyBjaGFuZ2VkXG4gICAgb3V0cHV0cyA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0cy5uZXcoKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbk91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCBtdWx0aUFzc2V0cyA9IG91dHB1dC5tdWx0aUFzc2V0cyBhcyBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0O1xuICAgICAgaWYgKG11bHRpQXNzZXRzKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeUlkID0gbXVsdGlBc3NldHMua2V5cygpLmdldCgwKTtcbiAgICAgICAgY29uc3QgYXNzZXRzID0gbXVsdGlBc3NldHMuZ2V0KHBvbGljeUlkKTtcbiAgICAgICAgY29uc3QgYXNzZXROYW1lID0gYXNzZXRzIS5rZXlzKCkuZ2V0KDApO1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IGFzc2V0cyEuZ2V0KGFzc2V0TmFtZSk7XG4gICAgICAgIGxldCB0eE91dHB1dEJ1aWxkZXIgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dEJ1aWxkZXIubmV3KCk7XG4gICAgICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihvdXRwdXQuYW1vdW50KTtcbiAgICAgICAgY29uc3QgdG9BZGRyZXNzID0gdXRpbC5nZXRXYWxsZXRBZGRyZXNzKG91dHB1dC5hZGRyZXNzKTtcbiAgICAgICAgdHhPdXRwdXRCdWlsZGVyID0gdHhPdXRwdXRCdWlsZGVyLndpdGhfYWRkcmVzcyh0b0FkZHJlc3MpO1xuICAgICAgICBsZXQgdHhPdXRwdXRBbW91bnRCdWlsZGVyID0gdHhPdXRwdXRCdWlsZGVyLm5leHQoKTtcbiAgICAgICAgY29uc3QgbXVsdGlBc3NldCA9IENhcmRhbm9XYXNtLk11bHRpQXNzZXQubmV3KCk7XG4gICAgICAgIGNvbnN0IGFzc2V0ID0gQ2FyZGFub1dhc20uQXNzZXRzLm5ldygpO1xuICAgICAgICBhc3NldC5pbnNlcnQoYXNzZXROYW1lLCBxdWFudGl0eSEpO1xuICAgICAgICBtdWx0aUFzc2V0Lmluc2VydChwb2xpY3lJZCwgYXNzZXQpO1xuICAgICAgICB0eE91dHB1dEFtb3VudEJ1aWxkZXIgPSB0eE91dHB1dEFtb3VudEJ1aWxkZXIud2l0aF9jb2luX2FuZF9hc3NldChvdXRwdXRBbW91bnQsIG11bHRpQXNzZXQpO1xuICAgICAgICBjb25zdCB0eE91dHB1dCA9IHR4T3V0cHV0QW1vdW50QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBvdXRwdXRzLmFkZCh0eE91dHB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXRzLmFkZChcbiAgICAgICAgICBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dC5uZXcoXG4gICAgICAgICAgICB1dGlsLmdldFdhbGxldEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpLFxuICAgICAgICAgICAgQ2FyZGFub1dhc20uVmFsdWUubmV3KENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihvdXRwdXQuYW1vdW50KSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuX2NoYW5nZUFkZHJlc3MgJiYgdGhpcy5fc2VuZGVyQmFsYW5jZSkge1xuICAgICAgY29uc3QgY2hhbmdlQWRkcmVzcyA9IHV0aWwuZ2V0V2FsbGV0QWRkcmVzcyh0aGlzLl9jaGFuZ2VBZGRyZXNzKTtcbiAgICAgIGNvbnN0IHV0eG9CYWxhbmNlID0gQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKHRoaXMuX3NlbmRlckJhbGFuY2UpO1xuXG4gICAgICBjb25zdCBhZGp1c3RtZW50ID0gQmlnTnVtLmZyb21fc3RyKCcyMDAwMDAwJyk7XG4gICAgICBsZXQgY2hhbmdlID0gdXR4b0JhbGFuY2UuY2hlY2tlZF9zdWIodGhpcy5fZmVlKS5jaGVja2VkX3N1Yih0b3RhbEFtb3VudFRvU2VuZCk7XG4gICAgICBpZiAodGhpcy5fdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZSkge1xuICAgICAgICBjaGFuZ2UgPSBjaGFuZ2UuY2hlY2tlZF9zdWIoYWRqdXN0bWVudCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSkge1xuICAgICAgICBjaGFuZ2UgPSBjaGFuZ2UuY2hlY2tlZF9hZGQoYWRqdXN0bWVudCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcgfHwgdGhpcy5fdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbSkge1xuICAgICAgICB0aGlzLl93aXRoZHJhd2Fscy5mb3JFYWNoKCh3aXRoZHJhd2FsOiBXaXRoZHJhd2FsKSA9PiB7XG4gICAgICAgICAgY2hhbmdlID0gY2hhbmdlLmNoZWNrZWRfYWRkKENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih3aXRoZHJhd2FsLnZhbHVlKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0b3RhbEFtb3VudFRvU2VuZCBpcyAwLCBpdHMgY29uc29saWRhdGlvblxuICAgICAgaWYgKHRvdGFsQW1vdW50VG9TZW5kLnRvX3N0cigpID09ICcwJykge1xuICAgICAgICAvLyBzdXBwb3J0IGZvciBtdWx0aS1hc3NldCBjb25zb2xpZGF0aW9uXG4gICAgICAgIGlmICh0aGlzLl9tdWx0aUFzc2V0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgdG90YWxOdW1iZXJPZkFzc2V0cyA9IENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cih0aGlzLl9tdWx0aUFzc2V0cy5sZW5ndGgudG9TdHJpbmcoKSk7XG4gICAgICAgICAgY29uc3QgbWluQW1vdW50TmVlZGVkRm9yT25lQXNzZXRPdXRwdXQgPSBDYXJkYW5vV2FzbS5CaWdOdW0uZnJvbV9zdHIoJzE1MDAwMDAnKTtcbiAgICAgICAgICBjb25zdCBtaW5BbW91bnROZWVkZWRGb3JUb3RhbEFzc2V0T3V0cHV0cyA9IG1pbkFtb3VudE5lZWRlZEZvck9uZUFzc2V0T3V0cHV0LmNoZWNrZWRfbXVsKHRvdGFsTnVtYmVyT2ZBc3NldHMpO1xuXG4gICAgICAgICAgaWYgKCFjaGFuZ2UubGVzc190aGFuKG1pbkFtb3VudE5lZWRlZEZvclRvdGFsQXNzZXRPdXRwdXRzKSkge1xuICAgICAgICAgICAgdGhpcy5fbXVsdGlBc3NldHMuZm9yRWFjaCgoYXNzZXQpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHR4T3V0cHV0QnVpbGRlciA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0QnVpbGRlci5uZXcoKTtcbiAgICAgICAgICAgICAgLy8gY2hhbmdlQWRkcmVzcyBpcyB0aGUgcm9vdCBhZGRyZXNzLCB3aGljaCBpcyB3aGVyZSB3ZSB3YW50IHRoZSB0b2tlbnMgYXNzZXRzIHRvIGJlIHNlbnQgdG9cbiAgICAgICAgICAgICAgY29uc3QgdG9BZGRyZXNzID0gdXRpbC5nZXRXYWxsZXRBZGRyZXNzKHRoaXMuX2NoYW5nZUFkZHJlc3MpO1xuICAgICAgICAgICAgICB0eE91dHB1dEJ1aWxkZXIgPSB0eE91dHB1dEJ1aWxkZXIud2l0aF9hZGRyZXNzKHRvQWRkcmVzcyk7XG4gICAgICAgICAgICAgIGxldCB0eE91dHB1dEFtb3VudEJ1aWxkZXIgPSB0eE91dHB1dEJ1aWxkZXIubmV4dCgpO1xuICAgICAgICAgICAgICBjb25zdCBhc3NldE5hbWUgPSBDYXJkYW5vV2FzbS5Bc3NldE5hbWUubmV3KEJ1ZmZlci5mcm9tKGFzc2V0LmFzc2V0X25hbWUsICdoZXgnKSk7XG4gICAgICAgICAgICAgIGNvbnN0IHBvbGljeUlkID0gQ2FyZGFub1dhc20uU2NyaXB0SGFzaC5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKGFzc2V0LnBvbGljeV9pZCwgJ2hleCcpKTtcbiAgICAgICAgICAgICAgY29uc3QgbXVsdGlBc3NldCA9IENhcmRhbm9XYXNtLk11bHRpQXNzZXQubmV3KCk7XG4gICAgICAgICAgICAgIGNvbnN0IGFzc2V0cyA9IENhcmRhbm9XYXNtLkFzc2V0cy5uZXcoKTtcbiAgICAgICAgICAgICAgYXNzZXRzLmluc2VydChhc3NldE5hbWUsIENhcmRhbm9XYXNtLkJpZ051bS5mcm9tX3N0cihhc3NldC5xdWFudGl0eSkpO1xuICAgICAgICAgICAgICBtdWx0aUFzc2V0Lmluc2VydChwb2xpY3lJZCwgYXNzZXRzKTtcblxuICAgICAgICAgICAgICB0eE91dHB1dEFtb3VudEJ1aWxkZXIgPSB0eE91dHB1dEFtb3VudEJ1aWxkZXIud2l0aF9jb2luX2FuZF9hc3NldChcbiAgICAgICAgICAgICAgICBtaW5BbW91bnROZWVkZWRGb3JPbmVBc3NldE91dHB1dCxcbiAgICAgICAgICAgICAgICBtdWx0aUFzc2V0XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgY29uc3QgdHhPdXRwdXQgPSB0eE91dHB1dEFtb3VudEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgICAgICAgb3V0cHV0cy5hZGQodHhPdXRwdXQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGZpbmFsbHkgc2VuZCB0aGUgcmVtYWluaW5nIEFEQSBpbiBpdHMgb3duIG91dHB1dFxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nT3V0cHV0QW1vdW50ID0gY2hhbmdlLmNoZWNrZWRfc3ViKG1pbkFtb3VudE5lZWRlZEZvclRvdGFsQXNzZXRPdXRwdXRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0Lm5ldyhcbiAgICAgICAgICAgICAgY2hhbmdlQWRkcmVzcyxcbiAgICAgICAgICAgICAgQ2FyZGFub1dhc20uVmFsdWUubmV3KHJlbWFpbmluZ091dHB1dEFtb3VudClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvdXRwdXRzLmFkZChjaGFuZ2VPdXRwdXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICAgICAnSW5zdWZmaWNpZW50IGZ1bmRzOiBuZWVkIGEgbWluaW11bSBvZiAxLjUgQURBIHBlciBvdXRwdXQgdG8gY29uc3RydWN0IHRva2VuIGNvbnNvbGlkYXRpb24nXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gdG9rZW5zIHRvIGNvbnNvbGlkYXRlLCB5b3Ugb25seSBoYXZlIDEgb3V0cHV0IHdoaWNoIGlzIEFEQSBhbG9uZVxuICAgICAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uT3V0cHV0Lm5ldyhjaGFuZ2VBZGRyZXNzLCBDYXJkYW5vV2FzbS5WYWx1ZS5uZXcoY2hhbmdlKSk7XG4gICAgICAgICAgb3V0cHV0cy5hZGQoY2hhbmdlT3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBhIGNvbnNvbGlkYXRlIHJlcXVlc3QsIHdoYXRldmVyIGNoYW5nZSB0aGF0IG5lZWRzIHRvIGJlIHNlbnQgYmFjayB0byB0aGUgcm9vdGFkZHJlc3MgaXMgYWRkZWQgYXMgYSBzZXBhcmF0ZSBvdXRwdXQgaGVyZVxuICAgICAgICBjb25zdCBjaGFuZ2VPdXRwdXQgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbk91dHB1dC5uZXcoY2hhbmdlQWRkcmVzcywgQ2FyZGFub1dhc20uVmFsdWUubmV3KGNoYW5nZSkpO1xuICAgICAgICBvdXRwdXRzLmFkZChjaGFuZ2VPdXRwdXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHR4UmF3ID0gQ2FyZGFub1dhc20uVHJhbnNhY3Rpb25Cb2R5Lm5ld190eF9ib2R5KGlucHV0cywgb3V0cHV0cywgdGhpcy5fZmVlKTtcblxuICAgIGNvbnN0IGNlcnRzID0gQ2FyZGFub1dhc20uQ2VydGlmaWNhdGVzLm5ldygpO1xuICAgIGZvciAoY29uc3QgY2VydCBvZiB0aGlzLl9jZXJ0cykge1xuICAgICAgY2VydHMuYWRkKGNlcnQpO1xuICAgIH1cbiAgICB0eFJhdy5zZXRfY2VydHMoY2VydHMpO1xuXG4gICAgLy8gYWRkIGluIHdpdGhkcmF3YWwgaWYgdGhpcyBpcyBhIHdpdGhkcmF3YWwgdHhcbiAgICBpZiAodGhpcy5fd2l0aGRyYXdhbHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd2l0aGRyYXdhbHMgPSBDYXJkYW5vV2FzbS5XaXRoZHJhd2Fscy5uZXcoKTtcbiAgICAgIHRoaXMuX3dpdGhkcmF3YWxzLmZvckVhY2goKHdpdGhkcmF3YWw6IFdpdGhkcmF3YWwpID0+IHtcbiAgICAgICAgY29uc3QgcmV3YXJkQWRkcmVzcyA9IENhcmRhbm9XYXNtLlJld2FyZEFkZHJlc3MuZnJvbV9hZGRyZXNzKFxuICAgICAgICAgIENhcmRhbm9XYXNtLkFkZHJlc3MuZnJvbV9iZWNoMzIod2l0aGRyYXdhbC5zdGFrZUFkZHJlc3MpXG4gICAgICAgICk7XG4gICAgICAgIHdpdGhkcmF3YWxzLmluc2VydChyZXdhcmRBZGRyZXNzISwgQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKHdpdGhkcmF3YWwudmFsdWUpKTtcbiAgICAgIH0pO1xuXG4gICAgICB0eFJhdy5zZXRfd2l0aGRyYXdhbHMod2l0aGRyYXdhbHMpO1xuICAgIH1cblxuICAgIHR4UmF3LnNldF90dGwoQ2FyZGFub1dhc20uQmlnTnVtLmZyb21fc3RyKHRoaXMuX3R0bC50b1N0cmluZygpKSk7XG4gICAgY29uc3QgdHhSYXdIYXNoID0gQ2FyZGFub1dhc20uaGFzaF90cmFuc2FjdGlvbih0eFJhdyk7XG5cbiAgICAvLyBub3cgYWRkIHRoZSB3aXRuZXNzZXMgYWdhaW4gdGhpcyB0aW1lIGZvciByZWFsLiBXZSBuZWVkIHRvIGRvIHRoaXMgYWdhaW5cbiAgICAvLyBiZWNhdXNlIG5vdyB0aGF0IHdlJ3ZlIGFkZGVkIG91ciByZWFsIGZlZSBhbmQgY2hhbmdlIG91dHB1dCwgd2UgaGF2ZSBhIGRpZmZlcmVuY2UgdHJhbnNhY3Rpb24gaGFzaFxuICAgIGNvbnN0IHdpdG5lc3NTZXQgPSBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbldpdG5lc3NTZXQubmV3KCk7XG4gICAgY29uc3QgdmtleVdpdG5lc3NlcyA9IENhcmRhbm9XYXNtLlZrZXl3aXRuZXNzZXMubmV3KCk7XG4gICAgdGhpcy5fc2lnbmVycy5mb3JFYWNoKChrZXlQYWlyKSA9PiB7XG4gICAgICBjb25zdCBwcnYgPSBrZXlQYWlyLmdldEtleXMoKS5wcnYgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgdmtleVdpdG5lc3MgPSBDYXJkYW5vV2FzbS5tYWtlX3ZrZXlfd2l0bmVzcyhcbiAgICAgICAgdHhSYXdIYXNoLFxuICAgICAgICBDYXJkYW5vV2FzbS5Qcml2YXRlS2V5LmZyb21fbm9ybWFsX2J5dGVzKEJ1ZmZlci5mcm9tKHBydiwgJ2hleCcpKVxuICAgICAgKTtcbiAgICAgIHZrZXlXaXRuZXNzZXMuYWRkKHZrZXlXaXRuZXNzKTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIHRoZSBjb3NtZXRpYyBzaWduYXR1cmUgYXJyYXkgaW4gbmF0aXZlIHR4biB3cmFwcGVyIHRvIHByZXZlbnQgZHVwbGljYXRlIHdoZW4gYnVpbGRlciBpcyBpbml0ZWQgZnJvbSBhIHBhcnRpYWxseSB3aXRuZXNzZWQgdHhuXG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5nZXRBbGxTaWduYXR1cmVzKCkuZm9yRWFjaCgoc2lnbmF0dXJlKSA9PiB7XG4gICAgICBjb25zdCB2a2V5ID0gQ2FyZGFub1dhc20uVmtleS5uZXcoQ2FyZGFub1dhc20uUHVibGljS2V5LmZyb21fYnl0ZXMoQnVmZmVyLmZyb20oc2lnbmF0dXJlLnB1YmxpY0tleS5wdWIsICdoZXgnKSkpO1xuICAgICAgY29uc3QgZWQyNTVTaWcgPSBDYXJkYW5vV2FzbS5FZDI1NTE5U2lnbmF0dXJlLmZyb21fYnl0ZXMoc2lnbmF0dXJlLnNpZ25hdHVyZSk7XG4gICAgICB2a2V5V2l0bmVzc2VzLmFkZChDYXJkYW5vV2FzbS5Wa2V5d2l0bmVzcy5uZXcodmtleSwgZWQyNTVTaWcpKTtcbiAgICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNpZ25hdHVyZS5wdXNoKHNpZ25hdHVyZS5zaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpKTtcbiAgICB9KTtcbiAgICB3aXRuZXNzU2V0LnNldF92a2V5cyh2a2V5V2l0bmVzc2VzKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi50cmFuc2FjdGlvbiA9IENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uLm5ldyh0eFJhdywgd2l0bmVzc1NldCk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIHNpZ25JbXBsZW1lbnRhdGlvbihrZXk6IEJhc2VLZXkpOiBUcmFuc2FjdGlvbiB7XG4gICAgdGhpcy5fc2lnbmVycy5wdXNoKG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkua2V5IH0pKTtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzczogQmFzZUFkZHJlc3MsIGFkZHJlc3NGb3JtYXQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXV0aWwuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ2ludmFsaWQgYWRkcmVzcyAnICsgYWRkcmVzcy5hZGRyZXNzKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVLZXkoa2V5OiBCYXNlS2V5KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkua2V5IH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgS2V5IHZhbGlkYXRpb24gZmFpbGVkYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IGFueSk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBDYXJkYW5vV2FzbS5UcmFuc2FjdGlvbi5mcm9tX2J5dGVzKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ2ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0cmFuc2FjdGlvbi50cmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVZhbHVlKHZhbHVlOiBCaWdOdW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuaXNMZXNzVGhhbigwKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG4gIC8vIGVuZHJlZ2lvblxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhZGRTaWduYXR1cmUocHVibGljS2V5OiBCYXNlUHVibGljS2V5LCBzaWduYXR1cmU6IEJ1ZmZlcik6IHZvaWQge1xuICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaCh7IHB1YmxpY0tleSwgc2lnbmF0dXJlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxTaWduYXR1cmVzKCk6IFNpZ25hdHVyZVtdIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdFNpZ25hdHVyZXMuY29uY2F0KHRoaXMuX3NpZ25hdHVyZXMpO1xuICB9XG59XG4iXX0=
|