breeze-client 2.1.1 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/adapter-ajax-angularjs/package.json +2 -2
- package/adapter-ajax-fetch/package.json +2 -2
- package/adapter-ajax-httpclient/package.json +2 -6
- package/adapter-ajax-jquery/package.json +2 -2
- package/adapter-ajax-post/package.json +2 -2
- package/adapter-data-service-odata/package.json +2 -2
- package/adapter-data-service-webapi/package.json +2 -2
- package/adapter-model-library-backing-store/package.json +2 -2
- package/adapter-model-library-ko/package.json +2 -2
- package/adapter-uri-builder-json/package.json +2 -2
- package/adapter-uri-builder-odata/package.json +2 -2
- package/breeze-client.d.ts +1 -1
- package/breeze-client.metadata.json +1 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.js +2 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.js.map +1 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js +1 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +1 -1
- package/bundles/breeze-client.umd.js +9 -5
- package/bundles/breeze-client.umd.js.map +1 -1
- package/bundles/breeze-client.umd.min.js +1 -1
- package/bundles/breeze-client.umd.min.js.map +1 -1
- package/esm2015/breeze-client.js +2 -2
- package/esm2015/mixin-save-queuing/mixin-save-queuing.js +3 -3
- package/esm2015/src/array.js +1 -1
- package/esm2015/src/breeze.js +2 -2
- package/esm2015/src/core.js +4 -1
- package/esm2015/src/csdl-metadata-parser.js +3 -3
- package/esm2015/src/default-property-interceptor.js +3 -2
- package/esm2015/src/enum.js +2 -2
- package/esm2015/src/local-query-comparison-options.js +1 -1
- package/esm2015/src/validate.js +1 -1
- package/esm5/breeze-client.js +2 -2
- package/esm5/mixin-save-queuing/mixin-save-queuing.js +3 -2
- package/esm5/src/array.js +1 -1
- package/esm5/src/breeze.js +2 -2
- package/esm5/src/core.js +4 -1
- package/esm5/src/csdl-metadata-parser.js +3 -3
- package/esm5/src/default-property-interceptor.js +3 -2
- package/esm5/src/enum.js +2 -2
- package/esm5/src/local-query-comparison-options.js +1 -1
- package/esm5/src/validate.js +1 -1
- package/fesm2015/breeze-client-mixin-save-queuing.js +2 -2
- package/fesm2015/breeze-client-mixin-save-queuing.js.map +1 -1
- package/fesm2015/breeze-client.js +9 -5
- package/fesm2015/breeze-client.js.map +1 -1
- package/fesm5/breeze-client-mixin-save-queuing.js +2 -2
- package/fesm5/breeze-client-mixin-save-queuing.js.map +1 -1
- package/fesm5/breeze-client.js +9 -5
- package/fesm5/breeze-client.js.map +1 -1
- package/mixin-get-entity-graph/package.json +2 -2
- package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +1 -1
- package/mixin-save-queuing/mixin-save-queuing.d.ts +31 -1
- package/mixin-save-queuing/package.json +2 -2
- package/package.json +1 -1
- package/src/validate.d.ts +4 -3
- package/esm2015/public_api.js +0 -2
- package/esm5/public_api.js +0 -2
- package/public_api.d.ts +0 -1
package/esm2015/src/validate.js
CHANGED
|
@@ -988,4 +988,4 @@ export class ValidationError {
|
|
|
988
988
|
}
|
|
989
989
|
}
|
|
990
990
|
export { ɵ0, ɵ1 };
|
|
991
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL3ZhbGlkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJbEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFFL0IsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQztBQUMxQixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO1dBeUJiLFVBQVUsT0FBMEI7SUFDL0MsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztLQUN6RztTQUFNO1FBQ0wsT0FBTyxPQUFPLENBQUM7S0FDaEI7QUFDSCxDQUFDO0FBUkgsbUVBQW1FO0FBQ25FLElBQUksV0FBVyxHQUFHO0lBQ2hCLFdBQVcsSUFNVjtDQUNGLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29yZSB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7IGFzc2VydFBhcmFtIH0gZnJvbSAnLi9hc3NlcnQtcGFyYW0nO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25Qcm9wZXJ0eSwgRGF0YVByb3BlcnR5IH0gZnJvbSAnLi9lbnRpdHktbWV0YWRhdGEnO1xyXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuL2VudGl0eS1hc3BlY3QnO1xyXG5cclxuZXhwb3J0IGNvbnN0IElOVDE2X01JTiA9IC0zMjc2ODtcclxuZXhwb3J0IGNvbnN0IElOVDE2X01BWCA9IDMyNzY3O1xyXG5cclxuZXhwb3J0IGNvbnN0IElOVDMyX01JTiA9IC0yMTQ3NDgzNjQ4O1xyXG5leHBvcnQgY29uc3QgSU5UMzJfTUFYID0gMjE0NzQ4MzY0NztcclxuXHJcbmV4cG9ydCBjb25zdCBCWVRFX01JTiA9IDA7XHJcbmV4cG9ydCBjb25zdCBCWVRFX01BWCA9IDI1NTtcclxuXHJcbi8qKiBQYXNzZWQgdG8gVmFsaWRhdGlvbkZuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbkNvbnRleHQge1xyXG4gIGVudGl0eT86IEVudGl0eTtcclxuICBwcm9wZXJ0eT86IERhdGFQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eTtcclxuICBwcm9wZXJ0eU5hbWU/OiBzdHJpbmc7XHJcbiAgdmFsdWU/OiBhbnk7XHJcbn1cclxuXHJcbi8qKiBVc2VkIGJ5IFZhbGlkYXRvciB0byBjb21wb3NlIG1lc3NhZ2VzICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0IGV4dGVuZHMgVmFsaWRhdGlvbkNvbnRleHQge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xyXG4gIG1lc3NhZ2VUZW1wbGF0ZTogc3RyaW5nO1xyXG4gIG1lc3NhZ2U/OiBzdHJpbmcgfCAoKHZjOiBWYWxpZGF0aW9uQ29udGV4dCkgPT4gc3RyaW5nKTtcclxufVxyXG5cclxuLyoqIEZ1bmN0aW9uIGNhbGxlZCB0byB2YWxpZGF0ZSBhbiBlbnRpdHkgb3IgcHJvcGVydHkgKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uRm4ge1xyXG4gICAgKHZhbHVlOiBhbnksIGNvbnRleHQ/OiBWYWxpZGF0aW9uQ29udGV4dCk6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8vIGFkZCBjb21tb24gcHJvcHMgYW5kIG1ldGhvZHMgZm9yIGV2ZXJ5IHZhbGlkYXRvciAnY29udGV4dCcgaGVyZS5cclxubGV0IHJvb3RDb250ZXh0ID0ge1xyXG4gIGRpc3BsYXlOYW1lOiBmdW5jdGlvbiAoY29udGV4dDogVmFsaWRhdGlvbkNvbnRleHQpIHtcclxuICAgIGlmIChjb250ZXh0LnByb3BlcnR5KSB7XHJcbiAgICAgIHJldHVybiBjb250ZXh0LnByb3BlcnR5LnJlc29sdmVQcm9wZXJ0eShcImRpc3BsYXlOYW1lXCIpIHx8IGNvbnRleHQucHJvcGVydHlOYW1lIHx8IGNvbnRleHQucHJvcGVydHkubmFtZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBcIlZhbHVlXCI7XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbkluc3RhbmNlcyBvZiB0aGUgVmFsaWRhdG9yIGNsYXNzIHByb3ZpZGUgdGhlIGxvZ2ljIHRvIHZhbGlkYXRlIGFub3RoZXIgb2JqZWN0IGFuZCBwcm92aWRlIGEgZGVzY3JpcHRpb24gb2YgYW55IGVycm9yc1xyXG5lbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcHJvY2Vzcy4gIFRoZXkgYXJlIHR5cGljYWxseSBhc3NvY2lhdGVkIHdpdGggYSAndmFsaWRhdG9ycycgcHJvcGVydHkgb24gdGhlIGZvbGxvd2luZyB0eXBlczogW1tFbnRpdHlUeXBlXV0sXHJcbltbRGF0YVByb3BlcnR5XV0gb3IgW1tOYXZpZ2F0aW9uUHJvcGVydHldXS5cclxuXHJcbkEgbnVtYmVyIG9mIHByb3BlcnR5IGxldmVsIHZhbGlkYXRvcnMgYXJlIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseSwgaS5lIGFkZGVkIHRvIGVhY2ggRGF0YVByb3BlcnR5LnZhbGlkYXRvcnMgcHJvcGVydHlcclxuYmFzZWQgb24gW1tEYXRhUHJvcGVydHldXSBtZXRhZGF0YS4gIEZvciBleGFtcGxlLFxyXG5cclxuLSBEYXRhUHJvcGVydHkuZGF0YVR5cGUgLT4gb25lIG9mIHRoZSAnZGF0YVR5cGUnIHZhbGlkYXRvciBtZXRob2RzIHN1Y2ggYXMgVmFsaWRhdG9yLmludDY0LCBWYWxpZGF0b3IuZGF0ZSwgVmFsaWRhdG9yLmJvb2wgZXRjLlxyXG4tIERhdGFQcm9wZXJ0eS5tYXhMZW5ndGggLT4gVmFsaWRhdG9yLm1heExlbmd0aFxyXG4tIERhdGFQcm9wZXJ0eS5pc051bGxhYmxlIC0+IFZhbGlkYXRvci5yZXF1aXJlZCAoaWYgbm90IG51bGxhYmxlKVxyXG5cclxuQGNsYXNzIFZhbGlkYXRvclxyXG4qKi9cclxuXHJcbi8qKlxyXG5WYWxpZGF0b3IgY29uc3RydWN0b3IgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSBjcmVhdGUgY3VzdG9tIHZhbGlkYXRpb25zLiAgU2V2ZXJhbFxyXG5iYXNpYyBcIlZhbGlkYXRvclwiIGNvbnN0cnVjdGlvbiBtZXRob2RzIGFyZSBhbHNvIHByb3ZpZGVkIGFzIHN0YXRpYyBtZXRob2RzIHRvIHRoaXMgY2xhc3MuIFRoZXNlIG1ldGhvZHNcclxucHJvdmlkZSBhIHNpbXBsZXIgc3ludGF4IGZvciBjcmVhdGluZyBiYXNpYyB2YWxpZGF0aW9ucy5cclxuXHJcbk1hbnkgb2YgdGhlc2Ugc3RvY2sgdmFsaWRhdG9ycyBhcmUgaW5zcGlyZWQgYnkgYW5kIGltcGxlbWVudGVkIHRvIGNvbmZvcm0gdG8gdGhlIHZhbGlkYXRvcnMgZGVmaW5lZCBhdFxyXG5odHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvc3lzdGVtLmNvbXBvbmVudG1vZGVsLmRhdGFhbm5vdGF0aW9ucy5hc3B4XHJcblxyXG5Tb21ldGltZXMgYSBjdXN0b20gdmFsaWRhdG9yIHdpbGwgYmUgcmVxdWlyZWQuXHJcbkBleGFtcGxlXHJcbk1vc3QgdmFsaWRhdG9ycyB3aWxsIGJlICdwcm9wZXJ0eScgbGV2ZWwgdmFsaWRhdG9ycywgbGlrZSB0aGlzLlxyXG5AZXhhbXBsZVxyXG4gICAgLy8gdiBpcyB0aGlzIGZ1bmN0aW9uIGlzIHRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQsIGluIHRoaXMgY2FzZSBhIFwiY291bnRyeVwiIHN0cmluZy5cclxuICAgIHZhciB2YWxGbiA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIChjb3JlLnN0cmluZ1N0YXJ0c1dpdGgodiwgXCJVU1wiKSk7XHJcbiAgICB9O1xyXG4gICAgdmFyIGNvdW50cnlWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKFwiY291bnRyeUlzVVNcIiwgdmFsRm4sIHtcclxuICAgICAgICBkaXNwbGF5TmFtZTogXCJDb3VudHJ5XCIsIFxyXG4gICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBzdGFydCB3aXRoICdVUydcIiBcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIE5vdyBwbHVnIGl0IGludG8gQnJlZXplLlxyXG4gICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICB2YXIgY3VzdFR5cGUgPSBtZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgIHZhciBjb3VudHJ5UHJvcCA9IGN1c3RUeXBlLmdldFByb3BlcnR5KFwiQ291bnRyeVwiKTtcclxuICAgIC8vIE5vdGUgdGhhdCB2YWxpZGF0b3IgaXMgYWRkZWQgdG8gYSAnRGF0YVByb3BlcnR5JyB2YWxpZGF0b3JzIGNvbGxlY3Rpb24uXHJcbiAgICBwcm9wLnZhbGlkYXRvcnMucHVzaChjb3VudHJ5VmFsaWRhdG9yKTtcclxuRW50aXR5IGxldmVsIHZhbGlkYXRvcnMgYXJlIGFsc28gcG9zc2libGVcclxuQGV4YW1wbGVcclxuICAgIGZ1bmN0aW9uIGlzVmFsaWRaaXBDb2RlKHZhbHVlKSB7XHJcbiAgICAgICAgdmFyIHJlID0gL15cXGR7NX0oW1xcLV1cXGR7NH0pPyQvO1xyXG4gICAgICAgIHJldHVybiAocmUudGVzdCh2YWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHYgaW4gdGhpcyBjYXNlIHdpbGwgYmUgYSBDdXN0b21lciBlbnRpdHlcclxuICAgIHZhciB2YWxGbiA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgLy8gVGhpcyB2YWxpZGF0b3Igb25seSB2YWxpZGF0ZXMgVVMgWmlwIENvZGVzLlxyXG4gICAgICAgIGlmICggdi5nZXRQcm9wZXJ0eShcIkNvdW50cnlcIikgPT09IFwiVVNBXCIpIHtcclxuICAgICAgICAgICAgdmFyIHBvc3RhbENvZGUgPSB2LmdldFByb3BlcnR5KFwiUG9zdGFsQ29kZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWRaaXBDb2RlKHBvc3RhbENvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcbiAgICB2YXIgemlwQ29kZVZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoXCJ6aXBDb2RlVmFsaWRhdG9yXCIsIHZhbEZuLFxyXG4gICAgICAgIHsgbWVzc2FnZVRlbXBsYXRlOiBcIkZvciB0aGUgVVMsIHRoaXMgaXMgbm90IGEgdmFsaWQgUG9zdGFsQ29kZVwiIH0pO1xyXG5cclxuICAgIC8vIE5vdyBwbHVnIGl0IGludG8gQnJlZXplLlxyXG4gICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAvLyBOb3RlIHRoYXQgdmFsaWRhdG9yIGlzIGFkZGVkIHRvIGFuICdFbnRpdHlUeXBlJyB2YWxpZGF0b3JzIGNvbGxlY3Rpb24uXHJcbiAgICBjdXN0VHlwZS52YWxpZGF0b3JzLnB1c2goemlwQ29kZVZhbGlkYXRvcik7XHJcbldoYXQgaXMgY29tbW9ubHkgbmVlZGVkIGlzIGEgd2F5IG9mIGNyZWF0aW5nIGEgcGFyYW1ldGVyaXplZCBmdW5jdGlvbiB0aGF0IHdpbGwgaXRzZWxmXHJcbnJldHVybiBhIG5ldyBWYWxpZGF0b3IuICBUaGlzIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYSAnY29udGV4dCcgb2JqZWN0LlxyXG5AZXhhbXBsZVxyXG4gICAgLy8gY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHRha2UgaW4gYSBjb25maWcgb2JqZWN0XHJcbiAgICAvLyBhbmQgd2lsbCByZXR1cm4gYSB2YWxpZGF0b3JcclxuICAgIHZhciBudW1lcmljUmFuZ2VWYWxpZGF0b3IgPSBmdW5jdGlvbihjb250ZXh0KSB7XHJcbiAgICAgICAgdmFyIHZhbEZuID0gZnVuY3Rpb24odiwgY3R4KSB7XHJcbiAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKHYpICE9PSBcIm51bWJlclwiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChjdHgubWluICE9IG51bGwgJiYgdiA8IGN0eC5taW4pIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGN0eC5tYXggIT0gbnVsbCAmJiB2ID4gY3R4Lm1heCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIFRoZSBsYXN0IHBhcmFtZXRlciBiZWxvdyBpcyB0aGUgJ2NvbnRleHQnIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIGludG8gdGhlICdjdHgnIHBhcmFtZXRlciBhYm92ZVxyXG4gICAgICAgIC8vIHdoZW4gdGhpcyB2YWxpZGF0b3IgZXhlY3V0ZXMuIFNldmVyYWwgb3RoZXIgcHJvcGVydGllcywgc3VjaCBhcyBkaXNwbGF5TmFtZSB3aWxsIGdldCBhZGRlZCB0byB0aGlzIG9iamVjdCBhcyB3ZWxsLlxyXG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwibnVtZXJpY1JhbmdlXCIsIHZhbEZuLCB7XHJcbiAgICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIHRoZSB2YWx1ZXMgb2YgJW1pbiUgYW5kICVtYXglXCIsXHJcbiAgICAgICAgICAgIG1pbjogY29udGV4dC5taW4sXHJcbiAgICAgICAgICAgIG1heDogY29udGV4dC5tYXhcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICAvLyBBc3N1bWUgdGhhdCBmcmVpZ2h0UHJvcGVydHkgaXMgYSBEYXRhRW50aXR5UHJvcGVydHkgdGhhdCBkZXNjcmliZXMgbnVtZXJpYyB2YWx1ZXMuXHJcbiAgICAvLyByZWdpc3RlciB0aGUgdmFsaWRhdG9yXHJcbiAgICBmcmVpZ2h0UHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKG51bWVyaWNSYW5nZVZhbGlkYXRvcih7IG1pbjogMTAwLCBtYXg6IDUwMCB9KSk7XHJcblxyXG5CcmVlemUgc3Vic3RpdHV0ZXMgY29udGV4dCB2YWx1ZXMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlIHRva2VucyBpbiB0aGUgbWVzc2FnZVRlbXBsYXRlIHdoZW4gcHJlcGFyaW5nIHRoZSBydW50aW1lIGVycm9yIG1lc3NhZ2U7XHJcbidkaXNwbGF5TmFtZScgaXMgYSBwcmUtZGVmaW5lZCBjb250ZXh0IGZ1bmN0aW9uIHRoYXQgaXMgYWx3YXlzIGF2YWlsYWJsZS5cclxuXHJcblBsZWFzZSBub3RlIHRoYXQgQnJlZXplIHN1YnN0aXR1dGVzIHRoZSBlbXB0eSBzdHJpbmcgZm9yIGZhbHNleSBwYXJhbWV0ZXJzLiBUaGF0IHVzdWFsbHkgd29ya3MgaW4geW91ciBmYXZvci5cclxuU29tZXRpbWVzIGl0IGRvZXNuJ3QgYXMgd2hlbiB0aGUgJ21pbicgdmFsdWUgaXMgemVybyBpbiB3aGljaCBjYXNlIHRoZSBtZXNzYWdlIHRleHQgd291bGQgaGF2ZSBhIGhvbGVcclxud2hlcmUgdGhlICdtaW4nIHZhbHVlIGdvZXMsIHNheWluZzogXCIuLi4gYW4gaW50ZWdlciBiZXR3ZWVuIHRoZSB2YWx1ZXMgb2YgYW5kIC4uLlwiLiBUaGF0IGlzIG5vdCB3aGF0IHlvdSB3YW50LlxyXG5cclxuVG8gYXZvaWQgdGhpcyBlZmZlY3QsIHlvdSBtYXkgY2FuIGJha2UgY2VydGFpbiBvZiB0aGUgY29udGV4dCB2YWx1ZXMgaW50byB0aGUgJ21lc3NhZ2VUZW1wbGF0ZScgaXRzZWxmXHJcbmFzIHNob3duIGluIHRoaXMgcmV2aXNpb24gdG8gdGhlIHBlcnRpbmVudCBwYXJ0IG9mIHRoZSBwcmV2aW91cyBleGFtcGxlOlxyXG5AZXhhbXBsZVxyXG4gICAgLy8gLi4uIGFzIGJlZm9yZVxyXG4gICAgLy8gLi4uIGJ1dCBiYWtlIHRoZSBtaW4vbWF4IHZhbHVlcyBpbnRvIHRoZSBtZXNzYWdlIHRlbXBsYXRlLlxyXG4gICAgdmFyIHRlbXBsYXRlID0gYnJlZXplLmNvcmUuZm9ybWF0U3RyaW5nKFxyXG4gICAgICAgIFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiB0aGUgdmFsdWVzIG9mICUxIGFuZCAlMlwiLFxyXG4gICAgICAgIGNvbnRleHQubWluLCBjb250ZXh0Lm1heCk7XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcIm51bWVyaWNSYW5nZVwiLCB2YWxGbiwge1xyXG4gICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogdGVtcGxhdGUsXHJcbiAgICAgICAgbWluOiBjb250ZXh0Lm1pbixcclxuICAgICAgICBtYXg6IGNvbnRleHQubWF4XHJcbiAgICB9KTtcclxuXHJcbkBtZXRob2QgPGN0b3I+IFZhbGlkYXRvclxyXG5AcGFyYW0gbmFtZSB7U3RyaW5nfSBUaGUgbmFtZSBvZiB0aGlzIHZhbGlkYXRvci5cclxuQHBhcmFtIHZhbGlkYXRvckZuIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBwZXJmb3JtIHZhbGlkYXRpb24uXHJcblxyXG52YWxpZGF0b3JGbih2YWx1ZSwgY29udGV4dClcclxuQHBhcmFtIHZhbGlkYXRvckZuLnZhbHVlIHtPYmplY3R9IFZhbHVlIHRvIGJlIHZhbGlkYXRlZFxyXG5AcGFyYW0gdmFsaWRhdG9yRm4uY29udGV4dCB7T2JqZWN0fSBUaGUgc2FtZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZiBub3Rcclxub3RoZXJ3aXNlIHNwZWNpZmllZC5cclxuQHBhcmFtIHZhbGlkYXRvckZuLmNvbnRleHQudmFsdWUge09iamVjdH0gVGhlIHZhbHVlIGJlaW5nIHZhbGlkYXRlZC5cclxuQHBhcmFtIHZhbGlkYXRvckZuLmNvbnRleHQubmFtZSB7U3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGJlaW5nIGV4ZWN1dGVkLlxyXG5AcGFyYW0gdmFsaWRhdG9yRm4uY29udGV4dC5kaXNwbGF5TmFtZSB7U3RyaW5nfSBUaGlzIHdpbGwgYmUgZWl0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkncyAnZGlzcGxheU5hbWUnIHByb3BlcnR5IG9yXHJcbnRoZSB2YWx1ZSBvZiBpdHMgJ25hbWUnIHByb3BlcnR5IG9yIHRoZSBzdHJpbmcgJ1ZhbHVlJ1xyXG5AcGFyYW0gdmFsaWRhdG9yRm4uY29udGV4dC5tZXNzYWdlVGVtcGxhdGUge1N0cmluZ30gVGhpcyB3aWxsIGVpdGhlciBiZSB0aGUgdmFsdWUgb2YgVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXNbIHt0aGlzIHZhbGlkYXRvcnMgbmFtZX1dIG9yIG51bGwuIFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzXHJcbmlzIGFuIG9iamVjdCB0aGF0IGlzIGtleWVkIGJ5IHZhbGlkYXRvciBuYW1lIGFuZCB0aGF0IGNhbiBiZSBhZGRlZCB0byBpbiBvcmRlciB0byAncmVnaXN0ZXInIHlvdXIgb3duIG1lc3NhZ2UgZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yLlxyXG5UaGUgZm9sbG93aW5nIHByb3BlcnR5IGNhbiBhbHNvIGJlIHNwZWNpZmllZCBmb3IgYW55IHZhbGlkYXRvciB0byBmb3JjZSBhIHNwZWNpZmljIGVycm9yTWVzc2FnZSBzdHJpbmdcclxuQHBhcmFtIFt2YWxpZGF0b3JGbi5jb250ZXh0Lm1lc3NhZ2VdIHtTdHJpbmd9IElmIHRoaXMgcHJvcGVydHkgaXMgc2V0IGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSAnbWVzc2FnZVRlbXBsYXRlJyBwcm9wZXJ0eSB3aGVuIGFuXHJcbmVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLlxyXG5cclxuQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBBIGZyZWUgZm9ybSBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyB3aWxsIG1hZGUgYXZhaWxhYmxlIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBhbmQgZXJyb3IgbWVzc2FnZSBjcmVhdGlvbiBwcm9jZXNzLlxyXG5UaGlzIG9iamVjdCB3aWxsIGJlIHBhc3NlZCBpbnRvIHRoZSBWYWxpZGF0b3IncyB2YWxpZGF0aW9uIGZ1bmN0aW9uIHdoZW5ldmVyICd2YWxpZGF0ZScgaXMgY2FsbGVkLiBTZWUgYWJvdmUgZm9yIGEgZGVzY3JpcHRpb25cclxub2YgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoaXMgb2JqZWN0IGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkLlxyXG5AZHluYW1pY1xyXG4qKi9cclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvciB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgXyR0eXBlTmFtZTogc3RyaW5nOyAvLyBvbiBwcm90b1xyXG5cclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdmFsRm46IFZhbGlkYXRpb25GbjtcclxuICBjb250ZXh0OiBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7XHJcbiAgY3VycmVudENvbnRleHQ6IFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDtcclxuICBwcml2YXRlIF9iYXNlQ29udGV4dDogVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0O1xyXG5cclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZhbEZuOiBWYWxpZGF0aW9uRm4sIGNvbnRleHQ/OiBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQpIHtcclxuICAgIC8vIF9iYXNlQ29udGV4dCBpcyB3aGF0IHdpbGwgZ2V0IHNlcmlhbGl6ZWRcclxuICAgIHRoaXMuX2Jhc2VDb250ZXh0ID0gY29udGV4dCB8fCB7fSBhcyBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7XHJcbiAgICB0aGlzLl9iYXNlQ29udGV4dC5uYW1lID0gbmFtZTtcclxuICAgIGNvbnRleHQgPSBjb3JlLmV4dGVuZChPYmplY3QuY3JlYXRlKHJvb3RDb250ZXh0KSwgdGhpcy5fYmFzZUNvbnRleHQpIGFzIFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDtcclxuICAgIGNvbnRleHQubWVzc2FnZVRlbXBsYXRlID0gY29udGV4dC5tZXNzYWdlVGVtcGxhdGUgfHwgVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXNbbmFtZV07XHJcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgdGhpcy52YWxGbiA9IHZhbEZuO1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFRoZSBuYW1lIG9mIHRoaXMgdmFsaWRhdG9yLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgbmFtZSB7U3RyaW5nfVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBUaGUgY29udGV4dCBmb3IgdGhpcyB2YWxpZGF0b3IuXHJcblxyXG4gIFRoaXMgb2JqZWN0IHdpbGwgdHlwaWNhbGx5IGNvbnRhaW4gYXQgYSBtaW5pbXVtIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcy4gXCJuYW1lXCIsIFwiZGlzcGxheU5hbWVcIiwgYW5kIFwibWVzc2FnZVwiIG9yIFwibWVzc2FnZVRlbXBsYXRlXCIuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IGNvbnRleHQge09iamVjdH1cclxuICAqKi9cclxuXHJcblxyXG4gIC8qKlxyXG4gIFJ1biB0aGlzIHZhbGlkYXRvciBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgdmFsdWUuICBUaGlzIG1ldGhvZCB3aWxsIHVzdWFsbHkgYmUgY2FsbGVkIGludGVybmFsbHkgZWl0aGVyXHJcbiAgYXV0b21hdGljYWxseSBieSBhbiBwcm9wZXJ0eSBjaGFuZ2UsIGVudGl0eSBhdHRhY2gsIHF1ZXJ5IG9yIHNhdmUgb3BlcmF0aW9uLCBvciBtYW51YWxseSBhcyBhIHJlc3VsdCBvZlxyXG4gIGEgdmFsaWRhdGVFbnRpdHkgY2FsbCBvbiB0aGUgRW50aXR5QXNwZWN0LiBUaGUgcmVzdWx0aW5nIFZhbGlkYXRpb25SZXN1bHRzIGFyZSBhdmFpbGFibGUgdmlhIHRoZVxyXG4gIEVudGl0eUFzcGVjdC5nZXRWYWxpZGF0aW9uRXJyb3JzIG1ldGhvZC5cclxuXHJcbiAgSG93ZXZlciwgeW91IGNhbiBhbHNvIGNhbGwgYSB2YWxpZGF0b3IgZGlyZWN0bHkgZWl0aGVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9yIHNvbWUgb3RoZXIgcmVhc29uIGlmIG5lZWRlZC5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyB1c2luZyBvbmUgb2YgdGhlIHByZWRlZmluZWQgdmFsaWRhdG9yc1xyXG4gICAgICB2YXIgdmFsaWRhdG9yID0gVmFsaWRhdG9yLm1heExlbmd0aCh7IG1heExlbmd0aDogNSwgZGlzcGxheU5hbWU6IFwiQ2l0eVwiIH0pO1xyXG4gICAgICAvLyBzaG91bGQgYmUgb2sgYmVjYXVzZSBcImFzZGZcIi5sZW5ndGggPCA1XHJcbiAgICAgIHZhciByZXN1bHQgPSB2YWxpZGF0b3IudmFsaWRhdGUoXCJhc2RmXCIpO1xyXG4gICAgICBvayhyZXN1bHQgPT09IG51bGwpO1xyXG4gICAgICByZXN1bHQgPSB2YWxpZGF0b3IudmFsaWRhdGUoXCJhZGFzZGZhc2RmXCIpO1xyXG4gICAgICAvLyBleHRyYWN0IGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ3Jlc3VsdCdcclxuICAgICAgdmFyIGVyck1zZyA9IHJlc3VsdC5lcnJvck1lc3NhZ2U7XHJcbiAgICAgIHZhciBjb250ZXh0ID0gcmVzdWx0LmNvbnRleHQ7XHJcbiAgICAgIHZhciBzYW1lVmFsaWRhdG9yID0gcmVzdWx0LnZhbGlkYXRvcjtcclxuICBAbWV0aG9kIHZhbGlkYXRlXHJcbiAgQHBhcmFtIHZhbHVlIHtPYmplY3R9IFZhbHVlIHRvIHZhbGlkYXRlXHJcbiAgQHBhcmFtIGFkZGl0aW9uYWxDb250ZXh0IHtPYmplY3R9IEFueSBhZGRpdGlvbmFsIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gdGhhdCB0aGUgVmFsaWRhdG9yXHJcbiAgY2FuIG1ha2UgdXNlIG9mLlxyXG4gIEByZXR1cm4ge1ZhbGlkYXRpb25FcnJvcnxudWxsfSBBIFZhbGlkYXRpb25FcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLCBudWxsIG90aGVyd2lzZVxyXG4gICoqL1xyXG4gIHZhbGlkYXRlKHZhbHVlOiBhbnksIGFkZGl0aW9uYWxDb250ZXh0PzogVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0KSB7XHJcbiAgICBsZXQgY3VycmVudENvbnRleHQ6IFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDsgLy8geyB2YWx1ZT86IE9iamVjdCB9O1xyXG4gICAgaWYgKGFkZGl0aW9uYWxDb250ZXh0KSB7XHJcbiAgICAgIGN1cnJlbnRDb250ZXh0ID0gY29yZS5leHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnRleHQpLCBhZGRpdGlvbmFsQ29udGV4dCkgYXMgVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3VycmVudENvbnRleHQgPSB0aGlzLmNvbnRleHQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHQ7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMudmFsRm4odmFsdWUsIGN1cnJlbnRDb250ZXh0KSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGN1cnJlbnRDb250ZXh0LnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IodGhpcywgY3VycmVudENvbnRleHQsIHRoaXMuZ2V0TWVzc2FnZSgpKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcih0aGlzLCBjdXJyZW50Q29udGV4dCwgXCJFeGNlcHRpb24gb2NjdXJlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyB2YWxpZGF0b3I6IFwiICsgdGhpcy5uYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLyBjb250ZXh0LnZhbHVlIGlzIG5vdCBhdmFpbCB1bmxlc3MgdmFsaWRhdGUgd2FzIGNhbGxlZCBmaXJzdC5cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlIG1vc3QgcmVjZW50IGV4ZWN1dGlvbiBvZiB0aGlzIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICB2YXIgdjAgPSBWYWxpZGF0b3IubWF4TGVuZ3RoKHsgbWF4TGVuZ3RoOiA1LCBkaXNwbGF5TmFtZTogXCJDaXR5XCIgfSk7XHJcbiAgICAgIHYwLnZhbGlkYXRlKFwiYWRhc2RmYXNkZlwiKTtcclxuICAgICAgdmFyIGVyck1lc3NhZ2UgPSB2MC5nZXRNZXNzYWdlKCkpO1xyXG4gIEBtZXRob2QgZ2V0TWVzc2FnZVxyXG4gIEByZXR1cm4ge1N0cmluZ31cclxuICAqKi9cclxuICBnZXRNZXNzYWdlKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLmN1cnJlbnRDb250ZXh0O1xyXG4gICAgICBsZXQgbWVzc2FnZSA9IGNvbnRleHQubWVzc2FnZTtcclxuICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodHlwZW9mIChtZXNzYWdlKSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICByZXR1cm4gbWVzc2FnZShjb250ZXh0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWVzc2FnZVRlbXBsYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRlbXBsYXRlKGNvbnRleHQubWVzc2FnZVRlbXBsYXRlLCBjb250ZXh0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gXCJpbnZhbGlkIHZhbHVlOiBcIiArICh0aGlzLm5hbWUgfHwgXCJ7dW5uYW1lZCB2YWxpZGF0b3J9XCIpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiBcIlVuYWJsZSB0byBmb3JtYXQgZXJyb3IgbWVzc2FnZVwiICsgZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9KU09OKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Jhc2VDb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhIHZhbGlkYXRvciBpbnN0YW5jZSBmcm9tIGEgSlNPTiBvYmplY3Qgb3IgYW4gYXJyYXkgb2YgaW5zdGFuY2VzIGZyb20gYW4gYXJyYXkgb2YgSlNPTiBvYmplY3RzLlxyXG4gIEBtZXRob2QgZnJvbUpTT05cclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIGpzb24ge09iamVjdH0gSlNPTiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzZXJpYWxpemVkIHZlcnNpb24gb2YgYSB2YWxpZGF0b3IuXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihqc29uOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikpIHtcclxuICAgICAgcmV0dXJuIGpzb24ubWFwKGZ1bmN0aW9uIChqcykge1xyXG4gICAgICAgIHJldHVybiBWYWxpZGF0b3IuZnJvbUpTT04oanMpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChqc29uIGluc3RhbmNlb2YgVmFsaWRhdG9yKSB7XHJcbiAgICAgIHJldHVybiBqc29uO1xyXG4gICAgfVxyXG4gICAgbGV0IHZhbGlkYXRvck5hbWUgPSBcIlZhbGlkYXRvci5cIiArIGpzb24ubmFtZTtcclxuICAgIGxldCBmbiA9IGNvbmZpZy5nZXRSZWdpc3RlcmVkRnVuY3Rpb24odmFsaWRhdG9yTmFtZSk7XHJcbiAgICBpZiAoIWZuKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBsb2NhdGUgYSB2YWxpZGF0b3IgbmFtZWQ6XCIgKyBqc29uLm5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZuKGpzb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmVnaXN0ZXIgYSB2YWxpZGF0b3IgaW5zdGFuY2Ugc28gdGhhdCBhbnkgZGVzZXJpYWxpemVkIG1ldGFkYXRhIGNhbiByZWZlcmVuY2UgaXQuXHJcbiAgQG1ldGhvZCByZWdpc3RlclxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gdmFsaWRhdG9yIHtWYWxpZGF0b3J9IFZhbGlkYXRvciB0byByZWdpc3Rlci5cclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyKHZhbGlkYXRvcjogVmFsaWRhdG9yKSB7XHJcbiAgICBjb25maWcucmVnaXN0ZXJGdW5jdGlvbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiB2YWxpZGF0b3I7XHJcbiAgICB9LCBcIlZhbGlkYXRvci5cIiArIHZhbGlkYXRvci5uYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJlZ2lzdGVyIGEgdmFsaWRhdG9yIGZhY3Rvcnkgc28gdGhhdCBhbnkgZGVzZXJpYWxpemVkIG1ldGFkYXRhIGNhbiByZWZlcmVuY2UgaXQuXHJcbiAgQG1ldGhvZCByZWdpc3RlckZhY3RvcnlcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIHZhbGlkYXRvckZhY3Rvcnkge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgb3B0aW9uYWxseSB0YWtlcyBhIGNvbnRleHQgcHJvcGVydHkgYW5kIHJldHVybnMgYSBWYWxpZGF0b3IgaW5zdGFuY2UuXHJcbiAgQHBhcmFtIG5hbWUge1N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvci5cclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5OiAob3B0aW9ucz86IGFueSkgPT4gVmFsaWRhdG9yLCBuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbmZpZy5yZWdpc3RlckZ1bmN0aW9uKHZhbGlkYXRvckZhY3RvcnksIFwiVmFsaWRhdG9yLlwiICsgbmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBNYXAgb2Ygc3RhbmRhcmQgZXJyb3IgbWVzc2FnZSB0ZW1wbGF0ZXMga2V5ZWQgYnkgdmFsaWRhdG9yIG5hbWUuXHJcbiAgWW91IGNhbiBhZGQgdG8gb3IgbW9kaWZ5IHRoaXMgb2JqZWN0IHRvIGN1c3RvbWl6ZSB0aGUgdGVtcGxhdGUgdXNlZCBmb3IgYW55IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZS5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyB2IGlzIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCwgaW4gdGhpcyBjYXNlIGEgXCJjb3VudHJ5XCIgc3RyaW5nLlxyXG4gICAgICB2YXIgdmFsRm4gPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICByZXR1cm4gKGNvcmUuc3RyaW5nU3RhcnRzV2l0aCh2LCBcIlVTXCIpKTtcclxuICAgICAgfTtcclxuICAgICAgdmFyIGNvdW50cnlWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKFwiY291bnRyeUlzVVNcIiwgdmFsRm4sIHsgZGlzcGxheU5hbWU6IFwiQ291bnRyeVwiIH0pO1xyXG4gICAgICBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlcy5jb3VudHJ5SXNVUyA9IFwiJyVkaXNwbGF5TmFtZSUnIG11c3Qgc3RhcnQgd2l0aCAnVVMnXCI7XHJcbiAgICAgIC8vIFRoaXMgd2lsbCBoYXZlIGEgc2ltaWxhciBlZmZlY3QgdG8gdGhpc1xyXG4gICAgICB2YXIgY291bnRyeVZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoXCJjb3VudHJ5SXNVU1wiLCB2YWxGbiwge1xyXG4gICAgICAgICAgZGlzcGxheU5hbWU6IFwiQ291bnRyeVwiLCBcclxuICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBzdGFydCB3aXRoICdVUydcIiBcclxuICAgICAgfSk7XHJcbiAgQHByb3BlcnR5IG1lc3NhZ2VUZW1wbGF0ZXMge09iamVjdH1cclxuICBAc3RhdGljXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBtZXNzYWdlVGVtcGxhdGVzID0ge1xyXG4gICAgYm9vbDogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhICd0cnVlJyBvciAnZmFsc2UnIHZhbHVlXCIsXHJcbiAgICBjcmVkaXRDYXJkOiBcIlRoZSAlZGlzcGxheU5hbWUlIGlzIG5vdCBhIHZhbGlkIGNyZWRpdCBjYXJkIG51bWJlclwiLFxyXG4gICAgZGF0ZTogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIGRhdGVcIixcclxuICAgIGR1cmF0aW9uOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgSVNPODYwMSBkdXJhdGlvbiBzdHJpbmcsIHN1Y2ggYXMgJ1AzSDI0TTYwUydcIixcclxuICAgIGVtYWlsQWRkcmVzczogXCJUaGUgJWRpc3BsYXlOYW1lJSAnJXZhbHVlJScgaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiLFxyXG4gICAgZ3VpZDogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIEdVSURcIixcclxuICAgIGludGVnZXI6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYW4gaW50ZWdlclwiLFxyXG4gICAgaW50ZWdlclJhbmdlOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiB0aGUgdmFsdWVzIG9mICVtaW5WYWx1ZSUgYW5kICVtYXhWYWx1ZSVcIixcclxuICAgIG1heExlbmd0aDogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIHN0cmluZyB3aXRoICVtYXhMZW5ndGglIGNoYXJhY3RlcnMgb3IgbGVzc1wiLFxyXG4gICAgbnVtYmVyOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgbnVtYmVyXCIsXHJcbiAgICBwaG9uZTogXCJUaGUgJWRpc3BsYXlOYW1lJSAnJXZhbHVlJScgaXMgbm90IGEgdmFsaWQgcGhvbmUgbnVtYmVyXCIsXHJcbiAgICByZWd1bGFyRXhwcmVzc2lvbjogXCJUaGUgJWRpc3BsYXlOYW1lJSAnJXZhbHVlJScgZG9lcyBub3QgbWF0Y2ggJyVleHByZXNzaW9uJSdcIixcclxuICAgIHJlcXVpcmVkOiBcIiclZGlzcGxheU5hbWUlJyBpcyByZXF1aXJlZFwiLFxyXG4gICAgc3RyaW5nOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgc3RyaW5nXCIsXHJcbiAgICBzdHJpbmdMZW5ndGg6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBzdHJpbmcgd2l0aCBiZXR3ZWVuICVtaW5MZW5ndGglIGFuZCAlbWF4TGVuZ3RoJSBjaGFyYWN0ZXJzXCIsXHJcbiAgICB1cmw6IFwiVGhlICVkaXNwbGF5TmFtZSUgJyV2YWx1ZSUnIGlzIG5vdCBhIHZhbGlkIHVybFwiXHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkICdyZXF1aXJlZCB2YWx1ZScgVmFsaWRhdG9yXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHJlZ2lvblByb3BlcnR5IC0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJSZWdpb25cIik7XHJcbiAgICAgIC8vIE1ha2VzIFwiUmVnaW9uXCIgb24gQ3VzdG9tZXIgYSByZXF1aXJlZCBwcm9wZXJ0eS5cclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5yZXF1aXJlZCgpKTtcclxuICAgICAgLy8gb3IgdG8gYWxsb3cgZW1wdHkgc3RyaW5nc1xyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnJlcXVpcmVkKHsgYWxsb3dFbXB0eVN0cmluZ3M6IHRydWUgfSk7KTtcclxuICBAbWV0aG9kIHJlcXVpcmVkXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBjb250ZXh0IHtPYmplY3R9XHJcbiAgQHBhcmFtIFtjb250ZXh0LmFsbG93RW1wdHlTdHJpbmdzXSB7Qm9vbGVhbn0gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCBvciBmYWxzZSB0aGVuIGVtcHR5IHN0cmluZ3MgZG8gTk9UIHBhc3MgdmFsaWRhdGlvbi5cclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVxdWlyZWQgPSBmdW5jdGlvbihjb250ZXh0PzogYW55KSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBpZiAoY3R4ICYmIGN0eC5hbGxvd0VtcHR5U3RyaW5ncykgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHYubGVuZ3RoID4gMDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdiAhPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJyZXF1aXJlZFwiLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIG1heGltdW0gc3RyaW5nIGxlbmd0aCBWYWxpZGF0b3I7IHRoZSBtYXhpbXVtIGxlbmd0aCBtdXN0IGJlIHNwZWNpZmllZFxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciByZWdpb25Qcm9wZXJ0eSAtIGN1c3RUeXBlLmdldFByb3BlcnR5KFwiUmVnaW9uXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFJlZ2lvbiBwcm9wZXJ0eSBvbiBDdXN0b21lciB3aWxsIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA1IGNoYXJhY3RlcnMuXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IubWF4TGVuZ3RoKCB7bWF4TGVuZ3RoOiA1fSkpO1xyXG4gIEBtZXRob2QgbWF4TGVuZ3RoXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBjb250ZXh0IHtPYmplY3R9XHJcbiAgQHBhcmFtIGNvbnRleHQubWF4TGVuZ3RoIHtJbnRlZ2VyfVxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBtYXhMZW5ndGggPSBmdW5jdGlvbihjb250ZXh0OiBhbnkpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mICh2KSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICByZXR1cm4gdi5sZW5ndGggPD0gY3R4Lm1heExlbmd0aDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcIm1heExlbmd0aFwiLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIHN0cmluZyBsZW5ndGggVmFsaWRhdG9yOyBib3RoIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RocyBtdXN0IGJlIHNwZWNpZmllZC5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgcmVnaW9uUHJvcGVydHkgLSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIlJlZ2lvblwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBSZWdpb24gcHJvcGVydHkgb24gQ3VzdG9tZXIgd2lsbCBiZVxyXG4gICAgICAvLyBiZXR3ZWVuIDIgYW5kIDUgY2hhcmFjdGVyc1xyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnN0cmluZ0xlbmd0aCgge21pbkxlbmd0aDogMiwgbWF4TGVuZ3RoOiA1fSk7XHJcbiAgQG1ldGhvZCBzdHJpbmdMZW5ndGhcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIGNvbnRleHQge09iamVjdH1cclxuICBAcGFyYW0gY29udGV4dC5tYXhMZW5ndGgge0ludGVnZXJ9XHJcbiAgQHBhcmFtIGNvbnRleHQubWluTGVuZ3RoIHtJbnRlZ2VyfVxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBzdHJpbmdMZW5ndGggPSBmdW5jdGlvbiAoY29udGV4dDogYW55KSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiAodikgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKGN0eC5taW5MZW5ndGggIT0gbnVsbCAmJiB2Lmxlbmd0aCA8IGN0eC5taW5MZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKGN0eC5tYXhMZW5ndGggIT0gbnVsbCAmJiB2Lmxlbmd0aCA+IGN0eC5tYXhMZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJzdHJpbmdMZW5ndGhcIiwgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBzdHJpbmcgZGF0YVR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciByZWdpb25Qcm9wZXJ0eSAtIGN1c3RUeXBlLmdldFByb3BlcnR5KFwiUmVnaW9uXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFJlZ2lvbiBwcm9wZXJ0eSBvbiBDdXN0b21lciBpcyBhIHN0cmluZy5cclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5zdHJpbmcoKSk7XHJcbiAgQG1ldGhvZCBzdHJpbmdcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHN0cmluZyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIHJldHVybiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwic3RyaW5nXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgR3VpZCBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciBjdXN0b21lcklkUHJvcGVydHkgLSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIkN1c3RvbWVySURcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgQ3VzdG9tZXJJRCBwcm9wZXJ0eSBvbiBDdXN0b21lciBpcyBhIEd1aWQuXHJcbiAgICAgIGN1c3RvbWVySWRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmd1aWQoKSk7XHJcbiAgQG1ldGhvZCBndWlkXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBndWlkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgcmV0dXJuIGNvcmUuaXNHdWlkKHYpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwiZ3VpZFwiLCB2YWxGbik7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIElTTyA4NjAxIGR1cmF0aW9uIHN0cmluZyAgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgZXZlbnRUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkV2ZW50XCIpO1xyXG4gICAgICB2YXIgZWxhcHNlZFRpbWVQcm9wZXJ0eSAtIGV2ZW50VHlwZS5nZXRQcm9wZXJ0eShcIkVsYXBzZWRUaW1lXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIEVsYXBzZWRUaW1lIHByb3BlcnR5IG9uIEN1c3RvbWVyIGlzIGEgZHVyYXRpb24uXHJcbiAgICAgIGVsYXBzZWRUaW1lUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5kdXJhdGlvbigpKTtcclxuICBAbWV0aG9kIGR1cmF0aW9uXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBkdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIHJldHVybiBjb3JlLmlzRHVyYXRpb24odik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJkdXJhdGlvblwiLCB2YWxGbik7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIG51bWVyaWMgZGF0YSB0eXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIGZyZWlnaHRQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIkZyZWlnaHRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRnJlaWdodCBwcm9wZXJ0eSBvbiBPcmRlciBpcyBhIG51bWJlci5cclxuICAgICAgZnJlaWdodFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IubnVtYmVyKCkpO1xyXG4gIEBtZXRob2QgbnVtYmVyXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcblxyXG4gICAgLy8gVE9ETzogbWF5IG5lZWQgdG8gaGF2ZSBzZXBlcmF0ZSBsb2dpYyBmb3Igc2luZ2xlLlxyXG4gIHB1YmxpYyBzdGF0aWMgbnVtYmVyID0gZnVuY3Rpb24oY29udGV4dD86IGFueSkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiBjdHggJiYgY3R4LmFsbG93U3RyaW5nKSB7XHJcbiAgICAgICAgdiA9IHBhcnNlRmxvYXQodik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIiAmJiAhaXNOYU4odikpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwibnVtYmVyXCIsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG4gIHB1YmxpYyBzdGF0aWMgZG91YmxlID0gVmFsaWRhdG9yLm51bWJlcjtcclxuICBwdWJsaWMgc3RhdGljIHNpbmdsZSA9IFZhbGlkYXRvci5udW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBsYXJnZSBpbnRlZ2VyIGRhdGEgdHlwZSAtIDY0IGJpdCAtIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIGZyZWlnaHRQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIkZyZWlnaHRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRnJlaWdodCBwcm9wZXJ0eSBvbiBPcmRlciBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIGEgNjQgYml0IGludGVnZXIuXHJcbiAgICAgIGZyZWlnaHRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmludDY0KCkpO1xyXG4gIEBtZXRob2QgaW50NjRcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGludGVnZXIgPSBmdW5jdGlvbihjb250ZXh0OiBhbnkpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIgJiYgY3R4ICYmIGN0eC5hbGxvd1N0cmluZykge1xyXG4gICAgICAgIHYgPSBwYXJzZUludCh2LCAxMCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikgJiYgKCFpc05hTih2KSkgJiYgTWF0aC5mbG9vcih2KSA9PT0gdjtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcImludGVnZXJcIiwgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcbiAgcHVibGljIHN0YXRpYyBpbnQ2NCA9IFZhbGlkYXRvci5pbnRlZ2VyO1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgMzIgYml0IGludGVnZXIgZGF0YSB0eXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIGZyZWlnaHRQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIkZyZWlnaHRcIik7XHJcbiAgICAgIGZyZWlnaHRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmludDMyKCkpO1xyXG4gIEBtZXRob2QgaW50MzJcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGludDMyID0gZnVuY3Rpb24oY29udGV4dDogYW55KSB7XHJcbiAgICByZXR1cm4gaW50UmFuZ2VWYWxpZGF0b3JDdG9yKFwiaW50MzJcIiwgSU5UMzJfTUlOLCBJTlQzMl9NQVgsIGNvbnRleHQpKCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIDE2IGJpdCBpbnRlZ2VyIGRhdGEgdHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgICAgIHZhciBmcmVpZ2h0UHJvcGVydHkgLSBvcmRlclR5cGUuZ2V0UHJvcGVydHkoXCJGcmVpZ2h0XCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIEZyZWlnaHQgcHJvcGVydHkgb24gT3JkZXIgaXMgd2l0aGluIHRoZSByYW5nZSBvZiBhIDE2IGJpdCBpbnRlZ2VyLlxyXG4gICAgICBmcmVpZ2h0UHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5pbnQxNigpKTtcclxuICBAbWV0aG9kIGludDE2XHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBpbnQxNiA9IGZ1bmN0aW9uKGNvbnRleHQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGludFJhbmdlVmFsaWRhdG9yQ3RvcihcImludDE2XCIsIElOVDE2X01JTiwgSU5UMTZfTUFYLCBjb250ZXh0KSgpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBieXRlIGRhdGEgdHlwZSBWYWxpZGF0b3IuIChUaGlzIGlzIGEgaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NSBpbmNsdXNpdmUgZm9yIGpzIHB1cnBvc2VzKS5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIGZyZWlnaHRQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIkZyZWlnaHRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRnJlaWdodCBwcm9wZXJ0eSBvbiBPcmRlciBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIGEgMTYgYml0IGludGVnZXIuXHJcbiAgICAgIC8vIFByb2JhYmx5IG5vdCBhIHZlcnkgZ29vZCB2YWxpZGF0aW9uIHRvIHBsYWNlIG9uIHRoZSBGcmVpZ2h0IHByb3BlcnR5LlxyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmJ5dGUoKSk7XHJcbiAgQG1ldGhvZCBieXRlXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBieXRlID0gZnVuY3Rpb24oY29udGV4dDogYW55KSB7XHJcbiAgICByZXR1cm4gaW50UmFuZ2VWYWxpZGF0b3JDdG9yKFwiYnl0ZVwiLCBCWVRFX01JTiwgQllURV9NQVgsIGNvbnRleHQpKCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIGJvb2xlYW4gZGF0YSB0eXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIHByb2R1Y3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIlByb2R1Y3RcIik7XHJcbiAgICAgIHZhciBkaXNjb250aW51ZWRQcm9wZXJ0eSAtIHByb2R1Y3RUeXBlLmdldFByb3BlcnR5KFwiRGlzY29udGludWVkXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIERpc2NvbnRpbnVlZCBwcm9wZXJ0eSBvbiBQcm9kdWN0IGlzIGEgYm9vbGVhblxyXG4gICAgICBkaXNjb250aW51ZWRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmJvb2woKSk7XHJcbiAgQG1ldGhvZCBib29sXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBib29sID0gZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICByZXR1cm4gKHYgPT09IHRydWUpIHx8ICh2ID09PSBmYWxzZSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJib29sXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc3RhdGljIG5vbmUgPSBmdW5jdGlvbigpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJub25lXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgZGF0ZSBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgb3JkZXJEYXRlUHJvcGVydHkgLSBvcmRlclR5cGUuZ2V0UHJvcGVydHkoXCJPcmRlckRhdGVcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgT3JkZXJEYXRlIHByb3BlcnR5IG9uIE9yZGVyIGlzIGEgZGF0ZVxyXG4gICAgICAvLyBQcm9iYWJseSBub3QgYSB2ZXJ5IGdvb2QgdmFsaWRhdGlvbiB0byBwbGFjZSBvbiB0aGUgRnJlaWdodCBwcm9wZXJ0eS5cclxuICAgICAgb3JkZXJEYXRlUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5kYXRlKCkpO1xyXG4gIEBtZXRob2QgZGF0ZVxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHJldHVybiAhaXNOYU4oRGF0ZS5wYXJzZSh2KSk7XHJcbiAgICAgICAgICAvLyBvbGQgY29kZVxyXG4gICAgICAgICAgLy8gcmV0dXJuIF9faXNEYXRlKG5ldyBEYXRlKHYpKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBjb3JlLmlzRGF0ZSh2KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwiZGF0ZVwiLCB2YWxGbik7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIGNyZWRpdCBjYXJkIG51bWJlciB2YWxpZGF0b3JcclxuICBQZXJmb3JtcyBhIGx1aG4gYWxnb3JpdGhtIGNoZWNrc3VtIHRlc3QgZm9yIHBsYXVzYWJpbGl0eVxyXG4gIGNhdGNoZXMgc2ltcGxlIG1pc3Rha2VzOyBvbmx5IHNlcnZpY2Uga25vd3MgZm9yIHN1cmVcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0gaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgcGVyc29uVHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIlBlcnNvblwiKTtcclxuICAgICAgdmFyIGNyZWRpdENhcmRQcm9wZXJ0eSA9IHBlcnNvblR5cGUuZ2V0UHJvcGVydHkoXCJjcmVkaXRDYXJkXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFBlcnNvbi5jcmVkaXRDYXJkIHByb3BlcnR5IGlzIGNyZWRpdCBjYXJkLlxyXG4gICAgICBjcmVkaXRDYXJkUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5jcmVkaXRDYXJkKCkpO1xyXG4gIEBtZXRob2QgY3JlZGl0Q2FyZFxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0aHJvdWdoIHRvIHZhbGlkYXRpb24gY29uc3RydWN0b3JcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgY3JlZGl0Q2FyZCA9IGZ1bmN0aW9uKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIGZ1bmN0aW9uIHZhbEZuKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiAodikgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHYgPSB2LnJlcGxhY2UoLyhcXC18XFxzKS9nLCBcIlwiKTsgLy8gcmVtb3ZlIGRhc2hlcyBhbmQgc3BhY2VzXHJcbiAgICAgIGlmICghdiB8fCAvXFxELy50ZXN0KHYpKSByZXR1cm4gZmFsc2U7IC8vIGFsbCBkaWdpdHMsIG5vdCBlbXB0eVxyXG4gICAgICByZXR1cm4gbHVobih2KTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKCdjcmVkaXRDYXJkJywgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRvcjsgdGhlIGV4cHJlc3Npb24gbXVzdCBiZSBzcGVjaWZpZWRcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBZGQgdmFsaWRhdG9yIHRvIGEgcHJvcGVydHkuIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0b21lclR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHJlZ2lvblByb3BlcnR5ID0gY3VzdG9tZXJUeXBlLmdldFByb3BlcnR5KFwiUmVnaW9uXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgQ3VzdG9tZXIuUmVnaW9uIGlzIDIgY2hhciB1cHBlcmNhc2UgYWxwaGEuXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IucmVndWxhckV4cHJlc3Npb24oIHtleHByZXNzaW9uOiAnXltBLVpdezJ9JCd9ICk7XHJcbiAgQG1ldGhvZCByZWd1bGFyRXhwcmVzc2lvblxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gY29udGV4dCB7T2JqZWN0fVxyXG4gIEBwYXJhbSBjb250ZXh0LmV4cHJlc3Npb24ge1N0cmluZ30gU3RyaW5nIGZvcm0gb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhcHBseVxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyByZWd1bGFyRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIGZ1bmN0aW9uIHZhbEZuKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgLy8gZG8gbm90IGludmFsaWRhdGUgaWYgZW1wdHk7IHVzZSBhIHNlcGFyYXRlIHJlcXVpcmVkIHRlc3RcclxuICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSAnJykgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgKHYpICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCByZSA9IG5ldyBSZWdFeHAoY3R4LmV4cHJlc3Npb24pO1xyXG4gICAgICAgIHJldHVybiByZS50ZXN0KHYpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgZXhwcmVzc2lvbiBwYXJhbWV0ZXIgdG8gcmVnRXhwIHZhbGlkYXRvcicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcigncmVndWxhckV4cHJlc3Npb24nLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgZW1haWwgYWRkcmVzcyB2YWxpZGF0b3JcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0gaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgcGVyc29uVHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIlBlcnNvblwiKTtcclxuICAgICAgdmFyIGVtYWlsUHJvcGVydHkgPSBwZXJzb25UeXBlLmdldFByb3BlcnR5KFwiZW1haWxcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgUGVyc29uLmVtYWlsIHByb3BlcnR5IGlzIGFuIGVtYWlsIGFkZHJlc3MuXHJcbiAgICAgIGVtYWlsUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5lbWFpbEFkZHJlc3MoKSk7XHJcbiAgQG1ldGhvZCBlbWFpbEFkZHJlc3NcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdGhyb3VnaCB0byB2YWxpZGF0aW9uIGNvbnN0cnVjdG9yXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGVtYWlsQWRkcmVzcyA9IGZ1bmN0aW9uKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc3JraXJrbGFuZC9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL2Jsb2IvbWFzdGVyL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvRW1haWxBdHRyaWJ1dGUuY3NcclxuICAgIGxldCByZUVtYWlsQWRkcmVzcyA9IC9eKCgoW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKyhcXC4oW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKykqKXwoKFxceDIyKSgoKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KChbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHg3Zl18XFx4MjF8W1xceDIzLVxceDViXXxbXFx4NWQtXFx4N2VdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoXFxcXChbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGQtXFx4N2ZdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpKSooKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KFxceDIyKSkpQCgoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKVxcLj8kL2k7XHJcbiAgICByZXR1cm4gbWFrZVJlZ0V4cFZhbGlkYXRvcignZW1haWxBZGRyZXNzJywgcmVFbWFpbEFkZHJlc3MsIG51bGwsIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIHBob25lIHZhbGlkYXRvclxyXG4gIFByb3ZpZGVzIGJhc2ljIGFzc2VydGlvbnMgb24gdGhlIGZvcm1hdCBhbmQgd2lsbCBoZWxwIHRvIGVsaW1pbmF0ZSBtb3N0IG5vbnNlbnNlIGlucHV0XHJcbiAgTWF0Y2hlczpcclxuICBJbnRlcm5hdGlvbmFsIGRpYWxpbmcgcHJlZml4OiB7e30sICssIDAsIDAwMDB9ICh3aXRoIG9yIHdpdGhvdXQgYSB0cmFpbGluZyBicmVhayBjaGFyYWN0ZXIsIGlmIG5vdCAnKyc6IFstLy4gXSlcclxuICA+ICgoXFwrKXwoMChcXGQrKT9bLS8uXFxzXSkpXHJcbiAgQ291bnRyeSBjb2RlOiB7e30sIDEsIC4uLiwgOTk5fSAod2l0aCBvciB3aXRob3V0IGEgdHJhaWxpbmcgYnJlYWsgY2hhcmFjdGVyOiBbLS8uIF0pXHJcbiAgPiBbMS05XVxcZHssMn1bLS8uXFxzXT9cclxuICBBcmVhIGNvZGU6IHsoMCksIC4uLiwgKDAwMDAwMCksIDAsIC4uLiwgMDAwMDAwfSAod2l0aCBvciB3aXRob3V0IGEgdHJhaWxpbmcgYnJlYWsgY2hhcmFjdGVyOiBbLS8uIF0pXHJcbiAgPiAoKFxcKFxcZHsxLDZ9XFwpfFxcZHsxLDZ9KVstLy5cXHNdPyk/XHJcbiAgTG9jYWw6IHswLCAuLi59KyAod2l0aCBvciB3aXRob3V0IGEgdHJhaWxpbmcgYnJlYWsgY2hhcmFjdGVyOiBbLS8uIF0pXHJcbiAgPiAoXFxkK1stLy5cXHNdPykrXFxkK1xyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0b21lclR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHBob25lUHJvcGVydHkgPSBjdXN0b21lclR5cGUuZ2V0UHJvcGVydHkoXCJwaG9uZVwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBDdXN0b21lci5waG9uZSBwcm9wZXJ0eSBpcyBwaG9uZS5cclxuICAgICAgcGhvbmVQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnBob25lKCkpO1xyXG4gIEBtZXRob2QgcGhvbmVcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdGhyb3VnaCB0byB2YWxpZGF0aW9uIGNvbnN0cnVjdG9yXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHBob25lID0gZnVuY3Rpb24gKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc3JraXJrbGFuZC9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL2Jsb2IvbWFzdGVyL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvRXhwcmVzc2lvbnMuY3NcclxuICAgIGxldCByZVBob25lID0gL14oKFxcK3woMChcXGQrKT9bLS8uXFxzXT8pKVsxLTldXFxkezAsMn1bLS8uXFxzXT8pPygoXFwoXFxkezEsNn1cXCl8XFxkezEsNn0pWy0vLlxcc10/KT8oXFxkK1stLy5cXHNdPykrXFxkKyQvO1xyXG4gICAgcmV0dXJuIG1ha2VSZWdFeHBWYWxpZGF0b3IoJ3Bob25lJywgcmVQaG9uZSwgbnVsbCwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgVVJMIChwcm90b2NvbCByZXF1aXJlZCkgdmFsaWRhdG9yXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIHBlcnNvblR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJQZXJzb25cIik7XHJcbiAgICAgIHZhciB3ZWJzaXRlUHJvcGVydHkgPSBwZXJzb25UeXBlLmdldFByb3BlcnR5KFwid2Vic2l0ZVwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBQZXJzb24ud2Vic2l0ZSBwcm9wZXJ0eSBpcyBhIFVSTC5cclxuICAgICAgd2Vic2l0ZVByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IudXJsKCkpO1xyXG4gIEBtZXRob2QgdXJsXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBbY29udGV4dF0ge09iamVjdH0gb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRocm91Z2ggdG8gdmFsaWRhdGlvbiBjb25zdHJ1Y3RvclxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyB1cmwgPSBmdW5jdGlvbiAoY29udGV4dD86IGFueSkge1xyXG4gICAgLy9TZWUgaHR0cHM6Ly9naXRodWIuY29tL3Nya2lya2xhbmQvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9ibG9iL21hc3Rlci9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL1VybEF0dHJpYnV0ZS5jc1xyXG4gICAgbGV0IHJlVXJsUHJvdG9jb2xSZXF1aXJlZCA9IC9eKGh0dHBzP3xmdHApOlxcL1xcLygoKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZBLUZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6KSpAKT8oKChcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSlcXC4oXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pXFwuKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKVxcLihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSkpfChbYS16QS1aXVtcXC1hLXpBLVowLTldKil8KCgoW2EtekEtWl18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpBLVpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkqKFthLXpBLVpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKVxcLikrKChbYS16QS1aXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16QS1aXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkqKFthLXpBLVpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuPykoOlxcZCopPykoXFwvKCgoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mQS1GXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OnxAKSsoXFwvKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZBLUZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6fEApKikqKT8pPyhcXD8oKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZBLUZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6fEApfFtcXHVFMDAwLVxcdUY4RkZdfFxcL3xcXD8pKik/KFxcIygoKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZkEtRl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDp8QCl8XFwvfFxcPykqKT8kLztcclxuICAgIHJldHVybiBtYWtlUmVnRXhwVmFsaWRhdG9yKCd1cmwnLCByZVVybFByb3RvY29sUmVxdWlyZWQsIG51bGwsIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIENyZWF0ZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdG9yIHdpdGggYSBmaXhlZCBleHByZXNzaW9uLlxyXG4gIE1hbnkgb2YgdGhlIHN0b2NrIHZhbGlkYXRvcnMgYXJlIGJ1aWx0IHdpdGggdGhpcyBmYWN0b3J5IG1ldGhvZC5cclxuICBUaGVpciBleHByZXNzaW9ucyBhcmUgb2Z0ZW4gZGVyaXZlZCBmcm9tXHJcbiAgaHR0cHM6Ly9naXRodWIuY29tL3Nya2lya2xhbmQvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9ibG9iL21hc3Rlci9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zXHJcbiAgWW91IGNhbiB0cnkgbWFueSBvZiB0aGVtIGF0IGh0dHA6Ly9kYXRhYW5ub3RhdGlvbnNleHRlbnNpb25zLm9yZy9cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBNYWtlIGEgemlwY29kZSB2YWxpZGF0b3JcclxuICAgICAgZnVuY3Rpb24gemlwVmFsaWRhdG9yID0gVmFsaWRhdG9yLm1ha2VSZWdFeHBWYWxpZGF0b3IoXHJcbiAgICAgIFwiemlwVmFsLFxyXG4gICAgICAvXlxcZHs1fShbXFwtXVxcZHs0fSk/JC8sXHJcbiAgICAgIFwiVGhlICVkaXNwbGF5TmFtZSUgJyV2YWx1ZSUnIGlzIG5vdCBhIHZhbGlkIFUuUy4gemlwY29kZVwiKTtcclxuICAgICAgLy8gUmVnaXN0ZXIgaXQuXHJcbiAgICAgIFZhbGlkYXRvci5yZWdpc3Rlcih6aXBWYWxpZGF0b3IpO1xyXG4gICAgICAvLyBBZGQgaXQgdG8gYSBkYXRhIHByb3BlcnR5LiBBc3N1bWUgZW0gaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHppcFByb3BlcnR5ID0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJQb3N0YWxDb2RlXCIpO1xyXG4gICAgICB6aXBQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goemlwVmFsaWRhdG9yKTtcclxuICBAbWV0aG9kIG1ha2VSZWdFeHBWYWxpZGF0b3JcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIHZhbGlkYXRvck5hbWUge1N0cmluZ30gbmFtZSBvZiB0aGlzIHZhbGlkYXRvclxyXG4gIEBwYXJhbSBleHByZXNzaW9uIHtTdHJpbmcgfCBSZWdFeHB9IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhcHBseVxyXG4gIEBwYXJhbSBbZGVmYXVsdE1lc3NhZ2VdIHtTdHJpbmd9IGRlZmF1bHQgbWVzc2FnZSBmb3IgZmFpbGVkIHZhbGlkYXRpb25zXHJcbiAgQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdGhyb3VnaCB0byB2YWxpZGF0aW9uIGNvbnN0cnVjdG9yXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIG1ha2VSZWdFeHBWYWxpZGF0b3IgPSBtYWtlUmVnRXhwVmFsaWRhdG9yO1xyXG5cclxufVxyXG5WYWxpZGF0b3IucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIlZhbGlkYXRvclwiO1xyXG5cclxuLy8gcmVnaXN0ZXIgYWxsIHZhbGlkYXRvcnNcclxuRXJyb3JbJ3gnXSA9IGNvcmUub2JqZWN0Rm9yRWFjaChWYWxpZGF0b3IsIGZ1bmN0aW9uIChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gIGlmICh0eXBlb2YgKHZhbHVlKSAhPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGlmIChrZXkgPT09IFwiZnJvbUpTT05cIiB8fCBrZXkgPT09IFwicmVnaXN0ZXJcIiB8fFxyXG4gICAgICBrZXkgPT09IFwicmVnaXN0ZXJGYWN0b3J5XCIgfHwga2V5ID09PSBcIm1ha2VSZWdFeHBWYWxpZGF0b3JcIikge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uZmlnLnJlZ2lzdGVyRnVuY3Rpb24odmFsdWUsIFwiVmFsaWRhdG9yLlwiICsga2V5KTtcclxufSk7XHJcblxyXG5mdW5jdGlvbiBmb3JtYXRUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCB2YXJzOiBPYmplY3QsIG93blByb3BlcnRpZXNPbmx5OiBib29sZWFuID0gZmFsc2UpIHtcclxuICBpZiAoIXZhcnMpIHJldHVybiB0ZW1wbGF0ZTtcclxuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvJShbXiVdKyklL2csIGZ1bmN0aW9uIChfLCBrZXkpIHtcclxuICAgIGxldCB2YWxPckZuOiBhbnk7XHJcbiAgICBpZiAob3duUHJvcGVydGllc09ubHkpIHtcclxuICAgICAgdmFsT3JGbiA9IHZhcnMuaGFzT3duUHJvcGVydHkoa2V5KSA/IHZhcnNba2V5XSA6ICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsT3JGbiA9IHZhcnNba2V5XTtcclxuICAgIH1cclxuICAgIGlmICh2YWxPckZuICE9IG51bGwpIHtcclxuICAgICAgaWYgKGNvcmUuaXNGdW5jdGlvbih2YWxPckZuKSkge1xyXG4gICAgICAgIHJldHVybiB2YWxPckZuKHZhcnMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB2YWxPckZuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaW50UmFuZ2VWYWxpZGF0b3JDdG9yKHZhbGlkYXRvck5hbWU6IHN0cmluZywgbWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlciwgY29udGV4dDogYW55KSB7XHJcbiAgY29udGV4dCA9IGNvbnRleHQgfHwge307XHJcbiAgaWYgKG1pblZhbHVlICE9PSB1bmRlZmluZWQpIHsgY29udGV4dC5taW4gPSBtaW5WYWx1ZTsgfVxyXG4gIGlmIChtYXhWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7IGNvbnRleHQubWF4ID0gbWF4VmFsdWU7IH1cclxuICBsZXQgdGVtcGxhdGVFeGlzdHMgPSBjb250ZXh0Lm1lc3NhZ2VUZW1wbGF0ZSB8fCBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1t2YWxpZGF0b3JOYW1lXTtcclxuICBpZiAoIXRlbXBsYXRlRXhpc3RzKSB7XHJcbiAgICBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1t2YWxpZGF0b3JOYW1lXSA9IGNvcmUuZm9ybWF0U3RyaW5nKFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIHRoZSB2YWx1ZXMgb2YgJTEgYW5kICUyXCIsXHJcbiAgICAgICAgbWluVmFsdWUsIG1heFZhbHVlKTtcclxuICB9XHJcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIgJiYgY3R4ICYmIGN0eC5hbGxvd1N0cmluZykge1xyXG4gICAgICAgIHYgPSBwYXJzZUludCh2LCAwKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSAmJiAoIWlzTmFOKHYpKSAmJiBNYXRoLmZsb29yKHYpID09PSB2KSB7XHJcbiAgICAgICAgaWYgKG1pblZhbHVlICE9IG51bGwgJiYgdiA8IG1pblZhbHVlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhWYWx1ZSAhPSBudWxsICYmIHYgPiBtYXhWYWx1ZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcih2YWxpZGF0b3JOYW1lLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZWdFeHBWYWxpZGF0b3IodmFsaWRhdG9yTmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiBSZWdFeHAsIGRlZmF1bHRNZXNzYWdlPzogc3RyaW5nIHwgbnVsbCwgY29udGV4dD86IGFueSkge1xyXG4gIGlmIChkZWZhdWx0TWVzc2FnZSkge1xyXG4gICAgVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXNbdmFsaWRhdG9yTmFtZV0gPSBkZWZhdWx0TWVzc2FnZTtcclxuICB9XHJcbiAgbGV0IHJlID0gKHR5cGVvZiAoZXhwcmVzc2lvbikgPT09ICdzdHJpbmcnKSA/IG5ldyBSZWdFeHAoZXhwcmVzc2lvbikgOiBleHByZXNzaW9uO1xyXG4gIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgIC8vIGRvIG5vdCBpbnZhbGlkYXRlIGlmIGVtcHR5OyB1c2UgYSBzZXBhcmF0ZSByZXF1aXJlZCB0ZXN0XHJcbiAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmICh0eXBlb2YgKHYpICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHJlLnRlc3Qodik7XHJcbiAgfTtcclxuICByZXR1cm4gbmV3IFZhbGlkYXRvcih2YWxpZGF0b3JOYW1lLCB2YWxGbiwgY29udGV4dCk7XHJcbn1cclxuXHJcbi8vIGh0dHA6Ly9yb3NldHRhY29kZS5vcmcvd2lraS9MdWhuX3Rlc3Rfb2ZfY3JlZGl0X2NhcmRfbnVtYmVycyNKYXZhU2NyaXB0XHJcblxyXG4vLyBmdW5jdGlvbiBsdWhuKGE6IHN0cmluZywgYjogbnVtYmVyLCBjOiBudW1iZXIsIGQ6IG51bWJlciwgZTogbnVtYmVyKSB7XHJcbi8vICAgZm9yIChkID0gK2FbYiA9IGEubGVuZ3RoIC0gMV0sIGUgPSAwOyBiLS07ICkge1xyXG4vLyAgICAgYyA9ICthW2JdLCBkICs9ICsrZSAlIDIgPyAyICogYyAlIDEwICsgKGMgPiA0KSA6IGM7XHJcbi8vICAgfVxyXG4vLyAgIHJldHVybiAhKGQgJSAxMCk7XHJcbi8vIH07XHJcblxyXG5sZXQgIGx1aG4gPSAoZnVuY3Rpb24oKSB7XHJcbiAgbGV0IGx1aG5BcnIgPSBbMCwgMiwgNCwgNiwgOCwgMSwgMywgNSwgNywgOV07XHJcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0cjogc3RyaW5nKSBcdHtcclxuICAgIGxldCBjb3VudGVyID0gMDtcclxuICAgIGxldCBpbmNOdW06IG51bWJlcjtcclxuICAgIGxldCBvZGQgPSBmYWxzZTtcclxuICAgIGxldCB0ZW1wID0gU3RyaW5nKHN0cikucmVwbGFjZSgvW15cXGRdL2csIFwiXCIpO1xyXG4gICAgaWYgKCB0ZW1wLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgZm9yIChsZXQgaSA9IHRlbXAubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpICB7XHJcbiAgICAgIGluY051bSA9IHBhcnNlSW50KHRlbXAuY2hhckF0KGkpLCAxMCk7XHJcbiAgICAgIGNvdW50ZXIgKz0gKG9kZCA9ICFvZGQpID8gaW5jTnVtIDogbHVobkFycltpbmNOdW1dO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIChjb3VudGVyICUgMTAgPT09IDApO1xyXG4gIH07XHJcbn0pKCk7XHJcblxyXG4vKipcclxuQSBWYWxpZGF0aW9uRXJyb3IgaXMgdXNlZCB0byBkZXNjcmliZSBhIGZhaWxlZCB2YWxpZGF0aW9uLlxyXG5cclxuQGNsYXNzIFZhbGlkYXRpb25FcnJvclxyXG4qKi9cclxuXHJcbi8qKlxyXG5Db25zdHJ1Y3RzIGEgbmV3IFZhbGlkYXRpb25FcnJvclxyXG5AbWV0aG9kIDxjdG9yPiBWYWxpZGF0aW9uRXJyb3JcclxuXHJcbkBwYXJhbSB2YWxpZGF0b3Ige1ZhbGlkYXRvciB8fCBudWxsfSBUaGUgVmFsaWRhdG9yIHVzZWQgdG8gY3JlYXRlIHRoaXMgZXJyb3IsIGlmIGFueS5cclxuQHBhcmFtIGNvbnRleHQgeyBDb250ZXh0T2JqZWN0IHx8IG51bGx9IFRoZSBDb250ZXh0IG9iamVjdCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFZhbGlkYXRvciB0byBjcmVhdGUgdGhpcyBlcnJvci5cclxuQHBhcmFtIGVycm9yTWVzc2FnZSB7IFN0cmluZ30gVGhlIGFjdHVhbCBlcnJvciBtZXNzYWdlXHJcbkBwYXJhbSBba2V5XSB7U3RyaW5nfSBBbiBvcHRpb25hbCBrZXkgdXNlZCB0byBkZWZpbmUgYSBrZXkgZm9yIHRoaXMgZXJyb3IuIE9uZSB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBpZiBub3QgcHJvdmlkZWQgaGVyZS5cclxuKiovXHJcbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3Ige1xyXG4gIHZhbGlkYXRvcj86IFZhbGlkYXRvcjtcclxuICBrZXk6IHN0cmluZztcclxuICBjb250ZXh0OiBhbnk7XHJcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbiAgcHJvcGVydHk6IGFueTsgLy8gSVByb3BlcnR5XHJcbiAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XHJcbiAgaXNTZXJ2ZXJFcnJvcjogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IodmFsaWRhdG9yOiBWYWxpZGF0b3IgfCBudWxsLCBjb250ZXh0OiBWYWxpZGF0aW9uQ29udGV4dCwgZXJyb3JNZXNzYWdlOiBzdHJpbmcsIGtleT86IHN0cmluZykge1xyXG4gICAgLy8gRXJyb3IgaXMgd2l0aCBpc0luc3RhbmNlT2YoVmFsaWRhdG9yKVxyXG4gICAgYXNzZXJ0UGFyYW0odmFsaWRhdG9yLCBcInZhbGlkYXRvclwiKS5pc09wdGlvbmFsKCkuaXNJbnN0YW5jZU9mKFZhbGlkYXRvcikuY2hlY2soKTtcclxuICAgIGFzc2VydFBhcmFtKGVycm9yTWVzc2FnZSwgXCJlcnJvck1lc3NhZ2VcIikuaXNOb25FbXB0eVN0cmluZygpLmNoZWNrKCk7XHJcbiAgICBhc3NlcnRQYXJhbShrZXksIFwia2V5XCIpLmlzT3B0aW9uYWwoKS5pc05vbkVtcHR5U3RyaW5nKCkuY2hlY2soKTtcclxuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yIHx8IHVuZGVmaW5lZDtcclxuICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlO1xyXG5cclxuICAgIHRoaXMucHJvcGVydHkgPSBjb250ZXh0LnByb3BlcnR5O1xyXG4gICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBjb250ZXh0LnByb3BlcnR5TmFtZSB8fCAoY29udGV4dC5wcm9wZXJ0eSAmJiBjb250ZXh0LnByb3BlcnR5Lm5hbWUpO1xyXG5cclxuICAgIGlmIChrZXkpIHtcclxuICAgICAgdGhpcy5rZXkgPSBrZXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmtleSA9IFZhbGlkYXRpb25FcnJvci5nZXRLZXkodmFsaWRhdG9yIHx8IGVycm9yTWVzc2FnZSwgdGhpcy5wcm9wZXJ0eU5hbWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1NlcnZlckVycm9yID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgVGhlIFZhbGlkYXRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBWYWxpZGF0aW9uRXJyb3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSB2YWxpZGF0b3Ige1ZhbGlkYXRvcn1cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgQSAnY29udGV4dCcgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZhbGlkYXRpb25FcnJvci5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IGNvbnRleHQge09iamVjdH1cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgVGhlIERhdGFQcm9wZXJ0eSBvciBOYXZpZ2F0aW9uUHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVmFsaWRhdGlvbkVycm9yLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgcHJvcGVydHkge0RhdGFQcm9wZXJ0eXxOYXZpZ2F0aW9uUHJvcGVydHl9XHJcbiAgKiovXHJcblxyXG4gIC8qKlxyXG4gIFRoZSBwcm9wZXJ0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZhbGlkYXRpb25FcnJvci4gVGhpcyB3aWxsIGJlIGEgXCJwcm9wZXJ0eSBwYXRoXCIgZm9yIGFueSBwcm9wZXJ0aWVzIG9mIGEgY29tcGxleCBvYmplY3QuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBwcm9wZXJ0eU5hbWUge1N0cmluZ31cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgVGhlIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBWYWxpZGF0aW9uRXJyb3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBlcnJvck1lc3NhZ2Uge3N0cmluZ31cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgVGhlIGtleSBieSB3aGljaCB0aGlzIHZhbGlkYXRpb24gZXJyb3IgbWF5IGJlIHJlbW92ZWQgZnJvbSBhIGNvbGxlY3Rpb24gb2YgVmFsaWRhdGlvbkVycm9ycy5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IGtleSB7c3RyaW5nfVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBXaGV0aGVyIHRoaXMgaXMgYSBzZXJ2ZXIgZXJyb3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBpc1NlcnZlckVycm9yIHtib29sfVxyXG4gICoqL1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgQ29tcG9zZXMgYSBWYWxpZGF0aW9uRXJyb3IgJ2tleScgZ2l2ZW4gYSB2YWxpZGF0b3Igb3IgYW4gZXJyb3JOYW1lIGFuZCBhbiBvcHRpb25hbCBwcm9wZXJ0eU5hbWVcclxuICBAbWV0aG9kIGdldEtleVxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gdmFsaWRhdG9yIHtWYWxpZGF0b3JPckVycm9yS2V5fSBBIFZhbGlkYXRvciBvciBhbiBcImVycm9yIG5hbWVcIiBpZiBubyB2YWxpZGF0b3IgaXMgYXZhaWxhYmxlLlxyXG4gIEBwYXJhbSBbcHJvcGVydHlOYW1lXSBBIHByb3BlcnR5IG5hbWVcclxuICBAcmV0dXJuIHtTdHJpbmd9IEEgVmFsaWRhdGlvbkVycm9yICdrZXknXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBnZXRLZXkodmFsaWRhdG9yT3JFcnJvck5hbWU6IFZhbGlkYXRvciB8IHN0cmluZywgcHJvcGVydHlOYW1lPzogc3RyaW5nKSB7XHJcbiAgICBsZXQgbmFtZSA9ICh0eXBlb2YgdmFsaWRhdG9yT3JFcnJvck5hbWUgPT09ICdzdHJpbmcnKSA/IHZhbGlkYXRvck9yRXJyb3JOYW1lIDogdmFsaWRhdG9yT3JFcnJvck5hbWUubmFtZTtcclxuICAgIHJldHVybiBuYW1lICsgKHByb3BlcnR5TmFtZSA/IFwiOlwiICsgcHJvcGVydHlOYW1lIDogXCJcIik7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==
|
|
991
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL3ZhbGlkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJbEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFFL0IsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQztBQUMxQixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO1dBMEJiLFVBQVUsT0FBMEI7SUFDL0MsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztLQUN6RztTQUFNO1FBQ0wsT0FBTyxPQUFPLENBQUM7S0FDaEI7QUFDSCxDQUFDO0FBUkgsbUVBQW1FO0FBQ25FLElBQUksV0FBVyxHQUFHO0lBQ2hCLFdBQVcsSUFNVjtDQUNGLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29yZSB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7IGFzc2VydFBhcmFtIH0gZnJvbSAnLi9hc3NlcnQtcGFyYW0nO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25Qcm9wZXJ0eSwgRGF0YVByb3BlcnR5IH0gZnJvbSAnLi9lbnRpdHktbWV0YWRhdGEnO1xyXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuL2VudGl0eS1hc3BlY3QnO1xyXG5cclxuZXhwb3J0IGNvbnN0IElOVDE2X01JTiA9IC0zMjc2ODtcclxuZXhwb3J0IGNvbnN0IElOVDE2X01BWCA9IDMyNzY3O1xyXG5cclxuZXhwb3J0IGNvbnN0IElOVDMyX01JTiA9IC0yMTQ3NDgzNjQ4O1xyXG5leHBvcnQgY29uc3QgSU5UMzJfTUFYID0gMjE0NzQ4MzY0NztcclxuXHJcbmV4cG9ydCBjb25zdCBCWVRFX01JTiA9IDA7XHJcbmV4cG9ydCBjb25zdCBCWVRFX01BWCA9IDI1NTtcclxuXHJcbi8qKiBQYXNzZWQgdG8gVmFsaWRhdGlvbkZuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbkNvbnRleHQge1xyXG4gIGVudGl0eT86IEVudGl0eTtcclxuICBwcm9wZXJ0eT86IERhdGFQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eTtcclxuICBwcm9wZXJ0eU5hbWU/OiBzdHJpbmc7XHJcbiAgdmFsdWU/OiBhbnk7XHJcbn1cclxuXHJcbi8qKiBVc2VkIGJ5IFZhbGlkYXRvciB0byBjb21wb3NlIG1lc3NhZ2VzICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0IGV4dGVuZHMgVmFsaWRhdGlvbkNvbnRleHQge1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XHJcbiAgbWVzc2FnZVRlbXBsYXRlPzogc3RyaW5nO1xyXG4gIG1lc3NhZ2U/OiBzdHJpbmcgfCAoKHZjOiBWYWxpZGF0aW9uQ29udGV4dCkgPT4gc3RyaW5nKTtcclxuICBba2V5OnN0cmluZ106IGFueTtcclxufVxyXG5cclxuLyoqIEZ1bmN0aW9uIGNhbGxlZCB0byB2YWxpZGF0ZSBhbiBlbnRpdHkgb3IgcHJvcGVydHkgKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uRm4ge1xyXG4gICAgKHZhbHVlOiBhbnksIGNvbnRleHQ/OiBWYWxpZGF0aW9uQ29udGV4dCk6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8vIGFkZCBjb21tb24gcHJvcHMgYW5kIG1ldGhvZHMgZm9yIGV2ZXJ5IHZhbGlkYXRvciAnY29udGV4dCcgaGVyZS5cclxubGV0IHJvb3RDb250ZXh0ID0ge1xyXG4gIGRpc3BsYXlOYW1lOiBmdW5jdGlvbiAoY29udGV4dDogVmFsaWRhdGlvbkNvbnRleHQpIHtcclxuICAgIGlmIChjb250ZXh0LnByb3BlcnR5KSB7XHJcbiAgICAgIHJldHVybiBjb250ZXh0LnByb3BlcnR5LnJlc29sdmVQcm9wZXJ0eShcImRpc3BsYXlOYW1lXCIpIHx8IGNvbnRleHQucHJvcGVydHlOYW1lIHx8IGNvbnRleHQucHJvcGVydHkubmFtZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBcIlZhbHVlXCI7XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbkluc3RhbmNlcyBvZiB0aGUgVmFsaWRhdG9yIGNsYXNzIHByb3ZpZGUgdGhlIGxvZ2ljIHRvIHZhbGlkYXRlIGFub3RoZXIgb2JqZWN0IGFuZCBwcm92aWRlIGEgZGVzY3JpcHRpb24gb2YgYW55IGVycm9yc1xyXG5lbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcHJvY2Vzcy4gIFRoZXkgYXJlIHR5cGljYWxseSBhc3NvY2lhdGVkIHdpdGggYSAndmFsaWRhdG9ycycgcHJvcGVydHkgb24gdGhlIGZvbGxvd2luZyB0eXBlczogW1tFbnRpdHlUeXBlXV0sXHJcbltbRGF0YVByb3BlcnR5XV0gb3IgW1tOYXZpZ2F0aW9uUHJvcGVydHldXS5cclxuXHJcbkEgbnVtYmVyIG9mIHByb3BlcnR5IGxldmVsIHZhbGlkYXRvcnMgYXJlIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseSwgaS5lIGFkZGVkIHRvIGVhY2ggRGF0YVByb3BlcnR5LnZhbGlkYXRvcnMgcHJvcGVydHlcclxuYmFzZWQgb24gW1tEYXRhUHJvcGVydHldXSBtZXRhZGF0YS4gIEZvciBleGFtcGxlLFxyXG5cclxuLSBEYXRhUHJvcGVydHkuZGF0YVR5cGUgLT4gb25lIG9mIHRoZSAnZGF0YVR5cGUnIHZhbGlkYXRvciBtZXRob2RzIHN1Y2ggYXMgVmFsaWRhdG9yLmludDY0LCBWYWxpZGF0b3IuZGF0ZSwgVmFsaWRhdG9yLmJvb2wgZXRjLlxyXG4tIERhdGFQcm9wZXJ0eS5tYXhMZW5ndGggLT4gVmFsaWRhdG9yLm1heExlbmd0aFxyXG4tIERhdGFQcm9wZXJ0eS5pc051bGxhYmxlIC0+IFZhbGlkYXRvci5yZXF1aXJlZCAoaWYgbm90IG51bGxhYmxlKVxyXG5cclxuQGNsYXNzIFZhbGlkYXRvclxyXG4qKi9cclxuXHJcbi8qKlxyXG5WYWxpZGF0b3IgY29uc3RydWN0b3IgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSBjcmVhdGUgY3VzdG9tIHZhbGlkYXRpb25zLiAgU2V2ZXJhbFxyXG5iYXNpYyBcIlZhbGlkYXRvclwiIGNvbnN0cnVjdGlvbiBtZXRob2RzIGFyZSBhbHNvIHByb3ZpZGVkIGFzIHN0YXRpYyBtZXRob2RzIHRvIHRoaXMgY2xhc3MuIFRoZXNlIG1ldGhvZHNcclxucHJvdmlkZSBhIHNpbXBsZXIgc3ludGF4IGZvciBjcmVhdGluZyBiYXNpYyB2YWxpZGF0aW9ucy5cclxuXHJcbk1hbnkgb2YgdGhlc2Ugc3RvY2sgdmFsaWRhdG9ycyBhcmUgaW5zcGlyZWQgYnkgYW5kIGltcGxlbWVudGVkIHRvIGNvbmZvcm0gdG8gdGhlIHZhbGlkYXRvcnMgZGVmaW5lZCBhdFxyXG5odHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvc3lzdGVtLmNvbXBvbmVudG1vZGVsLmRhdGFhbm5vdGF0aW9ucy5hc3B4XHJcblxyXG5Tb21ldGltZXMgYSBjdXN0b20gdmFsaWRhdG9yIHdpbGwgYmUgcmVxdWlyZWQuXHJcbkBleGFtcGxlXHJcbk1vc3QgdmFsaWRhdG9ycyB3aWxsIGJlICdwcm9wZXJ0eScgbGV2ZWwgdmFsaWRhdG9ycywgbGlrZSB0aGlzLlxyXG5AZXhhbXBsZVxyXG4gICAgLy8gdiBpcyB0aGlzIGZ1bmN0aW9uIGlzIHRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQsIGluIHRoaXMgY2FzZSBhIFwiY291bnRyeVwiIHN0cmluZy5cclxuICAgIHZhciB2YWxGbiA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIChjb3JlLnN0cmluZ1N0YXJ0c1dpdGgodiwgXCJVU1wiKSk7XHJcbiAgICB9O1xyXG4gICAgdmFyIGNvdW50cnlWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKFwiY291bnRyeUlzVVNcIiwgdmFsRm4sIHtcclxuICAgICAgICBkaXNwbGF5TmFtZTogXCJDb3VudHJ5XCIsIFxyXG4gICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBzdGFydCB3aXRoICdVUydcIiBcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIE5vdyBwbHVnIGl0IGludG8gQnJlZXplLlxyXG4gICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICB2YXIgY3VzdFR5cGUgPSBtZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgIHZhciBjb3VudHJ5UHJvcCA9IGN1c3RUeXBlLmdldFByb3BlcnR5KFwiQ291bnRyeVwiKTtcclxuICAgIC8vIE5vdGUgdGhhdCB2YWxpZGF0b3IgaXMgYWRkZWQgdG8gYSAnRGF0YVByb3BlcnR5JyB2YWxpZGF0b3JzIGNvbGxlY3Rpb24uXHJcbiAgICBwcm9wLnZhbGlkYXRvcnMucHVzaChjb3VudHJ5VmFsaWRhdG9yKTtcclxuRW50aXR5IGxldmVsIHZhbGlkYXRvcnMgYXJlIGFsc28gcG9zc2libGVcclxuQGV4YW1wbGVcclxuICAgIGZ1bmN0aW9uIGlzVmFsaWRaaXBDb2RlKHZhbHVlKSB7XHJcbiAgICAgICAgdmFyIHJlID0gL15cXGR7NX0oW1xcLV1cXGR7NH0pPyQvO1xyXG4gICAgICAgIHJldHVybiAocmUudGVzdCh2YWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHYgaW4gdGhpcyBjYXNlIHdpbGwgYmUgYSBDdXN0b21lciBlbnRpdHlcclxuICAgIHZhciB2YWxGbiA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgLy8gVGhpcyB2YWxpZGF0b3Igb25seSB2YWxpZGF0ZXMgVVMgWmlwIENvZGVzLlxyXG4gICAgICAgIGlmICggdi5nZXRQcm9wZXJ0eShcIkNvdW50cnlcIikgPT09IFwiVVNBXCIpIHtcclxuICAgICAgICAgICAgdmFyIHBvc3RhbENvZGUgPSB2LmdldFByb3BlcnR5KFwiUG9zdGFsQ29kZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWRaaXBDb2RlKHBvc3RhbENvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcbiAgICB2YXIgemlwQ29kZVZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoXCJ6aXBDb2RlVmFsaWRhdG9yXCIsIHZhbEZuLFxyXG4gICAgICAgIHsgbWVzc2FnZVRlbXBsYXRlOiBcIkZvciB0aGUgVVMsIHRoaXMgaXMgbm90IGEgdmFsaWQgUG9zdGFsQ29kZVwiIH0pO1xyXG5cclxuICAgIC8vIE5vdyBwbHVnIGl0IGludG8gQnJlZXplLlxyXG4gICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAvLyBOb3RlIHRoYXQgdmFsaWRhdG9yIGlzIGFkZGVkIHRvIGFuICdFbnRpdHlUeXBlJyB2YWxpZGF0b3JzIGNvbGxlY3Rpb24uXHJcbiAgICBjdXN0VHlwZS52YWxpZGF0b3JzLnB1c2goemlwQ29kZVZhbGlkYXRvcik7XHJcbldoYXQgaXMgY29tbW9ubHkgbmVlZGVkIGlzIGEgd2F5IG9mIGNyZWF0aW5nIGEgcGFyYW1ldGVyaXplZCBmdW5jdGlvbiB0aGF0IHdpbGwgaXRzZWxmXHJcbnJldHVybiBhIG5ldyBWYWxpZGF0b3IuICBUaGlzIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYSAnY29udGV4dCcgb2JqZWN0LlxyXG5AZXhhbXBsZVxyXG4gICAgLy8gY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHRha2UgaW4gYSBjb25maWcgb2JqZWN0XHJcbiAgICAvLyBhbmQgd2lsbCByZXR1cm4gYSB2YWxpZGF0b3JcclxuICAgIHZhciBudW1lcmljUmFuZ2VWYWxpZGF0b3IgPSBmdW5jdGlvbihjb250ZXh0KSB7XHJcbiAgICAgICAgdmFyIHZhbEZuID0gZnVuY3Rpb24odiwgY3R4KSB7XHJcbiAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKHYpICE9PSBcIm51bWJlclwiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChjdHgubWluICE9IG51bGwgJiYgdiA8IGN0eC5taW4pIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGN0eC5tYXggIT0gbnVsbCAmJiB2ID4gY3R4Lm1heCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIFRoZSBsYXN0IHBhcmFtZXRlciBiZWxvdyBpcyB0aGUgJ2NvbnRleHQnIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIGludG8gdGhlICdjdHgnIHBhcmFtZXRlciBhYm92ZVxyXG4gICAgICAgIC8vIHdoZW4gdGhpcyB2YWxpZGF0b3IgZXhlY3V0ZXMuIFNldmVyYWwgb3RoZXIgcHJvcGVydGllcywgc3VjaCBhcyBkaXNwbGF5TmFtZSB3aWxsIGdldCBhZGRlZCB0byB0aGlzIG9iamVjdCBhcyB3ZWxsLlxyXG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwibnVtZXJpY1JhbmdlXCIsIHZhbEZuLCB7XHJcbiAgICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIHRoZSB2YWx1ZXMgb2YgJW1pbiUgYW5kICVtYXglXCIsXHJcbiAgICAgICAgICAgIG1pbjogY29udGV4dC5taW4sXHJcbiAgICAgICAgICAgIG1heDogY29udGV4dC5tYXhcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICAvLyBBc3N1bWUgdGhhdCBmcmVpZ2h0UHJvcGVydHkgaXMgYSBEYXRhRW50aXR5UHJvcGVydHkgdGhhdCBkZXNjcmliZXMgbnVtZXJpYyB2YWx1ZXMuXHJcbiAgICAvLyByZWdpc3RlciB0aGUgdmFsaWRhdG9yXHJcbiAgICBmcmVpZ2h0UHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKG51bWVyaWNSYW5nZVZhbGlkYXRvcih7IG1pbjogMTAwLCBtYXg6IDUwMCB9KSk7XHJcblxyXG5CcmVlemUgc3Vic3RpdHV0ZXMgY29udGV4dCB2YWx1ZXMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlIHRva2VucyBpbiB0aGUgbWVzc2FnZVRlbXBsYXRlIHdoZW4gcHJlcGFyaW5nIHRoZSBydW50aW1lIGVycm9yIG1lc3NhZ2U7XHJcbidkaXNwbGF5TmFtZScgaXMgYSBwcmUtZGVmaW5lZCBjb250ZXh0IGZ1bmN0aW9uIHRoYXQgaXMgYWx3YXlzIGF2YWlsYWJsZS5cclxuXHJcblBsZWFzZSBub3RlIHRoYXQgQnJlZXplIHN1YnN0aXR1dGVzIHRoZSBlbXB0eSBzdHJpbmcgZm9yIGZhbHNleSBwYXJhbWV0ZXJzLiBUaGF0IHVzdWFsbHkgd29ya3MgaW4geW91ciBmYXZvci5cclxuU29tZXRpbWVzIGl0IGRvZXNuJ3QgYXMgd2hlbiB0aGUgJ21pbicgdmFsdWUgaXMgemVybyBpbiB3aGljaCBjYXNlIHRoZSBtZXNzYWdlIHRleHQgd291bGQgaGF2ZSBhIGhvbGVcclxud2hlcmUgdGhlICdtaW4nIHZhbHVlIGdvZXMsIHNheWluZzogXCIuLi4gYW4gaW50ZWdlciBiZXR3ZWVuIHRoZSB2YWx1ZXMgb2YgYW5kIC4uLlwiLiBUaGF0IGlzIG5vdCB3aGF0IHlvdSB3YW50LlxyXG5cclxuVG8gYXZvaWQgdGhpcyBlZmZlY3QsIHlvdSBtYXkgY2FuIGJha2UgY2VydGFpbiBvZiB0aGUgY29udGV4dCB2YWx1ZXMgaW50byB0aGUgJ21lc3NhZ2VUZW1wbGF0ZScgaXRzZWxmXHJcbmFzIHNob3duIGluIHRoaXMgcmV2aXNpb24gdG8gdGhlIHBlcnRpbmVudCBwYXJ0IG9mIHRoZSBwcmV2aW91cyBleGFtcGxlOlxyXG5AZXhhbXBsZVxyXG4gICAgLy8gLi4uIGFzIGJlZm9yZVxyXG4gICAgLy8gLi4uIGJ1dCBiYWtlIHRoZSBtaW4vbWF4IHZhbHVlcyBpbnRvIHRoZSBtZXNzYWdlIHRlbXBsYXRlLlxyXG4gICAgdmFyIHRlbXBsYXRlID0gYnJlZXplLmNvcmUuZm9ybWF0U3RyaW5nKFxyXG4gICAgICAgIFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiB0aGUgdmFsdWVzIG9mICUxIGFuZCAlMlwiLFxyXG4gICAgICAgIGNvbnRleHQubWluLCBjb250ZXh0Lm1heCk7XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcIm51bWVyaWNSYW5nZVwiLCB2YWxGbiwge1xyXG4gICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogdGVtcGxhdGUsXHJcbiAgICAgICAgbWluOiBjb250ZXh0Lm1pbixcclxuICAgICAgICBtYXg6IGNvbnRleHQubWF4XHJcbiAgICB9KTtcclxuXHJcbkBtZXRob2QgPGN0b3I+IFZhbGlkYXRvclxyXG5AcGFyYW0gbmFtZSB7U3RyaW5nfSBUaGUgbmFtZSBvZiB0aGlzIHZhbGlkYXRvci5cclxuQHBhcmFtIHZhbGlkYXRvckZuIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0byBwZXJmb3JtIHZhbGlkYXRpb24uXHJcblxyXG52YWxpZGF0b3JGbih2YWx1ZSwgY29udGV4dClcclxuQHBhcmFtIHZhbGlkYXRvckZuLnZhbHVlIHtPYmplY3R9IFZhbHVlIHRvIGJlIHZhbGlkYXRlZFxyXG5AcGFyYW0gdmFsaWRhdG9yRm4uY29udGV4dCB7T2JqZWN0fSBUaGUgc2FtZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZiBub3Rcclxub3RoZXJ3aXNlIHNwZWNpZmllZC5cclxuQHBhcmFtIHZhbGlkYXRvckZuLmNvbnRleHQudmFsdWUge09iamVjdH0gVGhlIHZhbHVlIGJlaW5nIHZhbGlkYXRlZC5cclxuQHBhcmFtIHZhbGlkYXRvckZuLmNvbnRleHQubmFtZSB7U3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGJlaW5nIGV4ZWN1dGVkLlxyXG5AcGFyYW0gdmFsaWRhdG9yRm4uY29udGV4dC5kaXNwbGF5TmFtZSB7U3RyaW5nfSBUaGlzIHdpbGwgYmUgZWl0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkncyAnZGlzcGxheU5hbWUnIHByb3BlcnR5IG9yXHJcbnRoZSB2YWx1ZSBvZiBpdHMgJ25hbWUnIHByb3BlcnR5IG9yIHRoZSBzdHJpbmcgJ1ZhbHVlJ1xyXG5AcGFyYW0gdmFsaWRhdG9yRm4uY29udGV4dC5tZXNzYWdlVGVtcGxhdGUge1N0cmluZ30gVGhpcyB3aWxsIGVpdGhlciBiZSB0aGUgdmFsdWUgb2YgVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXNbIHt0aGlzIHZhbGlkYXRvcnMgbmFtZX1dIG9yIG51bGwuIFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzXHJcbmlzIGFuIG9iamVjdCB0aGF0IGlzIGtleWVkIGJ5IHZhbGlkYXRvciBuYW1lIGFuZCB0aGF0IGNhbiBiZSBhZGRlZCB0byBpbiBvcmRlciB0byAncmVnaXN0ZXInIHlvdXIgb3duIG1lc3NhZ2UgZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yLlxyXG5UaGUgZm9sbG93aW5nIHByb3BlcnR5IGNhbiBhbHNvIGJlIHNwZWNpZmllZCBmb3IgYW55IHZhbGlkYXRvciB0byBmb3JjZSBhIHNwZWNpZmljIGVycm9yTWVzc2FnZSBzdHJpbmdcclxuQHBhcmFtIFt2YWxpZGF0b3JGbi5jb250ZXh0Lm1lc3NhZ2VdIHtTdHJpbmd9IElmIHRoaXMgcHJvcGVydHkgaXMgc2V0IGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSAnbWVzc2FnZVRlbXBsYXRlJyBwcm9wZXJ0eSB3aGVuIGFuXHJcbmVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLlxyXG5cclxuQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBBIGZyZWUgZm9ybSBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyB3aWxsIG1hZGUgYXZhaWxhYmxlIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBhbmQgZXJyb3IgbWVzc2FnZSBjcmVhdGlvbiBwcm9jZXNzLlxyXG5UaGlzIG9iamVjdCB3aWxsIGJlIHBhc3NlZCBpbnRvIHRoZSBWYWxpZGF0b3IncyB2YWxpZGF0aW9uIGZ1bmN0aW9uIHdoZW5ldmVyICd2YWxpZGF0ZScgaXMgY2FsbGVkLiBTZWUgYWJvdmUgZm9yIGEgZGVzY3JpcHRpb25cclxub2YgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoaXMgb2JqZWN0IGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkLlxyXG5AZHluYW1pY1xyXG4qKi9cclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvciB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgXyR0eXBlTmFtZTogc3RyaW5nOyAvLyBvbiBwcm90b1xyXG5cclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdmFsRm46IFZhbGlkYXRpb25GbjtcclxuICBjb250ZXh0OiBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7XHJcbiAgY3VycmVudENvbnRleHQ6IFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDtcclxuICBwcml2YXRlIF9iYXNlQ29udGV4dDogVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0O1xyXG5cclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZhbEZuOiBWYWxpZGF0aW9uRm4sIGNvbnRleHQ/OiBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQpIHtcclxuICAgIC8vIF9iYXNlQ29udGV4dCBpcyB3aGF0IHdpbGwgZ2V0IHNlcmlhbGl6ZWRcclxuICAgIHRoaXMuX2Jhc2VDb250ZXh0ID0gY29udGV4dCB8fCB7fSBhcyBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7XHJcbiAgICB0aGlzLl9iYXNlQ29udGV4dC5uYW1lID0gbmFtZTtcclxuICAgIGNvbnRleHQgPSBjb3JlLmV4dGVuZChPYmplY3QuY3JlYXRlKHJvb3RDb250ZXh0KSwgdGhpcy5fYmFzZUNvbnRleHQpIGFzIFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDtcclxuICAgIGNvbnRleHQubWVzc2FnZVRlbXBsYXRlID0gY29udGV4dC5tZXNzYWdlVGVtcGxhdGUgfHwgVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXNbbmFtZV07XHJcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgdGhpcy52YWxGbiA9IHZhbEZuO1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFRoZSBuYW1lIG9mIHRoaXMgdmFsaWRhdG9yLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgbmFtZSB7U3RyaW5nfVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBUaGUgY29udGV4dCBmb3IgdGhpcyB2YWxpZGF0b3IuXHJcblxyXG4gIFRoaXMgb2JqZWN0IHdpbGwgdHlwaWNhbGx5IGNvbnRhaW4gYXQgYSBtaW5pbXVtIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcy4gXCJuYW1lXCIsIFwiZGlzcGxheU5hbWVcIiwgYW5kIFwibWVzc2FnZVwiIG9yIFwibWVzc2FnZVRlbXBsYXRlXCIuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IGNvbnRleHQge09iamVjdH1cclxuICAqKi9cclxuXHJcblxyXG4gIC8qKlxyXG4gIFJ1biB0aGlzIHZhbGlkYXRvciBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgdmFsdWUuICBUaGlzIG1ldGhvZCB3aWxsIHVzdWFsbHkgYmUgY2FsbGVkIGludGVybmFsbHkgZWl0aGVyXHJcbiAgYXV0b21hdGljYWxseSBieSBhbiBwcm9wZXJ0eSBjaGFuZ2UsIGVudGl0eSBhdHRhY2gsIHF1ZXJ5IG9yIHNhdmUgb3BlcmF0aW9uLCBvciBtYW51YWxseSBhcyBhIHJlc3VsdCBvZlxyXG4gIGEgdmFsaWRhdGVFbnRpdHkgY2FsbCBvbiB0aGUgRW50aXR5QXNwZWN0LiBUaGUgcmVzdWx0aW5nIFZhbGlkYXRpb25SZXN1bHRzIGFyZSBhdmFpbGFibGUgdmlhIHRoZVxyXG4gIEVudGl0eUFzcGVjdC5nZXRWYWxpZGF0aW9uRXJyb3JzIG1ldGhvZC5cclxuXHJcbiAgSG93ZXZlciwgeW91IGNhbiBhbHNvIGNhbGwgYSB2YWxpZGF0b3IgZGlyZWN0bHkgZWl0aGVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9yIHNvbWUgb3RoZXIgcmVhc29uIGlmIG5lZWRlZC5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyB1c2luZyBvbmUgb2YgdGhlIHByZWRlZmluZWQgdmFsaWRhdG9yc1xyXG4gICAgICB2YXIgdmFsaWRhdG9yID0gVmFsaWRhdG9yLm1heExlbmd0aCh7IG1heExlbmd0aDogNSwgZGlzcGxheU5hbWU6IFwiQ2l0eVwiIH0pO1xyXG4gICAgICAvLyBzaG91bGQgYmUgb2sgYmVjYXVzZSBcImFzZGZcIi5sZW5ndGggPCA1XHJcbiAgICAgIHZhciByZXN1bHQgPSB2YWxpZGF0b3IudmFsaWRhdGUoXCJhc2RmXCIpO1xyXG4gICAgICBvayhyZXN1bHQgPT09IG51bGwpO1xyXG4gICAgICByZXN1bHQgPSB2YWxpZGF0b3IudmFsaWRhdGUoXCJhZGFzZGZhc2RmXCIpO1xyXG4gICAgICAvLyBleHRyYWN0IGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ3Jlc3VsdCdcclxuICAgICAgdmFyIGVyck1zZyA9IHJlc3VsdC5lcnJvck1lc3NhZ2U7XHJcbiAgICAgIHZhciBjb250ZXh0ID0gcmVzdWx0LmNvbnRleHQ7XHJcbiAgICAgIHZhciBzYW1lVmFsaWRhdG9yID0gcmVzdWx0LnZhbGlkYXRvcjtcclxuICBAbWV0aG9kIHZhbGlkYXRlXHJcbiAgQHBhcmFtIHZhbHVlIHtPYmplY3R9IFZhbHVlIHRvIHZhbGlkYXRlXHJcbiAgQHBhcmFtIGFkZGl0aW9uYWxDb250ZXh0IHtPYmplY3R9IEFueSBhZGRpdGlvbmFsIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gdGhhdCB0aGUgVmFsaWRhdG9yXHJcbiAgY2FuIG1ha2UgdXNlIG9mLlxyXG4gIEByZXR1cm4ge1ZhbGlkYXRpb25FcnJvcnxudWxsfSBBIFZhbGlkYXRpb25FcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLCBudWxsIG90aGVyd2lzZVxyXG4gICoqL1xyXG4gIHZhbGlkYXRlKHZhbHVlOiBhbnksIGFkZGl0aW9uYWxDb250ZXh0PzogVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0KSB7XHJcbiAgICBsZXQgY3VycmVudENvbnRleHQ6IFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDsgLy8geyB2YWx1ZT86IE9iamVjdCB9O1xyXG4gICAgaWYgKGFkZGl0aW9uYWxDb250ZXh0KSB7XHJcbiAgICAgIGN1cnJlbnRDb250ZXh0ID0gY29yZS5leHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnRleHQpLCBhZGRpdGlvbmFsQ29udGV4dCkgYXMgVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3VycmVudENvbnRleHQgPSB0aGlzLmNvbnRleHQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHQ7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMudmFsRm4odmFsdWUsIGN1cnJlbnRDb250ZXh0KSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGN1cnJlbnRDb250ZXh0LnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IodGhpcywgY3VycmVudENvbnRleHQsIHRoaXMuZ2V0TWVzc2FnZSgpKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcih0aGlzLCBjdXJyZW50Q29udGV4dCwgXCJFeGNlcHRpb24gb2NjdXJlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyB2YWxpZGF0b3I6IFwiICsgdGhpcy5uYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLyBjb250ZXh0LnZhbHVlIGlzIG5vdCBhdmFpbCB1bmxlc3MgdmFsaWRhdGUgd2FzIGNhbGxlZCBmaXJzdC5cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlIG1vc3QgcmVjZW50IGV4ZWN1dGlvbiBvZiB0aGlzIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICB2YXIgdjAgPSBWYWxpZGF0b3IubWF4TGVuZ3RoKHsgbWF4TGVuZ3RoOiA1LCBkaXNwbGF5TmFtZTogXCJDaXR5XCIgfSk7XHJcbiAgICAgIHYwLnZhbGlkYXRlKFwiYWRhc2RmYXNkZlwiKTtcclxuICAgICAgdmFyIGVyck1lc3NhZ2UgPSB2MC5nZXRNZXNzYWdlKCkpO1xyXG4gIEBtZXRob2QgZ2V0TWVzc2FnZVxyXG4gIEByZXR1cm4ge1N0cmluZ31cclxuICAqKi9cclxuICBnZXRNZXNzYWdlKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLmN1cnJlbnRDb250ZXh0O1xyXG4gICAgICBsZXQgbWVzc2FnZSA9IGNvbnRleHQubWVzc2FnZTtcclxuICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodHlwZW9mIChtZXNzYWdlKSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICByZXR1cm4gbWVzc2FnZShjb250ZXh0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWVzc2FnZVRlbXBsYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRlbXBsYXRlKGNvbnRleHQubWVzc2FnZVRlbXBsYXRlLCBjb250ZXh0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gXCJpbnZhbGlkIHZhbHVlOiBcIiArICh0aGlzLm5hbWUgfHwgXCJ7dW5uYW1lZCB2YWxpZGF0b3J9XCIpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiBcIlVuYWJsZSB0byBmb3JtYXQgZXJyb3IgbWVzc2FnZVwiICsgZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9KU09OKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Jhc2VDb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhIHZhbGlkYXRvciBpbnN0YW5jZSBmcm9tIGEgSlNPTiBvYmplY3Qgb3IgYW4gYXJyYXkgb2YgaW5zdGFuY2VzIGZyb20gYW4gYXJyYXkgb2YgSlNPTiBvYmplY3RzLlxyXG4gIEBtZXRob2QgZnJvbUpTT05cclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIGpzb24ge09iamVjdH0gSlNPTiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzZXJpYWxpemVkIHZlcnNpb24gb2YgYSB2YWxpZGF0b3IuXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihqc29uOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikpIHtcclxuICAgICAgcmV0dXJuIGpzb24ubWFwKGZ1bmN0aW9uIChqcykge1xyXG4gICAgICAgIHJldHVybiBWYWxpZGF0b3IuZnJvbUpTT04oanMpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChqc29uIGluc3RhbmNlb2YgVmFsaWRhdG9yKSB7XHJcbiAgICAgIHJldHVybiBqc29uO1xyXG4gICAgfVxyXG4gICAgbGV0IHZhbGlkYXRvck5hbWUgPSBcIlZhbGlkYXRvci5cIiArIGpzb24ubmFtZTtcclxuICAgIGxldCBmbiA9IGNvbmZpZy5nZXRSZWdpc3RlcmVkRnVuY3Rpb24odmFsaWRhdG9yTmFtZSk7XHJcbiAgICBpZiAoIWZuKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBsb2NhdGUgYSB2YWxpZGF0b3IgbmFtZWQ6XCIgKyBqc29uLm5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZuKGpzb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmVnaXN0ZXIgYSB2YWxpZGF0b3IgaW5zdGFuY2Ugc28gdGhhdCBhbnkgZGVzZXJpYWxpemVkIG1ldGFkYXRhIGNhbiByZWZlcmVuY2UgaXQuXHJcbiAgQG1ldGhvZCByZWdpc3RlclxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gdmFsaWRhdG9yIHtWYWxpZGF0b3J9IFZhbGlkYXRvciB0byByZWdpc3Rlci5cclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyKHZhbGlkYXRvcjogVmFsaWRhdG9yKSB7XHJcbiAgICBjb25maWcucmVnaXN0ZXJGdW5jdGlvbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiB2YWxpZGF0b3I7XHJcbiAgICB9LCBcIlZhbGlkYXRvci5cIiArIHZhbGlkYXRvci5uYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJlZ2lzdGVyIGEgdmFsaWRhdG9yIGZhY3Rvcnkgc28gdGhhdCBhbnkgZGVzZXJpYWxpemVkIG1ldGFkYXRhIGNhbiByZWZlcmVuY2UgaXQuXHJcbiAgQG1ldGhvZCByZWdpc3RlckZhY3RvcnlcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIHZhbGlkYXRvckZhY3Rvcnkge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgb3B0aW9uYWxseSB0YWtlcyBhIGNvbnRleHQgcHJvcGVydHkgYW5kIHJldHVybnMgYSBWYWxpZGF0b3IgaW5zdGFuY2UuXHJcbiAgQHBhcmFtIG5hbWUge1N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvci5cclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5OiAob3B0aW9ucz86IGFueSkgPT4gVmFsaWRhdG9yLCBuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbmZpZy5yZWdpc3RlckZ1bmN0aW9uKHZhbGlkYXRvckZhY3RvcnksIFwiVmFsaWRhdG9yLlwiICsgbmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBNYXAgb2Ygc3RhbmRhcmQgZXJyb3IgbWVzc2FnZSB0ZW1wbGF0ZXMga2V5ZWQgYnkgdmFsaWRhdG9yIG5hbWUuXHJcbiAgWW91IGNhbiBhZGQgdG8gb3IgbW9kaWZ5IHRoaXMgb2JqZWN0IHRvIGN1c3RvbWl6ZSB0aGUgdGVtcGxhdGUgdXNlZCBmb3IgYW55IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZS5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyB2IGlzIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCwgaW4gdGhpcyBjYXNlIGEgXCJjb3VudHJ5XCIgc3RyaW5nLlxyXG4gICAgICB2YXIgdmFsRm4gPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICByZXR1cm4gKGNvcmUuc3RyaW5nU3RhcnRzV2l0aCh2LCBcIlVTXCIpKTtcclxuICAgICAgfTtcclxuICAgICAgdmFyIGNvdW50cnlWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKFwiY291bnRyeUlzVVNcIiwgdmFsRm4sIHsgZGlzcGxheU5hbWU6IFwiQ291bnRyeVwiIH0pO1xyXG4gICAgICBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlcy5jb3VudHJ5SXNVUyA9IFwiJyVkaXNwbGF5TmFtZSUnIG11c3Qgc3RhcnQgd2l0aCAnVVMnXCI7XHJcbiAgICAgIC8vIFRoaXMgd2lsbCBoYXZlIGEgc2ltaWxhciBlZmZlY3QgdG8gdGhpc1xyXG4gICAgICB2YXIgY291bnRyeVZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoXCJjb3VudHJ5SXNVU1wiLCB2YWxGbiwge1xyXG4gICAgICAgICAgZGlzcGxheU5hbWU6IFwiQ291bnRyeVwiLCBcclxuICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBzdGFydCB3aXRoICdVUydcIiBcclxuICAgICAgfSk7XHJcbiAgQHByb3BlcnR5IG1lc3NhZ2VUZW1wbGF0ZXMge09iamVjdH1cclxuICBAc3RhdGljXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBtZXNzYWdlVGVtcGxhdGVzID0ge1xyXG4gICAgYm9vbDogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhICd0cnVlJyBvciAnZmFsc2UnIHZhbHVlXCIsXHJcbiAgICBjcmVkaXRDYXJkOiBcIlRoZSAlZGlzcGxheU5hbWUlIGlzIG5vdCBhIHZhbGlkIGNyZWRpdCBjYXJkIG51bWJlclwiLFxyXG4gICAgZGF0ZTogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIGRhdGVcIixcclxuICAgIGR1cmF0aW9uOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgSVNPODYwMSBkdXJhdGlvbiBzdHJpbmcsIHN1Y2ggYXMgJ1AzSDI0TTYwUydcIixcclxuICAgIGVtYWlsQWRkcmVzczogXCJUaGUgJWRpc3BsYXlOYW1lJSAnJXZhbHVlJScgaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiLFxyXG4gICAgZ3VpZDogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIEdVSURcIixcclxuICAgIGludGVnZXI6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYW4gaW50ZWdlclwiLFxyXG4gICAgaW50ZWdlclJhbmdlOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiB0aGUgdmFsdWVzIG9mICVtaW5WYWx1ZSUgYW5kICVtYXhWYWx1ZSVcIixcclxuICAgIG1heExlbmd0aDogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIHN0cmluZyB3aXRoICVtYXhMZW5ndGglIGNoYXJhY3RlcnMgb3IgbGVzc1wiLFxyXG4gICAgbnVtYmVyOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgbnVtYmVyXCIsXHJcbiAgICBwaG9uZTogXCJUaGUgJWRpc3BsYXlOYW1lJSAnJXZhbHVlJScgaXMgbm90IGEgdmFsaWQgcGhvbmUgbnVtYmVyXCIsXHJcbiAgICByZWd1bGFyRXhwcmVzc2lvbjogXCJUaGUgJWRpc3BsYXlOYW1lJSAnJXZhbHVlJScgZG9lcyBub3QgbWF0Y2ggJyVleHByZXNzaW9uJSdcIixcclxuICAgIHJlcXVpcmVkOiBcIiclZGlzcGxheU5hbWUlJyBpcyByZXF1aXJlZFwiLFxyXG4gICAgc3RyaW5nOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgc3RyaW5nXCIsXHJcbiAgICBzdHJpbmdMZW5ndGg6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBzdHJpbmcgd2l0aCBiZXR3ZWVuICVtaW5MZW5ndGglIGFuZCAlbWF4TGVuZ3RoJSBjaGFyYWN0ZXJzXCIsXHJcbiAgICB1cmw6IFwiVGhlICVkaXNwbGF5TmFtZSUgJyV2YWx1ZSUnIGlzIG5vdCBhIHZhbGlkIHVybFwiXHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkICdyZXF1aXJlZCB2YWx1ZScgVmFsaWRhdG9yXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHJlZ2lvblByb3BlcnR5IC0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJSZWdpb25cIik7XHJcbiAgICAgIC8vIE1ha2VzIFwiUmVnaW9uXCIgb24gQ3VzdG9tZXIgYSByZXF1aXJlZCBwcm9wZXJ0eS5cclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5yZXF1aXJlZCgpKTtcclxuICAgICAgLy8gb3IgdG8gYWxsb3cgZW1wdHkgc3RyaW5nc1xyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnJlcXVpcmVkKHsgYWxsb3dFbXB0eVN0cmluZ3M6IHRydWUgfSk7KTtcclxuICBAbWV0aG9kIHJlcXVpcmVkXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBjb250ZXh0IHtPYmplY3R9XHJcbiAgQHBhcmFtIFtjb250ZXh0LmFsbG93RW1wdHlTdHJpbmdzXSB7Qm9vbGVhbn0gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCBvciBmYWxzZSB0aGVuIGVtcHR5IHN0cmluZ3MgZG8gTk9UIHBhc3MgdmFsaWRhdGlvbi5cclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVxdWlyZWQgPSBmdW5jdGlvbihjb250ZXh0PzogYW55KSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBpZiAoY3R4ICYmIGN0eC5hbGxvd0VtcHR5U3RyaW5ncykgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHYubGVuZ3RoID4gMDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdiAhPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJyZXF1aXJlZFwiLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIG1heGltdW0gc3RyaW5nIGxlbmd0aCBWYWxpZGF0b3I7IHRoZSBtYXhpbXVtIGxlbmd0aCBtdXN0IGJlIHNwZWNpZmllZFxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciByZWdpb25Qcm9wZXJ0eSAtIGN1c3RUeXBlLmdldFByb3BlcnR5KFwiUmVnaW9uXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFJlZ2lvbiBwcm9wZXJ0eSBvbiBDdXN0b21lciB3aWxsIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA1IGNoYXJhY3RlcnMuXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IubWF4TGVuZ3RoKCB7bWF4TGVuZ3RoOiA1fSkpO1xyXG4gIEBtZXRob2QgbWF4TGVuZ3RoXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBjb250ZXh0IHtPYmplY3R9XHJcbiAgQHBhcmFtIGNvbnRleHQubWF4TGVuZ3RoIHtJbnRlZ2VyfVxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBtYXhMZW5ndGggPSBmdW5jdGlvbihjb250ZXh0OiBhbnkpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mICh2KSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICByZXR1cm4gdi5sZW5ndGggPD0gY3R4Lm1heExlbmd0aDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcIm1heExlbmd0aFwiLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIHN0cmluZyBsZW5ndGggVmFsaWRhdG9yOyBib3RoIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RocyBtdXN0IGJlIHNwZWNpZmllZC5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgcmVnaW9uUHJvcGVydHkgLSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIlJlZ2lvblwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBSZWdpb24gcHJvcGVydHkgb24gQ3VzdG9tZXIgd2lsbCBiZVxyXG4gICAgICAvLyBiZXR3ZWVuIDIgYW5kIDUgY2hhcmFjdGVyc1xyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnN0cmluZ0xlbmd0aCgge21pbkxlbmd0aDogMiwgbWF4TGVuZ3RoOiA1fSk7XHJcbiAgQG1ldGhvZCBzdHJpbmdMZW5ndGhcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIGNvbnRleHQge09iamVjdH1cclxuICBAcGFyYW0gY29udGV4dC5tYXhMZW5ndGgge0ludGVnZXJ9XHJcbiAgQHBhcmFtIGNvbnRleHQubWluTGVuZ3RoIHtJbnRlZ2VyfVxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBzdHJpbmdMZW5ndGggPSBmdW5jdGlvbiAoY29udGV4dDogYW55KSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiAodikgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKGN0eC5taW5MZW5ndGggIT0gbnVsbCAmJiB2Lmxlbmd0aCA8IGN0eC5taW5MZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKGN0eC5tYXhMZW5ndGggIT0gbnVsbCAmJiB2Lmxlbmd0aCA+IGN0eC5tYXhMZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJzdHJpbmdMZW5ndGhcIiwgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBzdHJpbmcgZGF0YVR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciByZWdpb25Qcm9wZXJ0eSAtIGN1c3RUeXBlLmdldFByb3BlcnR5KFwiUmVnaW9uXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFJlZ2lvbiBwcm9wZXJ0eSBvbiBDdXN0b21lciBpcyBhIHN0cmluZy5cclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5zdHJpbmcoKSk7XHJcbiAgQG1ldGhvZCBzdHJpbmdcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHN0cmluZyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIHJldHVybiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwic3RyaW5nXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgR3VpZCBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciBjdXN0b21lcklkUHJvcGVydHkgLSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIkN1c3RvbWVySURcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgQ3VzdG9tZXJJRCBwcm9wZXJ0eSBvbiBDdXN0b21lciBpcyBhIEd1aWQuXHJcbiAgICAgIGN1c3RvbWVySWRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmd1aWQoKSk7XHJcbiAgQG1ldGhvZCBndWlkXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBndWlkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgcmV0dXJuIGNvcmUuaXNHdWlkKHYpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwiZ3VpZFwiLCB2YWxGbik7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIElTTyA4NjAxIGR1cmF0aW9uIHN0cmluZyAgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgZXZlbnRUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkV2ZW50XCIpO1xyXG4gICAgICB2YXIgZWxhcHNlZFRpbWVQcm9wZXJ0eSAtIGV2ZW50VHlwZS5nZXRQcm9wZXJ0eShcIkVsYXBzZWRUaW1lXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIEVsYXBzZWRUaW1lIHByb3BlcnR5IG9uIEN1c3RvbWVyIGlzIGEgZHVyYXRpb24uXHJcbiAgICAgIGVsYXBzZWRUaW1lUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5kdXJhdGlvbigpKTtcclxuICBAbWV0aG9kIGR1cmF0aW9uXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBkdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIHJldHVybiBjb3JlLmlzRHVyYXRpb24odik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJkdXJhdGlvblwiLCB2YWxGbik7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIG51bWVyaWMgZGF0YSB0eXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIGZyZWlnaHRQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIkZyZWlnaHRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRnJlaWdodCBwcm9wZXJ0eSBvbiBPcmRlciBpcyBhIG51bWJlci5cclxuICAgICAgZnJlaWdodFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IubnVtYmVyKCkpO1xyXG4gIEBtZXRob2QgbnVtYmVyXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcblxyXG4gICAgLy8gVE9ETzogbWF5IG5lZWQgdG8gaGF2ZSBzZXBlcmF0ZSBsb2dpYyBmb3Igc2luZ2xlLlxyXG4gIHB1YmxpYyBzdGF0aWMgbnVtYmVyID0gZnVuY3Rpb24oY29udGV4dD86IGFueSkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiBjdHggJiYgY3R4LmFsbG93U3RyaW5nKSB7XHJcbiAgICAgICAgdiA9IHBhcnNlRmxvYXQodik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIiAmJiAhaXNOYU4odikpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwibnVtYmVyXCIsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG4gIHB1YmxpYyBzdGF0aWMgZG91YmxlID0gVmFsaWRhdG9yLm51bWJlcjtcclxuICBwdWJsaWMgc3RhdGljIHNpbmdsZSA9IFZhbGlkYXRvci5udW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBsYXJnZSBpbnRlZ2VyIGRhdGEgdHlwZSAtIDY0IGJpdCAtIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIGZyZWlnaHRQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIkZyZWlnaHRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRnJlaWdodCBwcm9wZXJ0eSBvbiBPcmRlciBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIGEgNjQgYml0IGludGVnZXIuXHJcbiAgICAgIGZyZWlnaHRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmludDY0KCkpO1xyXG4gIEBtZXRob2QgaW50NjRcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGludGVnZXIgPSBmdW5jdGlvbihjb250ZXh0OiBhbnkpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIgJiYgY3R4ICYmIGN0eC5hbGxvd1N0cmluZykge1xyXG4gICAgICAgIHYgPSBwYXJzZUludCh2LCAxMCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikgJiYgKCFpc05hTih2KSkgJiYgTWF0aC5mbG9vcih2KSA9PT0gdjtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcImludGVnZXJcIiwgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcbiAgcHVibGljIHN0YXRpYyBpbnQ2NCA9IFZhbGlkYXRvci5pbnRlZ2VyO1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgMzIgYml0IGludGVnZXIgZGF0YSB0eXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIGZyZWlnaHRQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIkZyZWlnaHRcIik7XHJcbiAgICAgIGZyZWlnaHRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmludDMyKCkpO1xyXG4gIEBtZXRob2QgaW50MzJcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGludDMyID0gZnVuY3Rpb24oY29udGV4dDogYW55KSB7XHJcbiAgICByZXR1cm4gaW50UmFuZ2VWYWxpZGF0b3JDdG9yKFwiaW50MzJcIiwgSU5UMzJfTUlOLCBJTlQzMl9NQVgsIGNvbnRleHQpKCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIDE2IGJpdCBpbnRlZ2VyIGRhdGEgdHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgICAgIHZhciBmcmVpZ2h0UHJvcGVydHkgLSBvcmRlclR5cGUuZ2V0UHJvcGVydHkoXCJGcmVpZ2h0XCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIEZyZWlnaHQgcHJvcGVydHkgb24gT3JkZXIgaXMgd2l0aGluIHRoZSByYW5nZSBvZiBhIDE2IGJpdCBpbnRlZ2VyLlxyXG4gICAgICBmcmVpZ2h0UHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5pbnQxNigpKTtcclxuICBAbWV0aG9kIGludDE2XHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBpbnQxNiA9IGZ1bmN0aW9uKGNvbnRleHQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGludFJhbmdlVmFsaWRhdG9yQ3RvcihcImludDE2XCIsIElOVDE2X01JTiwgSU5UMTZfTUFYLCBjb250ZXh0KSgpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBieXRlIGRhdGEgdHlwZSBWYWxpZGF0b3IuIChUaGlzIGlzIGEgaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NSBpbmNsdXNpdmUgZm9yIGpzIHB1cnBvc2VzKS5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIGZyZWlnaHRQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIkZyZWlnaHRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRnJlaWdodCBwcm9wZXJ0eSBvbiBPcmRlciBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIGEgMTYgYml0IGludGVnZXIuXHJcbiAgICAgIC8vIFByb2JhYmx5IG5vdCBhIHZlcnkgZ29vZCB2YWxpZGF0aW9uIHRvIHBsYWNlIG9uIHRoZSBGcmVpZ2h0IHByb3BlcnR5LlxyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmJ5dGUoKSk7XHJcbiAgQG1ldGhvZCBieXRlXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBieXRlID0gZnVuY3Rpb24oY29udGV4dDogYW55KSB7XHJcbiAgICByZXR1cm4gaW50UmFuZ2VWYWxpZGF0b3JDdG9yKFwiYnl0ZVwiLCBCWVRFX01JTiwgQllURV9NQVgsIGNvbnRleHQpKCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIGJvb2xlYW4gZGF0YSB0eXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIHByb2R1Y3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIlByb2R1Y3RcIik7XHJcbiAgICAgIHZhciBkaXNjb250aW51ZWRQcm9wZXJ0eSAtIHByb2R1Y3RUeXBlLmdldFByb3BlcnR5KFwiRGlzY29udGludWVkXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIERpc2NvbnRpbnVlZCBwcm9wZXJ0eSBvbiBQcm9kdWN0IGlzIGEgYm9vbGVhblxyXG4gICAgICBkaXNjb250aW51ZWRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmJvb2woKSk7XHJcbiAgQG1ldGhvZCBib29sXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBib29sID0gZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICByZXR1cm4gKHYgPT09IHRydWUpIHx8ICh2ID09PSBmYWxzZSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJib29sXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc3RhdGljIG5vbmUgPSBmdW5jdGlvbigpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJub25lXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgZGF0ZSBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgb3JkZXJEYXRlUHJvcGVydHkgLSBvcmRlclR5cGUuZ2V0UHJvcGVydHkoXCJPcmRlckRhdGVcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgT3JkZXJEYXRlIHByb3BlcnR5IG9uIE9yZGVyIGlzIGEgZGF0ZVxyXG4gICAgICAvLyBQcm9iYWJseSBub3QgYSB2ZXJ5IGdvb2QgdmFsaWRhdGlvbiB0byBwbGFjZSBvbiB0aGUgRnJlaWdodCBwcm9wZXJ0eS5cclxuICAgICAgb3JkZXJEYXRlUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5kYXRlKCkpO1xyXG4gIEBtZXRob2QgZGF0ZVxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHJldHVybiAhaXNOYU4oRGF0ZS5wYXJzZSh2KSk7XHJcbiAgICAgICAgICAvLyBvbGQgY29kZVxyXG4gICAgICAgICAgLy8gcmV0dXJuIF9faXNEYXRlKG5ldyBEYXRlKHYpKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBjb3JlLmlzRGF0ZSh2KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwiZGF0ZVwiLCB2YWxGbik7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIGNyZWRpdCBjYXJkIG51bWJlciB2YWxpZGF0b3JcclxuICBQZXJmb3JtcyBhIGx1aG4gYWxnb3JpdGhtIGNoZWNrc3VtIHRlc3QgZm9yIHBsYXVzYWJpbGl0eVxyXG4gIGNhdGNoZXMgc2ltcGxlIG1pc3Rha2VzOyBvbmx5IHNlcnZpY2Uga25vd3MgZm9yIHN1cmVcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0gaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgcGVyc29uVHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIlBlcnNvblwiKTtcclxuICAgICAgdmFyIGNyZWRpdENhcmRQcm9wZXJ0eSA9IHBlcnNvblR5cGUuZ2V0UHJvcGVydHkoXCJjcmVkaXRDYXJkXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFBlcnNvbi5jcmVkaXRDYXJkIHByb3BlcnR5IGlzIGNyZWRpdCBjYXJkLlxyXG4gICAgICBjcmVkaXRDYXJkUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5jcmVkaXRDYXJkKCkpO1xyXG4gIEBtZXRob2QgY3JlZGl0Q2FyZFxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0aHJvdWdoIHRvIHZhbGlkYXRpb24gY29uc3RydWN0b3JcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgY3JlZGl0Q2FyZCA9IGZ1bmN0aW9uKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIGZ1bmN0aW9uIHZhbEZuKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiAodikgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHYgPSB2LnJlcGxhY2UoLyhcXC18XFxzKS9nLCBcIlwiKTsgLy8gcmVtb3ZlIGRhc2hlcyBhbmQgc3BhY2VzXHJcbiAgICAgIGlmICghdiB8fCAvXFxELy50ZXN0KHYpKSByZXR1cm4gZmFsc2U7IC8vIGFsbCBkaWdpdHMsIG5vdCBlbXB0eVxyXG4gICAgICByZXR1cm4gbHVobih2KTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKCdjcmVkaXRDYXJkJywgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRvcjsgdGhlIGV4cHJlc3Npb24gbXVzdCBiZSBzcGVjaWZpZWRcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBZGQgdmFsaWRhdG9yIHRvIGEgcHJvcGVydHkuIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0b21lclR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHJlZ2lvblByb3BlcnR5ID0gY3VzdG9tZXJUeXBlLmdldFByb3BlcnR5KFwiUmVnaW9uXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgQ3VzdG9tZXIuUmVnaW9uIGlzIDIgY2hhciB1cHBlcmNhc2UgYWxwaGEuXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IucmVndWxhckV4cHJlc3Npb24oIHtleHByZXNzaW9uOiAnXltBLVpdezJ9JCd9ICk7XHJcbiAgQG1ldGhvZCByZWd1bGFyRXhwcmVzc2lvblxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gY29udGV4dCB7T2JqZWN0fVxyXG4gIEBwYXJhbSBjb250ZXh0LmV4cHJlc3Npb24ge1N0cmluZ30gU3RyaW5nIGZvcm0gb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhcHBseVxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyByZWd1bGFyRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIGZ1bmN0aW9uIHZhbEZuKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgLy8gZG8gbm90IGludmFsaWRhdGUgaWYgZW1wdHk7IHVzZSBhIHNlcGFyYXRlIHJlcXVpcmVkIHRlc3RcclxuICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSAnJykgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgKHYpICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCByZSA9IG5ldyBSZWdFeHAoY3R4LmV4cHJlc3Npb24pO1xyXG4gICAgICAgIHJldHVybiByZS50ZXN0KHYpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgZXhwcmVzc2lvbiBwYXJhbWV0ZXIgdG8gcmVnRXhwIHZhbGlkYXRvcicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcigncmVndWxhckV4cHJlc3Npb24nLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgZW1haWwgYWRkcmVzcyB2YWxpZGF0b3JcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0gaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgcGVyc29uVHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIlBlcnNvblwiKTtcclxuICAgICAgdmFyIGVtYWlsUHJvcGVydHkgPSBwZXJzb25UeXBlLmdldFByb3BlcnR5KFwiZW1haWxcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgUGVyc29uLmVtYWlsIHByb3BlcnR5IGlzIGFuIGVtYWlsIGFkZHJlc3MuXHJcbiAgICAgIGVtYWlsUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5lbWFpbEFkZHJlc3MoKSk7XHJcbiAgQG1ldGhvZCBlbWFpbEFkZHJlc3NcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdGhyb3VnaCB0byB2YWxpZGF0aW9uIGNvbnN0cnVjdG9yXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGVtYWlsQWRkcmVzcyA9IGZ1bmN0aW9uKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc3JraXJrbGFuZC9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL2Jsb2IvbWFzdGVyL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvRW1haWxBdHRyaWJ1dGUuY3NcclxuICAgIGxldCByZUVtYWlsQWRkcmVzcyA9IC9eKCgoW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKyhcXC4oW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKykqKXwoKFxceDIyKSgoKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KChbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHg3Zl18XFx4MjF8W1xceDIzLVxceDViXXxbXFx4NWQtXFx4N2VdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoXFxcXChbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGQtXFx4N2ZdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpKSooKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KFxceDIyKSkpQCgoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKVxcLj8kL2k7XHJcbiAgICByZXR1cm4gbWFrZVJlZ0V4cFZhbGlkYXRvcignZW1haWxBZGRyZXNzJywgcmVFbWFpbEFkZHJlc3MsIG51bGwsIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIHBob25lIHZhbGlkYXRvclxyXG4gIFByb3ZpZGVzIGJhc2ljIGFzc2VydGlvbnMgb24gdGhlIGZvcm1hdCBhbmQgd2lsbCBoZWxwIHRvIGVsaW1pbmF0ZSBtb3N0IG5vbnNlbnNlIGlucHV0XHJcbiAgTWF0Y2hlczpcclxuICBJbnRlcm5hdGlvbmFsIGRpYWxpbmcgcHJlZml4OiB7e30sICssIDAsIDAwMDB9ICh3aXRoIG9yIHdpdGhvdXQgYSB0cmFpbGluZyBicmVhayBjaGFyYWN0ZXIsIGlmIG5vdCAnKyc6IFstLy4gXSlcclxuICA+ICgoXFwrKXwoMChcXGQrKT9bLS8uXFxzXSkpXHJcbiAgQ291bnRyeSBjb2RlOiB7e30sIDEsIC4uLiwgOTk5fSAod2l0aCBvciB3aXRob3V0IGEgdHJhaWxpbmcgYnJlYWsgY2hhcmFjdGVyOiBbLS8uIF0pXHJcbiAgPiBbMS05XVxcZHssMn1bLS8uXFxzXT9cclxuICBBcmVhIGNvZGU6IHsoMCksIC4uLiwgKDAwMDAwMCksIDAsIC4uLiwgMDAwMDAwfSAod2l0aCBvciB3aXRob3V0IGEgdHJhaWxpbmcgYnJlYWsgY2hhcmFjdGVyOiBbLS8uIF0pXHJcbiAgPiAoKFxcKFxcZHsxLDZ9XFwpfFxcZHsxLDZ9KVstLy5cXHNdPyk/XHJcbiAgTG9jYWw6IHswLCAuLi59KyAod2l0aCBvciB3aXRob3V0IGEgdHJhaWxpbmcgYnJlYWsgY2hhcmFjdGVyOiBbLS8uIF0pXHJcbiAgPiAoXFxkK1stLy5cXHNdPykrXFxkK1xyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0b21lclR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHBob25lUHJvcGVydHkgPSBjdXN0b21lclR5cGUuZ2V0UHJvcGVydHkoXCJwaG9uZVwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBDdXN0b21lci5waG9uZSBwcm9wZXJ0eSBpcyBwaG9uZS5cclxuICAgICAgcGhvbmVQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnBob25lKCkpO1xyXG4gIEBtZXRob2QgcGhvbmVcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdGhyb3VnaCB0byB2YWxpZGF0aW9uIGNvbnN0cnVjdG9yXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHBob25lID0gZnVuY3Rpb24gKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc3JraXJrbGFuZC9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL2Jsb2IvbWFzdGVyL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvRXhwcmVzc2lvbnMuY3NcclxuICAgIGxldCByZVBob25lID0gL14oKFxcK3woMChcXGQrKT9bLS8uXFxzXT8pKVsxLTldXFxkezAsMn1bLS8uXFxzXT8pPygoXFwoXFxkezEsNn1cXCl8XFxkezEsNn0pWy0vLlxcc10/KT8oXFxkK1stLy5cXHNdPykrXFxkKyQvO1xyXG4gICAgcmV0dXJuIG1ha2VSZWdFeHBWYWxpZGF0b3IoJ3Bob25lJywgcmVQaG9uZSwgbnVsbCwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgVVJMIChwcm90b2NvbCByZXF1aXJlZCkgdmFsaWRhdG9yXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIHBlcnNvblR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJQZXJzb25cIik7XHJcbiAgICAgIHZhciB3ZWJzaXRlUHJvcGVydHkgPSBwZXJzb25UeXBlLmdldFByb3BlcnR5KFwid2Vic2l0ZVwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBQZXJzb24ud2Vic2l0ZSBwcm9wZXJ0eSBpcyBhIFVSTC5cclxuICAgICAgd2Vic2l0ZVByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IudXJsKCkpO1xyXG4gIEBtZXRob2QgdXJsXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBbY29udGV4dF0ge09iamVjdH0gb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRocm91Z2ggdG8gdmFsaWRhdGlvbiBjb25zdHJ1Y3RvclxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyB1cmwgPSBmdW5jdGlvbiAoY29udGV4dD86IGFueSkge1xyXG4gICAgLy9TZWUgaHR0cHM6Ly9naXRodWIuY29tL3Nya2lya2xhbmQvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9ibG9iL21hc3Rlci9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL1VybEF0dHJpYnV0ZS5jc1xyXG4gICAgbGV0IHJlVXJsUHJvdG9jb2xSZXF1aXJlZCA9IC9eKGh0dHBzP3xmdHApOlxcL1xcLygoKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZBLUZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6KSpAKT8oKChcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSlcXC4oXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pXFwuKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKVxcLihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSkpfChbYS16QS1aXVtcXC1hLXpBLVowLTldKil8KCgoW2EtekEtWl18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpBLVpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkqKFthLXpBLVpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKVxcLikrKChbYS16QS1aXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16QS1aXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkqKFthLXpBLVpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuPykoOlxcZCopPykoXFwvKCgoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mQS1GXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OnxAKSsoXFwvKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZBLUZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6fEApKikqKT8pPyhcXD8oKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZBLUZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6fEApfFtcXHVFMDAwLVxcdUY4RkZdfFxcL3xcXD8pKik/KFxcIygoKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZkEtRl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDp8QCl8XFwvfFxcPykqKT8kLztcclxuICAgIHJldHVybiBtYWtlUmVnRXhwVmFsaWRhdG9yKCd1cmwnLCByZVVybFByb3RvY29sUmVxdWlyZWQsIG51bGwsIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIENyZWF0ZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdG9yIHdpdGggYSBmaXhlZCBleHByZXNzaW9uLlxyXG4gIE1hbnkgb2YgdGhlIHN0b2NrIHZhbGlkYXRvcnMgYXJlIGJ1aWx0IHdpdGggdGhpcyBmYWN0b3J5IG1ldGhvZC5cclxuICBUaGVpciBleHByZXNzaW9ucyBhcmUgb2Z0ZW4gZGVyaXZlZCBmcm9tXHJcbiAgaHR0cHM6Ly9naXRodWIuY29tL3Nya2lya2xhbmQvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9ibG9iL21hc3Rlci9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zXHJcbiAgWW91IGNhbiB0cnkgbWFueSBvZiB0aGVtIGF0IGh0dHA6Ly9kYXRhYW5ub3RhdGlvbnNleHRlbnNpb25zLm9yZy9cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBNYWtlIGEgemlwY29kZSB2YWxpZGF0b3JcclxuICAgICAgZnVuY3Rpb24gemlwVmFsaWRhdG9yID0gVmFsaWRhdG9yLm1ha2VSZWdFeHBWYWxpZGF0b3IoXHJcbiAgICAgIFwiemlwVmFsLFxyXG4gICAgICAvXlxcZHs1fShbXFwtXVxcZHs0fSk/JC8sXHJcbiAgICAgIFwiVGhlICVkaXNwbGF5TmFtZSUgJyV2YWx1ZSUnIGlzIG5vdCBhIHZhbGlkIFUuUy4gemlwY29kZVwiKTtcclxuICAgICAgLy8gUmVnaXN0ZXIgaXQuXHJcbiAgICAgIFZhbGlkYXRvci5yZWdpc3Rlcih6aXBWYWxpZGF0b3IpO1xyXG4gICAgICAvLyBBZGQgaXQgdG8gYSBkYXRhIHByb3BlcnR5LiBBc3N1bWUgZW0gaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHppcFByb3BlcnR5ID0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJQb3N0YWxDb2RlXCIpO1xyXG4gICAgICB6aXBQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goemlwVmFsaWRhdG9yKTtcclxuICBAbWV0aG9kIG1ha2VSZWdFeHBWYWxpZGF0b3JcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIHZhbGlkYXRvck5hbWUge1N0cmluZ30gbmFtZSBvZiB0aGlzIHZhbGlkYXRvclxyXG4gIEBwYXJhbSBleHByZXNzaW9uIHtTdHJpbmcgfCBSZWdFeHB9IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhcHBseVxyXG4gIEBwYXJhbSBbZGVmYXVsdE1lc3NhZ2VdIHtTdHJpbmd9IGRlZmF1bHQgbWVzc2FnZSBmb3IgZmFpbGVkIHZhbGlkYXRpb25zXHJcbiAgQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdGhyb3VnaCB0byB2YWxpZGF0aW9uIGNvbnN0cnVjdG9yXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIG1ha2VSZWdFeHBWYWxpZGF0b3IgPSBtYWtlUmVnRXhwVmFsaWRhdG9yO1xyXG5cclxufVxyXG5WYWxpZGF0b3IucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIlZhbGlkYXRvclwiO1xyXG5cclxuLy8gcmVnaXN0ZXIgYWxsIHZhbGlkYXRvcnNcclxuRXJyb3JbJ3gnXSA9IGNvcmUub2JqZWN0Rm9yRWFjaChWYWxpZGF0b3IsIGZ1bmN0aW9uIChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gIGlmICh0eXBlb2YgKHZhbHVlKSAhPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGlmIChrZXkgPT09IFwiZnJvbUpTT05cIiB8fCBrZXkgPT09IFwicmVnaXN0ZXJcIiB8fFxyXG4gICAgICBrZXkgPT09IFwicmVnaXN0ZXJGYWN0b3J5XCIgfHwga2V5ID09PSBcIm1ha2VSZWdFeHBWYWxpZGF0b3JcIikge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uZmlnLnJlZ2lzdGVyRnVuY3Rpb24odmFsdWUsIFwiVmFsaWRhdG9yLlwiICsga2V5KTtcclxufSk7XHJcblxyXG5mdW5jdGlvbiBmb3JtYXRUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCB2YXJzOiBPYmplY3QsIG93blByb3BlcnRpZXNPbmx5OiBib29sZWFuID0gZmFsc2UpIHtcclxuICBpZiAoIXZhcnMpIHJldHVybiB0ZW1wbGF0ZTtcclxuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvJShbXiVdKyklL2csIGZ1bmN0aW9uIChfLCBrZXkpIHtcclxuICAgIGxldCB2YWxPckZuOiBhbnk7XHJcbiAgICBpZiAob3duUHJvcGVydGllc09ubHkpIHtcclxuICAgICAgdmFsT3JGbiA9IHZhcnMuaGFzT3duUHJvcGVydHkoa2V5KSA/IHZhcnNba2V5XSA6ICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsT3JGbiA9IHZhcnNba2V5XTtcclxuICAgIH1cclxuICAgIGlmICh2YWxPckZuICE9IG51bGwpIHtcclxuICAgICAgaWYgKGNvcmUuaXNGdW5jdGlvbih2YWxPckZuKSkge1xyXG4gICAgICAgIHJldHVybiB2YWxPckZuKHZhcnMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB2YWxPckZuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaW50UmFuZ2VWYWxpZGF0b3JDdG9yKHZhbGlkYXRvck5hbWU6IHN0cmluZywgbWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlciwgY29udGV4dDogYW55KSB7XHJcbiAgY29udGV4dCA9IGNvbnRleHQgfHwge307XHJcbiAgaWYgKG1pblZhbHVlICE9PSB1bmRlZmluZWQpIHsgY29udGV4dC5taW4gPSBtaW5WYWx1ZTsgfVxyXG4gIGlmIChtYXhWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7IGNvbnRleHQubWF4ID0gbWF4VmFsdWU7IH1cclxuICBsZXQgdGVtcGxhdGVFeGlzdHMgPSBjb250ZXh0Lm1lc3NhZ2VUZW1wbGF0ZSB8fCBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1t2YWxpZGF0b3JOYW1lXTtcclxuICBpZiAoIXRlbXBsYXRlRXhpc3RzKSB7XHJcbiAgICBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1t2YWxpZGF0b3JOYW1lXSA9IGNvcmUuZm9ybWF0U3RyaW5nKFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIHRoZSB2YWx1ZXMgb2YgJTEgYW5kICUyXCIsXHJcbiAgICAgICAgbWluVmFsdWUsIG1heFZhbHVlKTtcclxuICB9XHJcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIgJiYgY3R4ICYmIGN0eC5hbGxvd1N0cmluZykge1xyXG4gICAgICAgIHYgPSBwYXJzZUludCh2LCAwKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSAmJiAoIWlzTmFOKHYpKSAmJiBNYXRoLmZsb29yKHYpID09PSB2KSB7XHJcbiAgICAgICAgaWYgKG1pblZhbHVlICE9IG51bGwgJiYgdiA8IG1pblZhbHVlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhWYWx1ZSAhPSBudWxsICYmIHYgPiBtYXhWYWx1ZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcih2YWxpZGF0b3JOYW1lLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZWdFeHBWYWxpZGF0b3IodmFsaWRhdG9yTmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiBSZWdFeHAsIGRlZmF1bHRNZXNzYWdlPzogc3RyaW5nIHwgbnVsbCwgY29udGV4dD86IGFueSkge1xyXG4gIGlmIChkZWZhdWx0TWVzc2FnZSkge1xyXG4gICAgVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXNbdmFsaWRhdG9yTmFtZV0gPSBkZWZhdWx0TWVzc2FnZTtcclxuICB9XHJcbiAgbGV0IHJlID0gKHR5cGVvZiAoZXhwcmVzc2lvbikgPT09ICdzdHJpbmcnKSA/IG5ldyBSZWdFeHAoZXhwcmVzc2lvbikgOiBleHByZXNzaW9uO1xyXG4gIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgIC8vIGRvIG5vdCBpbnZhbGlkYXRlIGlmIGVtcHR5OyB1c2UgYSBzZXBhcmF0ZSByZXF1aXJlZCB0ZXN0XHJcbiAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmICh0eXBlb2YgKHYpICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHJlLnRlc3Qodik7XHJcbiAgfTtcclxuICByZXR1cm4gbmV3IFZhbGlkYXRvcih2YWxpZGF0b3JOYW1lLCB2YWxGbiwgY29udGV4dCk7XHJcbn1cclxuXHJcbi8vIGh0dHA6Ly9yb3NldHRhY29kZS5vcmcvd2lraS9MdWhuX3Rlc3Rfb2ZfY3JlZGl0X2NhcmRfbnVtYmVycyNKYXZhU2NyaXB0XHJcblxyXG4vLyBmdW5jdGlvbiBsdWhuKGE6IHN0cmluZywgYjogbnVtYmVyLCBjOiBudW1iZXIsIGQ6IG51bWJlciwgZTogbnVtYmVyKSB7XHJcbi8vICAgZm9yIChkID0gK2FbYiA9IGEubGVuZ3RoIC0gMV0sIGUgPSAwOyBiLS07ICkge1xyXG4vLyAgICAgYyA9ICthW2JdLCBkICs9ICsrZSAlIDIgPyAyICogYyAlIDEwICsgKGMgPiA0KSA6IGM7XHJcbi8vICAgfVxyXG4vLyAgIHJldHVybiAhKGQgJSAxMCk7XHJcbi8vIH07XHJcblxyXG5sZXQgIGx1aG4gPSAoZnVuY3Rpb24oKSB7XHJcbiAgbGV0IGx1aG5BcnIgPSBbMCwgMiwgNCwgNiwgOCwgMSwgMywgNSwgNywgOV07XHJcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0cjogc3RyaW5nKSBcdHtcclxuICAgIGxldCBjb3VudGVyID0gMDtcclxuICAgIGxldCBpbmNOdW06IG51bWJlcjtcclxuICAgIGxldCBvZGQgPSBmYWxzZTtcclxuICAgIGxldCB0ZW1wID0gU3RyaW5nKHN0cikucmVwbGFjZSgvW15cXGRdL2csIFwiXCIpO1xyXG4gICAgaWYgKCB0ZW1wLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgZm9yIChsZXQgaSA9IHRlbXAubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpICB7XHJcbiAgICAgIGluY051bSA9IHBhcnNlSW50KHRlbXAuY2hhckF0KGkpLCAxMCk7XHJcbiAgICAgIGNvdW50ZXIgKz0gKG9kZCA9ICFvZGQpID8gaW5jTnVtIDogbHVobkFycltpbmNOdW1dO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIChjb3VudGVyICUgMTAgPT09IDApO1xyXG4gIH07XHJcbn0pKCk7XHJcblxyXG4vKipcclxuQSBWYWxpZGF0aW9uRXJyb3IgaXMgdXNlZCB0byBkZXNjcmliZSBhIGZhaWxlZCB2YWxpZGF0aW9uLlxyXG5cclxuQGNsYXNzIFZhbGlkYXRpb25FcnJvclxyXG4qKi9cclxuXHJcbi8qKlxyXG5Db25zdHJ1Y3RzIGEgbmV3IFZhbGlkYXRpb25FcnJvclxyXG5AbWV0aG9kIDxjdG9yPiBWYWxpZGF0aW9uRXJyb3JcclxuXHJcbkBwYXJhbSB2YWxpZGF0b3Ige1ZhbGlkYXRvciB8fCBudWxsfSBUaGUgVmFsaWRhdG9yIHVzZWQgdG8gY3JlYXRlIHRoaXMgZXJyb3IsIGlmIGFueS5cclxuQHBhcmFtIGNvbnRleHQgeyBDb250ZXh0T2JqZWN0IHx8IG51bGx9IFRoZSBDb250ZXh0IG9iamVjdCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFZhbGlkYXRvciB0byBjcmVhdGUgdGhpcyBlcnJvci5cclxuQHBhcmFtIGVycm9yTWVzc2FnZSB7IFN0cmluZ30gVGhlIGFjdHVhbCBlcnJvciBtZXNzYWdlXHJcbkBwYXJhbSBba2V5XSB7U3RyaW5nfSBBbiBvcHRpb25hbCBrZXkgdXNlZCB0byBkZWZpbmUgYSBrZXkgZm9yIHRoaXMgZXJyb3IuIE9uZSB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBpZiBub3QgcHJvdmlkZWQgaGVyZS5cclxuKiovXHJcbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3Ige1xyXG4gIHZhbGlkYXRvcj86IFZhbGlkYXRvcjtcclxuICBrZXk6IHN0cmluZztcclxuICBjb250ZXh0OiBhbnk7XHJcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbiAgcHJvcGVydHk6IGFueTsgLy8gSVByb3BlcnR5XHJcbiAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XHJcbiAgaXNTZXJ2ZXJFcnJvcjogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IodmFsaWRhdG9yOiBWYWxpZGF0b3IgfCBudWxsLCBjb250ZXh0OiBWYWxpZGF0aW9uQ29udGV4dCwgZXJyb3JNZXNzYWdlOiBzdHJpbmcsIGtleT86IHN0cmluZykge1xyXG4gICAgLy8gRXJyb3IgaXMgd2l0aCBpc0luc3RhbmNlT2YoVmFsaWRhdG9yKVxyXG4gICAgYXNzZXJ0UGFyYW0odmFsaWRhdG9yLCBcInZhbGlkYXRvclwiKS5pc09wdGlvbmFsKCkuaXNJbnN0YW5jZU9mKFZhbGlkYXRvcikuY2hlY2soKTtcclxuICAgIGFzc2VydFBhcmFtKGVycm9yTWVzc2FnZSwgXCJlcnJvck1lc3NhZ2VcIikuaXNOb25FbXB0eVN0cmluZygpLmNoZWNrKCk7XHJcbiAgICBhc3NlcnRQYXJhbShrZXksIFwia2V5XCIpLmlzT3B0aW9uYWwoKS5pc05vbkVtcHR5U3RyaW5nKCkuY2hlY2soKTtcclxuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yIHx8IHVuZGVmaW5lZDtcclxuICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlO1xyXG5cclxuICAgIHRoaXMucHJvcGVydHkgPSBjb250ZXh0LnByb3BlcnR5O1xyXG4gICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBjb250ZXh0LnByb3BlcnR5TmFtZSB8fCAoY29udGV4dC5wcm9wZXJ0eSAmJiBjb250ZXh0LnByb3BlcnR5Lm5hbWUpO1xyXG5cclxuICAgIGlmIChrZXkpIHtcclxuICAgICAgdGhpcy5rZXkgPSBrZXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmtleSA9IFZhbGlkYXRpb25FcnJvci5nZXRLZXkodmFsaWRhdG9yIHx8IGVycm9yTWVzc2FnZSwgdGhpcy5wcm9wZXJ0eU5hbWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1NlcnZlckVycm9yID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgVGhlIFZhbGlkYXRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBWYWxpZGF0aW9uRXJyb3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSB2YWxpZGF0b3Ige1ZhbGlkYXRvcn1cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgQSAnY29udGV4dCcgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZhbGlkYXRpb25FcnJvci5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IGNvbnRleHQge09iamVjdH1cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgVGhlIERhdGFQcm9wZXJ0eSBvciBOYXZpZ2F0aW9uUHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVmFsaWRhdGlvbkVycm9yLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgcHJvcGVydHkge0RhdGFQcm9wZXJ0eXxOYXZpZ2F0aW9uUHJvcGVydHl9XHJcbiAgKiovXHJcblxyXG4gIC8qKlxyXG4gIFRoZSBwcm9wZXJ0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZhbGlkYXRpb25FcnJvci4gVGhpcyB3aWxsIGJlIGEgXCJwcm9wZXJ0eSBwYXRoXCIgZm9yIGFueSBwcm9wZXJ0aWVzIG9mIGEgY29tcGxleCBvYmplY3QuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBwcm9wZXJ0eU5hbWUge1N0cmluZ31cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgVGhlIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBWYWxpZGF0aW9uRXJyb3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBlcnJvck1lc3NhZ2Uge3N0cmluZ31cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgVGhlIGtleSBieSB3aGljaCB0aGlzIHZhbGlkYXRpb24gZXJyb3IgbWF5IGJlIHJlbW92ZWQgZnJvbSBhIGNvbGxlY3Rpb24gb2YgVmFsaWRhdGlvbkVycm9ycy5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IGtleSB7c3RyaW5nfVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBXaGV0aGVyIHRoaXMgaXMgYSBzZXJ2ZXIgZXJyb3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBpc1NlcnZlckVycm9yIHtib29sfVxyXG4gICoqL1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgQ29tcG9zZXMgYSBWYWxpZGF0aW9uRXJyb3IgJ2tleScgZ2l2ZW4gYSB2YWxpZGF0b3Igb3IgYW4gZXJyb3JOYW1lIGFuZCBhbiBvcHRpb25hbCBwcm9wZXJ0eU5hbWVcclxuICBAbWV0aG9kIGdldEtleVxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gdmFsaWRhdG9yIHtWYWxpZGF0b3JPckVycm9yS2V5fSBBIFZhbGlkYXRvciBvciBhbiBcImVycm9yIG5hbWVcIiBpZiBubyB2YWxpZGF0b3IgaXMgYXZhaWxhYmxlLlxyXG4gIEBwYXJhbSBbcHJvcGVydHlOYW1lXSBBIHByb3BlcnR5IG5hbWVcclxuICBAcmV0dXJuIHtTdHJpbmd9IEEgVmFsaWRhdGlvbkVycm9yICdrZXknXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBnZXRLZXkodmFsaWRhdG9yT3JFcnJvck5hbWU6IFZhbGlkYXRvciB8IHN0cmluZywgcHJvcGVydHlOYW1lPzogc3RyaW5nKSB7XHJcbiAgICBsZXQgbmFtZSA9ICh0eXBlb2YgdmFsaWRhdG9yT3JFcnJvck5hbWUgPT09ICdzdHJpbmcnKSA/IHZhbGlkYXRvck9yRXJyb3JOYW1lIDogdmFsaWRhdG9yT3JFcnJvck5hbWUubmFtZTtcclxuICAgIHJldHVybiBuYW1lICsgKHByb3BlcnR5TmFtZSA/IFwiOlwiICsgcHJvcGVydHlOYW1lIDogXCJcIik7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==
|
package/esm5/breeze-client.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generated bundle index. Do not edit.
|
|
3
3
|
*/
|
|
4
|
-
export * from './
|
|
4
|
+
export * from './index';
|
|
5
5
|
export { Param as ɵb } from './src/assert-param';
|
|
6
6
|
export { qualifyTypeName as ɵc } from './src/entity-metadata';
|
|
7
7
|
export { BooleanQueryOp as ɵd } from './src/entity-query';
|
|
8
8
|
export { PredicateExpression as ɵa } from './src/predicate';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlZXplLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2JyZWV6ZS1jbGllbnQvIiwic291cmNlcyI6WyJicmVlemUtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUM7QUFFeEIsT0FBTyxFQUFDLEtBQUssSUFBSSxFQUFFLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsZUFBZSxJQUFJLEVBQUUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBQyxjQUFjLElBQUksRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFDLG1CQUFtQixJQUFJLEVBQUUsRUFBQyxNQUFNLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcblxuZXhwb3J0IHtQYXJhbSBhcyDJtWJ9IGZyb20gJy4vc3JjL2Fzc2VydC1wYXJhbSc7XG5leHBvcnQge3F1YWxpZnlUeXBlTmFtZSBhcyDJtWN9IGZyb20gJy4vc3JjL2VudGl0eS1tZXRhZGF0YSc7XG5leHBvcnQge0Jvb2xlYW5RdWVyeU9wIGFzIMm1ZH0gZnJvbSAnLi9zcmMvZW50aXR5LXF1ZXJ5JztcbmV4cG9ydCB7UHJlZGljYXRlRXhwcmVzc2lvbiBhcyDJtWF9IGZyb20gJy4vc3JjL3ByZWRpY2F0ZSc7Il19
|
|
@@ -251,6 +251,7 @@ var QueuedSaveFailedError = /** @class */ (function (_super) {
|
|
|
251
251
|
}
|
|
252
252
|
return QueuedSaveFailedError;
|
|
253
253
|
}(Error));
|
|
254
|
+
export { QueuedSaveFailedError };
|
|
254
255
|
////////// SaveMemo ////////////////
|
|
255
256
|
// SaveMemo is a record of changes for a queued save, consisting of:
|
|
256
257
|
// entityMemos: info about entities that are being saved and
|
|
@@ -324,7 +325,7 @@ var SaveMemo = /** @class */ (function () {
|
|
|
324
325
|
}
|
|
325
326
|
var key = _this.makeEntityMemoKey(change);
|
|
326
327
|
var entityMemo = entityMemos[key] || (entityMemos[key] = new EntityMemo(change));
|
|
327
|
-
entityMemo.update(
|
|
328
|
+
entityMemo.update();
|
|
328
329
|
});
|
|
329
330
|
};
|
|
330
331
|
return SaveMemo;
|
|
@@ -408,4 +409,4 @@ var EntityMemo = /** @class */ (function () {
|
|
|
408
409
|
};
|
|
409
410
|
return EntityMemo;
|
|
410
411
|
}());
|
|
411
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW4tc2F2ZS1xdWV1aW5nLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC9taXhpbi1zYXZlLXF1ZXVpbmcvIiwic291cmNlcyI6WyJtaXhpbi1zYXZlLXF1ZXVpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDZDQUE2QztBQUM3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyREc7QUFDSCxZQUFZO0FBQ1osT0FBTyxFQUFxQyxXQUFXLEVBQWMsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25HLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxFQUFpQixFQUFFLE1BQXNCO0lBQXRCLHVCQUFBLEVBQUEsYUFBc0I7SUFDekUsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztRQUNuQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEQsV0FBVyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7SUFDaEMsSUFBSSxNQUFNLEVBQUU7UUFDVixtQ0FBbUM7UUFDbkMsRUFBRSxDQUFDLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQztLQUN6QztTQUFNO1FBQ0wsaURBQWlEO1FBQ2pELEVBQUUsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztLQUNyRDtBQUNILENBQUM7QUFFRDs7O0lBR0k7QUFDSixTQUFTLHNCQUFzQixDQUFDLFFBQXlCLEVBQUUsV0FBZ0I7SUFDekUsSUFBSTtRQUNGLDZCQUE2QjtRQUM3QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3BDLElBQUks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QUFJLENBQUMsQ0FBQztnQkFDN0QsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUNILGlCQUFDO0FBQUQsQ0FBQyxBQWhGRCxJQWdGQyIsInNvdXJjZXNDb250ZW50IjpbIi8vI3JlZ2lvbiBDb3B5cmlnaHQsIFZlcnNpb24sIGFuZCBEZXNjcmlwdGlvblxyXG4vKlxyXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIxIElkZWFCbGFkZSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogVXNlLCByZXByb2R1Y3Rpb24sIGRpc3RyaWJ1dGlvbiwgYW5kIG1vZGlmaWNhdGlvbiBvZiB0aGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgdGhlIElkZWFCbGFkZSBCcmVlemUgbGljZW5zZSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJlZXplanMuY29tL2xpY2Vuc2VcclxuICpcclxuICogQXV0aG9yOiBXYXJkIEJlbGxcclxuICogVmVyc2lvbjogMi4wLjYgU3RldmUgU2NobWl0dCAtIGNvbnZlcnQgdG8gVHlwZVNjcmlwdCwgbW92ZSB0byBicmVlemUtY2xpZW50IHJlcG8sIGNoYW5nZSBlbmFibGVTYXZlUXVldWluZyBmdW5jdGlvblxyXG4gKiBWZXJzaW9uOiAyLjAuNSBXYXJkIEJlbGxcclxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICogQWRkcyBcIlNhdmUgUXVldWluZ1wiIGNhcGFiaWxpdHkgdG8gbmV3IEVudGl0eU1hbmFnZXJzXHJcbiAqXHJcbiAqIFNhdmUgUXVldWluZyBhdXRvbWF0aWNhbGx5IHF1ZXVlcyBhbmQgZGVmZXJzIGFuIEVudGl0eU1hbmFnZXIuc2F2ZUNoYW5nZXMgY2FsbFxyXG4gKiB3aGVuIGFub3RoZXIgc2F2ZSBpcyBpbiBwcm9ncmVzcyBmb3IgdGhhdCBtYW5hZ2VyIGFuZCB0aGUgc2VydmVyIGhhcyBub3QgeWV0IHJlc3BvbmRlZC5cclxuICogVGhpcyBmZWF0dXJlIGlzIGhlbHBmdWwgd2hlbiB5b3VyIGFwcCBuZWVkcyB0byBhbGxvdyByYXBpZCwgY29udGludW91cyBjaGFuZ2VzXHJcbiAqIHRvIGVudGl0aWVzIHRoYXQgbWF5IGJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHNhdmVkLlxyXG4gKlxyXG4gKiBXaXRob3V0IFwiU2F2ZSBRdWV1aW5nXCIsIGFuIEVudGl0eU1hbmFnZXIgd2lsbCB0aHJvdyBhbiBleGNlcHRpb25cclxuICogd2hlbiB5b3UgY2FsbCBzYXZlQ2hhbmdlcyBmb3IgYW4gZW50aXR5IHdoaWNoIGlzIGN1cnJlbnRseSBiZWluZyBzYXZlZC5cclxuICpcclxuICogISEhIFVzZSB3aXRoIGNhdXRpb24gISEhXHJcbiAqIEl0IGlzIHVzdWFsbHkgYmV0dGVyIHRvIGRpc2FibGUgdXNlciBpbnB1dCB3aGlsZSBhIHNhdmUgaXMgaW4gcHJvZ3Jlc3MuXHJcbiAqIFNhdmUgUXVldWluZyBtYXkgYmUgYXBwcm9wcmlhdGUgZm9yIHNpbXBsZSBcImF1dG8tc2F2ZVwiIHNjZW5hcmlvc1xyXG4gKiB3aGVuIHRoZSBzYXZlIGxhdGVuY3kgaXMgXCJzaG9ydFwiICh1bmRlciBhIGZldyBzZWNvbmRzKS5cclxuICpcclxuICogU2F2ZSBRdWV1aW5nIGlzIE5PVCBpbnRlbmRlZCBmb3Igb2NjYXNzaW9uYWxseSBkaXNjb25uZWN0ZWQgb3Igb2ZmbGluZSBzY2VuYXJpb3MuXHJcbiAqXHJcbiAqIFNhdmUgUXVldWluZyBpcyBleHBlcmltZW50YWwuIEl0IHdpbGwgbm90IGJlY29tZSBhIHBhcnQgb2YgQnJlZXplSlMgY29yZVxyXG4gKiBidXQgbWlnaHQgYmVjb21lIGFuIG9mZmljaWFsIEJyZWV6ZSBwbHVnaW4gaW4gZnV0dXJlXHJcbiAqIGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSBpbiB0aGlzIGZvcm0gb3Igd2l0aCB0aGlzIEFQSVxyXG4gKlxyXG4gKiBNdXN0IGNhbGwgRW50aXR5TWFuYWdlci5lbmFibGVTYXZlUXVldWluZyh0cnVlKSB0byB0dXJuIGl0IG9uO1xyXG4gKiBFbnRpdHlNYW5hZ2VyLmVuYWJsZVNhdmVRdWV1aW5nKGZhbHNlKSByZXN0b3JlcyB0aGUgbWFuYWdlcidzIG9yaWdpbmFsXHJcbiAqIHNhdmVDaGFuZ2VzIG1ldGhvZCBhcyBpdCB3YXMgYXQgdGhlIHRpbWUgc2F2ZVF1ZXVpbmcgd2FzIGZpcnN0IGVuYWJsZWQuXHJcbiAqXHJcbiAqIFRoaXMgbW9kdWxlIGFkZHMgXCJlbmFibGVTYXZlUXVldWluZ1wiIHRvIHRoZSBFbnRpdHlNYW5hZ2VyIHByb3RvdHlwZS5cclxuICogQ2FsbGluZyBcImVuYWJsZVNhdmVRdWV1aW5nKHRydWUpXCIgYWRkcyBhIG5ldyBfc2F2ZVF1ZXVpbmcgb2JqZWN0XHJcbiAqIHRvIHRoZSBtYW5hZ2VyIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBTZWUgRG9jQ29kZTpzYXZlUXVldWluZ1Rlc3RzLmpzXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9CcmVlemUvYnJlZXplLmpzLnNhbXBsZXMvYmxvYi9tYXN0ZXIvbmV0L0RvY0NvZGUvRG9jQ29kZS90ZXN0cy9zYXZlUXVldWluZ1Rlc3RzLmpzXHJcbiAqXHJcbiAqIExJTUlUQVRJT05TXHJcbiAqIC0gQ2FuJ3QgaGFuZGxlIGNoYW5nZXMgdG8gdGhlIHByaW1hcnkga2V5IChkYW5nZXJvdXMgaW4gYW55IGNhc2UpXHJcbiAqIC0gQXNzdW1lcyBwcm9taXNlcy4gRG9lcyBub3Qgc3VwcG9ydCB0aGUgKGRlcHJlY2F0ZWQpIHN1Y2Nlc3MgYW5kIGZhaWwgY2FsbGJhY2tzXHJcbiAqIC0gRG9lcyBub3QgcXVldWUgc2F2ZU9wdGlvbnMuIFRoZSBmaXJzdCBvbmUgaXMgcmUtdXNlZCBmb3IgYWxsIHF1ZXVlZCBzYXZlcy5cclxuICogLSBEb2VzIG5vdCBkZWFsIHdpdGggZXhwb3J0L2ltcG9ydCBvZiBlbnRpdGllcyB3aGlsZSBzYXZlIGlzIGluZmxpZ2h0XHJcbiAqIC0gRG9lcyBub3QgZGVhbCB3aXRoIHJlamVjdENoYW5nZXMgd2hpbGUgc2F2ZSBpcyBpbiBmbGlnaHRcclxuICogLSBEb2VzIG5vdCBzdXBwb3J0IHBhcmFsbGVsIHNhdmVzIGV2ZW4gd2hlbiB0aGUgY2hhbmdlLXNldHMgYXJlIGluZGVwZW5kZW50LlxyXG4gKiAgIFRoZSBuYXRpdmUgc2F2ZUNoYW5nZXMgYWxsb3dzIHN1Y2ggc2F2ZXMuXHJcbiAqICAgU2F2ZVF1ZXVpbmcgZG9lcyBub3Q7IHRvbyBjb21wbGV4IGFuZCBkb2Vzbid0IGZpdCB0aGUgcHJpbWFyeSBzY2VuYXJpbyBhbnl3YXkuXHJcbiAqIC0gVGhlIHJlc29sdmVkIHNhdmVSZXN1bHQgaXMgdGhlIHNhdmVSZXN1bHQgb2YgdGhlIGxhc3QgY29tcGxldGVkIHNhdmVcclxuICogLSBBIHF1ZXVlZCBzYXZlIHRoYXQgbWlnaHQgaGF2ZSBzdWNjZWVkZWQgaWYgc2F2ZWQgaW1tZWRpYXRlbHlcclxuICogICBtYXkgZmFpbCBiZWNhdXNlIHRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIGFjY2VwdHMgaXQgbGF0ZXJcclxuICogLSBQcmlvciB0byBCcmVlemUgdi4xLjUuMywgYSBxdWV1ZWQgc2F2ZSB0aGF0IG1pZ2h0IGhhdmUgc3VjY2VlZGVkXHJcbiAqICAgaWYgc2F2ZWQgaW1tZWRpYXRlbHkgd2lsbCBmYWlsIGlmIHN1YnNlcXVlbnRseSBhdHRlbXB0IHRvIHNhdmVcclxuICogICBhbiBpbnZhbGlkIGVudGl0eS4gQ2FuIGRldGVjdCBhbmQgY2lyY3VtdmVudCBhZnRlciB2LjEuNS4zLlxyXG4gKlxyXG4gKiBBbGwgbWVtYmVycyBvZiBFbnRpdHlNYW5hZ2VyLl9zYXZlUXVldWluZyBhcmUgaW50ZXJuYWw7XHJcbiAqIHRvdWNoIHRoZW0gYXQgeW91ciBvd24gcmlzay5cclxuICovXHJcbi8vI2VuZHJlZ2lvblxyXG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eU1hbmFnZXIsIEtleU1hcHBpbmcsIEVudGl0eVN0YXRlLCBTYXZlUmVzdWx0LCBicmVlemUgfSBmcm9tICdicmVlemUtY2xpZW50JztcclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlU2F2ZVF1ZXVpbmcoZW06IEVudGl0eU1hbmFnZXIsIGVuYWJsZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICBsZXQgc2F2ZVF1ZXVpbmcgPSBlbVsnX3NhdmVRdWV1ZWluZyddIHx8XHJcbiAgICAoZW1bJ19zYXZlUXVldWluZyddID0gbmV3IFNhdmVRdWV1aW5nKGVtKSk7XHJcblxyXG4gIGVuYWJsZSA9IChlbmFibGUgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogZW5hYmxlO1xyXG4gIHNhdmVRdWV1aW5nLl9pc0VuYWJsZWQgPSBlbmFibGU7XHJcbiAgaWYgKGVuYWJsZSkge1xyXG4gICAgLy8gZGVsZWdhdGUgdG8gc2F2ZSBjaGFuZ2VzIHF1ZXVpbmdcclxuICAgIGVtLnNhdmVDaGFuZ2VzID0gc2F2ZUNoYW5nZXNXaXRoUXVldWluZztcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gcmV2ZXJ0IHRvIHRoZSBuYXRpdmUgRW50aXR5TWFuYWdlci5zYXZlQ2hhbmdlc1xyXG4gICAgZW0uc2F2ZUNoYW5nZXMgPSBlbVsnX3NhdmVRdWV1aW5nJ10uYmFzZVNhdmVDaGFuZ2VzO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcGxhY2VtZW50IGZvciBFbnRpdHlNYW5hZ2VyLnNhdmVDaGFuZ2VzXHJcbiAqIFRoaXMgdmVyc2lvbiBxdWV1ZXMgc2F2ZUNoYW5nZXMgY2FsbHMgd2hpbGUgYSByZWFsIHNhdmUgaXMgaW4gcHJvZ3Jlc3NcclxuICoqL1xyXG5mdW5jdGlvbiBzYXZlQ2hhbmdlc1dpdGhRdWV1aW5nKGVudGl0aWVzOiBFbnRpdHlbXSB8IG51bGwsIHNhdmVPcHRpb25zOiBhbnkpIHtcclxuICB0cnkge1xyXG4gICAgLy8gYHRoaXNgIGlzIGFuIEVudGl0eU1hbmFnZXJcclxuICAgIGxldCBzYXZlUXVldWluZyA9IHRoaXMuX3NhdmVRdWV1aW5nO1xyXG4gICAgaWYgKHNhdmVRdWV1aW5nLmlzU2F2aW5nKSB7XHJcbiAgICAgIC8vIHNhdmUgaW4gcHJvZ3Jlc3M7IHF1ZXVlIHRoZSBzYXZlIGZvciBsYXRlclxyXG4gICAgICByZXR1cm4gc2F2ZVF1ZXVpbmcucXVldWVTYXZlQ2hhbmdlcyhlbnRpdGllcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBub3RlIHRoYXQgc2F2ZSBpcyBpbiBwcm9ncmVzczsgdGhlbiBzYXZlXHJcbiAgICAgIHNhdmVRdWV1aW5nLmlzU2F2aW5nID0gdHJ1ZTtcclxuICAgICAgc2F2ZVF1ZXVpbmcuc2F2ZU9wdGlvbnMgPSBzYXZlT3B0aW9ucztcclxuICAgICAgcmV0dXJuIHNhdmVRdWV1aW5nLnNhdmVDaGFuZ2VzKGVudGl0aWVzLCBzYXZlT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLy8vLy8vLyBTYXZlUXVldWluZyAvLy8vLy8vLy9cclxuY2xhc3MgU2F2ZVF1ZXVpbmcge1xyXG4gIGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXI7XHJcbiAgYmFzZVNhdmVDaGFuZ2VzOiAoKSA9PiBQcm9taXNlPGFueT47XHJcbiAgaXNTYXZpbmc6IGJvb2xlYW47XHJcbiAgX2lzRW5hYmxlZDogYm9vbGVhbjtcclxuICBhY3RpdmVTYXZlRGVmZXJyZWQ6IERlZmVycmVkPFNhdmVSZXN1bHQ+O1xyXG4gIG5leHRTYXZlRGVmZXJyZWQ6IERlZmVycmVkPFNhdmVSZXN1bHQ+O1xyXG4gIGFjdGl2ZVNhdmVNZW1vOiBTYXZlTWVtbztcclxuICBuZXh0U2F2ZU1lbW86IFNhdmVNZW1vO1xyXG4gIHNhdmVPcHRpb25zOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXIpIHtcclxuICAgIHRoaXMuZW50aXR5TWFuYWdlciA9IGVudGl0eU1hbmFnZXI7XHJcbiAgICB0aGlzLmJhc2VTYXZlQ2hhbmdlcyA9IGVudGl0eU1hbmFnZXIuc2F2ZUNoYW5nZXM7XHJcbiAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc0VuYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNFbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2F2ZWROb3RoaW5nUmVzdWx0KCk6IFNhdmVSZXN1bHQge1xyXG4gICAgcmV0dXJuIHsgZW50aXRpZXM6IFtdIGFzIEVudGl0eVtdLCBrZXlNYXBwaW5nczogW10gYXMgS2V5TWFwcGluZ1tdIH07XHJcbiAgfVxyXG5cclxuICBxdWV1ZVNhdmVDaGFuZ2VzKGVudGl0aWVzOiBFbnRpdHlbXSkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWluZ1xyXG4gICAgbGV0IGVtID0gc2VsZi5lbnRpdHlNYW5hZ2VyO1xyXG5cclxuICAgIGxldCBjaGFuZ2VzID0gZW50aXRpZXMgfHwgZW0uZ2V0Q2hhbmdlcygpO1xyXG4gICAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5nZXRTYXZlZE5vdGhpbmdSZXN1bHQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHZhbEVycm9yID0gZW0uc2F2ZUNoYW5nZXNWYWxpZGF0ZU9uQ2xpZW50KGNoYW5nZXMpO1xyXG4gICAgaWYgKHZhbEVycm9yKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWxFcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNhdmVNZW1vID0gc2VsZi5uZXh0U2F2ZU1lbW8gfHwgKHNlbGYubmV4dFNhdmVNZW1vID0gbmV3IFNhdmVNZW1vKCkpO1xyXG4gICAgbWVtb2l6ZUNoYW5nZXMoKTtcclxuICAgIGxldCBkZWZlcnJlZCA9IHNlbGYubmV4dFNhdmVEZWZlcnJlZCB8fCAoc2VsZi5uZXh0U2F2ZURlZmVycmVkID0gbmV3IERlZmVycmVkPFNhdmVSZXN1bHQ+KCkpO1xyXG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcblxyXG4gICAgZnVuY3Rpb24gbWVtb2l6ZUNoYW5nZXMoKSB7XHJcbiAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cclxuICAgICAgbGV0IHF1ZXVlZENoYW5nZXMgPSBzYXZlTWVtby5xdWV1ZWRDaGFuZ2VzO1xyXG4gICAgICBjaGFuZ2VzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgaWYgKCFlLmVudGl0eUFzcGVjdC5pc0JlaW5nU2F2ZWQgJiYgcXVldWVkQ2hhbmdlcy5pbmRleE9mKGUpID09PSAtMSkge1xyXG4gICAgICAgICAgcXVldWVkQ2hhbmdlcy5wdXNoKGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzYXZlTWVtby51cGRhdGVFbnRpdHlNZW1vcyhjaGFuZ2VzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhdmVDaGFuZ2VzKGVudGl0aWVzOiBFbnRpdHlbXSwgc2F2ZU9wdGlvbnM6IGFueSkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWluZ1xyXG4gICAgbGV0IHByb21pc2UgPSBzZWxmLmJhc2VTYXZlQ2hhbmdlcy5jYWxsKHNlbGYuZW50aXR5TWFuYWdlciwgZW50aXRpZXMsIHNhdmVPcHRpb25zIHx8IHNlbGYuc2F2ZU9wdGlvbnMpXHJcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChzYXZlUmVzdWx0OiBTYXZlUmVzdWx0KSB7IHJldHVybiBzZWxmLnNhdmVTdWNjZWVkZWQoc2F2ZVJlc3VsdCk7IH0pXHJcbiAgICAgIC50aGVuKG51bGwsIGZ1bmN0aW9uIChlcnJvcjogRXJyb3IpIHsgY29uc29sZS5sb2coZXJyb3IpOyByZXR1cm4gc2VsZi5zYXZlRmFpbGVkKGVycm9yKTsgfSk7XHJcbiAgICByZW1lbWJlckFkZGVkT3JpZ2luYWxWYWx1ZXMoZW50aXRpZXMpOyAvLyBkbyBpdCBhZnRlciAuLi4gc28gZG9uJ3Qgc2VuZCBPcmlnVmFsdWVzIHRvIHRoZSBzZXJ2ZXJcclxuICAgIHJldHVybiBwcm9taXNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJlbWVtYmVyQWRkZWRPcmlnaW5hbFZhbHVlcyhlbnRpdGllczogRW50aXR5W10pIHtcclxuICAgICAgLy8gYWRkZWQgZW50aXRpZXMgbm9ybWFsbHkgZG9uJ3QgaGF2ZSBvcmlnaW5hbCB2YWx1ZXMgYnV0IHRoZXNlIHdpbGwgbm93XHJcbiAgICAgIGxldCBhZGRlZCA9IGVudGl0aWVzID9cclxuICAgICAgICBlbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzQWRkZWQoKTsgfSkgOlxyXG4gICAgICAgIHNlbGYuZW50aXR5TWFuYWdlci5nZXRFbnRpdGllcyhudWxsLCBFbnRpdHlTdGF0ZS5BZGRlZCk7XHJcbiAgICAgIGFkZGVkLmZvckVhY2goZW50aXR5ID0+IHtcclxuICAgICAgICBsZXQgcHJvcHMgPSBlbnRpdHkuZW50aXR5VHlwZS5kYXRhUHJvcGVydGllcztcclxuICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZXMgPSBlbnRpdHkuZW50aXR5QXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgICAgIHByb3BzLmZvckVhY2goZHAgPT4ge1xyXG4gICAgICAgICAgaWYgKGRwLmlzUGFydE9mS2V5KSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZXNbZHAubmFtZV0gPSBlbnRpdHkuZ2V0UHJvcGVydHkoZHAubmFtZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHNhdmVTdWNjZWVkZWQoc2F2ZVJlc3VsdDogU2F2ZVJlc3VsdCkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWVpbmdcclxuICAgIGxldCBhY3RpdmVTYXZlRGVmZXJyZWQgPSBzZWxmLmFjdGl2ZVNhdmVEZWZlcnJlZDtcclxuICAgIGxldCBuZXh0U2F2ZURlZmVycmVkID0gc2VsZi5uZXh0U2F2ZURlZmVycmVkO1xyXG4gICAgbGV0IG5leHRTYXZlTWVtbyA9IHNlbGYubmV4dFNhdmVNZW1vO1xyXG5cclxuXHJcbiAgICAvLyBwcmVwYXJlIGFzIGlmIG5vdGhpbmcgcXVldWVkIG9yIGxlZnQgdG8gc2F2ZVxyXG4gICAgc2VsZi5pc1NhdmluZyA9IGZhbHNlO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlTWVtbyA9IG51bGw7XHJcbiAgICBzZWxmLm5leHRTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5uZXh0U2F2ZU1lbW8gPSBudWxsO1xyXG5cclxuICAgIGlmIChuZXh0U2F2ZU1lbW8pIHtcclxuICAgICAgLy8gYSBzYXZlIHdhcyBxdWV1ZWQgc2luY2UgbGFzdCBzYXZlIHJldHVybmVkXHJcbiAgICAgIG5leHRTYXZlTWVtby5wa0ZpeHVwKHNhdmVSZXN1bHQua2V5TWFwcGluZ3MpO1xyXG4gICAgICBuZXh0U2F2ZU1lbW8uYXBwbHlUb1NhdmVkRW50aXRpZXMoc2VsZi5lbnRpdHlNYW5hZ2VyLCBzYXZlUmVzdWx0LmVudGl0aWVzKTtcclxuICAgICAgLy8gcmVtb3ZlIGRldGFjaGVkIGVudGl0aWVzIGZyb20gcXVldWVkQ2hhbmdlc1xyXG4gICAgICBsZXQgcXVldWVkQ2hhbmdlcyA9IG5leHRTYXZlTWVtby5xdWV1ZWRDaGFuZ2VzLmZpbHRlcihlID0+IHtcclxuICAgICAgICByZXR1cm4gIWUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzRGV0YWNoZWQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAocXVldWVkQ2hhbmdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gc2F2ZSBhZ2FpblxyXG4gICAgICAgIHNlbGYuaXNTYXZpbmcgPSB0cnVlO1xyXG4gICAgICAgIC8vIHJlbWVtYmVyIHRoZSBxdWV1ZWQgY2hhbmdlcyB0aGF0IHRyaWdnZXJlZCB0aGlzIHNhdmVcclxuICAgICAgICBzZWxmLmFjdGl2ZVNhdmVEZWZlcnJlZCA9IG5leHRTYXZlRGVmZXJyZWQ7XHJcbiAgICAgICAgc2VsZi5hY3RpdmVTYXZlTWVtbyA9IG5leHRTYXZlTWVtbztcclxuICAgICAgICBzZWxmLnNhdmVDaGFuZ2VzKHF1ZXVlZENoYW5nZXMsIHRoaXMuc2F2ZU9wdGlvbnMpO1xyXG4gICAgICB9IGVsc2UgaWYgKG5leHRTYXZlRGVmZXJyZWQpIHtcclxuICAgICAgICBuZXh0U2F2ZURlZmVycmVkLnJlc29sdmUodGhpcy5nZXRTYXZlZE5vdGhpbmdSZXN1bHQoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWN0aXZlU2F2ZURlZmVycmVkKSB7IGFjdGl2ZVNhdmVEZWZlcnJlZC5yZXNvbHZlKHNhdmVSZXN1bHQpOyB9XHJcbiAgICByZXR1cm4gc2F2ZVJlc3VsdDsgIC8vIGZvciB0aGUgY3VycmVudCBwcm9taXNlIGNoYWluXHJcbiAgfVxyXG5cclxuICBzYXZlRmFpbGVkKGVycm9yOiBFcnJvcikge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWVpbmdcclxuICAgIGVycm9yID0gbmV3IFF1ZXVlZFNhdmVGYWlsZWRFcnJvcihlcnJvciwgc2VsZik7XHJcblxyXG4gICAgbGV0IGFjdGl2ZVNhdmVEZWZlcnJlZCA9IHNlbGYuYWN0aXZlU2F2ZURlZmVycmVkO1xyXG4gICAgbGV0IG5leHRTYXZlRGVmZXJyZWQgPSBzZWxmLm5leHRTYXZlRGVmZXJyZWQ7XHJcblxyXG4gICAgc2VsZi5pc1NhdmluZyA9IGZhbHNlO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlTWVtbyA9IG51bGw7XHJcbiAgICBzZWxmLm5leHRTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5uZXh0U2F2ZU1lbW8gPSBudWxsO1xyXG5cclxuICAgIGlmIChhY3RpdmVTYXZlRGVmZXJyZWQpIHsgYWN0aXZlU2F2ZURlZmVycmVkLnJlamVjdChlcnJvcik7IH1cclxuICAgIGlmIChuZXh0U2F2ZURlZmVycmVkKSB7IG5leHRTYXZlRGVmZXJyZWQucmVqZWN0KGVycm9yKTsgfVxyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7IC8vIGxldCBwcm9taXNlIGNoYWluIGhlYXIgZXJyb3JcclxuICB9XHJcbn1cclxuXHJcbi8vLyBmb3IgYmFja3dhcmQgY29tcGF0IHdpdGggb2xkZXIgUHJvbWlzZSBpbXBsZW1lbnRhdGlvblxyXG5jbGFzcyBEZWZlcnJlZDxUPiB7XHJcbiAgcmVzb2x2ZTogKHZhbDogYW55KSA9PiB2b2lkO1xyXG4gIHJlamVjdDogKGVycjogYW55KSA9PiB2b2lkO1xyXG4gIHByb21pc2U6IFByb21pc2U8VD47XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZTxUPihmdW5jdGlvbiAocmVzb2x2ZTogKHZhbDogYW55KSA9PiB2b2lkLCByZWplY3Q6IChlcnI6IGFueSkgPT4gdm9pZCkge1xyXG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcclxuICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuLy8vLy8vLy8vLyBRdWV1ZWRTYXZlRmFpbGVkRXJyb3IgLy8vLy8vLy8vXHJcbi8vIEVycm9yIHN1Yi1jbGFzcyB0aHJvd24gd2hlbiByZWplY3RpbmcgcXVldWVkIHNhdmVzLlxyXG5jbGFzcyBRdWV1ZWRTYXZlRmFpbGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgbmFtZSA9IFwiUXVldWVkU2F2ZUZhaWxlZEVycm9yXCI7XHJcbiAgaW5uZXJFcnJvcjogRXJyb3I7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIGZhaWxlZFNhdmVNZW1vOiBTYXZlTWVtbztcclxuICBuZXh0U2F2ZU1lbW86IFNhdmVNZW1vO1xyXG5cclxuICAvLyBFcnJvciBzdWItY2xhc3MgdGhyb3duIHdoZW4gcmVqZWN0aW5nIHF1ZXVlZCBzYXZlcy5cclxuICAvLyBgaW5uZXJFcnJvcmAgaXMgdGhlIGFjdHVhbCBzYXZlIGVycm9yXHJcbiAgLy8gYGZhaWxlZFNhdmVNZW1vYCBpcyB0aGUgc2F2ZU1lbW8gdGhhdCBwcm9tcHRlZCB0aGlzIHNhdmVcclxuICAvLyBgbmV4dFNhdmVNZW1vYCBob2xkcyBxdWV1ZWQgY2hhbmdlcyBhY2N1bXVsYXRlZCBzaW5jZSB0aGF0IHNhdmUuXHJcbiAgLy8gWW91IG1heSB0cnkgdG8gcmVjb3ZlciB1c2luZyB0aGlzIGluZm8uIEdvb2QgbHVjayB3aXRoIHRoYXQuXHJcbiAgY29uc3RydWN0b3IoZXJyT2JqZWN0OiBFcnJvciwgc2F2ZVF1ZXVpbmc6IGFueSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuaW5uZXJFcnJvciA9IGVyck9iamVjdDtcclxuICAgIHRoaXMubWVzc2FnZSA9IFwiUXVldWVkIHNhdmUgZmFpbGVkOiBcIiArIGVyck9iamVjdC5tZXNzYWdlO1xyXG4gICAgdGhpcy5mYWlsZWRTYXZlTWVtbyA9IHNhdmVRdWV1aW5nLmFjdGl2ZVNhdmVNZW1vO1xyXG4gICAgdGhpcy5uZXh0U2F2ZU1lbW8gPSBzYXZlUXVldWluZy5uZXh0U2F2ZU1lbW87XHJcbiAgfVxyXG59XHJcblxyXG4vLy8vLy8vLy8vIFNhdmVNZW1vIC8vLy8vLy8vLy8vLy8vLy9cclxuLy8gU2F2ZU1lbW8gaXMgYSByZWNvcmQgb2YgY2hhbmdlcyBmb3IgYSBxdWV1ZWQgc2F2ZSwgY29uc2lzdGluZyBvZjpcclxuLy8gICBlbnRpdHlNZW1vczogICBpbmZvIGFib3V0IGVudGl0aWVzIHRoYXQgYXJlIGJlaW5nIHNhdmVkIGFuZFxyXG4vLyAgICAgICAgICAgICAgICAgIGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIHRoZSBzYXZlIHN0YXJ0ZWRcclxuLy8gICBxdWV1ZWRDaGFuZ2VzOiBlbnRpdGllcyB0aGF0IGFyZSBxdWV1ZWQgZm9yIHNhdmUgYnV0XHJcbi8vICAgICAgICAgICAgICAgICAgYXJlIG5vdCBjdXJyZW50bHkgYmVpbmcgc2F2ZWRcclxuY2xhc3MgU2F2ZU1lbW8ge1xyXG4gIGVudGl0eU1lbW9zOiBhbnk7XHJcbiAgcXVldWVkQ2hhbmdlczogYW55W107XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmVudGl0eU1lbW9zID0ge307XHJcbiAgICB0aGlzLnF1ZXVlZENoYW5nZXMgPSBbXTtcclxuICB9XHJcblxyXG4gIGFwcGx5VG9TYXZlZEVudGl0aWVzKGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXIsIHNhdmVkRW50aXRpZXM6IEVudGl0eVtdKSB7XHJcbiAgICBsZXQgZW50aXR5TWVtb3MgPSB0aGlzLmVudGl0eU1lbW9zOyAvLyBgdGhpc2AgaXMgYSBTYXZlTWVtb1xyXG4gICAgbGV0IHF1ZXVlZENoYW5nZXMgPSB0aGlzLnF1ZXVlZENoYW5nZXM7XHJcbiAgICBsZXQgcmVzdG9yZVB1Ymxpc2hpbmcgPSB0aGlzLmRpc2FibGVNYW5hZ2VyUHVibGlzaGluZyhlbnRpdHlNYW5hZ2VyKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHNhdmVkRW50aXRpZXMuZm9yRWFjaChzYXZlZCA9PiB7XHJcbiAgICAgICAgbGV0IGtleSA9IHRoaXMubWFrZUVudGl0eU1lbW9LZXkoc2F2ZWQpO1xyXG4gICAgICAgIGxldCBlbnRpdHlNZW1vID0gZW50aXR5TWVtb3Nba2V5XTtcclxuICAgICAgICBsZXQgcmVzYXZlID0gZW50aXR5TWVtbyAmJiBlbnRpdHlNZW1vLmFwcGx5VG9TYXZlZEVudGl0eShzYXZlZCk7XHJcbiAgICAgICAgaWYgKHJlc2F2ZSkge1xyXG4gICAgICAgICAgcXVldWVkQ2hhbmdlcy5wdXNoKHNhdmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgcmVzdG9yZVB1Ymxpc2hpbmcoKTtcclxuICAgICAgLy8gRCMyNjUxIGhhc0NoYW5nZXMgd2lsbCBiZSB3cm9uZyBpZiBjaGFuZ2VzIG1hZGUgd2hpbGUgc2F2ZSBpbiBwcm9ncmVzc1xyXG4gICAgICBsZXQgaGFzQ2hhbmdlcyA9IHF1ZXVlZENoYW5nZXMubGVuZ3RoID4gMDtcclxuICAgICAgLy8gTXVzdCB1c2UgYnJlZXplIGludGVybmFsIG1ldGhvZCB0byBwcm9wZXJseSBzZXQgdGhpcyBmbGFnIHRydWVcclxuICAgICAgaWYgKGhhc0NoYW5nZXMpIHsgZW50aXR5TWFuYWdlci5fc2V0SGFzQ2hhbmdlcyh0cnVlKTsgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNhYmxlTWFuYWdlclB1Ymxpc2hpbmcobWFuYWdlcjogRW50aXR5TWFuYWdlcikge1xyXG4gICAgbGV0IEV2ZW50ID0gYnJlZXplLkV2ZW50O1xyXG4gICAgRXZlbnQuZW5hYmxlKCdlbnRpdHlDaGFuZ2VkJywgbWFuYWdlciwgZmFsc2UpO1xyXG4gICAgRXZlbnQuZW5hYmxlKCdoYXNDaGFuZ2VzQ2hhbmdlZCcsIG1hbmFnZXIsIGZhbHNlKTtcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVzdG9yZVB1Ymxpc2hpbmcoKSB7XHJcbiAgICAgIEV2ZW50LmVuYWJsZSgnZW50aXR5Q2hhbmdlZCcsIG1hbmFnZXIsIHRydWUpO1xyXG4gICAgICBFdmVudC5lbmFibGUoJ2hhc0NoYW5nZXNDaGFuZ2VkJywgbWFuYWdlciwgdHJ1ZSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcGtGaXh1cChrZXlNYXBwaW5nczogS2V5TWFwcGluZ1tdKSB7XHJcbiAgICBsZXQgZW50aXR5TWVtb3MgPSB0aGlzLmVudGl0eU1lbW9zOyAgLy8gYHRoaXNgIGlzIGEgU2F2ZU1lbW9cclxuICAgIGtleU1hcHBpbmdzLmZvckVhY2goa20gPT4ge1xyXG4gICAgICBsZXQgdHlwZSA9IGttLmVudGl0eVR5cGVOYW1lO1xyXG4gICAgICBsZXQgdGVtcEtleSA9IHR5cGUgKyAnfCcgKyBrbS50ZW1wVmFsdWU7XHJcbiAgICAgIGlmIChlbnRpdHlNZW1vc1t0ZW1wS2V5XSkge1xyXG4gICAgICAgIGVudGl0eU1lbW9zW3R5cGUgKyAnfCcgKyBrbS5yZWFsVmFsdWVdID0gZW50aXR5TWVtb3NbdGVtcEtleV07XHJcbiAgICAgICAgZGVsZXRlIGVudGl0eU1lbW9zW3RlbXBLZXldO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IG1lbW9LZXkgaW4gZW50aXR5TWVtb3MpIHtcclxuICAgICAgICBlbnRpdHlNZW1vc1ttZW1vS2V5XS5ma0ZpeHVwKGttKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBtYWtlRW50aXR5TWVtb0tleShlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgbGV0IGVudGl0eUtleSA9IGVudGl0eS5lbnRpdHlBc3BlY3QuZ2V0S2V5KCk7XHJcbiAgICByZXR1cm4gZW50aXR5S2V5LmVudGl0eVR5cGUubmFtZSArICd8JyArIGVudGl0eUtleS52YWx1ZXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFbnRpdHlNZW1vcyhjaGFuZ2VzOiBFbnRpdHlbXSkge1xyXG4gICAgbGV0IGVudGl0eU1lbW9zID0gdGhpcy5lbnRpdHlNZW1vczsgIC8vIGB0aGlzYCBpcyBhIFNhdmVNZW1vXHJcbiAgICBjaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcclxuICAgICAgLy8gb25seSB1cGRhdGUgZW50aXR5TWVtbyBmb3IgZW50aXR5IGJlaW5nIHNhdmVcclxuICAgICAgaWYgKCFjaGFuZ2UuZW50aXR5QXNwZWN0LmlzQmVpbmdTYXZlZCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgIGxldCBrZXkgPSB0aGlzLm1ha2VFbnRpdHlNZW1vS2V5KGNoYW5nZSk7XHJcbiAgICAgIGxldCBlbnRpdHlNZW1vID0gZW50aXR5TWVtb3Nba2V5XSB8fCAoZW50aXR5TWVtb3Nba2V5XSA9IG5ldyBFbnRpdHlNZW1vKGNoYW5nZSkpO1xyXG4gICAgICBlbnRpdHlNZW1vLnVwZGF0ZShjaGFuZ2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG4vLy8vLy8vLy8gRW50aXR5TWVtbyBUeXBlIC8vLy8vLy8vLy8vLy8vL1xyXG4vLyBJbmZvcm1hdGlvbiBhYm91dCBhbiBlbnRpdHkgdGhhdCBpcyBiZWluZyBzYXZlZFxyXG4vLyBhbmQgd2hpY2ggaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSB0aGF0IHNhdmUgc3RhcnRlZFxyXG5jbGFzcyBFbnRpdHlNZW1vIHtcclxuICBlbnRpdHk6IEVudGl0eTtcclxuICBwZW5kaW5nQ2hhbmdlczogYW55O1xyXG4gIGlzRGVsZXRlZDogYm9vbGVhbjtcclxuICBjb25zdHJ1Y3RvcihlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XHJcbiAgICB0aGlzLnBlbmRpbmdDaGFuZ2VzID0ge307XHJcbiAgfVxyXG5cclxuXHJcbiAgYXBwbHlUb1NhdmVkRW50aXR5KHNhdmVkOiBFbnRpdHkpIHtcclxuICAgIGxldCBlbnRpdHlNZW1vID0gdGhpcztcclxuICAgIGxldCBhc3BlY3QgPSBzYXZlZC5lbnRpdHlBc3BlY3Q7XHJcbiAgICBpZiAoYXNwZWN0LmVudGl0eVN0YXRlLmlzRGV0YWNoZWQoKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKGVudGl0eU1lbW8uaXNEZWxldGVkKSB7XHJcbiAgICAgIGFzcGVjdC5zZXREZWxldGVkKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLy8gdHJlYXQgZW50aXR5IHdpdGggcGVuZGluZyBjaGFuZ2VzIGFzIG1vZGlmaWVkXHJcbiAgICBsZXQgcHJvcHMgPSBPYmplY3Qua2V5cyhlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzKTtcclxuICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgbGV0IG9yaWdpbmFsVmFsdWVzID0gYXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgcHJvcHMuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgb3JpZ2luYWxWYWx1ZXNbbmFtZV0gPSBzYXZlZC5nZXRQcm9wZXJ0eShuYW1lKTtcclxuICAgICAgc2F2ZWQuc2V0UHJvcGVydHkobmFtZSwgZW50aXR5TWVtby5wZW5kaW5nQ2hhbmdlc1tuYW1lXSk7XHJcbiAgICB9KTtcclxuICAgIGFzcGVjdC5zZXRNb2RpZmllZCgpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBma0ZpeHVwKGtleU1hcHBpbmc6IEtleU1hcHBpbmcpIHtcclxuICAgIGxldCBlbnRpdHlNZW1vID0gdGhpcztcclxuICAgIGxldCB0eXBlID0gZW50aXR5TWVtby5lbnRpdHkuZW50aXR5VHlwZTtcclxuICAgIGxldCBma1Byb3BzID0gdHlwZS5mb3JlaWduS2V5UHJvcGVydGllcztcclxuICAgIGZrUHJvcHMuZm9yRWFjaChma1Byb3AgPT4ge1xyXG4gICAgICBpZiAoZmtQcm9wLnBhcmVudFR5cGUubmFtZSA9PT0ga2V5TWFwcGluZy5lbnRpdHlUeXBlTmFtZSAmJlxyXG4gICAgICAgIGVudGl0eU1lbW8ucGVuZGluZ0NoYW5nZXNbZmtQcm9wLm5hbWVdID09PSBrZXlNYXBwaW5nLnRlbXBWYWx1ZSkge1xyXG4gICAgICAgIGVudGl0eU1lbW8ucGVuZGluZ0NoYW5nZXNbZmtQcm9wLm5hbWVdID0ga2V5TWFwcGluZy5yZWFsVmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gdXBkYXRlIHRoZSBlbnRpdHlNZW1vIG9mIGNoYW5nZXMgdG8gYW4gZW50aXR5IGJlaW5nIHNhdmVkXHJcbiAgLy8gc28gdGhhdCB3ZSBrbm93IGhvdyB0byBzYXZlIGl0IGFnYWluIGxhdGVyXHJcbiAgdXBkYXRlKCkge1xyXG4gICAgbGV0IGVudGl0eU1lbW8gPSB0aGlzO1xyXG4gICAgbGV0IHByb3BzO1xyXG4gICAgbGV0IGVudGl0eSA9IGVudGl0eU1lbW8uZW50aXR5O1xyXG4gICAgbGV0IGFzcGVjdCA9IGVudGl0eS5lbnRpdHlBc3BlY3Q7XHJcbiAgICBsZXQgc3RhdGVOYW1lID0gYXNwZWN0LmVudGl0eVN0YXRlLm5hbWU7XHJcbiAgICBzd2l0Y2ggKHN0YXRlTmFtZSkge1xyXG4gICAgICBjYXNlICdBZGRlZCc6XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWVzID0gYXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgICAgIHByb3BzID0gZW50aXR5LmVudGl0eVR5cGUuZGF0YVByb3BlcnRpZXM7XHJcbiAgICAgICAgcHJvcHMuZm9yRWFjaChkcCA9PiB7XHJcbiAgICAgICAgICBpZiAoZHAuaXNQYXJ0T2ZLZXkpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICBsZXQgbmFtZSA9IGRwLm5hbWU7XHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSBlbnRpdHkuZ2V0UHJvcGVydHkobmFtZSk7XHJcbiAgICAgICAgICBpZiAob3JpZ2luYWxWYWx1ZXNbbmFtZV0gIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGVudGl0eU1lbW8ucGVuZGluZ0NoYW5nZXNbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ0RlbGV0ZWQnOlxyXG4gICAgICAgIGVudGl0eU1lbW8uaXNEZWxldGVkID0gdHJ1ZTtcclxuICAgICAgICBlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzID0ge307XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdNb2RpZmllZCc6XHJcbiAgICAgICAgcHJvcHMgPSBPYmplY3Qua2V5cyhhc3BlY3Qub3JpZ2luYWxWYWx1ZXMpO1xyXG4gICAgICAgIHByb3BzLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgICBlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzW25hbWVdID0gZW50aXR5LmdldFByb3BlcnR5KG5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|
|
412
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW4tc2F2ZS1xdWV1aW5nLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC9taXhpbi1zYXZlLXF1ZXVpbmcvIiwic291cmNlcyI6WyJtaXhpbi1zYXZlLXF1ZXVpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDZDQUE2QztBQUM3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyREc7QUFDSCxZQUFZO0FBQ1osT0FBTyxFQUFxQyxXQUFXLEVBQWMsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25HLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxFQUFpQixFQUFFLE1BQXNCO0lBQXRCLHVCQUFBLEVBQUEsYUFBc0I7SUFDekUsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztRQUNuQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEQsV0FBVyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7SUFDaEMsSUFBSSxNQUFNLEVBQUU7UUFDVixtQ0FBbUM7UUFDbkMsRUFBRSxDQUFDLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQztLQUN6QztTQUFNO1FBQ0wsaURBQWlEO1FBQ2pELEVBQUUsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztLQUNyRDtBQUNILENBQUM7QUFFRDs7O0lBR0k7QUFDSixTQUFTLHNCQUFzQixDQUFDLFFBQXlCLEVBQUUsV0FBZ0I7SUFDekUsSUFBSTtRQUNGLDZCQUE2QjtRQUM3QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3BDLElBQUks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Q0FBQztnQkFDN0QsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUNILGlCQUFDO0FBQUQsQ0FBQyxBQWhGRCxJQWdGQyIsInNvdXJjZXNDb250ZW50IjpbIi8vI3JlZ2lvbiBDb3B5cmlnaHQsIFZlcnNpb24sIGFuZCBEZXNjcmlwdGlvblxyXG4vKlxyXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIxIElkZWFCbGFkZSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogVXNlLCByZXByb2R1Y3Rpb24sIGRpc3RyaWJ1dGlvbiwgYW5kIG1vZGlmaWNhdGlvbiBvZiB0aGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgdGhlIElkZWFCbGFkZSBCcmVlemUgbGljZW5zZSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJlZXplanMuY29tL2xpY2Vuc2VcclxuICpcclxuICogQXV0aG9yOiBXYXJkIEJlbGxcclxuICogVmVyc2lvbjogMi4wLjYgU3RldmUgU2NobWl0dCAtIGNvbnZlcnQgdG8gVHlwZVNjcmlwdCwgbW92ZSB0byBicmVlemUtY2xpZW50IHJlcG8sIGNoYW5nZSBlbmFibGVTYXZlUXVldWluZyBmdW5jdGlvblxyXG4gKiBWZXJzaW9uOiAyLjAuNSBXYXJkIEJlbGxcclxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICogQWRkcyBcIlNhdmUgUXVldWluZ1wiIGNhcGFiaWxpdHkgdG8gbmV3IEVudGl0eU1hbmFnZXJzXHJcbiAqXHJcbiAqIFNhdmUgUXVldWluZyBhdXRvbWF0aWNhbGx5IHF1ZXVlcyBhbmQgZGVmZXJzIGFuIEVudGl0eU1hbmFnZXIuc2F2ZUNoYW5nZXMgY2FsbFxyXG4gKiB3aGVuIGFub3RoZXIgc2F2ZSBpcyBpbiBwcm9ncmVzcyBmb3IgdGhhdCBtYW5hZ2VyIGFuZCB0aGUgc2VydmVyIGhhcyBub3QgeWV0IHJlc3BvbmRlZC5cclxuICogVGhpcyBmZWF0dXJlIGlzIGhlbHBmdWwgd2hlbiB5b3VyIGFwcCBuZWVkcyB0byBhbGxvdyByYXBpZCwgY29udGludW91cyBjaGFuZ2VzXHJcbiAqIHRvIGVudGl0aWVzIHRoYXQgbWF5IGJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHNhdmVkLlxyXG4gKlxyXG4gKiBXaXRob3V0IFwiU2F2ZSBRdWV1aW5nXCIsIGFuIEVudGl0eU1hbmFnZXIgd2lsbCB0aHJvdyBhbiBleGNlcHRpb25cclxuICogd2hlbiB5b3UgY2FsbCBzYXZlQ2hhbmdlcyBmb3IgYW4gZW50aXR5IHdoaWNoIGlzIGN1cnJlbnRseSBiZWluZyBzYXZlZC5cclxuICpcclxuICogISEhIFVzZSB3aXRoIGNhdXRpb24gISEhXHJcbiAqIEl0IGlzIHVzdWFsbHkgYmV0dGVyIHRvIGRpc2FibGUgdXNlciBpbnB1dCB3aGlsZSBhIHNhdmUgaXMgaW4gcHJvZ3Jlc3MuXHJcbiAqIFNhdmUgUXVldWluZyBtYXkgYmUgYXBwcm9wcmlhdGUgZm9yIHNpbXBsZSBcImF1dG8tc2F2ZVwiIHNjZW5hcmlvc1xyXG4gKiB3aGVuIHRoZSBzYXZlIGxhdGVuY3kgaXMgXCJzaG9ydFwiICh1bmRlciBhIGZldyBzZWNvbmRzKS5cclxuICpcclxuICogU2F2ZSBRdWV1aW5nIGlzIE5PVCBpbnRlbmRlZCBmb3Igb2NjYXNzaW9uYWxseSBkaXNjb25uZWN0ZWQgb3Igb2ZmbGluZSBzY2VuYXJpb3MuXHJcbiAqXHJcbiAqIFNhdmUgUXVldWluZyBpcyBleHBlcmltZW50YWwuIEl0IHdpbGwgbm90IGJlY29tZSBhIHBhcnQgb2YgQnJlZXplSlMgY29yZVxyXG4gKiBidXQgbWlnaHQgYmVjb21lIGFuIG9mZmljaWFsIEJyZWV6ZSBwbHVnaW4gaW4gZnV0dXJlXHJcbiAqIGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSBpbiB0aGlzIGZvcm0gb3Igd2l0aCB0aGlzIEFQSVxyXG4gKlxyXG4gKiBNdXN0IGNhbGwgRW50aXR5TWFuYWdlci5lbmFibGVTYXZlUXVldWluZyh0cnVlKSB0byB0dXJuIGl0IG9uO1xyXG4gKiBFbnRpdHlNYW5hZ2VyLmVuYWJsZVNhdmVRdWV1aW5nKGZhbHNlKSByZXN0b3JlcyB0aGUgbWFuYWdlcidzIG9yaWdpbmFsXHJcbiAqIHNhdmVDaGFuZ2VzIG1ldGhvZCBhcyBpdCB3YXMgYXQgdGhlIHRpbWUgc2F2ZVF1ZXVpbmcgd2FzIGZpcnN0IGVuYWJsZWQuXHJcbiAqXHJcbiAqIFRoaXMgbW9kdWxlIGFkZHMgXCJlbmFibGVTYXZlUXVldWluZ1wiIHRvIHRoZSBFbnRpdHlNYW5hZ2VyIHByb3RvdHlwZS5cclxuICogQ2FsbGluZyBcImVuYWJsZVNhdmVRdWV1aW5nKHRydWUpXCIgYWRkcyBhIG5ldyBfc2F2ZVF1ZXVpbmcgb2JqZWN0XHJcbiAqIHRvIHRoZSBtYW5hZ2VyIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBTZWUgRG9jQ29kZTpzYXZlUXVldWluZ1Rlc3RzLmpzXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9CcmVlemUvYnJlZXplLmpzLnNhbXBsZXMvYmxvYi9tYXN0ZXIvbmV0L0RvY0NvZGUvRG9jQ29kZS90ZXN0cy9zYXZlUXVldWluZ1Rlc3RzLmpzXHJcbiAqXHJcbiAqIExJTUlUQVRJT05TXHJcbiAqIC0gQ2FuJ3QgaGFuZGxlIGNoYW5nZXMgdG8gdGhlIHByaW1hcnkga2V5IChkYW5nZXJvdXMgaW4gYW55IGNhc2UpXHJcbiAqIC0gQXNzdW1lcyBwcm9taXNlcy4gRG9lcyBub3Qgc3VwcG9ydCB0aGUgKGRlcHJlY2F0ZWQpIHN1Y2Nlc3MgYW5kIGZhaWwgY2FsbGJhY2tzXHJcbiAqIC0gRG9lcyBub3QgcXVldWUgc2F2ZU9wdGlvbnMuIFRoZSBmaXJzdCBvbmUgaXMgcmUtdXNlZCBmb3IgYWxsIHF1ZXVlZCBzYXZlcy5cclxuICogLSBEb2VzIG5vdCBkZWFsIHdpdGggZXhwb3J0L2ltcG9ydCBvZiBlbnRpdGllcyB3aGlsZSBzYXZlIGlzIGluZmxpZ2h0XHJcbiAqIC0gRG9lcyBub3QgZGVhbCB3aXRoIHJlamVjdENoYW5nZXMgd2hpbGUgc2F2ZSBpcyBpbiBmbGlnaHRcclxuICogLSBEb2VzIG5vdCBzdXBwb3J0IHBhcmFsbGVsIHNhdmVzIGV2ZW4gd2hlbiB0aGUgY2hhbmdlLXNldHMgYXJlIGluZGVwZW5kZW50LlxyXG4gKiAgIFRoZSBuYXRpdmUgc2F2ZUNoYW5nZXMgYWxsb3dzIHN1Y2ggc2F2ZXMuXHJcbiAqICAgU2F2ZVF1ZXVpbmcgZG9lcyBub3Q7IHRvbyBjb21wbGV4IGFuZCBkb2Vzbid0IGZpdCB0aGUgcHJpbWFyeSBzY2VuYXJpbyBhbnl3YXkuXHJcbiAqIC0gVGhlIHJlc29sdmVkIHNhdmVSZXN1bHQgaXMgdGhlIHNhdmVSZXN1bHQgb2YgdGhlIGxhc3QgY29tcGxldGVkIHNhdmVcclxuICogLSBBIHF1ZXVlZCBzYXZlIHRoYXQgbWlnaHQgaGF2ZSBzdWNjZWVkZWQgaWYgc2F2ZWQgaW1tZWRpYXRlbHlcclxuICogICBtYXkgZmFpbCBiZWNhdXNlIHRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIGFjY2VwdHMgaXQgbGF0ZXJcclxuICogLSBQcmlvciB0byBCcmVlemUgdi4xLjUuMywgYSBxdWV1ZWQgc2F2ZSB0aGF0IG1pZ2h0IGhhdmUgc3VjY2VlZGVkXHJcbiAqICAgaWYgc2F2ZWQgaW1tZWRpYXRlbHkgd2lsbCBmYWlsIGlmIHN1YnNlcXVlbnRseSBhdHRlbXB0IHRvIHNhdmVcclxuICogICBhbiBpbnZhbGlkIGVudGl0eS4gQ2FuIGRldGVjdCBhbmQgY2lyY3VtdmVudCBhZnRlciB2LjEuNS4zLlxyXG4gKlxyXG4gKiBBbGwgbWVtYmVycyBvZiBFbnRpdHlNYW5hZ2VyLl9zYXZlUXVldWluZyBhcmUgaW50ZXJuYWw7XHJcbiAqIHRvdWNoIHRoZW0gYXQgeW91ciBvd24gcmlzay5cclxuICovXHJcbi8vI2VuZHJlZ2lvblxyXG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eU1hbmFnZXIsIEtleU1hcHBpbmcsIEVudGl0eVN0YXRlLCBTYXZlUmVzdWx0LCBicmVlemUgfSBmcm9tICdicmVlemUtY2xpZW50JztcclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlU2F2ZVF1ZXVpbmcoZW06IEVudGl0eU1hbmFnZXIsIGVuYWJsZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICBsZXQgc2F2ZVF1ZXVpbmcgPSBlbVsnX3NhdmVRdWV1ZWluZyddIHx8XHJcbiAgICAoZW1bJ19zYXZlUXVldWluZyddID0gbmV3IFNhdmVRdWV1aW5nKGVtKSk7XHJcblxyXG4gIGVuYWJsZSA9IChlbmFibGUgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogZW5hYmxlO1xyXG4gIHNhdmVRdWV1aW5nLl9pc0VuYWJsZWQgPSBlbmFibGU7XHJcbiAgaWYgKGVuYWJsZSkge1xyXG4gICAgLy8gZGVsZWdhdGUgdG8gc2F2ZSBjaGFuZ2VzIHF1ZXVpbmdcclxuICAgIGVtLnNhdmVDaGFuZ2VzID0gc2F2ZUNoYW5nZXNXaXRoUXVldWluZztcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gcmV2ZXJ0IHRvIHRoZSBuYXRpdmUgRW50aXR5TWFuYWdlci5zYXZlQ2hhbmdlc1xyXG4gICAgZW0uc2F2ZUNoYW5nZXMgPSBlbVsnX3NhdmVRdWV1aW5nJ10uYmFzZVNhdmVDaGFuZ2VzO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcGxhY2VtZW50IGZvciBFbnRpdHlNYW5hZ2VyLnNhdmVDaGFuZ2VzXHJcbiAqIFRoaXMgdmVyc2lvbiBxdWV1ZXMgc2F2ZUNoYW5nZXMgY2FsbHMgd2hpbGUgYSByZWFsIHNhdmUgaXMgaW4gcHJvZ3Jlc3NcclxuICoqL1xyXG5mdW5jdGlvbiBzYXZlQ2hhbmdlc1dpdGhRdWV1aW5nKGVudGl0aWVzOiBFbnRpdHlbXSB8IG51bGwsIHNhdmVPcHRpb25zOiBhbnkpIHtcclxuICB0cnkge1xyXG4gICAgLy8gYHRoaXNgIGlzIGFuIEVudGl0eU1hbmFnZXJcclxuICAgIGxldCBzYXZlUXVldWluZyA9IHRoaXMuX3NhdmVRdWV1aW5nO1xyXG4gICAgaWYgKHNhdmVRdWV1aW5nLmlzU2F2aW5nKSB7XHJcbiAgICAgIC8vIHNhdmUgaW4gcHJvZ3Jlc3M7IHF1ZXVlIHRoZSBzYXZlIGZvciBsYXRlclxyXG4gICAgICByZXR1cm4gc2F2ZVF1ZXVpbmcucXVldWVTYXZlQ2hhbmdlcyhlbnRpdGllcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBub3RlIHRoYXQgc2F2ZSBpcyBpbiBwcm9ncmVzczsgdGhlbiBzYXZlXHJcbiAgICAgIHNhdmVRdWV1aW5nLmlzU2F2aW5nID0gdHJ1ZTtcclxuICAgICAgc2F2ZVF1ZXVpbmcuc2F2ZU9wdGlvbnMgPSBzYXZlT3B0aW9ucztcclxuICAgICAgcmV0dXJuIHNhdmVRdWV1aW5nLnNhdmVDaGFuZ2VzKGVudGl0aWVzLCBzYXZlT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLy8vLy8vLyBTYXZlUXVldWluZyAvLy8vLy8vLy9cclxuY2xhc3MgU2F2ZVF1ZXVpbmcge1xyXG4gIGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXI7XHJcbiAgYmFzZVNhdmVDaGFuZ2VzOiAoKSA9PiBQcm9taXNlPGFueT47XHJcbiAgaXNTYXZpbmc6IGJvb2xlYW47XHJcbiAgX2lzRW5hYmxlZDogYm9vbGVhbjtcclxuICBhY3RpdmVTYXZlRGVmZXJyZWQ6IERlZmVycmVkPFNhdmVSZXN1bHQ+O1xyXG4gIG5leHRTYXZlRGVmZXJyZWQ6IERlZmVycmVkPFNhdmVSZXN1bHQ+O1xyXG4gIGFjdGl2ZVNhdmVNZW1vOiBTYXZlTWVtbztcclxuICBuZXh0U2F2ZU1lbW86IFNhdmVNZW1vO1xyXG4gIHNhdmVPcHRpb25zOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXIpIHtcclxuICAgIHRoaXMuZW50aXR5TWFuYWdlciA9IGVudGl0eU1hbmFnZXI7XHJcbiAgICB0aGlzLmJhc2VTYXZlQ2hhbmdlcyA9IGVudGl0eU1hbmFnZXIuc2F2ZUNoYW5nZXM7XHJcbiAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc0VuYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNFbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2F2ZWROb3RoaW5nUmVzdWx0KCk6IFNhdmVSZXN1bHQge1xyXG4gICAgcmV0dXJuIHsgZW50aXRpZXM6IFtdIGFzIEVudGl0eVtdLCBrZXlNYXBwaW5nczogW10gYXMgS2V5TWFwcGluZ1tdIH07XHJcbiAgfVxyXG5cclxuICBxdWV1ZVNhdmVDaGFuZ2VzKGVudGl0aWVzOiBFbnRpdHlbXSkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWluZ1xyXG4gICAgbGV0IGVtID0gc2VsZi5lbnRpdHlNYW5hZ2VyO1xyXG5cclxuICAgIGxldCBjaGFuZ2VzID0gZW50aXRpZXMgfHwgZW0uZ2V0Q2hhbmdlcygpO1xyXG4gICAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5nZXRTYXZlZE5vdGhpbmdSZXN1bHQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHZhbEVycm9yID0gZW0uc2F2ZUNoYW5nZXNWYWxpZGF0ZU9uQ2xpZW50KGNoYW5nZXMpO1xyXG4gICAgaWYgKHZhbEVycm9yKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWxFcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNhdmVNZW1vID0gc2VsZi5uZXh0U2F2ZU1lbW8gfHwgKHNlbGYubmV4dFNhdmVNZW1vID0gbmV3IFNhdmVNZW1vKCkpO1xyXG4gICAgbWVtb2l6ZUNoYW5nZXMoKTtcclxuICAgIGxldCBkZWZlcnJlZCA9IHNlbGYubmV4dFNhdmVEZWZlcnJlZCB8fCAoc2VsZi5uZXh0U2F2ZURlZmVycmVkID0gbmV3IERlZmVycmVkPFNhdmVSZXN1bHQ+KCkpO1xyXG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcblxyXG4gICAgZnVuY3Rpb24gbWVtb2l6ZUNoYW5nZXMoKSB7XHJcbiAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cclxuICAgICAgbGV0IHF1ZXVlZENoYW5nZXMgPSBzYXZlTWVtby5xdWV1ZWRDaGFuZ2VzO1xyXG4gICAgICBjaGFuZ2VzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgaWYgKCFlLmVudGl0eUFzcGVjdC5pc0JlaW5nU2F2ZWQgJiYgcXVldWVkQ2hhbmdlcy5pbmRleE9mKGUpID09PSAtMSkge1xyXG4gICAgICAgICAgcXVldWVkQ2hhbmdlcy5wdXNoKGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzYXZlTWVtby51cGRhdGVFbnRpdHlNZW1vcyhjaGFuZ2VzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhdmVDaGFuZ2VzKGVudGl0aWVzOiBFbnRpdHlbXSwgc2F2ZU9wdGlvbnM6IGFueSkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWluZ1xyXG4gICAgbGV0IHByb21pc2UgPSBzZWxmLmJhc2VTYXZlQ2hhbmdlcy5jYWxsKHNlbGYuZW50aXR5TWFuYWdlciwgZW50aXRpZXMsIHNhdmVPcHRpb25zIHx8IHNlbGYuc2F2ZU9wdGlvbnMpXHJcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChzYXZlUmVzdWx0OiBTYXZlUmVzdWx0KSB7IHJldHVybiBzZWxmLnNhdmVTdWNjZWVkZWQoc2F2ZVJlc3VsdCk7IH0pXHJcbiAgICAgIC50aGVuKG51bGwsIGZ1bmN0aW9uIChlcnJvcjogRXJyb3IpIHsgY29uc29sZS5sb2coZXJyb3IpOyByZXR1cm4gc2VsZi5zYXZlRmFpbGVkKGVycm9yKTsgfSk7XHJcbiAgICByZW1lbWJlckFkZGVkT3JpZ2luYWxWYWx1ZXMoZW50aXRpZXMpOyAvLyBkbyBpdCBhZnRlciAuLi4gc28gZG9uJ3Qgc2VuZCBPcmlnVmFsdWVzIHRvIHRoZSBzZXJ2ZXJcclxuICAgIHJldHVybiBwcm9taXNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJlbWVtYmVyQWRkZWRPcmlnaW5hbFZhbHVlcyhlbnRpdGllczogRW50aXR5W10pIHtcclxuICAgICAgLy8gYWRkZWQgZW50aXRpZXMgbm9ybWFsbHkgZG9uJ3QgaGF2ZSBvcmlnaW5hbCB2YWx1ZXMgYnV0IHRoZXNlIHdpbGwgbm93XHJcbiAgICAgIGxldCBhZGRlZCA9IGVudGl0aWVzID9cclxuICAgICAgICBlbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzQWRkZWQoKTsgfSkgOlxyXG4gICAgICAgIHNlbGYuZW50aXR5TWFuYWdlci5nZXRFbnRpdGllcyhudWxsLCBFbnRpdHlTdGF0ZS5BZGRlZCk7XHJcbiAgICAgIGFkZGVkLmZvckVhY2goZW50aXR5ID0+IHtcclxuICAgICAgICBsZXQgcHJvcHMgPSBlbnRpdHkuZW50aXR5VHlwZS5kYXRhUHJvcGVydGllcztcclxuICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZXMgPSBlbnRpdHkuZW50aXR5QXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgICAgIHByb3BzLmZvckVhY2goZHAgPT4ge1xyXG4gICAgICAgICAgaWYgKGRwLmlzUGFydE9mS2V5KSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZXNbZHAubmFtZV0gPSBlbnRpdHkuZ2V0UHJvcGVydHkoZHAubmFtZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHNhdmVTdWNjZWVkZWQoc2F2ZVJlc3VsdDogU2F2ZVJlc3VsdCkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWVpbmdcclxuICAgIGxldCBhY3RpdmVTYXZlRGVmZXJyZWQgPSBzZWxmLmFjdGl2ZVNhdmVEZWZlcnJlZDtcclxuICAgIGxldCBuZXh0U2F2ZURlZmVycmVkID0gc2VsZi5uZXh0U2F2ZURlZmVycmVkO1xyXG4gICAgbGV0IG5leHRTYXZlTWVtbyA9IHNlbGYubmV4dFNhdmVNZW1vO1xyXG5cclxuXHJcbiAgICAvLyBwcmVwYXJlIGFzIGlmIG5vdGhpbmcgcXVldWVkIG9yIGxlZnQgdG8gc2F2ZVxyXG4gICAgc2VsZi5pc1NhdmluZyA9IGZhbHNlO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlTWVtbyA9IG51bGw7XHJcbiAgICBzZWxmLm5leHRTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5uZXh0U2F2ZU1lbW8gPSBudWxsO1xyXG5cclxuICAgIGlmIChuZXh0U2F2ZU1lbW8pIHtcclxuICAgICAgLy8gYSBzYXZlIHdhcyBxdWV1ZWQgc2luY2UgbGFzdCBzYXZlIHJldHVybmVkXHJcbiAgICAgIG5leHRTYXZlTWVtby5wa0ZpeHVwKHNhdmVSZXN1bHQua2V5TWFwcGluZ3MpO1xyXG4gICAgICBuZXh0U2F2ZU1lbW8uYXBwbHlUb1NhdmVkRW50aXRpZXMoc2VsZi5lbnRpdHlNYW5hZ2VyLCBzYXZlUmVzdWx0LmVudGl0aWVzKTtcclxuICAgICAgLy8gcmVtb3ZlIGRldGFjaGVkIGVudGl0aWVzIGZyb20gcXVldWVkQ2hhbmdlc1xyXG4gICAgICBsZXQgcXVldWVkQ2hhbmdlcyA9IG5leHRTYXZlTWVtby5xdWV1ZWRDaGFuZ2VzLmZpbHRlcihlID0+IHtcclxuICAgICAgICByZXR1cm4gIWUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzRGV0YWNoZWQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAocXVldWVkQ2hhbmdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gc2F2ZSBhZ2FpblxyXG4gICAgICAgIHNlbGYuaXNTYXZpbmcgPSB0cnVlO1xyXG4gICAgICAgIC8vIHJlbWVtYmVyIHRoZSBxdWV1ZWQgY2hhbmdlcyB0aGF0IHRyaWdnZXJlZCB0aGlzIHNhdmVcclxuICAgICAgICBzZWxmLmFjdGl2ZVNhdmVEZWZlcnJlZCA9IG5leHRTYXZlRGVmZXJyZWQ7XHJcbiAgICAgICAgc2VsZi5hY3RpdmVTYXZlTWVtbyA9IG5leHRTYXZlTWVtbztcclxuICAgICAgICBzZWxmLnNhdmVDaGFuZ2VzKHF1ZXVlZENoYW5nZXMsIHRoaXMuc2F2ZU9wdGlvbnMpO1xyXG4gICAgICB9IGVsc2UgaWYgKG5leHRTYXZlRGVmZXJyZWQpIHtcclxuICAgICAgICBuZXh0U2F2ZURlZmVycmVkLnJlc29sdmUodGhpcy5nZXRTYXZlZE5vdGhpbmdSZXN1bHQoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWN0aXZlU2F2ZURlZmVycmVkKSB7IGFjdGl2ZVNhdmVEZWZlcnJlZC5yZXNvbHZlKHNhdmVSZXN1bHQpOyB9XHJcbiAgICByZXR1cm4gc2F2ZVJlc3VsdDsgIC8vIGZvciB0aGUgY3VycmVudCBwcm9taXNlIGNoYWluXHJcbiAgfVxyXG5cclxuICBzYXZlRmFpbGVkKGVycm9yOiBFcnJvcikge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWVpbmdcclxuICAgIGVycm9yID0gbmV3IFF1ZXVlZFNhdmVGYWlsZWRFcnJvcihlcnJvciwgc2VsZik7XHJcblxyXG4gICAgbGV0IGFjdGl2ZVNhdmVEZWZlcnJlZCA9IHNlbGYuYWN0aXZlU2F2ZURlZmVycmVkO1xyXG4gICAgbGV0IG5leHRTYXZlRGVmZXJyZWQgPSBzZWxmLm5leHRTYXZlRGVmZXJyZWQ7XHJcblxyXG4gICAgc2VsZi5pc1NhdmluZyA9IGZhbHNlO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlTWVtbyA9IG51bGw7XHJcbiAgICBzZWxmLm5leHRTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5uZXh0U2F2ZU1lbW8gPSBudWxsO1xyXG5cclxuICAgIGlmIChhY3RpdmVTYXZlRGVmZXJyZWQpIHsgYWN0aXZlU2F2ZURlZmVycmVkLnJlamVjdChlcnJvcik7IH1cclxuICAgIGlmIChuZXh0U2F2ZURlZmVycmVkKSB7IG5leHRTYXZlRGVmZXJyZWQucmVqZWN0KGVycm9yKTsgfVxyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7IC8vIGxldCBwcm9taXNlIGNoYWluIGhlYXIgZXJyb3JcclxuICB9XHJcbn1cclxuXHJcbi8vLyBmb3IgYmFja3dhcmQgY29tcGF0IHdpdGggb2xkZXIgUHJvbWlzZSBpbXBsZW1lbnRhdGlvblxyXG5jbGFzcyBEZWZlcnJlZDxUPiB7XHJcbiAgcmVzb2x2ZTogKHZhbDogYW55KSA9PiB2b2lkO1xyXG4gIHJlamVjdDogKGVycjogYW55KSA9PiB2b2lkO1xyXG4gIHByb21pc2U6IFByb21pc2U8VD47XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZTxUPihmdW5jdGlvbiAocmVzb2x2ZTogKHZhbDogYW55KSA9PiB2b2lkLCByZWplY3Q6IChlcnI6IGFueSkgPT4gdm9pZCkge1xyXG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcclxuICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuLy8vLy8vLy8vLyBRdWV1ZWRTYXZlRmFpbGVkRXJyb3IgLy8vLy8vLy8vXHJcbi8vIEVycm9yIHN1Yi1jbGFzcyB0aHJvd24gd2hlbiByZWplY3RpbmcgcXVldWVkIHNhdmVzLlxyXG5leHBvcnQgY2xhc3MgUXVldWVkU2F2ZUZhaWxlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIG5hbWUgPSBcIlF1ZXVlZFNhdmVGYWlsZWRFcnJvclwiO1xyXG4gIGlubmVyRXJyb3I6IEVycm9yO1xyXG4gIG1lc3NhZ2U6IHN0cmluZztcclxuICBmYWlsZWRTYXZlTWVtbzogU2F2ZU1lbW87XHJcbiAgbmV4dFNhdmVNZW1vOiBTYXZlTWVtbztcclxuXHJcbiAgLy8gRXJyb3Igc3ViLWNsYXNzIHRocm93biB3aGVuIHJlamVjdGluZyBxdWV1ZWQgc2F2ZXMuXHJcbiAgLy8gYGlubmVyRXJyb3JgIGlzIHRoZSBhY3R1YWwgc2F2ZSBlcnJvclxyXG4gIC8vIGBmYWlsZWRTYXZlTWVtb2AgaXMgdGhlIHNhdmVNZW1vIHRoYXQgcHJvbXB0ZWQgdGhpcyBzYXZlXHJcbiAgLy8gYG5leHRTYXZlTWVtb2AgaG9sZHMgcXVldWVkIGNoYW5nZXMgYWNjdW11bGF0ZWQgc2luY2UgdGhhdCBzYXZlLlxyXG4gIC8vIFlvdSBtYXkgdHJ5IHRvIHJlY292ZXIgdXNpbmcgdGhpcyBpbmZvLiBHb29kIGx1Y2sgd2l0aCB0aGF0LlxyXG4gIGNvbnN0cnVjdG9yKGVyck9iamVjdDogRXJyb3IsIHNhdmVRdWV1aW5nOiBhbnkpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmlubmVyRXJyb3IgPSBlcnJPYmplY3Q7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSBcIlF1ZXVlZCBzYXZlIGZhaWxlZDogXCIgKyBlcnJPYmplY3QubWVzc2FnZTtcclxuICAgIHRoaXMuZmFpbGVkU2F2ZU1lbW8gPSBzYXZlUXVldWluZy5hY3RpdmVTYXZlTWVtbztcclxuICAgIHRoaXMubmV4dFNhdmVNZW1vID0gc2F2ZVF1ZXVpbmcubmV4dFNhdmVNZW1vO1xyXG4gIH1cclxufVxyXG5cclxuLy8vLy8vLy8vLyBTYXZlTWVtbyAvLy8vLy8vLy8vLy8vLy8vXHJcbi8vIFNhdmVNZW1vIGlzIGEgcmVjb3JkIG9mIGNoYW5nZXMgZm9yIGEgcXVldWVkIHNhdmUsIGNvbnNpc3Rpbmcgb2Y6XHJcbi8vICAgZW50aXR5TWVtb3M6ICAgaW5mbyBhYm91dCBlbnRpdGllcyB0aGF0IGFyZSBiZWluZyBzYXZlZCBhbmRcclxuLy8gICAgICAgICAgICAgICAgICBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSB0aGUgc2F2ZSBzdGFydGVkXHJcbi8vICAgcXVldWVkQ2hhbmdlczogZW50aXRpZXMgdGhhdCBhcmUgcXVldWVkIGZvciBzYXZlIGJ1dFxyXG4vLyAgICAgICAgICAgICAgICAgIGFyZSBub3QgY3VycmVudGx5IGJlaW5nIHNhdmVkXHJcbmNsYXNzIFNhdmVNZW1vIHtcclxuICBlbnRpdHlNZW1vczogeyBba2V5OiBzdHJpbmddOiBFbnRpdHlNZW1vIH07XHJcbiAgcXVldWVkQ2hhbmdlczogRW50aXR5W107XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmVudGl0eU1lbW9zID0ge307XHJcbiAgICB0aGlzLnF1ZXVlZENoYW5nZXMgPSBbXTtcclxuICB9XHJcblxyXG4gIGFwcGx5VG9TYXZlZEVudGl0aWVzKGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXIsIHNhdmVkRW50aXRpZXM6IEVudGl0eVtdKSB7XHJcbiAgICBsZXQgZW50aXR5TWVtb3MgPSB0aGlzLmVudGl0eU1lbW9zOyAvLyBgdGhpc2AgaXMgYSBTYXZlTWVtb1xyXG4gICAgbGV0IHF1ZXVlZENoYW5nZXMgPSB0aGlzLnF1ZXVlZENoYW5nZXM7XHJcbiAgICBsZXQgcmVzdG9yZVB1Ymxpc2hpbmcgPSB0aGlzLmRpc2FibGVNYW5hZ2VyUHVibGlzaGluZyhlbnRpdHlNYW5hZ2VyKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHNhdmVkRW50aXRpZXMuZm9yRWFjaChzYXZlZCA9PiB7XHJcbiAgICAgICAgbGV0IGtleSA9IHRoaXMubWFrZUVudGl0eU1lbW9LZXkoc2F2ZWQpO1xyXG4gICAgICAgIGxldCBlbnRpdHlNZW1vID0gZW50aXR5TWVtb3Nba2V5XTtcclxuICAgICAgICBsZXQgcmVzYXZlID0gZW50aXR5TWVtbyAmJiBlbnRpdHlNZW1vLmFwcGx5VG9TYXZlZEVudGl0eShzYXZlZCk7XHJcbiAgICAgICAgaWYgKHJlc2F2ZSkge1xyXG4gICAgICAgICAgcXVldWVkQ2hhbmdlcy5wdXNoKHNhdmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgcmVzdG9yZVB1Ymxpc2hpbmcoKTtcclxuICAgICAgLy8gRCMyNjUxIGhhc0NoYW5nZXMgd2lsbCBiZSB3cm9uZyBpZiBjaGFuZ2VzIG1hZGUgd2hpbGUgc2F2ZSBpbiBwcm9ncmVzc1xyXG4gICAgICBsZXQgaGFzQ2hhbmdlcyA9IHF1ZXVlZENoYW5nZXMubGVuZ3RoID4gMDtcclxuICAgICAgLy8gTXVzdCB1c2UgYnJlZXplIGludGVybmFsIG1ldGhvZCB0byBwcm9wZXJseSBzZXQgdGhpcyBmbGFnIHRydWVcclxuICAgICAgaWYgKGhhc0NoYW5nZXMpIHsgZW50aXR5TWFuYWdlci5fc2V0SGFzQ2hhbmdlcyh0cnVlKTsgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNhYmxlTWFuYWdlclB1Ymxpc2hpbmcobWFuYWdlcjogRW50aXR5TWFuYWdlcikge1xyXG4gICAgbGV0IEV2ZW50ID0gYnJlZXplLkV2ZW50O1xyXG4gICAgRXZlbnQuZW5hYmxlKCdlbnRpdHlDaGFuZ2VkJywgbWFuYWdlciwgZmFsc2UpO1xyXG4gICAgRXZlbnQuZW5hYmxlKCdoYXNDaGFuZ2VzQ2hhbmdlZCcsIG1hbmFnZXIsIGZhbHNlKTtcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVzdG9yZVB1Ymxpc2hpbmcoKSB7XHJcbiAgICAgIEV2ZW50LmVuYWJsZSgnZW50aXR5Q2hhbmdlZCcsIG1hbmFnZXIsIHRydWUpO1xyXG4gICAgICBFdmVudC5lbmFibGUoJ2hhc0NoYW5nZXNDaGFuZ2VkJywgbWFuYWdlciwgdHJ1ZSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcGtGaXh1cChrZXlNYXBwaW5nczogS2V5TWFwcGluZ1tdKSB7XHJcbiAgICBsZXQgZW50aXR5TWVtb3MgPSB0aGlzLmVudGl0eU1lbW9zOyAgLy8gYHRoaXNgIGlzIGEgU2F2ZU1lbW9cclxuICAgIGtleU1hcHBpbmdzLmZvckVhY2goa20gPT4ge1xyXG4gICAgICBsZXQgdHlwZSA9IGttLmVudGl0eVR5cGVOYW1lO1xyXG4gICAgICBsZXQgdGVtcEtleSA9IHR5cGUgKyAnfCcgKyBrbS50ZW1wVmFsdWU7XHJcbiAgICAgIGlmIChlbnRpdHlNZW1vc1t0ZW1wS2V5XSkge1xyXG4gICAgICAgIGVudGl0eU1lbW9zW3R5cGUgKyAnfCcgKyBrbS5yZWFsVmFsdWVdID0gZW50aXR5TWVtb3NbdGVtcEtleV07XHJcbiAgICAgICAgZGVsZXRlIGVudGl0eU1lbW9zW3RlbXBLZXldO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IG1lbW9LZXkgaW4gZW50aXR5TWVtb3MpIHtcclxuICAgICAgICBlbnRpdHlNZW1vc1ttZW1vS2V5XS5ma0ZpeHVwKGttKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBtYWtlRW50aXR5TWVtb0tleShlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgbGV0IGVudGl0eUtleSA9IGVudGl0eS5lbnRpdHlBc3BlY3QuZ2V0S2V5KCk7XHJcbiAgICByZXR1cm4gZW50aXR5S2V5LmVudGl0eVR5cGUubmFtZSArICd8JyArIGVudGl0eUtleS52YWx1ZXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFbnRpdHlNZW1vcyhjaGFuZ2VzOiBFbnRpdHlbXSkge1xyXG4gICAgbGV0IGVudGl0eU1lbW9zID0gdGhpcy5lbnRpdHlNZW1vczsgIC8vIGB0aGlzYCBpcyBhIFNhdmVNZW1vXHJcbiAgICBjaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcclxuICAgICAgLy8gb25seSB1cGRhdGUgZW50aXR5TWVtbyBmb3IgZW50aXR5IGJlaW5nIHNhdmVcclxuICAgICAgaWYgKCFjaGFuZ2UuZW50aXR5QXNwZWN0LmlzQmVpbmdTYXZlZCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgIGxldCBrZXkgPSB0aGlzLm1ha2VFbnRpdHlNZW1vS2V5KGNoYW5nZSk7XHJcbiAgICAgIGxldCBlbnRpdHlNZW1vID0gZW50aXR5TWVtb3Nba2V5XSB8fCAoZW50aXR5TWVtb3Nba2V5XSA9IG5ldyBFbnRpdHlNZW1vKGNoYW5nZSkpO1xyXG4gICAgICBlbnRpdHlNZW1vLnVwZGF0ZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG4vLy8vLy8vLy8gRW50aXR5TWVtbyBUeXBlIC8vLy8vLy8vLy8vLy8vL1xyXG4vLyBJbmZvcm1hdGlvbiBhYm91dCBhbiBlbnRpdHkgdGhhdCBpcyBiZWluZyBzYXZlZFxyXG4vLyBhbmQgd2hpY2ggaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSB0aGF0IHNhdmUgc3RhcnRlZFxyXG5jbGFzcyBFbnRpdHlNZW1vIHtcclxuICBlbnRpdHk6IEVudGl0eTtcclxuICBwZW5kaW5nQ2hhbmdlczogYW55O1xyXG4gIGlzRGVsZXRlZDogYm9vbGVhbjtcclxuICBjb25zdHJ1Y3RvcihlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XHJcbiAgICB0aGlzLnBlbmRpbmdDaGFuZ2VzID0ge307XHJcbiAgfVxyXG5cclxuXHJcbiAgYXBwbHlUb1NhdmVkRW50aXR5KHNhdmVkOiBFbnRpdHkpIHtcclxuICAgIGxldCBlbnRpdHlNZW1vID0gdGhpcztcclxuICAgIGxldCBhc3BlY3QgPSBzYXZlZC5lbnRpdHlBc3BlY3Q7XHJcbiAgICBpZiAoYXNwZWN0LmVudGl0eVN0YXRlLmlzRGV0YWNoZWQoKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKGVudGl0eU1lbW8uaXNEZWxldGVkKSB7XHJcbiAgICAgIGFzcGVjdC5zZXREZWxldGVkKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLy8gdHJlYXQgZW50aXR5IHdpdGggcGVuZGluZyBjaGFuZ2VzIGFzIG1vZGlmaWVkXHJcbiAgICBsZXQgcHJvcHMgPSBPYmplY3Qua2V5cyhlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzKTtcclxuICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgbGV0IG9yaWdpbmFsVmFsdWVzID0gYXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgcHJvcHMuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgb3JpZ2luYWxWYWx1ZXNbbmFtZV0gPSBzYXZlZC5nZXRQcm9wZXJ0eShuYW1lKTtcclxuICAgICAgc2F2ZWQuc2V0UHJvcGVydHkobmFtZSwgZW50aXR5TWVtby5wZW5kaW5nQ2hhbmdlc1tuYW1lXSk7XHJcbiAgICB9KTtcclxuICAgIGFzcGVjdC5zZXRNb2RpZmllZCgpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBma0ZpeHVwKGtleU1hcHBpbmc6IEtleU1hcHBpbmcpIHtcclxuICAgIGxldCBlbnRpdHlNZW1vID0gdGhpcztcclxuICAgIGxldCB0eXBlID0gZW50aXR5TWVtby5lbnRpdHkuZW50aXR5VHlwZTtcclxuICAgIGxldCBma1Byb3BzID0gdHlwZS5mb3JlaWduS2V5UHJvcGVydGllcztcclxuICAgIGZrUHJvcHMuZm9yRWFjaChma1Byb3AgPT4ge1xyXG4gICAgICBpZiAoZmtQcm9wLnBhcmVudFR5cGUubmFtZSA9PT0ga2V5TWFwcGluZy5lbnRpdHlUeXBlTmFtZSAmJlxyXG4gICAgICAgIGVudGl0eU1lbW8ucGVuZGluZ0NoYW5nZXNbZmtQcm9wLm5hbWVdID09PSBrZXlNYXBwaW5nLnRlbXBWYWx1ZSkge1xyXG4gICAgICAgIGVudGl0eU1lbW8ucGVuZGluZ0NoYW5nZXNbZmtQcm9wLm5hbWVdID0ga2V5TWFwcGluZy5yZWFsVmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gdXBkYXRlIHRoZSBlbnRpdHlNZW1vIG9mIGNoYW5nZXMgdG8gYW4gZW50aXR5IGJlaW5nIHNhdmVkXHJcbiAgLy8gc28gdGhhdCB3ZSBrbm93IGhvdyB0byBzYXZlIGl0IGFnYWluIGxhdGVyXHJcbiAgdXBkYXRlKCkge1xyXG4gICAgbGV0IGVudGl0eU1lbW8gPSB0aGlzO1xyXG4gICAgbGV0IHByb3BzO1xyXG4gICAgbGV0IGVudGl0eSA9IGVudGl0eU1lbW8uZW50aXR5O1xyXG4gICAgbGV0IGFzcGVjdCA9IGVudGl0eS5lbnRpdHlBc3BlY3Q7XHJcbiAgICBsZXQgc3RhdGVOYW1lID0gYXNwZWN0LmVudGl0eVN0YXRlLm5hbWU7XHJcbiAgICBzd2l0Y2ggKHN0YXRlTmFtZSkge1xyXG4gICAgICBjYXNlICdBZGRlZCc6XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWVzID0gYXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgICAgIHByb3BzID0gZW50aXR5LmVudGl0eVR5cGUuZGF0YVByb3BlcnRpZXM7XHJcbiAgICAgICAgcHJvcHMuZm9yRWFjaChkcCA9PiB7XHJcbiAgICAgICAgICBpZiAoZHAuaXNQYXJ0T2ZLZXkpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICBsZXQgbmFtZSA9IGRwLm5hbWU7XHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSBlbnRpdHkuZ2V0UHJvcGVydHkobmFtZSk7XHJcbiAgICAgICAgICBpZiAob3JpZ2luYWxWYWx1ZXNbbmFtZV0gIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGVudGl0eU1lbW8ucGVuZGluZ0NoYW5nZXNbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ0RlbGV0ZWQnOlxyXG4gICAgICAgIGVudGl0eU1lbW8uaXNEZWxldGVkID0gdHJ1ZTtcclxuICAgICAgICBlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzID0ge307XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdNb2RpZmllZCc6XHJcbiAgICAgICAgcHJvcHMgPSBPYmplY3Qua2V5cyhhc3BlY3Qub3JpZ2luYWxWYWx1ZXMpO1xyXG4gICAgICAgIHByb3BzLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgICBlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzW25hbWVdID0gZW50aXR5LmdldFByb3BlcnR5KG5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|
package/esm5/src/array.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { makeRelationArray } from './relation-array';
|
|
2
2
|
export { makeComplexArray } from './complex-array';
|
|
3
3
|
export { makePrimitiveArray } from './primitive-array';
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL2FycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgbWFrZVJlbGF0aW9uQXJyYXkgfSBmcm9tICcuL3JlbGF0aW9uLWFycmF5JztcclxuZXhwb3J0IHsgbWFrZUNvbXBsZXhBcnJheSB9IGZyb20gJy4vY29tcGxleC1hcnJheSc7XHJcbmV4cG9ydCB7IG1ha2VQcmltaXRpdmVBcnJheSB9IGZyb20gJy4vcHJpbWl0aXZlLWFycmF5JztcclxuIl19
|