aws-cdk 2.1144.0 → 2.1145.0

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.
@@ -599,6 +599,9 @@ class CliIoHost {
599
599
  // Require approval if changes include broadening permissions
600
600
  case cloud_assembly_schema_1.RequireApproval.BROADENING:
601
601
  return ['none', 'non-broadening'].includes(msg.data?.permissionChangeType);
602
+ // Require approval if changes replace, delete or orphan an existing resource
603
+ case cloud_assembly_schema_1.RequireApproval.DESTRUCTIVE:
604
+ return !(msg.data?.destructiveChanges?.length > 0);
602
605
  }
603
606
  }
604
607
  /**
@@ -953,4 +956,4 @@ function hotswapToEventResult(result) {
953
956
  },
954
957
  };
955
958
  }
956
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbGktaW8taG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb25DQSw0QkFHQztBQXdCRCw0Q0FpQkM7QUFocUNELGdEQUFrQztBQUNsQywwRUFBaUU7QUFDakUsc0RBQW9EO0FBRXBELGtEQUEwQjtBQUMxQixtREFBcUM7QUFFckMsMERBQWdLO0FBRWhLLGtEQUE4RDtBQUM5RCxzRUFBcUU7QUFDckUsOENBQXFEO0FBRXJELG9EQUF1RDtBQUV2RCxrREFBd0Q7QUFDeEQsMkRBQWdFO0FBQ2hFLHFEQUFrRDtBQUVsRCx1RUFBNEU7QUFDNUUsbUNBQWtDO0FBNk9sQzs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQW1CO0lBQzFDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUEwREQ7O0dBRUc7QUFDSCxNQUFhLFNBQVM7SUFDcEI7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQXdCLEVBQUUsRUFBRSxRQUFRLEdBQUcsS0FBSztRQUMxRCxJQUFJLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQUc7UUFDUixPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVH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QUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDckYsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxTQUFTLEVBQUUsU0FBa0I7UUFDN0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqQixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLElBQUEsdUJBQWUsRUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ3BDO1NBQ0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsUUFBUSxFQUFFO1lBQ1IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNO1lBQ3RELHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNO1lBQzVELEdBQUcsd0JBQXdCO1NBQzVCO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dGlsIGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgeyBSZXF1aXJlQXBwcm92YWwgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHR5cGUgeyBIb3Rzd2FwUmVzdWx0LCBJSW9Ib3N0LCBJb01lc3NhZ2UsIElvTWVzc2FnZUNvZGUsIElvTWVzc2FnZUxldmVsLCBJb1JlcXVlc3QsIFRvb2xraXRBY3Rpb24gfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgcHJvbXB0bHkgZnJvbSAncHJvbXB0bHknO1xuaW1wb3J0IHR5cGUgeyBJb0hlbHBlciwgQWN0aXZpdHlQcmludGVyUHJvcHMsIElBY3Rpdml0eVByaW50ZXIsIElvTWVzc2FnZU1ha2VyLCBJb1JlcXVlc3RNYWtlciwgSW9EZWZhdWx0TWVzc2FnZXMgfSBmcm9tICcuLi8uLi8uLi9saWIvYXBpLXByaXZhdGUnO1xuaW1wb3J0IHsgYXNJb0hlbHBlciwgSU8sIGlzTWVzc2FnZVJlbGV2YW50Rm9yTGV2ZWwsIEN1cnJlbnRBY3Rpdml0eVByaW50ZXIsIEhpc3RvcnlBY3Rpdml0eVByaW50ZXIsIEVycm9yc09ubHlBY3Rpdml0eVByaW50ZXIgfSBmcm9tICcuLi8uLi8uLi9saWIvYXBpLXByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSAnLi4vLi4vYXBpL2NvbnRleHQnO1xuaW1wb3J0IHsgU3RhY2tBY3Rpdml0eVByb2dyZXNzIH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvZGVwbG95JztcbmltcG9ydCB7IGNhbkNvbGxlY3RUZWxlbWV0cnkgfSBmcm9tICcuLi90ZWxlbWV0cnkvY29sbGVjdC10ZWxlbWV0cnknO1xuaW1wb3J0IHsgY2RrQ2xpRXJyb3JOYW1lIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L2Vycm9yJztcbmltcG9ydCB0eXBlIHsgRXZlbnRSZXN1bHQgfSBmcm9tICcuLi90ZWxlbWV0cnkvbWVzc2FnZXMnO1xuaW1wb3J0IHsgQ0xJX1BSSVZBVEVfSU8gfSBmcm9tICcuLi90ZWxlbWV0cnkvbWVzc2FnZXMnO1xuaW1wb3J0IHR5cGUgeyBUZWxlbWV0cnlFdmVudCB9IGZyb20gJy4uL3RlbGVtZXRyeS9zZXNzaW9uJztcbmltcG9ydCB7IFRlbGVtZXRyeVNlc3Npb24gfSBmcm9tICcuLi90ZWxlbWV0cnkvc2Vzc2lvbic7XG5pbXBvcnQgeyBGaWxlVGVsZW1ldHJ5U2luayB9IGZyb20gJy4uL3RlbGVtZXRyeS9zaW5rL2ZpbGUtc2luayc7XG5pbXBvcnQgeyBGdW5uZWwgfSBmcm9tICcuLi90ZWxlbWV0cnkvc2luay9mdW5uZWwnO1xuaW1wb3J0IHR5cGUgeyBJVGVsZW1ldHJ5U2luayB9IGZyb20gJy4uL3RlbGVtZXRyeS9zaW5rL3NpbmstaW50ZXJmYWNlJztcbmltcG9ydCB7IFN1YnByb2Nlc3NUZWxlbWV0cnlTaW5rIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3Npbmsvc3VicHJvY2Vzcy1zaW5rJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlsL2NpJztcblxuZXhwb3J0IHR5cGUgeyBJSW9Ib3N0LCBJb01lc3NhZ2UsIElvTWVzc2FnZUNvZGUsIElvTWVzc2FnZUxldmVsLCBJb1JlcXVlc3QgfTtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkIGJ5IHRoZSBDTEkuICdub25lJyByZXByZXNlbnRzIHRoZSBhYnNlbmNlIG9mIGFuIGFjdGlvbi5cbiAqL1xudHlwZSBDbGlBY3Rpb24gPVxuICB8IFRvb2xraXRBY3Rpb25cbiAgfCAnY29udGV4dCdcbiAgfCAnZG9jcydcbiAgfCAnbHNwJ1xuICB8ICdmbGFncydcbiAgfCAnbm90aWNlcydcbiAgfCAndmVyc2lvbidcbiAgfCAnY2xpLXRlbGVtZXRyeSdcbiAgfCAnbm9uZSc7XG5cbi8qKlxuICogSG93IHRlbGVtZXRyeSBzaG91bGQgcmVhY2ggdGhlIG5ldHdvcmsuXG4gKlxuICogQW4gYEFnZW50YCBjYW5ub3QgY3Jvc3MgYSBwcm9jZXNzIGJvdW5kYXJ5LCBzbyB0aGUgZGV0YWNoZWQgc2VuZGVyIGlzIGhhbmRlZCB0aGUgcHJveHkgYW5kXG4gKiBjZXJ0aWZpY2F0ZSBjb25maWd1cmF0aW9uIGFzIHBsYWluIGRhdGEgYW5kIGJ1aWxkcyBpdHMgb3duLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbGVtZXRyeU5ldHdvcmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIFByb3h5IGNvbmZpZ3VyZWQgdmlhIGAtLXByb3h5YCBvciB0aGUgYHByb3h5YCBzZXR0aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBzZW5kZXIgcmVzb2x2ZXMgaXQgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5VXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBDQSBidW5kbGUgY29uZmlndXJlZCB2aWEgYC0tY2EtYnVuZGxlLXBhdGhgIG9yIGBBV1NfQ0FfQlVORExFYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBvbmx5IHRoZSBzeXN0ZW0gdHJ1c3Qgc3RvcmVcbiAgICovXG4gIHJlYWRvbmx5IGNhQnVuZGxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGlJb0hvc3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBUb29sa2l0IGFjdGlvbiB0aGUgaG9zdHMgc3RhcnRzIHdpdGguXG4gICAqXG4gICAqIEBkZWZhdWx0ICdub25lJ1xuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudEFjdGlvbj86IENsaUFjdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgdmVyYm9zaXR5IG9mIHRoZSBvdXRwdXQuXG4gICAqXG4gICAqIFRoZSBDbGlJb0hvc3Qgd2lsbCBzdGlsbCByZWNlaXZlIGFsbCBtZXNzYWdlcyBhbmQgcmVxdWVzdHMsXG4gICAqIGJ1dCBvbmx5IHRoZSBtZXNzYWdlcyBpbmNsdWRlZCBpbiB0aGlzIGxldmVsIHdpbGwgYmUgcHJpbnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2luZm8nXG4gICAqL1xuICByZWFkb25seSBsb2dMZXZlbD86IElvTWVzc2FnZUxldmVsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIGF1dG9tYXRpYyBUVFkgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBXaGVuIFRUWSBpcyBkaXNhYmxlZCwgdGhlIENMSSB3aWxsIGhhdmUgbm8gaW50ZXJhY3Rpb25zIG9yIGNvbG9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRldGVybWluZWQgZnJvbSB0aGUgY3VycmVudCBwcm9jZXNzXG4gICAqL1xuICByZWFkb25seSBpc1RUWT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIENsaUlvSG9zdCBpcyBydW5uaW5nIGluIENJIG1vZGUuXG4gICAqXG4gICAqIEluIENJIG1vZGUsIGFsbCBub24tZXJyb3Igb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLlxuICAgKiBTZXQgdG8gZmFsc2UgaW4gdGhlIENsaUlvSG9zdCBjb25zdHJ1Y3RvciBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGlmIHRoZSBDTEkgQ0kgYXJndW1lbnQgaXMgcGFzc2VkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGV0ZXJtaW5lZCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgc3BlY2lmaWNhbGx5IGJhc2VkIG9uIGBwcm9jZXNzLmVudi5DSWBcbiAgICovXG4gIHJlYWRvbmx5IGlzQ0k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbiB3aGF0IHNjZW5hcmlvcyBzaG91bGQgdGhlIENsaUlvSG9zdCBhc2sgZm9yIGFwcHJvdmFsXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlcXVpcmVBcHByb3ZhbC5CUk9BREVOSU5HXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlRGVwbG95QXBwcm92YWw/OiBSZXF1aXJlQXBwcm92YWw7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIFRvb2xraXQgYWN0aW9uIHRoZSBob3N0cyBzdGFydHMgd2l0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RhY2tBY3Rpdml0eVByb2dyZXNzLkJBUlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tQcm9ncmVzcz86IFN0YWNrQWN0aXZpdHlQcm9ncmVzcztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgQ0xJIHNob3VsZCBhdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkgcmVzcG9uZCB0byBwcm9tcHRzLlxuICAgKlxuICAgKiBXaGVuIHRydWUsIG9wZXJhdGlvbiB3aWxsIHVzdWFsbHkgcHJvY2VlZCB3aXRob3V0IGludGVyYWN0aXZlIGNvbmZpcm1hdGlvbi5cbiAgICogQ29uZmlybWF0aW9ucyBhcmUgcmVzcG9uZGVkIHRvIHdpdGggeWVzLiBPdGhlciBwcm9tcHRzIHdpbGwgcmVzcG9uZCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b1Jlc3BvbmQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgdHlwZSBmb3IgY29uZmlndXJpbmcgYSB0YXJnZXQgc3RyZWFtXG4gKi9cbmV4cG9ydCB0eXBlIFRhcmdldFN0cmVhbSA9ICdzdGRvdXQnIHwgJ3N0ZGVycicgfCAnZHJvcCc7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBhIG1lc3NhZ2UgbGlzdGVuZXIgbWF5IHJldHVybiB0byBpbmZsdWVuY2UgaG93IGEgbWVzc2FnZSBpcyBoYW5kbGVkLlxuICpcbiAqIEEgbGlzdGVuZXIgbWF5IHVwZGF0ZSB0aGUgbWVzc2FnZSBfdGV4dF8sIF9sZXZlbF8sIGFuZC9vciBfYWN0aW9uXzsgaXQgY2Fubm90XG4gKiBjaGFuZ2Ugb3RoZXIgZmllbGRzIChzdWNoIGFzIGl0cyBgY29kZWApLCB3aGljaCBrZWVwcyB0aGUgY29kZS1rZXllZCBsaXN0ZW5lclxuICogcmVnaXN0cnkgdmFsaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUxpc3RlbmVyUmVzdWx0IHtcbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIHRleHQgdGhhdCBpcyBwcmludGVkIGZvciB0aGlzIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIG1lc3NhZ2UgdGV4dCBpcyBsZWZ0IHVuY2hhbmdlZFxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGxldmVsIG9mIHRoaXMgbWVzc2FnZS5cbiAgICpcbiAgICogVGhlIG5ldyBsZXZlbCBpcyB1c2VkIGZvciBib3RoIHZlcmJvc2l0eSBmaWx0ZXJpbmcgYW5kIHN0cmVhbSBzZWxlY3Rpb24sIHNvXG4gICAqIHRoaXMgY2FuIG1vdmUgYSBtZXNzYWdlIGJldHdlZW4gc3Rkb3V0L3N0ZGVyciAoZS5nLiBkb3duZ3JhZGUgYSBgcmVzdWx0YCB0b1xuICAgKiBgaW5mb2ApLiBUaGUgYGNvZGVgIGlzIGludGVudGlvbmFsbHkgbGVmdCB1bmNoYW5nZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIG1lc3NhZ2UgbGV2ZWwgaXMgbGVmdCB1bmNoYW5nZWRcbiAgICovXG4gIHJlYWRvbmx5IGxldmVsPzogSW9NZXNzYWdlTGV2ZWw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVzc2FnZS5cbiAgICpcbiAgICogVGhlIG92ZXJyaWRlIGFmZmVjdHMgc3Vic2VxdWVudCBsaXN0ZW5lcnMgYW5kIHByZXNlbnRhdGlvbi9vYnNlcnZhdGlvbiBvZlxuICAgKiB0aGUgZWZmZWN0aXZlIG1lc3NhZ2UuIE1hdGNoaW5nIGFuZCB0ZWxlbWV0cnkgY29udGludWUgdG8gdXNlIHRoZSBhY3Rpb25cbiAgICogb24gdGhlIG9yaWdpbmFsbHkgZW1pdHRlZCBtZXNzYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBtZXNzYWdlIGFjdGlvbiBpcyBsZWZ0IHVuY2hhbmdlZFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uPzogVG9vbGtpdEFjdGlvbjtcblxuICAvKipcbiAgICogU2tpcCB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiB0aGUgbWVzc2FnZS5cbiAgICpcbiAgICogRm9yIGEgbm90aWZpY2F0aW9uIHRoaXMgbWVhbnMgaXQgaXMgbm90IHdyaXR0ZW4gdG8gYSBzdHJlYW0uIEZvciBhIHJlcXVlc3RcbiAgICogaXQgc3RvcHMgcHJvY2Vzc2luZyBlbnRpcmVseTogdGhlIHVzZXIgaXMgbm90IHByb21wdGVkLCBub3RoaW5nIGlzIHdyaXR0ZW4sXG4gICAqIGFuZCB0aGUgcmVxdWVzdCByZXNvbHZlcyB3aXRoIGl0cyAocG9zc2libHkgYHJlc3BvbmRgLW92ZXJyaWRkZW4pIGRlZmF1bHRcbiAgICogcmVzcG9uc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvciByZXF1ZXN0cyBvbmx5OiB0aGUgdmFsdWUgdG8gcmVzb2x2ZSB0aGUgcmVxdWVzdCB3aXRoLiBJdCBpcyBmb2xkZWQgaW50b1xuICAgKiB0aGUgcmVxdWVzdCdzIGRlZmF1bHQgcmVzcG9uc2UgYW5kIHNraXBzIHRoZSBwcm9tcHQgKHRoZSByZXF1ZXN0IGlzIHRyZWF0ZWRcbiAgICogYXMgbm90IHByb21wdGFibGUpLiBUaGUgcXVlc3Rpb24gaXMgc3RpbGwgd3JpdHRlbiB1bmxlc3MgYHByZXZlbnREZWZhdWx0YCBpc1xuICAgKiBhbHNvIHNldC4gSWdub3JlZCBmb3IgcGxhaW4gbm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogVGhlIHByZXNlbmNlIG9mIHRoZSBrZXkgaXMgd2hhdCBtYXR0ZXJzLCBzbyBgZmFsc2VgL2AwYC9gJydgIGFyZSB2YWxpZFxuICAgKiBhbnN3ZXJzLiBVc2UgdGhlIGByZXNwb25kYC9gcmVzcG9uZE9uY2VgIGhlbHBlcnMgZm9yIHRoZSBjb21tb24gY2FzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGlzIGxpc3RlbmVyIGRvZXMgbm90IHN1cHBseSBhIHJlc3BvbnNlXG4gICAqL1xuICByZWFkb25seSByZXNwb25kPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBXaGF0IGEgbWVzc2FnZSBsaXN0ZW5lciBtYXkgcmV0dXJuOiBub3RoaW5nLCBhIGBNZXNzYWdlTGlzdGVuZXJSZXN1bHRgLCBvciBhXG4gKiBgUHJvbWlzZWAgb2YgZWl0aGVyLlxuICpcbiAqIExpc3RlbmVycyBtYXkgYmUgYXN5bmMuIFRoZSBob3N0IGF3YWl0cyBlYWNoIGxpc3RlbmVyIGJlZm9yZSBydW5uaW5nIHRoZVxuICogbmV4dCwgc28gcmVnaXN0cmF0aW9uIG9yZGVyIOKAlCBhbmQgdGhlIGN1bXVsYXRpdmUgZWZmZWN0IG9uIHRoZSBtZXNzYWdlIOKAlCBpc1xuICogcHJlc2VydmVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBsaXN0ZW5lcnMgYXJlIHN5bmMgb3IgYXN5bmMuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VMaXN0ZW5lclJlc3VsdE9yUHJvbWlzZSA9IHZvaWQgfCBNZXNzYWdlTGlzdGVuZXJSZXN1bHQgfCBQcm9taXNlPHZvaWQgfCBNZXNzYWdlTGlzdGVuZXJSZXN1bHQ+O1xuXG4vKipcbiAqIEEgcmVnaXN0ZXJlZCBtZXNzYWdlIGxpc3RlbmVyLiBJdHMgcmV0dXJuIHZhbHVlIChpZiBhbnkpIG1heSB1cGRhdGUgdGhlXG4gKiBtZXNzYWdlIHRleHQsIGxldmVsLCBhbmQvb3IgYWN0aW9uIG9yIHByZXZlbnQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZy4gSXQgbWF5XG4gKiBiZSBhc3luYy5cbiAqL1xudHlwZSBNZXNzYWdlTGlzdGVuZXJGbiA9IChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBNZXNzYWdlTGlzdGVuZXJSZXN1bHRPclByb21pc2U7XG5pbnRlcmZhY2UgTWVzc2FnZUxpc3RlbmVyIHtcbiAgcmVhZG9ubHkgb25jZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZm46IE1lc3NhZ2VMaXN0ZW5lckZuO1xuICAvKipcbiAgICogRGVjaWRlcyB3aGljaCBtZXNzYWdlcyB0aGlzIGxpc3RlbmVyIGFwcGxpZXMgdG8uIEZvciBhIGxpc3RlbmVyIHJlZ2lzdGVyZWRcbiAgICogd2l0aCBhIG1ha2VyIHRoaXMgbWF0Y2hlcyBieSBgY29kZWA7IGZvciBvbmUgcmVnaXN0ZXJlZCB3aXRoIGEgcHJlZGljYXRlIGl0XG4gICAqIGlzIHRoZSBwcmVkaWNhdGUgaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hlczogKG1zZzogSW9NZXNzYWdlPHVua25vd24+KSA9PiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIG9uZSBvZiB0aGUgaG9zdCdzIG93biBpbnRlcm5hbCBsaXN0ZW5lcnMgKGUuZy4gc3RhY2stYWN0aXZpdHlcbiAgICogcm91dGluZykuIEludGVybmFsIGxpc3RlbmVycyBhcmUgbm90IHJlbW92ZWQgYnkgYHJlbW92ZUFsbExpc3RlbmVyc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlIC0gYSB1c2VyIGxpc3RlbmVyIHJlZ2lzdGVyZWQgdmlhIGBvbmAvYG9uY2VgL2ByZXdyaXRlYC9gcmVzcG9uZGBcbiAgICovXG4gIHJlYWRvbmx5IGludGVybmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHdoaWNoIG1lc3NhZ2VzIGEgbGlzdGVuZXIgYXBwbGllcyB0by5cbiAqXG4gKiBFaXRoZXIgYSBtZXNzYWdlL3JlcXVlc3QgKm1ha2VyKiDigJQgdGhlIGxpc3RlbmVyIGZpcmVzIGZvciBtZXNzYWdlcyB3aXRoIHRoYXRcbiAqIG1ha2VyJ3MgYGNvZGVgICh0aGUgb3JpZ2luYWwgYmVoYXZpb3IpIOKAlCBvciBhIGN1c3RvbSAqcHJlZGljYXRlKiBvdmVyIHRoZVxuICogbWVzc2FnZS4gQSBtYWtlcidzIGAuaXNgIHR5cGUgZ3VhcmQgKGUuZy4gYElPLkNES19UT09MS0lUX0k3MDEwLmlzYCkgaXMgYVxuICogY29udmVuaWVudCBwcmVkaWNhdGUsIGJ1dCBhbnkgYChtc2cpID0+IGJvb2xlYW5gIHdvcmtzIChlLmcuIHRvIG1hdGNoIGEgZmFtaWx5XG4gKiBvZiBjb2Rlcywgb3Igb24gdGhlIG1lc3NhZ2UgbGV2ZWwpLlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlU2VsZWN0b3I8VD4gPVxuICB8IElvTWVzc2FnZU1ha2VyPFQ+XG4gIHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PlxuICB8ICgobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gYm9vbGVhbik7XG5cbi8qKlxuICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBtZXNzYWdlIGxpc3RlbmVyLlxuICpcbiAqIENhbGxhYmxlIGRpcmVjdGx5IChgZGlzcG9zZSgpYCksIGFuZCBhbHNvIGEgYERpc3Bvc2FibGVgLCBzbyBpdCBjYW4gYmUgYm91bmRcbiAqIHRvIHRoZSBlbmNsb3Npbmcgc2NvcGUgd2l0aCBhIGB1c2luZ2AgZGVjbGFyYXRpb24g4oCUIHRoZSBsaXN0ZW5lciBpcyB0aGVuXG4gKiByZW1vdmVkIHdoZW4gdGhlIHNjb3BlIGV4aXRzLCBldmVuIG9uIGFuIGVhcmx5IHJldHVybiBvciBhIHRocm93OlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfZm10ID0gaW9Ib3N0LnJld3JpdGUoSU8uQ0RLX1RPT0xLSVRfSTI5MDEsIGZvcm1hdCk7XG4gKiBgYGBcbiAqXG4gKiBgdXNpbmcgeCA9IGNvbmQgPyBpb0hvc3Qub24oLi4uKSA6IHVuZGVmaW5lZGAgaXMgYWxzbyB2YWxpZDogZGlzcG9zYWwgaXNcbiAqIHNpbXBseSBza2lwcGVkIGZvciBgdW5kZWZpbmVkYCwgd2hpY2ggbWFrZXMgY29uZGl0aW9uYWwgbGlzdGVuZXJzIGNoZWFwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3Bvc2VMaXN0ZW5lciB7XG4gICgpOiB2b2lkO1xuICBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogTWFrZSBhIHBsYWluIHJlbW92ZXIgZnVuY3Rpb24gdXNhYmxlIGFzIGEgYERpc3Bvc2FibGVgIChzZWUgYERpc3Bvc2VMaXN0ZW5lcmApLlxuICovXG5mdW5jdGlvbiBkaXNwb3NlTGlzdGVuZXIoZGlzcG9zZTogKCkgPT4gdm9pZCk6IERpc3Bvc2VMaXN0ZW5lciB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKGRpc3Bvc2UsIHsgW1N5bWJvbC5kaXNwb3NlXTogZGlzcG9zZSB9KTtcbn1cblxuLyoqXG4gKiBIb3cgYW4gSW9Ib3N0IHByb2Nlc3NlZCBhIHNpbmdsZSBtZXNzYWdlIG9yIHJlcXVlc3QuXG4gKlxuICogVGhpcyBkZXNjcmliZXMgdGhlIG1lc3NhZ2UgKmFzIHRoZSBob3N0IGhhbmRsZWQgaXQqLCB3aGljaCBjYW4gZGlmZmVyIGZyb21cbiAqIHdoYXQgd2FzIGVtaXR0ZWQ6IGxpc3RlbmVycyBtYXkgcmV3cml0ZSB0aGUgdGV4dCBvciBsZXZlbCwgcHJldmVudCBpdCBmcm9tXG4gKiBiZWluZyB3cml0dGVuIGF0IGFsbCwgb3IgKGZvciByZXF1ZXN0cykgYW5zd2VyIGl0IG9uIHRoZSB1c2VyJ3MgYmVoYWxmLlxuICpcbiAqIEJvdGggbm90aWZpY2F0aW9ucyAoYG5vdGlmeWApIGFuZCByZXF1ZXN0cyAoYHJlcXVlc3RSZXNwb25zZWApIGFyZSByZXBvcnRlZCxcbiAqIHNvIGFuIG9ic2VydmVyIHNlZXMgdGhlIGNvbXBsZXRlLCBvcmRlcmVkIHN0cmVhbSB0aGUgaG9zdCBoYW5kbGVkLiBVc2VcbiAqIGB0eXBlYCB0byB0ZWxsIHRoZW0gYXBhcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW9NZXNzYWdlT2JzZXJ2YXRpb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIG9ic2VydmF0aW9uIGRlc2NyaWJlcyBhIHBsYWluIG5vdGlmaWNhdGlvbiAoYG5vdGlmeWApIG9yIGFcbiAgICogcmVxdWVzdCB0aGF0IGFza2VkIGZvciBhIHJlc3BvbnNlIChgcmVxdWVzdFJlc3BvbnNlYCkuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnbm90aWZ5JyB8ICdyZXF1ZXN0JztcblxuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgZXhhY3RseSBhcyBpdCB3YXMgZW1pdHRlZCB0byB0aGUgaG9zdCAoYmVmb3JlIGFueSBsaXN0ZW5lcnMpLlxuICAgKi9cbiAgcmVhZG9ubHkgZW1pdHRlZDogSW9NZXNzYWdlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSBhZnRlciB0aGUgaG9zdCdzIGxpc3RlbmVycyByYW4gKHRleHQsIGxldmVsLCBhbmQvb3IgYWN0aW9uIG1heSBkaWZmZXIpLlxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0aXZlOiBJb01lc3NhZ2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBsaXN0ZW5lciBwcmV2ZW50ZWQgdGhpcyBtZXNzYWdlIGZyb20gYmVpbmcgd3JpdHRlbiwgaS5lLiB0aGUgdXNlclxuICAgKiB3b3VsZCBub3Qgc2VlIGl0LiBBbHdheXMgYGZhbHNlYCBmb3IgcmVxdWVzdHMgKGEgcmVxdWVzdCBpcyByZXBvcnRlZCBvbmNlXG4gICAqIGl0IGhhcyBiZWVuIHJlc29sdmVkLCByZWdhcmRsZXNzIG9mIGhvdyBpdCB3YXMgYW5zd2VyZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgZHJvcHBlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBJb0hvc3Qgd2hvc2UgbWVzc2FnZSBoYW5kbGluZyBjYW4gYmUgb2JzZXJ2ZWQuXG4gKlxuICogVGhpcyBpcyBhIENMSS1pbnRlcm5hbCBjb250cmFjdCB1c2VkIGJ5IHRlc3RzIHRvIHJlY29yZCB0aGUgKmVmZmVjdGl2ZSosXG4gKiB1c2VyLWZhY2luZyBtZXNzYWdlIHN0cmVhbSAoYWZ0ZXIgbGlzdGVuZXJzKSB3aXRob3V0IHJlYWNoaW5nIGludG8gaG9zdFxuICogaW50ZXJuYWxzLiBJdCBpcyBpbnRlbnRpb25hbGx5IHNlcGFyYXRlIGZyb20gYElJb0hvc3RgIHNvIHRoYXQgdGhlIHJlY29yZGVyXG4gKiBjYW4gd29yayB3aXRoIGFueSBgSUlvSG9zdGAgYW5kIG9ubHkgZW5yaWNoIGl0cyBvdXRwdXQgd2hlbiB0aGUgaG9zdCBhbHNvXG4gKiBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2VydmFibGVJb0hvc3Qge1xuICAvKipcbiAgICogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgdGhhdCBpcyBpbnZva2VkIGZvciBldmVyeSBtZXNzYWdlIHRoZSBob3N0IGhhbmRsZXMg4oCUXG4gICAqIGJvdGggbm90aWZpY2F0aW9ucyBhbmQgcmVxdWVzdHMg4oCUIHdpdGggdGhlIGRpc3Bvc2l0aW9uIHRoZSBob3N0IGNvbXB1dGVkXG4gICAqIGZvciBpdCAoaXRzIGVmZmVjdGl2ZSBmb3JtIGFmdGVyIGxpc3RlbmVycyBhbmQgd2hldGhlciBpdCB3YXMgZHJvcHBlZCkuIEZvclxuICAgKiBhIHJlcXVlc3QsIHRoZSByZXNvbHZlZCBhbnN3ZXIgaXMgdGhlIGVmZmVjdGl2ZSBtZXNzYWdlJ3MgYGRlZmF1bHRSZXNwb25zZWAuXG4gICAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJlbW92ZXMgdGhlIG9ic2VydmVyIGFnYWluLlxuICAgKi9cbiAgb2JzZXJ2ZU1lc3NhZ2VzKG9ic2VydmVyOiAob2JzZXJ2YXRpb246IElvTWVzc2FnZU9ic2VydmF0aW9uKSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBIHNpbXBsZSBJTyBob3N0IGZvciB0aGUgQ0xJIHRoYXQgd3JpdGVzIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlLlxuICovXG5leHBvcnQgY2xhc3MgQ2xpSW9Ib3N0IGltcGxlbWVudHMgSUlvSG9zdCwgT2JzZXJ2YWJsZUlvSG9zdCB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBpbnN0YW5jZShwcm9wczogQ2xpSW9Ib3N0UHJvcHMgPSB7fSwgZm9yY2VOZXcgPSBmYWxzZSk6IENsaUlvSG9zdCB7XG4gICAgaWYgKGZvcmNlTmV3IHx8ICFDbGlJb0hvc3QuX2luc3RhbmNlKSB7XG4gICAgICBDbGlJb0hvc3QuX2luc3RhbmNlID0gbmV3IENsaUlvSG9zdChwcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiBDbGlJb0hvc3QuX2luc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBpZiBpdCBleGlzdHNcbiAgICovXG4gIHN0YXRpYyBnZXQoKTogQ2xpSW9Ib3N0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQ2xpSW9Ib3N0Ll9pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIENsaUlvSG9zdFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBDbGlJb0hvc3QgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGFjdGlvbiBiZWluZyBwZXJmb3JtZWQgYnkgdGhlIENMSS5cbiAgICovXG4gIHB1YmxpYyBjdXJyZW50QWN0aW9uOiBDbGlBY3Rpb247XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIENsaUlvSG9zdCBpcyBydW5uaW5nIGluIENJIG1vZGUuXG4gICAqXG4gICAqIEluIENJIG1vZGUsIGFsbCBub24tZXJyb3Igb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLlxuICAgKi9cbiAgcHVibGljIGlzQ0k6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGhvc3QgY2FuIHVzZSBpbnRlcmFjdGlvbnMgYW5kIG1lc3NhZ2Ugc3R5bGluZy5cbiAgICovXG4gIHB1YmxpYyBpc1RUWTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdGhyZXNob2xkLlxuICAgKlxuICAgKiBNZXNzYWdlcyB3aXRoIGEgbG93ZXIgcHJpb3JpdHkgbGV2ZWwgd2lsbCBiZSBpZ25vcmVkLlxuICAgKi9cbiAgcHVibGljIGxvZ0xldmVsOiBJb01lc3NhZ2VMZXZlbDtcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbnMgZm9yIHJlcXVpcmluZyBhcHByb3ZhbCBpbiB0aGlzIENsaUlvSG9zdC5cbiAgICovXG4gIHB1YmxpYyByZXF1aXJlRGVwbG95QXBwcm92YWw6IFJlcXVpcmVBcHByb3ZhbDtcblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSB0YXJnZXQgc3RyZWFtIGZvciBub3RpY2VzXG4gICAqXG4gICAqIChOb3QgYSBzZXR0ZXIgYmVjYXVzZSB0aGVyZSdzIG5vIG5lZWQgZm9yIGFkZGl0aW9uYWwgbG9naWMgd2hlbiB0aGlzIHZhbHVlXG4gICAqIGlzIGNoYW5nZWQgeWV0KVxuICAgKi9cbiAgcHVibGljIG5vdGljZXNEZXN0aW5hdGlvbjogVGFyZ2V0U3RyZWFtID0gJ3N0ZGVycic7XG5cbiAgcHJpdmF0ZSBfcHJvZ3Jlc3M6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyA9IFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CQVI7XG5cbiAgLy8gU3RhY2sgQWN0aXZpdHkgUHJpbnRlclxuICBwcml2YXRlIGFjdGl2aXR5UHJpbnRlcj86IElBY3Rpdml0eVByaW50ZXI7XG5cbiAgLy8gQ29ya2VkIExvZ2dpbmdcbiAgcHJpdmF0ZSBjb3JrZWRDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb3JrZWRMb2dnaW5nQnVmZmVyOiBJb01lc3NhZ2U8dW5rbm93bj5bXSA9IFtdO1xuXG4gIC8vIE1lc3NhZ2UgbGlzdGVuZXJzIGluIHJlZ2lzdHJhdGlvbiBvcmRlci4gRWFjaCBjYXJyaWVzIGEgbWF0Y2hlciAoYnkgY29kZSxcbiAgLy8gb3IgYSBjdXN0b20gcHJlZGljYXRlKS4gU2VlIGBvbmAvYG9uY2VgL2ByZXdyaXRlYC9gcmVzcG9uZGAuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUxpc3RlbmVyczogTWVzc2FnZUxpc3RlbmVyW10gPSBbXTtcblxuICAvLyBPYnNlcnZlcnMgb2YgaG93IG1lc3NhZ2VzIGFyZSBoYW5kbGVkIChzZWUgT2JzZXJ2YWJsZUlvSG9zdCAvIG9ic2VydmVNZXNzYWdlcykuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZU9ic2VydmVycyA9IG5ldyBTZXQ8KG9ic2VydmF0aW9uOiBJb01lc3NhZ2VPYnNlcnZhdGlvbikgPT4gdm9pZD4oKTtcblxuICAvLyBUcnVlIHdoaWxlIHJlcGxheWluZyBjb3JrZWQgbWVzc2FnZXMsIHNvIG9ic2VydmVycyBhcmVuJ3Qgbm90aWZpZWQgdHdpY2UuXG4gIHByaXZhdGUgY29ya1JlcGxheWluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b1Jlc3BvbmQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0ZWxlbWV0cnkgc2Vzc2lvbiBvYmplY3RcbiAgICpcbiAgICogV2lsbCByZW1haW4gYHVuZGVmaW5lZGAgaWYgdGhlIHVzZXIgaGFzIGRpc2FibGVkIHRlbGVtZXRyeS5cbiAgICovXG4gIHB1YmxpYyB0ZWxlbWV0cnk/OiBUZWxlbWV0cnlTZXNzaW9uO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IENsaUlvSG9zdFByb3BzID0ge30pIHtcbiAgICB0aGlzLmN1cnJlbnRBY3Rpb24gPSBwcm9wcy5jdXJyZW50QWN0aW9uID8/ICdub25lJztcbiAgICB0aGlzLmlzVFRZID0gcHJvcHMuaXNUVFkgPz8gcHJvY2Vzcy5zdGRvdXQuaXNUVFkgPz8gZmFsc2U7XG4gICAgdGhpcy5sb2dMZXZlbCA9IHByb3BzLmxvZ0xldmVsID8/ICdpbmZvJztcbiAgICB0aGlzLmlzQ0kgPSBwcm9wcy5pc0NJID8/IGlzQ0koKTtcbiAgICB0aGlzLnJlcXVpcmVEZXBsb3lBcHByb3ZhbCA9IHByb3BzLnJlcXVpcmVEZXBsb3lBcHByb3ZhbCA/PyBSZXF1aXJlQXBwcm92YWwuQlJPQURFTklORztcbiAgICB0aGlzLnN0YWNrUHJvZ3Jlc3MgPSBwcm9wcy5zdGFja1Byb2dyZXNzID8/IFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CQVI7XG4gICAgdGhpcy5hdXRvUmVzcG9uZCA9IHByb3BzLmF1dG9SZXNwb25kID8/IGZhbHNlO1xuXG4gICAgLy8gU3RhY2stYWN0aXZpdHkgbWVzc2FnZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGFjdGl2aXR5IHByaW50ZXIgcmF0aGVyIHRoYW5cbiAgICAvLyB3cml0dGVuIHRvIGEgc3RyZWFtLiBUaGlzIGlzIHdpcmVkIHVwIGFzIG1lc3NhZ2UgbGlzdGVuZXJzLlxuICAgIHRoaXMucm91dGVTdGFja0FjdGl2aXR5VG9QcmludGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnRUZWxlbWV0cnkoYXJnczogYW55LCBjb250ZXh0OiBDb250ZXh0LCBuZXR3b3JrOiBUZWxlbWV0cnlOZXR3b3JrT3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjb25maWcgPSByZXF1aXJlKCcuLi9jbGktdHlwZS1yZWdpc3RyeS5qc29uJyk7XG4gICAgY29uc3QgdmFsaWRDb21tYW5kcyA9IE9iamVjdC5rZXlzKGNvbmZpZy5jb21tYW5kcyk7XG4gICAgY29uc3QgY21kID0gYXJncy5fWzBdO1xuICAgIGlmICghdmFsaWRDb21tYW5kcy5pbmNsdWRlcyhjbWQpKSB7XG4gICAgICAvLyB0aGUgdXNlciB0eXBlZCBpbiBhbiBpbnZhbGlkIGNvbW1hbmQgLSBubyBuZWVkIGZvciB0ZWxlbWV0cnkgc2luY2UgdGhlIGludm9jYXRpb24gaXMgZ29pbmcgdG8gZmFpbFxuICAgICAgLy8gaW1taW5lbnRseSBhbnl3YXkuXG4gICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZShgU2Vzc2lvbiBpbnN0YW50aWF0ZWQgd2l0aCBhbiBpbnZhbGlkIGNvbW1hbmQgKCR7Y21kfSkuIE5vdCBzdGFydGluZyB0ZWxlbWV0cnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHNpbmtzOiBJVGVsZW1ldHJ5U2lua1tdID0gW107XG4gICAgY29uc3QgdGVsZW1ldHJ5RmlsZVBhdGggPSBhcmdzWyd0ZWxlbWV0cnktZmlsZSddO1xuICAgIGlmICh0ZWxlbWV0cnlGaWxlUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2lua3MucHVzaChuZXcgRmlsZVRlbGVtZXRyeVNpbmsoe1xuICAgICAgICAgIGlvSG9zdDogdGhpcyxcbiAgICAgICAgICBsb2dGaWxlUGF0aDogdGVsZW1ldHJ5RmlsZVBhdGgsXG4gICAgICAgIH0pKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHMudHJhY2UoJ0ZpbGUgVGVsZW1ldHJ5IGNvbm5lY3RlZCcpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKGBGaWxlIFRlbGVtZXRyeSBpbnN0YW50aWF0aW9uIGZhaWxlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGVsZW1ldHJ5RW5kcG9pbnQgPSBwcm9jZXNzLmVudi5URUxFTUVUUllfRU5EUE9JTlQgPz8gJ2h0dHBzOi8vY2RrLWNsaS10ZWxlbWV0cnkudXMtZWFzdC0xLmFwaS5hd3MvbWV0cmljcyc7XG4gICAgaWYgKGNhbkNvbGxlY3RUZWxlbWV0cnkoYXJncywgY29udGV4dCkgJiYgdGVsZW1ldHJ5RW5kcG9pbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNpbmtzLnB1c2gobmV3IFN1YnByb2Nlc3NUZWxlbWV0cnlTaW5rKHtcbiAgICAgICAgICBpb0hvc3Q6IHRoaXMsXG4gICAgICAgICAgZW5kcG9pbnQ6IHRlbGVtZXRyeUVuZHBvaW50LFxuICAgICAgICAgIHByb3h5VXJsOiBuZXR3b3JrLnByb3h5VXJsLFxuICAgICAgICAgIGNhQnVuZGxlUGF0aDogbmV0d29yay5jYUJ1bmRsZVBhdGgsXG4gICAgICAgIH0pKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHMudHJhY2UoJ1RlbGVtZXRyeSBzaW5rIHJlZ2lzdGVyZWQnKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZShgVGVsZW1ldHJ5IHNpbmsgcmVnaXN0cmF0aW9uIGZhaWxlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKCdUZWxlbWV0cnkgZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoc2lua3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50ZWxlbWV0cnkgPSBuZXcgVGVsZW1ldHJ5U2Vzc2lvbih7XG4gICAgICAgIGlvSG9zdDogdGhpcyxcbiAgICAgICAgY2xpZW50OiBuZXcgRnVubmVsKHsgc2lua3MgfSksXG4gICAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Py5iZWdpbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc3RhY2tQcm9ncmVzcyBwcmVmZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIHNldCBzdGFja1Byb2dyZXNzKHR5cGU6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcykge1xuICAgIHRoaXMuX3Byb2dyZXNzID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFja1Byb2dyZXNzIHZhbHVlLlxuICAgKlxuICAgKiBUaGlzIHRha2VzIGludG8gYWNjb3VudCBvdGhlciBzdGF0ZSBvZiB0aGUgaW9Ib3N0LFxuICAgKiBsaWtlIGlmIGlzVFRZIGFuZCBpc0NJLlxuICAgKi9cbiAgcHVibGljIGdldCBzdGFja1Byb2dyZXNzKCk6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB7XG4gICAgLy8gV2UgY2FuIGFsd2F5cyB1c2UgRVZFTlRTIGFuZCBFUlJPUlNfT05MWVxuICAgIGlmICh0aGlzLl9wcm9ncmVzcyA9PT0gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVWRU5UUyB8fCB0aGlzLl9wcm9ncmVzcyA9PT0gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVSUk9SU19PTkxZKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBkZWJ1ZyBtZXNzYWdlIChhbmQgdGh1cyBhbnkgbW9yZSB2ZXJib3NlIG1lc3NhZ2VzKSBhcmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgbG9nIGxldmVsLCB3ZSBoYXZlIHZlcmJvc2UgbG9nZ2luZ1xuICAgIGNvbnN0IHZlcmJvc2VMb2dnaW5nID0gaXNNZXNzYWdlUmVsZXZhbnRGb3JMZXZlbCh7IGxldmVsOiAnZGVidWcnIH0sIHRoaXMubG9nTGV2ZWwpO1xuICAgIGlmICh2ZXJib3NlTG9nZ2luZykge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gT24gV2luZG93cyB3ZSBjYW5ub3QgdXNlIGZhbmN5IG91dHB1dFxuICAgIGNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4gICAgaWYgKGlzV2luZG93cykge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gT24gc29tZSBDSSBzeXN0ZW1zIChzdWNoIGFzIENpcmNsZUNJKSBvdXRwdXQgc3RpbGwgcmVwb3J0cyBhcyBhIFRUWSBzbyB3ZSBhbHNvXG4gICAgLy8gbmVlZCBhbiBpbmRpdmlkdWFsIGNoZWNrIGZvciB3aGV0aGVyIHdlJ3JlIHJ1bm5pbmcgb24gQ0kuXG4gICAgLy8gc2VlOiBodHRwczovL2Rpc2N1c3MuY2lyY2xlY2kuY29tL3QvY2lyY2xlY2ktdGVybWluYWwtaXMtYS10dHktYnV0LXRlcm0taXMtbm90LXNldC85OTY1XG4gICAgY29uc3QgZmFuY3lPdXRwdXRBdmFpbGFibGUgPSB0aGlzLmlzVFRZICYmICF0aGlzLmlzQ0k7XG4gICAgaWYgKCFmYW5jeU91dHB1dEF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSB1c2VyIHByZWZlcmVuY2VcbiAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlZmF1bHRzKCk6IElvRGVmYXVsdE1lc3NhZ2VzIHtcbiAgICByZXR1cm4gdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHM7XG4gIH1cblxuICBwdWJsaWMgYXNJb0hlbHBlcigpOiBJb0hlbHBlciB7XG4gICAgcmV0dXJuIGFzSW9IZWxwZXIodGhpcywgdGhpcy5jdXJyZW50QWN0aW9uIGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBibG9jayBvZiBjb2RlIHdpdGggY29ya2VkIGxvZ2dpbmcuIEFsbCBsb2cgbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvblxuICAgKiBhcmUgYnVmZmVyZWQgYW5kIG9ubHkgd3JpdHRlbiB3aGVuIGFsbCBuZXN0ZWQgY29yayBibG9ja3MgY29tcGxldGUgKHdoZW4gQ09SS19DT1VOVEVSIHJlYWNoZXMgMCkuXG4gICAqIFRoZSBjb3JraW5nIGlzIGJvdW5kIHRvIHRoZSBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgQ2xpSW9Ib3N0LlxuICAgKlxuICAgKiBAcGFyYW0gYmxvY2sgLSBBc3luYyBmdW5jdGlvbiB0byBleGVjdXRlIHdpdGggY29ya2VkIGxvZ2dpbmdcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJsb2NrJ3MgcmV0dXJuIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2l0aENvcmtlZExvZ2dpbmc8VD4oYmxvY2s6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICB0aGlzLmNvcmtlZENvdW50ZXIrKztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJsb2NrKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ya2VkQ291bnRlci0tO1xuICAgICAgaWYgKHRoaXMuY29ya2VkQ291bnRlciA9PT0gMCkge1xuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggYnVmZmVyZWQgbWVzc2FnZSB0aHJvdWdoIG5vdGlmeVxuICAgICAgICB0aGlzLmNvcmtSZXBsYXlpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgaW9NZXNzYWdlIG9mIHRoaXMuY29ya2VkTG9nZ2luZ0J1ZmZlcikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ub3RpZnkoaW9NZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5jb3JrUmVwbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBidWZmZXJlZCBtZXNzYWdlcyBpbi1wbGFjZVxuICAgICAgICB0aGlzLmNvcmtlZExvZ2dpbmdCdWZmZXIuc3BsaWNlKDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIHRoYXQgaXMgaW52b2tlZCBmb3IgZXZlcnkgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBjb2RlLlxuICAgKlxuICAgKiBUaGUgbGlzdGVuZXIgbWF5IHJldHVybiBhIGBNZXNzYWdlTGlzdGVuZXJSZXN1bHRgIHRvIHVwZGF0ZSB0aGUgbWVzc2FnZVxuICAgKiB0ZXh0LCBsZXZlbCwgYW5kL29yIGFjdGlvbiBvciBwcmV2ZW50IHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcgKHdyaXRpbmcgaXQgdG9cbiAgICogYSBzdHJlYW0pOyByZXR1cm5pbmcgbm90aGluZyBsZWF2ZXMgdGhlIG1lc3NhZ2UgdW50b3VjaGVkLiBUaGUgbGlzdGVuZXIgbWF5XG4gICAqIGJlIGFzeW5jIChyZXR1cm4gYSBgUHJvbWlzZWApOyB0aGUgaG9zdCBhd2FpdHMgaXQgYmVmb3JlIHByb2Nlc3NpbmcgdGhlXG4gICAqIG1lc3NhZ2UgZnVydGhlci4gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgbGlzdGVuZXIgYWdhaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGRpc3Bvc2UgPSBpb0hvc3Qub24oSU8uQ0RLX1RPT0xLSVRfSTI5MDEsIGFzeW5jIChtc2cpID0+IHtcbiAgICogICBteUNvdW50ICs9IG1zZy5kYXRhLnN0YWNrcy5sZW5ndGg7XG4gICAqICAgYXdhaXQgcGVyc2lzdChteUNvdW50KTtcbiAgICogfSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIE1hdGNoIHdpdGggYSBjdXN0b20gcHJlZGljYXRlIGluc3RlYWQgb2YgYSBjb2RlLCBlLmcuIGEgbWFrZXIncyBgLmlzYDpcbiAgICogY29uc3QgZGlzcG9zZSA9IGlvSG9zdC5vbihJTy5DREtfVE9PTEtJVF9JNzAxMC5pcywgKG1zZykgPT4gKHsgcmVzcG9uZDogdHJ1ZSB9KSk7XG4gICAqL1xuICBwdWJsaWMgb248VD4oXG4gICAgc2VsZWN0b3I6IElvTWVzc2FnZU1ha2VyPFQ+IHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PiB8ICgobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gbXNnIGlzIElvTWVzc2FnZTxUPiksXG4gICAgbGlzdGVuZXI6IChtc2c6IElvTWVzc2FnZTxUPikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlLFxuICApOiBEaXNwb3NlTGlzdGVuZXI7XG4gIHB1YmxpYyBvbihcbiAgICBwcmVkaWNhdGU6IChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBib29sZWFuLFxuICAgIGxpc3RlbmVyOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdE9yUHJvbWlzZSxcbiAgKTogRGlzcG9zZUxpc3RlbmVyO1xuICBwdWJsaWMgb24oc2VsZWN0b3I6IE1lc3NhZ2VTZWxlY3Rvcjxhbnk+LCBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyRm4pOiBEaXNwb3NlTGlzdGVuZXIge1xuICAgIHJldHVybiB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7IG9uY2U6IGZhbHNlLCBmbjogbGlzdGVuZXIsIG1hdGNoZXM6IG1lc3NhZ2VNYXRjaGVyKHNlbGVjdG9yKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGlzIGludm9rZWQgZm9yIGV2ZXJ5IG1lc3NhZ2UgdGhlIGhvc3QgaGFuZGxlcyDigJRcbiAgICogYm90aCBub3RpZmljYXRpb25zIGFuZCByZXF1ZXN0cyDigJQgd2l0aCB0aGUgZGlzcG9zaXRpb24gdGhlIGhvc3QgY29tcHV0ZWRcbiAgICogZm9yIGl0IChpdHMgZWZmZWN0aXZlIGZvcm0gYWZ0ZXIgbGlzdGVuZXJzIGFuZCB3aGV0aGVyIGl0IHdhcyBkcm9wcGVkKS4gRm9yXG4gICAqIGEgcmVxdWVzdCwgdGhlIHJlc29sdmVkIGFuc3dlciBpcyB0aGUgZWZmZWN0aXZlIG1lc3NhZ2UncyBgZGVmYXVsdFJlc3BvbnNlYC5cbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgb2JzZXJ2ZXIuXG4gICAqXG4gICAqIEBzZWUgT2JzZXJ2YWJsZUlvSG9zdFxuICAgKi9cbiAgcHVibGljIG9ic2VydmVNZXNzYWdlcyhvYnNlcnZlcjogKG9ic2VydmF0aW9uOiBJb01lc3NhZ2VPYnNlcnZhdGlvbikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZU9ic2VydmVycy5hZGQob2JzZXJ2ZXIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VPYnNlcnZlcnMuZGVsZXRlKG9ic2VydmVyKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgYG9uYCwgYnV0IHRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYWZ0ZXIgaXQgaGFzIGJlZW5cbiAgICogaW52b2tlZCBvbmNlLlxuICAgKi9cbiAgcHVibGljIG9uY2U8VD4oXG4gICAgc2VsZWN0b3I6IElvTWVzc2FnZU1ha2VyPFQ+IHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PiB8ICgobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gbXNnIGlzIElvTWVzc2FnZTxUPiksXG4gICAgbGlzdGVuZXI6IChtc2c6IElvTWVzc2FnZTxUPikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlLFxuICApOiBEaXNwb3NlTGlzdGVuZXI7XG4gIHB1YmxpYyBvbmNlKFxuICAgIHByZWRpY2F0ZTogKG1zZzogSW9NZXNzYWdlPGFueT4pID0+IGJvb2xlYW4sXG4gICAgbGlzdGVuZXI6IChtc2c6IElvTWVzc2FnZTx1bmtub3duPikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlLFxuICApOiBEaXNwb3NlTGlzdGVuZXI7XG4gIHB1YmxpYyBvbmNlKHNlbGVjdG9yOiBNZXNzYWdlU2VsZWN0b3I8YW55PiwgbGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lckZuKTogRGlzcG9zZUxpc3RlbmVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGRNZXNzYWdlTGlzdGVuZXIoeyBvbmNlOiB0cnVlLCBmbjogbGlzdGVuZXIsIG1hdGNoZXM6IG1lc3NhZ2VNYXRjaGVyKHNlbGVjdG9yKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlcnkgbWVzc2FnZSBsaXN0ZW5lciByZWdpc3RlcmVkIHZpYSBgb25gL2BvbmNlYC9gcmV3cml0ZWAvYHJlc3BvbmRgLlxuICAgKlxuICAgKiBUaGUgaG9zdCdzIG93biBpbnRlcm5hbCBsaXN0ZW5lcnMgKHN1Y2ggYXMgc3RhY2stYWN0aXZpdHkgcm91dGluZykgYXJlIGtlcHQsXG4gICAqIHNvIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgYWZ0ZXJ3YXJkcy4gTWVzc2FnZSBvYnNlcnZlcnMgcmVnaXN0ZXJlZCB2aWFcbiAgICogYG9ic2VydmVNZXNzYWdlc2AgYXJlIGEgc2VwYXJhdGUgbWVjaGFuaXNtIGFuZCBhcmUgbm90IGFmZmVjdGVkLlxuICAgKlxuICAgKiBUaGlzIGlzIG1haW5seSB1c2VmdWwgZm9yIHRlc3RzIHRoYXQgc2hhcmUgdGhlIHNpbmdsZXRvbiBob3N0IGFuZCBuZWVkIHRvXG4gICAqIHJlc2V0IGxpc3RlbmVyIHN0YXRlIGJldHdlZW4gY2FzZXMgKGEgbGVmdG92ZXIgbGlzdGVuZXIgd291bGQgb3RoZXJ3aXNlXG4gICAqIGxlYWsgaW50byB0aGUgbmV4dCB0ZXN0KS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gRHJvcCB1c2VyIGxpc3RlbmVycyBpbiBwbGFjZSAocHJlc2VydmluZyBhcnJheSBpZGVudGl0eSBmb3IgYW55XG4gICAgLy8gb3V0c3RhbmRpbmcgZGlzcG9zZSBjbG9zdXJlcyk7IGtlZXAgdGhlIGhvc3QncyBpbnRlcm5hbCBsaXN0ZW5lcnMuXG4gICAgZm9yIChsZXQgaSA9IHRoaXMubWVzc2FnZUxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VMaXN0ZW5lcnNbaV0uaW50ZXJuYWwpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlTGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQW5zd2VyIGEgcmVxdWVzdCAoYnkgaXRzIGNvZGUpIG9uIHRoZSB1c2VyJ3MgYmVoYWxmIHdpdGggYSBmaXhlZCB2YWx1ZSwgc29cbiAgICogdGhlIGhvc3QgZG9lcyBub3QgcHJvbXB0LiBTeW50YWN0aWMgc3VnYXIgZm9yIGFuIGBvbmAgbGlzdGVuZXIgcmV0dXJuaW5nXG4gICAqIGB7IHJlc3BvbmQ6IHZhbHVlLCBwcmV2ZW50RGVmYXVsdDogc3VwcHJlc3NRdWVzdGlvbiB9YDsgZm9yIGNvbmRpdGlvbmFsXG4gICAqIGFuc3dlcnMgb3IgdG8gYWxzbyByZXdvcmQgdGhlIHF1ZXN0aW9uLCB1c2UgYG9uYC9gb25jZWAgZGlyZWN0bHkuIFJldHVybnMgYVxuICAgKiBmdW5jdGlvbiB0aGF0IHJlbW92ZXMgdGhlIHJlc3BvbmRlciBhZ2Fpbi5cbiAgICpcbiAgICogQHBhcmFtIHN1cHByZXNzUXVlc3Rpb24gLSB3aGV0aGVyIHRvIGFsc28gc3VwcHJlc3Mgd3JpdGluZyB0aGUgcXVlc3Rpb24gdGV4dC5cbiAgICogICBEZWZhdWx0cyB0byBgdHJ1ZWAgKGFuc3dlciBzaWxlbnRseSkuIFBhc3MgYGZhbHNlYCB0byBzdGlsbCBzdXJmYWNlIHRoZVxuICAgKiAgIHF1ZXN0aW9uIHdoaWxlIGFuc3dlcmluZyBpdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5kZXIgLS1mb3JjZSwgYXV0by1jb25maXJtIHRoZSBkZXN0cm95IHByb21wdCB3aXRob3V0IHByb21wdGluZy5cbiAgICogY29uc3QgZGlzcG9zZSA9IGlvSG9zdC5yZXNwb25kKElPLkNES19UT09MS0lUX0k3MDEwLCB0cnVlKTtcbiAgICovXG4gIHB1YmxpYyByZXNwb25kPFQsIFU+KGNvZGU6IElvUmVxdWVzdE1ha2VyPFQsIFU+LCB2YWx1ZTogVSwgc3VwcHJlc3NRdWVzdGlvbiA9IHRydWUpOiBEaXNwb3NlTGlzdGVuZXIge1xuICAgIHJldHVybiB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7IG9uY2U6IGZhbHNlLCBmbjogKCkgPT4gKHsgcmVzcG9uZDogdmFsdWUsIHByZXZlbnREZWZhdWx0OiBzdXBwcmVzc1F1ZXN0aW9uIH0pLCBtYXRjaGVzOiBtZXNzYWdlTWF0Y2hlcihjb2RlKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWtlIGByZXNwb25kYCwgYnV0IHRoZSBhbnN3ZXIgaXMgZ2l2ZW4gb25seSBvbmNlIGFuZCB0aGVuIHJlbW92ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVzcG9uZE9uY2U8VCwgVT4oY29kZTogSW9SZXF1ZXN0TWFrZXI8VCwgVT4sIHZhbHVlOiBVLCBzdXBwcmVzc1F1ZXN0aW9uID0gdHJ1ZSk6IERpc3Bvc2VMaXN0ZW5lciB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTWVzc2FnZUxpc3RlbmVyKHsgb25jZTogdHJ1ZSwgZm46ICgpID0+ICh7IHJlc3BvbmQ6IHZhbHVlLCBwcmV2ZW50RGVmYXVsdDogc3VwcHJlc3NRdWVzdGlvbiB9KSwgbWF0Y2hlczogbWVzc2FnZU1hdGNoZXIoY29kZSkgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBmb3JtYXR0ZXIgdGhhdCByZXBsYWNlcyB0aGUgcHJpbnRlZCB0ZXh0IG9mIG1lc3NhZ2VzIHdpdGggdGhlXG4gICAqIGdpdmVuIGNvZGUuIFRoaXMgbGV0cyBhIGNhbGxlciBkZWZpbmUgX2hvd18gYSB0b29sa2l0IG1lc3NhZ2UgaXMgcHJlc2VudGVkXG4gICAqIHdpdGhvdXQgdGhlIElvSG9zdCBuZWVkaW5nIHRvIGtub3cgYWJvdXQgaXQuXG4gICAqXG4gICAqIE9wdGlvbmFsbHkgcGFzcyBhIGBsZXZlbGAgdG8gYWxzbyBvdmVycmlkZSB0aGUgbWVzc2FnZSdzIGxldmVsICh3aGljaCBtb3Zlc1xuICAgKiBpdCBiZXR3ZWVuIHN0ZG91dC9zdGRlcnIgYW5kIGNoYW5nZXMgdmVyYm9zaXR5IGZpbHRlcmluZykuIEZvciB0aGUgcmFyZXJcbiAgICogY2FzZSBvZiBvdmVycmlkaW5nIG9ubHkgdGhlIGxldmVsLCB1c2UgYG9uYC9gb25jZWAgcmV0dXJuaW5nIGB7IGxldmVsIH1gLlxuICAgKlxuICAgKiBTeW50YWN0aWMgc3VnYXIgZm9yIGFuIGBvbmAgbGlzdGVuZXIgdGhhdCByZXR1cm5zIGB7IG1lc3NhZ2UsIGxldmVsPyB9YC5cbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgZm9ybWF0dGVyIGFnYWluLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBkaXNwb3NlID0gaW9Ib3N0LnJld3JpdGUoSU8uQ0RLX1RPT0xLSVRfSTI5MDEsIChtc2cpID0+XG4gICAqICAgc2VyaWFsaXplU3RydWN0dXJlKG1zZy5kYXRhLnN0YWNrcywgdHJ1ZSkpO1xuICAgKi9cbiAgcHVibGljIHJld3JpdGU8VD4oXG4gICAgY29kZTogSW9NZXNzYWdlTWFrZXI8VD4gfCBJb1JlcXVlc3RNYWtlcjxULCBhbnk+LFxuICAgIGZvcm1hdHRlcjogKG1zZzogSW9NZXNzYWdlPFQ+KSA9PiBzdHJpbmcsXG4gICAgbGV2ZWw/OiBJb01lc3NhZ2VMZXZlbCxcbiAgKTogRGlzcG9zZUxpc3RlbmVyIHtcbiAgICByZXR1cm4gdGhpcy5vbihjb2RlLCAobXNnKSA9PiAoeyBtZXNzYWdlOiBmb3JtYXR0ZXIobXNnKSwgLi4uKGxldmVsICE9PSB1bmRlZmluZWQgPyB7IGxldmVsIH0gOiB7fSkgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgYHJld3JpdGVgLCBidXQgdGhlIGZvcm1hdHRlciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYWZ0ZXIgaXQgaGFzXG4gICAqIGJlZW4gYXBwbGllZCBvbmNlLlxuICAgKi9cbiAgcHVibGljIHJld3JpdGVPbmNlPFQ+KFxuICAgIGNvZGU6IElvTWVzc2FnZU1ha2VyPFQ+IHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PixcbiAgICBmb3JtYXR0ZXI6IChtc2c6IElvTWVzc2FnZTxUPikgPT4gc3RyaW5nLFxuICAgIGxldmVsPzogSW9NZXNzYWdlTGV2ZWwsXG4gICk6IERpc3Bvc2VMaXN0ZW5lciB7XG4gICAgcmV0dXJuIHRoaXMub25jZShjb2RlLCAobXNnKSA9PiAoeyBtZXNzYWdlOiBmb3JtYXR0ZXIobXNnKSwgLi4uKGxldmVsICE9PSB1bmRlZmluZWQgPyB7IGxldmVsIH0gOiB7fSkgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRvIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIGEgcmVtb3ZlciBmb3IgaXQgKGNhbGxhYmxlIGFuZFxuICAgKiBgdXNpbmdgLWNvbXBhdGlibGUsIHNlZSBgRGlzcG9zZUxpc3RlbmVyYCkuXG4gICAqL1xuICBwcml2YXRlIGFkZE1lc3NhZ2VMaXN0ZW5lcihsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogRGlzcG9zZUxpc3RlbmVyIHtcbiAgICB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gZGlzcG9zZUxpc3RlbmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tZXNzYWdlTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlTGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGV2ZXJ5IHJlZ2lzdGVyZWQgbGlzdGVuZXIgdGhhdCBtYXRjaGVzIHRoZSBtZXNzYWdlLCBpbiByZWdpc3RyYXRpb25cbiAgICogb3JkZXIuIEEgbGlzdGVuZXIgbWF0Y2hlcyBieSBpdHMgY29kZSAobWFrZXIpIG9yIGl0cyBjdXN0b20gcHJlZGljYXRlLlxuICAgKlxuICAgKiBBIGxpc3RlbmVyIG1heSB1cGRhdGUgdGhlIG1lc3NhZ2UgdGV4dCwgbGV2ZWwsIGFuZC9vciBhY3Rpb24gKHBhc3NlZCBvbiB0b1xuICAgKiBzdWJzZXF1ZW50IGxpc3RlbmVycyBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBpcGVsaW5lKSwgcHJldmVudCB0aGUgZGVmYXVsdFxuICAgKiBwcm9jZXNzaW5nLCBvciAoZm9yIHJlcXVlc3RzKSBhbnN3ZXIgaXQuIGBvbmNlYCBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQgYWZ0ZXJcbiAgICogdGhleSBoYXZlIHJ1bi4gTWF0Y2hpbmcgaXMgZGVjaWRlZCBhZ2FpbnN0IHRoZSBtZXNzYWdlIGFzIGVtaXR0ZWQsIHNvIGFcbiAgICogdHJhbnNmb3JtYXRpb24gYnkgYW4gZWFybGllciBsaXN0ZW5lciBkb2VzIG5vdCBjaGFuZ2Ugd2hpY2ggbGF0ZXIgbGlzdGVuZXJzXG4gICAqIGFwcGx5LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgdXBkYXRlZCkgbWVzc2FnZSwgd2hldGhlciB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nIHdhc1xuICAgKiBwcmV2ZW50ZWQsIGFuZCB3aGV0aGVyIGEgbGlzdGVuZXIgYW5zd2VyZWQgdGhlIHJlcXVlc3QgKGFuZCB3aXRoIHdoYXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhcHBseU1lc3NhZ2VMaXN0ZW5lcnM8VCBleHRlbmRzIElvTWVzc2FnZTx1bmtub3duPj4obXNnOiBUKTogUHJvbWlzZTx7XG4gICAgbWVzc2FnZTogVDtcbiAgICBwcmV2ZW50RGVmYXVsdDogYm9vbGVhbjtcbiAgICByZXNwb25kZWQ6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBsZXQgY3VycmVudCA9IG1zZztcbiAgICBsZXQgcHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICBsZXQgcmVzcG9uZGVkID0gZmFsc2U7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGEgY29weSBzbyB0aGF0IGBvbmNlYCBsaXN0ZW5lcnMgY2FuIHJlbW92ZSB0aGVtc2VsdmVzIHNhZmVseS5cbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIFsuLi50aGlzLm1lc3NhZ2VMaXN0ZW5lcnNdKSB7XG4gICAgICAvLyBNYXRjaCBhZ2FpbnN0IHRoZSBlbWl0dGVkIG1lc3NhZ2U7IGEgbGlzdGVuZXIgcmVjZWl2ZXMgdGhlIGN1bXVsYXRpdmVseVxuICAgICAgLy8gdHJhbnNmb3JtZWQgYGN1cnJlbnRgIG1lc3NhZ2UuXG4gICAgICBpZiAoIWxpc3RlbmVyLm1hdGNoZXMobXNnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuZXJzIG1heSBiZSBhc3luYzsgYXdhaXQgZWFjaCBvbmUgYmVmb3JlIHJ1bm5pbmcgdGhlIG5leHQgc28gdGhlXG4gICAgICAvLyBjdW11bGF0aXZlIGVmZmVjdCBvbiB0aGUgbWVzc2FnZSBzdGF5cyBvcmRlci1kZXRlcm1pbmlzdGljLlxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGlzdGVuZXIuZm4oY3VycmVudCk7XG5cbiAgICAgIGlmIChsaXN0ZW5lci5vbmNlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tZXNzYWdlTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjdXJyZW50ID0geyAuLi5jdXJyZW50LCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQubGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGN1cnJlbnQgPSB7IC4uLmN1cnJlbnQsIGxldmVsOiByZXN1bHQubGV2ZWwgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY3VycmVudCA9IHsgLi4uY3VycmVudCwgYWN0aW9uOiByZXN1bHQuYWN0aW9uIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ3Jlc3BvbmQnIGluIHJlc3VsdCAmJiAnZGVmYXVsdFJlc3BvbnNlJyBpbiBtc2cpIHtcbiAgICAgICAgICAvLyBGb2xkIHRoZSBhbnN3ZXIgaW50byB0aGUgcmVxdWVzdCdzIGRlZmF1bHQgcmVzcG9uc2UgYW5kIG1hcmsgaXRcbiAgICAgICAgICAvLyBhbnN3ZXJlZCwgc28gd2Ugc2tpcCBwcm9tcHRpbmcgYW5kIHJlc29sdmUgd2l0aCB0aGlzIHZhbHVlLlxuICAgICAgICAgIGN1cnJlbnQgPSB7IC4uLmN1cnJlbnQsIGRlZmF1bHRSZXNwb25zZTogcmVzdWx0LnJlc3BvbmQgfTtcbiAgICAgICAgICByZXNwb25kZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbWVzc2FnZTogY3VycmVudCwgcHJldmVudERlZmF1bHQsIHJlc3BvbmRlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIHRoZSBob3N0IG9mIGEgbWVzc2FnZS5cbiAgICogVGhlIGNhbGxlciB3YWl0cyB1bnRpbCB0aGUgbm90aWZpY2F0aW9uIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBub3RpZnkobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1heWJlRW1pdFRlbGVtZXRyeShtc2cpO1xuXG4gICAgLy8gUnVuIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4gQSBsaXN0ZW5lciBtYXkgdXBkYXRlIHRoZSBtZXNzYWdlIHRleHQsXG4gICAgLy8gbGV2ZWwsIGFuZC9vciBhY3Rpb24gb3IgcHJldmVudCB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nIChlLmcuXG4gICAgLy8gc3RhY2stYWN0aXZpdHkgbWVzc2FnZXMgYXJlIHJvdXRlZCB0byB0aGUgYWN0aXZpdHkgcHJpbnRlciBhbmQgbm90XG4gICAgLy8gd3JpdHRlbiB0byBhIHN0cmVhbSkuXG4gICAgLy9cbiAgICAvLyBTa2lwIHRoaXMgd2hpbGUgcmVwbGF5aW5nIGNvcmtlZCBtZXNzYWdlczogdGhlIGxpc3RlbmVycyBhbHJlYWR5IHJhbiBvblxuICAgIC8vIHRoZSBmaXJzdCBwYXNzLCBhbmQgcnVubmluZyB0aGVtIGFnYWluIHdvdWxkIHJlLXRyYW5zZm9ybSBhblxuICAgIC8vIGFscmVhZHktdHJhbnNmb3JtZWQgbWVzc2FnZS5cbiAgICBjb25zdCB7IG1lc3NhZ2UsIHByZXZlbnREZWZhdWx0IH0gPSB0aGlzLmNvcmtSZXBsYXlpbmdcbiAgICAgID8geyBtZXNzYWdlOiBtc2csIHByZXZlbnREZWZhdWx0OiBmYWxzZSB9XG4gICAgICA6IGF3YWl0IHRoaXMuYXBwbHlNZXNzYWdlTGlzdGVuZXJzKG1zZyk7XG5cbiAgICAvLyBUZWxsIG9ic2VydmVycyBob3cgdGhpcyBtZXNzYWdlIHdhcyBoYW5kbGVkIChpdHMgZWZmZWN0aXZlIGZvcm0gYW5kXG4gICAgLy8gd2hldGhlciBpdCB3YXMgZHJvcHBlZCkuIFNraXBwZWQgd2hpbGUgcmVwbGF5aW5nIGNvcmtlZCBtZXNzYWdlcyBzbyBlYWNoXG4gICAgLy8gbWVzc2FnZSBpcyBvYnNlcnZlZCBleGFjdGx5IG9uY2UuXG4gICAgaWYgKCF0aGlzLmNvcmtSZXBsYXlpbmcpIHtcbiAgICAgIHRoaXMubm90aWZ5T2JzZXJ2ZXJzKHsgdHlwZTogJ25vdGlmeScsIGVtaXR0ZWQ6IG1zZywgZWZmZWN0aXZlOiBtZXNzYWdlLCBkcm9wcGVkOiBwcmV2ZW50RGVmYXVsdCB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldmVudERlZmF1bHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLndyaXRlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgZXZlcnkgcmVnaXN0ZXJlZCBtZXNzYWdlIG9ic2VydmVyIG9mIGhvdyBhIG1lc3NhZ2Ugb3IgcmVxdWVzdCB3YXNcbiAgICogaGFuZGxlZC4gQSBuby1vcCB3aGVuIG5vdGhpbmcgaXMgb2JzZXJ2aW5nIChpLmUuIG91dHNpZGUgb2YgdGVzdHMpLCBzbyB0aGVcbiAgICogc3Vycm91bmRpbmcgaG90IHBhdGhzIHBheSBub3RoaW5nIGluIHByb2R1Y3Rpb24uXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeU9ic2VydmVycyhvYnNlcnZhdGlvbjogSW9NZXNzYWdlT2JzZXJ2YXRpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlT2JzZXJ2ZXJzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvYnNlcnZlciBvZiB0aGlzLm1lc3NhZ2VPYnNlcnZlcnMpIHtcbiAgICAgIG9ic2VydmVyKG9ic2VydmF0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYSAoYWxyZWFkeSBsaXN0ZW5lci1wcm9jZXNzZWQpIG1lc3NhZ2UgdG8gaXRzIHRhcmdldCBzdHJlYW0sIGhvbm9yaW5nXG4gICAqIHRoZSBsb2cgbGV2ZWwgYW5kIGNvcmtlZC1sb2dnaW5nIGJ1ZmZlci4gU2hhcmVkIGJ5IGBub3RpZnlgIGFuZCB0aGVcbiAgICogbm9uLXByb21wdGluZyBgcmVxdWVzdFJlc3BvbnNlYCBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZU1lc3NhZ2UobWVzc2FnZTogSW9NZXNzYWdlPHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKCFpc01lc3NhZ2VSZWxldmFudEZvckxldmVsKG1lc3NhZ2UsIHRoaXMubG9nTGV2ZWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29ya2VkQ291bnRlciA+IDApIHtcbiAgICAgIHRoaXMuY29ya2VkTG9nZ2luZ0J1ZmZlci5wdXNoKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuZm9ybWF0TWVzc2FnZShtZXNzYWdlKTtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnNlbGVjdFN0cmVhbShtZXNzYWdlKTtcbiAgICBzdHJlYW0/LndyaXRlKG91dHB1dCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1heWJlRW1pdFRlbGVtZXRyeShtc2c6IElvTWVzc2FnZTx1bmtub3duPikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZWxlbWV0cnlFdmVudCA9IGV2ZW50RnJvbU1lc3NhZ2UobXNnKTtcbiAgICAgIGlmICh0ZWxlbWV0cnlFdmVudCkge1xuICAgICAgICBhd2FpdCB0aGlzLnRlbGVtZXRyeT8uZW1pdCh0ZWxlbWV0cnlFdmVudCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBhd2FpdCB0aGlzLmRlZmF1bHRzLnRyYWNlKGBFbWl0IFRlbGVtZXRyeSBGYWlsZWQgJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIHN0YWNrLWFjdGl2aXR5IG1lc3NhZ2VzIHRvIHRoZSBhY3Rpdml0eSBwcmludGVyIChwcm9ncmVzcyBiYXIgb3JcbiAgICogZXZlbnQgbGlzdCkgcmF0aGVyIHRoYW4gd3JpdGluZyB0aGVtIHRvIGEgc3RyZWFtLlxuICAgKlxuICAgKiBJbXBsZW1lbnRlZCBhcyBsaXN0ZW5lcnMgdGhhdCBoYW5kbGUgdGhlIG1lc3NhZ2UgdmlhIHRoZSBwcmludGVyIGFuZFxuICAgKiBwcmV2ZW50IHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcsIHNvIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSBkb2VzIG5vdCBhbHNvXG4gICAqIGVtaXQgdGhlbS4gVGhlIHByaW50ZXIgaXMgY3JlYXRlZCBsYXppbHkgb24gdGhlIGZpcnN0IHN0YWNrLWFjdGl2aXR5IG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIHJvdXRlU3RhY2tBY3Rpdml0eVRvUHJpbnRlcigpIHtcbiAgICBjb25zdCByb3V0ZSA9IChtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdCA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWN0aXZpdHlQcmludGVyKSB7XG4gICAgICAgIHRoaXMuYWN0aXZpdHlQcmludGVyID0gdGhpcy5tYWtlQWN0aXZpdHlQcmludGVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFjdGl2aXR5UHJpbnRlci5ub3RpZnkobXNnKTtcbiAgICAgIHJldHVybiB7IHByZXZlbnREZWZhdWx0OiB0cnVlIH07IC8vIGhhbmRsZWQgYnkgdGhlIHByaW50ZXI7IGRvbid0IGFsc28gd3JpdGUgdG8gYSBzdHJlYW1cbiAgICB9O1xuXG4gICAgLy8gQSBzaW5nbGUgaW50ZXJuYWwgbGlzdGVuZXIgKHNvIGl0IHN1cnZpdmVzIGByZW1vdmVBbGxMaXN0ZW5lcnMoKWAgYW5kIHRoZVxuICAgIC8vIGhvc3Qga2VlcHMgcm91dGluZyBzdGFjayBhY3Rpdml0eSkgbWF0Y2hpbmcgYW55IG9mIHRoZSBhY3Rpdml0eSBjb2Rlcy5cbiAgICB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7XG4gICAgICBvbmNlOiBmYWxzZSxcbiAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgZm46IHJvdXRlLFxuICAgICAgbWF0Y2hlczogbWF0Y2hBbnkoSU8uQ0RLX1RPT0xLSVRfSTU1MDEsIElPLkNES19UT09MS0lUX0k1NTAyLCBJTy5DREtfVE9PTEtJVF9JNTUwMyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHNwZWNpYWwgbWVzc2FnZXMgZW5jb2RlIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgb3Igbm90XG4gICAqIHRoZXkgcmVxdWlyZSBhcHByb3ZhbFxuICAgKi9cbiAgcHJpdmF0ZSBza2lwQXBwcm92YWxTdGVwKG1zZzogSW9SZXF1ZXN0PGFueSwgYW55Pik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFwcHJvdmFsVG9vbGtpdENvZGVzID0gWydDREtfVE9PTEtJVF9JNTA2MCddO1xuICAgIGlmICghKG1zZy5jb2RlICYmIGFwcHJvdmFsVG9vbGtpdENvZGVzLmluY2x1ZGVzKG1zZy5jb2RlKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMucmVxdWlyZURlcGxveUFwcHJvdmFsKSB7XG4gICAgICAvLyBOZXZlciByZXF1aXJlIGFwcHJvdmFsXG4gICAgICBjYXNlIFJlcXVpcmVBcHByb3ZhbC5ORVZFUjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAvLyBBbHdheXMgcmVxdWlyZSBhcHByb3ZhbFxuICAgICAgY2FzZSBSZXF1aXJlQXBwcm92YWwuQU5ZQ0hBTkdFOlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBSZXF1aXJlIGFwcHJvdmFsIGlmIGNoYW5nZXMgaW5jbHVkZSBicm9hZGVuaW5nIHBlcm1pc3Npb25zXG4gICAgICBjYXNlIFJlcXVpcmVBcHByb3ZhbC5CUk9BREVOSU5HOlxuICAgICAgICByZXR1cm4gWydub25lJywgJ25vbi1icm9hZGVuaW5nJ10uaW5jbHVkZXMobXNnLmRhdGE/LnBlcm1pc3Npb25DaGFuZ2VUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgb3V0cHV0IHN0cmVhbSwgYmFzZWQgb24gbWVzc2FnZSBhbmQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0U3RyZWFtKG1zZzogSW9NZXNzYWdlPGFueT4pOiBOb2RlSlMuV3JpdGVTdHJlYW0gfCB1bmRlZmluZWQge1xuICAgIGlmIChpc05vdGljZXNNZXNzYWdlKG1zZykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRTdHJlYW1PYmplY3QodGhpcy5ub3RpY2VzRGVzdGluYXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdFN0cmVhbUZyb21MZXZlbChtc2cubGV2ZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIG91dHB1dCBzdHJlYW0sIGJhc2VkIG9uIG1lc3NhZ2UgbGV2ZWwgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdFN0cmVhbUZyb21MZXZlbChsZXZlbDogSW9NZXNzYWdlTGV2ZWwpOiBOb2RlSlMuV3JpdGVTdHJlYW0ge1xuICAgIC8vIFRoZSBzdHJlYW0gc2VsZWN0aW9uIHBvbGljeSBmb3IgdGhlIENMSSBpcyB0aGUgZm9sbG93aW5nOlxuICAgIC8vXG4gICAgLy8gICAoMSkgTWVzc2FnZXMgb2YgbGV2ZWwgYHJlc3VsdGAgYWx3YXlzIGdvIHRvIGBzdGRvdXRgXG4gICAgLy8gICAoMikgTWVzc2FnZXMgb2YgbGV2ZWwgYGVycm9yYCBhbHdheXMgZ28gdG8gYHN0ZGVycmAuXG4gICAgLy8gICAoM2EpIEFsbCByZW1haW5pbmcgbWVzc2FnZXMgZ28gdG8gYHN0ZGVycmAuXG4gICAgLy8gICAoM2IpIElmIHdlIGFyZSBpbiBDSSBtb2RlLCBhbGwgcmVtYWluaW5nIG1lc3NhZ2VzIGdvIHRvIGBzdGRvdXRgLlxuICAgIC8vXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRlcnI7XG4gICAgICBjYXNlICdyZXN1bHQnOlxuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5pc0NJID8gcHJvY2Vzcy5zdGRvdXQgOiBwcm9jZXNzLnN0ZGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgdGhlIGhvc3Qgb2YgYSBtZXNzYWdlIHRoYXQgcmVxdWlyZXMgYSByZXNwb25zZS5cbiAgICpcbiAgICogUmVnaXN0ZXJlZCBsaXN0ZW5lcnMgcnVuIGZpcnN0OiBhIGxpc3RlbmVyIG1heSByZXdvcmQgdGhlIHF1ZXN0aW9uIChpdHMgdGV4dFxuICAgKiBvciBsZXZlbCkgb3IgYW5zd2VyIGl0IG91dHJpZ2h0IHZpYSBgcmVzcG9uZGAgKGUuZy4gYC0tZm9yY2VgIGF1dG8tY29uZmlybXNcbiAgICogYSBkZXN0cm95KS4gSWYgbm8gbGlzdGVuZXIgYW5zd2VycyBhbmQgdGhlIGhvc3QgY2Fubm90IHByb21wdCwgdGhlIHN1Z2dlc3RlZFxuICAgKiBkZWZhdWx0IHJlc3BvbnNlIGlzIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdFJlc3BvbnNlPERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KG1zZzogSW9SZXF1ZXN0PERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KTogUHJvbWlzZTxSZXNwb25zZVR5cGU+IHtcbiAgICAvLyBMaXN0ZW5lcnMgcnVuIGV4YWN0bHkgb25jZSBoZXJlIChzbyB3ZSBkb24ndCBnbyBiYWNrIHRocm91Z2ggYG5vdGlmeWApOlxuICAgIC8vIHRoZXkgbWF5IGFuc3dlciB0aGUgcmVxdWVzdCwgb3IgcmV3b3JkL3JlbGV2ZWwvcmV0YWcgdGhlIHF1ZXN0aW9uIHNob3duIGJlbG93LlxuICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ubGlzdGVuZXJSZXN1bHQgfSA9IGF3YWl0IHRoaXMuYXBwbHlNZXNzYWdlTGlzdGVuZXJzKG1zZyk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJlcXVlc3QobWVzc2FnZSwgbGlzdGVuZXJSZXN1bHQpO1xuXG4gICAgLy8gVGVsbCBvYnNlcnZlcnMgaG93IHRoaXMgcmVxdWVzdCB3YXMgaGFuZGxlZDogdGhlIGVmZmVjdGl2ZSAocG9zc2libHkgcmV3b3JkZWQpIHF1ZXN0aW9uXG4gICAgLy8gYW5kIHRoZSByZXNvbHZlZCByZXNwb25zZS4gV2hlbiBhIGxpc3RlbmVyIGFuc3dlcmVkIHRoZSByZXF1ZXN0IHdpdGggdGhlIHF1ZXN0aW9uIHN1cHByZXNzZWRcbiAgICAvLyAoYHByZXZlbnREZWZhdWx0YCwgZS5nLiBgLS1mb3JjZWAgYXV0by1jb25maXJtKSwgaXQgaXMgcmVwb3J0ZWQgYXMgYGRyb3BwZWRgIHNpbmNlIHRoZSB1c2VyIG5ldmVyIHNhdyBpdC5cbiAgICB0aGlzLm5vdGlmeU9ic2VydmVycyh7IHR5cGU6ICdyZXF1ZXN0JywgZW1pdHRlZDogbXNnLCBlZmZlY3RpdmU6IG1lc3NhZ2UsIGRyb3BwZWQ6IGxpc3RlbmVyUmVzdWx0LnByZXZlbnREZWZhdWx0IH0pO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSByZXF1ZXN0IHRvIGl0cyByZXNwb25zZTogYSBsaXN0ZW5lcidzIGFuc3dlciBpZiBvbmUgd2FzIGdpdmVuLFxuICAgKiBvdGhlcndpc2UgdGhlIGFuc3dlciBwcm9tcHRlZCBmcm9tIHRoZSB1c2VyLCBvdGhlcndpc2UgdGhlIHN1Z2dlc3RlZFxuICAgKiBkZWZhdWx0IHdoZW4gdGhlIGhvc3QgY2Fubm90IHByb21wdC5cbiAgICpcbiAgICogS2VwdCBzZXBhcmF0ZSBmcm9tIGByZXF1ZXN0UmVzcG9uc2VgIHNvIHRoZSByZXNwb25zZSBjYW4gYmUgb2JzZXJ2ZWQgaW4gYVxuICAgKiBzaW5nbGUgcGxhY2UgcmVnYXJkbGVzcyBvZiB3aGljaCBvZiB0aGVzZSBwYXRocyBwcm9kdWNlZCBpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlcXVlc3Q8RGF0YVR5cGUsIFJlc3BvbnNlVHlwZT4oXG4gICAgbXNnOiBJb1JlcXVlc3Q8RGF0YVR5cGUsIFJlc3BvbnNlVHlwZT4sXG4gICAgbGlzdGVuZXJSZXN1bHQ6IHsgcHJldmVudERlZmF1bHQ6IGJvb2xlYW47IHJlc3BvbmRlZDogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPFJlc3BvbnNlVHlwZT4ge1xuICAgIC8vIHN0b3AgcHJvY2Vzc2luZywgYSBsaXN0ZW5lciBoYXMgdGFrZW4gY2FyZSBvZiBpdFxuICAgIGlmIChsaXN0ZW5lclJlc3VsdC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBsaXN0ZW5lciBwcm92aWRlZCBhIHJlc3BvbnNlLCB3ZSBza2lwIGludGVyYWN0aW9uXG4gICAgaWYgKCFpc1Byb21wdGFibGVSZXF1ZXN0KG1zZykgfHwgbGlzdGVuZXJSZXN1bHQucmVzcG9uZGVkKSB7XG4gICAgICB0aGlzLndyaXRlTWVzc2FnZShtc2cpO1xuICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLndpdGhDb3JrZWRMb2dnaW5nKGFzeW5jICgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ID0+IHtcbiAgICAgIC8vIHByZXBhcmUgcHJvbXB0IGRhdGFcbiAgICAgIC8vIEB0b2RvIHRoaXMgZm9ybWF0IGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLCBwcm9iYWJseSBzaG91bGQgYmVcbiAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgbW90aXZhdGlvbj86IHN0cmluZztcbiAgICAgICAgY29uY3VycmVuY3k/OiBudW1iZXI7XG4gICAgICAgIHJlc3BvbnNlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICB9ID0gbXNnLmRhdGEgPz8ge307XG5cbiAgICAgIGNvbnN0IG1vdGl2YXRpb24gPSBkYXRhLm1vdGl2YXRpb24gPz8gJ1VzZXIgaW5wdXQgaXMgbmVlZGVkJztcbiAgICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gZGF0YS5jb25jdXJyZW5jeSA/PyAwO1xuICAgICAgY29uc3QgcmVzcG9uc2VEZXNjcmlwdGlvbiA9IGRhdGEucmVzcG9uc2VEZXNjcmlwdGlvbjtcblxuICAgICAgLy8gU3BlY2lhbCBhcHByb3ZhbCBwcm9tcHRcbiAgICAgIC8vIERldGVybWluZSBpZiB0aGUgbWVzc2FnZSBuZWVkcyBhcHByb3ZhbC4gSWYgaXQgZG9lcywgY29udGludWUgKGl0IGlzIGEgYmFzaWMgY29uZmlybWF0aW9uIHByb21wdClcbiAgICAgIC8vIElmIGl0IGRvZXMgbm90LCByZXR1cm4gc3VjY2VzcyAodHJ1ZSkuIFdlIG9ubHkgY2hlY2sgbWVzc2FnZXMgd2l0aCBjb2RlcyB0aGF0IHdlIGFyZSBhd2FyZVxuICAgICAgLy8gYXJlIHJlcXVpcmVzIGFwcHJvdmFsIGNvZGVzLlxuICAgICAgaWYgKHRoaXMuc2tpcEFwcHJvdmFsU3RlcChtc2cpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiAtLXllcyBtb2RlLCByZXNwb25kIGZvciB0aGUgdXNlciBpZiB3ZSBjYW5cbiAgICAgIGlmICh0aGlzLmF1dG9SZXNwb25kKSB7XG4gICAgICAgIC8vIHJlc3BvbmQgd2l0aCB5ZXMgdG8gYWxsIGNvbmZpcm1hdGlvbnNcbiAgICAgICAgaWYgKGlzQ29uZmlybWF0aW9uUHJvbXB0KG1zZykpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlTWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tc2csXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHtjaGFsay5jeWFuKG1zZy5tZXNzYWdlKX0gKGF1dG8tY29uZmlybWVkKWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXNwb25kIHdpdGggdGhlIGRlZmF1bHQgZm9yIGFsbCBvdGhlciBtZXNzYWdlc1xuICAgICAgICBpZiAobXNnLmRlZmF1bHRSZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy53cml0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubXNnLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7Y2hhbGsuY3lhbihtc2cubWVzc2FnZSl9IChhdXRvLXJlc3BvbmRlZCB3aXRoIGRlZmF1bHQ6ICR7dXRpbC5mb3JtYXQobXNnLmRlZmF1bHRSZXNwb25zZSl9KWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb25seSB0YWxrIHRvIHVzZXIgaWYgU1RESU4gaXMgYSB0ZXJtaW5hbCAob3RoZXJ3aXNlLCBmYWlsKVxuICAgICAgaWYgKCF0aGlzLmlzVFRZKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1R0eU5vdEF0dGFjaGVkJywgYCR7bW90aXZhdGlvbn0sIGJ1dCB0ZXJtaW5hbCAoVFRZKSBpcyBub3QgYXR0YWNoZWQgc28gd2UgYXJlIHVuYWJsZSB0byBnZXQgYSBjb25maXJtYXRpb24gZnJvbSB0aGUgdXNlcmApO1xuICAgICAgfVxuXG4gICAgICAvLyBvbmx5IHRhbGsgdG8gdXNlciBpZiBjb25jdXJyZW5jeSBpcyAxIChvdGhlcndpc2UsIGZhaWwpXG4gICAgICBpZiAoY29uY3VycmVuY3kgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0NvbmN1cnJlbmN5Q29uZmxpY3QnLCBgJHttb3RpdmF0aW9ufSwgYnV0IGNvbmN1cnJlbmN5IGlzIGdyZWF0ZXIgdGhhbiAxIHNvIHdlIGFyZSB1bmFibGUgdG8gZ2V0IGEgY29uZmlybWF0aW9uIGZyb20gdGhlIHVzZXJgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQmFzaWMgY29uZmlybWF0aW9uIHByb21wdFxuICAgICAgLy8gV2UgdHJlYXQgYWxsIHJlcXVlc3RzIHdpdGggYSBib29sZWFuIHJlc3BvbnNlIGFzIGNvbmZpcm1hdGlvbiBwcm9tcHRzXG4gICAgICAvLyBUaGUgSW9Ib3N0IG5ldmVyIGFib3J0cyBvbiBhIFwibm9cIjogaXQgcmV0dXJucyB0aGUgYW5zd2VyIGFuZCBsZXRzIHRoZVxuICAgICAgLy8gY2FsbGluZyBhY3Rpb24gZGVjaWRlIHdoYXQgdG8gZG8gKHNvIGFib3J0IGhhbmRsaW5nIGlzIGNvbnNpc3RlbnRcbiAgICAgIC8vIGFjcm9zcyBhY3Rpb25zKS5cbiAgICAgIGlmIChpc0NvbmZpcm1hdGlvblByb21wdChtc2cpKSB7XG4gICAgICAgIHJldHVybiBwcm9tcHRseS5jb25maXJtKGAke2NoYWxrLmN5YW4obXNnLm1lc3NhZ2UpfSAoeS9uKWApO1xuICAgICAgfVxuXG4gICAgICAvLyBBc2tpbmcgZm9yIGEgc3BlY2lmaWMgdmFsdWVcbiAgICAgIGNvbnN0IHByb21wdCA9IGV4dHJhY3RQcm9tcHRJbmZvKG1zZyk7XG4gICAgICBjb25zdCBkZXNjID0gcmVzcG9uc2VEZXNjcmlwdGlvbiA/PyBwcm9tcHQuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IHByb21wdGx5LnByb21wdChgJHtjaGFsay5jeWFuKG1zZy5tZXNzYWdlKX0ke2Rlc2MgPyBgICgke2Rlc2N9KWAgOiAnJ31gLCB7XG4gICAgICAgIGRlZmF1bHQ6IHByb21wdC5kZWZhdWx0LFxuICAgICAgICB0cmltOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJvbXB0LmNvbnZlcnRBbnN3ZXIoYW5zd2VyKTtcbiAgICB9KTtcblxuICAgIC8vIFdlIG5lZWQgdG8gY2FzdCB0aGlzIGJlY2F1c2UgaXQgaXMgaW1wb3NzaWJsZSB0byBuYXJyb3cgdGhlIGdlbmVyaWMgdHlwZVxuICAgIC8vIGlzUHJvbXB0YWJsZVJlcXVlc3QgZW5zdXJlcyB0aGF0IHRoZSByZXNwb25zZSB0eXBlIGlzIG9uZSB3ZSBjYW4gcHJvbXB0IGZvclxuICAgIC8vIHRoZSByZW1haW5pbmcgY29kZSBlbnN1cmUgd2UgYXJlIGluZGVlZCByZXR1cm5pbmcgdGhlIGNvcnJlY3QgdHlwZVxuICAgIHJldHVybiByZXNwb25zZSBhcyBSZXNwb25zZVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBhIG1lc3NhZ2UgZm9yIGNvbnNvbGUgb3V0cHV0IHdpdGggb3B0aW9uYWwgY29sb3Igc3VwcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRNZXNzYWdlKG1zZzogSW9NZXNzYWdlPHVua25vd24+KTogc3RyaW5nIHtcbiAgICAvLyBhcHBseSBwcm92aWRlZCBzdHlsZSBvciBhIGRlZmF1bHQgc3R5bGUgaWYgd2UncmUgaW4gVFRZIG1vZGVcbiAgICBsZXQgbWVzc2FnZV90ZXh0O1xuICAgIGlmIChtc2cuY29kZSA9PT0gJ0NES19UT09MS0lUX0U5NjAwJykge1xuICAgICAgLy8gTWVzc2FnZSBpcyBwcmUtc3R5bGVkXG4gICAgICBtZXNzYWdlX3RleHQgPSBtc2cubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzc2FnZV90ZXh0ID0gdGhpcy5pc1RUWVxuICAgICAgICA/IHN0eWxlTWFwW21zZy5sZXZlbF0obXNnLm1lc3NhZ2UpXG4gICAgICAgIDogbXNnLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gcHJlcGVuZCB0aW1lc3RhbXAgaWYgSW9NZXNzYWdlTGV2ZWwgaXMgREVCVUcgb3IgVFJBQ0UuIFBvc3RwZW5kIGEgbmV3bGluZS5cbiAgICByZXR1cm4gKChtc2cubGV2ZWwgPT09ICdkZWJ1ZycgfHwgbXNnLmxldmVsID09PSAndHJhY2UnKVxuICAgICAgPyBgWyR7dGhpcy5mb3JtYXRUaW1lKG1zZy50aW1lKX1dICR7bWVzc2FnZV90ZXh0fWBcbiAgICAgIDogbWVzc2FnZV90ZXh0KSArICdcXG4nO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgZGF0ZSB0byBISDpNTTpTU1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKGQ6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhZCA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke3BhZChkLmdldEhvdXJzKCkpfToke3BhZChkLmdldE1pbnV0ZXMoKSl9OiR7cGFkKGQuZ2V0U2Vjb25kcygpKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSBvZiB0aGUgQWN0aXZpdHlQcmludGVyXG4gICAqL1xuICBwcml2YXRlIG1ha2VBY3Rpdml0eVByaW50ZXIoKSB7XG4gICAgY29uc3QgcHJvcHM6IEFjdGl2aXR5UHJpbnRlclByb3BzID0ge1xuICAgICAgc3RyZWFtOiB0aGlzLnNlbGVjdFN0cmVhbUZyb21MZXZlbCgnaW5mbycpLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMuc3RhY2tQcm9ncmVzcykge1xuICAgICAgY2FzZSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVZFTlRTOlxuICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlBY3Rpdml0eVByaW50ZXIocHJvcHMpO1xuICAgICAgY2FzZSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSOlxuICAgICAgICByZXR1cm4gbmV3IEN1cnJlbnRBY3Rpdml0eVByaW50ZXIocHJvcHMpO1xuICAgICAgY2FzZSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVJST1JTX09OTFk6XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3JzT25seUFjdGl2aXR5UHJpbnRlcihwcm9wcyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIGBNZXNzYWdlU2VsZWN0b3JgIGludG8gYSBwcmVkaWNhdGUgdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBsaXN0ZW5lclxuICogYXBwbGllcyB0byBhIG1lc3NhZ2UuIEEgbWFrZXIgbWF0Y2hlcyBtZXNzYWdlcyBjYXJyeWluZyBpdHMgYGNvZGVgOyBhXG4gKiBwcmVkaWNhdGUgKGUuZy4gYSBtYWtlcidzIGAuaXNgLCBvciBhbnkgYChtc2cpID0+IGJvb2xlYW5gKSBpcyB1c2VkIGFzLWlzLlxuICovXG5mdW5jdGlvbiBtZXNzYWdlTWF0Y2hlcihzZWxlY3RvcjogTWVzc2FnZVNlbGVjdG9yPGFueT4pOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG4gIGNvbnN0IHsgY29kZSB9ID0gc2VsZWN0b3I7XG4gIHJldHVybiAobXNnKSA9PiBtc2cuY29kZSA9PT0gY29kZTtcbn1cblxuLyoqXG4gKiBDb21iaW5lIHNldmVyYWwgc2VsZWN0b3JzIGludG8gYSBzaW5nbGUgcHJlZGljYXRlIHRoYXQgbWF0Y2hlcyBhIG1lc3NhZ2Ugd2hlblxuICogKmFueSogb2YgdGhlbSBtYXRjaGVzLiBFYWNoIHNlbGVjdG9yIG1heSBiZSBhIG1ha2VyIChtYXRjaGVkIGJ5IGl0cyBgY29kZWApXG4gKiBvciBhIHByZWRpY2F0ZS5cbiAqXG4gKiBVc2VmdWwgZm9yIG9uZSBsaXN0ZW5lciB0aGF0IHNwYW5zIG11bHRpcGxlIGNvZGVzLCBlLmcuXG4gKiBgaW9Ib3N0Lm9uKG1hdGNoQW55KElPLkNES19UT09MS0lUX0k1NTAxLCBJTy5DREtfVE9PTEtJVF9JNTUwMiksIGxpc3RlbmVyKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEFueSguLi5zZWxlY3RvcnM6IE1lc3NhZ2VTZWxlY3Rvcjxhbnk+W10pOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IGJvb2xlYW4ge1xuICBjb25zdCBtYXRjaGVycyA9IHNlbGVjdG9ycy5tYXAobWVzc2FnZU1hdGNoZXIpO1xuICByZXR1cm4gKG1zZykgPT4gbWF0Y2hlcnMuc29tZSgobWF0Y2hlcykgPT4gbWF0Y2hlcyhtc2cpKTtcbn1cblxuLyoqXG4gKiBNZXRob2QgZGVjb3JhdG9yIHRoYXQgc3VwcHJlc3NlcyB0aGUgZ2l2ZW4gSW9Ib3N0IG1lc3NhZ2VzIGZvciB0aGUgZHVyYXRpb25cbiAqIG9mIHRoZSBkZWNvcmF0ZWQgbWV0aG9kLlxuICpcbiAqIEJlZm9yZSB0aGUgbWV0aG9kIHJ1bnMsIGEgc2luZ2xlIGBwcmV2ZW50RGVmYXVsdGAgbGlzdGVuZXIgY292ZXJpbmcgYWxsXG4gKiBnaXZlbiBzZWxlY3RvcnMgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgaW5zdGFuY2UncyBgaW9Ib3N0YDsgd2hlbiB0aGUgbWV0aG9kXG4gKiBzZXR0bGVzIChyZXR1cm5zIG9yIHRocm93cyksIGV4YWN0bHkgdGhhdCBsaXN0ZW5lciBpcyByZW1vdmVkIGFnYWluLiBUaGlzXG4gKiByZXBsYWNlcyB0aGUgbWFudWFsIHBhdHRlcm4gb2YgcmVnaXN0ZXJpbmcgZHJvcC1saXN0ZW5lcnMgYXQgdGhlIHRvcCBvZiBhXG4gKiBtZXRob2QgYW5kIGNsZWFuaW5nIHRoZW0gdXAgaW4gYSBgZmluYWxseWAsIGFuZCDigJQgdW5saWtlIGEgYmxhbmtldFxuICogYHJlbW92ZUFsbExpc3RlbmVycygpYCDigJQgaXQgZG9lcyBub3QgZGlzdHVyYiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBlbHNld2hlcmUuXG4gKlxuICogVGhlIGRlY29yYXRlZCBtZXRob2QgbXVzdCBiZSBhc3luYyBhbmQgbGl2ZSBvbiBhIGNsYXNzIHdob3NlIGluc3RhbmNlcyBjYXJyeVxuICogdGhlIGBDbGlJb0hvc3RgIG9uIGFuIGBpb0hvc3RgIHByb3BlcnR5IChsaWtlIGBDZGtUb29sa2l0YCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIENka1Rvb2xraXQge1xuICogICBcXEBzdXBwcmVzc01lc3NhZ2VzKElPLkNES19UT09MS0lUX0kxMDAxLCBJTy5DREtfVE9PTEtJVF9JMTAwMClcbiAqICAgcHVibGljIGFzeW5jIG1ldGFkYXRhKHN0YWNrTmFtZTogc3RyaW5nLCBqc29uOiBib29sZWFuKSB7XG4gKiAgICAgLy8gSTEwMDEvSTEwMDAgYXJlIGRyb3BwZWQgd2hpbGUgdGhpcyBydW5zXG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHByZXNzTWVzc2FnZXMoLi4uc2VsZWN0b3JzOiBNZXNzYWdlU2VsZWN0b3I8YW55PltdKSB7XG4gIHJldHVybiBmdW5jdGlvbiA8QSBleHRlbmRzIGFueVtdLCBSPihcbiAgICBfdGFyZ2V0OiBvYmplY3QsXG4gICAgX3Byb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8KC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgaWYgKCFvcmlnaW5hbCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignSW52YWxpZERlY29yYXRvclRhcmdldCcsICdzdXBwcmVzc01lc3NhZ2VzIGNhbiBvbmx5IGRlY29yYXRlIG1ldGhvZHMnKTtcbiAgICB9XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiB7IHJlYWRvbmx5IGlvSG9zdDogQ2xpSW9Ib3N0IH0sIC4uLmFyZ3M6IEEpOiBQcm9taXNlPFI+IHtcbiAgICAgIHVzaW5nIF9zdXBwcmVzcyA9IHRoaXMuaW9Ib3N0Lm9uKG1hdGNoQW55KC4uLnNlbGVjdG9ycyksICgpID0+ICh7IHByZXZlbnREZWZhdWx0OiB0cnVlIH0pKTtcbiAgICAgIC8vIGByZXR1cm4gYXdhaXRgIChub3QgYSBiYXJlIGByZXR1cm5gKSBzbyB0aGUgbGlzdGVuZXIgaXMgb25seSBkaXNwb3NlZFxuICAgICAgLy8gYWZ0ZXIgdGhlIG1ldGhvZCBoYXMgYWN0dWFsbHkgc2V0dGxlZC5cbiAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgSW9Ib3N0IGltcGxlbWVudGF0aW9uIGNvbnNpZGVycyBhIHJlcXVlc3QgcHJvbXB0YWJsZSwgaWY6XG4gKiAtIGl0J3MgYSB5ZXMvbm8gY29uZmlybWF0aW9uXG4gKiAtIGFza2luZyBmb3IgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGlzUHJvbXB0YWJsZVJlcXVlc3QobXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KTogbXNnIGlzIElvUmVxdWVzdDxhbnksIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+IHtcbiAgcmV0dXJuIGlzQ29uZmlybWF0aW9uUHJvbXB0KG1zZylcbiAgICB8fCB0eXBlb2YgbXNnLmRlZmF1bHRSZXNwb25zZSA9PT0gJ3N0cmluZydcbiAgICB8fCB0eXBlb2YgbXNnLmRlZmF1bHRSZXNwb25zZSA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgYSBjb25maXJtYXRpb24gcHJvbXB0XG4gKiBXZSB0cmVhdCBhbGwgcmVxdWVzdHMgd2l0aCBhIGJvb2xlYW4gcmVzcG9uc2UgYXMgY29uZmlybWF0aW9uIHByb21wdHNcbiAqL1xuZnVuY3Rpb24gaXNDb25maXJtYXRpb25Qcm9tcHQobXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KTogbXNnIGlzIElvUmVxdWVzdDxhbnksIGJvb2xlYW4+IHtcbiAgcmV0dXJuIHR5cGVvZiBtc2cuZGVmYXVsdFJlc3BvbnNlID09PSAnYm9vbGVhbic7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZm9yIHByb21wdGx5IGZyb20gdGhlIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFByb21wdEluZm8obXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KToge1xuICBkZWZhdWx0OiBzdHJpbmc7XG4gIGRlZmF1bHREZXNjOiBzdHJpbmc7XG4gIGNvbnZlcnRBbnN3ZXI6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmcgfCBudW1iZXI7XG59IHtcbiAgY29uc3QgaXNOdW1iZXIgPSAodHlwZW9mIG1zZy5kZWZhdWx0UmVzcG9uc2UgPT09ICdudW1iZXInKTtcbiAgY29uc3QgZGVmYXVsdFJlc3BvbnNlID0gdXRpbC5mb3JtYXQobXNnLmRlZmF1bHRSZXNwb25zZSk7XG4gIHJldHVybiB7XG4gICAgZGVmYXVsdDogZGVmYXVsdFJlc3BvbnNlLFxuICAgIGRlZmF1bHREZXNjOiAnZGVmYXVsdERlc2NyaXB0aW9uJyBpbiBtc2cgJiYgbXNnLmRlZmF1bHREZXNjcmlwdGlvbiA/IHV0aWwuZm9ybWF0KG1zZy5kZWZhdWx0RGVzY3JpcHRpb24pIDogZGVmYXVsdFJlc3BvbnNlLFxuICAgIGNvbnZlcnRBbnN3ZXI6IGlzTnVtYmVyID8gKHYpID0+IE51bWJlcih2KSA6ICh2KSA9PiBTdHJpbmcodiksXG4gIH07XG59XG5cbmNvbnN0IHN0eWxlTWFwOiBSZWNvcmQ8SW9NZXNzYWdlTGV2ZWwsIChzdHI6IHN0cmluZykgPT4gc3RyaW5nPiA9IHtcbiAgZXJyb3I6IGNoYWxrLnJlZCxcbiAgd2FybjogY2hhbGsueWVsbG93LFxuICByZXN1bHQ6IGNoYWxrLnJlc2V0LFxuICBpbmZvOiBjaGFsay5yZXNldCxcbiAgZGVidWc6IGNoYWxrLmdyYXksXG4gIHRyYWNlOiBjaGFsay5ncmF5LFxufTtcblxuZnVuY3Rpb24gdGFyZ2V0U3RyZWFtT2JqZWN0KHg6IFRhcmdldFN0cmVhbSk6IE5vZGVKUy5Xcml0ZVN0cmVhbSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoeCkge1xuICAgIGNhc2UgJ3N0ZGVycic6XG4gICAgICByZXR1cm4gcHJvY2Vzcy5zdGRlcnI7XG4gICAgY2FzZSAnc3Rkb3V0JzpcbiAgICAgIHJldHVybiBwcm9jZXNzLnN0ZG91dDtcbiAgICBjYXNlICdkcm9wJzpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb3RpY2VzTWVzc2FnZShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IG1zZyBpcyBJb01lc3NhZ2U8dm9pZD4ge1xuICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfSTAxMDAuaXMobXNnKSB8fCBJTy5DREtfVE9PTEtJVF9XMDEwMS5pcyhtc2cpIHx8IElPLkNES19UT09MS0lUX0UwMTAxLmlzKG1zZykgfHwgSU8uQ0RLX1RPT0xLSVRfSTAxMDEuaXMobXNnKTtcbn1cblxuZnVuY3Rpb24gZXZlbnRGcm9tTWVzc2FnZShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IFRlbGVtZXRyeUV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgaWYgKENMSV9QUklWQVRFX0lPLkNES19DTElfSTEwMDEuaXMobXNnKSkge1xuICAgIHJldHVybiBldmVudFJlc3VsdCgnU1lOVEgnLCBtc2cpO1xuICB9XG4gIGlmIChDTElfUFJJVkFURV9JTy5DREtfQ0xJX0kyMDAxLmlzKG1zZykpIHtcbiAgICByZXR1cm4gZXZlbnRSZXN1bHQoJ0lOVk9LRScsIG1zZyk7XG4gIH1cbiAgaWYgKENMSV9QUklWQVRFX0lPLkNES19DTElfSTMwMDEuaXMobXNnKSkge1xuICAgIHJldHVybiBldmVudFJlc3VsdCgnREVQTE9ZJywgbXNnKTtcbiAgfVxuICBpZiAoQ0xJX1BSSVZBVEVfSU8uQ0RLX0NMSV9JMzAwMy5pcyhtc2cpKSB7XG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0KCdBU1NFVCcsIG1zZyk7XG4gIH1cbiAgLy8gSG90c3dhcCBsaXZlcyBpbiB0aGUgY2RrLXRvb2xraXQgc28gaXQgY2Fubm90IGJlIGEgQ0RLX0NMSSBlcnJvciBjb2RlLlxuICAvLyBJbnN0ZWFkIHdlIHJldXNlIHRoZSBleGlzdGluZyBIb3Rzd2FwIHNwYW4uXG4gIGlmIChJTy5DREtfVE9PTEtJVF9JNTQxMC5pcyhtc2cpKSB7XG4gICAgLy8gQ3JlYXRlIGEgdGVsZW1ldHJ5LWNvbXBhdGlibGUgcmVzdWx0XG4gICAgcmV0dXJuIGhvdHN3YXBUb0V2ZW50UmVzdWx0KG1zZy5kYXRhKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGV2ZW50UmVzdWx0KGV2ZW50VHlwZTogVGVsZW1ldHJ5RXZlbnRbJ2V2ZW50VHlwZSddLCBtOiBJb01lc3NhZ2U8RXZlbnRSZXN1bHQ+KTogVGVsZW1ldHJ5RXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudFR5cGUsXG4gICAgICBkdXJhdGlvbjogbS5kYXRhLmR1cmF0aW9uLFxuICAgICAgZXJyb3I6IG0uZGF0YS5lcnJvcixcbiAgICAgIGNvdW50ZXJzOiBtLmRhdGEuY291bnRlcnMsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBob3Rzd2FwVG9FdmVudFJlc3VsdChyZXN1bHQ6IEhvdHN3YXBSZXN1bHQpOiBUZWxlbWV0cnlFdmVudCB7XG4gIGNvbnN0IG5vbkhvdHN3YXBwYWJsZVJlc291cmNlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICBmb3IgKGNvbnN0IHsgc3ViamVjdCB9IG9mIHJlc3VsdC5ub25Ib3Rzd2FwcGFibGVDaGFuZ2VzKSB7XG4gICAgaWYgKCdyZXNvdXJjZVR5cGUnIGluIHN1YmplY3QpIHtcbiAgICAgIGNvbnN0IGtleXMgPSAncmVqZWN0ZWRQcm9wZXJ0aWVzJyBpbiBzdWJqZWN0ICYmIHN1YmplY3QucmVqZWN0ZWRQcm9wZXJ0aWVzXG4gICAgICAgID8gc3ViamVjdC5yZWplY3RlZFByb3BlcnRpZXMubWFwKHAgPT4gYGhvdHN3YXBGYWxsYmFjazoke3N1YmplY3QucmVzb3VyY2VUeXBlfSMke3B9YClcbiAgICAgICAgOiBbYGhvdHN3YXBGYWxsYmFjazoke3N1YmplY3QucmVzb3VyY2VUeXBlfWBdO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBub25Ib3Rzd2FwcGFibGVSZXNvdXJjZXNba2V5XSA9IChub25Ib3Rzd2FwcGFibGVSZXNvdXJjZXNba2V5XSA/PyAwKSArIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBldmVudFR5cGU6ICdIT1RTV0FQJyBhcyBjb25zdCxcbiAgICBkdXJhdGlvbjogcmVzdWx0LmR1cmF0aW9uLFxuICAgIC4uLihyZXN1bHQuZXJyb3IgPyB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBuYW1lOiBjZGtDbGlFcnJvck5hbWUocmVzdWx0LmVycm9yKSxcbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgICBjb3VudGVyczoge1xuICAgICAgaG90c3dhcHBlZDogcmVzdWx0LmhvdHN3YXBwZWQgPyAxIDogMCxcbiAgICAgIGhvdHN3YXBGYWxsYmFjazogcmVzdWx0LmhvdHN3YXBGYWxsYmFjayA/IDEgOiAwLFxuICAgICAgaG90c3dhcHBhYmxlQ2hhbmdlczogcmVzdWx0LmhvdHN3YXBwYWJsZUNoYW5nZXMubGVuZ3RoLFxuICAgICAgbm9uSG90c3dhcHBhYmxlQ2hhbmdlczogcmVzdWx0Lm5vbkhvdHN3YXBwYWJsZUNoYW5nZXMubGVuZ3RoLFxuICAgICAgLi4ubm9uSG90c3dhcHBhYmxlUmVzb3VyY2VzLFxuICAgIH0sXG4gIH07XG59XG4iXX0=
959
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbGktaW8taG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdW5DQSw0QkFHQztBQXdCRCw0Q0FpQkM7QUFucUNELGdEQUFrQztBQUNsQywwRUFBaUU7QUFDakUsc0RBQW9EO0FBRXBELGtEQUEwQjtBQUMxQixtREFBcUM7QUFFckMsMERBQWdLO0FBRWhLLGtEQUE4RDtBQUM5RCxzRUFBcUU7QUFDckUsOENBQXFEO0FBRXJELG9EQUF1RDtBQUV2RCxrREFBd0Q7QUFDeEQsMkRBQWdFO0FBQ2hFLHFEQUFrRDtBQUVsRCx1RUFBNEU7QUFDNUUsbUNBQWtDO0FBNk9sQzs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQW1CO0lBQzFDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUEwREQ7O0dBRUc7QUFDSCxNQUFhLFNBQVM7SUFDcEI7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQXdCLEVBQUUsRUFBRSxRQUFRLEdBQUcsS0FBSztRQUMxRCxJQUFJLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQUc7UUFDUixPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLFNBQVMsQ0FBd0I7SUFFaEQ7O09BRUc7SUFDSSxhQUFhLENBQVk7SUFFaEM7Ozs7T0FJRztJQUNJLElBQUksQ0FBVTtJQUVyQjs7T0FFRztJQUNJLEtBQUssQ0FBVTtJQUV0Qjs7OztPQUlHO0lBQ0ksUUFBUSxDQUFpQjtJQUVoQzs7T0FFRztJQUNJLHFCQUFxQixDQUFrQjtJQUU5Qzs7Ozs7T0FLRztJQUNJLGtCQUFrQixHQUFpQixRQUFRLENBQUM7SUFFM0MsU0FBUyxHQUEwQiw4QkFBcUIsQ0FBQyxHQUFHLENBQUM7SUFFckUseUJBQXlCO0lBQ2pCLGVBQWUsQ0FBb0I7SUFFM0MsaUJBQWlCO0lBQ1QsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUNULG1CQUFtQixHQUF5QixFQUFFLENBQUM7SUFFaEUsNEVBQTRFO0lBQzVFLCtEQUErRDtJQUM5QyxnQkFBZ0IsR0FBc0IsRUFBRSxDQUFDO0lBRTFELGtGQUFrRjtJQUNqRSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBK0MsQ0FBQztJQUUzRiw0RUFBNEU7SUFDcEUsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUViLFdBQVcsQ0FBVTtJQUV0Qzs7OztPQUlHO0lBQ0ksU0FBUyxDQUFvQjtJQUVwQyxZQUFvQixRQUF3QixFQUFFO1FBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUM7UUFDbkQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztRQUMxRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFBLFNBQUksR0FBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMscUJBQXFCLElBQUksdUNBQWUsQ0FBQyxVQUFVLENBQUM7UUFDdkYsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxJQUFJLDhCQUFxQixDQUFDLEdBQUcsQ0FBQztRQUN0RSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDO1FBRTlDLDBFQUEwRTtRQUMxRSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVNLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBUyxFQUFFLE9BQWdCLEVBQUUsVUFBbUMsRUFBRTtRQUM1RixpRUFBaUU7UUFDakUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDcEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLHFHQUFxRztZQUNyRyxxQkFBcUI7WUFDckIsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxpREFBaUQsR0FBRyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3pILE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxLQUFLLEdBQXFCLEVBQUUsQ0FBQztRQUNqQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUM7Z0JBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLDZCQUFpQixDQUFDO29CQUMvQixNQUFNLEVBQUUsSUFBSTtvQkFDWixXQUFXLEVBQUUsaUJBQWlCO2lCQUMvQixDQUFDLENBQUMsQ0FBQztnQkFDSixNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDckUsQ0FBQztZQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLHFEQUFxRCxDQUFDO1FBQ2xILElBQUksSUFBQSx1Q0FBbUIsRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUM7Z0JBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLHlDQUF1QixDQUFDO29CQUNyQyxNQUFNLEVBQUUsSUFBSTtvQkFDWixRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7b0JBQzFCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtpQkFDbkMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM3RixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksMEJBQWdCLENBQUM7Z0JBQ3BDLE1BQU0sRUFBRSxJQUFJO2dCQUNaLE1BQU0sRUFBRSxJQUFJLGVBQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUM3QixTQUFTLEVBQUUsSUFBSTtnQkFDZixPQUFPLEVBQUUsT0FBTzthQUNqQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsYUFBYSxDQUFDLElBQTJCO1FBQ2xELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsYUFBYTtRQUN0QiwyQ0FBMkM7UUFDM0MsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLDhCQUFxQixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLDhCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzVHLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO1FBRUQseUhBQXlIO1FBQ3pILE1BQU0sY0FBYyxHQUFHLElBQUEsdUNBQXlCLEVBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BGLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsT0FBTyw4QkFBcUIsQ0FBQyxNQUFNLENBQUM7UUFDdEMsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQztRQUMvQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsT0FBTyw4QkFBcUIsQ0FBQyxNQUFNLENBQUM7UUFDdEMsQ0FBQztRQUVELGlGQUFpRjtRQUNqRiw0REFBNEQ7UUFDNUQsMEZBQTBGO1FBQzFGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDMUIsT0FBTyw4QkFBcUIsQ0FBQyxNQUFNLENBQUM7UUFDdEMsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDcEMsQ0FBQztJQUVNLFVBQVU7UUFDZixPQUFPLElBQUEsd0JBQVUsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQW9CLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBSSxLQUF1QjtRQUN2RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLCtDQUErQztnQkFDL0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksQ0FBQztvQkFDSCxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO3dCQUNqRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQy9CLENBQUM7Z0JBQ0gsQ0FBQzt3QkFBUyxDQUFDO29CQUNULElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixDQUFDO2dCQUNELHdDQUF3QztnQkFDeEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUE2Qk0sRUFBRSxDQUFDLFFBQThCLEVBQUUsUUFBMkI7UUFDbkUsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksZUFBZSxDQUFDLFFBQXFEO1FBQzFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEMsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFjTSxJQUFJLENBQUMsUUFBOEIsRUFBRSxRQUEyQjtRQUNyRSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGtCQUFrQjtRQUN2QixrRUFBa0U7UUFDbEUscUVBQXFFO1FBQ3JFLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0ksT0FBTyxDQUFPLElBQTBCLEVBQUUsS0FBUSxFQUFFLGdCQUFnQixHQUFHLElBQUk7UUFDaEYsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25KLENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FBTyxJQUEwQixFQUFFLEtBQVEsRUFBRSxnQkFBZ0IsR0FBRyxJQUFJO1FBQ3BGLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0ksT0FBTyxDQUNaLElBQWdELEVBQ2hELFNBQXdDLEVBQ3hDLEtBQXNCO1FBRXRCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksV0FBVyxDQUNoQixJQUFnRCxFQUNoRCxTQUF3QyxFQUN4QyxLQUFzQjtRQUV0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQixDQUFDLFFBQXlCO1FBQ2xELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckMsT0FBTyxlQUFlLENBQUMsR0FBRyxFQUFFO1lBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSyxLQUFLLENBQUMscUJBQXFCLENBQStCLEdBQU07UUFLdEUsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsNkVBQTZFO1FBQzdFLEtBQUssTUFBTSxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDbEQsMEVBQTBFO1lBQzFFLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzQixTQUFTO1lBQ1gsQ0FBQztZQUVELHdFQUF3RTtZQUN4RSw4REFBOEQ7WUFDOUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTFDLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDekMsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDakMsT0FBTyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEQsQ0FBQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQy9CLE9BQU8sR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2hELENBQUM7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNoQyxPQUFPLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsRCxDQUFDO2dCQUNELElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUMxQixjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixDQUFDO2dCQUNELElBQUksU0FBUyxJQUFJLE1BQU0sSUFBSSxpQkFBaUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDcEQsa0VBQWtFO29CQUNsRSw4REFBOEQ7b0JBQzlELE9BQU8sR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzFELFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ25CLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUF1QjtRQUN6QyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuQyx3RUFBd0U7UUFDeEUsK0RBQStEO1FBQy9ELHFFQUFxRTtRQUNyRSx3QkFBd0I7UUFDeEIsRUFBRTtRQUNGLDBFQUEwRTtRQUMxRSwrREFBK0Q7UUFDL0QsK0JBQStCO1FBQy9CLE1BQU0sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWE7WUFDcEQsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFO1lBQ3pDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUxQyxzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUN0RyxDQUFDO1FBRUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxlQUFlLENBQUMsV0FBaUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBQ0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM3QyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssWUFBWSxDQUFDLE9BQTJCO1FBQzlDLElBQUksQ0FBQyxJQUFBLHVDQUF5QixFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN2RCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUF1QjtRQUN0RCxJQUFJLENBQUM7WUFDSCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSywyQkFBMkI7UUFDakMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUF1QixFQUF5QixFQUFFO1lBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDcEQsQ0FBQztZQUNELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyx1REFBdUQ7UUFDMUYsQ0FBQyxDQUFDO1FBRUYsNEVBQTRFO1FBQzVFLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDdEIsSUFBSSxFQUFFLEtBQUs7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLEVBQUUsRUFBRSxLQUFLO1lBQ1QsT0FBTyxFQUFFLFFBQVEsQ0FBQyxnQkFBRSxDQUFDLGlCQUFpQixFQUFFLGdCQUFFLENBQUMsaUJBQWlCLEVBQUUsZ0JBQUUsQ0FBQyxpQkFBaUIsQ0FBQztTQUNwRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZ0JBQWdCLENBQUMsR0FBd0I7UUFDL0MsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxRQUFRLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ25DLHlCQUF5QjtZQUN6QixLQUFLLHVDQUFlLENBQUMsS0FBSztnQkFDeEIsT0FBTyxJQUFJLENBQUM7WUFDZCwwQkFBMEI7WUFDMUIsS0FBSyx1Q0FBZSxDQUFDLFNBQVM7Z0JBQzVCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsNkRBQTZEO1lBQzdELEtBQUssdUNBQWUsQ0FBQyxVQUFVO2dCQUM3QixPQUFPLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztZQUM3RSw2RUFBNkU7WUFDN0UsS0FBSyx1Q0FBZSxDQUFDLFdBQVc7Z0JBQzlCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZLENBQUMsR0FBbUI7UUFDdEMsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxxQkFBcUIsQ0FBQyxLQUFxQjtRQUNqRCw0REFBNEQ7UUFDNUQsRUFBRTtRQUNGLHlEQUF5RDtRQUN6RCx5REFBeUQ7UUFDekQsZ0RBQWdEO1FBQ2hELHNFQUFzRTtRQUN0RSxFQUFFO1FBQ0YsUUFBUSxLQUFLLEVBQUUsQ0FBQztZQUNkLEtBQUssT0FBTztnQkFDVixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDeEIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUN4QjtnQkFDRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksS0FBSyxDQUFDLGVBQWUsQ0FBeUIsR0FBc0M7UUFDekYsMEVBQTBFO1FBQzFFLGlGQUFpRjtRQUNqRixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsY0FBYyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0UsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUVwRSwwRkFBMEY7UUFDMUYsK0ZBQStGO1FBQy9GLDRHQUE0RztRQUM1RyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRXBILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFDLGNBQWMsQ0FDMUIsR0FBc0MsRUFDdEMsY0FBK0Q7UUFFL0QsbURBQW1EO1FBQ25ELElBQUksY0FBYyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUM3QixDQUFDO1FBRUQseURBQXlEO1FBQ3pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFDN0IsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssSUFBd0MsRUFBRTtZQUMzRixzQkFBc0I7WUFDdEIsZ0VBQWdFO1lBQ2hFLE1BQU0sSUFBSSxHQUlOLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBRW5CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksc0JBQXNCLENBQUM7WUFDN0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7WUFDMUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFFckQsMEJBQTBCO1lBQzFCLG9HQUFvRztZQUNwRyw2RkFBNkY7WUFDN0YsK0JBQStCO1lBQy9CLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELGdEQUFnRDtZQUNoRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsd0NBQXdDO2dCQUN4QyxJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQzt3QkFDdEIsR0FBRyxHQUFHO3dCQUNOLE9BQU8sRUFBRSxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUI7cUJBQ3ZELENBQUMsQ0FBQztvQkFDSCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUVELGtEQUFrRDtnQkFDbEQsSUFBSSxHQUFHLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN0QyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUM7d0JBQ3RCLEdBQUcsR0FBRzt3QkFDTixPQUFPLEVBQUUsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHO3FCQUN6RyxDQUFDLENBQUM7b0JBQ0gsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDO2dCQUM3QixDQUFDO1lBQ0gsQ0FBQztZQUVELDZEQUE2RDtZQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksMEJBQVksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLFVBQVUsMkZBQTJGLENBQUMsQ0FBQztZQUNySixDQUFDO1lBRUQsMERBQTBEO1lBQzFELElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwQixNQUFNLElBQUksMEJBQVksQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLFVBQVUsMEZBQTBGLENBQUMsQ0FBQztZQUN6SixDQUFDO1lBRUQsNEJBQTRCO1lBQzVCLHdFQUF3RTtZQUN4RSx3RUFBd0U7WUFDeEUsb0VBQW9FO1lBQ3BFLG1CQUFtQjtZQUNuQixJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5RCxDQUFDO1lBRUQsOEJBQThCO1lBQzlCLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxHQUFHLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDNUYsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dCQUN2QixJQUFJLEVBQUUsSUFBSTthQUNYLENBQUMsQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVILDJFQUEyRTtRQUMzRSw4RUFBOEU7UUFDOUUscUVBQXFFO1FBQ3JFLE9BQU8sUUFBd0IsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsR0FBdUI7UUFDM0MsK0RBQStEO1FBQy9ELElBQUksWUFBWSxDQUFDO1FBQ2pCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JDLHdCQUF3QjtZQUN4QixZQUFZLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUM3QixDQUFDO2FBQU0sQ0FBQztZQUNOLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSztnQkFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDbEIsQ0FBQztRQUVELDZFQUE2RTtRQUM3RSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQztZQUN0RCxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxZQUFZLEVBQUU7WUFDbEQsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVLENBQUMsQ0FBTztRQUN4QixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQVMsRUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakUsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssbUJBQW1CO1FBQ3pCLE1BQU0sS0FBSyxHQUF5QjtZQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQztTQUMzQyxDQUFDO1FBRUYsUUFBUSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsS0FBSyw4QkFBcUIsQ0FBQyxNQUFNO2dCQUMvQixPQUFPLElBQUksb0NBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsS0FBSyw4QkFBcUIsQ0FBQyxHQUFHO2dCQUM1QixPQUFPLElBQUksb0NBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsS0FBSyw4QkFBcUIsQ0FBQyxXQUFXO2dCQUNwQyxPQUFPLElBQUksdUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTd4QkQsOEJBNnhCQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxRQUE4QjtJQUNwRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBQzFCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLEdBQUcsU0FBaUM7SUFDM0QsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLEdBQUcsU0FBaUM7SUFDbkUsT0FBTyxVQUNMLE9BQWUsRUFDZixZQUE2QixFQUM3QixVQUErRDtRQUUvRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSwwQkFBWSxDQUFDLHdCQUF3QixFQUFFLDRDQUE0QyxDQUFDLENBQUM7UUFDakcsQ0FBQztRQUNELFVBQVUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxXQUFpRCxHQUFHLElBQU87OztnQkFDakYsTUFBTSxTQUFTLGtDQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFBLENBQUM7Z0JBQzNGLHdFQUF3RTtnQkFDeEUseUNBQXlDO2dCQUN6QyxPQUFPLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Ozs7Ozs7OztTQUN6QyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEdBQXdCO0lBQ25ELE9BQU8sb0JBQW9CLENBQUMsR0FBRyxDQUFDO1dBQzNCLE9BQU8sR0FBRyxDQUFDLGVBQWUsS0FBSyxRQUFRO1dBQ3ZDLE9BQU8sR0FBRyxDQUFDLGVBQWUsS0FBSyxRQUFRLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsb0JBQW9CLENBQUMsR0FBd0I7SUFDcEQsT0FBTyxPQUFPLEdBQUcsQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsaUJBQWlCLENBQUMsR0FBd0I7SUFLakQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxlQUFlLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDM0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDekQsT0FBTztRQUNMLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLFdBQVcsRUFBRSxvQkFBb0IsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlO1FBQzFILGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQzlELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxRQUFRLEdBQW9EO0lBQ2hFLEtBQUssRUFBRSxlQUFLLENBQUMsR0FBRztJQUNoQixJQUFJLEVBQUUsZUFBSyxDQUFDLE1BQU07SUFDbEIsTUFBTSxFQUFFLGVBQUssQ0FBQyxLQUFLO0lBQ25CLElBQUksRUFBRSxlQUFLLENBQUMsS0FBSztJQUNqQixLQUFLLEVBQUUsZUFBSyxDQUFDLElBQUk7SUFDakIsS0FBSyxFQUFFLGVBQUssQ0FBQyxJQUFJO0NBQ2xCLENBQUM7QUFFRixTQUFTLGtCQUFrQixDQUFDLENBQWU7SUFDekMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNWLEtBQUssUUFBUTtZQUNYLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN4QixLQUFLLFFBQVE7WUFDWCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDeEIsS0FBSyxNQUFNO1lBQ1QsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEdBQXVCO0lBQy9DLE9BQU8sZ0JBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksZ0JBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksZ0JBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksZ0JBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEksQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsR0FBdUI7SUFDL0MsSUFBSSx5QkFBYyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUkseUJBQWMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekMsT0FBTyxXQUFXLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxJQUFJLHlCQUFjLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsSUFBSSx5QkFBYyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELHlFQUF5RTtJQUN6RSw4Q0FBOEM7SUFDOUMsSUFBSSxnQkFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pDLHVDQUF1QztRQUN2QyxPQUFPLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7SUFFakIsU0FBUyxXQUFXLENBQUMsU0FBc0MsRUFBRSxDQUF5QjtRQUNwRixPQUFPO1lBQ0wsU0FBUztZQUNULFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDekIsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRO1NBQzFCLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsTUFBcUI7SUFDakQsTUFBTSx3QkFBd0IsR0FBMkIsRUFBRSxDQUFDO0lBQzVELEtBQUssTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3hELElBQUksY0FBYyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxHQUFHLG9CQUFvQixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsa0JBQWtCO2dCQUN4RSxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLG1CQUFtQixPQUFPLENBQUMsWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNyRixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsd0JBQXdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0UsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLFNBQVMsRUFBRSxTQUFrQjtRQUM3QixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDekIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsSUFBQSx1QkFBZSxFQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDcEM7U0FDRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxRQUFRLEVBQUU7WUFDUixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLGVBQWUsRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU07WUFDdEQsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQU07WUFDNUQsR0FBRyx3QkFBd0I7U0FDNUI7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0aWwgZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7IFJlcXVpcmVBcHByb3ZhbCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgdHlwZSB7IEhvdHN3YXBSZXN1bHQsIElJb0hvc3QsIElvTWVzc2FnZSwgSW9NZXNzYWdlQ29kZSwgSW9NZXNzYWdlTGV2ZWwsIElvUmVxdWVzdCwgVG9vbGtpdEFjdGlvbiB9IGZyb20gJ0Bhd3MtY2RrL3Rvb2xraXQtbGliJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBwcm9tcHRseSBmcm9tICdwcm9tcHRseSc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyLCBBY3Rpdml0eVByaW50ZXJQcm9wcywgSUFjdGl2aXR5UHJpbnRlciwgSW9NZXNzYWdlTWFrZXIsIElvUmVxdWVzdE1ha2VyLCBJb0RlZmF1bHRNZXNzYWdlcyB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGktcHJpdmF0ZSc7XG5pbXBvcnQgeyBhc0lvSGVscGVyLCBJTywgaXNNZXNzYWdlUmVsZXZhbnRGb3JMZXZlbCwgQ3VycmVudEFjdGl2aXR5UHJpbnRlciwgSGlzdG9yeUFjdGl2aXR5UHJpbnRlciwgRXJyb3JzT25seUFjdGl2aXR5UHJpbnRlciB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGktcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICcuLi8uLi9hcGkvY29udGV4dCc7XG5pbXBvcnQgeyBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MgfSBmcm9tICcuLi8uLi9jb21tYW5kcy9kZXBsb3knO1xuaW1wb3J0IHsgY2FuQ29sbGVjdFRlbGVtZXRyeSB9IGZyb20gJy4uL3RlbGVtZXRyeS9jb2xsZWN0LXRlbGVtZXRyeSc7XG5pbXBvcnQgeyBjZGtDbGlFcnJvck5hbWUgfSBmcm9tICcuLi90ZWxlbWV0cnkvZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBFdmVudFJlc3VsdCB9IGZyb20gJy4uL3RlbGVtZXRyeS9tZXNzYWdlcyc7XG5pbXBvcnQgeyBDTElfUFJJVkFURV9JTyB9IGZyb20gJy4uL3RlbGVtZXRyeS9tZXNzYWdlcyc7XG5pbXBvcnQgdHlwZSB7IFRlbGVtZXRyeUV2ZW50IH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3Nlc3Npb24nO1xuaW1wb3J0IHsgVGVsZW1ldHJ5U2Vzc2lvbiB9IGZyb20gJy4uL3RlbGVtZXRyeS9zZXNzaW9uJztcbmltcG9ydCB7IEZpbGVUZWxlbWV0cnlTaW5rIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3NpbmsvZmlsZS1zaW5rJztcbmltcG9ydCB7IEZ1bm5lbCB9IGZyb20gJy4uL3RlbGVtZXRyeS9zaW5rL2Z1bm5lbCc7XG5pbXBvcnQgdHlwZSB7IElUZWxlbWV0cnlTaW5rIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3Npbmsvc2luay1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU3VicHJvY2Vzc1RlbGVtZXRyeVNpbmsgfSBmcm9tICcuLi90ZWxlbWV0cnkvc2luay9zdWJwcm9jZXNzLXNpbmsnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWwvY2knO1xuXG5leHBvcnQgdHlwZSB7IElJb0hvc3QsIElvTWVzc2FnZSwgSW9NZXNzYWdlQ29kZSwgSW9NZXNzYWdlTGV2ZWwsIElvUmVxdWVzdCB9O1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGFjdGlvbiBiZWluZyBwZXJmb3JtZWQgYnkgdGhlIENMSS4gJ25vbmUnIHJlcHJlc2VudHMgdGhlIGFic2VuY2Ugb2YgYW4gYWN0aW9uLlxuICovXG50eXBlIENsaUFjdGlvbiA9XG4gIHwgVG9vbGtpdEFjdGlvblxuICB8ICdjb250ZXh0J1xuICB8ICdkb2NzJ1xuICB8ICdsc3AnXG4gIHwgJ2ZsYWdzJ1xuICB8ICdub3RpY2VzJ1xuICB8ICd2ZXJzaW9uJ1xuICB8ICdjbGktdGVsZW1ldHJ5J1xuICB8ICdub25lJztcblxuLyoqXG4gKiBIb3cgdGVsZW1ldHJ5IHNob3VsZCByZWFjaCB0aGUgbmV0d29yay5cbiAqXG4gKiBBbiBgQWdlbnRgIGNhbm5vdCBjcm9zcyBhIHByb2Nlc3MgYm91bmRhcnksIHNvIHRoZSBkZXRhY2hlZCBzZW5kZXIgaXMgaGFuZGVkIHRoZSBwcm94eSBhbmRcbiAqIGNlcnRpZmljYXRlIGNvbmZpZ3VyYXRpb24gYXMgcGxhaW4gZGF0YSBhbmQgYnVpbGRzIGl0cyBvd24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVsZW1ldHJ5TmV0d29ya09wdGlvbnMge1xuICAvKipcbiAgICogUHJveHkgY29uZmlndXJlZCB2aWEgYC0tcHJveHlgIG9yIHRoZSBgcHJveHlgIHNldHRpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHNlbmRlciByZXNvbHZlcyBpdCBmcm9tIHRoZSBlbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIENBIGJ1bmRsZSBjb25maWd1cmVkIHZpYSBgLS1jYS1idW5kbGUtcGF0aGAgb3IgYEFXU19DQV9CVU5ETEVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9ubHkgdGhlIHN5c3RlbSB0cnVzdCBzdG9yZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FCdW5kbGVQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsaUlvSG9zdFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIFRvb2xraXQgYWN0aW9uIHRoZSBob3N0cyBzdGFydHMgd2l0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50QWN0aW9uPzogQ2xpQWN0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSB2ZXJib3NpdHkgb2YgdGhlIG91dHB1dC5cbiAgICpcbiAgICogVGhlIENsaUlvSG9zdCB3aWxsIHN0aWxsIHJlY2VpdmUgYWxsIG1lc3NhZ2VzIGFuZCByZXF1ZXN0cyxcbiAgICogYnV0IG9ubHkgdGhlIG1lc3NhZ2VzIGluY2x1ZGVkIGluIHRoaXMgbGV2ZWwgd2lsbCBiZSBwcmludGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnaW5mbydcbiAgICovXG4gIHJlYWRvbmx5IGxvZ0xldmVsPzogSW9NZXNzYWdlTGV2ZWw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGUgYXV0b21hdGljIFRUWSBkZXRlY3Rpb24uXG4gICAqXG4gICAqIFdoZW4gVFRZIGlzIGRpc2FibGVkLCB0aGUgQ0xJIHdpbGwgaGF2ZSBubyBpbnRlcmFjdGlvbnMgb3IgY29sb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGV0ZXJtaW5lZCBmcm9tIHRoZSBjdXJyZW50IHByb2Nlc3NcbiAgICovXG4gIHJlYWRvbmx5IGlzVFRZPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgQ2xpSW9Ib3N0IGlzIHJ1bm5pbmcgaW4gQ0kgbW9kZS5cbiAgICpcbiAgICogSW4gQ0kgbW9kZSwgYWxsIG5vbi1lcnJvciBvdXRwdXQgZ29lcyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIuXG4gICAqIFNldCB0byBmYWxzZSBpbiB0aGUgQ2xpSW9Ib3N0IGNvbnN0cnVjdG9yIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gaWYgdGhlIENMSSBDSSBhcmd1bWVudCBpcyBwYXNzZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZXRlcm1pbmVkIGZyb20gdGhlIGVudmlyb25tZW50LCBzcGVjaWZpY2FsbHkgYmFzZWQgb24gYHByb2Nlc3MuZW52LkNJYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNDST86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluIHdoYXQgc2NlbmFyaW9zIHNob3VsZCB0aGUgQ2xpSW9Ib3N0IGFzayBmb3IgYXBwcm92YWxcbiAgICpcbiAgICogQGRlZmF1bHQgUmVxdWlyZUFwcHJvdmFsLkJST0FERU5JTkdcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVEZXBsb3lBcHByb3ZhbD86IFJlcXVpcmVBcHByb3ZhbDtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgVG9vbGtpdCBhY3Rpb24gdGhlIGhvc3RzIHN0YXJ0cyB3aXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSXG4gICAqL1xuICByZWFkb25seSBzdGFja1Byb2dyZXNzPzogU3RhY2tBY3Rpdml0eVByb2dyZXNzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBDTEkgc2hvdWxkIGF0dGVtcHQgdG8gYXV0b21hdGljYWxseSByZXNwb25kIHRvIHByb21wdHMuXG4gICAqXG4gICAqIFdoZW4gdHJ1ZSwgb3BlcmF0aW9uIHdpbGwgdXN1YWxseSBwcm9jZWVkIHdpdGhvdXQgaW50ZXJhY3RpdmUgY29uZmlybWF0aW9uLlxuICAgKiBDb25maXJtYXRpb25zIGFyZSByZXNwb25kZWQgdG8gd2l0aCB5ZXMuIE90aGVyIHByb21wdHMgd2lsbCByZXNwb25kIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhdXRvUmVzcG9uZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSB0eXBlIGZvciBjb25maWd1cmluZyBhIHRhcmdldCBzdHJlYW1cbiAqL1xuZXhwb3J0IHR5cGUgVGFyZ2V0U3RyZWFtID0gJ3N0ZG91dCcgfCAnc3RkZXJyJyB8ICdkcm9wJztcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGEgbWVzc2FnZSBsaXN0ZW5lciBtYXkgcmV0dXJuIHRvIGluZmx1ZW5jZSBob3cgYSBtZXNzYWdlIGlzIGhhbmRsZWQuXG4gKlxuICogQSBsaXN0ZW5lciBtYXkgdXBkYXRlIHRoZSBtZXNzYWdlIF90ZXh0XywgX2xldmVsXywgYW5kL29yIF9hY3Rpb25fOyBpdCBjYW5ub3RcbiAqIGNoYW5nZSBvdGhlciBmaWVsZHMgKHN1Y2ggYXMgaXRzIGBjb2RlYCksIHdoaWNoIGtlZXBzIHRoZSBjb2RlLWtleWVkIGxpc3RlbmVyXG4gKiByZWdpc3RyeSB2YWxpZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlTGlzdGVuZXJSZXN1bHQge1xuICAvKipcbiAgICogUmVwbGFjZSB0aGUgdGV4dCB0aGF0IGlzIHByaW50ZWQgZm9yIHRoaXMgbWVzc2FnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbWVzc2FnZSB0ZXh0IGlzIGxlZnQgdW5jaGFuZ2VkXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgbGV2ZWwgb2YgdGhpcyBtZXNzYWdlLlxuICAgKlxuICAgKiBUaGUgbmV3IGxldmVsIGlzIHVzZWQgZm9yIGJvdGggdmVyYm9zaXR5IGZpbHRlcmluZyBhbmQgc3RyZWFtIHNlbGVjdGlvbiwgc29cbiAgICogdGhpcyBjYW4gbW92ZSBhIG1lc3NhZ2UgYmV0d2VlbiBzdGRvdXQvc3RkZXJyIChlLmcuIGRvd25ncmFkZSBhIGByZXN1bHRgIHRvXG4gICAqIGBpbmZvYCkuIFRoZSBgY29kZWAgaXMgaW50ZW50aW9uYWxseSBsZWZ0IHVuY2hhbmdlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbWVzc2FnZSBsZXZlbCBpcyBsZWZ0IHVuY2hhbmdlZFxuICAgKi9cbiAgcmVhZG9ubHkgbGV2ZWw/OiBJb01lc3NhZ2VMZXZlbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXNzYWdlLlxuICAgKlxuICAgKiBUaGUgb3ZlcnJpZGUgYWZmZWN0cyBzdWJzZXF1ZW50IGxpc3RlbmVycyBhbmQgcHJlc2VudGF0aW9uL29ic2VydmF0aW9uIG9mXG4gICAqIHRoZSBlZmZlY3RpdmUgbWVzc2FnZS4gTWF0Y2hpbmcgYW5kIHRlbGVtZXRyeSBjb250aW51ZSB0byB1c2UgdGhlIGFjdGlvblxuICAgKiBvbiB0aGUgb3JpZ2luYWxseSBlbWl0dGVkIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIG1lc3NhZ2UgYWN0aW9uIGlzIGxlZnQgdW5jaGFuZ2VkXG4gICAqL1xuICByZWFkb25seSBhY3Rpb24/OiBUb29sa2l0QWN0aW9uO1xuXG4gIC8qKlxuICAgKiBTa2lwIHRoZSBkZWZhdWx0IGhhbmRsaW5nIG9mIHRoZSBtZXNzYWdlLlxuICAgKlxuICAgKiBGb3IgYSBub3RpZmljYXRpb24gdGhpcyBtZWFucyBpdCBpcyBub3Qgd3JpdHRlbiB0byBhIHN0cmVhbS4gRm9yIGEgcmVxdWVzdFxuICAgKiBpdCBzdG9wcyBwcm9jZXNzaW5nIGVudGlyZWx5OiB0aGUgdXNlciBpcyBub3QgcHJvbXB0ZWQsIG5vdGhpbmcgaXMgd3JpdHRlbixcbiAgICogYW5kIHRoZSByZXF1ZXN0IHJlc29sdmVzIHdpdGggaXRzIChwb3NzaWJseSBgcmVzcG9uZGAtb3ZlcnJpZGRlbikgZGVmYXVsdFxuICAgKiByZXNwb25zZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9yIHJlcXVlc3RzIG9ubHk6IHRoZSB2YWx1ZSB0byByZXNvbHZlIHRoZSByZXF1ZXN0IHdpdGguIEl0IGlzIGZvbGRlZCBpbnRvXG4gICAqIHRoZSByZXF1ZXN0J3MgZGVmYXVsdCByZXNwb25zZSBhbmQgc2tpcHMgdGhlIHByb21wdCAodGhlIHJlcXVlc3QgaXMgdHJlYXRlZFxuICAgKiBhcyBub3QgcHJvbXB0YWJsZSkuIFRoZSBxdWVzdGlvbiBpcyBzdGlsbCB3cml0dGVuIHVubGVzcyBgcHJldmVudERlZmF1bHRgIGlzXG4gICAqIGFsc28gc2V0LiBJZ25vcmVkIGZvciBwbGFpbiBub3RpZmljYXRpb25zLlxuICAgKlxuICAgKiBUaGUgcHJlc2VuY2Ugb2YgdGhlIGtleSBpcyB3aGF0IG1hdHRlcnMsIHNvIGBmYWxzZWAvYDBgL2AnJ2AgYXJlIHZhbGlkXG4gICAqIGFuc3dlcnMuIFVzZSB0aGUgYHJlc3BvbmRgL2ByZXNwb25kT25jZWAgaGVscGVycyBmb3IgdGhlIGNvbW1vbiBjYXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoaXMgbGlzdGVuZXIgZG9lcyBub3Qgc3VwcGx5IGEgcmVzcG9uc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlc3BvbmQ/OiB1bmtub3duO1xufVxuXG4vKipcbiAqIFdoYXQgYSBtZXNzYWdlIGxpc3RlbmVyIG1heSByZXR1cm46IG5vdGhpbmcsIGEgYE1lc3NhZ2VMaXN0ZW5lclJlc3VsdGAsIG9yIGFcbiAqIGBQcm9taXNlYCBvZiBlaXRoZXIuXG4gKlxuICogTGlzdGVuZXJzIG1heSBiZSBhc3luYy4gVGhlIGhvc3QgYXdhaXRzIGVhY2ggbGlzdGVuZXIgYmVmb3JlIHJ1bm5pbmcgdGhlXG4gKiBuZXh0LCBzbyByZWdpc3RyYXRpb24gb3JkZXIg4oCUIGFuZCB0aGUgY3VtdWxhdGl2ZSBlZmZlY3Qgb24gdGhlIG1lc3NhZ2Ug4oCUIGlzXG4gKiBwcmVzZXJ2ZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGxpc3RlbmVycyBhcmUgc3luYyBvciBhc3luYy5cbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlID0gdm9pZCB8IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdCB8IFByb21pc2U8dm9pZCB8IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdD47XG5cbi8qKlxuICogQSByZWdpc3RlcmVkIG1lc3NhZ2UgbGlzdGVuZXIuIEl0cyByZXR1cm4gdmFsdWUgKGlmIGFueSkgbWF5IHVwZGF0ZSB0aGVcbiAqIG1lc3NhZ2UgdGV4dCwgbGV2ZWwsIGFuZC9vciBhY3Rpb24gb3IgcHJldmVudCB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nLiBJdCBtYXlcbiAqIGJlIGFzeW5jLlxuICovXG50eXBlIE1lc3NhZ2VMaXN0ZW5lckZuID0gKG1zZzogSW9NZXNzYWdlPGFueT4pID0+IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdE9yUHJvbWlzZTtcbmludGVyZmFjZSBNZXNzYWdlTGlzdGVuZXIge1xuICByZWFkb25seSBvbmNlOiBib29sZWFuO1xuICByZWFkb25seSBmbjogTWVzc2FnZUxpc3RlbmVyRm47XG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoaWNoIG1lc3NhZ2VzIHRoaXMgbGlzdGVuZXIgYXBwbGllcyB0by4gRm9yIGEgbGlzdGVuZXIgcmVnaXN0ZXJlZFxuICAgKiB3aXRoIGEgbWFrZXIgdGhpcyBtYXRjaGVzIGJ5IGBjb2RlYDsgZm9yIG9uZSByZWdpc3RlcmVkIHdpdGggYSBwcmVkaWNhdGUgaXRcbiAgICogaXMgdGhlIHByZWRpY2F0ZSBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBtYXRjaGVzOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgb25lIG9mIHRoZSBob3N0J3Mgb3duIGludGVybmFsIGxpc3RlbmVycyAoZS5nLiBzdGFjay1hY3Rpdml0eVxuICAgKiByb3V0aW5nKS4gSW50ZXJuYWwgbGlzdGVuZXJzIGFyZSBub3QgcmVtb3ZlZCBieSBgcmVtb3ZlQWxsTGlzdGVuZXJzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgLSBhIHVzZXIgbGlzdGVuZXIgcmVnaXN0ZXJlZCB2aWEgYG9uYC9gb25jZWAvYHJld3JpdGVgL2ByZXNwb25kYFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJuYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNlbGVjdHMgd2hpY2ggbWVzc2FnZXMgYSBsaXN0ZW5lciBhcHBsaWVzIHRvLlxuICpcbiAqIEVpdGhlciBhIG1lc3NhZ2UvcmVxdWVzdCAqbWFrZXIqIOKAlCB0aGUgbGlzdGVuZXIgZmlyZXMgZm9yIG1lc3NhZ2VzIHdpdGggdGhhdFxuICogbWFrZXIncyBgY29kZWAgKHRoZSBvcmlnaW5hbCBiZWhhdmlvcikg4oCUIG9yIGEgY3VzdG9tICpwcmVkaWNhdGUqIG92ZXIgdGhlXG4gKiBtZXNzYWdlLiBBIG1ha2VyJ3MgYC5pc2AgdHlwZSBndWFyZCAoZS5nLiBgSU8uQ0RLX1RPT0xLSVRfSTcwMTAuaXNgKSBpcyBhXG4gKiBjb252ZW5pZW50IHByZWRpY2F0ZSwgYnV0IGFueSBgKG1zZykgPT4gYm9vbGVhbmAgd29ya3MgKGUuZy4gdG8gbWF0Y2ggYSBmYW1pbHlcbiAqIG9mIGNvZGVzLCBvciBvbiB0aGUgbWVzc2FnZSBsZXZlbCkuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VTZWxlY3RvcjxUPiA9XG4gIHwgSW9NZXNzYWdlTWFrZXI8VD5cbiAgfCBJb1JlcXVlc3RNYWtlcjxULCBhbnk+XG4gIHwgKChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBib29sZWFuKTtcblxuLyoqXG4gKiBSZW1vdmVzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIG1lc3NhZ2UgbGlzdGVuZXIuXG4gKlxuICogQ2FsbGFibGUgZGlyZWN0bHkgKGBkaXNwb3NlKClgKSwgYW5kIGFsc28gYSBgRGlzcG9zYWJsZWAsIHNvIGl0IGNhbiBiZSBib3VuZFxuICogdG8gdGhlIGVuY2xvc2luZyBzY29wZSB3aXRoIGEgYHVzaW5nYCBkZWNsYXJhdGlvbiDigJQgdGhlIGxpc3RlbmVyIGlzIHRoZW5cbiAqIHJlbW92ZWQgd2hlbiB0aGUgc2NvcGUgZXhpdHMsIGV2ZW4gb24gYW4gZWFybHkgcmV0dXJuIG9yIGEgdGhyb3c6XG4gKlxuICogYGBgdHNcbiAqIHVzaW5nIF9mbXQgPSBpb0hvc3QucmV3cml0ZShJTy5DREtfVE9PTEtJVF9JMjkwMSwgZm9ybWF0KTtcbiAqIGBgYFxuICpcbiAqIGB1c2luZyB4ID0gY29uZCA/IGlvSG9zdC5vbiguLi4pIDogdW5kZWZpbmVkYCBpcyBhbHNvIHZhbGlkOiBkaXNwb3NhbCBpc1xuICogc2ltcGx5IHNraXBwZWQgZm9yIGB1bmRlZmluZWRgLCB3aGljaCBtYWtlcyBjb25kaXRpb25hbCBsaXN0ZW5lcnMgY2hlYXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcG9zZUxpc3RlbmVyIHtcbiAgKCk6IHZvaWQ7XG4gIFtTeW1ib2wuZGlzcG9zZV0oKTogdm9pZDtcbn1cblxuLyoqXG4gKiBNYWtlIGEgcGxhaW4gcmVtb3ZlciBmdW5jdGlvbiB1c2FibGUgYXMgYSBgRGlzcG9zYWJsZWAgKHNlZSBgRGlzcG9zZUxpc3RlbmVyYCkuXG4gKi9cbmZ1bmN0aW9uIGRpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlOiAoKSA9PiB2b2lkKTogRGlzcG9zZUxpc3RlbmVyIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZGlzcG9zZSwgeyBbU3ltYm9sLmRpc3Bvc2VdOiBkaXNwb3NlIH0pO1xufVxuXG4vKipcbiAqIEhvdyBhbiBJb0hvc3QgcHJvY2Vzc2VkIGEgc2luZ2xlIG1lc3NhZ2Ugb3IgcmVxdWVzdC5cbiAqXG4gKiBUaGlzIGRlc2NyaWJlcyB0aGUgbWVzc2FnZSAqYXMgdGhlIGhvc3QgaGFuZGxlZCBpdCosIHdoaWNoIGNhbiBkaWZmZXIgZnJvbVxuICogd2hhdCB3YXMgZW1pdHRlZDogbGlzdGVuZXJzIG1heSByZXdyaXRlIHRoZSB0ZXh0IG9yIGxldmVsLCBwcmV2ZW50IGl0IGZyb21cbiAqIGJlaW5nIHdyaXR0ZW4gYXQgYWxsLCBvciAoZm9yIHJlcXVlc3RzKSBhbnN3ZXIgaXQgb24gdGhlIHVzZXIncyBiZWhhbGYuXG4gKlxuICogQm90aCBub3RpZmljYXRpb25zIChgbm90aWZ5YCkgYW5kIHJlcXVlc3RzIChgcmVxdWVzdFJlc3BvbnNlYCkgYXJlIHJlcG9ydGVkLFxuICogc28gYW4gb2JzZXJ2ZXIgc2VlcyB0aGUgY29tcGxldGUsIG9yZGVyZWQgc3RyZWFtIHRoZSBob3N0IGhhbmRsZWQuIFVzZVxuICogYHR5cGVgIHRvIHRlbGwgdGhlbSBhcGFydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJb01lc3NhZ2VPYnNlcnZhdGlvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgb2JzZXJ2YXRpb24gZGVzY3JpYmVzIGEgcGxhaW4gbm90aWZpY2F0aW9uIChgbm90aWZ5YCkgb3IgYVxuICAgKiByZXF1ZXN0IHRoYXQgYXNrZWQgZm9yIGEgcmVzcG9uc2UgKGByZXF1ZXN0UmVzcG9uc2VgKS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6ICdub3RpZnknIHwgJ3JlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSBleGFjdGx5IGFzIGl0IHdhcyBlbWl0dGVkIHRvIHRoZSBob3N0IChiZWZvcmUgYW55IGxpc3RlbmVycykuXG4gICAqL1xuICByZWFkb25seSBlbWl0dGVkOiBJb01lc3NhZ2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIGFmdGVyIHRoZSBob3N0J3MgbGlzdGVuZXJzIHJhbiAodGV4dCwgbGV2ZWwsIGFuZC9vciBhY3Rpb24gbWF5IGRpZmZlcikuXG4gICAqL1xuICByZWFkb25seSBlZmZlY3RpdmU6IElvTWVzc2FnZTx1bmtub3duPjtcblxuICAvKipcbiAgICogV2hldGhlciBhIGxpc3RlbmVyIHByZXZlbnRlZCB0aGlzIG1lc3NhZ2UgZnJvbSBiZWluZyB3cml0dGVuLCBpLmUuIHRoZSB1c2VyXG4gICAqIHdvdWxkIG5vdCBzZWUgaXQuIEFsd2F5cyBgZmFsc2VgIGZvciByZXF1ZXN0cyAoYSByZXF1ZXN0IGlzIHJlcG9ydGVkIG9uY2VcbiAgICogaXQgaGFzIGJlZW4gcmVzb2x2ZWQsIHJlZ2FyZGxlc3Mgb2YgaG93IGl0IHdhcyBhbnN3ZXJlZCkuXG4gICAqL1xuICByZWFkb25seSBkcm9wcGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIElvSG9zdCB3aG9zZSBtZXNzYWdlIGhhbmRsaW5nIGNhbiBiZSBvYnNlcnZlZC5cbiAqXG4gKiBUaGlzIGlzIGEgQ0xJLWludGVybmFsIGNvbnRyYWN0IHVzZWQgYnkgdGVzdHMgdG8gcmVjb3JkIHRoZSAqZWZmZWN0aXZlKixcbiAqIHVzZXItZmFjaW5nIG1lc3NhZ2Ugc3RyZWFtIChhZnRlciBsaXN0ZW5lcnMpIHdpdGhvdXQgcmVhY2hpbmcgaW50byBob3N0XG4gKiBpbnRlcm5hbHMuIEl0IGlzIGludGVudGlvbmFsbHkgc2VwYXJhdGUgZnJvbSBgSUlvSG9zdGAgc28gdGhhdCB0aGUgcmVjb3JkZXJcbiAqIGNhbiB3b3JrIHdpdGggYW55IGBJSW9Ib3N0YCBhbmQgb25seSBlbnJpY2ggaXRzIG91dHB1dCB3aGVuIHRoZSBob3N0IGFsc29cbiAqIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzZXJ2YWJsZUlvSG9zdCB7XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGlzIGludm9rZWQgZm9yIGV2ZXJ5IG1lc3NhZ2UgdGhlIGhvc3QgaGFuZGxlcyDigJRcbiAgICogYm90aCBub3RpZmljYXRpb25zIGFuZCByZXF1ZXN0cyDigJQgd2l0aCB0aGUgZGlzcG9zaXRpb24gdGhlIGhvc3QgY29tcHV0ZWRcbiAgICogZm9yIGl0IChpdHMgZWZmZWN0aXZlIGZvcm0gYWZ0ZXIgbGlzdGVuZXJzIGFuZCB3aGV0aGVyIGl0IHdhcyBkcm9wcGVkKS4gRm9yXG4gICAqIGEgcmVxdWVzdCwgdGhlIHJlc29sdmVkIGFuc3dlciBpcyB0aGUgZWZmZWN0aXZlIG1lc3NhZ2UncyBgZGVmYXVsdFJlc3BvbnNlYC5cbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgb2JzZXJ2ZXIgYWdhaW4uXG4gICAqL1xuICBvYnNlcnZlTWVzc2FnZXMob2JzZXJ2ZXI6IChvYnNlcnZhdGlvbjogSW9NZXNzYWdlT2JzZXJ2YXRpb24pID0+IHZvaWQpOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEEgc2ltcGxlIElPIGhvc3QgZm9yIHRoZSBDTEkgdGhhdCB3cml0ZXMgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGlJb0hvc3QgaW1wbGVtZW50cyBJSW9Ib3N0LCBPYnNlcnZhYmxlSW9Ib3N0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGluc3RhbmNlKHByb3BzOiBDbGlJb0hvc3RQcm9wcyA9IHt9LCBmb3JjZU5ldyA9IGZhbHNlKTogQ2xpSW9Ib3N0IHtcbiAgICBpZiAoZm9yY2VOZXcgfHwgIUNsaUlvSG9zdC5faW5zdGFuY2UpIHtcbiAgICAgIENsaUlvSG9zdC5faW5zdGFuY2UgPSBuZXcgQ2xpSW9Ib3N0KHByb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIENsaUlvSG9zdC5faW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIGlmIGl0IGV4aXN0c1xuICAgKi9cbiAgc3RhdGljIGdldCgpOiBDbGlJb0hvc3QgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBDbGlJb0hvc3QuX2luc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgQ2xpSW9Ib3N0XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IENsaUlvSG9zdCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZCBieSB0aGUgQ0xJLlxuICAgKi9cbiAgcHVibGljIGN1cnJlbnRBY3Rpb246IENsaUFjdGlvbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgQ2xpSW9Ib3N0IGlzIHJ1bm5pbmcgaW4gQ0kgbW9kZS5cbiAgICpcbiAgICogSW4gQ0kgbW9kZSwgYWxsIG5vbi1lcnJvciBvdXRwdXQgZ29lcyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIuXG4gICAqL1xuICBwdWJsaWMgaXNDSTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaG9zdCBjYW4gdXNlIGludGVyYWN0aW9ucyBhbmQgbWVzc2FnZSBzdHlsaW5nLlxuICAgKi9cbiAgcHVibGljIGlzVFRZOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB0aHJlc2hvbGQuXG4gICAqXG4gICAqIE1lc3NhZ2VzIHdpdGggYSBsb3dlciBwcmlvcml0eSBsZXZlbCB3aWxsIGJlIGlnbm9yZWQuXG4gICAqL1xuICBwdWJsaWMgbG9nTGV2ZWw6IElvTWVzc2FnZUxldmVsO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZGl0aW9ucyBmb3IgcmVxdWlyaW5nIGFwcHJvdmFsIGluIHRoaXMgQ2xpSW9Ib3N0LlxuICAgKi9cbiAgcHVibGljIHJlcXVpcmVEZXBsb3lBcHByb3ZhbDogUmVxdWlyZUFwcHJvdmFsO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIHRhcmdldCBzdHJlYW0gZm9yIG5vdGljZXNcbiAgICpcbiAgICogKE5vdCBhIHNldHRlciBiZWNhdXNlIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBsb2dpYyB3aGVuIHRoaXMgdmFsdWVcbiAgICogaXMgY2hhbmdlZCB5ZXQpXG4gICAqL1xuICBwdWJsaWMgbm90aWNlc0Rlc3RpbmF0aW9uOiBUYXJnZXRTdHJlYW0gPSAnc3RkZXJyJztcblxuICBwcml2YXRlIF9wcm9ncmVzczogU3RhY2tBY3Rpdml0eVByb2dyZXNzID0gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkJBUjtcblxuICAvLyBTdGFjayBBY3Rpdml0eSBQcmludGVyXG4gIHByaXZhdGUgYWN0aXZpdHlQcmludGVyPzogSUFjdGl2aXR5UHJpbnRlcjtcblxuICAvLyBDb3JrZWQgTG9nZ2luZ1xuICBwcml2YXRlIGNvcmtlZENvdW50ZXIgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvcmtlZExvZ2dpbmdCdWZmZXI6IElvTWVzc2FnZTx1bmtub3duPltdID0gW107XG5cbiAgLy8gTWVzc2FnZSBsaXN0ZW5lcnMgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiBFYWNoIGNhcnJpZXMgYSBtYXRjaGVyIChieSBjb2RlLFxuICAvLyBvciBhIGN1c3RvbSBwcmVkaWNhdGUpLiBTZWUgYG9uYC9gb25jZWAvYHJld3JpdGVgL2ByZXNwb25kYC5cbiAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlTGlzdGVuZXJzOiBNZXNzYWdlTGlzdGVuZXJbXSA9IFtdO1xuXG4gIC8vIE9ic2VydmVycyBvZiBob3cgbWVzc2FnZXMgYXJlIGhhbmRsZWQgKHNlZSBPYnNlcnZhYmxlSW9Ib3N0IC8gb2JzZXJ2ZU1lc3NhZ2VzKS5cbiAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlT2JzZXJ2ZXJzID0gbmV3IFNldDwob2JzZXJ2YXRpb246IElvTWVzc2FnZU9ic2VydmF0aW9uKSA9PiB2b2lkPigpO1xuXG4gIC8vIFRydWUgd2hpbGUgcmVwbGF5aW5nIGNvcmtlZCBtZXNzYWdlcywgc28gb2JzZXJ2ZXJzIGFyZW4ndCBub3RpZmllZCB0d2ljZS5cbiAgcHJpdmF0ZSBjb3JrUmVwbGF5aW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvUmVzcG9uZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRlbGVtZXRyeSBzZXNzaW9uIG9iamVjdFxuICAgKlxuICAgKiBXaWxsIHJlbWFpbiBgdW5kZWZpbmVkYCBpZiB0aGUgdXNlciBoYXMgZGlzYWJsZWQgdGVsZW1ldHJ5LlxuICAgKi9cbiAgcHVibGljIHRlbGVtZXRyeT86IFRlbGVtZXRyeVNlc3Npb247XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcm9wczogQ2xpSW9Ib3N0UHJvcHMgPSB7fSkge1xuICAgIHRoaXMuY3VycmVudEFjdGlvbiA9IHByb3BzLmN1cnJlbnRBY3Rpb24gPz8gJ25vbmUnO1xuICAgIHRoaXMuaXNUVFkgPSBwcm9wcy5pc1RUWSA/PyBwcm9jZXNzLnN0ZG91dC5pc1RUWSA/PyBmYWxzZTtcbiAgICB0aGlzLmxvZ0xldmVsID0gcHJvcHMubG9nTGV2ZWwgPz8gJ2luZm8nO1xuICAgIHRoaXMuaXNDSSA9IHByb3BzLmlzQ0kgPz8gaXNDSSgpO1xuICAgIHRoaXMucmVxdWlyZURlcGxveUFwcHJvdmFsID0gcHJvcHMucmVxdWlyZURlcGxveUFwcHJvdmFsID8/IFJlcXVpcmVBcHByb3ZhbC5CUk9BREVOSU5HO1xuICAgIHRoaXMuc3RhY2tQcm9ncmVzcyA9IHByb3BzLnN0YWNrUHJvZ3Jlc3MgPz8gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkJBUjtcbiAgICB0aGlzLmF1dG9SZXNwb25kID0gcHJvcHMuYXV0b1Jlc3BvbmQgPz8gZmFsc2U7XG5cbiAgICAvLyBTdGFjay1hY3Rpdml0eSBtZXNzYWdlcyBhcmUgaGFuZGxlZCBieSB0aGUgYWN0aXZpdHkgcHJpbnRlciByYXRoZXIgdGhhblxuICAgIC8vIHdyaXR0ZW4gdG8gYSBzdHJlYW0uIFRoaXMgaXMgd2lyZWQgdXAgYXMgbWVzc2FnZSBsaXN0ZW5lcnMuXG4gICAgdGhpcy5yb3V0ZVN0YWNrQWN0aXZpdHlUb1ByaW50ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFRlbGVtZXRyeShhcmdzOiBhbnksIGNvbnRleHQ6IENvbnRleHQsIG5ldHdvcms6IFRlbGVtZXRyeU5ldHdvcmtPcHRpb25zID0ge30pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NsaS10eXBlLXJlZ2lzdHJ5Lmpzb24nKTtcbiAgICBjb25zdCB2YWxpZENvbW1hbmRzID0gT2JqZWN0LmtleXMoY29uZmlnLmNvbW1hbmRzKTtcbiAgICBjb25zdCBjbWQgPSBhcmdzLl9bMF07XG4gICAgaWYgKCF2YWxpZENvbW1hbmRzLmluY2x1ZGVzKGNtZCkpIHtcbiAgICAgIC8vIHRoZSB1c2VyIHR5cGVkIGluIGFuIGludmFsaWQgY29tbWFuZCAtIG5vIG5lZWQgZm9yIHRlbGVtZXRyeSBzaW5jZSB0aGUgaW52b2NhdGlvbiBpcyBnb2luZyB0byBmYWlsXG4gICAgICAvLyBpbW1pbmVudGx5IGFueXdheS5cbiAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKGBTZXNzaW9uIGluc3RhbnRpYXRlZCB3aXRoIGFuIGludmFsaWQgY29tbWFuZCAoJHtjbWR9KS4gTm90IHN0YXJ0aW5nIHRlbGVtZXRyeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc2lua3M6IElUZWxlbWV0cnlTaW5rW10gPSBbXTtcbiAgICBjb25zdCB0ZWxlbWV0cnlGaWxlUGF0aCA9IGFyZ3NbJ3RlbGVtZXRyeS1maWxlJ107XG4gICAgaWYgKHRlbGVtZXRyeUZpbGVQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzaW5rcy5wdXNoKG5ldyBGaWxlVGVsZW1ldHJ5U2luayh7XG4gICAgICAgICAgaW9Ib3N0OiB0aGlzLFxuICAgICAgICAgIGxvZ0ZpbGVQYXRoOiB0ZWxlbWV0cnlGaWxlUGF0aCxcbiAgICAgICAgfSkpO1xuICAgICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZSgnRmlsZSBUZWxlbWV0cnkgY29ubmVjdGVkJyk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHMudHJhY2UoYEZpbGUgVGVsZW1ldHJ5IGluc3RhbnRpYXRpb24gZmFpbGVkOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0ZWxlbWV0cnlFbmRwb2ludCA9IHByb2Nlc3MuZW52LlRFTEVNRVRSWV9FTkRQT0lOVCA/PyAnaHR0cHM6Ly9jZGstY2xpLXRlbGVtZXRyeS51cy1lYXN0LTEuYXBpLmF3cy9tZXRyaWNzJztcbiAgICBpZiAoY2FuQ29sbGVjdFRlbGVtZXRyeShhcmdzLCBjb250ZXh0KSAmJiB0ZWxlbWV0cnlFbmRwb2ludCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2lua3MucHVzaChuZXcgU3VicHJvY2Vzc1RlbGVtZXRyeVNpbmsoe1xuICAgICAgICAgIGlvSG9zdDogdGhpcyxcbiAgICAgICAgICBlbmRwb2ludDogdGVsZW1ldHJ5RW5kcG9pbnQsXG4gICAgICAgICAgcHJveHlVcmw6IG5ldHdvcmsucHJveHlVcmwsXG4gICAgICAgICAgY2FCdW5kbGVQYXRoOiBuZXR3b3JrLmNhQnVuZGxlUGF0aCxcbiAgICAgICAgfSkpO1xuICAgICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZSgnVGVsZW1ldHJ5IHNpbmsgcmVnaXN0ZXJlZCcpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKGBUZWxlbWV0cnkgc2luayByZWdpc3RyYXRpb24gZmFpbGVkOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHMudHJhY2UoJ1RlbGVtZXRyeSBkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIGlmIChzaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRlbGVtZXRyeSA9IG5ldyBUZWxlbWV0cnlTZXNzaW9uKHtcbiAgICAgICAgaW9Ib3N0OiB0aGlzLFxuICAgICAgICBjbGllbnQ6IG5ldyBGdW5uZWwoeyBzaW5rcyB9KSxcbiAgICAgICAgYXJndW1lbnRzOiBhcmdzLFxuICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy50ZWxlbWV0cnk/LmJlZ2luKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBzdGFja1Byb2dyZXNzIHByZWZlcmVuY2UuXG4gICAqL1xuICBwdWJsaWMgc2V0IHN0YWNrUHJvZ3Jlc3ModHlwZTogU3RhY2tBY3Rpdml0eVByb2dyZXNzKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0YWNrUHJvZ3Jlc3MgdmFsdWUuXG4gICAqXG4gICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IG90aGVyIHN0YXRlIG9mIHRoZSBpb0hvc3QsXG4gICAqIGxpa2UgaWYgaXNUVFkgYW5kIGlzQ0kuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YWNrUHJvZ3Jlc3MoKTogU3RhY2tBY3Rpdml0eVByb2dyZXNzIHtcbiAgICAvLyBXZSBjYW4gYWx3YXlzIHVzZSBFVkVOVFMgYW5kIEVSUk9SU19PTkxZXG4gICAgaWYgKHRoaXMuX3Byb2dyZXNzID09PSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVZFTlRTIHx8IHRoaXMuX3Byb2dyZXNzID09PSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVJST1JTX09OTFkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzcztcbiAgICB9XG5cbiAgICAvLyBpZiBhIGRlYnVnIG1lc3NhZ2UgKGFuZCB0aHVzIGFueSBtb3JlIHZlcmJvc2UgbWVzc2FnZXMpIGFyZSByZWxldmFudCB0byB0aGUgY3VycmVudCBsb2cgbGV2ZWwsIHdlIGhhdmUgdmVyYm9zZSBsb2dnaW5nXG4gICAgY29uc3QgdmVyYm9zZUxvZ2dpbmcgPSBpc01lc3NhZ2VSZWxldmFudEZvckxldmVsKHsgbGV2ZWw6ICdkZWJ1ZycgfSwgdGhpcy5sb2dMZXZlbCk7XG4gICAgaWYgKHZlcmJvc2VMb2dnaW5nKSB7XG4gICAgICByZXR1cm4gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVWRU5UUztcbiAgICB9XG5cbiAgICAvLyBPbiBXaW5kb3dzIHdlIGNhbm5vdCB1c2UgZmFuY3kgb3V0cHV0XG4gICAgY29uc3QgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbiAgICBpZiAoaXNXaW5kb3dzKSB7XG4gICAgICByZXR1cm4gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVWRU5UUztcbiAgICB9XG5cbiAgICAvLyBPbiBzb21lIENJIHN5c3RlbXMgKHN1Y2ggYXMgQ2lyY2xlQ0kpIG91dHB1dCBzdGlsbCByZXBvcnRzIGFzIGEgVFRZIHNvIHdlIGFsc29cbiAgICAvLyBuZWVkIGFuIGluZGl2aWR1YWwgY2hlY2sgZm9yIHdoZXRoZXIgd2UncmUgcnVubmluZyBvbiBDSS5cbiAgICAvLyBzZWU6IGh0dHBzOi8vZGlzY3Vzcy5jaXJjbGVjaS5jb20vdC9jaXJjbGVjaS10ZXJtaW5hbC1pcy1hLXR0eS1idXQtdGVybS1pcy1ub3Qtc2V0Lzk5NjVcbiAgICBjb25zdCBmYW5jeU91dHB1dEF2YWlsYWJsZSA9IHRoaXMuaXNUVFkgJiYgIXRoaXMuaXNDSTtcbiAgICBpZiAoIWZhbmN5T3V0cHV0QXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVWRU5UUztcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIHVzZXIgcHJlZmVyZW5jZVxuICAgIHJldHVybiB0aGlzLl9wcm9ncmVzcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVmYXVsdHMoKTogSW9EZWZhdWx0TWVzc2FnZXMge1xuICAgIHJldHVybiB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBhc0lvSGVscGVyKCk6IElvSGVscGVyIHtcbiAgICByZXR1cm4gYXNJb0hlbHBlcih0aGlzLCB0aGlzLmN1cnJlbnRBY3Rpb24gYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGJsb2NrIG9mIGNvZGUgd2l0aCBjb3JrZWQgbG9nZ2luZy4gQWxsIGxvZyBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uXG4gICAqIGFyZSBidWZmZXJlZCBhbmQgb25seSB3cml0dGVuIHdoZW4gYWxsIG5lc3RlZCBjb3JrIGJsb2NrcyBjb21wbGV0ZSAod2hlbiBDT1JLX0NPVU5URVIgcmVhY2hlcyAwKS5cbiAgICogVGhlIGNvcmtpbmcgaXMgYm91bmQgdG8gdGhlIHNwZWNpZmljIGluc3RhbmNlIG9mIHRoZSBDbGlJb0hvc3QuXG4gICAqXG4gICAqIEBwYXJhbSBibG9jayAtIEFzeW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2l0aCBjb3JrZWQgbG9nZ2luZ1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmxvY2sncyByZXR1cm4gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB3aXRoQ29ya2VkTG9nZ2luZzxUPihibG9jazogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHRoaXMuY29ya2VkQ291bnRlcisrO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYmxvY2soKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jb3JrZWRDb3VudGVyLS07XG4gICAgICBpZiAodGhpcy5jb3JrZWRDb3VudGVyID09PSAwKSB7XG4gICAgICAgIC8vIFByb2Nlc3MgZWFjaCBidWZmZXJlZCBtZXNzYWdlIHRocm91Z2ggbm90aWZ5XG4gICAgICAgIHRoaXMuY29ya1JlcGxheWluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpb01lc3NhZ2Ugb2YgdGhpcy5jb3JrZWRMb2dnaW5nQnVmZmVyKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5vdGlmeShpb01lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLmNvcmtSZXBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgYWxsIGJ1ZmZlcmVkIG1lc3NhZ2VzIGluLXBsYWNlXG4gICAgICAgIHRoaXMuY29ya2VkTG9nZ2luZ0J1ZmZlci5zcGxpY2UoMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbGlzdGVuZXIgdGhhdCBpcyBpbnZva2VkIGZvciBldmVyeSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIGNvZGUuXG4gICAqXG4gICAqIFRoZSBsaXN0ZW5lciBtYXkgcmV0dXJuIGEgYE1lc3NhZ2VMaXN0ZW5lclJlc3VsdGAgdG8gdXBkYXRlIHRoZSBtZXNzYWdlXG4gICAqIHRleHQsIGxldmVsLCBhbmQvb3IgYWN0aW9uIG9yIHByZXZlbnQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZyAod3JpdGluZyBpdCB0b1xuICAgKiBhIHN0cmVhbSk7IHJldHVybmluZyBub3RoaW5nIGxlYXZlcyB0aGUgbWVzc2FnZSB1bnRvdWNoZWQuIFRoZSBsaXN0ZW5lciBtYXlcbiAgICogYmUgYXN5bmMgKHJldHVybiBhIGBQcm9taXNlYCk7IHRoZSBob3N0IGF3YWl0cyBpdCBiZWZvcmUgcHJvY2Vzc2luZyB0aGVcbiAgICogbWVzc2FnZSBmdXJ0aGVyLiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBsaXN0ZW5lciBhZ2Fpbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZGlzcG9zZSA9IGlvSG9zdC5vbihJTy5DREtfVE9PTEtJVF9JMjkwMSwgYXN5bmMgKG1zZykgPT4ge1xuICAgKiAgIG15Q291bnQgKz0gbXNnLmRhdGEuc3RhY2tzLmxlbmd0aDtcbiAgICogICBhd2FpdCBwZXJzaXN0KG15Q291bnQpO1xuICAgKiB9KTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gTWF0Y2ggd2l0aCBhIGN1c3RvbSBwcmVkaWNhdGUgaW5zdGVhZCBvZiBhIGNvZGUsIGUuZy4gYSBtYWtlcidzIGAuaXNgOlxuICAgKiBjb25zdCBkaXNwb3NlID0gaW9Ib3N0Lm9uKElPLkNES19UT09MS0lUX0k3MDEwLmlzLCAobXNnKSA9PiAoeyByZXNwb25kOiB0cnVlIH0pKTtcbiAgICovXG4gIHB1YmxpYyBvbjxUPihcbiAgICBzZWxlY3RvcjogSW9NZXNzYWdlTWFrZXI8VD4gfCBJb1JlcXVlc3RNYWtlcjxULCBhbnk+IHwgKChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBtc2cgaXMgSW9NZXNzYWdlPFQ+KSxcbiAgICBsaXN0ZW5lcjogKG1zZzogSW9NZXNzYWdlPFQ+KSA9PiBNZXNzYWdlTGlzdGVuZXJSZXN1bHRPclByb21pc2UsXG4gICk6IERpc3Bvc2VMaXN0ZW5lcjtcbiAgcHVibGljIG9uKFxuICAgIHByZWRpY2F0ZTogKG1zZzogSW9NZXNzYWdlPGFueT4pID0+IGJvb2xlYW4sXG4gICAgbGlzdGVuZXI6IChtc2c6IElvTWVzc2FnZTx1bmtub3duPikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlLFxuICApOiBEaXNwb3NlTGlzdGVuZXI7XG4gIHB1YmxpYyBvbihzZWxlY3RvcjogTWVzc2FnZVNlbGVjdG9yPGFueT4sIGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXJGbik6IERpc3Bvc2VMaXN0ZW5lciB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTWVzc2FnZUxpc3RlbmVyKHsgb25jZTogZmFsc2UsIGZuOiBsaXN0ZW5lciwgbWF0Y2hlczogbWVzc2FnZU1hdGNoZXIoc2VsZWN0b3IpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgaXMgaW52b2tlZCBmb3IgZXZlcnkgbWVzc2FnZSB0aGUgaG9zdCBoYW5kbGVzIOKAlFxuICAgKiBib3RoIG5vdGlmaWNhdGlvbnMgYW5kIHJlcXVlc3RzIOKAlCB3aXRoIHRoZSBkaXNwb3NpdGlvbiB0aGUgaG9zdCBjb21wdXRlZFxuICAgKiBmb3IgaXQgKGl0cyBlZmZlY3RpdmUgZm9ybSBhZnRlciBsaXN0ZW5lcnMgYW5kIHdoZXRoZXIgaXQgd2FzIGRyb3BwZWQpLiBGb3JcbiAgICogYSByZXF1ZXN0LCB0aGUgcmVzb2x2ZWQgYW5zd2VyIGlzIHRoZSBlZmZlY3RpdmUgbWVzc2FnZSdzIGBkZWZhdWx0UmVzcG9uc2VgLlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBvYnNlcnZlci5cbiAgICpcbiAgICogQHNlZSBPYnNlcnZhYmxlSW9Ib3N0XG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZU1lc3NhZ2VzKG9ic2VydmVyOiAob2JzZXJ2YXRpb246IElvTWVzc2FnZU9ic2VydmF0aW9uKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlT2JzZXJ2ZXJzLmFkZChvYnNlcnZlcik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZU9ic2VydmVycy5kZWxldGUob2JzZXJ2ZXIpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTGlrZSBgb25gLCBidXQgdGhlIGxpc3RlbmVyIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBhZnRlciBpdCBoYXMgYmVlblxuICAgKiBpbnZva2VkIG9uY2UuXG4gICAqL1xuICBwdWJsaWMgb25jZTxUPihcbiAgICBzZWxlY3RvcjogSW9NZXNzYWdlTWFrZXI8VD4gfCBJb1JlcXVlc3RNYWtlcjxULCBhbnk+IHwgKChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBtc2cgaXMgSW9NZXNzYWdlPFQ+KSxcbiAgICBsaXN0ZW5lcjogKG1zZzogSW9NZXNzYWdlPFQ+KSA9PiBNZXNzYWdlTGlzdGVuZXJSZXN1bHRPclByb21pc2UsXG4gICk6IERpc3Bvc2VMaXN0ZW5lcjtcbiAgcHVibGljIG9uY2UoXG4gICAgcHJlZGljYXRlOiAobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gYm9vbGVhbixcbiAgICBsaXN0ZW5lcjogKG1zZzogSW9NZXNzYWdlPHVua25vd24+KSA9PiBNZXNzYWdlTGlzdGVuZXJSZXN1bHRPclByb21pc2UsXG4gICk6IERpc3Bvc2VMaXN0ZW5lcjtcbiAgcHVibGljIG9uY2Uoc2VsZWN0b3I6IE1lc3NhZ2VTZWxlY3Rvcjxhbnk+LCBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyRm4pOiBEaXNwb3NlTGlzdGVuZXIge1xuICAgIHJldHVybiB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7IG9uY2U6IHRydWUsIGZuOiBsaXN0ZW5lciwgbWF0Y2hlczogbWVzc2FnZU1hdGNoZXIoc2VsZWN0b3IpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBldmVyeSBtZXNzYWdlIGxpc3RlbmVyIHJlZ2lzdGVyZWQgdmlhIGBvbmAvYG9uY2VgL2ByZXdyaXRlYC9gcmVzcG9uZGAuXG4gICAqXG4gICAqIFRoZSBob3N0J3Mgb3duIGludGVybmFsIGxpc3RlbmVycyAoc3VjaCBhcyBzdGFjay1hY3Rpdml0eSByb3V0aW5nKSBhcmUga2VwdCxcbiAgICogc28gdGhlIGhvc3Qga2VlcHMgd29ya2luZyBhZnRlcndhcmRzLiBNZXNzYWdlIG9ic2VydmVycyByZWdpc3RlcmVkIHZpYVxuICAgKiBgb2JzZXJ2ZU1lc3NhZ2VzYCBhcmUgYSBzZXBhcmF0ZSBtZWNoYW5pc20gYW5kIGFyZSBub3QgYWZmZWN0ZWQuXG4gICAqXG4gICAqIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCBmb3IgdGVzdHMgdGhhdCBzaGFyZSB0aGUgc2luZ2xldG9uIGhvc3QgYW5kIG5lZWQgdG9cbiAgICogcmVzZXQgbGlzdGVuZXIgc3RhdGUgYmV0d2VlbiBjYXNlcyAoYSBsZWZ0b3ZlciBsaXN0ZW5lciB3b3VsZCBvdGhlcndpc2VcbiAgICogbGVhayBpbnRvIHRoZSBuZXh0IHRlc3QpLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBEcm9wIHVzZXIgbGlzdGVuZXJzIGluIHBsYWNlIChwcmVzZXJ2aW5nIGFycmF5IGlkZW50aXR5IGZvciBhbnlcbiAgICAvLyBvdXRzdGFuZGluZyBkaXNwb3NlIGNsb3N1cmVzKTsga2VlcCB0aGUgaG9zdCdzIGludGVybmFsIGxpc3RlbmVycy5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5tZXNzYWdlTGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoIXRoaXMubWVzc2FnZUxpc3RlbmVyc1tpXS5pbnRlcm5hbCkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbnN3ZXIgYSByZXF1ZXN0IChieSBpdHMgY29kZSkgb24gdGhlIHVzZXIncyBiZWhhbGYgd2l0aCBhIGZpeGVkIHZhbHVlLCBzb1xuICAgKiB0aGUgaG9zdCBkb2VzIG5vdCBwcm9tcHQuIFN5bnRhY3RpYyBzdWdhciBmb3IgYW4gYG9uYCBsaXN0ZW5lciByZXR1cm5pbmdcbiAgICogYHsgcmVzcG9uZDogdmFsdWUsIHByZXZlbnREZWZhdWx0OiBzdXBwcmVzc1F1ZXN0aW9uIH1gOyBmb3IgY29uZGl0aW9uYWxcbiAgICogYW5zd2VycyBvciB0byBhbHNvIHJld29yZCB0aGUgcXVlc3Rpb24sIHVzZSBgb25gL2BvbmNlYCBkaXJlY3RseS4gUmV0dXJucyBhXG4gICAqIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgcmVzcG9uZGVyIGFnYWluLlxuICAgKlxuICAgKiBAcGFyYW0gc3VwcHJlc3NRdWVzdGlvbiAtIHdoZXRoZXIgdG8gYWxzbyBzdXBwcmVzcyB3cml0aW5nIHRoZSBxdWVzdGlvbiB0ZXh0LlxuICAgKiAgIERlZmF1bHRzIHRvIGB0cnVlYCAoYW5zd2VyIHNpbGVudGx5KS4gUGFzcyBgZmFsc2VgIHRvIHN0aWxsIHN1cmZhY2UgdGhlXG4gICAqICAgcXVlc3Rpb24gd2hpbGUgYW5zd2VyaW5nIGl0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBVbmRlciAtLWZvcmNlLCBhdXRvLWNvbmZpcm0gdGhlIGRlc3Ryb3kgcHJvbXB0IHdpdGhvdXQgcHJvbXB0aW5nLlxuICAgKiBjb25zdCBkaXNwb3NlID0gaW9Ib3N0LnJlc3BvbmQoSU8uQ0RLX1RPT0xLSVRfSTcwMTAsIHRydWUpO1xuICAgKi9cbiAgcHVibGljIHJlc3BvbmQ8VCwgVT4oY29kZTogSW9SZXF1ZXN0TWFrZXI8VCwgVT4sIHZhbHVlOiBVLCBzdXBwcmVzc1F1ZXN0aW9uID0gdHJ1ZSk6IERpc3Bvc2VMaXN0ZW5lciB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTWVzc2FnZUxpc3RlbmVyKHsgb25jZTogZmFsc2UsIGZuOiAoKSA9PiAoeyByZXNwb25kOiB2YWx1ZSwgcHJldmVudERlZmF1bHQ6IHN1cHByZXNzUXVlc3Rpb24gfSksIG1hdGNoZXM6IG1lc3NhZ2VNYXRjaGVyKGNvZGUpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgYHJlc3BvbmRgLCBidXQgdGhlIGFuc3dlciBpcyBnaXZlbiBvbmx5IG9uY2UgYW5kIHRoZW4gcmVtb3ZlZC5cbiAgICovXG4gIHB1YmxpYyByZXNwb25kT25jZTxULCBVPihjb2RlOiBJb1JlcXVlc3RNYWtlcjxULCBVPiwgdmFsdWU6IFUsIHN1cHByZXNzUXVlc3Rpb24gPSB0cnVlKTogRGlzcG9zZUxpc3RlbmVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGRNZXNzYWdlTGlzdGVuZXIoeyBvbmNlOiB0cnVlLCBmbjogKCkgPT4gKHsgcmVzcG9uZDogdmFsdWUsIHByZXZlbnREZWZhdWx0OiBzdXBwcmVzc1F1ZXN0aW9uIH0pLCBtYXRjaGVzOiBtZXNzYWdlTWF0Y2hlcihjb2RlKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGZvcm1hdHRlciB0aGF0IHJlcGxhY2VzIHRoZSBwcmludGVkIHRleHQgb2YgbWVzc2FnZXMgd2l0aCB0aGVcbiAgICogZ2l2ZW4gY29kZS4gVGhpcyBsZXRzIGEgY2FsbGVyIGRlZmluZSBfaG93XyBhIHRvb2xraXQgbWVzc2FnZSBpcyBwcmVzZW50ZWRcbiAgICogd2l0aG91dCB0aGUgSW9Ib3N0IG5lZWRpbmcgdG8ga25vdyBhYm91dCBpdC5cbiAgICpcbiAgICogT3B0aW9uYWxseSBwYXNzIGEgYGxldmVsYCB0byBhbHNvIG92ZXJyaWRlIHRoZSBtZXNzYWdlJ3MgbGV2ZWwgKHdoaWNoIG1vdmVzXG4gICAqIGl0IGJldHdlZW4gc3Rkb3V0L3N0ZGVyciBhbmQgY2hhbmdlcyB2ZXJib3NpdHkgZmlsdGVyaW5nKS4gRm9yIHRoZSByYXJlclxuICAgKiBjYXNlIG9mIG92ZXJyaWRpbmcgb25seSB0aGUgbGV2ZWwsIHVzZSBgb25gL2BvbmNlYCByZXR1cm5pbmcgYHsgbGV2ZWwgfWAuXG4gICAqXG4gICAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYW4gYG9uYCBsaXN0ZW5lciB0aGF0IHJldHVybnMgYHsgbWVzc2FnZSwgbGV2ZWw/IH1gLlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBmb3JtYXR0ZXIgYWdhaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGRpc3Bvc2UgPSBpb0hvc3QucmV3cml0ZShJTy5DREtfVE9PTEtJVF9JMjkwMSwgKG1zZykgPT5cbiAgICogICBzZXJpYWxpemVTdHJ1Y3R1cmUobXNnLmRhdGEuc3RhY2tzLCB0cnVlKSk7XG4gICAqL1xuICBwdWJsaWMgcmV3cml0ZTxUPihcbiAgICBjb2RlOiBJb01lc3NhZ2VNYWtlcjxUPiB8IElvUmVxdWVzdE1ha2VyPFQsIGFueT4sXG4gICAgZm9ybWF0dGVyOiAobXNnOiBJb01lc3NhZ2U8VD4pID0+IHN0cmluZyxcbiAgICBsZXZlbD86IElvTWVzc2FnZUxldmVsLFxuICApOiBEaXNwb3NlTGlzdGVuZXIge1xuICAgIHJldHVybiB0aGlzLm9uKGNvZGUsIChtc2cpID0+ICh7IG1lc3NhZ2U6IGZvcm1hdHRlcihtc2cpLCAuLi4obGV2ZWwgIT09IHVuZGVmaW5lZCA/IHsgbGV2ZWwgfSA6IHt9KSB9KSk7XG4gIH1cblxuICAvKipcbiAgICogTGlrZSBgcmV3cml0ZWAsIGJ1dCB0aGUgZm9ybWF0dGVyIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBhZnRlciBpdCBoYXNcbiAgICogYmVlbiBhcHBsaWVkIG9uY2UuXG4gICAqL1xuICBwdWJsaWMgcmV3cml0ZU9uY2U8VD4oXG4gICAgY29kZTogSW9NZXNzYWdlTWFrZXI8VD4gfCBJb1JlcXVlc3RNYWtlcjxULCBhbnk+LFxuICAgIGZvcm1hdHRlcjogKG1zZzogSW9NZXNzYWdlPFQ+KSA9PiBzdHJpbmcsXG4gICAgbGV2ZWw/OiBJb01lc3NhZ2VMZXZlbCxcbiAgKTogRGlzcG9zZUxpc3RlbmVyIHtcbiAgICByZXR1cm4gdGhpcy5vbmNlKGNvZGUsIChtc2cpID0+ICh7IG1lc3NhZ2U6IGZvcm1hdHRlcihtc2cpLCAuLi4obGV2ZWwgIT09IHVuZGVmaW5lZCA/IHsgbGV2ZWwgfSA6IHt9KSB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbGlzdGVuZXIgdG8gdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gYSByZW1vdmVyIGZvciBpdCAoY2FsbGFibGUgYW5kXG4gICAqIGB1c2luZ2AtY29tcGF0aWJsZSwgc2VlIGBEaXNwb3NlTGlzdGVuZXJgKS5cbiAgICovXG4gIHByaXZhdGUgYWRkTWVzc2FnZUxpc3RlbmVyKGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIpOiBEaXNwb3NlTGlzdGVuZXIge1xuICAgIHRoaXMubWVzc2FnZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBkaXNwb3NlTGlzdGVuZXIoKCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gZXZlcnkgcmVnaXN0ZXJlZCBsaXN0ZW5lciB0aGF0IG1hdGNoZXMgdGhlIG1lc3NhZ2UsIGluIHJlZ2lzdHJhdGlvblxuICAgKiBvcmRlci4gQSBsaXN0ZW5lciBtYXRjaGVzIGJ5IGl0cyBjb2RlIChtYWtlcikgb3IgaXRzIGN1c3RvbSBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEEgbGlzdGVuZXIgbWF5IHVwZGF0ZSB0aGUgbWVzc2FnZSB0ZXh0LCBsZXZlbCwgYW5kL29yIGFjdGlvbiAocGFzc2VkIG9uIHRvXG4gICAqIHN1YnNlcXVlbnQgbGlzdGVuZXJzIGFuZCB0aGUgcmVzdCBvZiB0aGUgcGlwZWxpbmUpLCBwcmV2ZW50IHRoZSBkZWZhdWx0XG4gICAqIHByb2Nlc3NpbmcsIG9yIChmb3IgcmVxdWVzdHMpIGFuc3dlciBpdC4gYG9uY2VgIGxpc3RlbmVycyBhcmUgcmVtb3ZlZCBhZnRlclxuICAgKiB0aGV5IGhhdmUgcnVuLiBNYXRjaGluZyBpcyBkZWNpZGVkIGFnYWluc3QgdGhlIG1lc3NhZ2UgYXMgZW1pdHRlZCwgc28gYVxuICAgKiB0cmFuc2Zvcm1hdGlvbiBieSBhbiBlYXJsaWVyIGxpc3RlbmVyIGRvZXMgbm90IGNoYW5nZSB3aGljaCBsYXRlciBsaXN0ZW5lcnNcbiAgICogYXBwbHkuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIChwb3NzaWJseSB1cGRhdGVkKSBtZXNzYWdlLCB3aGV0aGVyIHRoZSBkZWZhdWx0IHByb2Nlc3Npbmcgd2FzXG4gICAqIHByZXZlbnRlZCwgYW5kIHdoZXRoZXIgYSBsaXN0ZW5lciBhbnN3ZXJlZCB0aGUgcmVxdWVzdCAoYW5kIHdpdGggd2hhdCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFwcGx5TWVzc2FnZUxpc3RlbmVyczxUIGV4dGVuZHMgSW9NZXNzYWdlPHVua25vd24+Pihtc2c6IFQpOiBQcm9taXNlPHtcbiAgICBtZXNzYWdlOiBUO1xuICAgIHByZXZlbnREZWZhdWx0OiBib29sZWFuO1xuICAgIHJlc3BvbmRlZDogYm9vbGVhbjtcbiAgfT4ge1xuICAgIGxldCBjdXJyZW50ID0gbXNnO1xuICAgIGxldCBwcmV2ZW50RGVmYXVsdCA9IGZhbHNlO1xuICAgIGxldCByZXNwb25kZWQgPSBmYWxzZTtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYSBjb3B5IHNvIHRoYXQgYG9uY2VgIGxpc3RlbmVycyBjYW4gcmVtb3ZlIHRoZW1zZWx2ZXMgc2FmZWx5LlxuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgWy4uLnRoaXMubWVzc2FnZUxpc3RlbmVyc10pIHtcbiAgICAgIC8vIE1hdGNoIGFnYWluc3QgdGhlIGVtaXR0ZWQgbWVzc2FnZTsgYSBsaXN0ZW5lciByZWNlaXZlcyB0aGUgY3VtdWxhdGl2ZWx5XG4gICAgICAvLyB0cmFuc2Zvcm1lZCBgY3VycmVudGAgbWVzc2FnZS5cbiAgICAgIGlmICghbGlzdGVuZXIubWF0Y2hlcyhtc2cpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW5lcnMgbWF5IGJlIGFzeW5jOyBhd2FpdCBlYWNoIG9uZSBiZWZvcmUgcnVubmluZyB0aGUgbmV4dCBzbyB0aGVcbiAgICAgIC8vIGN1bXVsYXRpdmUgZWZmZWN0IG9uIHRoZSBtZXNzYWdlIHN0YXlzIG9yZGVyLWRldGVybWluaXN0aWMuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsaXN0ZW5lci5mbihjdXJyZW50KTtcblxuICAgICAgaWYgKGxpc3RlbmVyLm9uY2UpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGN1cnJlbnQgPSB7IC4uLmN1cnJlbnQsIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5sZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY3VycmVudCA9IHsgLi4uY3VycmVudCwgbGV2ZWw6IHJlc3VsdC5sZXZlbCB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuYWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjdXJyZW50ID0geyAuLi5jdXJyZW50LCBhY3Rpb246IHJlc3VsdC5hY3Rpb24gfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgncmVzcG9uZCcgaW4gcmVzdWx0ICYmICdkZWZhdWx0UmVzcG9uc2UnIGluIG1zZykge1xuICAgICAgICAgIC8vIEZvbGQgdGhlIGFuc3dlciBpbnRvIHRoZSByZXF1ZXN0J3MgZGVmYXVsdCByZXNwb25zZSBhbmQgbWFyayBpdFxuICAgICAgICAgIC8vIGFuc3dlcmVkLCBzbyB3ZSBza2lwIHByb21wdGluZyBhbmQgcmVzb2x2ZSB3aXRoIHRoaXMgdmFsdWUuXG4gICAgICAgICAgY3VycmVudCA9IHsgLi4uY3VycmVudCwgZGVmYXVsdFJlc3BvbnNlOiByZXN1bHQucmVzcG9uZCB9O1xuICAgICAgICAgIHJlc3BvbmRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBtZXNzYWdlOiBjdXJyZW50LCBwcmV2ZW50RGVmYXVsdCwgcmVzcG9uZGVkIH07XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgdGhlIGhvc3Qgb2YgYSBtZXNzYWdlLlxuICAgKiBUaGUgY2FsbGVyIHdhaXRzIHVudGlsIHRoZSBub3RpZmljYXRpb24gY29tcGxldGVzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG5vdGlmeShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubWF5YmVFbWl0VGVsZW1ldHJ5KG1zZyk7XG5cbiAgICAvLyBSdW4gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLiBBIGxpc3RlbmVyIG1heSB1cGRhdGUgdGhlIG1lc3NhZ2UgdGV4dCxcbiAgICAvLyBsZXZlbCwgYW5kL29yIGFjdGlvbiBvciBwcmV2ZW50IHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcgKGUuZy5cbiAgICAvLyBzdGFjay1hY3Rpdml0eSBtZXNzYWdlcyBhcmUgcm91dGVkIHRvIHRoZSBhY3Rpdml0eSBwcmludGVyIGFuZCBub3RcbiAgICAvLyB3cml0dGVuIHRvIGEgc3RyZWFtKS5cbiAgICAvL1xuICAgIC8vIFNraXAgdGhpcyB3aGlsZSByZXBsYXlpbmcgY29ya2VkIG1lc3NhZ2VzOiB0aGUgbGlzdGVuZXJzIGFscmVhZHkgcmFuIG9uXG4gICAgLy8gdGhlIGZpcnN0IHBhc3MsIGFuZCBydW5uaW5nIHRoZW0gYWdhaW4gd291bGQgcmUtdHJhbnNmb3JtIGFuXG4gICAgLy8gYWxyZWFkeS10cmFuc2Zvcm1lZCBtZXNzYWdlLlxuICAgIGNvbnN0IHsgbWVzc2FnZSwgcHJldmVudERlZmF1bHQgfSA9IHRoaXMuY29ya1JlcGxheWluZ1xuICAgICAgPyB7IG1lc3NhZ2U6IG1zZywgcHJldmVudERlZmF1bHQ6IGZhbHNlIH1cbiAgICAgIDogYXdhaXQgdGhpcy5hcHBseU1lc3NhZ2VMaXN0ZW5lcnMobXNnKTtcblxuICAgIC8vIFRlbGwgb2JzZXJ2ZXJzIGhvdyB0aGlzIG1lc3NhZ2Ugd2FzIGhhbmRsZWQgKGl0cyBlZmZlY3RpdmUgZm9ybSBhbmRcbiAgICAvLyB3aGV0aGVyIGl0IHdhcyBkcm9wcGVkKS4gU2tpcHBlZCB3aGlsZSByZXBsYXlpbmcgY29ya2VkIG1lc3NhZ2VzIHNvIGVhY2hcbiAgICAvLyBtZXNzYWdlIGlzIG9ic2VydmVkIGV4YWN0bHkgb25jZS5cbiAgICBpZiAoIXRoaXMuY29ya1JlcGxheWluZykge1xuICAgICAgdGhpcy5ub3RpZnlPYnNlcnZlcnMoeyB0eXBlOiAnbm90aWZ5JywgZW1pdHRlZDogbXNnLCBlZmZlY3RpdmU6IG1lc3NhZ2UsIGRyb3BwZWQ6IHByZXZlbnREZWZhdWx0IH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2ZW50RGVmYXVsdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMud3JpdGVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmeSBldmVyeSByZWdpc3RlcmVkIG1lc3NhZ2Ugb2JzZXJ2ZXIgb2YgaG93IGEgbWVzc2FnZSBvciByZXF1ZXN0IHdhc1xuICAgKiBoYW5kbGVkLiBBIG5vLW9wIHdoZW4gbm90aGluZyBpcyBvYnNlcnZpbmcgKGkuZS4gb3V0c2lkZSBvZiB0ZXN0cyksIHNvIHRoZVxuICAgKiBzdXJyb3VuZGluZyBob3QgcGF0aHMgcGF5IG5vdGhpbmcgaW4gcHJvZHVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgbm90aWZ5T2JzZXJ2ZXJzKG9ic2VydmF0aW9uOiBJb01lc3NhZ2VPYnNlcnZhdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VPYnNlcnZlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9ic2VydmVyIG9mIHRoaXMubWVzc2FnZU9ic2VydmVycykge1xuICAgICAgb2JzZXJ2ZXIob2JzZXJ2YXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBhIChhbHJlYWR5IGxpc3RlbmVyLXByb2Nlc3NlZCkgbWVzc2FnZSB0byBpdHMgdGFyZ2V0IHN0cmVhbSwgaG9ub3JpbmdcbiAgICogdGhlIGxvZyBsZXZlbCBhbmQgY29ya2VkLWxvZ2dpbmcgYnVmZmVyLiBTaGFyZWQgYnkgYG5vdGlmeWAgYW5kIHRoZVxuICAgKiBub24tcHJvbXB0aW5nIGByZXF1ZXN0UmVzcG9uc2VgIHBhdGguXG4gICAqL1xuICBwcml2YXRlIHdyaXRlTWVzc2FnZShtZXNzYWdlOiBJb01lc3NhZ2U8dW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoIWlzTWVzc2FnZVJlbGV2YW50Rm9yTGV2ZWwobWVzc2FnZSwgdGhpcy5sb2dMZXZlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3JrZWRDb3VudGVyID4gMCkge1xuICAgICAgdGhpcy5jb3JrZWRMb2dnaW5nQnVmZmVyLnB1c2gobWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5mb3JtYXRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc2VsZWN0U3RyZWFtKG1lc3NhZ2UpO1xuICAgIHN0cmVhbT8ud3JpdGUob3V0cHV0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWF5YmVFbWl0VGVsZW1ldHJ5KG1zZzogSW9NZXNzYWdlPHVua25vd24+KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbGVtZXRyeUV2ZW50ID0gZXZlbnRGcm9tTWVzc2FnZShtc2cpO1xuICAgICAgaWYgKHRlbGVtZXRyeUV2ZW50KSB7XG4gICAgICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Py5lbWl0KHRlbGVtZXRyeUV2ZW50KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVmYXVsdHMudHJhY2UoYEVtaXQgVGVsZW1ldHJ5IEZhaWxlZCAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgc3RhY2stYWN0aXZpdHkgbWVzc2FnZXMgdG8gdGhlIGFjdGl2aXR5IHByaW50ZXIgKHByb2dyZXNzIGJhciBvclxuICAgKiBldmVudCBsaXN0KSByYXRoZXIgdGhhbiB3cml0aW5nIHRoZW0gdG8gYSBzdHJlYW0uXG4gICAqXG4gICAqIEltcGxlbWVudGVkIGFzIGxpc3RlbmVycyB0aGF0IGhhbmRsZSB0aGUgbWVzc2FnZSB2aWEgdGhlIHByaW50ZXIgYW5kXG4gICAqIHByZXZlbnQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZywgc28gdGhlIHJlc3Qgb2YgdGhlIHBpcGVsaW5lIGRvZXMgbm90IGFsc29cbiAgICogZW1pdCB0aGVtLiBUaGUgcHJpbnRlciBpcyBjcmVhdGVkIGxhemlseSBvbiB0aGUgZmlyc3Qgc3RhY2stYWN0aXZpdHkgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgcm91dGVTdGFja0FjdGl2aXR5VG9QcmludGVyKCkge1xuICAgIGNvbnN0IHJvdXRlID0gKG1zZzogSW9NZXNzYWdlPHVua25vd24+KTogTWVzc2FnZUxpc3RlbmVyUmVzdWx0ID0+IHtcbiAgICAgIGlmICghdGhpcy5hY3Rpdml0eVByaW50ZXIpIHtcbiAgICAgICAgdGhpcy5hY3Rpdml0eVByaW50ZXIgPSB0aGlzLm1ha2VBY3Rpdml0eVByaW50ZXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWN0aXZpdHlQcmludGVyLm5vdGlmeShtc2cpO1xuICAgICAgcmV0dXJuIHsgcHJldmVudERlZmF1bHQ6IHRydWUgfTsgLy8gaGFuZGxlZCBieSB0aGUgcHJpbnRlcjsgZG9uJ3QgYWxzbyB3cml0ZSB0byBhIHN0cmVhbVxuICAgIH07XG5cbiAgICAvLyBBIHNpbmdsZSBpbnRlcm5hbCBsaXN0ZW5lciAoc28gaXQgc3Vydml2ZXMgYHJlbW92ZUFsbExpc3RlbmVycygpYCBhbmQgdGhlXG4gICAgLy8gaG9zdCBrZWVwcyByb3V0aW5nIHN0YWNrIGFjdGl2aXR5KSBtYXRjaGluZyBhbnkgb2YgdGhlIGFjdGl2aXR5IGNvZGVzLlxuICAgIHRoaXMuYWRkTWVzc2FnZUxpc3RlbmVyKHtcbiAgICAgIG9uY2U6IGZhbHNlLFxuICAgICAgaW50ZXJuYWw6IHRydWUsXG4gICAgICBmbjogcm91dGUsXG4gICAgICBtYXRjaGVzOiBtYXRjaEFueShJTy5DREtfVE9PTEtJVF9JNTUwMSwgSU8uQ0RLX1RPT0xLSVRfSTU1MDIsIElPLkNES19UT09MS0lUX0k1NTAzKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3Qgc3BlY2lhbCBtZXNzYWdlcyBlbmNvZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBvciBub3RcbiAgICogdGhleSByZXF1aXJlIGFwcHJvdmFsXG4gICAqL1xuICBwcml2YXRlIHNraXBBcHByb3ZhbFN0ZXAobXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgYXBwcm92YWxUb29sa2l0Q29kZXMgPSBbJ0NES19UT09MS0lUX0k1MDYwJ107XG4gICAgaWYgKCEobXNnLmNvZGUgJiYgYXBwcm92YWxUb29sa2l0Q29kZXMuaW5jbHVkZXMobXNnLmNvZGUpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5yZXF1aXJlRGVwbG95QXBwcm92YWwpIHtcbiAgICAgIC8vIE5ldmVyIHJlcXVpcmUgYXBwcm92YWxcbiAgICAgIGNhc2UgUmVxdWlyZUFwcHJvdmFsLk5FVkVSOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIC8vIEFsd2F5cyByZXF1aXJlIGFwcHJvdmFsXG4gICAgICBjYXNlIFJlcXVpcmVBcHByb3ZhbC5BTllDSEFOR0U6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFJlcXVpcmUgYXBwcm92YWwgaWYgY2hhbmdlcyBpbmNsdWRlIGJyb2FkZW5pbmcgcGVybWlzc2lvbnNcbiAgICAgIGNhc2UgUmVxdWlyZUFwcHJvdmFsLkJST0FERU5JTkc6XG4gICAgICAgIHJldHVybiBbJ25vbmUnLCAnbm9uLWJyb2FkZW5pbmcnXS5pbmNsdWRlcyhtc2cuZGF0YT8ucGVybWlzc2lvbkNoYW5nZVR5cGUpO1xuICAgICAgLy8gUmVxdWlyZSBhcHByb3ZhbCBpZiBjaGFuZ2VzIHJlcGxhY2UsIGRlbGV0ZSBvciBvcnBoYW4gYW4gZXhpc3RpbmcgcmVzb3VyY2VcbiAgICAgIGNhc2UgUmVxdWlyZUFwcHJvdmFsLkRFU1RSVUNUSVZFOlxuICAgICAgICByZXR1cm4gIShtc2cuZGF0YT8uZGVzdHJ1Y3RpdmVDaGFuZ2VzPy5sZW5ndGggPiAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgb3V0cHV0IHN0cmVhbSwgYmFzZWQgb24gbWVzc2FnZSBhbmQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0U3RyZWFtKG1zZzogSW9NZXNzYWdlPGFueT4pOiBOb2RlSlMuV3JpdGVTdHJlYW0gfCB1bmRlZmluZWQge1xuICAgIGlmIChpc05vdGljZXNNZXNzYWdlKG1zZykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRTdHJlYW1PYmplY3QodGhpcy5ub3RpY2VzRGVzdGluYXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdFN0cmVhbUZyb21MZXZlbChtc2cubGV2ZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIG91dHB1dCBzdHJlYW0sIGJhc2VkIG9uIG1lc3NhZ2UgbGV2ZWwgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdFN0cmVhbUZyb21MZXZlbChsZXZlbDogSW9NZXNzYWdlTGV2ZWwpOiBOb2RlSlMuV3JpdGVTdHJlYW0ge1xuICAgIC8vIFRoZSBzdHJlYW0gc2VsZWN0aW9uIHBvbGljeSBmb3IgdGhlIENMSSBpcyB0aGUgZm9sbG93aW5nOlxuICAgIC8vXG4gICAgLy8gICAoMSkgTWVzc2FnZXMgb2YgbGV2ZWwgYHJlc3VsdGAgYWx3YXlzIGdvIHRvIGBzdGRvdXRgXG4gICAgLy8gICAoMikgTWVzc2FnZXMgb2YgbGV2ZWwgYGVycm9yYCBhbHdheXMgZ28gdG8gYHN0ZGVycmAuXG4gICAgLy8gICAoM2EpIEFsbCByZW1haW5pbmcgbWVzc2FnZXMgZ28gdG8gYHN0ZGVycmAuXG4gICAgLy8gICAoM2IpIElmIHdlIGFyZSBpbiBDSSBtb2RlLCBhbGwgcmVtYWluaW5nIG1lc3NhZ2VzIGdvIHRvIGBzdGRvdXRgLlxuICAgIC8vXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRlcnI7XG4gICAgICBjYXNlICdyZXN1bHQnOlxuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5pc0NJID8gcHJvY2Vzcy5zdGRvdXQgOiBwcm9jZXNzLnN0ZGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgdGhlIGhvc3Qgb2YgYSBtZXNzYWdlIHRoYXQgcmVxdWlyZXMgYSByZXNwb25zZS5cbiAgICpcbiAgICogUmVnaXN0ZXJlZCBsaXN0ZW5lcnMgcnVuIGZpcnN0OiBhIGxpc3RlbmVyIG1heSByZXdvcmQgdGhlIHF1ZXN0aW9uIChpdHMgdGV4dFxuICAgKiBvciBsZXZlbCkgb3IgYW5zd2VyIGl0IG91dHJpZ2h0IHZpYSBgcmVzcG9uZGAgKGUuZy4gYC0tZm9yY2VgIGF1dG8tY29uZmlybXNcbiAgICogYSBkZXN0cm95KS4gSWYgbm8gbGlzdGVuZXIgYW5zd2VycyBhbmQgdGhlIGhvc3QgY2Fubm90IHByb21wdCwgdGhlIHN1Z2dlc3RlZFxuICAgKiBkZWZhdWx0IHJlc3BvbnNlIGlzIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdFJlc3BvbnNlPERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KG1zZzogSW9SZXF1ZXN0PERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KTogUHJvbWlzZTxSZXNwb25zZVR5cGU+IHtcbiAgICAvLyBMaXN0ZW5lcnMgcnVuIGV4YWN0bHkgb25jZSBoZXJlIChzbyB3ZSBkb24ndCBnbyBiYWNrIHRocm91Z2ggYG5vdGlmeWApOlxuICAgIC8vIHRoZXkgbWF5IGFuc3dlciB0aGUgcmVxdWVzdCwgb3IgcmV3b3JkL3JlbGV2ZWwvcmV0YWcgdGhlIHF1ZXN0aW9uIHNob3duIGJlbG93LlxuICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ubGlzdGVuZXJSZXN1bHQgfSA9IGF3YWl0IHRoaXMuYXBwbHlNZXNzYWdlTGlzdGVuZXJzKG1zZyk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJlcXVlc3QobWVzc2FnZSwgbGlzdGVuZXJSZXN1bHQpO1xuXG4gICAgLy8gVGVsbCBvYnNlcnZlcnMgaG93IHRoaXMgcmVxdWVzdCB3YXMgaGFuZGxlZDogdGhlIGVmZmVjdGl2ZSAocG9zc2libHkgcmV3b3JkZWQpIHF1ZXN0aW9uXG4gICAgLy8gYW5kIHRoZSByZXNvbHZlZCByZXNwb25zZS4gV2hlbiBhIGxpc3RlbmVyIGFuc3dlcmVkIHRoZSByZXF1ZXN0IHdpdGggdGhlIHF1ZXN0aW9uIHN1cHByZXNzZWRcbiAgICAvLyAoYHByZXZlbnREZWZhdWx0YCwgZS5nLiBgLS1mb3JjZWAgYXV0by1jb25maXJtKSwgaXQgaXMgcmVwb3J0ZWQgYXMgYGRyb3BwZWRgIHNpbmNlIHRoZSB1c2VyIG5ldmVyIHNhdyBpdC5cbiAgICB0aGlzLm5vdGlmeU9ic2VydmVycyh7IHR5cGU6ICdyZXF1ZXN0JywgZW1pdHRlZDogbXNnLCBlZmZlY3RpdmU6IG1lc3NhZ2UsIGRyb3BwZWQ6IGxpc3RlbmVyUmVzdWx0LnByZXZlbnREZWZhdWx0IH0pO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSByZXF1ZXN0IHRvIGl0cyByZXNwb25zZTogYSBsaXN0ZW5lcidzIGFuc3dlciBpZiBvbmUgd2FzIGdpdmVuLFxuICAgKiBvdGhlcndpc2UgdGhlIGFuc3dlciBwcm9tcHRlZCBmcm9tIHRoZSB1c2VyLCBvdGhlcndpc2UgdGhlIHN1Z2dlc3RlZFxuICAgKiBkZWZhdWx0IHdoZW4gdGhlIGhvc3QgY2Fubm90IHByb21wdC5cbiAgICpcbiAgICogS2VwdCBzZXBhcmF0ZSBmcm9tIGByZXF1ZXN0UmVzcG9uc2VgIHNvIHRoZSByZXNwb25zZSBjYW4gYmUgb2JzZXJ2ZWQgaW4gYVxuICAgKiBzaW5nbGUgcGxhY2UgcmVnYXJkbGVzcyBvZiB3aGljaCBvZiB0aGVzZSBwYXRocyBwcm9kdWNlZCBpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlcXVlc3Q8RGF0YVR5cGUsIFJlc3BvbnNlVHlwZT4oXG4gICAgbXNnOiBJb1JlcXVlc3Q8RGF0YVR5cGUsIFJlc3BvbnNlVHlwZT4sXG4gICAgbGlzdGVuZXJSZXN1bHQ6IHsgcHJldmVudERlZmF1bHQ6IGJvb2xlYW47IHJlc3BvbmRlZDogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPFJlc3BvbnNlVHlwZT4ge1xuICAgIC8vIHN0b3AgcHJvY2Vzc2luZywgYSBsaXN0ZW5lciBoYXMgdGFrZW4gY2FyZSBvZiBpdFxuICAgIGlmIChsaXN0ZW5lclJlc3VsdC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBsaXN0ZW5lciBwcm92aWRlZCBhIHJlc3BvbnNlLCB3ZSBza2lwIGludGVyYWN0aW9uXG4gICAgaWYgKCFpc1Byb21wdGFibGVSZXF1ZXN0KG1zZykgfHwgbGlzdGVuZXJSZXN1bHQucmVzcG9uZGVkKSB7XG4gICAgICB0aGlzLndyaXRlTWVzc2FnZShtc2cpO1xuICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLndpdGhDb3JrZWRMb2dnaW5nKGFzeW5jICgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ID0+IHtcbiAgICAgIC8vIHByZXBhcmUgcHJvbXB0IGRhdGFcbiAgICAgIC8vIEB0b2RvIHRoaXMgZm9ybWF0IGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLCBwcm9iYWJseSBzaG91bGQgYmVcbiAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgbW90aXZhdGlvbj86IHN0cmluZztcbiAgICAgICAgY29uY3VycmVuY3k/OiBudW1iZXI7XG4gICAgICAgIHJlc3BvbnNlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICB9ID0gbXNnLmRhdGEgPz8ge307XG5cbiAgICAgIGNvbnN0IG1vdGl2YXRpb24gPSBkYXRhLm1vdGl2YXRpb24gPz8gJ1VzZXIgaW5wdXQgaXMgbmVlZGVkJztcbiAgICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gZGF0YS5jb25jdXJyZW5jeSA/PyAwO1xuICAgICAgY29uc3QgcmVzcG9uc2VEZXNjcmlwdGlvbiA9IGRhdGEucmVzcG9uc2VEZXNjcmlwdGlvbjtcblxuICAgICAgLy8gU3BlY2lhbCBhcHByb3ZhbCBwcm9tcHRcbiAgICAgIC8vIERldGVybWluZSBpZiB0aGUgbWVzc2FnZSBuZWVkcyBhcHByb3ZhbC4gSWYgaXQgZG9lcywgY29udGludWUgKGl0IGlzIGEgYmFzaWMgY29uZmlybWF0aW9uIHByb21wdClcbiAgICAgIC8vIElmIGl0IGRvZXMgbm90LCByZXR1cm4gc3VjY2VzcyAodHJ1ZSkuIFdlIG9ubHkgY2hlY2sgbWVzc2FnZXMgd2l0aCBjb2RlcyB0aGF0IHdlIGFyZSBhd2FyZVxuICAgICAgLy8gYXJlIHJlcXVpcmVzIGFwcHJvdmFsIGNvZGVzLlxuICAgICAgaWYgKHRoaXMuc2tpcEFwcHJvdmFsU3RlcChtc2cpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiAtLXllcyBtb2RlLCByZXNwb25kIGZvciB0aGUgdXNlciBpZiB3ZSBjYW5cbiAgICAgIGlmICh0aGlzLmF1dG9SZXNwb25kKSB7XG4gICAgICAgIC8vIHJlc3BvbmQgd2l0aCB5ZXMgdG8gYWxsIGNvbmZpcm1hdGlvbnNcbiAgICAgICAgaWYgKGlzQ29uZmlybWF0aW9uUHJvbXB0KG1zZykpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlTWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tc2csXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHtjaGFsay5jeWFuKG1zZy5tZXNzYWdlKX0gKGF1dG8tY29uZmlybWVkKWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXNwb25kIHdpdGggdGhlIGRlZmF1bHQgZm9yIGFsbCBvdGhlciBtZXNzYWdlc1xuICAgICAgICBpZiAobXNnLmRlZmF1bHRSZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy53cml0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubXNnLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7Y2hhbGsuY3lhbihtc2cubWVzc2FnZSl9IChhdXRvLXJlc3BvbmRlZCB3aXRoIGRlZmF1bHQ6ICR7dXRpbC5mb3JtYXQobXNnLmRlZmF1bHRSZXNwb25zZSl9KWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb25seSB0YWxrIHRvIHVzZXIgaWYgU1RESU4gaXMgYSB0ZXJtaW5hbCAob3RoZXJ3aXNlLCBmYWlsKVxuICAgICAgaWYgKCF0aGlzLmlzVFRZKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1R0eU5vdEF0dGFjaGVkJywgYCR7bW90aXZhdGlvbn0sIGJ1dCB0ZXJtaW5hbCAoVFRZKSBpcyBub3QgYXR0YWNoZWQgc28gd2UgYXJlIHVuYWJsZSB0byBnZXQgYSBjb25maXJtYXRpb24gZnJvbSB0aGUgdXNlcmApO1xuICAgICAgfVxuXG4gICAgICAvLyBvbmx5IHRhbGsgdG8gdXNlciBpZiBjb25jdXJyZW5jeSBpcyAxIChvdGhlcndpc2UsIGZhaWwpXG4gICAgICBpZiAoY29uY3VycmVuY3kgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0NvbmN1cnJlbmN5Q29uZmxpY3QnLCBgJHttb3RpdmF0aW9ufSwgYnV0IGNvbmN1cnJlbmN5IGlzIGdyZWF0ZXIgdGhhbiAxIHNvIHdlIGFyZSB1bmFibGUgdG8gZ2V0IGEgY29uZmlybWF0aW9uIGZyb20gdGhlIHVzZXJgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQmFzaWMgY29uZmlybWF0aW9uIHByb21wdFxuICAgICAgLy8gV2UgdHJlYXQgYWxsIHJlcXVlc3RzIHdpdGggYSBib29sZWFuIHJlc3BvbnNlIGFzIGNvbmZpcm1hdGlvbiBwcm9tcHRzXG4gICAgICAvLyBUaGUgSW9Ib3N0IG5ldmVyIGFib3J0cyBvbiBhIFwibm9cIjogaXQgcmV0dXJucyB0aGUgYW5zd2VyIGFuZCBsZXRzIHRoZVxuICAgICAgLy8gY2FsbGluZyBhY3Rpb24gZGVjaWRlIHdoYXQgdG8gZG8gKHNvIGFib3J0IGhhbmRsaW5nIGlzIGNvbnNpc3RlbnRcbiAgICAgIC8vIGFjcm9zcyBhY3Rpb25zKS5cbiAgICAgIGlmIChpc0NvbmZpcm1hdGlvblByb21wdChtc2cpKSB7XG4gICAgICAgIHJldHVybiBwcm9tcHRseS5jb25maXJtKGAke2NoYWxrLmN5YW4obXNnLm1lc3NhZ2UpfSAoeS9uKWApO1xuICAgICAgfVxuXG4gICAgICAvLyBBc2tpbmcgZm9yIGEgc3BlY2lmaWMgdmFsdWVcbiAgICAgIGNvbnN0IHByb21wdCA9IGV4dHJhY3RQcm9tcHRJbmZvKG1zZyk7XG4gICAgICBjb25zdCBkZXNjID0gcmVzcG9uc2VEZXNjcmlwdGlvbiA/PyBwcm9tcHQuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IHByb21wdGx5LnByb21wdChgJHtjaGFsay5jeWFuKG1zZy5tZXNzYWdlKX0ke2Rlc2MgPyBgICgke2Rlc2N9KWAgOiAnJ31gLCB7XG4gICAgICAgIGRlZmF1bHQ6IHByb21wdC5kZWZhdWx0LFxuICAgICAgICB0cmltOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJvbXB0LmNvbnZlcnRBbnN3ZXIoYW5zd2VyKTtcbiAgICB9KTtcblxuICAgIC8vIFdlIG5lZWQgdG8gY2FzdCB0aGlzIGJlY2F1c2UgaXQgaXMgaW1wb3NzaWJsZSB0byBuYXJyb3cgdGhlIGdlbmVyaWMgdHlwZVxuICAgIC8vIGlzUHJvbXB0YWJsZVJlcXVlc3QgZW5zdXJlcyB0aGF0IHRoZSByZXNwb25zZSB0eXBlIGlzIG9uZSB3ZSBjYW4gcHJvbXB0IGZvclxuICAgIC8vIHRoZSByZW1haW5pbmcgY29kZSBlbnN1cmUgd2UgYXJlIGluZGVlZCByZXR1cm5pbmcgdGhlIGNvcnJlY3QgdHlwZVxuICAgIHJldHVybiByZXNwb25zZSBhcyBSZXNwb25zZVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBhIG1lc3NhZ2UgZm9yIGNvbnNvbGUgb3V0cHV0IHdpdGggb3B0aW9uYWwgY29sb3Igc3VwcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRNZXNzYWdlKG1zZzogSW9NZXNzYWdlPHVua25vd24+KTogc3RyaW5nIHtcbiAgICAvLyBhcHBseSBwcm92aWRlZCBzdHlsZSBvciBhIGRlZmF1bHQgc3R5bGUgaWYgd2UncmUgaW4gVFRZIG1vZGVcbiAgICBsZXQgbWVzc2FnZV90ZXh0O1xuICAgIGlmIChtc2cuY29kZSA9PT0gJ0NES19UT09MS0lUX0U5NjAwJykge1xuICAgICAgLy8gTWVzc2FnZSBpcyBwcmUtc3R5bGVkXG4gICAgICBtZXNzYWdlX3RleHQgPSBtc2cubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzc2FnZV90ZXh0ID0gdGhpcy5pc1RUWVxuICAgICAgICA/IHN0eWxlTWFwW21zZy5sZXZlbF0obXNnLm1lc3NhZ2UpXG4gICAgICAgIDogbXNnLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gcHJlcGVuZCB0aW1lc3RhbXAgaWYgSW9NZXNzYWdlTGV2ZWwgaXMgREVCVUcgb3IgVFJBQ0UuIFBvc3RwZW5kIGEgbmV3bGluZS5cbiAgICByZXR1cm4gKChtc2cubGV2ZWwgPT09ICdkZWJ1ZycgfHwgbXNnLmxldmVsID09PSAndHJhY2UnKVxuICAgICAgPyBgWyR7dGhpcy5mb3JtYXRUaW1lKG1zZy50aW1lKX1dICR7bWVzc2FnZV90ZXh0fWBcbiAgICAgIDogbWVzc2FnZV90ZXh0KSArICdcXG4nO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgZGF0ZSB0byBISDpNTTpTU1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKGQ6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhZCA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke3BhZChkLmdldEhvdXJzKCkpfToke3BhZChkLmdldE1pbnV0ZXMoKSl9OiR7cGFkKGQuZ2V0U2Vjb25kcygpKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSBvZiB0aGUgQWN0aXZpdHlQcmludGVyXG4gICAqL1xuICBwcml2YXRlIG1ha2VBY3Rpdml0eVByaW50ZXIoKSB7XG4gICAgY29uc3QgcHJvcHM6IEFjdGl2aXR5UHJpbnRlclByb3BzID0ge1xuICAgICAgc3RyZWFtOiB0aGlzLnNlbGVjdFN0cmVhbUZyb21MZXZlbCgnaW5mbycpLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMuc3RhY2tQcm9ncmVzcykge1xuICAgICAgY2FzZSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVZFTlRTOlxuICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlBY3Rpdml0eVByaW50ZXIocHJvcHMpO1xuICAgICAgY2FzZSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSOlxuICAgICAgICByZXR1cm4gbmV3IEN1cnJlbnRBY3Rpdml0eVByaW50ZXIocHJvcHMpO1xuICAgICAgY2FzZSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVJST1JTX09OTFk6XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3JzT25seUFjdGl2aXR5UHJpbnRlcihwcm9wcyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIGBNZXNzYWdlU2VsZWN0b3JgIGludG8gYSBwcmVkaWNhdGUgdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBsaXN0ZW5lclxuICogYXBwbGllcyB0byBhIG1lc3NhZ2UuIEEgbWFrZXIgbWF0Y2hlcyBtZXNzYWdlcyBjYXJyeWluZyBpdHMgYGNvZGVgOyBhXG4gKiBwcmVkaWNhdGUgKGUuZy4gYSBtYWtlcidzIGAuaXNgLCBvciBhbnkgYChtc2cpID0+IGJvb2xlYW5gKSBpcyB1c2VkIGFzLWlzLlxuICovXG5mdW5jdGlvbiBtZXNzYWdlTWF0Y2hlcihzZWxlY3RvcjogTWVzc2FnZVNlbGVjdG9yPGFueT4pOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG4gIGNvbnN0IHsgY29kZSB9ID0gc2VsZWN0b3I7XG4gIHJldHVybiAobXNnKSA9PiBtc2cuY29kZSA9PT0gY29kZTtcbn1cblxuLyoqXG4gKiBDb21iaW5lIHNldmVyYWwgc2VsZWN0b3JzIGludG8gYSBzaW5nbGUgcHJlZGljYXRlIHRoYXQgbWF0Y2hlcyBhIG1lc3NhZ2Ugd2hlblxuICogKmFueSogb2YgdGhlbSBtYXRjaGVzLiBFYWNoIHNlbGVjdG9yIG1heSBiZSBhIG1ha2VyIChtYXRjaGVkIGJ5IGl0cyBgY29kZWApXG4gKiBvciBhIHByZWRpY2F0ZS5cbiAqXG4gKiBVc2VmdWwgZm9yIG9uZSBsaXN0ZW5lciB0aGF0IHNwYW5zIG11bHRpcGxlIGNvZGVzLCBlLmcuXG4gKiBgaW9Ib3N0Lm9uKG1hdGNoQW55KElPLkNES19UT09MS0lUX0k1NTAxLCBJTy5DREtfVE9PTEtJVF9JNTUwMiksIGxpc3RlbmVyKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEFueSguLi5zZWxlY3RvcnM6IE1lc3NhZ2VTZWxlY3Rvcjxhbnk+W10pOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IGJvb2xlYW4ge1xuICBjb25zdCBtYXRjaGVycyA9IHNlbGVjdG9ycy5tYXAobWVzc2FnZU1hdGNoZXIpO1xuICByZXR1cm4gKG1zZykgPT4gbWF0Y2hlcnMuc29tZSgobWF0Y2hlcykgPT4gbWF0Y2hlcyhtc2cpKTtcbn1cblxuLyoqXG4gKiBNZXRob2QgZGVjb3JhdG9yIHRoYXQgc3VwcHJlc3NlcyB0aGUgZ2l2ZW4gSW9Ib3N0IG1lc3NhZ2VzIGZvciB0aGUgZHVyYXRpb25cbiAqIG9mIHRoZSBkZWNvcmF0ZWQgbWV0aG9kLlxuICpcbiAqIEJlZm9yZSB0aGUgbWV0aG9kIHJ1bnMsIGEgc2luZ2xlIGBwcmV2ZW50RGVmYXVsdGAgbGlzdGVuZXIgY292ZXJpbmcgYWxsXG4gKiBnaXZlbiBzZWxlY3RvcnMgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgaW5zdGFuY2UncyBgaW9Ib3N0YDsgd2hlbiB0aGUgbWV0aG9kXG4gKiBzZXR0bGVzIChyZXR1cm5zIG9yIHRocm93cyksIGV4YWN0bHkgdGhhdCBsaXN0ZW5lciBpcyByZW1vdmVkIGFnYWluLiBUaGlzXG4gKiByZXBsYWNlcyB0aGUgbWFudWFsIHBhdHRlcm4gb2YgcmVnaXN0ZXJpbmcgZHJvcC1saXN0ZW5lcnMgYXQgdGhlIHRvcCBvZiBhXG4gKiBtZXRob2QgYW5kIGNsZWFuaW5nIHRoZW0gdXAgaW4gYSBgZmluYWxseWAsIGFuZCDigJQgdW5saWtlIGEgYmxhbmtldFxuICogYHJlbW92ZUFsbExpc3RlbmVycygpYCDigJQgaXQgZG9lcyBub3QgZGlzdHVyYiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBlbHNld2hlcmUuXG4gKlxuICogVGhlIGRlY29yYXRlZCBtZXRob2QgbXVzdCBiZSBhc3luYyBhbmQgbGl2ZSBvbiBhIGNsYXNzIHdob3NlIGluc3RhbmNlcyBjYXJyeVxuICogdGhlIGBDbGlJb0hvc3RgIG9uIGFuIGBpb0hvc3RgIHByb3BlcnR5IChsaWtlIGBDZGtUb29sa2l0YCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIENka1Rvb2xraXQge1xuICogICBcXEBzdXBwcmVzc01lc3NhZ2VzKElPLkNES19UT09MS0lUX0kxMDAxLCBJTy5DREtfVE9PTEtJVF9JMTAwMClcbiAqICAgcHVibGljIGFzeW5jIG1ldGFkYXRhKHN0YWNrTmFtZTogc3RyaW5nLCBqc29uOiBib29sZWFuKSB7XG4gKiAgICAgLy8gSTEwMDEvSTEwMDAgYXJlIGRyb3BwZWQgd2hpbGUgdGhpcyBydW5zXG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHByZXNzTWVzc2FnZXMoLi4uc2VsZWN0b3JzOiBNZXNzYWdlU2VsZWN0b3I8YW55PltdKSB7XG4gIHJldHVybiBmdW5jdGlvbiA8QSBleHRlbmRzIGFueVtdLCBSPihcbiAgICBfdGFyZ2V0OiBvYmplY3QsXG4gICAgX3Byb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8KC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgaWYgKCFvcmlnaW5hbCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignSW52YWxpZERlY29yYXRvclRhcmdldCcsICdzdXBwcmVzc01lc3NhZ2VzIGNhbiBvbmx5IGRlY29yYXRlIG1ldGhvZHMnKTtcbiAgICB9XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiB7IHJlYWRvbmx5IGlvSG9zdDogQ2xpSW9Ib3N0IH0sIC4uLmFyZ3M6IEEpOiBQcm9taXNlPFI+IHtcbiAgICAgIHVzaW5nIF9zdXBwcmVzcyA9IHRoaXMuaW9Ib3N0Lm9uKG1hdGNoQW55KC4uLnNlbGVjdG9ycyksICgpID0+ICh7IHByZXZlbnREZWZhdWx0OiB0cnVlIH0pKTtcbiAgICAgIC8vIGByZXR1cm4gYXdhaXRgIChub3QgYSBiYXJlIGByZXR1cm5gKSBzbyB0aGUgbGlzdGVuZXIgaXMgb25seSBkaXNwb3NlZFxuICAgICAgLy8gYWZ0ZXIgdGhlIG1ldGhvZCBoYXMgYWN0dWFsbHkgc2V0dGxlZC5cbiAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgSW9Ib3N0IGltcGxlbWVudGF0aW9uIGNvbnNpZGVycyBhIHJlcXVlc3QgcHJvbXB0YWJsZSwgaWY6XG4gKiAtIGl0J3MgYSB5ZXMvbm8gY29uZmlybWF0aW9uXG4gKiAtIGFza2luZyBmb3IgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGlzUHJvbXB0YWJsZVJlcXVlc3QobXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KTogbXNnIGlzIElvUmVxdWVzdDxhbnksIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+IHtcbiAgcmV0dXJuIGlzQ29uZmlybWF0aW9uUHJvbXB0KG1zZylcbiAgICB8fCB0eXBlb2YgbXNnLmRlZmF1bHRSZXNwb25zZSA9PT0gJ3N0cmluZydcbiAgICB8fCB0eXBlb2YgbXNnLmRlZmF1bHRSZXNwb25zZSA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgYSBjb25maXJtYXRpb24gcHJvbXB0XG4gKiBXZSB0cmVhdCBhbGwgcmVxdWVzdHMgd2l0aCBhIGJvb2xlYW4gcmVzcG9uc2UgYXMgY29uZmlybWF0aW9uIHByb21wdHNcbiAqL1xuZnVuY3Rpb24gaXNDb25maXJtYXRpb25Qcm9tcHQobXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KTogbXNnIGlzIElvUmVxdWVzdDxhbnksIGJvb2xlYW4+IHtcbiAgcmV0dXJuIHR5cGVvZiBtc2cuZGVmYXVsdFJlc3BvbnNlID09PSAnYm9vbGVhbic7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZm9yIHByb21wdGx5IGZyb20gdGhlIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFByb21wdEluZm8obXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KToge1xuICBkZWZhdWx0OiBzdHJpbmc7XG4gIGRlZmF1bHREZXNjOiBzdHJpbmc7XG4gIGNvbnZlcnRBbnN3ZXI6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmcgfCBudW1iZXI7XG59IHtcbiAgY29uc3QgaXNOdW1iZXIgPSAodHlwZW9mIG1zZy5kZWZhdWx0UmVzcG9uc2UgPT09ICdudW1iZXInKTtcbiAgY29uc3QgZGVmYXVsdFJlc3BvbnNlID0gdXRpbC5mb3JtYXQobXNnLmRlZmF1bHRSZXNwb25zZSk7XG4gIHJldHVybiB7XG4gICAgZGVmYXVsdDogZGVmYXVsdFJlc3BvbnNlLFxuICAgIGRlZmF1bHREZXNjOiAnZGVmYXVsdERlc2NyaXB0aW9uJyBpbiBtc2cgJiYgbXNnLmRlZmF1bHREZXNjcmlwdGlvbiA/IHV0aWwuZm9ybWF0KG1zZy5kZWZhdWx0RGVzY3JpcHRpb24pIDogZGVmYXVsdFJlc3BvbnNlLFxuICAgIGNvbnZlcnRBbnN3ZXI6IGlzTnVtYmVyID8gKHYpID0+IE51bWJlcih2KSA6ICh2KSA9PiBTdHJpbmcodiksXG4gIH07XG59XG5cbmNvbnN0IHN0eWxlTWFwOiBSZWNvcmQ8SW9NZXNzYWdlTGV2ZWwsIChzdHI6IHN0cmluZykgPT4gc3RyaW5nPiA9IHtcbiAgZXJyb3I6IGNoYWxrLnJlZCxcbiAgd2FybjogY2hhbGsueWVsbG93LFxuICByZXN1bHQ6IGNoYWxrLnJlc2V0LFxuICBpbmZvOiBjaGFsay5yZXNldCxcbiAgZGVidWc6IGNoYWxrLmdyYXksXG4gIHRyYWNlOiBjaGFsay5ncmF5LFxufTtcblxuZnVuY3Rpb24gdGFyZ2V0U3RyZWFtT2JqZWN0KHg6IFRhcmdldFN0cmVhbSk6IE5vZGVKUy5Xcml0ZVN0cmVhbSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoeCkge1xuICAgIGNhc2UgJ3N0ZGVycic6XG4gICAgICByZXR1cm4gcHJvY2Vzcy5zdGRlcnI7XG4gICAgY2FzZSAnc3Rkb3V0JzpcbiAgICAgIHJldHVybiBwcm9jZXNzLnN0ZG91dDtcbiAgICBjYXNlICdkcm9wJzpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb3RpY2VzTWVzc2FnZShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IG1zZyBpcyBJb01lc3NhZ2U8dm9pZD4ge1xuICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfSTAxMDAuaXMobXNnKSB8fCBJTy5DREtfVE9PTEtJVF9XMDEwMS5pcyhtc2cpIHx8IElPLkNES19UT09MS0lUX0UwMTAxLmlzKG1zZykgfHwgSU8uQ0RLX1RPT0xLSVRfSTAxMDEuaXMobXNnKTtcbn1cblxuZnVuY3Rpb24gZXZlbnRGcm9tTWVzc2FnZShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IFRlbGVtZXRyeUV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgaWYgKENMSV9QUklWQVRFX0lPLkNES19DTElfSTEwMDEuaXMobXNnKSkge1xuICAgIHJldHVybiBldmVudFJlc3VsdCgnU1lOVEgnLCBtc2cpO1xuICB9XG4gIGlmIChDTElfUFJJVkFURV9JTy5DREtfQ0xJX0kyMDAxLmlzKG1zZykpIHtcbiAgICByZXR1cm4gZXZlbnRSZXN1bHQoJ0lOVk9LRScsIG1zZyk7XG4gIH1cbiAgaWYgKENMSV9QUklWQVRFX0lPLkNES19DTElfSTMwMDEuaXMobXNnKSkge1xuICAgIHJldHVybiBldmVudFJlc3VsdCgnREVQTE9ZJywgbXNnKTtcbiAgfVxuICBpZiAoQ0xJX1BSSVZBVEVfSU8uQ0RLX0NMSV9JMzAwMy5pcyhtc2cpKSB7XG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0KCdBU1NFVCcsIG1zZyk7XG4gIH1cbiAgLy8gSG90c3dhcCBsaXZlcyBpbiB0aGUgY2RrLXRvb2xraXQgc28gaXQgY2Fubm90IGJlIGEgQ0RLX0NMSSBlcnJvciBjb2RlLlxuICAvLyBJbnN0ZWFkIHdlIHJldXNlIHRoZSBleGlzdGluZyBIb3Rzd2FwIHNwYW4uXG4gIGlmIChJTy5DREtfVE9PTEtJVF9JNTQxMC5pcyhtc2cpKSB7XG4gICAgLy8gQ3JlYXRlIGEgdGVsZW1ldHJ5LWNvbXBhdGlibGUgcmVzdWx0XG4gICAgcmV0dXJuIGhvdHN3YXBUb0V2ZW50UmVzdWx0KG1zZy5kYXRhKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGV2ZW50UmVzdWx0KGV2ZW50VHlwZTogVGVsZW1ldHJ5RXZlbnRbJ2V2ZW50VHlwZSddLCBtOiBJb01lc3NhZ2U8RXZlbnRSZXN1bHQ+KTogVGVsZW1ldHJ5RXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudFR5cGUsXG4gICAgICBkdXJhdGlvbjogbS5kYXRhLmR1cmF0aW9uLFxuICAgICAgZXJyb3I6IG0uZGF0YS5lcnJvcixcbiAgICAgIGNvdW50ZXJzOiBtLmRhdGEuY291bnRlcnMsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBob3Rzd2FwVG9FdmVudFJlc3VsdChyZXN1bHQ6IEhvdHN3YXBSZXN1bHQpOiBUZWxlbWV0cnlFdmVudCB7XG4gIGNvbnN0IG5vbkhvdHN3YXBwYWJsZVJlc291cmNlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICBmb3IgKGNvbnN0IHsgc3ViamVjdCB9IG9mIHJlc3VsdC5ub25Ib3Rzd2FwcGFibGVDaGFuZ2VzKSB7XG4gICAgaWYgKCdyZXNvdXJjZVR5cGUnIGluIHN1YmplY3QpIHtcbiAgICAgIGNvbnN0IGtleXMgPSAncmVqZWN0ZWRQcm9wZXJ0aWVzJyBpbiBzdWJqZWN0ICYmIHN1YmplY3QucmVqZWN0ZWRQcm9wZXJ0aWVzXG4gICAgICAgID8gc3ViamVjdC5yZWplY3RlZFByb3BlcnRpZXMubWFwKHAgPT4gYGhvdHN3YXBGYWxsYmFjazoke3N1YmplY3QucmVzb3VyY2VUeXBlfSMke3B9YClcbiAgICAgICAgOiBbYGhvdHN3YXBGYWxsYmFjazoke3N1YmplY3QucmVzb3VyY2VUeXBlfWBdO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBub25Ib3Rzd2FwcGFibGVSZXNvdXJjZXNba2V5XSA9IChub25Ib3Rzd2FwcGFibGVSZXNvdXJjZXNba2V5XSA/PyAwKSArIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBldmVudFR5cGU6ICdIT1RTV0FQJyBhcyBjb25zdCxcbiAgICBkdXJhdGlvbjogcmVzdWx0LmR1cmF0aW9uLFxuICAgIC4uLihyZXN1bHQuZXJyb3IgPyB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBuYW1lOiBjZGtDbGlFcnJvck5hbWUocmVzdWx0LmVycm9yKSxcbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgICBjb3VudGVyczoge1xuICAgICAgaG90c3dhcHBlZDogcmVzdWx0LmhvdHN3YXBwZWQgPyAxIDogMCxcbiAgICAgIGhvdHN3YXBGYWxsYmFjazogcmVzdWx0LmhvdHN3YXBGYWxsYmFjayA/IDEgOiAwLFxuICAgICAgaG90c3dhcHBhYmxlQ2hhbmdlczogcmVzdWx0LmhvdHN3YXBwYWJsZUNoYW5nZXMubGVuZ3RoLFxuICAgICAgbm9uSG90c3dhcHBhYmxlQ2hhbmdlczogcmVzdWx0Lm5vbkhvdHN3YXBwYWJsZUNoYW5nZXMubGVuZ3RoLFxuICAgICAgLi4ubm9uSG90c3dhcHBhYmxlUmVzb3VyY2VzLFxuICAgIH0sXG4gIH07XG59XG4iXX0=