payload-auth 1.6.3 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/adapter/transform/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/adapter/transform/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAG3D,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,SAAS,CAAA;AAEpE,eAAO,MAAM,eAAe,GAAI,SAAS,iBAAiB,EAAE,iBAAiB,OAAO;0BAqErD,QAAQ,SAAS,MAAM,KAAG,MAAM;+BAlC3B,QAAQ,KAAG,cAAc;2BAoG7B,YAAY;8CAwIvC;QACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACzB,KAAK,EAAE,QAAQ,CAAA;QACf,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAA;KAC1B,KAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;sBAqDE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,kBAAkB;QAAE,GAAG,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAA;KAAE,KAAG,CAAC;mDAyMxD;QAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAA;KAAE,KAAG,YAAY;2BAmFtG,QAAQ,WAAW,MAAM,EAAE;yBA2B7B,QAAQ,WAAW;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,KAAG,MAAM,GAAG,SAAS;CAiBjH,CAAA"}
|
|
@@ -114,28 +114,6 @@ export const createTransform = (options, enableDebugLogs)=>{
|
|
|
114
114
|
return schemaFields[fieldKey]?.references !== undefined;
|
|
115
115
|
}
|
|
116
116
|
/**
|
|
117
|
-
* Determines if a value is a valid date string that can be parsed into a Date object.
|
|
118
|
-
*
|
|
119
|
-
* This utility function checks if a value is a string and can be successfully parsed
|
|
120
|
-
* into a JavaScript Date object using Date.parse(). It's used to identify date fields
|
|
121
|
-
* during data transformation processes.
|
|
122
|
-
*
|
|
123
|
-
* @param value - The value to check if it's a valid date string
|
|
124
|
-
* @returns True if the value is a string that can be parsed as a date, false otherwise
|
|
125
|
-
*
|
|
126
|
-
* @example
|
|
127
|
-
* // Returns true for ISO date strings
|
|
128
|
-
* isDateField('2023-01-01T12:00:00Z') // true
|
|
129
|
-
*
|
|
130
|
-
* @example
|
|
131
|
-
* // Returns false for non-date strings or other types
|
|
132
|
-
* isDateField('not a date') // false
|
|
133
|
-
* isDateField(123) // false
|
|
134
|
-
*/ function isDateField(value) {
|
|
135
|
-
// Check if value is a string and can be parsed as a valid date
|
|
136
|
-
return typeof value === 'string' && !isNaN(Date.parse(value));
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
117
|
* Extracts a single ID value from a Payload where clause if it represents a simple ID query.
|
|
140
118
|
*
|
|
141
119
|
* This function analyzes a Payload where clause to determine if it's a simple query for a
|
|
@@ -345,6 +323,7 @@ export const createTransform = (options, enableDebugLogs)=>{
|
|
|
345
323
|
const schemaFields = schema?.[model]?.fields ?? {};
|
|
346
324
|
// Identify relationship fields with custom field name mappings
|
|
347
325
|
const relationshipFields = Object.fromEntries(Object.entries(schemaFields).filter(([key])=>isRelationshipField(key, schemaFields)));
|
|
326
|
+
const dateFields = Object.fromEntries(Object.entries(schemaFields).filter(([_, value])=>value.type === 'date'));
|
|
348
327
|
Object.entries(doc).forEach(([key, value])=>{
|
|
349
328
|
if (value === null || value === undefined) return;
|
|
350
329
|
// Convert ID fields to strings for BetterAuth compatibility
|
|
@@ -361,8 +340,9 @@ export const createTransform = (options, enableDebugLogs)=>{
|
|
|
361
340
|
normalizeDocumentIds(result, originalRelatedFieldKey, key, value);
|
|
362
341
|
return;
|
|
363
342
|
}
|
|
364
|
-
|
|
365
|
-
if (
|
|
343
|
+
const originalDateFieldKey = Object.keys(dateFields).find((k)=>dateFields[k].fieldName === key);
|
|
344
|
+
if (originalDateFieldKey) {
|
|
345
|
+
// Convert ISO date strings to Date objects for BetterAuth
|
|
366
346
|
result[key] = new Date(value);
|
|
367
347
|
return;
|
|
368
348
|
}
|
|
@@ -664,4 +644,4 @@ export const createTransform = (options, enableDebugLogs)=>{
|
|
|
664
644
|
};
|
|
665
645
|
};
|
|
666
646
|
|
|
667
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB0eXBlIHsgTW9kZWxLZXkgfSBmcm9tICdAL2JldHRlci1hdXRoL2dlbmVyYXRlZC10eXBlcydcbmltcG9ydCB0eXBlIHsgQmV0dGVyQXV0aE9wdGlvbnMsIFdoZXJlIH0gZnJvbSAnYmV0dGVyLWF1dGgnXG5pbXBvcnQgdHlwZSB7IEZpZWxkQXR0cmlidXRlIH0gZnJvbSAnYmV0dGVyLWF1dGgvZGInXG5pbXBvcnQgeyB0eXBlIEZpZWxkVHlwZSwgZ2V0QXV0aFRhYmxlcyB9IGZyb20gJ2JldHRlci1hdXRoL2RiJ1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uU2x1ZywgV2hlcmUgYXMgUGF5bG9hZFdoZXJlIH0gZnJvbSAncGF5bG9hZCdcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zZm9ybSA9IChvcHRpb25zOiBCZXR0ZXJBdXRoT3B0aW9ucywgZW5hYmxlRGVidWdMb2dzOiBib29sZWFuKSA9PiB7XG4gIGNvbnN0IHNjaGVtYSA9IGdldEF1dGhUYWJsZXMob3B0aW9ucylcblxuICBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnlbXSkge1xuICAgIGlmIChlbmFibGVEZWJ1Z0xvZ3MpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbcGF5bG9hZC1kYi1hZGFwdGVyXWAsIC4uLm1lc3NhZ2UpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBtb2RlbCBuYW1lIHRvIGl0cyBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGNvbGxlY3Rpb24gc2x1Zy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiByZXNvbHZlcyB0aGUgYXBwcm9wcmlhdGUgY29sbGVjdGlvbiBzbHVnIGJ5OlxuICAgKiAxLiBMb29raW5nIHVwIHRoZSBtb2RlbCBpbiB0aGUgQmV0dGVyQXV0aCBzY2hlbWEgdG8gZmluZCBpdHMgY29uZmlndXJlZCBtb2RlbE5hbWVcbiAgICogMi4gRmFsbGluZyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCBuYW1lIGlmIG5vIG1hcHBpbmcgZXhpc3RzXG4gICAqXG4gICAqIENvbGxlY3Rpb24gc2x1ZyByZXNvbHV0aW9uIGZvbGxvd3MgdGhlc2UgcnVsZXM6XG4gICAqIC0gRm9yIGJhc2UgY29sbGVjdGlvbnM6IFRoZSBzYW5pdGl6ZUJldHRlckF1dGhPcHRpb25zIGZ1bmN0aW9uIGVuc3VyZXMgdGhlIGNvbGxlY3Rpb24gc2x1Z1xuICAgKiAgIGZyb20gcGx1Z2luIG9wdGlvbnMgaXMgc2V0IGFzIHRoZSBtb2RlbCBuYW1lIGluIHRoZSBzY2hlbWFcbiAgICogLSBGb3IgcGx1Z2luczogVGhlIGJldHRlckF1dGhQbHVnaW5TbHVncyBjb25zdGFudCBpcyB1c2VkIGFzIHRoZSBtb2RlbE5hbWVcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGNvbGxlY3Rpb24gc2x1Z1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWFbJ3VzZXInXS5tb2RlbE5hbWUgaXMgJ3VzZXJzJ1xuICAgKiBnZXRDb2xsZWN0aW9uU2x1ZygndXNlcicpIC8vIFJldHVybnMgJ3VzZXJzJ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBtb2RlbCBkb2Vzbid0IGV4aXN0IGluIHNjaGVtYVxuICAgKiBnZXRDb2xsZWN0aW9uU2x1ZygnY3VzdG9tJykgLy8gUmV0dXJucyAnY3VzdG9tJ1xuICAgKlxuICAgKiBAd2FybmluZyBJZiBhIGNvbGxlY3Rpb24gaXMgb3ZlcnJpZGRlbiB1c2luZyB0aGUgY29sbGVjdGlvbk92ZXJyaWRlIG9wdGlvblxuICAgKiB3aXRob3V0IHVwZGF0aW5nIHRoZSBzY2hlbWEgbWFwcGluZywgdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGluY29ycmVjdCBzbHVnc1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWw6IE1vZGVsS2V5KTogQ29sbGVjdGlvblNsdWcge1xuICAgIC8vIEZpcnN0IHRyeSB0byBnZXQgdGhlIG1vZGVsTmFtZSBmcm9tIHNjaGVtYSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgb3JpZ2luYWwgbW9kZWwgbmFtZVxuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBzY2hlbWE/Llttb2RlbF0/Lm1vZGVsTmFtZSB8fCBtb2RlbFxuICAgIGRlYnVnTG9nKFsnZ2V0Q29sbGVjdGlvblNsdWc6JywgeyBtb2RlbCwgcmVzb2x2ZWRTbHVnOiBjb2xsZWN0aW9uIH1dKVxuICAgIHJldHVybiBjb2xsZWN0aW9uIGFzIENvbGxlY3Rpb25TbHVnXG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIEJldHRlckF1dGggc2NoZW1hIGZpZWxkIHRvIGl0cyBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGZpZWxkIG5hbWUuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMgdGhlIGFwcHJvcHJpYXRlIGZpZWxkIG5hbWUgYnk6XG4gICAqIDEuIFByZXNlcnZpbmcgJ2lkJyBvciAnX2lkJyBmaWVsZHMgYXMtaXMgKHNwZWNpYWwgY2FzZSBoYW5kbGluZylcbiAgICogMi4gTG9va2luZyB1cCB0aGUgZmllbGQgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hIHRvIGZpbmQgaXRzIGNvbmZpZ3VyZWQgZmllbGROYW1lXG4gICAqIDMuIEZhbGxpbmcgYmFjayB0byB0aGUgb3JpZ2luYWwgZmllbGQgbmFtZSBpZiBubyBtYXBwaW5nIGV4aXN0c1xuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgQmV0dGVyQXV0aCBtb2RlbCBuYW1lIGNvbnRhaW5pbmcgdGhlIGZpZWxkXG4gICAqIEBwYXJhbSBmaWVsZCAtIFRoZSBvcmlnaW5hbCBmaWVsZCBuYW1lIHRvIHJlc29sdmVcbiAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgZmllbGQgbmFtZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWFbJ3VzZXInXS5maWVsZHNbJ2VtYWlsJ10uZmllbGROYW1lIGlzICdlbWFpbEFkZHJlc3MnXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdlbWFpbCcpIC8vIFJldHVybnMgJ2VtYWlsQWRkcmVzcydcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gU3BlY2lhbCBjYXNlIGZvciBJRCBmaWVsZHNcbiAgICogZ2V0RmllbGROYW1lKCd1c2VyJywgJ2lkJykgLy8gQWx3YXlzIHJldHVybnMgJ2lkJ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBmaWVsZCBkb2Vzbid0IGV4aXN0IGluIHNjaGVtYSBvciBoYXMgbm8gZmllbGROYW1lIG1hcHBpbmdcbiAgICogZ2V0RmllbGROYW1lKCd1c2VyJywgJ2N1c3RvbScpIC8vIFJldHVybnMgJ2N1c3RvbSdcbiAgICpcbiAgICogQHdhcm5pbmcgSWYgYSBmaWVsZE5hbWUgaXMgb3ZlcnJpZGRlbiBpbiB0aGUgcGF5bG9hZCBjb2xsZWN0aW9uIGNvbmZpZyB1c2luZyB0aGUgY29sbGVjdGlvbk92ZXJyaWRlIG9wdGlvblxuICAgKiB3aXRob3V0IHVwZGF0aW5nIHRoZSBzY2hlbWEgbWFwcGluZywgdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGluY29ycmVjdCBmaWVsZCBuYW1lc1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RmllbGROYW1lKG1vZGVsOiBNb2RlbEtleSwgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiAnaWQnIG9yICdfaWQnIGlzIGFsd2F5cyBwcmVzZXJ2ZWQgYXMtaXNcbiAgICBpZiAoWydpZCcsICdfaWQnXS5pbmNsdWRlcyhmaWVsZCkpIHtcbiAgICAgIHJldHVybiBmaWVsZFxuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIGZpZWxkIGluIHRoZSBzY2hlbWFcbiAgICBjb25zdCBmaWVsZERlZmluaXRpb24gPSBzY2hlbWFbbW9kZWxdPy5maWVsZHNbZmllbGRdXG5cbiAgICAvLyBVc2UgdGhlIGNvbmZpZ3VyZWQgZmllbGROYW1lIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBvcmlnaW5hbFxuICAgIGNvbnN0IGZpZWxkTmFtZSA9IGZpZWxkRGVmaW5pdGlvbj8uZmllbGROYW1lIHx8IGZpZWxkXG5cbiAgICAvLyBMb2cgdGhlIGZpZWxkIHJlc29sdXRpb24gZm9yIGRlYnVnZ2luZ1xuICAgIGRlYnVnTG9nKFsnZ2V0RmllbGQ6ICcsIHsgbW9kZWwsIG9yaWdpbmFsRmllbGQ6IGZpZWxkLCBmaWVsZE5hbWUgfV0pXG5cbiAgICByZXR1cm4gZmllbGROYW1lXG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIGJ5IGNoZWNraW5nIGZvciBhIHJlZmVyZW5jZXMgcHJvcGVydHkuXG4gICAqXG4gICAqIFJlbGF0aW9uc2hpcCBmaWVsZHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIGFub3RoZXIgbW9kZWwuXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIHRvIGlkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZEtleSAtIFRoZSBrZXkgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHNjaGVtYUZpZWxkcyAtIE9iamVjdCBjb250YWluaW5nIGFsbCBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIChoYXMgcmVmZXJlbmNlcyksIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMucG9zdHMgaGFzIHsgcmVmZXJlbmNlczoge30gfVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdwb3N0cycsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyB0cnVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYS51c2VyLmZpZWxkcy5lbWFpbCBoYXMgbm8gcmVmZXJlbmNlcyBwcm9wZXJ0eVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdlbWFpbCcsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyBmYWxzZVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSZWxhdGlvbnNoaXBGaWVsZChmaWVsZEtleTogc3RyaW5nLCBzY2hlbWFGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpZWxkQXR0cmlidXRlPEZpZWxkVHlwZT4+KTogYm9vbGVhbiB7XG4gICAgLy8gQSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBpZiBpdCBoYXMgYSAncmVmZXJlbmNlcycgcHJvcGVydHkgZGVmaW5lZFxuICAgIHJldHVybiBzY2hlbWFGaWVsZHNbZmllbGRLZXldPy5yZWZlcmVuY2VzICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgaW50byBhIERhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgYW5kIGNhbiBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkXG4gICAqIGludG8gYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0IHVzaW5nIERhdGUucGFyc2UoKS4gSXQncyB1c2VkIHRvIGlkZW50aWZ5IGRhdGUgZmllbGRzXG4gICAqIGR1cmluZyBkYXRhIHRyYW5zZm9ybWF0aW9uIHByb2Nlc3Nlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrIGlmIGl0J3MgYSB2YWxpZCBkYXRlIHN0cmluZ1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgYXMgYSBkYXRlLCBmYWxzZSBvdGhlcndpc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyB0cnVlIGZvciBJU08gZGF0ZSBzdHJpbmdzXG4gICAqIGlzRGF0ZUZpZWxkKCcyMDIzLTAxLTAxVDEyOjAwOjAwWicpIC8vIHRydWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBmYWxzZSBmb3Igbm9uLWRhdGUgc3RyaW5ncyBvciBvdGhlciB0eXBlc1xuICAgKiBpc0RhdGVGaWVsZCgnbm90IGEgZGF0ZScpIC8vIGZhbHNlXG4gICAqIGlzRGF0ZUZpZWxkKDEyMykgLy8gZmFsc2VcbiAgICovXG4gIGZ1bmN0aW9uIGlzRGF0ZUZpZWxkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB2YWx1ZSBpcyBhIHN0cmluZyBhbmQgY2FuIGJlIHBhcnNlZCBhcyBhIHZhbGlkIGRhdGVcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpXG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgYSBzaW5nbGUgSUQgdmFsdWUgZnJvbSBhIFBheWxvYWQgd2hlcmUgY2xhdXNlIGlmIGl0IHJlcHJlc2VudHMgYSBzaW1wbGUgSUQgcXVlcnkuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gYW5hbHl6ZXMgYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSB0byBkZXRlcm1pbmUgaWYgaXQncyBhIHNpbXBsZSBxdWVyeSBmb3IgYVxuICAgKiBzaW5nbGUgZG9jdW1lbnQgYnkgSUQuIEl0IHN1cHBvcnRzIGJvdGggJ2lkJyBhbmQgJ19pZCcgZmllbGRzIHdpdGggJ2VxdWFscycgb3IgJ2NvbnRhaW5zJ1xuICAgKiBvcGVyYXRvcnMuIFRoaXMgaXMgdXNlZnVsIGZvciBvcHRpbWl6aW5nIHF1ZXJpZXMgd2hlbiB3ZSBvbmx5IG5lZWQgdG8gZmV0Y2ggYSBzaW5nbGUgZG9jdW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSAtIFRoZSBQYXlsb2FkIHdoZXJlIGNsYXVzZSB0byBhbmFseXplXG4gICAqIEByZXR1cm5zIFRoZSBJRCB2YWx1ZSAoc3RyaW5nIG9yIG51bWJlcikgaWYgdGhlIHdoZXJlIGNsYXVzZSBpcyBhIHNpbXBsZSBJRCBxdWVyeSwgbnVsbCBvdGhlcndpc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyAnMTIzJyBmb3IgYSBzaW1wbGUgZXF1YWxzIHF1ZXJ5XG4gICAqIHNpbmdsZUlkUXVlcnkoeyBpZDogeyBlcXVhbHM6ICcxMjMnIH0gfSkgLy8gJzEyMydcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyA0NTYgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeSB3aXRoIG51bWJlciBJRFxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgX2lkOiB7IGVxdWFsczogNDU2IH0gfSkgLy8gNDU2XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzc4OScgZm9yIGEgY29udGFpbnMgcXVlcnkgd2l0aCBhIHNpbmdsZSB2YWx1ZVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgY29udGFpbnM6IFsnNzg5J10gfSB9KSAvLyAnNzg5J1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIG51bGwgZm9yIGNvbXBsZXggcXVlcmllc1xuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgYW5kOiBbeyBpZDogeyBlcXVhbHM6ICcxMjMnIH0gfV0gfSkgLy8gbnVsbFxuICAgKi9cbiAgZnVuY3Rpb24gc2luZ2xlSWRRdWVyeSh3aGVyZTogUGF5bG9hZFdoZXJlKSB7XG4gICAgLy8gUmV0dXJuIG51bGwgZm9yIGVtcHR5IHdoZXJlIGNsYXVzZXMgb3IgY29tcGxleCBxdWVyaWVzIHdpdGggJ2FuZCcvJ29yJyBvcGVyYXRvcnNcbiAgICBpZiAoIXdoZXJlIHx8ICdhbmQnIGluIHdoZXJlIHx8ICdvcicgaW4gd2hlcmUpIHJldHVybiBudWxsXG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2hlcmUgY2xhdXNlIGNvbnRhaW5zIGVpdGhlciAnaWQnIG9yICdfaWQnIGZpZWxkXG4gICAgaWYgKFsnaWQnLCAnX2lkJ10uc29tZSgoZmllbGQpID0+IGZpZWxkIGluIHdoZXJlKSkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIElEIGZpZWxkIGlzIGJlaW5nIHVzZWQgKHN1cHBvcnQgYm90aCAnaWQnIGFuZCAnX2lkJylcbiAgICAgIGNvbnN0IGlkRmllbGQgPSAnaWQnIGluIHdoZXJlID8gJ2lkJyA6ICdfaWQnXG4gICAgICBjb25zdCBjb25kaXRpb24gPSB3aGVyZVtpZEZpZWxkXVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBlcXVhbHMgb3BlcmF0b3IgY2FzZVxuICAgICAgaWYgKGNvbmRpdGlvbiAmJiB0eXBlb2YgY29uZGl0aW9uID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjb25kaXRpb24pICYmICdlcXVhbHMnIGluIGNvbmRpdGlvbikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5lcXVhbHNcbiAgICAgICAgLy8gT25seSByZXR1cm4gc3RyaW5nIG9yIG51bWJlciBJRCB2YWx1ZXNcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIGNvbnRhaW5zIG9wZXJhdG9yIGNhc2Ugd2l0aCBhIHNpbmdsZSB2YWx1ZVxuICAgICAgaWYgKFxuICAgICAgICBjb25kaXRpb24gJiZcbiAgICAgICAgdHlwZW9mIGNvbmRpdGlvbiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJlxuICAgICAgICAnY29udGFpbnMnIGluIGNvbmRpdGlvbiAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGNvbmRpdGlvbi5jb250YWlucykgJiZcbiAgICAgICAgY29uZGl0aW9uLmNvbnRhaW5zLmxlbmd0aCA9PT0gMVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29uZGl0aW9uLmNvbnRhaW5zWzBdXG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBudWxsIGlmIG5vIHZhbGlkIElEIHF1ZXJ5IHdhcyBmb3VuZFxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBkYXRhIHZhbHVlcyBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCByZXF1aXJlZCBJRCB0eXBlXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0eXBlIGNvbnZlcnNpb24gZm9yIHJlbGF0aW9uc2hpcCBmaWVsZHMgdG8gZW5zdXJlXG4gICAqIElEcyBhcmUgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IChzdHJpbmcgb3IgbnVtYmVyKSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBmaWVsZCBrZXkvbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gbm9ybWFsaXplXG4gICAqIEBwYXJhbSBpc1JlbGF0ZWRGaWVsZCAtIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZFxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBpc1JlbGF0ZWRGaWVsZCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIGlzUmVsYXRlZEZpZWxkOiBib29sZWFuXG4gICAgaWRUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0J1xuICB9KSB7XG4gICAgLy8gU2tpcCBwcm9jZXNzaW5nIGZvciBudWxsL3VuZGVmaW5lZCB2YWx1ZXNcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKFsnaWQnLCAnX2lkJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgaWRUeXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApXG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XSlcbiAgICAgICAgICByZXR1cm4gcGFyc2VkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlkVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICBkZWJ1Z0xvZyhbYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLCB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XSlcbiAgICAgICAgcmV0dXJuIHN0cmluZ0lkXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZXNzIHJlbGF0aW9uc2hpcCBmaWVsZHMgdGhhdCBuZWVkIHR5cGUgY29udmVyc2lvblxuICAgIGlmIChpc1JlbGF0ZWRGaWVsZCkge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBJRCB2YWx1ZSBjb252ZXJzaW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBpZFR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHZhbHVlLCAxMClcbiAgICAgICAgaWYgKCFpc05hTihwYXJzZWQpKSB7XG4gICAgICAgICAgZGVidWdMb2coW2BJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBzdHJpbmcgSUQgdG8gbnVtYmVyYCwgeyBvcmlnaW5hbDogdmFsdWUsIGNvbnZlcnRlZDogcGFyc2VkIH1dKVxuICAgICAgICAgIHJldHVybiBwYXJzZWRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlkVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICBkZWJ1Z0xvZyhbYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLCB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XSlcbiAgICAgICAgcmV0dXJuIHN0cmluZ0lkXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBhcnJheSBvZiBJRHMgLSBtYXAgZWFjaCB2YWx1ZSB0byB0aGUgY29ycmVjdCB0eXBlXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoaWQpID0+IHtcbiAgICAgICAgICAvLyBTa2lwIG51bGwvdW5kZWZpbmVkIHZhbHVlcyBpbiBhcnJheXNcbiAgICAgICAgICBpZiAoaWQgPT09IG51bGwgfHwgaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGlkXG5cbiAgICAgICAgICBpZiAoaWRUeXBlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChpZCwgMTApXG4gICAgICAgICAgICByZXR1cm4gIWlzTmFOKHBhcnNlZCkgPyBwYXJzZWQgOiBpZFxuICAgICAgICAgIH0gZWxzZSBpZiAoaWRUeXBlID09PSAndGV4dCcgJiYgdHlwZW9mIGlkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhpZClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlkXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG9yaWdpbmFsIHZhbHVlIGlmIG5vIGNvbnZlcnNpb24gd2FzIG5lZWRlZCBvciBhcHBsaWNhYmxlXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBpbnB1dCBkYXRhIGZyb20gYmV0dGVyLWF1dGggdG8gUGF5bG9hZCBDTVMgZm9ybWF0XG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlczpcbiAgICogMS4gRmllbGQgbmFtZSBtYXBwaW5nIGFjY29yZGluZyB0byBzY2hlbWEgZGVmaW5pdGlvbnNcbiAgICogMi4gSUQgdHlwZSBjb252ZXJzaW9uIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAqIDMuIFByb3BlciBkYXRhIG5vcm1hbGl6YXRpb24gYmFzZWQgb24gZmllbGQgdHlwZXNcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBuYW1lIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBleHBlY3RlZCBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIGRhdGEgY29tcGF0aWJsZSB3aXRoIFBheWxvYWQgQ01TXG4gICAqL1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1JbnB1dCh7XG4gICAgZGF0YSxcbiAgICBtb2RlbCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICBtb2RlbDogTW9kZWxLZXlcbiAgICBpZFR5cGU6ICdudW1iZXInIHwgJ3RleHQnXG4gIH0pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICAgIGNvbnN0IHNjaGVtYUZpZWxkcyA9IHNjaGVtYT8uW21vZGVsXT8uZmllbGRzID8/IHt9XG5cbiAgICAvLyBQcm9jZXNzIGVhY2ggZmllbGQgaW4gdGhlIGlucHV0IGRhdGFcbiAgICBPYmplY3QuZW50cmllcyhkYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIFNraXAgbnVsbC91bmRlZmluZWQgdmFsdWVzXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSByZWxhdGlvbnNoaXAgZmllbGRcbiAgICAgIGNvbnN0IGlzUmVsYXRlZEZpZWxkID0gaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcylcblxuICAgICAgLy8gR2V0IHRoZSBtYXBwZWQgZmllbGQgbmFtZSBmcm9tIHNjaGVtYSAoaWYgYW55KVxuICAgICAgY29uc3Qgc2NoZW1hRmllbGROYW1lID0gc2NoZW1hRmllbGRzW2tleV0/LmZpZWxkTmFtZVxuXG4gICAgICAvLyBOb3JtYWxpemUgdGhlIGRhdGEgdmFsdWUgYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgSUQgdHlwZVxuICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVEYXRhKHtcbiAgICAgICAgaWRUeXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpc1JlbGF0ZWRGaWVsZFxuICAgICAgfSlcblxuICAgICAgLy8gVXNlIHRoZSBzY2hlbWEtZGVmaW5lZCBmaWVsZCBuYW1lIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBvcmlnaW5hbCBrZXlcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkTmFtZSB8fCBrZXlcbiAgICAgIHRyYW5zZm9ybWVkRGF0YVt0YXJnZXRGaWVsZE5hbWVdID0gbm9ybWFsaXplZERhdGFcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgUGF5bG9hZCBDTVMgZG9jdW1lbnQgb3V0cHV0IHRvIG1hdGNoIEJldHRlckF1dGggc2NoZW1hIGV4cGVjdGF0aW9ucy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHNldmVyYWwgY3JpdGljYWwgdHJhbnNmb3JtYXRpb25zOlxuICAgKlxuICAgKiAxLiBJRCBDb252ZXJzaW9uOiBFbnN1cmVzIGFsbCBJRCBmaWVsZHMgYXJlIHN0cmluZ3MgYXMgcmVxdWlyZWQgYnkgQmV0dGVyQXV0aFxuICAgKiAgICAoc2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmV0dGVyLWF1dGgvYmV0dGVyLWF1dGgvYmxvYi9tYWluL3BhY2thZ2VzL2JldHRlci1hdXRoL3NyYy9kYi9zY2hlbWEudHMjTDEyNSlcbiAgICpcbiAgICogMi4gUmVsYXRpb25zaGlwIEZpZWxkIE1hcHBpbmc6IEFsaWducyByZWxhdGlvbnNoaXAgZmllbGRzIHdpdGggQmV0dGVyQXV0aCBzY2hlbWEgbmFtaW5nIGNvbnZlbnRpb25zXG4gICAqICAgIGFuZCBlbnN1cmVzIHByb3BlciBJRCB0eXBlIGhhbmRsaW5nXG4gICAqXG4gICAqIDMuIERhdGUgQ29udmVyc2lvbjogVHJhbnNmb3JtcyBkYXRlIHN0cmluZ3MgZnJvbSBQYXlsb2FkIGludG8gRGF0ZSBvYmplY3RzIGZvciBCZXR0ZXJBdXRoXG4gICAqXG4gICAqIE5vdGU6IFdoaWxlIHNldHRpbmcgZGVwdGg6IDEgaW4gUGF5bG9hZCBvcGVyYXRpb25zIHNpbXBsaWZpZXMgdGhpcyBwcm9jZXNzIGJ5IGF2b2lkaW5nXG4gICAqIGRlZXBseSBuZXN0ZWQgb2JqZWN0cywgd2UgbWFpbnRhaW4gY29tcHJlaGVuc2l2ZSBjaGVja3MgZm9yIHJvYnVzdG5lc3MuXG4gICAqXG4gICAqIEBwYXJhbSBkb2MgLSBUaGUgZG9jdW1lbnQgcmV0dXJuZWQgZnJvbSBQYXlsb2FkIENNU1xuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgbmFtZSBpbiB0aGUgQmV0dGVyQXV0aCBzY2hlbWFcbiAgICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVkIGRvY3VtZW50IGNvbXBhdGlibGUgd2l0aCBCZXR0ZXJBdXRoXG4gICAqL1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1PdXRwdXQ8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsPih7IGRvYywgbW9kZWwgfTogeyBkb2M6IFQ7IG1vZGVsOiBNb2RlbEtleSB9KTogVCB7XG4gICAgaWYgKCFkb2MgfHwgdHlwZW9mIGRvYyAhPT0gJ29iamVjdCcpIHJldHVybiBkb2NcblxuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4uZG9jIH1cbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fVxuXG4gICAgLy8gSWRlbnRpZnkgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIGN1c3RvbSBmaWVsZCBuYW1lIG1hcHBpbmdzXG4gICAgY29uc3QgcmVsYXRpb25zaGlwRmllbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNjaGVtYUZpZWxkcykuZmlsdGVyKChba2V5XSkgPT4gaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcykpKVxuXG4gICAgT2JqZWN0LmVudHJpZXMoZG9jKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgICAgLy8gQ29udmVydCBJRCBmaWVsZHMgdG8gc3RyaW5ncyBmb3IgQmV0dGVyQXV0aCBjb21wYXRpYmlsaXR5XG4gICAgICBpZiAoWydpZCcsICdfaWQnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCByZW5hbWVkIGZpZWxkTmFtZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5ID0gT2JqZWN0LmtleXMocmVsYXRpb25zaGlwRmllbGRzKS5maW5kKChrKSA9PiByZWxhdGlvbnNoaXBGaWVsZHNba10uZmllbGROYW1lID09PSBrZXkpXG4gICAgICBpZiAob3JpZ2luYWxSZWxhdGVkRmllbGRLZXkpIHtcbiAgICAgICAgbm9ybWFsaXplRG9jdW1lbnRJZHMocmVzdWx0LCBvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSwga2V5LCB2YWx1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgSVNPIGRhdGUgc3RyaW5ncyB0byBEYXRlIG9iamVjdHMgZm9yIEJldHRlckF1dGhcbiAgICAgIGlmIChpc0RhdGVGaWVsZCh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiByZXN1bHQgYXMgVFxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgSUQgZmllbGRzIGZvciBib3RoIHByaW1hcnkgYW5kIHJlbGF0aW9uc2hpcCBkb2N1bWVudHMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyBjb25zaXN0ZW50IElEIGhhbmRsaW5nIGJldHdlZW4gQmV0dGVyQXV0aCBhbmQgUGF5bG9hZCBDTVMgYnk6XG4gICAqIDEuIENvbnZlcnRpbmcgYWxsIElEcyB0byBzdHJpbmdzIGZvciBCZXR0ZXJBdXRoIChzdG9yZWQgaW4gb3JpZ2luYWxLZXkpXG4gICAqIDIuIFByZXNlcnZpbmcgb3JpZ2luYWwgSUQgdHlwZXMgZm9yIFBheWxvYWQgQ01TIChzdG9yZWQgaW4gZmllbGROYW1lKVxuICAgKlxuICAgKiBUaGUgZnVuY3Rpb24gaGFuZGxlcyB2YXJpb3VzIElEIGZvcm1hdHM6XG4gICAqIC0gUHJpbWl0aXZlIHZhbHVlcyAoc3RyaW5nL251bWJlciBJRHMpXG4gICAqIC0gT2JqZWN0IHJlZmVyZW5jZXMgd2l0aCBJRCBwcm9wZXJ0aWVzXG4gICAqIC0gQXJyYXlzIG9mIGVpdGhlciBwcmltaXRpdmUgSURzIG9yIG9iamVjdCByZWZlcmVuY2VzXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBUaGUgcmVzdWx0IG9iamVjdCBiZWluZyB0cmFuc2Zvcm1lZFxuICAgKiBAcGFyYW0gb3JpZ2luYWxLZXkgLSBUaGUgb3JpZ2luYWwgZmllbGQga2V5IGZyb20gQmV0dGVyQXV0aCBzY2hlbWFcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSByZW5hbWVkIGZpZWxkIGFzIHVzZWQgaW4gUGF5bG9hZCBDTVNcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIElEIHZhbHVlIHRvIG5vcm1hbGl6ZSAocHJpbWl0aXZlLCBvYmplY3QsIG9yIGFycmF5KVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplRG9jdW1lbnRJZHMocmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBvcmlnaW5hbEtleTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIENhc2UgMTogUHJpbWl0aXZlIElEIHZhbHVlIChzdHJpbmcgb3IgbnVtYmVyKVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIEZvciBCZXR0ZXJBdXRoOiBBbHdheXMgdXNlIHN0cmluZyBJRHNcbiAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSBTdHJpbmcodmFsdWUpXG4gICAgICAvLyBGb3IgUGF5bG9hZDogS2VlcCBvcmlnaW5hbCB0eXBlXG4gICAgICByZXN1bHRbZmllbGROYW1lXSA9IHZhbHVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDYXNlIDI6IE9iamVjdCB3aXRoIElEIHByb3BlcnR5XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2lkJyBpbiB2YWx1ZSkge1xuICAgICAgLy8gRm9yIEJldHRlckF1dGg6IEV4dHJhY3QgYW5kIHN0cmluZ2lmeSB0aGUgSURcbiAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSBTdHJpbmcodmFsdWUuaWQpXG4gICAgICAvLyBGb3IgUGF5bG9hZDogRXh0cmFjdCBJRCBidXQgcHJlc2VydmUgdHlwZVxuICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZS5pZFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2FzZSAzOiBBcnJheSBvZiBJRHMgb3IgcmVmZXJlbmNlc1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDaGVjayBpZiBhcnJheSBjb250YWlucyBvYmplY3RzIHdpdGggSUQgcHJvcGVydGllc1xuICAgICAgaWYgKHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCAmJiAnaWQnIGluIGl0ZW0pKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIG9iamVjdHMgd2l0aCBJRHNcbiAgICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0uaWQpKVxuICAgICAgICByZXN1bHRbZmllbGROYW1lXSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gaXRlbS5pZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHByaW1pdGl2ZSBJRHNcbiAgICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pKVxuICAgICAgICByZXN1bHRbZmllbGROYW1lXSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gaXRlbSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIE5vdGU6IElmIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggYW55IGV4cGVjdGVkIGZvcm1hdCwgbm8gY2hhbmdlcyBhcmUgbWFkZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgQmV0dGVyQXV0aCBvcGVyYXRvciB0byB0aGUgZXF1aXZhbGVudCBQYXlsb2FkIENNUyBxdWVyeSBvcGVyYXRvclxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIG1hcHMgc3RhbmRhcmQgcXVlcnkgb3BlcmF0b3JzIGZyb20gQmV0dGVyQXV0aCdzIGZvcm1hdCB0b1xuICAgKiB0aGUgc3BlY2lmaWMgZm9ybWF0IGV4cGVjdGVkIGJ5IFBheWxvYWQgQ01TJ3MgcXVlcnkgZW5naW5lLlxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0b3IgLSBUaGUgQmV0dGVyQXV0aCBvcGVyYXRvciBzdHJpbmcgKGUuZy4sICdlcScsICdndCcsICdjb250YWlucycpXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSB1c2VkIHdpdGggdGhlIG9wZXJhdG9yXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBQYXlsb2FkLWNvbXBhdGlibGUgb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgeyBlcXVhbHM6ICd0ZXN0QGV4YW1wbGUuY29tJyB9XG4gICAqIG9wZXJhdG9yVG9QYXlsb2FkKCdlcScsICd0ZXN0QGV4YW1wbGUuY29tJylcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyB7IGdyZWF0ZXJfdGhhbjogMTAwIH1cbiAgICogb3BlcmF0b3JUb1BheWxvYWQoJ2d0JywgMTAwKVxuICAgKi9cbiAgZnVuY3Rpb24gb3BlcmF0b3JUb1BheWxvYWQob3BlcmF0b3I6IHN0cmluZywgdmFsdWU6IGFueSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgIGNhc2UgJ2VxJzpcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9XG4gICAgICBjYXNlICduZSc6XG4gICAgICAgIHJldHVybiB7IG5vdF9lcXVhbHM6IHZhbHVlIH1cbiAgICAgIGNhc2UgJ2d0JzpcbiAgICAgICAgcmV0dXJuIHsgZ3JlYXRlcl90aGFuOiB2YWx1ZSB9XG4gICAgICBjYXNlICdndGUnOlxuICAgICAgICByZXR1cm4geyBncmVhdGVyX3RoYW5fZXF1YWw6IHZhbHVlIH1cbiAgICAgIGNhc2UgJ2x0JzpcbiAgICAgICAgcmV0dXJuIHsgbGVzc190aGFuOiB2YWx1ZSB9XG4gICAgICBjYXNlICdsdGUnOlxuICAgICAgICByZXR1cm4geyBsZXNzX3RoYW5fZXF1YWw6IHZhbHVlIH1cbiAgICAgIGNhc2UgJ2NvbnRhaW5zJzpcbiAgICAgICAgcmV0dXJuIHsgY29udGFpbnM6IHZhbHVlIH1cbiAgICAgIGNhc2UgJ2luJzpcbiAgICAgICAgcmV0dXJuIHsgaW46IHZhbHVlIH1cbiAgICAgIGNhc2UgJ3N0YXJ0c193aXRoJzpcbiAgICAgICAgcmV0dXJuIHsgbGlrZTogYCR7dmFsdWV9JWAgfVxuICAgICAgY2FzZSAnZW5kc193aXRoJzpcbiAgICAgICAgcmV0dXJuIHsgbGlrZTogYCUke3ZhbHVlfWAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGVxdWFscyBmb3IgdW5yZWNvZ25pemVkIG9wZXJhdG9yc1xuICAgICAgICByZXR1cm4geyBlcXVhbHM6IHZhbHVlIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSB3aGVyZSBjbGF1c2UgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgYmFzZWQgb24gZmllbGQgbmFtZSBhbmQgSUQgdHlwZSBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0d28gbWFpbiBzY2VuYXJpb3M6XG4gICAqIDEuIElEIGZpZWxkIGNvbnZlcnNpb24gLSBlbnN1cmVzIElEcyBtYXRjaCB0aGUgZGF0YWJhc2UncyBleHBlY3RlZCB0eXBlIChudW1iZXIgb3Igc3RyaW5nKVxuICAgKiAyLiBPYmplY3Qgd2l0aCBlbWJlZGRlZCBJRCAtIGV4dHJhY3RzIGFuZCBjb252ZXJ0cyB0aGUgSUQgcHJvcGVydHkgZnJvbSBvYmplY3RzXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0IChjYW4gYmUgcHJpbWl0aXZlLCBvYmplY3Qgd2l0aCBJRCwgb3IgYXJyYXkpXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgcXVlcmllZFxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgdmFsdWUgYXBwcm9wcmlhdGUgZm9yIHRoZSBkYXRhYmFzZSBxdWVyeVxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFdoZXJlVmFsdWUoeyB2YWx1ZSwgZmllbGROYW1lLCBpZFR5cGUgfTogeyB2YWx1ZTogYW55OyBmaWVsZE5hbWU6IHN0cmluZzsgaWRUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0JyB9KSB7XG4gICAgLy8gQ2hlY2sgaWYgZmllbGQgaXMgYW4gSUQgZmllbGQgKHN1cHBvcnRpbmcgYm90aCBNb25nb0RCLXN0eWxlIF9pZCBhbmQgc3RhbmRhcmQgaWQpXG4gICAgaWYgKFsnaWQnLCAnX2lkJ10uaW5jbHVkZXMoZmllbGROYW1lKSkge1xuICAgICAgLy8gQ2FzZSAxOiBWYWx1ZSBpcyBhbiBvYmplY3QgY29udGFpbmluZyBhbiBJRCBwcm9wZXJ0eVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2lkJyBpbiB2YWx1ZSkge1xuICAgICAgICAvLyBFeHRyYWN0IElEIGZyb20gb2JqZWN0XG4gICAgICAgIGNvbnN0IGlkID0gdmFsdWUuaWRcblxuICAgICAgICAvLyBVc2UgdHlwZSBjb252ZXJzaW9uIGJhc2VkIG9uIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgaWYgKGlkVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnN0IG51bUlkID0gTnVtYmVyKGlkKVxuICAgICAgICAgIHJldHVybiAhaXNOYU4obnVtSWQpID8gbnVtSWQgOiBpZFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkVHlwZSA9PT0gJ3RleHQnICYmIHR5cGVvZiBpZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGlkKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgICB9XG4gICAgICAvLyBDYXNlIDI6IFZhbHVlIGlzIGEgc3RhbmRhbG9uZSBJRCB0aGF0IG5lZWRzIHR5cGUgY29udmVyc2lvblxuICAgICAgLy8gQ29udmVydCBzdHJpbmcgSUQgdG8gbnVtYmVyIGlmIGRhdGFiYXNlIGV4cGVjdHMgbnVtZXJpYyBJRHNcbiAgICAgIGlmIChpZFR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIWlzTmFOKE51bWJlcih2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpXG4gICAgICB9XG4gICAgICAvLyBDb252ZXJ0IG51bWVyaWMgSUQgdG8gc3RyaW5nIGlmIGRhdGFiYXNlIGV4cGVjdHMgdGV4dCBJRHNcbiAgICAgIGVsc2UgaWYgKGlkVHlwZSA9PT0gJ3RleHQnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIC8vIEZvciBub24tSUQgZmllbGRzLCByZXR1cm4gdGhlIHZhbHVlIHVuY2hhbmdlZFxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIEJldHRlciBBdXRoIHdoZXJlIGNsYXVzZXMgdG8gUGF5bG9hZCBDTVMgY29tcGF0aWJsZSB3aGVyZSBjb25kaXRpb25zXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgQmV0dGVyIEF1dGggcXVlcnkgZm9ybWF0IGludG8gUGF5bG9hZCdzIHF1ZXJ5IGZvcm1hdCxcbiAgICogaGFuZGxpbmcgZmllbGQgbmFtZSBtYXBwaW5nLCB2YWx1ZSB0eXBlIGNvbnZlcnNpb24sIGFuZCBsb2dpY2FsIG9wZXJhdG9ycyAoQU5EL09SKS5cbiAgICpcbiAgICogVGhlIGZ1bmN0aW9uIGhhbmRsZXMgdGhyZWUgbWFpbiBjYXNlczpcbiAgICogMS4gRW1wdHkgb3IgdW5kZWZpbmVkIHdoZXJlIGNsYXVzZSAtIHJldHVybnMgZW1wdHkgb2JqZWN0XG4gICAqIDIuIFNpbmdsZSBjb25kaXRpb24gLSBjb252ZXJ0cyB0byBhIHNpbXBsZSBmaWVsZC12YWx1ZSBwYWlyXG4gICAqIDMuIE11bHRpcGxlIGNvbmRpdGlvbnMgLSBncm91cHMgYnkgQU5EL09SIGNvbm5lY3RvcnMgYW5kIGJ1aWxkcyBhIGNvbXBsZXggcXVlcnlcbiAgICpcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBkYXRhYmFzZSBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gcXVlcnlcbiAgICogQHBhcmFtIHdoZXJlIC0gQXJyYXkgb2YgQmV0dGVyIEF1dGggd2hlcmUgY29uZGl0aW9uc1xuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSB3aGVyZSBjbGF1c2Ugb2JqZWN0XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0V2hlcmVDbGF1c2UoeyBpZFR5cGUsIG1vZGVsLCB3aGVyZSB9OiB7IGlkVHlwZTogJ251bWJlcicgfCAndGV4dCc7IG1vZGVsOiBNb2RlbEtleTsgd2hlcmU/OiBXaGVyZVtdIH0pOiBQYXlsb2FkV2hlcmUge1xuICAgIC8vIEhhbmRsZSBlbXB0eSB3aGVyZSBjbGF1c2VcbiAgICBpZiAoIXdoZXJlKSByZXR1cm4ge31cblxuICAgIC8vIEhhbmRsZSBzaW5nbGUgY29uZGl0aW9uIGNhc2UgZm9yIG9wdGltaXphdGlvblxuICAgIGlmICh3aGVyZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHcgPSB3aGVyZVswXVxuICAgICAgaWYgKCF3KSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyBNYXAgZmllbGQgbmFtZSBhY2NvcmRpbmcgdG8gc2NoZW1hIGFuZCBjb252ZXJ0IHZhbHVlIHRvIGFwcHJvcHJpYXRlIHR5cGVcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZClcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pXG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgUGF5bG9hZCB3aGVyZSBjb25kaXRpb24gd2l0aCBwcm9wZXIgb3BlcmF0b3JcbiAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgW2ZpZWxkTmFtZV06IG9wZXJhdG9yVG9QYXlsb2FkKHcub3BlcmF0b3IgPz8gJycsIHZhbHVlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG11bHRpcGxlIGNvbmRpdGlvbnMgYnkgc2VwYXJhdGluZyBBTkQvT1IgY2xhdXNlc1xuICAgIC8vIERlZmF1bHQgdG8gQU5EIGlmIG5vIGNvbm5lY3RvciBpcyBzcGVjaWZpZWRcbiAgICBjb25zdCBhbmQgPSB3aGVyZS5maWx0ZXIoKHcpID0+IHcuY29ubmVjdG9yID09PSAnQU5EJyB8fCAhdy5jb25uZWN0b3IpXG4gICAgY29uc3Qgb3IgPSB3aGVyZS5maWx0ZXIoKHcpID0+IHcuY29ubmVjdG9yID09PSAnT1InKVxuXG4gICAgLy8gUHJvY2VzcyBBTkQgY29uZGl0aW9uc1xuICAgIGNvbnN0IGFuZENsYXVzZSA9IGFuZC5tYXAoKHcpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZClcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbZmllbGROYW1lXTogb3BlcmF0b3JUb1BheWxvYWQody5vcGVyYXRvciA/PyAnJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIFByb2Nlc3MgT1IgY29uZGl0aW9uc1xuICAgIGNvbnN0IG9yQ2xhdXNlID0gb3IubWFwKCh3KSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHcuZmllbGQpXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgaWRUeXBlXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2ZpZWxkTmFtZV06IG9wZXJhdG9yVG9QYXlsb2FkKHcub3BlcmF0b3IgPz8gJycsIHZhbHVlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBDb21iaW5lIEFORCBhbmQgT1IgY2xhdXNlcyBpbnRvIGZpbmFsIFBheWxvYWQgd2hlcmUgb2JqZWN0XG4gICAgLy8gT25seSBpbmNsdWRlIG5vbi1lbXB0eSBjbGF1c2UgYXJyYXlzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihhbmRDbGF1c2UubGVuZ3RoID8geyBBTkQ6IGFuZENsYXVzZSB9IDoge30pLFxuICAgICAgLi4uKG9yQ2xhdXNlLmxlbmd0aCA/IHsgT1I6IG9yQ2xhdXNlIH0gOiB7fSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgdG8gYSBQYXlsb2FkIHNlbGVjdCBvYmplY3RcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgKHdoaWNoIGNvbnRhaW5zIGZpZWxkIG5hbWVzKVxuICAgKiBpbnRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgUGF5bG9hZCBDTVMncyBxdWVyeSBBUEkgKGFuIG9iamVjdCB3aXRoIGZpZWxkIG5hbWVzIGFzIGtleXNcbiAgICogYW5kIGJvb2xlYW4gdHJ1ZSBhcyB2YWx1ZXMpLlxuICAgKlxuICAgKiBJdCBhbHNvIGhhbmRsZXMgZmllbGQgbmFtZSBtYXBwaW5nIGJldHdlZW4gYmV0dGVyLWF1dGggc2NoZW1hIGFuZCBQYXlsb2FkIGNvbGxlY3Rpb25zXG4gICAqIGJ5IHVzaW5nIHRoZSBnZXRGaWVsZE5hbWUgaGVscGVyIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgZmllbGQgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gZ2V0IGZpZWxkIG1hcHBpbmdzIGZyb21cbiAgICogQHBhcmFtIHNlbGVjdCAtIE9wdGlvbmFsIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRvIHNlbGVjdFxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzZWxlY3Qgb2JqZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBmaWVsZHMgdG8gc2VsZWN0XG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElucHV0OiBbJ2VtYWlsJywgJ25hbWUnXVxuICAgKiAvLyBPdXRwdXQ6IHsgZW1haWw6IHRydWUsIG5hbWU6IHRydWUgfVxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFNlbGVjdChtb2RlbDogTW9kZWxLZXksIHNlbGVjdD86IHN0cmluZ1tdKSB7XG4gICAgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBzZWxlY3QgaXMgZW1wdHkgb3Igbm90IHByb3ZpZGVkXG4gICAgaWYgKCFzZWxlY3QgfHwgc2VsZWN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgLy8gVHJhbnNmb3JtIHRoZSBhcnJheSBvZiBmaWVsZCBuYW1lcyBpbnRvIGEgUGF5bG9hZCBzZWxlY3Qgb2JqZWN0XG4gICAgLy8gd2hpbGUgYWxzbyBtYXBwaW5nIGFueSBmaWVsZCBuYW1lcyB0aGF0IG1pZ2h0IGJlIGRpZmZlcmVudCBpbiBQYXlsb2FkXG4gICAgcmV0dXJuIHNlbGVjdC5yZWR1Y2UoKGFjYywgZmllbGQpID0+ICh7IC4uLmFjYywgW2dldEZpZWxkTmFtZShtb2RlbCwgZmllbGQpXTogdHJ1ZSB9KSwge30pXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiZXR0ZXItYXV0aCBzb3J0IG9iamVjdCB0byBhIFBheWxvYWQgc29ydCBzdHJpbmdcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBiZXR0ZXItYXV0aCBzb3J0IG9iamVjdCAod2hpY2ggY29udGFpbnMgZmllbGQgbmFtZSBhbmQgZGlyZWN0aW9uKVxuICAgKiBpbnRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgUGF5bG9hZCBDTVMncyBxdWVyeSBBUEkgKGEgc3RyaW5nIHdpdGggb3B0aW9uYWwgJy0nIHByZWZpeCBmb3IgZGVzY2VuZGluZyBvcmRlcikuXG4gICAqXG4gICAqIEl0IGFsc28gaGFuZGxlcyBmaWVsZCBuYW1lIG1hcHBpbmcgYmV0d2VlbiBiZXR0ZXItYXV0aCBzY2hlbWEgYW5kIFBheWxvYWQgY29sbGVjdGlvbnNcbiAgICogYnkgdXNpbmcgdGhlIGdldEZpZWxkTmFtZSBoZWxwZXIgdG8gcmVzb2x2ZSB0aGUgY29ycmVjdCBmaWVsZCBuYW1lcy5cbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsL2NvbGxlY3Rpb24gbmFtZSB0byBnZXQgZmllbGQgbWFwcGluZ3MgZnJvbVxuICAgKiBAcGFyYW0gc29ydEJ5IC0gT3B0aW9uYWwgb2JqZWN0IGNvbnRhaW5pbmcgZmllbGQgbmFtZSBhbmQgc29ydCBkaXJlY3Rpb25cbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgc29ydCBzdHJpbmcgb3IgdW5kZWZpbmVkIGlmIG5vIHNvcnQgc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElucHV0OiB7IGZpZWxkOiAnZW1haWwnLCBkaXJlY3Rpb246ICdkZXNjJyB9XG4gICAqIC8vIE91dHB1dDogJy1lbWFpbCdcbiAgICogLy8gSW5wdXQ6IHsgZmllbGQ6ICdjcmVhdGVkQXQnLCBkaXJlY3Rpb246ICdhc2MnIH1cbiAgICogLy8gT3V0cHV0OiAnY3JlYXRlZEF0J1xuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFNvcnQobW9kZWw6IE1vZGVsS2V5LCBzb3J0Qnk/OiB7IGZpZWxkOiBzdHJpbmc7IGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzb3J0QnkpIHJldHVybiB1bmRlZmluZWRcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHNvcnRCeS5maWVsZClcbiAgICBjb25zdCBwcmVmaXggPSBzb3J0QnkuZGlyZWN0aW9uID09PSAnZGVzYycgPyAnLScgOiAnJ1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtmaWVsZE5hbWV9YFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRGaWVsZE5hbWUsXG4gICAgZ2V0Q29sbGVjdGlvblNsdWcsXG4gICAgc2luZ2xlSWRRdWVyeSxcbiAgICB0cmFuc2Zvcm1JbnB1dCxcbiAgICB0cmFuc2Zvcm1PdXRwdXQsXG4gICAgY29udmVydFdoZXJlQ2xhdXNlLFxuICAgIGNvbnZlcnRTZWxlY3QsXG4gICAgY29udmVydFNvcnRcbiAgfVxufVxuIl0sIm5hbWVzIjpbImdldEF1dGhUYWJsZXMiLCJjcmVhdGVUcmFuc2Zvcm0iLCJvcHRpb25zIiwiZW5hYmxlRGVidWdMb2dzIiwic2NoZW1hIiwiZGVidWdMb2ciLCJtZXNzYWdlIiwiY29uc29sZSIsImxvZyIsImdldENvbGxlY3Rpb25TbHVnIiwibW9kZWwiLCJjb2xsZWN0aW9uIiwibW9kZWxOYW1lIiwicmVzb2x2ZWRTbHVnIiwiZ2V0RmllbGROYW1lIiwiZmllbGQiLCJpbmNsdWRlcyIsImZpZWxkRGVmaW5pdGlvbiIsImZpZWxkcyIsImZpZWxkTmFtZSIsIm9yaWdpbmFsRmllbGQiLCJpc1JlbGF0aW9uc2hpcEZpZWxkIiwiZmllbGRLZXkiLCJzY2hlbWFGaWVsZHMiLCJyZWZlcmVuY2VzIiwidW5kZWZpbmVkIiwiaXNEYXRlRmllbGQiLCJ2YWx1ZSIsImlzTmFOIiwiRGF0ZSIsInBhcnNlIiwic2luZ2xlSWRRdWVyeSIsIndoZXJlIiwic29tZSIsImlkRmllbGQiLCJjb25kaXRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJlcXVhbHMiLCJjb250YWlucyIsImxlbmd0aCIsIm5vcm1hbGl6ZURhdGEiLCJrZXkiLCJpc1JlbGF0ZWRGaWVsZCIsImlkVHlwZSIsInBhcnNlZCIsInBhcnNlSW50Iiwib3JpZ2luYWwiLCJjb252ZXJ0ZWQiLCJzdHJpbmdJZCIsIlN0cmluZyIsIm1hcCIsImlkIiwidHJhbnNmb3JtSW5wdXQiLCJkYXRhIiwidHJhbnNmb3JtZWREYXRhIiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJzY2hlbWFGaWVsZE5hbWUiLCJub3JtYWxpemVkRGF0YSIsInRhcmdldEZpZWxkTmFtZSIsInRyYW5zZm9ybU91dHB1dCIsImRvYyIsInJlc3VsdCIsInJlbGF0aW9uc2hpcEZpZWxkcyIsImZyb21FbnRyaWVzIiwiZmlsdGVyIiwib3JpZ2luYWxSZWxhdGVkRmllbGRLZXkiLCJrZXlzIiwiZmluZCIsImsiLCJub3JtYWxpemVEb2N1bWVudElkcyIsIm9yaWdpbmFsS2V5IiwiZXZlcnkiLCJpdGVtIiwib3BlcmF0b3JUb1BheWxvYWQiLCJvcGVyYXRvciIsIm5vdF9lcXVhbHMiLCJncmVhdGVyX3RoYW4iLCJncmVhdGVyX3RoYW5fZXF1YWwiLCJsZXNzX3RoYW4iLCJsZXNzX3RoYW5fZXF1YWwiLCJpbiIsImxpa2UiLCJjb252ZXJ0V2hlcmVWYWx1ZSIsIm51bUlkIiwiTnVtYmVyIiwiY29udmVydFdoZXJlQ2xhdXNlIiwidyIsInJlcyIsImFuZCIsImNvbm5lY3RvciIsIm9yIiwiYW5kQ2xhdXNlIiwib3JDbGF1c2UiLCJBTkQiLCJPUiIsImNvbnZlcnRTZWxlY3QiLCJzZWxlY3QiLCJyZWR1Y2UiLCJhY2MiLCJjb252ZXJ0U29ydCIsInNvcnRCeSIsInByZWZpeCIsImRpcmVjdGlvbiJdLCJtYXBwaW5ncyI6IkFB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
|
|
647
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1vZGVsS2V5IH0gZnJvbSAnQC9iZXR0ZXItYXV0aC9nZW5lcmF0ZWQtdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEJldHRlckF1dGhPcHRpb25zLCBXaGVyZSB9IGZyb20gJ2JldHRlci1hdXRoJ1xuaW1wb3J0IHR5cGUgeyBGaWVsZEF0dHJpYnV0ZSB9IGZyb20gJ2JldHRlci1hdXRoL2RiJ1xuaW1wb3J0IHsgdHlwZSBGaWVsZFR5cGUsIGdldEF1dGhUYWJsZXMgfSBmcm9tICdiZXR0ZXItYXV0aC9kYidcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvblNsdWcsIFdoZXJlIGFzIFBheWxvYWRXaGVyZSB9IGZyb20gJ3BheWxvYWQnXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUcmFuc2Zvcm0gPSAob3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMsIGVuYWJsZURlYnVnTG9nczogYm9vbGVhbikgPT4ge1xuICBjb25zdCBzY2hlbWEgPSBnZXRBdXRoVGFibGVzKG9wdGlvbnMpXG5cbiAgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBpZiAoZW5hYmxlRGVidWdMb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3BheWxvYWQtZGItYWRhcHRlcl1gLCAuLi5tZXNzYWdlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgQmV0dGVyQXV0aCBzY2hlbWEgbW9kZWwgbmFtZSB0byBpdHMgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBjb2xsZWN0aW9uIHNsdWcuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMgdGhlIGFwcHJvcHJpYXRlIGNvbGxlY3Rpb24gc2x1ZyBieTpcbiAgICogMS4gTG9va2luZyB1cCB0aGUgbW9kZWwgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hIHRvIGZpbmQgaXRzIGNvbmZpZ3VyZWQgbW9kZWxOYW1lXG4gICAqIDIuIEZhbGxpbmcgYmFjayB0byB0aGUgb3JpZ2luYWwgbW9kZWwgbmFtZSBpZiBubyBtYXBwaW5nIGV4aXN0c1xuICAgKlxuICAgKiBDb2xsZWN0aW9uIHNsdWcgcmVzb2x1dGlvbiBmb2xsb3dzIHRoZXNlIHJ1bGVzOlxuICAgKiAtIEZvciBiYXNlIGNvbGxlY3Rpb25zOiBUaGUgc2FuaXRpemVCZXR0ZXJBdXRoT3B0aW9ucyBmdW5jdGlvbiBlbnN1cmVzIHRoZSBjb2xsZWN0aW9uIHNsdWdcbiAgICogICBmcm9tIHBsdWdpbiBvcHRpb25zIGlzIHNldCBhcyB0aGUgbW9kZWwgbmFtZSBpbiB0aGUgc2NoZW1hXG4gICAqIC0gRm9yIHBsdWdpbnM6IFRoZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MgY29uc3RhbnQgaXMgdXNlZCBhcyB0aGUgbW9kZWxOYW1lXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBCZXR0ZXJBdXRoIG1vZGVsIG5hbWUgdG8gcmVzb2x2ZVxuICAgKiBAcmV0dXJucyBUaGUgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBjb2xsZWN0aW9uIHNsdWdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hWyd1c2VyJ10ubW9kZWxOYW1lIGlzICd1c2VycydcbiAgICogZ2V0Q29sbGVjdGlvblNsdWcoJ3VzZXInKSAvLyBSZXR1cm5zICd1c2VycydcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgbW9kZWwgZG9lc24ndCBleGlzdCBpbiBzY2hlbWFcbiAgICogZ2V0Q29sbGVjdGlvblNsdWcoJ2N1c3RvbScpIC8vIFJldHVybnMgJ2N1c3RvbSdcbiAgICpcbiAgICogQHdhcm5pbmcgSWYgYSBjb2xsZWN0aW9uIGlzIG92ZXJyaWRkZW4gdXNpbmcgdGhlIGNvbGxlY3Rpb25PdmVycmlkZSBvcHRpb25cbiAgICogd2l0aG91dCB1cGRhdGluZyB0aGUgc2NoZW1hIG1hcHBpbmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3Qgc2x1Z3NcbiAgICovXG4gIGZ1bmN0aW9uIGdldENvbGxlY3Rpb25TbHVnKG1vZGVsOiBNb2RlbEtleSk6IENvbGxlY3Rpb25TbHVnIHtcbiAgICAvLyBGaXJzdCB0cnkgdG8gZ2V0IHRoZSBtb2RlbE5hbWUgZnJvbSBzY2hlbWEsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1vZGVsIG5hbWVcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gc2NoZW1hPy5bbW9kZWxdPy5tb2RlbE5hbWUgfHwgbW9kZWxcbiAgICBkZWJ1Z0xvZyhbJ2dldENvbGxlY3Rpb25TbHVnOicsIHsgbW9kZWwsIHJlc29sdmVkU2x1ZzogY29sbGVjdGlvbiB9XSlcbiAgICByZXR1cm4gY29sbGVjdGlvbiBhcyBDb2xsZWN0aW9uU2x1Z1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBmaWVsZCB0byBpdHMgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBmaWVsZCBuYW1lLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCBuYW1lIGJ5OlxuICAgKiAxLiBQcmVzZXJ2aW5nICdpZCcgb3IgJ19pZCcgZmllbGRzIGFzLWlzIChzcGVjaWFsIGNhc2UgaGFuZGxpbmcpXG4gICAqIDIuIExvb2tpbmcgdXAgdGhlIGZpZWxkIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIGZpZWxkTmFtZVxuICAgKiAzLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZpZWxkIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0gZmllbGQgLSBUaGUgb3JpZ2luYWwgZmllbGQgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGZpZWxkIG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hWyd1c2VyJ10uZmllbGRzWydlbWFpbCddLmZpZWxkTmFtZSBpcyAnZW1haWxBZGRyZXNzJ1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnZW1haWwnKSAvLyBSZXR1cm5zICdlbWFpbEFkZHJlc3MnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNwZWNpYWwgY2FzZSBmb3IgSUQgZmllbGRzXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdpZCcpIC8vIEFsd2F5cyByZXR1cm5zICdpZCdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgZmllbGQgZG9lc24ndCBleGlzdCBpbiBzY2hlbWEgb3IgaGFzIG5vIGZpZWxkTmFtZSBtYXBwaW5nXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgZmllbGROYW1lIGlzIG92ZXJyaWRkZW4gaW4gdGhlIHBheWxvYWQgY29sbGVjdGlvbiBjb25maWcgdXNpbmcgdGhlIGNvbGxlY3Rpb25PdmVycmlkZSBvcHRpb25cbiAgICogd2l0aG91dCB1cGRhdGluZyB0aGUgc2NoZW1hIG1hcHBpbmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3QgZmllbGQgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGdldEZpZWxkTmFtZShtb2RlbDogTW9kZWxLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogJ2lkJyBvciAnX2lkJyBpcyBhbHdheXMgcHJlc2VydmVkIGFzLWlzXG4gICAgaWYgKFsnaWQnLCAnX2lkJ10uaW5jbHVkZXMoZmllbGQpKSB7XG4gICAgICByZXR1cm4gZmllbGRcbiAgICB9XG5cbiAgICAvLyBMb29rIHVwIHRoZSBmaWVsZCBpbiB0aGUgc2NoZW1hXG4gICAgY29uc3QgZmllbGREZWZpbml0aW9uID0gc2NoZW1hW21vZGVsXT8uZmllbGRzW2ZpZWxkXVxuXG4gICAgLy8gVXNlIHRoZSBjb25maWd1cmVkIGZpZWxkTmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gb3JpZ2luYWxcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBmaWVsZERlZmluaXRpb24/LmZpZWxkTmFtZSB8fCBmaWVsZFxuXG4gICAgLy8gTG9nIHRoZSBmaWVsZCByZXNvbHV0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICBkZWJ1Z0xvZyhbJ2dldEZpZWxkOiAnLCB7IG1vZGVsLCBvcmlnaW5hbEZpZWxkOiBmaWVsZCwgZmllbGROYW1lIH1dKVxuXG4gICAgcmV0dXJuIGZpZWxkTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBieSBjaGVja2luZyBmb3IgYSByZWZlcmVuY2VzIHByb3BlcnR5LlxuICAgKlxuICAgKiBSZWxhdGlvbnNoaXAgZmllbGRzIGluIHRoZSBzY2hlbWEgaGF2ZSBhICdyZWZlcmVuY2VzJyBwcm9wZXJ0eSB0aGF0IHBvaW50cyB0byBhbm90aGVyIG1vZGVsLlxuICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyB0byBpZGVudGlmeSByZWxhdGlvbnNoaXAgZmllbGRzLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGRLZXkgLSBUaGUga2V5IG9mIHRoZSBmaWVsZCB0byBjaGVjayBpbiB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSBzY2hlbWFGaWVsZHMgLSBPYmplY3QgY29udGFpbmluZyBhbGwgZmllbGRzIGZyb20gdGhlIHNjaGVtYSBmb3IgYSBzcGVjaWZpYyBtb2RlbFxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCAoaGFzIHJlZmVyZW5jZXMpLCBmYWxzZSBvdGhlcndpc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hLnVzZXIuZmllbGRzLnBvc3RzIGhhcyB7IHJlZmVyZW5jZXM6IHt9IH1cbiAgICogaXNSZWxhdGlvbnNoaXBGaWVsZCgncG9zdHMnLCBzY2hlbWEudXNlci5maWVsZHMpIC8vIFJldHVybnMgdHJ1ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMuZW1haWwgaGFzIG5vIHJlZmVyZW5jZXMgcHJvcGVydHlcbiAgICogaXNSZWxhdGlvbnNoaXBGaWVsZCgnZW1haWwnLCBzY2hlbWEudXNlci5maWVsZHMpIC8vIFJldHVybnMgZmFsc2VcbiAgICovXG4gIGZ1bmN0aW9uIGlzUmVsYXRpb25zaGlwRmllbGQoZmllbGRLZXk6IHN0cmluZywgc2NoZW1hRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWVsZEF0dHJpYnV0ZTxGaWVsZFR5cGU+Pik6IGJvb2xlYW4ge1xuICAgIC8vIEEgZmllbGQgaXMgYSByZWxhdGlvbnNoaXAgZmllbGQgaWYgaXQgaGFzIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IGRlZmluZWRcbiAgICByZXR1cm4gc2NoZW1hRmllbGRzW2ZpZWxkS2V5XT8ucmVmZXJlbmNlcyAhPT0gdW5kZWZpbmVkXG4gIH1cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGEgc2luZ2xlIElEIHZhbHVlIGZyb20gYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSBpZiBpdCByZXByZXNlbnRzIGEgc2ltcGxlIElEIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGFuYWx5emVzIGEgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgYSBzaW1wbGUgcXVlcnkgZm9yIGFcbiAgICogc2luZ2xlIGRvY3VtZW50IGJ5IElELiBJdCBzdXBwb3J0cyBib3RoICdpZCcgYW5kICdfaWQnIGZpZWxkcyB3aXRoICdlcXVhbHMnIG9yICdjb250YWlucydcbiAgICogb3BlcmF0b3JzLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb3B0aW1pemluZyBxdWVyaWVzIHdoZW4gd2Ugb25seSBuZWVkIHRvIGZldGNoIGEgc2luZ2xlIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgLSBUaGUgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gYW5hbHl6ZVxuICAgKiBAcmV0dXJucyBUaGUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpIGlmIHRoZSB3aGVyZSBjbGF1c2UgaXMgYSBzaW1wbGUgSUQgcXVlcnksIG51bGwgb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzEyMycgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH0pIC8vICcxMjMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgNDU2IGZvciBhIHNpbXBsZSBlcXVhbHMgcXVlcnkgd2l0aCBudW1iZXIgSURcbiAgICogc2luZ2xlSWRRdWVyeSh7IF9pZDogeyBlcXVhbHM6IDQ1NiB9IH0pIC8vIDQ1NlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zICc3ODknIGZvciBhIGNvbnRhaW5zIHF1ZXJ5IHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICogc2luZ2xlSWRRdWVyeSh7IGlkOiB7IGNvbnRhaW5zOiBbJzc4OSddIH0gfSkgLy8gJzc4OSdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBudWxsIGZvciBjb21wbGV4IHF1ZXJpZXNcbiAgICogc2luZ2xlSWRRdWVyeSh7IGFuZDogW3sgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH1dIH0pIC8vIG51bGxcbiAgICovXG4gIGZ1bmN0aW9uIHNpbmdsZUlkUXVlcnkod2hlcmU6IFBheWxvYWRXaGVyZSkge1xuICAgIC8vIFJldHVybiBudWxsIGZvciBlbXB0eSB3aGVyZSBjbGF1c2VzIG9yIGNvbXBsZXggcXVlcmllcyB3aXRoICdhbmQnLydvcicgb3BlcmF0b3JzXG4gICAgaWYgKCF3aGVyZSB8fCAnYW5kJyBpbiB3aGVyZSB8fCAnb3InIGluIHdoZXJlKSByZXR1cm4gbnVsbFxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHdoZXJlIGNsYXVzZSBjb250YWlucyBlaXRoZXIgJ2lkJyBvciAnX2lkJyBmaWVsZFxuICAgIGlmIChbJ2lkJywgJ19pZCddLnNvbWUoKGZpZWxkKSA9PiBmaWVsZCBpbiB3aGVyZSkpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBJRCBmaWVsZCBpcyBiZWluZyB1c2VkIChzdXBwb3J0IGJvdGggJ2lkJyBhbmQgJ19pZCcpXG4gICAgICBjb25zdCBpZEZpZWxkID0gJ2lkJyBpbiB3aGVyZSA/ICdpZCcgOiAnX2lkJ1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gd2hlcmVbaWRGaWVsZF1cblxuICAgICAgLy8gUHJvY2VzcyB0aGUgZXF1YWxzIG9wZXJhdG9yIGNhc2VcbiAgICAgIGlmIChjb25kaXRpb24gJiYgdHlwZW9mIGNvbmRpdGlvbiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJiAnZXF1YWxzJyBpbiBjb25kaXRpb24pIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uZXF1YWxzXG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBjb250YWlucyBvcGVyYXRvciBjYXNlIHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICAgIGlmIChcbiAgICAgICAgY29uZGl0aW9uICYmXG4gICAgICAgIHR5cGVvZiBjb25kaXRpb24gPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGNvbmRpdGlvbikgJiZcbiAgICAgICAgJ2NvbnRhaW5zJyBpbiBjb25kaXRpb24gJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShjb25kaXRpb24uY29udGFpbnMpICYmXG4gICAgICAgIGNvbmRpdGlvbi5jb250YWlucy5sZW5ndGggPT09IDFcbiAgICAgICkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jb250YWluc1swXVxuICAgICAgICAvLyBPbmx5IHJldHVybiBzdHJpbmcgb3IgbnVtYmVyIElEIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiBubyB2YWxpZCBJRCBxdWVyeSB3YXMgZm91bmRcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgZGF0YSB2YWx1ZXMgYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgcmVxdWlyZWQgSUQgdHlwZVxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdHlwZSBjb252ZXJzaW9uIGZvciByZWxhdGlvbnNoaXAgZmllbGRzIHRvIGVuc3VyZVxuICAgKiBJRHMgYXJlIGluIHRoZSBjb3JyZWN0IGZvcm1hdCAoc3RyaW5nIG9yIG51bWJlcikgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgZmllbGQga2V5L25hbWVcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIG5vcm1hbGl6ZVxuICAgKiBAcGFyYW0gaXNSZWxhdGVkRmllbGQgLSBXaGV0aGVyIHRoaXMgZmllbGQgaXMgYSByZWxhdGlvbnNoaXAgZmllbGRcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBleHBlY3RlZCBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIHZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVEYXRhKHtcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gICAgaXNSZWxhdGVkRmllbGQsXG4gICAgaWRUeXBlXG4gIH06IHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHZhbHVlOiBhbnlcbiAgICBpc1JlbGF0ZWRGaWVsZDogYm9vbGVhblxuICAgIGlkVHlwZTogJ251bWJlcicgfCAndGV4dCdcbiAgfSkge1xuICAgIC8vIFNraXAgcHJvY2Vzc2luZyBmb3IgbnVsbC91bmRlZmluZWQgdmFsdWVzXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGlmIChbJ2lkJywgJ19pZCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIGlkVHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFsdWUsIDEwKVxuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICBkZWJ1Z0xvZyhbYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIHN0cmluZyBJRCB0byBudW1iZXJgLCB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBwYXJzZWQgfV0pXG4gICAgICAgICAgcmV0dXJuIHBhcnNlZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpZFR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBjb25zdCBzdHJpbmdJZCA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgZGVidWdMb2coW2BJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBudW1iZXIgSUQgdG8gc3RyaW5nYCwgeyBvcmlnaW5hbDogdmFsdWUsIGNvbnZlcnRlZDogc3RyaW5nSWQgfV0pXG4gICAgICAgIHJldHVybiBzdHJpbmdJZFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9ubHkgcHJvY2VzcyByZWxhdGlvbnNoaXAgZmllbGRzIHRoYXQgbmVlZCB0eXBlIGNvbnZlcnNpb25cbiAgICBpZiAoaXNSZWxhdGVkRmllbGQpIHtcbiAgICAgIC8vIEhhbmRsZSBzaW5nbGUgSUQgdmFsdWUgY29udmVyc2lvblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgaWRUeXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApXG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XSlcbiAgICAgICAgICByZXR1cm4gcGFyc2VkXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpZFR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBjb25zdCBzdHJpbmdJZCA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgZGVidWdMb2coW2BJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBudW1iZXIgSUQgdG8gc3RyaW5nYCwgeyBvcmlnaW5hbDogdmFsdWUsIGNvbnZlcnRlZDogc3RyaW5nSWQgfV0pXG4gICAgICAgIHJldHVybiBzdHJpbmdJZFxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYXJyYXkgb2YgSURzIC0gbWFwIGVhY2ggdmFsdWUgdG8gdGhlIGNvcnJlY3QgdHlwZVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGlkKSA9PiB7XG4gICAgICAgICAgLy8gU2tpcCBudWxsL3VuZGVmaW5lZCB2YWx1ZXMgaW4gYXJyYXlzXG4gICAgICAgICAgaWYgKGlkID09PSBudWxsIHx8IGlkID09PSB1bmRlZmluZWQpIHJldHVybiBpZFxuXG4gICAgICAgICAgaWYgKGlkVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoaWQsIDEwKVxuICAgICAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZWQpID8gcGFyc2VkIDogaWRcbiAgICAgICAgICB9IGVsc2UgaWYgKGlkVHlwZSA9PT0gJ3RleHQnICYmIHR5cGVvZiBpZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpZFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBvcmlnaW5hbCB2YWx1ZSBpZiBubyBjb252ZXJzaW9uIHdhcyBuZWVkZWQgb3IgYXBwbGljYWJsZVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoIHRvIFBheWxvYWQgQ01TIGZvcm1hdFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXM6XG4gICAqIDEuIEZpZWxkIG5hbWUgbWFwcGluZyBhY2NvcmRpbmcgdG8gc2NoZW1hIGRlZmluaXRpb25zXG4gICAqIDIuIElEIHR5cGUgY29udmVyc2lvbiBmb3IgcmVsYXRpb25zaGlwIGZpZWxkc1xuICAgKiAzLiBQcm9wZXIgZGF0YSBub3JtYWxpemF0aW9uIGJhc2VkIG9uIGZpZWxkIHR5cGVzXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGlucHV0IGRhdGEgZnJvbSBiZXR0ZXItYXV0aFxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgbmFtZSBpbiB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcmV0dXJucyBUcmFuc2Zvcm1lZCBkYXRhIGNvbXBhdGlibGUgd2l0aCBQYXlsb2FkIENNU1xuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtSW5wdXQoe1xuICAgIGRhdGEsXG4gICAgbW9kZWwsXG4gICAgaWRUeXBlXG4gIH06IHtcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgbW9kZWw6IE1vZGVsS2V5XG4gICAgaWRUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0J1xuICB9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fVxuXG4gICAgLy8gUHJvY2VzcyBlYWNoIGZpZWxkIGluIHRoZSBpbnB1dCBkYXRhXG4gICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAvLyBTa2lwIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkXG4gICAgICBjb25zdCBpc1JlbGF0ZWRGaWVsZCA9IGlzUmVsYXRpb25zaGlwRmllbGQoa2V5LCBzY2hlbWFGaWVsZHMpXG5cbiAgICAgIC8vIEdldCB0aGUgbWFwcGVkIGZpZWxkIG5hbWUgZnJvbSBzY2hlbWEgKGlmIGFueSlcbiAgICAgIGNvbnN0IHNjaGVtYUZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkc1trZXldPy5maWVsZE5hbWVcblxuICAgICAgLy8gTm9ybWFsaXplIHRoZSBkYXRhIHZhbHVlIGJhc2VkIG9uIGZpZWxkIHR5cGUgYW5kIElEIHR5cGVcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhID0gbm9ybWFsaXplRGF0YSh7XG4gICAgICAgIGlkVHlwZSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaXNSZWxhdGVkRmllbGRcbiAgICAgIH0pXG5cbiAgICAgIC8vIFVzZSB0aGUgc2NoZW1hLWRlZmluZWQgZmllbGQgbmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2Ugb3JpZ2luYWwga2V5XG4gICAgICBjb25zdCB0YXJnZXRGaWVsZE5hbWUgPSBzY2hlbWFGaWVsZE5hbWUgfHwga2V5XG4gICAgICB0cmFuc2Zvcm1lZERhdGFbdGFyZ2V0RmllbGROYW1lXSA9IG5vcm1hbGl6ZWREYXRhXG4gICAgfSlcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIFBheWxvYWQgQ01TIGRvY3VtZW50IG91dHB1dCB0byBtYXRjaCBCZXR0ZXJBdXRoIHNjaGVtYSBleHBlY3RhdGlvbnMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXZlcmFsIGNyaXRpY2FsIHRyYW5zZm9ybWF0aW9uczpcbiAgICpcbiAgICogMS4gSUQgQ29udmVyc2lvbjogRW5zdXJlcyBhbGwgSUQgZmllbGRzIGFyZSBzdHJpbmdzIGFzIHJlcXVpcmVkIGJ5IEJldHRlckF1dGhcbiAgICogICAgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JldHRlci1hdXRoL2JldHRlci1hdXRoL2Jsb2IvbWFpbi9wYWNrYWdlcy9iZXR0ZXItYXV0aC9zcmMvZGIvc2NoZW1hLnRzI0wxMjUpXG4gICAqXG4gICAqIDIuIFJlbGF0aW9uc2hpcCBGaWVsZCBNYXBwaW5nOiBBbGlnbnMgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIEJldHRlckF1dGggc2NoZW1hIG5hbWluZyBjb252ZW50aW9uc1xuICAgKiAgICBhbmQgZW5zdXJlcyBwcm9wZXIgSUQgdHlwZSBoYW5kbGluZ1xuICAgKlxuICAgKiAzLiBEYXRlIENvbnZlcnNpb246IFRyYW5zZm9ybXMgZGF0ZSBzdHJpbmdzIGZyb20gUGF5bG9hZCBpbnRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgKlxuICAgKiBOb3RlOiBXaGlsZSBzZXR0aW5nIGRlcHRoOiAxIGluIFBheWxvYWQgb3BlcmF0aW9ucyBzaW1wbGlmaWVzIHRoaXMgcHJvY2VzcyBieSBhdm9pZGluZ1xuICAgKiBkZWVwbHkgbmVzdGVkIG9iamVjdHMsIHdlIG1haW50YWluIGNvbXByZWhlbnNpdmUgY2hlY2tzIGZvciByb2J1c3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHJldHVybmVkIGZyb20gUGF5bG9hZCBDTVNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsIG5hbWUgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCBjb21wYXRpYmxlIHdpdGggQmV0dGVyQXV0aFxuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT3V0cHV0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4oeyBkb2MsIG1vZGVsIH06IHsgZG9jOiBUOyBtb2RlbDogTW9kZWxLZXkgfSk6IFQge1xuICAgIGlmICghZG9jIHx8IHR5cGVvZiBkb2MgIT09ICdvYmplY3QnKSByZXR1cm4gZG9jXG5cbiAgICBjb25zdCByZXN1bHQgPSB7IC4uLmRvYyB9XG4gICAgY29uc3Qgc2NoZW1hRmllbGRzID0gc2NoZW1hPy5bbW9kZWxdPy5maWVsZHMgPz8ge31cblxuICAgIC8vIElkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCBjdXN0b20gZmllbGQgbmFtZSBtYXBwaW5nc1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcEZpZWxkcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhzY2hlbWFGaWVsZHMpLmZpbHRlcigoW2tleV0pID0+IGlzUmVsYXRpb25zaGlwRmllbGQoa2V5LCBzY2hlbWFGaWVsZHMpKSlcbiAgICBjb25zdCBkYXRlRmllbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNjaGVtYUZpZWxkcykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZS50eXBlID09PSAnZGF0ZScpKVxuXG4gICAgT2JqZWN0LmVudHJpZXMoZG9jKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgICAgLy8gQ29udmVydCBJRCBmaWVsZHMgdG8gc3RyaW5ncyBmb3IgQmV0dGVyQXV0aCBjb21wYXRpYmlsaXR5XG4gICAgICBpZiAoWydpZCcsICdfaWQnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCByZW5hbWVkIGZpZWxkTmFtZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5ID0gT2JqZWN0LmtleXMocmVsYXRpb25zaGlwRmllbGRzKS5maW5kKChrKSA9PiByZWxhdGlvbnNoaXBGaWVsZHNba10uZmllbGROYW1lID09PSBrZXkpXG4gICAgICBpZiAob3JpZ2luYWxSZWxhdGVkRmllbGRLZXkpIHtcbiAgICAgICAgbm9ybWFsaXplRG9jdW1lbnRJZHMocmVzdWx0LCBvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSwga2V5LCB2YWx1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGF0ZUZpZWxkS2V5ID0gT2JqZWN0LmtleXMoZGF0ZUZpZWxkcykuZmluZCgoaykgPT4gZGF0ZUZpZWxkc1trXS5maWVsZE5hbWUgPT09IGtleSlcbiAgICAgIGlmIChvcmlnaW5hbERhdGVGaWVsZEtleSkge1xuICAgICAgICAvLyBDb252ZXJ0IElTTyBkYXRlIHN0cmluZ3MgdG8gRGF0ZSBvYmplY3RzIGZvciBCZXR0ZXJBdXRoXG4gICAgICAgIHJlc3VsdFtrZXldID0gbmV3IERhdGUodmFsdWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIFRcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIElEIGZpZWxkcyBmb3IgYm90aCBwcmltYXJ5IGFuZCByZWxhdGlvbnNoaXAgZG9jdW1lbnRzLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgY29uc2lzdGVudCBJRCBoYW5kbGluZyBiZXR3ZWVuIEJldHRlckF1dGggYW5kIFBheWxvYWQgQ01TIGJ5OlxuICAgKiAxLiBDb252ZXJ0aW5nIGFsbCBJRHMgdG8gc3RyaW5ncyBmb3IgQmV0dGVyQXV0aCAoc3RvcmVkIGluIG9yaWdpbmFsS2V5KVxuICAgKiAyLiBQcmVzZXJ2aW5nIG9yaWdpbmFsIElEIHR5cGVzIGZvciBQYXlsb2FkIENNUyAoc3RvcmVkIGluIGZpZWxkTmFtZSlcbiAgICpcbiAgICogVGhlIGZ1bmN0aW9uIGhhbmRsZXMgdmFyaW91cyBJRCBmb3JtYXRzOlxuICAgKiAtIFByaW1pdGl2ZSB2YWx1ZXMgKHN0cmluZy9udW1iZXIgSURzKVxuICAgKiAtIE9iamVjdCByZWZlcmVuY2VzIHdpdGggSUQgcHJvcGVydGllc1xuICAgKiAtIEFycmF5cyBvZiBlaXRoZXIgcHJpbWl0aXZlIElEcyBvciBvYmplY3QgcmVmZXJlbmNlc1xuICAgKlxuICAgKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJlc3VsdCBvYmplY3QgYmVpbmcgdHJhbnNmb3JtZWRcbiAgICogQHBhcmFtIG9yaWdpbmFsS2V5IC0gVGhlIG9yaWdpbmFsIGZpZWxkIGtleSBmcm9tIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgcmVuYW1lZCBmaWVsZCBhcyB1c2VkIGluIFBheWxvYWQgQ01TXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBJRCB2YWx1ZSB0byBub3JtYWxpemUgKHByaW1pdGl2ZSwgb2JqZWN0LCBvciBhcnJheSlcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURvY3VtZW50SWRzKHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55Piwgb3JpZ2luYWxLZXk6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBDYXNlIDE6IFByaW1pdGl2ZSBJRCB2YWx1ZSAoc3RyaW5nIG9yIG51bWJlcilcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogQWx3YXlzIHVzZSBzdHJpbmcgSURzXG4gICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gU3RyaW5nKHZhbHVlKVxuICAgICAgLy8gRm9yIFBheWxvYWQ6IEtlZXAgb3JpZ2luYWwgdHlwZVxuICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2FzZSAyOiBPYmplY3Qgd2l0aCBJRCBwcm9wZXJ0eVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICdpZCcgaW4gdmFsdWUpIHtcbiAgICAgIC8vIEZvciBCZXR0ZXJBdXRoOiBFeHRyYWN0IGFuZCBzdHJpbmdpZnkgdGhlIElEXG4gICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gU3RyaW5nKHZhbHVlLmlkKVxuICAgICAgLy8gRm9yIFBheWxvYWQ6IEV4dHJhY3QgSUQgYnV0IHByZXNlcnZlIHR5cGVcbiAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUuaWRcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIENhc2UgMzogQXJyYXkgb2YgSURzIG9yIHJlZmVyZW5jZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgaWYgYXJyYXkgY29udGFpbnMgb2JqZWN0cyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICAgIGlmICh2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gIT09IG51bGwgJiYgJ2lkJyBpbiBpdGVtKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBvYmplY3RzIHdpdGggSURzXG4gICAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtLmlkKSlcbiAgICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IGl0ZW0uaWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBcnJheSBvZiBwcmltaXRpdmUgSURzXG4gICAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKSlcbiAgICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IGl0ZW0pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBOb3RlOiBJZiB2YWx1ZSBkb2Vzbid0IG1hdGNoIGFueSBleHBlY3RlZCBmb3JtYXQsIG5vIGNoYW5nZXMgYXJlIG1hZGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEJldHRlckF1dGggb3BlcmF0b3IgdG8gdGhlIGVxdWl2YWxlbnQgUGF5bG9hZCBDTVMgcXVlcnkgb3BlcmF0b3JcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBtYXBzIHN0YW5kYXJkIHF1ZXJ5IG9wZXJhdG9ycyBmcm9tIEJldHRlckF1dGgncyBmb3JtYXQgdG9cbiAgICogdGhlIHNwZWNpZmljIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdG9yIC0gVGhlIEJldHRlckF1dGggb3BlcmF0b3Igc3RyaW5nIChlLmcuLCAnZXEnLCAnZ3QnLCAnY29udGFpbnMnKVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgdXNlZCB3aXRoIHRoZSBvcGVyYXRvclxuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgUGF5bG9hZC1jb21wYXRpYmxlIG9wZXJhdG9yIGFuZCB2YWx1ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIHsgZXF1YWxzOiAndGVzdEBleGFtcGxlLmNvbScgfVxuICAgKiBvcGVyYXRvclRvUGF5bG9hZCgnZXEnLCAndGVzdEBleGFtcGxlLmNvbScpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgeyBncmVhdGVyX3RoYW46IDEwMCB9XG4gICAqIG9wZXJhdG9yVG9QYXlsb2FkKCdndCcsIDEwMClcbiAgICovXG4gIGZ1bmN0aW9uIG9wZXJhdG9yVG9QYXlsb2FkKG9wZXJhdG9yOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlICdlcSc6XG4gICAgICAgIHJldHVybiB7IGVxdWFsczogdmFsdWUgfVxuICAgICAgY2FzZSAnbmUnOlxuICAgICAgICByZXR1cm4geyBub3RfZXF1YWxzOiB2YWx1ZSB9XG4gICAgICBjYXNlICdndCc6XG4gICAgICAgIHJldHVybiB7IGdyZWF0ZXJfdGhhbjogdmFsdWUgfVxuICAgICAgY2FzZSAnZ3RlJzpcbiAgICAgICAgcmV0dXJuIHsgZ3JlYXRlcl90aGFuX2VxdWFsOiB2YWx1ZSB9XG4gICAgICBjYXNlICdsdCc6XG4gICAgICAgIHJldHVybiB7IGxlc3NfdGhhbjogdmFsdWUgfVxuICAgICAgY2FzZSAnbHRlJzpcbiAgICAgICAgcmV0dXJuIHsgbGVzc190aGFuX2VxdWFsOiB2YWx1ZSB9XG4gICAgICBjYXNlICdjb250YWlucyc6XG4gICAgICAgIHJldHVybiB7IGNvbnRhaW5zOiB2YWx1ZSB9XG4gICAgICBjYXNlICdpbic6XG4gICAgICAgIHJldHVybiB7IGluOiB2YWx1ZSB9XG4gICAgICBjYXNlICdzdGFydHNfd2l0aCc6XG4gICAgICAgIHJldHVybiB7IGxpa2U6IGAke3ZhbHVlfSVgIH1cbiAgICAgIGNhc2UgJ2VuZHNfd2l0aCc6XG4gICAgICAgIHJldHVybiB7IGxpa2U6IGAlJHt2YWx1ZX1gIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBlcXVhbHMgZm9yIHVucmVjb2duaXplZCBvcGVyYXRvcnNcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgd2hlcmUgY2xhdXNlIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGJhc2VkIG9uIGZpZWxkIG5hbWUgYW5kIElEIHR5cGUgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdHdvIG1haW4gc2NlbmFyaW9zOlxuICAgKiAxLiBJRCBmaWVsZCBjb252ZXJzaW9uIC0gZW5zdXJlcyBJRHMgbWF0Y2ggdGhlIGRhdGFiYXNlJ3MgZXhwZWN0ZWQgdHlwZSAobnVtYmVyIG9yIHN0cmluZylcbiAgICogMi4gT2JqZWN0IHdpdGggZW1iZWRkZWQgSUQgLSBleHRyYWN0cyBhbmQgY29udmVydHMgdGhlIElEIHByb3BlcnR5IGZyb20gb2JqZWN0c1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydCAoY2FuIGJlIHByaW1pdGl2ZSwgb2JqZWN0IHdpdGggSUQsIG9yIGFycmF5KVxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHF1ZXJpZWRcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBleHBlY3RlZCBJRCB0eXBlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcmV0dXJucyBUaGUgY29udmVydGVkIHZhbHVlIGFwcHJvcHJpYXRlIGZvciB0aGUgZGF0YWJhc2UgcXVlcnlcbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRXaGVyZVZhbHVlKHsgdmFsdWUsIGZpZWxkTmFtZSwgaWRUeXBlIH06IHsgdmFsdWU6IGFueTsgZmllbGROYW1lOiBzdHJpbmc7IGlkVHlwZTogJ251bWJlcicgfCAndGV4dCcgfSkge1xuICAgIC8vIENoZWNrIGlmIGZpZWxkIGlzIGFuIElEIGZpZWxkIChzdXBwb3J0aW5nIGJvdGggTW9uZ29EQi1zdHlsZSBfaWQgYW5kIHN0YW5kYXJkIGlkKVxuICAgIGlmIChbJ2lkJywgJ19pZCddLmluY2x1ZGVzKGZpZWxkTmFtZSkpIHtcbiAgICAgIC8vIENhc2UgMTogVmFsdWUgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYW4gSUQgcHJvcGVydHlcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICdpZCcgaW4gdmFsdWUpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBJRCBmcm9tIG9iamVjdFxuICAgICAgICBjb25zdCBpZCA9IHZhbHVlLmlkXG5cbiAgICAgICAgLy8gVXNlIHR5cGUgY29udmVyc2lvbiBiYXNlZCBvbiBkYXRhYmFzZSBjb25maWd1cmF0aW9uXG4gICAgICAgIGlmIChpZFR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBudW1JZCA9IE51bWJlcihpZClcbiAgICAgICAgICByZXR1cm4gIWlzTmFOKG51bUlkKSA/IG51bUlkIDogaWRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZFR5cGUgPT09ICd0ZXh0JyAmJiB0eXBlb2YgaWQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyhpZClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpZFxuICAgICAgfVxuICAgICAgLy8gQ2FzZSAyOiBWYWx1ZSBpcyBhIHN0YW5kYWxvbmUgSUQgdGhhdCBuZWVkcyB0eXBlIGNvbnZlcnNpb25cbiAgICAgIC8vIENvbnZlcnQgc3RyaW5nIElEIHRvIG51bWJlciBpZiBkYXRhYmFzZSBleHBlY3RzIG51bWVyaWMgSURzXG4gICAgICBpZiAoaWRUeXBlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTihOdW1iZXIodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKVxuICAgICAgfVxuICAgICAgLy8gQ29udmVydCBudW1lcmljIElEIHRvIHN0cmluZyBpZiBkYXRhYmFzZSBleHBlY3RzIHRleHQgSURzXG4gICAgICBlbHNlIGlmIChpZFR5cGUgPT09ICd0ZXh0JyAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICAvLyBGb3Igbm9uLUlEIGZpZWxkcywgcmV0dXJuIHRoZSB2YWx1ZSB1bmNoYW5nZWRcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBCZXR0ZXIgQXV0aCB3aGVyZSBjbGF1c2VzIHRvIFBheWxvYWQgQ01TIGNvbXBhdGlibGUgd2hlcmUgY29uZGl0aW9uc1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIEJldHRlciBBdXRoIHF1ZXJ5IGZvcm1hdCBpbnRvIFBheWxvYWQncyBxdWVyeSBmb3JtYXQsXG4gICAqIGhhbmRsaW5nIGZpZWxkIG5hbWUgbWFwcGluZywgdmFsdWUgdHlwZSBjb252ZXJzaW9uLCBhbmQgbG9naWNhbCBvcGVyYXRvcnMgKEFORC9PUikuXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHRocmVlIG1haW4gY2FzZXM6XG4gICAqIDEuIEVtcHR5IG9yIHVuZGVmaW5lZCB3aGVyZSBjbGF1c2UgLSByZXR1cm5zIGVtcHR5IG9iamVjdFxuICAgKiAyLiBTaW5nbGUgY29uZGl0aW9uIC0gY29udmVydHMgdG8gYSBzaW1wbGUgZmllbGQtdmFsdWUgcGFpclxuICAgKiAzLiBNdWx0aXBsZSBjb25kaXRpb25zIC0gZ3JvdXBzIGJ5IEFORC9PUiBjb25uZWN0b3JzIGFuZCBidWlsZHMgYSBjb21wbGV4IHF1ZXJ5XG4gICAqXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZGF0YWJhc2UgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIHF1ZXJ5XG4gICAqIEBwYXJhbSB3aGVyZSAtIEFycmF5IG9mIEJldHRlciBBdXRoIHdoZXJlIGNvbmRpdGlvbnNcbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgd2hlcmUgY2xhdXNlIG9iamVjdFxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFdoZXJlQ2xhdXNlKHsgaWRUeXBlLCBtb2RlbCwgd2hlcmUgfTogeyBpZFR5cGU6ICdudW1iZXInIHwgJ3RleHQnOyBtb2RlbDogTW9kZWxLZXk7IHdoZXJlPzogV2hlcmVbXSB9KTogUGF5bG9hZFdoZXJlIHtcbiAgICAvLyBIYW5kbGUgZW1wdHkgd2hlcmUgY2xhdXNlXG4gICAgaWYgKCF3aGVyZSkgcmV0dXJuIHt9XG5cbiAgICAvLyBIYW5kbGUgc2luZ2xlIGNvbmRpdGlvbiBjYXNlIGZvciBvcHRpbWl6YXRpb25cbiAgICBpZiAod2hlcmUubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCB3ID0gd2hlcmVbMF1cbiAgICAgIGlmICghdykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gTWFwIGZpZWxkIG5hbWUgYWNjb3JkaW5nIHRvIHNjaGVtYSBhbmQgY29udmVydCB2YWx1ZSB0byBhcHByb3ByaWF0ZSB0eXBlXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHcuZmllbGQpXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgaWRUeXBlXG4gICAgICB9KVxuXG4gICAgICAvLyBDcmVhdGUgdGhlIFBheWxvYWQgd2hlcmUgY29uZGl0aW9uIHdpdGggcHJvcGVyIG9wZXJhdG9yXG4gICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgIFtmaWVsZE5hbWVdOiBvcGVyYXRvclRvUGF5bG9hZCh3Lm9wZXJhdG9yID8/ICcnLCB2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBjb25kaXRpb25zIGJ5IHNlcGFyYXRpbmcgQU5EL09SIGNsYXVzZXNcbiAgICAvLyBEZWZhdWx0IHRvIEFORCBpZiBubyBjb25uZWN0b3IgaXMgc3BlY2lmaWVkXG4gICAgY29uc3QgYW5kID0gd2hlcmUuZmlsdGVyKCh3KSA9PiB3LmNvbm5lY3RvciA9PT0gJ0FORCcgfHwgIXcuY29ubmVjdG9yKVxuICAgIGNvbnN0IG9yID0gd2hlcmUuZmlsdGVyKCh3KSA9PiB3LmNvbm5lY3RvciA9PT0gJ09SJylcblxuICAgIC8vIFByb2Nlc3MgQU5EIGNvbmRpdGlvbnNcbiAgICBjb25zdCBhbmRDbGF1c2UgPSBhbmQubWFwKCh3KSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHcuZmllbGQpXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgaWRUeXBlXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2ZpZWxkTmFtZV06IG9wZXJhdG9yVG9QYXlsb2FkKHcub3BlcmF0b3IgPz8gJycsIHZhbHVlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBQcm9jZXNzIE9SIGNvbmRpdGlvbnNcbiAgICBjb25zdCBvckNsYXVzZSA9IG9yLm1hcCgodykgPT4ge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCB3LmZpZWxkKVxuICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgICAgIHZhbHVlOiB3LnZhbHVlLFxuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIGlkVHlwZVxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtmaWVsZE5hbWVdOiBvcGVyYXRvclRvUGF5bG9hZCh3Lm9wZXJhdG9yID8/ICcnLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gQ29tYmluZSBBTkQgYW5kIE9SIGNsYXVzZXMgaW50byBmaW5hbCBQYXlsb2FkIHdoZXJlIG9iamVjdFxuICAgIC8vIE9ubHkgaW5jbHVkZSBub24tZW1wdHkgY2xhdXNlIGFycmF5c1xuICAgIHJldHVybiB7XG4gICAgICAuLi4oYW5kQ2xhdXNlLmxlbmd0aCA/IHsgQU5EOiBhbmRDbGF1c2UgfSA6IHt9KSxcbiAgICAgIC4uLihvckNsYXVzZS5sZW5ndGggPyB7IE9SOiBvckNsYXVzZSB9IDoge30pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYmV0dGVyLWF1dGggc2VsZWN0IGFycmF5IHRvIGEgUGF5bG9hZCBzZWxlY3Qgb2JqZWN0XG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgYmV0dGVyLWF1dGggc2VsZWN0IGFycmF5ICh3aGljaCBjb250YWlucyBmaWVsZCBuYW1lcylcbiAgICogaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IFBheWxvYWQgQ01TJ3MgcXVlcnkgQVBJIChhbiBvYmplY3Qgd2l0aCBmaWVsZCBuYW1lcyBhcyBrZXlzXG4gICAqIGFuZCBib29sZWFuIHRydWUgYXMgdmFsdWVzKS5cbiAgICpcbiAgICogSXQgYWxzbyBoYW5kbGVzIGZpZWxkIG5hbWUgbWFwcGluZyBiZXR3ZWVuIGJldHRlci1hdXRoIHNjaGVtYSBhbmQgUGF5bG9hZCBjb2xsZWN0aW9uc1xuICAgKiBieSB1c2luZyB0aGUgZ2V0RmllbGROYW1lIGhlbHBlciB0byByZXNvbHZlIHRoZSBjb3JyZWN0IGZpZWxkIG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIGdldCBmaWVsZCBtYXBwaW5ncyBmcm9tXG4gICAqIEBwYXJhbSBzZWxlY3QgLSBPcHRpb25hbCBhcnJheSBvZiBmaWVsZCBuYW1lcyB0byBzZWxlY3RcbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgc2VsZWN0IG9iamVjdCBvciB1bmRlZmluZWQgaWYgbm8gZmllbGRzIHRvIHNlbGVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJbnB1dDogWydlbWFpbCcsICduYW1lJ11cbiAgICogLy8gT3V0cHV0OiB7IGVtYWlsOiB0cnVlLCBuYW1lOiB0cnVlIH1cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRTZWxlY3QobW9kZWw6IE1vZGVsS2V5LCBzZWxlY3Q/OiBzdHJpbmdbXSkge1xuICAgIC8vIFJldHVybiB1bmRlZmluZWQgaWYgc2VsZWN0IGlzIGVtcHR5IG9yIG5vdCBwcm92aWRlZFxuICAgIGlmICghc2VsZWN0IHx8IHNlbGVjdC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJyYXkgb2YgZmllbGQgbmFtZXMgaW50byBhIFBheWxvYWQgc2VsZWN0IG9iamVjdFxuICAgIC8vIHdoaWxlIGFsc28gbWFwcGluZyBhbnkgZmllbGQgbmFtZXMgdGhhdCBtaWdodCBiZSBkaWZmZXJlbnQgaW4gUGF5bG9hZFxuICAgIHJldHVybiBzZWxlY3QucmVkdWNlKChhY2MsIGZpZWxkKSA9PiAoeyAuLi5hY2MsIFtnZXRGaWVsZE5hbWUobW9kZWwsIGZpZWxkKV06IHRydWUgfSksIHt9KVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYmV0dGVyLWF1dGggc29ydCBvYmplY3QgdG8gYSBQYXlsb2FkIHNvcnQgc3RyaW5nXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgYmV0dGVyLWF1dGggc29ydCBvYmplY3QgKHdoaWNoIGNvbnRhaW5zIGZpZWxkIG5hbWUgYW5kIGRpcmVjdGlvbilcbiAgICogaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IFBheWxvYWQgQ01TJ3MgcXVlcnkgQVBJIChhIHN0cmluZyB3aXRoIG9wdGlvbmFsICctJyBwcmVmaXggZm9yIGRlc2NlbmRpbmcgb3JkZXIpLlxuICAgKlxuICAgKiBJdCBhbHNvIGhhbmRsZXMgZmllbGQgbmFtZSBtYXBwaW5nIGJldHdlZW4gYmV0dGVyLWF1dGggc2NoZW1hIGFuZCBQYXlsb2FkIGNvbGxlY3Rpb25zXG4gICAqIGJ5IHVzaW5nIHRoZSBnZXRGaWVsZE5hbWUgaGVscGVyIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgZmllbGQgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gZ2V0IGZpZWxkIG1hcHBpbmdzIGZyb21cbiAgICogQHBhcmFtIHNvcnRCeSAtIE9wdGlvbmFsIG9iamVjdCBjb250YWluaW5nIGZpZWxkIG5hbWUgYW5kIHNvcnQgZGlyZWN0aW9uXG4gICAqIEByZXR1cm5zIEEgUGF5bG9hZC1jb21wYXRpYmxlIHNvcnQgc3RyaW5nIG9yIHVuZGVmaW5lZCBpZiBubyBzb3J0IHNwZWNpZmllZFxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJbnB1dDogeyBmaWVsZDogJ2VtYWlsJywgZGlyZWN0aW9uOiAnZGVzYycgfVxuICAgKiAvLyBPdXRwdXQ6ICctZW1haWwnXG4gICAqIC8vIElucHV0OiB7IGZpZWxkOiAnY3JlYXRlZEF0JywgZGlyZWN0aW9uOiAnYXNjJyB9XG4gICAqIC8vIE91dHB1dDogJ2NyZWF0ZWRBdCdcbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRTb3J0KG1vZGVsOiBNb2RlbEtleSwgc29ydEJ5PzogeyBmaWVsZDogc3RyaW5nOyBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIH0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghc29ydEJ5KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCBzb3J0QnkuZmllbGQpXG4gICAgY29uc3QgcHJlZml4ID0gc29ydEJ5LmRpcmVjdGlvbiA9PT0gJ2Rlc2MnID8gJy0nIDogJydcbiAgICByZXR1cm4gYCR7cHJlZml4fSR7ZmllbGROYW1lfWBcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0RmllbGROYW1lLFxuICAgIGdldENvbGxlY3Rpb25TbHVnLFxuICAgIHNpbmdsZUlkUXVlcnksXG4gICAgdHJhbnNmb3JtSW5wdXQsXG4gICAgdHJhbnNmb3JtT3V0cHV0LFxuICAgIGNvbnZlcnRXaGVyZUNsYXVzZSxcbiAgICBjb252ZXJ0U2VsZWN0LFxuICAgIGNvbnZlcnRTb3J0XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJnZXRBdXRoVGFibGVzIiwiY3JlYXRlVHJhbnNmb3JtIiwib3B0aW9ucyIsImVuYWJsZURlYnVnTG9ncyIsInNjaGVtYSIsImRlYnVnTG9nIiwibWVzc2FnZSIsImNvbnNvbGUiLCJsb2ciLCJnZXRDb2xsZWN0aW9uU2x1ZyIsIm1vZGVsIiwiY29sbGVjdGlvbiIsIm1vZGVsTmFtZSIsInJlc29sdmVkU2x1ZyIsImdldEZpZWxkTmFtZSIsImZpZWxkIiwiaW5jbHVkZXMiLCJmaWVsZERlZmluaXRpb24iLCJmaWVsZHMiLCJmaWVsZE5hbWUiLCJvcmlnaW5hbEZpZWxkIiwiaXNSZWxhdGlvbnNoaXBGaWVsZCIsImZpZWxkS2V5Iiwic2NoZW1hRmllbGRzIiwicmVmZXJlbmNlcyIsInVuZGVmaW5lZCIsInNpbmdsZUlkUXVlcnkiLCJ3aGVyZSIsInNvbWUiLCJpZEZpZWxkIiwiY29uZGl0aW9uIiwiQXJyYXkiLCJpc0FycmF5IiwidmFsdWUiLCJlcXVhbHMiLCJjb250YWlucyIsImxlbmd0aCIsIm5vcm1hbGl6ZURhdGEiLCJrZXkiLCJpc1JlbGF0ZWRGaWVsZCIsImlkVHlwZSIsInBhcnNlZCIsInBhcnNlSW50IiwiaXNOYU4iLCJvcmlnaW5hbCIsImNvbnZlcnRlZCIsInN0cmluZ0lkIiwiU3RyaW5nIiwibWFwIiwiaWQiLCJ0cmFuc2Zvcm1JbnB1dCIsImRhdGEiLCJ0cmFuc2Zvcm1lZERhdGEiLCJPYmplY3QiLCJlbnRyaWVzIiwiZm9yRWFjaCIsInNjaGVtYUZpZWxkTmFtZSIsIm5vcm1hbGl6ZWREYXRhIiwidGFyZ2V0RmllbGROYW1lIiwidHJhbnNmb3JtT3V0cHV0IiwiZG9jIiwicmVzdWx0IiwicmVsYXRpb25zaGlwRmllbGRzIiwiZnJvbUVudHJpZXMiLCJmaWx0ZXIiLCJkYXRlRmllbGRzIiwiXyIsInR5cGUiLCJvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSIsImtleXMiLCJmaW5kIiwiayIsIm5vcm1hbGl6ZURvY3VtZW50SWRzIiwib3JpZ2luYWxEYXRlRmllbGRLZXkiLCJEYXRlIiwib3JpZ2luYWxLZXkiLCJldmVyeSIsIml0ZW0iLCJvcGVyYXRvclRvUGF5bG9hZCIsIm9wZXJhdG9yIiwibm90X2VxdWFscyIsImdyZWF0ZXJfdGhhbiIsImdyZWF0ZXJfdGhhbl9lcXVhbCIsImxlc3NfdGhhbiIsImxlc3NfdGhhbl9lcXVhbCIsImluIiwibGlrZSIsImNvbnZlcnRXaGVyZVZhbHVlIiwibnVtSWQiLCJOdW1iZXIiLCJjb252ZXJ0V2hlcmVDbGF1c2UiLCJ3IiwicmVzIiwiYW5kIiwiY29ubmVjdG9yIiwib3IiLCJhbmRDbGF1c2UiLCJvckNsYXVzZSIsIkFORCIsIk9SIiwiY29udmVydFNlbGVjdCIsInNlbGVjdCIsInJlZHVjZSIsImFjYyIsImNvbnZlcnRTb3J0Iiwic29ydEJ5IiwicHJlZml4IiwiZGlyZWN0aW9uIl0sIm1hcHBpbmdzIjoiQUFHQSxTQUF5QkEsYUFBYSxRQUFRLGlCQUFnQjtBQUc5RCxPQUFPLE1BQU1DLGtCQUFrQixDQUFDQyxTQUE0QkM7SUFDMUQsTUFBTUMsU0FBU0osY0FBY0U7SUFFN0IsU0FBU0csU0FBU0MsT0FBYztRQUM5QixJQUFJSCxpQkFBaUI7WUFDbkJJLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUtGO1FBQ3pDO0lBQ0Y7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCQyxHQUNELFNBQVNHLGtCQUFrQkMsS0FBZTtRQUN4Qyw2RkFBNkY7UUFDN0YsTUFBTUMsYUFBYVAsUUFBUSxDQUFDTSxNQUFNLEVBQUVFLGFBQWFGO1FBQ2pETCxTQUFTO1lBQUM7WUFBc0I7Z0JBQUVLO2dCQUFPRyxjQUFjRjtZQUFXO1NBQUU7UUFDcEUsT0FBT0E7SUFDVDtJQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCQyxHQUNELFNBQVNHLGFBQWFKLEtBQWUsRUFBRUssS0FBYTtRQUNsRCx3REFBd0Q7UUFDeEQsSUFBSTtZQUFDO1lBQU07U0FBTSxDQUFDQyxRQUFRLENBQUNELFFBQVE7WUFDakMsT0FBT0E7UUFDVDtRQUVBLGtDQUFrQztRQUNsQyxNQUFNRSxrQkFBa0JiLE1BQU0sQ0FBQ00sTUFBTSxFQUFFUSxNQUFNLENBQUNILE1BQU07UUFFcEQsNkVBQTZFO1FBQzdFLE1BQU1JLFlBQVlGLGlCQUFpQkUsYUFBYUo7UUFFaEQseUNBQXlDO1FBQ3pDVixTQUFTO1lBQUM7WUFBYztnQkFBRUs7Z0JBQU9VLGVBQWVMO2dCQUFPSTtZQUFVO1NB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
|